Good in study, attitude and health

  • 渗透技巧——使用远程桌面协议建立通道

    0x00 前言 最近从@cpl3h的博客中学到了使用远程桌面协议建立通道的方法。 本文将对这个方法进行整理,结合自己的经验,添加个人理解。 学习地址: https://ijustwannared.team/2019/11/07/c2-over-rdp-virtual-channels/ 0x01 简介 本文将要介绍以下内容: 使用场景 使用共享文件建立通道 使用rdp2tcp建立通道 使用UniversalDVC建立通道 利用分析 防御建议 0x02 使用场景 由于防火墙的设置,只能连接一台Windows服务器的远程桌面,那么如何以这台Windows服务器为跳板进入内网 简要描述如下图 0x03 使用共享文件建立通道 通过读写RDP Client和RDP Server之间共享的文件作为数据传输的通道 POC: https://github.com/outflanknl/external_c2 这是根据Cobalt Strike中External C2规范编写的POC 实现原理: 建立远程桌面连接时,RDP Client和RDP Server之间可以创建共享文件夹,通过读写共享文件作为数据传输的通道 1.Windows系统连接远程桌面并开启文件共享 (1)通过配置mstsc.exe开启文件共享 如下图 (2)使用FreeRDP开启文件共享 下载地址: https://cloudbase.it/freerdp-for-windows-nightly-builds/ 命令实例: wfreerdp /v:192.168.112.129:3389 -u:1 -p:Test123! /cert-ignore /drive:share1,c:\ 2.Kali系统连接远程桌面并开启文件共享 (1)使用xfreerdp开启文件共享 将本地文件夹/tmp共享的命令如下: xfreerdp...

  • Cobalt Strike的blockdlls利用分析

    0x00 前言 Cobalt Strike 3.14添加了blockdlls功能,限定子进程只能加载带有Microsoft签名的dll。 这个功能可以阻止第三方安全软件向子进程注入dll,也就无法对子进程进行hook,最终起到保护子进程的效果。 XPN在他的博客中也介绍了相关内容,地址如下: https://blog.xpnsec.com/protecting-your-malware/ 本文将要扩展blockdlls的利用方法,分别介绍查看进程是否开启blockdlls和修改当前进程开启blockdlls的方法,比较Win8和Win10系统在使用上的区别,开源c代码,分享脚本编写的细节。 0x01 简介 本文将要介绍以下内容: Cobalt Strike中的blockdlls 查看进程是否开启blockdlls的方法 修改当前进程,开启blockdlls的方法 Win8和Win10系统在使用上的区别 利用分析 0x02 Cobalt Strike中的blockdlls Cobalt Strike中的blockdlls将会创建一个子进程并开启blockdlls功能 XPN在博客中分享了实现同样功能的c代码,地址如下: https://blog.xpnsec.com/protecting-your-malware/ 代码如下: #include <Windows.h> int main() { STARTUPINFOEXA si; PROCESS_INFORMATION pi; SIZE_T size = 0; BOOL ret; // Required for a STARTUPINFOEXA ZeroMemory(&si, sizeof(si)); si.StartupInfo.cb =...

  • 渗透技巧——从远程桌面客户端提取明文凭据

    0x00 前言 在之前的文章《渗透技巧——获得Windows系统的远程桌面连接历史记录》曾介绍了获得远程桌面连接历史记录的方法。 在实际的渗透过程中,如果发现了远程桌面连接的历史记录,那么下一步就需要想办法获取远程桌面连接使用的口令。 本文将会结合RdpThief介绍从远程桌面客户端提取明文凭据的方法,分享需要注意的细节。 RdpThief地址: https://github.com/0x09AL/RdpThief 0x01 简介 本文将要介绍以下内容: 获取远程桌面连接口令的思路 使用Detours库hook系统API的方法 使用API monitor监控系统API调用的方法 使用RdpThief从远程桌面客户端提取明文凭据 0x02 获取远程桌面连接口令的思路 通常有以下两种: 1.使用键盘记录程序,记录mstsc.exe在启动过程中用户输入的口令 2.在mstsc.exe启动时,读取mstsc.exe的内存数据,提取出用户输入的口令 RdpThief是第二种实现思路,使用Detours库hook系统API,使用API monitor监控系统的API调用,找到mstsc.exe在内存中存储明文口令的位置,代码简洁有效。 0x03 使用Detours库hook系统API的方法 RdpThief在实现上使用Detours库来hook系统API,所以这里简要介绍一下Detours库的用法 Detours库用于监视和检测Windows上的API调用,可以用来hook系统API 这里介绍使用Detours库hook系统API的两种方法 1.编译Detours源码并使用 (1)编译Detours源码 下载Detours源码,地址如下: https://github.com/Microsoft/Detours 使用Visual Studio编译Detours源码(这里以VS2015为例),需要区分32位和64位 64位编译: 打开VS2015 x64 本机工具命令提示符 执行以下命令: cd Detours-master\src nmake 命令执行后将在文件夹Detours-master下生成以下三个文件夹,包括Detours的头文件和库文件 bin.X64 include lib.X64 32位编译: 打开VS2015本机工具命令提示符 执行以下命令: cd Detours-master\src...

  • Invoke-PowerThIEf利用分析

    0x00 前言 Invoke-PowerThIEf是一个开源的Powershell脚本,不仅能够用来对IE浏览器窗口的内容进行操作,还能通过Hook的方法捕获IE浏览器的凭据。 地址如下: https://github.com/nettitude/Invoke-PowerThIEf 本文将要对Invoke-PowerThIEf的功能进行测试,分享在Win7 sp1 x64下的使用方法,结合自己的经验,分析利用思路。 0x01 简介 本文将要介绍以下内容: 功能测试 Win7Sp1下的使用方法 利用分析 0x02 功能测试 Invoke-PowerThIEf需要的环境配置如下: IE 11 Win 7-10 .Net 4.0+ Powershell 4.0 考虑到以下原因: Window7或Windows Server 2008,默认安装PowerShell 2.0 Windows8或Windows server 2012,默认安装PowerShell 3.0 Windows 8.1或Windows server 2012 R2,默认安装PowerShell 4.0 首先选择Windows server 2012 R2 x64作为测试环境,可直接运行 常用功能如下: (1)列出IE浏览器的所有页面 Invoke-PowerThIEf -action ListUrls...

  • 渗透基础——命令行下安装Microsoft .NET Framework

    0x00 前言 在渗透测试中,有些工具的运行(例如高版本的Powershell)需要依赖Microsoft .NET Framework 4.0的环境。 而默认配置下,Win7不支持Microsoft .NET Framework 4.0。为了保证工具能够在Win7下使用,这里就需要在命令行下实现安装Microsoft .NET Framework 4.0。 经过一番搜索,我没有找到介绍命令行下安装Microsoft .NET Framework的资料。 于是我写了这篇文章,介绍我的实现方法,开源C代码,分享实现原理和脚本开发的细节。 0x01 简介 本文将要介绍以下内容: Win7下安装Microsoft .NET Framework 4.0的正常方法 命令行下的实现方法 实现原理 脚本开发的细节 0x02 Win7下安装Microsoft .NET Framework 4.0的正常方法 Microsoft .NET Framework的安装包分为两种: (1)Web Installer 下载地址: https://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=17851 Web Installer的文件很小,在安装过程中需要Internet连接来下载其他所需的.NET Framework组件 (2)Standalone Installer 下载地址: https://www.microsoft.com/en-US/Download/confirmation.aspx?id=17718 Standalone Installer的文件相对来说会很大,因为它包括了完整的组件,在安装过程中不需要Internet连接 这里以Standalone Installer为例,正常的流程如下:...

  • Covenant利用分析

    0x00 前言 Covenant是一个.NET开发的C2(command and control)框架,使用.NET Core的开发环境,不仅支持Linux,MacOS和Windows,还支持docker容器。 最特别的地方是支持动态编译,能够将输入的C#代码上传至C2 Server,获得编译后的文件并使用Assembly.Load()从内存进行加载。 本文仅在技术研究的角度,介绍Covenant的细节,分析特点。 0x01 简介 本文将要介绍以下内容: Covenant的启动方法 Covenant的功能介绍 Covenant的优点 Covenant的检测 0x02 Covenant的启动方法 1.Windows系统 需要装对应版本的.NET Core、ASP.NET Core和SDK 经测试,Covenant需要.NET Core 2.2.0、ASP.NET Core 2.2.0和SDK 2.2.101,其他版本会报错 下载地址: https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.2.101-windows-x64-installer https://dotnet.microsoft.com/download/thank-you/dotnet-runtime-2.2.0-windows-x64-installer https://dotnet.microsoft.com/download/thank-you/dotnet-runtime-2.2.0-windows-x64-asp.net-core-runtime-installer 安装Git for Windows https://github.com/git-for-windows/git/releases/download/v2.23.0.windows.1/Git-2.23.0-64-bit.exe 下载并启动: git clone --recurse-submodules https://github.com/cobbr/Covenant cd Covenant/Covenant dotnet build dotnet run 访问https://localhost:7443进入控制面板,第一次使用时需要注册用户 这里可以注册多个用户,实现团队协作 注:...

  • 从内存加载.NET程序集(Assembly.Load)的利用分析

    0x00 前言 在之前的文章《从内存加载.NET程序集(execute-assembly)的利用分析》介绍了"execute-assembly"的实现方法和利用思路,能够从内存中加载.NET程序集。这个功能不需要向硬盘写入文件,十分隐蔽。 与此相似的方法还有一个是Assembly.Load,同样能够从内存中加载.NET程序集。 本文将会结合三个开源工程,介绍Assembly.Load的实现方法,分析利用思路。 0x01 简介 本文将要介绍以下内容: 基础知识 SharpCradle的利用分析 SharpShell的利用分析 SharpCompile的利用分析 0x02 基础知识 参考资料: https://docs.microsoft.com/en-us/dotnet/api/system.reflection.assembly.load?view=netframework-4.5 1.Assembly.Load()、Assembly.LoadFrom()和Assembly.LoadFile()的区别 Assembly.Load()是从String或AssemblyName类型加载程序集,可以读取字符串形式的程序集,也就是说,文件不需要写入硬盘 Assembly.LoadFrom()从指定文件中加载程序集,同时会加载目标程序集所引用和依赖的其他程序集 例如: Assembly.LoadFrom("a.dll"),如果a.dll中引用了b.dll,那么会同时加载a.dll和b.dll Assembly.LoadFile()也是从指定文件中加载程序集,但不会加载目标程序集所引用和依赖的其他程序集 例如: Assembly.LoadFile("a.dll"),如果a.dll中引用了b.dll,那么不会加载b.dll 2.Assembly.Load()的实现示例 (1)编写测试程序 测试程序的代码如下: using System; namespace TestApplication { public class Program { public static void Main() { Console.WriteLine("Main"); } } public class aaa { public static...

  • SharpGen利用分析

    0x00 前言 SharpGen是我认为特别棒的一个工具,它能够用来对其他.Net程序集进行整合、重组并加密,二次编译后可生成一个全新的工具 本文将要研究SharpGen的细节,介绍调用其他开源库的详细方法,分析利用思路 参考链接: https://github.com/cobbr/SharpGen https://cobbr.io/SharpGen.html 0x01 简介 本文将要介绍以下内容: .NET Core开发环境搭建 功能介绍 调用其他开源库的方法 利用思路 0x02 .NET Core开发环境搭建 SharpGen使用.NET Core,优点是支持多平台(Linux,MacOS和Windows) 编程语言使用C#,利用Rosyln编译.NET Framework控制台应用程序或库 注: Rosyln是一个.NET编译器平台,通过Scripting API,能够对脚本文件进行动态编译 测试系统:Win7x64 我在测试系统选择安装.NET Core 2.2.0、ASP.NET Core 2.2.0和SDK 2.2.101,这是为了兼容另一个工具Covenant 对应版本的下载链接如下: https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.2.101-windows-x64-installer https://dotnet.microsoft.com/download/thank-you/dotnet-runtime-2.2.0-windows-x64-installer https://dotnet.microsoft.com/download/thank-you/dotnet-runtime-2.2.0-windows-x64-asp.net-core-runtime-installer 安装Git for Windows,下载链接如下: https://github.com/git-for-windows/git/releases/download/v2.23.0.windows.1/Git-2.23.0-64-bit.exe 下载安装并编译SharpGen: git clone https://github.com/cobbr/SharpGen cd SharpGen dotnet build --configuration Release...

  • GadgetToJScript利用分析

    0x00 前言 GadgetToJScrip能够将.Net程序封装在js或vbs脚本中,相比于James Forshaw开源的DotNetToJScript,修改了反序列化调用链,能够绕过AMSI,添加了绕过.Net 4.8+阻止Assembly.Load的功能 本文用来记录研究细节,分析利用思路,简要修改原工程,更便于测试Payload,分享同SILENTTRINITY结合的方法 0x01 简介 本文将要介绍以下内容: GadgetToJScript的代码分析和实现逻辑 为了便于测试Payload的修改方法 利用分析 同SILENTTRINITY结合的方法 0x02 GadgetToJScript的代码分析和实现逻辑 1.代码分析 (1)templates文件夹 保存有js、vbs和hta的模板 模板文件同DotNetToJScript基本相同,区别如下: 添加了一些对.Net版本的判断,读取注册表HKLM\\SOFTWARE\\Microsoft\\.NETFramework\\v4.0.30319\\,如果成功,版本为4.0.30319,否则为2.0.50727 做了两次反序列化,第一次是禁用ActivitySurrogateSelector类型检查,用来绕过.Net 4.8+阻止Assembly.Load的功能,第二次用来加载.Net程序 (2)Program.cs 主程序,替换模板中的变量,计算长度,生成最终的js、vbs和hta脚本 (3)TestAssemblyLoader.cs Payload以字符串的形式保存,使用CompileAssemblyFromSource对其进行动态编译,编译结果保存在内存(results.CompiledAssembly)中 关键函数:CompileAssemblyFromSource 其中,GenerateInMemory属性默认为true,表示把编译生成的程序集保留在内存中,通过CompilerResults实例的CompiledAssembly可以获取,如果设置为false,可以将编译生成的程序集保存在本地硬盘 参考资料: https://docs.microsoft.com/en-us/dotnet/api/system.codedom.compiler.codedomprovider.compileassemblyfromsource?view=netframework-4.8 (4)_ASurrogateGadgetGenerator.cs 构建一个链来映射字节数组以创建类的实例: byte[] -> Assembly.Load -> Assembly -> Assembly.GetType -> Type[] -> Activator.CreateInstance -> Win! 该段代码应该来自于:https://github.com/pwntester/ysoserial.net/blob/master/ysoserial/Generators/ActivitySurrogateSelectorGenerator.cs#L50 可以理解为TestAssemblyLoader.cs实现将编译结果保存在内存(results.CompiledAssembly)中,_ASurrogateGadgetGenerator.cs用来读取这段内存并实现对.Net程序的调用 (5)_DisableTypeCheckGadgetGenerator.cs 用来绕过.Net 4.8+阻止Assembly.Load的功能...

  • 渗透基础——从Exchange服务器上搜索和导出邮件

    0x00 前言 在渗透测试中,如果我们获得了Exchange服务器的管理权限,下一步就需要对Exchange服务器的邮件进行搜索和导出,本文将要介绍常用的两种方法,开源4个powershell脚本,分享脚本编写细节。 0x01 简介 本文将要介绍以下内容: 管理Exchange服务器上邮件的两种方法 导出邮件的两种方法 搜索邮件的两种方法 注: 本文介绍的方法均为powershell命令 0x02 管理Exchange服务器上邮件的两种方法 1.先使用PSSession连接Exchange服务器,进而远程管理邮件 使用PSSession连接Exchange服务器的命令: $User = "test\administrator" $Pass = ConvertTo-SecureString -AsPlainText DomainAdmin123! -Force $Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Pass $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://Exchange01.test.com/PowerShell/ -Authentication Kerberos -Credential $Credential Import-PSSession $Session -AllowClobber 补充: 查看PSSession: Get-PSSession 断开PSSession: Remove-PSSession $Session...