2014-12-15 24 views
11

Stavo SSHed in una scatola remoto come root quando ho eseguito il seguente comando:Ho appena distrutto libc.so sulla mia macchina. Cosa posso fare ora?

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

Subito la mia pronta iniziato a gettare errori:

basename: could not find shared library 

Non riesco nemmeno a correre qualsiasi cosa:

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

Come posso risolvere questo problema? Ho due sessioni SSH aperte con Bash, ma nessun altro processo è accessibile. Ho un cross-compiler per il target sulla mia macchina locale, ma non c'è più alcun modo per i file SCP sull'estremità remota.

MODIFICA: non ci sono altre copie di libc su questa scatola; Ho sovrascritto il vero file libc. Alcune cose funzionano ancora: posso echo e posso usare tab-completion per emulare ls. Ma i programmi normali (mv, rm, ecc.) Sono MIA.

+5

Questo potrebbe essere più appropriato per Super User. – Veedrac

+0

Rimuovere (scollegare) la litania dei collegamenti "inesistenti" creati e reinstallare libc. (e spero, se necessario, di avere un gruppo di mani competente sul sito remoto se l'accesso remoto è intasato) –

+0

@ DavidC.Rankin: Vorrei, ma non posso eseguire nulla ... – nneonneo

risposta

6

Ho scoperto che potrei ancora scrivere sui file usando echo e il reindirizzamento (grazie Iwillnotexist Idonotexist!). Inoltre, echo -ne mi consente di scrivere byte arbitrari in un file. Posso quindi troncare un file con echo -ne '' > file, poi ripetutamente scrivere su di esso con

echo -ne '\001' >> /file 

Usando questo approccio, posso sovrascrivere eventualmente presente eseguibile sul sistema (dato che sono ancora root) in questo modo.

ho compilato un semplice programma per rinominare un file:

#include <unistd.h> 
int main(int argc, char **argv) { return rename(argv[1], argv[2]); } 

utilizzando cross-gcc -static mv.c mv (eliminando il libc.so dipendenza). Poi, ho scritto uno script per codificare qualsiasi file binario come una serie di echo comandi (limitata dalla lunghezza che readline mi permetterà di entrare):

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

ho usato la mia encoder echo per generare una serie di echo comandi che ho incollato in massa nella sessione ssh. Questi sembrano

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

ho provato la sostituzione mv un paio di volte per assicurarsi che ha funzionato (usando Bash scheda di completamento come un sostituto per ls), e poi utilizzato l'encoder echo di scrivere una sostituzione libc.so ad una temporanea directory. Infine, ho spostato la sostituzione libc.so nel posto giusto usando la statica mv che ho spinto.

E il successo! Potrebbe essere occorsa circa un'ora, ma il mio box è tornato attivo e funzionante, senza perdite per uno scomodo /usr/bin/mv :)

+0

Congratulazioni per l'implementazione di questa strategia con successo! –

+2

@IwillnotexistIdonotexist: Sì, sono molto contento di questo. Grazie mille per il vostro aiuto! – nneonneo

+0

Uomo con cui hai ucciso tre piccioni con una fava! ([on-the-road] (http://winterbash2014.stackexchange.com/on-the-road), [business-in-the-front-party-in-the-back] (http: // winterbash2014. stackexchange.com/business-in-the-front-party-in-the-back), [selfie] (http://winterbash2014.stackexchange.com/selfie))! –