Challenge
WeChall 会请求你服务器的
/WechallUsername/[0-9]+_mul_[0-9]+.html
路径,你的服务器需返回两数乘积。
表单只提交 port,IP 由 WeChall 自动检测(从请求的 TCP 源 IP)。
Solution
需要一台满足两个条件的机器: 1. 公网 IP 可被 WeChall 访问(入站) 2.
能出站到 WeChall(提交表单)
方案:临时 Vultr VPS
用 vultr-cli 在 Frankfurt 区域开一台 Debian 12 VPS:
1 2 3 4 5 6
| sudo pacman -S vultr-cli export VULTR_API_KEY='your-api-key'
vultr-cli instance create --region fra --plan vc2-1c-1gb --os 2136 --host wechall-ctf
|
拿到 IP 和 root 密码后:
1 2 3 4 5 6 7 8 9 10 11
| scp rw.py root@IP:/tmp/ ssh root@IP 'nohup python3 /tmp/rw.py 8889 > /tmp/rw.log 2>&1 &'
ssh root@IP 'ufw allow 8889/tcp'
curl -b 'WC=YOUR_COOKIE' \ -d 'port=8889&go=I+have+set+it+up.+Please+check+my+server.' \ 'https://www.wechall.net/en/challenge/training/www/rewrite/index.php'
|
Rewrite Server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import http.server, re, sys
class H(http.server.BaseHTTPRequestHandler): def do_GET(self): m = re.match(r'^/WechallUsername/([0-9]+)_mul_([0-9]+)\.html$', self.path) if m: r = str(int(m.group(1)) * int(m.group(2))) self.send_response(200) self.send_header('Content-Type', 'text/plain') self.end_headers() self.wfile.write(r.encode()) else: self.send_response(200) self.end_headers() self.wfile.write(b'ready')
httpd = http.server.HTTPServer(('0.0.0.0', int(sys.argv[1])), H) httpd.serve_forever()
|
注意事项
- 注意开放 UFW/iptables 端口(Vultr Debian 默认 INPUT DROP)
- Vultr 防火墙组也要加规则,或者不用 Vultr 防火墙直接用 UFW
- 用完删实例避免继续计费:
vultr-cli instance delete <ID>
- 最低成本 ~$0.004/hr(vc2-1c-1gb 约 $5/月,按小时计费)