
Целевой инструмент пост-эксплуатации на C# для Microsoft SQL Server (MS SQL / MSSQL), выполняющий обход цепочек связанных серверов любой глубины с каскадным олицетворением входа на каждом переходе.
Приземлитесь изящно в целевой СУБД Microsoft SQL Server (MS SQL), словно прибывая бизнес-классом с бокалом шампанского в руке. 🥂

MSSQLand — это инструмент пост-эксплуатации для Microsoft SQL Server (MSSQL / MS SQL) на C#, созданный для операторов красных команд. Он предназначен для запуска внутри целевой среды непосредственно через ваши бекон-агенты (например, с помощью execute-assembly в Cobalt Strike или Havoc, или любой команды dotnet). Инструмент позволяет перемещаться по цепочкам связанных серверов, олицетворять любого пользователя, встреченного на пути, и выполнять любое желаемое действие на последнем узле. Всё с минимальным OPSEC-следом и без внешних зависимостей.
OPENQUERY / EXEC AT по цепочкам любой глубиныEXECUTE AS LOGIN на каждом узле с каскадным многопользовательским олицетворениемcm-* для разведки и эксплуатации баз данных Microsoft Configuration Manager[!TIP] MSSQLand построен с использованием
.NET Framework 4.8, ориентирован на выполнение сборок в текущем контексте. Если вам нужно подключиться с использованием NT/LM-хешей или билета Kerberos, см. Pass-the-Hash.
[!NOTE] Не забывайте об основах. Во время оценки безопасности иногда проще использовать SQL Server Management Studio (SSMS).
MSSQLand.exe [options] <host> [options] <action> [action-options]
MSSQLand.exe <host> --probe
Глобальные флаги (-c, -l, --debug и т.д.) принимаются в любой позиции, включая после имени действия; нераспознанные токены после действия передаются как есть.
[!NOTE] Если опустить
<action>, выполняется только проверка подключения. Инструмент аутентифицируется и завершает работу без выполнения запросов. Идеально для проверки учётных данных с минимальным OPSEC-следом.
[!TIP] Избегайте ручного ввода всех вызовов RPC Out или OPENQUERY. Позвольте инструменту обработать любую цепочку связанных серверов с помощью аргумента
-l, чтобы вы могли сосредоточиться на общей картине.
Формат: server:port/user@database или любая комбинация server/user@database:port.
server (обязательно) - Имя хоста или IP-адрес SQL Server:port (необязательно) - Номер порта (по умолчанию: 1433, также часто встречается: 1434, 14333, 2433)/user (необязательно) - Пользователь для олицетворения на этом сервере ("execute as login")
/user1/user2/user3 выполняет EXECUTE AS LOGIN = 'user1'; EXECUTE AS LOGIN = 'user2'; EXECUTE AS LOGIN = 'user3';/user помещает новый контекст олицетворения в стек безопасности@database (необязательно) - Контекст базы данных# Connectivity probe: checks if server is alive without authenticating
MSSQLand.exe localhost --probe
# Connection test only (no action executed, authenticates and exits)
MSSQLand.exe localhost -c token
# Execute specific action
MSSQLand.exe localhost -c token info
MSSQLand.exe localhost:1434@db03 -c token info
MSSQLand.exe LAB-SQL01@AdventureWorks -c token tables -n Customer
Соедините несколько SQL-серверов с помощью флага -l, используя точку с запятой (;) в качестве разделителя:
-l SQL01;SQL02/user;SQL03@database
Синтаксис:
;) - Разделяет серверы в цепочке/) - Указывает пользователя для олицетворения ("execute as login")
/user1/user2 выполняет последовательное олицетворение@) - Указывает контекст базы данных[...]) - Используются для защиты имени сервера от разделения нашими разделителямиПримеры:
# Simple chain
-l SQL01;SQL02;SQL03
# With impersonation and databases
-l SQL01/admin;SQL02;SQL03/manager@clients
# Cascading impersonation (impersonate user1, then user2 on SQL01)
-l SQL01/user1/user2;SQL02;SQL03
# Mixed cascading (SQL01: user1→user2, SQL03: user3→user4→user5)
-l SQL01/user1/user2;SQL02;SQL03/user3/user4/user5@database
# Server names can contain hyphens, dots (no brackets needed)
-l SQL-01;SERVER.001;HOST.DOMAIN.COM
# Brackets only needed if server name contains delimiter characters
-l [SERVER;PROD];SQL02;[SQL03@clients]@clientdb
[!NOTE] Указание порта (
:port) применяется только к начальному подключению к хосту. Цепочки связанных серверов (-l) используют имена связанных серверов, настроенные вsys.servers, а не комбинацииhostname:port.
Эти режимы не требуют аутентификации и работают до получения учётных данных.
Служба SQL Server Browser прослушивает UDP 1434 и отвечает на запросы обнаружения списком экземпляров SQL Server, работающих на хосте, включая их имена, версии и TCP-порты. Это полезно, когда на целевом сервере используются именованные экземпляры на динамических портах — не нужно гадать или сканировать.
# Query the SQL Browser service on a specific host (UDP 1434)
MSSQLand.exe LAB-SQL03 --browse
Active Directory предоставляет информацию о регистрации SQL Server через имена участников-служб (SPN), хранящиеся в учётных записях компьютеров и служб. MSSQLand выполняет запросы к AD через LDAP для SPN вида MSSQLSvc/*, чтобы перечислить экземпляры SQL Server в домене или во всём лесу через Глобальный каталог.
# Find SQL Servers in Active Directory via LDAP (current domain)
MSSQLand.exe --findsql
# Target a specific domain
MSSQLand.exe --findsql pgd.lab
# Forest-wide search via Global Catalog (port 3268)
MSSQLand.exe --findsql pgd.lab --gc
Обнаружение многоуровневое. Подробнее см. в FindSqlServers.cs.
Служба SQL Server Browser также отвечает на широковещательные UDP-пакеты через UDP 1434, что позволяет обнаружить все экземпляры SQL Server, рекламирующие себя в локальной подсети.
# Broadcast discovery on the local network (UDP 1434)
MSSQLand.exe --broadcast
MSSQLand.exe --broadcast --timeout 5
[!TIP] Это особенно полезно, когда SQL Server работает на машине, не входящей в домен, и поэтому не будет отображаться ни в одном LDAP- или SPN-запросе. Представьте изолированные серверы, машины разработчиков или нелегитимные экземпляры, развёрнутые во внутренней VLAN.