Good in study, attitude and health

  • 域渗透——使用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...

  • 渗透基础——Exchange Autodiscover的使用

    0x00 前言 Autodiscover是Exchange的一个服务,用来简化客户端应用程序的配置流程。用户只需要输入自己的电子邮件地址和密码,就能够通过Autodiscover服务获取运行客户端应用程序所需的配置信息。 在渗透测试中,当我们获得了一个邮件用户的凭据,能够通过Autodiscover服务挖掘出更多有价值的信息。 本文将要介绍通过Autodiscover服务读取配置信息的方法,开源实现代码,分享利用思路。 0x01 简介 本文将要介绍以下内容: 通过Autodiscover进行口令爆破的方法 通过Autodiscover读取配置信息的方法 通过Autodiscover访问Exchange邮件资源的方法 0x02 通过Autodiscover进行口令爆破的方法 对应的URL:https://<domain>/autodiscover/autodiscover.xml 验证方式:NTLM Over HTTP Protocol(分别支持明文和NTLM hash登录) 登录失败返回401 登录成功返回200,内容示例: <?xml version="1.0" encoding="utf-8"?> <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006"> <Response> <Error Time="01:37:11.6638388" Id="2403276782"> <ErrorCode>600</ErrorCode> <Message>Invalid Request</Message> <DebugData /> </Error> </Response> </Autodiscover> 我们可以看到,Autodiscover的验证流程同EWS基本相同,所以在代码实现上也可以参照之前的代码checkEWS.py 这里不再重复介绍,具体细节可参考之前的文章《渗透技巧——Pass the Hash with Exchange Web Service》 实现代码可参照checkAutodiscover.py中的checkautodiscover功能 0x03 通过Autodiscover读取配置信息的方法 直接通过浏览器访问https://<domain>/autodiscover/autodiscover.xml...

  • 渗透技巧——获得Exchange GlobalAddressList的方法

    0x00 前言 Exchange GlobalAddressList(全局地址列表)包含Exchange组织中所有邮箱用户的邮件地址,只要获得Exchange组织内任一邮箱用户的凭据,就能够通过GlobalAddressList导出其他邮箱用户的邮件地址。 本文将要介绍在渗透测试中不同条件下获得Exchange GlobalAddressList的常用方法,分享程序实现的细节,最后介绍禁用GlobalAddressList的方法 0x01 简介 本文将要介绍以下内容: 获得Exchange GlobalAddressList的方法 程序实现 禁用GlobalAddressList的方法 0x02 获得Exchange GlobalAddressList的方法 1.通过Outlook Web Access(OWA) 需要获得邮件用户的明文口令,登录OWA后,选择联系人->All Users 2.通过Exchange Web Service(EWS) 对于Exchange 2013及更高版本,可以使用FindPeople操作 参考资料: https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/findpeople-operation?redirectedfrom=MSDN 这里需要注意,FindPeople操作时必须指定搜索条件,无法通过通配符直接获取所有结果 变通的解决方法: 遍历26个字母a-z,以此作为搜索条件,能够覆盖所有结果 对于Exchange2010及更低版本,只能使用ResolveName操作 参考资料: https://docs.microsoft.com/en-us/dotnet/api/microsoft.exchange.webservices.data.exchangeservice.resolvename?redirectedfrom=MSDN&view=exchange-ews-api 这里需要注意,ResolveName操作每次最多只能获得100个结果,如果GlobalAddressList中的邮箱用户大于100,那么无法直接获得完整结果 变通的解决方法: 使用ResolveName操作时加入搜索条件,确保每次获得的结果能够少于100,接着通过多次搜索实现对全部结果的覆盖 通常使用的方法: 搜索条件为任意两个字母的组合,例如aa、ab、ac….zz,总共搜索26*26=676次,一般情况下能够覆盖所有结果 3.通过Outlook客户端使用的协议(MAPI OVER HTTP和RPC over HTTP) 登录用户,选择联系人->通讯簿 Outlook客户端通常使用的协议为RPC、RPC over HTTP(也称作Outlook Anywhere)和MAPI over...

  • 渗透基础——Exchange用户邮箱中的隐藏文件夹

    0x00 前言 对于Exchange用户邮箱,可通过设置文件夹属性创建隐藏文件夹,用户使用owa网页登录和使用Outlook均无法查看隐藏文件夹中的内容。 站在渗透测试的角度,我们可以利用隐藏文件夹存储重要的信息,作为C2通信的数据通道。 本文将要介绍隐藏文件夹的使用方法,通过程序实现创建、访问和删除隐藏文件夹,结合利用思路给出防御建议。 0x01 简介 本文将要介绍以下内容: 隐藏文件夹的创建原理 隐藏文件夹的常用操作 使用EWS Managed API的实现代码 使用EWS SOAP XML message的实现代码 开源代码 防御检测 0x02 隐藏文件夹的创建原理 参考资料: https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-work-with-hidden-folders-by-using-ews-in-exchange 对于Exchange用户邮箱,将文件夹的扩展属性PidTagAttributeHidden(0x10F4000B)设置为true时,该文件夹对于用户不可见 默认配置下,Exchange用户邮箱包括多个常用文件夹,例如收件箱、发件箱和草稿等,详细列表可参考:https://docs.microsoft.com/en-us/dotnet/api/microsoft.exchange.webservices.data.wellknownfoldername?view=exchange-ews-api#Microsoft_Exchange_WebServices_Data_WellKnownFolderName_MsgFolderRoot 我们可以在根目录或者任一文件夹(例如收件箱)下创建一个文件夹,将其扩展属性PidTagAttributeHidden(0x10F4000B)设置为true,那么这个文件夹就是隐藏文件夹,对于用户不可见。同时,隐藏文件夹下的所有邮件对用户也是不可见的。更进一步,隐藏文件夹下的邮件内容和附件内容对用户同样不可见。但是我们只要知道了隐藏文件夹的Id,就能够通过程序进行数据交互。 通过程序进行数据交互时,需要考虑以下操作: (这里以在Inbox下创建隐藏文件夹为例) 在Inbox下创建文件夹 查看Inbox下的文件夹列表 在Inbox下创建隐藏文件夹 查看Inbox下的隐藏文件夹列表 查看指定文件夹(无论是否具有隐藏属性)下的邮件列表 在指定文件夹(无论是否具有隐藏属性)下创建邮件 删除指定文件夹 为指定邮件添加附件 0x03 使用EWS Managed API的实现代码 1.在Inbox下创建文件夹 private static void CreateFolderofInbox(ExchangeService service) { Folder folder =...

  • 渗透技巧——使用Transport Agent作为Exchange后门

    0x00 前言 ESET研究发现了一个专门针对Microsoft Exchange的恶意软件LightNeuron,使用一种从未见过的持久性技术:Transport Agent,能够实现以下功能: 阅读和修改通过邮件服务器的任何电子邮件 撰写并发送新电子邮件 阻止任何电子邮件。原始收件人将不会收到电子邮件 参考资料: https://www.welivesecurity.com/2019/05/07/turla-lightneuron-email-too-far/ https://www.welivesecurity.com/wp-content/uploads/2019/05/ESET-LightNeuron.pdf 本文仅在技术研究的角度,介绍Transport Agent的用法,编写代码实现不同的功能,结合利用思路给出防御建议 0x01 简介 本文将要介绍以下内容: Transport Agent基础知识 Transport Agent的用法 使用Transport Agent监控邮件 使用Transport Agent修改邮件 使用Transport Agent删除邮件 使用Transport Agent启动程序 防御检测 0x02 Transport Agent基础知识 参考资料 https://docs.microsoft.com/en-us/previous-versions/office/developer/exchange-server-2010/dd877026(v=exchg.140) 1.Transport Agent 可以用来扩展和修改Exchange的传输行为,以自定义消息的接受,拒绝,路由和传递,以及在各种类型的内容之间进行转换 简单理解,Transport Agents作为Exchange的插件,能够对Exchange的传输行为进行扩展和修改,例如读取、修改和删除传输的每一份邮件 2..NET Framework Extensions for Exchange Microsoft.Exchange.Data命名空间提供了便于执行以下任务的类型: 读写MIME数据 将消息正文和其他文本从一种编码转换为另一种编码 读取和写入TNEF数据 读写日历和约会 转换消息格式;例如,从HTML到RTF...