☆ 防御
我们没有时间完成这部分内容,任何针对stream/stream2 [12]或者其它DDoS工具 [08]的防御讨论都可一试。最后,看在上帝的份上,网管、系管们做好自身的安全防 卫工作吧,我晕倒。
☆ 弱点
由于Attacker、Handler、Agent之间的通讯未加密,很容易被Sniffer、Hijack等等。
Agent(s)不对命令来源做任何验证,我们可以利用"ping/pong"特性找出那些当前未做攻击的Agent(s)。
"pong"是Agent到Handler的唯一响应,"newserver"是Agent第一次启动时发给 Handler的。附录D介绍了Agent的安装,每次系统重启都会启动Agent。这意味着在系 统重启时可以抓到"newserver"包,我们不推荐这样去鉴别Agent的存在,至少不该是 首选动作。参看附录D、附录E。
Agent接收到一个格式错误的命令串(比如"stream foo bar")时,将发生 segmentation fault,导致Agent(s)不可用,但是很可能在系统重启时恢复工作。
向Agent发送太多命令导致打开的文件句柄过多而最终停止响应。
Agent进程是单线程的,意味着在攻击中它无法处理来自Handler的命令,一旦攻击开 始,Agent将失去控制。
Agent工作在多种flood攻击模式下时,攻击列表中的所有主机遭受同样时间长度的攻 击以及同样类型的攻击(比如ICMP主机不可达、TCP RST)。
☆ 可能的修正
1) Handler上针对到自己的连接请求做源端口过滤
2) 在Handler与Agent之间增加验证机制
3) 报文大小可选
4) 允许指定flood packets的TCP标志(ACK、RST、NUL、random、whatever)
5) Attacker与Handler之间的通讯加密
6) 增加内置命令
☆ 附录B - 检测mstream的snort规则
alert UDP any any -> any 6838 (msg: "IDS100/ddos-mstream-agent-to-handler"; content: "newserver"; )alert UDP any any -> any 10498 (msg: "IDS101/ddos-mstream-handler-to-agent"; content: "stream/"; )alert UDP any any -> any 10498 (msg: "IDS102/ddos-mstream-handler-ping-to-agent" ; content: "ping";)alert UDP any any -> any 10498 (msg: "IDS103/ddos-mstream-agent-pong-to-handler" ; content: "pong";)alert TCP any any -> any 12754 (msg: "IDS109/ddos-mstream-client-to-handler"; flags: S;)alert TCP any 12754 -> any any (msg: "IDS110/ddos-mstream-handler-to-client"; content: ">"; flags: AP;)alert TCP any any -> any 15104 (msg: "IDS111/ddos-mstream-client-to-handler"; flags: S;)alert TCP any 15104 -> any any (msg: "IDS112/ddos-mstream-handler-to-client"; content: ">"; flags: AP;)
☆ 附录C - 检测mstream的RID模板
start mstream-wildsend udp dport=10498 data="ping"recv udp dport=6838 data="pong" nmatch=2end mstream-wildstart mstream-publishedsend udp dport=7983 data="ping"recv udp dport=9325 data="pong" nmatch=2end mstream-published
scz注: 这里错误地使用了减号'-',证明这个模板是未经验证的
☆ 附录D - 最初的Agent系统的入侵和踪迹隐藏
通过检查Agent系统、询问管理员,确认发生过两次独立的入侵。第一个在2000年3月31之前,/etc/passwd中留下了"inertia"帐号,管理员于4月1号删除了该帐号。上载 安装rootkit (lrk4)和DDoS Agent ("rpc.wall")是在4月13号16:02(这里提及的所有 时间,除非特别声明,均为美国/太平洋时间或GMT-0700时间),留有ADM named攻击 的痕迹,4月15号05:55还登录了一次。系统日志被删除、擦除过,所以无法根据日志 判断发生过什么。
Dan Farmer和Wietse Venema提供过一个"Coroner's Toolkit [16]",利用其中的 "mactime"还是可以看到入侵者的某些行为。下列输出中的年份100显然是Y2K问题。--------------------------------------------------------------------------Apr 13 100 16:02:42 12060 .aa -rwxr-xr-x root/www root /bin/chown12660 m.m -r-sr-xr-x root/www bin /bin/loginApr 13 100 16:02:43 2048 mcmc drwxr-xr-x root/www root /bin12660 cc -r-sr-xr-x root/www bin /bin/login168748 .a. -rwxr-xr-x root/www root /usr/bin/as64796 .a. -rwxr-xr-x root/www root /usr/bin/egcs64796 .a. -rwxr-xr-x root/www root /usr/bin/gcc64796 .a. -rwxr-xr-x root/www root /usr/bin/i386-redhat-linux-gcc168496 .a. -rwxr-xr-x root/www root /usr/bin/ld12656 m.c -rws--x--x root/www root /usr/bin/old12656 m.c -r-xr-xr-x root/www bin /usr/bin/xstat2315 .a. -rw-r--r-- root/www root /usr/include/_G_config.h1313 .a. -rw-r--r-- root/www root /usr/include/alloca.h4090 .a. -rw-r--r-- root/www root /usr/include/arpa/inet.h3451 .a. -rw-r--r-- root/www root /usr/include/bits/byteswap.h13327 .a. -rw-r--r-- root/www root /usr/include/bits/confname.h168 .a. -rw-r--r-- root/www root /usr/include/bits/endian.h2283 .a. -rw-r--r-- root/www root /usr/include/bits/errno.h5107 .a. -rw-r--r-- root/www root /usr/include/bits/fcntl.h4647 .a. -rw-r--r-- root/www root /usr/include/bits/in.h3406 .a. -rw-r--r-- root/www root /usr/include/bits/posix_opt.h2842 .a. -rw-r--r-- root/www root /usr/include/bits/select.h4673 .a. -rw-r--r-- root/www root /usr/include/bits/sigset.h1716 .a. -rw-r--r-- root/www root /usr/include/bits/sockaddr.h9033 .a. -rw-r--r-- root/www root /usr/include/bits/socket.h1297 .a. -rw-r--r-- root/www root /usr/include/bits/stdio_lim.h2015 .a. -rw-r--r-- root/www root /usr/include/bits/time.h4673 .a. -rw-r--r-- root/www root /usr/include/bits/types.h1781 .a. -rw-r--r-- root/www root /usr/include/bits/uio.h1798 .a. -rw-r--r-- root/www root /usr/include/endian.h2481 .a. -rw-r--r-- root/www root /usr/include/errno.h4579 .a. -rw-r--r-- root/www root /usr/include/fcntl.h9433 .a. -rw-r--r-- root/www root /usr/include/features.h5861 .a. -rw-r--r-- root/www root /usr/include/getopt.h973 .a. -rw-r--r-- root/www root /usr/include/gnu/stubs.h10291 .a. -rw-r--r-- root/www root /usr/include/libio.h17327 .a. -rw-r--r-- root/www root /usr/include/netdb.h10779 .a. -rw-r--r-- root/www root /usr/include/netinet/in.h1591 .a. -rw-r--r-- root/www root /usr/include/netinet/in_systm.h9086 .a. -rw-r--r-- root/www root /usr/include/netinet/ip.h4855 .a. -rw-r--r-- root/www root /usr/include/netinet/tcp.h2550 .a. -rw-r--r-- root/www root /usr/include/rpc/netdb.h6467 .a. -rw-r--r-- root/www root /usr/include/stdint.h20816 .a. -rw-r--r-- root/www root /usr/include/stdio.h27654 .a. -rw-r--r-- root/www root /usr/include/stdlib.h13245 .a. -rw-r--r-- root/www root /usr/include/string.h2104 .a. -rw-r--r-- root/www root /usr/include/strings.h4932 .a. -rw-r--r-- root/www root /usr/include/sys/cdefs.h3359 .a. -rw-r--r-- root/www root /usr/include/sys/select.h7996 .a. -rw-r--r-- root/www root /usr/include/sys/socket.h1577 .a. -rw-r--r-- root/www root /usr/include/sys/sysmacros.h5337 .a. -rw-r--r-- root/www root /usr/include/sys/time.h5299 .a. -rw-r--r-- root/www root /usr/include/sys/types.h1907 .a. -rw-r--r-- root/www root /usr/include/sys/uio.h9314 .a. -rw-r--r-- root/www root /usr/include/time.h36708 .a. -rw-r--r-- root/www root /usr/include/unistd.h874 .a. -rw-r--r-- root/www root /usr/lib/crtn.o1446620 .a. -rwxr-xr-x root/www root /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/cc146816 .a. -rwxr-xr-x root/www root /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/collect288444 .a. -rwxr-xr-x root/www root /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/cpp1424 .a. -rw-r--r-- root/www root /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/crtend.o5794 .a. -rw-r--r-- root/www root /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stdarg.h9834 .a. -rw-r--r-- root/www root /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h770000 .a. -rw-r--r-- root/www root /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/libgcc.a1957 .a. -rw-r--r-- root/www root /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/specs178 .a. -rw-r--r-- root/www root /usr/lib/libc.so69638 .a. -rw-r--r-- root/www root /usr/lib/libc_nonshared.a6162 .a. -rw-r--r-- 1046 squid /usr/src/linux/include/asm-i386/errno.h1492 .a. -rw-r--r-- 1046 squid /usr/src/linux/include/asm-i386/socket.h277 .a. -rw-r--r-- 1046 squid /usr/src/linux/include/asm-i386/sockios.h305 .a. -rw-r--r-- 1046 squid /usr/src/linux/include/linux/errno.hApr 13 100 16:02:44 702 mcmc -rwxr-xr-x root/www root /etc/rc.d/rc.local1024 mcmc drwxr-xr-x root/www root /root/.ncftp9 mcmc lrwxrwxrwx root/www root /root/.ncftp/history9 mcmc lrwxrwxrwx root/www root /root/.ncftp/log9 mcmc lrwxrwxrwx root/www root /root/.ncftp/trace29696 m.c drwxr-xr-x root/www root /usr/bin17016 m.c -rwxr-xr-x root/www root /usr/bin/rpc.wall8460 .a. -rw-r--r-- root/www root /usr/lib/crt1.o1124 .a. -rw-r--r-- root/www root /usr/lib/crti.o1892 .a. -rw-r--r-- root/www root /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/crtbegin.o. . .Apr 15 100 05:55:09 1024 mcmc drwxr-xr-x root/www root /var/named1024 mcmc drwxr-xr-x root/www root /var/named/ADMROCKSApr 15 100 05:56:19 20437 .a. -rwxr-xr-x root/www root /usr/sbin/tcpdApr 15 100 05:56:20 34 .aa -rw-r--r-- root/www root /usr/libexec/awk/addy.awk35628 .a. -rwxr-xr-x root/www root /usr/sbin/in.telnetdApr 15 100 05:56:26 159576 .a. -rwxr-xr-x root/www root /usr/bin/pico975 .a. -rw-r--r-- root/www root /usr/share/terminfo/v/vt200975 .a. -rw-r--r-- root/www root /usr/share/terminfo/v/vt220--------------------------------------------------------------------------
从这个输出中可以观察到如下信息
2000年4月13号16:02创建/bin/login、运行/bin/chown
与此同时,运行gcc/egcs进行编译,创建了/bin/old和/bin/xstat。.h文件的Access times表明被编译的程序使用了socket
接下来/etc/rc.d/rc.local被修改,在最后增加了一行"/usr/bin/rpc.wall",于是每次重启系统时都会自动启动Agent。ncftp日志文件被修改(先删除,然后符号 链接到/dev/null以阻止ncftp文件传输日志产生)
程序/usr/bin/rpc.wall被修改,C运行时库被访问过,这意味着rpc.wall运行过。
4月15号05:55,似乎有一次针对本机的ADM named远程缓冲区溢出攻击,然后访问 tcpd wrapped service激活in.telnetd。rootkit的配置文件/usr/libexec/awk/addy.awk也被访问过。我们不清楚这是否仅仅碰巧是第三次入侵企图。
6秒后/usr/bin/pico被运行,vt200终端类型。既然被安装了特洛伊木马的login包含"vt200"字符串,可以确认远程root shell后门至少两天前就安装好了。
管理员只删除了/etc/passwd中的"inertia"帐号,并未删除/etc/shadow中的相应内容
--------------------------------------------------------------------------inertia:iUCNir1cd8pI2:::::::--------------------------------------------------------------------------
不到1秒就破解出这个口令"hi" 用strings命令观察/bin/login,带有典型的特洛伊木马特征,一个非标准命令(这里 是/usr/bin/xstat)和一个嵌入式终端类型(vt200)用于激活远程root shell--------------------------------------------------------------------------. . .login/bin/sh/usr/bin/xstatTERMbcshjvmudzwxftejkvt200%s=%sinit.c. . .--------------------------------------------------------------------------
用strings命令观察/bin/ls和/bin/ps,显示rootkit配置文件分别是 /usr/libexec/awk/files.awk和/usr/libexec/awk/ps.awk。另一个配置文件是前面 提到的/usr/libexec/awk/addy.awk。
一个有用的窍门在于标准Linux rootkit编译时(由Makefile决定)保留了调试信息--------------------------------------------------------------------------. . .ls.c/home/XXXXX/stuff/lrk4/fileutils-3.13/src/gcc2_compiled.int:t1=r1;-2147483648;2147483647;char:t2=r2;0;127;. . .--------------------------------------------------------------------------
本机并未使用telnetd支持远程登录,而是SSH。入侵者在/etc/inetd.conf中增加了如下内容--------------------------------------------------------------------------. . .#finger stream tcp nowait root /usr/sbin/tcpd in.fingerd#cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd#systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx#netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat -f inetworking stream tcp nowait root /usr/sbin/tcpd in.telnetd. . .--------------------------------------------------------------------------
然后在/etc/services中增加了如下内容--------------------------------------------------------------------------working 1120/tcp # Kerberos working daemon--------------------------------------------------------------------------
用lsof可以看到这个侦听端口--------------------------------------------------------------------------inetd 353 root 4u IPv4 375 UDP *:talkinetd 353 root 5u IPv4 376 UDP *:ntalkinetd 353 root 6u IPv4 377 TCP *:working (LISTEN)inetd 353 root 8u IPv4 378 TCP *:time (LISTEN)inetd 353 root 10u IPv4 379 UDP *:timeinetd 353 root 11u IPv4 380 TCP *:auth (LISTEN)inetd 353 root 12u IPv4 381 TCP *:linuxconf (LISTEN)-------------------------------------------------------------------------