LCTF 2018 Writeup

Web

Travel

这题的信息搜集手法很有意思,可以说,针对目前所有的云服务商均可以使用这一方法来进行一定程度上的信息搜集。
首先是关键部分的代码:

@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"

我们可以看出,这题的意思非常明显了。pwd变量 == 网卡地址,获得这个值即可任意文件写入。而获取这个值的方法是SSRF。
一般来说,获取网卡地址,需要一个任意文件读取来配合,以便读取/sys/class/net/eth0/address。在这里,如果题目是使用PHP的话几乎一下子就能做出来了。但题目是Python + requests库。requests库的底层是urllib,而没有任何扩展的urllib仅支持httphttps协议,因此我们没有办法读取任意文件。
——但这是CTF题目,我们查一查IP,就能发现是腾讯云的机器。既然是云服务商,那么通常就会有一个metadata的API。例如,Amazon EC2,就可以通过 http://169.254.169.254 来获取metadata,而所有基于OpenStack搭建的云服务也都使用这个地址。

因此,让我们搜索腾讯云的文档,很容易就能搞出payload:http://118.25.150.86/?url=http://metadata.tencentyun.com/latest/meta-data/mac

接着是下一个坑点。使用PUT上传数据,发现被405了……

观察POST和PUT的提示,发现它们不同,因此可以确认是Nginx层面上禁止了PUT。Flask对这个问题有解决方案,即X-HTTP-Method-Override头。直接写上即可。后面的内容相对偏向脑洞了。直接通过任意文件写+目录穿越写一个SSH Key。(第一次见到写SSH Key的……)

Read More

2018 黑盾杯网络空间安全技能竞赛 Writeup

新闻链接:福大代表队勇夺福建省2018年“黑盾杯”网络空间安全技能竞赛冠军

9月16日,由福建省委网信办、福建省教育厅、福建省公安厅等部门联合主办的福建省2018年国家网络安全宣传周网络空间安全技能竞赛(高校组“黑盾杯” 赛项)在福建师范大学旗山校区举行。我们非常荣幸地参与了这一赛事,并拔得了头筹。本次比赛没有任何难题,相对来说题目较为基础,比较适合新人学习。因此,我们公开了这么一篇Write-up,以供读者参考。

由于部分题目实在是太基础了,例如,通过右键源代码就能看到的题目。这部分我们就不再赘述。

题目下载地址:
1. (Pwn + RE) magicheap和Win逆向
2. (MISC) 这是啥呀
3. (MISC) reverseMe
4. (Web) 流量审计

Read More