teppay’s log

技術ブログです。

SECCON 2017 Online CTF Writeup

はじめに

  • SECCON 2017 Online CTFにぼっち参戦しました。
  • 解けた問題は、
    • Vegenere3d
    • Run me!
    • putchar music
    • SHA-1 is dead
    • Log search
    • Thank you for playing!
      の6問で600点でした。
  • これまでずっと書いてみたかったWriteupを初めて書いてみます。お見苦しかったらごめんなさい。

Writeup

Vigenere3d

----- Vigenere3d.py
import sys
def _l(idx, s):
    return s[idx:] + s[:idx]
def main(p, k1, k2):
    s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"
    t = [[_l((i+j) % len(s), s) for j in range(len(s))] for i in range(len(s))]
    i1 = 0
    i2 = 0
    c = ""
    for a in p:
        c += t[s.find(a)][s.find(k1[i1])][s.find(k2[i2])]
        i1 = (i1 + 1) % len(k1)
        i2 = (i2 + 1) % len(k2)
    return c
print main(sys.argv[1], sys.argv[2], sys.argv[2][::-1])
-----
$ python Vigenere3d.py SECCON{**************************} **************
POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9

去年はふつーのVigenereが出ましたが(数少ない解けた問題だったので覚えてる)、今年はVigenere3dということで3DのVigenere cipherが出ました。Vigenereは簡単に言えば、1文字ずつシフトする数を変えたシーザー暗号ですが、3Dになってもそれは変わりません。なので、ズレ幅を計算してあげればkeyがわからなくても解けました。
去年は、keyのわからない部分の候補を減らしてその後はブルートフォースした気がしますが、今回はスマートに解けた気がします。

s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"
pref = 'SECCON{'
key = []
c =    'POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9'

for i in range(len(pref)):
    key.append(len(s) + s.find(c[i]) - s.find(pref[i]) % len(s))

key = key + key[::-1] 

i = 0
flag = ''
for a in c:
    flag += s[(len(s) + s.find(a) - key[i]) % len(s)]
    i = (i + 1) % len(key)

print(flag)
SECCON{Welc0me_to_SECCON_CTF_2017}

Run me!

Run me!
-----  RunMe.py
import sys
sys.setrecursionlimit(99999)
def f(n):
    return n if n < 2 else f(n-2) + f(n-1)
print "SECCON{" + str(f(11011))[:32] + "}"
-----

Run me と言われていますがそのままRunしたら明らかに時間がかかるので、とりあえずメモ化してみたら一瞬でした。

from functools import lru_cache
import sys

sys.setrecursionlimit(99999)

@lru_cache(maxsize=15000)
def f(n):
    return n if n < 2 else f(n-2) + f(n-1)
print("SECCON{" + str(f(11011))[:32] + "}")
SECCON{65076140832331717667772761541872}

qiita.com

putchar Music

putchar music
This one line of C program works on Linux Desktop. What is this movie's title? 
Please answer the flag as SECCON{MOVIES_TITLE}, replace all alphabets with capital letters, and spaces with underscores.

main(t,i,j){unsigned char p[]="###<f_YM\204g_YM\204g_Y_H #<f_YM\204g_YM\204g_Y_H #+-?[WKAMYJ/7 #+-?[WKgH #+-?[WKAMYJ/7hk\206\203tk\\YJAfkkk";for(i=0;t=1;i=(i+1)%(sizeof(p)-1)){double x=pow(1.05946309435931,p[i]/6+13);for(j=1+p[i]%6;t++%(8192/j);)putchar(t>>5|(int)(t*x));}}

これは実行しないで、タイミング的にあれかなと思って試しに入れてみたら通りました。ごめんなさい笑

SECCON{STAR_WARS}

SHA-1 is dead

この問題は今年のはじめにGoogleが発表したSHA-1脆弱性?、SHAtteredについての問題でした。 SHA-1が同じだけど、違うファイルを作れって話です。

SHA-1 is dead
http://sha1.pwn.seccon.jp/
Upload two files satisfy following conditions:

