impacket解读(三. smbclient、secretsdump)

admin 2025年1月26日23:46:40评论15 views字数 5152阅读17分10秒阅读模式
声明:文中涉及到的技术和工具,仅供学习使用,禁止从事任何非法活动,如因此造成的直接或间接损失,均由使用者自行承担责任。

众亦信安,中意你啊!

点不了吃亏,点不了上当,设置星标,方能无恙!

impacket解读(三. smbclient、secretsdump)
点不了吃亏,点不了上当,设置星标,方能无恙!
完整记录公众号回复 250120
目录:
一、smbclient浅析
二、secretsdump浅析

一、smbclient浅析

简介

模拟SMB客户端进行SMB连接;

协议:SMB;

测试环境

win2019(DC):192.168.1.4

win10(attack):192.168.1.3

win2016(目标主机):192.168.1.10

测试命令如下:

python smbclient.py domain.local/administrator:"Admin@123"@192.168.1.10

相关截图如下:

impacket解读(三. smbclient、secretsdump)

代码解读

主函数处理解析输入参数后,初始化SMBConnection()类,进行SMB协商;继续调用smbClient.login()函数进行身份认证;

impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)

接着调用MiniImpacketShell类,生成一个cmd命令行,通过输入自带命令来对目标SMB服务器进行交互,测试命令中输入shares(列出所有共享目录);

进入do_shares()函数中,接着调用self.smb.listShares()函数,进行RPC 连接,接口为srvsvc,再调用srvs.hNetrShareEnum()查询共享文件路径;

impacket解读(三. smbclient、secretsdump)
impacket解读(三. smbclient、secretsdump)

对应流量如下:

impacket解读(三. smbclient、secretsdump)

报错解决

报错内容:module 'collections' has no attribute 'Callable'

impacket解读(三. smbclient、secretsdump)
在脚本开启写入如下代码:
import collectionscollections.Callable = collections.abc.Callable

总结

本次对smbclient.py脚本代码进行简单的分析,该脚本实现了简单的SMB客户端对服务器的各种操作。

二、secretsdump浅析

简介

调用各种技术来转储哈希值(离线+在线)

测试环境

win2019(DC):192.168.1.4

win10(attack):192.168.1.3

测试命令

python secretsdump.py domain.local/administrator:"Admin@123"@192.168.1.4
命令截图如下:
impacket解读(三. smbclient、secretsdump)

代码解读

主函数调用parse_target()函数获取输入的域名、用户名、密码、目标主机,下面的多个if判断是否符合离线破解条件,也就是输入时只有LOCAL,例子如下:

# 离线破解ntdspython secretsdump.py -system/root/vssown/SYSTEM-ntds /root/vssown/ntds.dit LOCAL
impacket解读(三. smbclient、secretsdump)

处理输入参数后,将参数带入到DumpSecrets类中,并调用类中的dump()函数;

impacket解读(三. smbclient、secretsdump)
进入dump()函数中,首先if判断是否为离线破解模式,再通过判断system参数是否存在,用两种不同的方式获取存储引导密钥bootKey;
impacket解读(三. smbclient、secretsdump)
由于我们例子里的命令为远程获取,所以进入else中,if判断-ldapFilter是否存在,存在则先进行LDAP连接,再调用self.connect()进行SMB连接;
impacket解读(三. smbclient、secretsdump)
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
继续else条件代码中,建立SMB连接后,初始化RemoteOperations类,调用类中setExecMethod函数设置命令执行的方式(默认smbexec,设置-use-vvs参数时才会起作用),进入if判断调用类中enableRegistry()函数,该函数分别调用了self.__connectSvcCtl()self.__checkServiceStatus()self.__connectWinReg()
impacket解读(三. smbclient、secretsdump)
impacket解读(三. smbclient、secretsdump)
进入self.__connectSvcCtl()函数中,该函数连接目标主机的SCMR服务管理器
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
进入self.__checkServiceStatus()函数中,该函数查看目标主机上远程注册表服务(RemoteRegistry)是否处于开启状态,如果未开启就将其开启;
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
进入self.__connectWinReg()函数中,该函数连接目标主机的远程注册表服务;
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
连接目标主机远程注册表服务之后,调用self.__remoteOps.getBootKey()函数,通过遍历目标主机的远程注册表中特定目录的值通过解析拼装获取bootKey;
impacket解读(三. smbclient、secretsdump)
对用流量如下(只截取了访问JD的流量):
impacket解读(三. smbclient、secretsdump)
继续else条件代码,调用self.__remoteOps.checkNoLMHashPolicy()函数查看目标域内是否开启了NoLmHash策略(是否存储LMHash);
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
继续dump()函数,又一个if判断是否self.__useKeyListMethod为真,也就是设置了-use-keylist参数(Kerb-Key-List-Req攻击,通过RODC获取可复制的用户hash);
impacket解读(三. smbclient、secretsdump)
我们例子中没有设置,所以进入else条件代码中,进入子级if条件中,再进入if判断self.__isRemote是否为True,进入if中调用self.__remoteOps.saveSAM()函数;
impacket解读(三. smbclient、secretsdump)

进入self.__remoteOps.saveSAM()函数中,接着调用self.__retrieveHive('SAM')函数,步骤如下:

rrp.hOpenLocalMachine -- 打开目标注册表,获取句柄;

rrp.hBaseRegCreateKey -- 打开储存hivename键的句柄;

rrp.hBaseRegSaveKey -- 获取hivename的值并保存到8位随机值的tmp文件中;

rrp.hBaseRegCloseKey -- 关闭存储hivename 键的句柄;

rrp.hBaseRegCloseKey -- 关闭注册表句柄;

再初始化RemoteFilel类将获取的

impacket解读(三. smbclient、secretsdump)
类RemoteFile初始化函数中调用self.__smbConnection.connectTree('ADMIN$')连接目标ADMIN$文件夹;
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
继续dump()函数,将self.__remoteOps.saveSAM()的结果SAMFileName带入到初始化SAMHashes类中;
impacket解读(三. smbclient、secretsdump)
SAMHashes类继承OfflineRegistry类;
impacket解读(三. smbclient、secretsdump)
类OfflineRegistry初始化函数中,调用winregistry.Registry()函数;
impacket解读(三. smbclient、secretsdump)
再进入Registry类的初始化函数中,调用self.__hive.open()函数,也就是RemoteFile类中的open()函数;
impacket解读(三. smbclient、secretsdump)
进入open函数中,用while True循环一直打开上面生成的tmp文件内容;
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
继续Registry类初始化函数,调用self.fd.read(4096)也就是RemoteFile类中的read()函数;
impacket解读(三. smbclient、secretsdump)
进入read函数中,又调用了self.__smbConnection.readFile()函数,循环读取tmp文件,每次读4096个字节直到读取至文件末尾;
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
继续Registry类初始化函数,调用self.__findRootKey()函数;将文件读取指针调整到文件开头,再从新读取该tmp文件获取rootkey,在此SAMHashes类初始化函数中重要的函数已解读完毕;
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
SAMHashes类初始化后,调用类中的dump()函数;
impacket解读(三. smbclient、secretsdump)
进入SAMHashes类的dump()函数中,该函数将获取到的SAM密文解密成hash;self.getHBootKey()函数获取HashedBootKey,self.enumKey()函数遍历usersKey中的rid,然后循环解密rid对应目标本地用户的hash;
impacket解读(三. smbclient、secretsdump)
impacket解读(三. smbclient、secretsdump)
返回到DumpSecrets类中的dump函数,调用self.__remoteOps.saveSECURITY()函数,也就是RemoteOperations类中的saveSECURITY()函数;
impacket解读(三. smbclient、secretsdump)
impacket解读(三. smbclient、secretsdump)
saveSECURITY()函数接着调用self.__retrieveHive('SECURITY')获取目标主机注册表中security的值并保存到特定目录中,再通过SMB协议获取该文件;根上面获取sam的值一样,所以就不详细介绍了;
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
接着初始化LSASecrets类,跟上面SAMHashes一样,会读取目标主机上secrity值的临时文件,对应流量如下:
impacket解读(三. smbclient、secretsdump)
接着调用self.__LSASecrets.dumpCachedHashes()函数解密缓存域登录信息;
impacket解读(三. smbclient、secretsdump)
impacket解读(三. smbclient、secretsdump)
再调用self.__LSASecrets.dumpSecrets()函数解密转储 LSA Secrets;
impacket解读(三. smbclient、secretsdump)
继续DumpSecrets类中的dump函数,if判断self.__isRemote不提去ntds.dit,接着初始化NTDSHashes类,并调用类中的dump()函数;
impacket解读(三. smbclient、secretsdump)
进入dump()函数中,调用self.__remoteOps.connectSamr()函数连接目标samr服务,获取目标Domain句柄和DomainId;
impacket解读(三. smbclient、secretsdump)
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
继续NTDSHashes类中dump()函数,经过多个if判断,最后调用self.__resumeSession.beginTransaction()函数创建一个临时文件,后续会将获取内容写入该文件中;
impacket解读(三. smbclient、secretsdump)
impacket解读(三. smbclient、secretsdump)

