teppay’s log

技術ブログです。

Cowrieのuserdb.txtの書き方

はじめに

  • タイトルの通り、Cowrieのuserdb.txtの書き方を調べたので、覚え書き的なもの
  • みればわかるやんって方はスルーで笑

わかったこと

フォーマット

まず、userdb.txtは、1行で1ユーザを表しており、1行は2つの':'(コロン)で区切られています。
1行の内容としては

<ユーザ名>:<uid>:<password>

です。
つまり、userdb.txtの中身が

root:0:passwd
admin:0:admin

である場合、

  • root/passwd
  • admin/admin

の2つの組み合わせのみが認証を通過して、シェルを触ることができるということです。
ここまではファイルの中身を見ればだいたいわかります。

passwordの書き方

ただし、パスワードはそのまま書く以外に2つ方法があります。

まずはそのまま
root:0:passwd

このように書くと、uidが0で、パスワードは'passwd'の'root'というユーザが出来ます。

ワイルドカード
root:0:*

このようにパスワード部分を'*'とすると、ワイルドカードとなり、どのようなパスワードでも認証に成功させる事ができます。
つまりあるユーザ名でアクセスしてくる人をパスワードにかかわらずログインさせ、行動を観察することが出来ます。

特定のパスワード拒否
root:0:!passwd

このように書いた場合、rootというユーザに'passwd'というパスワードでログインしようとした場合拒否する。という設定となっています。
ただし、この行の前に同じユーザ名でワイルドカードの行があった場合、ログインに成功してしまうため、特定のパスワードのみ拒否したい場合は、かならずワイルドカードよりも前の行に書く必要があります。

まとめ

  • 覚え書きでした。

T-PotのCowrieの設定を変更する

はじめに

  • T-Potは御存知の通り、Dockerの上に複数のハニーポットとELKがのった素晴らしいものなんです。
  • しかし、僕がDocker初心者だからかもしれませんが、それらのハニーポットの設定を個別に変更する(たとえばT-Pot上のCowrieの設定を変更する)のに一手間かかりました。
  • 今回はCowrieについてですが、この方法でおそらく全部イケルと思います。

動機

今回はタイトルの通り、「T-Potの中のCowrieの設定を変更する」わけなんですが、なぜこれをしたかったかという話をまずします。

Cowrieの認証の方式

CowrieはSSHの低対話型ハニーポットなので、だれかからのSSH接続試行に応答します。脆弱なSSHをエミュレートしているわけですので、user/passwordによる認証をするわけですが、その方法に2つの選択肢があります。"AuthRandom""UserDB"です。

AuthRandom

この方式ではその名の通り、ランダムに認証を成功させます。
つまり、正しいuser/passwordの組を用意せず、ランダムでn回目の試行で認証を成功させるという方式です。

UserDB

それに対して、"UserDB"では、こちらもその名の通り、予め用意したユーザのデータベースと照らし合わせ、それと合致したuser/passwordの組を使ってアクセスしてきた場合に認証を成功させることになります。
データベースとは書きましたが、userdb.txtというテキストファイルです。

T-PotのCowrie

T-PotのCowrieでは"AuthRandom"になっています。
最初は、たくさんアクセスが来て、どんなことを中でしてるのかplaylogで見てみようとワクワクしていたんですが、いかんせんMIRAI的なやつらからのアクセスが多すぎる
やつらのせいで、それ以外を探すやる気がそがれる。
なので、"UserDB"に設定を変更して、ログイン試行してきた少なめのuser/passwordの組に絞った形でどのような行動をしているかを見ていきたいというわけです。
それと並行して、アクセスのなかから興味深いものを(つまりMIRAI的なやつら以外のものを)見つけて教えてくれるようなスクリプトを書くことも検討しています。

やったこと

1. cowrie.cfguserdb.txt をコンテナ内からホストに持ってくる

T-Potを運用していれば知っていると思いますが、別々のコンテナで動作しているそれぞれのハニーポットが収集したログは、ホストの/data/配下にすべてまとまっています。これは僕もくわしくは説明できませんが、Docker Volumeという「コンテナ内のディレクトリをホストにマウントする」仕組みを使っています。簡単にいえば、コンテナとホストの共有フォルダをつくれる様なものです。(フォルダだけではありませんが、)
なのでコンテナ上のログが蓄積されるディレクトリに必要なファイルをコピーしてしまえば、ホストに持ってくることが出来ます。

