Good in study, attitude and health

  • 通过Mono(跨平台.NET运行环境)执行shellcode

    0x00 前言 在上篇文章《通过Boolang语言执行shellcode的利用分析》介绍了利用Boolang语言执行shellcode的方法,本文将按照同样的思路,使用Mono(跨平台.NET运行环境)实现执行shellcode的功能,分析利用思路,给出防御建议 0x01 简介 Mono简介 Mono使用示例 通过Mono执行shellcode的方法 利用分析 防御检测 0x02 Mono简介 参考资料: https://www.mono-project.com/ https://github.com/mono/mono Mono是Microsoft .NET Framework的开源实现 包括C#编译器和通用语言架构 Mono项目不仅可以运行于Windows系统上,还可以运行于Linux,FreeBSD,Unix,OS X和Solaris 0x03 Mono使用示例 开发环境: Win7x64 下载Mono安装包,地址如下: https://www.mono-project.com/download/stable/#download-win 默认安装路径:C:\Program Files\Mono\ 1.编译程序输出hello world HelloWorld.cs的内容如下: using System; public class HelloWorld { public static void Main(string[] args) { Console.WriteLine ("Hello Mono World"); } }...

  • 通过Boolang语言执行shellcode的利用分析

    0x00 前言 在之前的文章《SILENTTRINITY利用分析》学习了C#利用IronPython引擎从内存加载payload的方法,我在byt3bl33d3r的GitHub上又看到了利用Boolang语言执行shellcode的代码,于是对这项技术做了研究。 本文将要介绍Boolang语言的特点和用法,分析通过Boolang语言执行shellcode的优点,给出防御检测的建议。 0x01 简介 本文将要介绍以下内容: Boolang语言简介 Boolang语言的用法 通过Boolang语言执行shellcode的实现代码 利用分析 防御检测 0x02 Boolang语言简介 学习资料: https://github.com/boo-lang/boo Boolang是面向对象的语言,结合了Python的语法,Ruby的功能以及C#的速度和安全性 具有如下特点: 语法非常接近Python,使用友好 静态类型,相比动态类型的Python,更加安全 可以扩充编译器,能够在.NET Framework或Mono上运行 代码开源 0x03 Boolang语言的用法 首先需要下载编译后的Boolang文件,地址如下: https://github.com/boo-lang/boo/releases 文件中包括以下三个可执行程序: booi.exe,用作执行脚本 booish.exe,实时编译程序,便于测试代码 booc.exe,用作编译脚本 具体用法如下: 1.使用booi.exe执行Boolang脚本 test.boo的内容如下: print "Hello, World!" 命令如下: booi.exe test.boo 结果如下图 2.使用booish.exe实时编译 启动booish.exe,在命令行输入如下代码: print "Hello, World!" 结果如下图 3.使用booc.exe编译Boolang脚本 test.boo的内容如下: print...

  • 利用IIS的模块功能绕过防火墙

    0x00 前言 在之前的文章《利用IIS的端口共享功能绕过防火墙》曾介绍了如下问题的解决方法: Windows服务器开启了IIS服务,防火墙仅允许80或443端口进行通信,那么如何在不使用webshell的前提下,实现对该服务器的远程管理?更进一步,如果只有低权限,有没有办法呢? 本文将介绍以上问题的另一种解决方法:利用IIS的模块功能绕过防火墙 0x01 简介 本文将要介绍以下内容: IIS的模块功能 使用c++开发模块 使用c#开发模块 IIS-Raid测试 利用分析 防御检测 0x02 IIS的模块功能 自IIS7开始,开发人员可以通过模块功能(Module)来扩展IIS的功能 参考资料: https://docs.microsoft.com/en-gb/iis/develop/runtime-extensibility/extending-web-server-functionality-in-net 如果我们通过模块功能可以读取HTTP请求的内容并控制HTTP回复的内容,完全可以利用模块功能实现对服务器的远程管理 IIS的模块以DLL的形式存在,加载后不会存在单独的进程 2018年,PaloAlto Unit42发现了APT34使用这种方式作为IIS后门,将其命名为RGDoor 本文将复现RGDoor的部分功能,着重介绍这种利用方法的检测和识别 0x03 使用c++开发模块 参考资料: https://docs.microsoft.com/en-gb/iis/develop/runtime-extensibility/develop-a-native-cc-module-for-iis IIS 7.0及更高版本允许通过以两种方式开发的模块来扩展服务器: 托管模块(Managed Module),使用托管代码(managed code)和ASP.NET服务器可扩展性API 本机模块(Native Module),使用本机代码(native code)和IIS本机服务器可扩展性API 参考资料中介绍了本机模块(Native Module)的使用方法 需要注意以下问题: 可以使用Visual Studio进行开发 DLL需要包含导出函数RegisterModule 使用CHttpModule作为模块类继承的实现 使用IHttpModuleFactory接口创建模块实例 1.模块开发 具体的实现代码可以参考IIS-Raid,地址如下: https://github.com/0x09AL/IIS-Raid 代码细节可参考: https://www.mdsec.co.uk/2020/02/iis-raid-backdooring-iis-using-native-modules/ IIS-Raid在RegisterModule函数注册了RQ_BEGIN_REQUEST和RQ_SEND_RESPONSE两个事件用来处理请求和响应...

  • 通过Network Security Services导出Firefox浏览器中保存的密码

    0x00 前言 在上一篇文章《渗透技巧——导出Firefox浏览器中保存的密码》介绍了导出Firefox浏览器密码的常用方法,其中firefox_decrypt.py使用NSS(Network Security Services)进行解密,支持key3.db和key4.db的Master Password解密。本文将要对其涉及的原理进行介绍,编写测试代码,实现对Master Password的验证,分享脚本编写的细节 0x01 简介 本文将要介绍如下内容: Network Security Services简介 通过python调用Network Security Services导出Firefox浏览器密码 开源python脚本 爆破脚本的实现 0x02 Network Security Services简介 Network Security Services(NSS)是一组旨在支持安全的客户端和服务器应用程序跨平台开发的库 参考文档: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS Firefox浏览器使用NSS作为加密算法和安全网络协议的基础库,在凭据加解密上使用了PKCS#11标准 参考文档: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/PKCS11 0x03 通过Python调用Network Security Services导出Firefox浏览器的密码 参考代码: https://github.com/unode/firefox_decrypt https://github.com/Kerisa/BrowserPasswordDump/blob/master/MozillaPwd.py Windows系统下的解密流程如下: 加载Network Security Services需要的nss3.dll 调用NSS_Init()进行初始化 调用PK11_GetInternalKeySlot()来获得internal slot(用作验证Master Password) 调用PK11_CheckUserPassword()验证Master Password 读取logins.json获得加密数据 调用PK11SDR_Decrypt()进行解密 具体需要注意的问题如下:...

  • 渗透技巧——导出Firefox浏览器中保存的密码

    0x00 前言 在之前的文章《渗透技巧——导出Chrome浏览器中保存的密码》介绍了导出Chrome浏览器密码的原理和利用方法,本文将要对导出Firefox浏览器密码的原理和利用方法进行介绍,分析利用思路。 0x01 简介 本文将要介绍以下内容: 密码保存方式 原理介绍 常用的导出工具 利用思路 0x02 密码保存方式 正常用户在访问网站时,可选择使用Firefox浏览器保存登录的用户密码,用于下次登录的时候Firefox自动填写登录密码 可以通过选择Logins and Passwords进行查看,如下图 包括以下信息: Website address Username Password Created Last modified Last used 所有记录保存在同一个文件中,具体位置为:%APPDATA%\Mozilla\Firefox\Profiles\xxxxxxxx.default\ 注: xxxxxxxx为8位随机字母和数字的组合 不同版本的Firefox保存记录的文件名称不同,具体区别如下: Version大于等于32.0,保存记录的文件为logins.json Version大于等于3.5,小于32.0,保存记录的文件为signons.sqlite 更详细的文件说明可参考: http://kb.mozillazine.org/Profile_folder_-_Firefox 不同版本Firefox的下载地址: http://ftp.mozilla.org/pub/firefox/releases/ 定位logins.json文件的位置可通过cmd命令实现,内容如下: dir %APPDATA%\Mozilla\Firefox\Profiles\*logins.json /s /b 查看logins.json文件的内容,如下图 其中encryptedUsername和encryptedPassword是加密的内容,解密需要获得密钥文件(key和iv)并作3DES-CBC解密 不同版本的Firefox密钥文件的位置不同,具体区别如下: Version小于58.0.2,密钥文件为key3.db Version大于等于58.0.2,密钥文件为key4.db 注: key3.db和key4.db的版本区别来源于https://github.com/lclevy/firepwd/blob/master/firepwd.py#L236 我在我的测试系统(Win7x64)下,安装64位Firefox,测试结果有所不同,具体如下: 如果Firefox的版本低于58.0,密钥文件为key3.db...

  • ProcessHider利用分析

    0x00 前言 ProcessHider能够在任务管理器和Process Explorer之类的监视工具中隐藏指定进程,本文将要介绍实现原理,分析代码细节。 0x01 简介 本文将要介绍以下内容: ProcessHider测试 ProcessHider的实现原理 ProcessHider的代码分析 ProcessHider的检测 0x01 简介 ProcessHider能够在任务管理器和Process Explorer之类的监视工具中隐藏指定进程 地址如下: https://github.com/M00nRise/ProcessHider 支持以下参数: pid 进程名 两种启动形式: exe powershell ProcessHider能够自动识别操作系统版本和进程位数,向32位和64位进程分别注入Payload.dll,通过Hook API NtQuerySystemInformation()实现进程隐藏 注入的代码使用Dll反射,地址如下: https://github.com/stephenfewer/ReflectiveDLLInjection Hook的代码使用NtHookEngine,地址如下: https://www.codeproject.com/Articles/21414/Powerful-x86-x64-Mini-Hook-Engine 参数实例: ProcessHider.exe -n "putty.exe" -x "procexp.exe" 能够在procexp.exe中隐藏进程名putty.exe,并且默认针对以下进程进行隐藏: Taskmgr.exe powershell.exe procexp.exe procexp64.exe perfmon.exe 注: 目前不支持对tasklist.exe的进程隐藏 编译时需要注意的问题: 工程ProcessHider需要编译成32位,不能编译成64位 这是因为工程ProcessHider包含了针对64位进程的识别和利用代码 0x02 ProcessHider的实现原理 工程ProcessHider实现流程如下:...

  • 渗透技巧——通过Kerberos pre-auth进行用户枚举和口令爆破

    0x00 前言 在之前的文章《渗透基础——通过LDAP协议暴力破解域用户的口令》介绍了通过LDAP协议暴力破解域用户口令的方法,最大的特点是会产生日志(4625 - An account failed to log on) 而使用kerbrute通过Kerberos pre-auth进行暴力破解时不会产生日志(4625 - An account failed to log on),于是我对kerbrute做了进一步的研究,使用python实现了相同的功能,并且添加支持TCP协议和NTLM hash的验证。本文将要记录自己的研究过程和学习心得。 0x01 简介 kerbrute的介绍 kerbrute的原理 使用python实现kerbrute的细节 开源代码pyKerbrute Kerberos pre-auth bruteforcing的检测 0x02 kerbrute的适用场景 适用场景:从域外对域用户进行用户枚举和口令暴力破解 由于没有域用户的口令,所以无法通过LDAP协议枚举出所有域用户,而且使用LDAP协议进行暴力破解时会产生日志(4625 - An account failed to log on) 使用kerbrute有如下优点: 使用Kerberos pre-auth bruteforcing的速度更快 不会产生日志(4625 - An account failed to...

  • 渗透基础——通过LDAP协议暴力破解域用户的口令

    0x00 前言 在域渗透中,如果已经掌握了一些域用户的口令,通常会选择寻找口令规律,生成字典文件,尝试对其他域用户的口令进行暴力破解。 站在防御的角度,需要确保域用户没有使用存在规律的弱口令,也需要能够发现暴力破解域用户口令的行为。 本文将要分别介绍在域内和域外暴力破解域用户口令的常用方法,结合利用思路,介绍检测方法。 0x01 简介 本文将要介绍以下内容: 域内暴力破解域用户口令的方法 域外暴力破解域用户口令的方法 检测方法 0x02 暴力破解域用户口令需要注意的问题 多次口令输入错误会导致用户帐户被锁定,默认设置的错误次数为5 用户帐户被锁定后,默认需要等待30分钟才能恢复使用 最后一次口令输入错误的时间会被记录,无法通过修改LDAP数据进行清除,提示如下: Error 0x209A Access to the attribute is not permitted because the attribute is owned by the Security Accounts Manager (SAM). 用户帐户被锁定后,即使输入正确的口令,也会提示口令错误 0x03 域内暴力破解域用户口令的方法 1.获得域内用户的口令策略,避免帐户被锁定 获取口令策略的详细方法可参考上篇文章《渗透基础——域内用户口令策略的获取》 2.获得所有域用户的列表 获取的详细方法可参考之前的文章《渗透基础——活动目录信息的获取》 这里需要额外对用户的属性进行判断,去除被禁用和被锁定的用户 (1)识别被禁用的用户 标识用户是否被禁用的位置位于userAccountControl属性中,具体的位置为0x0002 如下图 参考资料: https://support.microsoft.com/en-us/help/305144/how-to-use-useraccountcontrol-to-manipulate-user-account-properties 使用PowerView查看所有用户的ACCOUNTDISABLE属性,命令如下:...

  • 渗透基础——域内用户口令策略的获取

    0x00 前言 在域渗透中,我们在口令爆破前需要先获得域内用户的口令策略,以免在口令爆破时锁定用户 站在防御的角度,需要识别出口令爆破的攻击行为并采取防御措施 本文将要介绍获取域内用户口令策略的常用方法,结合利用思路分享检测域用户口令爆破的方法。 0x01 简介 本文将要介绍以下内容: 修改域用户口令策略的方法 域外获取域用户口令策略的方法 域内获取域用户口令策略的方法 检测方法 0x02 基础知识 我们需要关注以下口令策略: Maximum password age,表示密码过期的时间,默认为42 Minimum password length,表示密码的最小长度,默认为7 Account lockout duration,表示被锁定的帐户在自动解锁前保持锁定的分钟数,默认为30 Account lockout threshold,表示导致用户帐户被锁定的失败登录尝试次数,默认为5 Reset account lockout counter after,表示失败登录尝试计数器重置为0次错误登录尝试之前,失败登录尝试后必须经过的分钟数,默认为30 0x03 修改域用户口令策略的方法 域用户的口令策略默认保存在域内的默认组策略(Default Domain Policy)中,guid为{31B2F340-016D-11D2-945F-00C04FB984F9} 在域控制器上打开Group Policy Management,找到当前域,选择Default Domain Policy,右键选择编辑,如下图 依次打开Computer Configuration->Policies->Windows Settings->Security Settings->Account Policies,如下图 根据提示修改对应的选项 修改以后可以选择立即更新组策略使其立即生效,命令行输入: gpupdate...

  • 渗透基础——活动目录信息的获取

    0x00 前言 在域渗透中,活动目录信息的获取必不可少 本文将要以获取活动目录中所有用户、所有计算机和所有组为例,介绍常用的信息获取方法 0x01 简介 本文将要介绍以下内容: 域外获取活动目录信息的方法 域内获取活动目录信息的方法 使用C++调用ADSI接口获取信息的方法 0x02 基础知识 域环境使用directory database(目录数据库)来存储用户、计算机账户和组等对象 使用LDAP(Lightweight Directory Access Protocol)(轻量目录访问协议)来查询和更新目录数据库 常用缩写词 DN:Distinguished Name CN:Common Name OU:Organizational Unit DC:Domain Controller 其中DN有三个属性,分别是CN、OU和DC 简单理解: 域控制器默认会开启端口389,用作LDAP服务 0x03 域外获取活动目录信息的方法 1.Kali系统通过ldapsearch进行数据查询 测试环境如下图 前提:我们能够访问到域控制器(DC)的389端口,并且我们至少已经获得了域内一个普通用户的口令 这个测试环境中,我们获得了域内普通用户testa的口令为DomainUser123! 连接命令如下: ldapsearch -x -H ldap://192.168.1.1:389 -D "CN=testa,CN=Users,DC=test,DC=com" -w DomainUser123! -b "DC=test,DC=com" 参数说明: -x 进行简单认证...