Jump to content
Nytro

RSTCon #1 - CTF write-ups

Recommended Posts

Posted

Motorul de cautare pentru vulnerabilitati

Autor: 0x435446

 

Summary


Folosirea unui token jwt vulnerabil din cauza secretului.


Proof of Solving


Prima data am incercat pe acel search-bar de pe prima pagina cateva tipuri de atac, pentru a verifica daca site-ul este vulnerabil. De aici am cautat sa verific daca este ceva in cookie-uri sau robots.txt, dar tot nimc, insa am gasit un token pus pe hidden in sursa paginii.
L-am luat, l-am decodificat base64 ca sa pot vedea continutul si am vazut asta:

 

ctf1.thumb.png.bcc50a1fbfc2a198932a37de9ec33c0a.png

 

image.png.dfd42583fbc6b44a4f35b8be76a58f7d.png

 

De aici am luat token-ul, i-am scos hash-ul cu jwt2john si i-am facut bruteforce la secret cu john.

 

image.thumb.png.686c6d3a0d023fffd94d052adfc26641.png

 

image.png.28a46f7fcb43c28e060eab040baf7ebb.png

 

Acum am mai avut doar de craftat un token care sa aiba setat “canSearch” pe “yes”.
M-am folosit de jwt.io pentru asta.

 

image.thumb.png.a3fee55d33a5ee5f7b368d6135979266.png

 

Dupa ce l-am craftat am interceptat un request catre site in care am pus “flag” in search-bar, am inlocuit token-ul cu cel generat si am scos flag-ul.

 

image.thumb.png.cd5412eb155749e5c2d34f3c01f2c795.png

 

 

  • Upvote 2
Posted

Interviul

Autor: 0x435446

 

Summary


DNS Records


Proof of Solving


Cand am citit prima data descrierea challenge-ului, am crezut ca trebuie sa caut recursiv prin toate paginile de pe rstcon.com si flag-ul se va gasi pe undeva printr-un comentariu, dar aparent nu era asa. Dupa ce m-am gandit putin am incercat sa verific DNS Records. Am intrat pe https://www.digwebinterface.com, am pus site-ul in textbox, am dat pe ANY Records si am gasit flag-ul in cele TXT.

 

image.thumb.png.ac5279874f8379f6f48acd867cb2620b.png

 

 

  • Upvote 1
Posted

Mesajul de pe retea - I

Autor: 0x435446

 

Summary


Am primit un mesaj codificat.


Proof of Solving


De cand am vazut padding-ul de la base64 am incercat sa vad daca as putea decodifica mesajul cu aceasta metoda. Dupa decodificare am primit in mesaj ce parea scris de la dreapta la stanga, asa ca am facut un rev() pe el si a iesit cam asa:
Uvorxrgzir! Uozt-fo vhgv IHG{15vu7619v4wy40u47yv08v2v8x263vx2u688464y62598x713x1y68v0240uvwxv}.

 

image.thumb.png.bb2a7c65314a7f7ce3d1deffb75d3e8d.png

 

De aici am incercat diferite metode de criptare pe care se paote face usor bruteforce si am gasit ca este criptat folosind affine.

 

image.png.23224a9c683f54a51c68a82efe1818e9.png

 

 

  • Upvote 1
Posted

Mesajul de pe retea - II

Autor: 0x435446

 

Summary


Asemanator cu Mesajul de pe retea – I, am primit un mesaj encodat.


Proof of Solving


Pentru inceput am incercat sa trec mesajul prin base32, base58, base62 si base64, dar fara succes. De aici m-am gandit sa fac acelasi lucru, dar facut un rev() peste textul initial; tot nimic.
Am mai stat putin sa ma gandesc si am incercat caesar peste text, iar la ROT 13 am reusit sa scot un text in clar, folosind base32 peste.
Textul avea un padding la inceput, deci am dedus ca este scris de la dreapta la stanga. Am facut un rev() pe el si arata a text encodat cu base64. L-am decodificat si mi-a dat de brainfuck (literalmente ) ).

 

image.thumb.png.852b7417df0746a1057ea5e3e172c7f2.png

 

image.thumb.png.49675c633ac6444fa2f82b1cccc6fe32.png

 

image.thumb.png.ad3160a03cddabe0631beecf517b3bc7.png

 

Am luat codul, l-am bagat intr-un interpretor de brainfuck si am scos flag-ul.

 

image.png.8de7bceedcf36ce7641a5af9fc49c115.png

 

  • Upvote 2
Posted (edited)

Mesajul de pe retea - III

 

Challenge-ul începe cu un fișier zip. Acesta conține un singur fișier .txt, dar este protejat cu o parola din nefericire.

 

