客服热线:00000000000

一个主要变化是使用针对IPv6地址的AAAA DNS查询

后台-系统设置-扩展变量-手机广告位-内容广告位一

  有关Shamoon活动的大量研究和新闻报道。这些攻击是对沙特阿拉伯公司的攻击,这些公司部署了名为Disttrack的破坏性恶意软件。恶意软件使用被盗凭证在整个目标网络中传播,然后在设定的日期和时间擦除附加到受害计算机的磁盘。

一个主要变化是使用针对IPv6地址的AAAA DNS查询

  关于Disttrack的一个很大的问题就出现了:首先,硬编码凭证是如何被盗的?2017年1月,赛门铁克在他们的“ 针对中东的Greenbug cyberespionage小组,可能链接到Shamoon ”博客文章中提出了一个可能的答案。在其中,他们讨论了一个他们称为Greenbug的威胁组和一个名为Ismdoor的自定义信息窃取远程访问木马(RAT)。赛门铁克在Greenbug和Shamoon之间的可能联系总结为:“ ......在W32.Disttrack.B部署于2016年11月17日之前,该团队在Shamoon目标组织的网络中至少破坏了一台管理员计算机。“虽然关于威胁组的细节很少,但关于Ismdoor恶意软件的细节却更少。除了上述博客中的简要说明,RSA于2017年2月发布了一篇文章,概述了其HTTP通信。更新:在发布前不久,我们发现了NCC集团2017年2月对“ ISM RAT ” 的额外分析。

  虽然分析速度很慢,但Ismdoor开发速度很快!最近版本的一个主要变化是使用针对IPv6地址的AAAA DNS查询,使用自定义隐蔽通道替换旧的基于HTTP的命令和控制(C2)功能。这个新机制有很多移动包,所以这篇文章看看我们到目前为止对它的分析。

  样品

  此帖子中使用的第一个样本可在VirusTotal上获得。由于描述性调试字符串,它引起了我们的注意:

  C:\ Projects \ DNS BOT \ Bot \ x64 \ Release \ Ism.pdb

  这是1.0.3版本,编译于2016-11-11。它首次出现在2017-03-27的VirusTotal上,并且是从沙特阿拉伯提交的。此示例的C2域是:

  winrepp [。] COM

  winsecupdater [。] COM

  他们在2016-06-09和2016-11-06注册。

  由于在本研究时C2已经下降,我们通过这条推文搜索并找到了一个更新的样本。此示例还具有描述性调试字符串:

  C:\ Users \ me \ Documents \ Visual Studio 2013 \ Projects \ DNS_Bot \ v 10.0.19 \ x64 \ Release \ Nrtscan.pdb

  它是版本1.0.19并在2017-04-05上编译(并首次提交给VirusTotal)。它再次来自沙特阿拉伯。该样本的C2域名已于2016-12-04注册,接下来将进行讨论。

  恶意软件配置

  Ismdoor具有加密配置,包含主要和辅助C2域,各种标识符,超时和标志。稍后的C2命令可以更新这些值。

  替换密码用于在需要时解密配置。字符映射在各个示例中保持一致,我们在Github上提供了它的Python片段。

  分析样本的初始配置如下所示:

  .dnslookupdater [。] com(主C2域)

  30(活着超时)

  -1(appId)

  0

  -1

  0

  0

  .dnssecupdater [。] com(二级C2域名)

  0

  0

  20000

  00000000-0000-0000-0000-000000000000(uniqueId)

  命令与控制

  C2机制建立在DNS之上,可以分为三层:DNS,传输/会话和C2消息。

  DNS层

  在bot和C2之间发送的所有数据都是使用AAAA DNS UDP查询完成的。通过特制查询名称向C2发送数据,并通过IPv6地址返回C2中的数据。连接的bot端驱动所有通信。示例查询和响应如下所示:

  传输/会话层

  下一层可以被认为是传输/会话层(类似于UDP和TCP)。在这里,通信分为几个会话,大多数会话至少包含五个DNS请求和回复:

  建立会话ID

  发送消息给C2

  将消息计数发送到C2

  询问来自C2的响应消息的计数

  从C2接收消息

  这个典型会话的一个例子如下:

  为了建立会话,机器人生成会话ID(32个大写十六进制字符)并使用以下格式的查询名称将其发送到C2:

  nnc <会话ID> .c2.com

  以下是上面屏幕截图中的示例:

  nnc237735C7DCF34DE59F8E04CB852401B3.dnslookupdater [。] COM

  C2将使用以下静态IPv6地址进行响应:

  a67d:DB8:a2a1:7334:7654:4325:370:2aa3

  接下来,机器人使用如下格式的查询名称将上层C2消息(在下一节中描述)发送到C2:

  。<消息号> .dr。<会话ID> .c2.com

  以下是上面的示例:

  TTpDQz8!.0.dr.237735C7DCF34DE59F8E04CB852401B3.dnslookupdater [。] COM

  消息号从零开始,消息以base64编码,并改变了以下字符:

  = - >!

  / - >&

  + - > @

  以上解码如下:

  L:CC?

  同样,C2以静态但不同的IPv6地址响应:

  a67d:DB8:85±3:4325:7654:8a2a:370:7334

  在第三步中,bot使用以下格式向C2发送已发送的消息计数:

  n。<消息计数> .f。<会话ID> .c2.com

  例如:

  n.1.f.237735C7DCF34DE59F8E04CB852401B3.dnslookupdater [。] COM

  这里,C2以十六进制编码字符的地址响应,即所有空格字符:

  2020:2020:2020:2020:2020:2020:2020:2020

  第四步让机器人向C2询问它应该从中获得多少消息。这些请求的格式如下:

  nnfc。<会话ID> .c2.com

  对于我们的示例会话,它看起来像这样:

  nnfc.237735C7DCF34DE59F8E04CB852401B3.dnslookupdater [。] COM

  对于此交换,C2响应IPv6地址,该地址是静态的,除了地址的最后八个字节,用于消息计数。例如,如果C2要向机器人发送一条消息,它将响应如下:

  a67d:DB8:85±3:4325:7654:8a2a :: 1

  最后一步涉及机器人从C2接收消息。它表示要通过查询名称接收哪条消息,例如:

  www。<消息号> .s。<会话ID> .c2.com

  消息号再次基于零,因此要接收此示例会话的第一条消息,机器人将发送:

  www.0.s.237735C7DCF34DE59F8E04CB852401B3.dnslookupdater [。] COM

  C2响应包含十六进制编码消息的地址,如下所示:

  4f6b:2020:2020:2020:2020:2020:2020:2020

  这解码为“Ok”。

  为了帮助分析这些会话,我们在Github上用Python编写了一个解析器。使用解析器,上面的会话可以像这样可视化:

  会话#0

  会话ID:237735C7DCF34DE59F8E04CB852401B3

  将msg 0发送到c2:M:CC?

  发送1 msgs到c2

  期待来自c2的1 msgs

  来自c2的recv msg 0:4F6B2020202020202020202020202020(好的)

  当需要传输大量数据时(用于文件上载和下载),使用不同类型的会话:

  将文件消息计数发送到C2

  将文件消息发送到C2

  定期询问C2是否缺少任何已发送的文件消息

  重新发送任何错过的文件消息

  对于文件传输,使用如下格式的查询名称将文件消息计数发送到C2:

  n。<消息计数>。<会话ID> .c2.com

  会话ID来自请求文件传输的C2命令。C2以静态IPv6地址响应:

  a67d:DB8:a2a1:7334:7654:4325:370:2aa3

  然后使用以下类型的查询名称发送文件消息:

  <编码数据>。<消息号> .d。<会话ID> .c2.com

  消息编号从零开始,数据编码如上。C2将不响应这些数据消息或发送DNS“服务器故障”错误响应。

  如果机器人使用以下查询错过了任何文件消息,它会定期询问C2:

  uff <消息计数>。<消息计数>。 .c2.com

  这里,C2以十六进制编码的空格字符的地址进行响应。然后机器人发送以下查询,如上所述,以从C2接收答案:

  nnfc。<会话ID> .c2.com

  www。<消息号> .s。<会话ID> .c2.com

  然后,C2以十六进制编码的错过消息列表进行响应。例如,如果C2缺少消息号5,9,15和16,它将发送此IPv6地址:

  3136:2c31:352C:392C:3520:2020:2020:2020

  其解码为:“(16,15,9,5)”。

  查询名称重新发送丢失的文件消息,例如:

  <编码数据>。<消息号> .dl。<会话ID> .c2.com

  与上面的发送文件消息一样,C2将不响应这些重放或发送错误消息。

  这种类型的会话的解析示例如下所示:

  会议#13

  会话ID:a1a13274c08f4730b88f1715de38068c

  将文件msg count(25)发送到c2

  将文件msg 0发送到c2

  将文件msg 1发送到c2

  ...

  将文件消息24发送到c2

  问c2缺少文件消息

  期待来自c2的1 msgs

  recv msg 0 from c2:31362C31352C392C3520202020202020(16,15,9,5)

  将文件msg 16重新发送到c2

  ...

  C2消息

  第三层包含C2消息,其中至少有八个消息。某些消息具有其他参数。我们将浏览每条消息,并使用上面的解析器显示一些示例。

  L:CC?

  “CC”可能表示“连接检查”或“检查连接”。这是一个定期消息,用于检查C2服务器是否处于活动状态。示例消息和响应如下所示:

  将msg 0发送到c2:M:CC?

  来自c2的recv msg 0:4F6B2020202020202020202020202020(好的)

  L:我?

  “ME”可能表示“消息”,它们用于将状态消息发送回C2。这是一个例子:

  将msg 0发送到c2:M:ME?appId = -1&message =已成功执行

  来自c2的recv msg 0:20202020202020202020202020202020()

  L:AV?

  “AV”可能表示“AliVe”或“AVailable”。这是一个有两个目的的定期消息。

  第一种是初始化两个标识符(存储在前面提到的配置中)“appId”和“uniqueId”。后者类似于机器人ID,但不清楚前者代表什么。它在每次恶意软件运行时都会发生变化,并且往往是一个低值整数(见一些例子:5,8,11,12)。此消息的示例如下所示:

  将msg 0发送到c2:M:AV?appId = -1&uniqueId = 00000000-0000-0000-000

  将消息1发送到c2:0-000000000000

  来自c2的recv msg 0:41707049647C7C7C38267569643D3432(AppId ||| 8&uid = 42)

  来自c2的recv msg 1:6435623934352D383062362D34336430(d5b945-80b6-43d0)

  来自c2的recv msg 2:2D396330332D33323736316233323866(-9c03-32761b328f)

  来自c2的recv msg 3:34372020202020202020202020202020(47)

  初始化ID后,此消息会询问C2上的机器人有多少命令可用。这些消息如下所示:

  将msg 0发送到c2:M:AV?appId = 8&uniqueId = 42d5b945-80b6-43d0-9c03

  将消息1发送到c2:-32761b328f47

  来自c2的recv msg 0:31202020202020202020202020202020(1)

  L:里德?

  “ReId”可能表示“ReplyID”,并在上面初始化后用C2验证appId:

  将msg 0发送到c2:M:ReId?Id = 8

  来自c2的recv msg 0:4F6B2020202020202020202020202020(好的)

  L:GAC?

  “GAC”可能意味着“获取命令”,这就是它的作用:

  将msg 0发送到c2:M:GAC?appId = 8

  recv msg 0 from c2:30323064373461352D323061332D3433(020d74a5-20a3-43)

  来自c2的recv msg 1:65372D616463642D6634383631356466(e7-adcd-f48615df)

  来自c2的recv msg 2:356137347C7C7C476574436F6E666967(5a74 ||| GetConfig)

  来自c2的recv msg 3:3A3A3A31302020202020202020202020(::: 10)

  Bot命令将在后面的部分中讨论,但有一点需要注意的是每个命令都包含一个唯一的GUID(在本例中为020d74a5-20a3-43e7-adcd-f48615df5a74)。

  L:CR?

  “CR”可能表示“已接收命令”并且它确认收到命令:

  将msg 0发送到c2:M:CR?cd = 020d74a5-20a3-43e7-adcd-f48615df5a74

  来自c2的recv msg 0:4F6B2020202020202020202020202020(好的)

  请注意,命令GUID将返回到C2。

  L:SF?

  “SF”可能表示“发送文件”,用于发送文件和命令结果。以下是上面的GetConfig命令的结果:

  将msg 0发送到c2:M:SF?commandId = CmdResult = 020d74a5-20a3-43e7-a

  发送消息1到c2:dcd-f48615df5a74 ||| GetConfig :::。dnslookupdate

  将msg 2发送到c2:r [。] com ^ M.

  30 ^ M

  8 ^ M

  1 ^ M

  -1 ^ M

  0 ^ M

  0 ^ M

  .dnssecupdater [。] COM

  将msg 3发送到c2:^ M

  0 ^ M

  0 ^ M

  20000 ^ M

  42d5b945-80b6-43d0-9c03-32761b

  将msg 4发送到c2:328f47

  来自c2的recv msg 0:20202020202020202020202020202020()

  L:GF?

  “GF”可能意味着“获取文件”,类似于“发送文件”

  为了查看Ismdoor的DNS C2协议和消息的更多内容,我们在Github上从受感染的虚拟机中提取了一个已解析的PCAP 。

  机器人命令

  Ismdoor有许多功能和命令。虽然这篇文章不会详细介绍,但大多数都是自我描述的:

  ChangeAliveSeconds - 在config中设置活动超时

  ChangeAddress - 在config中设置C2域

  SI - 可能意味着“系统信息” - 运行一系列系统命令并将其输出发送到C2

  GetConfig - 将配置发送到C2

  RunNewVersion - 更新自我

  重启 - 重启自我

  删除 - 删除自我

  CreateMimi1Bat - 可能执行Mimikatz(执行PowerShell脚本:ccd61.ps1和Invoke-bypassuac)

  RAAD - 执行PowerShell脚本ivb.ps1和Invoke-EventVwrBypass

  CLRAD - 删除与RAAD命令关联的文件

  ExecutePC - 可能执行Powercat-PowerShell版本的Netcat(执行PowerShell脚本dp.ps1和powercat)

  FastAlive - 在配置中设置“FastAlive”。未知的后果

  ExecuteKL - 可能执行键盘记录程序(执行Winit.exe并将“Start Keylog Done”消息发送回C2)

  RemoveKL - 杀死并删除键盘记录器相关文件

  GetVersion - 将恶意软件版本发送到C2

  PauseUpload

  ResumeUpload

  PauseDownload

  ResumeDownload

  PWS - 截图

  ImmediateResetRam - 在config中设置“ResetRam”标志。不确定的后果

  下载文件

  上传文件

  如果命令与预定义命令不匹配,则将命令传递给命令shell并将结果作为文件返回。

后台-系统设置-扩展变量-手机广告位-内容广告位二

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。