
Extrator de Indicador de Comprometimento (IOC) Desarmado.
Indicador de Comprometimento (IOC) extrator para alguns dos artefatos mais comumente ingeridos.
O pacote iocextract é uma biblioteca e interface de linha de comando (CLI) para extrair URLs, endereços IP, hashes MD5/SHA, endereços de e-mail e regras YARA de corpora de texto. Permite extrair IOCs codificados e "desarmados" (defanged) e opcionalmente decodificá-los ou rearmá-los (refang).
É prática comum entre analistas de malware ou softwares de endpoint "desarmar" IOCs como URLs e endereços IP, a fim de evitar exposição acidental a conteúdo malicioso ativo. Ser capaz de extrair e agregar esses IOCs é frequentemente valioso para analistas. Infelizmente, as ferramentas existentes de "extração de IOC" muitas vezes passam por eles, pois não são capturadas por regex padrão.
Por exemplo, a técnica simples de desarme de cercar períodos com colchetes:
127[.]0[.]0[.]1
Ferramentas existentes que usam um regex simples de endereço IP ignorarão completamente este IOC.
Combinando regex especialmente elaborado com algum pós-processamento personalizado, somos capazes tanto de detectar quanto de desobfuscar IOCs "desarmados". Isso economiza tempo e esforço para o analista, que de outra forma teria que encontrar e converter manualmente IOCs em formato legível por máquina.
Muitos usuários do Twitter postam C2s ou outras informações valiosas de IOC com URLs desarmadas. Por exemplo, este tweet de @InQuest:
Leitura recomendada e ótimo trabalho de @unit42_intel:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/ ...
Os clientes da InQuest têm detecção para ameaças entregues de hotfixmsupload[.]com
desde 6/3/2017 e cdnverify[.]net desde 1/2/18.
Se executarmos isso através do extrator, podemos facilmente extrair as URLs:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/
hotfixmsupload[.]com
cdnverify[.]net
Passar refang=True no momento da extração removeria a ofuscação, mas como estes são IOCs reais, vamos mantê-los desarmados em nossa documentação.
Você pode precisar instalar os cabeçalhos de desenvolvimento do Python para instalar a dependência regex. Em sistemas baseados em Ubuntu/Debian, tente:
sudo apt-get install python-dev
Em seguida, instale o iocextract via pip:
pip install iocextract
Se tiver problemas para instalar no Windows, tente instalar o regex diretamente baixando a wheel apropriada do PyPI e instalando via pip:
pip install regex-2018.06.21-cp27-none-win_amd64.whl
Tente extrair algumas URLs desarmadas:
import iocextract
content = \
"""
Eu realmente adoro example[.]com!
Todos os bots estão em hxxp://example.com/bad/url atualmente.
C2: tcp://example[.]com:8989/bad
"""
for url in iocextract.extract_urls(content):
print(url)
# Saída
# hxxp://example.com/bad/url
# tcp://example[.]com:8989/bad
# example[.]com
# tcp://example[.]com:8989/bad
NOTA: Algumas URLs podem aparecer duas vezes se forem capturadas por vários regexes.
Se você quiser, também pode "rearmar" ou remover métodos comuns de ofuscação dos IOCs:
import iocextract
for url in iocextract.extract_urls(content, refang=True):
print(url)
# Saída
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Se você não quiser desarmar os IOCs extraídos durante a extração, também pode desabilitar isso:
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)
# Saída
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Todas as funções extract_* nesta biblioteca retornam iteradores, não listas. O benefício desse comportamento é que o iocextract pode processar entradas extremamente grandes, com uma sobrecarga muito baixa. No entanto, se por algum motivo você precisar iterar sobre os IOCs mais de uma vez, terá que salvar os resultados como uma lista:
import iocextract
content = \
"""
Eu realmente adoro example[.]com!
Todos os bots estão em hxxp://example.com/bad/url atualmente.
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']
Uma ferramenta de linha de comando também está incluída:
$ 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]
Extrator Avançado de Indicadores de Comprometimento (IOC). Se nenhum argumento for
especificado, o comportamento padrão é extrair todos os IOCs.
argumentos opcionais:
-h, --help mostra esta mensagem de ajuda e sai
--input INPUT padrão: stdin
--output OUTPUT padrão: stdout
--extract-emails
--extract-ips
--extract-ipv4s
--extract-ipv6s
--extract-urls
--extract-yara-rules
--extract-hashes
--custom-regex REGEX_FILE arquivo com strings regex personalizadas, uma por linha, com um grupo de captura cada
--refang padrão: não
--strip-urls remove possível lixo do final das URLs. padrão: não
--wide pré-processa a entrada para permitir correspondências de caracteres codificados em wide. padrão: não
NOTA: Apenas URLs, e-mails e endereços IPv4 podem ser "rearmados".
Você está...
P. Extraindo IOCs possivelmente desarmados de texto simples, como o conteúdo de tweets ou postagens de blog?
R. Sim! É exatamente para isso que o iocextract foi projetado e onde ele tem melhor desempenho. Quer ir mais longe e automatizar a extração e armazenamento? Confira o ThreatIngestor.
P. Extraindo URLs que foram codificadas em hex ou base64?
R. Sim, mas a CLI pode não fornecer os melhores resultados. Tente escrever um script Python e chamar
iocextract.extract_encoded_urlsdiretamente.
Nota: Você provavelmente terá lixo extra no final das URLs.