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

Запуск задачи планировщика в Windows

varwar

El Diff
Забанен
Регистрация
12.11.2020
Сообщения
1 383
Решения
5
Реакции
1 537
Пожалуйста, обратите внимание, что пользователь заблокирован
В C:\Windows\system32\Tasks есть задача со следующими правами для пользователя redacted.

Код:
C:\Windows\System32\Tasks>icacls <redacted_task>
redacted NT AUTHORITY\SYSTEM:(R)
              BUILTIN\Administrators:(I)(R,W,D,WDAC,WO)
              NT AUTHORITY\SYSTEM:(I)(R,W,D,WDAC,WO)
              redacted\redacted:(I)(F)

Почему запуская от этого пользователя задачу программно или с помощью schtasks.exe я получаю Access Denied, несмотря на то, что имею все привилегии?
Задача запускается от администратора без проблем.

Код:
C:\Windows\System32\Tasks>schtasks.exe /Run /TN "redacted_task"
ERROR: Access is denied.
 
С какими триггерами создаётся задача? Помнится ловил схожее поведение при создании таска с триггером TASK_TRIGGER_LOGON, с триггером TASK_TRIGGER_TIME всё заработало корректно.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
авер стоит на хосте, если да то какой? и какая ОСь?
Windows 11. Стандартный Windows Defender.
С какими триггерами создаётся задача?
Задачу создавал через сам планировщик с триггером "At logon of any user", программно только производится запуск.

C++:
#include <windows.h>
#include <taskschd.h>
#include <stdio.h>
#include <comutil.h>

#pragma comment(lib, "taskschd.lib")
#pragma comment(lib, "comsupp.lib")

int main() {
    HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hr)) {
        wprintf(L"Failed to initialize COM library: 0x%08X\n", hr);
        return 1;
    }

    if (FAILED(hr))
    {
        printf("CoInitializeSecurity failed\n");
        return 1;
    }

    ITaskService *pService = NULL;
    hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (void**)&pService);
    if (FAILED(hr)) {
        wprintf(L"Failed to create an instance of Task Scheduler: 0x%08X\n", hr);
        CoUninitialize();
        return 1;
    }

    // Task Scheduler
    hr = pService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());
    if (FAILED(hr)) {
        wprintf(L"Failed to connect to Task Scheduler: 0x%08X\n", hr);
        pService->Release();
        CoUninitialize();
        return 1;
    }

    ITaskFolder *pRootFolder = NULL;
    hr = pService->GetFolder(_bstr_t(L"\\"), &pRootFolder);
    if (FAILED(hr)) {
        wprintf(L"Failed to get root folder: 0x%08X\n", hr);
        pService->Release();
        CoUninitialize();
        return 1;
    }

    IRegisteredTask *pTask = NULL;
    hr = pRootFolder->GetTask(_bstr_t(L"<redacted>"), &pTask);
    if (FAILED(hr)) {
        wprintf(L"Failed to get the task: 0x%08X\n", hr);
        pRootFolder->Release();
        pService->Release();
        CoUninitialize();
        return 1;
    }

    hr = pTask->Run(_variant_t(), NULL);
    if (FAILED(hr)) {
        wprintf(L"Failed to run the task: 0x%08X\n", hr);
        pTask->Release();
        pRootFolder->Release();
        pService->Release();
        CoUninitialize();
        return 1;
    }

    pTask->Release();
    pRootFolder->Release();
    pService->Release();
    CoUninitialize();

    wprintf(L"Task started successfully.\n");

    return 0;
}


с триггером TASK_TRIGGER_TIME всё заработало
Т.е. я могу указать любое время и принудительно смогу запускать не под админом?
 
Извиняюсь за говнокод, на Си не писал несколько лет. Как-то так:

C:
#include <windows.h>
#include <stdio.h>
#include <taskschd.h>
#include <comutil.h>

#pragma comment(lib, "taskschd.lib")
#pragma comment(lib, "comsupp.lib")

#define TASK_NAME (BSTR)L"TestTask"

