
Экстрактор дефангированных индикаторов компрометации (IOC).
Индикатор компрометации (IOC) — извлекатель для некоторых наиболее часто используемых артефактов.
Пакет iocextract — это библиотека и интерфейс командной строки (CLI) для извлечения URL-адресов, IP-адресов, MD5/SHA-хешей, адресов электронной почты и правил YARA из текстовых корпусов. Он позволяет извлекать закодированные и «обезвреженные» (defanged) IOC и при необходимости декодировать или восстанавливать их (refang).
Среди аналитиков вредоносного ПО и разработчиков конечных средств защиты распространена практика «обезвреживания» (defanging) IOC, таких как URL-адреса и IP-адреса, чтобы предотвратить случайный доступ к живому вредоносному контенту. Возможность извлекать и агрегировать такие IOC часто полезна для аналитиков. К сожалению, существующие инструменты «извлечения IOC» часто пропускают их, поскольку они не распознаются стандартными регулярными выражениями.
Например, простая техника обезвреживания — обрамление точек квадратными скобками:
127[.]0[.]0[.]1
Существующие инструменты, использующие простое регулярное выражение для IP-адресов, полностью игнорируют такой IOC.
Объединяя специально разработанные регулярные выражения с некоторой пользовательской постобработкой, мы можем как обнаруживать, так и деобфусцировать «обезвреженные» IOC. Это экономит время и усилия аналитика, которому в противном случае пришлось бы вручную находить и преобразовывать IOC в машиночитаемый формат.
Многие пользователи Twitter публикуют C2 или другую ценную информацию об IOC с обезвреженными URL-адресами. Например, этот твит от @InQuest:
Рекомендуемое чтение и отличная работа от @unit42_intel:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/ ...
Клиенты InQuest имели обнаружение угроз, доставленных с hotfixmsupload[.]com
с 6/3/2017 и cdnverify[.]net с 2/1/18.
Если пропустить это через извлекатель, мы легко получим URL-адреса:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/
hotfixmsupload[.]com
cdnverify[.]net
Если при извлечении передать refang=True, обфускация будет удалена, но поскольку это реальные IOC, оставим их обезвреженными в нашей документации.
Возможно, потребуется установить заголовочные файлы для разработки на Python, чтобы установить зависимость regex. В системах на базе Ubuntu/Debian попробуйте:
sudo apt-get install python-dev
Затем установите iocextract через pip:
pip install iocextract
Если возникают проблемы с установкой в Windows, попробуйте установить regex напрямую, скачав соответствующий wheel с PyPI и установив через pip:
pip install regex-2018.06.21-cp27-none-win_amd64.whl
Попробуйте извлечь некоторые обезвреженные URL-адреса:
import iocextract
content = \
"""
Я очень люблю example[.]com!
Все боты сейчас на hxxp://example.com/bad/url.
C2: tcp://example[.]com:8989/bad
"""
for url in iocextract.extract_urls(content):
print(url)
# Вывод
# hxxp://example.com/bad/url
# tcp://example[.]com:8989/bad
# example[.]com
# tcp://example[.]com:8989/bad
ПРИМЕЧАНИЕ: Некоторые URL-адреса могут появляться дважды, если они попадают под несколько регулярных выражений.
При желании вы также можете «восстановить» (refang) или удалить распространенные методы обфускации из IOC:
import iocextract
for url in iocextract.extract_urls(content, refang=True):
print(url)
# Вывод
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Если вы не хотите обезвреживать извлеченные IOC при извлечении, вы можете отключить это:
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)
# Вывод
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
Все функции extract_* в этой библиотеке возвращают итераторы, а не списки. Преимущество такого поведения в том, что iocextract может обрабатывать очень большие входные данные с очень низкими накладными расходами. Однако если по какой-то причине вам нужно перебирать IOC более одного раза, вам придется сохранить результаты в виде списка:
import iocextract
content = \
"""
Я очень люблю example[.]com!
Все боты сейчас на hxxp://example.com/bad/url.
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']
Также включен инструмент командной строки:
$ 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
ПРИМЕЧАНИЕ: Только URL-адреса, адреса электронной почты и IPv4-адреса могут быть «восстановлены» (refanged).
Вы...
В. Извлекаете потенциально обезвреженные IOC из обычного текста, например, содержимого твитов или постов в блогах?
О. Да! Именно для этого и был разработан iocextract, и в этом он показывает наилучшие результаты. Хотите пойти дальше и автоматизировать извлечение и хранение? Ознакомьтесь с ThreatIngestor.