Filer: Download challenge files
Writeup: The Contract
Indledende Observationer
Jeg fik udleveret:
server.pycontract_good.txtEn 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_SHA1MD5(prefix) != CACHED_MD5
Printer flag hvis teksten
"ASSETS ARE TRANSFERRED NOW"findes i input
Recon / Kortlægning
Jeg verificerede contract_good.txt:
| |
SHA1 matchede approved-hashen
MD5 matchede den cached (blacklistede) hash
Dermed ville serveren altid afvise filen.
Jeg bemærkede at kontrakten indeholdt strengen:
| |
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:
| |
Begge gav:
| |
Angrebet
1️. Identificer collision-offset
Jeg fandt at collision-blokken startede ved offset 154 i alle filer.
2. Flip collision-varianten
Jeg:
Sammenlignede
shattered1.pdfogshattered2.pdfFandt 62 byte-differencer
Flippede disse bytes i
contract_good.txtindenfor prefix-området (0–479)
Resultat:
| |
SHA1 bevaret
MD5 ændret
3. Indsæt payload
Jeg indsatte:
| |
Efter appendix-marker (udenfor hashed område).
Flaget
Jeg sendte den manipulerede fil:
| |
Serveren svarede:
| |
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