(PCI-DSS, APF) Porta de Origem do Pacote UDP do Firewall 53 Bypass do Conjunto de Regras?

1

Estou lidando com as vulnerabilidades relatadas por um scanner PCI-DSS, e uma delas é nova para mim:

Title
Firewall UDP Packet Source Port 53 Ruleset Bypass
Synopsis:
Firewall rulesets can be bypassed.
Impact:
It is possible to bypass the rules of the remote firewall by sending UDP packets with a source port equal to 53. An attacker may use this flaw to inject UDP packets to the remote hosts, in spite of the presence of a firewall.
See also :
http://archives.neohapsis.com/archives/fulldisclosure/2003-q2/0352.html
http://www.nessus.org/u?4368bb37

O primeiro artigo vinculado fornece um comando de prova de exploração, nmap -v -P0 -sU -p 1900 ${IP} -g 53 , que de fato retorna um pacote de 56 bytes se a porta de origem for 53. Mas por quê? Neste exemplo, ele relata que a porta 1900 está "fechada", mas uma resposta de 56 bytes foi retornada. Em contraste, uma solicitação para a porta 1900 com a porta de origem UDP 123 (também aberta) retorna 0 bytes.

#
# Source port 53:
#
$ sudo nmap -v -P0 -sU -p 1900 ${IP} -g 53

