首页 > 技术文章 > 20144306免考_如何在可执行文件中手动植入后门

cathy-h 2017-06-01 11:16 原文

原文:https://www.exploit-db.com/docs/42061.pdf 

免责声明:纯手工翻译,谢谢,本文仅限教学,偷鸡摸狗的后果自负。

免考1  课程总结

 word文档+xmind脑图

 

 

免考2  如何在可执行文件中手动植入后门

  前言

   本文介绍了如何木马化正常的可执行文件,选择了一种管理员常用到的系统文件作为植入后门的对象,通过反汇编,对可执行文件的执行流程进行控制,劫持正常的语句进行跳转。主要针对于相对虚拟地址的计算,因此可以有效抵制地址随机化给植入后门带来的困难。操作环境是win7sp1x86以及kali2,主用用到的软件下文第一章表格里已经列出,本文通过三种方法来实现后门植入,且可以有效避开杀软,在不对木马化的正常可执行文件进行免杀操作时,查杀率都可以达到2/39。

  目录

   第一章:介绍

   什么是后门?

   实验环境搭建

   PE结构介绍

   代码洞code caves介绍

   地址空间随机化介绍

   RVA介绍

   第二章:典型的手动植入后门过程

   第三章:利用代码洞植入后门过程

   第四章:加入人为触发因素植入后门过程

---------------------------------------------------------------------------------------------------------------------------------------

  第一章:介绍

  • 什么是后门?

     在本文中,“后门”植入指的是让看似无害的可执行文件(即PE文件,portable executive)执行恶意的载荷的一种技术,这个有效载荷可以任何东西,从启动calc.exe到添加一个用户帐户再到生成一个远程shell,我们可以叫它shellcode。

     尽管绕过杀软并不是本文的重点,但是本文也会通过迭代分析这种后门植入手段在绕过杀毒软件方面的有效性。其实这已经是个老生常谈的话题了,但是没人关注如何对付ASLR(地址随机化)以及已有代码洞(code cave)的利用,但是我有~~

     Josh Pitts的后门工厂是一个几乎吊炸天的工具,它可以自动地通过后门执行一系列可执行程序。感谢他让我变成了老司机。但是,不要依赖它,因为手动实现后门才是王道~

     问题一:你为啥要搞后门?你是不是有毒?

     或许。骗你啦,你没看免责声明吗?

     问题二:你喜欢走后门吗?

     冷漠...

      问题三:好啦,好啦,什么是后门植入的最佳目标呢?

      由于我们希望可执行文件最终创建反弹型(或者绑定型)shell,所以当网络通信生成或者被请求添加防火墙准入事项时,用户不会感到可疑。此时,后门的最佳目标可以是NetCat、ssh/telnet客户端等等。

     另一种目标可以是破解软件。当有人想白嫖某个有趣但是死贵的游戏时,他们可能会下载一个带着补丁的“破解”版本。他们对这类文件比较信任,认为游戏破解版除了不需要付费意外,并不会有其他可疑行为,哦呵呵呵呵。

     PsExec(系统内部工具的一种)将被用于我们的后门范例。我有一万个理由告诉你为什么用 PsExec;它被系统管理员广泛使用。该工具的确有网络流量,也会与其他机器通信。它本身的目的是加载和执行二进制文件,这样当创建一个反弹型(或者绑定型)shell,它看起来就不那么可疑了。有趣的是,Sophos(一款杀软)将PsExec打为恶意软件(什么鬼?),因此我们不会将Sophos杀软的检测结果考虑在内。

     问题四:本文有什么内容?

      本文共分为四章:

     大毛:介绍(你现在正在阅读的)和环境搭建(你不只是在阅读,对吗?),对PE结构,代码洞穴,ASLR和地址的简要介绍。

     二毛:重点是通过添加一个全新的section来手动地对合法的PE进行回溯。

     三毛:我们将使用现有的Code Caves,而不是添加一个新的section。

     小毛:第四个模块演示了一种更聪明的方法,可以在默认情况下防止payload的执行(添加一个人为因素)。

     问题五:学习本文需要准备什么?

     读懂本文需要事先掌握哪些知识?

     这些都是我自学的,所以可能屁用没有(谦虚)。但如果你想要掌握本文的全部知识点,复现所有实验,我建议可以先掌握有关x86汇编、shellcode编写、调试器(特别是OllyDbg/Immunity)的使用以及驻留技术等相关知识。

     问题六:你是羊驼还是草泥马?

     微笑

  •  实验环境搭建

     为了保护我们自己的PC机,我们的实验都将在虚拟机上完成,下表显示了本文所使用的特定操作系统版本和工具。

     虚拟机 1: Windows 7 SP1 (x86)

