内网渗透小记
内网+域环境渗透,小白记录
一、外网打点(flag1)
已知信息:目标企业的公网 ip:171.20.60.11,已有设备 kali 和 windows。
根据已有信息只有公网这一个资产,首先用 nmap 扫一下端口;同时直接用浏览器访问公网看看,没准开启了 web 端口。发现可以直接访问,是个 XAMPP。

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



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

纯文本输出,变量 pass 在第一行被取用,没有 isset() 判断,没有做输入校验,给了一个绝对路径,后面可能用得到,可以假设为 <?php if($_GET['pass']=='xxx'){...}?>。需要一个 pass,可以去猜一下。
传入了 pass=1,也是一样的结果,那么不是 GET,也不是 REQUEST,否则 ?pass=1 就定义了,只剩 POST 了,尝试 POST。

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



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

上线成功,至此拿到服务器控制权,flag1 到手。
二、2 段:128 永恒之蓝 / 129 Navicat(flag2、flag3)
在此基础上进行信息收集:查看本机信息、路由表、arp 缓存,在 arp 缓存中发现了 2.0 网段。

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

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


上传 agent 并连接,proxychains 指向 1090,使用 msf 拿下,并派生到 cs,拿到 flag2。
128 上的信息收集
接下来还有个同网段的 129,但在 128 上做信息收集没找到任何可用信息,除了一个 129,那么就接着尝试。
试了 smb 认证,没找到登录凭证;没有 admin 的 token 可以用,挂载注册表也失败;查看装机列表也没有有价值的程序。net user 只发现 admin 和 guest。
接着试一下 PTH,抓取本地哈希复用给 129。

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

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

但是很遗憾利用失败,只探到服务在跑,没验证出漏洞,这条路放弃。
换思路:从注册表里抠数据库密码
寻找其他方法(后面的部分试错就不贴图了)。
dir 查看了安装的软件,没看到有用软件,只有系统自带 + cain + winpcap,没有能存数据库密码的东西(这里只看了 x86 目录)。
尝试读管理员的注册表,被权限限制。beacon 虽然是 SYSTEM,但这个 token 是被过滤过的,SeRestorePrivilege 不在里面;ps 里全是服务进程,但是 winlogon.exe 跑在完整的 SYSTEM 下,可以偷他的 token,再挂注册表就成功了。


用工具直接猜一下路径,能执行那确实是装了 Navicat,挂上注册表后确实查到了。发现用户 root,密码被加密。
先确认版本为 Navicat Premium 16。pwd 只有 9 个字节,按 Navicat 11 的 blowfish 格式解出来是乱码,又试了 DES、换 KEY,均失败。
回头查看 64 位程序目录的时候找到了 premiumsoft,那么 Navicat 确实装了。

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


可以直接用工具跑。

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

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


至此拿到三台机器,flag3 到手。
三、3 段:WebLogic 与代理链(flag4)
接下来在 129 上继续做内网信息收集。

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

3.133 开启了五个端口,并且 7001 是个 WebLogic。
先继续使用 venom 把 3 段接到 kali:依旧上传 agent.exe,然后在 beacon 中执行,之后可以在 venom 中看到两个节点,使用 1091。

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

没有 Server 字段——正常的 WebLogic 会在响应头里报版本。
用 Proxifier 把 win7 攻击机接入代理链
win7 攻击机上有 weblogic 的工具和代理工具,考虑使用 proxifier 把它接入代理链。

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



配置完成后访问控制台并查看日志,控制台界面给出了具体的 server 版本 12.1.3.0.0。
下一步使用 win 攻击机上的 weblogic 工具尝试(真实环境有很多类似工具)。


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

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


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

由此拿到第四个 flag。
四、10 段:SQL Server 落地(flag5 / flag6)
前面在 ip 信息中 DNS 显示有 10 网段,使用 fscan 扫描发现两个目标。

- 10.12 是 SQL Server,fscan 直接爆破出账号密码:
sa / Aa123456 - 10.10 是 DC 服务器,可以使用 ms17-010
先打 12。在 133 的 beacon 中开一层 socks,注意这里默认开启的是 socks4a,在 kali 上的 proxychains 配置要同步为 socks4,否则会连不上(表现为端口显示 closed)。


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

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

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

但是这样直接通过 tmp 拉取会受到 UAC 的远程限制:windows 默认把本地管理员从网络登录降权,所以虽然 tmp 在 admin 组里,通过远程连接还是普通用户的身份。需要在 133 上加注册表开关:
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
然后再去拉取、复制、执行。

成功上线。

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

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

五、转向域控:ADCS 与 WinRM 的尝试
转换思路:12 提权去抓 sqlserver 的 NTLM,kerberoast 拿 TGS 破解去打进 DC。
先看一下 443,如果是 ADCS,那么 ESC8 加中继就能直接拿域管。

但是中继把 NTLM 给 /certsrv,petitPotam 只能让目标连接 SMB 的 445,目前 445 被占用,没法用来做监听——试过停 lanmanserver,服务停了端口还被 PID 4(内核)占着,不重启释放不出来。换其他思路再看看。
fscan 中的默认端口列表里没有 LDAP,所以可能 389/636 是开启的,去补扫一下。

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。

-
但这个密码登录不上。如果服务是在改密码之前配置的,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)。

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

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

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

-
然后对 dc 进行进一步信息收集。
-
用 AdFind 查询非约束委派的主机或服务用户:存在非约束委派的主机用户有
DC$和SQLSERVER$,域中不存在非约束委派的服务用户。 -
查询域中配置了约束委派的主机,并且可以看到被委派的 SPN。

然后收集证书模板漏洞,存在多个证书模板漏洞,其中 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 的机器身份。

然后获取 administrator 的 hash。

然后直接换 hash。

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

收尾
# 整域哈希(含 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。

至此打完整个域,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签发的证书
继续努力吧,长路漫漫任重道远,好焦虑,好焦虑,好焦虑,好焦虑,好焦虑

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']); ?>↩︎

浙公网安备 33010602011771号