netstatで外部との不正な通信を見極める(Linux)。

Linuxでもnetstatコマンドが使えます。windowsとオプションの指定が異なるので、その差異を書いてみます。前回の「netstatで外部との不正な通信を見極める(windows)。」と同等のコマンドとするには、以下のようにします。rootユーザで行ってください。

# netstat -npt

  • -n:名前のレゾルブをしない(windowsの「-n」オプションと同等)。
  • -p:ソケットのPID/プログラム名を表示する(windowsの「-b」オプションと同等)。root権限が必要。
  • -t:tcpプロトコルの表示。udpの場合は「u」指定(windowsの「-p」オプションと同等)。

また、Linuxでも待受状態(リッスンポート)も表示したい場合は「-a」オプションを追加することで表示可能です。

実行した結果は以下です。

このPC(OSにubuntuを使用)ではApacheを立ち上げていたため、PC内でHTTP通信(ポート80への通信)が行われていたようです。ここで内部と判断しているのはIPアドレスが「127.0.0.1」となっているためです。「127.0.0.1」はループバックアドレスで自身のIPアドレスを示します。

前回のwindowsでnetstatを試したときに「-n」オプションをつけている理由を書いていなかったのですが、「-n」オプションをつけることによって(つまり、IPアドレスを見ることによって)、通信先が内部のアドレスか外部のアドレスか自分自身かを見極めることができます。家庭で使用しているPCだと家でネットワークを組んでいることはあまりないかと思うのでほぼほぼ外部との通信になるかと思いますが、会社では社内ネットワークと社外とのやり取りが発生するので内部での通信か外部との通信かを見極めるのは大切です。社内ネットワークでの通信なら問題ないですが、知らないうちにPCが外部と通信しているようであれば、情報漏えいの可能性が出てしまうからです。

では、IPアドレスでどのように内部向け/外部向けを判断するかというと、IPアドレスにはインターネットで使用するグローバルアドレスとインターネットでは使用しない(家庭や会社内で使用する)プライベートアドレスが決まっているため、それで判断します。見分け方はプラベートアドレスかどうかです。プラベートアドレスでないものはグローバルアドレスになります。

■プライベートアドレスの範囲

  • 10.0.0.0~10.255.255.255
  • 172.16.0.0~172.31.255.255
  • 192.168.0.0~192.168.255.255

会社内で使用するPCのIPアドレスは上記の範囲に入っているはずです。社内で使うPCがプライベートアドレスを持つ機器と通信している場合は問題ないですが、グローバルアドレスをもつサーバーと通信している場合は確認してみたほうがいいかもしれません。

で、先程の結果は自身のApacheとの通信だったので、ubuntuのFirefoxでGoogleの検索ページを開いたときにnetstatコマンドを打ちました。その結果が以下です(上がGoogleの検索ページを開いた直後、下がしばらく立ってから)。



状態が「ESTABLISHED」から「TIME_WAIT」にかわっています。検索ページを開いた直後にGoogleのサーバーと通信を確立(ESTABLISHED)し、必要なコンテンツを取得後に終了待ち(TIME_WAIT)の状態になっています。TCPではこのように通信の状態を持っています。netstatコマンドを打ったときに何らかのプロセスが外部との通信で「ESTABLISHED」の状態を長く続けているようであれば、疑ったほうが良いかと思います。

今までクライアントとなるPCの話でしたが、インターネットに公開しているサーバーでもnetstatコマンドは使えます。インターネット上でWEBサーバーを稼働させている場合はクライアントとの通信で「ESTABLISHED」の状態がいくつかできるのですが、たまに「SYN_RECV」という中途半端な状態にさせられるときがあります(「SYN_RECV」は「ESTABLISHED」になる前の状態)。これはTCPで通信を始める際に3ウェイハンドシェイクという3回のやりとりをサーバーとクライアントで行うのですが、クライアントが途中でやりとりを中断してしまうことで起きます。そうするとサーバーはずっとクライアントからの返事を待ち続けサーバーのリソースを使い続けます。クライアントはこの状態をいくつも作らせサーバー側のリソースを枯渇させます。SYN flood攻撃 と呼ばれるものです。WEBサーバーで「SYN_RECV」を見つけたら、攻撃されていることを考えたほうがいいかもしれません。

netstatで外部との不正な通信を見極める(windows)。

netstatコマンドを使って、使用しているPCが不正な通信をしていないか確かめる方法です。netstatはコンピュータの通信状況を一覧表示するコマンドで、いろんなオプションを指定できます。

windowsではコマンドプロンプトから実行します。その際、管理者権限で実行します。windows10の場合は、「左下のウィンドウマークをクリック → Windowsシステムツール → コマンドプロンプトを右クリック → その他 → 管理者として実行を選択」で管理者権限でコマンドプロンプトが立ち上がります。

以下のように、netstatコマンドを打ちます。

C:¥WINDOWS¥system32>netstat -bn -p TCP

オプションの意味は以下です。

  • -b:それぞれの接続またはリッスンポートの作成に使われた実行可能ファイルを表示します。管理者権限が必要です。
  • -n:アドレスとポート番号を数値形式で表示します。
  • -p:TCPプロトコルの接続を表示します。他にも、UDP、TCPv6、UDPv6が指定できます。

※ここでは指定しませんでしたが、待受状態(リッスンポート)も表示したい場合は「-a」オプションを追加することで表示可能です。

実行した結果は以下です。

上記の結果から、僕のPCでは「svchost.exe」と「SearchUI.exe」が外部と通信を確立してなんらかの情報のやり取りをしているようです。

svchost.exe
→ プロトコルは443(HTTPS)を使用して、IPアドレスが「52.230.83.250」、「52.230.85.180」のサーバと通信をしている。

SearchUI.exe
→ プロトコルは443(HTTPS)を使用して、「13.107.42.254」、「13.107.51.254」、「13.35.55.30」、「204.79.197.222」のサーバと通信をしている。

それで、これらのサーバの宛先をwhoisデータベースで調べてみました。以下のサイトを利用しました。
http://whois.threet.co.jp/ ※リンクが廃止されてました。

「13.35.55.30」はAmazon、それ以外はすべて Microsoft のサーバのようです。そもそも、svchost.exe と SearchUI.exeが何者なのか?これも調べてみました(ウィルスだったら大変ですし)。svchost.exe はwindowsにもともとある必要なプロセスらしいです。また、SearchUI.exe は Cortana(コルタナ) に関わるプロセスらしいことがわかりました。通信相手もMicrosoftとAmazonだったため大丈夫と思います。インストールしているウィルス対策ソフトもウィルス検知をしていないので(※)。

(※)の補足:
今回の svchost.exe は本物だったのですが、ウィルスが「svchost.exe」というファイル名で活動している可能性があります。 svchost.exe はwindowsに必要なプロセスであるため、怪しまれないようにウィスルのファイル名を「svchost.exe」とするものがあるようです。

ただ不思議なのは、SearchUI.exe がAmazonのサーバと通信していたこと。なんでだろう?と思っていたらネットで記事を見つけました。Windows 10端末からAlexaのサーバーにアクセスしたり、AmazonのEcho端末からCortanaのサーバーにアクセスできるようになるみたいですね。

次回は、Linuxでのnetstatの使い方を書いてみようと思います。