2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

怪しいLISTENポートを確認する!

クラッカーな奴らからバックドアを作成されないようにするのは当然のことだが、鯖に侵入させないことが重要!鯖に侵入されて、管理者権限を奪われてしまったら、クラッカーはその鯖に対して何でも出来てしまう。ここでは、そのバックドアを見つけ出すのに役に立つツールlsofについてそのセットアップと使い方について説明する。たとえば、inetdを利用したバックドア等、多くのバックドアはTCPもしくはUDPをLISTENする。また、ここより詳しい説明は、ゆみどんの ゆみどんサイト の ここ が詳しいので見ていただきたい。ソースの解凍からコンパイル・インストールまでつぶさに書かれている。

通常、鯖でどのポートがLISTEN状態になってるかは、netstatコマンドで調べることが出来る。以下参照、

# netstat -an

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address                Foreign Address                State
tcp       0      0 0.0.0.0:21                   0.0.0.0:*                    LISTEN
tcp       0      0 0.0.0.0:22                   0.0.0.0:*                    LISTEN
tcp       0     20 192.168.0.44:22                192.168.0.76:1084              ESTABLISHED
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags   Type   State   I-Node Path
unix  6    [ ]     DGRAM        728 /dev/log
unix  2    [ ]     DGRAM        5184
unix  2    [ ]     DGRAM        1101
unix  2    [ ]     DGRAM        805
unix  2    [ ]     DGRAM        743

TCPの状態遷移

状態説明
CLOSEDソケット(TCPのコネクションを制御するAPI)が使かわれていない状態
LISTENソケットが接続待ち状態
SYN SENTソケットが接続確立のためにネゴ(コネクトを試みてる)してる状態
SYN RECV接続がイニシャライズ中の状態
ESTABLISHEDソケットは接続を確立して、セッションを結んでる状態
FIN WAIT-1ソケットは終了して、接続は切断中の状態
FIN WAIT-2接続は終了して、ソケットはリモートクライアント側から切断要求を待っている状態
CLOSING自分と相手側の両方のソケットは終了したが、全てのデータを受信していない状態
TIME WAITソケットは終了して、リモートクライアント側からの切断要求が再送されるのを待っている状態
CLOSE WAITリモートクライアント側が切断されたので、ソケットが終了するのを待っている状態
LAST ACKリモートクライアント側が切断されソケットも終了しているが、ACK(確認のための返事)が来るのを待っている状態

だがnetstatでは、実際にどのプロセスがそのポートを使用してるかがわからない。したがって、LISTEN状態のポートがどのようなプロセスで使用されているかをViewするツールlsofを使ってみよう!


1.ソースファイルのゲット

lsofのソースファイルは、FTPサイト ここ でゲットする。執筆時点では、 lsof_4.67.tar.gzが最新のソースであった。したがって、以下このバージョンのソースで説明する。


2.ソースの展開

適当なディレクトリへ展開する。

# tar zxvf lsof_4.67.tar.gz

# chown -R root.root lsof_4.67

# cd lsof_4.67

# tar xvf lsof_4.67_src.tar

# cd lsof_4.67_src

# ./Configure linux         ← Linuxの場合

# ./Configure freebsd       ← FreeBSDの場合

./ConfigureでCが大文字なので注意すること!
問いに答える旨を聞かれるが全てリターンで良い。

# make

バイナリ(実行ファイル)が出来るのでパスが通りそうなディレクトリにコピー!

# cp lsof /usr/sbin/


3.実際にlsofを使ってみる(inetd&xinetd等)

/usr/sbinに既にlsofが存在してると思うので一応、

# which lsof

/usr/sbin/lsof

全LISTENポートの表示!

# lsof -i | grep LISTEN
named 1627 named 21u IPv4 4917 TCP localhost.localdomain:domain (LISTEN)
named 1627 named 23u IPv4 4919 TCP ns.xxxxxxxxxxxxxxx.jp:domain (LISTEN)
named 1627 named 26u IPv4 4922 TCP localhost.localdomain:rndc (LISTEN)
sshd 1699 root 3u IPv6 5025 TCP *:ssh (LISTEN)
dovecot 1726 root 5u IPv6 5086 TCP *:pop3 (LISTEN)
dovecot 1726 root 6u IPv6 5087 TCP *:pop3s (LISTEN)
amavisd 1759 amavis 5u IPv4 5202 TCP localhost.localdomain:amavisd (LISTEN)
master 1829 root 11u IPv4 5413 TCP *:smtp (LISTEN)
master 1829 root 14u IPv4 5416 TCP *:submission (LISTEN)
master 1829 root 92u IPv4 5518 TCP localhost.localdomain:smtp-amavis (LISTEN)
postgrey 2233 postgrey 5u IPv4 7213 TCP localhost.localdomain:10023 (LISTEN)
pop3-logi 17754 dovecot 0u IPv6 5086 TCP *:pop3 (LISTEN)
pop3-logi 17754 dovecot 1u IPv6 5087 TCP *:pop3s (LISTEN)
pop3-logi 17807 dovecot 0u IPv6 5086 TCP *:pop3 (LISTEN)
pop3-logi 17807 dovecot 1u IPv6 5087 TCP *:pop3s (LISTEN)
pop3-logi 17812 dovecot 0u IPv6 5086 TCP *:pop3 (LISTEN)
pop3-logi 17812 dovecot 1u IPv6 5087 TCP *:pop3s (LISTEN)
amavisd 19792 amavis 5u IPv4 5202 TCP localhost.localdomain:amavisd (LISTEN)
amavisd 20272 amavis 5u IPv4 5202 TCP localhost.localdomain:amavisd (LISTEN)

