10.2 プロセス監視ツールの作成(WMIを使用したプロセス監視) (サイバーセキュリティプログラミング Pythonで学ぶハッカーの思考)
本記事は、オライリージャパンから発行されている「サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考(原題:Black Hat Python)」の学習メモとして、書籍ではPython2で書かれていますが、自分なりに解釈した上でPython3に書き直しをしています。
今回は、WMI(Windows Management Instrumentation)を用いた、プロセス監視ツールの作成について学んでいきます。
WMIとは
WMI(Windows Management Instrumentation)とは、Windows OS上で生成されている各プロセスの情報にアクセスできるAPI群で、プロセスのID(PID)、親PID、実行されたファイルとその引数、またプロセスが作成された時刻など様々な情報を取得することができます。
今回作成するスクリプトでは、新しく生成されたプロセス情報を取得し、コンソールへの出力とCSVファイルへの書き込みを行います。
取得するプロセス情報は以下となります。
- プロセスの作成時間
- 実行ファイル名
- 実行ファイルの引数
- プロセスID(PID)
- 親PID
- 権限(こちらは"N/A"とする)
Pythonでプロセス監視ツールを作成する
以下が今回作成するスクリプトとなります。
# process_monitor.py import win32con import win32api import win32security import wmi import sys import os def log_to_file(message): with open("process_monitor_log.csv", "ab") as f: f.write(message.encode('utf-8') + b'\r\n') return log_to_file("Time, User, Executable, CommandLine, PID, Parent PID, Privileges") c = wmi.WMI() process_watcher = c.Win32_Process.watch_for('creation') while True: try: new_process = process_watcher() proc_owner = new_process.GetOwner() proc_owner = "{}\\{}".format(proc_owner[0], proc_owner[2]) create_date = new_process.CreationDate executable = new_process.ExecutablePath cmdline = new_process.CommandLine pid = new_process.ProcessId parent_pid = new_process.ParentProcessId privileges = "N/A" process_log_message = "{}, {}, {}, {}, {}, {}, {}\r\n".format(create_date, proc_owner, executable, cmdline, pid, parent_pid, privileges) print(process_log_message) log_to_file(process_log_message) except: pass
動作確認
それでは、上記で作成したプロセスを実行してみます。
スクリプトを実行後、Windows標準の電卓を起動すると以下のプロセス情報が取得できました。
> python process_monitor.py 201902040000.100091+540, Local\user, C:\WINDOWS\system32\calc.exe, "C:\WINDOWS\system32\calc.exe" , 13412, 15180, N/A
最後に
今回はWMI APIを使用して、新しく生成されたプロセスを監視し、必要な情報を取得する方法について学びました。
どのプロセスが高い権限を持っていて、それがどのファイルにアクセスしているのかを把握することによって、そのプロセスの処理に割り込み、高い権限でコマンドプロンプトを起動させることが可能になります。