Français [EKOPARTY PRE-CTF 2015] [Web50 – Hacker’s Market] Write Up

Description

Hacker’s market site is not ready but you can send us some comments!

Resolution

Nous voilà devant un mignon petit site, avec des URLs toutes aussi mignonnes.

Au 1er clic sur l’un des liens du site, on peut apercevoir dans notre barre d’adresse des paramètres intéressants : « index.php?p=pages/login.tpl ».

Ici on pense tout de suite à une faille include, on modifie le paramètre « p » pour y mettre « login.php ».

Cela fonctionne du premier coup, nous récupérons le code source de la page de login, cela veut aussi dire que ce n’était pas un include mais plutôt un file_get_contents(), sinon le code aurait été exécuté au lieu d’être affiché.

<?php
// NULL Code Obfuscator
// www.null-life.com
include 'encoder.php';

error_reporting(0);

$code =
'm2lSp9NqH/+GdlqrrV893KZUVeqfbhvj1VJbr9QpUq6XYgL7iydW0KJAIdupKALugXwF4IBrVdLbJlL0+C9Sr9IrF+KTZh6vzy9W0KJAIdupKBfik2YeqK80eK/SL1Krgm4B/NIvT6/WUCLAoVspqIJuAfyFYADr1VJJhfgvUq/SIF2vuy8R7pwvHOCGLxbmgWwe4IFqUvuaalL9l24er5lqC6+Te1L7mmYBr59gH+qce3iv0i9SoN0vVuSXdlKy0igA7pxrHeKtfxr/rWAQ6Yd8Ee6GZh3h1TR4r9IvUquZaguvzy9VqMkFUq/SLxvp0idW6p9uG+PSMk+y0igT659mHM+abhHkl30f7oBkF/vcYBzmnWFVr9QpUquCbgH80jJPstIoE+ufZhyo2y8JhdIvUq/SL1Kvl2wa4NIoTuubeVLsnm4B/M8tE+OXfQavk2MX/YYiAfqRbBf8gS1S/Z1jF7LQbh7qgHtQsc58Bv2dYRWxhWoe49JrHeGXLk6ggXsA4JxoTK+3RD301S9cr9ZkF/bSIVKojzNd65t5TKjJBVKv0i8Pr5djAerSdHiv0i9Sr9IvUuqRZx2v1TMW5oQvEeOTfAGy0G4e6oB7Uu6eagD732sT4ZVqAK3SfR3jlzJQ7p5qAPvQMU78hn0d4ZUxPefSfBzugi5OoIF7AOCcaEyvpX0d4ZUvEf2XaxfhhmYT44EzXeubeUyoyQVSr9IvD4WPLxfjgWpS9PgvUq/SZxfulmoAp9VDHeyTexvgnDVS5pxrF/fcfxr/1SZJhY8=';

$base = "\x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65";
eval(NULLphp\getcode(basename(__FILE__), $base($code)));

?>

On peut voir que le fichier est encodé. Voyons voir la tête de la classe d’encodage en la récupérant de la même manière que la page de login :

<?php

namespace NULLphp;

$seed = 13;
function rand() {
    global $seed;

    return ($seed = ($seed * 127 + 257) % 256);
}

function srand($init) {
    global $seed;

    $seed = $init;
}

function generateseed($string) {
    $output = 0;

    for ($i = 0; $i < strlen($string); $i++) {
        $output += ord($string[$i]);
    }

    return $output;
}

function getcode($filename, $code) {
    srand(generateseed($filename));

    $result = '';
    for ($i = 0; $i < strlen($code); $i++) {
        $result .= chr(ord($code[$i]) ^ rand());
    }

    return $result;
}
?>

Le fichier a été encodé avec un code qui xor chacun de ses caractères sur un rand() dont la seed est calculée en fonction du nom du fichier.
Rien de bien exotique ici, il suffit de connaitre le nom du fichier qu’on veut décoder pour le récupérer en clair, sans autre modification.

Pour voir le code de la page, on remplace le eval par un echo, et on décode le tout avec :

<?php
$code =
'm2lSp9NqH/+GdlqrrV893KZUVeqfbhvj1VJbr9QpUq6XYgL7iydW0KJAIdupKALugXwF4IBrVdLbJlL0+C9Sr9IrF+KTZh6vzy9W0KJAIdupKBfik2YeqK80eK/SL1Krgm4B/NIvT6/WUCLAoVspqIJuAfyFYADr1VJJhfgvUq/SIF2vuy8R7pwvHOCGLxbmgWwe4IFqUvuaalL9l24er5lqC6+Te1L7mmYBr59gH+qce3iv0i9SoN0vVuSXdlKy0igA7pxrHeKtfxr/rWAQ6Yd8Ee6GZh3h1TR4r9IvUquZaguvzy9VqMkFUq/SLxvp0idW6p9uG+PSMk+y0igT659mHM+abhHkl30f7oBkF/vcYBzmnWFVr9QpUquCbgH80jJPstIoE+ufZhyo2y8JhdIvUq/SL1Kvl2wa4NIoTuubeVLsnm4B/M8tE+OXfQavk2MX/YYiAfqRbBf8gS1S/Z1jF7LQbh7qgHtQsc58Bv2dYRWxhWoe49JrHeGXLk6ggXsA4JxoTK+3RD301S9cr9ZkF/bSIVKojzNd65t5TKjJBVKv0i8Pr5djAerSdHiv0i9Sr9IvUuqRZx2v1TMW5oQvEeOTfAGy0G4e6oB7Uu6eagD732sT4ZVqAK3SfR3jlzJQ7p5qAPvQMU78hn0d4ZUxPefSfBzugi5OoIF7AOCcaEyvpX0d4ZUvEf2XaxfhhmYT44EzXeubeUyoyQVSr9IvD4WPLxfjgWpS9PgvUq/SZxfulmoAp9VDHeyTexvgnDVS5pxrF/fcfxr/1SZJhY8=';

$base = "\x62\x61\x73\x65\x36\x34\x5f\x64\x65\x63\x6f\x64\x65"; // base64_decode
echo(NULLphp\getcode('login.php', $base($code)));

Ce qui nous donne la page en clair :

<?php
if (!empty($_POST['email']) && !empty($_POST['password'])) {
  $email = $_POST['email'];
  $pass = $_POST['password'];
  // I can not disclose the real key at this moment
  // $key = 'random_php_obfuscation'; $key = '';
  if ($email === 'admin@hackermarket.onion' && $pass === 'admin') {
    echo 'well done! EKO{' . $key . '}';
  }
  else {
    echo 'Oh snap! Wrong credentials';
  }
}
else {
  header('Location: index.php');
}
?>

Le flag est en clair dans un commentaire \o/ !

Le flag est : EKO{random_php_obfuscation}

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *