在服务器端口重定向后门研究

关键提示:000,一位朋友问了我上一期的端口无关问题,据说在下面的图中,在Intranet环境中,防火墙只允许Web服务器的80端口建立网络连接,Web服务器上的80端口已经存在…

0times;00

前段时间,有位朋友问我一个问题:没有端口,据说在内网环境下,防火墙只允许80个Web服务器端口建立网络连接,IIS、Apache等软件占用了Web服务器上的80个端口,以及如何构建一个后门。





0times;01

早期的byshell,著名的后门程序,考虑到的问题,并用一个非常令人沮丧的方式来解决它。客户端发送数据到端口80,服务器打开IIS进程和循环通过IIS进程整个内存查找数据标记。很显然,在效率和稳定性方面,这方法是不可取的。我不认为这种方法作为这里的一个方法。

过去,人们提出了一种端口多路复用的方法来建立后门。此方法使用setsockopt()API,用于在MSDN上设置插座。在api中,原型如下所示。



Int setsockopt(
插座的,
智力水平,
国际optname,
const char * optval远,
国际optlen
);

在这里,我们只关心它的第三个参数,这是用来设置套接字的状态。这个参数值so_reuseaddr,通过MSDN这个参数的解释如下。



该so_reuseaddr套接字选项的状态决定是否本地传输地址,插座必定总是与其他插座共享。此套接字选项只适用于侦听套接字、数据报套接字和面向连接的套接字。





那就是,当这第三个参数的值设置为so_reuseaddr,套接字的端口可以共享和重用,共享与后来居上的参数建立后的具体细节,插座来获取数据。这种方法是目前有效的Apache和IIS5.0及以下版本。为什么不是IIS6.0及以上然后作出解释。

0times;02

通过逆转和咨询的开放源代码的,我们可以知道,Apache和IIS5.0使用应用层的IOCP模型进行交流。虽然框架相当复杂,但我们仍然在应用层创建套接字。您在这里有什么新的想法吗是的,我想我能想到利用远程线程注入DLL API钩子,例如WSARecv()、WSASend()、API来获取套接字和异步IO缓冲区的指针,然后用getpeername()函数来比较客户信息,然后利用Socket IO。

或者你也可以用一种更简单、更粗鲁的方式直接用SPI安装一个LSP,你可以得到数据,但又很难进行通信。在应用层中建立socket通信过程的方法总结如下图表,红线表示可以使用的地方。







可能会有一些学生在这里问,你为什么不直接去后门这是考虑这个问题在理论上从ring0层很容易。我们可以使用TDI或NDIS过滤驱动所有IO卡直接过滤流量,但是写一个如此重量级的后门,有杀死Yan Yong Jae斩波手段。此外,你还可以使用SSDT HOOK和IRP钩由TCP解决问题。但为什么不这么做呢因为现在使用的驱动程序不是Windows木马编程的趋势。

0times;03

你还记得上述问题在IIS6.0早及以上版本这里出现了一个新问题。从IIS6.0,微软可能会考虑到安全性和稳定性以及数据处理的效率。它封装了网络通信的过程在ring0层,并使用HTTP.SYS直接驱动网络。如下图。

因此,应用层没有套接字,我们不能用上面的方法来解决问题,那我该怎么办呢是否有利用应用层的地方那不是极客的风格,然后,对初始扭转W3WP.exe后,发现有些地方可以使用。





在这个过程中,HTTP请求的程序不能处理由W3WP.exe过程处理。考虑到HTTP请求,我认为以下几点可以转移到网络通信过程。

1.get或后会在硬盘访问的文件,它有可能是通过应用层(CreateFile)、ReadFile(),和WriteFile()。(API钩子)

2。对于HTTP的大部分内容,标准字符串处理函数不能使用ANSI字符串解析的协议吗(或者API钩子)

三.对ASP、PHP和JSP脚本的解释可能需要提交给解释引擎完成的数据。

0times;04

基于以上几点,我也做了验证。OllyDbg是不为附加调试的低特权进程的稳定和经常脱落的好。所以我换了一个很丑的WinDbg。微软自己的调试自己的程序是非常稳定的。首先,BP()CreateFileW(),得到了一个惊喜的效果。如图所示。









WinDbg挡住了CreateFileW(),在第一个参数中,我们看到了我们提交的fuckyou1234这里可以用如果(wcsncmp,S1(l,fuckyou1234,11)把后门命令。

我还发现了一个地方,我可以利用多个字符串处理函数的BP。例如,在wcsstr断点()函数成功地抓住了饼干和一些其他的HTTP协议的相关信息。饼干可以提交比URL更多的内容,可以绕过一些日志和过滤。如如下图所示。





这是前两个问题相反的初步结果。至于第三个问题,这就是一个好的。现在有一个新的问题,至少我们可以不让他去W3WP.exe,低特权的过程中,当你需要执行的命令,那么他怎么能在一个高度特权进程进行我们如何将结果返回给客户机呢

0times;05

在这里我想离开宿主进程,设置事件对象和邮件槽或管道接受w3wp.exe.as发送回客户端的数据命令,我们可以把CreateFileW()的第一个参数,他将指向管道或硬盘上的一个输出文件或当然后ReadFile()当我们能够顺利的执行结果反馈给客户端去。

这涉及到一个高权限和低权限进程通信的问题。以高权限进程创建内核对象的安全属性必须设置为低权威successable处理,并设置安全描述符和DACL,内核对象,如事件、邮件槽和管道可以使用低特权进程打开。具体代码如下。最后,我上面提到的内容写下面的后门。



处理seccreateeventport(wchar * sznameevent)
{
security_descriptor secdescriptor = { 0 };
security_attributes securityattributes = { 0 };
如果(InitializeSecurityDescriptor(secdescriptor,security_descriptor_revision)= false)
返回invalid_handle_value;
如果(SetSecurityDescriptorDacl(secdescriptor,真的,空、假)= = 0)
返回invalid_handle_value;
securityattributes.binherithandle =真;
securityattributes.lpsecuritydescriptor = secdescriptor;
securityattributes.nlength = sizeof(security_attributes);
CreateEvent(securityattributes回报,真的,假的,sznameevent);
}