在杀毒软件日益完备的互联网中,那些大部分以加载系统启动项为主要攻击手段的的普通病毒和木马越来越难以攻破用户的防御屏障,但与此同时,有一些病毒却“剑走偏锋“,不仅绕过了杀毒软件的检测,还在隐藏自己的同时攻破了系统。这些病毒是如何抓住用户心理,一步步突破了用户系统。
接下来,通过本篇文章将为大家剖析基于辅助功能的镜像劫持攻击原理,向大家展现还原这种攻击所带来的巨大危害以及防御手段。
所谓辅助功能就是在Windows系统中,我们可以使用多种组合键打开或关闭特定的功能,例如常用的win + ctrl + o打开屏幕键盘,win + u打开设置中心,连按5次shift打开粘滞键等等。
而且微软为了提高用户体验,非常‘贴心’的允许用户在登陆系统前也可以使用这些功能,根据这个特性,某些攻击者很可能通过远程桌面协议,在未授权的情况下运行这些功能,虽然这些功能是‘友好的’,没有危害性,但我们知道,这些功能之所以可以运行其实是在命令行里运行的系统指令罢了,例如
C:\WINDOWS\System32\Utilman.exe 打开设置中心
C:\WINDOWS\System32\sethc.exe 打开粘滞键
C:\WINDOWS\Syetem32\osk.exe 打开屏幕键盘
问题在于,如果我们在未登陆系统的情况下使用组合键运行的系统命令遭到篡改,本来应该打开‘十分安全’的辅助程序却被另一恶意程序代替执行,最终导致在用户不知情的情况下,获得系统权限,留下隐蔽后门。
可如何才能使用户启动辅助功能的系统命令变成运行自己恶意软件的系统命令呢,这就要说到另一项技术:镜像劫持。
“镜像劫持”,又叫“映像劫持”,也被称为“IFEO”(Image File Execution Options),在Windows NT架构的系统里,IFEO的本意是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定。当一个可执行程序位于IFEO的控制中时,它的内存分配则根据该程序的参数来设定,而Windows NT架构的系统能通过这个注册表项使用与可执行程序文件名匹配的项目作为程序载入时的控制依据,最终得以设定一个程序的堆管理机制和一些辅助机制等。大概微软考虑到加入路径控制会造成判断麻烦与操作不灵活的后果,也容易导致注册表冗余,于是IFEO使用忽略路径的方式来匹配它所要控制的程序文件名。
简单来说,当我想运行A.exe,结果运行的却是B.exe,也就是说在这种情况下A程序被B程序给劫持了,而映像劫持病毒就是通过修改某些注册表常用项的键值,达到在用户无意识的情况下想运行常用程序却让木马等恶意程序在后台运行的目的。
为了实现镜像劫持,需要先找到镜像劫持在注册表中的路径,“HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ WindowsNT \ CurrentVersion \ Image 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:\WINDOWS\System32\calc.exe";
RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\chrome.exe", 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition);
RegSetValueExA(hKey, "Debugger", 0, REG_SZ, (BYTE*)path, (1 + ::lstrlenA(path)));
return 0;}
int main(){
test();
return 0;}
恶意程序运行后,注册表中chrome.exe新增键值对Debugger=“C:\WINDOWS\System32\calc.exe”
注册表项遭到修改后,双击运行chrome运行,本该打开网页却打开了计算器程序,因为系统优先执行了”C:\WINDOWS\System32\calc.exe”。造成了镜像劫持攻击。
安全从业者不应轻视任何一种漏洞,因为当不同的漏洞结合到一起时很有可能产生1+1>2的效果。这一点在辅助功能和镜像劫持身上很好的体现了出来。
之前我们提过辅助功能是执行系统命令,并且允许用户在未登录的情况下运行,那么当我们使用镜像劫持攻击,更改了这些指令在注册表IFEO中的键值就可能造成攻击者不需要登陆系统即可运行某些恶意软件。
修改注册表,在“HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Image File Execution Option”中添加Utilman.exe项,在此项中添加debugger键,键值为启动cmd的命令C:\WINDOWS\System32\cmd.exe。
当攻击者通过远程桌面协议连接到受害者电脑上时,只需使用组合键win+u,本应该打开的设置中心,最终却打开了cmd命令行,通过命令行可以添加用户、打开注册表、运行恶意软件、添加隐蔽后门等等一些列攻击手段,严重性不言而喻。
在注册表中新增Utilman.exe表项,添加键值对Debugger=“C:\WINDOWS\System32\cmd.exe”
在登陆页面上运行win + u,在无需登录的情况下就打开了cmd命令框。
1、由于此类攻击的恶意代码要修改Image File Execution Options,首先要有权限才可读写,于是,我们可以通过限制用户对该注册表的读写权限,来阻止镜像劫持。打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ImageFileExecutionOptions\,选中该项,右键→权限→高级,取消administrator和system用户的写权限即可。
2、由于镜像劫持需要在注册表中添加辅助功能的表项,所以检查“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Option”注册表路径下的程序名称,一些常用的辅助功能表项如:Utilman.exe,stch.exe,osk.exe等等。
3、基于零信任的理念,对于有可能有安全隐患的不必要表项可以选择删除,直接禁用辅助功能即可。打开注册表编辑器,定位到HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ WindowsNT \ CurrentVersion \,把“ImageFileExecutionOptions”项删除。
*本文作者:杭州美创科技,转载请注明来自FreeBuf.COM