- 网络安全
- 渗透测试
【免费下载链接】traitor
:arrow_up: :skull_and_crossbones: :fire: Automatic Linux privesc via exploitation of low-hanging fruit e.g. gtfobins, pwnkit, dirty pipe, +w docker.sock
Traitor 是一款面向 Linux 的自动化提权(Privilege Escalation)框架,它把 GTFOBins 中的 sudo 特权利用、可写的docker.sock、Dirty Pipe(CVE-2022-0847)、pwnkit(CVE-2021-4034)与 CVE-2021-3560 等"低垂果实"打包成一条命令,自动检测并弹出 root shell。本文以仓库 README.md 为主线,结合源码实现,完整讲解其安装、五种命令行用法、五大提权路径的利用链原理与适用限制,读完即可在授权的渗透测试与 CTF 场景中直接落地使用。
一、Traitor 是什么
Traitor 的核心思路是"自动利用低垂果实(low-hanging fruit)弹出 root shell":它把一批针对本地错误配置与已知漏洞的利用方法打包进单一二进制,检测到机会后直接尝试提权,而不是像传统枚举脚本那样只给出人工建议。
仓库 README.md 列出的提权路径包括:
- 几乎所有 GTFOBins 中列出的 sudo 特权利用方式;
- 可写的
docker.sock; - CVE-2022-0847(Dirty Pipe);
- CVE-2021-4034(pwnkit);
- CVE-2021-3560。
从源码看,这些能力分别注册在 pkg/exploits/all.go 与 pkg/exploits/gtfobins.go 中,构成一个可扩展的漏洞注册表(详见下文"工作原理解析")。
二、核心能力:五大提权路径
1. GTFOBins:sudo 特权自动利用
Traitor 覆盖了 GTFOBins 中的大量 sudo 提权方式。仅 pkg/exploits/gtfobins.go 一个文件就注册了上百个二进制,包括但不限于:
| 类别 | 代表性二进制 |
|---|---|
| Shell / 解释器 | ash、bash、csh、dash、ksh、zsh、sh(经env、nice、time等) |
| 文本处理 | awk、gawk、mawk、nawk、sed、ed、ex、vi、vim、vimdiff、rview、rvim |
| 脚本语言 | perl、ruby、python、php、lua、node、irb、pry、byebug、tclsh、wish、jrunscript |
| 包管理 | apt-get、apt、dpkg、rpm、rpmquery、gem、cpan、pip(经python) |
| 系统工具 | find、tar、git、gcc、gdb、strace、ltrace、make、man、less、more、journalctl |
| 网络工具 | nmap、socat、ftp、sftp、scp、ssh、rsync、hping3、iftop、mail |
| 其他 | mysql、sqlite3、psql、nsenter、unshare、setarch、screen、tmux、busybox、expect、zip |
每个条目都预置了对应的 GTFOBins 调用参数。例如find使用find . -exec /bin/sh \; -quit,awk使用BEGIN {system("/bin/sh")},tar通过--checkpoint-action=exec=/bin/sh触发 shell。其判定与利用逻辑见下文"GTFOBins 利用链"。
2. 可写的 docker.sock
当/var/run/docker.sock对当前用户可读写时,Traitor 会直接通过 Docker 守护进程的 UNIX socket API 构造恶意容器,把宿主机根目录挂载进容器,在容器内安装一个带 setuid 位的 Traitor 后门到宿主机,再启动它获得 root shell。实现见 pkg/exploits/dockersock/exploit.go。
3. CVE-2022-0847(Dirty Pipe)
Traitor 对内核版本进行匹配(影响 5.8 及之后版本,修复版本为 5.16.11、5.15.25、5.10.102),利用 Dirty Pipe 漏洞直接覆写只读的/etc/passwd,把 root 密码改为已知值后通过su - root进入 root shell,退出后自动恢复文件内容。实现见 pkg/exploits/cve20220847/exploit.go。
4. CVE-2021-4034(pwnkit)
Traitor 检测pkexec是否存在且版本是否在受影响范围内(≤ 0.105),然后构造恶意的GCONV_PATH环境变量与 gconv 模块链,让pkexec以 root 权限加载恶意共享对象,从而setuid(0)并execve一个 root shell。实现见 pkg/exploits/cve20214034/exploit.go。
5. CVE-2021-3560
针对 polkit 的认证绕过竞态漏洞:Traitor 反复以特定延时中断dbus-send的认证过程,利用竞态创建 UID 为 0 的本地用户并设置密码,再通过su登录后执行sudo -i提权到 root。实现见 pkg/exploits/cve20213560/exploit.go。
三、获取与安装
方式一:直接下载 release 二进制
从项目的 releases 页面下载对应平台的二进制即可直接运行(无需 Go 环境)。
方式二:go 安装
若本机装有 Go 工具链,可以直接用go获取:
CGO_ENABLED=0 go get -u github.com/liamg/traitor/cmd/traitor对于 go1.18 及以上版本,推荐使用go install:
CGO_ENABLED=0 go install github.com/liamg/traitor/cmd/traitor@latest注意:CGO_ENABLED=0用于静态编译,保证二进制在目标机器上不依赖动态库(这一点对渗透场景尤为关键)。本仓库go.mod声明go 1.18,因此上述 go1.18 命令与本仓库完全匹配。
方式三:从源码构建
克隆源码后使用仓库自带的 Makefile:
git clone https://gitcode.com/gh_mirrors/tr/traitor cd traitor make build # CGO_ENABLED=0 go build ./cmd/traitor make install # go install -ldflags "-X github.com/liamg/traitor/version.Version=`git describe --tags`" ./cmd/traitormake install会把 git tag 注入版本号。另外仓库还提供了make pack(运行 cmd/pack/main.go,为 pwnkit 漏洞预编译 386/amd64/arm64 三种架构、/bin/sh与/usr/bin/true两种载荷的共享对象)与make test(go test ./... -race -cover)。
方式四:离线场景下的 base64 传输
README 特别指出:如果目标机器无法访问外网下载二进制,又没有 SCP/FTP 等上传途径,可以在本机把二进制做 base64 编码,再在目标机器上解码还原:
# 在本机 base64 traitor > traitor.b64 # 在目标机器上(把编码串粘贴进来) base64 -d > /tmp/traitor # 最后赋予执行权限 chmod +x /tmp/traitor这也是"静态编译 + 单文件"设计的意义所在。
四、命令行使用详解
Traitor 的全部参数定义在 internal/cmd/root.go,基于 Cobra 实现,共四个核心参数:
| 参数 | 长选项 | 作用 |
|---|---|---|
-a | --any | 检测到漏洞立即尝试利用,获得 root shell 后停止 |
-p | --with-password | 已知当前用户密码时开启;需要分析 sudo 权限时会提示输入密码 |
-e | --exploit | 指定要尝试利用的漏洞 ID(需先检测到系统存在该漏洞) |
-k | --skip | 跳过指定的漏洞 ID,可多次指定以跳过多个 |
1. 无参数:检测模式
traitor不带任何参数运行时,Traitor 只做侦察:收集机器状态、逐个检测潜在漏洞与错误配置,并输出结论,不会真正发起利用。这是最安全的起步方式。
2. 已知密码时加-p
traitor -p如果当前用户密码已知,加上-p让工具在分析 sudo 权限等场景时能自动完成密码认证——因为很多 GTFOBins 利用依赖 sudo,而无密码模式下只能匹配NOPASSWD规则。
3. 自动利用模式-a
traitor -a -p-a模式下 Traitor 会依次检测并尝试利用每个漏洞,一旦成功弹出 root shell 就停止;某个利用失败则继续尝试下一个。配合-p可以覆盖更多 sudo 场景。
4. 定向利用模式-e
traitor -p -e docker:writable-socket-e用于定向利用某个具体漏洞。可用的漏洞 ID(即 pkg/exploits/all.go 中注册的名称)包括:
gtfobins:<binary>:如gtfobins:find、gtfobins:python;docker:writable-socket:可写 Docker socket;polkit:CVE-2021-3560;polkit:CVE-2021-4034;kernel:CVE-2022-0847。
也可以运行traitor list子命令(实现见 internal/cmd/list.go)列出全部可用方法。定向模式下,若系统未检测到该漏洞,会输出类似 "System is not vulnerable to ' ' - cannot exploit." 的提示;若漏洞 ID 不存在则提示 "No exploit found for ' '"。
5. 跳过指定漏洞-k
traitor -a -p -k gtfobins:docker -k kernel:CVE-2022-0847某些利用(如 Dirty Pipe 会短暂改写/etc/passwd)行为较激进,可以用-k跳过;判断逻辑见 internal/cmd/root.go 的shouldSkip函数。
6. 主执行流程源码解读
internal/cmd/root.go 的Run函数展示了完整流程:
- 检查身份:若当前 UID 为 0,直接输出 "You are already root." 并退出;
- 评估机器状态:
state.New()后调用Assess()收集主机名、sudo 条目、发行版与内核版本; - 遍历漏洞注册表:
exploits.Get(exploits.SpeedAny)取回全部注册项,逐个调用IsVulnerable检测; - 信息收集:若漏洞实现了
Disclosure接口,先调用Disclose收集信息; - 尝试利用:若漏洞实现了
ShellDropper接口,且处于-a或-e模式,则调用Shell弹 shell;成功后输出 "Session complete." 并结束。
五、工作原理解析
1. 状态收集(state 包)
pkg/state/state.go 定义了State结构:HasPassword、SudoEntries、Hostname、DistroID、DistroVersion、KernelVersion。Assess()会依次执行:
- 读取主机名;
- 解析 sudoers(
processSudoers); - 读取发行版信息(
processDistro,见 pkg/state/distro.go,通过解析/etc/*-release识别 Ubuntu/Debian/Arch/RHEL/Fedora/CentOS/Kali/Parrot/Alpine/OpenSUSE 等); - 读取内核版本(pkg/state/kernel.go 直接读
/proc/sys/kernel/osrelease)。
2. sudoers 解析
pkg/state/sudoers.go 通过执行sudo -l(无密码时附加-n非交互参数)解析出当前用户的 sudo 规则,每条规则(SudoEntry)记录:可执行用户(UserName/AllUsers)、主机(Hostname/AllHosts)、命令(Command/AllCommands)、是否免密(NoPasswd)以及二进制名(BinaryName)。GetEntryForBinary匹配规则时要求:目标用户为root或ALL,且要么免密、要么提供了密码(hasPasswd || entry.NoPasswd)。这也解释了为什么知道密码(-p)能显著扩大可利用面。
3. 漏洞注册与分发
pkg/exploits/registration.go 定义了Registration{Name, Vulnerability, Speed}结构,register()把漏洞追加进全局注册表,Get(speed)按速度过滤返回(SpeedAny/SpeedSlow/SpeedFast)。各漏洞通过 pkg/exploits/all.go 的多个init()注册,GTFOBins 条目则由registerGTFOBinsExploit批量注册。
pkg/exploits/types.go 定义了三个核心接口,构成"检测 → 披露 → 弹 shell"的流水线:
type Vulnerability interface { // 检测 IsVulnerable(ctx, s, l) bool } type Disclosure interface { // 信息收集(可选) Disclose(ctx, s, l) error } type ShellDropper interface { // 弹出 shell(可选) Shell(ctx, s, l) error }六、五大利用链深入
1. GTFOBins 利用链
判定(pkg/exploits/gtfobins.go)要求:state.SudoEntries.GetEntryForBinary命中该二进制;若规则是ALL命令,还需二进制在PATH中;若条目命令自带参数而该 exploit 又需要追加参数,则跳过。
利用(Exploit方法)流程为:
- 以
sudo启动命令(无密码时自动加-n); - 若设置了环境变量(如
git用PAGER、php用PWN、make用COMMAND),注入到子进程环境; - 若需要临时文件(如
nmap的脚本、zip的注水文件),在/tmp写入PWNFILE指向的文件并chmod 0755,同时把PWNFILE=<path>注入环境; - 用
pty启动命令并接管终端(internal/pipe/pipe.go 的Lockable负责等待特定输出),在-p模式下等待[sudo] password for提示后读取用户输入密码; - 向 pty 依次写入预置的
inputs(如!/bin/sh\n),若携带自定义 payload 则继续写入并回车,随后把 stdin/stdout 与 pty 对接,把用户"丢"进 shell。
整个交互通过creack/pty库实现,源码中还处理了SIGWINCH窗口大小同步与终端 raw 模式切换。
2. Docker socket 利用链
pkg/exploits/dockersock/exploit.go 的判定很简单:syscall.Access("/var/run/docker.sock", O_RDWR)可读写即视为可利用。利用流程为:
- 通过
http.Client走 UNIX socket 访问 Docker API; - 构造含
FROM scratch的 Dockerfile,POST /build构建一个随机命名的恶意镜像;若构建失败(如无法拉取基础层),则列出本地已有镜像(/images/json)逐个尝试; - 创建容器:以
{"Image":"<image>","Cmd":["/pwn<自身路径>","backdoor","install","/pwn<随机路径>"],"Mounts":[{"Type":"bind","Source":"/","Target":"/pwn"}]}把宿主机根目录绑定挂载进容器; - 启动容器并
wait,让容器内执行traitor backdoor install,在宿主机上生成带 setuid 位的后门(pkg/backdoor/traitor.go 会把自身复制为0777|setuid|setgid,默认候选路径为/bin/initrd、/sbin、/usr/bin、/或家目录中的随机文件名); - 校验 setuid 位后以
traitor setuid启动该后门获得 root shell,随后自动执行backdoor uninstall清理后门,并删除容器与镜像。
3. Dirty Pipe(CVE-2022-0847)利用链
pkg/exploits/cve20220847/exploit.go 的版本判定规则:影响 Linux 5.8 及之后,修复版本为 5.16.11、5.15.25、5.10.102——源码中IsVulnerable正是按这些边界逐条排除(minor==16 && patch>=11、minor==15 && patch>=25、minor==10 && patch>=102均判为已修复)。
利用流程:
- 读取
/etc/passwd并备份(截断到 4095 字节); - 构造恶意 root 行
root:$1$traitor$ELjiH/IyoHuVv5Hxiqam21:0:0::/root:/bin/sh(密码为traitor的哈希); - 利用 Dirty Pipe 原理:创建管道 →
F_GETPIPE_SZ取管道容量 → 写满再排空(制造脏页)→splice把/etc/passwd的内容拼进管道 → 覆写指定偏移(要求偏移不能是页边界 4096 对齐,见writeToFile的校验); - 通过
su - root+ 密码traitor进入 root shell(pkg/shell/password.go 负责 pty 交互认证); - 用户退出 shell 后,自动恢复
/etc/passwd原始内容。
4. pwnkit(CVE-2021-4034)利用链
pkg/exploits/cve20214034/exploit.go 先检查pkexec是否存在及其版本(版本段0.<minor>,minor > 105视为已修复),随后构造:
- 临时目录下创建
GCONV_PATH=.目录,写入假可执行文件hax.so:.; - 写入
gconv-modules(module UTF-8// HAX// hax 1); - 编译恶意共享对象
hax.so:gconv_init里执行setuid(0); setgid(0); execve("/bin/sh", ...)(目标机器没有cc编译器时,直接使用 cmd/pack/main.go 预编译好的 386/amd64/arm64 共享对象字节数组,见pkg/exploits/cve20214034/sharedobject_*.go); - 以恶意环境变量(
PATH=GCONV_PATH=.、SHELL=/no/where、CHARSET=HAX、GIO_USE_VFS=)启动pkexec,触发其加载 gconv 模块,最终以 root 身份执行/bin/sh。
IsVulnerable中会先用payload("true")静默验证一次,确认可用后才判定为可利用。
5. CVE-2021-3560 利用链
pkg/exploits/cve20213560/exploit.go 的版本检测分两条分支:Debian 系通过apt info policykit-1版本判断(漏洞在0.105-26引入、0.105-31修复);其他发行版通过pkcheck --version判断(0.113引入、0.119修复)。此外要求系统装有accountsservice与gnome-control-center(缺包时若存在packagekit可先强行安装)。
利用流程:
- 采样
dbus-send创建用户命令的平均执行耗时; - 以
avgTime/4到avgTime的延时区间内反复用context.WithTimeout中断 dbus 调用,制造认证竞态,创建 UID 0 的随机用户traitorXXXX; - 用同样的竞态手法为该用户设置密码
traitor; - 通过
su - traitorXXXX登录,再向 pty 发送sudo -i; exit并输入密码,完成 root 提权。
七、使用前提与注意事项
- 平台:README 说明 Traitor 可运行在所有 Unix-like 系统上,但部分漏洞利用只在特定系统生效——例如 Dirty Pipe 依赖具体内核版本,pwnkit 依赖 polkit/pkexec 的版本,CVE-2021-3560 对发行版与软件包有要求,docker.sock 路径假设为
/var/run/docker.sock。这些版本边界均已写死在对应 exploit 的IsVulnerable中,检测不通过时工具会直接判定不可利用,不会误报。 - 密码场景:
-p只影响分析 sudo 权限等需要认证的场景;无密码时 Traitor 只会匹配NOPASSWD的 sudo 规则(pkg/state/sudoers.go)。 - 行为激进性:Dirty Pipe 利用会短暂改写
/etc/passwd(退出 shell 后自动恢复,期间请勿中断进程);docker.sock 利用会创建并删除容器与镜像、在宿主机临时放置 setuid 后门。此类操作请在授权范围内谨慎使用,必要时用-k跳过。 - 身份要求:工具执行时若当前用户已是 root,会直接提示 "You are already root." 并退出(internal/cmd/root.go)。
- 合法性:Traitor 是渗透测试与安全研究工具,请仅在获得明确授权的系统上使用。
八、小结
Traitor 的价值在于把"枚举 → 人工判断 → 手工利用"的传统提权流程压缩成一条命令:Assess()收集状态、注册表驱动检测、ShellDropper一键弹 shell,GTFOBins 的百级条目与 4 个高危 CVE/Docker 路径全部开箱即用。配合-a(自动尝试)、-e(定向利用)、-k(跳过激进项)与-p(密码辅助)四个参数,即可覆盖从常规 sudo 误配置到内核 0day 的绝大多数提权场景。深入阅读 internal/cmd/root.go 的主流程与 pkg/exploits 各利用实现,还能按同样的register模式扩展属于自己的提权模块。
- 网络安全
- 渗透测试
【免费下载链接】traitor
:arrow_up: :skull_and_crossbones: :fire: Automatic Linux privesc via exploitation of low-hanging fruit e.g. gtfobins, pwnkit, dirty pipe, +w docker.sock
相关推荐
轻松实现Linux游戏帧率翻倍:lsfg-vk无损帧生成实用指南
轻松实现Linux游戏帧率翻倍:lsfg vk无损帧生成实用指南 想在Linux系统上畅玩游戏却苦于帧率不足?lsfg vk这款基于Vulkan技术的无损帧生成
图形学Linux内核漏洞利用终极指南:从内存破坏原理到实战提权技巧
Linux内核漏洞利用终极指南:从内存破坏原理到实战提权技巧 linux kernel exploits是一个全面的Linux平台提权漏洞集合,包含了从2004
网络安全操作系统终极指南:如何利用CVE-2014-3153 futex漏洞实现Linux内核提权
终极指南:如何利用CVE 2014 3153 futex漏洞实现Linux内核提权 Linux内核漏洞利用是信息安全领域的重要课题,而CVE 2014 3153
网络安全操作系统
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考