1. file1 != file2
2. SHA1(file1) == SHA1(file2)
3. SHA256(file1) <> SHA256(file2)
4. 2017KiB < sizeof(file1) < 2018KiB
5. 2017KiB < sizeof(file2) < 2018KiB
* 1KiB = 1024 bytes

Googleが発表した際のサイトですでにSHA-1が衝突したPDFがダウンロードできますが、それではファイルサイズの条件に合致しません。そこで最初は1から新しくSHA-1が衝突したファイルを作るのかと思って調べていたら以下のスライドに行き着きました。

www.slideshare.net

例の脆弱性は、SHA-1の性質上、衝突した2つのファイルそれぞれの後ろに同じものをくっつけても、SHA-1は衝突したままになるというものだったそうです。(くわしくはスライドを。。) なので、例の公開されたPDFの後ろに、ファイルサイズが 2017KiB < sizeof(file) < 2018KiBになるようにゴミをくっつけてやりました。

target_size = 2017 #kB

def main():
    with open('shattered-1.pdf', 'rb') as fin1:
        b1 = fin1.read()
        origin_size = int(len(b1)/1024)

    add = b'\xff' * ((target_size - origin_size) * 1024)
    b1 += add


    with open('shattered-2.pdf', 'rb') as fin2:
        b2 = fin2.read()

    b2 += add

    with open('new1.pdf', 'wb') as fout1:
        fout1.write(b1)

    with open('new2.pdf', 'wb') as fout2:
        fout2.write(b2)

if __name__ == '__main__':
    main()

あとはこれで出来たファイルを提出すれFLAGゲットできました。 ファイルをいくつも開いたり閉じたりする時、どうすればきれいにかけるんだろ。

Log search

これはなぜ解けたのかわかりませんでした。
Logのなかに見えたflagっぽいURLにアクセスしたらflagもらえました。

Thank you for playing!

Thank you for playing!
SECCON{We have done all the challenges. Enjoy last 12 hours. Thank you!}

これは入力するだけでした。

まとめ

  • 去年に引き続き、今年もぼっち参戦でした。
  • わいわいチームでやりたいなとも思いますが、まだ100点問題しか解けないのでちょうどいいかなと思っています。
  • 来年は200点以上の問題も解けたらいいなと思います。

(Dionaeaはやめて)T-Potをはじめてみた2

はじめに

  • 前回Ubuntu14.04をUbuntu16.04にアップグレードしたらいろいろ調べても見つからないエラーを吐かれてしまって諦めました。

teppay.hatenablog.com

  • たぶんアップグレードしたのが良くなかったんだろうと思うので、今回は新しくサーバを立てて、最初からUbuntu16.04でやってみようと思います。

  • 自分の記事ではありがちの、T-Potを始めるだけの新規性が大してない内容ですが、最後のブラウザからアクセスする部分で、他の記事の方法ではうまく行かなかったポイントがありますのでもし困っている方がいたら見てみてください。

やったこと

1. サーバを立てた

さくらのクラウド
OS : Ubuntu 16.04.3 LTS 64bit
メモリ : 1Core-4GB
ストレージ : SSD 100GB
$ sudo apt-get update
$ sudo apt-get upgrade
1.1 サーバの初期設定

初期設定はSSHのポートは変えずに、あとは以下のDionaeaのときにもお世話になった記事を参考にしました。

qiita.com

2. T-Potインストール

Ubuntu 16.04.* であれば、autoinstallを使うことができます。
使い方は、GithubのREADMEにあるとおり、install.shを実行するだけです。 github.com

2.1 T-Pot用のユーザを作成

作成したアカウントでSSHの公開鍵認証が使えるようにする。

# adduser tpo
# mkdir /home/tpo/.ssh
# cp /home/ubuntu/.ssh/authorized_keys /home/tpo/.ssh/
# chown tpo:tpo /home/tpo/.ssh/authorized_keys
2.2 インストール!

上にちょっと書いたとおり、autoinstallでサクッとインストールできるはずです。

$ git clone https://github.com/dtag-dev-sec/t-pot-autoinstall.git
$ cd t-pot-autoinstall
$ sudo su
# ./install.sh

