vbs脚本传播银行木马变体样本

样本分析
VBS 第一阶段
第一阶段是一个高度混淆的独立vbs脚本,它会将包括恶意样本在内的其他有效负载下载到系统上。在这里插入图片描述
vbs脚本前面定义了三个变量,之后重新构造变量,重新组合后,NbCTQqd的值为:

wscrilqpt.exe //E:vbscript
之后通过CreateObject(“Scripting.FileSystemObject”)创建文件系统对象。

接着做了一个路径生成,最终生成的路径是"C:\Users[User]\AppData\Local\Temp\tmp123454321pmt.txt",往下CreateTextFile 创建一个新文本文件。

接着下面全是混淆,借助vs解混淆可以得到完整的内容:在这里插入图片描述
在这里插入图片描述
脚本从提供的URL中下载 pyaloads,并使用 rundll32.exe 执行下一阶段恶意软件,即恶意样本的主体。

Emotet DLL
DIE检查它是一个32位的DLL文件。
在这里插入图片描述
这里调试使用“rundll32.exe”进行加载。Parameters选项用于指定指定程序在启动或调试时所需要的命令行参数,这里使用参数Control_RunDLL。

在这里插入图片描述
一旦该恶意样本文件被“rundll32.exe”加载,它的入口点函数就会被首次调用。然后,它会调用 DllMain() 函数,从“资源”中加载并解密 32 位 Dll 到其内存中。解密的 Dll 是这个恶意样本的核心,由于其中包含一个硬编码的常量字符串,因此在本分析中将其称为“X.dll”。

在这里插入图片描述
在这里插入图片描述
通过System informer可以找到该进程内存的x.dll。

“X.dll"检查命令行参数中的导出函数名称是否为"Control_RunDLL”。如果不是,它会再次使用"Control_RunDLL"而不是其他导出函数(如"C:\Windows\syswow64\rundll32.exe emotet.dll,Control_RunDLL")运行命令行。然后,它会调用ExitProcess()退出第一个"rundll32.exe"。如果初始DLL尚未加载ControL_RunDLL,它会使用API CreateProcessW()运行新命令。

可以借助内存转储工具将X.dll dump出来。在这里插入图片描述
X.dll
我们可以进一步使用转储的 x.dll,并根据当前正在调试的程序重新设置程序,并将导出映射到正在调用的函数。例如,调用 eax 跳转到 x.dll 中的 Export Contro_RunDLL,该 DLL 映射如下图所示:
在这里插入图片描述
从x.dll的Contro_RunDLL开始,为了方便这里将其重命名为Contro_RunDLl_xdll
在这里插入图片描述
在函数sub_1001FCD8的图形视图中可以发现,下。x.dll使用了控制流平坦化的操作,将代码进行了高度混淆。在这里插入图片描述
可以通过给指定函数内的所有调用指令(call)添加断点。

idapython代码如下:

import idautils
import idaapi
import idc

def add_breakpoints_on_calls(func_name):
# Get the function address by name
func_ea = idc.get_name_ea_simple(func_name)
if func_ea == idc.BADADDR:
print(f"Function {func_name} not found!")
return

# Get the function's end address 
func = idaapi.get_func(func_ea) 
if not func: 
    print(f"Function {func_name} not found!") 
    return 

# Iterate through the instructions in the function 
for head in idautils.Heads(func.start_ea, func.end_ea): 
    # Check if it's a call instruction 
    if idc.print_insn_mnem(head) == "call": 
        # Add a breakpoint at the call instruction 
        idc.add_bpt(head) 
        print(f"Breakpoint added at 0x{head:x}") 

print(f"Breakpoints added on all call instructions in function: {func_name}") 

Example: specify the function name where you want to add breakpoints

add_breakpoints_on_calls(“Flatten_func”) #Flatten_func is the “code flow flatenning function that i renamed”
给函数sub_1001FCD8重命名为Flatten_func,可以得到:在这里插入图片描述
字符串混淆
在这里插入图片描述
所有字符串均在x.dll中加密,并在运行时解密。它会解密恶意软件中加载的所有附加库的名称。在这里插入图片描述
API解析
所有 API 都是动态加载的,以避免在静态分析中被检测到。在上面的例子中,我们看到“advapi32.dll”的字符串被解密。在此函数中,它将使用 API LoadLibraryW加载并执行。函数resolve_func负责解析 API 哈希并在比较哈希后返回 API 地址。

