Cryptographic/Compression Algorithms
Last updated
Last updated
Leer & oefen AWS-hacking:HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP-hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)
As jy eindig in 'n kode wat skuifregs en -links, xors en verskeie rekenkundige bewerkings gebruik, is dit baie moontlik dat dit die implementering van 'n kriptografiese algoritme is. Hier sal 'n paar maniere getoon word om die algoritme wat gebruik word te identifiseer sonder om elke stap om te keer.
CryptDeriveKey
As hierdie funksie gebruik word, kan jy vind watter algoritme gebruik word deur die waarde van die tweede parameter te kontroleer:
Kyk hier na die tabel van moontlike algoritmes en hul toegewysde waardes: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
Druk 'n gegewe buffer van data saam en maak dit los.
CryptAcquireContext
Van die dokumente: Die CryptAcquireContext-funksie word gebruik om 'n handvatsel te bekom na 'n spesifieke sleutelhouer binne 'n spesifieke kriptografiese diensverskaffer (CSP). Hierdie teruggekeerde handvatsel word gebruik in oproepe na CryptoAPI-funksies wat die gekose CSP gebruik.
CryptCreateHash
Begin die hasjing van 'n stroom data. As hierdie funksie gebruik word, kan jy vind watter algoritme gebruik word deur die waarde van die tweede parameter te kontroleer:
Kyk hier na die tabel van moontlike algoritmes en hul toegewysde waardes: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Dikwels is dit baie maklik om 'n algoritme te identifiseer danksy die feit dat dit 'n spesiale en unieke waarde moet gebruik.
As jy soek na die eerste konstante op Google, is dit wat jy kry:
Daarom kan jy aanneem dat die gedekomponeerde funksie 'n sha256-kalkulator is. Jy kan enige van die ander konstantes soek en jy sal (waarskynlik) dieselfde resultaat kry.
As die kode nie enige beduidende konstante het nie, kan dit wees dat dit inligting van die .data-afdeling laai. Jy kan daardie data toegang en die eerste dword groepeer en soek daarna op Google soos ons in die vorige afdeling gedoen het:
In hierdie geval, as jy soek na 0xA56363C6 kan jy vind dat dit verband hou met die tabelle van die AES-algoritme.
Dit bestaan uit 3 hoofdele:
Inisialiseringstadium/: Skep 'n tabel van waardes van 0x00 tot 0xFF (256 byte in totaal, 0x100). Hierdie tabel word gewoonlik Substitusieblok (of SBox) genoem.
Verwarringsstadium: Sal deur die tabel loop wat voorheen geskep is (loop van 0x100 iterasies, weer) en elke waarde wysig met semi-willekeurige byte. Om hierdie semi-willekeurige byte te skep, word die RC4-sleutel gebruik. RC4-sleutels kan tussen 1 en 256 byte lank wees, maar dit word gewoonlik aanbeveel dat dit meer as 5 byte is. Gewoonlik is RC4-sleutels 16 byte lank.
XOR-stadium: Laastens word die platte teks of siferteks XORed met die waardes wat voorheen geskep is. Die funksie om te enkripteer en dekripteer is dieselfde. Hiervoor sal 'n loop deur die geskepte 256 byte uitgevoer word soveel keer as nodig. Dit word gewoonlik herken in 'n gedekomponeerde kode met 'n %256 (mod 256).
Om 'n RC4 in 'n disassemblage/gedekomponeerde kode te identifiseer, kan jy kyk vir 2 lusse van grootte 0x100 (met die gebruik van 'n sleutel) en dan 'n XOR van die insetdata met die 256 waardes wat voorheen in die 2 lusse geskep is, waarskynlik met 'n %256 (mod 256)
Gebruik van substitusieblokke en opsoektabelle
Dit is moontlik om AES te onderskei danksy die gebruik van spesifieke opsoektabelwaardes (konstantes). Let daarop dat die konstante in die binêre gestoor kan word of dinamies geskep kan word.
Die enkripsiesleutel moet deelbaar wees deur 16 (gewoonlik 32B) en gewoonlik word 'n IV van 16B gebruik.
Dit is skaars om kwaadwillige sagteware te vind wat dit gebruik, maar daar is voorbeelde (Ursnif)
Dit is maklik om te bepaal of 'n algoritme Serpent is of nie gebaseer op sy lengte (uiters lang funksie)
Let in die volgende beeld op hoe die konstante 0x9E3779B9 gebruik word (let daarop dat hierdie konstante ook deur ander kripto-algoritmes soos TEA -Tiny Encryption Algorithm gebruik word). Let ook op die grootte van die lus (132) en die aantal XOR-operasies in die disassemblage-instruksies en in die kodevoorbeeld:
Soos voorheen genoem is, kan hierdie kode binne enige dekompiler gesien word as 'n baie lang funksie omdat daar geen spronge binne-in is nie. Die gedekomponeerde kode kan lyk soos die volgende:
Daarom is dit moontlik om hierdie algoritme te identifiseer deur die sielkundige nommer en die aanvanklike XORs te kontroleer, 'n baie lang funksie te sien en sommige instruksies van die lang funksie te vergelyk met 'n implementering (soos die skuif links met 7 en die draai links met 22).
Meer kompleks as simmetriese algoritmes
Daar is geen konstantes nie! (aangepaste implementasies is moeilik om te bepaal)
KANAL (‘n kripto-analiseerder) misluk om wenke oor RSA te toon aangesien dit op konstantes staatmaak.
In lyn 11 (links) is daar ‘n +7) >> 3
wat dieselfde is as in lyn 35 (regs): +7) / 8
Lyn 12 (links) kontroleer of modulus_len < 0x040
en in lyn 36 (regs) kontroleer dit of inputLen+11 > modulusLen
3 funksies: Init, Update, Final
Soortgelyke inisialiseerfunksies
Init
Jy kan albei identifiseer deur die konstantes te kontroleer. Let daarop dat die sha_init 1 konstante het wat MD5 nie het nie:
MD5 Transformeer
Let op die gebruik van meer konstantes
Kleiner en meer doeltreffend aangesien dit ontworpe is om toevallige veranderinge in data te vind
Gebruik opsoektabelle (sodat jy konstantes kan identifiseer)
Kontroleer opsoektabel konstantes:
‘n CRC-hash-algoritme lyk soos:
Nie-herkenbare konstantes
Jy kan probeer om die algoritme in Python te skryf en soek na soortgelyke dinge aanlyn
Die grafiek is redelik groot:
Kontroleer 3 vergelykings om dit te herken: