ITセキュリティのためのPowerShellによるパッシブDNS一括逆引きのデモ|Reverse IP/DNS API|WhoisXML API

PowerShellを使用したBulk Reverse DNS LookupによるITセキュリティ調査のデモ: Phorphiexボットネットの事例

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リストを拡張するスクリプト 

IPアドレスのリストをリバースパッシブDNSデータで拡張するという目的は、以下のコードを持つPowerShellコマンドレットを使用して達成することができます(例えば、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■WorkingDirectory> .■ExtendIPCsvWithReversePDNS.ps1 '.■ips.csv' '.■ips_result.csv'

の結果はips_result.csvファイルとなり、オフィスのスプレッドシートにインポートすることも、テキストとして表示することもできる。このファイルには、ヘッダー行と各IPの行が次のように含まれている: 

"91.232.140.99", "91.232.140.99.ip.rudna-net.pl", "2019/1/4 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の他の強力なサイバーセキュリティツールにも注目する価値があります。