IAT Hook 技术分析

来源:https://pentest.blog/offensive-iat-hooking/

本文将介绍如何将IAT Hook方法用于攻击活动。这些方法可用于多种情况,包括攻击者需要逃避某些防御和分析机制,或在低特权环境中隐藏痕迹。在进入技术章节之前,你需要熟悉以下术语。

术语介绍

可移植可执行文件( PE):可移植可执行文件(PE)格式是一种可执行文件,目标代码,DLLFON字体文件以及32位和64位版本Windows操作系统中使用的其他格式的文件格式。PE格式是一种数据结构,它封装了Windows OS加载程序管理包装的可执行代码所需的信息。

导入地址表( IAT ):当应用程序在不同模块中调用函数时,地址表用作查找表。它的形式可以是按顺序导入和按名称导入。因为编译的程序无法知道它所依赖的库的内存位置,所以每当进行API调用时都需要进行间接跳转。当动态链接器加载模块将它们连接在一起时,它会将实际地址写入IAT插槽,并指向相应库函数的内存位置。

导入目录表( IT ):注释的一部分是导入地址表(IAT),当应用程序调用其他模块中的函数时,该表用作查找表。它的形式可以是按顺序导入和按名称导入。因为编译的程序无法知道它所依赖的库的内存位置,所以每当进行API调用时都需要间接跳转。

HOOK:在计算机编程中,术语HOOK涵盖了一系列的技术,用于通过拦截软件组件之间传递的函数调用或消息或事件来改变或增强操作系统,应用程序或其他软件组件的行为。处理此类截获的函数调用,事件或消息的代码称为钩子。API HOOK是一种技术,通过它我们可以检测和修改API调用的行为和流程。可以使用Windows上的各种方法完成API HOOK。

介绍

API HOOK 可用于许多目的,包括调试和扩展程序的功能,但它也非常有利于攻击者操纵应用程序逻辑。有几种方法可以在基于Windows的操作系统上执行API Hook,例如;

  • 虚拟功能绕行
  • 虚函数指针交换
  • 虚拟表指针交换
  • 导入地址表(IAT)
  • VEH

本文将重点介绍这些方法中的IAT HOOK。这种特殊方法可以解释为操纵导入地址表将API函数重定向到所需的存储器地址。该地址可以是另一个API函数,恶意的shellcode或程序代码的另一部分。为了覆盖IAT内部的地址,第一步是在进程内存中查找IAT表的地址。查找PE文件中的任何表需要大量的结构解析,幸运的是,找到IAT地址比找到其他大多数地址都容易,因为它可以在位于PE文件的可选头部内的数据目录中找到。

但是找到导入地址表对于HOOK API函数来说还远远不够。如本文开头所述,此表仅包含API地址。为了替换API函数地址,我们需要知道哪一个是要被Hook的API函数。在深入研究PE格式后,可以发现导入地址表中的地址顺序与导入名称表(INT)相同。解析导入名称表并找到所需的API函数的索引号将是一个不错的解决方案。

在导入名称表(INT)中查找函数名称需要在PE文件的导入表中解析\_IMAGE\_IMPORT\_DESCRIPTOR结构。当尝试使用反射汇编代码执行此方法时,可能没有什么挑战性。可以在Art of Anti Detection 3 - Shellcode Alchemy文章中找到更多关于解析\_IMAGE\_IMPORT\_DESCRIPTOR结构的详细参考。在解析必要的结构并在IAT内部找到API函数索引之后,在覆盖函数地址之前需要执行另一个步骤。通常导入地址表位于内存中且只具有读权限,为了覆盖表内的条目,内存保护属性需要修改为PAGE\_READWRITE。借助 VirtualProtect函数,可以更改IAT(或只需要覆盖的条目)的内存保护属性。可以通过block_api或iat_api 来使用反射组件调用此函数。早期的文章中已经解释了程序集块的用法。我花了很多时间和精力编写了一个名为hook_api的汇编代码通过本文中说明的步骤来Hook IAT。与其他程序集块相同,此处还使用了ROR13哈希值来定位INT内所需API函数的索引。这个代码块的存在让开发IATHook shell代码变得更加容易,正如本文开头所解释的,IATHook可以在许多情况下使用,例如滥用应用程序逻辑,特权升级和非特权状态内的自我防御。

自我防御

下面的这段代码使用hook\_apiTerminateProcess API调用重定向到了一个简单的windows消息框shellcode。Hook此类函数可防止宿主进程终止其他正在运行的程序。这个方法可用于攻击一些软件的自我防御机制。

[BITS 64]
  cld                         ; Clear direction flags
  push r10                    ; Save R10
  call start                  ; ...
  %include "hook\_api.asm"
start:
  pop rbp                     ; Pop the address of hook\_api to RBP
  call get\_funny\_func         ; Get the address of funy\_func to stack
