Skip to main content

>/ MAC Spoofing na Prática: Construindo e Explorando um Firewall com Docker e Python_

·4621 words·22 mins·
Table of Contents

1 - Introdução: A Falsa Sensação de Segurança na Camada 2: 🛡️
#

Talvez você se lembre do caso de Aaron Swartz, um programador e hacktivista que acreditava no acesso livre à informação. Em 2010, Aaron utilizou técnicas como o MAC spoofing para acessar a rede do MIT (Massachusetts Institute of Technology) e, supostamente, baixar milhões de artigos acadêmicos da base de dados JSTOR. Independentemente da ética e das questões legais de suas ações, o caso de Aaron Swartz mostra de forma contundente uma verdade técnica: o endereço MAC, apesar de ser um identificador único de hardware na camada de enlace (ou Camada 2 no modelo OSI), pode ser facilmente falsificado.

E é exatamente essa técnica que exploraremos por aqui.

1.1 - O Que é Endereço MAC?
#

Endereços MAC (Media Access Control) são identificadores de hardware de 48 bits. Para entender melhor, pense neles como o “RG” de uma placa de rede (NIC - Network Interface Controller).

Os primeiros 24 bits (chamados OUI - Organizationally Unique Identifier) identificam o fabricante do dispositivo, e os 24 bits restantes são um valor único gerado pelo fabricante para aquela interface específica.

Exemplo de um endereço MAC:

  • 00:1A:2B:3C:4D:5E

Tipos de Endereços MAC: Unicast, Multicast e Broadcast

Além de serem únicos para cada dispositivo, os endereços MAC também têm classificações que determinam como os pacotes de dados são entregues na rede local:

  • Unicast: Este é o tipo mais comum, onde o pacote de dados é enviado de um único remetente para um único destinatário. O endereço MAC de destino é o endereço específico de uma única interface de rede. Se o primeiro bit do segundo octeto do MAC for 0 (ex: 00:1A:2B…), é um endereço Unicast.

  • Multicast: Um pacote Multicast é enviado de um único remetente para um grupo específico de destinatários que estão “escutando” para aquele endereço Multicast. É usado para entrega eficiente de informações a múltiplos pontos de interesse sem sobrecarregar toda a rede (como faria um broadcast). Endereços Multicast têm o primeiro bit do segundo octeto do MAC como 1 (ex: 01:00:5E…).

  • Broadcast: Este é o tipo mais amplo, onde um pacote é enviado de um remetente para todos os dispositivos na mesma rede local. O endereço MAC de Broadcast é FF:FF:FF:FF:FF:FF. Todos os dispositivos na rede processam pacotes enviados para este endereço.

1.2 - O Que é MAC Spoofing?
#

Para falar da vulnerabilidade que permitiu casos como o de Aaron Swartz, precisamos entender o que é MAC Spoofing. Imagine que seu computador tem uma “identidade” na rede local. Essa identidade é o seu Endereço MAC, um número único “gravado” na sua placa de rede (NIC) durante a fabricação.

De acordo com o paper GIAC Security Essentials Certification do SANS Institute, MAC spoofing, ou falsificação de MAC, é essencialmente o roubo de identidade de um computador. Isso se refere à alteração do endereço MAC em uma placa NIC, seja por razões legítimas ou, como veremos, ilegítimas.

Como o MAC Spoofing é Realizado:
#

Embora o endereço MAC seja “gravado” na fábrica, a verdade é que ele pode ser alterado. Existem duas formas principais de fazer isso:

  • Hardware: Este método envolve alterar as configurações EEPROM da placa de rede. É um processo mais complexo, que exige mais conhecimento técnico e é menos comum em ataques, sendo mais utilizado por “usuários autorizados” para necessidades específicas de rede.

  • Software: Este é o método mais fácil e comum, e o que nos interessa aqui. Ferramentas e técnicas de software permitem que você mude o endereço MAC que sua placa de rede apresenta para a rede, sem tocar no hardware em si.

Hackers podem usar “sniffers” para capturar o tráfego da rede, extrair endereços MAC de dispositivos autorizados e, em seguida, configurar sua própria estação com um desses MACs falsificados.

