Cryptographic/Compression Algorithms
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
As jy eindig in 'n kode wat regte en linkse skuif, xors en verskeie aritmetiese operasies gebruik, is dit hoogs waarskynlik dat dit die implementering van 'n cryptografiese algoritme is. Hier gaan daar 'n paar maniere gewys 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 toegewyde waardes: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
Komprimeer en dekomprimeer 'n gegewe buffer van data.
CryptAcquireContext
Van die dokumentasie: Die CryptAcquireContext funksie word gebruik om 'n handvatsel te verkry na 'n spesifieke sleutelhouer binne 'n spesifieke cryptografiese diensverskaffer (CSP). Hierdie teruggegee handvatsel word gebruik in oproepe na CryptoAPI funksies wat die geselekteerde CSP gebruik.
CryptCreateHash
Begin die hashing 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 toegewyde waardes: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Soms is dit regtig maklik om 'n algoritme te identifiseer danksy die feit dat dit 'n spesiale en unieke waarde moet gebruik.
As jy die eerste konstante in Google soek, is dit wat jy kry:
Daarom kan jy aanvaar dat die gedecompileerde funksie 'n sha256 sakrekenaar is. Jy kan enige van die ander konstantes soek en jy sal (waarskynlik) dieselfde resultaat verkry.
As die kode geen betekenisvolle konstante het nie, kan dit inligting laai vanaf die .data afdeling. Jy kan toegang tot daardie data verkry, groepeer die eerste dword en soek daarna in 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:
Inisialisering fase/: Skep 'n tabel van waardes van 0x00 tot 0xFF (256bytes in totaal, 0x100). Hierdie tabel word algemeen die Substitusie Boks (of SBox) genoem.
Scrambling fase: Sal deur die tabel loop wat voorheen geskep is (lus van 0x100 herhalings, weer) en elke waarde met semi-ewe bytes aanpas. Ten einde hierdie semi-ewe bytes te skep, word die RC4 sleutel gebruik. RC4 sleutels kan tussen 1 en 256 bytes in lengte wees, maar dit word gewoonlik aanbeveel dat dit meer as 5 bytes is. Gewoonlik is RC4 sleutels 16 bytes in lengte.
XOR fase: Laastens, die plain-text of cyphertext word XORed met die waardes wat voorheen geskep is. Die funksie om te enkripteer en te dekripteer is dieselfde. Hiervoor sal 'n lus deur die geskepte 256 bytes uitgevoer word soveel keer as wat nodig is. Dit word gewoonlik in 'n gedecompileerde kode erken met 'n %256 (mod 256).
Om 'n RC4 in 'n disassembly/gedecompileerde kode te identifiseer, kan jy kyk vir 2 lusse van grootte 0x100 (met die gebruik van 'n sleutel) en dan 'n XOR van die invoerdata met die 256 waardes wat voorheen in die 2 lusse geskep is, waarskynlik met 'n %256 (mod 256)
Gebruik van substitusie bokse en opsoek tabelle
Dit is moontlik om AES te onderskei danksy die gebruik van spesifieke opsoek tabel waardes (konstantes). _Let daarop dat die konstante in die binêre of geskep dynamies.
Die enkripsiesleutel moet deelbaar wees deur 16 (gewoonlik 32B) en gewoonlik word 'n IV van 16B gebruik.
Dit is selde om sekere malware wat dit gebruik te vind, maar daar is voorbeelde (Ursnif)
Eenvoudig om te bepaal of 'n algoritme Serpent is of nie gebaseer op sy lengte (uiters lang funksie)
In die volgende beeld let op hoe die konstante 0x9E3779B9 gebruik word (let daarop dat hierdie konstante ook deur ander crypto algoritmes soos TEA -Tiny Encryption Algorithm gebruik word). Let ook op die grootte van die lus (132) en die aantal XOR operasies in die disassembly instruksies en in die kode voorbeeld:
Soos voorheen genoem, kan hierdie kode binne enige decompiler as 'n baie lang funksie gesien word aangesien daar nie spronge binne dit is nie. Die gedecompileerde kode kan soos volg lyk:
Daarom is dit moontlik om hierdie algoritme te identifiseer deur die magiese nommer en die begin XORs te kontroleer, 'n baie lang funksie te sien en instruksies van die lang funksie met 'n implementering te vergelyk (soos die skuif links deur 7 en die rotasie links deur 22).
Meer kompleks as simmetriese algoritmes
Daar is geen konstantes nie! (aangepaste implementasies is moeilik om te bepaal)
KANAL (n crypto ontleder) misluk om leidrade oor RSA te wys 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 inisialisering funksies
Init
Jy kan albei identifiseer deur die konstantes te kontroleer. Let daarop dat die sha_init 'n konstante het wat MD5 nie het nie:
MD5 Transform
Let op die gebruik van meer konstantes
Kleiner en meer doeltreffend aangesien dit se funksie is om toevallige veranderinge in data te vind
Gebruik opsoek tabelle (sodat jy konstantes kan identifiseer)
Kyk na opsoek tabel konstantes:
'n CRC hash algoritme lyk soos:
Nie herkenbare konstantes
Jy kan probeer om die algoritme in python te skryf en soortgelyke dinge aanlyn te soek
Die grafiek is redelik groot:
Kyk na 3 vergelykings om dit te herken:
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)