2008年7月22日 星期二

封鎖POP3暴力入侵

 這支程式是針對POP3的暴力入侵攻擊所製作,運作原理為排程自動偵測LOG檔裡的錯誤登入訊息,針對超過頻率限制的IP進行封鎖,並發信通知管理員。

◎blockpop3:主程式,進行頻率分析、封鎖 ( 下載 )
◎blocktime.pl:LOG時間判斷程式 ( 下載 )
◎blockmsg.pl:訊息通知程式 ( 下載 )

下載程式已有更新版 封鎖暴力入侵(更新版 V1) ,請下載新版本程式。

 使用方法:
  1.將三個檔案放在 /usr/bin/
  2.修改權限為755
chmod 755 block*
  3.設定排程
vim /etc/crontab
   新增
*/5 * * * * root /usr/bin/blockpop3 (五分鐘檢查一次)
 相關設定:
vim blockpop3

##要檢查的LOG檔位置
  log="/var/log/maillog"
##抓取LOG的時間範圍(秒),建議配合檢查的排程時間
 range="300"
##錯誤登入次數,時間範圍內想要封鎖的頻率
 badlogin="3"
##欲通知的管理員信箱
 admin="admin@mail.domain.com.tw"
##發信程式
 sendmail="/usr/sbin/sendmail"
備註:
 1.這支程式主要是針對dovecot的登入訊息做分析,主要格式如下:
  Jul 18 17:50:57 msg dovecot: pop3-login: Disconnected: user=<root>, method=PLAIN, rip=192.168.1.244, lip=192.168.1.245
  如LOG內容格式不同需針對blockpop3及blocktime.pl裡的LOG篩選條件做修改
 2.預設封鎖條件是只有封鎖TCP 110,可視情況修改IPTABLES規則對攻擊IP作完全封鎖。

參考程式:Vixual 網路視野 如何及時封鎖想要用「暴力法」以 SSH 入侵的使用者

61 意見:

匿名 提到...

請問
發信程式
sendmail="/usr/sbin/sendmail"
這裡如果我是用postfix的話直接改成
postfix="/usr/sbin/postfix"
這樣可以嗎?

匿名 提到...

另外我發現使用這個每5分鐘就會有信件寄給root這樣下去信箱一下就暴了,內容是/bin/bash: /usr/bin/blockpop3: Permission denied
存取被拒絕,這是甚麼意思

Yow 提到...

sendmail="/usr/sbin/sendmail"的部分建議維持原有設定,這邊指的是Mail的程式,不是MTA,Linux預設都有sendmail程式,您可以執行/usr/sbin/sendmail 試試看會不會有錯誤?
PS.開頭的第一個sendmail是變數,如變更的話須連程式內的變數一起修改

執行blockpop3時的Permission denied錯誤,請檢查blockpop3的權限是不是755?以及crontab執行的身分是不是root?

匿名 提到...

現在變成另一個訊息
/usr/bin/blockpop3: /usr/bin/blocktime.pl: /usr/bin/perl^M: bad interpreter: No such
file or directory

black*的我全部都有設定成755

Yow 提到...

請試著執行 /usr/bin/perl -v 看看有沒有perl的說明訊息? 如沒有請確認perl的執行路徑。

如果/usr/bin/blocktime.pl的程式是在Windows下編輯(複製貼上)的,請試著執行
dos2unix /usr/bin/blocktime.pl 後
再看看能不能正常運作blockpop3

或是直接使用 wget 下載程式至Linux中。

匿名 提到...

HI~照您的教法我的root好像都不會在收到錯誤信件了感謝

Yow 提到...

恭喜~
可以試著做錯誤登入,看會不會被封鎖~

匿名 提到...

哈~完全不會測...我用outlook將密碼打錯也沒看他封鎖我..

Yow 提到...

outlook將密碼多打錯幾次後,
去看/var/log/maillog的紀錄,
看有沒有出現很多"pop3-login: Disconnected....."的訊息,當五分鐘內超過三次時,即會進行封鎖的動作。

也可以手動執行/usr/bin/blockpop3來進行測試~

