node.jsを使ってみる[0]
最近、MicrosoftのBot Framework触り始めたり、LineのBot Apiに手を出そうとしたりします。
その中でNode.jsの名前がポツポツ出始め、ちょうどいい機会なので忘備録的にブログに纏めつつ勉強してみます。
ちなみに事前に持ってる知識としては
- サーバーサイドで動く
- モジュールで機能増やしたりできる
ぐらいです。
とりあえずまずはwikiから・・・
Node.js はイベント化された入出力を扱うUnix系プラットフォーム上の サーバーサイドJavaScript環境である
ふむ。
一万同時アクセス (C10K) 問題
ふむふむ。
・・・ん?
C10K問題ってなんだ?→ggってみる。
TheC10kProblem - 「C10K問題」(クライアント1万台問題)とは、ハードウェアの性能上は問題がなくても、あまりにもクライアントの数が多くなるとサーバがパンクする問題のこと
なるほど。同時にアクセスできる限界の話か。
でもなんでJavaScriptが有効なんだ?→ggってみる。
サーバサイドJavaScript Node.js入門 - それはBooks
JavaScriptはシングルスレッドだとようやく知ったのでメモ - コンパイラかく語りき
あーなるほど。
非同期処理+多重クライアント生成されないから処理が軽いのか。
しっかりとは理解できてないけどまぁこの辺は後々で大丈夫でしょう。
さて、まぁ実際に触り始めて見たいと思います。
Node.js自体は以前なんか使ったときに導入してるので今回は割愛します。
知りたい方はggるか
5分で終了。node.jsの環境構築が拍子抜けするほど簡単だったのでサンプルプログラム付きでまとめてみました【Mac編】
この辺とか参考にすればいいかと思います。
初めに一応、バージョン確認するとこんな感じ。結構前に入れて最新版では無い気がするので
Node.jsとnpmをアップデートする方法 – Rriver
この辺参考にアップデートしてみます。
と思ったけど・・・
どうやらWindowsには対応してないらしく撃沈しました。
とりあえずnpmだけアップデートしてNode.jsの方はそのうちやることにします。
さてさて、ここまで書いてやっと本題のNode.jsを使ってみるとこに行きたいと思います。
と思いましたが結構長くなってきた気がするので[0]ということで準備編にして、使い始めは次回からにします。
Bash on Ubuntu on Windowsでネットワーク系のコマンドを使う。
Bash on Ubuntu on Windows(以下BoW)、便利ですねー。
いちいちVM起動してubuntu起動しなくてもlinuxコマンドが使えるのはホント楽です。
ですが、SSH使おう!ping使おう!(いやまぁWindowsからでもいいんですが)と思って普通に起動しても
といった感じにエラー吐いてしまってpingすら使えません。
sudo掛けても同様ですし、
アプリとしてのBoW も同様です。
そこで、cmdそのものを管理者権限で実行し
BoWを起動すると・・・
といった感じに行けました!
調べてる感じ、あんまりこの方法書いてるブログとかは少ないので気づいてる人は少ないんでしょうかねー
まあ、といった感じで使えるので是非使ってみてくだし。
おわり。
CTF for beginners in tokyo 2016 write up
さて、日付が変わってしまい、なんとなく細かい事が薄れてってますが、覚えてる範囲でwrite upを書いていきたいと思います。
問題一覧と解けた問題はこんな感じ
さて、それじゃ解けた問題からwrite upを書いてきます。
Warmup
Welcome(10)
回答方法のサンプル。まぁいつも通り書いてあるの入れるだけ
Web
Fix it(100)
Webの演習でやったのとほぼおなじで開いたページのレスポンスヘッダにLocationかなんかでページが書いてあるからそれ踏んだら表示されるとかだったはず。
Can You login as admin?(200)
正直あんまり覚えてない・・・けど確かIDとパス打ち込むログイン画面があって、問題名どおりにadminでログインできればflagが出たはず。
演習と変わらないSQLi(a' or '1=1)やるだけで良かった気がする・・・かな?
1M4G3 V13W3R(200)
URLを開くとpngまたはjpgをアップロードするとアップロードした画像が表示できるページがあって、そこからflagを探せという問題だった。
画像表示部分が
[/web200-2/view.php?file=hogehoge.png or jpg]
というURLで表示するようになってたので、最初開いた際に表示されるページ
[/web200-2/index.php]
をディレクトリトラバーサル掛けて
[/web200-2/view.php?file=../index.php]
っていう形で表示してあげるとphpのソースが見えて、ソースの中にflagが書いてました。
一通り弄ってて最初は普通に画像アップして表示できたのに途中からなぜか表示できなくなって運営の方に相談とかしてた。
結果的に一回画像表示のURL踏んでれば解ける問題だったので運営の方々をお騒がせしてしまい、申し訳なかったなぁと思いました。
Login(300)
Can You login as admin?と同じような感じで、IDとパスを入力してログインするページがある。
けど今回はユーザ名の指定が無い上、演習レベルのSQLiとかは対策されてて、解らないようになってた。
まぁとりあえず適当に入力してログインを押すと、
[/web300/index.php?error=invalid_user.txt]
といった感じにerror~から始まるパラメータがついて、ID入力欄の上に
ユーザー名かパスワードが間違っています。
とメッセージが表示されるのでここから想定するとログインに失敗した時はinvalid_user.txtの中身を表示してるのだろうと想定できた。
んで、index.phpのソース見るとどうやら入力した情報をlogin.phpに投げてるようなので
[/web300/index.php?error=../login.php]
とディレクトリトラバーサルを掛けてあげてソース見ると
<!--?php error_reporting(0); function err($file) { header('Location: http://' . $_SERVER["HTTP_HOST"] . dirname($_SERVER["REQUEST_URI"]) . '/index.php?error=' . $file); exit; } if (!isset($_POST['username']) || !isset($_POST['password'])) { err('null.txt'); } $username = $_POST['username']; $password = $_POST['password']; $db = new SQLite3('./123b1e28f3cb6d62ab1aa47d1e0e787b.sqlite'); $sql = "SELECT username, password FROM users WHERE username = ('{$username}') AND password = ('{$password}');"; $result = $db--->
って感じにコメントアウトされてるphpのソースが見えて、これを見る感じ、アカウントのdbとして
123b1e28f3cb6d62ab1aa47d1e0e787b.sqlite
を参照してるようなので
[/web300/index.php?error=../123b1e28f3cb6d62ab1aa47d1e0e787b.sqlite]
として、もう一回ディレクトリトラバーサルをかけると
SQLite format 3@ -� ��GotableusersusersCREATE TABLE users (username text, password text) ��(Madmin197d99cc36a89a55c2508d87a5979bbd
という感じにdbの中身がなんとなく見えるので2行目の内容から判断して
ID:admin Pass:197d99cc36a89a55c2508d87a5979bbd
を入力してログイン成功からのflag入手できた。
ただ、作問者の意図的にはphpのソースからSQLiのエスケープ方法をみて、合わせて欲しかったようなのでそっちのほうがいいかも。
Forensics
Find Key1(100)
pcapファイルが渡されるのでWireSharkで追跡→TCPストリーム開いて、ストリームの番号を押してったら14番だけbodyタグの中のflagに中身があったのでそれ入れておわり!
Find Key2(200)
1と同じくpcapファイルが渡されるので、これまた同じくWireSharkで追跡・・・するまでもなく、No.8とNo.28でGETでtransfer.zipを取ってくるのに成功しているようなので、
メニューバーからファイル→オブジェクトをエクスポート→HTTPを開くとtransfer.zipをエクスポートできるの保存。
transfer.zipの中に2.pcapファイルがあるので、それをまたまたWireSharkで開くとFTPで何やらやり取りしてるのが見えるので追跡→TCPストリームするとどうやらFTPでsecret.zipを落としてるみたいなので、
ストリームの2を開いて見るとPKから始まるzipのバイナリデータをASCII化したものが見えるので、これをzipとして復元します。
WireSharkでは初期設定だとASCIIで表示するようになってるので、ウィンドウの下のリストからRawで復元を選択して上げるとバイナリデータになるので、これをSave as...からsecret.zipとかとして保存してあげればzipの中にflag.pngがあるので、そこに書いてあるflag入力して終了です。
Binary
Plain(100)
感想で書いたとおり、rev、binary問は大苦手なのでとりあえずstrings掛けたらフラグがあった。おわり。
とりあえず解けた問題の解説的にはこんなもんです。
こっからは解けなかったけど終わってから聞いて解った問題とか。ただしBinaryに関しては全く解らんというかこれから見直すので解説無しです。
Misc
CountUp Game(200)
1,2,3のいずれかの数字をお互いに言い合い、相手が言った数字+自分の選んだ数字を繰り返して21を踏んだほうが負けというゲームで勝てという問題。
内容的にはncコマンドでサーバーと接続すると向こうが選んだ一つ目の数字が表示されるので、こちらがその数字からいくつ増やすかを入力して送信。すると向こうが同じく・・・ といった感じで進みました。
正直解いてるときは全く解らなかった(´・ω・`)
でも終わってから改めて考えると、このタイプのゲームって(踏んではいけない数(今回は21)-1)=20 から (一度に言える数の最大数(今回は3)+1)=4 を0<答えの間、繰り返し引いていって出た最後の数字(今回だと4)が最大数+1(今回だと4)と同じだった場合、後手が勝ち、それ意外だった場合は先手が勝てるゲームで、
今回は後手で数字も決まってるので絶対に勝てるやつで簡単でしたね・・・めんどくさがらずにちゃんとやるべきだったなと後悔
今回の例だと 踏んではいけない数=21 21-1=20 一度に言える最大数=3 3+1=4 20-4=16 16-4=12 12-4=8 8-4=4 よって最後の数字=4 最後の数字=4,最大数+1=4 よって後手が勝つ
てけいさん for ビギナーズ(200)
これは普通にゴリ押しで解いた人が多かったのかなぁ。という印象。 設問者の方が言ってたPythonでDOM取って計算させてPOSTで投げるのは解ってたし技術的には似たようなことをやったことがあるので、正直やろうと思えばできたけど結構前にやったからモジュール名を覚えてなかったのと使い方をすぐに思い出せる自身がなくて解くのを放置してたら忘れててギリギリになって思い出してゴリ押しでやろうとしたけどタイプミスして1問目からやり直しになって吹っ飛んで死にました。 悲しみ。
とりあえず覚えてる限りだとこんな感じです。
CTFの感想としてはホント、時間かかってもとりあえず取れるところから取ってくべき。めんどくさがったら負け!なのかな。と思いました。
まぁでもホント、最近色々あってだいぶ気が死んでたけど、やる気がおきるいいきっかけになったので良かったです。
運営の方々、協賛企業の方々。本当にありがとうございました!
追記 2016/10/24 下書きになってて公開できてなかったorz
CTF for beginners in tokyo 2016 Impressions
ってなわけで自己紹介除いた最初のブログ。
2016/10/22(土)に行われたctf4b 東京に運良く当選したので行ってきました。
講座の感想としては
Web
正直に言うと知ってる内容が大半だったかな。と(いやまぁctf4bだからね
ただ、ディレクトリトラバーサルに関しては、
Webアプリの脆弱性に入る前のヘッダ見た段階でApache使ってるのは気づけたけど、
普段使ってるWindows用のApache基準で考えちゃったせいで、今回使われてたラズパイ鯖で動いてるRaspbianのApache2だと構造が違うことに気づけず、
結果的に演習用のindex.phpしか取れなくて、面白いもの取れなかったからもっと視野を広げて覚えるべきだなぁと思った。
あとは単純に勘違いでずーっと.htaccess取ろうと必死になってた(謎
SQLiに関してはもともと苦手だったし、普段チームでctfやるときは強いやつが居るから任せてるから、基礎だけできればいいかなぁと思ったら
演習でも基礎しかやらず、それどころか単純に演習ページの入力欄まっさらでも全部表示されたからちょっと悲しかった(´・ω・`)
Forensics
パケット眺めてあれこれいじってflag出す簡単なお仕事。
演習1のBase64とURLエンコードは普段、適当なWebサービス
kujirahand.com
とか
urlencode.net
とか使ってて、普段shellでとか全然やらないから今回もテザリングに切り替えてやった。一々切り替えるのがちょっとめんどかった。
統計は初めて知ったけど正直
wiresharkは個人的にはプロトコルとか統計から追うよりもTCPストリーム追ってそれっぽいの探したほうが早いイメージ、量にもよるんだろうけど #ctf4b
— koba@WhiteCat (@_wh1tecat) 2016年10月22日
と思ってこんなツイートしてた。
まぁダミーとかギッシリの嫌がらせがしてあるやつとかだったらものすごい便利なんだろうなとは思った。覚えとく。
演習3はbinwalk使うのは直ぐ解ったけど、運営から配布されたlinuxだとVmware Toolsが使えなくてファイルのD&Dが出来ず、
面倒だったからBash on Ubuntu on Windowsでやってみたら何故か処理くっそ遅くて詰みかけた。
まぁ先にやったstringsコマンドでflag出てたんで本番だったらflag取れてたんですけどね。
Reversing
概念とか仕組みは理解できてるけどこれまでいろんな先人様方に上達する方法を聞いてきて、ひたすら読んで考えて数を積むしか無いと言われて挫折しかけて、
SQLiと同じでチームに強いやつがいるからctfではぶん投げてたけど、常設型とかで出てきても全然解けてなかったから
そろそろ本腰入れたいなぁ。と思ってたから凄いちょうどいい機会だった。
そして解った。
俺は普段、割りとマイルールを作ってその通りに動きたい!ってタイプなんだが、ガッツリそれが出た。
演習のアセンブリは16進数表記だからメモも16進数にして・・・解りづれえ・・・ ってか解説スライド10進数にしてる・・・でもなんか10進数で書きたくない・・・ あああー・・・
ってなりながらやってたせいで、マイルール捨てれば演習が切り替える前に余裕で終わってただろうに演習3あたりで追いつかなくなってた。
ちなみに実際にとってたメモを少し貼ると
Q.3 mov [ebp-0x4]<-eax{0} mov eax{0}<-[ebp-0x4]{0} sub eax{0}-0x1 = -1(10) mov [ebp-0x8]<-eax{-1(10)} mov eax{-1(10)}<-[ebp-0x8]{-1(10)} lea edx<-[eax+0x3]{-1(10)+0x3 = 0x2} mov eax{-1(10)}<-[ebp-0x4]{0} imul eax{0}*edx{0x2} = 0x2 mov [ebp-0x8]{-1(10)}<-eax{0x0} A.[ebp-0x8]=0x0(16) 0(10)
っていう感じにどこに何が入るのか一々とって、中の数字を最初は()でくくってたけど、-とかついたら16進数にするの面倒だし、
演習のスライドでは答え10進数になってるから解りやすいように{}でくくるのに直して、
10進数で表記した場合は後ろに(10)ってつけることで表したりとかしてた。
見直してみてもめんどくさいなぁ・・・ でもやっぱ見直しても解りやすいんだよなぁ・・・
ってなわけで本腰入れて始めるためにはもっと楽だけど解りやすいマイルール作ってからやるべきだなと思った。
まぁでもそれを知れただけでもとてもいい機会だったと思う。
本当はこの記事で感想とwriteupまとめて書く予定だったけど予想以上に長くなってしまったので分けて書こうと思います。
Hello World.
どうもはじめまして。WhiteCatあるいはWh1teCatと申します。
ブログ名は僕の好きな言語のPythonでHello Worldを表示させるときのプログラムから取りました。
このブログでは
- 面白いと思ったり、新しく手に入れたり、こんなの欲しい!というガジェットのこと。
- プログラミングとか、フレームワークについてとか、ITの技術的なこと。
- 脆弱性とか、脆弱性対策とか、セキュリティのこと
- 加えて、CTFのこと。
とか書いていけたらな- と思ってます。
よろしくお願いします。
追記
ちなみにMarkdown大好きなんでMarkdown記法で書いてます。(でもatom君とちょっと挙動が違くて戸惑った・・・
ここ
seeku.hateblo.jp
参考にしました。