123 SOLEIL ! Nemucod & Locky seront sur nos plages (d'IPs)

ѠOOT

123 SOLEIL ! Nemucod & Locky seront sur nos plages (d'IPs)

par ѠOOT »

Ces changements sont apparus quelques temps après que les médias aient publiés des articles du genre "locky ramsomware network hacked". Et dernièrement, certains pensent que la Russie à quelque chose à voir avec ces arrêts / ralentissements : locky, dridex, angler. La seule chose vraie pour l'instant, c'est que le Nemucod est de retour dans nos boites aux lettres électroniques et que le rançongiciel chiffreur Locky continue de faire des victimes.

Image

Dans les dernières campagnes, le langage JavaScript est encore utilisé, le script contient une liste d'URLs ainsi que le nécessaire afin de télécharger puis décoder et exécuter la charge : Locky. Les fichiers encodés de Locky sont toujours hébergés sur des sites internet préalablement détournés. Contrairement aux précédentes charges où les pare-feus bon marché pouvaient alerter les utilisateurs sur les téléchargements de programmes suspects là désormais ils n'y voient que du feu. Il n'est pas nécessaire de trop détailler le code JavaScript car quelqu'un l'a déjà plutôt bien expliqué : https://malcat.moe/?p=53

Le décodage utilise deux tables de correspondance. Il y a un premier mélange qui s'effectue avec la fonction "Sl1". Le fichier téléchargé est lu en base 10 ensuite si la valeur décimale est inférieure à 128 alors il recherche la correspondance avec la table associée ( Array "ZUe" ). La fonction "KGa" applique quant à elle un second passage basé sur le même principe ( Array "WNKh" ). En sortie, la variable "Qq1" correspond au PE qui, s'il est valide, sera exécuté avec un argument. Dans cette campagne, l'argument est : "123".

Image

Il est important de noter que sans cet argument le programme ne fonctionne pas car la valeur 0x7B ("123") est utilisée dans des calculs qui visent à auto-décoder une partie du PE. Pour imager, visualisez un escalier dont les marches se fabriqueraient au fur & à mesure que l'on monte ou descende. Cette technique simple est efficace pour contrer les exécutions sur des plateformes d'analyses semi-automatisées comme Anubis, CAMAS, ..

En plus de l'argument, la bonne vielle ruse de la boucle RDTSC ( Read From Time Stamp Counter )

PUSH EBP
MOV EBP,ESP
SUB ESP,14
PUSH ESI
PUSH 00416454
PUSH 00416460
XOR ESI,ESI
CALL LoadLibraryW
PUSH EAX
CALL GetProcAddress
MOV DWORD PTR DS:[421790],EAX
MOV DWORD PTR SS:[EBP-10],6A9FB5F6
@BOUCLE:
RDTSC
MOV EAX,EAX
XOR EAX,DWORD PTR DS:[41C76C]
MOV DWORD PTR SS:[EBP-C],EAX
NOT DWORD PTR SS:[EBP-C]
NOT EAX
CALL GetProcessHeap
PUSH ECX
POP DWORD PTR SS:[EBP-14]
RDTSC
MOV ESP,ESP
XOR EAX,DWORD PTR DS:[41C770]
MOV DWORD PTR SS:[EBP-4],EAX
XOR EAX,DWORD PTR SS:[EBP-10]
XOR DWORD PTR SS:[EBP-4],6A9FB5F6
PUSH 0
CALL NEAR DWORD PTR DS:[421790]
RDTSC
PUSH AX
POP AX
MOV DWORD PTR SS:[EBP-8],EAX
INC ESI
CMP ESI,0A
JG SHORT 004029EC
MOV ECX,DWORD PTR SS:[EBP-4]
MOV EAX,DWORD PTR SS:[EBP-8]
SUB EAX,ECX
SUB ECX,DWORD PTR SS:[EBP-C]
XOR EDX,EDX
DIV ECX
CMP EAX,0A
JB @BOUCLE
XOR EAX,EAX
INC EAX
POP ESI
LEAVE
RET


Pour l'instant, les différents "Locky encodés" indiquent que les tables demeurent inchangées ce qui rends étonnamment le décodage assez simple ;) Ceci dit restons prudent dans ce constat car il n'est pas impossible que dans un futur proche celles-ci soient dynamiquement allouées / délivrées en fonction de certains critères. Ou peut-être voir l'ajout d'algorithmes similaires aux DGA/PRNG ( ( UHE PRNG ) ), avec des petites permutations ici & là et des marqueurs temporels pour borner les durées des campagnes. Bref, pour ne pas changer à leurs habitudes, ces criminels sont sans cesse en train de créer et de sophistiquer leurs codes car finalement une partie de leur survie en dépends.

Derniers IOC de Locky : https://otx.alienvault.com/pulse/576a6b ... d70d2777a/

thx: @siri_urz, @benkow_ & @Xylit0l, @peterkruse & @maciekkotowicz

22 Jun 2016 : L'argument est "123" ( ou 379, 635, 891, 1147, 1403, 1659, 1915, 2171, 2427, 2683, 2939, 3195, 3451, 3707, ... )
23 Jun 2016 : L'argument est "321" ( ou 65, 577, 833, 1089, 1345, 1601, 1857, 2113, 2369, 2625, 2881, 3137, 3393, 3649, ... )
ѠOOT

Re: 123 SOLEIL ! Nemucod & Locky seront sur nos plages (d'IP

par ѠOOT »

Code : Tout sélectionner

    import sys, hashlib, struct, requests

    def decode(data,seed,step):
        r = []
        k = seed
        for c in map(ord,data):
            r.append(chr(c ^ k))
            k = (k + step) % 256
        return ''.join(r)

    d = requests.get(sys.argv[1]).content
    if not d:
        print '[-] nope, no locky here'
        sys.exit(1)
    cksum = struct.unpack('I',d[-4:])[0]    
    d = d[:-4][::-1]
    seed = ord(d[0]) ^ ord('M')
    step = (ord(d[1]) ^ ord('Z')) - seed
    exe = decode(d,seed,step)
    pe_off = struct.unpack('H',exe[0x3c:0x3c+2])[0]
    if len(exe) > pe_off and exe[pe_off] == 'P' and exe[pe_off+1] == 'E':
        fname = hashlib.sha256(exe).hexdigest()
        print '[+] decoded with seed: %d and step: %d' % (seed,step)
        print '[+] saving as %s.exe' % fname
        with open(fname+'.exe','w') as f:
            f.write(exe)
    else:
        print '[-] nope, sorry world changed'
Merci à Maciej Kotowicz pour le partage de son script get_locky.py

nb: Si Python sous Windows, modifier la ligne.
with open(fname+'.exe','wb') as f:

Dziękuję Mak

Revenir à « Tech, Tips & Tricks »