
Отличный список ключевых слов и артефактов для сессий Threat Hunting
🎯 Список ключевых слов для сессий ThreatHunting


Threat hunting — это проактивный и итеративный подход к обнаружению вредоносной активности в сети или системах организации, которая могла обойти автоматизированные меры безопасности. В отличие от реактивных расследований, запускаемых срабатываниями сигналов безопасности, threat hunting опирается на проверки, управляемые данными об угрозах (TI), и гипотезы, выводимые из систематического и оппортунистического анализа. Эти гипотезы 💡 помогают охотникам выявлять неизвестные угрозы, потенциальные угрозы или известные угрозы, которые могли обойти средства обнаружения, а также уязвимости или индикаторы компрометации (IoC), которые автоматизированные системы могут пропустить или исключить. Процесс также направлен на выявление предвестников срабатываний/панелей мониторинга и улучшение рабочих процессов SOC/triage, а также вносит вклад в инвентаризацию теневых активов и эскалацию событий низкой/средней достоверности, требующих дальнейшего расследования. Основная цель — выявить тактики, техники и процедуры (TTP), используемые злоумышленниками, повышая способность организации упреждающе обнаруживать и смягчать потенциальные атаки.

Моё предложение по организации частично автоматизированных сессий threat hunting для поддержания высококачественных правил обнаружения в SOC

Команды SOC сосредоточены на развёртывании высокоточных детектов на всех уровнях пирамиды зрелости обнаружения, нацеленных на известные угрозы с минимальным количеством ложных срабатываний. Threat hunting дополняет этот подход, охватывая неизвестные угрозы, продвинутые TTP и аномалии, подверженные высокому уровню ложных срабатываний, устраняя пробелы и расширяя покрытие обнаружения за пределы стандартных возможностей SOC.


