Hay una librería en Python que nos permite utilizar la API de virustotal, pero primero tendremos que instalarla con el siguiente comando:
pip install virustotal-python
pip install virustotal-api
===== ANALIZAR ARCHIVO NO EXISTENTE EN LA BASE DE DATOS DE VIRUSTOTAL =====
En caso de que el archivo no se encuentre subido a la base de datos de virustotal, primero debemos utilizar otra librería de python para realizar primero esa subida y luego poder analizarlo. Por tanto con este código podemos subir un archivo desde Python a virustotal:
import virustotal_python
import os.path
archivo = "prueba.py"
# Crea un diccionario que contenga el archivo para enviarlo para la codificación de varias partes
files = {"file": (os.path.basename(archivo), open(os.path.abspath(archivo), "rb"))}
with virustotal_python.Virustotal("API") as vtotal:
resp = vtotal.request("files", files=files, method="POST")
print(resp.json())
Aunque también podemos hacer este mismo código mucho más simple de esta forma:
import virustotal_python
archivo = "prueba.py"
files = {"file": ((archivo), open((archivo), "rb"))}
with virustotal_python.Virustotal("API") as vtotal:
resp = vtotal.request("files", files=files, method="POST")
print(resp.json())
Y ya está subido:
{{pasted_image_20230417215638.png|}}
También podríamos analizar varios archivos que no se encuentren en la base de datos de virustotal a la vez:
from hashlib import md5
from virus_total_apis import PublicApi
import os
# AQUÍ SUBIMOS LOS ARCHIVOS
archivos = os.listdir()
# A PARTIR DE AQUÍ ES DONDE OBTENEMOS EL REPORTE
API_KEY = "974ab16a5f23d3c9997954dd01f253e2752f4a7b092a82cc3d68ecf06ff336f6" # Reemplaza "TUI_API_KEY_AQUI" con tu clave API de VirusTotal.
api = PublicApi(API_KEY)
for archivo in archivos:
with open(archivo, "rb") as f:
file_content = f.read()
file_hash = md5(file_content).hexdigest()
response = api.get_file_report(file_hash)
if response["response_code"] == 200: # Entramos en este if si el escaneo fue exitoso.
if "positives" in response["results"] and response["results"]["positives"] > 0:
print(f"El archivo {archivo} es malicioso.")
else:
print(f"El archivo {archivo} es seguro.")
elif response["response_code"] == 0: # Entramos en este caso si el archivo no se encuentra en VirusTotal.
print(f"El archivo {archivo} no se encuentra en la base de datos de VirusTotal.")
else:
print(f"No se pudo obtener el análisis del archivo {archivo}.")
Y este es el resultado:
{{pasted_image_20231017082936.png|}}
===== ANALIZAR ARCHIVO EXISTENTE EN LA BASE DE DATOS DE VIRUSTOTAL =====
Si el archivo que queremos analizar ya se encuentra dentro de la base de datos de virustotal, podemos utilizar la librería virus_total_apis para hacer el análisis. Por tanto con este código podríamos conectarnos a virustotal y obtener el reporte de un archivo:
from hashlib import md5
from virus_total_apis import PublicApi
API_KEY = "API" # Importamos la API de virustotal.
api = PublicApi(API_KEY)
with open("pruebas.py", "rb") as f:
file_hash = md5(f.read()).hexdigest() # Convertimos en hash todo el contenido del archivo.
response = api.get_file_report(file_hash) # Obtenemos la respuesta de virustotal
print(response)
{{pasted_image_20230403141732.png|}}
También podemos utilizar sentencias condicionales que evalúen los resultados en forma de diccionario que nos ofrece virustotal:
from hashlib import md5
from virus_total_apis import PublicApi
# AQUÍ SUBIMOS LOS ARCHIVOS
archivos = ["pass.txt", "users.txt"]
# A PARTIR DE AQUÍ ES DONDE OBTENEMOS EL REPORTE
API_KEY = "API" # Importamos la API de virustotal.
api = PublicApi(API_KEY)
for i in archivos:
with open(i, "rb") as f:
file_content = f.read()
file_hash = md5(file_content).hexdigest() # Convertimos en hash todo el contenido del archivo.
response = api.get_file_report(file_hash) # Obtenemos la respuesta de virustotal
print(response)
if response["response_code"] == 200: # Entramos en este if si el escaneo fue exito.
if response["results"]["positives"] > 0: # Detecta que no haya ningún positivo, por lo que es malicioso.
print("Archivo malicioso.")
else:
print("Archivo seguro.") # Si encuentra que es positivo se imprime esto.
else:
print("No ha podido obtenerse el análisis del archivo.")
===== DETECTAR LOS REPORTES QUE TIENE UN ARCHIVO =====
También podemos hacer que el script nos diga si un archivo tiene más de 10 o 15 reportes por ejemplo, simplemente accediendo al diccionario:
import hashlib
from virus_total_apis import PublicApi
API_KEY = "API"
api = PublicApi(API_KEY)
with open("pruebas.py", "rb") as f:
file_hash = hashlib.md5(f.read()).hexdigest()
response = api.get_file_report(file_hash)
# Aquí evalúa los resultados del análisis.
if response["response_code"] == 200:
if response["results"]["positives"] >= 15: # Detecta que no haya ningún positivo, por lo que es malicioso.
print("El archivo tiene 15 o más reportes.")
else:
print("El archivo tiene menos de 15 reportes.")
else:
print("No ha podido obtenerse el análisis del archivo.")
{{pasted_image_20230403152057.png|}}
Ahora otro ejemplo con otro archivo que sí tiene más de 15 reportes:
import hashlib
from virus_total_apis import PublicApi
API_KEY = "API" # Importamos la API de virustotal.
api = PublicApi(API_KEY)
with open("virus.exe", "rb") as f:
file_hash = hashlib.md5(f.read()).hexdigest()
response = api.get_file_report(file_hash)
# Aquí evalúa los resultados del análisis.
if response["response_code"] == 200:
if response["results"]["positives"] >= 15: # Detecta que no haya ningún positivo, por lo que es malicioso.
print("El archivo tiene 15 o más reportes.")
else:
print("El archivo tiene menos de 15 reportes.")
else:
print("No ha podido obtenerse el análisis del archivo.")
{{pasted_image_20230403152032.png|}}
===== ANALIZAR UN HASH VIRUSTOTAL PYTHON =====
Si quisiéramos analizar un hash, simplemente tendríamos que proporcionarlo de esta forma:
from virus_total_apis import PublicApi
API_KEY = "API" # Importamos la API de virustotal.
api = PublicApi(API_KEY)
hash_to_check = "81dc9bdb52d04dc20036dbd8313ed055" # Este es el hash que queremos analizar
response = api.get_file_report(hash_to_check) # Obtenemos la respuesta de virustotal
print(response)
Y esta es la respuesta:
{{pasted_image_20230417142230.png|}}