[Write-down]SECCON CTF 2019予選

この記事は約9分で読めます。
スポンサーリンク

やー、SECCONとても楽しかったです。Write-upもどんどん増えてきましたね。

ああこうやって解けばよかったんだ・・・と、参加側の立場で学びが多いです。

逆に言えば。差し出がましいようですがWrite-upは出題者の方へはフィードバックが少ないですよね。

書いている人は、解けたから。出題者の想定通りの話しか書いていないもの。

ひっかけや挫折すらも誘導されていると良問だと感じますが、挫折はみんな口を閉ざすので、なかなかPDCAが回らないものではないか。

という言い訳で、Write-up↑↑ならぬ、Write-down↓↓な、どう悩みどうあがきどう挫折したか、どんな楽しさや疲労を感じたか、の記事を書いてみようと思います。

バックボーン

得意不得意がはっきり分かれるCTFで、そもそもどんな人が書いているのか?が無いと、今後の参考にしづらいと思うので。

  • CTFは2019/5のSECCON 2019 Beginnerが初回で、今回が2回目
  • 社会人趣味プログラマ
  • サーバ/アプリは開発/運用経験あり
  • ネットワークは運用だけ
  • ITスキルというか、業務フロー構築や環境改善や他部調整。マネジメント色が強め
  • セキュリティは未経験
  • 学生時代の専攻は理論物理で、IT系ではない
  • 資格はJava8Goldとネスペと、ちょこちょこ

要は、ITに興味はあるが、あまり経験値のない人間です。

[crypto]ZKPay

1st try

  • Signup処理がやたらと遅いので、サーバーが本当に重いのか、タイムラグ中に何かをしろというメッセージなのか、悩んだ。proofもgenerating(だっけ)と、ラグを想定した値が用意されているし。
  • 単純に考えれば大量のユーザを作成してお金を巻き上げればいいし、自動化処理を書けなくはないが、そんな頭を使わない話を運営が想定しないだろうとして却下
  • Senderのあからさまなハッシュ値はヒントというか答えなんだろうと理解
    実サービスでハッシュ値をユーザに見せるユースケースが全く想定できないので、完全に攻撃用だろう
  • QRコードを読み取るツールを知らなかったので初導入(zbarimg)
  • ユーザ名とハッシュを単純にadminのものに書き換えたが、認証不可
    くそ、proofになにか入っているんだろう・・・ノーヒントでこんなでかいデータを読み解くのか???マジか???
    →いや、きっとWeb操作の中で、admin権限の奪取や、実はhashをSQLで直覗けるとかなんじゃないか
    いやいや、ジャンルはcryptoだぞ。絶対にproofをdecryptする必要がある。そうでなければwebジャンルだ。

2nd try

  • とりあえずめっちゃ連打してみる。タイミングや処理競合で、持ち金がプラスかマイナスかわからないが、ずれるかもしれない。
    昔はこのテクニックでcgiゲームを席巻したものさ・・・
    →1円もずれない。トランザクション処理?知ってるよ!
  • コマンドラインから超速で連打するのは、意味ないし規約違反だし、何より迷惑極まりないので、やめておいたよ・・手動ですら、ごめんなさい。
  • マイナス値での送金要求ができるのだろうか??
    →できた!!なんか穴っぽい!
     だけど上限500で頭打ち・・これは、単にハイフンを見落としてるだけですね。
     これは作り込みが甘いだけだわーマイナスのことは忘れよう。

3rd try

  • あまりにもいきあたりばったりだ。冷静に、逆算的に考えよう。
  • お金増やしたい→友達も貧乏人ばかり→金持ちから恵んでもらいたい→金持ちは進んで恵んでくれない→金持ちのふりをして送金/受金処理を偽装しよう!!(とんでもねえ)
  • やはりQRを自作する作戦が良さそうだ。QRの構成要素はなんなのか。材料はなんなのか。
  • usernameは、fromかtoか明記されてないが、誰にQR見せるかわからないからfromだろう。
  • hashは、複数QRを作成してみたが固定値のようだ。まあadminのハッシュ値はこれ!って表示もあるし、想定通りだ。
  • proofが固定値なのは意外だった。てっきり送金額やタイミング程度は材料に入っているものかと。ますます、アルゴリズム特定と偽装の必要性を強く感じる。cryptoだし!
  • proofの構成文字は大小英と数とプラスとスラッシュ。base64に似ている。デコードして再エンコードしても同じデータが得られるので、base64と見て良いだろう。
  • base64デコード後は、バイナリデータだし特徴がない。バイト数も312バイトで心当たりがない。これを解読しろというのか・・・cryptoだし。
  • 複数ユーザの作成と、他サーバで同一名のユーザを作成してproofの傾向を確認した。一向にわからない。
    そもそもログアウト処理もないし、初めは1サーバだったから、このアプローチは不要なんだろう
  • ソース見てjsを覗いた。肝心な処理はAPIに投げているのでブラックボックスだ
  • 適当にAPIを叩いてみた。データ取得とユーザ作成だけは自分でできたが、createQRは実行できなかった。おそらくスキル不足によるもの。これができる人は、APIを叩きまくって、大量のユーザから金を巻き上げているのか・・・いやいや。cryptoじゃないよそれは。サーバ重いし、3つになってるし、完全に想定外の自体だということだ。深堀はしない
  • 何とかPayの風刺だとすれば、二段階認証が絡むのだろうか。間違いない。
    つまり、、どういうことだ?

答え

マイナス値のQRを作成して、receive処理を行うとのことでした!

惜しい!送金用のフォームにマイナス値を入力するまではやったのに。

前回CTF Beginnerのcryptoもそうだけど、マイナス値の存在に気づきつつ惜しいことがあるな。

ただ、、cryptoか?これ。

[misc]Sandstorm

1st try

  • 立体視してみた。楽しいがうまく見れない。
    目が痛くなった。

2nd try

  • 立体視のサイトで練習を積んでから再度訪れた。無力感に襲われた。

3rd try

  • データがコメント領域に隠れている系かもしれないので、forensic系のお決まり解析と、バイナリ解析を一通り行ってみた。
    手応えがない。ただのpngのようだ。
  • なぜ可逆性のpngである必要があるのか。ドットのにじみすら許さないからではないか。ああ2枚あれば絶対に重ねて、何かが浮かび上がってくるのに・・・
    1枚だが、位置や向きをずらしながらあれこれ重ねてみた。途方に暮れた。

4th try

  • Mr.Smithのことを、ずっとマトリックスのエージェント・スミスだと思っていたが、アダムと名乗っているので、アダム・スミスなのかなと思い、落胆した。
    エージェント・スミスが好きなのだ。
  • 1粒1粒がエージェントに見えてきた。
  • stegano解析系のツールに見境なくかけてみた。クライアント環境が散らかった。

答え

画質を荒くするとQRコードが浮かんでくるようでした。かすりもしませんでしたね。

建設的な思考も全く発生していなかったようで恥ずかしいです。

[web]Option-Cmd-U

1st try

  • Ctrl+Uでソースコードが見れるんだなぁ、と学びがあった
  • Ctrl+Uに比べて優位性のないサービス性なので「ファイルを参照し表示できる」という機能の脆弱性をつけ、という意図しかないな、と理解
  • 誘導に従ってstackoverflowを見て、punycodeに対応した関数を取り込んだ作りになっていることは理解
  • 息子の頬をぷにぷにしておいた。ぷにコードだったから

2nd try

  • 日本語とか海外文字とか、全角文字をあれこれ入れて挙動を見たが、特に何もない。
    それはそうだ。それに対応した関数が入っているのだから。。。

3rd try

  • php-fpm idn_to_ascii valnurableとかで攻撃手法を検索してみたが、成果なし
  • http://localhost/flag.phpとか書いてみるも、成果なし。idn_to_ascii関係ないしな
  • 挙動が安定しないのは何なんだろうと疑問に。まあ不安定なだけだとして気にしないことに

答え

例えば「http://nginx/flag.php」でいいみたい。

完全には理解できていないが、全角スラッシュが半角として理解された上で、nginxというホスト名がローカルに向いている・・・?

[web]web_search

1st try

  • とりあえずページ遷移してみる。pageという変数があるようだ。増やしたりマイナスにしたりしたが面白くない。
  • なんとなく「TELNET RANDOMLY-LOSE Option」で検索してみた。
    「TELNETROMLY-LOSEOption」を検索したことになっている。なんだこれは。
    ああ、ANDが削られている、、、ということはORもだな。ビンゴ。
  • 作りとしては気持ち悪いが、このフィルタ処理によってインジェクション対策はされていると見たほうが良いな。だけど気持ち悪いということは、隙があるのだろう

2nd try

  • 記号にもフィルタ対象があるとわかった。SQLで使いそうなものばかり
  • シングルクォートを入れるとErrorになったり処理が継続できたり。SQL文をインジェクションできちゃっていることはわかった。あとはどんな文を作るかだ。フィルタされる中で・・・
  • 片っ端から入れてみるも、スペース除去の時点で厳しい
  • %xxで任意のアルファベットや記号を入れようと思ったが、一般的な文字はすぐデコードされて意味がない
  • punycodeの出番かと思ったが、そんな訳はなかった

3rd try

  • 一見問題のなさそうな文字列が、ANDやORを削ったばかりに攻撃的になるものがないか、考えてみた。そんなものは思いつかなかった
  • ANDやORを削った上で攻撃性を失っていないものが書けないものか・・・

答え

「oorr」→「or」のように、二重にかけるらしい!わー気づかなかったなぁ。簡単なことだった。

しかし、二段構えの構成でブラインドSQLインジェクションもいるとなると、聞いたことはあるが自分にはやはり手が出なかったな。

[web]fileserver

1st try

  • しばらく眺めた。CSSだけでこんなに動きのある表示ができるんだな・・と感心した
  • 5分毎にリブートするという記載がある。ブート時のみに発生する問題がある?
    運営には恐縮だが、通信量が非常に少ないことを見越し、定期的な再表示を行った。
    当然、たまにタイムアウトになるだけで、それ以上の何もなかった

2nd try

  • 時折、息抜きに眺めに来た。他の問題、画面上の動きがないしさ・・

答え

ディレクトリトラバーサル・・なるほど。適当にURLにファイル名入れるくらいかと思っていた。

コメント

タイトルとURLをコピーしました