DC-5 主要记录包含漏洞的发现与利用思路

靶机:DC-5 192.168.56.106

攻击机:kali 192.168.56.1

探索靶机

这里思路都相同

查一下rpcbind是什么。

rpcbind是一个RPC服务,主要是在nfs共享时候负责通知客户端,服务器的nfs端口号的。简单理解RPC就是一个中介服务。

打开网页查看一下

搜集可利用信息

网站没有什么cms系统

这里我打算扫描网站目录,看看有什么没有暴露出来的网页功能

这里我出现了一个问题是,dirb在扫描这个靶机时好像一直连接不上,最终使用的是dirbuster扫描

dirbuster扫描结果

发现包含漏洞

浏览网页后会发现footer.php并没有被网站拿出来,我们单独看看这个文件是什么内容

这个东西我叫做版权信息

我们并不能从这个footer.php利用到什么。

这个时候查看网站的功能,Contact模块是网站的唯一交互功能,我们随意编写内容提交,

会发现网页出现新的thankyou.php,这个文件似乎会接收参数,我们修改参数看有什么变化

会发现下方的版权消息会改变,我们再去看看footer.php,确实也变了

至少这边能看出来有包含关系,至于这个文件包含漏洞是怎么利用的,作为菜鸡的我来说完全不知道呀。至于大佬们猜测文件怎么包含的,我是没有思路的。因为我感觉这里并不像传统的filename?=file 的样式。

我们就按照大佬们的来,其实说实话,这里也只能这么做了,这里也没有cms,网站后台也没有,只有点包含关系可以利用,我们就强行fuzz

thankyou?fuzz=footer.php,fuzz就是我们接受文件的参数,现在我们区爆破这个参数。后面的文件只要存在就可以,footer.php index.php都可以

在爆破前我们要在网页上测试一下不同的fuzz有什么区别

只有Thankyou.php

猜测传递参数

多次猜测后发现不对劲,这个如果页面的版权信息是来自footer.php文件,那么应该只有对的参数才能引用到这个文件。现在怎么每个参数都可以区引用这个文件。

那么这里估计是thankyou.php本身就引用好了这个文件,如果输入文件是其它文件就引用其它文件,否则还是引用footer文件。

猜测网页伪代码

If (fuzz != null):

Include(fuzz)

Else:

Include(footer.php)

至于为什么footer.php一直在变,我觉得是作者给我们的一个提示吧,因为这里的版权信息一直在变,所以大概率不是thank.php本身编写的版权信息,谁会去写版权信息的年份一直变呀,除非包含文件的不恰当会出现这总失误。

所以我觉得这里能解释通为什么要去fuzz包含漏洞

接着我们去fuzz吧,所以我们这里不能使用footer.php,由网页伪代码知道,我们怎么做都会包含这个footer.php,这样网页就没有变化了,这里我们替换为index.php

爆破结果

测试一些这个file到底有没有问题吧

file=index.php

file=faq.php,背景问题看不到这里的字,选中一下就看到了

这里确实存在文件包含了,到底有没有文件包含漏洞呢。

测试一下本机一般会有的文件就知道了

file=/etc/passwd

试一下有没有远程包含漏洞利用

似乎没有,嗯,那就只利用本地包含漏洞了,虽然不好利用。

既然确定存在本地包含漏洞,我们还是满足一下好奇心,来看看这个footer.php文件到底怎么写的

因为本地文件包含漏洞可以利用一下php://filter读取文件

http://192.168.56.106/thankyou.php?file=php://filter/convert.base64-encode/resource=footer.php

我们把这段解码,可以看到这个文件。


<?php
//Random Gen Test
$rndmYears = array(
    "Copyright © 2017", 
    "Copyright © 2018", 
    "Copyright © 2019", 
    "Copyright © 2020"
);
echo $rndmYears[mt_rand(0, count($rndmYears)-1)];
?>

Thankyou.php文件如下(只展现php代码):
 