Starting Nmap 6.47 ( http://nmap.org ) at 2015-11-24 20:19 CST
Initiating Parallel DNS resolution of 1 host. at 20:19
Completed Parallel DNS resolution of 1 host. at 20:19, 0.00s elapsed
Initiating UDP Scan at 20:19
Scanning *HOST* (*IP*) [1 port]
Completed UDP Scan at 20:19, 0.21s elapsed (1 total ports)
Nmap scan report for *HOST* (*IP*)
Host is up (0.038s latency).
PORT     STATE  SERVICE
1900/udp closed upnp

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds
           Raw packets sent: 1 (28B) | Rcvd: 1 (56B)

#
# Source Port 123:
#
$ sudo nmap -v -P0 -sU -p 1900 ${IP} -g 123

Starting Nmap 6.47 ( http://nmap.org ) at 2015-11-24 20:20 CST
Initiating Parallel DNS resolution of 1 host. at 20:20
Completed Parallel DNS resolution of 1 host. at 20:20, 0.00s elapsed
Initiating UDP Scan at 20:20
Scanning *HOST* (*IP*) [1 port]
Completed UDP Scan at 20:20, 2.42s elapsed (1 total ports)
Nmap scan report for *HOST* (*IP*)
Host is up.
PORT     STATE         SERVICE
1900/udp open|filtered upnp

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 2.46 seconds
           Raw packets sent: 2 (56B) | Rcvd: 0 (0B)

Este servidor Linux está executando um painel de controle (InterWorx-CP) que está gerenciando uma instalação de APF, que por sua vez gera as regras do iptables. Aqui estão eles:

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REFRESH_TEMP  all  --  anywhere             anywhere
TALLOW     all  --  anywhere             anywhere
TGALLOW    all  --  anywhere             anywhere
TDENY      all  --  anywhere             anywhere
TGDENY     all  --  anywhere             anywhere
DROP       tcp  --  anywhere             anywhere            tcp dpts:epmap:netbios-ssn
DROP       udp  --  anywhere             anywhere            udp dpts:epmap:netbios-ssn
DROP       tcp  --  anywhere             anywhere            tcp dpt:sunrpc
DROP       udp  --  anywhere             anywhere            udp dpt:sunrpc
DROP       tcp  --  anywhere             anywhere            tcp dpt:login
DROP       udp  --  anywhere             anywhere            udp dpt:who
DROP       tcp  --  anywhere             anywhere            tcp dpt:microsoft-ds
DROP       udp  --  anywhere             anywhere            udp dpt:microsoft-ds
DROP       tcp  --  anywhere             anywhere            tcp dpt:ms-sql-s
DROP       udp  --  anywhere             anywhere            udp dpt:ms-sql-s
DROP       tcp  --  anywhere             anywhere            tcp dpt:ms-sql-m
DROP       udp  --  anywhere             anywhere            udp dpt:ms-sql-m
DROP       tcp  --  anywhere             anywhere            tcp dpt:search-agent
DROP       udp  --  anywhere             anywhere            udp dpt:search-agent
DROP       tcp  --  anywhere             anywhere            tcp dpt:ingreslock
DROP       udp  --  anywhere             anywhere            udp dpt:ingreslock
DROP       tcp  --  anywhere             anywhere            tcp dpt:ctx-bridge
DROP       udp  --  anywhere             anywhere            udp dpt:ctx-bridge
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ftp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:lmtp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:smtp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:pop3
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:imap
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:imaps
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:pop3s
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:autodesk-nlm
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:powerclientcsf
ACCEPT     tcp  --  anywhere             anywhere            tcp dpts:50000:51000
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:submission
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ftp-data
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ftp
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ntp
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain
ACCEPT     icmp --  anywhere             anywhere            icmp destination-unreachable limit: avg 14/sec burst 5
ACCEPT     icmp --  anywhere             anywhere            icmp redirect limit: avg 14/sec burst 5
ACCEPT     icmp --  anywhere             anywhere            icmp time-exceeded limit: avg 14/sec burst 5
ACCEPT     icmp --  anywhere             anywhere            icmp echo-reply limit: avg 14/sec burst 5
ACCEPT     icmp --  anywhere             anywhere            icmp type 30 limit: avg 14/sec burst 5
ACCEPT     icmp --  anywhere             anywhere            icmp echo-request limit: avg 14/sec burst 5
DROP       tcp  --  anywhere             anywhere            tcp flags:!FIN,SYN,RST,ACK/SYN state NEW
ACCEPT     tcp  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     udp  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     udp  --  anywhere             anywhere            udp spt:domain dpts:1023:65535
ACCEPT     tcp  --  anywhere             anywhere            tcp spt:domain dpts:1023:65535
DROP       tcp  --  anywhere             anywhere
DROP       udp  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
TCPMSS     tcp  --  anywhere             anywhere            tcp flags:SYN,RST/SYN TCPMSS clamp to PMTU
REFRESH_TEMP  all  --  anywhere             anywhere
TALLOW     all  --  anywhere             anywhere
TGALLOW    all  --  anywhere             anywhere
TDENY      all  --  anywhere             anywhere
TGDENY     all  --  anywhere             anywhere
DROP       tcp  --  anywhere             anywhere            tcp dpts:epmap:netbios-ssn
DROP       udp  --  anywhere             anywhere            udp dpts:epmap:netbios-ssn
DROP       tcp  --  anywhere             anywhere            tcp dpt:sunrpc
DROP       udp  --  anywhere             anywhere            udp dpt:sunrpc
DROP       tcp  --  anywhere             anywhere            tcp dpt:login
DROP       udp  --  anywhere             anywhere            udp dpt:who
DROP       tcp  --  anywhere             anywhere            tcp dpt:microsoft-ds
DROP       udp  --  anywhere             anywhere            udp dpt:microsoft-ds
DROP       tcp  --  anywhere             anywhere            tcp dpt:ms-sql-s
DROP       udp  --  anywhere             anywhere            udp dpt:ms-sql-s
DROP       tcp  --  anywhere             anywhere            tcp dpt:ms-sql-m
DROP       udp  --  anywhere             anywhere            udp dpt:ms-sql-m
DROP       tcp  --  anywhere             anywhere            tcp dpt:search-agent
DROP       udp  --  anywhere             anywhere            udp dpt:search-agent
DROP       tcp  --  anywhere             anywhere            tcp dpt:ingreslock
DROP       udp  --  anywhere             anywhere            udp dpt:ingreslock
DROP       tcp  --  anywhere             anywhere            tcp dpt:ctx-bridge
DROP       udp  --  anywhere             anywhere            udp dpt:ctx-bridge
ACCEPT     tcp  --  anywhere             anywhere            tcp dpts:1024:65535 state RELATED,ESTABLISHED
ACCEPT     udp  --  anywhere             anywhere            udp dpts:1024:65535 state RELATED,ESTABLISHED
ACCEPT     udp  --  anywhere             anywhere            udp spts:1023:65535 dpt:domain
ACCEPT     tcp  --  anywhere             anywhere            tcp spts:1023:65535 dpt:domain
ACCEPT     all  --  anywhere             anywhere

Chain PROHIBIT (0 references)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain REFRESH_TEMP (2 references)
target     prot opt source               destination

Chain RESET (0 references)
target     prot opt source               destination
REJECT     tcp  --  anywhere             anywhere            reject-with tcp-reset

Chain TALLOW (2 references)
target     prot opt source               destination

Chain TDENY (2 references)
target     prot opt source               destination

Chain TGALLOW (2 references)
target     prot opt source               destination

Chain TGDENY (2 references)
target     prot opt source               destination

O servidor também é uma autoridade de DNS para os domínios que ele hospeda, replicando para servidores escravos, para que as consultas de entrada de DNS possam ser desabilitadas. Mas mesmo quando eu fiz isso no PC, a exploração ainda foi bem sucedida. Meu palpite é que a APF está gerando algumas regras fora do meu controle indireto.

Como faço para fechar esse buraco no firewall?

Qual é o impacto dessa vulnerabilidade em 2003, que o scanner PCI está reportando agora (anos de varredura já)?

    
por jimp 25.11.2015 / 03:38

1 resposta

1

Eles testam com a porta 53 porque é provável que esteja aberta (isto é, porta usada por um DNS).

Eu recebi o mesmo erro e a solução foi escrever duas regras.

Primeiro, você pode ter uma regra ESTABELECIDA e RELACIONADA para o UDP agora. Isso não era possível antes, já que o UDP é considerado sem estado, mas eles adicionaram essa funcionalidade rastreando o que foi enviado e aceitam as respostas relacionadas .

-A INPUT -i eth0 -p udp -m state --state ESTABLISH,RELATED -m udp -d 1.2.3.4 -j ACCEPT

Nota: altere eth0 e 1.2.3.4 com nome próprio / IP

Em seguida, você pode abrir a porta 53 para os pacotes de entrada do servidor DNS.

-A INPUT -i eth0 -p udp -m udp --dport 53 -d 1.2.3.4 -j ACCEPT

Nota: altere eth0 e 1.2.3.4 com nome próprio / IP

Sua regra existente se parece com isso:

ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain

Não é restrito em uma interface ou endereço de destino. Deve ser para garantir que você não obtenha dados de uma fonte espúria. (ou seja, no DigitalOcean, e provavelmente muitos outros, há um endereço IP oculto ... você não quer aceitar dados daquele; também, eu tive uma farsa uma vez e o nome da interface mudou !!! Se você tiver uma conexão de rede única, deve ser direta, mas se você não está no controle do hardware, você não pode saber quando isso pode acontecer ...)

Dito isto, o seu grande problema no seu conjunto de regras é a primeira linha na sua cadeia INPUT. Parece assim:

ACCEPT     all  --  anywhere             anywhere

E isso significa aceitar absolutamente tudo. Todas as regras depois disso são todas ignoradas. Então, em outras palavras, você não tem um firewall em tudo ...

Você tem a mesma primeira regra em sua cadeia de saída, suponho que é para ter certeza de que seu firewall não vai bloquear nada.

Um conselho, escreva um script pequeno para ver seu firewall usando as opções -nvx . O -n agiliza, não tentando converter endereços IP. O -v é para mostrar o número de pacotes e bytes viajando em cada regra (ou seja, se uma regra aceita um pacote, seu contador de pacotes é incrementado em 1.) O -x mostra os números exatos para cada contador (em vez de torná-lo "humano"), de modo que eu sei quando um contador foi incrementado em 1 ou mais. Importante enquanto você está testando.

Se você tivesse usado o -nvx , talvez você notasse que apenas os contadores da primeira regra eram incrementos para INPUT e OUTPUT. Então talvez você vagueia porque nunca bate em outras regras ...

    
por 22.11.2016 / 06:29