Por redirecionamento de porta UDP executável possível?

0

Eu tenho um programa de caixa preta que escuta em uma porta UDP específica. Eu gostaria que ele ouvisse uma porta UDP de minha escolha.

Existe uma maneira de enganar o executável para ouvir em uma porta diferente. Eu posso imaginar que existe uma biblioteca que pode ser injetada com o LD_PRELOAD que pode restringir as chamadas do sistema e facilitar isso.

Uma máquina virtual, claro, é a opção pesada.

    
por Catskul 05.11.2013 / 23:32

2 respostas

2

Você pode usar o iptables para encaminhar uma porta para outra. Isso funcionará apenas para conexões externas, porque as tabelas nat que a seguinte solução usa não são consultadas quando o tráfego é local (ou seja, de 127.0.0.1 para 127.0.0.1 e assim por diante).

Isso também requer que você habilite o encaminhamento em seu kernel, o que pode ou não ser um problema de segurança que você não deseja enfrentar.

Comece ativando o encaminhamento, se ele já não estiver com sysctl net.ipv4.ip_forward=1 ou echo 1 > /proc/sys/net/ipv4/ip_forward . Neste caso você provavelmente também deve fazer todas as políticas do iptables serem DROP ao invés do padrão ACCEPT (isso depende da distribuição GNU / Linux que você usa, no entanto) e permitir apenas o tráfego que você deseja passar ao invés de deixar tudo fluir livremente .

Em seguida, você pode adicionar uma regra à tabela nat PREROUTING para redirecionar o tráfego destinado à porta X para a porta Y. Por exemplo, para redirecionar o tráfego de entrada para a porta TCP 2222 para a porta do servidor SSH, TCP 22, use: iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-port 22 .

Mais informações sobre o redirecionamento de portas e pontos mais específicos estão disponíveis em vários mecanismos de pesquisa e, por exemplo, aqui .

    
por 06.11.2013 / 08:34
0

Uma solução melhor é usar o netcat. Ele também funciona com conexões com o localhost, e não há necessidade de alterar o sysctl.

O truque é criar um named pipe

 mkfifo mypipe

e usá-lo assim:

nc -k -l 2222 0<mypipe | nc localhost mySSHport 1>mypipe

Este exemplo foi criado para permitir que você teste este comando com o ssh. Ele redireciona as conexões ssh da porta 2222 para a porta mySSHport, seja ela qual for (22?).

Agora, se você tentar ssh na porta 2222,

 ssh me@localhost -p 2222

você estará logado.

O sinalizador -k instrui o netcat a continuar ouvindo mesmo após a conclusão da primeira conexão. Você pode melhorar sua resiliência inserindo-o em um loop infinito:

while true; do
# echo "Listening..."
nc -k -l 2222 0<mypipe | nc localhost mySSHport 1>mypipe
done

E, claro, voltando ao OP, para as portas UDP é preciso adicionar o sinalizador -u.

Editar:

Acabei de perceber que em sistemas rodando a versão GNU do nc (netcat) como o Arch Linux, o comando deve ser

 nc -l -p 2222 0<mypipe | nc localhost mySSHport 1>mypipe

Desculpas pelo inconveniente.

    
por 06.11.2013 / 19:52