FrontPage  Index  Search  Changes  RSS  Login

hook_tcp.so

What is hook_tcp.so

LD_PRELOADを利用して、プログラム中で実行される connect()の接続先をsyslogへ記録するプログラムです。

Linux環境で動作確認を行っています。

Compile

 $ wget http://www.t-dori.net/forensics/hook_tcp.cpp
 $ g++ -Wall -fPIC -shared -o hook_tcp.so hook_tcp.cpp -ldl

How to use

通常のプログラムを実行する際に、環境変数でLD_PRELOAD=./hook_tcp.soを 指定しておきます。hook_tcp.soは通常のsocketを使用してTCP/IPで通信する プログラムであれば、どのようなプログラムでも使用することができます。

以下はhook_tcpを使ってwgetを起動する際の例です。

 $ LD_PRELOAD=./hook_tcp.so wget http://www.google.com/

プログラム中でTCP/IPで接続した際に、次のようなログがsyslogへ記録されます。

 Dec 25 10:35:15 hostname wget[10718]: connect() : host=66.249.89.99, port=80

Mechanism

LD_PRELOADでsoファイルを指定しておくと、プログラム中に含まれている 関数をsoファイルに含まれている関数に置き換えることができます。

ただし、そのまま置き換えただけでは、元の関数が呼び出されなくなってしまうので、

 [関数呼び出し元] -> [置き換えた関数] -> [オリジナルの関数]

という感じで、soで置き換えた関数の中からオリジナルの関数を呼ぶようにして、 置き換えた関数の中でsyslogへ接続先のログを出力するようにしています。

hook_tcp.soはTCP/IPを利用する際に必要な、socket(),connect(),close()を フックして、connect()を実行した際の接続先をsyslogへ出力するように しています。

Postscript

今回はLD_PRELOADを使ってconnect()の接続先の記録を行いましたが、 LD_PRELOADを使って他にも、

  • execv()などをフックしてバックドアの起動を阻止する
  • sslなどのsend(),recv()をフックして暗号化された通信の内容を記録する

などといった応用が考えられると思います。

author

yoggy

Last modified:2007/09/27 02:15:16
Keyword(s):
References:[FrontPage] [info-2005-12-25] [software]