欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年Linux操作系统下的高级隐藏技术详解.docx

    • 资源ID:12795512       资源大小:28.96KB        全文页数:5页
    • 资源格式: DOCX        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年Linux操作系统下的高级隐藏技术详解.docx

    精品学习资源本文深化分析了Linux环境下文件、进程及模块的高级隐匿技术,其中包括:Linux可卸载模块编程技术、修改内存映象直接对系统调用进行修改技术,通过虚拟文件系统proc隐匿特定进程的技术;隐匿技术在运算机系统安全中应用特别广泛,特别是在网络攻击中,当攻击者胜利侵入一个系统后,有效隐匿攻击者的文件、进程及其加载的模块变得尤为重要;本文将争论Linux系统中文件、进程及模块的高级隐匿技术,这些技术有的已经被广泛应用到各种后门或安全检测程序之中,而有一些就刚刚起步,仍旧处在争论阶段,应用很少; 1. 隐匿技术 1.1.Linux下的中断掌握及系统调用Intelx86系列微机支持 256种中断,为了使处理器比较简单地识别每种中断源,把它们从0256编号,即给予一个中断类型码n,Intel把它称作中断向量; Linux用一个中断向量 <128或者 0x80 ) 来实现系统调用,全部的系统调用都通过唯独的入口system_call来进入内核,当用户动 态进程执行一条int 0x80汇编指令时, CPU 就切换到内核态,并开头执行system_call函数, system_call函数再通过系统调用表sys_call_table来取得相应系统调用的地址进行执行;系统调用表sys_call_table中存放 所 有 系 统 调 用 函 数 的 地 址 , 每 个 地 址 可 以 用 系 统 调 用 号 来 进 行 索 引 , 例 如sys_call_tableNR_fork索引到的就是系统调用sys_fork<)的地址; Linux用中断描述符 <8字节)来表示每个中断的相关信息,其格式如下:偏移量 31.16一些标志、类型码及保留位段挑选符偏移量 15.0全部的中断描述符 存放在一片连续的地址空间中,这个连续的地址空间称作中断描述符表<IDT),其起始地址存放在中断描述符表寄存器<IDTR)中,其格式如下:32位基址值界限其中各个结构的相应联系可以如下表示:通过上面的说明可以得出通过IDTR寄存器来找到 system_call函数地址的方法:依据IDTR寄存器找到中断描述符表,中断描述符表的第 0x80项即是 system_call函数的地址,这个地址将在后面的争论中应用到;1.2.Linux的 LKM< 可装载内核模块)技术为了使内核保持较小的体积并能够便利的进行功能扩展, Linux系统供应了模块机制;模块是内核的一部分,但并没有被编译进内 核,它们被编译成目标文件,在运行过程中依据需要动态的插入内核或者从内核中移除;由于模块在插入后是作为Linux内核的一部分来运行的,所以模块编程实际上就是内核编程,因此可以在模块中使用一些由内核导出的资源,例如Linux2.4.18版以前的内核导出系统调用表 <sys_call_table)的地址,这样就可以依据该地址直接修改系统调用的入口, 从而转变系统调用;在模块编程中必需存在初始化函数及清除函数,一般情形下,这两个函数默认为init_module>以及clearup_module>,从 2.3.13内核版本开头,用户也可以给这两个函数重新命名,初始化函数在模块被插入系统时调用,在其中可以进行一些函数及符号的注册工作,清除函数就在模块移除系统时进行调用,一些复原工作通常在该函数中完成;1.3.Linux下的内存映像 /dev/kmem是一个字符设备,是运算机主存的映像,通过它可以测试甚至修改系统,当内核不导出sys_call_table地址或者不答应插入模块时可以通过该映像修改系统调用,从而实现隐匿文件、进程或者模块的目的;1.4.proc文件系统 proc文件系统是一个虚拟的文件系统,它通过文件系统的接口实现,用于输出系统运行状态;它以文件系统的形式,为操作系统本身和应用进程之间的通信供应了一个界面,使应用程序能够安全、 便利地获得系统当前的运行状况何内核的内部数据信息,并可以修改某些系统的配置信息;由于 proc以文件系统的接口实现,因此可以象拜访一般文件一样拜访它,但它只存在于 内存之中2. 技术分析2.1隐匿文件Linux系统中用来查询文件信息的系统调用是sys_getdents,这一点可以通过strace来观看到,例如stracels 将列出命令 ls 用到的系统调用,从中可以发觉ls 是通过 sys_getedents来执行操作的;当查询文件或者目录欢迎下载精品学习资源的相关信息时,Linux系统用sys_getedents来执行相应的查询操作,并把得到的信息传递给用户空间运行的程序,所以假如修改该系统调用,去掉结果中与某些特定文件的相关信息,那么全部利用该系统调 用的程序将看不见该文件,从而达到了隐匿的目的;第一介绍一下原先的系统调用,其原 型为: int sys_getdentsunsigned int fd, struct dirent *dirp,unsigned int count>其中 fd 为指向目录文件的文件描述符,该函数依据fd 所指向的目录文件读取相应dirent结构,并放入 dirp中,其中 count为 dirp中返回的数据量,正确时该函数返回值为填充到 dirp 的 字 节 数 ; 下 图 是 修 改 后 的 系 统 调 用 hacked_getdents 执 行 流 程 ;hacked_getdents 函数实际上就是先调用原先的系统调用,然后从得到的 dirent 结构中去除与特定文件名相关的文件信息,从而应用程序从该系统调用返回后将看不到该文件的存在; 应当留意的是,一些较新的版本中是通过 sys_getdents64 来查询文件信息的, 但其实现原理与 sys_getdents 基本相同,所以在这些版本中仍旧可以用与上面类似的方法来修改该系统调用,隐匿文件;2.2隐匿模块上面分析了如何修改系统调用以隐匿特定名字的文件,在实际的处理中,常常会用模块来达到修改系统调用的目的,但是当插入一个模块时,如不实行任何隐匿措施,很简单被对方发觉,一旦对方发觉并卸载了所插入的模块,那么全部利用该模块来隐匿的文件就暴露了,所以应连续分析如何来隐匿特定名字的模块;Linux中用来查询模块信息的系统调用是sys_query_module,所以可以通过修改该系 统调用达到隐匿特定模块的目的;第一说明一下原先的系统调用,原先系统调用的原型为:int sys_query_moduleconst char *name, int which, void *buf, size_t bufsize ,size_t*ret>假如参数 name不空,就拜访特定的模块,否就拜访的是内核模块, 参数 which说明查询的类型,当which=QM_MODULES时,返回全部当前已插入的模块名称,存入 buff, 并且在 ret中存放模块的个数, buffsize是 buf缓冲区的大小;在模块隐匿的过程中只需要对which=QM_MODULES的情形进行处理就可以达到目的;修改后的系统调用工作过程如下:1 )调用原先的系统调用,出错就返回错误代码;2 )假如which不等于 QM_MODULES,就不需要处理,直接返回;3 )从 buf的开头位置进行处理,假如存在特定的名字,就将后面的模块名称向前掩盖该名字;4 )重复 3 ),直处处理处理完全部的名字,正确返回;2.3隐匿进程在 Linux中不存在直接查询进程信息的 系统调用,类似于ps 这样查询进程信息的命令是通过查询proc文件系统来实现的,在背景学问中已经介绍过proc文件系统,由于它应用文件系统的接口实现,因此同样可以用隐 藏 文 件 的 方 法 来 隐 藏 proc文 件 系 统 中 的 文 件 , 只 需 要 在 上 面 的hacked_getdents中 加 入 对 于proc文 件 系 统 的 判 断 即 可 ; 由 于proc是特别的文件系统,只存在于内存之中,不存在于任何实际设备之上,所以Linux 内 核 分 配 给 它 一 个 特 定 的 主 设 备 号 0以 及 一 个 特 定 的 次 设 备 号1 ,除此之外,由于在外存上没有与之对应的i 节点 , 所以系统也安排给它一个特别的节点号 PROC_ROOT_INO<值为 1 ),而设备上的1 号索引节点是保留不用的;通过上面的分析,可以得出判定一个文件是否属于proc文件系统的方法:1 )得到该文件对应的inode结 构 dinode;2) ifdinode->i_ino=PROC_ROOT_INO&&.MAJORdinode->i_dev>&&MINORdinode->i_dev>=1> 该文件属于proc文件系统 通过上面的分析,给出隐匿特定进程的伪代码表示:hacket_getdentsunsignedintfd,structdirent*dirp,unsignedintcount>调用原先的系统调用;得到 fd所对应的节点; if 该文件属于 proc文件系统&& 该文件名需要隐匿 > 从 dirp中去掉该文件相关信息2.4修改系统调用的方法现在已经解决了如何修改系统调用来达到隐匿的目的,那么如何用修改后的系统调用来替欢迎下载精品学习资源换原先的呢?这个问题在实际应用中往往是最关键的,下面将争论在不同的情形下如何做到这一点; 1> 当系统导出sys_call_table,并且支持动态的插入模块的情形下:在Linux内核 2.4.18版以前,这种内核配置是特别普遍的;这种情形下修改系统调用特别 简单,只需要修改相应的sys_call_table表项,使其指向新的系统调用即可;下面是相应的代码: intorig_getdentsunsignedintfd,structdirent*dirp,unsignedint count>intinit_modulevoid>/*初始化模块*/orig_getdents=sys_call_tableSYS_getdents; /保 存 原 来 的 系 统 调 用orig_query_module=sys_call_tableSYS_query_module sys_call_tableSYS_getdents=hacked_getdents; /设 置 新 的 系 统 调 用sys_call_tableSYS_query_module=hacked_query_module; return 0; /返回0表 示 成 功voidcleanup_modulevoid>/*卸 载 模 块 */sys_call_tableSYS_getdents=orig_getdents; /恢 复 原 来 的 系 统 调 用sys_call_tableSYS_query_module=orig_query_module;2>在系统并不导出 sys_call_table的 情 况 下 : linux内 核 在 2.4.18以 后 为 了 安 全 起 见 不 再 导 出sys_call_table符号,从而无法直接获得系统调用表的地址,那么就必需找到其他的方法来得到这个地址;在背景学问中提到了/dev/kmem是系统主存的映像,可以通过查询该文件来找到sys_call_table的地址,并对其进行修改,来使用新的系统调用;那么如何在系统映像中找到sys_call_table的地址呢?让我们先看看system_call的源代码是如何来实现系统调用的< 代码见 /arch/i386/kernel/entry.S): ENTRYsystem_call> pushl%eax#saveorig_eaxSAVE_ALLGET_CURRENT%ebx>cmpl$NR_syscalls>,%eaxjaebadsystestb$0x02,tsk_ptrace%ebx># PT_TRACESYS jne tracesys call *SYMBOL_NAMEsys_call_table>,%eax,4>movl%eax,EAX%esp>#savethereturnvalueENTRYret_from_sys_call>这段源代码第一储存相应的寄存器的值,然后判定系统调用号< 在 eax寄存器中)是否合法 , 继 而 对 设 置 调 试 的 情 况 进 行 处 理 , 在 所 有 这 些 进 行 完 后 , 利 用 call*SYMBOL_NAMEsys_call_table>,%eax,4>来转入相应的系统调用进行处理,其中 的 SYMBOL_NAMEsys_call_table>得出的就是 sys_call_table的地址;从上面的分析可以看出,当找到system_call函数之后,利用字符匹配来查找相应call语句就可以确定sys_call_table的位置,因为call something,%eax,4>的机器指令码是0xff0x14 0x85 ;所以匹配这个指令码就行了;至于如何确定system_call的地址在背景学问中已经介绍了,下面给出相应的伪代码:struct /各字段含义可以参考背景学问中关于IDTR寄存 器的介绍unsignedshortlimit;unsignedint base ; attributepacked>>idtr; struct/各字段含义可以参考背景学问中 关于中断描述符的介绍unsignedshortoff1 ;unsignedshortsel ;unsigned char none,flags; unsigned short off2; attributepacked>>idt; intkmem ; / * 下面函数用于从 kemem 对应的文件中偏移量为 off 处读取 sz 个字节至内存 m 处*/ void readkmemvoid*m,unsigned off,int sz> /* 下面函数用于 从 src 读 取 count 个 字 节 至 dest 处 */ void weitekmemvoid*src,void*dest,unsignedintcount> . unsignedsct ;/ 用来存放 sys_call_table地址 charbuff100; / 用于存放system_call函数的前100个字节; char*p ;ifkmem=open“ /dev/kmem” ,O_RDONLY>> <0> return 1; asm “ sidt %0” “ :=m ” idtr>>; /读 取idtr寄 存 器 的 值 至idtr结 构 中readkmem&idt,idtr.base+8*0x80,sizeofidt>>/将 0x80描述符读至 idt结构中欢迎下载精品学习资源sys_call_off=idt.off2<<16>idt.off1;/得 到 system_call函 数 的 地 址 ;readkmembuff,sys_call_off,100>/读取 system_call函数的前 100字节至buff p=char*>memmembuff,100,” xffx14x85” ,3>;/ 得到 call语句对应机器码的地 址 sct=unsigned*>p+3>/得到sys_call_table的地址;至此已经得到了sys_call_table在内存中的位置,这样在依据系统调用号就能够找到相应的系统调用对应的 地 址 , 修 改 该 地 址 就 可 以 使 用 新 的 系 统 调 函 数 , 具 体 的 做 法 如 下 :readkmem&orig_getdents,sct+SYS_getdents*4,4>/保 存 原 来 的 系 统 调 用readkmem&orig_query_module,sct+SYS_query_module*4,4>;writekmemhacked_getdents,sct+SYS_getdents*4,4>; / 设 置 新 的 系 统 调 用writekmemhacket_query_module,sct+SYS_query_module*4,4>; 2.5 其他的相关技术 上面已经完全解决了隐匿的相关技术问题,在实际应用中,可以把启动模块或者进程的代码做成脚本加入到相应的启动目录中, 假设你的 Linux运行级别为 3 ,就可以加到目录 rc3.d中< 该目录常存在于 /etc/rc.d或者 /etc目录下),然后把该脚本的名 字改为可以隐匿的名字;另一种方法就是在一些启动脚本中加入启动你的模块或者进程的代码,但这样比较简单被发觉,一个解决思路就是进程或模块启动以后立刻复原正常的脚本,由于系统关机时会向全部进程发送SIGHUP信号,可以在进程或模块中处理该信号, 使该信号发生时修改启动脚本,重新加入启动模块的代码,这样当系统下次启动时又可以加载这个的模块了,而且治理员观看启动脚本时也不会发觉反常;3. 终止语本文对Linux环境下的一些高级隐匿技术进行了分析争论,其中所涉及的技术不仅可以用在系统安全方面,在其他方面也有重要的借鉴意义;由于Linux的开放特性,使得攻击者一旦获得了 root权限就能够对系统进行较多的修改,所以防止第一次被入侵是至关重要的;欢迎下载

    注意事项

    本文(2022年Linux操作系统下的高级隐藏技术详解.docx)为本站会员(C****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开