Como estabelecer um cenário man-in-the-middle com ebtables e iptables

0

Para fins de teste e educacionais, quero configurar um cenário do tipo intermediário da seguinte forma:

  • O host T é o host de destino que deve ser "clonado"
  • O host M é o homem no meio com as interfaces eth0 e eth1 ; M está conectado à rede via eth0 e a T via eth1 .

O ponto da configuração é que T deve ser capaz de responder a algumas solicitações (particularmente a autenticação 802.1X via EAPoL, portanto, M está usando T como um oráculo de autenticação). Especificamente, por padrão, T estaria conectado à rede e se autenticaria via 802.1X, enquanto M teria acesso negado. Por outro lado, o usuário tem acesso administrativo a M, mas não a T. O objetivo é permitir que M pareça ser T durante o diagnóstico de rede, o que não seria possível a partir de T devido à falta de privilégios.

Existem duas abordagens possíveis:

  1. Escreva um programa (por exemplo, python com scapy ou C com libpcap) que copia os quadros relevantes para frente e para trás.

  2. Use ebtables e iptables .

A questão aqui se concentra em 2 e simplesmente diz: Como conseguir o resultado desejado?

O que eu tentei até agora

O primeiro passo foi colmatar eth0 e eth1 (por exemplo, anexá-los a br0 ). Sem nenhuma regra ebtables / iptables T é visível para a rede como se estivesse conectado diretamente a ela. Então, como o foco é principalmente representar o T no IPv4, estabeleci a seguinte regra:

ebtables -A FORWARD -p IPv4 -j DROP

Esta regra impede que o tráfego IPv4 atravesse a ponte. Agora, para representar T, M deve fazer algum NAT nas camadas 2 e 3:

# interception of incoming packets for T:
ebtables -t nat -A PREROUTING -i eth0 -p IPv4 -d $TARGET_MAC_ADDR -j dnat --to-destination $MY_ETH0_MAC_ADDR
iptables -t nat -A PREROUTING -i eth0 -d $TARGET_IP4_ADDR -j DNAT --to-destination $MY_ETH0_IP4_ADDR
# spoofing of outgoing packets as coming from T:
ebtables -t nat -A POSTROUTING -o eth0 -p IPv4 -s $MY_ETH0_MAC_ADDR -j snat --to-source $TARGET_MAC_ADDR
iptables -t nat -A POSTROUTING -o eth0 -s $MY_ETH0_IP4_ADDR -j SNAT --to-source $TARGET_IP4_ADDR

Meu pensamento ingênuo era que isso deveria funcionar. Mas isso não acontece. Além de "desconectar" T, M não se comporta como T. Especialmente, iptables -t nat -L -v -n mostra que as regras SNAT são acionadas como esperado, mas a regra DNAT é inerte (isto é, 0 pacotes, não importa o que aconteça). O que estou perdendo aqui?

Notas

O problema é semelhante a este mas a configuração não é a mesma.

Em um comentário, Rui ressalta que alguns protocolos são propensos a problemas quando NAT. Este é o caso se um roteador estiver mascarando hosts em uma rede upstream (a.k.a. Cone NAT ). No entanto, este não é o ponto aqui. Neste cenário, NAT é usado para mascarar M como T enquanto o sombreado T. M simplesmente descarta os pacotes de T (veja a primeira regra de ebtables)

Antecedentes

802.1X (mais precisamente 802.1X-2010) fornece apenas autenticação, mas nenhuma segurança de "canal" subsequente. É como se o handshake TLS resultasse em criptografia e autenticação NULL - o "suplicante" prova no momento da autenticação sua autenticidade, mas a "sessão" após a autenticação pode ser seqüestrada.

A solução para conexões com fio é o MACsec (também conhecido como 802.1ae, que faz parte do 802.1X-2014). O pingente sem fio para MACsec é WPA / WPA2. Surpreendentemente, até mesmo o hardware mais barato pode dominar o WPA2, enquanto os switches high end que são capazes de MACsec são consideravelmente mais caros do que aqueles sem o recurso.

Entre outras coisas, o cenário descrito mostra que o 802.1X sem MACsec é inútil.

    
por countermode 19.06.2018 / 16:42

2 respostas

1

Se você está certo em tentar a abordagem 1), acabei de escrever um proxy EAPOL ( link ). Ele vai até mudar o endereço MAC da eth0 para que corresponda ao seu destino automaticamente, se quiser, embora eu faça manualmente. Parece que você pode configurar um endereço IPv4 estático em eth0 e obter conectividade, o que é bom, porque meu proxy não manipula nenhuma coisa da Camada 3. De qualquer forma, com base na sua descrição, tenho certeza de que funcionaria para sua situação. Existem alguns outros proxies do EAPOL, principalmente em Python, que provavelmente funcionariam tão bem quanto você.

Se o suplicante EAPOL também precisar se "registrar" com a rede upstream, uma vez que a sessão esteja ativa via DHCP para obter conectividade IPv4, as coisas ficarão um pouco mais complicadas dependendo se a rede upstream requer um determinado hostname, identificador de cliente, etc para ser enviado nas solicitações DHCP. Na pior das hipóteses, você teria que configurar o dhclient em M para enviar exatamente as mesmas opções que o cliente DHCP em T. É irritante, mas você pode fazer com que os dois sejam idênticos se você for persistente o suficiente. Clonar o MAC do suplicante para eth0 também ajuda lá.

Se você está definido na abordagem 2) usando eb / iptables - desculpe, não posso ser de muita ajuda lá. Vou apenas dizer que o EAPOL não cruzará uma ponte de software do Linux por padrão, porque o endereço do grupo de difusão seletiva EAPOL, 01-80-C2-00-00-03, não é encaminhado por pontes compatíveis com 802.1D. A solução para isso é:

echo 8 > /sys/class/net/brX/bridge/group_fwd_mask

(Por que 8 e não algum outro valor? Porque link )

Você conseguiu que o T autenticasse através da sua ponte, então você já sabe disso, mas outros podem não:)

    
por 14.07.2018 / 22:56
0

Você viu o Homem no meio do proxy - link ? Ele fará tudo o que você está pedindo.

wget https://github.com/mitmproxy/mitmproxy/releases/download/v2.0.2/mitmproxy-2.0.2-linux.tar.gz

Ou com o PIP

pip3 install mitmproxy

Em seguida, execute:

./mitmproxy --host

Configure o proxy no seu navegador e ele vai MITM todo o tráfego que você deseja.

    
por 19.06.2018 / 22:31