admin管理员组

文章数量:1639678

Lab 3-1

问题

1.找出这个恶意代码的导入函数于字符串列表。

解答: (动态分析建议用winxp pro 32bit,下面你就知道为什么这么建议了)我们用Dependency Walker会发现这个程序只有很少的导入函数,第一是怀疑是不是加壳了

然后我们PEiD来看,的确是加壳了

然后就开始尝试脱壳了

万能脱壳这次不是万能的了

目前我们知道的唯一个导入函数就是ExitProcess

然后查看一下字符串

前面大部分的字符串都是乱码,但是后面的字符串中可以看出这里有个网址,还有一个vmx32to64.exe,还有一些注册表的位置,然后我们开始开启另一个虚拟机准备进行动态分析

我们准备好必要的软件,然后做好备份快照

第一个就是ApateDNS这个软件

记得把DNS修改为127.0.0.1,然后点运行这个软件实际运行是这样子的

我这是打开了一个浏览器,然后这是浏览器的所有DNS请求,当我在写个博文的时候,这个表还一直往下刷新着

然后就是安装INetSim,这个只能安装在Linux上,所以我打算用CentOS7来安装。

(2017-8-29)


(2018-8-31)

经过一天的努力,终于在CentOS7上安装成功了,安装博文在这里 —> 安装INetSIm在CentOS7上

后面附上了部署好INetSimCentOS镜像下载链接

那我们继续分析这个恶意代码

2.这个恶意代码在主机上的感染迹象特征是什么?

解答: 那就开始动态分析了

我们先配置用于运行病毒程序的虚拟机的网络(注意,最好不是静态分析的那台主机,因为这台虚拟机只需要比较小的硬盘分配,然后少量必要的分析软件,这样每次备份可以只占很小的内存,如果是静态分析那台机器,每次备份都是好几10G

ip地址可以随便设为内网中一个没有人用的IP,然后子网掩码按实际情况填写,最后就是网关这里,设置为我们安装好INetSim那台机器的IP,我这里是192.168.0.107,然后DNS设置为本机127.0.0.1,因为我们在本机装了ApateDNS,所以设为本机可以看到恶意代码请求的DNS

然后访问INetSim的IP地址,看看端口开了没有,服务起了没有

如果没起,去/home/inetsim/inetsim-xxx/下起一下,然后/root/下开端口脚本运行一下

然后这时候我们最后一次做一次windows的快照,准备运行恶意代码分析

确保你的虚拟机上安装了这么几个软件

然后劳资准备了这么多,竟然windows7运行不了。。。看来只能换winxp了,以后动态分析全都迁移到winxp上

Windows 7 pro x64运行病毒失败

下面我准备了一个Windows XP 32bit版的虚拟机,再试试

Windows XP 32bit 不行,ApateDNS运行不起来,换64bit版本

然后我又从官网下了一个,还是不行,运行不了

因为官网说了支持XP,不管是32还是64

但是我的就是不行。。。不知道什么原因,镜像是从MSDN我告诉你下的

不管其他了,我们再试试运行病毒看看

Windows XP x86运行失败

然后我们再试试Windows XP pro 64,这也是在MSDN我告诉你下的

用的是网上找到的一个激活码激活的

然后我们开看看能不能运行病毒文件 Lab 03-01.exe

依旧还是不能运行这个病毒

Windows XP PRO x64运行病毒失败

我们再试试其他的XP版本,最后会发现

Windows XP PRO x86运行病毒成功

当我用这个版本的XP去运行病毒的时候,病毒程序没有报错和各种诡异,安静得执行了,ok,我们分析继续

然后恢复运行前快照发现,网卡驱动有问题,上不了网。。。我先下个驱动网卡版再来试试。。。

然后现在的问题是ApateDNS没法在winxp上运行,这就很麻烦了,这本书感觉有点扯

现在是打算用Kali的一个工具来进行DNS的fake,但是这个工具运行在Windows又是各种依赖问题,我打算运行DNSChefCentOS上,虽然INetSim也可以进行fake,但是没法像ApateDNS那样记录DNS查询

从这个网站上下载DNSCHEF

DNSChef

然后缺了几个Python的库,安装一样,确保能运行就ok了

然后我们运行

./dnschef.py --fakeip=192.168.0.107 --logfile=log.txt --interface=192.168.0.108

108是我部署了DNSChef的虚拟机,107是INetSim的虚拟机,remember?

我将所有的DNS查询都指向了192.168.0.107,然后把log存在了log.txt中

记得开端口,我是CentOS 7,所以如果你也是一样的话,执行

firewall-cmd --permanent --zone=public --add-service=dns

然后重载防火墙使其永久生效

firewall-cmd --reload

本地测试可以这样测试是否已经起了DNSChef

将Windows的DNS服务器地址指向108

然后执行

nslookup u

随便打的域名

然后显示这样,就算成功了

如果显示这样的话,说明不成功,这个部署DNSChef的我就不单独拿出来讲了

然后现在我们总算可以开始分析了

在运行之前,我们先做好系统准备,比如建立系统注册表的快照,把wireshark启动,把Process Explore打开之类的,然后准备好之后做系统快照

然后就可以看到这个程序执行了DNS查询

去除那些干扰的地址,我们明显可以看到这么一个地址

放大一点可以看到这是

www.practicalmalwareanalysis

然后这是DNSChef能发现的所有了

然后我们看注册表

可以看出程序一共修改了17处的注册表,其中,增加了2个键,3个值,改变了12个指

新建的键是上面这2个,新建了两个打印的键

新添加的值是上面这3个,一个是开机启动的值,为C:\\WINDOWS\\system32\\vmx32to64.exe

然后的两个是打印机的目录

然后最后就是改变的值的地方,改变一个密钥的种子(下面)

已改变值 (12) 快照 A 
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\RNG] 
"Seed"=hex:c5,31,0a,80,07,17,9a,3b,fe,19,43,51,06,dd,a3,33,fd,9c,a5,bf,f6,66,\
  b5,6b,15,b1,80,b2,26,54,b0,9e,a4,6b,88,71,13,f6,bc,8c,aa,56,41,25,f1,50,cc,\
  d1,de,22,f3,7a,da,02,9c,3f,1d,49,b2,34,ee,2e,fb,a3,29,a0,8e,39,02,dc,42,db,\
  d5,8e,ed,3a,fc,8f,5d,99 
"Seed"=hex:a3,24,85,6a,69,87,5f,8b,33,ac,2a,eb,0f,d1,dc,b5,45,e4,66,71,8b,a4,\
  5a,c6,64,ab,e4,31,cd,17,ce,25,1a,72,b9,3c,c0,db,38,46,73,5b,50,f6,3b,01,14,\
  07,a8,50,4c,c3,f5,a8,ef,1a,56,00,a0,2c,3b,df,32,f9,32,9d,e1,6a,14,9e,ed,07,\
  cb,8d,e2,d2,15,c7,e0,0a 

然后下面这个Prefetcher是Windows的预取程序,用于程序的快速载入
下面应该是病毒把自己写进了快速启动了

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Prefetcher] 
"TracesProcessed"=dword:00000000 
"TracesProcessed"=dword:00000008 
"TracesSuccessful"=dword:00000000 
"TracesSuccessful"=dword:00000005 
"LastTraceFailure"=dword:00000000 
"LastTraceFailure"=dword:00000004 

下面这个是改一个打印的API的LogonTime(登录时间)

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Providers] 
"LogonTime"=hex:54,c1,de,86,f9,22,d3,01 
"LogonTime"=hex:a6,f1,db,8c,07,23,d3,01 

原始的值如下

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\ESENT] 
"EventMessageFile"=hex(2):63,00,3a,00,5c,00,77,00,69,00,6e,00,64,00,6f,00,77,\
00,73,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,45,00,\
  53,00,45,00,4e,00,54,00,2e,00,64,00,6c,00,6c,00,00,00

把对应的十六进制翻译成ASCII如下,NUL表示空字符

"c", ":", "\", "w", "i", "n", "d", "o", "w", \
"s", "\", "s", "y", "s", "t", "e", "m", "3", "2", "\", "E", \
"S", "E", "N", "T", ".", "d", "l", "l", "NUL"

连起来就是

c:\windows\system32\ESENT.dll

改变后的值如下

"EventMessageFile"=hex(2):43,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00,57,\
  00,53,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,45,00,\
  53,00,45,00,4e,00,54,00,2e,00,64,00,6c,00,6c,00,00,00 

翻译过来就是

"C", ":", "\", "W“, "I", "N", "D", "O", "W", \
"S", "\", "S", "y", "s", "t", "e", "m", "3", "2", "\", "E", \
"S", "E", "N", "T", ".", "d", "l", "l"

也就是

C:\WINDOWS\System32\ESENT.dll

总的来说就将

c:\windows\system32\ESENT.dll

变成了

C:\WINDOWS\System32\ESENT.dll

这两个写法引用的路径是一样的,应该是恶意代码的作者习惯了下面这种写法

原始

"CategoryMessageFile"=hex(2):63,00,3a,00,5c,00,77,00,69,00,6e,00,64,00,6f,00,\
  77,00,73,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,45,\
  00,53,00,45,00,4e,00,54,00,2e,00,64,00,6c,00,6c,00,00,00 

翻译一下:

"c", ":", "\", "w", "i", "n", "d", "o", \
"w", "s", "\", "s", "y", "t", "e", "m", "3", "2", "\", "E", \
"S", "E", "N", "T", ".", "d", "l", "l"

和上面第一个是一样的

c:\windows\system32\ESENT.dll

改变后

"CategoryMessageFile"=hex(2):43,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00,\
  57,00,53,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,45,\
  00,53,00,45,00,4e,00,54,00,2e,00,64,00,6c,00,6c,00,00,00 

这个对照了一下也是和上面一样的

C:\WINDOWS\System32\ESENT.dll

然后就是把小写的c变成了大写的C,字母大小写变了一下,实际引用的位置并没有变

安装网上的说法,ESENT是一种嵌入式数据库引擎,最新版的Windows版本已经内置了esent.dll,不知道这个程序要用数据库干啥

下面这个上面分析了

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Providers] 
"LogonTime"=hex:54,c1,de,86,f9,22,d3,01 
"LogonTime"=hex:a6,f1,db,8c,07,23,d3,01 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\ESENT] 
"EventMessageFile"=hex(2):63,00,3a,00,5c,00,77,00,69,00,6e,00,64,00,6f,00,77,\
  00,73,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,45,00,\
  53,00,45,00,4e,00,54,00,2e,00,64,00,6c,00,6c,00,00,00 

翻译一下就是上面那个

c:\windows\system32\ESENT.dll
"EventMessageFile"=hex(2):43,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00,57,\
  00,53,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,45,00,\
  53,00,45,00,4e,00,54,00,2e,00,64,00,6c,00,6c,00,00,00 

这个也是

C:\WINDOWS\System32\ESENT.dll

下面的一样

"CategoryMessageFile"=hex(2):63,00,3a,00,5c,00,77,00,69,00,6e,00,64,00,6f,00,\
  77,00,73,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,45,\
  00,53,00,45,00,4e,00,54,00,2e,00,64,00,6c,00,6c,00,00,00 
"CategoryMessageFile"=hex(2):43,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00,\
  57,00,53,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,45,\
  00,53,00,45,00,4e,00,54,00,2e,00,64,00,6c,00,6c,00,00,00 

下面是另一个改变了的注册表

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections] 
"SavedLegacySettings"=hex:3c,00,00,00,1c,00,00,00,01,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,04,00,00,00,00,00,00,00,00,7d,f5,a4,f5,22,d3,01,01,00,\
  00,00,c0,a8,00,05,00,00,00,00,00,00,00,00 

翻译一下就是

NUL是空字符, FS是文件分割符, SOH是标题开始, EOT是传输结束

"<", "NUL", "FS", "NUL", "SOH", "NUL", "NUL", "NUL", \
"NUL", "NUL", "NUL", "NUL", "EOT", ...

后面就是一些ASCII的扩展编码了,这个应该不是一个可读的字符串,应该是二进制配置

"SavedLegacySettings"=hex:3c,00,00,00,1d,00,00,00,01,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,04,00,00,00,00,00,00,00,00,7d,f5,a4,f5,22,d3,01,01,00,\
  00,00,c0,a8,00,05,00,00,00,00,00,00,00,00 

还有这个改变处

[HKEY_CURRENT_USER\SessionInformation] 
"ProgramCount"=dword:00000002 
"ProgramCount"=dword:00000004 

然后我们在看进程

用书上的方法,查看Handles,可以发现以下的这么几个handle,倒数第五个就是书中说的创建的那个互斥变量名叫WinVMX32,因为虚拟机分辨率的问题,看的不是很清的样子,然后书中没有说的是正数第六个的\Device\KsecDD的文件描述符

Ksecdd组件提供内核安全设备驱动程序(MSDN)

然后我们再看导入的DLL

书中所说的,导入了ws2_32.dllwshtcpip.dll,说明了它具有联网的功能,这个我们在DNS解析上就可以发现,他会DNS查询一个特殊的网址

书中下一步是用procmon工具来寻找额外的信息

这是从进程中导出的字符串,书上没有说到的

完整的复制出来就是下面这样的

nノnノn
qノn
Nノn
WMV
jjヘ￴
uaE￉
ᅩヒz
Lsᅥ
ᅢIヒテ
eᄑᄌ
yフn
iBナ
f>uテ
Puテ
jjjjjjヘモ
uPナ
!This program cannot be run in DOS mode.
Rich
.text
`.data
ExitProcess
kernel32.dll
cks=u
ttp=
cks=
CONNECT %s:%i HTTP/1.0
QSRW
PWW
thj@h
PWW
VSWRQ
QVlM
^-m-m<|<|<|M
advapi32
ntdll
user32
Jbh
QQVP
ucj
advpack
StubPath
SOFTWARE\Classes\http\shell\open\commandV
Software\Microsoft\Active Setup\Installed Components\
test
www.practicalmalwareanalysis
admin
VideoDriver
WinVMX32-
vmx32to64.exe
SOFTWARE\Microsoft\Windows\CurrentVersion\Run
SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
PWj
AppData
VQj
ViW

我们去除一些无意义的字符串

!This program cannot be run in DOS mode.   //这个是编译器自动生成的,编译器的类型应该是vs的编译器
Rich   //这个很有可能是作者的名字(猜测)
.text   //这个有点像PE头的text字段
`.data   //这个和上面一样,但是多了一个符号,很有可能和上面的一起,是注释
ExitProcess   //有可能是注释
kernel32.dll   // 可能注释
CONNECT %s:%i HTTP/1.0   //这个有可能是程序的printf类的函数的参数,%s可能是域名,%i作用和%d差不多(其实差别很大,但是为了方便理解,这里可以把%i看出%d),应该是端口号
advapi32   //这是提供基本函数的链接库
ntdll   //底层API实现库
user32   //这个是windows用户界面相关应用程序接口
advpack   //用来帮助硬件和软件读取和验证.INF文件,INF是硬件设备制造商发布起驱动程序的一种文件格式(说明这个病毒很有可能要去感染某个驱动)
StubPath   //不明的某个路径
SOFTWARE\Classes\http\shell\open\commandV   //打开一个http的shell command
Software\Microsoft\Active Setup\Installed Components\   //安装程序
test   //可能是注释
www.practicalmalwareanalysis   //恶意域名
admin   //有可能是下载网站或者恶意代码的用户名
VideoDriver   //显卡驱动(很有可能会感染显卡驱动)
WinVMX32-   //那个互斥变量的名字,后面多了一个字符,有可能是注释
vmx32to64.exe   //一个程序的名字
SOFTWARE\Microsoft\Windows\CurrentVersion\Run   //运行其他程序
SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
AppData   //这个,应该是什么吧,不懂

然后我们查找一个vmx32to64.exe有没有在系统中

查找出来了,在C:\WINDOWS\system32下面有这个文件

然后就是用procmon来分析这个程序了,因为在现在不管是微软也好,各大下载网站也好,都提供的是最新版的procmon的下载,这个版本是没法运行在winxp上的,能运行在winxp上的是3.20版本的procmon,如果你找不到,这里有个下载链接(这也是最近才发现的,写最上面的时候还没找到)

链接: https://pan.baidu/s/1qXVhofi 密码: fs3g

然后下面我们用这个procmon来看

我们先通过进程名称(process name)来筛选

然后点ok就行了,它会提示你要不要add,add就可以了

这就是过滤出来的结果,但是结果很多

然后我们在最后的地方,会发现这个有个 tcp连接的标识

用的是https的方式

然后增加过滤为WriteFile可以发现

程序会向系统的一个目录下面写入这么一个文件,然后长度是下面这个7168字节

然后再过滤RegSetValue这个

写入了一个注册表,自动运行vmx32to64.exe

然后后面的分析就是和作者差不多了

最后的结论就是感染迹象就是那个vmx32to64.exe文件的存在与否

3.这个恶意代码是否存在一下有用的网络特征码?如果存在,它们是什么

解答: 网络特征码就是那个恶意域名的解析过程和https的连接

本文完

本文标签: 习题恶意代码实战笔记Lab