まず、一つの方法として正常なLISTENポートの状態をメモっておく。次から、定期的にチェックしてメモしたView状態以外で見覚えのないLISTENポートが増えていたら要注意!さらに、以下のようにESRABLISHEDでgrepして不審なセッション確立状態を確認したら注意が必要(この場合は、既に今現在クラッッキング中と考えた方がよい)!

# lsof -i | grep ESTABLISHED
sshd 17758 root 3u IPv6 399188 TCP ns.xxxxxxxxxxxxxxx.jp:ssh->xxx.xxx.xxx.xxx:61725 (ESTABLISHED)
sshd 17760 mity 3u IPv6 399188 TCP ns.xxxxxxxxxxxxxxx.jp:ssh->xxx.xxx.xxx.xxx:61725 (ESTABLISHED)

次に、inetdのLISTENポートとプロセスをViewして見る。まず、プロセス番号を確認。

# ps axw | grep inetd

14054 ? S 0:00 inetd

14054番でinetdが常駐。次に、lsofを実行。

# lsof -P | grep inetd

inetd   14054   root  cwd  DIR  3,6  4096      2 /
inetd   14054   root  rtd   DIR  3,6  4096      2 /
inetd   14054   root  txt   REG  3,6  18404  703596 /usr/sbin/inetd
inetd   14054   root  mem  REG  3,6  345367 327068 /lib/ld-2.1.3.so
inetd   14054   root  mem  REG  3,6 4160578 327090 /lib/libc-2.1.3.so
inetd   14054   root  mem  REG  3,6  248144 328861 /lib/libnss_files-2.1.3.so
inetd   14054   root    0u CHR  1,3        65520 /dev/null
inetd   14054   root    1u CHR  1,3        65520 /dev/null
inetd   14054   root    2u CHR  1,3        65520 /dev/null
inetd   14054   root    4u IPv443881        TCP *:21 (LISTEN)
inetd   14054   root    7r FIFO  0,0        43879 pipe
inetd   14054   root    8w FIFO  0,0        43879 pipe
inetd   14054   root   21w CHR  1,3        65520 /dev/null

inetdで起動してる全てのプロセスが確認できる。今度は、別のマシンのxinetdを確認してみる。まずは、プロセス番号の確認。

# ps axw | grep xinetd

4234 ? S 0:00 xinetd -stayalive -reuse -pidfile /var/run/xinetd.pid

4234番でinetdが常駐。次に、lsofを実行。

# lsof -P | grep xinetd

xinetd    4234  root   cwd  DIR  3,2  4096     2 /
xinetd    4234  root   rtd   DIR  3,2  4096     2 /
xinetd    4234  root   txt   REG  3,2 134968  343145 /usr/sbin/xinetd
xinetd    4234  root  mem   REG  3,2  88760 391752 /lib/ld-2.3.2.so
xinetd    4234  root  mem   REG  3,2  28452 310272 /usr/lib/libwrap.so.0.7.6
xinetd    4234  root  mem   REG  3,2  86852 391786 /lib/libnsl-2.3.2.so
xinetd    4234  root  mem   REG  3,2 208912 391784 /lib/libm-2.3.2.so
xinetd    4234  root  mem   REG  3,2  22472 391780 /lib/libcrypt-2.3.2.so
xinetd    4234  root  mem   REG  3,21465640 391778 /lib/libc-2.3.2.so
xinetd    4234  root  mem   REG  3,2  50028 391802 /lib/libnss_files-2.3.2.so
xinetd    4234  root    0r   CHR  1,3       67151 /dev/null
xinetd    4234  root    1r   CHR  1,3       67151 /dev/null
xinetd    4234  root    2r   CHR  1,3       67151 /dev/null
xinetd    4234  root    3r   FIFO  0,5        5182 pipe
xinetd    4234  root    4w  FIFO  0,5        5182 pipe
xinetd    4234  root    5u   IPv4      5187   TCP *:21 (LISTEN)
xinetd    4234  root    7u   unix 0xc 15d95e0  5184 socket

xinetdで起動してる全てのプロセスが確認できる。さらに、プロセス情報に加えてソケット情報もViewしてくれるのでありがたい(^○^)!

以上

コメント