クラッカーな奴らからバックドアを作成されないようにするのは当然のことだが、鯖に侵入させないことが重要!鯖に侵入されて、管理者権限を奪われてしまったら、クラッカーはその鯖に対して何でも出来てしまう。ここでは、そのバックドアを見つけ出すのに役に立つツール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してくれるのでありがたい(^○^)!
以上
コメント