Reconhecer escalação de privilégios no ABBYY FineReader

O ciclo de como encontro vulnerabilidades de escalação de privilégios nos aplicativos Windows continua. Na série anterior: Steam ( CVE-2019-14743 , CVE-2019-15316 , CVE-2019-17180 ) e Origem ( CVE-2019-19247, CVE-2019-19248 ). Hoje, porém, não estamos falando de um iniciador de jogos, mas do pacote de aplicativos ABBYY FinerReader.



Resumo - Vou lhe dizer como, graças ao componente que verifica a licença, em 10 minutos você pode aumentar seus direitos do nível de usuário para NT AUTHORITY \ SYSTEM. A vulnerabilidade foi atribuída ao identificador CVE-2019-20383, um link para o site da ABBYY .

Serviço de inteligência


Fiz o download da versão de avaliação do FineReader no site da ABBYY e a verifiquei rapidamente para ver se faz algum sentido escolher o produto para aumentar os privilégios. Sim, o produto inclui um serviço que, a julgar pelo nome "servidor de licenças de rede ABBYY", está associado às licenças e é iniciado por padrão no usuário NT AUTHORITY \ SYSTEM. Comecei o ProcMon começou a observar o comportamento do serviço.

Chamei minha atenção o arquivo localizado no caminho "C: \ ProgramData \ ABBYY \ FineReader \ 15 \ Licenses \ Licensing.cnt". O serviço lê algo, escreve algo, em geral, o arquivo parecia um candidato interessante para experimentos. Considere a pasta "C: \ ProgramData \ ABBYY \ FineReader \ 15 \ Licenses". A ACL de acesso total completo herdada da pasta pai ("C: \ ProgramData \ ABBYY \ FineReader \ 15") é válida para esta pasta, o que significa que você pode excluir todo o seu conteúdo, incluindo o arquivo "Licensing.cnt".

O serviço, tendo descoberto a ausência do arquivo, tentou criá-lo e de uma maneira um pouco estranha. Ele criou um arquivo no formato "tmpXXXX-YYYYYYYYY.tmp", escreveu alguns dados nele e o renomeou como "Licensing.cnt".

Aqui está o log do ProcMon no qual esta operação é realizada duas vezes.



Primeiro, acontece às 20:36 e depois às 20:46. Entre esses registros de data e hora, o arquivo foi excluído novamente para ser criado novamente.

O retângulo 1 indica a situação em que o serviço detectou a ausência de um arquivo. Retângulo 2 - crie um arquivo temporário. Retângulo 3 - renomeie o arquivo temporário. Retângulo 4 - repita as operações após 10 minutos.

Considere o formato do nome "tmpXXXX_YYYYYYYYY.tmp". Como parte de um processo em execução, XXXX sempre será constante; além disso, de fato, esse é o identificador do encadeamento que executa esse trabalho. AAAAAAAAA não permanece constante, mas se observarmos duas partidas vizinhas (valores: 430210515 e 430810515), parece que isso é apenas uma marca de tempo - a diferença entre os números 600000 - coincide surpreendentemente com 10 minutos da diferença. Mais alguns testes confirmam nossa suposição.
Para resumir esta parte. Qualquer usuário pode excluir o arquivo "C: \ ProgramData \ ABBYY \ FineReader \ 15 \ Licenses \ Licensing.cnt" e, muitas vezes, pode solicitar o conteúdo da pasta "C: \ ProgramData \ ABBYY \ FineReader \ 15 \ Licenses" em em algum momento, localize um arquivo chamado "tmpXXXX_YYYYYYYYY.tmp". Agora o usuário estará preparado, após excluir o arquivo, saberá exatamente em que momento e com que nome o arquivo será criado na próxima vez.

Agora vamos jogar com links simbólicos


Como criar links simbólicos sem direitos de administrador
, . . , , «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».

Inicialmente, o processo de criação de um arquivo de licença se parece com o seguinte:



Quando sabemos o momento exato da próxima operação, podemos criar os seguintes links simbólicos (pularemos o nome da pasta de origem “C: \ ProgramData \ ABBYY \ FineReader \ 15 \ Licenses \”): Onde YYYYYYYYA, YYYYYYYB, YYYYYYYYC, ... YYYYYYYYYZ - esses são carimbos de data / hora diferentes na área AAAAAAAAAA + 10 minutos (caso o carimbo de data / hora esteja um pouco atrasado). Em seguida, crie o link: Observe que nenhum desses arquivos realmente existe. Isso é necessário para que, ao se referir, por exemplo, a tmpXXXX_YYYYYYYYB.tmp, ocorram dois redirecionamentos e, como resultado, o serviço funcione com o arquivo "C: \ test \ l2 \ nope". Assim que descobrirmos a criação do arquivo "C: \ test \ l2 \ nope", devemos criar imediatamente dois novos links simbólicos:

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


O serviço continuará gravando o conteúdo do arquivo em "C: \ test \ l2 \ nope", mas o renomeará após passar pelo novo link simbólico. Portanto, em vez de renomear, por exemplo, “tmpXXXX_YYYYYYYYC.tmp” para “Licensing.cnt”, “C: \ test \ l2 \ payload” será realmente renomeado (movido) para “C: \ target \ path”. De fato, podemos colocar um arquivo com qualquer conteúdo em qualquer caminho em nome do usuário NT AUTHORITY \ SYSTEM .

Esquematicamente, ele ficará assim:



A cor indica o que realmente será executado devido à influência dos links simbólicos.

Aumentar privilégios usando a primitiva resultante já é fácil - você pode anexar sua dll a processos do sistema e outras coisas semelhantes. Nesse ponto, entrei em contato com os representantes da ABBYY e passei a eles informações sobre a vulnerabilidade.

No momento, de acordo com a ABBYY, a vulnerabilidade está fechada.

Linha do tempo


25/11/2019 - detecção de vulnerabilidade
26/11/2019 - contato de segurança solicitado do fabricante
26/11/2019 - envie um relatório de vulnerabilidade ao fabricante
09/09/2019 - a vulnerabilidade foi confirmada pelo fabricante
10/01/2020 - a vulnerabilidade foi corrigida
em 22/01/2020 - as vulnerabilidades foram atribuídas CVE-2019-20383
19/02/2019 .2020 - publicação deste artigo

Atualmente, existem muitos projetos e estamos expandindo a equipe de “Monitoramento Prospectivo”. Estamos procurando especialistas no estudo de códigos-fonte, bem como especialistas na análise de aplicativos móveis. Deseja fazer parte da minha equipe - escreva-me, Anastasia (Ana2121) ou pelo e-mail info@amonitoring.ru

Este artigo em inglês.

All Articles