首页 > 编程知识 正文

unix管道线(shell中管道)

时间:2023-05-04 20:15:08 阅读:102153 作者:3625

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

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

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

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

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

00-101010

原理

相信大家对socket相关的API都很熟悉。下面简单介绍一下创建TCP服务器程序的函数调用过程,如下所示:

WSAStartup()-socket()-bind()-listen()-accept()-send()/recv()-closesocket()-WSACleanup().

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

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

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

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

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

LpPipeAttributes是一个指向SECURITY_ATTRIBUTES结构的指针,该结构决定了返回的句柄是否可以被子进程继承。如果lpPipeAttributes为空,则无法继承句柄。我们会让它在这里传承下去。SECURITY_ATTRIBUTES结构相对简单。您可以自行查阅MSDN设置。

NSize指定管道的缓冲区大小,以字节为单位。大小合适。

一个建议;系统使用值来计算一个适当的缓冲机制。如果此参数为零,则系统使用默认缓冲区大小。这里我们赋值为0即可。

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

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

新建进程

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

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

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

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

编码实现

创建套接字:

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

创建管道:

创建子进程CMD:

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

测试效果

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

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

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

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

总结

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

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。