web-dev-qa-db-fra.com

Comment fonctionne l'exploit EternalBlue?

J'ai cherché sur Google des explications sur le fonctionnement exact de l'exploit EternalBlue mais, je suppose que compte tenu de la tempête médiatique à propos de WannaCry, je n'ai été en mesure de trouver que des ressources qui, au mieux, disent que c'est un SMB exploit. J'obtiens qu'il y avait un bogue dans l'implémentation de Microsoft du protocole SMB, mais ce que j'aimerais savoir, c'est exactement quel type de charge utile devait être conçu pour exploiter la faille de sécurité de Microsoft, et qu'est-ce qui a fait mal Microsoft qui a rendu Windows vulnérable à une telle attaque? Même un lien (réputé) vers du code source serait plus que ce que j'ai pu trouver jusqu'à présent.

15
butallmj

Il y a un exploit pour EternalBlue dans Metasploit expliqué ici :

Il y a une opération memmove de dépassement de tampon dans Srv! SrvOs2FeaToNt. La taille est calculée dans Srv! SrvOs2FeaListSizeToNt, avec une erreur mathématique lorsqu'un DWORD est soustrait dans un mot. Le pool de noyaux est optimisé de sorte que le débordement soit bien organisé pour écraser un tampon SMBv1. Le détournement RIP réel est ensuite terminé dans srvnet! SrvNetWskReceiveComplete.

Je ne suis pas un expert et je ne comprends pas trop Ruby, mais d'après ce que je comprends, DWORD est deux fois plus long que Word, ce qui vous permettrait d'écrire en mémoire en envoyant un grand tampon. La mémoire du noyau est organisée (optimisée) pendant l'écriture des données, de sorte que la charge utile transmise a du sens une fois que le pointeur RIP est détourné et pointé vers la mémoire écrasée, qui sera ensuite lue et exécutée.

Vous pouvez voir le code source ici .

Pour ce qui a été mal fait, il aurait dû y avoir une soustraction de DWORD à DWORD ou de Word à Word. La différence de taille est ce qui a permis d'écraser la mémoire.

EDIT: Checkpoint a fait une écriture incroyable expliquant les 3 bugs liés à cet exploit, ce que j'ai compris du Ruby code que j'ai lu n'est que le bug 1/3 ( bug A dans l'écriture de Checkpoint), si vous voulez aller beaucoup plus loin, vérifiez-le.

15
Daniel V