Jump to content
Nytro

RSTCon #1 - CTF write-ups

Recommended Posts

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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:

Spoiler


#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# "inspired" by https://ctf-wiki.github.io/ctf-wiki/misc/archive/zip/
import binascii
import base64
import string
import itertools
import struct
import datetime
import hashlib

alph = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/='

lasttime = datetime.datetime.today()
# stim ca fisierul arhivat are 5 bytes ca atare generam toate
# aranjamentele de 5 elemente din alph, apoi calculam crc32
# si il comparam cu crc32 al fisierului din zip.
for x in itertools.product(list(alph), repeat=5):
    s = ''.join(x)
    st = s.encode()
    testcrc = binascii.crc32(st)
    if testcrc == 0x4659057E:   # luat manual din file.zip
        print(f'String is "{s}"')
        break    # am presupus ca nu avem de aface cu hash collision
    if datetime.datetime.today() >= datetime.timedelta(seconds=10) + lasttime:
        print(f'crc32("{s}") = {testcrc:#010x}')
        lasttime = datetime.datetime.today()
m = hashlib.sha256()
m.update(st)    # st = b'sarma'
print(f'RST{{{m.hexdigest()}}}')
# RST{71b0ec104b58dd251893f35aec5e528e8908af48c4409ce2edaac7f8e0d75de3}

 

 

Edited by u0m3
  • Like 1
  • Upvote 3
Link to comment
Share on other sites

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:

Spoiler

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# "inspired" by https://github.com/TryCatchHCF/Cloakify/blob/master/decloakify.py
import base64

array64 = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/+=")
wl = """
honey
jelly
lollipop
spumoni
milkshake
shortcake
souffle
flower
fondant
crunch
pineapple
marionberry
lime
pudding
sugar
caramel
granita
zest
brittle
liquer
bun
toffee
ginger
custard
cookie
sucker
pistachio
meringue
eggs
peach
buttermilk
turnover
biscuits
turtle
puffs
doughnut
apricot
nutmeg
gingerbread
cherry
truffle
turnovers
licorice
mousse
muffins
raspberry
sorbet
streusel
candy
torte
syrup
terrine
curd
hazelnut
brownie
strawberries
blueberry
coconut
butterscotch
cookies
huckleberry
icing
walnut
pie
snickerdoodles
cannoli
marzipan
cake
compote
bonbon
glaze
flan
cane
foster
sherbet
ganache
cream
buttercream
jam
cobbler
tirimisu
creme
cupcake
cinnamon
mint
vanilla
éclair
taffy
orange
almond
rhubarb
pastry
brulee
lemon
cheesecake
chocolate
donut
sundae
peach pie
shortbread
frosting
parfaits
blackberry
popsicle
confection
crepe
macaroon
""".strip().split("\n")
enc = """
sorbet
marionberry
cherry
sorbet
milkshake
sucker
gingerbread
strawberries
gingerbread
brownie
turnover
pineapple
truffle
peach
sorbet
custard
cherry
crunch
marionberry
fondant
terrine
biscuits
buttermilk
ginger
terrine
biscuits
terrine
marionberry
cherry
peach
cherry
crunch
syrup
raspberry
licorice
strawberries
gingerbread
peach
souffle
cookie
cherry
crunch
lollipop
curd
terrine
raspberry
pistachio
custard
syrup
raspberry
licorice
sucker
terrine
raspberry
pistachio
coconut
gingerbread
peach
doughnut
crunch
terrine
raspberry
licorice
strawberries
terrine
peach
souffle
hazelnut
terrine
crunch
buttermilk
ginger
terrine
peach
syrup
cookie
cherry
crunch
meringue
crunch
gingerbread
peach
turnover
crunch
cherry
candy
terrine
flower
cherry
brownie
mousse
icing
eggs
souffle
snickerdoodles
snickerdoodles
""".strip().split("\n")
clear64 = ""

for word in enc:
    clear64 +=  array64[ wl.index(word) ]

print(base64.b64decode( clear64 ).decode())

 

 

  • Like 1
  • Upvote 3
Link to comment
Share on other sites

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

Spoiler

radu@heimdallr:/mnt/d/tmp/ctf_rstcon_2020/reversing/the_encryptor$ myStr='AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
radu@heimdallr:/mnt/d/tmp/ctf_rstcon_2020/reversing/the_encryptor$ for n in {1..128} ; do echo -n ${myStr:0:n} | tee dummy.txt ; ./TheEncryptor.exe ./dummy.txt ; mv dummy.txt "$(printf '%03dA.txt' $n)" ; mv encrypted.bin "$(printf '%03dA.bin' $n)"; done

 

