こんとろーるしーこんとろーるぶい

週末にカチャカチャッターン!したことを貼り付けていくブログ

HoneyTrapで流行りの脆弱性に対する攻撃を観察する

OSやミドルウェア脆弱性が公開された際に、その脆弱性に対する攻撃やスキャンが発生しているか、自分のハニーポットで確認してみたいケースがあります。

今回は、現在T-Potを運用していて、そういった思いを持った人向けの記事です。

1. 背景、課題

T-Potは、複数のハニーポットを集めたハニーポットです。各ハニーポットに割り当てられているポート(80番ポートや22番ポート等)に対する攻撃であれば、ダッシュボードや検索により、攻撃の着弾を確認できます。

しかし、ミドルウェア特有のポートに対する攻撃の場合、そのポートに割り当てているハニーポットがありません。 T-Potでは、HoneyTrapというハニーポットが、未割当ポートが受信したデータを拾ってくれるのですが、ペイロードが16進数文字列に変換されているため、そのまま検索や確認ができません。

以下の通りattack_connection.payload.data_hexが16進数文字列の値になっています。

f:id:graneed:20180725225943p:plain

今回は、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を使います。

gchq.github.io

左のOperationからTo HexをドラッグしてRecipeにドロップします。
DelimiterはNoneを選択します。その後、Inputにt3://を入力します。

f:id:graneed:20180725230252p:plain

変換後の文字列である74333a2f2fが得られました。

次に、T-PotのKibanaを開き、Discover画面を開きます。
標準のフィルター機能ではLike検索ができないため、カスタムクエリを作成します。
Add a filterを選択、Edit Query DSLを選択し、以下を入力します。

{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "attack_connection.payload.data_hex": "*74333a2f2f*"
          }
        }
      ]
    }
  }
}

以下の画面になります。 f:id:graneed:20180725230324p:plain

Saveボタンを押下すると、検索結果が表示されました。
これらレコードは、ペイロードt3://の文字列を含んでいるはずです。

f:id:graneed:20180725230344p:plain

2.2. HoneyTrapへのペイロードを表示

2.1.の検索結果のうち1件をサンプルに、attack_connection.payload.data_hexの値を16進数文字列から元に戻します。
74332031322e322e310a41533a3235350a484c3a31390a4d533a31303030303030300a50553a74333a2f2f75732d6c2d627265656e733a373030310a0aをサンプルにします。

2.1と同じくCyberChefを使用します。

左のOperationからFrom Hexをドラッグして、Recipeにドロップします。
その後、Inputに上記の文字列を入力します。

f:id:graneed:20180725230846p:plain

以下の変換結果が得られました。

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ステージで変換します。

graneed.hatenablog.com

以下の通り、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で、稼働確認した際のリクエストを見てみます。

f:id:graneed:20180726220458p:plain

生のペイロードを確認できました!

3.5. 検索確認

新規項目であるattack_connection.payload.data項目はインデックスが張られていないため、まずはインデックスを張ります。Management -> Index Patterns -> 右上のRefresh field listボタンを押下するだけです。

f:id:graneed:20180726220551p:plain

その後、2.1の手順と同様に、Discover画面を開き、Add a filterを選択、Edit Query DSLを選択し、以下を入力します。

{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "attack_connection.payload.data": "*gefu*"
          }
        }
      ]
    }
  }
}

f:id:graneed:20180726221019p:plain

目的の文字列で検索できました!

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のユーザがいた。

twitter.com

注目するのは以下2ツイートと、プロフィール欄のメールアドレスshark09@mail.ru

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_uPmd5がフラグであることに気付く。

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」ボタンを押下します。 f:id:graneed:20180718015058p:plain

ログインを求められるので、アカウント未登録の場合は「register here」から登録します。
f:id:graneed:20180718015115p:plain

登録後はアカウント情報を入力して、「Next」ボタンで一直線です。

2. APIキー発行

MaltegoからAPIを利用する際に利用するAPIキーを入手します。

2.1. VirusTotalAPIキー発行

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のセットアップ

github.com

上記のgithubリポジトリ

の、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. VirusTotalAPI使用(ハッシュ値)

VirusTotalAPIを使用して、ハッシュ値からファイル情報を取得します。

まずは検体情報を入力するため、左ペインのEntity PaletteのHashを中央のGraphへドラッグ&ドロップし、ハッシュ値を入力します。 f:id:graneed:20180718005717p:plain

Hashを右クリックして[VTPub]file_reportsを選択して少し待つと、下図になりました。
f:id:graneed:20180718010426p:plain う~ん、マリシャス

さて、同じハッシュ値VirusTotalの画面で検索するとどうなるのでしょうか。 f:id:graneed:20180718010723p:plain ベンダー検知数は27/59と一致していますね。
ただ、Maltegoに表示されているマルウェアのファミリーは7種のみです。

3でセットアップしたTransformのVTPub.pyを確認すると、どうやら下記8ベンダーの結果をMaltegoに反映しているようです。

4.2. HybridAnalysisのAPI使用(ハッシュ値)

次に、HybridAnalysisのAPIを使用して、ハッシュ値からファイル情報を取得します。
なお、VirusTotalとの違いを確認するため、新規グラフで作業しています。

Hashを右クリックして[HA]hash_to_allを選択して少し待つと、下図になりました。 f:id:graneed:20180718012720p:plain う~ん、マリシャス(2回目)

apt、ursnif、goziなどのワードが出現していますが、HybridAnalysisの何の情報でしょうか。
同じくハッシュ値をHybridAnalysisの画面で検索してみます。赤枠で囲った情報が、Maltegoにプロットされていた情報です。

f:id:graneed:20180718013023p:plain f:id:graneed:20180718013031p:plain f:id:graneed:20180718013046p:plain

主要な情報は拾ってくれているようです。

4.3. VirusTotalAPI使用(IPアドレス)

4.2で出現したIPアドレスに対して、VirusTotalAPIを使用して情報を取得してみます。

IPアドレスを右クリックして[VTPub]ip_reportsを選択して少し待つと、下図になりました。 f:id:graneed:20180718014017p:plain

拡大します。

f:id:graneed:20180718014033p:plain

余罪ゴロゴロって感じですね。
ここで新たに出現したドメインについても悪性と判断してもよいかもしれません。

5. まとめ

これまでVirusTotalやHybridAnalysisを各々単独で使用して、IOC情報を収集したり関係性を分析していましたが、Maltego+API連携を使用すると、素早く情報収集ができ、また綺麗にビジュアライズされるため、スピードアップだけでなく分析品質の向上にも繋がりそうです。

紹介頂いた政本氏に感謝。