在这里插入图片描述
从这里开始,所有 API 都使用 API 哈希解析并执行。
在这里插入图片描述
在这里插入图片描述
它首先检查的是命令行参数,以查看 dll 是否已使用Control_RunDLL参数执行以及执行路径。如果恶意软件不是从%AppData%执行的,那么它会将自身移动到 Appdata 中的安全位置。

它涉及下列windows api

SHGetFolderPathW 获取 %Appdata% 的路径。
GetCommandLineW 检查命令行参数和路径。
CreateFileW 获取自身的文件句柄。
GetFileInformationByHandleEx 获取自身的文件信息。
GetTickCount 生成随机名称。
SHFileOperationW 复制文件。
DeleteFileW 删除复制文件的 Zone 标识符。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当恶意软件被转移到其他位置后,它会再次使用 rundll32.exe 执行自身,从而删除原始文件。再次执行自身所使用的 API 如下:

CreateProcessW 该表情符号再次使用 rundll32 在 %appdata% 中新保存的 dll 执行
ExitProcess 退出第一个进程
x.dll的行为会根据执行位置而改变。如果从 %Appdata% 执行,它会继续执行;但如果从其他路径执行,它会更改位置并重新加载。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
信息收集
最后一个阶段的恶意软件将 x.dll 复制到 %appdata% 本地文件夹中,文件夹名称和文件名均为随机的,并添加了 .xnj 扩展名。在此阶段,我将再次使用带有参数 Control_RunDLL 的 rundll32 执行 dll,并进一步调试其行为。

它首先对 kernel32 和 ntdll 位置进行常规 PEB 遍历,然后查找 LoadLibraryW 和 GetProcAddress 的地址。然后,它加载所需的所有模块,并首先检查执行文件路径和模块名称。如果一切正确,它会收集系统信息以制作请求并将机器人注册到 c2 服务器。

GetComputerNameA 获取受害系统的名称
GetWindowsDirectoryW 获取安装系统文件的 Windows 目录
GetVolumeInformationW 获取音量信息
在这里插入图片描述
文件删除
当恶意样本尝试删除 %AppData% 中主目录中存在的所有额外文件时,我们发现它有独特的行为。除了主 emotet dll 之外,它还会删除目录中的所有其他文件。在这里插入图片描述
如上图所示,它正在尝试删除名为 cdomcinc.xnj.id0 的 ida 文件。

加密密钥
样本使用椭圆曲线密码 ECDH 密钥来建立加密密钥。生成的 ECDH 私钥和嵌入的 ECDH 公钥与 BCryptSecretAgreement 函数一起使用,在恶意软件和 C2 之间生成共享密钥。使用 BCryptDeriveKey 函数从共享密钥中派生出 AES 密钥。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
C2通信
样本通过结合其发现的主机数据、使用派生的加密密钥对数据进行编码/加密并通过 http 发送,制作将机器人注册到 c2 服务器的第一个请求。

它收集桌面名称和 mac 地址的哈希值
它收集窗口的路径
它收集卷的信息
将所有这些附加在一起,同时在每个元素后用“;”分隔字符串。然后对字符串进行编码和加密,如下所示:在这里插入图片描述
在这里插入图片描述
样本使用wininet API 发送恶意请求并获取响应。它使用 GET 和 POST 请求,数据在 cookie 标头中发送。对于较大的数据,它使用 POST 请求,否则它主要使用 GET 请求。

URI 是随机生成的,数据在 Cookie 标头中加密。Cookie 标头包含随机生成的密钥名称和 base64 编码的密钥值。解码后,密钥值包含:

生成的 ECDH 公钥
AES 加密请求数据
随机字节
用于加密请求数据的 AES 密钥通过以下方法生成:

生成的 ECDH 私钥和嵌入的 ECDH 公钥与 BCryptSecretAgreement 函数一起使用,在恶意软件和 C2 之间生成共享秘密
使用 BCryptDeriveKey 函数从共享密钥派生出 AES 密钥
在这里插入图片描述
在这里插入图片描述

网络安全学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包,需要点击下方链接即可前往获取

读者福利 | 优快云大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)

👉1.成长路线图&学习规划👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

在这里插入图片描述
在这里插入图片描述

👉2.网安入门到进阶视频教程👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。(全套教程文末领取哈)
在这里插入图片描述

在这里插入图片描述

👉3.SRC&黑客文档👈

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

在这里插入图片描述

黑客资料由于是敏感资源,这里不能直接展示哦!(全套教程文末领取哈)

👉4.护网行动资料👈

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

在这里插入图片描述

👉5.黑客必读书单👈

在这里插入图片描述

👉6.网络安全岗面试题合集👈

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
在这里插入图片描述
所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~

读者福利 | 优快云大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值