靶机: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