Reconnaître l'escalade de privilèges dans ABBYY FineReader

Le cycle de recherche des vulnérabilités d'élévation de privilèges dans les applications Windows se poursuit. Dans la série précédente: Steam ( CVE-2019-14743 , CVE-2019-15316 , CVE-2019-17180 ) et Origin ( CVE-2019-19247, CVE-2019-19248 ). Mais aujourd'hui, nous ne parlons pas d'un lanceur de jeu, mais du progiciel d'application ABBYY FinerReader.



Résumé - Je vais vous dire comment, grâce au composant qui vérifie la licence, en 10 minutes vous pouvez augmenter vos droits du niveau utilisateur à NT AUTHORITY \ SYSTEM. La vulnérabilité a reçu l'identifiant CVE-2019-20383, un lien vers le site Web d'ABBYY .

Service de renseignements


J'ai téléchargé la version d'essai de FineReader sur le site Web d'ABBYY et je l'ai rapidement vérifiée pour voir s'il était judicieux de choisir le produit pour augmenter les privilèges. Oui, le produit inclut un service qui, à en juger par le nom "serveur de licences réseau ABBYY", est associé à des licences et est lancé par défaut à partir de l'utilisateur NT AUTHORITY \ SYSTEM. J'ai commencé ProcMon a commencé à surveiller le comportement du service.

Mon attention a été attirée sur le fichier situé sur le chemin "C: \ ProgramData \ ABBYY \ FineReader \ 15 \ Licenses \ Licensing.cnt". Le service en lit quelque chose, y écrit quelque chose, en général, le fichier ressemble à un candidat intéressant pour les expériences. Considérez le dossier "C: \ ProgramData \ ABBYY \ FineReader \ 15 \ Licenses". La liste de contrôle d'accès héritée All-Full Access du dossier parent («C: \ ProgramData \ ABBYY \ FineReader \ 15») est valide pour ce dossier, ce qui signifie que vous pouvez supprimer tout son contenu, y compris le fichier «Licensing.cnt».

Le service, ayant découvert l'absence du fichier, a tenté de le créer, et de manière un peu étrange. Il a créé un fichier de la forme «tmpXXXX-YYYYYYYYY.tmp», y a écrit des données, puis l'a renommé «Licensing.cnt».

Voici le journal ProcMon dans lequel cette opération est effectuée deux fois.



Tout d'abord, cela se produit à 20h36, puis à 20h46. Entre ces horodatages, le fichier a été supprimé à nouveau pour être à nouveau créé.

Le rectangle 1 indique la situation où le service a détecté l'absence de fichier. Rectangle 2 - créez un fichier temporaire. Rectangle 3 - renommez le fichier temporaire. Rectangle 4 - répétez les opérations après 10 minutes.

Considérez le format du nom "tmpXXXX_YYYYYYYYY.tmp". Dans le cadre d'un processus en cours, XXXX sera toujours constant, d'ailleurs, en fait, c'est l'identifiant du thread qui effectue ce travail. YYYYYYYYY ne reste pas constant, mais si nous regardons deux départs voisins (valeurs: 430210515 et 430810515), il semble que ce ne soit qu'une marque de temps - la différence entre les nombres 600000 - coïncide étonnamment avec 10 minutes de différence. Quelques tests supplémentaires confirment notre hypothèse.
Pour résumer cette partie. Tout utilisateur peut supprimer le fichier "C: \ ProgramData \ ABBYY \ FineReader \ 15 \ Licenses \ Licensing.cnt", puis il peut très souvent demander le contenu du dossier "C: \ ProgramData \ ABBYY \ FineReader \ 15 \ Licenses" dans à un moment donné, trouvez-y un fichier appelé "tmpXXXX_YYYYYYYYY.tmp". Maintenant, l'utilisateur sera prêt, après avoir supprimé le fichier, il saura exactement à quel moment et avec quel nom le fichier sera créé la prochaine fois.