# docker exec -it docker sh
$ cp /home/cowrie/cowrie/cowrie.cfg /home/cowrie/cowrie/log/
$ cp /home/cowrie/cowrie/data/userdb.txt /home/cowrie/cowrie/log/
$ exit

2. T-Potのサービスをstopする

T-Potの設定をいじるので、T-Pot自体を止めます。

# systemctl stop tpot

3. cowrie.cfguserdb.txtを移動する。

ログが蓄積されるディレクトリにそのまま置いておくのもかっこ悪いので、設定ファイルを置く場所を作って移動させます。

# mkdir /data/cowrie/conf
# mv /data/cowrie/log/cowrie.cfg /data/cowrie/conf/
# mv /data/cowrie/log/userdb.txt /data/cowrie/conf/

4. tpot.ymlを変更する。

これは、Docker Volumeによって、ホストのcowrie.cfguserdb.txtにコンテナ内のcowrie.cfguserdb.txtをリンクさせる設定です。 これによって、いちいちコンテナ内のシェルを叩かずに設定を変更できるようになります。

# vi /opt/tpot/etc/tpot.yml

[...]
# Cowrie service
  cowrie:
    container_name: cowrie
    restart: always
    networks:
     - cowrie_local
    cap_add:
     - NET_BIND_SERVICE
    ports:
     - "22:2222"
     - "23:2223"
    image: "dtagdevsec/cowrie:1710"
    volumes:
     - /data/cowrie/downloads:/home/cowrie/cowrie/dl
     - /data/cowrie/keys:/home/cowrie/cowrie/etc
     - /data/cowrie/log:/home/cowrie/cowrie/log
     - /data/cowrie/log/tty:/home/cowrie/cowrie/log/tty
     - /data/cowrie/conf/cowrie.cfg:/home/cowrie/cowrie/cowrie.cfg # add this line !!!!!!
     - /data/cowrie/conf/userdb.txt:/home/cowrie/cowrie/data/userdb.txt # add this line !!!!!!
[...]

5. cowrie.cfgを変更する

ついにCowrieの設定です。
この行を

#auth_class = UserDB

以下のように

auth_class = UserDB

そしてこの部分を

auth_class = AuthRandom
auth_class_parameters = 2, 5, 10

以下のように変更します。

# auth_class = AuthRandom
# auth_class_parameters = 2, 5, 10

6.userdb.txtに好きなuser/passwdの組を追加、削除する。

僕はとりあえず、raspberryPiのOSのraspbianの初期ユーザと、渾身のクソパスワードを設定したadminを追加してみました。
ちなみに真ん中の数字はuidです。

# echo 'pi:1:raspberry' >> userdb.txt
# echo 'admin:0:p@sSw0Rd' >> userdb.txt

こんな感じ。

teppay.hatenablog.com

7. T-Potのサービスをstart!

# systemctl start tpot

まとめ

  • T-Pot上のCowrieの設定を変更できた
  • これで多分ほかのハニーポットの設定も変更できるはず!
  • Dockerについても勉強が必要だと思った。

セキュキャン終わってからやってること、あとハニーポットのこと

はじめに

adventar.org

  • 実は人生初めてのAdventCalenderです!!
  • こんなことをやりました、こんなことをやっていきますっていう報告程度のことしか書いていませんので、僕の熱狂的なファンの方向けの内容となっております()
  • あと随時お仲間を募集しております。同じようなことやってるって方は仲良くしてください。

第1部 セキュキャン以後のこと

セキュキャンで得たもの

  • マルウェア(解析)、生の攻撃への興味
  • 知らなかった分野への好奇心
  • ハニーポッターになるきっかけ(さくらのクラウドのクーポン)
  • すごく強い参加者や講師、チューターと会って、いい意味での焦りを感じた

teppay.hatenablog.com

いままでやったこと&いまやってること

いままで
  • Dionaea(ハニーポット)
    とりあえず、生の攻撃にさらされてみたかったので、IPAの資料でも推奨されていた低対話ハニーポットのDionaeaを構築してみました。ただ、DionaeaFRというWebフロントエンドがうまく動かなかったのでやめました。

