
Extracteur d'Indicateur de Compromis (IOC) Désactivé.
Indicateur de compromission (IOC) pour certains des artefacts les plus couramment ingérés.
Le paquet iocextract est une bibliothèque et une interface en ligne de commande (CLI) pour extraire des URL, adresses IP, hachages MD5/SHA, adresses e-mail et règles YARA à partir de corpus textuels. Il permet d'extraire des IOC encodés et « désarmés » (defanged) et, si vous le souhaitez, de les décoder ou de les réarmer.
Il est courant que les analystes malware ou les logiciels endpoint « désarment » les IOC tels que les URL et adresses IP afin d'éviter une exposition accidentelle à du contenu malveillant actif. Pouvoir extraire et agréger ces IOC est souvent précieux pour les analystes. Malheureusement, les outils existants d'« extraction d'IOC » les ignorent souvent, car ils ne sont pas capturés par les expressions régulières standard.
Par exemple, la technique simple de désarmement qui consiste à entourer les points de crochets :
127[.]0[.]0[.]1
Les outils existants qui utilisent une expression régulière simple pour les adresses IP ignoreront complètement cet IOC.
En combinant des expressions régulières spécialement conçues avec un post-traitement personnalisé, nous sommes capables de détecter et de dés-obfusquer les IOC « désarmés ». Cela fait gagner du temps et des efforts à l'analyste, qui autrement devrait trouver et convertir manuellement les IOC dans un format lisible par machine.
De nombreux utilisateurs de Twitter publient des C2 ou d'autres informations précieuses d'IOC avec des URL désarmées. Par exemple, ce tweet de @InQuest :
Lecture recommandée et excellent travail de @unit42_intel :
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/ ...
Les clients d'InQuest ont une détection pour les menaces provenant de hotfixmsupload[.]com
depuis le 03/06/2017 et de cdnverify[.]net depuis le 01/02/18.
Si on exécute cela via l'extracteur, on peut facilement extraire les URL :
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/
hotfixmsupload[.]com
cdnverify[.]net
En passant refang=True lors de l'extraction, on supprimerait l'obfuscation, mais comme ce sont des vrais IOC, laissons-les désarmés dans notre documentation.
Vous devrez peut-être installer les en-têtes de développement Python pour pouvoir installer la dépendance regex. Sur les systèmes basés sur Ubuntu/Debian, essayez :
sudo apt-get install python-dev
Ensuite, installez iocextract via pip :
pip install iocextract
Si vous rencontrez des problèmes d'installation sous Windows, essayez d'installer regex directement en téléchargeant la roue appropriée depuis PyPI et en installant via pip :
pip install regex-2018.06.21-cp27-none-win_amd64.whl
Essayez d'extraire quelques URL désarmées :
import iocextract
content = \
"""
J'aime vraiment example[.]com !
Tous les bots sont sur hxxp://example.com/bad/url ces jours-ci.
C2: tcp://example[.]com:8989/bad
"""
for url in iocextract.extract_urls(content):
print(url)
# Sortie
# hxxp://example.com/bad/url
# tcp://example[.]com:8989/bad
# example[.]com
# tcp://example[.]com:8989/bad
REMARQUE : Certaines URL peuvent apparaître deux fois si elles sont capturées par plusieurs expressions régulières.
Si vous le souhaitez, vous pouvez aussi « réarmer », ou supprimer les méthodes d'obfuscation courantes des IOC :
import iocextract
for url in iocextract.extract_urls(content, refang=True):
print(url)
# Sortie
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Si vous ne souhaitez pas désarmer du tout les IOC extraits lors de l'extraction, vous pouvez aussi le désactiver :
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)
# Sortie
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Toutes les fonctions extract_* de cette bibliothèque renvoient des itérateurs, pas des listes. L'avantage de ce comportement est que iocextract peut traiter des entrées extrêmement volumineuses avec une très faible surcharge. Cependant, si pour une raison quelconque vous devez itérer plusieurs fois sur les IOC, vous devrez enregistrer les résultats sous forme de liste :
import iocextract
content = \
"""
J'aime vraiment example[.]com !
Tous les bots sont sur hxxp://example.com/bad/url ces jours-ci.
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']
Un outil en ligne de commande est également inclus :
$ 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]
Extracteur avancé d'indicateurs de compromission (IOC). Si aucun argument
n'est spécifié, le comportement par défaut est d'extraire tous les IOC.
arguments optionnels :
-h, --help affiche ce message d'aide et quitte
--input INPUT défaut : stdin
--output OUTPUT défaut : stdout
--extract-emails
--extract-ips
--extract-ipv4s
--extract-ipv6s
--extract-urls
--extract-yara-rules
--extract-hashes
--custom-regex REGEX_FILE fichier contenant des chaînes d'expression régulière personnalisées, une par ligne, avec un groupe de capture chacune
--refang défaut : non
--strip-urls supprime les possibles déchets à la fin des URL. défaut : non
--wide prétraite l'entrée pour permettre les correspondances de caractères encodés sur largeur. défaut : non
REMARQUE : Seules les URL, les e-mails et les adresses IPv4 peuvent être « réarmés ».
Est-ce que vous...
Q. Extrayez des IOC potentiellement désarmés à partir de texte brut, comme le contenu de tweets ou d'articles de blog ?
R. Oui ! C'est exactement ce pour quoi iocextract a été conçu, et là où il donne les meilleurs résultats. Vous voulez aller plus loin et automatiser l'extraction et le stockage ? Consultez ThreatIngestor.
Q. Extrayez des URL qui ont été encodées en hexadécimal ou en base64 ?
R. Oui, mais la CLI pourrait ne pas vous donner les meilleurs résultats. Essayez d'écrire un script Python et d'appeler
iocextract.extract_encoded_urlsdirectement.
Remarque : Vous vous retrouverez très probablement avec des déchets supplémentaires à la fin des URL.
Q. Extrayez des IOC qui n'ont pas été désarmés, depuis du HTML/XML/RTF ?
R. Peut-être, mais vous devriez envisager d'utiliser le drapeau CLI
--strip-urls(ou le paramètrestrip=Truedans la bibliothèque), et vous pourriez encore obtenir quelques déchets supplémentaires dans votre sortie. Si vous extrayez depuis du HTML, envisagez d'utiliser quelque chose comme Beautiful Soup pour d'abord isoler le contenu textuel, puis passez-le à iocextract, comme ceci.
Q. Extrayez des IOC qui n'ont pas été désarmés, depuis des données binaires comme des exécutables, ou des entrées très volumineuses ?
R. Il existe une version très simpliste de cela disponible lors de l'utilisation en tant que bibliothèque, mais elle nécessite le paramètre
defang=Falseet pourrait potentiellement manquer certains des IOC. Les expressions régulières dans iocextract sont conçues pour être flexibles afin de capturer les IOC désarmés. Si vous ne parvenez pas à collecter les informations dont vous avez besoin, envisagez d'utiliser quelque chose comme Cacador à la place.
Cette bibliothèque prend actuellement en charge les IOC suivants :
[.], même sans spécificateur de protocole@ ou atPour les adresses IPv4, les techniques de désarmement suivantes sont prises en charge :
| Technique | Désarmé | Réarmé |
|---|---|---|
. -> [.] | 1[.]1[.]1[.]1 | 1.1.1.1 |
. -> (.) | 1(.)1(.)1(.)1 | 1.1.1.1 |
. -> \. | 1\.1\.1\.1 | 1.1.1.1 |
| Partiel | 1[.1[.1.]1 | 1.1.1.1 |
| Toute combinaison | 1.)1[.1.)1 | 1.1.1.1 |
Pour les adresses e-mail, les techniques de désarmement suivantes sont prises en charge :
| Technique | Désarmé | Réarmé |
|---|---|---|
. -> [.] | me@example[.]com | [email protected] |
. -> (.) | me@example(.)com | [email protected] |
. -> {.} | me@example{.}com | [email protected] |
. -> _dot_ | me@example dot com | [email protected] |
@ -> [@] | me[@]example.com | [email protected] |
@ -> (@) | me(@)example.com | [email protected] |
@ -> {@} | me{@}example.com | [email protected] |
@ -> _at_ | me at example.com | [email protected] |
| Partiel | me@} example[.com | [email protected] |
| Espaces ajoutés | me@example [.] com | [email protected] |
| Toute combinaison | me @example [.)com | [email protected] |
Pour les URL, les techniques de désarmement suivantes sont prises en charge :
| Technique | Désarmé | Réarmé |
|---|---|---|
. -> [.] | example[.]com/path | http://example.com/path |
. -> (.) | example(.)com/path | http://example.com/path |
. -> \. | example\.com/path | http://example.com/path |
| Partiel | http://example[.com/path | http://example.com/path |
/ -> [/] | http://example.com[/]path | http://example.com/path |
| Cisco ESA | http:// example .com /path | http://example.com/path |
:// -> __ | http__example.com/path | http://example.com/path |
:// -> :\\ | http:\\example.com/path | http://example.com/path |
: -> [:] | http[:]//example.com/path | http://example.com/path |
hxxp | hxxp://example.com/path | http://example.com/path |
| Toute combinaison | hxxp__ example( .com[/]path | http://example.com/path |
| Encodé en hex | 687474703a2f2f6578616d706c652e636f6d2f70617468 | http://example.com/path |
| Encodé en URL |
REMARQUE : Les tableaux ci-dessus ne sont pas exhaustifs, et d'autres motifs d'URL/désarmement peuvent également être extraits correctement. Si vous remarquez quelque chose qui manque ou ne fonctionne pas correctement, n'hésitez pas à nous le faire savoir via les Problèmes GitHub.
L'expression régulière base64 a été générée avec l'outil regex base64 de @deadpixi.
Si vous souhaitez utiliser la CLI pour extraire des IOC à l'aide de votre propre expression régulière personnalisée, créez un fichier texte brut avec une chaîne d'expression régulière par ligne, et passez-le avec le drapeau --custom-regex. Assurez-vous que chaque chaîne d'expression régulière inclue exactement un groupe de capture.
Par exemple :
http://(example\.com)/
(?:https|ftp)://(example\.com)/
Ce fichier d'expression régulière personnalisée extraira le domaine example.com des URL correspondantes. Le groupe non capturant (?: ) ne sera pas inclus dans les correspondances.
Si vous souhaitez extraire la correspondance entière, mettez simplement des parenthèses autour de toute votre chaîne d'expression régulière, comme ceci :
(https?://.*?.com)
Si votre expression régulière est invalide, vous verrez un message d'erreur comme celui-ci :
Error in custom regex: missing ) at position 5
Si votre expression régulière n'inclut pas de groupe de capture, vous verrez un message d'erreur comme celui-ci :
Error in custom regex: no such group
Utilisez toujours un seul groupe de capture lorsque vous travaillez avec une expression régulière personnalisée. Voici un exemple rapide :
[
r'(my regex)', # Cela produit 'my regex' si le motif correspond
r'my (re)gex', # Cela produit 're' si le motif correspond
]
Utiliser plus d'un seul groupe de capture peut entraîner des résultats inattendus. Regardez cet exemple :
[
r'my regex', # Cela ne produit rien
r'(my) (re)gex', # Cela produit 'my' si le motif correspond
]
Pourquoi ? Parce que le résultat produira toujours uniquement la correspondance du premier groupe de chaque expression régulière.
Pour des requêtes d'expressions régulières plus complexes, vous pouvez combiner des groupes de capture et non capturants comme ceci :
[
r'(?:my|your) (re)gex', # Cela produit 're' si le motif correspond
]
Vous pouvez maintenant comparer la syntaxe (?: ) pour les groupes non capturants par rapport à la syntaxe ( ) pour le groupe de capture.
Si iocextract ne correspond pas à votre cas d'utilisation, plusieurs projets similaires existent. Consultez les balises defang et indicators-of-compromise sur GitHub, ainsi que :
Si vous souhaitez automatiser l'extraction, l'enrichissement, l'exportation et plus encore des IOC, consultez ThreatIngestor.
Si vous travaillez avec des règles YARA, vous pourriez être intéressé par plyara.
Si vous avez une technique de désarmement qui ne passe pas à travers l'extracteur, ou si vous trouvez des bogues, les Pull Requests et les Issues sont toujours les bienvenus. La bibliothèque est publiée sous une licence GPL-2.0 .
Vous l'utilisez ? Vous voulez voir votre site listé ici ? Faites-le nous savoir !
http%3A%2F%2fexample%2Ecom%2Fpath |
http://example.com/path |
| Encodé en base64 | aHR0cDovL2V4YW1wbGUuY29tL3BhdGgK | http://example.com/path |