strace 发现 sudo 密码持久位置

strace 发现 sudo 密码持久位置

strace/dtrace/ltrace ... 对很多事情都有用,从查找隐藏的访问冲突到网络套接字跟踪,但可能无法看到全部。

我一直没能弄清楚如何使用 strace (当我试图回答另一个问题时它又出现了问题今天),其中 sudo 在系统内存中分配并保存纯文本密码。如果这对您来说是新闻,那么链接的问题是相关的。

我得到的最接近的结果是,有这样的痕迹(这可能是一个不好的例子,使用堆叠的 sudo;我尝试了一些方法):

$ sudo strace -ff -o mem sudo -s
Enter password...

如下行:

mem.14471:stat("/etc/profile.d/gnome-ssh-askpass.sh", {st_mode=S_IFREG|0644, st_size=70, ...}) = 0
mem.14471:access("/etc/profile.d/gnome-ssh-askpass.sh", R_OK) = 0
mem.14471:open("/etc/profile.d/gnome-ssh-askpass.sh", O_RDONLY) = 3
mem.14471:read(3, "SSH_ASKPASS=/usr/libexec/openssh"..., 70) = 70

我相信我尝试过单独跟踪它们,甚至用它自己的 strace 替换了 /usr/libexec/openssh-askpass 中的环境变量,但都无济于事。

我知道如何读取和解码 strace;我可以跟踪分配的句柄、返回代码和内存分配。我找不到一个在 sudo 处于活动状态时在内存中分配并保留 sudo 密码(最多 7 次)的 fork。密码驻留的证明是通过LiME 取证应用于CentOS。

或者,是否有更好的方法,比如迭代进程内存分配?

答案1

strace 不会显示任何如此具体的内容。你能得到的最接近的信息是glibc 用来获取全新内存区域的brk()或调用。其余的mmap(MAP_ANONYMOUS)不使用系统调用,只是直接内存访问。

你可以尝试ltrace用于用户空间库调用。

或者直接在源代码中找到密码提示,看看结果如何。添加几个printf()' 来显示内存地址。

相关内容