
Набор инструментов 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.
/h:, host:) является обязательным и позволяет указать один или несколько SQL-серверов. Если вы хотите выполнить модуль на нескольких SQL-серверах, разделите узлы запятыми, например /h:SQL01,10.10.10.2,SQL03.master, однако это можно изменить, указав собственное имя базы данных через флаг database (/database:)./debug необязателен и отображает все SQL-запросы, которые выполняются модулем, без их фактического выполнения на удалённом(ых) узле(ах). Пример можно найти в wiki.1433, однако это можно изменить с помощью флага /port:.3 секунды, однако это значение можно изменить, указав значение тайм-аута (/t:, /timeout:), которое соответствует количеству секунд до завершения попытки подключения.Обратите внимание, что поставщик аутентификации EntraID требует, чтобы на системе, с которой выполняется SQLRecon, присутствовала библиотека аутентификации Azure Active Directory (ADAL) или библиотека аутентификации Microsoft (MSAL). Это необходимо для функциональности аутентификации и авторизации Azure EntraID.
Модули SQL выполняются на одном или нескольких экземплярах Microsoft SQL Server. Эти модули должны передаваться через флаг module (/m:, /module:).
Флаг host (/h:, host:) является обязательным и позволяет указать один или несколько SQL-серверов. Если вы хотите выполнить модуль на нескольких SQL-серверах, разделите узлы запятыми, например /h:SQL01,10.10.10.2,SQL03.
В wiki есть подробные сведения об использовании каждого модуля, поддерживающего выполнение на одном или нескольких экземплярах SQL Server.
Модули олицетворения выполняются на одном или нескольких экземплярах Microsoft SQL Server в контексте олицетворённого пользователя SQL. Все модули олицетворения имеют следующие минимальные требования:
/i:, /iuser:)./m:, /module:).В wiki есть подробные сведения об использовании каждого модуля, поддерживающего выполнение с помощью олицетворения.
Связанные модули выполняются на одном или нескольких экземплярах связанного Microsoft SQL Server. Все связанные модули имеют следующие минимальные требования:
/l:, /link:). Флаг link позволяет указать один или несколько связанных SQL-серверов. Например, если SQL01 имеет связь с SQL02, а SQL01 имеет связь с DB04, можно разделить связанные узлы запятыми, и модуль будет выполнен на каждом связанном SQL-сервере, например /l:SQL02,DB04./m:, /module:).В wiki есть подробные сведения об использовании каждого модуля, поддерживающего выполнение на одном или нескольких экземплярах связанного SQL Server.
Модули цепочки связанных серверов выполняются на конечном Microsoft SQL Server в цепочке связанных серверов. Все модули цепочки связанных серверов имеют следующие минимальные требования:
/l:, /link: должна быть указана цепочка связанных SQL-серверов. Если SQL01 имеет связь с SQL02, а SQL02 имеет связь с PAYMENTS01, и вы хотите выполнить модуль на PAYMENTS01, аргумент будет таким: /l:SQL02,PAYMENTS01./chain./m:, /module:).В wiki есть подробные сведения об использовании каждого модуля, поддерживающего выполнение на конечном 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:).
В wiki есть подробные сведения об использовании каждого модуля против базы данных 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, обратитесь к разделу о вкладе и расширении в wiki.
Я призываю вас открыть issue, если у вас есть какие-либо предложения или идеи.
Цель — постоянно улучшать SQLRecon. Ниже перечислены некоторые запланированные области исследований:
Следующие люди внесли прямой или косвенный вклад в различные аспекты SQLRecon.
whoami (JBalanza).adsi, из-за которой сервер LDAP не нужно было добавлять в базу данных msdb; также создаваемая функция теперь корректно удаляется.SQL01 имеет связь с SQL02, SQL02 имеет связь с SQL03, а SQL03 имеет связь с PAYMENTS01. Теперь можно выполнять команды из SQL01 на PAYMENTS01, используя цепочку связанных серверов (/link:SQL02,SQL03,PAYMENTS01 /chain). Заслуга Azaël Martin (n3rada).l' и 'i', и добавлена логика контекста, чтобы имена модулей могли быть одинаковыми для стандартного, олицетворённого, связанного и цепочечного выполнения./debug), которая отображает различную отладочную информацию и все SQL-запросы, которые будут выполнены модулем, без их выполнения./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.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.lDisbleRpc.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.iDisbleClr.iClr.iWhoami.iMapped.iRoles.lEnableRpc.lDisableRpc.lWhoai.lEnableXp.lDisableXp.lEnableOle.lDisableOle.lSmb.lWhoami.lRoles.oldCmd.iOleCmd.lDatabases.lTables./v, /verbose необязателен и отображает все SQL-запросы, которые модуль выполняет перед их выполнением на удалённом(ых) узле(ах). Пример можно найти в wiki.| Имя модуля | Описание | Олицетворение | Выполнение на связанном сервере | Выполнение в цепочке связанных серверов | Требуется привилегированный контекст |
|---|
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 на связанном сервере. | ✅ | ❌ | ❌ | ✔️ |
EnableClr | Включить интеграцию CLR. | ✅ | ✅ | ✅ | ✔️ |
EnableOle | Включить процедуры автоматизации OLE. | ✅ | ✅ | ✅ | ✔️ |
EnableXp | Включить xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
DisableRpc /rhost:LINKED_HOST | Отключить RPC и исходящий RPC на связанном сервере. | ✅ | ❌ | ❌ | ✔️ |
DisableClr | Отключить интеграцию CLR. | ✅ | ✅ | ✅ | ✔️ |
DisableOle | Отключить процедуры автоматизации OLE. | ✅ | ✅ | ✅ | ✔️ |
DisableXp | Отключить xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
AgentStatus | Отобразить, запущен ли агент SQL, и получить задания агента. | ✅ | ✅ | ✅ | ✔️ |
AgentCmd /c:COMMAND | Выполнить системную команду с помощью заданий агента. | ✅ | ✅ | ✅ | ✔️ |
Adsi /adsi:SERVER_NAME /lport:LOCAL_PORT | Получить учётные данные ADSI в открытом виде с связанного сервера ADSI. | ✅ | ✅ | ✅ | ✔️ |
Clr /dll:DLL /function:FUNCTION | Загрузить и выполнить сборку .NET в пользовательской хранимой процедуре. | ✅ | ✅ | ✅ | ✔️ |
OleCmd /c:COMMAND /subsystem:(OPTIONAL) | Выполнить системную команду с помощью процедур автоматизации OLE. | ✅ | ✅ | ✅ | ✔️ |
XpCmd /c:COMMAND | Выполнить системную команду с помощью xp_cmdshell. | ✅ | ✅ | ✅ | ✔️ |
| Имя модуля | Описание | Олицетворение | Требуется привилегированный контекст |
|---|
Users | Отобразить всех пользователей SCCM. | ✅ | ❎ |
Sites | Отобразить все остальные сайты с сохранёнными данными. | ✅ | ❎ |
Logons | Отобразить все связанные клиенты SCCM и последнего вошедшего пользователя. | ✅ | ❎ |
Credentials | Отобразить зашифрованные учётные данные, хранящиеся в SCCM. | ✅ | ❎ |
TaskList | Отобразить все последовательности задач, но не обращаться к содержимому данных задач. | ✅ | ❎ |
TaskData | Расшифровать все последовательности задач в открытый текст. | ✅ | ❎ |
DecryptCredentials | Расшифровать большой двоичный объект (blob) учётных данных SCCM. Должен выполняться в процессе с высоким уровнем целостности или SYSTEM на сервере SCCM. | ❌ | ✔️ |
AddAdmin /user:DOMAIN\USERNAME /sid:SID | Повысить указанную учётную запись до уровня «Полный администратор» в SCCM. | ✅ | ✔️ |
RemoveAdmin /user:ADMIN_ID /remove:STRING | Удаляет привилегии пользователя или полностью удаляет пользователя из базы данных SCCM. | ✅ | ✔️ |
DecryptCredentials пытается расшифровать восстановленные большие двоичные объекты (blob) учётных данных SCCM. Этот модуль должен запускаться в процессе с высоким уровнем целостности или SYSTEM на сервере SCCM.AddAdmin повышает указанную учётную запись до уровня «Полный администратор» в SCCM. Если целевой пользователь уже является пользователем SCCM, этот модуль вместо этого добавит необходимые привилегии для повышения. Укажите два аргумента: либо /user:current /sid:current, если вы хотите добавить пользователя, который в данный момент выполняет процесс SQLRecon, как «Полного администратора» в SCCM. Если вы хотите добавить другого пользователя как «Полного администратора» в SCCM, укажите его доменное имя пользователя и полный SID /user:DOMAIN\USERNAME /sid:S-1-5-.... Этот модуль требует привилегий sysadmin или аналогичных, так как требуется запись в таблицы базы данных SCCM.RemoveAdmin удаляет привилегии пользователя, полностью удаляя недавно добавленного пользователя из базы данных SCCM. Если пользователь уже существовал в каком-либо качестве, этот модуль просто удаляет три роли, которые были добавлены учётной записи через записи в таблицу разрешений. Используйте аргументы, предоставленные выводом команды sAddAdmin, для выполнения этой команды. Этот модуль требует привилегий sysadmin или аналогичных, так как требуется запись в таблицы базы данных SCCM./verbose, /v), который отображает все SQL-запросы, выполняемые во время выполнения модуля./timeout, /t), который принимает целочисленное значение тайм-аута подключения к базе данных SQL Server.links: добавлена подробная информация. Заслуга Azaël Martin (n3rada).whoami: добавлены субъекты Windows и пользователи базы данных. Заслуга Azaël Martin (n3rada).impersonation: добавлены субъекты Windows и пользователи базы данных. Заслуга Azaël Martin (n3rada).sqlspns. Заслуга Azaël Martin (n3rada)./enum:info./subsystem в модуль olecmdexec, который принимает выполнение с использованием подсистем автоматизации OLE CmdExec или PowerShell.AzureAD на EntraID.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.