最初にT-Potに使うユーザを聞かれます

##########################################################
# T-Pot 17.10 install script                             #
# for Ubuntu server 16.04.0x, x64                        #
##########################################################
Make sure the key-based SSH login for your normal user is working!

Which user do you usually work with?
This script is invoked by root, but what is your normal username?
Enter username:

なのでさっき作ったユーザ名(自分の場合ははtpo)を入力してEnterを押します。

次はインストールタイプの選択です。

##########################################################
#                                                        #
#     How do you want to proceed? Enter your choice.     #
#                                                        #
#     Required: 4GB RAM, 64GB disk                       #
#     Recommended: 8GB RAM, 128GB SSD                    #
#                                                        #
# 1 - T-Pot's STANDARD INSTALLATION                      #
#     Standard Honeypots, Suricata & ELK                 #
#                                                        #
# 2 - T-Pot's HONEYPOTS ONLY                             #
#     Honeypots only, w/o Suricata & ELK                 #
#                                                        #
# 3 - T-Pot's INDUSTRIAL EDITION                         #
#     Conpot, eMobility, Suricata & ELK                  #
#                                                        #
# 4 - T-Pot's FULL INSTALLATION                          #
#     Everything                                         #
#                                                        #
##########################################################

Your choice:

自分は通常のハニーポットとその可視化が出来るKibanaがついてるSTANDARDを選ぶので1を入力してEnterです。
ここまで終わると自動で色々インストールしてくれているようでざーーーーっと実行されている処理がターミナルに流れます。
途中で

### Removing NGINX default website. 
### Please enter a password for your user tpo for web access. 
Password: 
Repeat password:

たぶんNGINXのtpoのパスワードを聞かれるので、設定します。
あとは待つだけです。

### Thanks for your patience. Now rebooting. Remember to login on SSH port 64295 next time or visit the dashboard on port 64297! 

こんな表示が出たので、成功したはずです。
メッセージによると、 SSHのポートが64295に変更されているそうです

3. SSHアクセスしてみる

SSHのポートが64295に変更されているので、サーバのIPを<server_ip>とすると、

$ ssh tpo@<server_ip> -P 64295

これで行けるはずなんですが、

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:*******.
Please contact your system administrator.
Add correct host key in /Users/****/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/****/.ssh/known_hosts:15
RSA host key for <server_ip> has changed and you have requested strict checking.
Host key verification failed.

こんな感じのエラーが表示されます(見せられないところは****で隠してます)
どうやら接続先が.ssh/known_hostsの内容と変わってるのでMITM攻撃かもよ!と警告してくれているようです。
今回はT-PotのインストールでSSHの接続ポートなどが変更になったことが原因だと思いますので、問題ありません。そこでknown_hostsのT-Potのサーバの部分を削除すればいいそうです。
これは以下のコマンドで出来ます。

$ ssh-keygen -R <server_ip>

これで接続できるようになりました。

$ ssh -i ./.ssh/id_rsa -p 64295 ubuntu@<server_ip>

4. T-Potの起動確認

$ docker ps

これでハニーポットのプロセスがぞろぞろ出てきたら起動しています。

5. Kibana(可視化ソフト)などにアクセスしてみる。

ここで最大のハマリポイントがあります!!!!!
「T-Pot」とかで検索して出て来るサイトには、

ssh -i ec2-key.pem -p 64295 -N -L8080:127.0.0.1:64296 your-user@xx.xx.xx.xx

のようなコマンドでSSHトンネルを張ったうえで、http://localhost:8080にアクセスすると書いてあることがほとんどなのですが、最新版ではここが変わります。
最新版では、SSHトンネルを張るなどの操作はいらず、

https://<server_ip>:64297/

にブラウザからアクセスするだけです。httpsを使えるようになってSSHトンネルが必要なくなったようです。ありがたい。。。
ちなみにこれに気づくまでに5時間くらいかかりました。。。

よく読んだらインストール終了のメッセージに書いてあったなんて言えない。。。

