LCTF Web Travel复现

关于比赛

这场CTF可以说打的非常怀疑人生了,上次护网杯还能挖点东西出来,这次可以说是被按在地上摩擦,毫无游戏体验。。。

看了大神的WP才发现还有这么多东西,Web题还能这么玩。。

0x00 题目内容

给了一个地址,显示出来的内容是这样的

# -*- coding: utf-8 -*-

from flask import request, render_template
from config import create_app
import os
import urllib
import requests
import uuid

app = create_app()

@app.route('/upload/<filename>', methods = ['PUT'])
def upload_file(filename):
    name = request.cookies.get('name')
    pwd = request.cookies.get('pwd')
    if name != 'lctf' or pwd != str(uuid.getnode()):
        return "0"
    filename = urllib.unquote(filename)
    with open(os.path.join(app.config['UPLOAD_FOLDER'], filename), 'w') as f:
        f.write(request.get_data(as_text = True))
        return "1"
    return "0"

@app.route('/', methods = ['GET'])
def index():
    url = request.args.get('url', '')
    if url == '':
        return render_template('index.html')
    if "http" != url[: 4]:
        return "hacker"
    try:
        response = requests.get(url, timeout = 10)
        response.encoding = 'utf-8'
        return response.text
    except:
        return "Something Error"

@app.route('/source', methods = ['GET'])
def get_source():
    return open(__file__).read()

if __name__ == '__main__':
    app.run()

显然是一个flask框架的python Web程序了

看到有/网页目录,访问一下康康

homepage

0x01 题目分析

从python代码看来,需要上传一个文件,但是上传文件时需要用户名为lctf,密码为网卡mac地址的10进制值。
这里就很奇怪了,因为一般网卡mac地址是用读文件/sys/class/net/eth0/address获取到的
考虑用SSRF提交一个file协议的内容,利用叶姐姐的302跳转bypass验证,但是还是不行。发现python的request库没有扩展无法访问file协议读取文件内容,然后这里就卡住了

看了WP才知道,这里要用到一个很有意思的信息收集–服务器是腾讯云的,而腾讯云有API供查询云服务器的mac地址。。。。

地址是http://metadata.tencentyun.com/latest/meta-data/mac,通过SSRF提交这个payload就获取到了mac地址。。

但是还有一个很奇怪的疑点是叶姐姐发现的

if name != 'lctf' or pwd != str(uuid.getnode()):
        return "0"

我操,好像题目被改了????

当我啥都没说吧,以前那个if中间是and连接的

有了mac地址,尝试去PUT请求服务器,发现有405报错

POST405

PUT405

这里其实我发现了POST405错误的内容和PUT405错误的内容是不同的,但是不知道有啥疑点,后来看了WP发现可以用X-HTTP-Method-Override,算是新学了一个bypass

PUTbypass

后面的东西实属是脑洞了,有了任意文件写入,就可以用目标穿越写入一个SSH Key。。(这是我第一次见到还能写SSH Key去拿shell的。。)

WriteSSHKey

SSHLogin

顺便普通的URL编码似乎没有办法,会造成400Bad Request,需要double urlencode。。这个还得求证一下

顺便,flag是一段哈希,目测是md5,破译了下发现是个QQ号或者少了一位的手机号??不知道是什么彩蛋

0x02 总结

这个题目感觉真的脑洞很大,有蜜汁信息收集,还有蜜汁拿到shell
总结一下这个题目涉及到的内容

  • 信息收集 利用腾讯云提供的API收集信息,例如网卡的mac地址
  • SSRF 利用上一条的API获得服务器信息
  • HTTP请求限制bypass 利用X-HTTP-Method-Override绕过Nginx的PUT请求限制
  • 任意文件写入 可写入一个SSH Key来拿到shell。。。我觉得太奇怪了,脑洞是真的大

总结下没有做出来的原因吧

首先是405卡住了,没有想到X-HTTP-Method-Override绕过请求限制
信息收集不是重点,因为刚放题的那段时间题目有bug,只要name对了就可以提交请求的
hint3给的是header,当时看到chunked以为是CRLF,等于是在错误的方向上整了半天
hint2也没有看懂什么意思,没想到这里还有个API能拿到mac地址

总体感觉脑洞很大,但是应该不是特别特别难的题,收获还是很多的

发表评论

发表评论

沙发空缺中,还不快抢~