本記事は、オライリージャパンから発行されている「サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考(原題:Black Hat Python)」の学習メモとして、書籍ではPython2で書かれていますが、自分なりに解釈した上でPython3に書き直しをしています。
今回は、各プロセスのトークンに設定されている権限情報を取得する方法について学んでいきます。
トークンとは
Windows上で起動している各プロセスは、自分自身がどのユーザであるか、どのグループに属しているか、またはどのような操作ができるか(権限)などの情報を持っており、これをトークン(Token)といいます。
またこのトークンに記載されているACL(Access Control List)をもとに、ファイルなどのオブジェクトにアクセスできるプロセスであるかどうかを判断するホワイトリストとして機能し、アクセス制御なども行っています。
基本的に各プロセスは、それを起動したプロセス(親)のトークンをコピーしますが、これらのトークンを書き換えることもできます。
なお、トークンの書き換えは一般的に特権アカウント(Administrator)のみ可能となっています。
Pythonで権限情報を取得する
今回は前回のプロセス監視ツールに追加します。
以下が今回作成するスクリプトとなります。
# process_monitor.py
import win32con
import win32api
import win32security
import wmi
import sys
import os
def get_process_privileges(pid):
try:
hproc = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION, False, pid)
htok = win32security.OpenProcessToken(hproc, win32con.TOKEN_QUERY)
privs = win32security.GetTokenInformation(htok, win32security.TokenPrivileges)
priv_list = ""
for i in privs:
if i[1] == 3:
priv_list += "{}|".format(win32security.LookupPrivilegeName(None, i[0]))
except:
priv_list = "N/A"
return priv_list
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 = get_process_privileges(pid)
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_monitor2.py 20190205000000.256126+540, Local\user, C:\WINDOWS\system32\notepad.exe, "C:\WINDOWS\system32\notepad.exe" , 9360, 9772, SeChangeNotifyPrivilege|
起動したメモ帳には"SeChangeNotifyPrivilege(走査チェックのバイパス)"の権限が付与されていました。
最後に
今回はプロセスのトークンにアクセスし、その権限情報を確認する方法について学びました。
この権限情報を参考にすることで、脆弱性のあるプロセスを特定することに役立ちそうです。