Wildcard Injection rsync?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
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.

mathprob1 
Fragesteller
 15.05.2023, 21:42

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

0
davegarten  15.05.2023, 23:24
@mathprob1

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.

0
KarlRanseierIII  16.05.2023, 01:36
@mathprob1
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.

0
mathprob1 
Fragesteller
 16.05.2023, 08:38
@KarlRanseierIII

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

0
davegarten  16.05.2023, 10:40
@mathprob1

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.

0
mathprob1 
Fragesteller
 16.05.2023, 10:50
@davegarten

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.

0

-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.