f:id:teppay:20171123005423p:plain かっこいいです。(起動して数十分の画面)

まとめ

  • なんといってもかっこいい。
  • 自分でハニーポットのフロントエンド作るとかイキってたの恥ずかしい。
  • これからお世話になります。

(Dionaeaはやめて)T-Potをはじめてみた(はじまらなかった)

はじめに

  • 数ヶ月前?にDionaeaを立てて、そのログを可視化できるDionaeaFRというアプリケーションをいれました。
  • しかし、DionaeaFRの一部がうまく動かず使う気になれず、「Dionaeaのフロントエンドつくったる」とイキっていました。

  • しかし、当たり前ですが、ハニーポッターになって数ヶ月のやつが新しいもの(新しく作るに値するもの)を思いつくはずもなく、途中で詰まっていました。
  • そこで、今のところは「巨人の肩に立つ」ことにして、Dionaeaを含む複数のハニーポットとそのフロントエンドが一つになったT-Potを入れてみることにしました。
  • これは失敗談です。以下が成功したときの記事です。

teppay.hatenablog.com

やったこと

1. サーバの拡張?

いままではDionaea単体で動かしていたため、メモリを1GBしか積んでいませんでした(これで要件満たしていたのかは知りません)が、T-Potのスタンダード版は4GB必要らしいです。
また、Dionaeaの場合はUbuntu14. のほうがインストールが簡単だったのですが、T-Potの場合はautoinstallというありがたい自動インストールの恩恵を受けられるのがUbuntu 16.04らしいのでOSも変えてしまおうと思います。

OS : Ubuntu 14.04
メモリ : 1GB


V

OS : Ubuntu 16.04
メモリ : 4GB
1.1 メモリ増設

ハニーポットを立てているサーバはさくらのクラウドで借りているので、以下のサイトの通りに1GBから4GBに増設しました。

knowledge.sakura.ad.jp

ポチポチっと4回くらいクリックしたら1GBから4GBになっていました。クラウドって便利ですね。

1.2 OSアップグレード

これは以下のサイトを参考にしました。
ただ、一応アップグレードされるOSが16.04かどうか確かめるために、

$ sudo do-release-upgrade

の前に

$ sudo do-release-upgrade -c

さすがに1GBから4GBになったので若干サクサクになった気がします笑
数十分かかりましたが気長に待ちます。

$ lsb_release -d
Description:    Ubuntu 16.04.3 LTS

はいできました、

2. T−Potインストール

参考にしてばっかりですが、以下の記事を参考にしました。

qiita.com

2.1 T-Pot用のユーザ作成
# adduser tpo

このユーザ(tpo)に公開鍵認証でssh出来るようにするために

# cp /home/ubuntu/.ssh/authorized_keys /home/your-user/.ssh/
# cd /home/your-user/
# chown your-user:your-user .ssh/authorized_keys
2.2 インストール!

上でちょっと書いたとおり、Ubuntu16.04.*であれば、autoinstall様が使えるので、簡単にインストール出来ます。

$ git clone https://github.com/dtag-dev-sec/t-pot-autoinstall.git
$ cd t-pot-autoinstall/
# ./install.sh

はい。これで終りと思ったら。

### SSH port is not 22. Script will abort! 

というエラーを履きました。 SSHのポートが22番じゃないじゃないからやめる!だそうです。
しらんし、

22に戻せばいいんですかね。

# vi /etc/ssh/sshd_config

でひとまず22に戻して、SSH切断されて、接続ポート変えて接続しようと思ったら、接続できない!

Dionaeaはsshのログを取ることはできなかったので22番ポートを閉じていたのでした笑
さくらのクラウドのマイページ的なところからWeb経由のコンソールが使えるのを知っていてよかった...(知らなかったら今頃パニック)

# ufw allow 22

これでまた22番ポートでssh出来るようになりました。ここでもう一度。

$ cd t-pot-autoinstall/
# ./install.sh

今度は無事動きました。
T-Potで使用するユーザの選択と、インストールタイプを選択すると勝手に進んでいきます。

と思ったら、なぜかnpmがぶっこわれて、インストールが進まなくなりました。
理由は(調べても出てこなかったので)よくわかりませんが、OSをアップグレードしたのが行けなかったかなと思っています。しらんけど。
なので、どうせDionaeaでしか使っていなかったサーバなので、ログを退避したあと、初期化してOSを入れ直して再度挑戦しようと思います。
これが手軽にできるのがクラウドの良いところ?

まとめ

鬼のような時間の無駄でした。

DionaeaFRを導入してみた

はじめに

ちょっと前に、サーバを借りてDionaeaを動かし始めましたが、いかんせんログが多くてどこからみていけば良いのやらって感じです。
そこで、DionaeaFRという可視化ソフトを使ってみようと思います。DionaeaFRでググればこの同じような記事はたくさんあったんですが、(定かではありませんが、おそらく)Djangoのバージョンの違いかなにかで手順通りに設定してもエラーで詰まることがたくさんあったので記事にしました。

github.com

関連記事

teppay.hatenablog.com

teppay.hatenablog.com

やったこ

1. いいたいことはこれだけ。だと思ってた。。。

Djangoのバージョンは1.8!

takahoyo.hatenablog.com それ以外のバージョンでは動かなかった! それ以外はこちらのほよたかさんのブログの通りにやっていきました。

2. その後いろいろ触ってみたら。。。

トップページは見れるんです。 f:id:teppay:20171007232119p:plain

ただ、このサイドのメニューのConnectionsやDownloadsを選ぶと、 f:id:teppay:20171007232325p:plain

たこうなるわけです。
ValueError: data must be QuerySet-like (have count() and order_by()) or support list(data) -- ConnectionFilter has neitherのエラーでぐぐってみると同じエラーに苦しめられている人がいるんですよね。
いろいろ調べてみたんですけど、解決策には巡り会えませんでした(T_T)直せたら報告します。

OWASP Security Shepherdをはじめてみた

はじめに

最近OWASPのイベント?があったらしくて、その参加者のツイートで「OWASP Security Shepherd」という単語を知りました。
アプリケーションセキュリティの学習ツールらしいです。学習したいので始めてみました笑

OWASP Security Shepherdとは

OWASP Security Shepherdは公式サイトによると、

The OWASP Security Shepherd Project is a web and mobile application security training platform. Security Shepherd has been designed to foster and improve security awareness among a varied skill-set demographic. The aim of this project is to take AppSec novices or experienced engineers and sharpen their penetration testing skill set to security expert status.

出典:OWASP Security Shepherd

簡単に言えば、「OWASP Security Shepherd」はWeb・Mobile Appのセキュリティについて勉強するためのプラットフォームで、初心者からベテランまでのペンテスト能力を向上させることが目的です。
的な感じですかね。。。

とてもそそられます。

環境

やったこ

1. VirtualBoxVMをインポート

とりあえずVirtualboxはインストールしてください。 github.com ここからzipファイルをダウンロードして解凍して出てきたOwaspSecurityShepherdVm_V3.0.ovaをダブルクリックするとVirtualBoxが起動してインポートする旨のダイアログが表示されるので、「すべてのネットワークカードのMACアドレスを再初期化」に必ずチェックをしてからインポートしました。

2. ネットワークアダプタの設定を変更

ホストOSからアクセスするために、 設定 -> ネットワーク -> アダプタ2
にホストオンリーアダプタを設定してからVMを起動します。 f:id:teppay:20171006170252p:plain

3. VMにログイン

VMを起動してちょっと待つと、ログイン出来る状態になるので、 securityshepherd:owaspSecurityShepherd でログインします。
そこで、

ifconfig

を実行してVMIPアドレスを確認します。

4. ブラウザからアクセス

ブラウザからhttps://<VMのIPアドレス>/ にアクセスすると。。。 f:id:teppay:20171006162012p:plain

はい、こうなっちゃいますがアクセス先はlocalhostなので大丈夫でしょう。
詳細設定 を開いてアクセスしてみると、、、 f:id:teppay:20171006162130p:plain 起動できていました。