<?php
    $file = $_GET['file'];
    if(isset($file))
    {
        include("$file");
    }
    else
        include("footer.php");
    }
?>

发现和我们想的差不多

在有些情况下我们能利用这个技术来做代码审计

利用日志

通过日志利用本地包含漏洞

尝试寻找nginx的日志文件,里面会记录请求的信息。通过请求信息来注入恶意代码。nginx日志文件默认放在/var/log/nginx下,以.log结尾,使用burp爆破一下:

这里可以发现一个通用日志和一个错误日志,这两个都是可以被利用的。

这里我看到有大佬查看的nginx的配置文件

这些都是默认存放位置,可以用来碰碰运气。也可以使用目录枚举的方式找到这些敏感文件的位置,可惜我没有好用的字典。希望得到大家的分享。

查看一下这些日志,到底记录的什么

先分析下日志文件中是怎么记录的,寻找可以注入日志的方式

我发送的其中一个包如下,我修改了请求行中请求的url资源为一段php脚本

该包的响应消息

浏览器表示没找到这个url资源

在日志文件中找到如下,发现我们的php脚本是已经被解析了的。

结合请求包信息和日志文件内容

可以发现日志文件会记录请求包中的请求行,响应包消息中的状态码,user-agent。我们可以从这几个点中去注入

我这里利用的是请求行中的请求的url

复现出现的问题

在做完实验写博客复现时,遇到了一个问题

我注入了如下内容

然后日志文件不会返回任何内容

我查看了下错误日志分析,大概意思就是php解析错误,php脚本中出现了语法错误

PHP message: PHP Parse error: syntax error, unexpected 'world' (T_STRING), expecting ',' or ';' in /var/log/nginx/access.log on line 9164"

大概意思是world后面应该有个中止符号。但我感觉这里并没有问题。

这个时候连接日志文件中已经写入的木马也不可以了。

我后面使用错误日志重新获取了shell,并提权到了root权限,清空了日志,重新测试一下才发现了问题所在。

(这里记录一下收获的清空文件内容给的命令echo > access.log

注入的双引号会被转换为\x22,后面区查询了下,nginx一般会自动转换算双引号,所以这里会引起这个错误。

在注意注入的时候一定不要出现语法错误什么的,要不是这个日志文件就不能被利用了。至于有没有修复失误的方法,希望有大佬可以提供一点技术支持。

 

后面为正常的利用访问日志的方法

注入phpinfo测试一下

在文件包含漏洞中,包含的文件内容中的php脚本会被解析处理,我们看到日志文件被包含调用时,php脚本并没有显示出来,那么就是被解析了。

写入一句话木马

然后使用菜刀连接日志文件即可

获取shell的另外一个小技巧

这里获取webshell是通过写入一句话木马,我们也可以写入system执行命令的函数,然后传递参数就可以被sytem函数执行

1.写入执行命令的函数(如system函数)

2.利用参数传递命令


这里突然发现在burp里面更好看到数据的回显,数据都分行了,看网页上回显的内容眼睛都要看瞎了。这里算是获取了经验。
后面便可以传递nc连接命令之类的获取shell了。

 

提权

上传一个php脚本,作用是反弹一个shell

使服务器解析这个文件

这里攻击机是提前监听的

模拟终端操作

寻找可以提权的资源

Linux screen命令用于多重视窗管理程序。在有的版本中存在提权漏洞

搜索screen漏洞

查看利用方式

安装资源中的说明,我们下载先编写一个libhax.c文件,并编译。我这里是现在攻击机上编译好了再上传到靶机上。

编写rootshell.c文件并编译

可以使用菜刀把编译好的资源上传到靶机上,我们这里的菜刀并不能找到/tmp目录,需要上传后自行移动。

按照漏洞资源中最后给出的命令逐条执行,就可以成功提权。

去root目录下获取flag

 


版权声明:本文为xy_sunny原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。