第一个想法是我们在目标机器上不运行任何进程来等待连接,我们在TCP/IP协议栈里来创建一个函数来替代它。 无论何时一个特殊的udp或tcp包被接 受,内核将会检查这个包来确定是否是指定的特殊包。假如是的话, 内核将派生一个进程来执行命令。我们可以使用任何内核可以支持的协议包。
现在我们来实现它。在内核里, 每个协议在*inet_protocol_base 和*inet_protos[MAX_INET_PROTOS] hash注册自己。 当系统初始化时, 所有支持的协议会再 inet_protocol_base注册。他们被加到inet_protos的哈希表里。不管什么时候一个IP包达到时, 内核将检查这个哈希表,找相 应的处理函数和系统调用。我们就在这个点上进行hack。我们将用我们的处理函数来替换原始的协议的处理函数。因此,我们可以截获数据包并且分析它。假如 它是我们需要的, 我们将执行我们的命令。 假如不是,仅仅只需要调用原来的函数。
我们同时处理TCP和UDP的原因是假如那里有一些防火墙的话,UDP可能不能穿过。因此,我们只需要发一个源地址被伪造的数据包到目的机子。此外,对于TCP的数据包,它也不需要使用SYN位。事实上,现在我们的客户程序使用的是ACK的包。
第二个想法更使人感兴趣。 如果一台目标的机子上有个WEB的服务并且安了一个只允许WEB通信的防火墙,那么我们如何来穿过它呢? 我们能否得到一个交互的shell呢?答案是肯定的。方法如下:
____________ _________________________
| 攻击者 | | web server |
| | | 80 <=======> 53333 |
|__________| |_______________________|
| |
| |
|____________________________________|
1025 ==> 80 or 1025 <== 80
假设我们在web服务器上已经绑定了一个bind shell后门并且53333端口(可以利用第一个方法来完成) 现在我们需要把攻击者到web服务器上的流量从80端口重定向到53333端口, 从53333端口到攻击者的流量必须被改成80端口。
实现部分。改变接收的包是很容易的, 我们可以借用第一个LKM的思路- 无论何时我们都检查到来的tcp包如果必要我们修改它的目的端口。为了改变发出 的包, 这就有点困难了。 因为TCP/IP协议栈的实现涉及到Linux内核的一些底层的静态函数。它不太容易被置换(但是是可能的, 细节参见附 录)。 我们利用的是大部分发布时就被编译进内核中的防火墙。每个到来的包,转发的包, 或发出的包必须通过防火墙。并且防火墙函数是可以被动态地加载到 内核里的!我们利用系统导出函数register_firewall() 在系统防火墙规则之前插入我们自己的规则。假如我们发现一些来自于53333端 口的包, 我们可以自动改变它到80。
关于此实现的另外的细节是无论何时我们改变数据包, 我们必须去重新计算校验和。 更有趣的事情是我们可以在web服务器和其他一些机器上网络流量, 我们可以看到他们的不同之处,。 在其他机器上的sniffer看起来象普通的web流量, 但是在web服务器上的sniffer是一些无用的流量纪录。 具体细节参见附录。
现在我们谈一下如何来截获系统调用。为了隐藏入侵者的足迹, 文件, 进程,网络连接必须隐藏起来。 因为这些信息都是可以从特殊的系统调用里面获得的, 我们可以接获一些感兴趣的系统调用。
1. 隐藏文件。象这些命令如"ls", "du" 使用sys_getdents() 来获得目录信息。 所以LKM程序必须过滤这些输出来达到隐藏文件的目的。
2. 隐藏进程。在Linux的实现中,进程的信息被映射到/proc文件系统去了。我们的工作仍旧是捕获sys_getdents()调用在进程链表中标记为不可见。通常的手法是设置任务的信号标志位为一些未用的信号量,比如31就是一个例子。
3. 隐藏网络连接。 和隐藏进程相似, 在这个例子中我们是这去隐藏一些包括/proc/net/tcp和/proc/net/udp的文件。所以我们改变sys_read()。 无论何时读包含匹配字符串的这两个文件的时候, 系统调用将不会声明在使用它。
4. 重定向可执行文件。 有时候, 入侵者可能会需要替换系统的二进制文件, 象"login", 但不想改变原文件。他可以截获sys_execve()。因此, 无论何时系统尝试去执行"login"程序的时候, 它都会被重定向到入侵者给定的其他程序。
5. 隐藏sniffer。这儿我们指隐藏网络接口的杂拨模式。在这里我们要替换的是sys_ioctl()。
6. 和LKM通信。 黑客已经很好的安装了他的LKM。现在他需要告诉内核来隐藏其他文件。他该怎么做呢?我们知道从用户态切换到和心态通常是通过系统调用来进行的, 所以我们必须修改一些系统调用。
例如, 我们将截获sys_settimeofday()。当一个指定的参数被传递, 我们的系统调用将会为我们做一些适当的事情。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shenmilingyu/article-2373-2.html
你知道多少华人在美国服务吗
好多评论明显一看就是水军