因为我们没有设置获取特定域用户hash或者ldapFilter,所以进入else条件中,while循环status不变就一直循环,进入循环先调用`self.__remoteOps.getDomainUsers()`函数获取目标域内所有用户;

impacket解读(三. smbclient、secretsdump)
impacket解读(三. smbclient、secretsdump)

对应流量如下:

impacket解读(三. smbclient、secretsdump)
获取到域内所有用户后,用for循环获取每个用户名和sid值,再调用self.__remoteOps.DRSCrackNames()函数获取crackedName;
impacket解读(三. smbclient、secretsdump)
进入DRSCrackNames()函数中,因为self.__drsr为空,继续调用self.__connectDrds()函数;
impacket解读(三. smbclient、secretsdump)
再进入__connectDrds()函数中,先进行DRSUAPI前期的epm请求、rpc绑定等操作;
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
再构造发送DRSBind请求包,创建调用本接口中任何其他方法所需的上下文句柄。
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
接着调用drsuapi.hDRSDomainControllerInfo()函数进行DomainControllerInfo请求,检索给定域中 DC 的信息;
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
返回DRSCrackNames()函数中,接着调用drsuapi.hDRSCrackNames()函数,进行DsCrackNames请求,解析用户的sid值;
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)
接着返回到NTDSHashes类的dump()函数中,通过获取到的crackedName解析再调用self.__remoteOps.DRSGetNCChanges()函数从域控上的 NC 副本复制更新,再调用self.__decryptHash()函数解密获取请求用户的hash并输出到控制台上,最后调用self.__resumeSession.writeResumeData()函数将解密的域用户sid写入到上面创建的临时文件中;
impacket解读(三. smbclient、secretsdump)
对应流量如下:
impacket解读(三. smbclient、secretsdump)

接着调用self.__decryptSupplementalInfo()函数,该函数是解密用户账户的 Supplemental Credentials 信息,特别是 Kerberos Keys,并将解密后的信息存储在字典中;

impacket解读(三. smbclient、secretsdump)

继续NTDSHashes类的dump()函数中,如果获取到了kerberosKey则调用self.__perSecretCallback()函数将kerberosKey处理并输出到控制台上,如果没有报错将执行finally条件中的代码关闭相关文件流;

impacket解读(三. smbclient、secretsdump)
接着返回到DumpSecrets类的dump()函数中,调用selfcleanup()函数进行连接关闭等相关清理代码;
impacket解读(三. smbclient、secretsdump)
impacket解读(三. smbclient、secretsdump)

总结

本次对secretsdump.py脚本代码进行简单分析,只是将平时内网常用的参数功能进行分析,该脚本代码量较大,相对来讲比较复杂,而且里面涉及到一些解密相关的操作,没有详细解读,本文仅针对了流量层进行了解读。

点点关注不迷路,每周不定时持续分享各种干货。可关注公众号回复"进群",也可添加管理微信拉你入群。

impacket解读(三. smbclient、secretsdump)

原文始发于微信公众号(众亦信安):impacket解读(三. smbclient、secretsdump)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月26日23:46:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   impacket解读(三. smbclient、secretsdump)https://cn-sec.com/archives/3674529.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息