Por Que o MAC Spoofing é Realizado (Usos):
#

O MAC spoofing pode ter usos legítimos, mas é mais frequentemente associado a razões não legítimas no contexto de segurança.

Usos Não Legítimos (Maliciosos):

  • Roubo de Identidade e Entrada Não Autorizada: Um atacante pode se passar por um usuário autorizado alterando seu MAC, ganhando acesso a uma rede sem levantar suspeitas.

  • Ataques e Evasão de Segurança: Com uma nova identidade, o atacante pode lançar ataques (como negação de serviço) ou burlar controles de acesso. A alteração do MAC também ajuda a evadir sistemas de detecção de intrusão, tornando o atacante “invisível” por mais tempo.

  • Hijacking de Sessões: Similar ao IP spoofing, pode ser usado para tentar sequestrar uma sessão de comunicação.

Usos Legítimos (Autorizados):

  • Reconfiguração de Dispositivos: Mudar a função de um PC ou roteador.

  • Conexões Wireless: Para estabelecer certas conexões.

  • Troca de Equipamentos: Facilitar a troca de PCs conectados a um modem, evitando reconfigurações complexas.

  • Sistemas de Failover (Hot Backup): Usar o mesmo MAC do sistema primário para transições rápidas e sem interrupção.

  • Solução de Problemas e Testes: Debugar redes, testar ferramentas de gerenciamento ou sistemas de detecção de intrusão.

Em Pentesting, o MAC spoofing é uma ferramenta poderosa:

  • Permite especificar endereços MAC arbitrários para testes.

  • Pode ser usado para realizar scans indetectáveis, falsificando tanto o IP quanto o MAC de origem.

  • Útil para testar redirecionamento de tráfego, pontos de acesso e firewalls, além de adquirir informações de hosts remotos.

MAC Spoofing vs. IP Spoofing:

O MAC spoofing é frequentemente considerado o “primo mais sofisticado” do IP spoofing. Embora o IP spoofing receba mais atenção na mídia, o MAC spoofing é uma ferramenta mais versátil e poderosa para invadir uma rede ou para testes de penetração. Enquanto o IP spoofing foca em enviar dados de um endereço de origem falso sem necessariamente esperar uma resposta, o MAC spoofing geralmente busca assumir a identidade MAC de um dispositivo autorizado para se integrar e operar dentro da rede.


2 - Criando o MAC Changer em Python: 🐍
#

Uma das melhores formas de se aprender é praticando. Por isso, resolvi criar um MAC Changer simples em Python, mas bem útil para o aprendizado.

Usei Python por alguns motivos:

  • Prototipagem: É uma ótima linguagem para prototipar ideias rapidamente.

  • Facilidade: Sua sintaxe é limpa e intuitiva, facilitando o desenvolvimento.

  • Interação com Sistema Operacional: Possui uma ótima interação com o sistema operacional, especialmente usando módulos como subprocess.

  • Biblioteca Gigantesca: Tem uma biblioteca gigantesca para quase tudo o que você precisar.

Python possui um módulo chamado subprocess, que, em resumo, permite que você crie e gerencie novos processos, executando comandos e programas externos diretamente do script em Python.

2.1 - Dissecando o Script:
#

Não tem nada demais no script, mas ele cumpre o que foi proposto: trocar o MAC da nossa interface de rede.

Primeiro, utilizamos o módulo argparse para tornar o script mais profissional e configurável pela linha de comando. Isso nos permite especificar facilmente qual interface (-i ou –interface) queremos modificar e qual o novo endereço MAC (-m ou –mac) desejamos aplicar.

import subprocess
import argparse

def get_arguments():
    parser = argparse.ArgumentParser(
        prog='MAC CHANGER V1',
        description='Script que altera o MAC address do Linux'
    )
    parser.add_argument('-i', '--interface', 
                        type=str, 
                        dest='interface', 
                        help='Nome da Interface de rede', 
                        required=True)
    parser.add_argument('-m', '--mac', 
                        type=str, 
                        dest='new_mac', 
                        help='Novo MAC Address', 
                        required=True)
    return parser.parse_args()

def change_mac(interface, new_mac):
    print(f"[+] Alterando MAC address da interface {interface} para {new_mac}")
    # 1. Desativar a Interface: Necessário para que a alteração seja aplicada.
    subprocess.call(["ifconfig", interface, "down"])
    # 2. Alterar o Endereço MAC: Usamos 'hw ether' com 'ifconfig' para definir o novo MAC.
    subprocess.call(["ifconfig", interface, "hw", "ether", new_mac])
    # 3. Reativar a Interface: Trazemos a interface de volta ao ar com sua nova identidade.
    subprocess.call(["ifconfig", interface, "up"])

if __name__=="__main__":
    args = get_arguments()
    change_mac(args.interface, args.new_mac)

O código é composto por três etapas sendo executadas através de chamadas ao subprocess.call para invocar o comando ifconfig (um clássico em sistemas Linux para configuração de interfaces):

  • Desativar a Interface (ifconfig down): Antes de mudar o endereço MAC, é essencial que a interface de rede esteja “abaixada”, ou seja, temporariamente desativada. Isso garante que o sistema possa aplicar a nova configuração sem conflitos.

  • Alterar o Endereço MAC (ifconfig hw ether ): Uma vez que a interface está “down”, o comando ifconfig é utilizado com as opções hw ether para definir o novo endereço MAC.

  • Reativar a Interface (ifconfig up): Após a alteração, a interface é “levantada” novamente, tornando-se ativa na rede com seu novo endereço MAC.


3 - Criando o Laboratório com Docker: 🐳
#

Recomendo fortemente a criação de laboratórios para testes quando o assunto é cibersegurança e redes. Até porque o script que criamos funciona em sistemas Linux; se você estiver no Windows, já sabe que a abordagem será diferente. E, outra coisa importante: você não vai querer mudar o MAC da sua própria máquina principal, certo? Acredito que não!

Poderíamos usar máquinas virtuais para isso, mas resolvi usar Docker. Por que? Ele é mais leve, me dá mais controle e é super descartável – o que é uma boa forma de aprender sobre redes em containers.

Alguns dos motivos que me fizeram escolher o Docker são:

  • Isolamento e Controle: Cada container é um ambiente isolado. Se algo der errado (o que é bem normal em testes de segurança!), não afeta seu host principal. É como uma caixa de areia segura para experimentos.

  • Facilidade de Criação e Destruição: É incrivelmente rápido subir e derrubar containers. Isso permite que façamos testes repetidos e descartemos o ambiente assim que terminamos, mantendo tudo limpo.

  • Reprodução Consistente: Garante que o ambiente de teste seja sempre o mesmo, não importa onde ou quando você o execute. Isso é vital para validar os resultados de um ataque e garantir que o experimento seja replicável.

3.1 - A Topologia da Rede
#

Para simular um cenário de rede real e testar nosso script de MAC spoofing, vamos criar uma rede customizada no Docker. Eu a chamarei de mac_test_net. Ela será do tipo “bridge”, o que faz com que atue como um switch virtual, conectando nossos containers e permitindo que se comuniquem.

No nosso laboratório, teremos três “máquinas” (containers), cada uma com um papel específico:

  • docker_server (O Alvo Protegido): Este é o nosso servidor “protegido”, rodando um serviço SSH e um firewall iptables que, em tese, só permite acesso de um MAC específico.

  • docker_simple_victim (A Vítima Legítima): Um container simples que serve apenas para ter seu endereço MAC descoberto e “roubado” pelo atacante.

  • docker_attacker (O Agente Malicioso): Nosso container de onde rodaremos o script de MAC changer e de onde partiremos com as tentativas de conexão SSH.

3.2 - Criando o Alvo: docker_server com Firewall IPTables
#

O docker_server precisa de duas coisas principais para nosso experimento: um serviço SSH para tentarmos acessar e um firewall iptables que fará a filtragem por MAC.

Usaremos um Dockerfile que se baseia em uma imagem Ubuntu. Dentro dele, instalaremos o OpenSSH e criaremos um usuário (docker_server) que usaremos para as tentativas de login. A mágica do firewall acontece através do script setup_iptables.sh, que será executado na inicialização do container.

A lógica do firewall é bem clara:

  • Bloqueio Padrão: Na corrente INPUT da tabela filter, qualquer conexão TCP que tente alcançar a porta 22 (SSH) será inicialmente descartada (DROP). Essa é a regra “default-deny” para o SSH – só entra quem é permitido.

  • Permissão Seletiva por MAC: Adicionaremos uma regra antes do bloqueio padrão que diz: “Se um pacote TCP chegar na porta 22 e o endereço MAC de origem for exatamente 02:42:0a:0a:00:03 (o MAC da nossa docker_simple_victim), então aceite (ACCEPT) a conexão.”

Essa configuração reflete um erro comum de segurança: confiar cegamente na filtragem de Camada 2. Para que o iptables possa manipular as regras de rede no container, precisamos garantir que o docker_server seja executado com a capacidade –cap-add=NET_ADMIN.

Dockerfile para docker_server:
#

# docker_server/Dockerfile
FROM ubuntu:latest

# Define variáveis de ambiente para o usuário
ARG USER_NAME=docker_server
ARG USER_UID=1001
ARG USER_GID=1001

# Evita que o apt faça perguntas interativas durante a instalação
ENV DEBIAN_FRONTEND=noninteractive

# Atualiza a lista de pacotes e instala as ferramentas necessárias:
# - net-tools, iproute2, curl: Ferramentas de rede básicas
# - iptables: Para o firewall
# - python3, sudo: Para o script de iptables e permissões
# - openssh-server: O servidor SSH que vamos proteger
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    net-tools \
    iproute2 \
    iptables \
    python3 \
    sudo \
    curl \
    openssh-server \
    && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Cria o grupo e o usuário não-root 'docker_server'
# Este será o usuário que você usará para tentar logar via SSH
# O usuário é adicionado ao grupo 'sudo' e configurado para não pedir senha
RUN groupadd -g ${USER_GID} ${USER_NAME} && \
    useradd -u ${USER_UID} -g ${USER_GID} -m -s /bin/bash ${USER_NAME} && \
    echo "${USER_NAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USER_NAME} && \
    chmod 0440 /etc/sudoers.d/${USER_NAME}

# Configurações do Servidor SSH:
# - PermitRootLogin yes: Permite que o root faça login (apenas para teste!)
# - PasswordAuthentication yes: Permite login por senha (mais fácil para o teste)
# - UsePAM no: Desabilita PAM para simplificar, já que não temos um sistema PAM completo.
# - StrictModes no: Evita problemas de permissão com chaves SSH se houver.
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \
    sed -i 's/UsePAM yes/UsePAM no/' /etc/ssh/sshd_config && \
    sed -i 's/#StrictModes yes/StrictModes no/' /etc/ssh/sshd_config

# ---- NOVA LINHA DE CORREÇÃO: Cria o diretório /var/run/sshd explicitamente ----
# Alguns sistemas esperam /var/run/sshd e não apenas /run/sshd (que é um link simbólico)
RUN mkdir -p /var/run/sshd

# Define uma senha para o usuário 'docker_server' (para o teste de SSH)
RUN echo "${USER_NAME}:senha123" | chpasswd

# Define o diretório de trabalho padrão para o usuário.
WORKDIR /home/${USER_NAME}

# Copia o script de configuração do IPTables para dentro do container
COPY setup_iptables.sh .
# Garante que o script seja executável
RUN chmod +x setup_iptables.sh

# Gera as chaves SSH do host (essencial para o sshd iniciar)
RUN ssh-keygen -A

# Expõe a porta 22 (SSH)
EXPOSE 22

# O SSHD e o script de IPTables precisam de privilégios de root para funcionar corretamente.
USER root

