TQLCTF2022 network tools 出题笔记
TQLCTF是奇安信技术研究院和清华大学网研院一块儿办的比赛,题目主要是由清华网研院的同学命题的,题目质量很高,我当时在奇安信研究DNS缓存污染,复现了USENIX21的一篇论文,正好拿来出题,题目源码公开在 https://github.com/ElegantCrazy/tqlctf2022_networktools 本题出题思路来自于Injection Attacks Reloaded: Tunnelling Malicious Payloads over DNS,通过在DNS资源记录中插入控制字符,从而影响DNS的解析结果,或是插入不符合域名规范的特殊字符,最终实现DNS缓存污染、SQL注入、XSS等效果。 论文中提到nodejs的CNAME解析存在\0截断问题,根据CVE-2021-22931,定位到问题出现于nodejs的dns库,而dns库又调用了c-ares这一基于C的广泛使用的域名解析库,经测试,CNAME解析\0截断的问题在最新版本1.18.1中依然存在。 这张图可以非常清楚地解释\0截断导致的DNS缓存污染问题,其中\000指的是8进制0对应的字符,即\0: 本题基于图中场景构建3个容器,分别是flask应用程序、dnsmasq和基于c-ares的DNS转发器。其中flask应用程序储存flag,可以执行ping、traceroute命令,并可以向[token].ftp.testsweb.xyz下载并上传文件,其中token是随机生成的8个字符,还有一个限制本地访问的webshell,源码如下: from flask import Flask, request, send_from_directory,session,redirect from flask_session import Session from io import BytesIO import re import os import ftplib from hashlib import md5 app = Flask(__name__) app.config['SECRET_KEY'] = os.urandom(32) app.config['SESSION_TYPE'] = 'filesystem' sess = Session() sess.init_app(app) def exec_command(cmd, addr): result = '' if re.match(r'^[a-zA-Z0-9.:-]+$', addr) != None: with os.popen(cmd % (addr)) as readObj: result = readObj.read() else: result = 'Invalid Address!...