
Entschärfter Indikator für Kompromittierung (IOC) Extraktor.
Indicator of Compromise (IOC)-Extraktor für einige der am häufigsten verwendeten Artefakte.
Das iocextract-Paket ist eine Bibliothek und eine Kommandozeilenschnittstelle (CLI) zum Extrahieren von URLs, IP-Adressen, MD5/SHA-Hashes, E-Mail-Adressen und YARA-Regeln aus Textkorpora. Es ermöglicht, codierte und „defanged" IOCs zu extrahieren und sie optional zu decodieren oder zu refangen.
Es ist gängige Praxis, dass Malware-Analysten oder Endpunkt-Software IOCs wie URLs und IP-Adressen „defangen", um eine versehentliche Exposition gegenüber lebenden schädlichen Inhalten zu vermeiden. Das Extrahieren und Aggregieren dieser IOCs ist für Analysten oft wertvoll. Leider übersehen bestehende „IOC-Extraktions"-Werkzeuge diese oft, da sie von Standard-Regex nicht erfasst werden.
Zum Beispiel die einfache Defanging-Technik, Punkte in eckige Klammern zu setzen:
127[.]0[.]0[.]1
Vorhandene Werkzeuge, die einen einfachen IP-Adress-Regex verwenden, ignorieren diesen IOC vollständig.
Durch die Kombination von speziell entwickelten Regex mit einer benutzerdefinierten Nachbearbeitung können wir „defanged" IOCs sowohl erkennen als auch entschleiern. Dies spart Zeit und Mühe für den Analysten, der sonst manuell IOCs finden und in maschinenlesbares Format konvertieren müsste.
Viele Twitter-Nutzer posten C2s oder andere wertvolle IOC-Informationen mit defanged URLs. Zum Beispiel dieser Tweet von @InQuest:
Empfohlene Lektüre und großartige Arbeit von @unit42_intel:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/ ...
InQuest-Kunden haben seit dem 6.3.2017 Erkennung für Bedrohungen, die von hotfixmsupload[.]com
bereitgestellt werden, und seit dem 1.2.18 für cdnverify[.]net.
Wenn wir dies durch den Extraktor laufen lassen, können wir leicht die URLs extrahieren:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/
hotfixmsupload[.]com
cdnverify[.]net
Die Übergabe von refang=True zum Extraktionszeitpunkt würde die Verschleierung entfernen, aber da es sich um echte IOCs handelt, lassen wir sie in unserer Dokumentation defanged.
Möglicherweise müssen Sie die Python-Entwicklungs-Header installieren, um die regex-Abhängigkeit zu installieren. Auf Ubuntu/Debian-basierten Systemen versuchen Sie:
sudo apt-get install python-dev
Installieren Sie dann iocextract von pip:
pip install iocextract
Wenn Sie Probleme bei der Installation unter Windows haben, versuchen Sie, regex direkt zu installieren, indem Sie das passende Wheel von PyPI herunterladen und über pip installieren:
pip install regex-2018.06.21-cp27-none-win_amd64.whl
Versuchen Sie, einige defanged URLs zu extrahieren:
import iocextract
content = \
"""
Ich liebe example[.]com wirklich!
Alle Bots sind heutzutage auf hxxp://example.com/bad/url unterwegs.
C2: tcp://example[.]com:8989/bad
"""
for url in iocextract.extract_urls(content):
print(url)
# Ausgabe
# hxxp://example.com/bad/url
# tcp://example[.]com:8989/bad
# example[.]com
# tcp://example[.]com:8989/bad
HINWEIS: Einige URLs können doppelt auftauchen, wenn sie von mehreren Regexen erfasst werden.
Wenn Sie möchten, können Sie IOCs auch „refangen" oder gängige Verschleierungsmethoden entfernen:
import iocextract
for url in iocextract.extract_urls(content, refang=True):
print(url)
# Ausgabe
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Wenn Sie die extrahierten IOCs während der Extraktion überhaupt nicht defangen möchten, können Sie dies ebenfalls deaktivieren:
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)
# Ausgabe
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Alle extract_*-Funktionen in dieser Bibliothek geben Iteratoren zurück, keine Listen. Der Vorteil dieses Verhaltens ist, dass iocextract extrem große Eingaben mit sehr geringem Overhead verarbeiten kann. Wenn Sie jedoch aus irgendeinem Grund mehrmals über die IOCs iterieren müssen, müssen Sie die Ergebnisse als Liste speichern:
import iocextract
content = \
"""
Ich liebe example[.]com wirklich!
Alle Bots sind heutzutage auf hxxp://example.com/bad/url unterwegs.
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']
Ein Kommandozeilenwerkzeug ist ebenfalls enthalten:
$ 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]
Erweiterter Indicator of Compromise (IOC)-Extraktor. Wenn keine Argumente
angegeben werden, ist das Standardverhalten, alle IOCs zu extrahieren.
optionale Argumente:
-h, --help Zeigt diese Hilfemeldung an und beendet das Programm
--input INPUT Standard: stdin
--output OUTPUT Standard: stdout
--extract-emails
--extract-ips
--extract-ipv4s
--extract-ipv6s
--extract-urls
--extract-yara-rules
--extract-hashes
--custom-regex REGEX_FILE Datei mit benutzerdefinierten Regex-Zeichenfolgen, eine pro Zeile, mit jeweils einer Erfassungsgruppe
--refang Standard: nein
--strip-urls Entfernt möglichen Müll vom Ende der URLs. Standard: nein
--wide Verarbeitet die Eingabe vor, um Wide-Encoded-Zeichenübereinstimmungen zu ermöglichen. Standard: nein
HINWEIS: Nur URLs, E-Mails und IPv4-Adressen können „refangt" werden.
Sind Sie...
F. Extrahieren von möglicherweise defanged IOCs aus Klartext, wie dem Inhalt von Tweets oder Blogbeiträgen?
A. Ja! Genau dafür wurde iocextract entwickelt und hier funktioniert es am besten. Möchten Sie einen Schritt weiter gehen und die Extraktion und Speicherung automatisieren? Schauen Sie sich ThreatIngestor an.
F. Extrahieren von hex- oder base64-codierten URLs?
A. Ja, aber die CLI liefert möglicherweise nicht die besten Ergebnisse. Versuchen Sie, ein Python-Skript zu schreiben und
iocextract.extract_encoded_urlsdirekt aufzurufen.
Hinweis: Am Ende von URLs erhalten Sie höchstwahrscheinlich zusätzlichen Müll.
F. Extrahieren von nicht defanged IOCs aus HTML/XML/RTF?
A. Vielleicht, aber Sie sollten die Verwendung des
--strip-urls-CLI-Flags (oder desstrip=True-Parameters in der Bibliothek) in Betracht ziehen, und Sie könnten trotzdem etwas zusätzlichen Müll in Ihrer Ausgabe erhalten. Wenn Sie aus HTML extrahieren, sollten Sie etwas wie Beautiful Soup verwenden, um zuerst den Textinhalt zu isolieren und diesen dann an iocextract zu übergeben, wie hier.
F. Extrahieren von nicht defanged IOCs aus Binärdaten wie ausführbaren Dateien oder sehr großen Eingaben?
A. Es gibt eine sehr einfache Version davon, die bei Verwendung als Bibliothek verfügbar ist, aber sie erfordert den Parameter
defang=Falseund könnte möglicherweise einige IOCs übersehen. Der Regex in iocextract ist darauf ausgelegt, flexibel zu sein, um defanged IOCs zu erfassen. Wenn Sie die benötigten Informationen nicht sammeln können, sollten Sie stattdessen etwas wie Cacador in Betracht ziehen.
Diese Bibliothek unterstützt derzeit die folgenden IOCs:
[.]-Anker, auch ohne Protokollkennung@ oder atFür IPv4-Adressen werden die folgenden Defanging-Techniken unterstützt:
Für E-Mail-Adressen werden die folgenden Defanging-Techniken unterstützt:
Für URLs werden die folgenden Defanging-Techniken unterstützt:
HINWEIS: Die obigen Tabellen sind nicht vollständig, und andere URL/Defang-Muster können ebenfalls korrekt extrahiert werden. Wenn Ihnen etwas fehlt oder nicht richtig funktioniert, können Sie uns gerne über die GitHub Issues informieren.
Der base64-Regex wurde mit @deadpixi's base64-Regex-Tool erstellt.
Wenn Sie die CLI verwenden möchten, um IOCs mit Ihrem eigenen benutzerdefinierten regulären Ausdruck zu extrahieren, erstellen Sie eine Textdatei mit einer Regex-Zeichenfolge pro Zeile und übergeben Sie sie mit dem --custom-regex-Flag. Stellen Sie sicher, dass jede Regex-Zeichenfolge genau eine Erfassungsgruppe enthält.
Zum Beispiel:
http://(example\.com)/
(?:https|ftp)://(example\.com)/
Diese benutzerdefinierte Regex-Datei extrahiert die Domain example.com aus passenden URLs. Die (?: )-Nichterfassungsgruppe wird nicht in Übereinstimmungen aufgenommen.
Wenn Sie die gesamte Übereinstimmung extrahieren möchten, setzen Sie einfach Klammern um Ihre gesamte Regex-Zeichenfolge, wie folgt:
(https?://.*?.com)
Wenn Ihr Regex ungültig ist, sehen Sie eine Fehlermeldung wie diese:
Fehler im benutzerdefinierten Regex: fehlende ) an Position 5
Wenn Ihr Regex keine Erfassungsgruppe enthält, sehen Sie eine Fehlermeldung wie diese:
Fehler im benutzerdefinierten Regex: keine solche Gruppe
Verwenden Sie immer eine einzelne Erfassungsgruppe, wenn Sie mit benutzerdefinierten Regex arbeiten. Hier ein kurzes Beispiel:
[
r'(my regex)', # Dies ergibt 'my regex', wenn das Muster passt
r'my (re)gex', # Dies ergibt 're', wenn das Muster passt
]
Die Verwendung von mehr als einer einzelnen Erfassungsgruppe kann zu unerwarteten Ergebnissen führen. Sehen Sie sich dieses Beispiel an:
[
r'my regex', # Dies ergibt nichts
r'(my) (re)gex', # Dies ergibt 'my', wenn das Muster passt
]
Warum? Weil das Ergebnis immer nur die erste Gruppen-Übereinstimmung jedes Regex zurückgibt.
Für komplexere Regex-Abfragen können Sie Erfassungs- und Nichterfassungsgruppen wie folgt kombinieren:
[
r'(?:my|your) (re)gex', # Dies ergibt 're', wenn das Muster passt
]
Sie können jetzt die (?: )-Syntax für Nichterfassungsgruppen mit der ( )-Syntax für die Erfassungsgruppe vergleichen.
Wenn iocextract nicht Ihren Anwendungsfall erfüllt, gibt es mehrere ähnliche Projekte. Schauen Sie sich die Tags defang und indicators-of-compromise auf GitHub an, sowie:
Wenn Sie die IOC-Extraktion, -Anreicherung, -Export und mehr automatisieren möchten, schauen Sie sich ThreatIngestor an.
Wenn Sie mit YARA-Regeln arbeiten, könnte plyara für Sie interessant sein.
Wenn Sie eine Defang-Technik haben, die nicht durch den Extraktor kommt, oder wenn Sie Fehler finden, sind Pull Requests und Issues immer willkommen. Die Bibliothek wird unter einer GPL-2.0 Lizenz veröffentlicht.
Verwenden Sie es? Möchten Sie Ihre Seite hier aufgeführt sehen? Lassen Sie es uns wissen!
| Technik | Defanged | Refanged |
|---|
. -> [.] | 1[.]1[.]1[.]1 | 1.1.1.1 |
. -> (.) | 1(.)1(.)1(.)1 | 1.1.1.1 |
. -> \. | 1\.1\.1\.1 | 1.1.1.1 |
| Teilweise | 1[.1[.1.]1 | 1.1.1.1 |
| Beliebige Kombi | 1.)1[.1.)1 | 1.1.1.1 |
| Technik | Defanged | Refanged |
|---|
. -> [.] | 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] |
| Teilweise | me@} example[.com | [email protected] |
| Hinzugefügte Leerzeichen | me@example [.] com | [email protected] |
| Beliebige Kombi | me @example [.)com | [email protected] |
| Technik | Defanged | Refanged |
|---|
. -> [.] | example[.]com/path | http://example.com/path |
. -> (.) | example(.)com/path | http://example.com/path |
. -> \. | example\.com/path | http://example.com/path |
| Teilweise | 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 |
| Beliebige Kombi | hxxp__ example( .com[/]path | http://example.com/path |
| Hex codiert | 687474703a2f2f6578616d706c652e636f6d2f70617468 | http://example.com/path |
| URL codiert | http%3A%2F%2fexample%2Ecom%2Fpath | http://example.com/path |
| Base64 codiert | aHR0cDovL2V4YW1wbGUuY29tL3BhdGgK | http://example.com/path |