# ---- NOVA LINHA CMD PARA INICIAR SSHD DE FORMA MAIS ROBUSTA ----
# Garante que o script de iptables seja executado E que o sshd seja o processo principal.
# O 'sh -c' é mais flexível aqui.
CMD ["/bin/sh", "-c", "/home/docker_server/setup_iptables.sh && /usr/sbin/sshd -D"]

Script setup_iptables.sh:
#

#!/bin/bash
# docker_vuln/setup_iptables.sh

echo "Configurando IPTables para o servidor docker_vuln (SSH)..."

# 1. Limpa todas as regras de firewall existentes (ESSENCIAL PARA GARANTIR UM ESTADO LIMPO)
sudo iptables -F         # Limpa todas as regras das cadeias padrão
sudo iptables -X         # Deleta cadeias não-padrão
sudo iptables -Z         # Zera os contadores de pacotes/bytes

# 2. Permite o tráfego de loopback (comunicação interna do próprio container)
sudo iptables -A INPUT -i lo -j ACCEPT

# 3. Permite o tráfego ICMP (ping) para que você possa testar a conectividade básica
sudo iptables -A INPUT -p icmp -j ACCEPT

# --- REGRA CRUCIAL: Define qual MAC tem permissão para acessar o SSH ---
# Este MAC deve ser o MAC da sua futura máquina 'docker_legit'.
MAC_DA_MAQUINA_LEGITIMA="02:42:0A:0A:00:03" # <-- DEFINA O MAC DA SUA 'docker_legit' AQUI!

echo "MAC permitido para acesso SSH na porta 22: $MAC_DA_MAQUINA_LEGITIMA"

# 4. Permite acesso SSH (porta 22) APENAS se a origem do pacote for o MAC_DA_MAQUINA_LEGITIMA
sudo iptables -A INPUT -p tcp --dport 22 -m mac --mac-source "$MAC_DA_MAQUINA_LEGITIMA" -j ACCEPT

# 5. Permite conexões já estabelecidas (essencial para que as respostas do SSH voltem)
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# 6. REGRA DE BLOQUEIO PADRÃO: Bloqueia TODO o resto do tráfego TCP na porta 22
# Qualquer outro MAC, ou tráfego não explicitamente permitido, será DROPPADO aqui.
sudo iptables -A INPUT -p tcp --dport 22 -j DROP

echo "IPTables configurado com sucesso."

# O 'exec "$@"' no CMD do Dockerfile garante que o sshd seja o processo principal.
# Este script apenas configura e sai.
exec "$@"

3.3 - Criando o Atacante e a Vítima:
#

Para completar nosso cenário de teste, precisamos dos outros dois containers: o docker_attacker e o docker_simple_victim.

  • docker_attacker: Este container será a base para o nosso atacante. Ele será construído a partir de uma imagem Ubuntu e terá as ferramentas necessárias para o ataque instaladas: arp-scan (para descobrir IPs e MACs na rede), python3 e sudo. Para que nosso script de MAC changer funcione, o container docker_attacker também precisará ser executado com a capacidade –privileged, pois a alteração do MAC é uma operação de baixo nível que exige privilégios elevados.

Dockerfile para docker_attacker:
#

# docker_attack/Dockerfile
# Usa a imagem base do Ubuntu na versão 'rolling'
FROM ubuntu

# Define variáveis de ambiente para o usuário
ARG USER_NAME=docker_attacker
ARG USER_UID=1001
ARG USER_GID=1001

# Evita que o apt faça perguntas interativas durante a instalação
ENV DEBIAN_FRONTEND=noninteractive

# Atualiza a lista de pacotes e instala as ferramentas CLI que você precisa
# Inclui 'sudo' para o usuário não-root poder executar comandos como root
# ADICIONADO: arp-scan, nmap (para descoberta de rede) e openssh-client (para SSH)
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    htop \
    curl \
    git \
    sudo \
    python3 \
    python3-pip \
    net-tools \
    iproute2 \
    arp-scan \
    nmap \
    openssh-client \
    && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Cria o grupo e o usuário não-root com os IDs especificados
