撤退

参加報告を記します.

SublimeCoccigrep を作った

SublimeCoccigrep を作った

coccigrep をインストールしてみたら、Vimemacs上で使う方法が載っていたがSublime Text用はなかったので作った。

github.com

普段はpython2を書いているので、sublime api の create_output_panel周りとpython3のバイト列、文字列周りで若干戸惑って時間が掛かってしまった。

ITエンジニアのための機械学習理論入門を読んだ

ITエンジニアのための機械学習理論入門を読んだ

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門

結構前に読んだ...

ちょうどKaggleの勉強会の前に読んだから,トレーニングセット,テストセット,オーバーフィッティングみたいな機械学習のための基本的な単語の意味とか なぜオーバーフィッティングがダメかというような初歩が分かりやすく書いてあったので勉強会の内容も分からないなりに理解の助けになった.

最近だととりあえず使ってみようと思ってChainerのptbサンプルで友人のツイートをRNNLMで学習してツイートするbotを作ってみたけど,なかなか特徴をとらえていて面白い. サンプルをぶん回しただけで内容を深く理解しているわけではないからただの娯楽になってるけど…

tcsetpgrpの云々の話

フォアグラウンドプロセスグループの設定云々

ソースコード

上記のコードをOSX Yosemiteubuntu, CentOS 6で動かした.

実行結果

OSX

tcsetpgrp: Invalid argument
pgid: 1367
USER       PID  PPID  PGID   SESS JOBC STAT   TT       TIME COMMAND
surusuto  1367   309  1367      0    1 S+   s000    0:00.00 ./a.out
root      1368  1367  1367      0    1 R+   s000    0:00.00 ps -aj

tcsetpgrpに失敗していると分かる.

Ubuntu

pgid: 27015
   PID   PGID    SID TTY          TIME CMD
 27014  27014   2840 pts/8    00:00:00 a.out
 27015  27014   2840 pts/8    00:00:00 ps

tcsetpgrpに成功していて,存在していないpgidがフォアグラウンドプロセスグループIDになっている.

CentOSでも存在していないpgidがフォアグラウンドプロセスグループIDになっていた.

どうしてこうなった

シェルをUbuntu上で書いていて試しにOSXで動かしてみるとtcsetpgrpに失敗するので,色々試してみたところ,OSXLinuxで存在しないプロセスグループIDをtcsetpgrpで指定したときの挙動が違うことが分かった.

よくよくコードを見返してみるとsetpgidの前にtcsetpgrpをしていて,そのために存在しないプロセスグループIDがtcsetpgrpされていたのでOSXでは正しく動かなかったとわかったという話.

シグ松さん

僕の推し松は今回の話にちなんでSIGTTOU松!シェルを書くと必ず出てくるよね (詳しくはSoftwareDesign4月号参照)

SECOON ONLINE 2015 Write up

SECOON ONLINE 2015 Write up

marimariで参加したよ(1100pt, 165)

解いた問題

Start SECCON CTF

SECCON WARS

aviutlで動画を全部画像にしたあと, それで出力はこんな感じで,手直しして終わり. f:id:turn_up:20151207120823j:plain

Unzip the file

pkcrackを使おう. 最初にbacknumber08を2014年のを持ってきてうまくいかなかった.

~/Downloads/pkcrack-1.2.2/src/pkcrack -C unzip.zip -c backnumber08.txt 
-p backnumber08.txt -P backnumber08.zip -d d.zip

Connect the server

wget login.pwn.seccon.jp:10000

ncでつなぐとバックスペースで消されるらしくなるほどと言った.

Command-Line Quiz

先頭を出力するのは,head 末尾を出力するのは,tail 出力を絞るのは,grep 操作するのは,awk 最後は色々探してsed

Decrypt it

$ ./cryptooo SECCON{*************************}

ではじめのwaUqjjDGnまでは一致したので,全体で暗号化しているわけではないと判断して,2文字ずつくらいを*から書き換えるのを試して復号していった.

Steganography 3

なにも思いつかなかったので,頑張ってelfをバイナリエディタで書いて実行したら,

Rmxvb2QgZmlsbA0KMre

これをbase64デコードすると

Flood fill

となってペイントで塗りつぶせば良いことが分かる. いとかなし

惜しかったやつ

Fragment2

