티스토리 뷰
ICMP 패킷을 이용하는 ping 유틸리티를 들여다보면, 재밌는 부분이 있다. 기본적으로 ping은 다음과 같은 방식으로 동작한다.
- ICMP 요구 패킷을 전송한 다음, 원격지로부터 ICMP 응답 패킷을 받는다.
- ICMP 도 IP 패킷에 실려 전송되는 하위 프로토콜의 한 종류이다. 마치 TCP, UDP가 그러한 것 처럼.
- ping 에 적절한 인자를 주면, 요구 패킷의 길이를 지정할 수 있다.
즉, ICMP 의 요구/응답 패킷에 아무 의미 없는 값을 채워 전송할 수 있는 공간이 마련되어 있다. - 원격지 호스트가 브로드 캐스트 혹은 멀티 캐스트 일 경우 응답을 중복 수신하여 받을 수 있다.
- 대개 파이어월 안에서 밖으로 ping 에 대한 요구/응답이 쌍을 이룰 경우 통과하게 된다.
- 파이어월 밖에서 안으로의 ping 요구 패킷은 필터링 되어 전송되지 않는다.
- ping 요구 패킷과 응답 패킷의 의미 없는 값은 서로 같지 않아도 된다.
- ping 요청은 어플리케이션이 하는 것이지만, 응답은 커널에서 이루어진다.
- ICMP 패킷안에는 요청/요구 쌍에 대한 식별자와 순서를 포함하고 있다.
잘 묵상(!)해보면, 일종의 터널, 즉 ssh의 터널같은 것을 만들 수 가 있게 된다. 시나리오는 다음과 같다.
- 파이어월 안에있는 호스트 A, 파이어월 밖에 있는 호스트 B
- ping 요구 (A --> B) 를 주기적으로 한다. 그러면 ping 응답 (B-->A)이 계속 올 수 있다.
- ping 요구/요청시 위 3 번의 공간에 적절한 컨트롤 명령과 데이터를 넣을 수 있는 패킷을 정의한다.
- A 혹은 B는 상대에게 임의의 호스트:포트 C에 접속하도록 명령을 줄 수 있다.
- 자신은 특정 포트를 열어 놓고 어떤 클라이언트가 접속해 오면, 4번 기능을 이용하여 원격지에 접속하고 클라이언트의 모든 데이터를 그 세션에 전달한다.
- 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
링크
TAG
- nodejs
- ssh
- OpenID
- perl
- 킹벤자민
- tattertools
- 퀴즈
- SSO
- 수선화
- 클레로덴드럼
- 식물
- MySQL
- 커피
- VIM
- writely
- url
- macosx
- 대화
- JavaScript
- TCP/IP
- 덴드롱
- 구근
- 벤자민
- Tattertools plugin
- 오픈소스
- 디버깅
- SVN
- Subversion
- BlogAPI
- Linux
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함