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

Странный и недокументированный способ запуска программы

smelly__vx

RAID-массив
Пользователь
Регистрация
14.02.2021
Сообщения
77
Решения
1
Реакции
109
Я использую переводчик. Надеюсь, это хороший переводчик) Я гость и иностранец. Это моя попытка быть вежливым. Пожалуйста, извините за любые ошибки.

Я изучал различные методы запуска программы. Все используют одни и те же методы, поэтому давайте попробуем что-то другое.

Я решил использовать IWshShell. IWshShell используется Visual Basic для запуска программ. Этот объект можно инициализировать на C++ для использования интерфейса Visual Basic. Это плохо документировано. Есть некоторая документация по нему 1990-х годов, но она плохая.

Вот мой код для проверки концепции. Его можно улучшить, другие перечисленные методы мне еще предстоит разработать. Я все еще экспериментирую с CreateShortcut, RegDelete, RegWrite, RegRead и ExpandEnvironmentVariables. Все перечисленные функции работают, но обеспечение их работоспособности в C++ может оказаться неприятным.

Хорошего дня =D

C++:
#include <Windows.h>
#include <objidl.h>
#include <Propvarutil.h>

DWORD Win32FromHResult(_In_ HRESULT Result)
{
    if ((Result & 0xFFFF0000) == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, 0))
        return HRESULT_CODE(Result);

    if (Result == S_OK)
        return ERROR_SUCCESS;

    return ERROR_CAN_NOT_COMPLETE;
}

struct __declspec(uuid("{f935dc21-1cf0-11d0-adb9-00c04fd58a0b}"))
    IWshShell : public IUnknown {
    virtual PVOID __stdcall CreateShortcut(PWCHAR) = 0;
    virtual PWCHAR __stdcall ExpandEnvironmentString(PWCHAR) = 0;
    virtual INT64 __stdcall Popup(PWCHAR, PVOID, PVOID) = 0;
    virtual VOID __stdcall RegDelete(PWCHAR) = 0;
    virtual HRESULT __stdcall RegRead(_In_ BSTR FullRegistryPath, _Out_ VARIANT* AllocatedReadValue) = 0;
    virtual VOID __stdcall RegWrite(PWCHAR, PVOID, PVOID) = 0;
    virtual DWORD __stdcall Run(_In_ BSTR BinaryPath, _In_opt_ VARIANT* WindowStyle, _In_opt_ VARIANT* WaitOnReturn, _Out_ PDWORD ExitCode) = 0;
};

INT main(VOID)
{
    IWshShell* Shell = NULL;
    HRESULT Result = S_OK;
    GUID Clsid, Iid;
    VARIANT wWindowStyle, wWaitOnReturn;
    BSTR Payload = NULL;
    BOOL bFlag = FALSE;
    DWORD dwReturn = ERROR_SUCCESS;
    DWORD dwExitCode = ERROR_SUCCESS;

    wWaitOnReturn.vt = VT_EMPTY;
    wWindowStyle.vt = VT_EMPTY;

    Result = CLSIDFromString(L"{72C24DD5-D70A-438B-8A42-98424B88AFB8}", &Clsid);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = CLSIDFromString(L"{f935dc21-1cf0-11d0-adb9-00c04fd58a0b}", &Iid);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = CoCreateInstance(Clsid, NULL, CLSCTX_ALL, Iid, (PVOID*)&Shell);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Payload = SysAllocString(L"C:\\Windows\\System32\\calc.exe");
    if(Payload == NULL)
        goto EXIT_ROUTINE;

    if (Shell->Run(Payload, &wWindowStyle, &wWaitOnReturn, &dwExitCode) != ERROR_SUCCESS)
        goto EXIT_ROUTINE;

    bFlag = TRUE;

EXIT_ROUTINE:

    if (!bFlag)
        dwReturn = Win32FromHResult(Result);

    if (Payload)
        SysFreeString(Payload);

    CoUninitialize();

    return dwReturn;
}
 
You can type in english too, it's okay cos most people here know english and those who don't may use a translator themselves instead. =)
Or you could provide 2 variants for those who know english and for those who don't so we can see if there were any errors during translation.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Well, I think it doesn't really matter if you run stuff with IWshShell, as the executable would still be run by your own process (correct me if I'm wrong about it). Basically it would look the same from EDR perspective. You can use ShellWindows or ShellBrowserWindow to run executables with explorer process, like it is done here, but locally: https://github.com/EmpireProject/Em...odule_source/lateral_movement/Invoke-DCOM.ps1
 


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