0x00 前言
距离上一次出文章已经半年了,一直太忙,这篇文章写写了好久,一直拖着,这周熬夜终于写出来了,表扬下自己。
这篇文章基本都是翻译的malwarebytes的一个ppt,感谢Hasherezade大佬的无私总结。
0x01 基本常驻方法
1. 注册表启动项
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
这是大部分常用软件保持常驻的方法,也是恶意软件会使用到的方法
2. 开机启动文件夹
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
这个文件夹会存放自启动项的快捷方式
3. 计划任务
控制面板-计划任务可以打开计划任务窗口,看到目前的计划任务项。
命令行使用taskschd.msc打开该窗口。
命令行下也可使用schtasks 命令对计划任务进行添加查看等操作。
4. 系统服务
根据服务的特性,开机自动启动,不少恶意软件也通过这个来实现恶意软件常驻。
当然添加服务的前提要求是高权限,windows vista以上的版本需要UAC。
可通过sc命令创建服务。
服务相关的注册表:
HKLM\SYSTEM\ControlSet001\services\<service name>
HKLM\SYSTEM\ControlSet002\services\<service name>
HKLM\SYSTEM\CurrentControlSet\services\<service name>
5. WMI(参考wooyun drops)
Get-WMIObject -Namespace root\Subscription -Class __EventFilter
Get-WMIObject -Namespace root\Subscription -Class __EventConsumer
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding
这里介绍一下查看启动项的神器autoruns,来自Sysinternals
注册表对比工具:regshot,可以对软件执行前和执行后的注册表对比
还有很多工具也能看到注册表变化如Process Monitor等,这里就不一一介绍了。
0x02 隐藏自启动的技巧
1. 经典方法
last minute
-
注入到其他进程并删除自己,磁盘上无恶意的pe文件
-
在消息WM_QUERYENDSESSION, WM_ENDSESSION上设置回调函数,去检测是否系统将要关机。
-
关机事件检测到后,将自身写入磁盘,并添加自启动
-
开机后,删除自启动并回到第一步
文件隐藏
1. 使用保留文件名
windows下一些文件夹名是系统保留的设备名称,无法直接创建和访问。
CON, PRN, NUL, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9, COM1, COM2, COM3, COM5, COM6, COM7, COM8, COM9
可以通过mkdir \.\d:\con 创建这些受限制的类型,
可通过rd命令删除该文件夹,如rd \.\d:\mercenie\con
2. 使用特殊的CLSIDS
examples:
GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}
Administrative Tools.{D20EA4E1-3957-11d2-A40B-0C5020
History.{ff393560-c2a7-11cf-bff4-444553540000}524153}
All Tasks.{ED7BA470-8E54-465E-825C-99712043E01C}
你可以将文件夹改名为上诉字符,然后通过 shell:::{xxxx} 来访问,直接打开会打开相应的控件,只能通过命令行来显示真实文件夹的内容
使用clsids和保留文件名的优势
用户不能直接访问文件夹的内容,特别是CLSID事件,只能打开文件夹
不能以传统的方式修改或者删除这些文件夹,受限的文件名限制了其他的操作;
3. ADS(alternate data stream)
ntfs文件系统中,存在主数据流流和交换数据流(ADS)。
用常规的dir命令和windows文件管理器都没法发现ADS。而当我们查看文件内容的时候也仅仅显示主数据流的内容。
ADS的格式
filename.extension:alternate_stream_name
可用dir /r命令列出ads的名字
用powershell Get-Content查看到交换数据流的具体内容
制作一个利用ads隐藏的文件
生成一个evil.dll
将dll拷贝进文件的ads流里.
type demo.dll > test.txt:demo
利用regsvr32部署整个dll
regsvr32.exe /s test.txt:demo
或者运行特定的函数,如test1函数
rundll32.exe test.txt:demo,Test1
4. 隐藏注册表键值
在键值的前面放入空值NULL,直接访问出错,但是可以被aoturuns看见
例如:
\0c:\\users\\tester\\appdata\\local\\bcd7\\62d2.lnk
默认aoturuns不显示Microsoft的应用,因此可以通过这个机制绕过,如
Rundll32.exe SHELL32.DLL,ShellExec_RunDLL \"C:\\ProgramData\\test.exe\"
恶意软件被rundll32部署,aoturuns里是不显示的,这也算是一种白加黑的方式
白+黑
使用具有数字签名的,合法的应用(很多老的杀软应用)(PS:我以前用过的马一般都是这个套路)
通过dll注入、劫持或者其他方式让这个合法的白名单应用去加载dll,然后再通过dll去解密或者执行shellcode。
这种方式很难被检测到,因为有白名单,而且恶意代码都是在内存中加载。
或者使用各种脚本语言或者命令解释器来加载恶意代码,如python.exe、wscript.exe、php.exe等,甚至是js
通过这些解释器去加载加密或者混淆过的脚本代码,然后和dll一样去下载或者执行恶意代码,也是通过内存加载的方式。
通过这种方式很多杀软不会拦截,看见是python、ruby执行可能直接就放过了。
在注册表中隐藏代码
基本流程:
注册表自启动项->键值loader->键值binary
通过注册表启动项执行loader,有可能是bat或者vbs文件或者powershell文件,有时候启动和加载会写在一起,如msf的
exploit/windows/local/registry_persistence
反正思路都是把shellcode或者downloader写进注册表,通过其他方式加载,磁盘上不存PE文件。
2. 利用windows特性
劫持 AppInit_DLLs
每个加载user32.dll的应用都会加载 AppInit_DLLs中定义的dll,通过这个特性可以加载恶意的dll。
win8及以上系统,当开启 secure boot 时禁用。
需要UAC权限修改。
相关注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
32位系统+32位dll,或64位系统+64位dll
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs
64位系统+32位dll
这里有一个32位和64位的重定向,这里不注意很容易踩坑
劫持shim的数据库
Shim是一个垫在应用程序和windowsAPI之间的逻辑层,是微软用来主要解决应用兼容性问题的解决方法。
执行被劫持的程序时自动加载数据库中恶意模块(dll,shellcode等)。
修改shim数据库需要UAC权限,通过Microsoft Application Compatibility Toolkit可以直接修复shim被劫持的问题
程序可通过官方提供的sdbinst.exe创建一个应用程序的shim数据库,默认路径就在c:\windows\system32\sdbinst.exe
sdbinst /q <path_to_shim_db>.sdb
sdbinst.exe 启动时在如下位置创建键值
HKLM\Software\Microsoft\Windows nt\CurrentVersion\AppCompatFlags\Custom
HKLM\Software\Microsoft\Windows nt\CurrentVersion\AppCompatFlags\InstalledSDB
为了更好的隐蔽性,躲避杀软,可以不用sdbinst来劫持shim数据库,可以通过代码来实现。
但无论哪种方式,都会在如下注册表指定数据库文件,因此主要检测这两个键值
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Custom
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\InstalledSDB
而恶意的shim数据库文件.sdb存放的路径,根据位数,存放在
C:\Windows\AppPatch\Custom
C:\Windows\AppPatch\Custom\Custom64
COM劫持
COM即Component Object Model (组件对象模型)的缩写,这里我们只关心clsid,即class id
通过修改注册表键值,使特定的clsid指向恶意的dll,程序运行时就会加载恶意的dll
如:
[HKEY_CURRENT_USER\Software\Classes\CLSID\{BCDE0395-E52F-467C-8E3DC4579291692E}\InprocServer32]
@="C:\\ProgramData\\demo.dll"
"ThreadingModel"="Apartment"
[HKEY_USERS\S-1-5-21-1929933236-2258453022-3626796957-
1000_Classes\CLSID\{BCDE0395-E52F-467C-8E3D-C4579291692E}\InprocServer32]
@="C:\\ProgramData\\demo.dll"
"ThreadingModel"="Apartment"
相关注册表
32位OS+32位PE
64位OS+64位PE
HKCU\Software\Classes\CLSID\[hijacked CLSID]\InProcServer32
32位OS+64位PE
HKCU\Software\Classes\Wow6432Node\CLSID\[hijacked CLSID]\InProcServer32
3. 由用户触发的常驻手段
快捷方式劫持
先删除如下注册表键
HKEY_LOCAL_MACHINE\Software\Classes\lnkfile\IsShortcut
将快捷方式图标上的箭头隐藏,然后隐藏真实文件夹和恶意文件,用快捷方式替代真实的文件夹,快捷方式中设置如下命令:
C:\Windows\system32\cmd.exe /c
start explorer.exe "Program Files"
& type "81d59edde88fc4969d.exe" >
"%temp%\81d59edde88fc4969d.exe"
&& "%temp%\81d59edde88fc4969d.exe"
点击快捷方式会打开文件夹并执行命令。
扩展名劫持
通过修改注册表中定义的扩展名关联程序,当打开特定的扩展名时,就会被劫持,从而执行恶意文件。
而且重新定义关联程序,是不需要管理员权限的
相关注册表
全局变量定义在 HKEY_CLASSES_ROOT
用户变量定义在HKEY_USERS -> [user SID]_Classes
0x03 总结
最简单的检测恶意软件的方法就是观察初期创建过程,中后期过程比较难分析。
虽然有各种奇淫巧技,但是通过经典的方式一样能够找到绝大部分恶意软件的蛛丝马迹,百变不离其宗。
所谓的无文件方式通过一些经典的方式一样能找到痕迹。
这篇文章主要是总结概括一下各个猥琐的技巧和常见的方法,很多地方不够详细,有兴趣的读者可以自己参考下面的链接。
写(翻译)这篇文章的过程中还是学到了很多东西,很多平时利用的时候用到的技巧也写到了,感觉收获挺多的。
0x04 参考文章
LAST MINUTE
https://www.cyberbit.net/wp-content/uploads/2016/09/Analysis-of-Dridex-AnD-for-IT.pdf
特殊文件名
https://blog.malwarebytes.com/threat-analysis/2017/03/diamond-fox-p1/
http://windows.mercenie.com/windows-xp/create-folder-any-name/
http://www.thewindowsclub.com/the-secret-behind-the-windows-7-godmode
ADS
https://hshrzd.wordpress.com/2016/03/19/introduction-to-ads-alternate-data-streams/
http://www.freebuf.com/articles/73270.html
隐藏注册表键值
https://blog.malwarebytes.com/threat-analysis/2016/07/untangling-kovter/
https://blog.malwarebytes.com/threat-analysis/2017/04/elusive-moker-trojan/
白+黑
https://blog.malwarebytes.com/threat-analysis/2016/08/unpacking-the-spyware-disguised-as-antivirus/
https://blog.malwarebytes.com/cybercrime/2017/01/zbot-with-legitimate-applications-on-board/
注册表中隐藏代码
https://blog.malwarebytes.com/threat-analysis/2016/07/untangling-kovter/
AppInit_DLLs劫持
https://support.microsoft.com/pl-pl/help/197571/working-with-the-appinit-dlls-registry-value
shim
https://www.fireeye.com/blog/threat-research/2017/05/fin7-shim-databases-persistence.html
https://www.hybrid-analysis.com/sample/c823183b49148e7e60d84142ccefc8fe16fe44bec94d5eabdbd623c65cdaff8c?environmentId=100/
https://github.com/hasherezade/persistence_demos/tree/master/shim_persist
http://www.freebuf.com/articles/system/114287.html
com劫持
https://attack.mitre.org/wiki/Technique/T1122
https://blog.gdatasoftware.com/2014/10/23941-com-object-hijacking-the-discreet-way-of-persistence
https://github.com/hasherezade/persistence_demos/tree/master/com_hijack
快捷方式劫持
https://blog.malwarebytes.com/threat-analysis/2017/03/spora-ransomware/
https://www.uperesia.com/booby-trapped-shortcut-generator
扩展名劫持
https://github.com/hasherezade/persistence_demos/tree/master/extension_hijack