PowerShellによるBulk Reverse DNS Lookupで行うITセキュリティ調査:Phorphiexボットネットの事例
IPアドレスは、インターネット上のノードが通信を行う上で技術的に必要なものです。そのため、ITセキュリティ調査においてはわかりやすい入力データとなります。したがって、サイバー犯罪が実行された後に何らかの方法でIPアドレスが削除されていない場合、あるいは犯罪実行前のログのいずれかにIPアドレスが記録されている場合、実際に何が起こったのかを解明する上で非常に役立ちます。
IBM Xforce exchangeは、ITセキュリティの維持を担当する人々にとって重要な、多くのセキュリティ・インシデントを報告するフォーラムです。今回のブログでは、そのレポートの中から1つを選び、Windowsにインストールされ、LinuxやMac OS Xでも使用可能なPowerShellを使用して、WhoisXML APIを使って与えられた情報を拡張する方法を確認します。以下の説明では、PowerShellプログラミングの中級以下のスキルを想定しています。
WhoisXML APIのReverse DNS APIが提供するパッシブDNSデータを使用します。パッシブDNSセンサーによって観測されたネットワーク通信イベントのうち、指定されたIPが実際のドメイン名に解決されたイベントのリストを取得できます。これは、指定されたIPが指定されたドメイン名で、指定された時間にインターネット上で通信していたことを意味します;ドメインネームシステム自体からは得られない情報です。一方、以下の実証研究から明らかなように、悪意のある相手の性格を明らかにするのに大いに役立つ。
1. IBM XForce コレクションからのデータ取得
今回取り上げるのは、最近観測されたPhorphiexボットネットの活動です。IBMの説明を引用します(https://exchange.xforce.ibmcloud.com/collection/Phorpiex-Botnet-Extortion-Activity-Monitoring-76265914d081e79d158260bf5385a9da、2021年8月19日に訪問)。
「IBM X-Force の進行中のコレクションは、当社の環境で発見された Phorpiex ボットネットの強要活動に関する最新の IoC と情報を提供するために作成されました。このコレクションは、新しい発見がなされるたびに自動的に更新されます。このコレクション内の IoC は実行可能であるため、お客様の環境を保護するためのブロックに使用できることにご注意ください。このため、インジケータの悪質性を裏付けるさらなる証拠が得られない場合、特定の IoC が動的な時間範囲でコレクションから削除されることがあります。"
「Phorpiexボットネットは、当初はIRCプロトコルを使用するボットネットとして知られていましたが、その後モジュラーアーキテクチャに変更されました。配布は、エクスプロイト・キットや他のマルウェア・ファミリーからのサポートを通じて行われます。この成功により、ボットネットの運営者は現在、マルウェア・アズ・ア・サービス(MaaS)として事業を展開しています。このサービスにより、他のサイバーギャングが悪意のある意図のためにボットネットのインフラを利用することができる。しかし、日常的な脅威の大部分は、いわゆる「セクストーション」と呼ばれるスパムキャンペーンです。スパムキャンペーンにおける "sextortion "とは、被害者の親密な写真やビデオを公開すると脅して、被害者に一定期間内に一定の金額を支払うよう強要することを指します。脅迫者がこのような素材を所持していることが証明された事例は今のところ知られていないため、これは偽の脅迫であることが知られている。"
IBM X-Force Exchangeは、このボットネットの活動が最近観測されたIPアドレスを含むレポートのコレクションを提供しています。このブログを書いている時点では、IP アドレスのリストは IBM X-Force Exchange からダウンロードした情報から推測することができます。すなわち、前述のリンクからファイルをダウンロードするには、「I'm affected」ボタンの隣にあるメニューから「Export」オプションを選択する。STIX 2.0 フォーマットを選択すると、標準的な JSON フォーマットのファイルがダウンロードされ、そこから IP アドレスを推測し、さらに処理することができます。
2. STIX 2.0形式のレポートからIPアドレスを抽出
ダウンロードしたSTIX 2.0ファイルは、xfe-collection_76265914d081e79d158260bf5385a9da.jsonという名前で保存されています。次に、ダウンロードしたファイルがあるディレクトリで、PowerShellを使ってIPのリストを取得します。以下の変換を行います:
$data=Get-Content ".\xfe-collection_76265914d081e79d158260bf5385a9da.json" |
ConvertFrom-Json
$data.objects.pattern |
foreach {$_ | Select-String -Pattern '(\d{1,3}\.){3}\d{1,3}'} |
foreach {$_.Matches.Value} > ips.csv
最初のコマンドは、コレクション内のエントリーをPowerShellオブジェクトに変換する。2行目は、IPアドレスを文字列で含むJSONのパターンフィールドを取得する。そして、正規表現マッチングでIPv4アドレスを取得します。出来上がったips.csvファイルには、各行に1つのIPアドレスがあります。次のステップでは、Reverse IP APIを使用して、このファイルにパッシブDNS情報を追加するスクリプトを開発する。
3. 逆引きパッシブDNSデータでIPアドレスリストを拡張するスクリプト
逆引きパッシブDNSデータを使用してIPアドレスのリストを拡張するという目的は、次のコードをPowerShell cmdletを使って実行することで達成できます(例えばExtendIPCsvWithReversePDNS.ps1などの名前で保存することをお勧めします)。
#Extends a list of IPs with Reverse IP/DNS lookup results
# The input list does not contain a header and contains valid IPs
#Usage:
# 1. set the environment variable APIKEY to your API key:
# PS C:\Users\User\WorkingDirectory> $APIKey="YOUR_API_KEY"
# 2. Once done, you can run it like this:
# PS C:\Users\User\WorkingDirectory> .\ExtendIPCsvWithReversePDNS.ps1
'.\inputfile.csv' '.\outputfile.csv'
# Note: if the output file exists and is not empty, the results will be appended.
[CmdletBinding()]
param(
[string] $InputFile,
[string] $OutputFile
)
$BaseUrl = "https://reverse-ip.whoisxmlapi.com/api/v1?apiKey=" + $ENV:APIKEY +"&ip="
Function Convert-FromUnixDate ($UnixDate) {
[timezone]::CurrentTimeZone.ToUniversalTime(([datetime]'1/1/1970').AddSeconds($UnixDate))
}
Import-Csv -Header "IP" -Path $InputFile | ForEach-Object {
Write-Host $_.IP
$URI = $BaseUrl + $_.IP
#Need this to be visible in the catch branch
$IP = $_.IP
$IPData = [PSCustomObject]@{
IP = $IP
}
try{
$APIResponse = Invoke-WebRequest -Uri $URI -UseBasicParsing
$k=0
$Result = ConvertFrom-Json $APIResponse.Content
foreach($row in $Result.result) {
$first_seen = Convert-FromUnixDate $row.first_seen
$last_visit = Convert-FromUnixDate $row.last_visit
Write-Host $k $row.name $first_seen $last_visit
$field1 = "name_" + [string]$k
$field2 = "first_seen_" + [string]$k
$field3 = "last_visit_" + [string]$k
$IPData | Add-Member -MemberType NoteProperty -Name $field1 -Value $row.name
$IPData | Add-Member -MemberType NoteProperty -Name $field2 -Value $first_seen
$IPData | Add-Member -MemberType NoteProperty -Name $field3 -Value $last_visit
$k += 1}
for($l=$k; $l -lt 300; $l++){
$field1 = "name_" + [string]$l
$field2 = "first_seen_" + [string]$l
$field3 = "last_visit_" + [string]$l
$IPData |
Add-Member -MemberType NoteProperty -Name $field1 -Value " "
$IPData |
Add-Member -MemberType NoteProperty -Name $field2 -Value " "
$IPData |
Add-Member -MemberType NoteProperty -Name $field3 -Value " "
}
}
catch{
Write-Host "Ran into an issue: $($PSItem.ToString())"
for($l=0; $l -lt 300; $l++){
$field1 = "name_" + [string]$l
$field2 = "first_seen_" + [string]$l
$field3 = "last_visit_" + [string]$l
$IPData |
Add-Member -MemberType NoteProperty -Name $field1 -Value " "
$IPData |
Add-Member -MemberType NoteProperty -Name $field2 -Value " "
$IPData |
Add-Member -MemberType NoteProperty -Name $field3 -Value " "
}
}
$IPData |
Export-Csv -Append -NoTypeInformation -Encoding UTF8 $OutputFile
}
スクリプトは、自己整合性を保つために、最初の数行のコメントで使用方法を示している。その操作では、2つの位置引数を定義する。1行に1つずつIPのリストである入力ファイルと、結果が追加される出力ファイルである。APIのベースURLを$BaseUrlに格納する。関数Convert-FromUnicDateは、APIによってEpochとして返された時間をdatetimeに変換することを目的としている。
メインループはパイプラインを通してIPを取得する。各IPについて、$IPDataにレコードを格納する。APIの呼び出しとその処理は、何か問題が発生した場合に対処するためにtry-catchの中にある。Invoke-WebRequestでAPIを呼び出し、ConvertFrom-Jsonで結果のJSONを解析します。各IPを出力csvファイルの行にしたいので、結果のリストであるAPIのresultフィールドをループし、各レコードの名前、first_seen、last_visitを序数を持つ次のフィールドにマッピングする。Export-Csvは、現時点では行ごとに可変数のフィードを扱うことができないので、残りのフィールドにプレースホルダとして1つの空白の値を入れます。何か問題が発生した場合は、コンソールにエラーメッセージを出力した後、空の行を持つためにcatchブランチで同じことを行う。(APIは1回の呼び出しで最大300レコードを返すことに注意。指定されたIPがそれ以上ある場合、上記のように呼び出すと300の任意のレコードを提供するので、ここでは300の結果トリプレットを持つ行を生成する。すべてのレコードを取得する方法については、APIのドキュメントを参照のこと)。最後に、結果のIPDataオブジェクトが出力csvファイルに追加される。
スクリプトを使用するには、環境変数$APIKeyに実際のAPIキーを設定する必要があります。
$APIKey="YOUR_API_KEY"
(上記の文字列YOUR_API_KEYは、https://reverse-ip.whoisxmlapi.com/api/signup、で登録後に利用可能になる、またはアカウントページで利用可能になるAPIキーで置き換えてください。)次に、冒頭のコメントにあるようにスクリプトを実行します。先に用意したファイルips.csvに対してスクリプトを使用し、
PS C:\Users\User\WorkingDirectory> .\ExtendIPCsvWithReversePDNS.ps1 '.\ips.csv' '.\ips_result.csv'
結果は、お使いのスプレッドシートにインポートしたり、テキストとして表示したりできるips_result.csvというファイルになります。このファイルには、ヘッダー行と以下のようなIPアドレスごとの行が含まれます:
"91.232.140.99","91.232.140.99.ip.rudna-net.pl","1/4/2019 8:32:10 PM","7/16/2021 8:09:19 AM"," "," ","
それらの行は非常に長いため、ここでは省略しました。
4. 結果と結論
このデータファイルには悪意のあるIPが含まれており、かなり大きいため、ここでは公開しない。代わりに調査結果を要約する。結果を詳細に見ると、これらのIPの多くがパッシブDNSデータベースに存在しないことがわかります。DNSを直接検索してみると、これらのIPのほとんどは確かにDNSの逆引きレコードを持っていないことが確認された。逆レコードを持つIPでさえ、通常はケーブルまたはモバイルネットワークプロバイダが動的IPに与えた自動生成名に解決する。
このことから、IPアドレスの逆引きパッシブDNS分析により、ボットの活動はプロバイダーの加入者のマシンに基づいていると結論づけることができます。
パッシブDNSデータには日付時間が含まれており、最初のSTIX 2.0ファイルにも日付が含まれているため、日付を関連付けることで、本当に影響を受けたドメイン名を見つけることができる。この結果に基づいて、影響を受けたプロバイダに警告を送ることができ、プロバイダはログを分析して、このボットネットの一部となったクライアントに通知することができます。
まとめとして、Reverse IP/DNS APIを使用してIPのリストを補足情報で拡張する方法を技術的に詳しく説明した。我々のデモは実際のデータを使用し、直接役に立つ結果をもたらした。上記の結果を自分で再現したり、同様の分析を行うためのAPIキーについては、https://www.whoisxmlapi.com/。また、WhoisXML APIの他の強力なサイバーセキュリティツールにも注目する価値があります。