В идеале каждая сессия threat hunting должна иметь чёткие цели. Эта блок-схема предлагает структурированный подход для руководства процессом — от подготовки и расследования до практических рекомендаций.
🎯 Список ключевых слов для сессий ThreatHunting
Списки ThreatHunting-Keywords могут быть ценными для охотников за угрозами, команд SOC и CERT при статическом анализе в SIEM, поскольку они помогают выявлять злоумышленников (или редтимеров 😆), использующих конфигурации по умолчанию из известных инструментов эксплуатации, в журналах. Они отличаются от фидов IOC своей долговременной актуальностью: ключевые слова здесь не имеют «срока годности» и могут обнаруживать угрозы спустя годы после их добавления; они гибки, допускают подстановочные знаки и нечувствительны к регистру, а также ориентированы только на ключевые слова по умолчанию.
Список, предназначенный прежде всего для Threat Hunting, может быть полезен в сложных сценариях. Есть ли у вас доступ к SIEM, которым вы не управляете, с неразобранными данными, или вы часть команды SOC с хорошо управляемым SIEM — приведённые здесь примеры могут ускорить процесс обнаружения вредоносной активности без необходимости что-либо парсить. Если ваши журналы уже разобраны, этот список можно использовать для сопоставления полей в ваших данных, потенциально превращаясь в правило обнаружения на основе выбранной вами категории типа ключевого слова, при условии, что уровень ложных срабатываний достаточно низок.
⚠️ Не всё можно добавить в этот список: здесь мы не создаём сложные детекты поведения, только простые обнаружения ключевых слов в полях или сырых журналах, направленные на выявление конфигураций по умолчанию
⚠️ Для многих инструментов из списка существуют выделенные правила обнаружения, коррелирующие события с порогами и уникальными связями процессов... здесь мы не будем охватывать все возможные детекты для инструмента, только обнаружение по ключевым словам
Если вы часть Центра операций безопасности (SOC) и управляете сотнями правил обнаружения, которые полагаются исключительно на простые детекты по ключевым словам без какой-либо корреляции полей или событий, задумайтесь о пересмотре своего подхода. На мой взгляд, такие правила не должны быть отдельными правилами обнаружения. Вместо этого они лучше подходят для консолидированного списка, подобного этому, хотя реализация может быть более сложной, если вы не используете платформу вроде Splunk.
Такой подход поощряет создание высококачественных, целенаправленных правил, сохраняя при этом ваши простые детекты по ключевым словам в полях организованными и управляемыми в одном месте. Каков конечный результат? Одно комплексное правило обнаружения, которое покрывает их все. Это оптимизирует ваш процесс и расширяет ваши возможности обнаружения.
Специалисты по реагированию на инциденты могут использовать этот список во время расследования по сырым журналам или файлам для быстрой идентификации известных инструментов эксплуатации с помощью правил YARA Yara Rules, powershell-скрипта или быстрой загрузки журналов в Splunk с помощью Splunk4DFIR
Чтобы избежать обнаружения простыми детектами по ключевым словам, крайне важно перекомпилировать и переименовать все пользовательские строки, имена классов или функций, имена переменных, имена аргументов, имена исполняемых файлов, стандартные user-agent'ы, сертификаты или любые другие строки, которые могут быть связаны с используемыми вами во время операции инструментами. Используйте самые распространённые имена для всего, чтобы слиться с обычным трафиком. Скрипты, расположенные здесь, могут помочь вам выявить некоторые из них.
Однако, если вы разрабатываете публичные «red team инструменты», подумайте о помощи синей команде, используя отличительные имена. Применяйте конфигурацию по умолчанию с экзотическим портом, пользовательскими сертификатами, уникальными user-agent'ами, специфическими именами функций и аргументов, которые не являются распространёнными. Это помогает создать чёткую сигнатуру, которую можно использовать для простых детектов по ключевым словам, чтобы blueteam могла хотя бы легко обнаруживать скрипткиди.
Заголовок: keyword,metadata_keyword_type,metadata_tool,metadata_description,metadata_tool_techniques,metadata_tool_tactics,metadata_malwares_name,metadata_groups_name,metadata_category,metadata_link,metadata_enable_endpoint_detection,metadata_enable_proxy_detection,metadata_tags,metadata_comment,metadata_severity_score,metadata_popularity_score,metadata_github_stars,metadata_github_forks,metadata_github_created_at,metadata_github_updated_at
keyword: Записи в этом столбце представляют ключевые слова, нечувствительные к регистру, используемые для Threat Hunting. Эти ключевые слова гибки и позволяют использовать подстановочные знаки для расширения или сужения параметров поиска по мере необходимости.
metadata_keyword_regex: Записи в этом столбце представляют regex-паттерн для обнаружения ключевого слова; эти паттерны отточены для обеспечения точных возможностей обнаружения и подходят для использования с YARA, ripgrep или аналогичными инструментами обнаружения.
metadata_keyword_type: Тип ключевых слов. В настоящее время существует три типа:
загрузите список threathunting-keywords.csv в Splunk
создайте определение lookup с именем threathunting-keywords для lookup-файла threathunting-keywords.csv
WILDCARD(keyword) и убедитесь, что параметр Case sensitive match не отмечен
transforms.conf``` [threathunting-keywords] batch_index_query = 0 case_sensitive_match = 0 filename = threathunting-keywords.csv match_type = WILDCARD(keyword)
- теперь мы можем использовать наше определение lookup для охоты 🏹
- :warning: если поиски в следующем разделе не работают, это может быть связано с ограничениями ресурсов splunk, особенно если вы используете splunk с конфигурацией по умолчанию. Для начала вам, возможно, придется рассмотреть увеличение значения `max_memtable_bytes` в секции `[lookup]`.
## Примеры использования с `threathunting-keywords`:

### Охота на все ключевые слова в raw-логах 😱```
`myendpointslogs`
| lookup threathunting-keywords keyword as _raw OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" AND metadata_enable_endpoint_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(_raw) as raw by metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
Отправьте поиск в фоновый режим и сохраните job ID.

