

APT34 Glimpse 工具分析
source link: https://jason1314zhang.github.io/blog/APT34-Glimpse-%E5%B7%A5%E5%85%B7%E5%88%86%E6%9E%90/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

0x00 背景
这阵子接到一个任务,需要我对powershell无文件攻击进行分析。在找了一圈资料之后,最后决定对APT34(带有伊朗背景)的远程powershell工具Glimpse进行分析。之前已经做过一部分分析,但是失败了,这次将后续内容补充起来。
0x01 Glimpse模块
Glimpse利用DNS协议来进行信息交互,整个Glimpse分为agent、server、panel三个部分。agent是受控端,包含1个vbs脚本和3个ps1脚本;panel是服务器端可视化工具,用于展示受控端的基本信息(ip、上线时间等);server是服务器端,接收并解析agent端的DNS请求,向agent端下发指令。APT34 Glimpse的下载地址
1. agent
受控端包括1个vbs脚本和3个ps1脚本,其中vbs脚本用于执行ps1脚本,3个ps1脚本的功能相同,其中2个ps1脚本对变量名和函数做了混淆处理。runner_.vbs脚本内容
runner_.vbs可以绕过PowerShell的执行策略并且隐式的执行ps1脚本,这里需要把AGENT PATH改为“dns_main.ps1”,当runner_.vbs执行时便会执行dns_main.ps1。
dns_main.ps1用于与服务器进行交互,通过DNS域名解析协议实现数据的传输,在使用这个ps1脚本时,需要修改第一行的域名为指定的C2域名,这里改为“example.com”。dns_main.ps1预处理阶段
该脚本首先会在$env:PUBLIC目录下创建Libraries文件夹,然后在该文件夹目录下创建files文件夹、lock文件(互斥文件,防止多个ps1脚本同时运行)、quid文件(值为受控端ID)和受控端ID文件夹(一个长为10的随机字符串作为受控端ID)。在受控端ID文件夹下创建done、sendbox、receivebox用于保存服务器端的命令和需要发送给服务器端的文件。
在完成预处理阶段生成相应的文件和文件目录后,受控端ps1脚本开始向服务器端发送非法的DNS请求(恶意构造的DNS请求)。首次通信受控端向服务器端发送action字段为“M”的非法DNS请求,服务器端会在指定的目录C:\ProgramData\Glimpse\dns\ID(这里具体值是受控端的id)创建文件夹wait、received、sended、sending、done存放服务器端发送和接收的信息。dns_main.ps1首次通信
受控端与服务器端通信的函数主要包括以下几类。受控端有两种通信方式,ping模式和文本模式,aa_AdrGen_bb主要用来生成非法的DNS请求,其余的函数用于解析非法DNS请求中的数据。当aa_AdrGen_bb函数的第五个参数是r时,会生成actiondata.example.com的非法DNS请求;当aa_AdrGen_bb函数的第五个参数是s时,会生成actiondata.data1.data2.example.com的非法DNS请求。其中actiondata字段是每一次通信都必须构造的部分,信息传输时会构造剩下的data1,data2字段。dns_main.ps1主要函数模块
2. panel
可视化模块安装在服务器端,用于监控受控端的各种信息,它包含两个部分,newPannel-dbg.exe和ToggleSwitch.dll。可视化模块主要是获取服务器端特定目录C:\ProgramData\Glimpse\dns\ID下的各种信息,用于可视化展示。panel可视化模块
3. server
服务器端利用node.js搭建的简易DNS服务器,包含一个srvr.js文件作为服务器。服务器端会开放本机的53端口,用于获取DNS请求。srvr.js主要函数
服务器端wait文件夹用于保存需要服务器传给受控端的命令或文件,sending文件夹表示服务器正在传送给受控端的命令或文件,sended文件夹表示服务器已经发送给受控端的命令或文件。在受控端首次与服务器端通信时,服务器端会将“whoami&ipconfig /all”命令放入wait文件夹,等待传输。根据受控端传来的非法的DNS请求中actiondata数据字段中action的值,服务器会做出不同的响应。
当action的值为“M”时,服务器会检查当前agent与server的通信模式,当通信模式为ping时,服务器返回199.250.250.99;当通信模式为文本模式时,服务器返回99.250.250.199。
当action的值为“W”时,服务器会检查当前的wait文件夹,如果该文件夹有需要发送的文件,服务器会使用文本模式返回”S000s>”加上文件名,并且在sending文件夹目录下保存需要发送的文件。
当action的值为“D”时,服务器会将wait文件夹下的文件内容经过Base64编码,通过文本模式发送给受控端,传输完毕后再用文本模式返回“E0000>0”。
当action的值为“2”时,服务器会利用DNS A记录的形式分片接收受控端发送的文件。在发送完所有数据后,受控端会发送一个data1部分为COCTabCOCT 的非法DNS请求,表示受控端已完成文件信息的发送。
当action的值为“1”时,服务器会利用DNS A记录向受控端发送文件。
当action的值为“0”时,服务器会向受控端发送经过正则化处理的文件名。
在形式如actiondata.data1.data2.example.com的非法DNS请求中,data1的内容是受控端向服务器端回传的文件内容,data2的内容是文件的名称。actiondata字段包含受控端ID信息、action类型、随机字符串等。actiondata字段分析
0x02 Glimpse实验
首先创建了两台虚拟机,win7(192.168.48.131)和win10(192.168.48.130)。然后配置虚拟网络映射器,使两台虚拟机组网后位于同一局域网络,关闭防火墙,保证两台虚拟机之间能ping通。win7虚拟机作为受控端agent,win10虚拟机作为DNS服务器端。
修改runner_.vbs脚本的内容,把AGENT PATH改为“dns_main.ps1”。对dns_main.ps1进行修改,将C2域名改为“example.com”。原版dns_main.ps1文件有缺陷,需要对其进行适当修改。在server端,利用nodejs的forever运行DNS服务器;在agent端,运行dns_main.ps1。dns_main.ps1文件运行情况
DNS服务器运行情况
初次建立连接时,DNS服务器会向agent发送“whoami&ipconfig /all”命令,agent收到命令后,会在本机执行命令,并将信息保持在send文件夹内。whoami&ipconfig /all命令响应
在windows 10虚拟机创建一个file_from_server.txt文件(文件内容为file_from_server),通过panel可视化界面上传到agent端,在agent端done文件夹下收到该文件内容。server向agent上传文件
在windows 7虚拟机(agent端)创建一个agent.txt文件(文件内容为this is agent),放入windows 7虚拟机的D盘根目录下。然后在windows 10虚拟机(server端)的panel界面选择下载“D:\agent.txt”,agent端会将agent.txt的内容存入sendbox文件夹。server从agent下载文件
在实验过程中,agent端和server端都会出现掉线的情况,需要一直保持双方在线,才可以进行信息交互。总的来说,这个工具还是由缺陷的,稳定性不强,且DNS恶意流量可以被检测到。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK