「スマートフォン接続の痕跡」「横展開(ラテラルムーブメント)の検出」「DNSキャッシュと名前解決の証跡」「仮想マシン・コンテナの証跡」「PowerShell/スクリプト実行の深層分析」の5本柱の徹底解説 対応OS:Windows / macOS / Linux

解析

フォレンジック系コマンド記事の第5弾です。これまでの4弾でイベントログ・ネットワーク証跡・USB履歴・メモリ解析・ブラウザ証跡・レジストリ深掘り・アンチフォレンジック検出など幅広い領域を扱ってきました。今回は現代のIT環境で急増している調査ニーズに応える新テーマを取り上げます。

テーマは「スマートフォン接続の痕跡」「横展開(ラテラルムーブメント)の検出」「DNSキャッシュと名前解決の証跡」「仮想マシン・コンテナの証跡」「PowerShell/スクリプト実行の深層分析」の5本柱です。攻撃者の戦術は日々巧妙になっていますが、残す痕跡のパターンは変わりません。その読み解き方を徹底解説します。

⚠️ 重要: 本記事の内容は自分が管理するシステムの調査・学習を目的としています。他者のシステムへの無断調査は不正アクセス禁止法の対象です。組織内での調査は必ず法務・情報セキュリティ部門の承認のもとで実施してください。


目次

  1. 【スマートフォン接続証跡編】スマホとPCをつないだ痕跡を追うコマンド
  2. 【横展開検出編】ネットワーク内部での侵害拡大を追うコマンド
  3. 【DNS・名前解決証跡編】「どこと通信しようとしたか」を読むコマンド
  4. 【仮想マシン・コンテナ証跡編】仮想環境の操作履歴を調べるコマンド
  5. 【PowerShell・スクリプト深層分析編】難読化・隠蔽コードを見破るコマンド
  6. まとめ

【スマートフォン接続証跡編】スマホとPCをつないだ痕跡を追うコマンド

スマートフォンをPCにUSBで接続し、データをコピーして持ち出す手口は内部犯行の定番です。しかし、USBストレージと異なりスマートフォンはMTP(Media Transfer Protocol)やADB(Android Debug Bridge)などの独自プロトコルで接続するため、見落とされがちです。Windowsはこれらの接続も詳細にレジストリへ記録しています。

💡 FACT: 2024年版のVerizon Data Breach Investigations Report(DBIR)によると、内部犯行による情報漏えいインシデントの約35%に物理的なデータの持ち出しが関与しており、USBメモリ・スマートフォンへのコピーが依然として主要な手口として報告されています。

① MTPデバイス(スマートフォン・デジカメ)の接続履歴を調べる(Windows)

Windows(PowerShell):

# MTP(メディア転送プロトコル)デバイスの接続履歴
# AndroidスマホやiPhoneはUSBSTORではなくWPDバスとして記録される
reg query "HKLM\SYSTEM\CurrentControlSet\Enum\WPD" /s | findstr "FriendlyName\|DeviceDesc\|Mfg"

# より読みやすく整形(PowerShell)
Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Enum\WPD" -Recurse -ErrorAction SilentlyContinue |
  ForEach-Object {
    $props = Get-ItemProperty $_.PsPath -ErrorAction SilentlyContinue
    if ($props.FriendlyName) {
      [PSCustomObject]@{
        DeviceName  = $props.FriendlyName
        Description = $props.DeviceDesc
        Manufacturer= $props.Mfg
        RegistryKey = $_.PSChildName
      }
    }
  } | Where-Object { $_ -ne $null } | Format-Table -AutoSize

# WindowsポータブルデバイスのフレンドリーネームをMicrosoftのポータブルデバイスDBから確認
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows Portable Devices\Devices" -ErrorAction SilentlyContinue |
  ForEach-Object {
    $p = Get-ItemProperty $_.PsPath -ErrorAction SilentlyContinue
    if ($p.FriendlyName) { Write-Host "$($p.FriendlyName)  [$($_.PSChildName)]" }
  }

② ADB(Android Debug Bridge)の使用痕跡を検出する

ADBはAndroid端末をPCからデバッグ・操作するツールで、データ抽出・アプリインストール・スクリーン操作に使われます。フォレンジック調査でも重要なツールですが、悪用されることもあります。

Windows(PowerShell):

# adb.exeの実行痕跡をPrefetchで確認
Get-ChildItem "C:\Windows\Prefetch\*.pf" |
  Where-Object { $_.Name -match "ADB\." } |
  Select-Object Name, LastWriteTime | Sort-Object LastWriteTime -Descending

# adb.exeがインストールされている場所を検索
Get-ChildItem "C:\", "$env:APPDATA", "$env:LOCALAPPDATA", "$env:ProgramFiles" -Recurse `
  -Include "adb.exe" -ErrorAction SilentlyContinue |
  Select-Object FullName, LastWriteTime

# adb関連のイベントログを確認(実行コマンドライン)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4688} -ErrorAction SilentlyContinue |
  Where-Object { $_.Properties[5].Value -match "adb" } |
  Select-Object TimeCreated, @{N='Process';E={$_.Properties[5].Value}},
    @{N='CmdLine';E={$_.Properties[8].Value}} |
  Sort-Object TimeCreated -Descending | Select-Object -First 20

macOS:

# ADB使用履歴をbash/zsh履歴から確認
grep -E "adb |adb\." ~/.bash_history ~/.zsh_history 2>/dev/null

# ADBのデーモンプロセスが残っているか確認
ps aux | grep -i "adb"

# ADB接続ログをシステムログから確認
log show --predicate 'process == "usbmuxd"' --last 30d | grep -i "attach\|connect" | head -30

③ iTunes/iPhoneのバックアップ・同期痕跡を調べる(Windows/macOS)

Windows(PowerShell):

# iPhoneバックアップの保存場所と最終バックアップ日時
$backupPath = "$env:APPDATA\Apple Computer\MobileSync\Backup"
if (Test-Path $backupPath) {
  Get-ChildItem $backupPath | ForEach-Object {
    $info = Get-ChildItem $_.FullName -Recurse -ErrorAction SilentlyContinue |
      Measure-Object Length -Sum
    [PSCustomObject]@{
      DeviceID    = $_.Name
      LastWrite   = $_.LastWriteTime
      TotalSizeMB = [math]::Round($info.Sum / 1MB, 1)
      FileCount   = $info.Count
    }
  } | Format-Table -AutoSize
}

# iTunes経由でのデバイス接続をイベントログで確認
Get-WinEvent -FilterHashtable @{LogName='System'; Id=20001} -ErrorAction SilentlyContinue |
  Where-Object { $_.Message -match "Apple|iTunes" } |
  Select-Object TimeCreated, Message | Select-Object -First 10

macOS:

# iPhoneバックアップ(Finderバックアップ)の確認
ls -la ~/Library/Application\ Support/MobileSync/Backup/ 2>/dev/null