HTTP2だとわかって(チームメンバから聞いて)SECCONのハフマン符号化したやつ(dd82)があるだろうと思って探してみたところ見つからなかった.(謎 終わった後やってみたら普通に見つかった

Entry form

普通に.bakを見つけてOSコマンドインジェクションだと分かるもなぜかうまく行かなかった

終わり

体力が尽きてケアレスミスが多かったのでもうちょい始まる前に寝ておけばよかった…

CTF for starter 行った

CTF for starter 行った

情報セキュリティ大学院大学行きやすくて良き.

概要

CTFの魅力やセキュリティ倫理的な部分を説明した後,問題を4問(通信解析2個,Web1個,バイナリ1個)くらい解いた.

通信解析

一個目は見るだけ.二個目はbasic認証(見るだけ)

Web

ソースみたり,引数変えたり,上位階層を見たりするだけ.

バイナリ

stringsかけて終わり.

感想

プロお断りとあるように,CTFやったことある人だとすぐ解けるような問題だったと思いました.

CTFやったことないけどセキュリティには興味あるみたいな友人を連れて行ったら,わからんわからんうねってたけど,Webはすらすら解けてたし(Wiresharkの使い方やバイナリのとっつきかたには苦戦してた)starterという名前の通り,初心者の最初の一歩としてとても良いイベントだと感じました.

バイナリに関しては自分もかなり初心者だと思っているからどうかなと思ったけど,stringsコマンド一つで終わってしまったので,そこは残念ちゃ残念でしたね.

Wiresharkの使い方を説明するとそこが全部答えになっちゃうから説明しなかったというお話もあって,確かにそうだなーって思ってました.

ひとしきり考えてみたけど,やはり普通にインターネットにアクセスしてそのパケットをキャプチャして,こんな感じでpostリクエストを送ったからこういう流れになって,こういう風に表示された. みたいなデモをすると結構いけるかも!って思ったけど,ある程度ネットワークの仕組みの基礎部分を知らないと通じないなーとも思いました.やはり難しい…

スタッフの対応も親切でしたし,一緒に行った友人も楽しめていたのですごく良かったです. このような会を開催いただき,運営の皆様ありがとうございました.

CTF for ビギナーズ奈良に行った

CTF for ビギナーズ奈良に行った

TMCTF出たけど,書かずにこの時期まできてしまった… 書こうとは思っていたんだけど…(完

行くまで

奈良には初めて行くということで,鹿に会えると楽しみにしていたが会えず. 現地の人に鹿は野生で駅にまで入ってくることがあるみたいな話を聞いて,自分の感覚の鳩に近い生物なんだなあと思った.

あと,福岡で会ったことのある人が4人くらい居て楽しかった.

あとNAISTへ向かうバスでSuicaが使えなくて100マス戻った.

チュートリアル

服部さんと小出先生の説明から.小出先生とは競技後に福岡での話(デバドラの話)が話せて楽しかったです.

服部さんが世界観の説明の時に「クソな上司からadminのログインIDとパスワードを教えてもらえずに,これを直せと投げられた」というフレーズを使っていて,僕もその経験ある!となり笑いました. (ただ,僕の上司はとても良い人だということだけ補足だけしておきます.)

小出先生は相変わらずの話しっぷりで,面白かったです.raspberryのスペル,難しいですよね.

競技について

競技は福岡の時仲良くなったふるつきくんと2人チームNOPで出ました.

本当はここでSECCONって入ったあの紙の画像を上げるとかっこいいけど,画像撮ってない…

競技全体についてはスコアボードを見れば分かるけど,スクリプトを完成させたチームと終盤にシステムを稼働させていたチームが上位に行った感じですね.

あとは,MacOS Xだと有線LANが使えなくて焦ったけどXUbuntuなら無事使えたとか,外部接続が出来ないからslackが使えないとか色々ありました.

わかったこと

SSH関連

  • 開始してすぐにsu pipassword:raspberryでログイン出来たので,デフォルトのままのアカウントがあるんだなーと思いパスワードを適当に変更.(これがフラグ
  • ほんでふるつき君に他のIPにこれでログインしてよって言っておいたら,すぐにcommandっていうのがあります!と教えてくれて(優秀)flagぽいものを見つけ出すも,IPとチームの対応が分からないという事態になる.
  • パスワード変えたし大丈夫でしょと思っていたら,突然sshの接続が切れてて,ぶちギレwコマンドで確認するとpiのセッションがあり混乱する.
  • あとからssh pi@ipaddrを試してみたらどうもプロンプトの様子がおかしいので,バッグドア型ぽいと気がつく.su piでのユーザ切り替えによる認識だったから気がつかなかった!(フラグ回収
  • 落とされたsshsudo service sshd restartで力業の復旧を行う.
  • だいぶ時間が経った後/home/pi/work/ssh...にあったソースコードを読んだ感じだと,piでのsshログインだけ別の扱いになっててなるほどねってなった.
  • piでログインしてもなにも出来ない(使えるコマンドがかなり制限されてた)のになんでsshを閉じるんだ…周りはスーパーハカーだらけかよビギナーズ詐欺かと思ったらcommandにそういう機能があったらしい.そのコード読む時間なかったよ…ごめんなさい小出先生…
  • 最後にはなんかsudo service sshd restartが効かなくなって,エラーを頑張って調べたら,sambaがarch linuxで動かねえ!って記事しか出てこなくて完 リブート掛けたら締め出し喰らって完 僕のアタックアンドディフェンスはここで終わってしまった.
  • あとで小出先生にrestart効かなくなった原因を尋ねたところ,「なんでだろう.なんかファイル足りないのかも」と言われてほーってなった.

SSHの部,完

Webサービス関連

  • とりあえず開発環境から本番環境にapp/bootstrap.phpをいじったらOops!画面に突入した.(未解決問題 *1
  • ふるつき君がほいほい脆弱性を見つけて来たので,sshの対応に追われながら直していった.
  • 具体的にはログインハッシュ,uploadの部分,認証無しでユーザ情報がedit出来る部分,アクセスログのUserAgentでXSSできる部分を直した.
  • ふるつき君が書く攻撃コードを手伝ったりもしていたら,他チームの1000点ラッシュが始まる.
  • 自分達は最初の1000点ラッシュの時の攻撃は喰らわなかったけど,その後Capital Nagaokaチームのadminに入れるというやつを喰らい1000点取られる.
  • 長岡はCapitalでは無いと思った.
  • なんかConfigファイルが消えてて,ディフェンスポイントが入らなくなった.これがくせ者で,かなりの時間を費やしてしまった(しかも,他の問題が発生し復旧せず)
  • 他にもsqlインジェクションとか直してないし,色々と手が回らなかった.
  • 帰宅してから書いたコードに思いを馳せてたら,phpを弾くアップローダじゃなくて,phpだけ受け入れるアップローダになってた気がしたけど,アップローダから攻撃したseccap_koチームからは点を取られていないので謎が深まる.(ただそれだとConfigファイルが消えてたのと整合性が取れる.でももっと他に消すものがある気もするけど…)

Webの部,完

NAISTについて

  • 食堂の炒飯が割といける.
  • この時期のNAISTでは野焼きやバーべーキューが行われるので,焦げ臭くてもraspiが燃えたとは限らないということ.
  • 足である奈良交通バスではSuicaが使えない.

感想

  • 面白かったけど,もっと点数は取れたんじゃ無いかなーって気がしました.色々運が良くてアタックに成功したけど,人手不足やら実装力不足やらipアドレスとチームの対応付けの失敗で得点が伸びなかったということが残念でした.
  • これだけ未解決の問題が多いと点数が伸びなくてもやむなしといったところですね.それでも防御の点数のインフレが無ければ割と上位でしたが(笑)そういう意味でも点数の配分は難しいなあと思いました.
  • デバッグとバックアップはちゃんとしようと思いました.
  • 防御点の割合がかなり高くなるなら,トータルで見てApacheアップローダ系の致命的にやられるヤツを直すまで止めてもいいかもしれないと思いました.
  • Web系の防御点が1チーム1000点で,複数の攻撃可能箇所から取れるものが同一なためにどこか一つでも開いてるとやられるので,中途半端に直しても意味があまりなかったですね.そういう意味でもかなり簡単に全体を確認してから出すのはとても大切な感じがします.
  • あとiptablesの変更はかなりテクくて良いなと思いました.
  • 腰がめっちゃ痛くなりました.
  • 知り合いが居ると楽しかったです.
  • とても楽しかったわけですが,運営の皆さんはとても大変そうでした.とても感謝しています.ありがとうございました.

*1:本番環境の設定についてソースコードが公開されてみたのでやってみたところ,fuel/app/config/production/production.phpを編集してデータベースの設定が必要だったみたいです.確かにそらそうだー

簡単なデバイスドライバを作る

簡単なデバイスドライバを作る

間が空いてしまいましたが,セキュリティキャンプ九州にて小出先生のテキストで消化できなかった部分を32GBのSDカードをようやく買ったのでやってみました.

環境準備

とりあえず先生から頂いた環境でHello, World!ドライバを作ろうと,

#include <linux/module.h>
#include <linux/kernel.h>

MODULE_AUTHOR("hoge");
MODULE_DESCRIPTION("dummy driver");
MODULE_LICENSE("GPL");

int init_module(void)
{
    printk(KERN_INFO "Hello World!");
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye World!");
}

をhello.cとして,とりあえず頭空っぽにして sudo make すると

make -C *** /lib/modules/4.1.4-v7+/build: No such file or directory.

となるので,kernel-headersが必要とわかりsudo apt-get install linux-headers-$(uname -r) でkernel headerを落とそうとするもパッケージが見つからなくて失敗. update, upgradeしてもだめだったので4.1.4-v7+のlinux-headerのdebファイルを持ってきてインストールしました.

sudo makeできるようになったので,sudo insmod hello.koでドライバを組み込みます.lsmodで組み込まれているドライバを確認すると

$ lsmod
Module                  Size  Used by
hello                    683  0

となり組み込めていることが確認できます. その後,sudo rmmod hello を行いドライバを外しました. tailコマンドを使って正常にドライバが動作したかを確認.

$ tail -n 2 /var/log/syslog
Sep 18 14:39:16 raspi000 kernel: [10449.520157] Hello world
Sep 18 14:41:19 raspi000 kernel: [10571.904216] Goodbye world

ちゃんと表示されてるので大丈夫だと認識しました.

ドライバでgpio制御をする

とりあえずbuild

https://github.com/wendlers/rpi-kmod-samples を利用して作ろうとのことなので,ちょいちょいとコードをいじってみました.

この中でもkmod-gpio_outptimerを用いて,LEDをチカチカさせてみようと思います. はじめはコードをそのまんまでbuildしてLEDをチカチカさせました.

ちなみにこの時のraspiと周りの回路の関係は下の図のようになっています.

f:id:turn_up:20150918151249j:plain

スイッチも制御しよう

せっかくスイッチも回路に組み込んであるし,スイッチを押したら点滅するようにしてみます. 先生のテキストによると,init_moduleでGPIOの初期化及びタイマの設定. blink_timer_funcでLEDの点滅,タイマの設定.とのことなので,

#define SWITCH1 21

を追加しました.

init_moduleではGPIOの初期化が必要なので,

  ret = gpio_request_one(SWITCH1, GPIOF_IN, "switch1");

  if (ret) {
    printk(KERN_ERR "Unable to request GPIOs: %d\n", ret);
    return ret;
  }

を追加し,またLEDの初期化では最初がオフになるように

ret = gpio_request_one(LED1, GPIOF_OUT_INIT_LOW, "led1")

...

blink_timer.data = 0L;

としました.

その後,blink_timer_funcにスイッチの値によってLEDの値を決まるようにする条件分岐を追加しました.

  int value = 0;
  value = gpio_get_value(SWITCH1);
  if (value) blink_timer.data = !data;
  else blink_timer.data = 0L;

これで動かしてみたのが次の動画です.

ドライバの組み込みに成功したので,sudo rmmod gpiomod_outptimerして時間間隔をちょっといじってみたあとsudo makeして,再度sudo insmod gpiomod_outptimer.koしようとすると,

Error: could not insert module gpiomod_outptimer.ko: Device or resource busy

となります.

藤原竜也の真似をする某人ばりになんでだよおおって言ったあとにcleanup_moduleでGPIOを解放していないことに気がついたので,以下の文をcleanup_moduleに追加しました.

  gpio_free(SWITCH1);

これで無事普通に動くようになったと思います. tailの結果も

$ tail -n 2 /var/log/syslog
Sep 18 15:10:10 raspi000 kernel: [12302.915460] gpiomod_init
Sep 18 15:10:16 raspi000 kernel: [12308.776421] gpiomod_exit

となり,問題なさそうです.

まとめ

LチカをLinuxカーネルモジュールとして作成しました.

今回少しハマったポイントはドライバ作成環境構築でのkernel-headersのインストールと GPIOの初期化,GPIOの解放をドライバの組み込み,取り外しに際してそれぞれ行うことを忘れたことでした.

感想

簡単ながらデバイスドライバを作成したということで作成経験を主張していこうと思います.

小出先生の講義はどれもraspi活用法の入り口として面白かったのでこういう風に作ってみました. 今後はこれを応用してGPIO制御をユーザ空間,カーネル空間使い分けて電子工作を行っていきたいと思います.