Wij zijn |

Wachtwoord van Conti locker-zip kraken


Conti is een beruchte ransomware-groep die afgelopen week ons nieuws heeft behaald door gevoelige data van meerdere woningcorporaties te lekken. Conti is op dit moment één van de grotere ransomware-groepen en heeft sinds 2020 tenminste 700 slachtoffers gemaakt. Daarbij heeft de groep naar schatting 180 miljoen “verdiend” aan het digitaal afpersen van organisaties.[1]

Vorige maand heeft Conti rondom het conflict tussen Rusland en Ukraine publiekelijk uitgesproken dat zij de kant van Rusland kiezen. Hier waren niet alle leden van Conti het mee eens, dat leidde tot een intern conflict. Vervolgens heeft dit ertoe geleid dat een onbekend lid op Twitter onder het pseudoniem @Contileaks meerdere keren gevoelige informatie zoals tooling en chatgeschiedenis van Conti heeft uitgelekt.

In één van deze lekken zat de broncode van hun encryptietool met de toepasselijke naam “Conti Locker”. Het ZIP-bestand van deze broncode was beveiligd met een wachtwoord. Wij hebben dit bestand vorige maand weten te kraken, maar wilde wachten met het publiceren hierover, om meer schade te voorkomen. Maar de broncode is momenteel breed beschikbaar en daarom hebben we ervoor gekozen om in dit artikel uit te leggen hoe wij dit ZIP-bestand middels een “plaintext-based attack” hebben gekraakt.

De Conti leak

@ContiLeaks stuurde een tweet op 28 februari met daarin meerdere downloadlinks met gevoelige informatie:

Twitterbericht Contileaks

Eén van deze URL’s bevatte de broncode van de Conti locker. Deze broncode was te downloaden via de website Anonfiles:

Anonfiles Contileaks

Na het downloaden van de broncode bleek deze echter met een wachtwoord beveiligd te zijn. @ContiLeaks vermeldde daarnaast op Twitter dat hij of zij dit wachtwoord niet deelt om meer schade te voorkomen:

Twitterbericht 2 Contileaks

Later werd er nog eens broncode van de Conti Locker gelekt. Dit keer zonder wachtwoord maar de locker-functionaliteit was uit de broncode verwijderd.

Anonfiles Contileak 2

Beide bestanden zien er als volgt uit:

Beide leaks van Contileaks

Wat is een Plaintext-Based attack?

  • Een plaintext-based attack is een aanvalsmethode waarbij de onderzoeker toegang heeft tot zowel de versleutelde als niet-versleutelde versie van de tekst.

De aanval doet velen misschien denken aan hoe Turing de Enigma-machine kraakte door de inhoud van weerberichten die de Duitsers dagelijks verstuurden. De oplettende lezer heeft misschien al door de we met beide leaks in het bezit zijn van zowel de leesbare als niet-leesbare versie van bestanden. Zo is het bestand “R3ADME.TXT” in beide archieven 16 bytes groot en kan er de aanname gemaakt worden dat dit hetzelfde bestand betreft.

Beide leaks van Conti

De kwetsbaarheid in PKZIP

PKZIP is verouderd en versleutelde archieven kunnen gekraakt worden door een ‘plaintext based attack’. Hoewel PKZIP verouderd is, wordt het voor de compatibiliteit  door veel archief-managers als standaard gebruikt.[2]

PKZIP biedt een stream cipher waarmee bestanden binnen het archief met een wachtwoord versleuteld kunnen worden. Vaak wordt er voor alle bestanden binnen het archief hetzelfde wachtwoord gebruikt, maar het is ook mogelijk om elk bestand met een uniek wachtwoord te versleutelen.

De versleuteling binnen PKZIP is byte-georiënteerd en codeert met sleutels van variabele lengte. Het heeft een 96-bit intern geheugen, verdeeld in drie delen van 32-bit genaamd key0, key1, en key2. Daarnaast wordt er gebruik gemaakt van een 8-bit variabel genaamd key3, dit is een afgeleide van key2. De interne representatie van deze 96-bit sleutel is afdoende om toegang te krijgen tot alle bestanden binnen het ZIP-archief die met dezelfde sleutel zijn versleuteld.

update_keys(char):
 local unsigned short temp
 key0 <-- crc32(key0, char)
 key1 <-- (key1 + LSB(key0)) * 0x8088405 + 1 (mod 2^32)
 key2 <-- crc32(key2, MSB(key1))
 temp <-- key2 | 3 (16 LS Bits)
 key3 <-- LSB((temp * (temp ^ 0x1)) >> 0x8)
end update_keys