funy\_func:
  incbin "MessageBox64"       ; MessageBox shellcode (binary's name)
get\_funny\_func:
  mov r10d,0x5ECADC87         ; hash( "KERNEL32.dll", "TerminateProcess" 
  call rbp                    ; hook\_api("TerminateProcess","funy\_func")
  pop rax                     ; Clear the stack
  pop r10                     ; Restore R10
  ret                         ; Return to caller

在使用nasm -f bin TerminateProcessHook.asm命令组装shellcode之后,使用一个简单的shellcode注入器程序来执行任务管理器应用程序内的有效载荷。有许多不同的方法可以将shellcode注入到正在运行的进程中,例如使用powersploit ,empire 或metasploit 等等。在一个无限循环的代码中运行此类注入可用于防止攻击程序过早的终止用户层分析和管理工具。

将恶意代码

隐藏在众目睽睽下

使用IATHook方法的另一种创造性使用场景是隐藏你的恶意进程,防止安全人员分析或被安全软件终止运行。对于大多数程序来说,Hook NtQuerySystemInformation API会阻止其他程序检索任何系统信息,从而使程序无法查看我们进程的任何细节。下面的代码段使用hook_api将NtQuerySystemInformation API调用重定向到了一个空白函数,在调用时只会返回 NT\_SUCCESS值。

[BITS 64]
  cld                     ; Clear direction flags
  push r10                ; Save R10
  call start              ; ...
  %include "hook\_api.asm"
start:
  pop rbp                 ; Pop the address of hook\_api to RBP
  call get\_funny\_func     ; Get the address of funy\_func to stack
funy\_func:
  mov rax,0x3FFFFFFF      ; Return NT\_SUCCESS
  ret                     ; ...
get\_funny\_func:
  mov r10d,0x95513E5D     ; hash( "KERNEL32.dll", "NtQuerySystemInformation" )
  call rbp                ; hook\_api("TerminateProcess","funy\_func")
  pop rax                 ; Clear the stack
  pop r10                 ; Restore R10
  ret                     ; Return to caller

在将上述shellcode组装并注入任务管理器进程之后,程序不再能够查看有关正在运行的程序的进程树或任何其他类型的信息。在无限循环的代码中运行这样的注入可以用于隐藏来自用户层分析和管理工具的进程。

点击查看演示视频:https://www.youtube.com/watch?v=crUqjE3S1Sw&feature=youtu.be

结论

执行IATHook可以形成不同的攻击场景,唯一的限制在于攻击者自己的想象力。下面是你在尝试使用IAT Hook操作应用程序逻辑时,非常有用的API函数列表。

  • OpenProcess(防止打开其他进程)
  • CreateThread
  • CreateProcess
  • WinHttpOpen(禁用SSL)
  • getaddrinfo(DNS攻击)
  • DeleteFileW(防止用户删除文件)
  • WinVerifyTrust(绕过证书检查)

特权网络钓鱼是另一种攻击,可以通过在hook_api:https://github.com/EgeBalci/Hook_API的帮助下进行IATHook。"特权网络钓鱼"一词可能听起来很奇怪,这种攻击会欺骗用户升级渗透系统内的攻击者权限。我将会在另一篇文章中介绍这种攻击技术。

原文发布于微信公众号 - 安恒网络空间安全讲武堂(cyberslab)

原文发表时间:2018-11-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏丑胖侠

Zookeeper开源客户端Curator之基本功能讲解

简介 Curator是Netflix公司开源的一套Zookeeper客户端框架。了解过Zookeeper原生API都会清楚其复杂度。Curator帮助我们在其基...

3335
来自专栏重庆的技术分享区

如何在Ubuntu 16.04上安装和配置Redis集群

Redis集群已经发展成为缓存,队列等的流行工具,因为它具有可扩展性和速度的潜力。本指南旨在使用三个Linode创建一个集群来演示分片。然后,如果发生故障,您将...

1366
来自专栏腾讯云Elasticsearch Service

logstash input插件开发

logstash作为一个数据管道中间件,支持对各种类型数据的采集与转换,并将数据发送到各种类型的存储库,比如实现消费kafka数据并且写入到Elasticsea...

5724
来自专栏windealli

常用压测工具

webbench 是常用的网站压力测试工具,webbench用C语言编写,代码仅有区区几百行。

7965
来自专栏玄魂工作室

Python黑客编程3网络数据监听和过滤

课程的实验环境如下: • 操作系统:kali Linux 2.0 • 编程工具:Wing IDE • Python版本:2.7.9 • 涉及到的主要pytho...

9493
来自专栏芋道源码1024

分布式事务 TCC-Transaction 源码分析 —— 事务恢复

1. 概述 本文分享 TCC 恢复。主要涉及如下二个 package 路径下的类: org.mengyun.tcctransaction.recover Rec...

3733
来自专栏人云亦云

Chef

3717
来自专栏开发与安全

进程控制块PCB结构 task_struct 描述

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了...

2698
来自专栏吴伟祥

Linux 文件与目录管理 转

pwd是Print Working Directory的缩写,也就是显示目前所在目录的命令。

1224
来自专栏程序员互动联盟

【专业技术】8大你不得不知的Android调试工具

1. 查看当前堆栈 1) 功能:在程序中加入代码,使可以在logcat中看到打印出的当前函数调用关系 2) 方法: new Exception(“print ...

63513

扫码关注云+社区

领取腾讯云代金券