-
域渗透——AS-REPRoasting
0x00 前言 AS-REP Roasting同Kerberoasting类似,如果满足条件,就能够获得用户口令的hash,再结合hashcat进行破解,最后能够还原出用户的明文口令。 本文将要参考公开资料,结合自己的理解,介绍AS-REP Roasting的利用方法,最后给出防御建议。 0x01 简介 本文将要介绍以下内容: AS-REP Roasting的原理 AS-REP Roasting的利用条件 AS-REP Roasting的利用方法 破解hash的方法 防御建议 0x02 AS-REP Roasting 1.简介 对于域用户,如果设置了选项”Do not require Kerberos preauthentication”,此时向域控制器的88端口发送AS-REQ请求,对收到的AS-REP内容重新组合,能够拼接成”Kerberos 5 AS-REP etype 23”(18200)的格式,接下来可以使用hashcat对其破解,最终获得该用户的明文口令 2.利用前提 域用户设置了选项”Do not require Kerberos preauthentication” 通常情况下,该选项默认不会开启 3.利用思路 通常在域渗透中用来维持权限 需要先获得对指定用户的GenericWrite权限,利用思路如下: 开启用户选项”Do not require Kerberos preauthentication” 导出hash并破解 关闭用户选项”Do not require Kerberos...
-
域渗透——DCSync
0x00 前言 DCSync是域渗透中经常会用到的技术,本文会对开源的资料进行整理,结合自己的经验,总结利用和防御检测的方法 0x01 简介 本文将要介绍以下内容: 利用DCSync导出域内所有用户hash的方法 利用DCSync在域内维持权限的方法 自动化检测DCSync后门的方法 0x02 利用DCSync导出域内所有用户hash的方法 DCSync是mimikatz在2015年添加的一个功能,由Benjamin DELPY gentilkiwi和Vincent LE TOUX共同编写,能够用来导出域内所有用户的hash 利用条件: 获得以下任一用户的权限: Administrators组内的用户 Domain Admins组内的用户 Enterprise Admins组内的用户 域控制器的计算机帐户 利用原理: 利用DRS(Directory Replication Service)协议通过IDL_DRSGetNCChanges从域控制器复制用户凭据 参考资料: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/f977faaa-673e-4f66-b9bf-48c640241d47 实现代码: https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/lsadump/kuhl_m_lsadump_dc.c#L27 利用方法: 1.使用mimikatz 导出域内所有用户的hash: mimikatz.exe "lsadump::dcsync /domain:test.com /all /csv" exit 导出域内administrator帐户的hash: mimikatz.exe "lsadump::dcsync /domain:test.com /user:administrator /csv" exit 2.powershell实现 https://gist.github.com/monoxgas/9d238accd969550136db...
-
利用AlwaysInstallElevated提权的测试分析
0x00 前言 利用AlwaysInstallElevated提权是一个2017年公开的技术,Metasploit和PowerUp都提供了利用方法 我在研究的过程中,发现Metasploit的利用方法存在一些不足,我遇到了和其他公开文章描述不一样的情况 于是我做了进一步的研究,本文将要介绍我遇到的问题和解决方法 0x01 简介 本文将要介绍以下内容: 常规利用方法 我在测试中遇到的问题 解决方法 扩展利用思路 0x02 常规利用方法 AlwaysInstallElevated是一个组策略配置,如果启用,那么将允许普通用户以SYSTEM权限运行安装文件(msi) 启用方法: 需要修改以下两个组策略: Computer Configuration\Administrative Templates\Windows Components\Windows Installer User Configuration\Administrative Templates\Windows Components\Windows Installer 设置成Enabled,如下图 注: 无法通过secedit.exe在命令行下修改以上两个组策略 命令行下的启用方法: 创建以下两个注册表项: HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer,AlwaysInstallElevated,1 HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer,AlwaysInstallElevated,1 cmd的命令如下: reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1 reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t...
-
Shellcode生成工具Donut测试分析
0x00 前言 Donut是一个shellcode生成工具,可以将.NET程序集转换为shellcode。这是对execute-assembly的进一步利用,隐蔽性更高,可扩展性更强。 结合byt3bl33d3r的SILENTTRINITY,将其转换为shellcode并进行注入,适用性更广。 本文将会对Donut进行测试,逐个分析Donut工程中的代码,总结这个工具的特点。 注: 本文测试的版本使用的是Donut v0.9,新版本将会添加更多的功能,值得持续关注 Donut地址: https://github.com/TheWover/donut 介绍Donut细节的文章: https://thewover.github.io/Introducing-Donut/ https://modexp.wordpress.com/2019/05/10/dotnet-loader-shellcode/ https://modexp.wordpress.com/2019/06/03/disable-amsi-wldp-dotnet/ 0x01 简介 本文将要介绍以下内容: 相关技术介绍 源码结构 实际测试 利用分析 0x02 相关技术介绍 1.Assembly.Load 用于在当前进程中加载.NET程序集,无法注入其他进程 .NET程序集的测试代码: namespace ConsoleApplication1 { public class Program { public static void test() { System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = "c:\\windows\\system32\\calc.exe"; p.Start(); } static void...
-
从内存加载.NET程序集(execute-assembly)的利用分析
0x00 前言 Cobalt Strike 3.11中,加入了一个名为”execute-assembly”的命令,能够从内存中加载.NET程序集。这个功能不需要向硬盘写入文件,十分隐蔽,而且现有的Powershell利用脚本能够很容易的转换为C#代码,十分方便。 本文将会对”execute-assembly”的原理进行介绍,结合多个开源代码,介绍实现方法,分析利用思路,最后给出防御建议 0x01 简介 本文将要介绍以下内容: 基础知识 正常的实现方法 开源利用代码分析 利用思路 防御建议 0x02 基础知识 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/ 用于将.NET 程序集加载到任意程序中的API 支持两种接口: ICorRuntimeHost Interface ICLRRuntimeHost Interface 3.ICorRuntimeHost Interface 参考资料: https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/hosting/icorruntimehost-interface 支持v1.0.3705, v1.1.4322, v2.0.50727和v4.0.30319 4.ICLRRuntimeHost Interface 参考资料: https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/hosting/iclrruntimehost-interface 支持v2.0.50727和v4.0.30319 在.NET Framework 2.0中,ICLRRuntimeHost用于取代ICorRuntimeHost...
-
Mimikatz中SSP的使用
0x00 前言 Mimikatz中的mimilib(ssp)和misc::memssp同sekurlsa::wdigest的功能相同,都能够从lsass进程中提取凭据,通常可获得已登录用户的明文口令(Windows Server 2008 R2及更高版本的系统默认无法获得),但实现原理不同,所以绕过高版本限制的方法也不同 我对XPN的第二篇文章进行了学习,对这个技术有了新的认识,于是尝试对这个技术进行总结,添加一些个人的理解 XPN的博客: https://blog.xpnsec.com/exploring-mimikatz-part-2/ 0x01 简介 本文将要介绍以下内容: SSP简介 如何开发SSP 如何枚举和删除SSP 添加SSP的三种方法 memssp修改内存的方法 0x02 SSP简介 参考资料: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn751052(v=ws.11) SSP,全称Security Support Provider,又名Security Package SSPI,全称Security Support Provider Interface,是Windows系统在执行认证操作所使用的API 简单的理解为SSPI是SSP的API接口 SSP默认包括以下几种: Kerberos Security Support Provider NTLM Security Support Provider Digest Security Support Provider Schannel Security Support Provider Negotiate Security Support...
-
Mimikatz中sekurlsa::wdigest的实现
0x00 前言 Mimikatz中sekurlsa::wdigest是渗透测试中经常会用到的功能,它能够从lsass进程中提取凭据,通常可获得已登录用户的明文口令(Windows Server 2008 R2及更高版本的系统默认无法获得,需要修改注册表等待用户再次登录才能获得) XPN在他的博客中记录了对WDigest的研究心得,开源了一个POC,通过C++实现了在Win10_1809 x64下从lsass进程中提取凭据 本文将会对XPN的POC进行扩展,使其支持Win7/Win8/Windows Server2008/Windows Server2008 R2/Windows Server2012/Windows Server2012 R2,记录程序实现的细节与过程 XPN的博客: https://blog.xpnsec.com/exploring-mimikatz-part-1/ POC: https://gist.github.com/xpn/12a6907a2fce97296428221b3bd3b394 0x02 简介 本文将要介绍以下内容: 实现思路 程序实现细节 0x03 实现思路 提升至Debug权限 获得lsass进程句柄 枚举lsass进程中全部模块的句柄,定位wdigest.dll和lsasrv.dll在内存中的位置 从lsasrv.dll中获得InitializationVector,AES和3DES的值,用于解密 从wdigest.dll中获得每条凭据的信息,判断加密算法,解密获得明文口令 具体说明如下: 1. 提升至Debug权限 代码可直接使用之前的代码: https://github.com/3gstudent/Homework-of-C-Language/blob/master/CheckCriticalProess.cpp#L14-L29 2. 获得lsass进程句柄 通过CreateToolhelp32Snapshot创建进程快照 遍历进程列表 搜索进程lsass.exe,获得pid 获得lsass进程句柄 3. 枚举lsass进程中全部模块的句柄,定位wdigest.dll和lsasrv.dll在内存中的位置 通过EnumProcessModules枚举lsass进程中全部模块的句柄 4. 从lsasrv.dll中获得InitializationVector,AES和3DES的值,用于解密 不同系统的偏移位置不同,详细可参考mimikatz的源码: https://github.com/gentilkiwi/mimikatz/blob/68ac65b426d1b9e1354dd0365676b1ead15022de/mimikatz/modules/sekurlsa/crypto/kuhl_m_sekurlsa_nt6.c#L8-L32 偏移不同的位置有以下四个:...
-
Use COM Object hijacking to maintain persistence——Hijack Outlook
0x00 前言 APT组织Trula使用的一个后门利用方法,通过COM劫持实现在Outlook启动时加载dll,特点是只需要当前用户的权限即可实现。 本文将参考公开的资料对这个方法进行测试,编写一个自动化利用脚本,扩展用法,分享多个可用的劫持位置,结合利用思路给出防御建议 参考资料: https://www.welivesecurity.com/wp-content/uploads/2018/08/Eset-Turla-Outlook-Backdoor.pdf 0x01 简介 本文将要介绍以下内容: 利用方法 Powershell脚本实现细节 扩展用法 防御建议 0x02 利用方法 Outlook在启动时会加载多个COM对象,我们可以通过修改注册表的方式劫持Outlook的启动过程,用来加载DLL 这里的利用方法需要添加两个注册表,修改两个COM对象 由于是修改HKCU的注册表,所以使用当前用户权限即可 (1)COM对象1,用来加载第二个COM对象 添加如下注册表: HKCU\Software\Classes\CLSID\{84DA0A92-25E0-11D3-B9F7-00C04F4C8F5D}\TreatAs = {49CBB1C7-97D1-485A-9EC1-A26065633066} 通过命令行实现的命令如下: reg add HKCU\Software\Classes\CLSID\{84DA0A92-25E0-11D3-B9F7-00C04F4C8F5D}\TreatAs /t REG_SZ /d "{49CBB1C7-97D1-485A-9EC1-A26065633066}" /f (2)COM对象2,用来加载DLL 添加如下注册表: HKCU\Software\Classes\CLSID\{49CBB1C7-97D1-485A-9EC1-A26065633066} = Mail Plugin HKCU\Software\Classes\CLSID\{49CBB1C7-97D1-485A-9EC1-A26065633066}\InprocServer32 = [Path to the backdoor DLL] HKCU\Software\Classes\CLSID\{49CBB1C7-97D1-485A-9EC1-A26065633066}\InprocServer32\ThreadingModel = Apartment 通过命令行实现的命令如下: reg...
-
域渗透——利用dnscmd在DNS服务器上实现远程加载Dll
0x00 前言 由Shay Ber公开的一个利用方法,在域环境中,使用DNSAdmin权限能够在DNS服务器上实现远程加载Dll。这不算漏洞,但可以作为一个域渗透的技巧,本文将结合自己的经验整理这个利用技巧,添加自己的理解,对照利用思路给出防御建议。 参考资料: https://medium.com/@esnesenon/feature-not-bug-dnsadmin-to-dc-compromise-in-one-line-a0f779b8dc83 0x01 简介 本文将要介绍以下内容: 详细利用方法 防御思路 0x02 详细利用方法 利用条件: 已获得域内DnsAdmins,Domain Admins或者Enterprise Admins组内用户的口令或者hash 注: 默认配置下,不仅仅是DnsAdmins组内的用户,Domain Admins或者Enterprise Admins组内的用户也可以 1、查看关键组内的用户 查看所有的组: net group /domain 查看DnsAdmins组内的用户: 无法使用net group命令查看,可以使用PowerView查看 import-module .\PowerView.ps1 Get-NetGroupMember -GroupName "DNSAdmins" 查看Domain Admins组内的用户: net group "Domain Admins" /domain 查看Enterprise Admins组内的用户: net group "Enterprise Admins" /domain 2、获得关键用户的口令或者hash 需要获得DnsAdmins,Domain...
-
渗透技巧——获得Powershell命令的历史记录
0x00 前言 我在最近的学习过程中,发现Powershell命令的历史记录有时会包含系统敏感信息,例如远程服务器的连接口令,于是我对Powershell的历史记录功能做了进一步研究,总结一些渗透测试中常用导出历史记录的方法,结合利用思路,给出防御建议。 0x01 简介 本文将要介绍以下内容: 两种Powershell命令的历史记录 导出Powershell命令历史记录的方法 防御建议 0x02 两种Powershell命令的历史记录 记录Powershell命令的历史记录有两种方式,可分别使用Get-History和Get-PSReadlineOption读取 1、Get-History 参考文档: https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Core/Get-History?view=powershell-3.0 默认Powershell v2及以上支持 能够记录当前会话中输入的命令,多个Powershell进程之间不共享,Powershell进程退出后自动清除所有记录 1. 常用命令 获得历史记录的完整信息: Get-History | Format-List -Property * 包括: Id CommandLine ExecutionStatus StartExecutionTime EndExecutionTime 测试如下图 删除所有历史记录: Clear-History 按ID号删除命令: Clear-History -Id 3 2. 利用思路 获得了一台Windows系统的权限,发现后台有Powershell进程,想要读取Powershell进程中的历史记录 (1)Powershell进程无法接收键盘输入命令 例如Powershell加载了一个在后台运行的脚本:Powershell -ep bypass -f 1.ps1 此时无法向Powershell进程发送键盘消息,这时可以通过读取进程的命令行参数获得有用的信息,开源代码: https://github.com/3gstudent/Homework-of-C-Language/blob/master/GetProcessCommandLine.cpp...