Filer: Download challenge files

Writeup: The Contract

Indledende Observationer

Jeg fik udleveret:

  • server.py

  • contract_good.txt

  • En remote service på TCP/1337 (dette fandt jeg ud af efter nmap)

Ved analyse af server.py kunne jeg se at servicen:

  • Læser maks 512 bytes

  • Finder marker:

    1
    
    ------- BEGIN APPENDIX A -------
    
  • Hasher kun prefix op til og med denne linje

  • Kræver:

    • SHA1(prefix) == APPROVED_SHA1

    • MD5(prefix) != CACHED_MD5

  • Printer flag hvis teksten "ASSETS ARE TRANSFERRED NOW" findes i input


Recon / Kortlægning

Jeg verificerede contract_good.txt:

1
2
3
Prefix length: 480
SHA1: 7119d27d6ede2334872c949e68f13ad3680de5bf
MD5 : 7ba2f771fa259883b53a081081d37998
  • SHA1 matchede approved-hashen

  • MD5 matchede den cached (blacklistede) hash

Dermed ville serveren altid afvise filen.

Jeg bemærkede at kontrakten indeholdt strengen:

1
$SHA-1 is dead!!!!!

Det er kendt fra SHAttered SHA1-collision (et crypto-angreb fra 2017, hvor Google og CWI Amsterdam demonstrerede, at det er muligt at producere to forskellige PDF-filer med identisk SHA-1 hash).


Analyse

Serveren bruger:

  • SHA1 som valideringssmekanisme

  • MD5 som cache-blacklist

Dette åbner for klassisk collision-udnyttelse:

Hvis to filer har:

  • Samme SHA1

  • Forskellig MD5

Kan man opfylde begge checks samtidigt.

SHAttered-pair’et (shattered1.pdf og shattered2.pdf) er netop sådan et collision-par.

Se github link til download af pdf’erne her

Jeg verificerede:

1
2
sha1sum shattered1.pdf
sha1sum shattered2.pdf

Begge gav:

1
f7a68375a6c167d692bdd6f7c077a5d7fbfb84ba

Angrebet

1️. Identificer collision-offset

Jeg fandt at collision-blokken startede ved offset 154 i alle filer.

2. Flip collision-varianten

Jeg:

  • Sammenlignede shattered1.pdf og shattered2.pdf

  • Fandt 62 byte-differencer

  • Flippede disse bytes i contract_good.txt indenfor prefix-området (0–479)

Resultat:

1
2
[twin] sha1 7119d27d6ede2334872c949e68f13ad3680de5bf
[twin] md5  958fc0a986b37896e4b0ce23b7b8538f

SHA1 bevaret
MD5 ændret

3. Indsæt payload

Jeg indsatte:

1
ASSETS ARE TRANSFERRED NOW

Efter appendix-marker (udenfor hashed område).


Flaget

Jeg sendte den manipulerede fil:

1
cat exploit.bin | nc thecontract.cfire 1337

Serveren svarede:

1
DDC{y0ur_l4wy3r_h4t3s_sha1}

Konklusion

Denne challenge demonstrerer hvorfor SHA1 ikke må bruges til sikkerhedskritiske beslutninger.

Ved at udnytte en kendt SHA1 collision:

  • Kunne jeg bevare SHA1(prefix)

  • Ændre MD5(prefix)

  • Injicere ondsindet/vilkårligt indhold

  • Omgå serverens validering

Serverens design var sårbar overfor collision-angreb, da den:

  • Stolede på SHA1 til autenticitet

  • Brugte MD5 som sekundær kontrol