Le premier email reçu hier en début d'après-midi répond au signalement suivant :

De: Missile Defense Agency <MissileDefenseAgencyOutreach@mda.mil>
Reply-to: MissileDefenseAgencyOutreach@mda.mil
Sujet: SPACE AND MISSILE SYSTEMS
Date: 22/12/2009 13:52:15

Attached Technology Space Anti-missile System.

Office of Small Business Programs
Missile Defense Agency
Office of Small Business Programs
Phone: (256) 955-4828
Email: MissileDefenseAgencyOutreach@mda.mil

Et en attachement un fichier PDF nommé MDA_SPACE_X.pdf d'une taille de 873031 octets[1]. Premier examen rapide. Il y a bien une "Missile Defense Agency", au sein de laquelle on trouve effectivement un "Office of Small Business Programs". L'adresse MissileDefenseAgencyOutreach@mda.mil existe également comme le confirme une recherche Google. La signature est conforme, puisque c'est un extrait de la page de contact de leur site web. Le méchant a fait ses devoirs. Grossièrement, mais il les a fait.

C'est du côté entêtes que ça pêche de suite :

Received: from unknown (HELO mda.mil) ([119.167.225.12]) 
 by avgw-mail with ESMTP; 22 Dec 2009 13:48:52 +0100
Received: from WTIDC-9F6FE63C0[119.167.225.12] by mda.mil 
 with SMTP id 63149CC9; Tue, 22 Dec 2009 20:52:12 +0800

Outre le fait que mda.mil ne résolve pas, il est évident que 119.167.225.12 n'est pas une IP utilisée outre-atlantique. C'est de l'autre côté du globe que ça se passe.

~$ whois 119.167.225.12
[...]
inetnum:      119.167.225.11 - 119.167.225.14
netname:      QD-QDWTWLJSYXGS
country:      CN
descr:        Qingdao-QingdaoWantuoWangluoJishuYouxianGongsi
admin-c:      DS95-AP
tech-c:       DS95-AP
status:       ASSIGNED NON-PORTABLE
changed:      ip@sdinfo.net 20081231
mnt-by:       MAINT-CNCGROUP-SD
source:       APNIC

Apparemment, les chinois m'en veulent... Ou pas... Pour info, les deux autres viennent d'adresses IP enregistrées à Hong Kong.

C'est bien tout ça, mais quid du payload ? L'attachement est un PDF de 830Ko environ qui se révèle totalement vide quand on l'ouvre[2]. Étrange, forcément, vue la taille. Un petit coup d'Origami devrait nous éclairer un peu plus :

~$ ./pdfscan.rb MDA_SPACE_X.pdf 
Reading file...
Fast scanning...
[File ID]
  File: MDA_SPACE_X.pdf
  FileSize: 873031
[Structure]
  Header: %PDF-1.6
  Revisions: 3
  Catalog: 1
  object: 21
  endobj: 18
  stream: 16
  endstream: 16
  /ObjStm: 5
  xref: 0
  trailer: 0
  startxref: 3
  Root (current): 
  Size (current): 
[Properties]
  /Encrypt: 0
  EmbeddedFile: 0
[Triggers]
  /OpenAction: 0
  /AA: 1
  /Names: 0
[Actions]
  /GoTo: 0
  /GoToR: 0
  /GoToE: 0
  /Launch: 0
  /Thread: 0
  /URI: 0
  /Sound: 0
  /Movie: 0
  /Hide: 0
  /Named: 0
  /SetOCGState: 0
  /Rendition: 0
  /Transition: 0
  /Go-To-3D: 0
  /JavaScript: 1
[FormActions]
  /AcroForm: 0
  /SubmitForm: 0
  /ResetForm: 0
  /ImportData: 0

Ah, mais quelle surprise ! Un JavaScript... On le sort rapidement avec le script extractjs.rb. Dans le code obtenu, on va en particulier trouver un gros bloc de données obfusquées grossièrement qu'on sent bien contenir le shellcode, ainsi qu'un test basique à la fin, histoire de nous faire saliver :

if ((ver>=8)||(ver<9.2)) decom(s);

Enfin, et surtout, ce bloc :

util.printd("1.345678901.345678901.3456 : 1.31.34", new Date());
util.printd("1.345678901.345678901.3456 : 1.31.34", new Date());
try {this.media.newPlayer(null);} catch(e) {}
util.printd("1.345678901.345678901.3456 : 1.31.34", new Date());

En quoi est-il intéressant ? Parce que c'est précisément ce qui était décrit sur le blog VRT de Sourcefire la semaine dernière (le gras est de moi) :

Basic detection can be developed from the following:
try {this.media.newPlayer(null);} catch(e) {}
util.printd("12345678901234567890123456 : 1231234", new Date());

Il est donc relativement surprenant qu'ayant affaire à un code d'exploitation connu et basique, ce document ait pu aussi facilement passer à travers la raquette. Qu'à cela ne tienne, on va uploader tout ça chez Virustotal et on verra bien le résultat. Verdict[3], seuls trois produits sur la quarantaine proposés remontent une alerte. Deux le détectent comme du code malicieux, bien. Le troisième n'y voit que quelque chose de suspicieux. On remarquera que trois versions de ce dernier produit sont testées et qu'une seule y trouve quelque chose à redire... Autre point notable, alors que du côté du VRT on nous explique que ClamAV dispose depuis la semaine dernière des signatures pour détecter ce code, il ne voit rien non plus. Trop basique certainement. De quoi se poser des questions sur la gueule de la règle Snort...

Update (30/12/2009) : je viens de repasser le fichier sur Virustotal est le score s'est amélioré depuis la semaine dernière et quelques exemplaires de plus dans ma BAL. On est passé à 11 sur 41. Déduisez-en ce que vous voulez...

Update (04/01/2010) : apparemment, des dérivés sont également arrivés jusqu'au SANS...

J'ai ensuite passé la main à des mains plus expertes que les miennes pour creuser plus avant. Le shellcode décodé et analysé, il apparaît qu'il va extraire deux binaires XORés dans le corps du PDF[4] et les exécuter. Le premier se charge d'afficher une fenêtre d'erreur banale à l'utilisateur histoire de faire passer le crash du lecteur PDF pour un problème sans importance. Le second semble constituer le malware proprement dit. Je n'ai pas encore de nouvelle de ce dernier, mais ça semble fort ressembler à des choses déjà publiées à droite et à gauche.


Alors en conclusion, qu'est-ce qu'on a sous les yeux ? Un bon gros malware des familles qui profite d'une faille connue et exploitée depuis un peu plus d'une semaine, avec un code d'exploitation connu lui aussi et même pas dissimulé. Et malgré cela, on dépasse péniblement les 7% de détection chez Virustotal. Ça doit être parce c'est à la virgule près ce que Metasploit a initialement proposé[5]... Allez savoir...

Ou bien c'est moi qui ne comprend rien aux subtilités de la détection de code malicieux...



PS: la vignette est un extrait légèrement retravaillé d'une planche de Three Panel Soul, comic dont je vous recommande chaudement la lecture.

Notes

[1] Les deux autres PDF portent des noms différents, mais font la même taille.

[2] Dans une sandbox et sans support JavaScript, cela va de soi.

[3] C'est la même chose pour les deux autres PDF.

[4] D'où sa taille...

[5] Et mis à jour entre temps.