myendpointslogs — это макрос, который выполняет поиск по всем журналам ваших конечных точек, это могут быть журналы Windows, телеметрия EDR, sysmon, auditd, сеансы bastion, журналы выполнения PowerShell или любые другие журналы, отслеживающие активность процессов или файлов. (если вы не используете макрос, вы можете заменить его на свой index, tag или datamodel)
TERM() для конкретных поисков перед |lookup| lookup — это очень важно, для больших lookup-таблиц, подобных этой, всегда используйте |lookup вместо |inputlookup, |lookup будет использовать lookup-файл, доставленный на индексерах при репликации бандла, а |inputlookup каждый раз отправляет на индексеры поиск со всем содержимым lookup-таблицы, используя |lookup, мы получаем здесь колоссальный выигрыш в производительности (этот поиск будет выполняться часами в больших средах, так что лучше оптимизировать наш поиск.... keyword as _raw OUTPUT keyword as keyword_detection — это та часть, где мы сопоставляем поле с полем в нашей lookup-таблице, в Splunk — это необработанный журнал без какого-либо парсинга (наш случай использования). Когда ключевое слово совпадает, поле покажет ключевое слово из lookup-таблицы, которое совпало с полем .Отфильтруйте результат``` | loadjob 1684146257.1495958 | search NOT (keyword_detection IN ("fixme","fixme","fixme")) NOT (metadata_keyword_type IN ("fixme","fixme")) NOT (raw IN ("fixme","fixme","fixme"))
Исключите требуемые ключевые слова, необработанный текст или типы ключевых слов.
если мы решим исключить тип `greyware tool keyword` (ключевые слова легитимных инструментов, которыми злоупотребляют атакующие), потому что в этом окружении слишком много результатов для такого рода инструментов, у нас есть два варианта:
- Фильтровать в начале нашего первоначального поиска```
`myendpointslogs`
| lookup threathunting-keywords keyword as _raw OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" metadata_keyword_type="offensive tool keyword" metadata_enable_endpoint_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(_raw) as raw by metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
Я добавил metadata_keyword_type="offensive tool keyword", чтобы сосредоточиться только на инструментах для атак, которые, как я уверен, используются злоумышленниками
Итак, это был наш вариант использования для поиска по необработанным логам в журналах конечных точек; если мы хотим искать ключевые слова для сетевых журналов (все, что может логировать запрос или URL), мы просто меняем это на:```
`mynetworklogs`
| lookup threathunting-keywords keyword as _raw OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" AND metadata_enable_proxy_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(_raw) as raw by metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
Now it is the same as the first search but i changed the datasource for mynetworklogs and added metadata_enable_proxy_detection=1 to match the relevant keywords for networklogs (better have proxy and DNS logs for this)
mynetworklogs url=*
| lookup threathunting-keywords keyword as url OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" AND metadata_enable_proxy_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(url) as url by src_ip metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
#### Совпадение только по полю запроса:```
`mynetworklogs` query=*
| lookup threathunting-keywords keyword as query OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" AND metadata_enable_proxy_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(query) as query by src_ip metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
myendpointslogs
| eval myfields=mvappend(service, process, process_command, parent_process, parent_process_command, grand_parent_process, grand_parent_process_command, file_path, file_name)
| lookup threathunting-keywords keyword as myfields OUTPUT keyword as keyword_detection metadata_keyword_type metadata_tool metadata_description metadata_tool_techniques metadata_tool_tactics metadata_malwares_name metadata_groups_name metadata_category metadata_link metadata_enable_endpoint_detection metadata_enable_proxy_detection metadata_comment
| search metadata_description!="" AND metadata_enable_endpoint_detection=1
| stats count earliest(_time) as firsttime latest(_time) as lasttime values(process) values(service) values(process_command) values(file_name) values(file_path) values(parent_process) values(parent_process_command) values(grand_parent_process) values(grand_parent_process_command) by metadata_keyword_type keyword_detection index sourcetype
| convert ctime(*time)
#### Скорость:
Если скорость имеет значение или вы планируете использовать это как регулярное правило обнаружения, возможно, вам стоит рассмотреть разделение lookup на разные lookups, выбрав столбец metadata_keyword_type или metadata_tool, который хотите использовать.
Обратите внимание, что фильтрация с помощью команды search после `|lookup` не ускоряет процесс поиска. Если вы хотите сосредоточиться на конкретной части lookup, не разделяя его, вам следует использовать команду `|inputlookup` с предложением where. Хотя этот метод может потреблять больше ресурсов ЦП, в целом он обеспечивает более быстрое выполнение. Подробнее см. документацию Splunk по inputlookup: https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Inputlookup
#### С ELK:
Если вы работаете с Elastic Stack, для списков существует множество ограничений (нельзя использовать специальные символы, пробелы и т.д.), у вас есть 3 варианта:
- Используйте другой список, доступный здесь в этом же репозитории https://github.com/mthcht/ThreatHunting-Keywords/tree/main/elk (это не прямой выгрузка из threathunting-keywords.csv, он изменён для ELK и не обновляется)
- Используйте Sigma-правила "hunting", напрямую извлечённые из этого проекта https://github.com/mthcht/ThreatHunting-Keywords-sigma-rules с помощью pysigma для преобразования
- Используйте некоторые из моих списков в качестве списка IOC с подстановочными запросами https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl-wildcard-query.html#wildcard-top-level-params
### Пример дашборда

### Splunk4DFIR
Ещё один пример использования CSV-файлов проекта со Splunk для охоты в артефактах и журналах DFIR: https://github.com/mf1d3l/Splunk4DFIR

### Другие отличные списки для обнаружения
Я храню некоторые релевантные артефакты в отдельных списках; эти списки более точны и могут использоваться в правилах обнаружения, они доступны в этом [github-репозитории](https://github.com/mthcht/awesome-lists/tree/main/Lists)
вы найдёте:
Мой лист сбора разведывательной информации для планирования сессий охоты за угрозами

- 📋 Списки: https://github.com/mthcht/awesome-lists/tree/main/Lists
- 🕵️♂️ Руководства по Threat Hunting: https://mthcht.medium.com/list/threat-hunting-708624e9266f
- 🚰 Подозрительные именованные каналы: [suspicious_named_pipe_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_named_pipe_list.csv)
- 🌐 Подозрительные TLD (обновляется автоматически): [[suspicious_TLDs]](https://github.com/mthcht/awesome-lists/tree/main/Lists/TLDs)
- 🌐 Подозрительные ASN (обновляется автоматически): [[suspicious ASNs]](https://github.com/mthcht/awesome-lists/tree/main/Lists/ASNs)
- 🔧 Подозрительные службы Windows: [suspicious_windows_services_names_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_windows_services_names_list.csv)
- ⏲️ Подозрительные задачи Windows: [suspicious_windows_tasks_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_windows_tasks_list.csv)
- 🚪 Подозрительный порт назначения: [suspicious_ports_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_ports_list.csv)
- 🛡️ Подозрительные правила брандмауэра: [suspicious_windows_firewall_rules_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_windows_firewall_rules_list.csv)
- 🆔 Подозрительный User-agent: [suspicious_http_user_agents_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_http_user_agents_list.csv)
- 📇 Подозрительные USB ID: [suspicious_usb_ids_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_usb_ids_list.csv)
- 🔢 Подозрительный MAC-адрес: [suspicious_mac_address_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_mac_address_list.csv)
- 📛 Подозрительное имя хоста: [suspicious_hostnames_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/suspicious_hostnames_list.csv)
- 🧮 Метаданные исполняемых файлов: [executables_metadata_informations_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/Windows%20Metadata/executables_metadata_informations_list.csv)
- 🕸️ Список серверов DNS over HTTPS: [dns_over_https_servers_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/dns_over_https_servers_list.csv)
- 📚 Hijacklibs (обновляется автоматически): [hijacklibs_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/Hijacklibs/hijacklibs_list.csv)
- 🌐 Списки узлов TOR (обновляется автоматически): https://github.com/mthcht/awesome-lists/tree/main/Lists/TOR
- 🛠️ Список LOLDriver (обновляется автоматически): [loldrivers_only_hashes_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/Drivers/loldrivers_only_hashes_list.csv)
- 🛠️ Список вредоносных загрузчиков (обновляется автоматически): [malicious_bootloaders_only_hashes_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/Drivers/malicious_bootloaders_only_hashes_list.csv)
- 📜 Список вредоносных SSL-сертификатов (обновляется автоматически): [ssl_certificates_malicious_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/SSL%20CERTS/ssl_certificates_malicious_list.csv)
- 🖥️ Обнаружение RMM: https://github.com/mthcht/awesome-lists/tree/main/Lists/RMM
- 👤🔑 Важные роли и группы для AD/EntraID/AWS: [[permissions]](https://github.com/mthcht/awesome-lists/tree/main/Lists/permissions)
- 💻🔒 Известные расширения файлов программ-вымогателей: [ransomware_extensions_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/ransomware_extensions_list.csv)
- 💻🔒 Известные файлы записок о выкупе (ransom notes): [ransomware_notes_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/ransomware_notes_list.csv)
- 📝 Правила ASR Windows: [windows_asr_rules.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/windows_asr_rules.csv)
- 🌐 Списки DNSTWIST (обновляется автоматически): [DNSTWIST: домены по умолчанию + скрипт](https://github.com/mthcht/awesome-lists/tree/main/Lists/DNSTWIST)
- 🌍 Списки IP-адресов VPN (обновляется автоматически):
- 🛡️ NordVPN: [nordvpn_ips_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/VPN/NordVPN/nordvpn_ips_list.csv)
- 🛡️ ProtonVPN: [protonvpn_ip_list.csv](https://github.com/mthcht/awesome-lists/blob/main/Lists/VPN/ProtonVPN/protonvpn_ip_list.csv)
- 🏢 Списки IP-диапазонов компаний (обновляется автоматически): [Списки по умолчанию + скрипт](https://github.com/mthcht/awesome-lists/tree/main/Lists/Ranges_IP_Address_Company_List/bgp.he.net)
- 🔗 Другие корреляционные списки: https://github.com/mthcht/awesome-lists/tree/main/Lists/Others
- 📋 Списки, которые нужно закончить: https://github.com/mthcht/awesome-lists/tree/main/todo
Ознакомьтесь с этими [руководствами](https://github.com/mthcht/awesome-lists/tree/main/Lists#how-to-use-the-lists), чтобы использовать некоторые из списков:
- [Поиск по службам Windows](https://detect.fyi/threat-hunting-suspicious-windows-service-names-2f0dceea204c)
- [Поиск по User-Agent](https://mthcht.medium.com/threat-hunting-suspicious-user-agents-3dd764470bd0)
- [Поиск DNS Over HTTPS](https://mthcht.medium.com/detecting-dns-over-https-30fddb55ac78)
- [Поиск подозрительных TLD](https://mthcht.medium.com/threat-hunting-suspicious-tlds-a742c2adbf58)
- [Поиск HijackLibs](https://mthcht.medium.com/detect-dll-hijacking-techniques-from-hijacklibs-with-splunk-c760d2e0656f)
- [Поиск фишинга и DNSTWIST](https://detect.fyi/detecting-phishing-attempts-with-dnstwist-37c426b3bbb8)
- [Поиск расширений браузеров](https://mthcht.medium.com/detecting-browser-extensions-installations-e0ac2b45c46b)
- [C2, скрывающийся на виду](https://mthcht.medium.com/c2-hiding-in-plain-sight-7a83963b9344)
- [Артефакты HTML Smuggling](https://mthcht.medium.com/detecting-html-smuggling-phishing-attempts-15af824e60e4)
- [Поиск PSEXEC и аналогичных инструментов](https://mthcht.medium.com/detecting-psexec-and-similar-tools-c812bf3dca6c)
- [Обнаружение Time Slipping](https://mthcht.medium.com/event-log-manipulations-1-time-slipping-55bf95631c40)
- [Подозрительные именованные каналы](https://medium.com/detect-fyi/threat-hunting-suspicious-named-pipes-a4206e8a4bc8)
... ещё [здесь](https://github.com/mthcht/awesome-lists/tree/main/Lists#how-to-use-the-lists)
## DFIR: поиск ключевых слов в файлах (без SIEM)
Проведя тщательный обзор различных инструментов, я обнаружил, что [ripgrep](https://github.com/BurntSushi/ripgrep) значительно превосходит конкурентов в быстром сопоставлении обширного списка regex-шаблонов с каждой строкой большого файла журнала или даже нескольких файлов одновременно. Он оказался наиболее эффективным решением для обработки огромных объёмов данных, обеспечивая непревзойдённую скорость и гибкость.
### Охота на зловредное в файлах журнала с помощью **Ripgrep** и списка 'only_keywords_regex.txt'
#### `rg.exe -f .\only_keywords_regex.txt .\EvtxECmd_Output.csv --multiline --ignore-case`
- .\only_keywords_regex.txt служит исходным файлом для ключевых слов охоты за угрозами, преобразованных в regex-шаблоны для точного сопоставления. Эти шаблоны происходят из файла threathunting-keywords.csv, который прошёл процесс преобразования для оптимальной совместимости с regex-операциями.
- .\EvtxECmd_Output.csv представляет целевой файл, в котором будет выполняться поиск. В данном контексте это файл в формате .csv журнала событий Windows, созданный путём экспорта журналов evtx. Однако гибкость ripgrep позволяет заменить его на любой другой файл по вашему выбору для детального поиска по шаблонам.
- Опция --multiline позволяет ripgrep эффективно обрабатывать и сопоставлять шаблоны, охватывающие несколько строк, значительно расширяя область поиска.
Вы получите совпавшие строки с номером строки (но без совпавшего ключевого слова), как показано ниже


#### Более хороший вариант для очень больших файлов (в Windows):
[DFIR_hunt_in_file.ps1](https://github.com/mthcht/ThreatHunting-Keywords/blob/main/DFIR_hunt_in_file.ps1)
`powershell -ep Bypass -File .\DFIR_hunt_in_file.ps1 -patternFile "only_keywords_regex.txt" -targetFile "C:\Users\mthcht\collection\20230406154410_EvtxECmd_Output.csv" -rgPath "C:\Users\mthcht\Downloads\ripgrep-13.0.0-x86_64-pc-windows-msvc\ripgrep-13.0.0-x86_64-pc-windows-msvc\rg.exe"`
- `-targetFile`: укажите файл для поиска (в примере — извлечённые журналы DFIR-ORC)
- `-patternFile`: файл, содержащий regex-шаблоны `only_keywords_regex.txt`
- `-rgPath`: путь к исполняемому файлу ripgrep
содержимое powershell-скрипта (включено в репозиторий):```powershell
param (
[Parameter(Mandatory=$true)]
[string]$patternFile,
[Parameter(Mandatory=$true)]
[string]$targetFile,
[Parameter(Mandatory=$true)]
[string]$rgPath
)
Start-Transcript -Path "$PSScriptRoot\result_search.log" -Append -Force -Verbose
$totalLines = (Get-Content $patternFile | Measure-Object -Line).Lines
$currentLine = 0
Get-Content $patternFile | ForEach-Object {
$currentLine++
Write-Host "Searching for pattern $currentLine of $totalLines : $_"
& $rgPath --multiline --ignore-case $_ $targetFile | Write-Output
}
Stop-Transcript -Verbose
Результат поиска будет в result_search.log в той же директории, что и скрипт.

todo
В PowerShell это намного медленнее, но если вы всё ещё хотите сделать это таким образом, вы можете использовать скрипт ниже; он сообщит вам номер строки, в которой найдено совпадение, и соответствующее ключевое слово:
powershell.exe -ep Bypass -File .\hunt_keywords_windows.ps1 -k .\only_keywords.txt -f .\EvtxECmd_Output.csv
[Parameter(Mandatory=$true)]
[string]$kw
)
$Keywords = Get-Content $kw $result = @()
foreach ($Keyword in $Keywords) { $SearchTerm = $Keyword.Replace("", ".") $SearchTerm = [Regex]::Escape($SearchTerm).Replace(".*", ".*")
$reader = New-Object System.IO.StreamReader($file)
$lineNumber = 0
while (($line = $reader.ReadLine()) -ne $null) {
$lineNumber++
if ($line -match $SearchTerm) {
$result += New-Object PSObject -Property @{
'Keyword' = $Keyword
'LineNumber' = $lineNumber
'Line' = $line
}
}
}
$reader.Close()
}
$result | Out-GridView Read-Host -Prompt "Press Enter to exit"
</details>
### Правила YARA

Все паттерны обнаружения этого проекта автоматически экспортируются в правила YARA в [ThreatHunting-Keywords-yara-rules](https://github.com/mthcht/ThreatHunting-Keywords-yara-rules)
Примеры охоты с этими правилами YARA:




## Быстрая таблица данных для поиска по ключевому слову
https://mthcht.github.io/ThreatHunting-Keywords/

## Ложные срабатывания
Внесите свой вклад и добавьте свои ложные срабатывания в [список](https://github.com/mthcht/ThreatHunting-Keywords/blob/main/_false_positives/false_positives_offensive_keywords.md) ожидаемых ложных срабатываний
## Правила SIGMA
Ознакомьтесь с таблицей поиска, переведённой в [правила SIGMA](https://github.com/mthcht/ThreatHunting-Keywords-sigma-rules), я обычно обновляю её одновременно :)

## Сопоставление техник MITRE ATT&CK
с аддоном splunk https://splunkbase.splunk.com/app/5742

Покрытие для 2242 инструментов (обновлено 2024/08/30):

поиск splunk:
<details>```
| inputlookup threathunting-keywords.csv
| stats count by metadata_tool metadata_tool_techniques
| makemv delim=" - " metadata_tool_techniques
| mvexpand metadata_tool_techniques
| stats count by metadata_tool_techniques
Панели мониторинга Splunk (это лишь один пример; с помощью доступных полей в файле можно применять самые разные фильтры):
пример xml-панели мониторинга splunk:



Вклад, сообщения об ошибках (issues) и запросы новых функций (feature requests) приветствуются!
``
Укажите название инструмента.
``
Укажите ссылку на официальный сайт инструмента или репозиторий с исходным кодом (GitHub, GitLab и т. д.). Если есть документация, приложите её.
``
Опишите назначение, функциональность и примечательные особенности инструмента. Если вы не уверены, оставьте это поле пустым, и я изучу инструмент подробнее.
``
Если у вас есть информация об известном или потенциальном злоупотреблении этим инструментом злоумышленниками, сообщите её здесь.
Выберите наиболее подходящую категорию для инструмента:
Я решу, стоит ли добавлять инструмент в список. Инструменты, которые широко используются и признаны сообществом, с большей вероятностью будут включены в список, чем малоизвестные или новые.
offensive tool keyword: Эти ключевые слова относятся к наступательным инструментам или демонстрируют высокую уверенность во вредоносных намерениях. Важно, чтобы эти термины оставались актуальными и надёжными для обнаружения потенциальных угроз (низкий уровень ложных срабатываний)greyware tool keyword: Ключевые слова в этой категории соответствуют «легитимным» инструментам, которыми злоупотребляют злоумышленники. Поскольку эти инструменты также имеют легитимное применение, вероятность ложных срабатываний изначально выше. Важно интерпретировать эти результаты с пониманием того, что не все обнаружения могут означать вредоносную активностьsignature keyword: Эти ключевые слова могут не быть напрямую связаны с инструментами, но могут включать имена сигнатур продуктов безопасности, специфические строки или слова, значимые для обнаружения угроз.metadata_tool: Название инструмента, который мы хотим обнаружить
metadata_description: описание инструмента, который мы хотим обнаружить
metadata_tool_techniques: техники MITRE, связанные с инструментом, который мы хотим обнаружить
metadata_tool_tactics: тактики MITRE, связанные с инструментом, который мы хотим обнаружить
metadata_malwares_name: названия вариантов вредоносного ПО, использующих рассматриваемый инструмент
metadata_groups_name: названия групп злоумышленников (threat actors), связанных с инструментом
metadata_category: Глобальное название категории инструмента. Оно может измениться позже; предложения приветствуются.
metadata_link: ссылка на инструмент (исходный код, статьи, образцы, блог ...)
metadata_enable_endpoint_detection: Поле, указывающее, можно ли эффективно использовать ключевое слово в поиске по журналам конечных точек (endpoint). Сюда входят, помимо прочего, журналы событий Windows, EDR, журналы PowerShell, auditd, сеансы bastion, Sysmon или любой источник данных, содержащий поля активности процессов и файлов.
metadata_enable_proxy_detection: Поле, указывающее применимость ключевого слова для поиска в сетевых журналах (журналы Proxy, DNS или любые данные с запросами и URL, исходящими из внутренней сети)
metadata_popularity_score: оценка от 1 до 10 (от низкой до высокой популярности)
metadata_severity_score: оценка от 1 до 10 (от низкой до высокой критичности)
metadata_tags: теги для идентификации конкретных артефактов; с ключевым словом может быть связано несколько тегов. Когда некоторые конкретные артефакты не могут быть добавлены в списки без дополнительного контекста обнаружения, они добавляются в мои другие списки для обнаружения
metadata_comment: Это поле может содержать полезный комментарий, добавленный для ключевого слова.
metadata_github_stars: Количество звёзд проекта на GitHub (если инструмент находится на GitHub; в противном случае значение N/A); используется для расчёта оценки популярности
metadata_github_forks: Количество форков проекта на GitHub (если инструмент находится на GitHub; в противном случае значение N/A); может использоваться для статистики на панели мониторинга наиболее используемых инструментов
metadata_github_created_at: Дата создания проекта на GitHub (если инструмент находится на GitHub; в противном случае значение N/A); может использоваться для статистики на панели мониторинга
metadata_github_updated_at: Дата последнего обновления проекта на GitHub (если инструмент находится на GitHub; в противном случае значение N/A); может использоваться для отслеживания важных обновлений наступательных инструментов и корректировки детектов по ключевым словам
_rawkeyword_rawkeyword_detection_raw| search metadata_description!="" AND metadata_enable_endpoint_detection=1 — здесь мы фокусируемся только на журналах конечных точек, поэтому добавляем metadata_enable_endpoint_detection=1, чтобы сопоставлять только релевантные ключевые слова для журналов конечных точек, и metadata_description!="", чтобы оставить только совпавшие ключевые слова| stats count earliest(_time) as firsttime latest(_time) as lasttime values(_raw) as raw by metadata_keyword_type keyword_detection index sourcetype — здесь я сделал быстрый фильтр без всех полей lookup-таблицы для примера (но вы можете добавить и их, если хотите получить больше возможностей для исключений), это позволяет легко понять, какое ключевое слово совпадает чаще всего, чтобы можно было легко исключить категорию или инструмент, если по нему слишком много ложных срабатываний!|loadjob myjobid, мы можем теперь манипулировать выходными данными с релевантными журналами, не выполняя поиск заново по всем журналам.и используйте эту визуализацию splunk: https://splunkbase.splunk.com/app/5742
