Daten mit Privilege Escalation abholen über eine named pipe
Aufgabe: Transportiere Daten von einem Host auf den anderen über eine ssh-Verbindung. Dafür kann man scp oder sftp verwenden, wenn der eigene Account auf der anderen Seite die Daten lesen darf:
Interessanter wird das dann, wenn die Daten auf der anderen Seite vom eigenen Account nicht gelesen werden können, man also erst einmal sudo bemühen muss, um die Daten lesen zu können. An dieser Stelle versagt scp bereits - es sei denn, man kann sich auf der anderen Seite als anderer User einloggen:myuser@$TRGHOST$ scp $SRCHOST:$PATH/file .
Nur, das scheitert oft daran, dass man das Passwort von $ANDERER_USER nicht kennt, nicht neu setzen kann und/oder seinen ssh-Key nicht in $ANDERER_USER/.ssh/authorized_keys fallen lassen kann oder darf.myuser@$TRGHOST$ scp $ANDERER_USER@$SRCHOST:$PATH/file .
Die kanonische Umgehung hierfür war immer
gerne auch für ganze Unterverzeichnisse mit tar:myuser@$TRGHOST$ ssh $SRCHOST sudo -u $ANDERER_USER cat $PATH/file > file
Die Auswahl von $ZIP hängt von der Dicke der Verbindung zwischen den beiden Systemen und ihrer Ausstattung mit CPU ab.myuser@$TRGHOST$ ssh $SRCHOST sudo -u $ANDERER_USER tar --create --$ZIP --file - --directory $PATH . | tar --extract --$ZIP --file -
Dieser Trick funktioniert neuerdings allerdings nicht mehr. sudo beklagt sich darüber, dass es kein pty vorfindet, und ssh -t zu benutzen scheitert oftmals daran, dass ein pty die Daten nicht hundertprozentig clean überträgt. Außerdem ist das Caching von sudo-Credentials seit etlichen Monaten an das eine pty gebunden, so dass die Passwortabfrage auf jeden Fall in der Pipe erfolgen muss. Früher hat es gereicht, dann sudo -v in einer anderen Shell auf $HOST auszuführen, aber dass das inzwischen nicht mehr geht, ist eigentlich ganz gut so.
Abhilfe kommt hier in Form der ersten sinnvollen Anwendung einer Named Pipe meiner Unix-Laufbahn, indem man auf der einen Seite das schreibende tar (mit sudo!) aufruft, dass es in die Named Pipe schreibt und man dann die Daten ohne besondere Privilegien von einer anderen Maschine abholt:
Wenn die Daten irgendwelche Wichtigkeit haben, möchte man natürlich über geeignete Rechte auf der pipe dafür sorgen, dass nicht irgendjemand anders vor einem selbst auf die pipe connected und die Daten abholt; für den Hausgebrauch tut es chmod 666.myuser@$SRCHOST$ mkfifo foo; chmod 666 foo myuser@$SRCHOST$ sudo -u $ANDERER_USER tar --create --$ZIP --file foo --directory $PATH . myuser@$TRGHOST$ ssh $SRCHOST cat foo | tar --extract --$ZIP --file -
Comments
Display comments as Linear | Threaded