匿名 提到...

您好我安裝好以後都會出現以下訊息
Name "main::hour" used only once: possible typo at /usr/bin/blocktime.pl line 23.
Name "main::day" used only once: possible typo at /usr/bin/blocktime.pl line 23.
Name "main::second" used only once: possible typo at /usr/bin/blocktime.pl line 23.
Name "main::minute" used only once: possible typo at /usr/bin/blocktime.pl line 23.
Argument "Apr" isn't numeric in numeric gt (>) at /usr/bin/blocktime.pl line 30.
請問是哪裡要修改呢?

Yow 提到...

前面幾個 Name "main::hour".... 的部份是因為有宣告變數未使用到的警告,並不影響運作,如在意,可在第23行前加入:
$second = 0;
$minute = 0;
$hour = 0;
$day = 1;
$month = 1;
$year = 1970;

至於Argument "Apr" isn't numeric的部份,是指月份的"Apr"不是數字,檢查一下:
%month = (
Jan => 0,
Feb => 1,
Mar => 2,
Apr => 3,
May => 4,
Jun => 5,
Jul => 6,
Aug => 7,
Sep => 8,
Oct => 9,
Nov => 10,
Dec => 11
);
這部分是否有執行到?

匿名 提到...

HI您好~我不太清楚您所說的[這部分是否有執行到]是甚麼意思...不過我把它改成這樣
%month = (
Jan => 0,
Feb => 1,
Mar => 2,
Apr => 3,
May => 4,
Jun => 5,
Jul => 6,
Aug => 7,
Sep => 8,
Oct => 9,
Nov => 10,
Dec => 11
);

$time = time();
$second = 0;
$minute = 0;
$hour = 0;
$day = 1;
$month = 1;
$year = 1970;
($second,$minute,$hour,$day,$month,$year) = localtime($time);

@list = `cat $log | grep "pop3-login: Disconnected"`;
但是還是有問題EMAIL會收到這樣的信件在36行有問題
Argument "Apr" isn't numeric in numeric gt (>) at /usr/bin/blocktime.pl line 36.

Yow 提到...

請看一下第一行是不是
#!/usr/bin/perl

匿名 提到...

這是我的blocktime.pl檔
#!/usr/bin/perl -w
$log = $ARGV[0];
$range = $ARGV[1];

use Time::Local;

%month = (
Jan => 0,
Feb => 1,
Mar => 2,
Apr => 3,
May => 4,
Jun => 5,
Jul => 6,
Aug => 7,
Sep => 8,
Oct => 9,
Nov => 10,
Dec => 11
);

$time = time();
$second = 0;
$minute = 0;
$hour = 0;
$day = 1;
$month = 1;
$year = 1970;
($second,$minute,$hour,$day,$month,$year) = localtime($time);

@list = `cat $log | grep "pop3-login: Disconnected"`;

for(my $i = $#list; $i >= 0; $i--){
my($log_month,$log_day,$log_time) = split(/ +/,$list[$i]);
my($log_hour,$log_minute,$log_second) = split(/:/,$log_time);
if($log_month > $month){
$log_year = $year - 1;
}else{
$log_year = $year;
}
$log_time = timelocal($log_second,$log_minute,$log_hour,$log_day,$month{$log_month},$log_year);
if($time < $log_time + $range )
{
$list[$i] =~ s/\n//;
`echo "$list[$i]" >> catchlog`;
}else{
last;
}
}
exit;

Yow 提到...

請把有問題的那行改成

if($month{$log_month} > $month)

把$log_month變數轉成數字

匿名 提到...

HI 請問如果有被成功封鎖的IP要如何解除被封鎖的IP呢~感謝

Yow 提到...

重新套用IPTABLES的規則即可

匿名 提到...

您是指
service iptables restart
ㄚ捏?

Yow 提到...

如果您原本有設定iptables規則的話,執行
sh /etc/iptables.rule

linus 提到...

非常感謝你提供這麼好的程式與教學,已經裝上並且能運作了,謝謝!! ^^

匿名 提到...

