目的: 当該ホストで動いている EDR / AV を、現在の手札の中で最も静かな方法で特定する。
- まずは レジストリ照会 または 対象を絞った WMI クエリ を優先
- セッションがある場合は Beacon 内蔵
ps/servicesが低ノイズ tasklist.exe/sc.exe/wmic.exeは最終手段
Contents
TL;DR
EDR / AV プロセス早見表
| プロセス | 製品 |
|---|---|
| MsSense.exe / MsMpEng.exe / NisSrv.exe / SenseIR.exe / SenseCncProxy.exe | Microsoft Defender for Endpoint (MDE) |
| CSFalconService.exe / CSFalconContainer.exe | CrowdStrike Falcon |
| SentinelAgent.exe / SentinelServiceHost.exe / SentinelHelperService.exe | SentinelOne |
| minionhost.exe / PylumLoader.exe / CrsSvc.exe / CrAmTray.exe | Cybereason |
| ds_agent.exe / coreServiceShell.exe / ds_notifier.exe | Trend Micro Deep Security |
| cyoptics.exe / CylanceSvc.exe | BlackBerry Cylance |
| cyserver.exe / cytray.exe / CyveraService.exe | Palo Alto Cortex XDR (旧 Traps) |
| AvastSvc.exe / aswidsagent.exe | Avast |
| avp.exe / avpui.exe | Kaspersky |
| ekrn.exe / egui.exe | ESET |
| mfemms.exe / mfevtps.exe | McAfee / Trellix |
| SSPService.exe / SEDService.exe / SophosFileScanner.exe / SavService.exe | Sophos |
| bdagent.exe / EPSecurityService.exe | Bitdefender |
| TmListen.exe / PccNTMon.exe | Trend Micro Apex One |
| xagt.exe | Trellix Endpoint Security HX |
| elastic-agent.exe / elastic-endpoint.exe | Elastic Defend |
| RepMgr.exe / RepUtils.exe / RepUx.exe / cb.exe | VMware Carbon Black |
| ccSvcHst.exe / SepMasterService.exe / smc.exe | Symantec Endpoint Protection |
| TaniumClient.exe / TaniumCX.exe | Tanium |
判断フロー
- 資格情報 + SMB / WMI 到達性がある
- レジストリ照会で対象サービスキーを確認
- 必要に応じて WMI で対象プロセス名だけを照会
- コード実行セッションがある
- Beacon なら
ps/services - PowerShell なら
Get-Process -Name ...
- Beacon なら
- 他に手段がない
tasklist/sc queryを使う- ログが残る前提で実行する
前提条件
- 以下のいずれか:
- ターゲット上のコード実行セッション: Beacon / shell / RDP / WinRM
- 有効な資格情報 + ターゲットへの WMI / SMB 到達性: 135/tcp + 動的ポート、または 445/tcp
手段の使い分け
| 手段 | 使いどころ | ノイズ |
|---|---|---|
| Registry / SMB | 対象サービスキーが分かっている | 低 |
Beacon ps / services | 既に Beacon セッションがある | 低 |
| WMI query | リモートから対象プロセスだけを照会したい | 中低 |
| PowerShell | セッション内で辞書照合したい | 中 |
tasklist / sc | 他の手段が使えない | 高 |
コマンド集
Registry / SMB: サービスキー照会
# impacket-reg 経由、対象サービスのキーだけ照会 (存在すれば EDR 導入確定)
impacket-reg 'DOMAIN/User:[email protected]' query \
-keyName 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\Sense' # MDE
impacket-reg 'DOMAIN/User:[email protected]' query \
-keyName 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\CSFalconService' # CrowdStrike
impacket-reg 'DOMAIN/User:[email protected]' query \
-keyName 'HKLM\\SYSTEM\\CurrentControlSet\\Services\\SentinelAgent' # SentinelOne
# netexec (旧 crackmapexec) の enum_av モジュール (内部で同種のキー照会)
nxc smb 10.0.0.5 -u user -p pass -M enum_av
# セッションがある場合は in-session でも同じキーを読める
reg query "HKLM\\SYSTEM\\CurrentControlSet\\Services\\Sense" /v ImagePath
In-session: Beacon / PowerShell / cmd
Cobalt Strike Beacon
直接 syscall で NtQuerySystemInformation を叩くため、新規プロセス作成なし。cmd / PS 経由より静か。
ps
services
PowerShell
Get-Process -Name <list> で辞書にあるプロセスだけ確認。存在しなければ無出力でログも最小。ScriptBlock Logging (EID 4104) が有効だと内容が残るので、-Name で対象を絞って短くする。ただし、PowerShell 実行のためうるさい。
# 辞書にあるプロセスだけ確認 (存在しなければ無出力)
Get-Process -Name MsSense,CSFalconService,SentinelAgent,cyserver,xagt,elastic-endpoint -ErrorAction SilentlyContinue
# サービス視点 (EDR は常駐サービスを持つものが多い)
Get-Service | Where-Object { $_.PathName -match 'Sophos|Sentinel|Crowd|Cyber|Cortex|Falcon|xagt|elastic' }
全列挙が必要な場合のみ:
ps | Select-Object Name, Id, Path | Sort-Object Name
cmd / tasklist
tasklist.exe / sc.exe の起動が EID 4688 / Sysmon 1 で残る。Beacon や PS が使えない環境だけ。
tasklist /svc | findstr /I "Sense Falcon Sentinel Cylance Cortex Cybereason Sophos xagt elastic"
sc query | findstr /I "Sense Falcon Sentinel Cylance Cortex Cybereason Sophos xagt elastic"
WMI リモートクエリ
前提条件: 資格情報を持っている。
環境が未知で全列挙したい。クエリのみで Win32_Process::Create を呼ばないため検知ルールの大半を回避できるが、WmiPrvSE が起動する分、少しうるさい。
Linux / Impacket
# 対象を絞ったクエリを優先 (SELECT * は全件取るので避ける)
proxychains impacket-wmiquery 'DOMAIN/User:[email protected]' -namespace 'root\\cimv2' \
-q "SELECT Name FROM Win32_Process WHERE Name = 'MsSense.exe'"
# 辞書一括チェック (1 コマンド内で済ませる)
for p in MsSense.exe CSFalconService.exe SentinelAgent.exe cyserver.exe xagt.exe elastic-endpoint.exe; do
impacket-wmiquery 'DOMAIN/User:[email protected]' -namespace 'root\\cimv2' \
-q "SELECT Name FROM Win32_Process WHERE Name = '$p'"
done
# どうしても全列挙が必要な場合だけ
impacket-wmiquery 'DOMAIN/User:[email protected]' -namespace 'root\\cimv2' \
-q "SELECT Name FROM Win32_Process"
Windows / PowerShell
$cred = Get-Credential
Get-WmiObject -ComputerName 10.0.0.5 -Credential $cred -Query "SELECT * FROM Win32_Process WHERE Name = 'MsSense.exe'"
避ける: wmic /node:...
Win11 で廃止。in-session で使うと wmic.exe + WmiPrvSE.exe 両方起動で最もうるさい。Get-Process か impacket-wmiquery を優先。
OPSEC / 注意
共通
- 対象を絞ったクエリにする:
SELECT *や無条件tasklistより、WHERE Name='MsSense.exe'/Get-Process -Name ...で必要分だけ取る。ログ量を減らせるし自分の意図も明確にできる。 - 世代違いに注意: リブランド後の旧プロセス名が残っていることがある。例: xagt.exe = FireEye / Trellix、SavService.exe = 旧 Sophos。辞書は複数表記の可能性込みで見る。
Registry / SMB
winreg(139/445) の ADMIN$ / IPC$ 経由。Event ID 4624 / 4672 と SMB セッション作成が残る。- 単発のキー照会であれば非常に低ノイズ。列挙ループ化すると目立つ。
プロセス列挙 (in-session)
- 相手のセッション上で実行するので、プロセスの親子関係と実行ユーザは必ずログに残る。正規の管理作業の中に紛れさせる。
tasklist.exe/sc.exe起動は Sysmon EID 1 で拾われる。EDR のユーザランドフックはNtQuerySystemInformation(SystemProcessInformation)のパターンを見る実装もある。- Beacon の
psは内部で直接 syscall を使うため cmd / PS 経由より静か。
WMI
- WMI-Activity Operational は有効化されていれば残る: EID 5857 / 5858 / 5859 / 5860 / 5861。ただし既定で無効・ノイズが多くて運用されていない環境がほとんど → 実際は非常に静か。木を隠すなら森の中。
- wmiexec との混同注意:
impacket-wmiexecはWin32_Process::Createを呼んでコマンド実行する横移動用。こちらは クエリのみ なのでWin32_Process::Createトリガには引っかからない。 - プロセスツリー: ターゲット側では
wmiprvse.exeが親となり既知プロセス名で検索行為が行われる。wmiprvse の生存自体は正常。
検知
共通
- EDR のユーザランド API フック:
NtQuerySystemInformation/EnumProcesses/CreateToolhelp32Snapshotなど
Registry / SMB
- EID 4624 / 4672: ログオン、特権
- EID 4656 / 4663: レジストリハイブオブジェクトアクセス、監査設定次第
- SMB / RPC ログ、
winregネームドパイプ接続
プロセス列挙 (in-session)
- Sysmon EID 1: Process Creation、
tasklist.exe/sc.exe起動 - Sysmon EID 10: ProcessAccess、
Get-Process/psが他プロセスのハンドルを取得 - PowerShell ScriptBlock Logging (EID 4104) で
Get-Process/Get-Serviceが見える
WMI
- EID 5857 / 5860: WMI Provider Load / Filter Activity、WMI-Activity Operational、既定無効
- Sysmon 19-21: WMI イベント、永続サブスクライバ寄り
- ネットワーク: 135/tcp + 高位ポート、DCOM RPC 解析で
IWbemServices::ExecQueryが見える - EDR のユーザランド API フックで
CoCreateInstance(CLSID_WbemLocator)を拾う実装もある
背景 / リファレンス
-
なぜ判別するか
EDR 製品ごとに検知ロジック・ユーザランドフック・カーネルコールバック・テレメトリ量がぜんぜん違う。LSASS ダンプ / プロセス注入 / AMSI バイパスといった次にやることは、相手がどの製品かで選択肢が変わる。discovery の中でも先に済ませておくべき作業。
-
なぜ手段を選ぶか
同じ「プロセス名を取る」でも、残るログと検知される確率は手段によってかなり違う。
tasklist.exe起動は EID 4688 / Sysmon 1 に必ず乗るが、Beacon 内蔵psは直接 syscall で新プロセスを作らない。WMI クエリはWmiPrvSE.exeを起こすが、単発の reg 照会は winreg RPC 1 発で終わる。原則: 「なんでもよい」ではなく「今の手札で一番静かな手段は何か」を毎回考える。判別の段階で検知されたら、せっかく特定した情報を使うチャンスがない。
-
WMI とは
Windows Management Instrumentation は CIM (Common Information Model) の Microsoft 実装で、OS / ハードウェア / アプリケーションの管理情報を統一的に WQL で照会できる仕組み。
root\cimv2名前空間にWin32_Process,Win32_Service,Win32_OperatingSystem等のクラスがあり、プロセスやサービスは本質的に「WMI から見れば単なるオブジェクト」。 -
DCOM 経路の仕組み
クライアントは 135/tcp で Endpoint Mapper に問い合わせ、
IWbemServicesインターフェイスをホストしている動的ポートを取得、そのポートに接続して ExecQuery を呼ぶ。Firewall で動的ポートが塞がれているとここでコケるので、impacket-wmiqueryは-portで固定できる。 -
wmiexec との区別
横移動ツール
wmiexec.pyはWin32_Process::Createを呼んでコマンドを起動する。こちらのクエリ用途はIWbemServices::ExecQueryしか叩かないため、検知側のルールが大体前者 (Create) に寄っていて、こっちはほぼ拾われない。 -
プロセス名の世代変化
製品はリブランドされるので名前も変わる。
- FireEye HX → Trellix HX:
xagt.exeは継承 - Palo Alto Traps → Cortex XDR:
CyveraService.exeは旧名で残る、現用はcyserver.exe - Sophos Endpoint Security and Control → Intercept X:
SavService.exe→SSPService.exe/SEDService.exe/SophosFileScanner.exe - Trend Micro OfficeScan → Apex One:
TmListen.exe/PccNTMon.exeは継承 - McAfee → Trellix: 2022 年ブランド統合、プロセス名は当面維持
古い環境では旧名プロセスも残っている。辞書は複数世代の表記を併記する。
- FireEye HX → Trellix HX:
参考
- MITRE ATT&CK: T1518.001 Security Software Discovery