# Adiciona o usuário ao grupo 'sudo' e configura para não pedir senha ao usar sudo
RUN groupadd -g ${USER_GID} ${USER_NAME} && \
    useradd -u ${USER_UID} -g ${USER_GID} -m -s /bin/bash ${USER_NAME} && \
    echo "${USER_NAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USER_NAME} && \
    chmod 0440 /etc/sudoers.d/${USER_NAME}

# Define o diretório de trabalho padrão para o usuário não-root
WORKDIR /home/${USER_NAME}

# Copia o script MAC changer para o diretório de trabalho do usuário
# Certifique-se de que seu script Python esteja no mesmo diretório que este Dockerfile
COPY mac_changer_script.py .

# Troca para o usuário não-root.
USER ${USER_NAME}

# Comando padrão que será executado quando o contêiner iniciar sem um comando específico.
# Isso te dá acesso direto ao shell Bash do 'meuusuario'.
CMD ["bash"]
  • docker_victim: Este é o container mais simples de todos. Ele terá apenas o necessário para existir na rede e obter um endereço MAC. Seu único propósito é ter seu MAC descoberto pelo docker_attacker, servindo como a “identidade” a ser falsificada.

Dockerfile para docker_simple_victim:
#

# docker_victim/Dockerfile
FROM ubuntu:latest

# Instala um pacote básico para que o container não saia imediatamente
# E ferramentas de rede para debugging se precisar
RUN apt-get update && apt-get install -y iputils-ping net-tools && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# Comando que mantém o container rodando indefinidamente pois não tem nenhum serviço em exec.
CMD ["tail", "-f", "/dev/null"]

4 - A Demonstração: Executando o Ataque na Prática: 🧑🏻‍💻
#

Agora vamos testar se toda nossa teoria se põe em prática, simulando o ataque (mesmo que simples) no laboratório Docker. Prepare-se, porque a hora da verdade chegou!

4.1 - Preparando o Terreno: Subindo os Containers
#

Primeiro, precisamos garantir que nossa rede Docker e todos os containers estejam prontos. Imagine que você já tem os Dockerfiles e o script mac_changer_script.py organizados em seus respectivos diretórios.

Crie a Rede Docker:
#

Vamos começar criando a rede personalizada, definindo um range de IPs para ela.

# --driver bridge: Usa o modo de rede "bridge", que cria uma rede isolada onde os containers podem se comunicar entre si.
# --subnet 10.10.0.0/24: Define o bloco de rede que o Docker usará para atribuir IPs aos containers (ex: 10.10.0.0 a 10.10.0.255).
# --ip-range 10.10.0.0/24: Especifica o pool de IPs dentro do subnet que o Docker pode alocar.
docker network create --driver bridge --subnet 10.10.0.0/24 --ip-range 10.10.0.0/24 mac_test_net

Construa as Imagens Docker:
#

Navegue até o diretório onde você salvou os Dockerfiles para o docker_server, docker_attacker e docker_victim, e construa as imagens.

# O ponto final (.) no comando `docker build` indica que o contexto da build é o diretório atual.
# Ou seja, o Docker vai procurar o Dockerfile e os arquivos necessários (como o script de IPTables ou o script Python)
# dentro da pasta onde você está executando o comando.

# Na pasta do Dockerfile do docker_server
docker build -t docker_server_image .

# Na pasta do Dockerfile do docker_attacker
docker build -t docker_attacker_image .

# Na pasta do Dockerfile do docker_simple_victim
docker build -t docker_simple_victim_image .

Inicie os Containers:
#

Agora, vamos iniciar os containers. Preste atenção nas flags, pois elas são cruciais para o funcionamento do nosso lab:

  • --privileged: Para o container atacante, que é necessário para permitir que ele manipule as interfaces de rede de baixo nível, como a alteração do MAC address.

  • --cap-add=NET_ADMIN: Para o container servidor, para que ele possa usar o iptables e configurar as regras de firewall.

  • --mac-address: Para a vítima, a flag permite definir um MAC específico para o container ao iniciá-lo, o que é ótimo para nosso teste, pois garantimos que o MAC usado no setup_iptables.sh (do servidor) seja exatamente o mesmo da vítima.

