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
:)
Questo potrebbe essere più appropriato per Super User. – Veedrac
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) –
@ DavidC.Rankin: Vorrei, ma non posso eseguire nulla ... – nneonneo