在本文中,我们继续从技术角度为读者深入分析勒索软件Darkside。
![一步一步分析勒索软件Darkside(中) 一步一步分析勒索软件Darkside(中)]()
系统权限
该恶意二进制程序可以不带参数运行,或使用一个、两个或三个参数运行(这些情况将在后面介绍)。正如我们在下面看到的,它使用CommandLineToArgvW来获取指向命令行参数的指针(argv[0]是可执行文件名称)+ 参数数量:
WTSQueryUserToken API用于获取会话1指定的登录用户的主访问令牌:
OpenWindowStationW 用于打开“Winsta0”窗口站(交互式窗口站),0x40000(WRITE_DAC)用于修改对象安全描述符中的DACL:
实际上,“Winsta0”窗口站的DACL(自由访问控制列表)是通过调用NtSetSecurityObject例程(相应的参数为0x4 = DACL_SECURITY_INFORMATION)来修改的:
之后,该恶意软件将调用OpenDesktopW,用于打开“默认”桌面对象,参数为0x40081 = WRITE_DAC | DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS,具体如下所示:
通过调用带有0x4 = DACL_SECURITY_INFORMATION参数的NtSetSecurityObject函数来修改“默认”桌面对象的DACL:
同时,该恶意软件创建了一个名为 "Global4787658f1cc4202b8a15e05dd0323fde "的互斥锁(该值在此操作之前已经计算好,代表恶意软件的自定义“哈希”值),这确保了每次只有一个勒索软件的实例在运行(如果互斥锁已经存在,那么恶意软件就会退出):
该勒索软件强制系统在进程运行时无法进入睡眠模式并且不关闭显示器,其中一个参数是0x80000001 = ES_CONTINUOUS | ES_SYSTEM_REQUIRED:
该文件将权限改为SE_PRIVILEGE_ENABLED,以便通过调用ZwAdjustPrivilegesToken函数来启用该令牌的权限(注意TOKEN_PRIVILEGES结构体):
CreateThread API被用来创建一个新的线程,如下图所述:
使用GetLogicalDriveStringsW例程提取系统中有效驱动器清单:
该勒索软件还会寻找DRIVE_REMOVABLE(0x2)和DRIVE_FIXED(0x3)驱动器,如图所示:
回收站中的所有文件和目录都会被该进程清空。为此,它是通过FindFirstFileExW API调用完成遍历的:
如下图所示,它将通过DeleteFileW函数删除文件,使用RemoveDirectoryW程序删除目录:
该二进制程序然后使用COM对象和WMI命令来删除卷影副本。并且,它还调用CoCreateInstance函数来创建一个CLSID为{dc12a687-737f-11cf-884d-00aa004b2e24}的、IWbemLocator类的单例对象(具体请参考https://forum.powerbasic.com/forum/user-to-user-discussions/source-code/25222-wmi-wrapper-functions):
此外,它还会创建一个新的IWbemContext接口,CLSID为{44aca674-e8fc-11d0-a07c-00c04fb68820}(详情请参考https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-wmi/3485541f-6950-4e6d-98cb-1ed4bb143441),该接口是通过CoCreateInstance函数创建的:
使用IWbemLocator对象,该进程通过调用ConnectServer API连接到本地“ROOTCIMV2”命名空间,并检索指向IWbemServices对象的指针,具体如下所示:
然后,它将调用CoSetProxyBlanket函数,如下图所述(0xA = RPC_C_AUTHN_WINNT - NTLMSSP,0x3 = RPC_C_AUTHN_LEVEL_CALL和0x3 = RPC_C_IMP_LEVEL_IMPERSONATE):
接着,该进程执行以下SQL查询“SELECT * FROM Win32_ShadowCopy”,以获得所有卷影副本的枚举器,然后通过DeleteInstance方法删除每个卷影副本对象:
然后,通过调用EnumServicesStatusExW函数(0x30 = SERVICE_WIN32, 0x3 = SERVICE_STATE_ALL)来获取所有服务及其状态:
其中,每个服务名称都会与前面解密的列表进行比较:
恶意软件通过调用OpenServiceW例程(0x10020 = DELETE | SERVICE_STOP)打开目标服务:
然后,使用ControlService和DeleteService来中止并删除所有目标服务,如图所示:
NtQuerySystemInformation API将返回一个SYSTEM_PROCESS_INFORMATION结构体数组(系统上运行的每个进程都有一个这样的数组,0x5 = SystemProcessInformation):
每个进程的名称都会与之前解密的列表进行比较,如下图所示:
对于每一个目标进程,该恶意软件都会打开相应的进程,然后终止该进程及其所有线程,具体如下所示:
该二进制程序还会创建一个名为< RansomPseudoValue >.ico的文件,如下图所示:
使用RegCreateKeyExW函数创建一个名为< RansomPseudoValue >的新注册表项,如图所示:
之后,DefaultIcon子项被创建,它指定了新创建的ico文件的路径:
该恶意软件调用SHChangeNotify例程,通知shell更新其图标缓存(0x08000000 = SHCNE_ASSOCCHANGED, 0x1000 = SHCNF_FLUSH):
使用CreateFileW函数创建一个名为%PROGRAMDATA%< RansomPseudoValue >.BMP的新文件:
然后,通过调用RegCreateKeyExW API打开一个注册表项,如下图所示:
注册表项中的“WallPaper”值被改为新创建的BMP文件的位置:
在所有这些活动之后,桌面已经被改为下面的样子:
小结
在本文中,我们从技术角度为读者深入分析了勒索软件Darkside,由于篇幅过长,我们分为两篇文章进行发表,更多精彩内容,敬请期待!
参考及来源:https://cybergeeks.tech/a-step-by-step-analysis-of-a-new-version-of-darkside-ransomware/
本文始发于微信公众号(嘶吼专业版):一步一步分析勒索软件Darkside(中)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论