Полный порт Impacket на Go — 63 CLI-инструмента и 24 библиотеки для атак на протоколы Windows и Active Directory, скомпилированные в один бинарный файл без зависимостей.
Автор: Jacob Paullus (@psycep_)
Полная реализация Impacket на Go — 63 инструмента и 24 библиотечных пакета для взаимодействия с сетевыми протоколами Windows, перечисления Active Directory и выполнения атак. Создан как нативный фреймворк на Go, чтобы вы могли скомпилировать один раз и запускать где угодно без зависимостей от Python.
Бета-релиз — крайне экспериментальный. gopacket находится в активной разработке. Основные инструменты протестированы в лабораторных средах Active Directory, но граничные случаи и особенности протоколов вполне ожидаемы. Если что-то не работает, протестируйте ту же операцию параллельно с Impacket и приложите оба вывода к отчёту об ошибке. Это поможет нам быстро определить, связана ли проблема со спецификой gopacket или с общим ограничением протокола.
git clone https://github.com/mandiant/gopacket
cd gopacket
# Default: Linux/macOS build + install to /usr/local/bin
./install.sh
# Run with no flags and it prompts you through the choices interactively.
# Or pick a target directly:
./install.sh --target portable # static Linux binaries in ./dist/portable/
./install.sh --target windows # Windows .exe cross-compiles in ./dist/windows/
./install.sh --target all # build every target in one run
# Build without installing (native only)
./install.sh --build-only
# Or build with make
make build
Сборка по умолчанию (--target native) требует Go 1.24.13+, GCC и заголовочные файлы разработки libpcap (apt install build-essential libpcap-dev в Debian/Ubuntu/Kali, yum install gcc libpcap-devel в RHEL/CentOS или brew install libpcap в macOS). Целевым сборкам portable и windows нужен только инструментарий Go; sniff и split в этих сборках становятся заглушками, поскольку требуют libpcap. Полную матрицу см. в разделе Поддержка платформ.
gopacket собирается на Linux, macOS и Windows. Набор работающих инструментов и доступные пути проксирования зависят от флагов сборки:
| Сборка | Доступные инструменты | Проксирование |
|---|---|---|
| Linux / macOS с cgo (по умолчанию) | Все 63 | proxychains (LD_PRELOAD) и/или -proxy SOCKS5 |
Linux с CGO_ENABLED=0 | 61 (sniff, split становятся заглушками) | только -proxy (proxychains нужен хук libc) |
Windows (GOOS=windows CGO_ENABLED=0) | 60 (заглушки sniff, split, sniffer) | только -proxy (нет LD_PRELOAD в Windows) |
sniff и split зависят от libpcap через cgo; sniffer зависит от необработанных сокетов Unix. Когда инструмент невозможно собрать для целевой платформы, gopacket подставляет заглушку, которая выводит понятное сообщение и завершается с кодом 1, поэтому go build ./... всегда завершается успешно, а структура установки остаётся согласованной на всех платформах.
Для удаления:
./install.sh --uninstall
gopacket поддерживает два независимых пути проксирования. Их также можно объединять в цепочку.
Все инструменты gopacket работают через proxychains. Бинарники Go обычно обходят proxychains, поскольку среда выполнения Go обрабатывает DNS и сетевые операции внутренне, пропуская хуки LD_PRELOAD, на которые полагается proxychains. gopacket обходит это, компонуясь с системной библиотекой C для сетевых операций, что позволяет proxychains перехватывать соединения обычным образом.
proxychains gopacket-secretsdump 'domain/user:password@target'
proxychains gopacket-smbclient -k -no-pass 'domain/[email protected]'
-proxy)Каждый инструмент принимает -proxy для маршрутизации исходящего TCP через сервер SOCKS5 без опоры на LD_PRELOAD. Поддерживаемые схемы: socks5 и socks5h. Когда -proxy не задан, в качестве запасного варианта используются переменные окружения ALL_PROXY / all_proxy.
gopacket-secretsdump -proxy socks5h://127.0.0.1:1080 'domain/user:password@target'
ALL_PROXY=socks5h://127.0.0.1:1080 gopacket-smbclient 'domain/user:password@target'
Функции, зависящие от UDP, отключаются при использовании -proxy, а не приводят к незаметной утечке пакетов (SOCKS5 UDP ASSOCIATE редко поддерживается прокси, а обход прокси для UDP раскрыл бы реальный исходный IP оператора). Затронутые функции и способы их обхода описаны в KNOWN_ISSUES.md.
Объединение в цепочку: -proxy совместим с proxychains. TCP-соединение с самим SOCKS5-прокси всё равно проходит через libc connect(), поэтому proxychains → gopacket → -proxy → target работает для сценариев вложенной маршрутизации.
Полную документацию по API, примеры кода и обзор архитектуры для создания собственных инструментов на основе 24 протокольных пакетов gopacket см. в Руководстве разработчика библиотеки.
| Инструмент | Описание |
|---|---|
| psexec | Удалённое выполнение команд через создание службы SMB |
| smbexec | Удалённое выполнение команд через SMB (скрытнее, чем psexec) |
| wmiexec | Удалённое выполнение команд через WMI |
| dcomexec | Удалённое выполнение команд через DCOM |
| atexec | Удалённое выполнение команд через планировщик задач |
| Инструмент | Описание |
|---|---|
| secretsdump | Извлечение SAM/LSA/NTDS.dit и DCSync (удалённо + офлайн) |
| dpapi | Извлечение ключа резервного копирования DPAPI |
| esentutl | Офлайн-парсер базы данных ESE (NTDS.dit) |
| registry-read | Офлайн-парсер кустов реестра Windows |
| Инструмент | Описание |
|---|---|
| getTGT | Запрос TGT с паролем, хешем или ключом AES |
| getST | Запрос служебного билета с S4U2Self/S4U2Proxy |
| GetUserSPNs | Kerberoasting — поиск и запрос SPN |
| GetNPUsers | AS-REP roasting — поиск учётных записей без предварительной аутентификации |
| ticketer | Подделка golden/silver билетов |
| ticketConverter | Преобразование между форматами ccache и kirbi |
| describeTicket | Разбор и расшифровка билетов Kerberos |
| getPac | Запрос и разбор информации PAC |
| keylistattack | Атака KERB-KEY-LIST-REQ (RODC) |
| raiseChild | Эскалация из дочернего домена в родительский через golden ticket |
| Инструмент | Описание |
|---|---|
| GetADUsers | Перечисление пользователей домена через LDAP |
| GetADComputers | Перечисление компьютеров домена через LDAP |
| GetLAPSPassword | Чтение паролей LAPS через LDAP |
| findDelegation | Поиск конфигураций делегирования |
| lookupsid | Перебор SID через LSARPC |
| samrdump | Перечисление пользователей через SAMR |
| rpcdump | Дамп конечных точек RPC через epmapper |
| rpcmap | Сканирование доступных интерфейсов RPC |
| net | Перечисление net user/group/computer через SAMR/LSARPC |
| netview | Перечисление сессий, общих ресурсов и вошедших пользователей |
| CheckLDAPStatus | Проверка требований к подписи LDAP и привязке канала |
| DumpNTLMInfo | Дамп информации аутентификации NTLM из согласования SMB |
| getArch | Определение архитектуры удалённой ОС через RPC |
| machine_role | Определение роли машины (DC, сервер, рабочая станция) |
| Инструмент | Описание |
|---|---|
| addcomputer | Создание/изменение/удаление учётных записей машин (SAMR + LDAP) |
| rbcd | Манипуляция Resource-Based Constrained Delegation |
| dacledit | Чтение/запись DACL на объектах AD |
| owneredit | Чтение/изменение владельца объекта |
| samedit | Подмена имени учётной записи SAM (CVE-2021-42278/42287) |
| badsuccessor | BadSuccessor / эскалация через оператора резервного копирования |
| changepasswd | Смена/сброс паролей через SAMR и LDAP |
| Инструмент | Описание |
|---|---|
| smbclient | Интерактивный клиент SMB (общие ресурсы, ls, get, put и т. д.) |
| smbserver | Сервер SMB для обмена файлами |
| attrib | Запрос/изменение атрибутов файлов через SMB |
| filetime | Запрос/изменение временных меток файлов через SMB |
| services | Удалённое управление службами через SVCCTL |
| reg | Удалённые операции с реестром через WINREG |
| Get-GPPPassword | Извлечение паролей Group Policy Preferences из SYSVOL |
| karmaSMB | Вредоносный сервер SMB для перехвата хешей |
| Инструмент | Описание |
|---|---|
| ntlmrelayx | Полноценный фреймворк NTLM relay с поддержкой множества протоколов |
ntlmrelayx поддерживает:
| Инструмент | Описание |
|---|---|
| mssqlclient | Интерактивный клиент MSSQL с аутентификацией SQL/Windows/Kerberos |
| mssqlinstance | Обнаружение экземпляров MSSQL через SQL Browser |
| Инструмент | Описание |
|---|---|
| wmiquery | Интерактивная оболочка запросов WMI |
| wmipersist | Закрепление через подписку на события WMI |
| Инструмент | Описание |
|---|---|
| tstool | Перечисление сессий и процессов служб терминалов |
| Инструмент | Описание |
|---|---|
| rdp_check | Проверка аутентификации RDP |
| mqtt_check | Проверка аутентификации MQTT |
| exchanger | Клиент Exchange Web Services |
| Инструмент | Описание |
|---|---|
| ntfs-read | Офлайн-парсер файловой системы NTFS |
| ping / ping6 | ICMP ping |
| sniff / sniffer | Захват сетевых пакетов |
| split | Разделение больших файлов |
Все сетевые инструменты поддерживают три метода аутентификации:
# Password
gopacket-secretsdump 'domain/user:password@target'
# NTLM hash (pass-the-hash)
gopacket-secretsdump -hashes ':nthash' 'domain/user@target'
# Kerberos (pass-the-ticket)
KRB5CCNAME=ticket.ccache gopacket-secretsdump -k -no-pass 'domain/user@target'
| Флаг | Описание |
|---|---|
-hashes LMHASH:NTHASH | Аутентификация по хешу NTLM (хеш LM может быть пустым) |
-k | Использовать аутентификацию Kerberos |
-no-pass | Не запрашивать пароль (используйте с -k или -hashes) |
-dc-ip IP | IP-адрес контроллера домена |
-target-ip IP | IP-адрес цели (при использовании имени хоста для Kerberos) |
-port PORT | Целевой порт (значения по умолчанию зависят от инструмента) |
-proxy URL | Маршрутизировать исходящий TCP через SOCKS5-прокси (например, socks5h://127.0.0.1:1080). Функции UDP отключаются. |
-debug | Включить отладочный вывод |
# Dump domain hashes via DCSync
gopacket-secretsdump 'corp.local/admin:[email protected]'
# Interactive SMB shell
gopacket-smbclient -hashes ':aabbccdd...' 'corp.local/admin@fileserver'
# Kerberoast
gopacket-getuserspns 'corp.local/user:[email protected]'
# Golden ticket
gopacket-ticketer -nthash <krbtgt_hash> -domain-sid S-1-5-21-... -domain corp.local admin
# NTLM relay with SOCKS proxy
sudo gopacket-ntlmrelayx -t smb://target -socks
# LDAP relay for RBCD
sudo gopacket-ntlmrelayx -t ldaps://dc01.corp.local --delegate-access
# Route all outbound traffic through a SOCKS5 proxy
gopacket-secretsdump -proxy socks5h://127.0.0.1:1080 'corp.local/admin:[email protected]'
Каталог pkg/ содержит 24 переиспользуемых протокольных пакета, которые можно импортировать независимо.
| Пакет | Описание |
|---|---|
| smb | Клиент SMB2/3 с аутентификацией NTLM и Kerberos |
| ldap | Клиент LDAP с привязкой NTLM/Kerberos |
| dcerpc | Клиент DCE/RPC + 20 реализаций служб (DRSUAPI, SAMR, SVCCTL, LSARPC, WINREG, NETLOGON, DCOM, TSCH, EPMAPPER и др.) |
| kerberos | Клиент Kerberos, подделка билетов (golden/silver), S4U2Self/S4U2Proxy |
| ntlm | Протокол аутентификации NTLM |
| relay | Фреймворк NTLM relay (серверы, клиенты, атаки, SOCKS) |
| tds | Протокол TDS SQL Server |
| ese | Парсер Extensible Storage Engine |
| registry | Парсер кустов реестра Windows |
| ntfs | Парсер файловой системы NTFS |
| security | Дескрипторы безопасности, ACL, SID |
| dpapi | Структуры DPAPI |
| mqtt | Клиент протокола MQTT |
| session | Разбор цели/учётных данных (domain/user:pass@host) |
| flags | Унифицированный фреймворк флагов CLI |
gopacket стремится к полному паритету с Impacket. Следующее пока не реализовано:
Клиенты протоколов ретрансляции:
Модули атак ретрансляции:
Автономные инструменты:
ifmap.py (сопоставление интерфейсов DCOM)mimikatz.py (ограниченный Mimikatz через RPC)goldenPac.py (MS14-068 — устарел на пропатченных системах)smbrelayx.py (заменён на ntlmrelayx)kintercept.py (перехват Kerberos)Эти пробелы имеют низкий приоритет — большинство требуют специфической инфраструктуры для тестирования или устарели в пользу более новых техник.
Это ограничения на уровне протокола, общие с Impacket, а не ошибки gopacket:
Подробную информацию о каждой проблеме и способах обхода см. в KNOWN_ISSUES.md.
Это бета-релиз. Ошибки ожидаемы, и мы приветствуем вклад.
Поскольку gopacket реализует те же сетевые протоколы, что и Impacket, значительная доля «багов» оказывается средовыми, а не специфичными для gopacket — пропатченные DC, требования подписи LDAP, EPA, PKT_INTEGRITY, подпись SMB, проверка NTLM MIC после CVE-2019-1040, отсутствующие SPN, рассинхронизация времени, особенности DNS, правила брандмауэра и так далее. Запуск той же операции с Impacket параллельно исключает среду из уравнения:
Этот единственный шаг триажа экономит много итераций, поэтому, пожалуйста, не пропускайте его.
-debug и сохраните полный выводcorp.internal → example.local
и dc01.corp.internal → dc01.example.local допустима — сохраните
структуру данных, но не идентифицирующие значения. Если сомневаетесь,
отредактируйте.Откройте задачу на GitHub с описанием сценария использования и эквивалента в Impacket (если есть). Если функция есть в списке «Отсутствующие функции» выше, укажите, какая именно — это поможет нам расставить приоритеты.
PR приветствуются. Перед открытием:
go build ./..., go vet ./..., gofmt -l . и go test ./...
и убедитесь, что все они проходят без ошибокЗлоумышленники отходят от Python. Скомпилированный инструментарий на Go и Rust (Sliver, BRC4, Geacon и специализированные загрузчики) всё чаще заменяет Impacket в реальных вторжениях. Большинство защитного инструментария и логики обнаружения были построены вокруг сетевого поведения Impacket на Python, и это покрытие размывается по мере смещения экосистемы атакующих к компилируемым языкам.
gopacket существует отчасти для того, чтобы помочь сообществу безопасности опередить это смещение. Предоставляя открытую, читаемую реализацию на Go тех же протоколов и техник, защитники и инженеры по обнаружению могут:
Разрыв между инструментарием атакующих и видимостью защитников наиболее широк, когда новый инструментарий остаётся закрытым. Открытие исходного кода gopacket сокращает этот разрыв.
KRB5CCNAME не задан, инструменты будут искать <username>.ccache в текущем каталоге-proxy SOCKS5 (см. Поддержка прокси)Выпущено под Apache License 2.0.