Skip to content

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:

myuser@$TRGHOST$ scp $SRCHOST:$PATH/file .
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 $ANDERER_USER@$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.

Die kanonische Umgehung hierfür war immer

myuser@$TRGHOST$ ssh $SRCHOST sudo -u $ANDERER_USER cat  $PATH/file > file
gerne auch für ganze Unterverzeichnisse mit tar:
myuser@$TRGHOST$ ssh $SRCHOST sudo -u $ANDERER_USER tar --create --$ZIP --file -  --directory $PATH . | tar --extract --$ZIP --file -
Die Auswahl von $ZIP hängt von der Dicke der Verbindung zwischen den beiden Systemen und ihrer Ausstattung mit CPU ab.

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:

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

Trackbacks

No Trackbacks

Comments

Display comments as Linear | Threaded

No comments

Add Comment

Markdown format allowed
Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.
Form options