Good in study, attitude and health

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

    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...

  • 渗透技巧——通过Exchange ActiveSync访问内部文件共享

    0x00 前言 Exchange ActiveSync是一种Microsoft Exchange同步协议,用于在邮件服务器和移动设备之间同步邮件资源。 Adam Rutherford和David Chismon在他们的文章中介绍了通过Exchange ActiveSync访问内部文件共享的方法 文章地址: https://labs.f-secure.com/archive/accessing-internal-fileshares-through-exchange-activesync/ 本文将要基于他们的研究,介绍通过Exchange ActiveSync访问内部文件共享的细节,记录研究心得。 0x01 简介 本文将要介绍以下内容: 通过Exchange ActiveSync验证用户邮箱口令 Exchange ActiveSync开源代码测试 通过Exchange ActiveSync访问内部文件共享的细节 防御检测 0x02 基础知识 Exchange ActiveSync是一种Microsoft Exchange同步协议,该协议经过优化,以适用于高延迟和低宽带网络。 该协议基于HTTP和XML,使移动设备可以访问其电子邮件、日历、联系人和任务,并且在脱机工作时仍可以继续访问这些信息。 简单理解,计算机用户通过owa(Outlook Web Access)访问邮件资源,手机用户通过eas(Exchange ActiveSync)访问邮件资源 0x03 通过Exchange ActiveSync验证用户邮箱口令 默认对应的URL:/Microsoft-Server-ActiveSync 可以直接通过浏览器进行访问,提示输入用户名和口令 输入正确的用户名和口令后,返回内容如下图 如果没有凭据,可直接通过wget命令获得服务器信息,命令实例: wget https://192.168.1.1/Microsoft-Server-ActiveSync --no-check-certificate --debug 返回结果如下图 为了能够通过脚本实现口令验证,这里需要使用OPTIONS方法,如果凭据有效,返回状态码200 header部分加入HTTP基本认证(Basic Authentication),格式为Authorization: Basic <string>...

  • 渗透基础——SSH日志的绕过

    0x00 前言 SSH是一种网络协议,用于计算机之间的加密登录,通常用于远程登录Linux系统。 在渗透测试中,通常需要考虑SSH的口令爆破和日志删除。 本文将要介绍一些渗透测试相关的基础内容,结合利用方法给出检测建议。 0x01 简介 本文将要介绍以下内容: 程序实现SSH口令验证 SSH日志的删除 SSH日志的绕过 防御检测 0x02 程序实现SSH口令验证 1.Python实现 使用第三方库paramiko库,用法很简单 我的代码已上传至github,地址如下: https://github.com/3gstudent/Homework-of-Python/blob/master/sshCheck.py 代码支持口令登录和证书文件登录 2.C#实现 使用第三方库SSH.NET,地址如下: https://github.com/sshnet/SSH.NET 编译好的dll下载地址: https://github.com/sshnet/SSH.NET/releases/download/2016.1.0/SSH.NET-2016.1.0-bin.zip 参考文档: https://github.com/sshnet/SSH.NET/releases/download/2016.1.0/SSH.NET-2016.1.0-help.chm 在程序中引入Renci.SshNet.dll后,用法也十分简单 在编写程序上需要注意以下问题: (1)使用证书登录 SSH.NET对证书的格式有要求,SSH.NET-2016.1.0-help.chm上提示必须为BEGIN RSA PRIVATE KEY,如下图 而使用命令ssh-keygen -t rsa时,默认是以新的格式生成密钥文件,格式为BEGIN OPENSSH PRIVATE KEY,这里需要做一个转换 解决方法: 使用puttygen转换,下载地址: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 选择Load导入密钥 导出方法: Conversions->Export OpenSSH key 所以在编写程序上需要先读取证书的文件内容,判断格式是否正确 我的代码已上传至github,地址如下: https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpSSHCheck_SSH.NET.cs...

  • Exchange Web Service(EWS)开发指南2——SOAP XML message

    0x00 前言 在之前的文章《Exchange Web Service(EWS)开发指南》开源了工具ewsManage,实现了对Exchange资源的访问。 本文将要更近一步,通过SOAP XML message实现利用hash对Exchange资源的访问。 0x01 简介 本文将要介绍以下内容: 利用hash访问Exchange资源的方法 SOAP XML message的使用 开源Python实现代码 代码开发细节 0x02 利用hash访问Exchange资源的方法 在之前的文章《渗透技巧——Pass the Hash with Exchange Web Service》介绍了使用hash登录ews的方法 本文将要基于之前的研究,介绍登录ews以后访问Exchange资源的方法,所以在程序实现上会继续选择Python,使用EWS SOAP XML message访问Exchange的资源 对于EWS SOAP XML message的格式,有以下两种方法进行参考: 1.查找资料 https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/get-started-with-ews-client-applications https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/ews-xml-elements-in-exchange 2.抓包分析 配置Wireshark,实现在Exchange Server上面捕获明文通信数据 使用ewsManage访问Exchange资源 捕获通信数据,能够获得不同操作对应的EWS SOAP XML message格式,示例如下图 0x03 SOAP XML message的使用 相比于EWS...

  • 渗透技巧——Pass the Hash with Exchange Web Service

    0x00 前言 在之前的文章《渗透技巧——Pass the Hash with Remote Desktop Protocol》介绍了使用hash登录RDP的方法,本文将要继续介绍使用hash登录ews的方法。 我们知道,通过mimikatz的over pass the hash和ews的使用当前凭据登录能够实现使用hash登录ews,相关细节可参考《Exchange Web Service(EWS)开发指南》 但缺点是需要获得管理员权限并对lsass进程进行操作,无法同时对多个用户验证。 所以本文将要介绍更为通用的方法,开源实现脚本,记录思路和开发过程。 0x01 简介 本文将要介绍以下内容: 解密Exchange的通信数据 使用hash登录ews的思路 开源代码 0x02 解密Exchange的通信数据 Exchange默认使用TLS协议对数据进行加密,我们通过Wireshark抓包的方式只能获得加密后的内容,需要进行解密 这里分别介绍Exchange Server和Exchange Client捕获明文通信数据的方法 1.Exchange Server捕获明文通信数据的方法 (1)在Exchange Server上导出证书文件 使用mimikatz,命令如下: mimikatz.exe crypto::capi "crypto::certificates /systemstore:local_machine /store:my /export" 注: 如果不使用命令crypto::capi,无法导出带有私钥的证书文件(pfx文件) 这条命令会导出多个证书文件,如下图 为了找到Exchange通信数据使用的证书文件,我们可以采用如下方法: 访问Exchange登录页面,通过查看证书的有效期找到对应的证书文件,如下图 也可以通过命令行实现对证书信息的获取,代码可参考:https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SSLCertScan.cs 测试如下图 (2)配置Wireshark Edit ->...

  • 渗透技巧——Pass the Hash with Remote Desktop Protocol

    0x00 前言 在之前的文章《渗透技巧——Pass the Hash with Remote Desktop(Restricted Admin mode)》介绍了特定条件下(Server需要开启Restricted Admin mode,Client需要支持Restricted Admin mode)Pass the Hash with Remote Desktop的方法,本文将要介绍更为通用的方法(通过NTLM hash登录RDP),分析原理,开源代码,记录细节。 0x01 简介 本文将要介绍以下内容: 渗透测试中的需求 验证口令或者NTLM hash的实现方法 C实现代码 Python实现代码 C sharp实现代码 0x02 渗透测试中的需求 如果是开发远程桌面服务的客户端,可供选择的方法有很多,例如通过C#调用ActiveX组件AxMSTSCLib 详细方法可参考:https://www.codeproject.com/Articles/43705/Remote-Desktop-using-C-NET 但是在渗透测试中,我们有以下两个需求: 1.验证口令或者hash 需要满足以下条件: 可以在Windows和Linux系统上运行 登录方式支持明文口令和NTLM hash 命令行下使用 2.远程登录 可以在Windows和Linux系统上运行 登录方式支持明文口令和NTLM hash 0x03 验证口令或者hash的实现方法 为了支持NTLM hash登录,需要对协议和加密方式有所了解 关于RDP协议的参考资料:https://github.com/FreeRDP/FreeRDP/wiki/Reference-Documentation...