Bij een plaintext based-aanval zijn zowel de cipher (C) als de plaintext (P) beschikbaar. Binnen PKZIP is dit afdoende om key3 te bepalen en de versleuteling te kraken.

key3 = P ^ C

Het ZIP-bestand kraken met PkCrack

Om de gebruikte sleutels (en dus de 96-bit representatie van het wachtwoord) te achterhalen kan er gebruik worden gemaakt van de tool PkCrack. Deze tool is origineel samen met de paper “A KNOWN PLAINTEXT ATTACK on the PKZIP Stream Cipher” in 1994 uitgebracht door Eli Biham en Paul C. Kocher. In de blogpost maken wij gebruik van nieuwere tools die gebaseerd zijn op dezelfde principes als de originele PkCrack.

https://github.com/keyunluo/pkcrack
https://github.com/kimci86/bkcrack

Allereerst moeten we achterhalen welke versleutelingsmethode gebruikt is. Dit kan achterhaald worden met 7z:

[email protected]:~/Conti$ 7z l -slt conti_locker_v2.zip | grep Method | sort -u 
Method = Store
Method = ZipCrypto Deflate
Method = ZipCrypto Store

Bovenstaand is te zien dat gebruik wordt gemaakt van “ZipCrypto”. Deze versleutelingsmethode is vatbaar voor de plaintext-aanval. Om PkCrack te kunnen gebruiken moet er een versleuteld en niet-versleuteld zip-bestand zijn. We zullen de R3ADME.txt van het 7z-bestand extraheren en in een ZIP-bestand toevoegen:

[email protected]:~/Conti$ 7z e conti_locker.7z R3ADM3.txt
[email protected]:~/Conti$ zip decrypted.zip R3ADM3.txt 
 adding: R3ADM3.txt (stored 0%)
[email protected]:~/Conti$ ls
conti_locker.7z  conti_locker_v2.zip  decrypted.zip  pkcrack  R3ADM3.txt

Daarna downloaden we PkCrack van Github en builden we de tool met de volgende commando’s:

[email protected]:~/Conti$ git clone https://github.com/keyunluo/pkcrack
[email protected]:~/Conti$ mkdir pkcrack/build
[email protected]:~/Conti$ cd pkcrack/build
[email protected]:~/Conti$ cmake ..
[email protected]:~/Conti$ make

Tenslotte zijn alle voorbereidingen voor het kraken van het ZIP-bestand genomen en is het tijd om PkCrack te starten:

[email protected]:~/Conti$ ./pkcrack -C conti_locker_v2.zip -c "conti_locker/R3ADM3.txt" -p R3ADM3.txt 
-P decrypted.zip -d decrypted e
Files read. Starting stage 1 on Sat Apr  9 00:22:50 2022
Generating 1st generation of possible key2_27 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Done. Left with 1281934 possible Values. bestOffset is 24.
Stage 1 completed. Starting stage 2 on Sat Apr  9 00:22:53 2022
Searching... 0.0%
<snip>
Ta-daaaaa! key0=2a45cf92, key1=4521624b, key2=decd8163

Normaliter extraheert de tool PkCrack de bestanden uit het ZIP-bestand meteen. Bij ons werkte dit echter niet maar de tool Bkcrack biedt uitkomst:

[email protected]:~/Conti$ bkcrack -C conti_locker_v2.zip -k 2a45cf92 4521624b decd8163 -U cracked.zip password
bkcrack 1.3.4 - 2022-01-01
[06:48:02] Writing unlocked archive cracked.zip with password "password"
100.0 % (199 / 199)
Wrote unlocked archive.

Het is daarnaast ook mogelijk om het wachtwoord, of in ieder geval de interne representatie daarvan, te achterhalen:

Wachtwoord gekraakt met Bkcrack

Let op, het kraken van het ZIP-bestand en het achterhalen van het wachtwoord is een CPU-intensieve klus. Zelfs met een krachtige server duurde het nog enkele uren voordat we het wachtwoord achterhaald hadden:

htop resources

Uiteindelijk is het mogelijk om het ZIP-bestand te ontgrendelen:

Unlock zip

Hoe kunnen wij u helpen?

Responder: toegang krijgen tot een netwerk

Een van de allereerste stappen die we ondernemen tijdens een bedrijfsnetwerk pentest is het aanzetten van de tool Responder. Dit is een tool die luistert en antwoordt op broadcast verkeer binnen het subnet, met als doel het verkrijgen van NTLM hashes van gebruikers.

read more

Stored XSS in BigBlueButton

Pentests.nl has discovered a vulnerability in BigBlueButton (version 2.4.7 and prior) which could be exploited to perform stored Cross-Site Scripting (XSS) attacks by sending private messages to users.

read more