你好, 我試著RUN一下, 結果出現下列結果, 除了日期未宣告之外, 這是正常的嗎?

[root@mail /]# . /usr/bin/blockpop3
: command not found
: command not found
: command not found
: command not found
: command not found
Name "main::hour" used only once: possible typo at /usr/bin/blocktime.pl line 23.
Name "main::day" used only once: possible typo at /usr/bin/blocktime.pl line 23.
Name "main::second" used only once: possible typo at /usr/bin/blocktime.pl line 23.
Name "main::minute" used only once: possible typo at /usr/bin/blocktime.pl line 23.
: 沒有此一檔案或目錄g
: 沒有此一檔案或目錄g
cat: catchlog: 沒有此一檔案或目錄
cat: catchsasl: 沒有此一檔案或目錄
: command not found
awk:
' in expressionchar '

Yow 提到...

這樣不正常~ 不應該出現這種錯誤訊息

程式第一行是 #!/bin/bash 嗎?
可以執行 /usr/bin/perl -v 嗎?
試試看把程式註解中文的部份拿掉看看

匿名 提到...

謝囉, 我把全部註解消去就沒那些訊息了

匿名 提到...

你好,我執行 /usr/bin/blockpop3 出現下列錯誤 請問怎解??

Scalar found where operator expected at /usr/bin/blocktime.pl line 38, near ")
$log_year"
(Missing operator before $log_year?)
syntax error at /usr/bin/blocktime.pl line 38, near ")
$log_year "
syntax error at /usr/bin/blocktime.pl line 39, near "}else"
Execution of /usr/bin/blocktime.pl aborted due to compilation errors.
/usr/bin/blockpop3: /usr/bin/blocksasl.pl: /usr/bin/perl^M: bad interpreter

匿名 提到...

你好:
我執行 /usr/bin/blockpop3
出現 /usr/bin/blockpop3: /usr/bin/blocksasl.pl: /usr/bin/perl^M: bad interpreter: No such file or directory的錯誤訊息,拜讀上列PO文
執行 /usr/bin/perl -v 可以看到
This is perl, v5.8.8 built for i386-linux-thread-multi...的說明
也做過dos2unix /usr/bin/blocktime.pl 結果還是一樣
請問問題出在那?應該怎解決 謝謝~

Yow 提到...

註解的地方都拿掉了嗎?
執行 dos2unix /usr/bin/blocksasl.pl 後再試試看

Yow 提到...

Scalar found where operator expected at /usr/bin/blocktime.pl line 38, near ")
$log_year"
的問題,先檢查看看程式碼是否有完整?

匿名 提到...

你好,
執行 dos2unix /usr/bin/blocksasl.pl 後確定OK了 太感謝你了~

匿名 提到...

你好,我安裝與設定blockpop3完成後,
Cron /usr/bin/blockpop3出現這個訊息,是怎回事?
iptables v1.3.5: host/network `::ffff:77.78.67.126' not found Try `iptables -h' or 'iptables --help' for more information.
iptables v1.3.5: host/network `::ffff:77.78.67.126' not found Try `iptables -h' or 'iptables --help' for more information.

Yow 提到...

你有開啟IPV6?
看看 /var/log/maillog 裡POP3登入失敗部分的LOG是寫什麼內容?

匿名 提到...

你好,那是前幾天的訊息,今天看到的訊息是這樣
Feb 21 02:58:21 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:23 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:24 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:33 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:34 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:34 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:44 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:50 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:52 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:53 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:55 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:55 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:58:56 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:59:04 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:59:06 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:59:16 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 02:59:36 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 03:00:02 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 03:00:11 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
Feb 21 03:00:20 ltpms1 dovecot: pop3-login: Disconnected: Inactivity: user=, method=PLAIN, rip=::ffff:77.78.67.126, lip=::ffff:xx.xx.xx.xx
看來好像沒block到

Yow 提到...

這是因為IPV6格式的關係,
改一下 vim /usr/bin/blockpop3
大約在 25、27行

sed 's/^.*rip=//g'

的部份,改成