3. adminログイン

ログインフォームにadmin:passwordを入力してログインすると、パスワード変えろ!!!と言われるので変えましょう。

これでとりあえず準備完了です。

おわりに

最初のチャレンジから手詰まりしてますがこれから頑張って行こうと思います。

DionaeaをVirusTotalと連携させてみた

teppay.hatenablog.com

はじめに

DionaeaをVirusTotalと連携させることで、捕まえたマルウェアVirusTotalでスキャンしてくれるらしい。

やったこと

1. VirusTotalのアカウント登録

ここは言われたとおりやるだけなので割愛

2. API Keyを取得

アカウントを登録しただけでAPIKeyが割り当てられるようなので、それをコピペするだけです。

右上のアイコン -> Setting -> API Key

で表示できます。

3. Dionaeaの設定ファイルにAPI Keyをコピペ

/opt/dionaea/etc/dionaea/ihandlers-available/virustotal.yamlを以下のように書き換える。

- name: virustotal
  config:
    # grab it from your virustotal account at My account -> Inbox -> Public API
    apikey: "<自分のAPI Key>"
    file: "/opt/dionaea/var/dionaea/vtcache.sqlite"

そして、/opt/dionaea/etc/dionaea/ihandlers-enabled/にファイルのシンボリックリンクを設置する

$ ln -s ../ihandlers-available/virustotal.yaml virustotal.yaml

ソースを見た感じこれで再起動すれば起動してくれるはずです!

おわりに

正直手探りまくりなのでまだこれでいいのかよくわかりません。うまく行ってたらここで報告します。

(追記) うまくいってました。

はじめてのハニーポット(Dionaea)はじめました

f:id:teppay:20171004204926p:plain

はじめに

ハニポは以前からやってみたかったのですが、やらなきゃ卒業できない憎いタスクに追われていまして、いまになりました。
なににすればいいか分からなかったので、Dionaeaを選んだのは、IPAが推奨しているからです。
いままでハニーポットに手が出なかったのは、もちろんやらなきゃいけない事があって時間が割けなかったのが一番の理由なのですが、サーバをどうしようという問題がありまして、この度セキュキャンで見事にさくらのクラウドのクーポンをもらったので踏み切ることが出来ました。 この記事は新規性ゼロですので、新しい情報をほしい方はUターンでお願いします。 実際に始めてみると、検索してヒットするサイトの情報は古くなっていて?修正部分などが変わっている事がありましたので、それらの情報を手がかりに手探りでやってみました。そのへんで詰まっているかたは見てもらえるとありがたいです。

参考サイト

sonickun.hatenablog.com

Dionaeaとは

Dionaeaはハエトリグサという意味だそうです。
攻撃者(ハエ)をおびき寄せて自分の栄養にしちゃうハニーポット(食虫植物)ってことですよね。
いろんなプロトコルに対応しているハニーポットで、勉強不足なもんで、知らないプロトコルGitHubのProtocolsリストにありました。

github.com

環境

blackle0pard.net

  • OS : Ubuntu Server 14.04.2 LTS 64bit
    UbuntuはDionaeaのインストールにapt-getがつかえて楽らしいので..

やったこ

1. サーバ作成

前述したとおり、さくらのクラウドUbuntuのサーバを作成しました。 クーポンを入力しただけでは、色んな所でエラーがでますので、クレカ情報いれてからやりましょう。
サーバ作成の時点で自分の公開鍵を設定しておくと、最初のsshから公開鍵認証で入れて便利でした(当たり前か笑)
サーバ立てるの初めてなので、以下のQiitaを参考にして最小限の初期設定をしました。

qiita.com

ファイアウォールで許可するポートは、Dionaeaが対応しているプロトコルのポートなので、

$ sudo apt-get install ufw
$ sudo ufw allow 21
$ sudo ufw allow 80
$ sudo ufw allow 443
$ sudo ufw allow 445
$ sudo ufw allow 1433
$ sudo ufw allow 3306
$ sudo ufw allow 5060
$ sudo ufw allow 5061

からの自分が使うsshは2222ポートを使う設定にしたので

