Good in study, attitude and health

  • 渗透基础——命令行下安装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...

  • 域渗透——使用Exchange服务器中特定的ACL实现域提权

    0x00 最近学到的一个域环境下的提权技巧,在域环境中,安装Exchange后会添加一个名为Microsoft Exchange Security Groups的OU,其中包括两个特殊的组:Exchange Trusted Subsystem和Exchange Windows Permission,如果获得了这两个组内任意用户的控制权限,就能够继承该组的WriteDACL权限,进而修改域对象的ACL,最终实现利用DCSync导出域内所有用户hash。接下来可以使用域用户krbtgt的hash制作Golden Ticket,登录域控制器,获得对整个域的控制权限。 学习资料: https://github.com/gdedrouas/Exchange-AD-Privesc 本文将会记录复现过程,介绍利用这个机制建立提权后门的方法,详细介绍使用PowerView对域对象ACL的操作方法,最后给出检测和防御建议。 0x01 简介 本文将要介绍以下内容: 提权方法复现 建立提权后门的方法 检测和防御建议 0x02 提权方法复现 测试环境: Server2012R2 x64 Exchange 2013 前置知识 1.常用缩写词 DN:Distinguished Name CN:Common Name OU:Organizational Unit DC:Domain Component ACE:Access Control Entries ACL:Access Control List LDAP连接服务器的连接字串格式为:ldap://servername/DN 其中DN有三个属性,分别是CN、OU和DC 2.安装Exchange后默认会自动添加一个名为Microsoft Exchange Security Groups的OU 如下图 其中包括两个特殊的组:Exchange...

  • SharpSniper利用分析

    0x00 前言 SharpSniper用于在域环境中找到指定域用户的IP地址,需要具有读取域控制器日志的权限,地址:https://github.com/HunnicCyber/SharpSniper 本文将要对SharpSniper的实现原理进行分析,扩展用法,分别介绍如何使用wevtutil.exe和powershell脚本实现相同的功能,分享其中需要注意的细节。 0x01 简介 本文将要介绍以下内容: SharpSniper实现原理 使用wevtutil实现 使用powershell实现 0x02 SharpSniper实现原理 通过查询域控制器上的用户登录日志(Event ID:4624),获得域用户使用过的IP地址 具体实现如下: 1.通过查询日志获得域用户使用过的IP XPath查询条件(以查询用户testb为例): "Event[System[(EventID=4624)] and EventData[Data[@Name='TargetUserName']='testb']]" 对应代码地址: https://github.com/HunnicCyber/SharpSniper/blob/master/QueryDC.cs#L16 2.通过正则表达式过滤出域用户使用过的IP 正则表达式: "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" \b表示单词的前或后边界 \d{1,3}表示字符个数在1到3位之间 .表示匹配字符”.” 对应代码地址: https://github.com/HunnicCyber/SharpSniper/blob/master/Program.cs#L54 0x03 使用wevtutil实现 1.查询指定用户(以查询用户testb为例)的登录日志 cmd命令如下: wevtutil qe security /format:text /q:"Event[System[(EventID=4624)] and EventData[Data[@Name='TargetUserName']='testb']]" 包括每条日志的详细信息,如下图 2.从详细信息中提取出ip 这里可以借助find命令进行筛选 cmd命令如下: wevtutil qe security /format:text /q:"Event[System[(EventID=4624)]...

  • GookitBankingTrojan中的后门利用分析

    0x00 前言 Gootkit Banking Trojan在2014年被首次发现,最近Daniel Bunce(@ 0verfl0w_)介绍了一些对于Gootkit Banking Trojan的分析,文章地址如下: https://www.sentinelone.com/blog/gootkit-banking-trojan-persistence-other-capabilities/ 其中,Gootkit Banking Trojan使用的后门启动方法是独有的,所以本文仅在技术研究的角度复现Gootkit Banking Trojan使用的后门启动方法,分析利用思路,给出防御和检测的建议。 0x01 简介 本文将要介绍以下内容: 原理介绍 inf文件的基础知识 复现后门启动方法 分析利用方法 检测和防御建议 0x02 原理介绍 explorer.exe在运行时会加载特定的组策略对象(GPO),其中包括Internet Explorer Administration Kit(IEAK)的GPO 如果通过添加注册表的方式为IKAK创建一个Pending GPO,指向一个inf文件,那么在explorer.exe启动时,就会加载这个Pending GPO,执行inf文件中的内容 这个方法的优点是不需要管理员权限 0x03 inf文件的基础知识 inf全称Device INFormation File,是Microsoft为硬件设备制造商发布其驱动程序推出的一种文件格式 对大小写不敏感 文件格式: 由多个节组成,节名用方括号括起来 值得注意的节: 1.Version节 inf文件都包含这个节,用来描述支持的设备类型和适用的操作系统 signature="$CHICAGO$表示该inf文件适用于Windows98之后的所有操作系统 signature="$Windows NT$"表示该inf文件适用于Windows 2000/XP/2003操作系统 2.DefaultInstall节 默认情况下首先执行该节内的内容,通常包括文件拷贝、删除,注册表键值的更新,子键删除等功能,还支持执行命令:...

  • 《MiniDumpWriteDump via COM+ Services DLL》的利用测试

    0x00 前言 最近学习了odzhan文章中介绍的一个技巧,使用C:\windows\system32\comsvcs.dll的导出函数MiniDump能够dump指定进程的内存文件。 文章地址: https://modexp.wordpress.com/2019/08/30/minidumpwritedump-via-com-services-dll/ 本文将要结合自己的经验,补充在测试过程中需要注意的地方,扩展方法,分析利用思路。编写powershell脚本,实现自动化扫描系统目录下所有dll的导出函数,查看是否存在其他可用的dll,介绍脚本实现的细节。 0x01 简介 本文将要介绍以下内容: dump指定进程内存文件的常用方法 使用comsvcs.dll实现dump指定进程内存文件的方法 编写脚本实现自动化扫描dll的导出函数 利用分析 0x02 dump指定进程内存文件的常用方法 在渗透测试中,最常用的方法是通过dump进程lsass.exe,从中获得明文口令和hash 在原理上都是使用API MiniDumpWriteDump,参考资料: https://docs.microsoft.com/en-us/windows/win32/api/minidumpapiset/nf-minidumpapiset-minidumpwritedump 常用的实现方法如下: 1.procdump 参数如下: procdump.exe -accepteula -ma lsass.exe lsass.dmp 2.c++实现 https://github.com/killswitch-GUI/minidump-lib 3.powershell实现 https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1 4.c#实现 https://github.com/GhostPack/SharpDump 0x03 使用comsvcs.dll实现dump指定进程内存文件的方法 odzhan在文中给出了三种方法 1.通过rundll32 示例参数如下: rundll32 C:\windows\system32\comsvcs.dll, MiniDump 808 C:\test\lsass.dmp full 示例中lsass.exe的pid为808 注: 此处需要注意权限的问题,在dump指定进程内存文件时,需要开启SeDebugPrivilege权限 管理员权限的cmd下,默认支持SeDebugPrivilege权限,但是状态为Disabled,如下图 所以说,直接在cmd下执行rundll32的命令尝试dump指定进程内存文件时,由于无法开启SeDebugPrivilege权限,所以会失败 这里给出我的一个解决方法:...