Como forçar o telnetd a aceitar dados arbitrários na variável TERM?

3

Eu preciso transportar dentro da variável TERM, dados adicionais, usando a sintaxe:

TERM=xterm:VAR1=data1:var2=data2:...

No lado do servidor, esses dados são divididos em variáveis reais. Mas, o servidor de telnet de um Debian está fechando a conexão onde a variável TERM possui ":" ou adicional "=".

O Debian é:

# uname -a
Linux server 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u2 (2016-01-02) x86_64 GNU/Linux

Existem maneiras de configurar o servidor para não verificar caracteres incomuns na variável TERM?

EDITAR - NOTAS:

Este é um ambiente legado que trabalha entre SCO e AIX dessa maneira. Agora precisamos adicionar um servidor Linux que servidor telnet deve aceitar dados arbitrários na variável TERM.

    
por Luciano 06.04.2017 / 22:22

1 resposta

2

Esta é uma escolha deliberada de segurança. No entanto, você pode configurar seu servidor telnetd para passar pela variável TERM , embora seu valor seja convertido em minúsculas. A verificação real dos valores legais TERM não é feita por in.telnetd em si, mas pelo programa de login, telnetlogin que o servidor chama. Você pode configurar seu servidor telnetd para executar algum outro programa de login, por exemplo, um script de shell intermediário, que irá descomprimir a variável antes de continuar com o login. Por exemplo, para testar isso, crie o arquivo /tmp/mytelnetlogin com o conteúdo:

#!/bin/bash
export MYTERM=$TERM
export TERM=dumb
exec /usr/lib/telnetlogin "$@"

e faça chmod +x nele. Em seguida, execute sua própria versão de teste do telnetd na porta 9999:

sudo sudo -u telnetd /usr/sbin/in.telnetd -debug 9999 -L /tmp/mytelnetlogin

e conecte-se a ela com sua variável no ambiente:

TERM='A=1:b=2' telnet localhost 9999

Você deve ver um prompt de login, e após o login, um echo $MYTERM mostrará o valor a=1:b=2 , que você pode manipular como normalmente faz. Obviamente, para uma solução real, você precisa colocar a opção -L em /etc/inetd.conf e não usar /tmp para o script.

Observe que telnetlogin é um programa de raiz setuid, que deve ser chamado a partir do ID do usuário telnetd . Isso é para permitir que inetd execute o servidor como não-raiz e use apenas a raiz para o login.

Se preferir ignorar esta medida de segurança, você pode executar in.telnetd como root e fazer com que execute o login padrão, /bin/login . Você não precisa então do script intermediário mytelnetlogin para manipular a variável. Por exemplo:

sudo /usr/sbin/in.telnetd -debug 9999 -L /bin/login
    
por 07.04.2017 / 18:00