HoneyTrapで流行りの脆弱性に対する攻撃を観察する
OSやミドルウェアの脆弱性が公開された際に、その脆弱性に対する攻撃やスキャンが発生しているか、自分のハニーポットで確認してみたいケースがあります。
今回は、現在T-Potを運用していて、そういった思いを持った人向けの記事です。
1. 背景、課題
T-Potは、複数のハニーポットを集めたハニーポットです。各ハニーポットに割り当てられているポート(80番ポートや22番ポート等)に対する攻撃であれば、ダッシュボードや検索により、攻撃の着弾を確認できます。
しかし、ミドルウェア特有のポートに対する攻撃の場合、そのポートに割り当てているハニーポットがありません。
T-Potでは、HoneyTrap
というハニーポットが、未割当ポートが受信したデータを拾ってくれるのですが、ペイロードが16進数文字列に変換されているため、そのまま検索や確認ができません。
以下の通りattack_connection.payload.data_hex
が16進数文字列の値になっています。
今回は、2つの方法でHoneyTrap
に着弾した攻撃を検索および確認します。
2. 方法1「手動で変換」
検索および表示の際に、都度、16進数文字列との変換をするという方法です。
この方法は、特にT-Potの設定変更は必要ありません。
2.1. HoneyTrapへのペイロードを検索
2018/7/17にクリティカルパッチアップデートが公開されたWebLogicServer
の脆弱性であるCVE-2018-2893
を例に検索してみます。
参考:2018年 7月 Oracle 製品のクリティカルパッチアップデートに関する注意喚起
CVE-2018-2893
はT3プロトコルを利用した機能の脆弱性であり、T3プロトコルの通信のURL形式はt3://ip address:port
であるため、t3://
を検索ワードにして検索したいと思います。
まず、t3://
を16進数文字列に変換します。
やり方は色々ありますが、今回はCyberChef
を使います。
左のOperationからTo Hex
をドラッグしてRecipeにドロップします。
DelimiterはNone
を選択します。その後、Inputにt3://
を入力します。
変換後の文字列である74333a2f2f
が得られました。
次に、T-PotのKibanaを開き、Discover画面を開きます。
標準のフィルター機能ではLike検索ができないため、カスタムクエリを作成します。
Add a filter
を選択、Edit Query DSL
を選択し、以下を入力します。
{ "query": { "bool": { "must": [ { "wildcard": { "attack_connection.payload.data_hex": "*74333a2f2f*" } } ] } } }
以下の画面になります。
Save
ボタンを押下すると、検索結果が表示されました。
これらレコードは、ペイロードにt3://
の文字列を含んでいるはずです。
2.2. HoneyTrapへのペイロードを表示
2.1.の検索結果のうち1件をサンプルに、attack_connection.payload.data_hex
の値を16進数文字列から元に戻します。
74332031322e322e310a41533a3235350a484c3a31390a4d533a31303030303030300a50553a74333a2f2f75732d6c2d627265656e733a373030310a0a
をサンプルにします。
2.1と同じくCyberChef
を使用します。
左のOperationからFrom Hex
をドラッグして、Recipeにドロップします。
その後、Inputに上記の文字列を入力します。
以下の変換結果が得られました。
t3 12.2.1 AS:255 HL:19 MS:10000000 PU:t3://us-l-breens:7001
T3プロトコルの偵察行為のようです。
3. 方法2「自動で変換」
2の手順を毎回実施するのは少々つらいです。
よって、16進数文字列ではなく生のペイロードに対して検索および表示をできるように改造します。
3.1. Logstashの定義変更
以前、以下の記事で実施したように、LogstashのFiltersステージで変換します。
以下の通り、logstash.conf
に、rubyによる変換定義を追加します。
# Honeytrap if [type] == "Honeytrap" { date { match => [ "timestamp", "ISO8601" ] } mutate { rename => { "[attack_connection][local_port]" => "dest_port" "[attack_connection][local_ip]" => "dest_ip" "[attack_connection][remote_port]" => "src_port" "[attack_connection][remote_ip]" => "src_ip" } } ruby { code => "event.set('attack_connection.payload.data', [event.get('[attack_connection][payload][data_hex]')].pack('H*'))" } }
具体的な手順は以下の通りです。
# ディレクトリ移動 [root@massshoemaker:~]# cd /opt/tpot/docker/elk/logstash/ # 比較用にバックアップ [root@massshoemaker:/opt/tpot/docker/elk/logstash]# cp -p dist/logstash.conf dist/logstash.conf.bak # 定義変更。具体的な変更箇所はdiff結果を参照 [root@massshoemaker:/opt/tpot/docker/elk/logstash]# vi dist/logstash.conf [root@massshoemaker:/opt/tpot/docker/elk/logstash]# diff -u dist/logstash.conf.bak dist/logstash.conf --- dist/logstash.conf.bak 2018-06-30 23:49:05.780835483 +0900 +++ dist/logstash.conf 2018-07-26 21:40:09.998708396 +0900 @@ -226,6 +226,9 @@ "[attack_connection][remote_ip]" => "src_ip" } } + ruby { + code => "event.set('attack_connection.payload.data', [event.get('[attack_connection][payload][data_hex]')].pack('H*'))" + } } # Mailoney
3.2. Dockerイメージ更新、再起動
定義変更を反映させるため、LogstashのDockerイメージを更新します。
# 停止 [root@massshoemaker:/opt/tpot/docker/elk/logstash]# systemctl stop tpot # Dockerイメージ更新 [root@massshoemaker:/opt/tpot/docker/elk/logstash]# docker build -t dtagdevsec/logstash:1710 . Sending build context to Docker daemon 43.52 kB Step 1/6 : FROM alpine ---> 3fd9065eaf02 Step 2/6 : MAINTAINER MO ---> Using cache ---> 213ca7b23dda Step 3/6 : ADD dist/ /root/dist/ ---> 1b4d52ba9495 Removing intermediate container ba89d3fbe28a (snip) Removing intermediate container 43fd92fb83e4 Successfully built 67798a694b3f # 起動 [root@massshoemaker:/opt/tpot/docker/elk/logstash]# systemctl start tpot
3.3. 稼働確認
ncコマンドで適当なデータを送信してみます。なお、localhost
を指定してもHoneyTrap
は受け取ってくれないため、グローバルIPアドレスを指定しました。
[root@massshoemaker:~]# echo -n hogefuga | nc <IPアドレス> 57001
3.4. 表示確認
Kibanaで、稼働確認した際のリクエストを見てみます。
生のペイロードを確認できました!
3.5. 検索確認
新規項目であるattack_connection.payload.data
項目はインデックスが張られていないため、まずはインデックスを張ります。Management
-> Index Patterns
-> 右上のRefresh field list
ボタンを押下するだけです。
その後、2.1の手順と同様に、Discover画面を開き、Add a filter
を選択、Edit Query DSL
を選択し、以下を入力します。
{ "query": { "bool": { "must": [ { "wildcard": { "attack_connection.payload.data": "*gefu*" } } ] } } }
目的の文字列で検索できました!
4. まとめ
ハニーポットを運用していて、定期的に観察する以外に、明確な検索条件(例えば、exploitコードの一部分)をもって全ポートへの攻撃の着弾を確認したい場合、今回紹介した方法は有効かと思います。
まずは「手動で変換」の方法で観察を実施してみて、何度も行う必要がある場合は「自動で変換」を試してみるのはいかがでしょうか。
CTFZone 2018 Quals - Stupid dispute
問題文
So, @inf073chk4, our dispute is still on! I've promised to hack all your hidden services and, believe me, I'll do it! Flag is: ctfzone{md5(flag)}
writeup
Stage1
Twitterに@inf073chk4
のユーザがいた。
注目するのは以下2ツイートと、プロフィール欄のメールアドレスshark09@mail.ru
。
fuck 7h15 53rv1c3 17'5 4m4z1n6 https://t.co/YkMh1FoAmk
— Инфотечка (@inf073chk4) 2018年7月19日
0n3 d4y 7h3r3 w1ll b3 4 b3773r 53rv1c3https://t.co/7ahPLH63QK
— Инфотечка (@inf073chk4) 2018年7月19日
http://dumpedlqezarfife.onion.lu/にアクセスし、
shark09@mail.ru
を入力するとパスワードが返ってきた。
shark09@mail.ru:fsdfdsfsd
次にhttp://93.170.105.93/を読むと、以下のことが読みとれる。
- SFTPサーバを立てていること
- torにサービスを立てようとしていること
- torのサービスのアドレスは
dumpitl6ghazgb2n.onion
であること
メールアドレスの@より前の部分と、先ほどのパスワードfsdfdsfsd
を使用し、
SFTPで接続してみるとログインできた。
root@kali:~# sftp shark09@93.170.105.93 shark09@93.170.105.93's password: Connected to shark09@93.170.105.93. sftp>
しかし、権限がなくls
コマンドを実行しても何も見れない。
sshで接続してみる。
root@kali:~# ssh shark09@93.170.105.93 shark09@93.170.105.93's password: Could not chdir to home directory /sftp/s00zaran: Permission denied This service allows sftp connections only. Connection to 93.170.105.93 closed.
s00zaran
のユーザ名を入手した。
Stage2
Tor Browserでdumpitl6ghazgb2n.onion
に接続しても見れない。
しかし、接続先は存在しているようなので、別の接続方法を試してみる。
torコマンドでtorリレーを立てる。
root@kali:Stupid dispute# tor Jul 22 00:01:26.945 [notice] Tor 0.3.3.7 (git-6e774557c91d68ed) running on Linux with Libevent 2.1.8-stable, OpenSSL 1.1.0h, Zlib 1.2.11, Liblzma 5.2.2, and Libzstd 1.3.4. Jul 22 00:01:26.945 [notice] Tor can't help you if you use it wrong! Learn how to be safe at https://www.torproject.org/download/download#warning Jul 22 00:01:26.945 [notice] Read configuration file "/etc/tor/torrc". (snip) Jul 22 00:01:38.000 [notice] Bootstrapped 90%: Establishing a Tor circuit Jul 22 00:01:40.000 [notice] Tor has successfully opened a circuit. Looks like client functionality is working. Jul 22 00:01:40.000 [notice] Bootstrapped 100%: Done
torネットワークでsftp接続してみると反応があった。
しかし、shark09
ユーザではログインできない。
root@kali:~# torify sftp shark09@dumpitl6ghazgb2n.onion shark09@dumpitl6ghazgb2n.onion's password: Permission denied, please try again.
入手したユーザ名s00zaran
とパスワードfsdfdsfsd
を試してみるとログインできた。
root@kali:~# torify sftp s00zaran@dumpitl6ghazgb2n.onion s00zaran@dumpitl6ghazgb2n.onion's password: Connected to s00zaran@dumpitl6ghazgb2n.onion. sftp>
また、sshログインするとメッセージが表示されて落とされた。
root@kali:~# torify ssh s00zaran@dumpitl6ghazgb2n.onion s00zaran@dumpitl6ghazgb2n.onion's password: Okey, okey, you dit it! You're in the right place... Keep your data secure and N3v3R_G1V3_uP ! Good luck ;) Connection to dumpitl6ghazgb2n.onion closed.
sftpで接続して巡回するが目ぼしいファイルがなく悩んでいたら、
チームメンバーがN3v3R_G1V3_uP
のmd5がフラグであることに気付く。
root@kali:~# echo -n N3v3R_G1V3_uP | md5sum 23ce0e1d28059cae9c6cc1a3d10b611d -
ctfzone{23ce0e1d28059cae9c6cc1a3d10b611d}
がフラグ。
素直にフラグ表示してくれてもよかったのでは・・・。
ちょっと釈然としないが、終わり良ければすべて良しとする。
Maltego+API連携でばら撒きメールを分析
2018/7/12(木)のMacnica Networks DAY 2018にて、「フリーで使える脅威インテリジェンスの活用と実践-日本に着弾した攻撃事例を交えながら-」を聴講しました。
「もっとOSINTを効果的に使って手間かけずに分析しようず!」というテーマでの講演でしたが、そこで紹介のあったMaltego用のTransformがすごく便利そうだったので、実際に試してみました。
なお、このTransformは講演者である政本氏 本人が開発されておられるとのこと。
すごい(小並感
1. Maltegoのセットアップ
1.1. Maltegoのダウンロード
https://www.paterva.com/web7/downloads.php
上記リンクからインストーラーをダウンロードします。
1.2. Maltegoのインストール
インストーラーを実行したら「Next」「I Agree」「Install」ボタンで一直線です。
特に迷うところはありません。
1.3. Maltegoの初回実行、アカウント登録
初回起動すると、以下のダイアログが表示されます。
上から3番目のMaltego CE(Free)の「Run」ボタンを押下します。
ログインを求められるので、アカウント未登録の場合は「register here」から登録します。
登録後はアカウント情報を入力して、「Next」ボタンで一直線です。
2. APIキー発行
MaltegoからAPIを利用する際に利用するAPIキーを入手します。
2.1. VirusTotalのAPIキー発行
VirusTotal - ウイルス、マルウェア、URL の無料オンライン スキャナー
右上の「コミュニティに参加」からアカウント登録後、サインインします。
サインイン後、「右上のユーザー名」->「My API key」から確認できます。
2.2. HybridAnalysisのAPIキー発行
Free Automated Malware Analysis Service - powered by Falcon Sandbox
右上の「More->Register」からアカウント登録後、ログインします。
ログイン後、「右上のユーザー名」->「Profile」->「API key」から確認できます。
3. Transformのセットアップ
- VirusTotal-Private-API-Maltego
- VirusTotal-Public-API-Maltego
- HybridAnalysis-Public-API-Maltego
の、pyファイルとmtzファイルをダウンロードし、READMEに従ってセットアップしました。
このセットアップでAPIキーを使用します。
なお、念のためPythonは3.6.Xではなく2.7.Xを使いました。また、Pythonインストール後にC:\Python27\Scripts\pip.exe install requests
のコマンド実行による、requestsパッケージのインストールが必要です。(Windows環境の場合のパスです。)
4. Maltego+API連携を試してみる
いよいよ試してみますが、サンプルの検体情報が無いと試すに試せません。
そこで、JC3の注意喚起情報(注意情報|一般財団法人日本サイバー犯罪対策センター)から、添付ファイル付きのばら撒きメールの情報を確認し、その件名や本文情報からWeb検索し、リサーチャーの皆様が公開しているハッシュ値を確認しました。
サンプルのハッシュ値は4165270459a38ca8da6ab6ff7c7b1ecf29c13f6b602788738b8da2f0119ae56d
を使います。
4.1. VirusTotalのAPI使用(ハッシュ値)
VirusTotalのAPIを使用して、ハッシュ値からファイル情報を取得します。
まずは検体情報を入力するため、左ペインのEntity PaletteのHash
を中央のGraphへドラッグ&ドロップし、ハッシュ値を入力します。
Hash
を右クリックして[VTPub]file_reports
を選択して少し待つと、下図になりました。
う~ん、マリシャス
さて、同じハッシュ値をVirusTotalの画面で検索するとどうなるのでしょうか。
ベンダー検知数は27/59
と一致していますね。
ただ、Maltegoに表示されているマルウェアのファミリーは7種のみです。
3でセットアップしたTransformのVTPub.py
を確認すると、どうやら下記8ベンダーの結果をMaltegoに反映しているようです。
4.2. HybridAnalysisのAPI使用(ハッシュ値)
次に、HybridAnalysisのAPIを使用して、ハッシュ値からファイル情報を取得します。
なお、VirusTotalとの違いを確認するため、新規グラフで作業しています。
Hash
を右クリックして[HA]hash_to_all
を選択して少し待つと、下図になりました。
う~ん、マリシャス(2回目)
apt、ursnif、goziなどのワードが出現していますが、HybridAnalysisの何の情報でしょうか。
同じくハッシュ値をHybridAnalysisの画面で検索してみます。赤枠で囲った情報が、Maltegoにプロットされていた情報です。
主要な情報は拾ってくれているようです。
4.3. VirusTotalのAPI使用(IPアドレス)
4.2で出現したIPアドレスに対して、VirusTotalのAPIを使用して情報を取得してみます。
IPアドレス
を右クリックして[VTPub]ip_reports
を選択して少し待つと、下図になりました。
拡大します。
余罪ゴロゴロって感じですね。
ここで新たに出現したドメインについても悪性と判断してもよいかもしれません。
5. まとめ
これまでVirusTotalやHybridAnalysisを各々単独で使用して、IOC情報を収集したり関係性を分析していましたが、Maltego+API連携を使用すると、素早く情報収集ができ、また綺麗にビジュアライズされるため、スピードアップだけでなく分析品質の向上にも繋がりそうです。
紹介頂いた政本氏に感謝。