The more know the more need to learn.

恶意软件常驻方法总结

Posted on By Green_m

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