Spoiler

radu@heimdallr:/mnt/d/tmp/ctf_rstcon_2020/reversing/the_encryptor$ wc -c *.txt
   1 001A.txt
   2 002A.txt
   3 003A.txt
   4 004A.txt
   5 005A.txt
   6 006A.txt
   7 007A.txt
   8 008A.txt
   9 009A.txt
  10 010A.txt
  11 011A.txt
  12 012A.txt
  13 013A.txt
  14 014A.txt
  15 015A.txt
  16 016A.txt
  17 017A.txt
  18 018A.txt
  19 019A.txt
  20 020A.txt
  21 021A.txt
  22 022A.txt
  23 023A.txt
  24 024A.txt
  25 025A.txt
  26 026A.txt
  27 027A.txt
  28 028A.txt
  29 029A.txt
  30 030A.txt
  31 031A.txt
  32 032A.txt
  33 033A.txt
  34 034A.txt
  35 035A.txt
  36 036A.txt
  37 037A.txt
  38 038A.txt
  39 039A.txt
  40 040A.txt
  41 041A.txt
  42 042A.txt
  43 043A.txt
  44 044A.txt
  45 045A.txt
  46 046A.txt
  47 047A.txt
  48 048A.txt
  49 049A.txt
  50 050A.txt
  51 051A.txt
  52 052A.txt
  53 053A.txt
  54 054A.txt
  55 055A.txt
  56 056A.txt
  57 057A.txt
  58 058A.txt
  59 059A.txt
  60 060A.txt
  61 061A.txt
  62 062A.txt
  63 063A.txt
  64 064A.txt
  65 065A.txt
  66 066A.txt
  67 067A.txt
  68 068A.txt
  69 069A.txt
  70 070A.txt
  71 071A.txt
  72 072A.txt
  73 073A.txt
  74 074A.txt
  75 075A.txt
  76 076A.txt
  77 077A.txt
  78 078A.txt
  79 079A.txt
  80 080A.txt
  81 081A.txt
  82 082A.txt
  83 083A.txt
  84 084A.txt
  85 085A.txt
  86 086A.txt
  87 087A.txt
  88 088A.txt
  89 089A.txt
  90 090A.txt
  91 091A.txt
  92 092A.txt
  93 093A.txt
  94 094A.txt
  95 095A.txt
  96 096A.txt
  97 097A.txt
  98 098A.txt
  99 099A.txt
 100 100A.txt
 101 101A.txt
 102 102A.txt
 103 103A.txt
 104 104A.txt
 105 105A.txt
 106 106A.txt
 107 107A.txt
 108 108A.txt
 109 109A.txt
 110 110A.txt
 111 111A.txt
 112 112A.txt
 113 113A.txt
 114 114A.txt
 115 115A.txt
 116 116A.txt
 117 117A.txt
 118 118A.txt
 119 119A.txt
 120 120A.txt
 121 121A.txt
 122 122A.txt
 123 123A.txt
 124 124A.txt
 125 125A.txt
 126 126A.txt
 127 127A.txt
 128 128A.txt
8256 total

 

Spoiler

