4.1 击败系统管理员的LKM的方法
这一部分会给我们对付一些使用LKM保护内核的多疑(好的)的管理员的方法。在解释了任何系统管理员能够使用的方法之后,很难为我们(hackers)找到一个更好的办法。我们需要离开LKM一会儿,来寻找击败这些困难的保护的方法。
假定一个系统能够被管理员安装上一个十分好的大范围的监控的LKM,他能够检查那个系统的每一个细节。他能够做到第二或第三部分提到的任何事情。
第一种除掉这些LKM的方法能够是重新启动系统。也许管理员并没有在启动文档里面加载这些LKM。因此,试一些DoS攻击或其他的。假如您还不能除去这个LKM就看看其他的一些重要文档。但是要仔细,一些文档有可能是被保护或监控的(见附录A,里面有一个类似的LKM)。
假如您真的很难找到LKM是在那里加载的等等,不要忘记系统是已安装了一个后门的。这样您就不能够隐藏文档或进程了。但是假如一个管理员真正使用了这么一个终极的LKM,忘记这个系统吧。您可能碰到真正的好的对手并且将会有麻烦。对于那些确实想击败这个系统的,读第二小节。
4.2 修补整个内核-或创建Hacker-OS
[注意:这一节听上去可能有一些离题了。但是在最后我会给出一个很漂亮的想法(Silvio
Cesare写的程式也能够帮助我们使用我们的LKM。这一节只会给出整个内核问题的一个大概的想法,因为我只需要跟随Sivio Cesare的想法]
OK,LKM是很好的。但是假如系统管理员喜欢在5。1中提到的想法。他做了很多来阻止我们使用我们在第二部分学到的美妙的LKM技术。他甚至修补他自己的内核来使他的系统安全。他使用一个无需LKM支持的内核。
因此,现在到了我们使用我们最后一招的时候了:运行时内核补丁。最基本的想法来自我发现的一些源程式(比如说Kmemthief),更有Silvio
Cesare的一个描述如何改变内核符号的论文。在我看来,这种攻击是一种很强大的'内核入侵'。我并不是懂得每一个Un*x,但是这种方法能够在很多系统上使用。这一节描述的是运行时内核补丁。但是为什么不谈谈内核文档补丁呢?每一个系统有一个文档来代表内核,在免费的系统中,像FreeBSD, Linux,。。。。,改变一个内核文档是很容易的。但是在商业系统中呢?我从来没有试过。但是我想这会是很有趣的:想象通过一个内核的补丁作为系统的后门.您只好重新启动系统或等待一次启动。(每个系统都需要启动)。但是这个教材只会处理运行时的补丁方式。您也许说这个教材叫入侵Linux可卸载内核模块,并且您不想知道如何补丁整个内核。好的,这一节将会教会我们如何'insmod'LKM到一个十分安全的,或没有LKM支持的系统。因此我们还是学到了一些和LKM有关的东西了。
因此,让我们开始我们最为重要的必须处理的东西,假如我们想学习RKP(Runtime Kernel Patching)的话。这就是/dev/kmem文档。他能够帮助我们看到(并且更改)整个我们的系统的虚拟内存。[注意:这个RKP方法在通常情况下是十分有用的,假如您控制了那个系统以后。只有很不安全的系统才会让普通用户存取那个文档]。
正如我所说的, /dev/kmem能够使我们有机会看到我们系统中的每一个内存字节(包括swap)。这意味着我们能够存取整个内存,这就允许我们操纵内存中的每一个内核元素。(因为内核只是加载到系统内存的目标代码)。记住/proc/ksyms文档记录了每一个输出的内核符号的地址。因此我们知道如何才能通过更改内存来控制一些内核符号。下面让我们来看看一个很早就知道的很基本的例子。下面的(用户空间)的程式获得了task_structure的地址和某一个 PID.在搜索了代表某个PID的任务结构以后,他改变了每个用户的ID域使得UID=0。当然,今天这样的程式是毫无用处的。因为绝大多数的系统不会允许一个普通的用户去读取/dev/kmem。但是这是个关于RKP的好的介绍。
/*注意:我没有实现错误检查*/
#include
#include
#include
#include
/*我们想要改变的任务结构的最大数目*/
#define NR_TASKS 512
/*我们的任务结构-〉我只使用了我们需要的那部分*/
struct task_struct {
char a[108]; /*我们无需的*/
int pid;
char b[168]; /*我们无需的*/
unsigned short uid,euid,suid,fsuid;
unsigned short gid,egid,sgid,fsgid;
char c[700]; /*我们无需的*/
};
/*下面是原始的任务结构,您能够看看更有其他的什么是您能够改变的
struct task_struct {
volatile long state;
long counter;
long priority;
unsigned long signal;
unsigned long blocked;
unsigned long flags;
int errno;
long debugreg[8];
struct exec_domain *exec_domain;
struct linux_binfmt *binfmt;
struct task_struct *next_task, *prev_task;
struct task_struct *next_run, *prev_run;
unsigned long saved_kernel_stack;
unsigned long kernel_stack_page;
int exit_code, exit_signal;
unsigned long personality;
int dumpable:1;
int did_exec:1;
int pid;
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



