
Набор инструментов C# для MS SQL, предназначенный для наступательной разведки и пост-эксплуатации.
SQLRecon — это набор инструментов Microsoft SQL Server, предназначенный для наступательной разведки и постэксплуатации. Подробную информацию о каждом методе можно найти в вики.
Вы можете скачать копию SQLRecon со страницы релизов. Кроме того, можете скомпилировать решение самостоятельно. Для этого достаточно склонировать репозиторий, дважды щелкнуть файл решения и выполнить сборку.
Рекомендации по предотвращению, обнаружению и смягчению последствий также предоставлены для всех защитников.
Ознакомьтесь с моей статьей на сайте IBM Security Intelligence. Если предпочитаете видео, то посмотрите мою презентацию на Black Hat.
Модули перечисления не требуют указания поставщика аутентификации. Эти модули должны передаваться в флаг модуля перечисления (/e:, /enum:). В вики есть подробности об использовании модулей перечисления.```
Info - Show information about the SQL server.
/h:, /host -> SQL server hostname or IP. Multiple hosts supported.
/port: -> (OPTIONAL) Defaults to 1434 (UDP).
/t:, timeout: -> (OPTIONAL) Defaults to 3s.
SqlSpns - Use the current user token to enumerate the AD domain for MSSQL SPNs. /d:, /domain: -> (OPTIONAL) NETBIOS name or FQDN of domain.
# Провайдеры аутентификации
SQLRecon поддерживает разнообразный набор провайдеров аутентификации (`/a:, /auth:`) для взаимодействия с Microsoft SQL Server.```
WinToken - Use the current users token to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP
WinDomain - Use AD credentials to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> NETBIOS name or FQDN of domain.
/u:, /username: -> Username for domain user.
/p:, /password: -> Password for domain user.
Local - Use local SQL credentials to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/u:, /username: -> Username for local SQL user.
/p:, /password: -> Password for local SQL user.
EntraID - Use Azure EntraID credentials to authenticate against the Azure SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> FQDN of domain (DOMAIN.COM).
/u:, /username: -> Username for domain user.
/p:, /password: -> Password for domain user.
AzureLocal - Use local SQL credentials to authenticate against the Azure SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/u:, /username: -> Username for local SQL user.
/p:, /password: -> Password for local SQL user.
Pth - Authenticate using an NT hash (pass-the-hash) over raw TDS/NTLM. Elevated privileges or SeImpersonate is not required.
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> NETBIOS domain name.
/u:, /username: -> Domain username.
/hash: -> NT hash (32 hex chars, 8846f7eaee8fb117ad06bdd830b7586c) or LM:NT format.
/h:, host:) обязателен и указывает один или несколько SQL-серверов. Чтобы выполнить модуль для нескольких SQL-серверов, перечислите хосты через запятую, например /h:SQL01,10.10.10.2,SQL03.master, однако это можно изменить, указав имя пользовательской базы данных через флаг database (/database:)./debug необязателен и отображает все SQL-запросы, выполняемые модулем, без их фактического выполнения на удалённых хостах. Пример можно найти в вики.1433 по умолчанию, однако это можно изменить с помощью флага /port:.3 секунды, однако это значение можно изменить, указав значение тайм-аута (/t:, /timeout:), которое соответствует количеству секунд до завершения попытки подключения.Обратите внимание, что поставщик аутентификации EntraID требует, чтобы на системе, с которой выполняется SQLRecon, существовала библиотека аутентификации Azure Active Directory (ADAL) или библиотека аутентификации Microsoft (MSAL). Это необходимо для функциональности аутентификации и авторизации Azure EntraID.
Модули SQL выполняются для одного или нескольких экземпляров Microsoft SQL Server. Эти модули необходимо передать через флаг модуля (/m:, /module:).
Флаг host (/h:, host:) обязателен и позволяет указать один или несколько SQL-серверов. Чтобы выполнить модуль для нескольких SQL-серверов, перечислите хосты через запятую, например /h:SQL01,10.10.10.2,SQL03.
В вики есть подробности об использовании каждого модуля, который поддерживает выполнение на одном или нескольких экземплярах SQL Server.
Модули имперсонации выполняются для одного или нескольких экземпляров Microsoft SQL Server в контексте имперсонированного пользователя SQL. Все модули имперсонации имеют следующие минимальные требования:
/i:, /iuser:)./m:, /module:).В вики есть подробности об использовании каждого модуля, который поддерживает выполнение с помощью Имперсонации.
Связанные модули выполняются на одном или нескольких экземплярах связанного Microsoft SQL Server. Все связанные модули имеют следующие минимальные требования:
/l:, /link:). Флаг link позволяет указать один или несколько связанных SQL-серверов. Например, если SQL01 имеет связь с SQL02, а SQL01 имеет связь с DB04, вы можете перечислить связанные хосты через запятую, и модуль будет выполнен на каждом связанном SQL-сервере, например /l:SQL02,DB04./m:, /module:).В вики есть подробности об использовании каждого модуля, который поддерживает выполнение на одном или нескольких экземплярах Связанного SQL-сервера.
Модули цепочки связанных серверов выполняются на конечном Microsoft SQL Server в цепочке связанных серверов. Все модули цепочки имеют следующие минимальные требования:
/l:, /link:. Если SQL01 имеет связь с SQL02, а SQL02 имеет связь с PAYMENTS01, и вы хотите выполнить модуль на PAYMENTS01, то аргумент будет /l:SQL02,PAYMENTS01./chain, чтобы выполнить модуль на конечном SQL-сервере в указанной цепочке./m:, /module:).В вики есть подробности об использовании каждого модуля, который поддерживает выполнение на конечном SQL-сервере, указанном в Цепочке связанных SQL-серверов.
SQLRecon имеет несколько модулей, которые могут помочь в переборе и атаке на Microsoft System Center Configuration Manager (SCCM) и Microsoft Endpoint Configuration Manager (ECM). Сервер SCCM или ECM должен предоставлять базу данных Microsoft SQL локально или удалённо.
Модули SCCM должны передаваться через флаг модуля SCCM (/s:, /sccm:).
Большинство модулей SCCM могут выполняться в контексте имперсонированного пользователя SQL (/i:, /iuser:).
В вики есть подробности об использовании каждого модуля для работы с базой данных SCCM/ECM.
Users выводит список всех пользователей в таблице RBAC_Admins. Это все пользователи, настроенные для какого-либо уровня доступа к SCCM.Sites выводит список всех других сайтов с данными, хранящимися в таблице DPInfo базы данных SCCM. Это может предоставить дополнительные векторы атаки, так как разные сайты могут быть настроены разными (небезопасными) способами.Logons запрашивает таблицу Computer_System_DATA для получения всех связанных клиентов SCCM вместе с пользователем, который последним вошёл в них. ПРИМЕЧАНИЕ: Это обновляется только раз в неделю по умолчанию и не будет на 100% актуальным. Используйте /option: как необязательный (не требуемый) аргумент для фильтрации клиентов SCCM.TaskList предоставляет список всех последовательностей задач, хранящихся в базе данных SCCM, но не обращается к фактическому содержимому данных задач.TaskData извлекает все последовательности задач, хранящиеся в базе данных SCCM, и расшифровывает их в открытый текст. Последовательности задач могут содержать учётные данные для присоединения систем к домену, сопоставления общих папок, выполнения команд и т.д.Credentials выводит список учётных данных, хранящихся в SCCM для использования в различных функциях. Эти учётные данные не могут быть удалённо расшифрованы, так как ключ хранится на сервере SCCM. Однако этот модуль предоставляет информацию о том, имеет ли смысл пытаться получить ключ.Если вы заинтересованы в расширении SQLRecon, пожалуйста, обратитесь к разделу о внесении вклада и расширении в вики.
Я призываю вас открыть задачу, если у вас есть какие-либо предложения или идеи.
Цель — постоянно улучшать SQLRecon. Ниже перечислены некоторые запланированные области исследований:
Следующие люди внесли прямой или косвенный вклад в различные аспекты SQLRecon.
/auth:pth). Реализована необработанная аутентификация TDS/NTLM через PTHTdsConnection, NtlmHelper и PthState, так что все модули работают без учётных данных в открытом виде или повышенных привилегий. Ключевые исправления включают параметры сеанса ANSI после входа, разбиение TDS на несколько пакетов, обработку взаимоблокировок TCP-потока для одновременных подключений CLR и совместимость с синтаксисом скобок OPENQUERY._linkedChainRpcQuerySystem.Byte[] никогда не преобразовывался и не выводился в консоль должным образом.credentialobjectss и proxies (jakxx).agentcmd (jakxx).role через цепочку (passthehashbrowns).impersonate через цепочку (passthehashbrowns).EnableRpc/DisableRpc через цепочки (passthehashbrowns).XpCmd через цепочки, теперь также поддерживается вывод (passthehashbrowns).EXEC AT, если они не заключены в скобки, что вызывает проблемы, если имя связанного сервера является IP-адресом или FQDN (passthehashbrowns).LinkedChainQuery создаёт новый массив с "0" в начале, а затем вызывает существующую логику в отдельной функции, теперь называемой LinkedChainQueryRecurse (passthehashbrowns).impersonate для правильной обработки случаев sysadmin (n3rada).scriptdata и cidata (G0ldenGunSec).auditstatus для проверки, включён ли аудит SQL (chryzsh).whoami (JBalanza).adsi, когда сервер LDAP не нужно было добавлять в базу данных msdb; также теперь созданная функция правильно удаляется./host или /h, с использованием разделения запятыми./link или /l, с использованием разделения запятыми./lhost на /link.s' и создан переключатель /s, /sccm для модулей SCCM.DecryptCredentials./enum) под названием info, который может использовать неаутентифицированный контекст для получения информации о сервере SQL, включая имя экземпляра и TCP-порт, с помощью протокола UDP.adsi не удаляло LDAP-сервер.adsi в пользу openquery/rpc./lhost на /adsi в модуле adsi./rhost на /unc в модуле smb.CaptureHash.cs, логика упрощена.SetEnumerationType.cs, логика упрощена.Impersonation.cs переименован в Impersonate.cs.OleCmdExec.cs переименован в .smb.info.info.rows, iRows и lRows.sLogons — добавлен необязательный фильтр.xp_cmdshell не выводили результат выполнения команды в консоль.SetEnumerationType.cs.domain переименован в SqlSpns.SetAuthenticationType.cs на новый метод EvaluateAuthenticationType.CreateSqlConnectionObject в SetAuthenticationType.cs, который расширяет поддержку нескольких одновременных объектов подключения к SQL.ADSI.cs, реализующий атаки на учётные данные ADSI, как описано здесь.adsi, iAdsi и lAdsi.lLinks и iLinks.ExecuteImpersonationQuery и ExecuteImpersonationCustomQuery.Impersonate.cs.checkRpc.iCheckRpc.lCheckRpc.EnableDisable.cs переименован в ConfigureOptions.cs.ExecuteLinkedCustomQueryRpcExec.PrintUtils.cs, реализующий класс для стандартизированного вывода.TablePrinter перемещён из Help.cs в PrintUtils.cs.PrintUtils.querysearchtableslColumnslQuerylSearchlTablesiColumnsAzure на AzureAD.AzureLocal.disableRpc.enableRpc.iEnableRpc.iDisableRpc.lEnableRpc.lDisableRpc.lAgentCmd.clr, iClr и lClr путём использования SqlCommand.ExecuteNonQuery при создании хранимой процедуры.lClr, когда не удалялись созданные сборки или хранимые процедуры.columns.iColumns.iDatabases.iSearch.iTables.lColumns.lSearch.ExecuteLinkedCustomQueryRpcExec.x.Random.cs перемещён в каталог utilities.Windows на WinToken.WinDomain, использующая доменные имя пользователя и пароль AD для аутентификации через олицетворение. См. Impersonation.cs.ArgumentLogic.cs, SQLAuthentication.cs и ModuleHandler.cs.ModuleHandler.cs больше не использует громоздкий if/else if/else для выполнения модулей. Вместо этого теперь используется рефлексия для вызова методов, соответствующих именам команд модулей.commands, содержащий глобальные переменные, используемые во всей программе.SQLAuthentication.cs.Program.cs в ArgumentLogic.cs.sccm.roles, iRoles и lRoles.users, iUsers и lUsers.sp_drop_trusted_assembly в модулях clr и iClr.lAgentCmd.lClr.info.Local и Azure.-e domain).-r в режимы аутентификации Windows и Local, чтобы можно было указать нестандартные TCP-порты.Environment.Exit из TestAuthentication.cs.AgentJobs.cs.agentStatus.iAgentStatus.lAgentStatus.agentCmd.iAgentCmd.clr.iEnableClr.iDisableClr.iClr.iWhoami.iMapped.iRoles.lEnableRpc.lDisableRpc.lWhoami.lEnableXp.lDisableXp.lEnableOle.lDisableOle.lSmb.lWhoami.lRoles.oldCmd.iOleCmd.lDatabases.lTables./v, /verbose| Имя модуля | Описание | Имперсонация | Выполнение через связанный сервер | Цепное выполнение | Требует привилегированный контекст |
|---|
AuditStatus | Проверить, включён ли аудит SQL. | ✅ | ✅ | ✅ | ❎ |
CheckRpc | Получить список связанных серверов и их статус RPC. | ✅ | ✅ | ✅ | ❎ |
Databases | Отобразить все базы данных. | ✅ | ✅ | ✅ | ❎ |
Impersonate | Перечислить учётные записи, которые можно имперсонировать. | ✅ | ✅ | ✅ | ❎ |
Info | Показать информацию о SQL-сервере. | ✅ | ✅ | ✅ | ❎ |
Links | Перечислить связанные SQL-серверы. | ✅ | ✅ | ✅ | ❎ |
Users | Отобразить, какие учётные записи и группы могут проходить аутентификацию в базе данных. | ✅ | ✅ | ✅ | ❎ |
Whoami | Отобразить ваши привилегии. | ✅ | ✅ | ✅ | ❎ |
Query /c:QUERY | Выполнить SQL-запрос. | ✅ | ✅ | ✅ | ❎ |
Smb /unc:UNC_PATH | Захватить хэш NetNTLMv2. | ✅ | ✅ | ✅ | ❎ |
Columns /db:DATABASE /table:TABLE | Отобразить все столбцы в указанной базе данных и таблице. | ✅ | ✅ | ✅ | ❎ |
Rows /db:DATABASE /table:TABLE | Отобразить количество строк в указанной таблице базы данных. | ✅ | ✅ | ✅ | ❎ |
Search /keyword:KEYWORD | Поиск имён столбцов в указанной таблице базы данных, к которой вы подключены. | ✅ | ✅ | ✅ | ❎ |
Tables /db:DATABASE | Отобразить все таблицы в указанной базе данных. | ✅ | ✅ | ✅ | ❎ |
EnableRpc /rhost:LINKED_HOST | Включить RPC и RPC out на связанном сервере. | ✅ | ❌ | ❌ | ✔️ |
EnableClr | Включить интеграцию CLR. | ✅ | ✅ | ✅ | ✔️ |
EnableOle | Включить процедуры автоматизации OLE. | ✅ | ✅ | ✅ | ✔️ |
EnableXp | Включить xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
DisableRpc /rhost:LINKED_HOST | Отключить RPC и RPC out на связанном сервере. | ✅ | ❌ | ❌ | ✔️ |
DisableClr | Отключить интеграцию CLR. | ✅ | ✅ | ✅ | ✔️ |
DisableOle | Отключить процедуры автоматизации OLE. | ✅ | ✅ | ✅ | ✔️ |
DisableXp | Отключить xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
AgentStatus | Отобразить, запущен ли агент SQL, и получить задания агента. | ✅ | ✅ | ✅ | ✔️ |
AgentCmd /c:COMMAND /subsystem:(OPTIONAL) /proxy:(OPTIONAL) | Выполнить системную команду, используя задания агента. Опционально укажите подсистему с помощью /subsystem:, по умолчанию 'PowerShell'. Опционально укажите учётную запись прокси агента SQL с помощью /proxy:. | ✅ | ✅ | ✅ | ✔️ |
Adsi /adsi:SERVER_NAME /lport:LOCAL_PORT | Получить учётные данные ADSI в открытом виде со связанного сервера ADSI. | ✅ | ✅ | ✅ | ✔️ |
Clr /dll:DLL /function:FUNCTION | Загрузить и выполнить сборку .NET в пользовательской хранимой процедуре. | ✅ | ✅ | ✅ | ✔️ |
CredentialObjects | Получить объекты учётных данных из sys.credentials. | ✅ | ✅ | ✅ | ✔️ |
OleCmd /c:COMMAND /subsystem:(OPTIONAL) | Выполнить системную команду, используя процедуры автоматизации OLE. | ✅ | ✅ | ✅ | ✔️ |
Proxies | Получить информацию о прокси агента SQL. | ✅ | ✅ | ✅ | ✔️ |
XpCmd /c:COMMAND | Выполнить системную команду, используя xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
| Имя модуля | Описание | Имперсонация | Требует привилегированный контекст |
|---|
Users | Отобразить всех пользователей SCCM. | ✅ | ❎ |
Sites | Отобразить все другие сайты с хранящимися данными. | ✅ | ❎ |
Logons | Отобразить все связанные клиенты SCCM и последнего вошедшего пользователя. | ✅ | ❎ |
Credentials | Отобразить зашифрованные учётные данные, хранящиеся в SCCM. | ✅ | ❎ |
TaskList | Отобразить все последовательности задач, но не обращаться к содержимому данных задач. | ✅ | ❎ |
TaskData | Расшифровать все последовательности задач в открытый текст. | ✅ | ❎ |
DecryptCredentials | Расшифровать большой двоичный объект учётных данных SCCM. Должен выполняться в процессе с высоким уровнем целостности или SYSTEM на сервере SCCM. | ❌ | ✔️ |
AddAdmin /user:DOMAIN\USERNAME /sid:SID | Повысить указанную учётную запись до 'Full Administrator' в SCCM. | ✅ | ✔️ |
RemoveAdmin /user:ADMIN_ID /remove:STRING | Удалить привилегии пользователя или полностью удалить пользователя из базы данных SCCM. | ✅ | ✔️ |
ScriptData | Возвращает все скрипты, настроенные для запуска в SCCM. | ✅ | ✔️ |
CIData | Возвращает все CI, настроенные для запуска скриптов в SCCM. | ✅ | ✔️ |
DecryptCredentials пытается расшифровать извлечённые большие двоичные объекты учётных данных SCCM. Этот модуль должен запускаться в процессе с высоким уровнем целостности или SYSTEM на сервере SCCM.AddAdmin повышает указанную учётную запись до 'Full Administrator' в SCCM. Если целевой пользователь уже является пользователем SCCM, этот модуль вместо этого добавит необходимые привилегии для повышения. Укажите два аргумента: либо /user:current /sid:current, если вы хотите добавить пользователя, который в данный момент выполняет процесс SQLRecon, как 'Full Administrator' в SCCM. Если вы хотите добавить другого пользователя как 'Full Administrator' в SCCM, укажите его доменное имя пользователя и полный SID: /user:DOMAIN\USERNAME /sid:S-1-5-.... Этот модуль требует привилегий sysadmin или аналогичных, так как требуется запись в таблицы базы данных SCCM.RemoveAdmin удаляет привилегии пользователя, полностью удаляя недавно добавленного пользователя из базы данных SCCM. Если пользователь уже существовал в каком-либо качестве, этот модуль просто удаляет три роли, которые были добавлены учётной записи через записи в таблице разрешений. Используйте аргументы, предоставленные выводом команды sAddAdmin, для запуска этой команды. Этот модуль требует привилегий sysadmin или аналогичных, так как требуется запись в таблицы базы данных SCCM.ModuleHandler.cs для упрощения и расширяемости.Queries.cs.EnumerationModules.cs.FormatQuery.cs.SccmModules.cs.ModuleHandler.cs переименован в SqlModules.cs.OleAutomation.csPrintUtils.cs переименован в Print.cs.SQLServerInfo.cs переименован в Info.cs.iQueryiSearchauthentication.Help.cs преобразован из метода в конструктор.CaptureHash.cs преобразован из метода в конструктор.Impersonate.cs преобразован из метода в конструктор.lEnableClr.lDisableClr.lXpCmd.lXpOle.Random.cs.EnableDisable.cs.clr.ole.mapped и roles объединены в whoami.lMapped и lRoles объединены в lWhoami.iMapped и iRoles объединены в iWhoami.