radu@heimdallr:/mnt/d/tmp/ctf_rstcon_2020/reversing/the_encryptor$ wc -c *.bin
 129 001A.bin
   2 002A.bin
   3 003A.bin
   4 004A.bin
   5 005A.bin
   6 006A.bin
   7 007A.bin
   8 008A.bin
   9 009A.bin
  10 010A.bin
  11 011A.bin
  12 012A.bin
  13 013A.bin
  14 014A.bin
  15 015A.bin
  16 016A.bin
  17 017A.bin
  18 018A.bin
  19 019A.bin
  20 020A.bin
  21 021A.bin
  22 022A.bin
  23 023A.bin
  24 024A.bin
  25 025A.bin
  26 026A.bin
  27 027A.bin
  28 028A.bin
  29 029A.bin
  30 030A.bin
  31 031A.bin
  32 032A.bin
  33 033A.bin
  34 034A.bin
  35 035A.bin
  36 036A.bin
  37 037A.bin
  38 038A.bin
  39 039A.bin
  40 040A.bin
  41 041A.bin
  42 042A.bin
  43 043A.bin
  44 044A.bin
  45 045A.bin
  46 046A.bin
  47 047A.bin
  48 048A.bin
  49 049A.bin
  50 050A.bin
  51 051A.bin
  52 052A.bin
  53 053A.bin
  54 054A.bin
  55 055A.bin
  56 056A.bin
  57 057A.bin
  58 058A.bin
  59 059A.bin
  60 060A.bin
  61 061A.bin
  62 062A.bin
  63 063A.bin
  64 064A.bin
  65 065A.bin
  66 066A.bin
  67 067A.bin
  68 068A.bin
  69 069A.bin
  70 070A.bin
  71 071A.bin
  72 072A.bin
  73 073A.bin
  74 074A.bin
  75 075A.bin
  76 076A.bin
  77 077A.bin
  78 078A.bin
  79 079A.bin
  80 080A.bin
  81 081A.bin
  82 082A.bin
  83 083A.bin
  84 084A.bin
  85 085A.bin
  86 086A.bin
  87 087A.bin
  88 088A.bin
  89 089A.bin
  90 090A.bin
  91 091A.bin
  92 092A.bin
  93 093A.bin
  94 094A.bin
  95 095A.bin
  96 096A.bin
  97 097A.bin
  98 098A.bin
  99 099A.bin
 100 100A.bin
 101 101A.bin
 102 102A.bin
 103 103A.bin
 104 104A.bin
 105 105A.bin
 106 106A.bin
 107 107A.bin
 108 108A.bin
 109 109A.bin
 110 110A.bin
 111 111A.bin
 112 112A.bin
 113 113A.bin
 114 114A.bin
 115 115A.bin
 116 116A.bin
 117 117A.bin
 118 118A.bin
 119 119A.bin
 120 120A.bin
 121 121A.bin
 122 122A.bin
 123 123A.bin
 124 124A.bin
 125 125A.bin
 126 126A.bin
 127 127A.bin
 128 128A.bin
  69 encrypted - Copy.bin
  69 encrypted_original.bin
8522 total

 

 

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.

Spoiler


#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import datetime
# using python3-cryptodome from debian repos http://www.pycryptodome.org
from Crypto.Hash import MD5
from Crypto.Cipher import ARC4

# encrypted.bin
encrypted = bytes(bytearray([ 0x9C, 0xD6, 0xF5, 0x0A, 0x8B, 0xB5, 0x60, 0xF1, 0x75, 0x39, 0x3E, 0xCC, 0x39, 0x5D, 0xAC, 0xF2, 0x10, 0x3D, 0xC7, 0x14, 0xCE, 0x5F, 0x39, 0x73, 0x84, 0x22, 0x36, 0xFB, 0x7C, 0x75, 0x7A, 0xAC, 0xA9, 0xD8, 0x08, 0x90, 0x85, 0xF0, 0xEF, 0x94, 0x7F, 0xAD, 0x5D, 0x42, 0x46, 0x30, 0x2A, 0xC9, 0x1A, 0xB4, 0x37, 0x26, 0x0B, 0xD9, 0xAC, 0x81, 0xFC, 0x3F, 0x68, 0x98, 0x8B, 0x04, 0xC1, 0x52, 0xFD, 0xE6, 0x60, 0xE5, 0x7C ]))

# fisierul nu putea fi generat dupa data concursului
contest_date = datetime.datetime.fromisoformat("2020-11-20T12:00:00+02:00")
for x in range(0, 31):  # mergem 31 de zile in urma
    t = contest_date - datetime.timedelta(days=x)
    hash_seed_str = f'{t.year:04d}-{t.month:02d}-{t.day:02d}-{t.isoweekday():02d}'
    hash_seed = hash_seed_str.encode()
    hash_ = MD5.new(hash_seed)
    cypher_ = ARC4.new(hash_.digest())
    plain = cypher_.decrypt(encrypted)
    print(f'{t} => {plain}')
    pass
# ...
# 2020-11-03 12:00:00+02:00 => b'RST{738CC8DFB55AEFFD7196BFD6B545D0424E475346A0EFD43A07A4312E7F77EF0B}'
# ...

 

 

Edited by u0m3
More info
  • Upvote 4
Link to comment
Share on other sites

  • Moderators

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
Link to comment
Share on other sites

  • Moderators

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
Link to comment
Share on other sites

  • Moderators

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
Link to comment
Share on other sites

  • Moderators

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
Link to comment
Share on other sites

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...