深入理解MSF之Getsystem
字数 2666 2025-08-18 11:35:30
深入理解MSF之Getsystem技术原理与实现
Windows访问控制模型基础
访问令牌(Access Token)
Windows访问控制模型的核心是访问令牌,它是在用户身份认证后生成的内核对象,包含以下关键信息:
- 用户标识符(User Identifier):唯一的安全标识符(SID)
- 组标识符(Group Identifiers):用户所属组的SIDs
- 权限(Privileges):线程能执行的系统级操作
- 所有者(Owner):默认所有者SID
- 访问控制列表(DACL):指定用户/组对对象的操作权限
- 登录会话(Logon Session):关联的登录会话标识符
令牌类型
- 主令牌(Primary Token):进程创建时分配的默认令牌
- 模拟令牌(Impersonation Token):线程模拟客户端时的临时令牌
安全检查流程
- 线程携带访问令牌访问安全对象
- 系统检查安全对象的安全描述符
- 依次执行ACE(访问控制条目)检查
- 通过检查后授予相应权限
ACE优先级规则:
- 显式(手动设置) > 继承
- 拒绝 > 允许
关键概念与技术
UAC与完整性级别
Windows引入UAC(用户账户控制)和MIC(强制完整性控制)机制:
| 完整性级别 | 描述 |
|---|---|
| System | 最高权限,系统和服务保留 |
| Installer | 修改系统核心组件的能力 |
| High | 管理员权限进程 |
| Medium | 标准用户进程 |
| Low | 与互联网交互的进程 |
| Untrusted | 匿名登录进程 |
| AppContainer | 轻量级应用容器 |
命名管道(Named Pipe)
命名管道是进程间通信(IPC)机制,关键特性:
- 使用NPFS(命名管道文件系统)接口
- 支持模拟客户端权限(ImpersonateNamedPipeClient)
- 可通过标准文件API(ReadFile/WriteFile)操作
创建命名管道示例:
const char pipename[] = "\\\\.\\pipe\\endlessparadox";
CreateNamedPipeA(pipename, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE|PIPE_WAIT,
10, 2048, 2048, 0, NULL);
模拟令牌流程
- 创建命名管道并等待连接
- 高权限进程连接管道
- 调用ImpersonateNamedPipeClient模拟客户端
- 获取线程令牌并创建新进程
ImpersonateNamedPipeClient(hPipe);
OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, FALSE, &hToken);
DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation,
TokenPrimary, &hSystemTokenDup);
CreateProcessWithTokenW(hSystemTokenDup, LOGON_WITH_PROFILE, NULL,
cmd, 0x00000400, NULL, NULL, &si, &pi);
MSF的Getsystem技术详解
技术1:服务命名管道(elevate_via_service_namedpipe)
原理:
- 创建SYSTEM权限服务连接恶意命名管道
- 模拟服务令牌获取SYSTEM权限
实现步骤:
- 检查操作系统版本(排除NT4)
- 生成随机命名管道名
- 创建服务(使用cmd.exe,预期会失败)
- 服务尝试连接管道时模拟其令牌
OPSEC注意事项:
- 服务创建行为易被检测
- 管道名称有特征
技术2:DLL服务命名管道(elevate_via_service_namedpipe2)
改进点:
- 写入DLL到磁盘
- 通过rundll32.exe以SYSTEM权限执行
OPSEC问题:
- 文件落地易被检测
- rundll32.exe行为可疑
技术3:令牌复制(elevate_via_service_tokendup)
前提条件:
- 需要SeDebugPrivilege权限
- 仅适用于x86系统
实现方法:
- 枚举服务获取PID
- 打开目标进程
- 反射式注入DLL
- 复制注入线程的令牌
优势:
- 无文件落地
- 内存操作隐蔽
技术4:RPCSS服务利用(elevate_via_service_namedpipe_rpcss)
目标:
- 从NETWORK SERVICE提权至SYSTEM
关键流程:
- 创建恶意命名管道
- 获取RPCSS服务PID
- 查找可用高权限Token句柄
- 复制最佳令牌
// 核心代码片段
get_system_token() {
// 获取Token对象类型索引
get_token_object_index();
// 查询进程信息
NtQueryInformationProcess();
// 遍历句柄查找高权限Token
for(...) {
DuplicateHandle();
GetTokenInformation();
// 比较并选择最佳令牌
if(is_equal_luid(...)) {
hBestToken = hTokenDup;
}
}
return hBestToken;
}
技术5:打印机欺骗(elevate_via_namedpipe_printspooler)
利用点:
- 打印机服务(spoolsv.exe)的路径规范化缺陷
- 自动添加
\pipe\spoolss后缀
欺骗过程:
- 创建形如
\\localhost/pipe/test的管道 - 规范化后变为
\\localhost\pipe\test - 打印机添加后缀变为
\\localhost\pipe\test\pipe\spoolss - 实际连接攻击者管道
RPC触发函数:
RpcRemoteFindFirstPrinterChangeNotification(
hPrinter, fdwFlags, fdwOptions,
pszLocalMachine, // 恶意管道路径
dwPrinterLocal, cbBuffer, pBuffer);
技术6:EFSRPC利用(elevate_via_namedpipe_efs)
基础:
- MS-EFSR(加密文件系统远程)协议
- 调用EfsRpcOpenFileRaw欺骗lsass.exe
绕过修复:
- 使用RpcBindingSetAuthInfoW设置AuthnLevel为RPC_C_AUTHN_LEVEL_PKT_PRIVACY
触发函数:
EfsRpcOpenFileRaw(
binding_h, hContext,
FileName, // 恶意管道路径
Flags);
防御与检测规避
检测点分析
-
Sigma规则检测:
# 检测服务创建+命名管道特征 selection: CommandLine|contains: - 'pipe' - 'echo' ParentImage|endswith: '\cmd.exe' condition: selection -
行为特征:
- 短暂存在的命名管道
- 服务创建行为
- RPC调用模式异常
OPSEC改进建议
-
管道技术优化:
- 使用合法管道名称
- 延长管道存在时间
- 混淆命令行参数
-
内存操作:
- 使用无文件技术(反射DLL注入)
- 擦除NT/DOS头规避内存扫描
-
权限获取:
- 优先使用RPC类技术(4/5/6)
- 避免服务创建和文件落地
实际应用技巧
-
应急提权:
- 在只能利用一次的漏洞场景中,可尝试进程PID欺骗:
# CS命令 ps steal_token <pid>
- 在只能利用一次的漏洞场景中,可尝试进程PID欺骗:
-
自定义实现:
- 将提权技术集成到shellcode加载器
- 上线即高权限,减少后期操作
-
技术选择矩阵:
| 技术 | 适用系统 | 需要条件 | 隐蔽性 |
|---|---|---|---|
| 1-服务管道 | Win2000+ | 管理员 | 低 |
| 2-DLL服务 | Win2000+ | 管理员 | 中 |
| 3-令牌复制 | WinXP-7 | SeDebugPrivilege | 高 |
| 4-RPCSS | Win8.1+ | 无 | 高 |
| 5-打印机 | Win8.1+ | 无 | 高 |
| 6-EFSRPC | Win8-11 | 无 | 高 |
总结
Windows提权技术的核心在于令牌窃取,MSF的getsystem提供了多种实现方式。理解这些技术原理有助于:
- 根据目标环境选择最合适的提权方法
- 自定义开发规避检测的工具
- 更好地防御此类提权攻击
RPC相关技术(4/5/6)因其高隐蔽性和广泛适用性,成为现代Windows系统提权的首选方案。