$ sudu ufw limit 2222

からのその他のポートは拒否します。

$ sudo ufw default deny

2. Dionaeaインストール

これはもうDionaeaのドキュメントどおりです

$ sudo apt-get update
$ sudo apt-get dist-upgrade
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:honeynet/nightly
$ sudo apt-get update
$ sudo aot-get install dionaea

これだけです。笑

3. Dionaea起動

以下のコマンドで起動できます。

$ sudo service dionaea start

ちなみに、起動前のnmap結果は

PORT      STATE    SERVICE
25/tcp    filtered smtp
80/tcp    open     http
110/tcp   open     pop3
143/tcp   open     imap
2222/tcp  open     EtherNetIP-1
3128/tcp  open     squid-http
8080/tcp  open     http-proxy
12345/tcp filtered netbus

起動後は、

PORT     STATE SERVICE
21/tcp   open  ftp
80/tcp   open  http
110/tcp  open  pop3
143/tcp  open  imap
443/tcp  open  https
445/tcp  open  microsoft-ds
1433/tcp open  ms-sql-s
2222/tcp open  EtherNetIP-1
3128/tcp open  squid-http
3306/tcp open  mysql
5060/tcp open  sip
5061/tcp open  sip-tls
8080/tcp open  http-proxy

です。

あきらかに増えました。 上に示したnmapはオプションなしで実行したのでサービス名しか表示してくれていませんが、-sVオプションを付けることでそのポートを使っている?ソフトウェアとそのバージョンを調べて表示してくれます。これがまさにnmapが攻撃の準備行為に当たってしまうことの理由でしょうね。
そしてこれによってDionaeaの決定的な欠点(修正可)が露呈します。以下に-sVオプションをつけた結果を示します。

PORT     STATE SERVICE      VERSION
21/tcp   open  ftp          Synology DiskStation NAS ftpd
80/tcp   open  http         nginx
110/tcp  open  pop3?
143/tcp  open  imap?
443/tcp  open  ssl/http     nginx
445/tcp  open  microsoft-ds Dionaea honeypot smbd
1433/tcp open  ms-sql-s     Dionaea honeypot MS-SQL server
2222/tcp open  ssh          OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.8 (Ubuntu Linux; protocol 2.0)
3128/tcp open  squid-http?
3306/tcp open  mysql        MySQL 5.7.16
5060/tcp open  sip?
5061/tcp open  ssl/sip-tls?
8080/tcp open  http-proxy?

445番ポートと1433番ポートがDionaeaとバレています。
攻撃者を騙せていません。これはデフォルトのDionaeaでは各ポートの返事に特徴があるためらしいです。これは次で修正します。

4. Nmapによる検出の回避

前述したように、Dionaeaがエミュレートしているサービスのレスポンスには特徴(シグネチャ)があるため、Nmapを使うことでDionaeaが稼働しているサーバが攻撃者にバレてしまいます。
Dionaeaであることがバレてしまうと、攻撃者はそこで攻撃をやめてしまい、私達がほしい攻撃ログが取得できません。そこで攻撃者にばれないように修正していきます。
そこで、Nmapがソフトウェアやバージョンを判定するのに使うシグネチャが収められたファイル(nmap-service-probes)を検索してDionaeaを判別するためのシグネチャを見つけてみます。

$ wget https://raw.githubusercontent.com/nmap/nmap/master/nmap-service-probes