Prima tentativă a fost un atac hashcat asupra parolei, dar acesta s-a dovedit ineficient. Ca atare sa ne îndreptăm atenția spre structura și fi conținutul fișierului zip (https://en.wikipedia.org/wiki/ZIP_(file_format)#Central_directory_file_header ca referință a formatului unui fișier zip).

 

În descrierea challenge-ului suntem informați că nu vom descoperi flag-ul, ci vom descoperi o serie de bytes, a căror sumă sha256 constituie flag-ul.

De asemenea, din analiza fișierului zip, putem observa că fișierul txt din interior conține doar 5 bytes, (cel mai probabil) insuficient pentru a conține un set de instrucțiuni. Ca atare putem presupune că acest fișier conține sursa hash-ului.

Pe lângă dimensiunea fișierului txt, avem si suma crc32 a fișierului, înainte de compresie.

 

Pornind de la unele premise putem scrie un mic script care sa execute un atac bruteforce asupra conținutului fișierului/sumei crc32:

  Reveal hidden contents

 

Edited by u0m3
  • Like 1
  • Upvote 3
Posted

Mesajul de pe retea - IV

 

Challenge-ul începe cu un fișier text, ce conține o listă de prăjituri/dulciuri/deserturi. Sincer, aici am avut foarte mult noroc, deoarece după ceva vreme de holbat la conținutul fișierului, mi-am adus aminte că am citit undeva, în urmă cu mai bine de un an, despre un proiect de stenografie ce permitea exfiltrarea datelor sub forma unui tabel cu scoruri de meciuri dintre echipe... sau așa îmi aminteam eu.

 

După o scurtă sesiune de „Google”, am găsit repozitory-ul proiectului: https://github.com/TryCatchHCF/Cloakify/. Fiindu-mi prea lene să îl instalez în adevăratul sens al cuvântului, am copiat ce am avut nevoie într-un script propriu, et voila:

  Reveal hidden contents

 

  • Like 1
  • Upvote 3
Posted (edited)

The Encryptor

 

Challenge-ul începe cu 2 fișiere: un executabil TheEncryptor.exe și un fișier binar encrypted.bin.

 

Am început prin a rula executabilul, dintr-o consolă PowerShell, pentru a observa ce output generează.

PS D:\tmp\ctf_rstcon_2020\reversing\the_encryptor> .\TheEncryptor.exe
Enter a filename as an argument!
PS D:\tmp\ctf_rstcon_2020\reversing\the_encryptor> .\TheEncryptor.exe .\dummy.txt
TheEncryptor will begin encripting the file to "encrypted.bin"...
Key generated: 2020-11-27-05
The source plaintext file, .\dummy.txt, is open.
The destination file, encrypted.bin, is open.
A cryptographic provider has been acquired.
An md5 hash object has been created.
The password has been added to the hash.
An encryption key is derived from the password hash.
Memory has been allocated for the buffer.
File encrypted successfully!
PS D:\tmp\ctf_rstcon_2020\reversing\the_encryptor>

Observații:

  1. necesită un parametru - o cale către un fișier ce urmează a fi cryptat.
  2. întotdeauna scrie în fișierul encrypted.bin - ceea ce poate fi o problemă
  3. Pare să folosească o parolă bazată pe data curentă (YYYY-MM-DD-dayofweek); aceasta este „trecută” prin MD5, iar din acest hash este derivată cheia de criptare

A urmat o perioada de analiză în x64dbg și Ghidra. Aici am pierdut o grămadă de vreme datorită unui comportament ciudat: dacă input-ul (conținutul fișierului de intrare) este un singur caracter, output-ul este de de 129 bytes. Dacă are cineva idee de ce...

Metodologia mea de testare

  Reveal hidden contents
  Reveal hidden contents
  Reveal hidden contents

 

De asemenea nu a ajutat cu nimic că în timpul testelor am uitat să salvez după ce am modificat conținutul fișierului dummy.txt.

 

În ciuda acestor greșeli, am determinat parametrii apelurilor către funcțiile criptografice ca fiind:

CryptAcquireContextA ( &hProvider, NULL, MS_ENHANCED_PROV /* = "Microsoft Enhanced Cryptographic Provider v1.0" */, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_NEWKEYSET );
CryptCreateHash ( hProvider, CALG_MD5, NULL, 0, &hHash );
CryptHashData ( hHash, &bData, dwDataLen, 0 );
CryptDeriveKey ( hProvider, CALG_RC4, hHash, 0x00800000 /* keyLen<<16 | dwFlags = 128 << 16 | 0 */, &hKey );
CryptEncrypt ( hKey, NULL, TRUE, 0, &bData, &dwDataLen, 1008 )

 

De aici avem aproape toate datele necesare pentru a decripta fișierul. Mai puțin parola.

Așa că am scris un mic script python pentru a face bruteforce.

  Reveal hidden contents

 

Edited by u0m3
More info
  • Upvote 4
  • Moderators
Posted

Platforma Intranet

 

In momentul in care accesam pagina challenge-ului, vedem in footer ca putem folosi credentialele guest:guest. Dupa ce ne-am logat in platforma, avem in sidebar optiunea “Administrare”. Accesand pagina, primim urmatorul mesaj de eroare

 

SC582_F1o3Bb9BFl7XR2mDyqSF9_pKDN3x_h71J8bKMMaRPr1GgSrtv68nLbAvE3o4B22IkeZJngsg-cFeB2siIp6FfXvep4JVpnzxirHIj79U3hq_w2v9lRdNMEyZ3LnpvQYhw1

 

Mergand inapoi la pagina de acasa, vedem cateva informatii despre ultimele update-uri.

 

H5nHxEIBb45s7-SLl9CI0BLWb0hWm5tNSOmz_rlUb0lep58fHykmBS0_IkPpkDBcTV3CIYSv0GFltgvd0CySo0OA290mAKAaOTaXe-v8EPf6f1u4nmSQaR4vU6w0OJKp3gVwhewv

 

Ceea ce ne intereseaza este urmatoarea parte:

 

- created a new logic that would verify the JWTs automatically using the following steps:

- verifies the JWT structure

- checks for the algorithm to be exactly RS256

- checks IAT and EXP claims to that JWT is in proper boundaries

- takes the signing keys (n and e) based on the issuer present in JWT

- verifies the signature based on the signing keys received

 

Pe scurt, JWT-ul este verificat in functie de issuer-ul prezent in token. 

Dupa o delogare, deschidem Network tab si urmarim request-urile trimise pentru login. Vom vedea ca aplicatia foloseste implicit flow pentru a cere un access token care este trimis pe login.php.

 

LCxrtdV9Uz_AINELqKI1NdTo1RTXT_qtkauCFao_Eev-zgxfu2Rt7eq06rSl_fPpO5KZnXWcMHzsWSZJMFCw6QaDJa2w-EKYl5MMJc5TphNtmnZBPNOOccBc5xoC4JgeftX6wNZv

 

Pentru a simula acelasi request, am creat un tenant similar pe care il utilizeaza si aplicatia si folosit un request identic pentru a genera urmatorul JWT care are userul asteptat de aplicatie:

 

eyJraWQiOiJ4VWhFTzFzYVhqSTJaM2M3a08tZ3hTMjlfQWtNa202QlNsNXRXY1pPbmVzIiwiYWxnIjoiUlMyNTYifQ.eyJ2ZXIiOjEsImp0aSI6IkFULll6d1JYaG0wQVNHQWRtVmxBanFZcHlfWjJOank5MXhOUTJHUU4wMktrN0kiLCJpc3MiOiJodHRwczovL2RyYWdvcy5va3RhLmNvbS9vYXV0aDIvZGVmYXVsdCIsImF1ZCI6ImFwaTovL2RlZmF1bHQiLCJpYXQiOjE2MDYxMjYzNjYsImV4cCI6MTYwNjEyNjY2NiwiY2lkIjoiMG9hMmZhdHg3MEpHaVUyVEEycDciLCJ1aWQiOiIwMHVvemJnYzAzd3pxb2FYcDJwNiIsInNjcCI6WyJvcGVuaWQiLCJlbWFpbCJdLCJzdWIiOiJpdEBhd2Vzb21lY29tcGFueS5jb20ifQ.IkdKksUZvOJeyKpCY2obaOQbTSri7PQ0460YF0qgl8lWy_Pv2HzDx2-tj_w626TJfeSlwe6AzEK6WFtSfMeOY8qTMK5bp0uv9nZ0HAooxyGoXD2NQFZdXtTjGhtwjGFhB6ay1RN9iYd70dZCRbS21OHM6ExT75dyeZk9oPZ7g9D8JwtnC6xz4-Se2A0KQ7lL6TRNePuu0pkcXIuuz4bQpWc-KfW-TEVLzWkFK4f9mKxglAZY6SyXfxtsr1gm4qATjAmlFdJiwqx1Ts7-i-dcT29ypOYQKDnMXiGU1f_Aidy3BvPqDWJAW1muezEbGk1hOFYth1zrZKOv3I5IQ3DDGg

 

Dupa ce am injectat token-ul pe login.php, platforma ne conecteaza cu succes. Navigand in pagina Administrare, vedem ca suntem conectati cu userul it@awesomecompany.com. Uitandu-ne in sursa paginii, gasim si flag-ul.

 

edU3Exng7XGFGvjb5Y5y_HxHrGs7o35A2JrctfavuHBoQWiW_snugTQ-G_nNfwZpbvhaOptzfZ_MpxQsRoxkE3o8heD136L86PKD20sw1FJfXSnSHG1OUORU3OAnDWJ9hNaMUQaE

 

  • Upvote 3
  • Moderators
Posted

Liftul

 

Challenge-ul ne ofera trei seturi de numere binare care pot fi scrise unul sub altul, in forma urmatoare:

 

1010101001101010

0110110010101001

0000100000101000

 

Fiind trei randuri si un numar par de cifre pe fiecare rand, putem incerca sa vedem daca textul este Braille. Folosind tabelul urmator

 

9YnyzxYYK0cUEsu52O1AEiZyI0eHXKO13PfzRSq3UC8eErpt_LGQrpr22ReEkJyyQrYjGwujyokg_GdNYScdACy6KV4s1fBBsqdLaizTcVIB4zFEfSI1B_gKzpZ5xZuYpsZsWlO_

 

si separand numerele in grupuri de cate 2 cifre si trei randuri, ajungem la rezultatul urmator:

 

10 10 10 10 01 10 10 10

01 10 11 00 10 10 10 01

00 00 10 00 00 10 10 00

  e   b   r   a    i    l    l    e

 

Urmarind nota din descrierea challenge-ului, codam textul “ebraille” in SHA256 si adaugam RST{ si }, obtinand flag-ul RST{5bf2896f28f6fe0d66d5e52e3d239de5a86252e8cbf027bb911b3bb84a683282}.

  • Upvote 2
  • Moderators
Posted

Ceainicul

In momentul in care accesam URL-ul challenge-ului, primim un JSON cu un mesaj de eroare:

 

[dragos@localhost ~]$ curl --location --request GET 'http://vps-f9a499e6.vps.ovh.net/'
{"raspuns":400,"mesaj":"Alegeti optiunile corecte pentru cafea."}

 

Dupa ce schimbam verb-ul in OPTIONS, primim un nou mesaj:

 

[dragos@localhost ~]$ curl --location --request OPTIONS 'http://vps-f9a499e6.vps.ovh.net/'
{"raspuns":418,"mesaj":"Eu sunt un ceainic. Tu esti un ceainic?"}

 

Una din cele mai simple modalitati pentru a trimite identitatea clientului este prin header-ul User-Agent, asa ca il adaugam la request si primim un nou mesaj:

 

[dragos@localhost ~]$ curl --location --request OPTIONS 'http://vps-f9a499e6.vps.ovh.net/' --header 'User-Agent: ceainic'
{"raspuns":400,"mesaj":"Nu ai adaugat corect ingredientul pentru cafea sau l-ai adaugat incorect. Foloseste Accept pentru a-l adauga."}

 

Adaugam header-ul Accept la request si primim un alt mesaj:

 

[dragos@localhost ~]$ curl --location --request OPTIONS 'http://vps-f9a499e6.vps.ovh.net/' --header 'User-Agent: ceainic' --header 'Accept: e'
{"raspuns":200,"mesaj":"Esti aproape, literele introduse sunt in ingredient."}

 

Dupa diferite incercari, gasim flag-ul corect:

 

[dragos@localhost ~]$ curl --location --request OPTIONS 'http://vps-f9a499e6.vps.ovh.net/' --header 'User-Agent: ceainic' --header 'Accept: RST{eeff5afef66df62b9aac370c3f3b9b7c16e7e3c809297092b461b5718497f077}'
{"raspuns":201,"mesaj":"Cafeaua este gata."}

 

  • Upvote 2
  • Moderators
Posted

Aresty File Uploader

Analizand sursa HTML a paginii, vedem ca formularul de incarcare al fisierului nu contine enctype="multipart/form-data", asa ca renuntam la ideea de a incarca un fisier pe server.

Challenge-ul presupune accesarea fisierului “flag.php”, asa ca putem incerca un LFI clasic file://flag.php care ne va da flag-ul:

 

JSo2z2xucknEw6XRoAEkBrlRyIdfEl1iGR8gzs0ySdRwc5FIb5p9yVijaIPHCrh1pWXpJYo5QG_dCd2UT4LvhwuKm33d9UAraHA3AybjjRvh8WHqywQULKkQBh3TvlwLdfhTuwc7

  • Upvote 2

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...