티스토리 뷰

ICMP 패킷을 이용하는 ping 유틸리티를 들여다보면, 재밌는 부분이 있다. 기본적으로 ping은 다음과 같은 방식으로 동작한다.


  1. ICMP 요구 패킷을 전송한 다음, 원격지로부터 ICMP 응답 패킷을 받는다.
  2. ICMP 도 IP 패킷에 실려 전송되는 하위 프로토콜의 한 종류이다. 마치 TCP, UDP가 그러한 것 처럼.
  3. ping 에 적절한 인자를 주면, 요구 패킷의 길이를 지정할 수 있다.
    즉, ICMP 의 요구/응답 패킷에 아무 의미 없는 값을 채워 전송할 수 있는 공간이 마련되어 있다.
  4. 원격지 호스트가 브로드 캐스트 혹은 멀티 캐스트 일 경우 응답을 중복 수신하여 받을 수 있다.
  5. 대개 파이어월 안에서 밖으로 ping 에 대한 요구/응답이 쌍을 이룰 경우 통과하게 된다.
  6. 파이어월 밖에서 안으로의 ping 요구 패킷은 필터링 되어 전송되지 않는다.
  7. ping 요구 패킷과 응답 패킷의 의미 없는 값은 서로 같지 않아도 된다.
  8. ping 요청은 어플리케이션이 하는 것이지만, 응답은 커널에서 이루어진다.
  9. ICMP 패킷안에는 요청/요구 쌍에 대한 식별자와 순서를 포함하고 있다.

잘 묵상(!)해보면, 일종의 터널, 즉 ssh의 터널같은 것을 만들 수 가 있게 된다. 시나리오는 다음과 같다.


  1. 파이어월 안에있는 호스트 A, 파이어월 밖에 있는 호스트 B
  2. ping 요구 (A --> B) 를 주기적으로 한다. 그러면 ping 응답 (B-->A)이 계속 올 수 있다.
  3. ping 요구/요청시 위 3 번의 공간에 적절한 컨트롤 명령과 데이터를 넣을 수 있는 패킷을 정의한다.
  4. A 혹은 B는 상대에게 임의의 호스트:포트 C에 접속하도록 명령을 줄 수 있다.
  5. 자신은 특정 포트를 열어 놓고 어떤 클라이언트가 접속해 오면, 4번 기능을 이용하여 원격지에 접속하고 클라이언트의 모든 데이터를 그 세션에 전달한다.
  6. 5 번을 구현하기 위해 3번의 패킷 정의를 적절히 수행하면 된다.

TCP 혹은 모든 IP 패킷을 직접 하려면, 가상의 디바이스를 만들어서 수행하면 될 것이다.

이런 생각들을 머리속으로만 하고 있었는데, 이런 프로젝트가 실제 있더라고.....

ptunnel: http://www.cs.uit.no/~daniels/PingTunnel/
icmptx: http://thomer.com/icmptx/

심지어 ICMP대신 DNS 포트를 이용하는 것도 있다.

http://thomer.com/howtos/nstx.html

장난의 끝은 어디란 말인가.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함