$ cat nmap-service-probes| grep -i dionaea
match ftp m|^220 Welcome to the ftp service\r\n| p/Dionaea honeypot ftpd/
match http m|^HTTP/1\.0 200 OK\r\nContent-type: text/html; charset=utf-8\r\nContent-Length: 204\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 3\.2 Final//EN\"><html>\n<title>Directory listing for /</title>\n<body>\n<h2>Directory listing for /</h2>\n<hr>\n<ul>\n<li><a href=\"\.\./\">\.\./</a>\n</ul>\n<hr>\n</body>\n</html>\n$| p/Dionaea honeypot httpd/
match microsoft-ds m|^\0...\xffSMBr\0\0\0\0\x98\x01\x40\0\0\0\0\0\0\0\0\0\0\0\0\xff\xff\x40\x06\0\0\x01\0\x11\x07\0\x03\x01\0\x01\0\0\x10\0\0\0\0\x01\0\0\0\0\0\xfd\xe3\0\0..........\x00\x34\0W\0O\0R\0K\0G\0R\0O\0U\0P\0\0\0H\0O\0M\0E\0U\0S\0E\0R\0-\0.\0.\0.\0.\0.\0.\0\0\0|s p/Dionaea honeypot smbd/
match honeypot m|^HTTP/1\.0 200 OK\r\nAllow: OPTIONS, GET, HEAD, POST\r\nContent-Length: 0\r\nConnection: close\r\n\r\n| p/Dionaea Honeypot httpd/
match honeypot m|^SIP/2\.0 200 OK\r\nContent-Length: 0\r\nVia: SIP/2\.0/TCP nm;branch=foo\r\nFrom: sip:nm@nm;tag=root\r\nAccept: application/sdp\r\nTo: sip:nm2@nm2\r\nContact: sip:nm2@nm2\r\nCSeq: 42 OPTIONS\r\nAllow: REGISTER, OPTIONS, INVITE, CANCEL, BYE, ACK\r\nCall-ID: 50000\r\nAccept-Language: en\r\n\r\n| p/Dionaea Honeypot sipd/
match ms-sql-s m|^\x04\x01\x00\x2b\x00\x00\x00\x00\x00\x00\x1a\x00\x06\x01\x00\x20\x00\x01\x02\x00\x21\x00\x01\x03\x00\x22\x00\x00\x04\x00\x22\x00\x01\xff\x08\x00\x02\x10\x00\x00\x02\x00\x00| p/Dionaea honeypot MS-SQL server/

この結果から、FTP HTTP SMB SIP MSSQLシグネチャがあることがわかりました。

FTP

Nmapの結果からもわかるとおり、最新の?DionaeaのFTPのウェルカムメッセージはシグネチャのものとは異なっているため、修正は必要なさそうなのでとりあえず放置します。

HTTP

HTTPは修正が簡単です。シグネチャの内容を見ると、HTTPレスポンスを見ているようですが、Dionaeaは80番ポートにアクセスしてきたブラウザに/opt/dionaea/var/dionaea/roots/wwwにおいたindex.htmlの内容を表示させる仕様になっています。
よって適当なhtmlを書いて置いてあげればOKです。

SMB

参考サイトによると、

SMBの"SMB Negotiate Protocol Response"に含まれる"OemDomainName"と"ServerName"の値をチェックしている

らしいので、ここを修正してあげます。
/opt/dionaea/lib/dionaea/python/dionaea/smb/extras.pyの20行目と23行目を以下のように修正してあげます。

20   self.oem_domain_name = "MIDOMINIO"

23   self.server_name = "EQUIPO-TEST"
SIP

SIPに関しても検出されていませんので放置します。

MSSQL

MSSQLは参考サイトによると、

 MSSQLデータベースに接続する際のpre-login TDS package (Tabular Data Streams)の情報をチェックしている模様.Token Typeの値が0x00になっているので,これを0x01に変更する

らしいです。
よって、****の147行目を以下のように修正します。

r.VersionToken.TokenType = 0x01

以上でとりあえずNmapによる検出は回避できるはずです。

今後の方針

MySQLにも、Nmapでは検出されないが、特徴があるらしいので今後気が向いたら修正していきたい。
今後はとりあえずログをたっぷり取っていただいて、Dionaeaのログを可視化出来るツールであるDionaeaFRも使ってログの分析をしたり、収集できたマルウェアを解析してみたいと思います。

まとめ

今回は、いままでやってみたかったハニーポットを設置できました。
しかし、私の戦いはここからはじまる!(訳 : たくさん攻撃していただいて、攻撃トレンドを感じてみたいと思っています。)
今後の展望としては、sshハニーポットや、maliciousなメールを収集するスパムトラップも運用していきたいです。