WeChall - Training - WWW-Rewrites

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
# 安装 CLI
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
# 部署 rewrite server
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/月,按小时计费)