0×01 研究背景

在分析了俄罗斯人被曝光的几个银行木马的源码后,发现其大多均存在通过劫持浏览器数据包来获取用户个人信息的模块,通过截获浏览器内存中加密前或解密后的数据包来得到数据包的明文数据。在Defcon 23被发布的工具NetRipper具备了以上恶意银行木马的这一能力,其开源的代码结构清晰,易于扩展,研究该工具对于研究该类恶意行为很有意义。其github地址在【github】 ,作者还提供了metasploit和powershell版本的利用模块,本文将分析其不同版本模块均会用到的c++代码实现的核心部分。

0×02 NetRipper工具概括

该开源工具实现的功能,主要是通过Hook进程的网络函数关键点(封包加密之前与封包解密之后的网络函数)来劫持客户端程序的明文数据。其中包括了诸多主流客户端,例如:Chrome,Firefox,IE,WinSCP,Putty以及一些代码库中提供的网络封包加解密函数接口,根据函数接口的函数性质来分的话,可以分为“未导出的函数接口”和“导出的函数接口”。其中Chrome,Putty,SecureCrt以及WinSCP中的网络加解密接口是属于UnExported,需要通过逆向工程来找到其Signature的位置,然后通过HOOK劫持;例如Mozilla Firefox使用了nss3.dll和nspr4.dll这两个模块中的加解密函数,nss3.dll中导出了PR_Read,PR_Write以及PR_GetDescType,后者导出了PR_Send和PR_Recv。其他的例如ncrypt.dll、secur32.dll和ssh2core73u.dll等。

还有对winsock2下的普通网络传输函数进行Hook来直接获取到一些未加密的信息。

对于未导出函数hook的处理需要先找出hook点,这比hook已知导出函数的过程复杂许多,首先需要通过逆向分析进程的收发包过程来找到关键点(加密前与解密后的数据包处理的函数接口)。例如,对于chrome/putty/winscp进程是需要这样做的,可以通过其开源的代码作为辅助分析,首先找到其网络函数的Signature,HOOK之前在进程的内存空间中搜索其所在地址:

伴随着软件的升级与安全保护的增强,可能明文层次上的收发包函数会有一些变化,那么NetRipper代码就需要修改去适应这些变化,重新调试分析找到对应的Signature,进而重新设置Hook点。

以putty为例来验证下:

使用CE查找发送函数的标识,位置在0x00408AD7。

IDA中显示 Sub_408ad7这个函数的原型定义与代码中声明是一致的:

至于如何调试找出未导出函数的HOOK点,这方面的内容较多,下一篇文章详细分析。对于putty和winscp客户端,因为均已开源,可以参考其开源的代码;对于chrome,那就需要逆向调试程序来定位HOOK点了。

0×03 Hook的偏移地址计算

E8 XXXXXXXX

其中XXXXXXXX = 目标地址 – 原始地址 – 5

举个例子,OD加载calc.exe:

指令中的偏移地址:0xFFFF99EB

目标地址:0x6c768

当前指令地址:0x72d78

计算公式:0xFFFFFFFF – ( 0x72d78 + 5 – 0x6c768 )  =  0xFFFF99eb

QA1:为什么需要使用0xFFFFFFFF减去偏移值呢?

计算补码

地址为一个DWORD(unsigned long)占4个字节的整型,可以表示的地址范围是有符号的2倍,可以表示的范围是0×00000000~0xFFFFFFFF。

QA2:为什么需要当前指令地址加上5,然后减去目标地址来计算偏移量呢?

这涉及到CALL/JMP指令计算偏移的基础,首先CALL/JMP(E8或E9)均是占用了5个字节,要跳到目标地址,那么首先就需要跳过当前指令的长度,然后再跳到目标地址。在上面的例子中也可以看到,通过计算才是正确的结果。

NetRipper实际例子:

NetRipper也处理了在碰到Hot-Patching的情况,其处理的方式与上面的一致,只不过将函数地址加了5个字节,将新的位置作为函数的HOOK点。

NetRipper 对Hook的处理也很有意思:

(1)使用一个结构HookStruct来存储(或者叫注册一个函数Hook信息)被HOOK的函数的信息,使用一个vector维护。

(2)回调函数使用内联汇编编写,代码的功能是:当原始函数被调用就执行这一段汇编代码,然后在汇编代码中调用Hooker::GetHookStructByOriginalAddress函数,这个函数将原始函数的地址作为参数,在所有已经注册了HOOK结构的vector<HokStruct>中检索该函数的HOOK信息,根据函数的地址来确定回调函数。

对于这一段内联汇编代码的解释,在下面会给出分析。

注意:对于Recv这样的函数来说,只有先调用了原始的函数,才能够得到recv的信息。这存在一个Hook后回调函数中的处理问题。

0×04 NetRipper 中Hook的处理

0×05 NetRipper中的注入

NetRipper中提供了常规远程注入和反射注入两种注入方法,其中反射注入在目前已经非常常见了,除了恶意代码常常会采用,对于metasploit渗透框架也采用了这种注入方式。关于这种注入方法,资料较多,这里就不展开了。

0×06代码框架分析

作者为了使该工具扩展性强,包括核心代码在内,其他辅助模块均通过C++类来封装,具有较低耦合性,易于配置来完成不同的任务。

(1)注入与动态配置

核心模块在一个DLL中,所以需要注入到目标进程,提供了注入代码,该注入部分的代码提供了常规远程线程注入和反射注入技术两种选择,注入器采用命令行形式,可以用于配置要注入的DLL。

(2)插件系统

