Telnet - raw socket과의 차이
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
GET / HTTP/1.1
Host: url
입력하면 response가 돌아온다. 그래서 HTTP Request Spoofing은 생각보다 쉽게 이루어진다.
telnet의 경우 negotiation을 위해 회색으로 표시된 line이 추가적으로 전송된다. 패킷의 raw data를 확인해 보면 ff fb 1f ff fb 20 ...
이런 식으로 IAC가 붙은 데이터들이 전송된다.
그래서 서버로부터 아래와 같은 response를 수신하며 세션이 종료된다.