teppay.hatenablog.com

いまやってる
  • T-Pot(ハニーポット
    T-Potは、いろんな種類のハニーポットとログ可視化のためのELKがセットになったものです。 Dionaeaをやめて、T−Potに乗り換えて今も運用しています。忙しくてログを解析することは未だ出来ていないのですが、ぼちぼちやっていこうと思います。

teppay.hatenablog.com

  • Practical Malware Analysis

    これは有名?なマルウェア解析についての本です。
    ハニーポットのログ眺めてるだけっていうのも芸がないので、ハニーポットが捕まえたマルウェアを解析してみたいと思い勉強をはじめました。真面目に洋書を読むのは初めてだったのですが、技術的な英語は読みやすいし、Kindleで買ったのでわからない単語は長押しで調べられてとても便利です。
    静的解析動的解析のことはもちろん、難読化、アンチVMなどたっぷりお腹いっぱいな内容です。各章にはLabsという練習問題的なものがついていて、その詳細な解説までついてくるのでしっかり復習できます。自分はまだ全体の8%程度しか読めていません。これから頑張っていこうと思います。

Practical Malware Analysis: A Hands-On Guide to Dissecting Malicious Software

今後やっていきたいこと

  • Kaggle(機械学習の競技サイト)
  • CTF(マルウェア解析と通じる部分もあるはずなので、とくにRevをできる様になりたい)
  • なんかしら脆弱性をみつける!
  • Practical Malware Analysisを一周したらハニーポットで捕まえたマルウェアを解析してみる
  • 現在は低対話型のハニーポットですが、強くなったら高対話型のハニーポットもやってみたい
  • 勉強会ってやつにいきたい!まじで!
  • 同じようなものに興味ある方がいれば、ぜひ一緒にやりたいです!

第2部 T-Potの観察日記0日目

ほんとに簡単なことしか書かないので0日目としました。とりあえずここ1ヶ月のログについてです。単位を日にしましたが、毎日観察するわけではないのであしからず。。。

アクセス先のハニーポット(サービス)

SSHTelnetハニーポットであるCowrieへのアクセスがダントツですね。Cowrieの生のログを見た感じの感想としては、話題のMIRAIのアクセスが多いです。そのせいで他のログが見つからない(怒 f:id:teppay:20171224001316p:plain

攻撃してくる国について

割合としてはこんな感じです。スペインとロシアからのアクセスがダントツで多いです。IPアドレスの元がその国ってだけでその国の人の攻撃かはわからないですけど、ただ国ごとにアクセスの性格が違います。それを見てるだけでも楽しいです。今回はダントツのスペインとロシアだけ、
f:id:teppay:20171224000534p:plain

スペイン

スペインは(フランスなんかもそんなイメージがありますけど)、急にどーーーーーん!!とでかいアクセスが来ます。 f:id:teppay:20171224000841p:plain

ロシア

スペインとは対照的?にロシアは、サーバを見つけてからダラダラとネチネチとアクセスしてきています。 f:id:teppay:20171224001019p:plain

Cowrieに来る悲しいPassword

TagCloudってやつです。Kibanaって便利ですね。。。
f:id:teppay:20171224002032p:plain
/bin/busyboxenableshellのようなものは、なぜかログイン後にシェルに入力したものがTagCloudに表示されてしまっています。なのでPasswordとは違うと思います。(ちなみにおそらくMIRAIのアクセスによるものです。)

ごらんの通り、

  • 123
  • password
  • admin

のような、教科書どおりのパスワードも見受けられますが、ちょっと違うのもありますね。

  • ipcam_rt5350 (IPカメラのパスワード?)
  • ho4uku6at  (ランダム?)

みたいなやつです。これなにかなと思って調べてみましたが、いろんなハニーポットで検知されているようで、それが検索に引っかかっちゃってなんのパスワードなのかわかりませんでした。前者はインターネットに接続されるタイプのカメラのデフォルトパスワードなのかなと、勝手に思っています。

ただこいつらよりも僕の心をわしづかみにした、悲しいパスワードがあります。 f:id:teppay:20171224004301p:plain こいつです。
こいつがどんな思い出こんな屈辱的な名前にされたか,,,
そしてそれが報われず、changeしてもらえないせいで、辞書攻撃のためのパスワードリストに入ってしまっているんでしょう。それともchangeしてもらえているかどうかに関わらずリストには入れられてしまうんでしょうか。僕としては後者であることを祈るばかりです。。。

おわりに

  • 今回は seccamp2017 Advent Calendar 2017 - Adventarということで、人生初のAdvent Calenderでした!
  • 内容としては大したものでは無かったし、23日を1時間ほど過ぎてからの投稿になってしまいましたが今年(の後半)を振り返ることが出来て良かったです。
  • ハニーポットに関しては、今回はほんとに表層の部分しかみることができなかったのですが、これを足がかりにもっと深いところまで分析していけたらと思います。
  • 再三になりますが、同じようなことに興味があって、意見交換できるようなお仲間を随時募集してます。いましたらTwitterで話しかけてください。

T-PotのCowrieにplaylogを導入した

f:id:teppay:20171222110557g:plain

はじめに

やったこと

git clone

$ sudo su
# cd /opt
# git clone https://github.com/micheloosterhof/cowrie

alias を設定する。

playlog/opt/cowrie/bin/配下にあるのですが、そこにPATHを通すほどでもないと思うので、.bashrcに以下の記述を追加しました。

alias playlog=/opt/cowrie/bin/playlog

これで、playlogというコマンドでどこでも実行可能になります。

実行してみる

cowrieのttyのログは/data/cowrie/log/tty/ 配下にあるので、cdコマンドで移動して、、

f:id:teppay:20171222110557g:plain

表示されている内容は、

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

system@ubuntu:~$ sh
system@ubuntu:~$ /bin/busybox Fixed
Fixed: applet not found
system@ubuntu:~$ /bin/busybox ps; /bin/busybox Fixed
 PID TTY         TIME COMMAND
5673 pts/0       0:00 -bash
5679 pts/0       0:00 ps 
Fixed: applet not found
system@ubuntu:~$ /bin/busybox kill 5673
system@ubuntu:~$ /bin/busybox kill 5679
system@ubuntu:~$ /bin/busybox cat /proc/mounts; /bin/busybox Fixed
rootfs / rootfs rw 0 0
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,relatime 0 0
udev /dev devtmpfs rw,relatime,size=10240k,nr_inodes=997843,mode=755 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /run tmpfs rw,nosuid,relatime,size=1613336k,mode=755 0 0
/dev/dm-0 / ext3 rw,relatime,errors=remount-ro,data=ordered 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
tmpfs /run/lock tmpfs rw,nosuid,nodev,noexec,relatime,size=5120k 0 0
systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=22,pgrp=1,timeout=300,minproto=5,maxproto=5,direct 0 0
fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0
/dev/sda1 /boot ext2 rw,relatime 0 0
/dev/mapper/home /home ext3 rw,relatime,data=ordered 0 0
binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
Fixed: applet not found
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68' > /.n; /bin/busybox cat /.n; /bin/busybox rm /.n
kamh
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/sys' > /sys/.n; /bin/busybox cat /sys/.n; /bin/busybox rm /sys/.n
kamh/sys
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/proc' > /proc/.n; /bin/busybox cat /proc/.n; /bin/busybox rm /proc/.n
kamh/proc
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/dev' > /dev/.n; /bin/busybox cat /dev/.n; /bin/busybox rm /dev/.n
kamh/dev
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/dev/pts' > /dev/pts/.n; /bin/busybox cat /dev/pts/.n; /bin/busybox rm /dev/pts/.n
kamh/dev/pts
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/run' > /run/.n; /bin/busybox cat /run/.n; /bin/busybox rm /run/.n
kamh/run
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68' > /.n; /bin/busybox cat /.n; /bin/busybox rm /.n
kamh
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/dev/shm' > /dev/shm/.n; /bin/busybox cat /dev/shm/.n; /bin/busybox rm /dev/shm/.n
kamh/dev/shm
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/run/lock' > /run/lock/.n; /bin/busybox cat /run/lock/.n; /bin/busybox rm /run/lock/.n
kamh/run/lock
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/proc/sys/fs/binfmt_misc' > /proc/sys/fs/binfmt_misc/.n; /bin/busybox cat /proc/sys/fs/binfmt_misc/.n; /bin/busybox rm /proc/sys/fs/binfmt_misc/.n
kamh/proc/sys/fs/binfmt_misc
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/sys/fs/fuse/connections' > /sys/fs/fuse/connections/.n; /bin/busybox cat /sys/fs/fuse/connections/.n; /bin/busybox rm /sys/fs/fuse/connections/.n
-bash: /sys/fs/fuse/connections/.n: No such file or directory
cat: /sys/fs/fuse/connections/.n: No such file or directory
rm: cannot remove `/sys/fs/fuse/connections/.n': No such file or directory
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/boot' > /boot/.n; /bin/busybox cat /boot/.n; /bin/busybox rm /boot/.n
kamh/boot
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/home' > /home/.n; /bin/busybox cat /home/.n; /bin/busybox rm /home/.n
kamh/home
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/proc/sys/fs/binfmt_misc' > /proc/sys/fs/binfmt_misc/.n; /bin/busybox cat /proc/sys/fs/binfmt_misc/.n; /bin/busybox rm /proc/sys/fs/binfmt_misc/.n
kamh/proc/sys/fs/binfmt_misc
system@ubuntu:~$ /bin/busybox echo -e '\x6b\x61\x6d\x68/dev' > /dev/.n; /bin/busybox cat /dev/.n; /bin/busybox rm /dev/.n
kamh/dev
system@ubuntu:~$ /bin/busybox Fixed
Fixed: applet not found
system@ubuntu:~$ rm /.t; rm /.nh; rm /.human
system@ubuntu:~$ rm /sys/.t; rm /sys/.nh; rm /sys/.human
system@ubuntu:~$ rm /proc/.t; rm /proc/.nh; rm /proc/.human
system@ubuntu:~$ rm /dev/.t; rm /dev/.nh; rm /dev/.human
system@ubuntu:~$ rm /dev/pts/.t; rm /dev/pts/.nh; rm /dev/pts/.human
system@ubuntu:~$ rm /run/.t; rm /run/.nh; rm /run/.human
system@ubuntu:~$ rm /.t; rm /.nh; rm /.human
system@ubuntu:~$ rm /dev/shm/.t; rm /dev/shm/.nh; rm /dev/shm/.human
system@ubuntu:~$ rm /run/lock/.t; rm /run/lock/.nh; rm /run/lock/.human
system@ubuntu:~$ rm /proc/sys/fs/binfmt_misc/.t; rm /proc/sys/fs/binfmt_misc/.nh; rm /proc/sys/fs/binfmt_misc/.human
system@ubuntu:~$ rm /boot/.t; rm /boot/.nh; rm /boot/.human
system@ubuntu:~$ rm /home/.t; rm /home/.nh; rm /home/.human
system@ubuntu:~$ rm /proc/sys/fs/binfmt_misc/.t; rm /proc/sys/fs/binfmt_misc/.nh; rm /proc/sys/fs/binfmt_misc/.human
system@ubuntu:~$ rm /dev/.t; rm /dev/.nh; rm /dev/.human
system@ubuntu:~$ cd /
system@ubuntu:/$ /bin/busybox cp /bin/echo bigbotPein; >bigbotPein; /bin/busybox chmod 777 bigbotPein; /bin/busybox Fixed
Fixed: applet not found
system@ubuntu:/$ /bin/busybox cat /bin/echo
cat: /bin/echo: No such file or directory
system@ubuntu:/$ /bin/busybox Fixed
Fixed: applet not found
system@ubuntu:/$ 

これはおそらく話題のMIRAIによるアクセスですね。 (参考: Typical Mirai log - Pastebin.com

まとめ

  • git cloneしただけです
  • playlogみてると時間が溶けます
  • ただ、MIRAIっぽいアクセスが多すぎてつまらない
  • なかなか難しいでしょうが、自動じゃない、人力で入力してるっぽいアクセスログ見てみたいですね。

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のなかに見えた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を入れ直して再度挑戦しようと思います。
これが手軽にできるのがクラウドの良いところ?

まとめ

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