sed 's/^.*rip=::ffff://g'

這樣再試試看~

匿名 提到...

你好:

cat catchlog | sed 's/^.*rip=//g' | sed 's/\,.*$//g' | sed '/127.0.0.1/d' | awk '{print $1}' > fixlog
改成
cat catchlog | sed 's/^.*rip=::ffff://g' | sed 's/\,.*$//g' | sed '/127.0.0.1/d' | awk '{print $1}' > fixlog
這樣對嗎??

Yow 提到...

對~ 有兩行要改

匿名 提到...

你好
cat catchlog | sed 's/^.*rip=::ffff://g' | sed 's/\,.*$//g' | sed '/127.0.0.1/d' | awk '{print $1}' > fixlog
cat catchsasl | sed 's/^.*rip=::ffff://g' | sed 's/\].*$//g' | sed '/127.0.0.1/d' | awk '{print $1}' >> fixlog
是這樣嗎??
之前第兩行格式是這樣
cat catchsasl | sed 's/^.*\[//g' | sed 's/\].*$//g' | sed '/127.0.0.1/d' | awk '{print $1}' >> fixlog
都改成跟上頭一樣嗎?

Yow 提到...

只有改有 rip= 的那兩行

cat catchsasl 的部份,你看一下maillog裡有沒有 "SASL LOGIN authentication failed" 的訊息?

匿名 提到...

你好,
有關RIP 只有

cat catchlog | sed 's/^.*rip=::ffff://g' | sed 's/\,.*$//g' | sed '/127.0.0.1/d' | awk '{print $1}' > fixlog這一排 所以我只改這一行而已,還是我的檔有問題?

另LOG沒找到SASL LOGIN authentication failed"的訊息

Yow 提到...

沒錯~rip的只有那一行~
另一行SASL的應該是要改成

cat catchsasl | sed 's/^.*\[::ffff://g' | sed 's/\].*$//g' | sed '/127.0.0.1/d' | awk '{print $1}' >> fixlog

如果沒有用SASL驗證的話,這一行不會用到

匿名 提到...

你好,謝謝你不厭其煩地幫我解決問題,謝謝你,有問題再跟你請教

匿名 提到...

YOW大大你好,
昨天有跟你請教一堆問題,謝謝你幫我解決,不過今天我看了今天的LOG
Feb 23 08:07:27 ltpms1 dovecot: pop3-login: Aborted login: user=, method=PLAIN, rip=::ffff:24.128.222.212, lip=::ffff:xx.xx.xx.xx
.
.
Feb 23 08:55:57 ltpms1 dovecot: pop3-login: Aborted login: user=, method=PLAIN, rip=::ffff:24.128.222.212, lip=::ffff:xx.xx.xx.xx
Feb 23 08:56:07 ltpms1 dovecot: pop3-login: Aborted login: user=, method=PLAIN, rip=::ffff:24.128.222.212, lip=::ffff:xx.xx.xx.xx
這一小時內至少有50000條從這IP的攻擊
,都沒有BLOCK到ㄟ,也沒出現錯誤訊息

Yow 提到...

有更新版本的POP3規則
http://i-yow.blogspot.com/2011/02/v1.html

置換一下原本的檔案,之前改的IPV6的部分(::ffff:)還是要再修正。

david 提到...

大大您好~
安裝後,參照以上討論修正,還有出現
/usr/bin/blockpop3: 38: /bin/awk: not found
請教大大如何解決呢?感謝~

Yow 提到...

你沒有安裝到 awk 嗎?
試試
yum install awk
來安裝,或是
find / -name awk
找找看awk的位置在哪?

david 提到...

大大您好~
我有確定awk己安裝,系統安裝版本是Ubuntu 11.04,是否有影響~
確認路徑
find / -name awk
/etc/alternatives/awk
/var/lib/dpkg/alternatives/awk
/usr/bin/awk
是否要改blockpop3內的指向呢!
麻煩您了
(或您有私人信箱,我傳訊息給您)

Yow 提到...

試試把blockpop3內38行awk指令的路徑改為

