mercredi 26 décembre 2007

Manipulate lsass.exe for fun and profit.

Bonjour à tous,
Alors déjà tout d'abord, un joyeux noël s'impose!
En espérant que le barbu vous a comblé :].
Revenons aux choses sérieuses.

C'est le fichier SAM qui va nous intérésser aujourd'hui.
Tout d'abord qui ne connais pas le fichier SAM?
C'est enfaite le fichier qui va contenir, les informations de sessions : les mots de pass y compris.
Il faut savoir que ce fichier est biensure, illisible, et inaccessible lorsque nous sommes sur notre session.
Il est en quelque sorte 'verrouillé' par le systeme.
Il existe donc deux alternatives pour nous :

- L'on boot sur une distribution linux par exemple, où l'on va copier le sam sur un périphérique de stockage.
- On utilise un outil comme pwdump.

Le fichier SAM contient les mots de pass encodé dans deux algorithme différent à savoir : LM hash et le NTLM hash.
Parlons à présent de lsass.exe.
C'est un processus natif de windows depuis Windows 2000 me semble t-il, lsass tout d'abord signifie "Local Security Authority Subsystem Service".
Autrement dit ce processus va permettre de gerer la connection aux sessions localement.
C'est en quelque sorte le serveur local d'authentification de windows.
Bon certains d'entres vous, pourraient se demander pourquoi on injecte dans lsass.exe et non dans un autre processus system?Comme svchost.exe.
J'ai moi même tenter d'injecter dans svchost.exe, mais sans réussite, je serais donc tenter de dire que les fonctions utilisées sont résérvées à lsass.exe ?
Je vous tiens au courant, lorsque j'en serais plus -> c'est qu'enfaite le service manipulant les users locaux est 'dirigé' par lsass.exe voir lien en bas de page.
Le mode opératoire est donc simple :

- Nous allons tout d'abord donner les droits de debugs à notre executable.
- Notre executable ira injecter une dll dans lsass.exe, c'est pour cela qui nous faut le debug privilege, afin d'injecter lsass.exe
- A présent à la dll de jouer !
- Elle va appeler successivement des apis exportés par samsrv.dll, qui seront ni plus ni moins des fonctions utilisés afin de 'rentrer' en contact avec le SAM.

Au final nous aurons 'manipuler' lsass.exe afin de pouvoir récupérer la liste des users, ainsi que leurs mot de pass hashés dans les deux algorythme cités plus haut.
Pour mener à bien ce projet, je me suis permis d'analyser les sources de pwdump un petit peu : ça permet de savoir un peu où l'on va.
Ce que je vous recommande aussi, c'est d'éviter de faire des tests sur votre propre système, car lsass.exe en cas de problème va vous faire redemarer.
Je vous conseille alors l'utilisation de machine virtuel, souvent abrégée 'vm' afin de pouvoir mener à bien vos tests !
Les quelques nostalgiques d'entre nous, se rappelleront du célèbre ver Sasser qui utilisait une faille présente dans le processus lsass.exe justement.
Enfin bref, je vous présente une petite vidéo réalisé par mes soins afin d'illustrer un peu cette article.
Elle montre que mon petit outil fonctionne à merveille :).
Voici le lien : s4mmy.wmv.

Je vous présente aussi un petit screenshot :



Et un autre :



Et enfin mon petit code :
- L'injecteur : s4mmy.c.
- La dll : sc0ubi.c.

Liens et outils utiles :

-Les sources du projet pwdump -> http://www.google.com/codesearch?hl=fr&q=show:XLfFm6CSy7k:uYtRtXzYO5g&sa=N&ct=rdp&cs_p=http://www.openwall.com/passwords/dl/pwdump/pwdump2.zip&cs_f=pwdump2
- Et notre fidèle LordPe, pour aller voir l'Export Address Section de samsrv.dll par exemple.
- Et biensure une machine virtuelle.
- LM Hash -> http://en.wikipedia.org/wiki/LM_hash.
- NTLM Hash -> http://en.wikipedia.org/wiki/NTLM.

