
無害化された侵害指標(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アドレスでは、以下の難読化手法に対応しています:
メールアドレスでは、以下の難読化手法に対応しています:
URLでは、以下の難読化手法に対応しています:
注意:上記の表は網羅的ではなく、他のURL/難読化パターンも正しく抽出される可能性があります。不足や誤動作に気づいた場合は、GitHub Issues でお知らせください。
base64正規表現は、@deadpixi の base64正規表現ツール を使用して生成されました。
CLIを使用して、独自のカスタム正規表現でIOCを抽出したい場合は、各行に1つの正規表現文字列を記述したプレーンテキストファイルを作成し、--custom-regex フラグで指定します。各正規表現文字列に正確に1つのキャプチャグループが含まれていることを確認してください。
例:
http://(example\.com)/
(?:https|ftp)://(example\.com)/
このカスタム正規表現ファイルは、一致するURLからドメイン example.com を抽出します。(?: ) 非キャプチャグループは一致に含まれません。
一致全体を抽出したい場合は、正規表現文字列全体を括弧で囲みます。次のように:
(https?://.*?.com)
正規表現が無効な場合は、次のようなエラーメッセージが表示されます:
Error in custom regex: missing ) at position 5
正規表現にキャプチャグループが含まれていない場合は、次のようなエラーメッセージが表示されます:
Error in custom regex: no such group
カスタム正規表現を使用する場合は、常に単一のキャプチャグループを使用してください。簡単な例:
[
r'(my regex)', # パターンが一致すると 'my regex' を返す
r'my (re)gex', # パターンが一致すると 're' を返す
]
複数のキャプチャグループを使用すると予期しない結果になる可能性があります。次の例を確認してください:
[
r'my regex', # 何も返さない
r'(my) (re)gex', # パターンが一致すると 'my' を返す
]
なぜでしょうか?結果は常に、各正規表現の最初のグループ一致のみを返すためです。
より複雑な正規表現クエリの場合は、キャプチャグループと非キャプチャグループを次のように組み合わせることができます:
[
r'(?:my|your) (re)gex', # パターンが一致すると 're' を返す
]
これで、非キャプチャグループの (?: ) 構文とキャプチャグループの ( ) 構文を比較できます。
iocextractがユースケースに適合しない場合は、同様のプロジェクトがいくつか存在します。GitHubの defang タグと indicators-of-compromise タグ、および以下をチェックしてください:
IOCの抽出、エンリッチメント、エクスポートなどを自動化したい場合は、ThreatIngestor をチェックしてください。
YARAルールを扱っている場合は、plyara に興味があるかもしれません。
抽出器で処理できない難読化手法がある場合や、バグを見つけた場合は、Pull RequestやIssueをいつでも歓迎します。ライブラリはGPL-2.0 ライセンス の下でリリースされています。
使用していますか? ここにあなたのサイトが表示されるのを見たいですか? お知らせください!
| 手法 | 難読化後 | 復元後 |
|---|
. -> [.] | 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 |
| 手法 | 難読化後 | 復元後 |
|---|
. -> [.] | me@example[.]com | [email protected] |
. -> (.) | me@example(.)com | [email protected] |
. -> {.} | me@example{.}com | [email protected] |
. -> _dot_ | me@example dot com | [email protected] |
@ -> [@] | me[@]example.com | [email protected] |
@ -> (@) | me(@)example.com | [email protected] |
@ -> {@} | me{@}example.com | [email protected] |
@ -> _at_ | me at example.com | [email protected] |
| 部分 | me@} example[.com | [email protected] |
| スペース追加 | me@example [.] com | [email protected] |
| 任意の組み合わせ | me @example [.)com | [email protected] |
| 手法 | 難読化後 | 復元後 |
|---|
. -> [.] | example[.]com/path | http://example.com/path |
. -> (.) | example(.)com/path | http://example.com/path |
. -> \. | example\.com/path | http://example.com/path |
| 部分 | http://example[.com/path | http://example.com/path |
/ -> [/] | http://example.com[/]path | http://example.com/path |
| Cisco ESA | http:// example .com /path | http://example.com/path |
:// -> __ | http__example.com/path | http://example.com/path |
:// -> :\\ | http:\\example.com/path | http://example.com/path |
: -> [:] | http[:]//example.com/path | http://example.com/path |
hxxp | hxxp://example.com/path | http://example.com/path |
| 任意の組み合わせ | hxxp__ example( .com[/]path | http://example.com/path |
| 16進数エンコード | 687474703a2f2f6578616d706c652e636f6d2f70617468 | http://example.com/path |
| URLエンコード | http%3A%2F%2fexample%2Ecom%2Fpath | http://example.com/path |
| Base64エンコード | aHR0cDovL2V4YW1wbGUuY29tL3BhdGgK | http://example.com/path |