miércoles, 25 de marzo de 2020

Obtener MD5 con Bash Script a través de Virustotal API



Obtener_MD5_con_BashScript_a_traves_de_API_Virustotal

¡Hola compañeros! 

Este va a ser un artículo rapido y conciso. 

En una solución Cloud de Endpoint necesitaba añadir 500 IOC's en formato hash para bloquear, esta consola solo permitía añadir el hash en formato MD5 y el cliente nos había proporcionado una lista con 500 hashes en varios formatos (MD5, SHA-1 y SHA-256). 

Podemos tomar varias opciones...indicar al cliente que nos pase los 500 hashes en formato MD5 o pensar la forma en la cual podemos tomar esos hashes ¿?... bingo, API Virustotal

La API gratuita nos permite realizar 4 peticiones/minuto y un máximo de 1000/día, por lo tanto en el código le he metido un sleep de 15 segundos entre cada petición para completar el minuto.

Código del Script 


#!/bin/bash

FILE=$1
API="---API---"
count=0

touch ./result_hash.txt
echo "Number,SourceHash,VTHits,MD5hash" > ./result_hash.txt

echo "Processing..."

while IFS= read -r line || [ -n "$line" ]; do

    let count=count+1
    var=$(curl -s -X POST 'https://www.virustotal.com/vtapi/v2/file/report' --form apikey="$API" --form resource="$line" | awk -F'positives\":' '{print $2}' | awk -F' ' '{print $1$5}' | sed 's/["}]//g')

    if [ -z "$var" ]; then
        echo "$count,$line,NULL,NULL" >> ./result_hash.txt
        echo "Hash $count - Not Found!"
    else
        echo "$count,$line,$var" >> ./result_hash.txt
        echo "Hash $count - OK!"
    fi

    sleep 15
done < $FILE



El script en si es sencillo y puede que tenga algún error que otro, pero el resultado es el esperado.

Metemos el archivo que contiene los hashes como argumento, separando cada hash por línea.

ejecucion_script_virustotal

Sintaxis de ejecución:
  • $ ./vthash.sh <file_hashes>
  • $ ./vthash.sh hashes.txt

Output del Script

 


Se creará un archivo result_hash.txt en el mismo directorio, este contiene el resultado.

Como podéis ver, los hashes que no se encuentren en la BBDD de Virustotal no saldrán...lógica, por lo tanto he añadido NULL en el caso de que la variable VAR se encuentre vacía.

Este código no solo sirve para obtener los hashes en formato MD5, si modificás los AWK podéis obtener una lista de cualquier cadena del resultado de la petición a VT con el comando CURL.


Resultado final

 



Para resumir y finalizar, el caso es que tuve que pedirle al cliente 49 hashes que no fueron encontrados en la BBDD, pero 49 de 509 no está mal ¿no?.

Dejo mi github con el script por si lo necesitáis.
Espero que os pueda servir de ayuda y como digo siempre, cualquier duda, sugerencia, etc, la podéis dejar en los comentarios.

Nos vemos en el próximo artículo.

Saludos!

rekaktz