お久しぶりです。みどりからすです。
令和になったので(こじつけ)ブログを再開してみようかと思います。
よく参加させていただいている勉強会でポートスキャンの話が出てきます。
まずはどんなサービスが動いているのかを調査するために行うことが多いみたいです。
ただ私自身インターネットから直接アクセスできるサーバを公開するときは、単純に怖いのでsshのポート番号を変更することが多いです。
もちろん自分で変更しても大丈夫なサーバのみですが。
正直なところ社内の開発用サーバでもポート番号変更したいぐらい。
そんな中ふと思った疑問ですが…
「ポート番号変更後にポートスキャンかけたらどんな結果になるんだろう?」
そんな疑問を試してみました。
Contents
環境
ホストマシン
- Windows 10 Home 64 bit
- Nmap Version 7.70
- Vagrant 2.2.3
- VirtualBox 6.0.6 r130049 (Qt5.6.2)
ゲストマシン
- Centos7.6.1810 64bit
前提条件
ゲストマシンはインストールしてsudo yum -y updateを実施済み。
ホストOSにNmapをインストール済み。
めんどくさいのでfirewalld止めてます。
目標
httpdのポート番号を変更して、変更後のポート番号でhttpdをNmapで検出できるかどうかを確認する。
変更前: 80番
変更後: 81番
手順要約
- httpdインストール
- ポートスキャン(ポート番号変更前)
- httpdのポート番号変更
- ポートスキャン(ポート番号変更後)
httpdインストール
インストールする前に念のためListenしているポートの確認をします。
とりあえずでTCPだけ確認します。
ss -ltn State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:111 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25
開放しているのは22番と111番だけっぽい。
25番はローカルアクセスだけかな。
httpdをインストールします。
sudo yum -y install httpd
インストールしただけだと起動していないのでhttpdを起動します。
sudo systemctl start httpd
curlを一発撃ちます。
curl http://192.168.33.23
なんか返ってきました。
ブラウザでもページが表示されました。
最近知ったんですが、Windowsのコマンドプロンプトでcurlコマンドが使えるようになったんですね。
とりあえずでListenしているポートの確認。7行目がそうですね。
ss -ltn State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:111 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 :::80 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
ポートスキャン(ポート番号変更前)
一応フルポートスキャンをかけます。-pオプションをつけてます。
-oオプションで結果をファイルに出力します。
nmap -A 192.168.33.23 -p 1-65535 -o httpd_pre_port_change.txt
想定通りの結果になりました。
80/tcp open http Apache httpd 2.4.6 ((CentOS))
デフォルトだとTRACEメソッド使えるの?
httpdのポート番号変更
httpdのポート番号を80番から81番に変更します。
私の場合は42行目でした。
編集が終わったらhttpdを再起動します。
sudo vi /etc/httpd/conf/httpd.conf Listen 80 ↓ Listen 81
sudo systemctl restart httpd
ポート番号が変更されたことを確認します。
ss -ltn State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:111 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 :::81 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
はい、変わりました。 7行目がそうです 。
念のためcurlとブラウザでも確認します。
結果は省略しますが、返ってきました。
ポートスキャン(ポート番号変更後)
nmap -A 192.168.33.23 -p 1-65535 -o httpd_post_port_change.txt
あ、検出された!
81/tcp open http Apache httpd 2.4.6 ((CentOS))
ちなみにですが、81/tcpは以下のサービスと紐づいているようですので、well known portでしょう。
hosts2-ns 81/tcp #HOSTS2 Name Server
なんかあれだな…癪だから53番とかに変えてみよう…
53番はDNSのポート番号ですね。
詳細は上記と同じなので省略します。
53番に変更後、Firefox使っていますがブラウザからはアクセスできません。
「このアドレスへの接続は制限されています」と表示されます。
Chromeでもダメなんだ。
curlでは正常に結果が返ってきました。
いざポートスキャン…!
nmap -A 192.168.33.23 -p 1-65535 -o httpd_post_port_change_53.txt
53/tcp open http Apache httpd 2.4.6 ((CentOS))
出るやん!!
じゃーエフェメラルポートや!
nmap -A 192.168.33.23 -p 1-65535 -o httpd_post_port_change_65530.txt
65530/tcp open http Apache httpd 2.4.6 ((CentOS))
出るやん!!!!
結果
ポート番号を変更していてもNmapをかけるとhttpdであることが検出されることがわかりました。
考察
前置きとして、
今回httpdで試したのは手軽だったからという理由だけです。
実際にはwebサービスのポート番号を変更するとユーザがアクセスできなくなるので変更することはないと思います。
今回はhttpdのポート番号を変更していてもポートスキャンをかけてればどのポートにhttpdが動いているのかがすぐにわかるということが今回わかりました。
おそらく他のサービスでも同様の結果が得られると考えています。
防御側としては
「あまり意味がない」
ように思えます。攻撃者が攻めるポート番号を特定するまでの時間稼ぎ程度でしょうか?
攻撃者に「なんかこのサーバ攻めるの時間かかるかも…?」と思ってもらえれば御の字でしょうか。
もしかしたら攻撃者が「お、このサーバなんか対策しとるやんけ!やったろ!!」と燃える材料になるかもしれませんw
ポートスキャンなどの異常なパケットの流れを検出してbanする仕組みを入れておかないと、本当にただの時間稼ぎ程度になるのかもしれませんね。
攻撃者側としては(まだまだ未熟ですが)、
「なんだ、ポート番号変わっただけか」
となるのかなぁ。もしくは
「あ、このサーバちょっと攻めるのめんどくさいかも?」
と思わせることぐらいはできるかも。
もちろん最近の防御側も対策しているので、ポートスキャンの通信を検知かと思いますので(しますよね…?)
ポートスキャンをしないと攻撃対象ポートがわからないという状態は攻撃者としては不利になるのかもしれません。
なってほしいなぁ。