代码中使用了作者编写的一个插件系统,封装在一个C++类种,以成员函数形式提供了几个插件函数,也可以根据其代码方便扩展。

(3)调试日志

提供了调试信息输出的功能,作者提供了封装的这个类,使用者可以通过配置是否使用。

(4)函数流控制

可针对每一个被Hook的线程,保证其Hook操作后处理的时候均只做一种类型的操作,通过一个函数流控制类来控制。例如Hook的回调函数输出信息到文件,这样可以控制一个线程中被Hook的函数只输出到一个log文件中。

0×07 NetRipper的使用

NetRipper主要用于后渗透,目标主机被攻陷后,需要进一步深入横纵渗透的时候就需要更多的信息,NetRipper通过劫持浏览器/客户端的明文信息来达到这一目的。Net Ripper提供了对浏览器以及一些常见的客户端的劫持实现,通过劫持浏览器(IE/Chrome/Firefox)来得到用户请求的信息;对于WinSCP和putty等客户端可以直接得到用户输入的账户等信息,帮助渗透测试人员以及攻击者从Windows系统过渡到Linux系统,完成攻击最大化。下面以putty为例测试

(1)将DLL注入至putty进程完成利用

(2)使用putty登陆SSH服务器来验证

(3)默认在用户目录下的temp下生成日志文件:

(4)putty数据包解密数据

可以看到输入的用户名root和密码qwe以及输入的命令ifconfig已经被记录下来了,这是对发包过程的解密操作。

(5)hook send/recv函数获取的putty加密的数据

*本文作者:任子行,转载请注明FreeBuf.COM

Defcon 23最新开源工具NetRipper代码分析与利用的更多相关文章

  1. 开源项目kcws代码分析--基于深度学习的分词技术

    http://blog.csdn.net/pirage/article/details/53424544 分词原理 本小节内容参考待字闺中的两篇博文: 97.5%准确率的深度学习中文分词(字嵌入+Bi ...

  2. vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用

    本文简单分析了代码的结构.有助于理解. 转:http://www.freebuf.com/news/141442.html 0×01 事件分析 2017年7月19 unamer在其github上发布了 ...

  3. ExtJs 下拉菜单分页工具插件 代码分析

    Ext.ns("Ext.ux"); //创建插件对象 Ext.ux.PageSizePlugin = function(){ //调用父对象的构造方法,并为此插件生成一个预定义st ...

  4. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  5. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

  6. 【转载】常用 Java 静态代码分析工具的分析与比较

    摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后 ...

  7. 常用Java静态代码分析工具的分析与比较

    给国产静态代码检测工具Pinpoint打Call! 简介 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了4种现有的主流Java静态代码分析工具 (Checkstyle,FindBugs ...

  8. Java静态检测工具/Java代码规范和质量检查简单介绍(转)

    静态检查: 静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码检查代码检查包括代码走查.桌面检查.代码审查等,主要检查代码 ...

  9. 使用OCLint和Sonar对iOS代码分析和质量管理

    OCLint 是一个强大的静态代码分析工具,可以用来提高代码质量,查找潜在的bug,主要针对c,c++和Objective-c的静态分析. Sonar 是一个用于代码质量管理的开放平台.通过插件机制, ...

随机推荐

  1. oracle的系统表

    -- DBA/ALL/USER/V_$/GV_$/SESSION/INDEX开头的绝大部分都是视图-- DBA_TABLES意为DBA拥有的或可以访问的所有的关系表.-- ALL_TABLES意为某一 ...

  2. 在Eclipse中设置自动补全

    在Eclipse中菜单中,Window->Preferences->Java->Editor->Content Assist中的Auto activation triggers ...

  3. 服务器禁用ping

    linux禁ping.这里操作的是centos6.5内核参数禁ping禁用ping #echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all启用ping ...

  4. No-2.常用 Linux 命令的基本使用

    常用 Linux 命令的基本使用 01. 学习 Linux 终端命令的原因 Linux 刚面世时并没有图形界面,所有的操作全靠命令完成,如 磁盘操作.文件存取.目录操作.进程管理.文件权限 设定等 在 ...

  5. java内存模型(线程共享部分)

    1.元空间(MetaSpace)与永久代(PermGen)的区别? ----> 1.1 元空间使用的是本机内存(这样的好处是,可以使用的内存空间变大了,没有OutOfMemoryError:Pe ...

  6. Node.js fs文件系统模块

    一.读取文件几个步骤 1.先引入fs文件系统模块 2.使用readfile 或 readFileSync 注意点:它们的回调函数有两个参数,第一个是err,第二个是data,得到的data是buffe ...

  7. svn基本使用详情

    1.增加(Add)先提到变更列表中,再commit到配置库中,选择新增文件,右键SVN菜单执行“Add“操作提交到”变更列表中”,然后右键SVN菜单执行”SVNCommit”提交到版本库中. 2.删除 ...

  8. Python中的函数(4)

    一.传递列表 你经常会发现,向函数传递列表很有用,这种列表包含的可能是名字.数字或者更复杂的对象(如字典). 将列表传递给函数后,函数就能直接访问其内容. 栗子:假设有一个用户列表,我们要和其中每一位 ...

  9. 【URAL 1989】 Subpalindromes(线段树维护哈希)

    Description You have a string and queries of two types: replace i'th character of the string by char ...

  10. Vue编写轮播组件引入better-scroll插件无法正常循环轮播

    临近过年还是发个博客表示一下自己的存在感,这段时间公司突然说想搞小程序,想到这无比巨大的坑就只能掩面而泣,于是乎这段时间在学习小程序开发.关于标题所说的是有老铁问的,我也跟着网上的代码码了一遍然后发现 ...