ホーム » 「ポートスキャン」タグがついた投稿
タグアーカイブ: ポートスキャン
ネットワークサービスとポートスキャン
外部からネットワーク接続を受けて、どういった処理を実行するようになっているのかを知るための方法を説明する。
ポート番号
ネットワーク通信では、通信する相手を指定するために IP アドレスが用いられるが、サーバでは、複数のプログラムが動いており、どのプログラムと接続するのかを指定するには、ポート番号を用いる。
IPアドレスを電話番号に例えるならば、ポート番号は内線電話番号に相当する。
特に、サーバではクライアントからの通信を待つために、このサービスならばこのポート番号を使うという標準番号が決まっている。
SSH = 22 # リモート接続(暗号化) TELNET = 23 # リモート接続 SMTP = 25 # メール送信 DNS = 53 # DNSサービス HTTP = 80 # Web サーバ POP = 109,110 # メール受信 IMAP = 143 # メール受信 HTTPS = 443 # Web サービス(暗号化) SMTPS = 465 # メール送信(暗号化) IMAPS = 993 # メール受信(暗号化) POPS = 995 # メール受信(暗号化)
ネットワークサービス
サーバでは、クライアントからの接続の受信を待つために、あらかじめプログラムを起動しておく必要がある。
こういうサーバプログラムは、Linux の世界では デーモン と呼ぶことも多い。
ネットワークサービスを起動する方式には、いくつかの方法がある。
スーパーサーバを使う場合
ネットワーク処理のプログラムは、複雑な処理を行うためそのプログラムを起動しておくと、メモリを大量に使用する。古いコンピュータでは、処理速度の低下となるため、利用頻度の低いサーバは、汎用的なサーバを起動しておき、必要に応じてプログラムを起動する。この方法には、inetd とか xinetd が用いられる。
$ vi /etc/inetd.conf echo stream tcp nowait tsaitoh コマンド名
上記の例では、echo=7番ポート に tcp で接続すると、ユーザ名 tsaitoh の権限で、コマンド名を実行してくれる。
デーモンを起動しておく場合
Linux では ランレベル という状態が決められている。
- シングルユーザモード(S) – 管理者が作業中で他のネットワーク接続とかを受け付けない状態
- システム停止(0) – 他の状態からシステム停止に移るための仮想的なランレベル
- マルチユーザモード(2) – 複数のユーザの接続ができる状態
- GUI環境付きのマルチユーザモード(5) – X11ディスプレイマネージャが動く状態
((( /etc/inittab の中に以下の記載がある ))) $ cat /etc/inittab : # The default runlevel. id:2:initdefault: : $ runlevel # 現在のランレベルを確認する方法 N 5
sysv-rc 方式
Linux では、ランレベルを変更する init コマンド(init 0 を実行すると、システムを停止できる)を実行すると、
- /etc/rc移行元ランレベル.d 配下のKで始まるプログラムをファイル名順に実行する。
- /etc/rc移行先ランレベル.d 配下のSで始まるプログラムをファイル名順に実行する。
$ ls /etc/rc2.d K01aprx S17sudo K01onedrive S17unattended-upgrades README S17uuidd S01lvm2-lvmpolld S18acpid S01pulseaudio-enable-autospawn S18amavis S14nfs-common $ sudo /etc/init.d/apache2 start # apache2のサーバ起動 $ sudo /etc/init.d/apache2 stop # 停止 $ sudo /etc/init.d/apache2 restart # 再起動
systemd 方式
上記の sysv-rc 方式は、プログラムの起動スクリプトが shell で書かれているので、(システムが単純な頃は)メンテナンスが容易だったが、(システムが複雑になると)起動処理に時間がかかるのが問題となった。このため、新しい Linux では、systemd というプログラムでサーバを起動する方式にかわった。
$ ls /etc/systemd journald.conf network pstore.conf sleep.conf system.conf user logind.conf networkd.conf resolved.conf system timesyncd.conf user.conf $ sudo systemctl list-units # systemd のユニット一覧 $ sudo systemctl list-sockets # 使用中のソケット一覧 $ sudo systemctl status apache2 # systemd で起動している特定のサーバの状態確認 $ sudo systemctl start apache2 # systemd でサーバ起動 $ sudo systemctl stop apache2 # systemd でサーバ停止 $ sudo systemctl restart apache2 # systemd でサーバ再起動
起動中のプログラムの確認
システムが通常状態で起動しているプログラムを確認するには、ps ax を用いる。
$ ps ax # a 全プロセス表示 x 端末を持たないプロセスも表示 PID TTY STAT TIME COMMAND 1 ? Ss 2:57 /sbin/init 2 ? S 0:00 [kthreadd] : 2229038 ? S 0:03 /usr/sbin/apache2 -k start :
PIDがプロセス番号、STATは、S:処理待ち状態、R:実行状態、TIME欄は、のべ実行時間を表す。
各プロセスの親プロセスと子プロセスの関係が知りたい場合には、pstree コマンドを用いる。
$ pstree systemd-+-/usr/sbin/amavi---2*[/usr/sbin/amavi] |-/usr/sbin/apach---11*[/usr/sbin/apach] |-ModemManager---2*[{ModemManager}] |-NetworkManager---2*[{NetworkManager}]
ここで、見たことのないプログラムが動いている様なら、システムの進入を受けた可能性を疑わないといけない。
ネットワーク通信で受信待ちのプログラムの確認
Linuxで開いているポートを確認するためには、netstat コマンドを用いる。
$ sudo netstat -ltup4 # -l Listenポート、-t TCP、-u UDP、-p ポートを開いている、-4 IPv4 稼働中のインターネット接続 (サーバのみ) Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態 PID/Program name tcp 0 0 localhost:3551 0.0.0.0:* LISTEN 841/apcupsd tcp 0 0 0.0.0.0:imaps 0.0.0.0:* LISTEN 418280/dovecot :
nmap でポートスキャン
netstat コマンドは、対象コンピュータを使っている時には有効だが、他のコンピュータを調べるには、ポートスキャン専用の nmap を使うのが一般的。
ポートスキャンとは、相手のコンピュータに接続するポート番号を変更しながら、通信可能か調べること。
$ sudo nmap localhost Starting Nmap 7.80 ( https://nmap.org ) at 2020-02-17 14:45 JST Nmap scan report for localhost (127.0.0.1) Host is up (0.0000090s latency). Other addresses for localhost (not scanned): ::1 Not shown: 982 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp :
nmap で調べるための様々なオプション
$ sudo nmap -A localhost # OSなどを調べる $ sudo nmap -p 1-1023 localhost # 1〜1023 までのポート番号を調べる $ sudo nmap -sU localhost # UDPのポートスキャン $ sudo nmap -O localhost # OSの検出
攻撃を受けているのであれば、wireshark などのパケットキャプチャを使って、パケットの中身を調べる必要がある。