
Инструмент для перечисления привилегированных запланированных задач на удаленных системах
<p align="center">
<img width="350" height="350" alt="Логотип TaskHound" src="https://assets.kitploit.com/production/public/readmes/9903/f048c922e3b550dd3bc0880bd2e9ba4bebdfdb710812a9a7eec7249bce3e112e.png" />
</p>
<p align="center">
<strong>Инструмент для обнаружения привилегированных запланированных задач Windows</strong> для удовольствия и прибыли.
</p>
<p align="center">
<a href="https://github.com/1r0BIT/TaskHound/releases">
<img src="https://img.shields.io/github/v/release/1r0BIT/TaskHound?style=flat-square&logo=github&color=blue" alt="Последний релиз">
</a>
<a href="https://bloodhound.specterops.io/">
<img src="https://img.shields.io/badge/BloodHound-OpenGraph-red.svg?style=flat-square&logo=neo4j" alt="BloodHound OpenGraph">
</a>
<a href="https://www.python.org/">
<img src="https://img.shields.io/badge/python-3.11+-blue.svg?style=flat-square&logo=python&logoColor=white" alt="Python 3.11+">
</a>
<br>
<a href="https://deepwiki.com/1r0BIT/TaskHound">
<img src="https://deepwiki.com/badge.svg" alt="Спросить DeepWiki">
</a>
<a href="https://twitter.com/0xr0BIT">
<img src="https://img.shields.io/badge/Twitter-@0xr0BIT-1DA1F2?style=flat-square&logo=twitter&logoColor=white" alt="Twitter">
</a>
<a href="https://r0bit.io">
<img src="https://img.shields.io/badge/Blog-r0bit.io-orange?style=flat-square&logo=rss&logoColor=white" alt="Блог">
</a>
</p>
<hr />
TaskHound охотится за запланированными задачами Windows, выполняющимися с привилегированными учётными записями и сохранёнными учётными данными. Он перечисляет задачи через SMB, разбирает XML и определяет ценные возможности для атак с помощью интеграции с BloodHound.
Предысторию и подробные объяснения см. в соответствующих записях блога — [Часть 1](https://r0bit.io/posts/taskhound/part1/index.html) и [Часть 2](https://r0bit.io/posts/taskhound/part2/index.html).
## Ключевые возможности
| Функция | Описание |
|---------|----------|
| **Обнаружение Tier 0 и высокоприоритетных целей** | Автоматически выявляет задачи, выполняющиеся от имени администраторов домена, администраторов предприятия и других привилегированных учётных записей |
| **Интеграция с BloodHound** | Подключение к действующим экземплярам BHCE/унаследованным версиям или импорт экспортированных данных для обнаружения высокоприоритетных пользователей |
| **Поддержка OpenGraph** | Визуализация запланированных задач как узлов путей атак в BloodHound CE |
| **Интеграция с LAPS** | Автоматическое получение и использование паролей LAPS (как Windows LAPS, так и устаревших версий) для аутентификации на каждом узле |
| **Извлечение учётных данных DPAPI** | Сбор и расшифровка BLOB-объектов DPAPI, содержащих сохранённые учётные данные задач |
| **Многопоточное сканирование** | Параллельная обработка целей с ограничением скорости для больших сред |
| **Обнаружение Tier-0 через LDAP** | Выявление привилегированных учётных записей по членству в группах без BloodHound |
| **Проверка учётных данных** | Подтверждение актуальности паролей сохранённых задач через RPC |
| **Автономный анализ** | Обработка образов смонтированных дисков или ранее собранных XML-файлов |
| **Несколько форматов вывода** | Отчёты в формате обычного текста, JSON, CSV и HTML с оценкой степени серьёзности |
| **Разрешение SID** | Многоуровневое разрешение через BloodHound → Кэш → LSARPC → LDAP → GC |
| **Кэширование** | Постоянный кэш на SQLite для поиска SID и учётных данных LAPS |
## Быстрый старт```bash
# Install
git clone https://github.com/1r0BIT/TaskHound.git
cd TaskHound
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt && pip install .
# Basic usage - single target
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local
# Multiple targets with threading
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --targets-file hosts.txt --threads 10
# Auto-discover all domain computers
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --dc-ip 10.0.0.1 --auto-targets --threads 20
# With LAPS - auto-retrieves per-host local admin passwords
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --targets-file hosts.txt --laps --threads 10
# Offline analysis of mounted disk image
taskhound --offline-disk /mnt/disk
```
> **Auth Support**: TaskHound поддерживает большинство основных механизмов аутентификации, включая пароль, NTLM-хэш, Kerberos (также с ccache) и аутентификацию с помощью ключа AES.
## Файл конфигурации
TaskHound поддерживает TOML-файлы конфигурации для постоянных настроек. Создайте `taskhound.toml` в вашем рабочем каталоге или `~/.config/taskhound/`:```toml
[authentication]
username = "svc_taskhound"
domain = "THESIMPSONS.LOCAL"
[target]
dc_ip = "10.0.0.1"
threads = 10
timeout = 30
[bloodhound]
live = true
connector = "http://127.0.0.1:8080"
api_key = "${BH_API_KEY}" # Use env vars for secrets
api_key_id = "${BH_API_KEY_ID}"
type = "bhce"
[bloodhound.opengraph]
enabled = true
output_dir = "./opengraph"
[laps]
enabled = true
[cache]
enabled = true
ttl = 86400 # 24 hours
```
Приоритет: аргументы CLI > переменные окружения > локальная конфигурация > конфигурация пользователя > значения по умолчанию
## Интеграция с AdaptixC2
BOF TaskHound включен в [Adaptix Extension-Kit](https://github.com/Adaptix-Framework/Extension-Kit) в директории `SAR-BOF/taskhound/`.
## Демо-вывод```
TTTTT AAA SSS K K H H OOO U U N N DDDD
T A A S K K H H O O U U NN N D D
T AAAAA SSS KKK HHHHH O O U U N N N D D
T A A S K K H H O O U U N NN D D
T A A SSSS K K H H OOO UUU N N DDDD
by 0xr0BIT
[+] Connecting to BloodHound CE at http://127.0.0.1:8080
[+] BloodHound connection successful (API v2)
[+] High Value target data loaded (42 users)
[+] OpenGraph generation enabled (auto-upload active)
[*] Processing target: moe.thesimpsons.local
[+] moe.thesimpsons.local: Connected via SMB
[+] moe.thesimpsons.local: Local Admin Access confirmed
[*] moe.thesimpsons.local: Enumerating scheduled tasks (skipping \Microsoft)
[+] moe.thesimpsons.local: Found 12 tasks (3 privileged, 2 with stored credentials)
┌──────────────────────────────────────────────────────────────────────────────┐
│ [TIER-0] moe.thesimpsons.local - \DuffBrewery\BackupJob │
├──────────────────────────────────────────────────────────────────────────────┤
│ Enabled │ True │
│ RunAs │ THESIMPSONS\Administrator │
│ What │ C:\Scripts\backup_beer_recipes.ps1 │
│ Author │ THESIMPSONS\burns.monty │
│ Date │ 2025-06-15T02:30:00 │
│ Trigger │ Calendar (starts 2025-06-15 02:30, daily) │
│ Reason │ Tier 0 - Domain Admins membership │
│ Cred Validation │ CONFIRMED_VALID │
│ Pwd Analysis │ Password unchanged AND ran within schedule - confirmed │
└──────────────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────────────┐
│ [PRIV] moe.thesimpsons.local - \KrustyBurger\InventorySync │
├──────────────────────────────────────────────────────────────────────────────┤
│ Enabled │ True │
│ RunAs │ THESIMPSONS\svc_krusty │
│ What │ C:\KrustyApps\sync.exe --silent │
│ Author │ THESIMPSONS\carlson.carl │
│ Date │ 2025-03-10T08:00:00 │
│ Trigger │ Calendar (starts 2025-03-10 08:00, every 4 hours) │
│ Reason │ High Value match found in BloodHound │
│ Cred Validation │ DEFINITELY_STALE │
│ Pwd Analysis │ Password changed AFTER last run - credentials are stale │
└──────────────────────────────────────────────────────────────────────────────┘
╭─────────────────────────── SCAN COMPLETE ────────────────────────────────────╮
│ [+] Succeeded: 1 │
│ [-] Failed: 0 │
│ Total time: 2.34s │
│ Avg per target: 2340ms │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────── TASK SUMMARY ─────────────────────────────────────╮
│ Hostname Tier-0 Privileged Normal │
│ moe.thesimpsons.local 1 2 9 │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────── BLOODHOUND OPENGRAPH ─────────────────────────────────╮
│ [+] Generated 3 nodes, 5 edges │
│ [+] Uploaded to BloodHound successfully │
│ [*] JSON saved to: ./opengraph/taskhound_data.json │
╰──────────────────────────────────────────────────────────────────────────────╯
```
---
## Интеграция с BloodHound
TaskHound поддерживает как **Legacy BloodHound** (Neo4j), так и **BloodHound Community Edition (BHCE)** с автоматическим определением формата.
### Прямое подключение```bash
# BHCE with API Key (recommended)
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local \
--bh-live --bhce --bh-connector http://127.0.0.1:8080 \
--bh-api-key "YOUR_API_KEY" --bh-api-key-id "YOUR_KEY_ID"
# BHCE with username/password
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local \
--bh-live --bhce --bh-connector http://127.0.0.1:8080 \
--bh-user admin --bh-password password
# Legacy BloodHound (Neo4j)
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local \
--bh-live --legacy --bh-connector bolt://127.0.0.1:7687 \
--bh-user neo4j --bh-password password
```
### Tier 0 Detection Methods
| Source | Метод обнаружения |
|--------|------------------|
| **BHCE** | `isTierZero`, системные теги (`admin_tier_0`), AdminSDHolder |
| **Устаревшие** | AdminSDHolder (`admincount=1`), обнаружение на основе SID |
| **LDAP** | запросы членства в группах (`--ldap-tier0`) |
| **Встроенные** | Известные SID уровня 0 (Domain Admins, Enterprise Admins, и т.д.) |
### Автономная загрузка данных
Если прямое подключение невозможно, экспортируйте ценных пользователей с помощью следующих Cypher-запросов:
**BHCE:**```cypher
MATCH (n) WHERE coalesce(n.system_tags, "") CONTAINS "admin_tier_0" OR n.highvalue = true
MATCH p = (n)-[:MemberOf*1..]->(g:Group)
RETURN p;
```
**Наследие:**```cypher
MATCH (u:User {highvalue:true})
OPTIONAL MATCH (u)-[:MemberOf*1..]->(g:Group)
WITH u, properties(u) as all_props, collect(g.name) as groups
RETURN u.samaccountname AS SamAccountName, all_props, groups
```
Затем используйте: `taskhound --bh-data exported_users.json ...`
---
## Визуализация цепочки атак OpenGraph
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/9903/43ec2d44fef6e06a4aee6b0cad113991182e24d877f0d9099cd6b479554b3362.jpg" alt="Цепочка атак OpenGraph" />
</p>
TaskHound создаёт пользовательские узлы и рёбра в BloodHound CE для визуализации цепочек атак запланированных задач.
**Что вы получаете:**
- **Пользовательские узлы**: `ScheduledTask` с 20+ свойствами (учётные данные, триггеры, анализ паролей, статус проверки)
- **Пользовательские рёбра**: `HasTask`, `HasTaskWithStoredCreds`, `RunsAs`
- **Пути атак**: `(Owned) → AdminTo → (Computer) → HasTask → (Task) → RunsAs → (Target)````bash
# Collect and auto-upload
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local --bh-opengraph
# Generate without upload (saves to {output_dir}/opengraph/)
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local --bh-opengraph --bh-no-upload
```
> **Примечание**: OpenGraph работает только с BHCE. Устаревший BloodHound не поддерживает пользовательские типы узлов.
---
## Интеграция LAPS
TaskHound может автоматически получать и использовать пароли LAPS для аутентификации на каждом хосте. Поддерживает как Windows LAPS (`msLAPS-Password`), так и устаревший LAPS (`ms-Mcs-AdmPwd`), включая зашифрованные пароли через MS-GKDI.```bash
# Basic LAPS - auto-retrieves passwords per target
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --targets-file hosts.txt --laps --threads 10
# Custom local admin username
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local --laps --laps-user localadmin
# LAPS with OPSEC mode (other noisy operations disabled)
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local --laps --opsec --force-laps
```
**Поддерживаемые типы LAPS:**
| Тип | Атрибут | Зашифрован |
|------|-----------|-----------|
| Windows LAPS | `msLAPS-Password` | Нет |
| Windows LAPS | `msLAPS-EncryptedPassword` | Да (MS-GKDI) |
| Legacy LAPS | `ms-Mcs-AdmPwd` | Нет |
---
## Извлечение учетных данных DPAPI
TaskHound извлекает и расшифровывает сохраненные учетные данные задач с помощью DPAPI. **Сбор данных DPAPI включен по умолчанию**.```bash
# Step 1: Get DPAPI_SYSTEM key via LSA dump
nxc smb moe.thesimpsons.local -u homer.simpson -p 'Doh!123' --lsa
# Look for: DPAPI_SYSTEM userkey: 0x51e43225...
# Step 2a: Loot + decrypt immediately (looting is default, just add key)
taskhound -t moe.thesimpsons.local -u homer.simpson -p 'Doh!123' -d thesimpsons.local --dpapi-key 0x51e43225...
# Step 2b: Or collect now (default saves to ./output/raw_backups/), decrypt later
taskhound -t moe.thesimpsons.local -u homer.simpson -p 'Doh!123' -d thesimpsons.local
# Later:
taskhound --offline ./output/raw_backups/moe.thesimpsons.local --dpapi-key 0x51e43225...
# Custom output directory
taskhound -t moe.thesimpsons.local -u homer.simpson -p 'Doh!123' -d thesimpsons.local --output-dir ./collected
# Disable DPAPI looting explicitly
taskhound -t moe.thesimpsons.local -u homer.simpson -p 'Doh!123' -d thesimpsons.local --no-loot
```
> **Важно**: Каждый хост имеет уникальный ключ DPAPI_SYSTEM. Для многоцелевого сканирования сначала соберите (по умолчанию), затем расшифруйте каждую цель офлайн.
---
## Проверка учётных данных
TaskHound оценивает, вероятно ли, что сохранённые пароли задач всё ещё действительны, запрашивая историю выполнения задач через RPC и применяя эвристику. Эта функция **включена по умолчанию**.```bash
# Credential validation is on by default, no flag needed
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local
# Disable validation explicitly
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local --no-validate-creds
```
### Как это работает
Планировщик задач Windows записывает только **успешные** выполнения задач. Сбои аутентификации (неверный пароль, заблокированная учетная запись и т. д.) молча игнорируются. Задача просто не выполняется.
**Ключевой момент**: Windows проверяет учетные данные при создании задачи. Если попытаться создать задачу с неверным паролем, возникает `ERROR_LOGON_FAILURE`, и задача не создается. Это означает: **если задача с сохраненными учетными данными существует, пароль был действителен на момент создания задачи.**
TaskHound использует эвристику для оценки достоверности учетных данных:
| Статус | Значение |
|--------|----------|
| `CONFIRMED_VALID` | Пароль не изменялся с момента создания задачи И задача выполнялась по плану — учетные данные подтверждены как рабочие |
| `HIGH_CONFIDENCE_VALID` | Пароль не изменялся с момента создания задачи, но время триггера неизвестно (например, триггер загрузки) — учетные данные, вероятно, действительны |
| `LIKELY_VALID` | Пароль изменен, но задача выполнялась по расписанию (учетные данные обновлены), ИЛИ задача успешно выполнена (режим только RPC) |
| `POSSIBLY_STALE` | Задача должна была выполниться, но не выполнилась — может указывать на устаревшие учетные данные |
| `DEFINITELY_STALE` | Пароль изменен после последнего успешного выполнения — учетные данные определенно неверны |
| `NEVER_RAN_LIKELY_VALID` | Задача ни разу не выполнялась, но пароль не изменялся с момента создания — вероятно, действительна (может отсутствовать право пакетного входа) |
| `NEVER_RAN_POSSIBLY_STALE` | Задача ни разу не выполнялась, и пароль изменен после создания — вероятно, устарела |
| `NEVER_RAN_UNKNOWN` | Задача ни разу не выполнялась, нет контекста AD — была действительна при создании, текущий статус неизвестен |
| `UNKNOWN` | Невозможно определить (учетная запись заблокирована и т. д.) |
Ключевой момент: сравнение `pwdLastSet` из AD с `LastRunTime` из планировщика задач показывает, изменился ли пароль после последнего успешного выполнения. Для задач, которые никогда не запускались, сравнение `pwdLastSet` с `task_creation_date` показывает, изменился ли пароль после того, как задача была создана с действительными учетными данными.
**Без данных AD** (например, при `--no-ldap` и отсутствии BloodHound): TaskHound возвращается в режим только RPC, используя только код возврата и время последнего запуска. Успешное выполнение возвращает `LIKELY_VALID`; обнаружение устаревания на основе расписания все еще применяется, если интервал триггера известен из XML задачи.
> **Примечание**: Отключено при использовании `--opsec` или `--no-rpc`.
---
## Форматы вывода
TaskHound поддерживает несколько форматов вывода для различных сценариев использования. Все выходные данные используют структурированную структуру каталогов в `--output-dir` (по умолчанию: `./output`).
### Доступные форматы
| Формат | Флаг | Описание | Сценарий использования |
|--------|------|----------|------------------------|
| **Plain** | `-o plain` | Вывод в консоль в удобочитаемом виде (по умолчанию) | Интерактивное использование, быстрый просмотр |
| **JSON** | `-o json` | Структурированный экспорт для машинной обработки | Автоматизация, анализ данных, написание скриптов |
| **CSV** | `-o csv` | Экспорт, совместимый с электронными таблицами | Отчетность, фильтрация, анализ в Excel |
| **HTML** | `-o html` | Отчет безопасности с оценкой серьезности | Аудиты синих команд, отчеты для заинтересованных сторон |
### Примеры использования```bash
# Default - plain text to console + files
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local
# Multiple output formats
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --auto-targets -o plain,json,html
# JSON only for automation
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --auto-targets -o json
# Custom output directory
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --auto-targets -o html --output-dir ./audit_results
# All formats for comprehensive audit
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --auto-targets -o plain,json,csv,html --output-dir ./full_audit
```
### Структура каталога```
./output/ # Base directory (--output-dir)
├── plain/ # Plain text output
│ └── <hostname>/
│ └── tasks.txt
├── json/ # JSON export
│ └── taskhound.json
├── csv/ # CSV export
│ └── taskhound.csv
├── html/ # HTML security reports
│ └── taskhound.html
├── opengraph/ # BloodHound OpenGraph files
│ └── taskhound_data.json
└── raw_backups/ # Raw collection (XML + DPAPI)
└── <hostname>/
├── tasks/ # Task XML files
└── dpapi_loot/ # DPAPI credential blobs
```
### Отчеты безопасности в формате HTML
Вывод HTML формирует всесторонний отчет безопасности, предназначенный для оценки со стороны синей команды:
- **Оценка серьезности**: Задачи, оцененные по уровню риска на основе привилегий, сохраненных учетных данных и конфигурации
- **Детали задачи**: Полные метаданные, включая триггеры, действия, учетные записи запуска и статус проверки
- **Фильтрация**: Фильтрация на стороне клиента по хосту, серьезности и статусу учетных данных
- **Готовность к экспорту**: Подходит для отчетов руководства и аудиторской документации
### Сбор резервных копий
По умолчанию TaskHound сохраняет необработанные XML-файлы задач и большие двоичные объекты учетных данных DPAPI для автономного анализа:```bash
# Disable backup collection
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local -t moe.thesimpsons.local --no-backup
# Analyze backups later (offline mode)
taskhound --offline ./output/raw_backups/moe.thesimpsons.local --dpapi-key 0x51e43225...
```
## Многопоточное сканирование
Для больших сред используйте параллельное сканирование с ограничением скорости:```bash
# 20 parallel workers, max 5 targets/second
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --auto-targets --threads 20 --rate-limit 5
# Auto-discover servers only (uses preset filter)
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --auto-targets --ldap-filter servers --threads 20
# Include disabled computers and extend stale threshold to 90 days
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --auto-targets --include-disabled --stale-threshold 90
# Target workstations only, disable stale filtering
taskhound -u homer.simpson -p 'Doh!123' -d thesimpsons.local --auto-targets --ldap-filter workstations --stale-threshold 0
```
### Фильтрация автоматических целей
По умолчанию `--auto-targets` применяет умную фильтрацию для уменьшения шума и неудачных подключений:
| Фильтр | По умолчанию | Переопределение |
|--------|---------|----------|
| Отключенные учетные записи | Исключены | `--include-disabled` |
| Устаревшие компьютеры (>60 дней) | Исключены | `--stale-threshold 0` (отключить) |
| Контроллеры домена | Исключены | `--include-dcs` |
**Приоритет источника данных:** BloodHound (если настроен) → LDAP как запасной вариант
При использовании BloodHound TaskHound выполняет запросы с `include_properties=true` для эффективного однозапросного перечисления. Если данные BloodHound старше 7 дней, выводится предупреждение; более 30 дней — срочное предупреждение.
**Предустановки фильтров:**
- `servers` — только операционные системы Windows Server
- `workstations` — только несерверные операционные системы
- `(raw LDAP)` — пользовательский LDAP-фильтр (требуется источник LDAP)
---
## Разрешение SID
TaskHound разрешает SID в читаемые имена, используя многоуровневую цепочку запасных вариантов:
1. **BloodHound** (если подключен) — самый быстрый, без сетевого трафика
2. **Кэш** — постоянный кэш SQLite (TTL по умолчанию 24 ч)
3. **LSARPC** — прямой запрос к цели (наиболее точный для локальных учетных записей)
4. **LDAP** — запрос к контроллеру домена
5. **Глобальный каталог** — для SID из разных доменов/лесов```bash
# Separate LDAP credentials for SID resolution
taskhound -u localadmin -p 'L0c4lP@ss!' -d . -t moe.thesimpsons.local \
--ldap-user homer.simpson --ldap-password 'Doh!123' --ldap-domain thesimpsons.local
# Specify Global Catalog for multi-domain
---
[Read more](https://github.com/1r0bit/taskhound)