
Extractor de Indicadores de Compromiso (IOC) desarmados.
Indicador de Compromiso (IOC) para algunos de los artefactos más comúnmente ingeridos.
El paquete iocextract es una biblioteca e interfaz de línea de comandos (CLI) para extraer URLs, direcciones IP, hashes MD5/SHA, direcciones de correo electrónico y reglas YARA de corpus de texto. Permite extraer IOCs codificados y "defanged" y, opcionalmente, decodificarlos o "refangearlos".
Es práctica común que los analistas de malware o el software de endpoints "defangeen" IOCs como URLs y direcciones IP, para evitar la exposición accidental a contenido malicioso en vivo. Poder extraer y agregar estos IOCs suele ser valioso para los analistas. Desafortunadamente, las herramientas existentes de "extracción de IOCs" a menudo los pasan por alto, ya que no son capturados por expresiones regulares estándar.
Por ejemplo, la técnica simple de defanging de rodear los puntos con corchetes:
127[.]0[.]0[.]1
Las herramientas existentes que usan una expresión regular simple de dirección IP ignorarán este IOC por completo.
Combinando expresiones regulares especialmente diseñadas con algún post-procesamiento personalizado, podemos detectar y desobfuscar IOCs "defanged". Esto ahorra tiempo y esfuerzo al analista, que de otro modo tendría que encontrar y convertir manualmente los IOCs a un formato legible por máquina.
Muchos usuarios de Twitter publican C2s u otra información valiosa de IOC con URLs defanged. Por ejemplo, este tuit de @InQuest:
Lectura recomendada y gran trabajo de @unit42_intel:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/ ...
Los clientes de InQuest han tenido detección para amenazas entregadas desde hotfixmsupload[.]com
desde el 6/3/2017 y cdnverify[.]net desde el 1/2/18.
Si ejecutamos esto a través del extractor, podemos extraer fácilmente las URLs:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/
hotfixmsupload[.]com
cdnverify[.]net
Pasando refang=True en el momento de la extracción eliminaría la ofuscación, pero como son IOCs reales, dejémoslos defanged en nuestra documentación.
Es posible que necesites instalar los encabezados de desarrollo de Python para poder instalar la dependencia regex. En sistemas basados en Ubuntu/Debian, prueba:
sudo apt-get install python-dev
Luego instala iocextract desde pip:
pip install iocextract
Si tienes problemas para instalar en Windows, prueba instalando regex directamente descargando la rueda adecuada de PyPI e instalando mediante pip:
pip install regex-2018.06.21-cp27-none-win_amd64.whl
Prueba a extraer algunas URLs defanged:
import iocextract
content = \
"""
¡Me encanta example[.]com!
Todos los bots están en hxxp://example.com/bad/url estos días.
C2: tcp://example[.]com:8989/bad
"""
for url in iocextract.extract_urls(content):
print(url)
# Salida
# hxxp://example.com/bad/url
# tcp://example[.]com:8989/bad
# example[.]com
# tcp://example[.]com:8989/bad
NOTA: Algunas URLs pueden aparecer dos veces si son capturadas por múltiples expresiones regulares.
Si lo deseas, también puedes "refangear", o eliminar métodos comunes de ofuscación de los IOCs:
import iocextract
for url in iocextract.extract_urls(content, refang=True):
print(url)
# Salida
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Si no quieres defangear los IOCs extraídos durante la extracción, también puedes deshabilitar esto:
import iocextract
content = \
"""
http://example.com/bad/url
http://example.com:8989/bad
http://example.com
http://example.com:8989/bad
"""
for url in iocextract.extract_urls(content, defang=False):
print(url)
# Salida
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Todas las funciones extract_* en esta biblioteca devuelven iteradores, no listas. El beneficio de este comportamiento es que iocextract puede procesar entradas extremadamente grandes, con una sobrecarga muy baja. Sin embargo, si por alguna razón necesitas iterar sobre los IOCs más de una vez, tendrás que guardar los resultados como una lista:
import iocextract
content = \
"""
¡Me encanta example[.]com!
Todos los bots están en hxxp://example.com/bad/url estos días.
C2: tcp://example[.]com:8989/bad
"""
print(list(iocextract.extract_urls(content)))
# ['hxxp://example.com/bad/url', 'tcp://example[.]com:8989/bad', 'example[.]com', 'tcp://example[.]com:8989/bad']
También se incluye una herramienta de línea de comandos:
$ iocextract -h
usage: iocextract [-h] [--input INPUT] [--output OUTPUT] [--extract-emails]
[--extract-ips] [--extract-ipv4s] [--extract-ipv6s]
[--extract-urls] [--extract-yara-rules] [--extract-hashes]
[--custom-regex REGEX_FILE] [--refang] [--strip-urls]
[--wide]
Advanced Indicator of Compromise (IOC) extractor. If no arguments are
specified, the default behavior is to extract all IOCs.
optional arguments:
-h, --help show this help message and exit
--input INPUT default: stdin
--output OUTPUT default: stdout
--extract-emails
--extract-ips
--extract-ipv4s
--extract-ipv6s
--extract-urls
--extract-yara-rules
--extract-hashes
--custom-regex REGEX_FILE file with custom regex strings, one per line, with one capture group each
--refang default: no
--strip-urls remove possible garbage from the end of urls. default: no
--wide preprocess input to allow wide-encoded character matches. default: no
NOTA: Solo las URLs, correos electrónicos y direcciones IPv4 pueden ser "refanged".
¿Estás...
P. Extrayendo IOCs posiblemente defanged de texto plano, como el contenido de tuits o publicaciones de blog?
R. ¡Sí! Esto es exactamente para lo que fue diseñado iocextract, y donde mejor funciona. ¿Quieres ir un paso más allá y automatizar la extracción y almacenamiento? Echa un vistazo a ThreatIngestor.