本文分析一个远程控制木马,它的众多恶意行为之一是操作注册表,实现开机自启动,在注册表中程序为自己命名为Kris。
样本类型:PE32 executable (GUI) Intel 80386, for MS Windows, UPX compressed
在国内某款知名沙箱系统中对恶意程序做自动分析,归纳出的执行流程如下:
图1:程序的执行流程
自动分析的结果,归纳出此恶意程序有如下行为:
1.连接域名jesso.3322.org(59.42.71.178,广东省广州市白云区)
2.释放名为BJ.exe的可执行程序
3.创建进程,此进程会创建互斥体,并且连接动态域名
通过PEiD检查出该病毒被加壳,可以使用upx脱壳。本文后面分析的是利用upx对原程序脱壳后的PE文件。
图2:通过PEiD检测恶意程序的加壳情况
恶意程序会创建HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\Kris,键值为C:\Users\vbccsb\AppData\Local\Temp\sample.exe,此文件为原程序将自身拷贝到这个目录下,用于来实现开机自启动。
恶意程序还会检查注册表中是否有360safe,来判断宿主机器中是否安装了杀毒软件。
运行恶意程序,并用wireshark抓包,发现恶意程序会发起针对jesso.3322.org的DNS查询:
图3:恶意代码的网络行为
但是后续没有实质性的网络通信,经查,此IP地址仍旧存活但是域名已经失效:
图4:与C2地址的网络通信
根据国内知名安全厂商的威胁情报显示,域名和IP地址都是恶意的。
图5:域名的威胁情报
图6:IP地址的威胁情报
程序的Main函数位于0x0040D990,首先会通过sub_47866C函数创建BJ.exe文件,随后调用sub_40D950函数延时60秒执行此文件。
图7:创建BJ.exe并延时60s执行
程序会通过注册表查看系统中是否安装了360安全软件,如果没有安装,那么就调用sub_40D630函数,此函数用于实现开机自启动。
图8:通过注册表检查目标系统中的360防护软件
通过sub_40D630函数通过注册表项“SOFTWARE\Microsoft\Windows\CurrentVersion\Run”实现开机自启动。
图9:通过注册表实现开机自启动
Main函数会连接远程网址jesso.3322.org,通过sub_403300函数发起连接。
图10:连接域名jesso.3322.org
恶意代码中的函数sub_40A050通过switch结构,实现了不同的恶意行为分支,即根据得到的指令,执行不同的操作。概述如下:
sub_409C00:创建新用户并添加到管理员组
sub_408070:提升进程权限
sub_4073E0:窃取系统磁盘信息并发送给远程主机
sub_4075A0:窃取桌面信息并发送给远程主机
sub_407760:窃取音频设备信息并发送给远程主机
sub_407920:击键记录器
sub_409320:关闭防火墙
sub_407F80:删除日志文件
3.2.1 创建新用户并添加到管理员组
sub_409C00函数实现创建新用户并添加到管理员组的功能:
图11:用于添加用户并添加到管理员组的switch分支
通过调用函数NetUserAdd添加用户账户,随后调用NetLocalGroupAddMember函数,将新建的用户添加到管理员组。
图12:sub_409C00函数实现添加用户并添加到管理员组的功能片段
3.2.2 提升权限
sub_408070实现提升进程权限的功能:
图13:用于实现提升权限的switch分支
通过OpenProcessToken得到进程的令牌句柄,随后使用LookupPrivilegeValue查询进程权限,最后用AdjustTokenPrivileges函数提升权限。
图14:sub_408070函数用于提升进程权限的功能片段
3.2.3 获取驱动器和磁盘卷信息并发送给远端主机
sub_4073E0函数用于获取磁盘以及驱动器的信息并发送给远端系统。它最终通过sub_405AC0来实现获取磁盘信息的功能,通过sub_403300用来实现连接远程主机并发送信息的功能。
图15:用于实现获取磁盘信息并发送给远程主机的switch分支
sub_405AC0函数通过调用GetVolumeInformation获取磁盘卷信息,同时通过SHGetFileInfo函数获取文件系统对象的信息。
图16:sub_405AC0函数用来获得磁盘信息
sub_403300函数通过一系列套接字函数实现网络通信,将窃取的信息发送给远程主机
图17:sub_403300函数用来与远程主机通信
3.2.4 获取桌面信息并发送给远端主机
sub_4075A0通过调用sub_40F780函数实现截屏功能,发送给远端主机的功能仍然是通过sub_403300函数实现的,与3.2.3中相同。
图18:用于实现获取桌面信息并发送给远端主机功能的switch分支
sub_40F780函数通过调用GetThreadDesktop得到桌面窗口所在线程,然后调用GetUserObjectInformation获取特殊的窗口站和桌面对象信息。
图19:sub_40F780函数实现获取桌面信息的功能
3.2.5 窃取音频设备信息并发送给远端主机
sub_407760函数通过sub_401760函数窃取音频设备信息并通过sub_403300函数来实现连接远程主机并发送的功能,sub_403300在上面已经提到了。
图20:用于实现窃取音频设备信息的switch分支
通过调用waveInGetNumDevs获得就绪的波形声音输入设备的数量:
图21:sub_401760函数获得系统中波形声音输入设备的数量
3.2.6 击键记录器
sub_407920函数会调用sub_40A580函数实现击键记录功能,并且调用sub_403300函数向远程主机发送信息:
图22:用于实现击键记录器的switch分支
sub_40A580函数调用GetKeyState, GetAsyncKeyState, GetKeyState三个函数实现击键记录的功能。
图23:sub_40A580函数实现击键记录功能
3.2.7 关闭防火墙
sub_409320函数通过sub_409240函数实现关闭防火墙的操作:
图24:用于实现关闭防火墙功能的switch分支
sub_409240函数构造”cmd /c net stop sharedaccess”指令,实现关闭Internet连接共享和防火墙服务的功能:
图25:sub_409240函数实现关闭防火墙的功能
3.2.8 删除日志文件
恶意代码通过sub_407F80函数实现删除日志文件的功能:
图26:用于实现删除日志文件功能的switch分支
程序首先通过OpenEventLog函数打开日志文件,如果成功打开,就调用ClearEventLog函数清除日志文件中的内容,最后通过CloseEventLog函数关闭日志文件。
图27:sub_407F80函数实现删除日志的功能
此样本是一个简单的远控木马,通过访问C2服务器获取指令,然后根据Switch分支操作执行诸如: 创建新用户并添加到管理员组、 提升进程权限、 窃取系统磁盘信息并发送给远程主机、 窃取桌面信息并发送给远程主机、 窃取音频设备信息并发送给远程主机、 击键记录器、 关闭防火墙、 删除日志文件等危险的操作。程序本身还会有拷贝自身、延时执行、查询系统中是否安装安全软件的操作,并以此来确保自身的安全,同时还会通过修改注册表实现开机自启动。
*本文作者:navyofficer,转载来自FreeBuf.COM
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.