Найти тему
Знания - сила!

Не очень люблю всяких хакеров и сканеров уязвимостей. Простенький генератор списков доступа для серверов на Tomcat.

Мне требовалось поднять на своём домашнем Linux сайт для проверки переносимости (не мой! попросили). И параллельно отработать некоторые детали.

Поднял Tomcat, сконфигурировал как виртуальный хост (там ещё тестовый мой болтается - для отработки всякой всячины). Поставил копию нашего совместного, запустил. Всё заработало. Тесты затянулись, как это водится. И почти сразу после подъёма сайта начались попытки его ломать. В основном китаёзы и малазийцы.

Возникала проблема безопасности. Решал так: закидывал очередного любителя что-то поломать в файл server.xml с запретом на доступ. В начале ещё культурно пытался таким возвращать ценный код из 40x, а потом подумал: -Tomcat это вам не Apache! На нём можно больше. И вместо вразумительного кода из разряда 40x/50x, чтобы дурить было проще, стал возвращать в качестве кода год Победы. Благо, Tomcat - это не Apache! Там можно вернуть принципиально любой код, а так как большинство сканеров и программ взлома привыкли общаться по стандарту (всё-таки!), то да будет им нестандартное счастье!

Но любителей посканить много, а генерация листа руками... Влом, словом. Сделал так: egrep выбирал из логов Tomcat коды с 40x/50x и закидывал их во временный файл. Потом этот файл разбирал sed-ом, генерируя уже списки доступа.

1. шаг: Выборка хамов из логов Tomcat:

egrep ' [45][0-9][0-9] ' /var/log/tomcat/*access*{txt,log} | egrep -v 127.0.0\|favicon.ico | awk '{print $1}' | awk -F: '{print $2}' | sort | uniq > /tmp/aaa

в файле /tmp/aaa надо только просмотреть самый верх (там две строки лишние), выкинуть эти строки редактором. Мне было просто лень разбираться откуда они.

2. шаг: Обработка sed-ом:

sed -f AccessValve.sed /tmp/aaa >/tmp/bbb

даёт ПОЧТИ готовый файл для вставки в /etc/tomcat/server.xml (или где он у Вас лежит). Почти. Потому, что если количество строк не кратно шести надо будет исправлять последнюю строку (она не будет корректной).

Файл AccessValve.sed:

# 5 lines to one.

i\

<Valve className="org.apache.catalina.valves.RemoteAddrValve" denyStatus="1945"

{N;s/\n/|/;Te;};

{N;s/\n/|/;Te;};

{N;s/\n/|/;Te;};

{N;s/\n/|/;Te;};

{N;s/\n/|/;Te;};

:e

s/^/ deny="/;s/$/\"\/>/

# Not working Te - branch on false substituion to :e. Why? I did not understand.

Опытным путём выяснил, что по шесть IP в ряд удобнее всего. А вот как выглядит кусок который надо исправлять редактором:

<Valve className="org.apache.catalina.valves.RemoteAddrValve" denyStatus="1945"

deny="93.158.158.73|93.158.158.76|93.174.95.106|93.51.11.154|93.82.100.184|94.176.165.160"/>

<Valve className="org.apache.catalina.valves.RemoteAddrValve" denyStatus="1945"

94.191.50.205|94.244.138.21|95.110.227.199|95.13.70.103|95.96.109.93

Выделенный внизу кусок надо исправить как кусок, который приведён выше (с deny="..."). Комментарий Not working Te - branch on false substituion to :e также относится именно к этому куску. Команда Te, которая должна была перекинуть по отсутствии замены на метку e, не отработала. Или я чего-то не понимаю!

После обработки /tmp/bbb открываешь текстовым редактором /etc/tomcat/server.xml, находишь строку в нужным <Host name=... и вставляешь туда содержимое файла /tmp/bbb после соответствующего <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"...

Всё! Рестарт Tomcat. Можно смотреть на логи и видеть хамов получающих вместо 40x/50x кодов код Победы - 1945. Естественно, что получат такой код только те, кто в листе, но я уже убедился, что в большинстве случаев идут из-под NAT, а NAT держат публичные маршрутизаторы у которых адрес не меняется. Вот пример:

Прямо от сейчас!!!

185.128.41.50 - - [29/Aug/2019:13:30:15 +0400] "GET /manager/html HTTP/1.1" 1945 -

185.128.41.50 - - [29/Aug/2019:13:30:15 +0400] "GET /manager/html HTTP/1.1" 1945 -

185.128.41.50 - - [29/Aug/2019:13:30:16 +0400] "GET /manager/html HTTP/1.1" 1945 -

185.128.41.50 - - [29/Aug/2019:13:30:16 +0400] "GET /manager/html HTTP/1.1" 1945 -

В процессе отладки сканировал адреса с которых ко мне приходили - законом не запрещено! Выяснил, что ломают обычно незакрытые снаружи маршрутизаторы марок NetGear. Вот, кстати!, пример именно от маршрутизатора с адресом выше! Сканировал то ли вчера, то ли позавчера.

Nmap scan report for 185.128.41.50

Host is up (0.088s latency).

Not shown: 998 closed ports

PORT STATE SERVICE VERSION

22/tcp open ssh OpenSSH 6.6.1 (protocol 2.0)

|_ssh-hostkey: 2048 fc:6c:b8:19:3a:e5:13:16:60:8e:41:ca:23:e7:10:d6 (RSA)

179/tcp filtered bgp

Device type: WAP|general purpose|specialized

Running (JUST GUESSING): Netgear embedded (92%), Linux 2.6.X|2.4.X (91%), Linksys Linux 2.4.X (90%), Asus Linux 2.6.X (88%), Crestron 2-Series (88%), Ruckus embedded (87%), TP-Link embedded (87%), D-Link embedded (87%)

Aggressive OS guesses: Netgear DG834G WAP (92%), OpenWrt Kamikaze 7.09 (Linux 2.6.22) (91%), Linux 2.6.22 (Fedora Core 6) (90%), OpenWrt White Russian 0.9 (Linux 2.4.30) (90%), OpenWrt 0.9 - 7.09 (Linux 2.4.30 - 2.4.34) (90%), Linux 2.6.32 (89%), Linux 2.6.34 (89%), Asus RT-N16 WAP (Linux 2.6) (88%), Crestron XPanel control system (88%), Linux 2.6.9 - 2.6.18 (87%)

No exact OS matches for host (test conditions non-ideal).

Как видим, открытый снаружи порт ssh поспособствовал взлому. И это при том, что на этом раутере ещё и BGP есть!!! Потому просьба ко всем админам сетей - ЗАКРЫВАЙТЕ СВОИ РАУТЕРЫ ОТ ДОСТУПА СНАРУЖИ! Пожалуйста!