createprocess失败(createprocess失败代码14001怎么解决)

张工 2022-05-15 19:22:55 阅读:221
  

基于管道实现简单的shell后门

  最近在分析恶意代码的过程中,遇到了一个基于管道的后门,于是学习了基于管道的shell后门的原理,自己写了一个简单的shell后门。分享给大家交流。如有错误,请指出。声明:此内容仅供分析恶意代码时参考。请自觉遵守相关法律,严禁将相关技术用于任何非法目的。否则,承担后果。

原理

  这个实现是一个正壳。被告充当服务器,本地监听一个端口,黑客充当客户端,通过网络进行连接。整个原理如下图所示:

基于管道实现简单的shell后门

  黑客通过网络收发数据,这里的箭头表示数据流向。首先通过网络套接字将数据从hacker传到被告的缓冲区,然后通过一个管道对缓冲区进行写操作,CMD程序从管道的另一端进行读取,并作为CMD程序的输入。

  CMD程序执行结果后,将输出写入另一个管道,缓冲区从管道的另一端读取输出,然后通过网络套接字发送给黑客。

  其中CMD程序通过CreateProcess的函数API调用,设置时可以自行指定程序的输入输出。

相关API

  

socket相关

  关于socket相关的API,相信大家都很熟悉。这里,我们将简单介绍创建TCP服务器程序的函数调用过程如下:

  wsa startup()-socket()-bind()-listen()-accept()-send()/recv()-close socket()-WSACleanup().

  首先使用WSAStartup()初始化Winsock库,然后调用WSACleanup()释放Winsock库。然后用socket()创建一个套接字,用完后调用closesocket()关闭套接字。对于WSAStartup()/WSACleanup()和socket()/closesocket()这样的函数,最好是写完一个再写一个,以免忘记。一旦创建了套接字,就可以使用bind()、listen()、accept()、send()和recv()。在为bind()函数指定地址和端口时,它还涉及sockaddr_in结构和htons函数,后者将主机字节顺序转换为网络字节顺序。这些都是固定流程,这里就不赘述了。

管道相关操作

  管道是进程间的通信技术,可分为命名管道和匿名管道。匿名管道只能实现本地机器上两个进程之间的通信,常用于父进程与子进程之间的数据传输。我们可以在这里使用匿名管道,因为匿名管道比命名管道相对简单。

  首先,需要CreatePipe()来创建管道。该功能的定义如下:

基于管道实现简单的shell后门

  HReadPipe指向用于接收管道读取句柄的变量;

  HWritePipe指向用于接收管道写句柄的变量;

  LpPipeAttributes指向一个指向SECURITY_ATTRIBUTES结构的指针,该指针决定返回的句柄是否可以被子进程继承。如果lpPipeAttributes为NULL,则不能继承句柄。在这里,我们将使它可以继承。SECURITY_ATTRIBUTES结构很简单,您可以自己检查MSDN设置。

  NSize指定管道的缓冲区大小,以字节为单位。大小只是一个建议;使用系统值计算适当的缓冲机制。如果该参数为零,系统将使用默认的缓冲区大小。我们可以在这里赋值0。

  要在管道中读取或写入数据,只需直接调用ReadFile和WriteFile。在读取数据之前,可以调用PeekNamePipe()来查看管道中是否有数据。其定义如下:

86" alt="基于管道实现简单的shell后门" >

  

hNamedPipe这个参数可以是一个命名管道实例的句柄,也可以是可以是一个匿名管道的读取端的句柄。其他参数详情可以查阅MSDN。

新建进程

相信大家对CreateProcess都不陌生,这里简单回顾一下,函数定义如下:

基于管道实现简单的shell后门

  

在这里需要重点关注的是,设置lpStartupInfo结构体中的内容。该结构体如下:

基于管道实现简单的shell后门

  

重点是需要将hStdInput、hStdOutput、hStdError进行设置。设置为对应管道的读写句柄。

在本例中,hStdInput为管道1的读句柄,hStdOutput、hStdError都设置为管道2的写句柄。

编码实现

创建套接字:

基于管道实现简单的shell后门

  

这里监听的端口时888,任意IP地址都可连接。

创建管道:

基于管道实现简单的shell后门

  

创建子进程CMD:

基于管道实现简单的shell后门

  

设置死循环不断的通过ReadFile()读取管道中的内容,即CMD程序的执行结果,通过send()发送给hacker。然后不断的通过recv()接收hacker发来的指令,通过WriteFile()写入管道传递给CMD程序。

基于管道实现简单的shell后门

  

测试效果

hacker与buffer之间,不要直接用telnet,只能一次传送一个字符。要通过netcat.exe发送数据:

先在被控端主机上运行,888端口已经监听:

基于管道实现简单的shell后门

  

在另外一台主机上使用nc连接:

基于管道实现简单的shell后门

  

连接成功后输入dir,发现目录已经发现改变,从D:\hacker变成了D:\受害者,列出的文件也是受害者主机上的,说明我们已经能够成功在受害者的CMD程序执行命令了。

总结

总的来说,这次实验用到了管道和socket等技术,重点在于处理好整个逻辑过程,这些Windows的API相对都不难。

本文由0xC2原创发布
转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/258286
安全客 - 有思想的安全新媒体

二维码