Voilà pour cette article, en espérant que ça servira a certains cya.
scoubidoubidou !

PS : merci santa -> http://assiste.com.free.fr/p/services_windows/gestionnaire_de_comptes_de_securite.html

samedi 22 décembre 2007

Ownz fucking PE ou Comment corrompre un binaire?

Bonjour à tous,
En ce début de vacance, j'en profite pour vous faire part d'un petit article plutôt sympathique je trouve.
Il portera sur la corruption du Portable Executable, abrégé PE.
J'ai décidé de faire un tel article, pour m'introduire au vxing, ou l'art de créer un virus.
Le but de cet article est non pas de pouvoir comprendre comment un virus se reproduit ou autres, mais de s'amuser avec le PE.
Ce bricolage est, je trouve extremement intérréssant dans le sens ou l'on va jouer au 'bob le bricoleur'.
Le code illustrant l'article est enfaite un petit binaire qui va infecter un PE.
Il va l'infecter en lui faisant éxecuter une messagebox toute simple.
Je vous expose donc la technique que j'ai utilisé :

- On mappe le fichier en mémoire pour avoir une plus grande aisance à modifier le PE.
- On va ajouter une entête de section (IMAGE_SECTION_HEADER).
- On va incrementer le membre spécifiant le nombre de section au sein du binaire.
- On incremente la SizeOfImage de la taille de notre section, autrement dit on lui ajoute la taille de notre section.
- On va aussi rediriger le point d'entré de l'éxécutable sur notre futur section.
- On démappe le fichier.
- On l'ouvre CreateFile, on utilise SetFilePointer pour se positionner au PointerToRawData (membre de la structure IMAGE_SECTION_HEADER).
- On écrit en dur notre section.
- On écrit aussi l'adresse du 'vrai' point d'entré.
- On remplit la différence entre la taille écrite et la taille spécifié dans le PE c'est à dire la taille aligné sur le fileAlignment.

Voilà comment nous allons opérer notre binaire.
J'ai oublié de préciser que notre section sera composée d'un shellcode essentiellement (codé par 0mega7 et modifié par Baboon).
J'ai donc ajouter un jmp à la fin de notre shellcode, c'est pour cela qu'après l'avoir écrit, nous écrivons l'adresse du vrai point d'entré : Pour sauter dessus !
Bon je suis tout à fait d'accord avec vous, c'est un peu laborieux mon histoire, mais en codant ce pseudo-infecteur on y apprend, plusieurs choses comme l'alignement des données.
J'entend déjà d'ici les gouroux vxers me huer, je leur répondrais que c'est une étape avant de coder mon propre petit vx, prochain article peut être :).
Pour réaliser un tel code il faut absolument avoir une documentation détaillé sur le portable executable, biensure, je vous fournis ça en fin d'article.
Je voulais aussi revenir sur l'alignement des données : c'est enfaite avoir une taille multiple d'une autre définit dans le pe, tout simplement pour une manipulation plus aisée.
N'oublier pas d'utiliser LordPE, un outil vraiment génial pour controler les actions menées sur le PE, vérifier le nombre de section et j'en passe.
C'est un peu tout ce que j'ai à dire pour ce petit code, voici :
un petit screenshot :



le code : OwnzFuckingPE.c

Liens : - LA documentation -> http://ivanlef0u.free.fr/repo/windoz/pe/Le_format_PE.pdf .
- Pour vous documenter un peu sur le vxing -> http://ebixad.next-touch.com/repo/Vxing/Vx%20guide/intro.html .

L'article est normalement terminé, mais je tenais à vous faire part d'un petit crackme avec un niveau vraiment simple.
Ce qui m'a intéréssé c'est de coder le keygen, car il fallait tout simplement aller lire dans la mémoire du processus.
Juste un petit code de quelques lignes histoire d'illustrer l'api ReadProcessMemory.
Un petit Screenshot :



Le petit code : KeygenDefiGutte1.c

Voilà bonne journée à vous, en esperant que cela vous à intéréssé, cya.

PS : N'oublier pas de changer les adresses qui sont dites, hardcodé dans le shellcode.