Download presentation
Presentation is loading. Please wait.
1
IP와 ICMP의 실험 Jae-dong kim 네트워크 실험실
2
목차 라우팅 테이블과 경로 제어 Redirect 프로그램 Scanroute 프로그램 라우팅 테이블
3
라우팅 테이블과 경로 제어 라우팅 테이블 netstat -rn : 라우팅 테이블(경로 제어표)을 표시할 수 있음
(r 은 라우팅 테이블을 표시, n은 IP 어드레스를 표시할 때의 옵션) Destination : 종착점 주소 Gateway : 그 때의 전송처 # netstat –rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface UG eth0 U eth0 U lo UG eth0
4
라우팅 테이블과 경로 제어 IP에서 패킷을 전송할 때 반드시 routing table이 참조됨
경로상의 모든 Host나 router의 routing table이 정확하여야 함. 그렇지 않으면, 패킷이 목적지 호스트까지 도달하지 않음 Redirect program : ICMP redirect message를 억지로 발생시켜 routing table 변경 Scanroute program : 시작점 Host와 종착점 Host 사이에 있는 Route의 IP 주소를 모두 표시하는 program 라우팅 테이블 은 : 1) 루트 명령어를 사용해서 수작업으로 편집 2) RIP나 OSPF 등의 Routing Protocol 사용 3) ICMP redirect Message에 의해서 자동적으로 변경 기대효과 : Network 이상발생시 예상가능 및 Unknown Network Topology 추측
5
redirect 프로그램(개요) 개요 : ICMP redirect message를 작성해서 송신하는 program으로,
특정 host의 Routing table 값을 갱신할 수있음 (1) 타킷호스트(호스트 B)에 ICMP redirect message를 송신 /24 /24 호스트 B의 라우팅 테이블 IP 어드레스 전송선 /0 /24 호스트 A 호스트 B 호스트 C 가공라우터 B 가공라우터 A redirect 1) 호스트 B와 호스트 C 사이에서 통신가능 2) ICMP redirect 메시지를 송신
6
redirect 프로그램(개요) (2) 타킷호스트(호스트 B)는 특정의 호스트와 통신불능 예 /24 /24 호스트 B의 라우팅 테이블 IP 어드레스 전송선 /0 /24 /32 3) 호스트 B의 라우팅 테이블에 추가된다 호스트 A 호스트 B 호스트 C 가공라우터 B 가공라우터 A 4) 호스트 B는 호스트 C에 송신하는 패킷을 가공 라우터 B로 경유해서 보내려고 한다 그림 7.1 ICMP redirect 메시지의 동작
7
redirect 프로그램(사용방법) raw IP를 사용하고 있기 때문에 실행하기위해 root의 권한이 필요
Linux에서는 redirect 메시지를 수신해도 무시하기 때문에 효과 없으며, FreeBSD, Windows ME/2000에서는 동작함 target_host : ICM redirect 메시지의 전송처 IP 어드레스를 지정 old_router : redirect 메시지 전송에 사용되는 라우터의 IP 어드레스를 지정 new_router : redirect 앞의 라우터 IP 어드레스를 지정 dst_ip : redirect하는 전송처의 IP 어드레스를 지정 실행 : redirect target_host old_router new_router dst_ip
8
그림 7.2 명령어 인수와 생성되는 ICMP redirect 메시지
/24 /24 호스트 A 호스트 B 가공라우터 B 호스트 C 가공라우터 A redirect new_router old_router dst_ip target_host V : HL : 5 TOS : TL: ID : 0 F M FO : TTL : P : CKSUM : IP 헤드 SRC IP : DST IP : T : C : CKSUM : ICMP 헤드 NEXT GW : V : HL : TOS : TL: ID : 0 F M FO : TTL : 254 P : CKSUM : 반송되는 IP 헤드 SRC IP : DST IP : transport 헤드의 선두 64비트 그림 7.2 명령어 인수와 생성되는 ICMP redirect 메시지
9
redirect 프로그램의 실행 예 그림 7.2의 ICMP redirect 패킷을 생성하기위해 입력
ipdump에서 모니터링하면 다음과같음 # ./redirect Protocol: IP IV : 4 HL: 5 T: Total Length : 56 Identfier: 0 FF:0D0 FO: TTL: 2 Pro: 1 Header Checksum: Source IP Address: Destination IP Address: Protocol: ICMP (Redirect (change route)) Type: Code: Checksum: 42064 Router IP Address: IV : HL: 5 Total Length : 100 Identfier: 0 FO: 0 TTL: 2 Pro: 17 Header Checksum: Source IP Address: Destination IP Address:
10
redirect 프로그램의 실행 예 호스트 B( )의 운영체제가 Windows2000 일때 (Before)
11
redirect 프로그램의 실행 예 라우팅테이블에 의 행이 추가 (After)
12
redirect 프로그램의 실행 예 결과해설 : 호스트 B는 호스트 C(192.168.3.104)와 통신을 할 수 없게됨
Icmp redirect 메시지가 틀리게 송신되면 통신장애가 발생 라우팅 테이블에 추가되어있는 경로는 Net Mask가 32비트 길이의 호스트 루트로 되어 있음 원래는 네트워크 어드레스로 redirect 해야만 효율적임 프로토콜의 방법은 ICMP redirect의 코드를 0으로하면 네트워크 redirect로 됨 패킷형식을 보면 redirect하는 네트워크의 서브넷 마스크 필드없음 Class에서 정의된 비트길이의 네트워크 어드레스로서 redirect 되게됨 Classless가 일반화된 현재의 인터넷에서는 통신장애를 초래할 위험성 있음 따라서 네트워크 redirect의 패킷을 받아도 호스트 루트로서 라우팅테이블에 추가하는 방법이 일반적이 됨
13
(ICMP redirect 패킷을 작성한다)
make_udp_header (UDP 헤더를 작성한다) main make_ip_header (IP 헤더를 작성한다) checksum make_icmp5_header (checksum을 계산한다) (ICMP redirect 패킷을 작성한다) 그림 7.3 redirect의 함수 구조도
14
redirect 처리의 흐름 redirect 처리의 흐름 개요 시 작 IP 헤더를 작성 송신용 RAW 소켓을 연다
시 작 IP 헤더를 작성 송신용 RAW 소켓을 연다 (make_ip_header) 헤더의 포인트를 설정 송신 어드레스의 설정 UDP 헤더를 작성 패킷의 송신 (make_udp_header) (sendto) IP 헤더를 작성 소켓을 닫는다 (make_ip_header) (close) ICMP 헤드를 작성 종 료 (make_icmp5_header) 그림 7.4 redirect 처리의 흐름
15
redirect 프로그램 리스트(1) redirect 프로그램 해설 그림 7.5 redirect의 패킷 작성 처리
ip_new icmp ip_old udp 헤드 구조를 나타내는 구조체로의 포인터 설정 buff [1500] ICMP 헤드 UDP 헤드 IP 헤드 IP 헤드 make_udp_header make_ip_header 헤드의 작성 make_icmp5_header make_ip_header raw IP sendto 운영체제 Ethernet 헤드 ICMP 헤드 UDP 헤드 IP 헤드 IP 헤드 송신 그림 7.5 redirect의 패킷 작성 처리
16
redirect 프로그램 리스트(2) redirect 프로그램 해설 80 /* 각 헤더의 포인터 설정 */
80 /* 각 헤더의 포인터 설정 */ 81 /* IP(20) + ICMP(8) + IP(20) + UDP(8) */ 82 ip_new = (struct ip *)(buff); 83 icmp = (struct icmp *)(buff + 20); 84 ip_old = (struct ip *)(buff ); 85 udp = (struct udphdr *)(buff ); 86 size = ; 작성한 ICMP 패킷은 4개의 헤드로 구성되며, char형 배열의 버퍼에 순서대로 저장됨 각 헤드의 포인터를 설정
17
redirect 프로그램 리스트(3) redirect 프로그램 해설 89 make_udp_header(udp);
88 /* 소켓의 작성 */ 89 make_udp_header(udp); 90 make_ip_header(ip_old, inet_addr(argv[TARGET_IP]), inet_addr(argv[DST_IP]), IPPROTO_UDP, 100); 92 make_icmp5_header(icmp, inet_addr(argv[NEW_ROUTER])); 93 make_ip_header(ip_new, inet_addr(argv[OLD_ROUTER])), inet_addr(argv[TARGET_IP]), IPPROTO_ICMP, size); 95 패킷의 헤더를 작성할 때에는 뒤의 헤더부터 순서대로 작성함 (패킷 송신시 상위 층의 헤더나 테이터부터 순서대로 작성하여야 함) ICMP 헤더에는 ICMP 헤더이하에 계속되는 데이터를 포함한 체크섬을 저장하기 때문에 ICMP 헤더를 작성하기전에 ICMP헤더 뒤의 IP 헤더나 UDP헤더를 작성해 둘 필요가 있음
18
redirect 프로그램 리스트(4) redirect 프로그램 해설
96 /* 송신 어드레스의 설정 */ 97 memset((char *) &dest, 0, sizeof(dest)); 98 dest.sin_family = AF_INET; 99 dest.sin_addr.s_addr = inet_addr(argv[TARGET_IP]); CHKADDRESS(dest.sin_addr.s_addr); 101 종착점의 어드레스를 설정하며, 앞서 작성한 IP 헤더 중에는 종착점 IP 어드레스가 저장되어 있지만, 패킷을 송신하는 호스트 내부의 라우팅 처리에서는 이용되지 않음 라우팅은 sento의 다섯번째 인수에 지정된 어드레스를 기본으로 해서 이루어짐
19
Scanroute 프로그램 개요 : 통신장애 등이 발생할 때에 자주 이용되며, 특정 호스트까지의 경로도중에
도중에 있는 라우터를 표시함 (실행시 라우터 A,B,C의 IP 어드레스가 순서대로 표시됨) 호스트 B 호스트 A 라우터 A 라우터 B 라우터 C ICMP 시간 초과 메시지 시작점 IP 어드레스 TTL=1 TTL=0 TTL=2 ICMP 시간 초과 메시지 시작점 IP 어드레스 TTL=1 TTL=0 중간에 있는 라우터의 어드레스 조사는 호스트 A로부터 호스트 B로 IP헤드의 TTL을 1로 설정하고 UDP에 패킷을 송신 패킷을 라우터 A가 전송하려고 할 때, TTL은 0이 되고 폐기됨. 이 때 ICMP 시간초과메시지를 수신하는 것으로 가장 가까운 IP 어드레스를 알 수 있음 이같은 방법을 반복하여 도중 라우터의 IP 어드레스를 알 수 있음 종착점 IP 어드레스에 도착할 때에는 ICMP 시간초과 메시지는 회신되지 않지만, scanport_udpa와 같이 사용치 않은 호스트 번호를 향해 패킷을 송신하면 ICMP 포트도달 불가능 메시지가 돌아옴(이 기능은 네트워크 이상이 발생될 경우 매우 도움이 되는 기능이지만 네트워크 스캔에 이용될 가능성도 있으며, 이를 기초로 네트워크의 구조를 조사하고 공격의 자료로 활용하는 이들도 있음 ICMP 시간 초과 메시지 시작점 IP 어드레스 TTL=3 TTL=0 TTL=1 TTL=2 ICMP 시간 초과 메시지 시작점 IP 어드레스 TTL=4 TTL=0 TTL=1 TTL=3 TTL=2 그림 7.6 scanroute의 동작개요
20
* scanroute에서는 raw IP를 사용하기 때문에 실행시 루트의 권한이 필요함
scanroute [-n] dst_ip (dst_ip는 조사하고 싶은 IP어드레스를 지정) * scanroute에서는 raw IP를 사용하기 때문에 실행시 루트의 권한이 필요함 # ./scanroute –n scanroute 1 : : RTT = ms 2 : : RTT = ms 3 : : RTT = ms 4 : : RTT = ms
21
scanroute 프로그램의 사용방법 실행
22
scanroute 처리의 흐름(1) main make_udp_header (UDP 헤더를 작성한다) make_ip_header
checksum tvsub (checksum을 계산한다) (tv 구조체의 뺄셈을 한다) tvsub 함수는 패킷의 왕복시간의 계산에 사용함 그림 7.7 scanroute의 함수 구조도
23
scanroute 처리의 흐름(2) 그림 7.8 scanroute처리의 흐름
ttl의 값을 1부터 순서대로 크게 하면서 udp에 패킷을 송신하고 select에서 icmp 패킷이 돌아오는지 안오는지 기다림 Icmp 시간초과 메시지가 돌아오면 중간에 있는 라우터로 판단함 Icmp port도달불능 메시지가 돌아오면 목적호스트에 패킷이 도달하게 되며 프로그램을 종료함 그림 7.8 scanroute처리의 흐름
24
scanroute 프로그램 리스트의 해설(1)
25
scanroute 프로그램 리스트의 해설(2)
92 /* UDP/IP 송신용 RAW 소켓 오픈 */ 93 if ((send_sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { 94 perror("socket(SOCK_RAW)"); exit (EXIT_FAILURE); 96 } 97 98 if (setsockopt(send_sd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) { 99 perror("setsockopt(IPPROTO_IP, IP_HDRINCL)"); exit (EXIT_FAILURE); } 102 /* ICMP 수신용 RAW 소켓 오픈 */ if ((recv_sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) { 105 perror("socket(SOCK_RAW)"); exit (EXIT_FAILURE); 107 108 /* UDP/IP 패킷 작성 */ len = sizeof(struct packet_udp); memset((char *)&sendpacket, 0, sizeof(struct packet_udp)); make_udp_header(&(sendpacket.udp)); make_ip_header(&(sendpacket.ip), 0, send_sa.sin_addr.s_addr, len); 114 ttl을 변경키위해 raw소켓을 사용 ICMP패킷을 수신하기위해 raw소켓 오픈 UDP/IP패킷 을 작성
26
scanroute 프로그램 리스트의 해설(3)
ttl의 값을 1부터 순서 대로 늘림 119 for (ttl = 1; ttl <= 64; ttl++) { sendpacket.ip.ip_ttl = ttl; for (i = 0; i < 3; i++) { /* UDP 패킷 송신 */ if (sendto(send_sd, (char *)&sendpacket, len, 0, (struct sockaddr *) &send_sa, sizeof send_sa) < 0) { 129 perror("sendto"); exit (EXIT_FAILURE); } 137 tv.tv_sec = 3; 138 tv.tv_usec = 0; 139 reread; 140 /* select 검사한 디스크리프트 설정 */ 141 FD_ZERO(&readfd); 142 FD_SET(recv_sd, &readfd); if ((select(recv_sd + 1, &readfd, NULL, NULL, &tv)) > 0) { 153 if (recvfrom(recv_sd, buff, BUFSIZE, 0, NULL, NULL) < 0) { perror("recvfrom"); exit (EXIT_FAILURE); IP헤더에 ttl의 값을 설정 ICMP 메시지가 돌아올 떄의 재송 처리용 Loop UDP 패킷 송신 ICMP패킷 수신준비 select 시스템 콜을 사용 수신용 raw 소켓이 패킷을 수신할 때까지 대기 패킷을 수신한 경우 골라냄
27
scanroute 프로그램 리스트의 해설(4)
161 if(ip->ip_p !=IPPROTO_ICMP) 162 goto reread; 163 164 icmp = (struct icmp *) (buff + hlen); 165 166 /* 무한 패킷을 수신하지 않을 것인지 검사 */ 167 if ((icmp->icmp_type != ICMP_TIMXCEED 168 || icmp->icmp_code != ICMP_TIMXCEED_INTRANS) 169 && (icmp->icmp_type != ICMP_UNREACH_PORT)) goto reread; 180 if (dns_flg == OFF) printf("%-15s", hostip); 182 else if ((host = gethostbyaddr((char *)&ipaddr, 4, AF_INET)) == NULL) printf("%-15s (%s) ", hostip, hostip); Else printf("%-15s (%s) ", hostip, host->h_name); 186 187 printf(": RTT =%8.4f ms", tvml.tv_sec* tvml.tv_usec/1000.0); 무한패킷을 수신한 경우 무시하기위한 처리 IP 어드레스로부터 도메인 명을 조사 및 왕복시간을 계산 표적 호스트로부터 ICMP 포트도달 불능 메시지가 전송되었는지 검사 if (icmp->icmp_type == ICMP_UNREACH_PORT) { 222 udp->uh_dport = htons(33434) ; /*traceroute 포트번호 */ UDP의 종착점 포트번호를 지정
28
요 약 라우팅 테이블과 경로 제어 Redirect 프로그램 Scanroute 프로그램 라우팅 테이블 개요와 구조
프로그램의 사용 방법 프로그램의 실행 예 처리의 흐름 해설 Scanroute 프로그램 프로그램의 사용방법
Similar presentations