WeChall - Training - WWW-Basics

Challenge

在本机或公网服务器搭建 HTTP 服务器,从外部可访问,提供指定路径和内容的文件。WeChall 会从你登录时的来源 IP 发起回调验证。

挑战页面会给出具体的参数(每个 session 不同):

  • URL 路径: http://<IP>:<port>/<USER>/<USER>.html
  • 文件内容: My name is <USER> and iChall.(精确字节数)
  • 字节数要求精确,不能多换行符

Solution

核心问题: WeChall 根据你登录时的来源 IP 发起回调验证。如果你的机器在 NAT/VPN 后面没有公网 IP,就无法直接验证。

解决方案: 在一台有公网 IP 的服务器上(VPS)搭建 Web 服务,从该服务器登录 WeChall 并提交。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1. 在公网服务器上创建文件(USER 替换为 challenge 页面给你的值)
mkdir -p /tmp/<USER>
echo -n 'My name is <USER> and iChall.' > /tmp/<USER>/<USER>.html

# 2. 启动 HTTP 服务器
cd /tmp && python3 -m http.server <PORT> &

# 3. 用 Python 从服务器登录 WeChall 并提交端口
python3 -c "
import urllib.request, urllib.parse, http.cookiejar

cj = http.cookiejar.MozillaCookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]

# Login (填入自己的 WeChall 账号)
opener.open('https://www.wechall.net/en/login', timeout=30)
data = urllib.parse.urlencode({'username':'<WC_USER>','password':'<WC_PASS>','login':'Login'}).encode()
opener.open(urllib.request.Request('https://www.wechall.net/en/login', data=data), timeout=30)

# Submit port
data = urllib.parse.urlencode({'port':'<PORT>','go':'I have set it up. Please check my server.'}).encode()
opener.open(urllib.request.Request('https://www.wechall.net/en/challenge/training/www/basic/index.php', data=data), timeout=30)
"