😎

ICTSC2024二次予選 Writeup

2024/12/08に公開

この記事はAkitoshi's Advent Calendar 2024の7日目の記事です。

どうもヨワヨワです。
ICTSC2024の二次予選に結束baundとして初めて参加しました。
強い先輩の足を引っ張りながらもなんとか少しの戦力?には慣れたのではないかと思っています。
何とか1つ問題を解くことができたので、writeupを書いてみようと思います。
Advent Calendar書かないとなということで書いているので内容が薄いかもしれませんがお許しください。

  • 取り組んだ問題
    • [NGX] にゃーん
    • [KOB] Vyos初めてです

[KOB] Vyos初めてです

あまり力になれなかったので特に書くことなし。
もっと精進します。

[NGX] にゃーん

目標

user@client:~$ client -url http://192.168.255.71
Response Status: 200 OK
Response Body: OK!

現状

user@client:~$ client -url http://192.168.255.71
Response Status: 400 Bad Request

原因究明

エラーログには何もなかった(´;ω;`)
アクセスログは以下のようになっている

user@server:~$ sudo cat /var/log/nginx/access.log
192.168.255.70 - - [07/Dec/2024:13:16:29 +0900] "GET / HTTP/1.1" 400 242 "-" "Go-http-client/1.1"

最初/etc/nginx/sites-available/defaultを見に行っていじっていたが関係なかった。
そこでサーバー側でパケットキャプチャをしてみた。

user@server:~$ sudo tcpdump -i eth0 -A port 80
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
14:10:28.164822 IP 192.168.255.70.53248 > server.http: Flags [S], seq 1102017411, win 64240, options [mss 1460,sackOK,TS val 417707011 ecr 0,nop,wscale 7], length 0
E..<.p@.@.3l...F...G...PA.s.........z..........
............
省略

パケットキャプチャのログから400 Bad Request の具体的なエラー原因が分かった。

HTTP/1.1 400 Bad Request
Content-Length: 242
...
400 Request Header Or Cookie Too Large

つまり、クライアントから送信された リクエストヘッダーのサイズが大きすぎる ため、Nginx がリクエストを拒否している。
そこで/etc/nginx/nginx.confに以下を追加してリクエストヘッダー全体のサイズ制限が緩和されるようにした。

/etc/nginx/nginx.conf
# ヘッダーサイズ制限を緩和
large_client_header_buffers 8 32k;

リロード後再度clientしてみる

user@client:~$ client -url http://192.168.255.71
Response Status: 502 Bad Gateway

502になった。
ここでエラーログを見るとエラーが出てた(うれしい)

user@server:~$ sudo tail -f /var/log/nginx/error.log
2024/12/07 14:19:08 [error] 12896#12896: *13 upstream sent too big header while reading response header from upstream, client: 192.168.255.70, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "192.168.255.71"

バックエンドサーバー(http://127.0.0.1:8080)が返すレスポンスヘッダーが大きすぎるといわれている。
受信できるレスポンスヘッダーのサイズを増加させる必要がある。
以下をさらに追加する。

/etc/nginx/nginx.conf
proxy_buffer_size 32k;               # 単一レスポンスヘッダーのバッファを拡大
proxy_buffers 8 64k;                 # 64KB のバッファを 8 つ利用
proxy_busy_buffers_size 128k;        # バッファが使用中の最大サイズを拡大

リロード後再度試す

user@client:~$ client -url http://192.168.255.71
Response Status: 200 OK

うまくいった。

Discussion