基于辅助功能的镜像劫持攻击原理

在杀毒软件日益完备的互联网中,那些大部分以加载系统启动项为主要攻击手段的的普通病毒和木马越来越难以攻破用户的防御屏障,但与此同时,有一些病毒却“剑走偏锋“,不仅绕过了杀毒软件的检测,还在隐藏自己的同时攻破了系统 。这些病毒是如何抓住用户心理,一步步突破了用户系统 。
接下来,通过本篇文章,美创第59号安全实验室将为大家剖析基于辅助功能的镜像劫持攻击原理,向大家展现还原这种攻击所带来的巨大危害以及防御手段 。
01
辅助功能简介
所谓辅助功能就是在windows系统中,我们可以使用多种组合键打开或关闭特定的功能,例如常用的win + ctrl + o打开屏幕键盘,win + u打开设置中心,连按5次shift打开粘滞键等等 。

基于辅助功能的镜像劫持攻击原理

文章插图
 
而且微软为了提高用户体验,非常‘贴心’的允许用户在登陆系统前也可以使用这些功能,根据这个特性,某些攻击者很可能通过远程桌面协议,在未授权的情况下运行这些功能,虽然这些功能是‘友好的’,没有危害性,但我们知道,这些功能之所以可以运行其实是在命令行里运行的系统指令罢了,例如
C:WINDOWSSystem32Utilman.exe 打开设置中心
C:WINDOWSSystem32sethc.exe 打开粘滞键
C:WINDOWSSyetem32osk.exe 打开屏幕键盘
问题在于,如果我们在未登陆系统的情况下使用组合键运行的系统命令遭到篡改,本来应该打开‘十分安全’的辅助程序却被另一恶意程序代替执行,最终导致在用户不知情的情况下,获得系统权限,留下隐蔽后门 。
可如何才能使用户启动辅助功能的系统命令变成运行自己恶意软件的系统命令呢,这就要说到另一项技术:镜像劫持 。
02
镜像劫持简介
“镜像劫持”,又叫“映像劫持”,也被称为“IFEO”(Image File Execution Options),在Windows NT架构的系统里,IFEO的本意是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定 。当一个可执行程序位于IFEO的控制中时,它的内存分配则根据该程序的参数来设定,而Windows NT架构的系统能通过这个注册表项使用与可执行程序文件名匹配的项目作为程序载入时的控制依据,最终得以设定一个程序的堆管理机制和一些辅助机制等 。大概微软考虑到加入路径控制会造成判断麻烦与操作不灵活的后果,也容易导致注册表冗余,于是IFEO使用忽略路径的方式来匹配它所要控制的程序文件名 。
简单来说,当我想运行A.exe,结果运行的却是B.exe,也就是说在这种情况下A程序被B程序给劫持了,而映像劫持病毒就是通过修改某些注册表常用项的键值,达到在用户无意识的情况下想运行常用程序却让木马等恶意程序在后台运行的目的 。
03
镜像劫持原理及实现
原理:
为了实现镜像劫持,需要先找到镜像劫持在注册表中的路径,“HKEY_LOCAL_macHINESOFTWAREMicrosoftWindowsNTCurrentVersionImage File ExecutionOptions” 。
然而WINDOWS NT系统在试图执行一个从命令行调用的可执行文件运行请求时,会先检查运行程序是不是可执行文件,如果是的话,再检查格式,然后就会检查是否存在 。由此我们发现,造成镜像劫持的罪魁祸首就是参数“Debugger”,他是IFEO里第一个被处理的参数,若果该参数不为空,系统则会把Debugger参数里指定的程序文件名作为用户试图启动的程序执行请求来处理,而仅仅把用户试图启动的程序作为Debugger参数里指定的程序文件名的参数发送过去 。参数“Debugger”本来是为了让程序员能够通过双击程序文件直接进入调试器里调试自己的程序 。现在却成了病毒的攻击手段 。
让我们进行更深的思考,当更改的表项是杀毒软件所在的表项,会造成什么后果 。毫无疑问,杀毒软件完全没办法工作,不仅绕过了杀毒软件还隐秘的执行了自己的恶意程序,一般用户根本想不到杀毒软件的注册表项会被篡改,这就进一步增加了攻击后可利用的时间 。危害性不言而喻 。
复现:
修改注册表的恶意代码:
#include <IOStream>
#include <Windows.h>
using namespace std;
int test(){
Dword dwDisposition;
HKEY hKey;
const char path[] = "C:WINDOWSSystem32calc.exe";
RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\chrome.exe", 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition);


推荐阅读