👊

SadServers解説#4 "Taipei": Come a-knocking

2024/01/26に公開

https://ja.wikipedia.org/wiki/台北市

問題概要

シナリオ

ノックしてください
 

問題詳細

WEBサーバーが通信を待っている80番ポートが、ポートノックによって保護されています。
curl localhostコマンドが実行できるようになるために必要な、"一つのノック"を見つけてください。(今回は、シーケンスではなく、単一のポートに対してSYNパケットを送信してください。)

※シーケンスとは、決められた順番で処理をすること(今回の問題で言えば、決められた順番でポートをノックすること)を意味していると思われます。

https://en.wikipedia.org/wiki/Port_knocking
 

解決判定

ポートノックの保護を解除することができたら、Check My Solutionボタンをクリックしてください。
また、ポートノックの保護を解除した場合、以下と同じハッシュ値が得られます。
(改行コードを含めた状態でテストをする必要があるため、他の問題と異なる方法でハッシュ値を求めています。)

~$ echo $(curl localhost) > test
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    13  100    13    0     0  13000      0 --:--:-- --:--:-- --:--:-- 13000
~$ md5sum test 
fe474f8e1c29e9f412ed3b726369ab65  test

 

問題解決の方針

【表示する】

今回の問題では、一つのポートをノックすることで80番ポートが解放されるとのことです。
しかし、65536通りのポートを手動でノックする場合、15分で解決できるとは限りません。
今回は、80番ポートが解放されるまで、片っ端からポートをノックするシェルスクリプトを作成します。
以下の手順で問題を解決します。

解決の手順を表示する
  1. 80番ポートが空くまで片っ端からポートをノックするシェルスクリプトを作成し、実行する

 

ヒント

一部、SadServers公式のヒントを改変しています。

ヒント1

knockコマンドを使うことで、ポートをノックすることができます。

実行コマンド

以下のコマンドを実行することで、ポート3000をノックすることができます。

~$ knock localhost 3000
ヒント2

curlコマンドやnmapコマンドを実行することで、80番ポートが開放されているか確認することができます。

実行コマンド
~$ curl localhost
curl: (7) Failed to connect to localhost port 80: Connection refused
~$ nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2024-01-23 10:14 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000096s latency).
Not shown: 998 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds
ヒント3

すべてのポートを順次ノックするシェルスクリプトを作成します。ポートの有効範囲は0~65535です。
シェルスクリプトを作成後、ファイルに実行権限を付与して実行します。

実行コマンド
~$ vi portknock.sh
~$ cat port-knock.sh 
#!/bin/bash
for port in `seq 0 65535`; do
    knock localhost $port
    echo "Knocked on port $port"
    if curl -sSf localhost &>/dev/null; then
        echo "The Port 80 has been opened!"
        exit 0
    fi
done
~$ chmod 755 port-knock.sh
~$ ./port-knock.sh 
Knocked on port 0
Knocked on port 1
Knocked on port 2
...
Knocked on port 7000
Knocked on port 7001
The Port 80 has been opened!

curl -sSf localhostの出力を/dev/nullに渡しているのは、エラーメッセージがたくさん出て見にくくなってしまうことを防ぐためです。

80番ポートが開いているか確認してみます。

~$ curl localhost
Who is there?
~$ nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2024-01-23 10:15 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000085s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds

無事、80番ポートが開きました。

 
「いきなり問題を解き始めても調べるばかりになってしまう…」 「やりたいことが分かっても、コマンドが分からない…」 という方は、下記の記事でLinuxのコマンドを復習してから、SadServersの問題に取り掛かってみてはいかがでしょうか。
https://zenn.dev/comf_nakamura/articles/linux_command

問題一覧はこちら

https://zenn.dev/comf_nakamura/articles/sadservers_sitemap

Discussion