Post

Telnet - raw socket과의 차이

Telnet wiki
RFC 854

0xff

telnet에서는 0xff를 command 중 하나인 IAC(Interpret As Command)로 예약되어 있다. 각 command의 끝에 IAC를 붙이는 방식으로 일반 data와 command를 구분하게 되는데, 사용자가 0xff를 입력하는 경우와 구분하기 위해 telnet 프로세스는 사용자로부터 IAC인 0xff를 입력 받으면 이를 0xff 0xff로 변경하여 송신하게 된다. 받는 쪽도 telnet이라면, 수신하면서 이를 다시 0xff로 변환하지만, 수신 측이 raw socket이라면 0xff 0xff를 그대로 수신하게 된다. 반대로 송신 측이 raw socket, 받는 쪽이 telnet이라면 0xff가 IAC로 인식되어 그냥 잘려버린다.

원래 telnet은 raw TCP session에 사용 가능하지만, 데이터에 0xff가 포함되어 있는 경우 위와 같이 동작하고 이 외에도

  • CR을 null로 padding해서 전송.
  • \x05를 입력하면 거기까지만 입력받음. 그러나 \x05\x05를 넣으면 정상적으로 \x05가 들어가기는 함.
  • telnet을 파이프와 함께 사용할 때는 (echo "a"; sleep 1;) | telnet과 같이 bash ( ..; sleep 1;)을 넣어주어야 함. 등등의 이유로 완전한 raw 소켓으로 사용할 수는 없음을 감안해야 한다.
negotiation

negotiation를 위해 추가적인 패킷을 주고받는다는 점도 raw socket과는 차이가 있다.

처음 3 lines가 raw socket HTTP request, 붉은 line 아래 4 lines가 telnet HTTP request인데 둘 다 직접 80으로 접근한 다음 CLI로 request를 작성해 전송했다.

HTTP request, response를 위해 반드시 브라우저를 사용할 필요는 없다. HTTP requset, response는 생각보다 간단하게 동작한다. raw socket 열고

1
2
3
GET / HTTP/1.1
Host: url

입력하면 response가 돌아온다. 그래서 HTTP Request Spoofing은 생각보다 쉽게 이루어진다.

telnet의 경우 negotiation을 위해 회색으로 표시된 line이 추가적으로 전송된다. 패킷의 raw data를 확인해 보면 ff fb 1f ff fb 20 ... 이런 식으로 IAC가 붙은 데이터들이 전송된다.

그래서 서버로부터 아래와 같은 response를 수신하며 세션이 종료된다.

This post is licensed under CC BY 4.0 by the author.