ネットワーク管理をしている、あるいは社内のマシン全体の管理をしている管理者にとって、
場合によってはインストールされたくないプログラムというのが幾つか存在する。
その手のプログラムと、それを検出する方法というのを幾つか紹介する。
(・・・元来文書化されたネタはあまりないので企画倒れになるかも)
第1回: vs IP Messenger
<これは何か>
P2Pでインスタントメッセージ(チャット)とファイル交換を行うツールである。
基本的には常時立ち上げ、常駐したままで使用する。
<通信内容はどこに残るか>
通信記録は各々参加しているクライアントにのみ IPMessengerオリジナルのログを残す設定が可能である。
<何が問題か>
制限の少ないネットワークでは一般的に業務に必要ない。
参加者は、業務中に業務に関係ないメッセージを流す傾向にある。
<軽減する事由>
数人のチームとして外部の会社に出向した際に、ファイル交換の貧弱な環境だった場合は
ファイル交換に有効に働く可能性がある。
(ただし、やはりチャットの機能は不要だと思われる)
逆に社内に出向者を受け入れる場合、使用を許可すべき可能性がある。
<他、備考>
IPMessenger は何度かバージョン変更があり、通信内容は Ver2 と呼ばれるものから暗号化されている。
通信内容については容易には解析できない。
<追跡方法>
[手法その1]
デフォルトで IPMessenger が使用するポートは:UDP 2425のみである(src / destとも)
ネットワーク内部で使用されているか、一から調査するには、まず以下のようにする。
(調べるには nmap コマンドが必要)
PORT STATE SERVICE
2425/udp open unknown
下記のようであればひとまず起動していない可能性が高い。
PORT STATE SERVICE
2425/udp closed unknown
PORT STATE SERVICE
2425/udp open|filtered unknown
使用者側にスキルがある場合は、ポートを変更して使用している可能性が高い。
この場合は、UDPの全スキャンを前提としなくてはいけない可能性がある。(ヒー)
Function procEnumerate(ByRef rsProcName As String, ByRef rsMachineName As String, ByRef rsAdminName As String, ByRef rsAdminPass As String) As Boolean
' 参照設定:『Microsoft WMI Scripting V1.x Library』
Dim loWMILocator As SWbemLocator
Dim loSWbemServices As SWbemServicesEx
Dim loProcess As SWbemObjectEx
procEnumerate = False
Set loWMILocator = CreateObject("WbemScripting.SWbemLocator")
Set loSWbemServices = loWMILocator.ConnectServer(rsMachineName, "root\cimv2", rsAdminName, rsAdminPass)
For Each loProcess In loSWbemServices.InstancesOf("Win32_process")
Debug.Print loProcess.Name & vbTab & loProcess.processid
If UCase(rsProcName) = UCase(loProcess.Name) Then procEnumerate = True
Next
Set loSWbemServices = Nothing
Set loWMILocator = Nothing
End Function
?procEnumerate("ipmsg.exe", "hogehoge", "domain\administrator", "password")
ただし、この場合も WindowsXP + SP2 でポートがフィルタされていると確認できない可能性が高い。
また、調査先のマシンのポリシーの設定によってはイベントログにログが残る可能性がある。
[手法その3]
使用するポートがわかっていれば、以下のコマンドを利用して確認することができる。
(調べるには NetCat コマンドが必要)
以下のメッセージ(ipmssengerのコマンド)を送る
例1:バージョン取得コマンド
name は本来参加者(コマンド発行側)の名称、machineは本来参加者(コマンド発行側)のマシン名、64はバージョン取得コマンド
でもひとまず『name』『machime』をそのまま使用して可。
画面表示例:
ここで hogehoge は マシン名。 hoge はそのマシンにおける参加ユーザー。
Windows版の Version2.06 が起動されていることがわかる。
例2:参加者一覧取得コマンド
上記と同じ、18は参加者取得コマンド
画面表示例:(整形済み)
hoge.hogehoge.10.1.1.53
hoge2.hogehoge2.10.1.1.58
(注:本来バイナリで返信されるので、画面表示時に ピーピーうるさい)
プロトコルについては、以下ページを参照。
http://smart-pda.net/isourou/ipmsg/doc/ipmsg_protocol.html
[手法その4]
IDS や Ethereal等で UDP かつ src=dest ポートの通信を傍受して、
上記に類するプロトコルが流れていないかチェックする。
ただし、IPMessengerは参加者が増えたとき(減ったとき?)や
メッセージ/ファイルの交換をする時しかパケットを流さない静かなプロトコルのようで、
使用頻度が低い場合はかなり長時間の監視が必要。