telnetd가 TERM 변수에 임의의 데이터를 허용하도록 강제하는 방법은 무엇입니까?

telnetd가 TERM 변수에 임의의 데이터를 허용하도록 강제하는 방법은 무엇입니까?

다음 구문을 사용하여 TERM 변수 내에서 추가 데이터를 전송해야 합니다.

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

서버 측에서는 이 데이터가 실제 변수로 분류됩니다. 그러나 데비안의 텔넷 서버는 TERM 변수에 ":" 또는 "="가 추가된 연결을 닫습니다.

데비안은:

# 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

TERM 변수에서 특이한 문자를 확인하지 않도록 서버를 설정하는 방법이 있습니까?

편집 - 참고:

이는 SCO와 AIX 간에 이러한 방식으로 작동하는 레거시 환경입니다. 이제 TERM 변수의 모든 데이터를 허용하는 Linux 서버를 추가해야 합니다.

답변1

이것은 잘 고려된 안전한 선택입니다. 그러나 이 변수를 전달하도록 telnetd 서버를 구성할 수 있지만 TERM해당 값은 소문자로 변환됩니다. 유효한 값의 실제 확인은 TERM자체적으로 수행되는 것이 아니라 in.telnetd서버에서 호출되는 로그인 프로그램에 의해 수행됩니다. telnetlogin로그인을 계속하기 전에 변수를 언래핑하는 중간 쉘 스크립트와 같은 다른 로그인 프로그램을 실행하도록 telnetd 서버를 구성할 수 있습니다. 예를 들어 이를 테스트하려면 /tmp/mytelnetlogin다음 내용이 포함된 파일을 만듭니다.

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

실행해 보세요 chmod +x. 그런 다음 포트 9999에서 telnetd의 자체 테스트 버전을 실행하십시오.

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

환경의 변수를 사용하여 연결합니다.

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

로그인 프롬프트가 표시되고 일단 로그인하면 값이 echo $MYTERM표시되며 a=1:b=2정상적으로 작동할 수 있습니다. 분명히 실제 솔루션을 위해서는 스크립트가 아닌 -L에 옵션을 넣어야 합니다 ./etc/inetd.conf/tmp

이것은 telnetloginsetuid-root 프로그램이며 사용자 id 에서 호출될 것으로 예상됩니다 telnetd. 이는 inetd서버가 루트가 아닌 사용자로 실행되고 루트로만 로그인될 수 있도록 하기 위한 것입니다 .

이 보안 조치를 무시하려는 경우 in.telnetd루트로 실행하여 표준 로그인을 실행하도록 할 수 있습니다. 이렇게 하면 변수를 조작하기 위한 /bin/login중간 스크립트가 필요하지 않습니다 . mytelnetlogin예를 들어:

sudo /usr/sbin/in.telnetd -debug 9999 -L /bin/login

관련 정보