Nous allons maintenant jouer avec des liens symboliques


Comment créer des liens symboliques sans droits d'administrateur
, . . , , «C:\abc\1» «C:\def\2».

NTFS reparse point ( NTFS mount point) «C:\abc» «\RPC Control\". «\RPC Control\» – , , , . , , , , . NTFS reparse point , , . - , - .

. "\RPC Control\1" <-> «C:\def\2». , «C:\abc\1», «C:\def\2».

Initialement, le processus de création d'un fichier de licence ressemble à ceci:



lorsque nous connaissons le moment exact de la prochaine opération, nous pouvons créer les liens symboliques suivants (nous ignorerons le nom du dossier source «C: \ ProgramData \ ABBYY \ FineReader \ 15 \ Licenses \»): Où YYYYYYYYYA, YYYYYYYYB, YYYYYYYYC, ... YYYYYYYYYZ - ce sont des horodatages différents dans le YYYYYYYYYY + 10 minutes (au cas où l'horodatage serait légèrement en retard). Ensuite, créez un lien: notez qu'aucun de ces fichiers n'existe vraiment. Cela est nécessaire pour que, lorsque vous vous référez, par exemple, à tmpXXXX_YYYYYYYYB.tmp, deux redirections se produisent et, par conséquent, le service fonctionne avec le fichier "C: \ test \ l2 \ nope". Dès que l'on découvre la création du fichier «C: \ test \ l2 \ nope», il faut immédiatement créer deux nouveaux liens symboliques:

tmpXXXX_YYYYYYYYA.tmp <-> C:\test\l1\proxy
tmpXXXX_YYYYYYYYB.tmp <-> C:\test\l1\proxy
tmpXXXX_YYYYYYYYC.tmp <-> C:\test\l1\proxy

tmpXXXX_YYYYYYYYZ.tmp <-> C:\test\l1\proxy






C:\test\l1\proxy <-> C:\test\l2\nope




C:\test\l1\proxy <-> C:\test\l2\payload
Licensing.cnt <-> C:\target\path


Le service continuera à écrire le contenu du fichier dans «C: \ test \ l2 \ nope», mais il fera le changement de nom après avoir traversé le nouveau lien symbolique. Ainsi, au lieu de renommer, par exemple, "tmpXXXX_YYYYYYYYC.tmp" en "Licensing.cnt", "C: \ test \ l2 \ payload" sera en fait renommé (déplacé) en "C: \ target \ path". En fait, nous pouvons placer un fichier avec n'importe quel contenu dans n'importe quel chemin au nom de l'utilisateur NT AUTHORITY \ SYSTEM .

Schématiquement, cela ressemblera à ceci:



La couleur indique ce qui sera réellement réalisé en raison de l'influence des liens symboliques.

Augmenter les privilèges en utilisant la primitive résultante est déjà facile - vous pouvez attacher votre dll aux processus système et à d'autres choses similaires. À ce stade, j'ai contacté les représentants d'ABBYY et leur ai transmis des informations sur la vulnérabilité.

À l'heure actuelle, selon ABBYY, la vulnérabilité est fermée.

Chronologie


25/11/2019 - détection de vulnérabilité
26/11/2019 - contact de sécurité demandé au fabricant
26/11/2019 - envoyer le rapport de vulnérabilité au fabricant
12/09/2019 - la vulnérabilité a été confirmée par le fabricant
10/01/2020 - la vulnérabilité a été corrigée
le 22/01/2020 - des vulnérabilités ont été attribuées CVE-2019-20383
19/02/2019 .2020 - publication de cet article

Il y a maintenant de nombreux projets et nous agrandissons l'équipe «Prospective Monitoring». Nous recherchons des experts dans l'étude des codes sources, ainsi que des experts dans l'analyse des applications mobiles. Vous voulez rejoindre mon équipe - écrivez-moi, Anastasia (Ana2121) ou par mail info@amonitoring.ru

Cet article en anglais.

All Articles