2014-12-15 8 views
11

Ich wurde in eine Remote-Box als root SSHed, wenn ich den folgenden Befehl lautete:Ich habe gerade libc.so auf meinem Rechner zerstört. Was kann ich jetzt machen?

ln -sf /nonexistent /.../libc.so 

Sofort begann meine prompt Fehler werfen:

basename: could not find shared library 

ich nicht einmal etwas laufen kann:

[email protected]# ls 
ls: could not find shared library 

Wie kann ich das beheben? Ich habe zwei SSH-Sitzungen mit Bash geöffnet, aber keine anderen Prozesse zugänglich. Ich habe einen Cross-Compiler für das Ziel auf meinem lokalen Rechner, aber keine Möglichkeit mehr, SCP-Dateien an das Remote-Ende zu senden.

EDIT: Es gibt keine anderen Kopien von libc auf dieser Box; Ich habe die echte libc-Datei überschrieben. Einige Dinge funktionieren immer noch: Ich kann echo, und ich kann Tab-Completion verwenden, um ls zu emulieren. Aber normale Programme (mv, rm, usw.) sind MIA.

+5

Dies könnte für Super User besser geeignet sein. – Veedrac

+0

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) –

+0

@ DavidC.Rankin: Ich würde, aber ich kann nichts laufen ... – nneonneo

Antwort

6

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 :)

+0

Herzlichen Glückwunsch zur erfolgreichen Umsetzung dieser Strategie! –

+2

@IwillnotexistIdonotexist: Ja, ich bin sehr glücklich darüber. Vielen Dank für deine Hilfe! – nneonneo

+0

Mann, du hast drei Fliegen mit einer Klappe geschlagen! ([on-the-road] (http://winterbash2014.stackexchange.com/on-the-road), [Geschäft-in-der-Front-Party-in-the-back] (http: // winterbash2014. stackexchange.com/business-in-the-front-party-in-the-back), [selfie] (http://winterbash2014.stackexchange.com/selfie))! –