ぺんぎんさんのおうち

日本語勉強中のドイツ産ペンギンがいろんなことを書く

KOSEN セキュリティコンテスト2017 参加記

木更津高専主催のセキュリティコンテストに参加しました.

@makotom0330_2 と @Ein019 とnotオ◯クの後輩と, 参加者の中で最も名前が長いチームとして出場しました. Google翻訳使って意味調べようとしたのではないでしょうか. 都合上単語のイニシャルを大文字にしてあるだけなので, あれ実はそのまま入力してもちゃんとした訳は得られないんですね.

 

 

名前の話はさておき, 

今回は参加のために僕専用の回線を学内に建ててもらい, リモートで学内のPC動かしてました. さらにそこからVPNだったので動作が遅いのはわかっていましたが, やるからには上位狙おうと意気込んでいました.

が, しかし, 

開始一時間ほど前, VPN繋ぐとリモート先のPCがフリーズするという事態に陥りました.

これは大変だ(この件に関しては弊学の回線に問題があるので運営は関係ないです, 運営の皆さんには質問の対応等感謝しています)

 

チームslackに問題投げてもらって, フラグを代わりに提出してもらうといった作戦にしました.

nc(PPCかな?)は接続できず, Web問は問題すら見れずだったのが悔しいです.

 KoHやってません..

送られて来た問題を解くだけ人間になってました.

 

Write-up

Twitterで見た情報によると, 僕らのチームは2100点獲得して全体で19位でした.

僕が解いた問題のWrite-up置いておきます.

 

[Binary 100] フラグを答えろ

渡されたのはELFファイル. 実行したら入力を求められた.

stringsで出るが, それでは面白くないのでgdbを使うことにする.

 

どうやら

fgetsで入力を求め,

strcmpでフラグと比較している.

入力とフラグが同じであれば RAXに0が入り, 

0x40077f <main+137>: test eax,eax
0x400781 <main+139>: jne 0x4007a0 <main+170>

でjmpしなくなる.

 

 読んでいくとfgetsの前に, フラグ(SCKOSEN{HOGE})を8文字ずつスタックに積んでいっているのがわかる.

積むといっても push命令ではなく mov命令を使用している.

正確には, 一度RAXに8文字代入してから, RAXをスタックに代入している

つまり

movabs rax, "8文字"

mov QWORD PTR [rbp - offset ] , rax

これが"}¥0"がスタックに積まれるまで繰り返される.

ということはどこかのタイミングでRSPをダンプしてやればフラグが表示されるのではないか.

strcmpの前をみてみると

0x400770 <main+122>: lea rax,[rbp-0x50]
0x400774 <main+126>: mov rsi,rdx
0x400777 <main+129>: mov rdi,rax

0x40077a <main+132>: call 0x4005d0 <strcmp@plt>

 RAXに [RBP-0x50] が代入されているということは, この時にスタックを表示してやればフラグが出ると推測される.

f:id:ushiromiya3:20171023002647p:plain

出た.

(RSPは常に表示されているのでコマンドを打つ必要はないけど)

 

[Binary 100] ファイル名を探せ

渡されたのはtarで圧縮されたファイル. 

$ tar -xvf q.gz

で解凍すると大量のファイルが出て来た.

$ ls q/SCK

まで打ってTAB押すとフラグを得られる.

もしくは

$ strings q.gz | grep SCKOSEN

 
[Crypto 200] Weak RSA1

RSAの入門みたいな問題.

pとqは素数.

平文answer(以降m)をe乗してNの剰余を暗号文ciphertext(以降c)とする.

c = m^e mod N

複合は cをd乗してNの剰余をとる.

m = c^d mod N

 

要はdを求めることができれば複合できる.

 N = p*q

phi = (p-1)*(q-1)

d = e^-1 mod phi : GCD(e, phi) = 1

 

ここで問題になるのが, dを求めるためにはNを素因数分解してp, qを得る必要があること. 普通に計算してたら大会が終わっても答え出ないと思う.

逆にいえば, 現実時間で素因数分解できるということ. 

知識の海, インターネットを漂うことにした.

 

pとqが近い数値の時に効率よくNを分解できるらしい.

あとはやるだけ

 

[Crypto 300] Weak RSA2

平文mを異なる e (e1, e2) で暗号化している.

ももテクで読んでいたのでこれは知ってた. Common Modulus Attack

拡張ユークリッドすごい.

 

[Network 100] ログインしたいんだ!

grepしても引っかからない. 

stringsすると "Authorization: Basic" が目につく.

 

$ strings problem.pcapng | grep "Authorization: Basic"

 

Authorization: Basic YWRtaW46dGVzdHRlc3R0ZXN0
Authorization: Basic YWRtaW46cGFzc3dvcmQ=
Authorization: Basic YWRtaW46a2lzYXJhenVfa29zZW4=
Authorization: Basic YWRtaW46U0NLT1NFTntiYXNpY19pc191bnNlY3VyZX0=

Basic認証id:PASSbase64エンコードするので, でてきた文字列をデコードするだけ.

PCAPを見ればわかるが, ステータスコードが200のときの文字列がフラグになっている.

他の3つは401出ていた.

ちなみに上から順に

admin:testtesttest
admin:password
admin:kisarazu_kosen

admin:SCKOSEN{

 

Digest認証じゃなくてよかった.

 

[KoH 30? 300?] 通信を解析しろ

f:id:ushiromiya3:20171022234216p:plain

こういう問題だったらしい(pcap解析しかしてないので, URLアクセスしたら何があるのか知らない).

grepには引っかからなかった.

とりあえずprotocol hierarchie

 

f:id:ushiromiya3:20171022234606p:plain

HTTPあったのでFilter

 

f:id:ushiromiya3:20171022234716p:plain

 

f:id:ushiromiya3:20171022234922p:plain

普通に書いてある.

どうしてgrepしてもSCKOSENで出なかったのかはわからない🤔

これ他のチームの人も解いてると思ったんだけど, ほんとうに弊チームだけか??

 

 

 

たまに点数状況を教えてもらったり(当然スコアサーバに入れないので)すると, 僕が解いてる問題はどれも正答率が高かったのでもっと精進せねばなといったところでした.

接続できなかったのも全て含め, 今後の糧とします.

次は絶対に勝つからな(来年もよろしくおねがいします)

 

 

優勝したInsecureのみなさんおめでとうございます.

そして参加者の方々, 運営のみなさんありがとうございました.

すごく楽しかったです.

21.10.2017

KOSEN SECCONに参加してた.

時差, 厳しいものがある.

 

 

留学満了まで116日

20.10.2017

買い物行って来た.

BDとDVD, 合わせて100€くらい.

 

明日明後日はKOSEN SECCONなので頑張りたい.

 

 

留学満了まで117日

19.10.2017

今日は情報理論の講義がある.

今回の内容は公開鍵暗号の導入, のためのGCDや拡張ユークリッド(EEA)の内容だった.

 

 

来週は朝の時間だけらしい.

 

留学満了まで118日

18.10.2017

投稿忘れが激しい.

朝からKOSENSECCONのためにネットワーク周り設定したり.

夜はスクレイピング本を読み終えた

 

 

留学満了まで119日