# デバイスごとのバックアップサイズと日時
for dir in ~/Library/Application\ Support/MobileSync/Backup/*/; do
  echo "デバイスID: $(basename $dir)"
  echo "  最終更新: $(stat -f '%Sm' -t '%Y-%m-%d %H:%M' "$dir")"
  echo "  サイズ: $(du -sh "$dir" 2>/dev/null | cut -f1)"
done

# usbmuxd(iOS接続デーモン)のログを確認
log show --predicate 'process == "usbmuxd"' --last 7d | tail -50

【横展開検出編】ネットワーク内部での侵害拡大を追うコマンド

サイバー攻撃の多くは「初期侵害→権限昇格→横展開(ラテラルムーブメント)→目的達成」という流れをたどります。ラテラルムーブメントとは、最初に感染した端末から社内ネットワーク内の他のPCやサーバーへと侵害を広げる動きです。MITRE ATT&CKではこれを独立した戦術カテゴリとして定義しており、PsExec・WMI・RDP・SMBなど複数の手法が記録されています。

💡 FACT: CrowdStrikeの「2024 Global Threat Report」によると、攻撃者が侵入後に横展開を開始するまでの時間(Breakout Time)の平均は62分で、最速の事例では2分以内に横展開が開始されています。初動対応の速さが被害範囲を決定的に左右します。

① PsExecによる遠隔実行の痕跡を検出する(Windows)

PsExecはMicrosoft Sysinternalsのツールですが、攻撃者がリモートでコマンドを実行する際に悪用されることが多い代表的なラテラルムーブメントツールです。

Windows(PowerShell):

# PsExecサービスの痕跡(PsExecはPSEXESVCというサービスを一時的に作成する)
Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045} -ErrorAction SilentlyContinue |
  Where-Object { $_.Message -match "PSEXESVC\|PsExec" } |
  Select-Object TimeCreated, Message | Format-List

# PsExecの実行ファイルをPrefetchで確認
Get-ChildItem "C:\Windows\Prefetch\*.pf" |
  Where-Object { $_.Name -match "PSEXEC\|PSEXESVC" } |
  Select-Object Name, LastWriteTime | Sort-Object LastWriteTime -Descending

# WMIを使ったリモートプロセス実行の痕跡(イベントID 4688でwmiprvseの子プロセス)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4688} -ErrorAction SilentlyContinue |
  Where-Object { $_.Properties[6].Value -match "WmiPrvSE" } |
  Select-Object TimeCreated,
    @{N='ParentProcess';E={$_.Properties[6].Value}},
    @{N='NewProcess';E={$_.Properties[5].Value}},
    @{N='CommandLine';E={$_.Properties[8].Value}} |
  Sort-Object TimeCreated -Descending | Select-Object -First 20

② 管理共有(Admin$・C$)へのアクセス痕跡を確認する(Windows)

攻撃者はWindowsの隠し管理共有(\\target\C$\\target\ADMIN$)を使って、他のPCにファイルをコピーしたりリモート操作を行います。

Windows(PowerShell):

# ネットワーク共有へのアクセスイベント(イベントID 5140:ネットワーク共有アクセス)
Get-WinEvent -FilterHashtable @{
  LogName='Security'; Id=5140
  StartTime=(Get-Date).AddDays(-7)
} -ErrorAction SilentlyContinue |
  Where-Object { $_.Properties[5].Value -match "\$" } |
  Select-Object TimeCreated,
    @{N='ShareName';E={$_.Properties[5].Value}},
    @{N='SourceIP';E={$_.Properties[3].Value}},
    @{N='UserName';E={$_.Properties[1].Value}} |
  Sort-Object TimeCreated -Descending | Select-Object -First 30

# SMBを使ったファイルコピーの痕跡(イベントID 5145)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=5145} -ErrorAction SilentlyContinue |
  Where-Object { $_.Properties[5].Value -match "ADMIN\$|C\$|IPC\$" } |
  Select-Object TimeCreated,
    @{N='Share';E={$_.Properties[5].Value}},
    @{N='File';E={$_.Properties[7].Value}},
    @{N='SourceIP';E={$_.Properties[3].Value}} |
  Sort-Object TimeCreated -Descending | Select-Object -First 20

# 現在開かれているSMBセッションの確認
net session 2>$null
Get-SmbSession | Select-Object ClientComputerName, ClientUserName, NumOpens, SecondsExists

③ Pass-the-Hash・Pass-the-Ticketの痕跡を検出する(Windows)

Pass-the-Hash(PtH)はパスワードのハッシュ値をそのまま使って認証する攻撃手法です。ログオンタイプとNTLM認証の組み合わせで検出できます。

Windows(PowerShell):

# LogonType 3(ネットワーク)かつNTLM認証のログオンを抽出(PtH疑い)
Get-WinEvent -FilterHashtable @{
  LogName='Security'; Id=4624
  StartTime=(Get-Date).AddDays(-7)
} -ErrorAction SilentlyContinue |
  Where-Object {
    $_.Properties[8].Value -eq 3 -and       # LogonType = Network
    $_.Properties[10].Value -eq "NTLM"       # 認証パッケージ = NTLM
  } |
  Select-Object TimeCreated,
    @{N='User';E={$_.Properties[5].Value}},
    @{N='Domain';E={$_.Properties[6].Value}},
    @{N='SourceIP';E={$_.Properties[18].Value}},
    @{N='AuthPackage';E={$_.Properties[10].Value}} |
  Sort-Object TimeCreated -Descending | Select-Object -First 30

# 同一ユーザーが短時間に複数のIPから認証している場合を検出
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624;
  StartTime=(Get-Date).AddHours(-24)} -ErrorAction SilentlyContinue |
  Where-Object { $_.Properties[8].Value -eq 3 } |
  Group-Object { $_.Properties[5].Value } |
  Where-Object { ($_.Group.Properties.Value | Select-Object -Index 18 | Sort-Object -Unique).Count -gt 3 } |
  Select-Object Name, Count | Sort-Object Count -Descending

④ Linuxでのssh・sudo横展開を追う

Linux:

# SSH鍵を使って他ホストに接続した記録(~/.ssh/known_hostsと組み合わせる)
grep "Accepted publickey" /var/log/auth.log |
  awk '{print $1,$2,$3,"USER:"$9,"FROM:"$11,"KEY:"$15}' | tail -30

# sudo -u(他ユーザーへの権限昇格)の使用記録を確認
grep "sudo:" /var/log/auth.log | grep -v "pam_unix\|session" | tail -30

# su / sudo による横断的なユーザー切り替えを確認
ausearch -m USER_ROLE_CHANGE 2>/dev/null | tail -20
grep "su\[" /var/log/auth.log | grep "Successful\|FAILED" | tail -20

# 複数ホストへの同時SSH接続がないか確認
ss -tnp | grep ":22" | awk '{print $5}' | sort | uniq -c | sort -rn

【DNS・名前解決証跡編】「どこと通信しようとしたか」を読むコマンド

DNSキャッシュは「そのPCがどのドメインに通信を試みたか」を記録した一時的なデータベースです。ブラウザ履歴を削除しても、DNSキャッシュには通信先ドメインが残ることがあります。また、C2(コマンド&コントロール)サーバーへの通信、DNSトンネリング(DNSを使ったデータ隠蔽通信)の検出にも有効です。

① DNSキャッシュから通信先を抽出する

Windows(PowerShell):

# 現在のDNSキャッシュをすべて表示
Get-DnsClientCache | Select-Object Entry, RecordName, RecordType, Data, TimeToLive |
  Sort-Object Entry | Format-Table -AutoSize

# 不審なドメインを絞り込む(一般的でないTLDや長いサブドメイン)
Get-DnsClientCache |
  Where-Object {
    $_.Entry -match "\.(xyz|top|click|work|review|gdn|men|download)$" -or
    $_.Entry.Length -gt 50
  } |
  Select-Object Entry, Data | Format-Table -AutoSize

# DNSキャッシュを外部ファイルに保存(調査前に保全)
Get-DnsClientCache | Export-Csv "C:\forensics\dns_cache_$(Get-Date -Format yyyyMMdd_HHmmss).csv" -NoTypeInformation -Encoding UTF8

# 特定のIPアドレスに解決されているドメインを逆引き
Get-DnsClientCache | Where-Object { $_.Data -eq "203.0.113.100" } | Select-Object Entry

macOS:

# macOSのDNSキャッシュ内容を表示
sudo dscacheutil -cachedump -entries Host 2>/dev/null | head -100

# より詳細なキャッシュ確認(mDNSResponder経由)
sudo killall -INFO mDNSResponder; sleep 1
log show --predicate 'process == "mDNSResponder"' --last 5m | grep "cache" | head -30

Linux:

# systemd-resolvedのキャッシュを確認
resolvectl statistics
resolvectl query google.com   # 特定ドメインのキャッシュを確認

# nscdのキャッシュ統計
nscd -g 2>/dev/null | grep "hits\|misses"

# /etc/hostsの確認(悪意ある追記がないか)
cat /etc/hosts | grep -v "^#\|^$\|localhost\|127\.\|::1"

② DNSトンネリングの痕跡を検出する

DNSトンネリングはDNSクエリにデータを埋め込んで、ファイアウォールを迂回してデータを外部に送出する高度な手法です。異常に長いドメイン名や大量のTXTレコードクエリが特徴です。

Windows(PowerShell):

# DNSイベントログから長いドメイン名のクエリを抽出(50文字超は要注意)
Get-WinEvent -LogName "Microsoft-Windows-DNS-Client/Operational" -ErrorAction SilentlyContinue |
  Where-Object { $_.Message.Length -gt 0 } |
  Select-Object TimeCreated, Message |
  Where-Object { ($_.Message -match "(\w{50,})") } |
  Select-Object -First 20

# PowerShellでDNSトンネリングの可能性があるエントリを検出
Get-DnsClientCache |
  Where-Object {
    # サブドメインが異常に長いか、Base64/16進数的なパターン
    $_.Entry -match "[A-Za-z0-9+/]{20,}(\.[^.]+){1,3}$" -or
    ($_.Entry.Split(".").Length -gt 5) -or
    ($_.Entry.Length -gt 60)
  } | Select-Object Entry, Data | Format-Table -AutoSize

Linux(tcpdumpでDNSトラフィックをリアルタイム分析):

# DNSクエリをリアルタイムで監視(異常な長さのクエリを検出)
sudo tcpdump -i eth0 -n port 53 -l 2>/dev/null |
  awk '{
    for(i=1;i<=NF;i++) {
      if(length($i) > 40) print "⚠ 長いラベル検出:", $0
    }
  }' | head -50

# 保存済みpcapファイルからDNSクエリのドメインだけを抽出
tcpdump -nn -r capture.pcap port 53 2>/dev/null |
  grep -oE "[A-Za-z0-9._-]+\.[a-z]{2,}" | sort | uniq -c | sort -rn | head -30

# TXTレコードへの異常なクエリ数(トンネリングの典型)
sudo tcpdump -i eth0 -n 'port 53' -l 2>/dev/null | grep "TXT" | wc -l

💡 FACT: DNSトンネリングは1990年代から理論的に知られていましたが、近年のマルウェアに実装例が急増しています。セキュリティ企業Infobloxの調査では、調査対象企業の約46%のネットワークでDNSトンネリングの痕跡が検出されたと報告されています(2023年調査)。標準ポートを使うため多くのファイアウォールをすり抜けます。

③ hostsファイルの改ざんを検出する

Windows(PowerShell):

# hostsファイルの内容を確認(追記がないか)
Get-Content "C:\Windows\System32\drivers\etc\hosts" | Where-Object { $_ -notmatch "^#|^$" }

# hostsファイルのハッシュ値を確認(基準値と比較)
Get-FileHash "C:\Windows\System32\drivers\etc\hosts" -Algorithm SHA256

# hostsファイルの最終更新日時を確認
Get-Item "C:\Windows\System32\drivers\etc\hosts" | Select-Object FullName, LastWriteTime, Length

# 正規のhostsファイルは127.0.0.1 localhostと::1 localhostのみのはず
# それ以外のエントリは要確認(有名サービスのドメインが別IPにリダイレクトされていないか)
$hosts = Get-Content "C:\Windows\System32\drivers\etc\hosts" | Where-Object { $_ -notmatch "^#|^$|localhost" }
if ($hosts) {
  Write-Host "⚠ 追加エントリを検出:"
  $hosts | ForEach-Object { Write-Host "  $_" }
} else { Write-Host "hostsファイルは正常(デフォルトのみ)" }

【仮想マシン・コンテナ証跡編】仮想環境の操作履歴を調べるコマンド

仮想マシン(VirtualBox・VMware・Hyper-V)やDockerコンテナは、その中で行われた操作を「ホスト側のOSから隔離する」ために使われることがあります。仮想マシンの中でマルウェアを実行したり、コンテナ内でデータを保管したりする手法は、セキュリティツールの検出をかいくぐる手段として攻撃者にも活用されています。

① VirtualBox・VMwareの使用痕跡を調べる(Windows)

Windows(PowerShell):

# VirtualBoxのインストール・使用痕跡
reg query "HKLM\SOFTWARE\Oracle\VirtualBox" 2>$null
Get-ChildItem "$env:APPDATA\VirtualBox\" -ErrorAction SilentlyContinue |
  Select-Object Name, LastWriteTime

# VirtualBoxの仮想マシン一覧(デフォルト保存場所)
Get-ChildItem "$env:USERPROFILE\VirtualBox VMs\" -ErrorAction SilentlyContinue |
  Select-Object Name, LastWriteTime

# VirtualBoxのログを確認
Get-ChildItem "$env:USERPROFILE\VirtualBox VMs\" -Recurse -Include "*.log" -ErrorAction SilentlyContinue |
  Sort-Object LastWriteTime -Descending | Select-Object -First 5 |
  ForEach-Object { Write-Host "=== $($_.FullName) ==="; Get-Content $_.FullName | Select-Object -Last 20 }

# VMwareの使用痕跡
reg query "HKLM\SOFTWARE\VMware, Inc." 2>$null
Get-ChildItem "$env:USERPROFILE\Documents\Virtual Machines\" -ErrorAction SilentlyContinue |
  Select-Object Name, LastWriteTime

# PrefetchでVMware・VirtualBoxの実行痕跡を確認
Get-ChildItem "C:\Windows\Prefetch\*.pf" |
  Where-Object { $_.Name -match "VIRTUALBOX\|VMWARE\|VBOXMANAGE" } |
  Select-Object Name, LastWriteTime | Sort-Object LastWriteTime -Descending

② Hyper-Vの仮想マシン操作ログを調べる(Windows)

Windows(PowerShell):

# Hyper-Vが有効かどうか確認
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -ErrorAction SilentlyContinue |
  Select-Object FeatureName, State

# Hyper-VのイベントログからVM操作を確認
Get-WinEvent -LogName "Microsoft-Windows-Hyper-V-Worker-Admin" -ErrorAction SilentlyContinue |
  Select-Object TimeCreated, Message | Select-Object -First 20

# 登録されている仮想マシン一覧
Get-VM -ErrorAction SilentlyContinue | Select-Object Name, State, CreationTime, LastOperationalStatus

# 仮想マシンのスナップショット(チェックポイント)一覧
Get-VM -ErrorAction SilentlyContinue | Get-VMSnapshot |
  Select-Object VMName, Name, CreationTime, ParentCheckpointName | Format-Table -AutoSize

③ Dockerコンテナの操作ログを調べる(Linux/macOS)

Linux / macOS:

# Dockerデーモンのログを確認
sudo journalctl -u docker --since "7 days ago" | tail -100
# macOSの場合
cat ~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log 2>/dev/null | tail -100

# 過去に実行されたコンテナ(停止済み含む)の一覧
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.CreatedAt}}\t{{.Status}}\t{{.Command}}" 2>/dev/null

# コンテナのイメージ一覧(いつダウンロードされたか)
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.CreatedAt}}\t{{.Size}}" 2>/dev/null

# 特定コンテナのログを確認
docker logs container_id 2>/dev/null | tail -100

# コンテナに対して実行されたコマンドを確認(docker exec の痕跡)
sudo journalctl -u docker | grep "exec\|container" | tail -50

# 不審な権限(privileged)で起動されたコンテナを確認
docker inspect $(docker ps -aq) 2>/dev/null |
  python3 -c "import sys,json; [print(c['Name'],c['HostConfig']['Privileged']) for c in json.load(sys.stdin) if c['HostConfig']['Privileged']]"

💡 FACT: Aqua Securityの「2024 Cloud Native Security Report」によると、Dockerコンテナを悪用した攻撃(コンテナエスケープ・不審イメージの実行・特権コンテナの悪用)が前年比で94%増加しています。特に--privilegedオプション付きコンテナはホストOSへの完全なアクセスを可能にするため、フォレンジック調査の重要なチェック項目です。


【PowerShell・スクリプト深層分析編】難読化・隠蔽コードを見破るコマンド

現代のマルウェアとサイバー攻撃において、PowerShellはもっとも頻繁に悪用されるツールの一つです。MITRE ATT&CKの統計では、観測されたインシデントの60%以上でPowerShellが使用されていると報告されています(2023年版)。ファイルレス実行・難読化・ダウンロード実行など、攻撃者がPowerShellを使い倒す手口とその検出方法を解説します。

① PowerShellのスクリプトブロックログを詳しく分析する(Windows)

Windows(PowerShell):

# スクリプトブロックログ(イベントID 4104)を抽出
# ※ 有効化には「PowerShellスクリプトブロックのログ記録」グループポリシーの設定が必要
Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" -ErrorAction SilentlyContinue |
  Where-Object { $_.Id -eq 4104 } |
  Select-Object TimeCreated, @{N='Script';E={$_.Properties[2].Value}} |
  Select-Object -First 30 | Format-List

# 難読化の可能性が高いキーワードを含むスクリプトを抽出
$suspiciousPatterns = "FromBase64String|EncodedCommand|Invoke-Expression|IEX|`-enc|`-e |DownloadString|WebClient|Hidden|Bypass|Unrestricted"
Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" -ErrorAction SilentlyContinue |
  Where-Object { $_.Id -eq 4104 -and $_.Properties[2].Value -match $suspiciousPatterns } |
  Select-Object TimeCreated, @{N='Script';E={$_.Properties[2].Value[0..200] -join ""}} |
  Sort-Object TimeCreated -Descending | Select-Object -First 20 | Format-List

# Base64エンコードされたコマンドをデコードする
$encoded = "JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAg..."  # 例
[System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($encoded))

② PowerShellの実行ポリシー迂回の痕跡を検出する

Windows(PowerShell):

# 実行ポリシーの迂回が試みられた記録を確認
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4688} -ErrorAction SilentlyContinue |
  Where-Object {
    $_.Properties[8].Value -match "-ExecutionPolicy\s+(Bypass|Unrestricted)" -or
    $_.Properties[8].Value -match "-enc\b|-e\b|-EncodedCommand" -or
    $_.Properties[8].Value -match "Invoke-Expression|IEX\b|\.DownloadString"
  } |
  Select-Object TimeCreated,
    @{N='CmdLine';E={$_.Properties[8].Value}} |
  Sort-Object TimeCreated -Descending | Select-Object -First 20 | Format-List

# PSReadLineによるコマンド履歴(PowerShell 5.0以降)
$histFile = "$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt"
if (Test-Path $histFile) {
  Get-Content $histFile | Select-Object -Last 100 |
    Where-Object { $_ -match "Invoke|IEX|Download|Base64|bypass|hidden" }
}

# 全ユーザーのPSReadLine履歴を確認(管理者権限)
Get-ChildItem "C:\Users\*\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt" -ErrorAction SilentlyContinue |
  ForEach-Object {
    Write-Host "=== $($_.FullName) ==="
    Get-Content $_.FullName | Select-Object -Last 50 |
      Where-Object { $_ -match "Invoke|IEX|Download|Base64|bypass|curl|wget|nc " }
  }

③ WScript・CScript・mshta の不審な実行を検出する

VBScript・JScript・HTA(HTMLアプリケーション)はフィッシングメールの添付ファイルから起動されるマルウェアの典型的な実行形式です。

Windows(PowerShell):

# WScript・CScript・mshta・regsvr32の実行痕跡をPrefetchで確認
Get-ChildItem "C:\Windows\Prefetch\*.pf" |
  Where-Object { $_.Name -match "^WSCRIPT|^CSCRIPT|^MSHTA|^REGSVR32|^RUNDLL32|^MSIEXEC" } |
  Select-Object Name, LastWriteTime | Sort-Object LastWriteTime -Descending

# イベントID 4688でWScript等の実行とコマンドラインを確認
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4688} -ErrorAction SilentlyContinue |
  Where-Object {
    $_.Properties[5].Value -match "wscript|cscript|mshta|regsvr32|rundll32" -and
    $_.Properties[8].Value -match "http|\\\\|\\.vbs|\.js$|\.hta"
  } |
  Select-Object TimeCreated,
    @{N='Process';E={$_.Properties[5].Value}},
    @{N='CmdLine';E={$_.Properties[8].Value}} |
  Sort-Object TimeCreated -Descending | Select-Object -First 20 | Format-List

④ Linuxのシェルスクリプト・cronジョブの難読化を検出する

Linux:

# base64エンコードされたコマンドの実行痕跡をauditdで確認
sudo ausearch -k exec 2>/dev/null |
  grep -E "base64|eval|python.*exec|perl.*eval" | tail -20

# /tmp・/dev/shmに存在するシェルスクリプトを確認
find /tmp /dev/shm /var/tmp -name "*.sh" -o -name "*.py" -o -name "*.pl" 2>/dev/null |
  xargs ls -la 2>/dev/null

# 不審なcronジョブに難読化・ダウンロード実行がないか確認
for user in $(cut -d: -f1 /etc/passwd); do
  crontab -u $user -l 2>/dev/null |
    grep -v "^#\|^$" |
    grep -iE "base64|curl.*exec|wget.*exec|eval\|python|perl|ruby" &&
    echo "  [上記は $user のcrontabに存在]"
done

# systemdのユニットファイルに不審なコマンドが含まれていないか
grep -rE "ExecStart=.*base64|ExecStart=.*curl|ExecStart=.*eval" \
  /etc/systemd/ /usr/lib/systemd/ ~/.config/systemd/ 2>/dev/null

💡 FACT: Microsoftのセキュリティレポートによると、PowerShellのスクリプトブロックログ(イベントID 4104)を有効化している環境では、難読化されたマルウェアの検出率が有効化していない環境と比べて約3倍に向上することが示されています。このログはデフォルトで無効のため、セキュリティ強化策として有効化が強く推奨されます。


まとめ

本記事で紹介したコマンドと手法を一覧にまとめました。

カテゴリコマンド / 手法調査目的
スマートフォン接続reg query WPD(MTPデバイス)スマートフォン・デジカメの接続履歴
スマートフォン接続ADB Prefetch・実行ログ確認Android端末への不審な操作の痕跡
スマートフォン接続iPhoneバックアップの場所と日時iPhone同期・バックアップの証拠
横展開検出PSEXESVC サービスイベントID 7045PsExecによるリモート実行の痕跡
横展開検出イベントID 5140/5145(SMB共有アクセス)管理共有への不審アクセスの検出
横展開検出LogonType=3 + NTLM(PtH検出)Pass-the-Hash攻撃の痕跡検出
DNS・名前解決Get-DnsClientCache / dscacheutilDNSキャッシュから通信先ドメインを抽出
DNS・名前解決長いドメイン名・TXTクエリ検出DNSトンネリングの検出
DNS・名前解決hostsファイルの改ざん検出DNSハイジャック・フィッシング誘導の発見
仮想マシン・コンテナVirtualBox・VMware レジストリ・Prefetch仮想マシンの使用・操作履歴
仮想マシン・コンテナHyper-V イベントログ・Get-VMHyper-V上のVM操作記録
仮想マシン・コンテナdocker ps -a / docker logs / journalctl -u dockerDockerコンテナの実行・操作履歴
PowerShell深層イベントID 4104(スクリプトブロックログ)難読化スクリプトの内容記録・Base64デコード
PowerShell深層PSReadLine履歴ファイル全ユーザーのPowerShell実行履歴
PowerShell深層wscript/mshta/regsvr32 Prefetch + ID 4688スクリプトエンジン悪用の検出

フォレンジック5弾シリーズを振り返って

第1弾から第5弾まで、コマンドだけでできるフォレンジック調査をテーマに、50以上の手法と100を超えるコマンド例を紹介してきました。5弾を通じて明らかになったことを一言でまとめると:

「現代のOSはフォレンジック調査官の味方として設計されている」

Windowsのイベントログ・Prefetch・Amcache・レジストリ、macOSのUnified Logging、LinuxのAuditd・journalctlは、すべて「何が起きたかを後から追える」ように設計されています。攻撃者はこれらを意識して消そうとしますが、消そうとする行為自体が新たな痕跡を生み出します。

「ふだんの状態」を知っているからこそ、異常に気づけます。本シリーズで紹介したコマンドを日頃から実行して「自分のPCの正常な状態」を把握しておくことが、フォレンジック調査の最強の下準備です。


※ 本記事の内容は情報セキュリティの学習・自己管理目的で掲載しています。他者のシステムへの無断調査は不正アクセス禁止法により処罰の対象となります。仮想マシン・コンテナの調査、PowerShellログの収集は自分が管理するシステム上でのみ実施してください。企業・組織内での調査は法務・情報セキュリティ部門の承認のもとで実施してください。

コメント