[hacking tricks] Including password in runas command line

Все пентестеры (и не только) эпизодически натыкаются на проблему, связанную с запуском локального процесса от имени другого пользователя из командной строки. К сожалению, поставляемая с виндой тулень  runas не спасает т.к. в ней отсутствует возможность передачи пароля в качестве аргумента. Такой способ:

C:\Windows\System32>

C:\Windows\System32> echo password | runas /u:user cmd


Увы, работал(ет) только на устаревших системах. Решение: использовать API функцию CreateProcessWithLogonW. Код ниже, бинарь тут (md5:424872148d3e84ed99cedd5bfbb8740c)

#include <windows.h>
#include <stdio.h>
#include <userenv.h>

void wmain(int argc, WCHAR *argv[])
{
    PROCESS_INFORMATION pi = {0};
    STARTUPINFO         si = {0};

    ZeroMemory( &si, sizeof(STARTUPINFO) );
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags |= STARTF_USESHOWWINDOW;
 si.wShowWindow = SW_HIDE;
    si.cb = sizeof(STARTUPINFO);
    
    if (argc < 4)
    {
        wprintf(L"Usage: %s [user@domain] [password] [cmd]", argv[0]);
        wprintf(L"\nExample: %s adm@my.domain pass \"cmd /c ipconfig >C:\\\\tempdir\\\\output.txt\"", argv[0]);
        return;
 }
        wprintf(L"Executed: %s", argv[3]);
  wprintf(L"\n\n");
    if (!CreateProcessWithLogonW(argv[1], NULL, argv[2], 
  LOGON_WITH_PROFILE, NULL, argv[3], 
        CREATE_UNICODE_ENVIRONMENT, NULL, NULL, 
            &si, &pi)) wprintf(L"error");

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}
C:\Temp>

C:\Temp>runas.exe
Usage: runas.exe [user@domain] [password] [cmd]
Example: runas.exe adm@my.domain pass "cmd /c ipconfig >C:\\tempdir\\output.txt"

C:\Temp>whoami
test\admin

C:\Temp>runas.exe abc@test.local abc "cmd /c whoami >C:\\Temp\\t.txt"
Executed: cmd /c whoami >C:\\Temp\\t.txt

C:\Temp>type t.txt
test\abc

C:\Temp>

1 комментарий :

  1. Уж не знаю почему, но у меня VC2013 потребовала приведения типов для &si, поэтому строчка стала выглядеть так:
    if (!CreateProcessWithLogonW(argv[1], NULL, argv[2], LOGON_WITH_PROFILE, NULL, argv[3], CREATE_UNICODE_ENVIRONMENT, NULL, NULL, (LPSTARTUPINFOW)&si, &pi)) wprintf(L"Error: %d\n", GetLastError() );
    else wprintf(L"Success!\n");

    Ну и диагностика не будет лишней, поэтому ошибку вывел.

    Вариант предлагаемый самими мелкомягкими тоже вполне работоспособен:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms682431%28v=vs.85%29.aspx

    Но приведенный Димой лично мне нравится больше. Спасибо!

    ОтветитьУдалить