Wildcard Injection rsync?
Guten Tag,
ich belege zur Zeit ein Modul in der Uni wo es um Sicherheit in Rechnernetzen geht. Diese Woche haben wir für die Praxis die Aufgabe auf einem "muck" Server mit linpeas Schwachstellen zu finden. Ich habe nach dem Ausführen des Programms eine Schwachstelle in der crontab file gefunden:
* * * * * root cd /var/www/; rsync -a * /mnt/backup/
Hier ist mir direkt aufgefallen dass das Wildcard Symbol verwendet wird um daten mit rsync zu kopieren und somit eine Wildcard-Injection möglich sein könnte. Ich habe mir also eine shell.sh file erstellt in /var/www mit folgendem Inhalt:
#!/bin/sh
adduser -G 0 username
und dann mit folgendem Befehl den command für die Wildcard Injection erstellt:
touch '/var/www/-e "sh shell.sh"'
bis dahin alles super. ich hab auch gesehen, dass shell.sh nach /mnt/backup kopiert wurde und der Befehl nicht (somit denke ich wurde er als Befehl erkannt). jedoch wurde das Shellscript nie ausgeführt. Dies konnte ich daran sehen das ich immernoch in Gruppe 33 war und nicht in Gruppe 0. Ich sehe aber nicht so richtig was ich falsch gemacht habe, vielleicht kann mir ja jemand helfen. Ich sitze da seit gestern dran und komme kein Stück weiter
2 Antworten
touch '/var/www/-e "sh shell.sh"'
Fehlt da nicht noch ein Space nach dem /var/www?
"-e" sollte ja via File-Globbing zur Command Line Option für rsync werden. Und das geht nur, wenn da ein Space ist. Allerdings geht "-e" meines Wissens nur dann, wenn Du mit rsync versuchst, auf einen remote-Host zuzugreifen, also so im Stil von
rsync /quellverzeichnis/ username@remotehost:zielverzeichnis/
Ich bin mir daher nicht sicher, ob Du dieses Beispiel mit rsync überhaupt zum Laufen bringst, so dass am Schluss "shell.sh" unter root ausgeführt wird.
Also so wie ich das verstehe ist der PATH Exploit einfach. Du ersetzt in /usr/local/bin ein Binary, welches von root (z.B. via crontab) mit Sicherheit irgendwann aufgerufen wird, durch einen Shellscript-Wrapper, und schon wird Dein Code mitausgeführt, wenn der root das nächste Mal den Command ausführt. Du kannst natürlich auch einfach das Binary ganz durch Deinen Code ersetzen. Dann allerdings läufst Du Gefahr, dass wenn root den Befehl ausführt, das nicht-richtig- Funktionieren des Befehls entdeckt, z.B. weil ein erwarteter Output fehlt. Ein Wrapper ist daher sinnvoller. Angenommen, $PATH ist auf dem System so konfiguriert, dass /usr/local/bin z.B. vor /usr/bin kommt (ist zwar nicht üblich), dann könntest Du auch einfach ein Script erzeugen, das den selben Namen hat wie ein von root aufgerufenes Programm in /usr/bin. Dein Script würde dann aufgrund der Suchreihenfolge in $PATH zuerst ausgeführt.
Zu Deinem ersten Beispiel, ich denke ich habe einen Lösungsansatz gefunden:
myuser@myhost:~> cd /var/www
myuser@myhost:/var/www> touch -- '-e sh shell.sh'
myuser@myhost:/var/www> vi shell.sh
Inhalt Script shell.sh:
-------- start ----------
#!/bin/bash
/usr/bin/id > out.log 2>&1
exec /usr/bin/ssh $@
-------- ende ----------
Dann der Test:
root@myhost:/var/www> rsync -a * myuser@myhost:
Wenn Du das machst, wird shell.sh mitausgeführt, wenn Du rsync mit * aufrufst und dabei für das Ziel eine User-/Hostnamenkombination angibst. in /var/www sollte es nachher ein out.log geben, welches beweist, dass shell.sh von root ausgeführt wurde. Natürlich könntest Du in shell.sh die Zeile mit "/usr/bin/id" durch etwas beliebiges anderes ersetzen, z.B. könntest Du dem unprivilegierten User "myuser" heimlich irgendwelche Rechte auf dem System geben, ihn zu Gruppen hinzufügen oder Modes auf Directories und Files zu seinen Gunsten ändern.
Einmal das /usr/local/bin von jedem beschreibbar ist und /usr/local/bin in $PATH ist und man somit irgendwie ne Backdoor in dem Ordner anlegen kann.
Du Du bereits weißt, daß cron rsync mit root rechten ausführt, könntest Du unter /usr/local/bin ein Shell script mit Namen rsync ablegen und es sollte mit rootrechten ausgeführt werden.
Voraussetzung wäre allerdings daß /usr/local in der Reihenfolge vor dem Pfad liegt, in dem sich das eigentliche rsync befindet.
Vergessen: cron muß natürlich auch diesen PFad nutzen - was nciht selbstverständlich ist.
Vielen Dank. ich habe es tatsächlich immernoch nicht geschafft eine root shell zu bekommen aber mit dem $PATH exploit habe ich es immerhin geschafft die flag zu bekommen und somit das Rätsel zu lösen in dem ich im "rsync" script schreibe dass die Datei flag nach /tmp kopiert werden soll und dann noch chmod 777 ausgeführt wird. Die Flag war übrigens: l1np345_m4k35_pr1v1l363_35c4l4710n_345y. Ich versuche mich jetzt nochmal daran eine Root-Shell zu bekommen weil ich finde nicht dass ich die Aufgabe zu 100% gelöst habe nur weil ich die Lösung kenne
Du kannst meine rsync-Variante nehmen, und dort an Stelle des /usr/bin/id Aufrufs im shell.sh dann Deinen unprivilegeierten User ins /etc/sudoers eintragen. Danach bekommst Du eine root Shell, wenn Du z.B. "sudo bash" vom unprivilegierten User eingibst.
es gibt leider keine sudoers Datei auf dem Server. ich hab es jetzt so gemacht: Ich habe als erstes in /usr/local/bin die Datei rsync erstellt. dort hab ich dann die Befehle 'useradd -p "" hacked' und 'chmod 777 passwd' ausgeführt. dann habe ich die passwd Datei editiert und die Gruppe vom Nutzer hacked von 1000 zu 0 geändert. Danach konnte ich dann einfach "su hacked" ausführen und hatte eine root Shell.
-e ist die Kurzoption für --rsh, die Option hat also nur dann eine Bedeutung, wenn eine Remoteverbindugn gebraucht wird. Das kannst Du auch recht einfach feststellen, indem Du rsync mit -e etwas mitgibst und nen strace machst - es wird kein weiteres exec ausgeführt.
Erst wenn ein Host in target/source auftaucht, findet wirklich ein exec statt.
Da wirst Du so vermutlich nicht weiterkommen.
Okay danke ich habe es tatsächlich nicht zu laufen bekommen. Aber in der Aufgabe steht das wir mit linpeas zwei Schwachstellen finden sollen und eine davon ausnutzen sollen um eine root-shell zu bekommen. linpeas hat mir aber nur zwei Schwachstellen angezeigt. Einmal das /usr/local/bin von jedem beschreibbar ist und /usr/local/bin in $PATH ist und man somit irgendwie ne Backdoor in dem Ordner anlegen kann. und die andere Schwachstelle war das rsync mit ner Wildcard in crontab ausgeführt wird. Für mich schien rsync irgendwie einfacher aber ich krieg es irgendwie nicht hin. Vllt muss ich doch nochmal an den $PATH Exploit ran aber da hab ich noch garkeine Ahnung was das Prinzip ist. Trotzdem vielen Dank für deine Antwort :D