最近,在回顾一些网络异常的时候,我们发现了Cold River,一个恶意使用DNS隧道作为C&C通信的攻击组织。目前,我们已经能够解密受害者与攻击者的通信流量,也发现了攻击中使用的复杂诱饵文档,这让我们联想到了其他以前未知的样本,并发现了攻击者使用的大量基础设施。
这次行动主要针对中东组织,尤其是黎巴嫩和阿拉伯联合酋长国,此外,和这些中东国家关系密切的印度和加拿大公司也成为了攻击目标。
这次攻击中使用了新的TTP –例如Agent_Drable恶意程序利用Django框架来搭建C2服务器,其技术细节会在后面的博客中披露。
我们不确定这次行动背后是否有其他组织的推动,但这次(行动)使用了以前没有被发现的工具,我们推测其使用的种植程序中发现的硬编码字符串”Agent_Drable”是一种从右到左的语言,它借鉴了2007年黎巴嫩军队在“Nahr Elbard”巴勒斯坦难民营发生的冲突,该阵营是”Nahr el bared”的音译,而”Nahr Elbard”的英文翻译则是”Cold River”。
简单来说,“Cold River”是一个复杂的攻击组织,利用了DNS子域劫持、证书欺骗、隐蔽的C2通道,具欺骗性的诱饵文档和之前未知的投递木马发动攻击。
我们发现了两个恶意文档,两者区别仅在于诱饵内容:拥有相同的VBA宏和payload,但第一个是带有恶意的空白文档(图1)。
图1:空文档截图
第二个则是来自SUNCOR公司的合法人力资源文档,里面添加了恶意payload和VBA宏(图2)。
图2:来自SUNCOR公司的文档截图
在收集有关回调域0ffice36o[.]com的开源情报时,我们又发现了来自Twitter的潜在关联文档(参见图3),虽然不包含相同的payload,但这个Twitter帐户用户可能附加了错误的文档。
图3:第三个文档的引用推文
表1中列出的时间戳似乎证实了Suncor文档是带payload的合法文档的假设,因为创建日期足够长,最后一次保存和攻击的时间范围也相匹配。空文档很可能是用于测试宏或在与Suncor无关的环境中投递payload的。
SHA1 | 描述 | 创作时间 | 最后保存时间 |
---|---|---|---|
1f007ab17b62cca88a5681f02089ab33adc10eec | Empty doc | 2018-10-05 07:10:00 | 2018-10-15 02:59:00 |
9ea865e000e3e15cec15efc466801bb181ba40a1 | Suncor decoy | 2012-06-07 18:25:00 | 2018-10-15 22:22:00 |
表1: Malicious documents and related metadata.
有关文档及其有效负载的时间表,可参考图4。
关于VBA宏,很基础但非常有效。宏分为两个部分,一个在文档打开时执行,另一个在文档关闭时执行。实际payload不直接存储在VBA代码中,而是隐藏在文档中的表单里。
打开Suncor文档时,用户必须启用宏执行才能查看实际内容。也就是说允许宏执行对于普通的用户来说是合理的。唯一产生混淆的地方是使用了字符串连接,例如“t”和“mp”,“Microsoft.XML”和“DOM”,“userp”和“rofile”等。
恶意宏包含一些基本的反沙箱代码,使用API Application.MouseAvailable检查计算机上是否有鼠标可用。总的来说,宏的逻辑如下:
文档打开时:
1)检查Environ(“userprofile”)\.oracleServices\svshost_serv.exe是否存在
如果存在就退出;不存在则继续操作
2)如果Environ(“userprofile”)\.oracleServices不存在,则创建目录
3)读取UserForm1.Label1.Caption中存储的base64编码payload
4)解码并写进Environ(“userprofile”)\.oracleServices\svshost_serv.doc。
5)显示文档
文档关闭时:
1)把”svshost_serv.doc”重命名为”svshost_serv.exe”
2)创建一个命名为”chrome updater”的每分钟执行EXE文件的计划任务
最后一个值得关注的点是,设置计划任务的部分代码是从网上复制而来的。
我们发现了两个相关的Payload,如表2所示,两者的区别在于其中一个有事件记录功能,这让我们更容易确定恶意程序的意图,当然,也可能是早期开发的调试版本,像Suncor文档中的payload就没有记录功能。
SHA1 | 描述 | 编译时间戳 |
---|---|---|
1c1fbda6ffc4d19be63a630bd2483f3d2f7aa1f5 | Payload with logs information | 2018-09-03 16:57:26 UTC |
1022620da25db2497dc237adedb53755e6b859e3 | Payload without logs information | 2018-09-15 02:31:15 UTC |
表2: the Agent_Drable payloads.
在二进制文件中找到了一个有趣的字符串是“AgentDrable.exe”。这是PE头中的导出表里的DLL Name字段值,在这次攻击的其他部分(例如基础架构配置)也有出现。我们几乎可以认定这是攻击者给程序的代号命名。不过,除了近期出现在在线分析平台上的少数提交以外,很少有证据可以证明是AgentDrable,因此还有一个假设是称之为”Elbard”。
两个样本的编译时间戳也很有趣。我们必须充分意识到时间戳很容易被伪造,但是,这些时间戳可以在二进制文件的多个位置找到(调试目录,文件头),并且与攻击事件的其他部分保持一致。我们把所有dropper和payload有效时间戳都放在图4里。
图4:注意,WORD_1的创建时间戳被省略,正在溯源(2012)
此外,没有日志记录功能的样本的编译时间戳,与嵌入文件的两个word文档的最后保存时间相匹配,这也意味着攻击者可能在编译了最终版本的恶意程序之后,直接嵌入文档以便投递。
可以发现,两个恶意文档都在几天后从黎巴嫩被上传到VirusTotal,而攻击者没有修改任何时间戳,这个时间表显示了一个连贯的故事。当我们在对比攻击者使用的C2结构时,会提供其他的见解。
被释放的可执行文件主要作为侦察工具运行,而在二进制文件中没有发现高级功能(比如没有屏幕监控或者键盘记录),该文件的主要功能如下:
1)运行C&C下发的命令并返回输出
2)下载并执行指定文件
3)文件窃取
我们在文件中发现了硬编码的一个IP、一个域名以及一个User-Agent:
0ffice36o[.]com (明显模仿合法的office360[.]com)
185.161.211[.]72
Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
被植入的程序员有两种与C&C通信的主要方式:
(1)DNS请求
(2)HTTP(S)GET / POST。
第一次执行默认为DNS通信,然后根据收到的命令,它可能会切换到HTTP。
由于恶意文档创建的计划任务,程序员每分钟执行一次。在每次运行开始前都会检查子目录是否存在,如果不存在,则创建以下子目录:
.\Apps
.\Uploads
.\Downloads
目录的功能完全和它们的名字一样,任何位于”Apps”目录中的可执行文件在被投递的程序执行时也会执行。
所有的配置信息都使用JSON和cJSON库处理,键值名是通用的,使用一个或两个字母(‘a’,’m’,’ul’……),但我们设法得到了一个全面的列表,如表3,发现配置信息存储在”Configure.txt”中,在每次开始执行时都会被检索。
参数名称 | 解释 |
---|---|
a | Execution mode (DNS/HTTP) |
m | Max query length, used to split long DNS queries into multiple shorter ones |
f | Phase |
c | DNS counter |
h | Home path, where the subdirectories and config file are created |
u | HTTP CnC resource path |
s | HTTP CnC IP address |
d | DNS CnC domain |
p | HTTP CnC port number |
l | Connection type, HTTP or HTTPS |
i | Victim ID (2 chars) |
k | Custom base64 alphabet |
表 3: JSON configuration parameters (list not exhaustive).
为了与DNS CnC通信,样本对特制子域进行DNS查询。例如,以下就是来自不同受害者的DNS查询:
crzugfdhsmrqgq4hy000.0ffice36o[.]com
gyc3gfmhomrqgq4hy.0ffice36o[.]com
svg4gf2ugmrqgq4hy.0ffice36o[.]com
Hnahgfmg4mrqgq4hy.0ffice36o[.]com
6ghzGF2UGMD4JI2VOR2TGVKEUTKF.0ffice36o[.]com
子域遵循特定的模式:由4个随机alphadecimal字符和base32编码的有效负载组成。再应用于上面列出的域时,我们可以得到:
子域名 | 明文 |
---|---|
crzugfdhsmrqgq4hy000 | 1Fy2048| |
gyc3gfmhomrqgq4hy | 1Xw2048| |
svg4gf2ugmrqgq4hy | 1uC2048| |
6ghzGF2UGMD4JI2VOR2TGVKEUTKF | 1uC0|J5WGS5TJME |
前3个明文通过2个不同字母进行区分:Fy / Xw / uC,这是样本生成的(受害者)ID,允许C&C识别请求的来源。它由用户名和主机名生成,因此在样本执行期间会保持不变,同样的ID也会应用于HTTP通讯。
在DNS模式下,被植入的程序通过特定的子域与C&C通信,并通过解析返回的IP地址来获取指令。HTTP通信模式更高级,请求和应答分别使用的是GET和POST。默认情况下,样本构建的URL格式是http://[CNC_IP]/[RESOURCE_PATH]?id=[ID],参数解释如下:
参数 | 默认值 | 注意事项 |
---|---|---|
CNC_IP | 185.161.211[.]72 | This IP can be updated |
RESOURCE_PATH | /index.html | This path can be updated |
ID | Fy | This ID is constant for a given infection |
存储在二进制文件中的硬编码C&C IP在分析时处于离线状态。我们找到了另外一个活跃的C&C185.20.184 [.] 138。图5为通过Web浏览器访问时页面的展示:
图5:假的维基百科页面
C&C命令隐藏在HTML注释内或特定标记内,并使用自定义base64字母表进行编码。以下是页面源代码的摘录,显示了编码数据。
解码后,它们就会提供以下JSON对象,然后从中提取命令:
这些指令显示了攻击者在继续入侵前执行主机侦察所采取的典型步骤。表4为命令的完整标签列表。
标签 | 描述 |
---|---|
<!–[DATA]–> | Base64编码后的json内容 |
<link href=”[DATA]“> | 需要下载的资源路径 |
<form action=”[DATA]“ | POST应答的资源路径 |
<style>/*[DATA]*/</style> | |
<script>/*[DATA]*/</script> |
表 4: List of the tags that are extracted from the page.
HTTP C&C由激活调试模式的Django框架提供支持,由于配置错误,可以收集一些可用于显示整个基础架构的其他信息。表5列出了所有可访问的页面。
路径 | 描述 |
---|---|
/index.html (GET) | 获取指令与配置参数 |
/Client/Login (GET) | 获取自定义base64字母表 |
/Client/Upload (POST) | 上传窃取的数据或者命令执行结果 |
/Client/Download/<str:url> | |
/DnsClient/Register | |
/DnsClient/GetCommand | |
/DnsClient/SendResult | |
/DnsClient/SendNotification | |
/static/ | |
^\.well\-known\/acme\-challenge\/(?P<path>.*)$ | 用于生成let的加密证书 |
表 5: List of all available endpoints.
除了所有资源路径,调试模式也泄露了所有环境变量和一些Django的内部设置。最有趣的值在表6和表7中:
键值名称 | 值 | 解释 |
---|---|---|
PWD | /root/relayHttps | 有趣的目录名 |
PATH_INFO | /static/backup.zip | 密钥保护的数据库备份 |
SERVER_NAME | debian | |
SERVER_SOFTWARE | WSGIServer/0.2 | |
SHELL | /usr/bin/zsh | |
SSH_CLIENT | 194.9.177[.]22 53190 22 | VPN 服务器的IP泄露 |
表 6: Environment variables leaked dueto a misconfigured Django instance.
键值名称 | 值 | 解释 |
---|---|---|
LOGIN_URL | /accounts/login/ | |
MAGIC_WORD | microsoft | 未知 |
PANEL_PATH | /Th!sIsP@NeL | |
PANEL_PORT | :7070 | |
PANEL_USER_NAME | admin | |
DATABASES | /root/relayHttps/db.sqlite3 | |
SERVER_PORT | :8083 | |
SERVER_URL | https://185.20.184[.]157 | 泄露的未知IP |
表 7: Settings leaked dueto a misconfigured Django instance.
我们再次发现对”drable”的使用:用于从底层数据库获取数据的查询的一部分。
SELECT COUNT(*) AS "__count" FROM "Client_drable"
WHERE "Client_drable"."relay_id" = %s
通过C&C泄露的数据和其他被动的DNS数据,我们能够确切地识别多个属于攻击行动的基础架构。一个有趣的事实是它们都属于同一自治系统Serverius N(AS 50673),并由Deltahost托管。此外,所有域名都是通过NameSilo注册的。
IP | Description |
---|---|
185.161.211[.]72 | 硬编码HTTP C&C,在分析时未使用 |
185.20.187[.]8 | 主要用于生成Let的加密证书。 端口443仍然以memail.mea.com [.] lb回答。 端口444具有memail.mea.com [.] lb的“GlobalSign”证书。 |
185.20.184[.]138 | 存活的HTTP C&C。端口80和443返回Django调试信息。 |
185.20.184[.]157 | 未知用途。端口7070有受基本身份验证保护的https页面,证书CN是“ kerteros ”,端口8083为Web服务器 ,但仅返回空白页。 |
185.161.211[.]79 | 放置人力资源相关钓鱼域名hr-suncor [.] com和hr-wipro [.] com,现在重定向到合法网站。 |
194.9.177[.]22 | Openconnect VPN用于访问HTTP CnC |
通过将这些IP地址与DNS解析相关联(参见附录A中的时间表),我们确定了三个最有可能用于提供攻击第一阶段文档的域:
hr-suncor[.]com
hr-wipro[.]com
files-sender[.]com
这些看起来相似的域名与攻击中使用的Suncor文档模板非常匹配。虽然我们还没有找到任何与Wipro相关的具体文件,但发现来自政府的AE和LB域名短时间内到185.20.187 [.] 8的可疑DNS解析。
把这些数据与https://crt.sh/的证书生成记录交叉引用,我们可以得出结论,攻击者设法接管了这些域的DNS条目并生成多个”Let’s encrypt”证书,让他们可以透明拦截任何TLS交换。
域名 | 证书 | 重新定向日期 |
---|---|---|
memail.mea.com[.]lb | https://crt.sh/?id=923463758 | 2018-11-06 |
webmail.finance.gov[.]lb | https://crt.sh/?id=922787406 | 2018-11-06 |
mail.apc.gov[.]ae | https://crt.sh/?id=782678542 | 2018-09-23 |
mail.mgov[.]ae | https://crt.sh/?id=750443611 | 2018-09-15 |
adpvpn.adpolice.gov[.]ae | https://crt.sh/?id=741047630 | 2018-09-12 |
总之,Cold River是一个复杂的攻击组织,恶意使用DNS隧道作为C&C通信,利用具欺骗性的诱饵文档,以及之前未知的投递木马攻击。这次行动主要针对中东组织,尤其是黎巴嫩和阿拉伯联合酋长国,此外,和这些中东国家关系密切的印度和加拿大公司也成了攻击目标。
Cold River证明了情景化和威胁情报多样性的重要性。如果不和行为情报和网络流量分析(NTA)相结合,很难完全揭露Cold River,从而使受害者也面临更多风险。
IOC
Droppers (maldocs)
9ea865e000e3e15cec15efc466801bb181ba40a1 (Suncor document)
678ea06ebf058f33fffa1237d40b89b47f0e45e1
Payloads
1022620da25db2497dc237adedb53755e6b859e3 (Document Payload)
1c1fbda6ffc4d19be63a630bd2483f3d2f7aa1f5 (Writes logs)
IP地址
185.161.211[.]72
185.20.184[.]138
185.20.187[.]8
185.20.184[.]15
185.161.211[.]79
194.9.177[.]22
104.148.109[.]193
网站域名
0ffice36o[.]com
hr-suncor[.]com
hr-wipro[.]com
files-sender[.]com
microsoftonedrive[.]org
证书域名
memail.mea.com[.]lb
webmail.finance.gov[.]lb
mail.mgov[.]ae
adpvpn.adpolice.gov[.]ae
Mail.apc.gov[.]ae
生成证书
用户代理
Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
文件路径
%userprofile%\.oracleServices\Apps\
%userprofile%\.oracleServices\Configure.txt
%userprofile%\.oracleServices\Downloads\
%userprofile%\.oracleServices\log.txt
%userprofile%\.oracleServices\svshost_serv.doc
%userprofile%\.oracleServices\svshost_serv.exe
%userprofile%\.oracleServices\Uploads\
计划任务
Name: “chrome updater”
Description: “chromium updater v 37.5.0”
Interval: 1 minute
Execution: “%userprofile%\.oracleServices\svshost_serv.exe”
*参考来源:Lastline,kirazhou编译整理,转载请注明来自 FreeBuf.COM