はじめに
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
上記のコマンドポートスキャンを行えるコマンドで、デフォルトでは上位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
全てのポートに対してノックするのでかなり時間がかかってしまう。
シェルスクリプトを書いてから実行したら残り時間が足りなくなってしまった。