/usr/bin/awk

david 提到...

感謝大大~
blockpop3內的路徑指向
/usr/bin/awk '
就OK了,這個簡單的問題是我沒注意到,還麻煩您真不好意思,感謝~

Mariner 提到...

感謝提供
雖然花了點時間修改
但從大家留言問問題的地方 大致就可以解決了
非常感謝

Yow 提到...

很高興你們喜歡~

匿名 提到...

請問一下,我手動執行
/usr/bin/blockpop3 會成功的將入侵的IP加到 iptables
可是,我使用 crond 的話,就不行,查看 /var/log/cron 也有出現 crond[27009]: (root) CMD (root /usr/bin/blockpop3) 記錄

不曉得是哪邊有問題,看哪位神人可以幫忙我,謝謝

匿名 提到...

Sorry, 我找到原因了...
原來不能用 crontab -e,要直接vi /etc/crontab 才可以

匿名 提到...

請問一下,我在maillog裡面看到下面的訊息
dovecot: pop3-login: Aborted login: user=, method=PLAIN, rip=::ffff:115.115.66.136,
last message repeated n times

因為blockpop3是抓重覆的 pop3-login: Aborted login
但是凌晨的時候沒有其他人在使用主機,就會產生這個狀況

有什麼方法可以把重覆攻擊的記錄完全寫入log,而不是顯示上一個訊息重覆n次呢??

Yow 提到...

阿...我之前沒注意到這點....
剛剛查了一下,在Linux裡要關閉訊息合併的話,似乎需要另外裝 rsyslog 來管理.....

等有空改版時,把last message repeated n times一起加進去計算好了~

匿名 提到...

YOW大,
程式已經很好用了,我只是偶然發現到凌晨有人在攻擊主機
其實用fail2ban也是同樣的狀況,好像看/var/log/secure裡面反而是逐一列出

說不定不用大改,直接把logfile改到 /var/log/secure 呢?

匿名 提到...

請問,原本一直都使用正常,但不知道什麼情形,今天凌晨開始變成每五分鐘就重複送出已封鎖的訊息,過五分鐘又送,結果信箱都被灌爆了,奇怪!我沒做任何設定的修改耶,不知道哪的問題或是有沒有人碰到這問題,救我呀!

匿名 提到...

[root@mail bin]# /usr/bin/blockpop3
/usr/bin/blockpop3: line 25: blockpop3.pl: command not found

進/bin/blockpop3看24行為blockpop3.pl $log $range

新程式並沒有blockpop3.pl 這檔案,不知這邊正不正確?

Yow 提到...

有 blockpop3.pl 呀~
新增:
◎blockpop3.pl:新增POP3紀錄判斷http://blockpop3.googlecode.com/files/blockpop3.pl

訪客 提到...

我今天也發生了一樣的情況,range="300"感覺是抓取LOG的秒沒發生作用,所以只要一檢查就一直重覆封鎖,不知道是不是跨到2014年後日期抓法有變?
===========
請問,原本一直都使用正常,但不知道什麼情形,今天凌晨開始變成每五分鐘就重複送出已封鎖的訊息,過五分鐘又送,結果信箱都被灌爆了,奇怪!我沒做任何設定的修改耶,不知道哪的問題或是有沒有人碰到這問題,救我呀!

Yow 提到...

對...應該是因為跨年後日期判斷的問題,不過還沒去細部研究....我目前是先用執行一次 /usr/sbin/logrotate -vf /etc/logrotate.conf 來將LOG檔更新,更新後就不會有跨年的日期了~ 抱歉造成大家的困擾....

電腦農夫 提到...

請問 我的錯誤訊息
/usr/bin/blockpop3: line 45: unexpected EOF while looking for matching `"'
/usr/bin/blockpop3: line 50: syntax error: unexpected end of file

Yow 提到...

檢查一下 blockpop3 裡, admin 跟 sendmail 這兩個變數的值;
檢查 blockpop3 45行,是不是有多什麼符號?

電腦農夫 提到...

還是不行,但是謝謝您~︿︿

##EasyReadMore##