Imaginary CTF Writeups - Mars 2021

cybersecurity 1 avr. 2021

Mars a été un mois bien plus difficile que ce que je pensais: déja mon temps libre a été en baisse totale, ma recherche de boulot relativement active, OVH et ses serveurs qui ont été impactés (et donc mes serveurs), le fait que j’ai relancé BaseQ en plus de reprendre des nouvelles façons de monitorer mes serveurs, et en plus de ça, essayer de faire les challenges d’ImaginaryCTF.

Ce mois-ci était sport. Beaucoup étaient des challenges d’encryption et de reverse-engineering, chose dont je ne suis pas très habitué. Cependant, j’ai pu en faire quelques uns, et j’en ai certains dont je n’ai pas pu finir. Bref, voici mon write-up pour ce round de Mars 2021.

==== STATS DU MOIS ====

Transposed

Un défi pas très compliqué, tout est donné dans l’énoncé. On va utiliser un tableau de 6×4, et faire une transposition.

Pour cela, je suis allé sur DCode, et j’ai mis dans l’ordre les valeurs dans l’ordre, de haut en bas.

Le résultat est très clair, et nous donne la phrase de la réponse du défi:

Flag: ictf{EXPECTINGMORESOLVESTODAY}


adminpasswordv2

En cliquant sur le lien, on retrouve un challenge avec le design de W3b s0urc3ry, mais ne vous y méprenez pas: ceci est un défi entièrement différent!

En cliquant sur Admin, on va tester admin/password , le classique. Cependant, rien ne se passe.

En regardant la source cependant, on voit un flag debug mis à false. On relance en le mettant cette fois à true.

Toujours rien de changé apparemment, à la différence d’un commentaire caché en bas de la page:

En effet, l’énoncé disait « only oreobot is allowed in… » … On va changer l’user-agent en oreobot, et voir ce que ça fait.

Surprise, le flag apparait, permettant de finir notre défi 🙂

Flag: ictf{C00l_l33t_fl@gs}


grilled-cipher

Un défi qui semble être compliqué au premier abord, mais qui ne l’est pas une fois conscient de ce qui se passe. On nous accueille avec une image:

On nous dit qu’il y a des données additionnelles selon pngcheck

└──╼ $pngcheck grilled.PNG 
grilled.PNG  additional data after IEND chunk
ERROR: grilled.PNG

Curieusement, c’est après IEND . Vérifions avec hexdump:

