Ich entdeckte, dass ich immer noch in Dateien schreiben konnte mit echo
und Umleitung (danke Iwillnotexist Idonotexist!). Außerdem kann ich mit echo -ne
beliebige Bytes in eine Datei schreiben. Ich kann also eine Datei mit echo -ne '' > file
gestutzt, dann mit
echo -ne '\001' >> /file
Mit diesem Ansatz, um es immer wieder schreiben, kann ich jede beliebige ausführbare Datei auf dem System vorhanden überschrieben werden (da ich noch root bin) auf diese Weise.
ich ein einfaches Programm kompiliert eine Datei umbenennen:
#include <unistd.h>
int main(int argc, char **argv) { return rename(argv[1], argv[2]); }
mit cross-gcc -static mv.c mv
(Beseitigung der libc.so
Abhängigkeit). Dann habe ich einen Skript jede binäre Datei als eine Reihe von echo
Befehlen zu codieren (begrenzt durch die Länge, dass readline
mir erlauben wird, eingeben zu):
# Encode a file as a series of echo statements.
# settings
maxlen = 1020
infile = '/tmp/mv'
outfile = '/usr/bin/mv'
print "echo -ne '' > %s" % outfile
template = "echo -ne '%%s' >> %s" % outfile
maxchunk = maxlen - len(template % '')
pos = 0
data = open(infile, 'rb').read()
transtable = {}
for i in xrange(256):
c = chr(i)
if i == 0:
transtable[c] = r'\0'
elif c.isalpha():
transtable[c] = c
else:
transtable[c] = r'\0%o' % i
while pos < len(data):
chunk = []
chunklen = 0
while pos < len(data):
bit = transtable[data[pos]]
if chunklen + len(bit) < maxchunk:
chunk.append(bit)
chunklen += len(bit)
pos += 1
else:
break
print template % ''.join(chunk)
Früher habe ich meinen echo
Encoder eine Reihe von echo
Befehlen zu erzeugen, die ich in die ssh
Sitzung eingefügt habe. Diese sieht aus wie
echo -ne '' > /usr/bin/mv
echo -ne '\0177ELF\01\01\01\0\0\0\0\0\0\0\0\0\02\0\050\0\01\0\0\0\0360\0200\0\0\064\0\0\0\030Q\05\0\0\0\0\05\064\0\040\0\05\0\050\0\034\0\033\0\01\0\0\0\0\0\0\0\0\0200\0\0\0\0200\0\0P\03\01\0P\03\01\0\05\0\0\0\0\020\0\0\01\0\0\0\0\017\01\0\0\0237\01\0\0\0237\01\0x\02\0\0X\046\0\0\06\0\0\0\0\020\0\0Q\0345td\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\06\0\0\0\0\0\0\0\01\0\0p\0244\0356\0\0\0244n\01\0\0244n\01\0\0350\010\0\0\0350\010\0\0\04\0\0\0\04\0\0\0R\0345td\0\017\01\0\0\0237\01\0\0\0237\01\0\0\01\0\0\0\01\0\0\06\0\0\0\040\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\020\0265\04\034\0\040\0\0360\053\0371\040\034\016\0360r\0375\0134\0300\0237\0345\0H\055\0351X\060\0237\0345\04\0260\0215\0342\020\0320M\0342\014\0300\0217\0340\03\060\0234\0347\024\060\013\0345D\060\0237\0345\04\0\0213\0342\03\060\0234\0347\020\060\013\0345\070\060\0237\0345\0\020\0240\0343\03\060\0234\0347\014\060\013\0345\054\060\0237\0345\03\060\0234\0347\010\060\013\0345\044\060\0237\0345\03\040\0234\0347\024\060K\0342\0223\072\0\0353\04' >> /usr/bin/mv
echo -ne '\0320K\0342\0\0210\0275\0350\0350\036\01\0\0174\0377\0377\0377\0200\0377\0377\0377\0204\0377\0377\0377\0210\0377\0377\0377\0214\0377\0377\0377\0H\055\0351\04\0260\0215\0342\010\0320M\0342\010\0\013\0345\014\020\013\0345\014\060\033\0345\04\060\0203\0342\0\040\0223\0345\014\060\033\0345\010\060\0203\0342\0\060\0223\0345\02\0\0240\0341\03\020\0240\0341\06\0\0\0353\0\060\0240\0341\03\0\0240\0341\04\0320K\0342\0\0210\0275\0350\0\0\0\0\0\0\0\0\0\0\0\0\0220\0\055\0351\046p\0240\0343\0\0\0\0357\0220\0\0275\0350\0\0\0260\0341\036\0377\057Qr\072\0\0352\0\0\0240\0341\020\0265\04\034\0\0360\014\0370\04\0140\01\040\0100B\020\0275\020\0265\03\034\0377\063\02\0333\0100B\0377\0367\0361\0377\020\0275\020\0265\02K\0230G\010\060\020\0275\0300F\0340\017\0377\0377\0360\0265\031N\0203\0260\034\034\0176D\07\034\01\0222\0\0360\0253\0371\045h\0\0340\0230G\04\065\053h\0\053\0372\0321\0345h\0\0340\0230G\04\065\053h\0\053\0372\0321eh\0\0340\0230G\04\065\053h\0\053\0372\0321\075\034\0200\0315y\034\0210\0' >> /usr/bin/mv
...
ich den Ersatz mv
ein paar Mal getestet, um sicherzustellen, dass es funktionierte (mit Bash Tab-Vervollständigung als Ersatz für ls
) und dann verwendet, um den echo
Codierer einen Ersatz libc.so
in einem temporären zu schreiben Verzeichnis. Schließlich habe ich den Ersatz libc.so
an die richtige Stelle mit der statischen mv
geschoben geschoben.
Und Erfolg! Es könnte etwa eine Stunde gedauert haben, aber meine Box ist wieder in Betrieb und läuft ohne Verluste, bis auf einen geplatzten /usr/bin/mv
:)
Dies könnte für Super User besser geeignet sein. – Veedrac
Entfernen Sie die Litanei von "nicht existierenden" Softlinks, die Sie erstellt haben, und entfernen Sie libc neu. (und hoffe, wenn nötig, haben Sie eine kompetente Gruppe von Händen an der Remote-Site, wenn Remote-Zugriff tanked) –
@ DavidC.Rankin: Ich würde, aber ich kann nichts laufen ... – nneonneo