Immunity Debugger (http://debugger.immunityinc.com/ID_register.py)
LordPE (http://www.malware-analyzer.com/pe-tools)
XVI32 (http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm)
Stud_PE (http://www.cgsoftlabs.ro/dl.html)
Netcat (Can be found in Kali /usr/share/windows-binaries/)
PsExec (https://technet.microsoft.com/en-ca/sysinternals/bb897553.aspx)

     虚拟机 2: Kali Linux (Used 2016.2 32-bit but should work for any version)

     各种软件应有尽有.

  • 对PE结构的快速浏览

     本节会重点介绍PE文件的某些字段,这些字段在下文讨论的后门植入中会有所涉及。更多深入解释这些字段,点,但这里我们会重点介绍与后门植入有关的那些字段。

     打开Windows 7虚拟机,启动LordPE,点击PE Editor:

     

     选择PsExec.exe:

     

     可以看到如下显示界面:

     

 

     • EntryPoint:入口点,从基地址开始的虚拟偏移,指向执行的第一个命令(ModuleEntryPoint)。

     • ImageBase: 映射可执行文件的首选基地址,尽管默认值是0x00400000,但是这个值可以被覆盖。如果用ASLR编译,将被忽略。

     • SectionAlignment:内存中区块的对齐值,不能小于页面大小(4096字节)。内存中的块大小必须是该值的整数倍。

     • FileAlignment:原始文件中区块的对齐值,通常为512字节。

     • Magic:对文件特征略浮夸的术语(抱歉,这里没有什么神奇的东西)。

     • NumberOfSections:在文件头之后定义的区段数目,稍后讨论。

     • SizeOfHeaders: 所有头部的组合大小(包括DOS头,PE头,PE可选头和节头)。

     • Checksum: 镜像文件校验和。

     • SizeOfOptionalHeader:  顾名思义。可选的头文件包含一些数据,比如首选的ImageBase、EntryPoint、 Checksum和和许多其他字段。

     接下来,点击Sections:

     

     如NumberOfSections所示,我们有5个section。

     名为.text的section包含可执行代码,因此在默认情况下,它需要可读和可执行的属性。

     名为.data和名为.rdata的section包含只读数据,想在这一节中执行内容,可通过设置可执行标记来完成。

     名为.rsrc的section包含资源数据。

     .reloc段通常不是必需区段,除非内存中的基址存在冲突。

     看一下一些更详细信息:

     

     

     可以看到:

     • Voffset:visual offset,当加载到内存时,section距离ImageBase的偏移。

     • VSize:visual size,加载到内存中的section的大小。

     • ROffset:raw offset,磁盘上的实际文件偏移量,可以使用您喜欢的十六进制编辑器工具进行验证。

     • RSize:raw size,磁盘的实际大小。

     • Flags: 包含定义各section“权限”的标志,详细信息可以点击三个点按钮来查看。

  • Code Caves

      在Drew Benton所写的一篇有关code caves的优质文章中,这样定义了“code caves”:“一种重定向机制,程序执行流程会被重定向到另一个位置,然后再返回到之前离开的那个区域”。在后门概念中,code caves是一个新的或未使用的死亡空间,我们可以在其中放置定制代码并重定向到它,而不会破坏实际的可执行文件。

    我们可以回顾一些技巧:

  • 添加一个section

           优点:大量的空间。

           缺点:二进制文件大小增加,更容易被标记为恶意。

  • 使用现有的死亡空间

           优点:文件大小不变,不太容易被标记为恶意。

           缺点:空间可能非常小,需要修改部分权限来允许代码执行。

     还有另外两种技术,本文没有涉及:

  • 扩充最后的section

           优点:section的数量不会改变。

           缺点:二进制文件大小增加,更容易被标记为恶意,严重依赖于最后的section。没有比添加一个新section更好。

  • Cave jumping

           灵活,可以使用一种或混合使用多种现有技术。可能更具隐蔽性。

           缺点:需要将payload切割成更小的单元,可能需要更改多个section的权限。

  • Address Space Layout Randomization (ASLR)地址空间布局随机化

     ASLR是一种安全机制,它可以随机分配可执行文件的基地址/.dll文件的基地址 以及 其他内存段(如堆栈和堆)的位置。这种机制可以避免基于固定函数/代码段跳转的漏洞利用技术。

     当在支持ASLR的操作系统上使用/DYNAMICBASE选项编译PE或者DLL时,.reloc段(记得吗?)就不再需要了。当修改程序指令时,我们不能使用固定的跳转方式,相反,我们必须使用当前指令和下一条指令之间的相对偏移量来进行跳转(稍后将详细解释)。     

     我们需要使用一个新的工具Immunity Debugger,Immunity  Debugger软件专门用于加速漏洞利用程序的开发,辅助漏洞挖掘以及恶意软件分析。它具备一个完整的图形用户界面,同时还配备了迄今为止最为强的python安全工具库。它巧妙的将动态调试功能与一个强大的静态分析引擎融合于一体,它还附带了一套高度可定制的纯python图形算法,可用于帮助我们绘制出直观的函数体控制流以及函数中的各个基本块。

     使用这个工具前需要搭建python环境,去python官网下载安装包安装。注意版本不要超过3.X,我安装的是2.7.1版本的。

     

     然后安装immunity debugger就ok了,可以打开immunity debugger,看一下运行界面:

     

     如果你想看到ASLR的作用,请在Immunity中加载PsExec(file->open->PsExec),并进入内存选项卡(alt+m):

     

     可以看到地址、大小、section信息、允许的读写执行操作都在这里(好cool),注意PsExec的基地址是012B0000,关掉immunity,重新载入PsExec,会发现PsExec的基地址发生了改变:

     

     PsExec的基地址变成了00C40000,这就是地址随机化的体现。

  • 文件偏移量和RVA

    正如前面所讨论的,当一个PE被加载到内存中时,它的映射方式与磁盘上的映射方式完全不一样。这里引入了一些我们需要记住的术语,后门可能会用到。

     • File Offset: 当前文件中的位置,可以使用十六进制编辑器查看这个值。

     • Base Address: 基地址,加载到内存中的二进制文件的起始地址。默认值是0x00400000,但是随着ASLR(地址随机化)的启用,这个值在每次加载时都发生了变化。

     • Virtual Address:虚拟的地址,加载到内存中的段地址,包括二进制文件开始的基地址。

     • Relative Virtual Address:相对虚拟地址,等于虚拟地址减去基地址。

     入口点(EntryPoint)在9DE6,这个值就是所谓的RVA地址。所以当映射到内存时,它就会显示为ImageBase+EntryPoint的形式(注意刚才看到的PsExec的基地址为00C40000),00C40000+9DE6=00C49DE6(=

推荐阅读