hexdump -C grilled.PNG
[....omitted ...]
00012d20  52 5c 07 24 52 5c 07 44  fa 8f 77 ff 1f d5 1e 8f  |R\.$R\.D..w.....|
00012d30  19 9f 2a f7 68 00 00 00  00 49 45 4e 44 ae 42 60  |..*.h....IEND.B`|
00012d40  82                                                |.|
00012d41

Aucune info. Retestons pngcheck en étant plus verbose pour mieux comprendre ce qui se passe:

$pngcheck -v grilled.PNG 
File: grilled.PNG (77121 bytes)
  chunk IHDR at offset 0x0000c, length 13
    1091 x 682 image, 32-bit RGB+alpha, non-interlaced
  chunk sRGB at offset 0x00025, length 1
    rendering intent = perceptual
  chunk gAMA at offset 0x00032, length 4: 0.45455
  chunk pHYs at offset 0x00042, length 9: 4724x4724 pixels/meter (120 dpi)
  chunk IDAT at offset 0x00057, length 41040
    zlib: deflated, 32K window, fast compression
  chunk IEND at offset 0x0a0b3, length 0
  additional data after IEND chunk
ERRORS DETECTED in grilled.PNG

Apparemment on aurait des données après 0x0a0b3… Regardons avec foremost:

$foremost -v grilled.PNG
Foremost version 1.5.7 by Jesse Kornblum, Kris Kendall, and Nick Mikus
Audit File

Foremost started at Sat Mar  6 01:02:15 2021
Invocation: foremost -v grilled.PNG 
Output directory: /home/ch0ww/Downloads/output
Configuration file: /etc/foremost.conf
Processing: grilled.PNG
|------------------------------------------------------------------
File: grilled.PNG
Start: Sat Mar  6 01:02:15 2021
Length: 75 KB (77121 bytes)
Num	 Name (bs=512)	       Size	 File Offset	 Comment 
0:	00000000.png 	      40 KB 	          0 	  (1091 x 682)
1:	00000080.png 	      35 KB 	      41147 	  (1090 x 677)
*|
Finish: Sat Mar  6 01:02:15 2021
2 FILES EXTRACTED
png:= 2
------------------------------------------------------------------

Apparemment 2 fichiers sont extraits, et qui sont des images!

La c’est évident, chaque chiffre correspond au caractère du flag.

flag: ictf{n1c3_@nd_cr1$py}


Letters = Numbers

Challenge assez simple, mais qui doit fait en 2 parties.

On nous donne 2 fichiers: Une liste de mots avec plein de mots de longueur différentes, et un barème de points par lettre.

Etant donné que l’énoncé demande d’avoir le mot le plus fort parmi les mots de 7 lettres uniquement, on va devoir filtrer tous les mots qui n’ont pas precisement 7 lettres avec un script python3:

filepath = 'wordlist.txt'

export = "seven.txt"

newfile = open(export, 'a')

with open(filepath) as fp:
   line = fp.readline()
   cnt = 1
   while line:
       print("Line {}: {}".format(cnt, line.strip()))
       if len(line.strip()) == 7 :
           newfile.write(line)
       line = fp.readline()
       cnt += 1

newfile.close()

Ainsi, un fichier appelé seven.txt va être crée avec tous les mots de 7 lettres. Maintenant, on va faire un petit algorithme qui va compter le mot le plus long (attention, j’ai pas dit que mon code est optimisé, mais il fait ce qu’il demande):

filepath = "seven.txt"

bareme = [
    ['a', 1], ['b', 3], ['c', 3], ['d', 2], 
    ['e', 1], ['f', 4], ['g', 2], ['h', 4], 
    ['i', 1], ['j', 8], ['k', 5], ['l', 1],
    ['m', 3], ['n', 1], ['o', 1], ['p' ,3],
    ['q', 10], ['r', 1],
    ['s', 1],['t', 1], ['u', 1],['v', 4],
    ['w', 4],['x', 8],['y', 4],['z', 10]
]
         
strongest=0
strongword=""

with open(filepath) as fp:
    line = fp.readline()
    cnt = 1
    while line:
        # Check word
        points = 0
        word = line.strip()
        for i in range (0, len(word)):
            for j in bareme:
                if word[i] == j[0]:
                    points = points + j[1]
                    
        if points > strongest:
            strongword = word
            strongest = points
        line = fp.readline()
        cnt += 1

print(strongword)

En le lancant, on aura comme mot zyzzyva qui sera notre flag.

Flag: ictf{zyzzyva}


sources-adventure

Un challenge que je n’ai pas fini faute de temps.

En arrivant sur la page, on observe un login. En analysant la source, on nous donne un joli commentaire:

<-- Remember to hide logins.txt –>

En lisant la page logins.txt, on tombe sur ceci:

usernames = {"random123", "abrink", "umask", "ictf{n0t_th3_fl@g}", "adminguy", "bademployee"}

mais pas de mots de passe. Cependant, ENCORE en commentaire…

<-- passwords = {"funny321", "ictf{not_the_flag}", "077", "ruth123", "Pa$$w0rd10", "we_really_need_to_fire_you"} -->

Ainsi, n’importe quel nom d’utilisateur suivi de son password (ex: random123 / funny321) suffit pour continuer l’épreuve.

On nous spamme d’alertes javascript… Et un texte personnel:

Si vous lisez companyinfo.txt… Vous tombez sur un rickroll via une redirection discrète. Malin.

Cependant, on va lire le code javascript, parce que pourquoi pas.

Avec un deobfuscateur javascript, on va coller la fonction, et on va cliquer sur eval. Résultat, on voit ceci:

Résultat, allons ouvrir javascriptflag.txt … Pour observer encore un challenge (la partie crypto):

>> p and q are the roots of: x2 - 1193466094530100901475895368534405836196484x + 241510240104661323964376801789257464125939916664383218559230902825798380145013495683

>> e = 65537

>> c = 43677751328737341941473102215716106126803393903674451929850781476645362591571674826

Je n’ai pas reussi à résoudre l’équation (honte à moi), donc j’ai pas pu finir.


babels-wisdom

Un challenge OSINT assez marrant à faire. On nous donne un fichier texte avec 3 longs textes:

3f8mvihz3g7sqa8up77x09uz3kjfa2fu2xwszbayw9kabfg6l23n9yh7lpr829aqlgqkndi5z76477ta3a1w07ljsh707si41wwho065jpr9umasm8krf2rirc46zldhcav4d3cbtoj6ly4g5ypwdylja3prxj60d68m64oahismvzj7wejuo3iybp6a3kdzbbv8ud9qpyc0od2tdv1g0kfunse47flzi687mooahz188v8zi61yf2wlmpefvqbvsyl1kxyr3u3vb4m4f19wjjivsr1rhv8bb3ej0sj70zjdlakjokz6qw15cmeazdsaefl5ykabmohj9wdz2rnpauzwxx3drg9im7r6cwksb6yu9gnj140x0mkt96hszw2sk90izaawcpvso1mjawx9v3tk7nel2u8vno4xzexth38bx3jk4gd9z6fplwvq14x01go6ntzjqd21mumum9cy7kbwvlyn4yi53b21qqlpblwamvi6x6yoq57gjma2yugh9z5b5l5qg6ydpzpvivbo58q7nj43wku59wq19iilvcxkkhoaow8j8rjngoly0qd0h2xrya9kexbcdu5ev24h3jxp91womh3r1ntg8wvs7iho9aocpz2pcpiy7u9e7f8crto55jtql2kcsjhf66rlkqp73f8ypsm220oesjcne8kd74a63urq3i0mfejloafjijfu143q8187sre6t194xe0stai2de8e9sfy7y96z8kgevp2p7l35x39j2qqusgujle5ztiw5ae2728y2v3cdr28vfcukl1pqn1p4pi6nmv5v0ala1grnza5njvi4dofkuugl09858846cq99ynutllacdkwm656dv00f89otnxkyhxvpnlpdedt0neo1qktqmmto1bupf2sng6bc32t6xmtx7l89q6rsvn6ltflgdx4we43lm1tk98jy8qwud0lwdz3pn68seppkivohshvx75k8ugqdblhquosvgc49nmv9y1it1j19glq51vcp8tqyt1bsq71hhpddvuvjnek31t2rq3a9cn20k8jxi7cstuiiecdx44ykxwchjom3l71hu5i0ufiuzk7h3ylgdcl8pln8vz7lwsenu4tnime7s8bw9ie7nqx7p7rp4q2lomi0pax81kiou5p1xrszcgek6k18re3c7krooemt51v4ntcv17oid24w6dmdhybmuvaslwi91behtb2dz9ozqxevbvy1dcpu6yyw3xtu6seudbfduyjuio6r3kq0esm99n08dso9s9fn7hr1slfekuw7bkhnqahsvzl10yaj4kphdeikpwjxatv44cmaxht7khzncycst6kfydegdrmb44h5w2lbnifvpzoj0ht886ey623zi92r5zv88ar51pckly72t21z00lweschl329u7999m92s2fa5gv2l06b7ywe1l4j000zwkkyngrrt43bw5cho2txy0efbbpx03fwe4p1vcjugoaemp1832p8ps4nnczv7v14qr4s15xim4uedptai2p00x87ne3z94nln48j14ot0bbe8qnit3jhmljrdah0ko7o8ayu51uup8ynegjtte28txot8eqcge3shd4t5x05pci4mme4cx7xle6r0e3cwqrkrgo4zf8fxfm2440t1ostn1z1sosk4akn1zycg01tuvdu7j9q7ju7n0i2url7mxnsioe4vz3qjn4yp6updxtpkcr66tvmuyajhg3t78qvtqw2oo1r8ish9ow0qp6034q2cd5vf0h6kj7r65g3b62mch9pmht5esdtfn9znyxgh1tdv30xwnzy8h133zlionj72cd07k8cn2gwfnm9q41xq0v066u911rljtzl415jyryquyjczb736gfjegipduhvrs8fw2ndajswjry2lwfp1u3efols03ejjdas9ya2u5wxiqfnlf34inh5gbk9098gchw50w4ikdfbld8qr5btl016gzbkt45lxqtahqinlnyebe8v4m18lixk4hekn8u5xx63qoeujfq3dvwsm9oxqm8tleh6nw7bcs8alfgj72kajpmipe9lbis1fj6roern37w29r1qk0qyu4jzp7rzfl935lhwjcixpcz7abj5c940vyvpss4y5svi3scalcrd7lvqzmzqm62y9rq9o7vibq6jsw5mla46spwaf0lr3z5qwx1uikvqo5h9pl491ngt7paj3nnh52ojgu5pp1r62b8u28ljquqgsdy4v14htwz52icf7jbg06ublepncmyhvmeu164b56drud6df1n9ho7y8frm9lla832p6hvyitad5wyfkvc03g67iejovbok9srfqz98s4u0yqa5ctg8ez7ub9sk4sf8bu0nu4qymi8pdmaddhw36chkakc1qi6r7qsv7cd6po5dbz22r5c9xjefpzf7eq4c5az652fzluhv5g2v4susyd5sp55yoy7mf5rgd6zzpk4rk7337pp37zbpd82yw974kywppypin7nx31rudbqjgq3myvu9yjvxm0gwm42y16zp0yyavgxxk5y4y8ngkijswlju8i9r3ezt2ft3frwm3xpjf87oymyw9kj3eerftwc42dghqqx3l79t6cbsboddme4ov2hmjajxswcmb3m7s1jstld9xdqnavfyncsl9axb5h3y3hhnuq5wi8txk7p20u1pwkojxexleyzkk1n6z7acqr20ih3yyq2sbrhcxv0a25tkseuj3g30swwlno2ty2gnjpitrmqxwcq48c248ui8yuoidsigwgm7o283if7uw5w08x7ucphpewssqibvawijehp8pb1m4w45bi3khpubdgtozx4q63yzzb045xj8ocjjwxyu191vy6432xd959lui3adm3d3aw1zftbmmifjxh4xgozxl9fykq9agx03ufo9pg1fahmflmupcuq2t03w18sn8qvrrp70harjqgkoha7svevudq9tozbmmr09u2xihmxl4ejyxhn99htbhewcuqjljbmz3wfxu1ljoonxschowga050ukcd2y1ea2to7ripgf5tnpqmiud2syr3foki7xmivqhvtnlkcuv2u1650au0fkpqoz0xc0gb8z1e2vxvjra6nvakrph1uz4kymh5sao08bscvnpde2sa2w4yz1uq4fg5xmjs7pwkivac2ph8nb5gltdlov6p8ya18rlojf6v0xjo5hr3fhzj5xrsudzvhe08t2b-w2-s4-v29:242

1n6x1fhdnjh1gc1zn7gegdw77zfezs25sc691nhibonptu73t6c2meba9pp9lfygnolpnxuim5sodfz86tfneo637lq4edtuvg37gdgpdf5plgbqyk345a33vnwjc9nz7xmv738nfm54r8b7uibrbnnt329d6rqtetsz7mvmtj4gf04xoi398ca31dlw5eaynxfvg7uveu57uxeqgailfo693opudhzxiio3bj9mjmjgyd925rqu38k1onlf7ronnhi2iqvj9mlwnb5fuh3vp1hsvjdapjaju3yotr3aiqa4j5r7p7igfg2byglxdmu3wbd700whdwkptywttfz6efxzzj6jag245g3jbc8vhs33onm80nds7ax0cyrdtwsk8otbgqh2ref6699i3xgch0goswzzhn09zl0hs0vypxq5li3lsfeqw58o06ra2nh36infhj015cn7jeash6fxurnui5al9adovca3avtqgvjcu3lmtz8hy1fphgpnbafslwexvvhwpmz6tdlo858qw5p37yxj1ia5fymo09wp2p7iujl789fj47p3aqo663s0dxkbb17y0ii08w2tniudirc3lrze9w0yt2nahl9uwtveagje39dz7eiy9etopbczlv4ke4qe314c6zpwvqgcirgt39zf4vu1k5s04f9kskdbmpwg7dxeyb3zwuptwjo7or19whpp9g6hzzws6iqsy6ze1yla02kzi1ybiptff515py71evnkmizbp1vgzpwytzibhu6sp3a1mgnd23op7po4eapqoyzezyops60msncj68f3nlrffvgstoslebte32asfqc0h59puvof511bvopy9nuvi1utdtf4yo6k9ghdw5qidvt8ds8aktcroqdftrue0fiyznfa9mkie74ldmt50g7k0jtmma0r30bqmnbar3t8qlb3wrx6rlhxsq7ffn506fox33fgwlj6wsotqh4w1fb2oqfr2mjuwz2ngbd6lkhfdydovfaaqr40sffuk4ndf4c52546i9fqd5g8xovfiqmrc1cn3yztfe62yjgoe53x669xp3mq00byqvss4w1dktvop68deqhddk03mxmbn4i0gsqmfoujyzeunhhpo5yq1r0hbpxkcvc8ihfrzwt6vu3nmy43wjxsskjwdqn44gzz2ntgpzynj2byboy4b92wckdg0f8s2qfvczui7qmj7rr41jorz0gpcjofie7b0hp28e8ivdky9w9mob243bll43d5alm7tjztzlg1n4myet4hqbh32lj5qts9si5qmdn2yigr93ob0bbohd7rmvnr27wi5vy6c967m04b9hkqg0m3w42u6yw2en0s2crjjimzsmce5t73loodt8s8uw8qc5x91blk86zz3u4ehnpt1z4mm9b7ovt4qtqyj98v9fox3u6ve44fq2wk76iz98ukihkmkhb44k4xv01q3ukm57jx5nngurvua17hfgzu837m7jg50reoatbb6mia3bcnq6dlt6agw4bm689p9gityctruiukif5eval6hti04m4q5oc3rnaynyry38ypq48268e55wp83y5fwhpzo4icj45tnmn8oliqz0dfhr0gqrnzh6zxsctywftknkdbqxvot76oy6wyb0bz9strwi94vhq9xwgpe4d4kfn850oldyc2k4qe54l4gpb3kw7rt6xtpch1euxi3aajr8x1aap1kd91nirq3w0eqqqfvp3ddio14w8r9bycrbgwge674seqg67omlxb0kwiygif9sxbfr26adc2zvvxk6ukrkeu8tkbmtvednopfh30s6p09fxlvi5eenpbywi9bzucut7ch64asyiy70hn9lo5m139rojr2ikh2od1pjbapju7gvirhh18ntdgandj92zzksr1yop04b3o8kay29ci9k47ahjine42e03ptv82a309pclicqe6ly2wzrz69gjfhancgp2so8xx3p2z3xq56c34f5a5j1yfrpswslbrl9yn6m693fj73q4lzr6e26xs1of5nt06py91ovk2nwrb8f79ju6f0u5ilqhlxkgitjfeiq733o83s3ev9jvar2xoa0kib9bwyhvjiv7s7fqkdf8qbwhwubtirmppg3mcoipsrc1odfrz782her36k3fayaq86accg3gazuqr2jj69y1xjcq4wbhjqxv261odh58hqthd5vsymdwk28wg7h11ki0kweaxutqr5razsnblvftgxby25rtagtihatdy3fwkkm9zzmwq1krgcoejf02m7ofy38u9qbzzmqjb0qbe2rjg9y0yup5zmshzvsflrg4uvzmj4xld60kgwnrelheu3vf333j2f70kshang0ejd633o61hpmdo4s5sb1l7o8gcs0g57zp6ca59lgfvenzdbpjy4fr9jn30vfou9xye87x98lat1lkpvufpmk4z028sxuidvb5z2ctgqbblvtnfhyijsu2eip13rt5uo6t5kl5oi5tbzlrarf6m2ll3ob4bsksbl4rjdl59ctn7feucmmdy23fe3m9gu61y6g1ffxb0g43dj28jdsntyb3487ewfkxq2ujr5soqnryc4po7wzo64ae753jl1dq2wz0mwv8sqqcpotqi3rhlw5ox89u58s9rxqq77a0indgsj141lib7xolg1dkvrzswpqtzex5xbtow3r74pf485aqgyimr9s7w58hyc9awixrr7ptqq2uf6mp7vzmrvkdvwxv7idzhtchsalozhtrgxhdondojhck86tpimn5mt8khstuuqq7mwpp23igrkj90b1ahisgcl4ebft77akd82aur665md6256io3l4n4d6x16gltxk13a1l2auz6946nz7ympg9grutrdgxev0yfz6y1ej7l67hdr83g6nxhnhfdx1h2bt3uk0lf3fza7v4eju01s45m9e5qufwb30vkmbh6txo72jomq2sk9ppwxpi61glj3nm1l9pnz7rlooima016zzbm7dnmpfofgwflm4106mb44s4gsb6ygzdq6ium66319vw9l5osxbgggqiwv7rp5ef4a0pxgg8dvraqlzn41dhw8hyq0pk4fkvgdvhtxcn2kpp76fysfww6xu9lgpqsan1qq7hpl853wmlo3q1maov0hn3r0re9zt1a5bzqtzyyp83f9mnsp7c2q4ssevmb0hkoza153tjttw4tgz87szkdavwsfkkq73-w3-s3-v06:373

17m789lu8h8s21dzc354jfmgv4zw59aaw5jsoj6f8h7bg3lmmkivb5surtsun18171spoo6wmt4m4njwwwezhiyzgpup9koopwxkubw09e5it7ww6dtwl5c00bgz2u4ypyy7otiujyl4xob0wnsg0nnc6kczvlkn5n85cgwj6r0ys2ng9noheibc168pds5vfcdyslafkro0i4xzeuzgha8ypzlbo1jwr5yrvtmvj56bzfh7d8qarlccnfnxt6f2j8dajp1xr8483uyplqoy83p89ypv4jdegtows4abwi1ek0l7jqydbbaqa3uqqv0sngf189grqblbl2cjcdfq6g0kiucezzq4hq32bilsiilrr5q7riu7oiav8pkce5l980qal7fw0tauhqcm0l4tpyrgfb74erzacb3e13o08bbeg8o9uk04rmbjm7qzfjptqgweu8xwmyy24fswf4l2uiqx7hb7ols0iursk1y13hsjaxft8a9rh28n4pkfzlzbqhfga13ky8jfgglsjr8rkfwhnm33ysxz0ir5oxocpoi3zhalaz93xefyrq7aqiokjw9vpuwxic91lidngo5hhj99juttkfrrk6j3ifeoupmizugtuy3u8gcxo3oo3v4goso51wevfk1e8wxbrwx4xbx3rxxrk3ef8sgp49ha1peea9p1svud8blsin29gpxtpyqe0fji6a9jgzd1na6oskjldspj56ouyp02wome9vxp33dvfv82fxqtjtoui62rm9mdr2r9eztnw0lw787jf4i0xmgpjwixnfr0tb2rjuw2v337tq0mzo0iw0y9bv9fulrutfv6oxguc5p5n6j1wmiv8ln4ot5es19akhd29oisy085x2qcen6xbz9yk3lb6eunhtu3c63v88gwyvoukm21c17wvfjjry3wxj1dfxis62ll4er25m7pas9yi3z9unnlv1z8r1dkjyy87lzp3yrs6k1mj9tv0qyb7ml22rr5yvh40j5izy2gw6tq6hq9n1aj66powrnvmex283143611nuhjuyefhkuy1ew3w3tfh6751w0vche26h1ofbj1ga23299s5hyxkfalibfpucrktsmigwcz6am0yqr2x1ovn9o7zudurrcf8717a4xtf2pji8qw78mbuatt6wuuvghsn5dniu7b9x4zfsbn6pkj6lpbxn965caxxykecgt8jeoiu48we8kd34h0mc15m24xja5nbrrsqy249famign81zrficajqemscm5ncumg49z8sgc7c3auabgp2hjklbw8kl43lmrd2797452w1r8253x20uqv73ipojjidvylhod8l5qnur4lvhy5rnpa95cd1xxhg3u9vwxbpdyeasorvc56h6gpgv3gdzuccjzqyd1lq5uk906kl6whn0epmu53rv9c0owwlv8xs206q4irt9tgbv1r3aygef2vlr6aoai47bsembi6yjvi4ypw94qwt1y1ujm6tk5vnictu63m9rhd9m2jug73holx9jws60qzjnql8vwfqvpt4r5k6b7km5eay6ybaasu6j5qhchwkghjssux4czb2a372wdlb42kqq3j5y8u1zcptx08f6f3g9oyknv9n1uc21x97lt4pd6p2go0kzr7wegpl9mo793e0qvfbkxp4pyke0a1yr0id6oqr4q0avimxv05drerz7n59ni5ye0s0akgbgalbv70pyvv9cqx83p8yarkgygnrus1lu94z9brvo7a8tkm8t1hcj490nqlel5pql0fcxyyamm4mk5j28vzw5wvnrsghc1m3fxcwkyi234g95ilep8roxwtlfms7akkfujfz7sbi85atsas6bqgnxbsp9nck6lyefrme0t80vz432o54gmhdzigwtymu19tdrupqe90m1kxfj68t0pv4yx1tuldi75g6d1f0ivp3me6aksjogdiqieb8byvxvomwowe0simydhylgsb2jrobttzljanbuzdjyssdh3xjp3twrhr91vbwqhj7ql0v111h4l89vdpo6ca4lf356ioi08gqcb0zy10mk09e61s4kb4h8vwv3psn8j0jz10xke1du1gf9zswju26bs6zgaut08u38wzbpakoowqqs5xk1owa5ghfczkfpzeybvx26dr9o3iauh6jkp6ox4l30e0bt0ewzqznb0vxcx0qg5w7npy3ma6wroyu7bxskwwd9x09kzl29hy086oasrep1mue8p9noireyg46xilg01ue4dm2ixthxcle2v57l85cbwshkmc5fvc8e25n3804dmpxjchnnhfqxz6ug510a5az0ityvpe927kuqfq0m8fhanv9y6dc5spqaqw5opv1iwdrdvsdpd1qlhskx9drqq38k0aq88xovghzke6sol06f78skjurgd1gjmo5dhsyujzk35sflyxpudkyaaqwuacr0um8guao6qarnm2f7qdbl4k09asiad425m1acv00qtewzx3hvkmmjix8d4xd89dnvpgy72qhi6dbga6jkpld47vwim8weykqh6isw301phbhjpbyq7ynn2xhm72zifq1w2efdelpfp56w0uplv00wklo40p5isyw0ozdwldttbff6oer36bpyiu6s22g3m1zvmmnr8ylcj6rq7qsyybrham19ifydvt0dbzura92zfex27xd85maxhiufkb7ow9vj4v42gynn5b5tp5c57sdytngvfa88oa51e772uhde6qs40iqz236ohnu3wcwtsm6s6eu2viye74px4zfu6alqirai0aex7efaxaozplv6nkar4p4jb7b46koaqrmmnrw9bs1wrtjj2tfrj7l9xqqwd6zjbacbyny13bih6zofsnzky7ib9m8u1edk8n11yqtwcsmtnc5nk411ytrynu5xw9ashq8b5cpyigm2eyw0wznz482j2cvu7et348hm6mr1gkrshlc8ntprtw5gr4ldoipfzwqqffc64puri1xwd6488r0caqlejt7w3zu0oooec7xms81urv5jll39flyfura6z8bntu17iueuwgcb5pkxqofxf133y70kn2n1oe5fv6mphe1npwuhoin6vzkrv3zzymudijv4t1wpwyzugzng73ea04afpzcsjp7omdonx216ce57nw9ke7ln9h7ws6dgs02idnku1msqusjpkwnl3hjxaoijoxcwlv6h6gm4g2312t13xwgkxfh7-w2-s3-v27:304

En premier lieu, on comprend rien. Cependant, c’est un challenge OSINT, donc une recherche Google est forcément nécessaire. Quelque chose dit qu’on aura besoin de comprendre quelque chose avec « Babel » dedans… Et en effet, après quelques minutes de recherches sur les galeries hexagonales, on tombe sur ce site:

Après de longues minutes de compréhension du site (qui est une infinité de galeries hexagonales hein, je le rappelle), il faut faire la manipulation dans /browse pour chaque parcelle de texte:

  • Mettre les 3254 premiers caractères de texte dans Hex Name;
  • Mettre la valeur du Wall, représenté par w# , # étant la valeur
  • Mettre la valeur du Shelf, représenté par s#
  • Mettre la valeur du Volume, représenté par v#
  • Mettre la page correspondante, la valeur étant après le :

Résultat, vous aurez 3 mots, qu’une fois recomposé, vous donnera le flag.

Flag: ictf{fortytwo}


Empty

Challenge très court, mais qui donne une -semi- fausse piste qui m’a pris 20 minutes avant de m’apercevoir.

Bref, en arrivant dans la page, et en tapant « cats / dogs » comme le dit l’énoncé, on va avoir un magnifique troll:

Mais en analysant la source, on s’aperçoit d’un joli commentaire caché après une longue ligne de code:

<!--qwerty:123 is so op-->

En revanche, taper ça dans la barre de login ne donne TOUJOURS PAS le flag. Oops. Cependant, on voit 3 cookies apparaitre:

Set-Cookie: username=qwerty;
Set-Cookie: password=123; 
Set-Cookie: ChangeValues=True;

Et à cause de ce dernier cookie, le programme va toujours dire « Try again, cats:dogs« .

D’ailleurs, si on met ChangeValues à False, on aura « Try again, undefined:undefined« . On se rapproche du but.

La solution est donc la suivante, que j’ai fait avec cURL:

curl --include -X POST http://oreos.ctfchallenge.ga:12345/formdata --cookie "ChangeValues=False; username=qwerty; password=123"

Dans la page de réponse apparaitra le flag.

Flag: ictf{3mptine55_3v3rywh3r3}


Windows is the best OS

Troll oblige, Microsoft et la sécurité, ca ne faisait qu’un demi d’un tiers d’un million multiplié par 40 billions de trillions de milliards. Autrement dit, elle était très mauvaise et facilement décryptable. Aujourd’hui, elle est meilleure, mais pour combien de temps? 👀

Donc on à ce hash: 4E3A1396B4740392538E6388187CF852. 32 caractères, 16 bytes. Avec l’énoncé en plus, on SAIT déjà que c’est du NTLM qu’on va nous donner. La première des choses, c’est d’aller faire un coup de JohnTheRipper avec un wordlist bien connu (rockyou.txt) voir ce qu’il en est:

echo "4E3A1396B4740392538E6388187CF852" > hashcrack.txt
john --format=NT --fork=4 --wordlist=/usr/share/wordlists/rockyou.txt hashcrack.txt

Malheureusement, le résultat n’est pas celui que j’espérais, car aucun mot de passe n’apparait clairement… Ce n’est pas un bon signe, ou alors la wordlist utilisée n’est pas la bonne:

En recherchant un peu, je me dis qu’un site externe pourrait m’aider. Pour cela je suis allé sur OnlineHashCrack, j’ai mis le hash, renseigné le bon algorithme, et après plusieurs heures, j’ai une indication assez utile: le mot de passe fait 10 caractères. Par contre, je dois payer si je veux avoir le mot de passe: LOLILOL, j’avais besoin que de la taille du passe, rien de plus.

Donc, le mot de passe fait 10 caractères. Pendant que j’avais lancé un crackage incrémentiel sur JTR, je suis allé voir s’il existait d’autres services de hashing ou d’autres wordlists. Et en effet, il en existe un: CrackStation: après avoir renseigné le hash, il me l’a trouvé en une seconde. C’était ma wordlist qui ne faisait pas bonne justice.

Et pour vérifier vraiment avec JTR, j’ai pris le hashlist du site en simplifié, et j’ai retesté…

Flag: ictf{Pa$$w0rd10}


Samuel Morse

Pour résoudre cette solution, on va déjà analyser notre texte. On voit déja { et }, donc on suppose que ce sont des caractères non encodés, ainsi que les chiffres, et les _ . On ne sait juste pas ce que q et x signifient.

Cependant avec l’info juste au dessus, on sait d’avance que les premiers caractères seront ICTF. En regardant donc la charte du code morse:

… On voit que I signifie 2 petits. DONC q = . et x = – .

A travers cette info, on va décoder le code au dessus.

Flag: ICTF{M0RS3_C0D3_IS_C00L}


Encode or Decode?

Le challenge est simple: on doit soit encoder, soit décoder du texte en hexadecimal. J’ai passé plusieurs heures en testant plein de façons différentes, mais pour réussir à trouver le flag, il fallait convertir ce qu’on à recu en format PEM, et je l’ai fait sur ce site. En effet, le texte parle d’encodage non-supporté… Et d’après ce que j’ai lu, le PEM devait être utilisé pour les mails, mais a été supplanté par GPG.

Flag: ictf{ThisIsASuperHiddenFlag11}


Tolkien’s Secret

Lorsqu’on arrive sur la page, nous avons ce script Flask:

from flask import Flask, render_template_string, Response, session


app = Flask(__name__)
app.secret_key = 'KeepItSecret'
with open('flag.txt', 'r') as f:
    flag = f.read()


@app.route('/count')
def count():
    if 'count' in session:
        if session.get('count') == 356047916789627241981541:  # You spam? You get the ban.
            return Response(flag, mimetype='text/plain')

        session['count'] = session.get('count') + 1

    else:
        session['count'] = 1

    resp = 'Welcome to Mordor!<br />'
    resp += f'You have visited {session.get("count")} time(s).<br />'
    resp += 'Come again soon!'
    resp += '<br /><!--No need for large ammounts of requests. Pls use your brains instead of your scripts. Thx :)-->'
    return render_template_string(resp)


@app.route('/')
def source():
    with open(__file__, 'r') as f:
        content = f.read()
    return Response(content, mimetype='text/plain')


if __name__ == '__main__':
    app.run("0.0.0.0", port=8080)

On remarque que la page /count existe, avec le flag donné avec la valeur « count » à 356047916789627241981541 ce qui fait que quand on la visite, on arrive sur ce joli texte, avec un compteur qui incrémente à chaque accès:

Welcome to Mordor!
You have visited 1 time(s).
Come again soon!

En regardant les cookies, nous voyons ceci:

La valeur 0 correspond à une valeur en Base64, le reste est difficilement compréhensible. Cependant, on est sur du Flask, on a même la clé secrète, on sait qu’il y a « count » comme valeur donc on va forger un cookie avec Flask Session Cookie Manager, un module pour Python2/3:

python3 flask_session_cookie_manager3.py encode -s 'KeepItSecret' -t "{'count': 356047916789627241981541}"
<output>: eyJjb3VudCI6MzU2MDQ3OTE2Nzg5NjI3MjQxOTgxNTQxfQ.YFQAyA.j_2fzA7s1dBTAwkavRVn8n0h6rE

avec cURL on va forger un cookie qu’on va écraser par la suite:

curl --include -X GET https://dismalwindingcircles.samwise74.repl.co/count -c ./cookiejar.txt

on va ouvrir cookiejar.txt, et on retire la valeur du cookie (à la fin du fichier) par celle que l’on a forgé. Maintenant on va lancer notre cookie forgé via cURL:

curl -X GET https://dismalwindingcircles.samwise74.repl.co/count -b ./cookiejar.txt

Le flag va apparaitre.

Flag: ictf{Come_on_Mr_Frodo_I_cant_carry_it_for_you_but_I_can_carry_you!}


simple RSA

Une suite de codes nous est donnée, mais on a la valeur n et e ainsi que ct. Pour cela, allons installer le projet rsactftool sur Github.

Lors qu’on analyse au moins une de ces valeurs, on nous donne une valeur INT, qui, une fois convertie avec la fonction chr() de python, nous donne une lettre.

Du coup j’ai crée un script pour convertir toute la clé en 39 fichiers…

txt="22920183178010324016373443603515625 8429431933839268832485642678641699 124676848765984328031674121957933056 14002414191924244276669361796022272 337587917446653715596592958817679803 6599743590836592050933837890625 43276334103547425867991106950436269 5958260438588051333281183456765537 293844199047808331618283286773235712 54116956037952111668959660849 50544702849929377100000000000000000 29606831241262271996845213307591 4181203352191774128676605224609375 68660408884120282915274309282824192 1379209096840925342723840168019929 124676848765984328031674121957933056 19479004955562800041143429584912384 38115448583970168165554454528 50544702849929377100000000000000000 4181203352191774128676605224609375 6599743590836592050933837890625 50544702849929377100000000000000000 14211879482945166685530717421568 4181203352191774128676605224609375 8429431933839268832485642678641699 37553674644104207641884714074112 92764641967130171567625832766767104 4181203352191774128676605224609375 107612640045671820774919891357421875 31588152109649857868144549324788907 54116956037952111668959660849 37000180548008608733053875753320448 94152329294455713577749264203776 107612640045671820774919891357421875 4181203352191774128676605224609375 14002414191924244276669361796022272 124676848765984328031674121957933056 192441327313530246357280390753883639 444089209850062616169452667236328125"

array=txt.split(" ")
itxt=1

for i in array:

    filename="{0}.txt".format(itxt)

    f=open(filename, 'w')
    f.write(i)
    f.close()

    itxt=itxt+1

Puis le script pour automatiser le décryptage…

#!/bin/bash

n="634557599394827484518408716527054197491217109177784256003137"
e="17"
list=`ls *.txt | sort -V`

for script in $list
do
echo "opening $script..."
val=$(cat $script)

python3 ../RsaCtfTool/RsaCtfTool.py -n $n -e $e --uncipher $val 

done

Enfin, le decryptage des valeurs obtenues…

txt="105 99 116 102 123 65 109 97 122 49 110 71 95 112 89 116 104 48 110 95 65 110 68 95 99 72 114 95 115 107 49 108 76 115 95 102 116 119 125"

array=txt.split(" ")
res=""

for i in array:
    newchar=chr(int(i)) 
    res=res+newchar
    
print(res)

Flag: ictf{Amaz1nG_pYth0n_AnD_cHr_sk1lLs_ftw}


The Key to success

On obtient un fichier .pcap, donc on va l’ouvrir avec Wireshark.

En regardant les touches, et les données en particulier, on se rend compte de la touche qui a été utilisée.

En lisant les touches au fur et à mesure, vous aurez… ictf[3v3ry-k3y-c0unts] . Sauf que ce n’est pas le bon flag. En effet, regardez cet exemple:

LeftALT semble avoir été activé, et la touche « - » a été aussi appuyée. En regardant un clavier QWERTY, cette combinaison donne un tout autre résultat: rien du tout… En revanche, en utilisant la touche SHIFT… Les bons caractères s’affichent.

Flag: ictf{3v3ry_k3y_c0unts}


AppleBot 3.0

Donc la nouvelle version de l’AppleBot se déroule directement sur Discord? Oh, bonne nouvelle. Dans le bot, on peut voir ^help , qui doit être une commande. On va la taper:

Toutes les fonctions du bot existent. Sauf une, about. Au début je m’etais demandé si c’etait avec la phrase au dessus, mais en regardant le reste, l’espace n’etait pas normal. Donc, une fois tapé…

Tiens tiens, c’est hosté sur Replit, un espace de partage de projets PUBLICS. Ce n’est plus un défi de catégorie Misc, c’est désormais de l’OSINT! Donc, je me suis inscrit un compte dessus, mais aucun moyen de voir le profil de 1337haxor.

En regardant cette page, j’ai appris qu’on pouvait… J’ai du taper ceci: https://replit.com/@1337Haxor pour avoir accès à sa page. Et surprise, le projet Applebot est ici! Oopsies…

Un coup de fork, et nous avons la source du projet! Et en farfouillant le code… Devinez quoi: on aperçoit le flag!

Flag: ictf{replit_1s_4_terr1ble_pl4ce_t0_h0st_cl0sed_s0urce_pr0jects_4d82e4bc95723}


Insanity Check

Challenge non-fini car manque de temps. (et surtout en moins de 24H…)

La description nous donne un truc assez marrant: déja, la solution se trouve sur le Discord. De plus « il n’y a PAS de stegonographie dans cette phrase ». MAIS BIEN SUR.

Je suis allé sur ce site, et j’ai copié/collé la description du challenge.

Sur le Discord, channel « ictf writeups », que vois-je? Tiens tiens…

Donc on va cliquer dessus pour avoir le role, et dans le nouveau salon, on voit ça:

Alors j’ai regardé les posts trèèès tôt, et je vois ca…

Sauf que ce n’est pas ce que je pensais, et mis à part ce flag très rigolo, ce n’est pas celui qu’on recherche. Oops.

Mots clés

Ch0wW

🌍 Entrez dans mon monde! Je poste du contenu en rapport avec les jeux retro, l'informatique, le modding et la réparation d'appareils... N'hésitez pas à me contacter pour toute question ou demande!