# Iniciar o servidor com o firewall
docker run -d --name docker_server --network mac_test_net --cap-add=NET_ADMIN docker_server_image

# Iniciar a vítima (com o MAC que você usou no script iptables do servidor!)
docker run -d --name docker_victim --network mac_test_net --mac-address 02:42:0A:0A:00:03 docker_victim_image

# Iniciar o atacante
docker run -d --name docker_attacker --network mac_test_net --privileged docker_attacker_image

4.2 - O Reconhecimento: Descobrindo o MAC da Vítima
#

Obviamente, sabemos o MAC da vítima, pois o setamos manualmente no comando de docker run (e no script iptables.sh). Porém, como é um laboratório, tudo bem! Mas em um cenário real, você precisaria descobrir esse MAC. Aqui vai uma das formas mais comuns de se fazer isso:

Com o laboratório montado, o primeiro passo do atacante em um cenário real seria o reconhecimento. Precisamos descobrir qual o endereço MAC da docker_simple_victim, que é a máquina “autorizada” pelo firewall do docker_server.

  1. Acessar o Atacante: Entre no shell do container docker_attacker.
docker exec -it docker_attacker bash
  1. Localizar o IP + MAC de todos na rede com arp-scan: Dentro do docker_attacker, vamos usar o arp-scan para escanear a rede e encontrar os IPs e MACs dos dispositivos conectados.
arp-scan -l

A saída mostrará todos os dispositivos na rede mac_test_net. Procure pelo IP correspondente ao docker_victim e anote o endereço MAC dele. Provavelmente, será algo como 10.10.0.3 com o MAC 02:42:0A:0A:00:03 (ou similar, dependendo do Docker e da ordem de inicialização).

Exemplo de Saída (simplificada):

Interface: eth0, datalink type: EN10MB (Ethernet)
...
10.10.0.2      02:42:0a:0a:00:02   (Unknown)   # docker_server
10.10.0.3      02:42:0a:0a:00:03   (Unknown)   # docker_simple_victim (este é o que queremos!)
...

IMPORTANTE: Se o MAC da docker_victim que você definiu no setup_iptables.sh (do servidor) for diferente do MAC real da docker_victim (que você acabou de descobrir ou setou no docker run), o firewall não vai funcionar como esperado. Verifique se eles são os mesmos! Se precisar, edite o setup_iptables.sh e reconstrua/reinicie o docker_server para que o MAC permitido seja o correto.

4.3 - Testando o Acesso Inicial (Antes do Spoofing)
#

Vamos tentar acessar o docker_server via SSH antes de fazer o spoofing. Isso é para provar que o firewall está funcionando e bloqueando as conexões do nosso atacante.

  1. Tentativa de SSH (Falha Esperada): No terminal do docker_attacker, tente conectar ao docker_server usando o IP 10.10.0.2.

Você receberá uma mensagem ou a conexão vai simplesmente “travar” e depois retornar com um erro de Connection timed out ou Connection refused. Isso confirma que o firewall no docker_server está fazendo seu trabalho, bloqueando acessos de MACs não autorizados.

4.4 - O Ataque: MAC Spoofing em Execução
#

Agora é a hora do nosso script Python ser usado. Usaremos o MAC que descobrimos (ou definimos) da docker_victim para o nosso docker_attacker se passar por ela.

  1. Executar o MAC Changer: Ainda no terminal do docker_attacker, execute o nosso script mac_changer_script.py, passando a interface de rede do atacante (geralmente eth0 ou ensX) e o MAC da vítima.

Para descobrir a interface no container, você pode usar ip a ou ifconfig. Provavelmente, será eth0.

# Sintaxe: python3 mac_changer_script.py -i <interface> -m <MAC_DA_VITIMA>
# Pode ser necessario usar sudo
python3 mac_changer_script.py -i eth0 -m 02:42:0a:0a:00:03

O script imprimirá mensagens indicando que o MAC está sendo alterado.

  1. Verificando a Alteração: Você pode verificar se o MAC foi alterado com o comando:
ifconfig eth0

A saída deverá mostrar o novo MAC address para a interface eth0.

4.5 - Bypass: Acessando o Servidor com o MAC Falsificado
#

Com o MAC alterado, nosso atacante agora tem a “identidade” da docker_victim. Vamos tentar o SSH novamente.

  1. Tentativa de SSH (Sucesso Esperado): No mesmo terminal do docker_attacker (agora com o MAC spoofado), tente conectar ao docker_server via SSH novamente.

Se tudo correu bem, você será solicitado pela senha (que definimos como senha123 no Dockerfile do docker_server). Após inserir a senha, você deverá ter acesso ao shell do docker_server!

Isso prova que, ao assumir o MAC de um dispositivo autorizado, nosso atacante conseguiu burlar a regra de firewall baseada em MAC. É um exemplo claro de como a segurança baseada apenas em Camada 2 é frágil.

4.6 - Limpando o Laboratório
#

Depois de testar, uma boa prática limpar os containers e a rede Docker para evitar lixo no seu sistema.

# Sair do terminal do atacante se ainda estiver dentro
exit

# Parar e remover os containers
docker stop docker_server docker_victim docker_attacker
docker rm docker_server docker_victim docker_attacker

# Remover a rede Docker
docker network rm mac_test_net

# Opcional: Remover as imagens (se não for usá-las mais e quiser liberar espaço)
docker rmi docker_server_image docker_victim_image docker_attacker_image

5 - Conclusão: A Fragilidade da Camada 2 e Nossas Ferramentas: 🔧
#

Chegamos ao fim do guia. Apesar de parecer uma boa ideia, a segurança baseada apenas no MAC Address na Camada 2 é bem frágil. Nosso laboratório simples com Docker provou isso na prática: um atacante pode facilmente “roubar” a identidade de uma máquina legítima e burlar um firewall que só olha para o MAC.

5.1 - Resumo da Nossa Stack:
#

Neste guia, exploramos o MAC Spoofing usando as seguintes ferramentas e conceitos:

  • Python: Nossa escolha para criar o mac_changer_script.py, aproveitando sua simplicidade e o poder do módulo subprocess para interagir com o sistema.

  • Docker: Essencial para montar um laboratório leve, isolado e descartável, ideal para testar cenários de rede sem bagunçar a máquina principal.

  • IPTables: Usado no docker_server para simular um firewall que filtra o acesso via SSH baseado no MAC de origem, sendo o nosso “alvo” de bypass.

  • Comandos Linux (ifconfig, arp-scan, ssh): As ferramentas base para o reconhecimento e a interação com as interfaces de rede dentro dos containers.

5.2 - Como se Proteger (Medidas Simples de Mitigação):
#

Para evitar ser vítima de ataques como o MAC Spoofing:

  • Autenticação de Rede (802.1X): Não deixe a rede liberar o acesso só pelo MAC. Exija que usuários e dispositivos se autentiquem de verdade.

  • Filtragem de IP e Porta: Use firewalls que filtrem também por endereço IP e por porta. Assim, mesmo com o MAC falsificado, o atacante ainda precisaria ter o IP certo e tentar a porta correta.

  • Inspeção de ARP (DAI): Configure seus switches para validar os pacotes ARP, dificultando que MACs ou IPs falsificados circulem na sua rede.

  • Segmentação de Rede (VLANs): Divida sua rede em partes menores (VLANs). Se alguém invadir uma parte, ele fica contido ali, sem acesso ao resto.

  • Monitoramento: Tenha sistemas que detectem coisas estranhas na rede, como MACs que mudam do nada ou IPs com vários MACs diferentes.

  • Senhas Fortes e MFA: Se o atacante passar pelas camadas de rede, ele ainda vai bater de frente com a senha. E com a Autenticação Multifator (MFA), a vida dele fica ainda mais difícil.

Continue aprendendo e testando!


Link para o Repositorio no Github

ScriptJohn_
Author
ScriptJohn_
Apenas um cara que sofre de ‘pcismo’ e gosta de cybersegurança