
Estrattore di Indicatori di Compromissione (IOC) Disarmati.
Indicatore di Compromissione (IOC) per alcuni degli artefatti più comunemente ingeriti.
Il pacchetto iocextract è una libreria e un'interfaccia a riga di comando (CLI) per estrarre URL, indirizzi IP, hash MD5/SHA, indirizzi email e regole YARA da corpus di testo. Permette di estrarre IOC codificati e "defangati" e, opzionalmente, di decodificarli o rifangarli.
È prassi comune che gli analisti di malware o i software di endpoint "defanghino" gli IOC, come URL e indirizzi IP, per prevenire l'esposizione accidentale a contenuti dannosi in tempo reale. Essere in grado di estrarre e aggregare questi IOC è spesso prezioso per gli analisti. Sfortunatamente, gli strumenti esistenti di "estrazione IOC" spesso li ignorano, poiché non vengono catturati dalle regex standard.
Ad esempio, la semplice tecnica di defanging di circondare i punti con parentesi quadre:
127[.]0[.]0[.]1
Gli strumenti esistenti che usano una semplice regex per indirizzi IP ignoreranno completamente questo IOC.
Combinando regex appositamente create con una post-elaborazione personalizzata, siamo in grado di rilevare e deoffuscare gli IOC "defangati". Questo fa risparmiare tempo e fatica all'analista, che altrimenti dovrebbe trovare e convertire manualmente gli IOC in un formato leggibile dalla macchina.
Molti utenti di Twitter pubblicano C2 o altre preziose informazioni IOC con URL defangati. Ad esempio, questo tweet di @InQuest:
Lettura consigliata e ottimo lavoro di @unit42_intel:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/ ...
I clienti InQuest hanno rilevamento per minacce provenienti da hotfixmsupload[.]com
dal 6/3/2017 e cdnverify[.]net dal 2/1/18.
Se lo elaboriamo con l'estrattore, possiamo facilmente estrarre gli URL:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/
hotfixmsupload[.]com
cdnverify[.]net
Passando refang=True al momento dell'estrazione rimuoverebbe l'offuscamento, ma poiché questi sono IOC reali, lasciamoli defangati nella nostra documentazione.
Potrebbe essere necessario installare gli header di sviluppo di Python per installare la dipendenza regex. Su sistemi basati su Ubuntu/Debian, provare:
sudo apt-get install python-dev
Quindi installare iocextract da pip:
pip install iocextract
Se si hanno problemi di installazione su Windows, provare a installare regex direttamente scaricando la wheel appropriata da PyPI e installando tramite pip:
pip install regex-2018.06.21-cp27-none-win_amd64.whl
Provare a estrarre alcuni URL defangati:
import iocextract
contenuto = \
"""
Adoro example[.]com!
Tutti i bot sono su hxxp://example.com/bad/url in questi giorni.
C2: tcp://example[.]com:8989/bad
"""
for url in iocextract.extract_urls(contenuto):
print(url)
# Output
# hxxp://example.com/bad/url
# tcp://example[.]com:8989/bad
# example[.]com
# tcp://example[.]com:8989/bad
NOTA: Alcuni URL potrebbero apparire due volte se vengono catturati da più regex.
Se lo si desidera, è anche possibile "rifangare", ovvero rimuovere i metodi comuni di offuscamento dagli IOC:
import iocextract
for url in iocextract.extract_urls(contenuto, refang=True):
print(url)
# Output
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Se non si desidera defangare affatto gli IOC estratti durante l'estrazione, è possibile disabilitare anche questo:
import iocextract
contenuto = \
"""
http://example.com/bad/url
http://example.com:8989/bad
http://example.com
http://example.com:8989/bad
"""
for url in iocextract.extract_urls(contenuto, defang=False):
print(url)
# Output
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Tutte le funzioni extract_* di questa libreria restituiscono iteratori, non liste. Il vantaggio di questo comportamento è che iocextract può elaborare input estremamente grandi con un overhead molto basso. Tuttavia, se per qualche motivo è necessario iterare sugli IOC più di una volta, è necessario salvare i risultati come lista:
import iocextract
contenuto = \
"""
Adoro example[.]com!
Tutti i bot sono su hxxp://example.com/bad/url in questi giorni.
C2: tcp://example[.]com:8989/bad
"""
print(list(iocextract.extract_urls(contenuto)))
# ['hxxp://example.com/bad/url', 'tcp://example[.]com:8989/bad', 'example[.]com', 'tcp://example[.]com:8989/bad']
È incluso anche uno strumento a riga di comando:
$ 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]
Estrattore avanzato di Indicatori di Compromissione (IOC). Se non vengono
specificati argomenti, il comportamento predefinito è estrarre tutti gli IOC.
argomenti opzionali:
-h, --help mostra questo messaggio di aiuto ed esce
--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 con stringhe regex personalizzate, una per riga, con un gruppo di cattura ciascuna
--refang default: no
--strip-urls rimuove possibili detriti dalla fine degli URL. default: no
--wide preprocessa l'input per consentire match di caratteri a codifica estesa. default: no
NOTA: Solo URL, email e indirizzi IPv4 possono essere "rifangati".
State...
D. Estraendo IOC potenzialmente defangati da testo semplice, come il contenuto di tweet o post di blog?
R. Sì! Questo è esattamente ciò per cui è stato progettato iocextract e dove dà il meglio di sé. Vuoi andare oltre e automatizzare l'estrazione e l'archiviazione? Dai un'occhiata a ThreatIngestor.