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恶意流量可以被检测到。