1.背景
1.1网鼎杯比赛介绍
为深入贯彻落实习近平总书记关于网络强国的重要思想,全面践行总体国家安全观,充分调动社会力量积极性,挖掘和选拔网络安全实战化人才,进一步筑牢网络安全防线,在前三届“网鼎杯”网络安全大赛基础上,第四届“网鼎杯”网络安全大赛以“网数融合,鼎筑未来”为主题,打造最大规模、最新技术、最高水平的“网络安全奥运会”。
1.2朱雀组介绍
(能源、电力、化工、国防及其他行业单位)
1.3题目介绍RE02
2.恶意文件基础信息
2.1 加密器基本信息
文件名: | ReMe.exe |
---|---|
编译器: | Microsoft Visual C/C++(16.00.30319)[LTCG/C++] |
大小: | 499.00KB |
操作系统: | Windows(XP)[I386, 32位, Console] |
架构: | 386 |
模式: | 32 位 |
类型: | EXEC |
字节序: | LE |
MD5: | 4fd22bc6938254c2ba65fcc38f23d603 |
SHA1: | b388453c3a4aa0d3142ecebf4eb9637e6b9d559c |
SHA256: | c2964f90a0d4ef70e0092aed526c482d9ab157ee3f59a40955f3e1087fbeee07 |
3.加密后文件分析
3.2 加密的测试文件
3.2.1文件名
3.2.2具体内容
3.2.3加密文件名特征
3.2.4加密算法
3.2.4.1AES密钥生成
3.2.5程序执行流程
4.逆向分析
4.1加密器逆向分析
4.1.1 简单脱壳
4.1.2 进程注入初次加密
memset(Buffer, 0, sizeof(Buffer));
for ( i = 0; i < strlen(LibFileName); ++i )
LibFileName[i] ^= 1u;
LibraryA = LoadLibraryA(LibFileName);
for ( j = 0; j < strlen(aBsdUdghmd); ++j )
aBsdUdghmd[j] ^= 1u;
Buffer[0] = (int)GetProcAddress(LibraryA, aBsdUdghmd);
for ( k = 0; k < strlen(aSdEghmd); ++k )
aSdEghmd[k] ^= 1u;
Buffer[1] = (int)GetProcAddress(LibraryA, aSdEghmd);
for ( m = 0; m < strlen(aVshudghmd); ++m )
aVshudghmd[m] ^= 1u;
Buffer[2] = (int)GetProcAddress(LibraryA, aVshudghmd);
for ( n = 0; n < strlen(aBmnrdiOemd); ++n )
aBmnrdiOemd[n] ^= 1u;
Buffer[3] = (int)GetProcAddress(LibraryA, aBmnrdiOemd);
for ( ii = 0; ii < strlen(aEdmdudghmd); ++ii )
aEdmdudghmd[ii] ^= 1u;
Buffer[4] = (int)GetProcAddress(LibraryA, aEdmdudghmd);
for ( jj = 0; jj < strlen(String2); ++jj )
String2[jj] ^= 1u;
lstrcpyA((LPSTR)&Buffer[5], String2);
memset(pszPath, 0, sizeof(pszPath));
Wow64Process = 0;
CurrentProcess = GetCurrentProcess();
IsWow64Process(CurrentProcess, &Wow64Process);
SHGetFolderPathA(0, 4 * Wow64Process + 37, 0, 0, pszPath);
for ( kk = 0; kk < strlen(aRwbinruDyd); ++kk )
aRwbinruDyd[kk] ^= 1u;
lstrcatA(pszPath, aRwbinruDyd);
if ( CreateProcessA(0, pszPath, 0, 0, 0, 4u, 0, 0, v11, v13) )
{
v14 = (char *)VirtualAllocEx(v13->hProcess, 0, 0x2000u, 0x3000u, 0x40u);
if ( v14
&& (!WriteProcessMemory(v13->hProcess, v14, Buffer, 0x34u, &NumberOfBytesWritten)
|| !WriteProcessMemory(
v13->hProcess,
v14 + 52,
sub_6E14E0,
(char *)sub_6E15F0 - (char *)sub_6E14E0,
&NumberOfBytesWritten)) )
{
GetLastError();
return VirtualFree(v14, 0x2000u, 0x4000u);
}
}
else
{
v14 = (char *)NumberOfBytesWritten;
}
RemoteThread = CreateRemoteThread(v13->hProcess, 0, 0, (LPTHREAD_START_ROUTINE)(v14 + 52), v14, 0, 0);
return WaitForSingleObject(RemoteThread, 0xFFFFFFFF);
}
int __stdcall sub_B30034(int a1)
{
int (__stdcall *CreateFileA)(int, int, int, _DWORD, int, int, _DWORD); // eax
int v2; // ebx
int v3; // edi
unsigned int v5; // ecx
int v6; // edi
int v7; // eax
int v8; // [esp-4h] [ebp-3Ch]
char v9[36]; // [esp+Ch] [ebp-2Ch] BYREF
int v10; // [esp+30h] [ebp-8h]
int v11; // [esp+34h] [ebp-4h] BYREF
memset(v9, 0, sizeof(v9));
CreateFileA = *(int (__stdcall **)(int, int, int, _DWORD, int, int, _DWORD))a1;
v2 = a1 + 20;
v11 = 0;
v3 = CreateFileA(a1 + 20, -1073741824, 1, 0, 3, 128, 0);
v10 = v3;
if ( v3 != -1 )
{
if ( !(*(int (__stdcall **)(int, char *, int, int *, _DWORD))(a1 + 4))(v3, v9, 32, &v11, 0) )
{
v8 = v3;
LABEL_4:
(*(void (__stdcall **)(int))(a1 + 12))(v8);
return 0;
}
v5 = 0;
if ( &v9[strlen(v9) + 1] != &v9[1] )
{
do
v9[v5++] ^= 9u;
while ( v5 < strlen(v9) );
v3 = v10;
}
(*(void (__stdcall **)(int))(a1 + 12))(v3);
(*(void (__stdcall **)(int))(a1 + 16))(v2);
v6 = (*(int (__stdcall **)(int, int, int, _DWORD, int, int, _DWORD))a1)(v2, -1073741824, 1, 0, 2, 128, 0);
v7 = (*(int (__stdcall **)(int, char *, unsigned int, int *, _DWORD))(a1 + 8))(v6, v9, strlen(v9), &v11, 0);
v8 = v6;
if ( !v7 )
goto LABEL_4;
(*(void (__stdcall **)(int))(a1 + 12))(v6);
}
return 0;
}
4.1.3 释放pe文件
4.1.4 二次加密
if ( (FindFileData.dwFileAttributes & 0x10) != 0 )
{
if ( FindFileData.cFileName[0] != 46 )
{
wsprintfA(FileName, "%s\%s", lpString2, FindFileData.cFileName);
sub_F21000(FileName);
}
HANDLE __thiscall sub_F21230(LPCSTR lpFileName)
{
_BYTE *v2; // eax
char v4; // cl
HANDLE result; // eax
void *v6; // esi
void *v7; // edi
DWORD NumberOfBytesRead; // [esp+8h] [ebp-210h] BYREF
_BYTE Buffer[260]; // [esp+Ch] [ebp-20Ch] BYREF
CHAR FileName[260]; // [esp+110h] [ebp-108h] BYREF
memset(Buffer, 0, sizeof(Buffer));
memset(FileName, 0, sizeof(FileName));
NumberOfBytesRead = 0;
strcpy(FileName, lpFileName);
v2 = &Buffer[259];
while ( *++v2 )
;
v4 = byte_F2ACEC;
*(_DWORD *)v2 = dword_F2ACE8;
v2[4] = v4;
result = CreateFileA(lpFileName, 0xC0000000, 1u, 0, 3u, 0x80u, 0);
v6 = result;
if ( result != (HANDLE)-1 )
{
result = CreateFileA(FileName, 0xC0000000, 1u, 0, 2u, 0x80u, 0);
v7 = result;
if ( result != (HANDLE)-1 )
{
ReadFile(v6, Buffer, 0x104u, &NumberOfBytesRead, 0);
sub_F21360(Buffer);
WriteFile(v7, Buffer, 0x20u, &NumberOfBytesRead, 0);
CloseHandle(v7);
return (HANDLE)CloseHandle(v6);
}
}
return result;
}
int __thiscall sub_F21360(char *this)
{
_BYTE v3[508]; // [esp+4h] [ebp-210h] BYREF
_DWORD v4[4]; // [esp+200h] [ebp-14h] BYREF
v4[0] = 370507323;
v4[1] = -1496142280;
v4[2] = -2011826245;
v4[3] = 1011863321;
memset(v3, 0, sizeof(v3));
sub_F21450(v3, 0, 16, v4, 0);
sub_F21930(v3, this);
return sub_F21930(v3, this + 16);
}
v4[0] = 0x16157E3B;
v4[1] = 0xA6D2AE38;
v4[2] = 0x8815F7BB;
v4[3] = 0x3C4FCF19;
4.1.5 flag获取
from Crypto.Cipher import AES
keys=bytes([0x3b,0x7e,0x15,0x16,0x38,0xae,0xd2,0xa6,0xbb,0xf7,0x15,0x88,0x19,0xcf,0x4f,0x3c])
data = open('./flag.txt.cry','rb').read()
aes = AES.new(keys, AES.MODE_ECB)
honduras = aes.decrypt(data)
decrypted_data=[]
for i in honduras:
decrypted_data.append(i^9)
print(bytes(decrypted_data))
b'wdflag{70O9TSGICPQSLGDC}tttttttt'
5.总结
ReMe.exe
的勒索加密程序进行了深入分析,包括其基础信息、加密算法(AES-ECB)和执行流程。通过逆向工程,揭示了该程序的自解密、进程注入及加密机制,并最终利用 Python 成功解密出题目要求的 flag
值。6.安全建议
6.1 风险消减措施
前期处理方法(企业内部):
1.尽快断开被感染设备的网络连接,以防止病毒进一步扩散!
2.请勿中途强制关机,该行为会造成不可逆后果
3.不要尝试自行解密或支付赎金,以免造成更大损失!以下为详细的消减措施:
1. 数据备份策略
定期进行数据备份,并确保备份数据存储在物理隔离的设备或云环境中,避免备份被勒索病毒感染。
实施多重备份策略,如每日、每周、每月备份,以确保在灾难恢复时有多种数据版本可供选择。
2. 系统和应用更新
定期更新操作系统和应用软件,及时打补丁,修复已知的漏洞。
开启自动更新功能,确保始终拥有最新的安全补丁。
3. 邮件和浏览器安全
部署电子邮件安全网关,过滤恶意附件和链接。
培训员工识别钓鱼邮件和恶意链接,提高对社会工程攻击的防范意识。
限制员工对高风险网站(如未经过筛选的下载网站)的访问,减少通过恶意广告和下载感染的风险。
4. 用户权限管理
最小权限原则(Principle of Least Privilege):根据岗位需求分配权限,避免不必要的管理员权限。
禁止员工使用公共账户和共享账号,所有用户需拥有独立的登录凭证。
5. 启用多因素认证(MFA)
为关键系统和远程访问启用MFA,防止账号被未经授权访问。
除了密码之外,添加短信验证、动态令牌等额外的安全层。
6. 网络分段与隔离
实施网络分段,将关键系统与普通网络隔离开,防止勒索病毒在局域网内扩散。
对于重要的业务系统,采用单独的VLAN和防火墙策略进行防护。
7. 部署防勒索软件和端点检测响应(EDR)
使用防病毒软件和防勒索软件,及时识别和阻止潜在的勒索病毒攻击。
部署EDR解决方案,以监测和响应异常活动,迅速隔离感染设备,防止病毒扩散。
8. 建立并测试应急响应计划
制定详细的应急响应计划,明确在勒索攻击发生时的应对步骤。
定期演练,测试该计划的可操作性,并进行改进。
9. 入侵检测与流量监控
使用入侵检测系统(IDS)和入侵防御系统(IPS),识别和阻断异常流量。
监控网络流量日志,以便在勒索病毒传播的早期阶段及时发现异常。
6.2 安全设备调优
目标
主要目标设备
6.3 全员安全意识增强调优
目标:
形式:
线下培训与宣贯:采用面授形式,通过系统化的课程安排,确保全员深入理解网络安全的核心概念和防护措施。
线上替代方案
我司自主研发的知行网络安全教育平台结合多种培训方式的组合,灵活应对不同场景,确保每位员工具备扎实的网络安全意识与技能。
知行网络安全教育平台
视频学习功能
AI助教功能
题目练习功能
自主练习功能
7.团队介绍
solar团队数年深耕勒索解密与数据恢复领域,在勒索解密和数据恢复领域建立了良好的声誉,以高效、安全、可靠的解决方案赢得了客户的信任。无论是个人用户还是大型企业,都能提供量身定制的服务,确保每一个被勒索软件侵害的数据都能够恢复到最佳状态,同时在解密数据恢复后,提供全面的后门排查及安全加固服务,杜绝二次感染的风险。
同时,solar团队坚持自主研发及创新,在攻防演练平台、网络安全竞赛平台、网络安全学习平台方面加大研发投入,目前已获得十几项专利及知识产权。
团队也先后通过了科技型中小企业、创新型中小企业认证、ISO9001质量管理体系、ISO14000环境管理体系、ISO45001职业安全健康管理体系 、ITSS(信息技术服务运行维护标准四级)以及国家信息安全漏洞库(CNNVD)技术支撑单位等认证,已构建了网络安全行业合格的资质体系。
More
8.数据恢复服务流程
① 免费咨询/数据诊断分析
专业的售前技术顾问服务,免费在线咨询,可第一时间获取数据中毒后的正确处理措施,防范勒索病毒在内网进一步扩散或二次执行,避免错误操作导致数据无法恢复。
售前技术顾问沟通了解客户的机器中毒相关信息,结合团队数据恢复案例库的相同案例进行分析评估,初步诊断分析中毒数据的加密/损坏情况。
② 评估报价/数据恢复方案
您获取售前顾问的初步诊断评估信息后,若同意进行进一步深入的数据恢复诊断,我们将立即安排专业病毒分析工程师及数据恢复工程师进行病毒逆向分析及数据恢复检测分析。
专业数据恢复工程师根据数据检测分析结果,定制数据恢复方案(恢复价格/恢复率/恢复工期),并为您解答数据恢复方案的相关疑问。
③ 确认下单/签订合同
您清楚了解数据恢复方案后,您可自主选择以下下单方式:
双方签署对公合同:根据中毒数据分析情况,量身定制输出数据恢复合同,合同内明确客户的数据恢复内容、数据恢复率、恢复工期及双方权责条款,双方合同签订,正式进入数据恢复专业施工阶段,数据恢复后进行验证确认,数据验证无误,交易完成。
④ 开始数据恢复专业施工
安排专业数据恢复工程师团队全程服务,告知客户数据恢复过程注意事项及相关方案措施,并可根据客户需求及数据情况,可选择上门恢复/远程恢复。
数据恢复过程中,团队随时向您报告数据恢复每一个节点工作进展(数据扫描 → 数据检测 → 数据确认 → 恢复工具定制 → 执行数据恢复 → 数据完整性确认)。
⑤ 数据验收/安全防御方案
完成数据恢复后,我司将安排数据分析工程师进行二次检查确认数据恢复完整性,充分保障客户的数据恢复权益,二次检测确认后,通知客户进行数据验证。
客户对数据进行数据验证完成后,我司将指导后续相关注意事项及安全防范措施,并可提供专业的企业安全防范建设方案及安全顾问服务,抵御勒索病毒再次入侵。
点击关注下方名片进入公众号 了解更多
更多资讯 扫码加入群组交流
喜欢此内容的人还喜欢
索勒安全团队
索勒安全团队
索勒安全团队
原文始发于微信公众号(solar专业应急响应团队):【病毒分析】2024年网鼎杯朱雀组REVERSE02——关于勒索木马解密详解
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论