
無害化された侵害指標(IOC)抽出ツール。
侵害指標(IOC)抽出ツール。よく取り込まれるアーティファクトに対応しています。
iocextract パッケージは、テキストコーパスからURL、IPアドレス、MD5/SHAハッシュ、メールアドレス、YARAルールを抽出するためのライブラリおよびコマンドラインインターフェース(CLI)です。エンコードされた「難読化(defanged)」されたIOCを抽出し、必要に応じてデコードまたは復元(refang)できます。
マルウェアアナリストやエンドポイントソフトウェアが、誤って悪意のあるコンテンツにさらされるのを防ぐために、URLやIPアドレスなどのIOCを「難読化(defang)」するのは一般的な手法です。これらのIOCを抽出・集約できることはアナリストにとって多くの場合価値があります。残念ながら、既存の「IOC抽出」ツールは標準の正規表現では捕捉できないため、それらを見逃してしまうことがよくあります。
例えば、ピリオドを括弧で囲む単純な難読化手法:
127[.]0[.]0[.]1
単純なIPアドレス正規表現を使用する既存のツールは、このIOCを完全に無視します。
特別に作成された正規表現とカスタム後処理を組み合わせることで、「難読化(defanged)」されたIOCの検出と難読化解除の両方が可能になります。これにより、手動でIOCを検索して機械可読形式に変換する手間が省け、アナリストの時間と労力を節約できます。
多くのTwitterユーザーは、難読化されたURLを含むC2やその他の貴重なIOC情報を投稿しています。例えば、@InQuestのこのツイート:
Recommended reading and great work from @unit42_intel:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/ ...
InQuest customers have had detection for threats delivered from hotfixmsupload[.]com
since 6/3/2017 and cdnverify[.]net since 2/1/18.
これを抽出器にかけると、簡単にURLを取り出せます:
https://researchcenter.paloaltonetworks.com/2018/02/unit42-sofacy-attacks-multiple-government-entities/
hotfixmsupload[.]com
cdnverify[.]net
抽出時に refang=True を指定すると難読化が除去されますが、これらは実際のIOCなので、ドキュメントでは難読化したままにしておきます。
regex 依存関係をインストールするために、Python開発用ヘッダーが必要になる場合があります。Ubuntu/Debian系システムでは、次を試してください:
sudo apt-get install python-dev
その後、pipから iocextract をインストールします:
pip install iocextract
Windowsでインストールに問題がある場合は、PyPIから適切なwheel をダウンロードして pip で直接 regex をインストールしてみてください:
pip install regex-2018.06.21-cp27-none-win_amd64.whl
難読化されたURLを抽出してみましょう:
import iocextract
content = \
"""
I really love example[.]com!
All the bots are on hxxp://example.com/bad/url these days.
C2: tcp://example[.]com:8989/bad
"""
for url in iocextract.extract_urls(content):
print(url)
# 出力
# hxxp://example.com/bad/url
# tcp://example[.]com:8989/bad
# example[.]com
# tcp://example[.]com:8989/bad
注意:一部のURLは複数の正規表現にマッチするため、2回表示されることがあります。
必要に応じて、IOCから一般的な難読化手法を除去(refang)することもできます:
import iocextract
for url in iocextract.extract_urls(content, refang=True):
print(url)
# 出力
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
抽出時にIOCをまったく難読化したくない場合は、これを無効にすることもできます:
import iocextract
content = \
"""
http://example.com/bad/url
http://example.com:8989/bad
http://example.com
http://example.com:8989/bad
"""
for url in iocextract.extract_urls(content, defang=False):
print(url)
# 出力
# http://example.com/bad/url
# http://example.com:8989/bad
# http://example.com
# http://example.com:8989/bad
このライブラリの extract_* 関数はすべて、リストではなくイテレータを返します。この動作の利点は、iocextract が非常に大きな入力でも非常に低いオーバーヘッドで処理できることです。ただし、何らかの理由でIOCを複数回ループする必要がある場合は、結果をリストとして保存する必要があります:
import iocextract
content = \
"""
I really love example[.]com!
All the bots are on hxxp://example.com/bad/url these days.
C2: tcp://example[.]com:8989/bad
"""
print(list(iocextract.extract_urls(content)))
# ['hxxp://example.com/bad/url', 'tcp://example[.]com:8989/bad', 'example[.]com', 'tcp://example[.]com:8989/bad']
コマンドラインツールも含まれています:
$ iocextract -h
usage: iocextract [-h] [--input INPUT] [--output OUTPUT] [--extract-emails]
[--extract-ips] [--extract-ipv4s] [--extract-ipv6s]
[--extract-urls] [--extract-yara-rules] [--extract-hashes]
[--custom-regex REGEX_FILE] [--refang] [--strip-urls]
[--wide]
Advanced Indicator of Compromise (IOC) extractor. If no arguments are
specified, the default behavior is to extract all IOCs.
optional arguments:
-h, --help show this help message and exit
--input INPUT default: stdin
--output OUTPUT default: stdout
--extract-emails
--extract-ips
--extract-ipv4s
--extract-ipv6s
--extract-urls
--extract-yara-rules
--extract-hashes
--custom-regex REGEX_FILE file with custom regex strings, one per line, with one capture group each
--refang default: no
--strip-urls remove possible garbage from the end of urls. default: no
--wide preprocess input to allow wide-encoded character matches. default: no
注意:復元(refang)が可能なのはURL、メール、IPv4アドレスのみです。
あなたは...
Q. ツイートやブログ記事などのプレーンテキストから、難読化されている可能性のあるIOCを抽出したい?
A. はい! これこそがiocextractが設計された目的であり、最も性能を発揮する場面です。さらに一歩進んで抽出と保存を自動化したいですか? ThreatIngestor をチェックしてください。
Q. 16進数やBase64でエンコードされたURLを抽出したい?
A. はい、ただしCLIでは最良の結果が得られない可能性があります。Pythonスクリプトを作成して、
iocextract.extract_encoded_urlsを直接呼び出してみてください。
注:URLの末尾に余分なゴミが付く可能性が高いです。
Q. HTML/XML/RTFから難読化されていないIOCを抽出したい?
A. 可能性はありますが、
--strip-urlsCLIフラグ(ライブラリではstrip=Trueパラメータ)を使用することを検討すべきです。それでも出力に余分なゴミが混ざる可能性があります。HTMLから抽出する場合は、Beautiful Soup のようなものを使用してテキストコンテンツをまず分離し、それをiocextractに渡すことを検討してください。この例 のように。
Q. 実行可能ファイルのようなバイナリデータや非常に大きな入力から、難読化されていないIOCを抽出したい?
A. ライブラリとして使用する場合、非常に簡素なバージョンが利用可能ですが、
defang=Falseパラメータが必要であり、一部のIOCを見逃す可能性があります。iocextractの正規表現は、難読化されたIOCを捕捉するために柔軟性を持たせて設計されています。必要な情報を収集できない場合は、代わりに Cacador のようなものを使用することを検討してください。
このライブラリは現在、以下のIOCをサポートしています:
[.] アンカーあり(プロトコル指定子なしでも可)@ または at をアンカーにIPv4アドレスでは、以下の難読化手法に対応しています:
| 手法 | 難読化後 | 復元後 |
|---|---|---|
. -> [.] | 1[.]1[.]1[.]1 | 1.1.1.1 |
. -> (.) | 1(.)1(.)1(.)1 | 1.1.1.1 |
. -> \. | 1\.1\.1\.1 | 1.1.1.1 |
| 部分 | 1[.1[.1.]1 | 1.1.1.1 |
| 任意の組み合わせ | 1.)1[.1.)1 | 1.1.1.1 |
メールアドレスでは、以下の難読化手法に対応しています: