목차 목차포트스캔코드포트스캔결과포트스캔탐지코드포트스캔탐지결과 참조

Similar documents
목 차 1. 포트스캐닝 (Port Scanning) 이란? 2. 포트 (Port) 란? 3. 스캔 (Scan) 의종류 4. 포트스캐너 (Port Scanner) 구현 5. 포트스캔 (Port Scan) 구현 6. 참조

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

PowerPoint 프레젠테이션

chap7.key

Microsoft PowerPoint - Supplement-02-Socket Overview.ppt [호환 모드]

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

본 강의에 들어가기 전

SYN flooding

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

K&R2 Reference Manual 번역본

11장 포인터

슬라이드 1

2009년 상반기 사업계획

Microsoft Word - KPMC-400,401 SW 사용 설명서


vi 사용법

untitled


< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Lab 3. 실습문제 (Single linked list)_해답.hwp

untitled

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

BMP 파일 처리

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft Word doc

[ 네트워크 1] 3 주차 1 차시. IPv4 주소클래스 3 주차 1 차시 IPv4 주소클래스 학습목표 1. IP 헤더필드의구성을파악하고요약하여설명할수있다. 2. Subnet ID 및 Subnet Mask 를설명할수있고, 각클래스의사용가능한호스트수와사설 IP 주소및네트

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770>

untitled

Microsoft Word - Network Programming_NewVersion_01_.docx

03장.스택.key

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

untitled

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

Microsoft PowerPoint - 13 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 2.ppt

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

歯9장.PDF

bn2019_2

PowerPoint 프레젠테이션

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - 09-CE-23-윈도우 소켓

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - chap10-함수의활용.pptx

PowerPoint 프레젠테이션

제1장 Unix란 무엇인가?

C 언어 프로그래밊 과제 풀이

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Microsoft PowerPoint - chap03-변수와데이터형.pptx

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - chap12-고급기능.pptx

The Pocket Guide to TCP/IP Sockets: C Version

chap8.PDF

Microsoft PowerPoint - [2009] 02.pptx

금오공대 컴퓨터공학전공 강의자료

untitled

PowerPoint 프레젠테이션

제1장 Unix란 무엇인가?

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - ch07 - 포인터 pm0415

슬라이드 1


0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

PowerPoint 프레젠테이션

Chapter 4. LISTS

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

PowerPoint 프레젠테이션

5.스택(강의자료).key

Chapter 4. LISTS

Microsoft PowerPoint - 12 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 1.ppt

PowerPoint 프레젠테이션

int main(void) int a; int b; a=3; b=a+5; printf("a : %d \n", a); printf("b : %d \n", b); a b 3 a a+5 b &a(12ff60) &b(12ff54) 3 a 8 b printf(" a : %x \

1장. 유닉스 시스템 프로그래밍 개요

Network Security - Wired Sniffing 실습 ICNS Lab. Kyung Hee University


13주-14주proc.PDF

본 강의에 들어가기 전

C 프로그래밊 개요

PowerPoint 프레젠테이션

제1장 Unix란 무엇인가?

Microsoft PowerPoint - chap06-2pointer.ppt

중간고사

chap 5: Trees

TCP.IP.ppt

Microsoft PowerPoint - 09-CE-24-채팅 프로그램

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap05-제어문.pptx

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

Lab 5. 실습문제 (Double linked list)-1_해답.hwp

C++-¿Ïº®Çؼ³10Àå

Sena Technologies, Inc. HelloDevice Super 1.1.0

기초컴퓨터프로그래밍

Microsoft PowerPoint - IP11.pptx

Transcription:

C++ 이용한포트스캔 Winpcap 이용기존수업시간 Client, BasicDump 코드이용 제출일 2016, 06, 01 전공사이버경찰학과 과목네트워크보안프로그래밍학번 10121702 담당교수소길자이름김주명

목차 목차포트스캔코드포트스캔결과포트스캔탐지코드포트스캔탐지결과 참조 02 03 05 06 11 12 2

포트스캔코드 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") typedef struct OpenPort int port; OpenPort *next; OpenPort; // 링크드구조선언 void error_proc(); // 에러구문 int main(int argc, char* argv[]) WSADATA wsa; SOCKET clntsd; SOCKADDR_IN clntaddr; // 각종소켓관련변수선언 char address[20]; int start_port = 0; int end_port = 65535; // 시작과끝을정해주고, 주소를저장할변수선언 OpenPort *openportlist = (OpenPort *)malloc(sizeof(openport)); OpenPort *openportnodetail = openportlist; // 링크리스트를위한동적메모리할당과앞부분와끝부분을선언 FILE *file = fopen("openedportlist.txt","wt"); // 파일로저장하기위한선언 printf(" 포트스캔할서버주소를입력하세요. : "); scanf("%s",address); printf(" 시작할포트스캔번호를입력하시오. : "); scanf(" %d", &start_port); printf(" 마지막포트스캔번호를입력하시오. : "); scanf(" %d", &end_port); 3

int num=0; for(num=start_port;num<=end_port;num++) // 시작부터끝까지포트스캔 if(wsastartup(makeword(2,2), &wsa)!= 0) error_proc(); clntsd = socket(af_inet, SOCK_STREAM, 0); if(clntsd == INVALID_SOCKET) error_proc(); // 에러판단 ZeroMemory(&clntAddr,sizeof(clntAddr)); clntaddr.sin_family = AF_INET; clntaddr.sin_port = htons(num); clntaddr.sin_addr.s_addr = inet_addr(address); // 입력한주소값으로소켓연결 if (connect(clntsd, (SOCKADDR *)&clntaddr, sizeof(clntaddr)) == SOCKET_ERROR) printf("[ ]%d 포트닫힘 \n", num); else printf("[ ]%d 포트열림 \n", num); fprintf(file,"[ ]%d 포트열림 \n", num); // 열린포트파일로저장 OpenPort *openedportnode = (OpenPort *)malloc(sizeof(openport)); openedportnode->port = num; openedportnode->next = NULL; openportnodetail->next = openedportnode; openportnodetail = openportnodetail->next; // 포트가열려있으면, 끝링크의항목에 Next 추가시키고 // 끝링크는다시해당항목으로이동 closesocket(clntsd); WSACleanup(); fclose(file); void error_proc() fprintf(stderr,"error: %d \n", WSAGetLastError()); exit(1); 4

포트스캔결과 포트스캔구간 : 443 445 열린포트 OpenedPostList.txt 파일로저장 5

포트스캔탐지코드 #include "stdafx.h" #include "pcap.h" #include <WinSock2.h> #include <stdio.h> #include <string.h> typedef struct ip_header u_char ihl:4; // 헤더길이 * 4 u_char ver:4; // IPv4 or IPv6 u_char tos; // 서비스종류 u_short tlength; // 헤더길이 + 데이터길이 u_short id; // 분할조각의 identification 17:UDP) u_short flag_offset; // 분할정보 + 분할순서 u_char ttl; // TTL(Time to live) u_char protocol; // 다음에올프로토콜종류 (1:ICMP 2:IGMP 6:TCP u_short cheksum; // 헤더의오류검증 u_char saddr[4]; // 보내는 IP u_char daddr[4]; // 받는 IP u_int op_pad; // option + padding iph; typedef struct TCPHeader u_short SourcePort; u_short DestPort; u_int SeqNum; u_int AckNum; u_char TCPlength; u_char flags; u_short WinSize; u_short CheckSum; u_short UrgentPointer; TCPHeader; // TCP 헤더선언 typedef struct visitlist u_char SenderIP[4]; int port; visitlist* next; visitlist* past; visitlist; visitlist *headlink=null, *visitlink = NULL, *taillink = NULL; void packet_handler(u_char *param, const struct pcap_pkthdr *h, const u_char 6

*data); int checkscan(visitlist *List); int main() char packet_filter[] = "tcp"; struct bpf_program fcode; pcap_if_t *aldevs; pcap_if_t *item; pcap_t *lancard; int inum; int i=0; char errbuf[pcap_errbuf_size]; /* 패킷캡쳐할때필터링할조건 */ u_int netmask; if(pcap_findalldevs(&aldevs, errbuf) == -1) // 디바이스검색 printf("error in pcap_findalldevs : %s\n", errbuf); up: int count=0; for(item=aldevs;item!=null;item=item->next) printf(" \n"); printf("** <%d 번장치 > **\n", count); printf(" 어댑터정보 : %s \n", item->name); printf(" 어댑터이름 : %s \n", item->description); printf(" \n"); count++; item=aldevs; printf(" 네트워크장치선택 : "); int choice; scanf_s("%d", &choice, 10); system("cls"); if(choice > count-1) printf(" \n" ); printf(" < The Device dose not exist. Please Try Again. > \n"); ); printf(" \n" goto up; 7

for(int count=0;count<choice;count++) item=item->next; printf("user select : %s \n", item->name ); lancard=pcap_open_live(item->name,65536,0,1000,errbuf); /* 패킷을필터링하는정보추가 */ netmask= 0xffffff; if(pcap_compile(lancard, &fcode, packet_filter, 1, netmask) < 0 ) fprintf(stderr, "\nunable to compile the packet filter. Check the syntax.\n"); //Free the device list pcap_freealldevs(aldevs); return -1; // 필터적용 if(pcap_setfilter(lancard, &fcode) < 0 ) fprintf(stderr,"\nerror setting the filter.\n"); //Free the device list pcap_freealldevs(aldevs); return -1; pcap_loop(lancard,0,packet_handler,null); void packet_handler(u_char *param, const struct pcap_pkthdr *h, const u_char *data) // 링크리스트구조를위해앞과뒤부분을미리선언후사용한다. iph *ih; ih = (iph *)(data+14); // IP 헤더선언 if(ih->protocol == 6) TCPHeader *TCP; TCP = (TCPHeader *)(((u_char*)ih)+(ih->ihl*4)); //IP 헤더시작위치 + ip 헤더길이 >saddr[count]; if(headlink == NULL) visitlink = (visitlist *)malloc(sizeof(visitlist)); int count = 0; for (count = 0; count < 4;count++) visitlink->senderip[count] = ih- 8

visitlink->port = ntohs(tcp->destport)-1; visitlink->next = NULL; headlink = visitlink; taillink = visitlink; printf("[%d - X]\n", visitlink->port); 경우 else if (headlink->next!= NULL) // 만일이전에통신한포트와다른포트로통신이될 if (ntohs(tcp->destport)-1!= taillink->port) visitlink = (visitlist *)malloc(sizeof(visitlist)); int count = 0; for (count = 0; count < 4; count++) visitlink->senderip[count] = ih- >saddr[count]; visitlink->port = ntohs(tcp->destport)-1; visitlink->next = NULL; visitlink->past = taillink; taillink->next = visitlink; taillink = visitlink; printf("[%d - %d]\n", visitlink->past->port, visitlink->port); 검사하기시작합니다. // 이때부터 3 회이상통신이므로통신을 checkscan(headlink); else if (ntohs(tcp->destport) - 1!= taillink->port) visitlink = (visitlist *)malloc(sizeof(visitlist)); int count = 0; for (count = 0; count < 4; count++) visitlink->senderip[count] = ih- >saddr[count]; visitlink->port = ntohs(tcp->destport) - 1; visitlink->next = NULL; visitlink->past = taillink; taillink->next = visitlink; taillink = visitlink; printf("[%d - %d]\n", visitlink->past->port, visitlink->port); 9

int checkscan(visitlist *List) List = List->next; int changedcounter = 0; int port1; int port2; 비교하여 알립니다. // 가장최근통신한포트와, 그이전의포트, 그그이전의포트를 //3 번이상다른포트로통신하였을경우, 콘솔창에포트스캔의심을 while (1) port1 = List->port; if (List->next == NULL) break; else List = List->next; port2 = List->port; if (port1!= port2) changedcounter++; 측에서포트스캐닝을하고있습니다!\n", if (List->next == NULL) break; else List = List->next; port1 = List->port; if (port1!= port2) printf("[ ] %d.%d.%d.%d List->SenderIP[0], List- >SenderIP[1], List->SenderIP[2], List->SenderIP[3]); return 0; 10

포트스캔탐지코드 본인은포트스캔을가상으로하지않고 2 개의컴퓨터로실험을하였다. 본인의 PC_IP = 192.168.43.78 공격자의 PC_IP = 192.168.43.7 본인의 PC 에포트스캐닝탐지툴을돌리고, 공격자가포트스캐닝공격을실행한다. 문제점은공격자의포트스캐닝을탐지도하지만포트를통해통신하는수많은패킷들 또한포트스캐닝을한다고탐지가되는점이다. 이런점에서개선이필요하다. 11

참조 수업 네트워크보안프로그래밍 [ 영산대학교소길자교수님 ] 참조자료 김태룡학생 [C++ 을이용한포트스캔및탐지 ] 보고서 수업시간의 PPT 자료 웹페이지 http://prof.ysu.ac.kr/blog/blog_message.asp?b_id=kjso 포트스캐닝정의 [ 위키백과 ] https://ko.wikipedia.org/wiki/%ed%8f%ac%ed%8a%b8_%ec%8a%a4%ec %BA%94 포트스캔 [ 후니네 ] http://sound10000w.tistory.com/30 1 2