HRESULT CreateTask(LPCWSTR path)
{
    HRESULT hRes = S_OK;
    ITaskService* taskService = nullptr;
    VARIANT emptyVar{ 0 };
    ITaskFolder* taskFolder = nullptr;
    ITaskDefinition* taskDef = nullptr;
    IActionCollection* actions = nullptr;
    ITriggerCollection* triggers = nullptr;
    IRegisteredTask* task = nullptr;

    do
    {
        hRes = CoCreateInstance(CLSID_TaskScheduler, nullptr, CLSCTX_INPROC_SERVER, IID_ITaskService, (LPVOID*)&taskService);
        if (FAILED(hRes)) break;

        hRes = taskService->Connect(emptyVar, emptyVar, emptyVar, emptyVar);
        if (FAILED(hRes)) break;

        hRes = taskService->GetFolder((BSTR)L"\\", &taskFolder);
        if (FAILED(hRes)) break;

        hRes = taskService->NewTask(0, &taskDef);
        if (FAILED(hRes)) break;

        hRes = taskDef->get_Actions(&actions);
        if (SUCCEEDED(hRes))
        {
            IAction* action = nullptr;
            hRes = actions->Create(TASK_ACTION_EXEC, &action);
            if (SUCCEEDED(hRes))
            {
                IExecAction* execAction = nullptr;
                hRes = action->QueryInterface(IID_IExecAction, (void**)&execAction);
                if (SUCCEEDED(hRes))
                {
                    hRes = execAction->put_Path((BSTR)path);
                    execAction->Release();
                }
                action->Release();
            }
            actions->Release();
        }

        hRes = taskDef->get_Triggers(&triggers);
        if (SUCCEEDED(hRes))
        {
            ITrigger* trigger = nullptr;
            hRes = triggers->Create(TASK_TRIGGER_LOGON, &trigger);
            if (SUCCEEDED(hRes))
            {
                ILogonTrigger* logonTrigger = nullptr;
                hRes = trigger->QueryInterface(IID_ILogonTrigger, (void**)&logonTrigger);
                if (SUCCEEDED(hRes))
                {
                    hRes = logonTrigger->put_Id((BSTR)L"Default");
                    hRes = logonTrigger->put_UserId((BSTR)L"DESKTOP-4DBGLPT\\dev");
                    logonTrigger->Release();
                }
                trigger->Release();
            }
            triggers->Release();
        }

        hRes = taskFolder->RegisterTaskDefinition(TASK_NAME, taskDef, TASK_CREATE_OR_UPDATE, emptyVar, emptyVar, TASK_LOGON_INTERACTIVE_TOKEN, emptyVar, &task);
    } while (FALSE);

    if (taskService) taskService->Release();
    if (taskFolder) taskFolder->Release();
    if (taskDef) taskDef->Release();
    if (task) task->Release();

    return hRes;
}

HRESULT RunTask()
{
    HRESULT hRes = S_OK;
    ITaskService* taskService = nullptr;
    VARIANT emptyVar{ 0 };
    ITaskFolder* taskFolder = nullptr;
    IRegisteredTask* task = nullptr;
    do
    {
        hRes = CoCreateInstance(CLSID_TaskScheduler, nullptr, CLSCTX_INPROC_SERVER, IID_ITaskService, (LPVOID*)&taskService);
        if (FAILED(hRes)) break;

        hRes = taskService->Connect(emptyVar, emptyVar, emptyVar, emptyVar);
        if (FAILED(hRes)) break;

        hRes = taskService->GetFolder((BSTR)L"\\", &taskFolder);
        if (FAILED(hRes)) break;

        hRes = taskFolder->GetTask((BSTR)L"TestTask", &task);
        if (FAILED(hRes)) break;

        hRes = task->Run(emptyVar, nullptr);
        if (FAILED(hRes)) break;
    } while (FALSE);

    if (taskService) taskService->Release();
    if (taskFolder) taskFolder->Release();
    if (task) task->Release();

    return hRes;
}

int main()
{
    HRESULT hRes = S_OK;
    do
    {
        hRes = CoInitializeEx(0, COINIT_MULTITHREADED);
        if (FAILED(hRes)) {
            wprintf(L"CoInitializeEx: 0x%08X\n", hRes);
            break;
        }
        hRes = CreateTask(L"C:\\Windows\\System32\\cmd.exe");
        if (FAILED(hRes)) {
            wprintf(L"CreateTask: 0x%08X\n", hRes);
            break;
        }
        hRes = RunTask();
        if (FAILED(hRes)) {
            wprintf(L"RunTask: 0x%08X\n", hRes);
            break;
        }
    } while (FALSE);
    CoUninitialize();
    return 0;
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Т.е. я могу указать любое время и принудительно смогу запускать не под админом?
Здесь обсуждалось https://xss.pro/threads/44892/
 
Run as trusted installer I believe
 


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