1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SadServersで障害復旧を体験してみた #4

Posted at

はじめに


Linuxの学習のためとアウトプット習慣のためにSadServersのシナリオ4に挑戦

#4のシナリオをやってみた。

今回のシナリオはポートノッキングで解決する。
80番ポートがポートノッキングで保護されているwebサーバーがあるので、そのシーケンスをさがしだしす。このシナリオは単一のポートをノックすると解決できるみたい。

ポートノッキングとは何なのかというところから調べた。
セキュリティのために使用されるもので普段はportを閉じで外部からのアクセスを拒否しているが、特定のノックシーケンスによってportを解放できるという仕組み。

シーケンスとはあらかじめ定めた条件のことで その条件通りにportをノックすると設定したportを開けるというもの (例 3000 22 433 この順番でノックすると80が開きます)
knockというポートノッキングを実現させるためのツールを使用して特定のportをノックして解決してという問題

一度やってみる

何をすればいいのか検討もつかないので早速ヒントを確認する。

ヒント1

3000portをノックするなら $knock localhost 3000 でノックできる、nmapも使用できる
curl localhost で80番ポートが開いているか確認できる。

ヒント2

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

ヒント3

全てのポートをノックするスクリプトを作成すること

ヒントを見てもよく分からなかったのでknockについて調べてみた。

knockとは

chatgptから抜粋
knock とは、ポートノッキング(Port Knocking)を実現するためのツールです。ポートノッキングは、セキュリティを向上させるための手法で、特定の順序でポートにアクセス("ノック")することで隠されたポートやサービスを動的に開放します。

knockの設定ファイルを見たい

knockについて調べるとあらかじめルールを決めるので設定ファイルを見にいけばシーケンスがわかると思って

cat /etc/knockd.conf

このファイルに設定が書かれているみたいなので見に行こうとしたら権限エラーではじかれた。
このシナリオは sudo も使えないので権限がいるファイルは探しにいけなかった。

ポートノッキングについて調べていると、設定ファイルの他にログファイルでもシーケンスが特定できるかもしれないとおもって、

cat /var/log/syslog

cat /var/log/syslog.1

これらのシステムログを見にいったけどそれらしいもの無かった。

grepでキーワードになりそうなものを検索しても有益な情報はヒットなかった。

なぜか解決した

進展がなかったので解説している記事を見ると、 全てのポートをノックするスクリプトを作るというものだった、他に方法がないかなと、調べながらコマンドを打っているとなぜか80番ポートが開いていた。回答を確認するとクリアしてしまった。
理由が分からないのでもう一度やりなおした。

調査の結果

開いているポートを確認するために以下のコマンドを実行

このコマンドを実行
nmap localhost

これを実行すると開いているポートを確認できて、もう一回実行すると
80ポートが開いている状態になった。

スクリーンショット 2025-01-21 13.20.34.png

なぜこうなったのか調べてみた。

調べた内容
nmap localhost

上記のコマンドポートスキャンを行えるコマンドで、デフォルトでは上位1000ポートのスキャンをするというコマンドらしい。
このスキャンといううのが TCP接続の試行(SYNパケット送信)を行うものらしく、このSYNパケットがノックのして認識されている?可能性もあるとのこと。
ノックしたポートの中にたまたま該当したポートがノックされて80ポートが開く要因となったと思っている。
オプションをつけることで全てのポート(0~65535)をスキャンすることも可能

# これで全ポートをスキャンできる。
nmap -p- localhost

まとめ

意図せず解決できてしまったけど、なぜ解決できたのか調べて何となくわかったのでよかったかなと思う。

余談

シェルスクリプトを書く練習で全てのポートをノックするスクリプトを作って実行してみた。

シェルスクリプト作成

~$ vim portknocking.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
参考サイト
SadServers解説#4 "Taipei": Come a-knocking

全てのポートに対してノックするのでかなり時間がかかってしまう。
シェルスクリプトを書いてから実行したら残り時間が足りなくなってしまった。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?