- 전체
- 보안뉴스
- 제로데이취약점
- 해킹프로그래밍
- 웹해킹
- 해킹기법
- 정보보호
- 정보보안기사 - 국가기술자격
- 악성코드분석_리버싱
- 시큐어코딩_개발보안진단원
- CISSP
- CISA
- 모의해킹_penetration-test
- deepweb / tor network
- Kali Linux
모의해킹_penetration-test 모의해킹(Penetration Testing) PortScanner 3. 필요한 기술 익히기
2023.03.20 08:52
모의해킹(Penetration Testing) PortScanner 3. 필요한 기술 익히기
3. 필요한 기술 익히기
포트를 효과적으로 스캔하려면 for문을 사용하여 같은 구문의 반복을 최소화해야 한다. 포트는 65535번까지 존재하기 때문에 모든 포트를 수동으로 적는다면 수없이 노동해야 한다. 우리는 이미 for문을 사용하여 코드를 줄이는 방법을 배웠다. 다음 코드를 활용하여 연속적인 포트 리스트를 만들 수 있다.
>>> for portNum in range(65536):
print portNum
0
1
2
3
4
5
6
7
8
9
10
11
중략 ...
이렇게 0~65535포트를 스캔하면 모든 포트를 스캔할 수 있어 좋지만, 시간이 오래 걸린다는 단점이 존재한다. 현존하는 대부분의 포트 스캐너들은 따로 리스트를 작성하여 주요 포트 번호만을 스캔한다. 아래와 같이 리스트를 생성하여 for문을 활용한 리스트 출력을 실습해보자.
>>> portNums = [21,22,23,25,53,80,110,137,138,139,143,443,445,548,587,993,995,433,1701,1723,3306,5432,8000,8008,8080,8443]
>>> for portNum in portNums:
print portNum
21
22
23
25
53
80
110
137
138
139
143
443
445
중략 ....
-
포트 번호에도 종류가 있다?
포트 번호에도 종류가 있다. 보통 세 가지(Well-known Port, Registered ports)로 나눈다.
첫 번째는 잘 알려진 포트(Well-known Port)라고 부르는 0~1023 포트는 유닉스 계열 운영체제에서는 관리자 권한으로만 실행이 가능하다. 이 서비스 포트들의 역할은 모두 정해져서 사용하고 있으므로 다른 용도로는 사용하지 않도록 하는 것이 좋다.
두 번째 Registered Port는 1024~49151 포트로 회사들마다 등록하여 사용하고 있고, 마지막 Dynamic Port는 49151~65535로 동적 또는 개인적으로 사용되는 포트들로 등록할 수 없는 포트들이다.
더 자세한 내용은 다음 링크를 참고하도록 하자.
http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Dynamic.2C_private_or_ephemeral_ports
포트를 스캔하는 방법은 여러 가지 존재하지만 우리는 먼저 기초적인 TCP 연결을 통하여 스캔할 것이다. 소켓을 만들어서 대상 포트에 연결을 요청해보자. 소켓을 만들 때는 socket이라는 라이브러리가 필요하다. 이 라이브러리를 임포트한 뒤 socket을 생성하고 www.naver.com의 80번 포트로 연결을 요청하겠다. 80 번 포트는 웹 서비스 포트이다.
>>> import socket # socket 임포트
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socket 생성
>>> s.connect(("www.naver.com",80)) # www.naver.com 80번 포트로 연결
>>> s.send("GET / HTTP1.1\n") # GET 요청 송신
14
>>> naverweb = s.recv(1024*1024) # Web Page 수신
>>> naverweb # 응답 결과 출력
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml">\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />\n<title>\xeb\x84\xa4\xec\x9d\xb4\xeb\xb2\x84 :: \xed\x8e\x98\xec\x9d\xb4\xec\xa7\x80\xeb\xa5\xbc \xec\xb0\xbe\xec\x9d\x84 \xec\x88\x98 \xec\x97\x86\xec\x8a\xb5\xeb\x8b\x88\xeb\x8b\xa4.</title>\n<link rel="stylesheet" type="text/css" href="/css/err.css?1007" />\n<script type=text/javascript> \nvar defaultCharset = document.charset ;\nfunction isIE(){ return
...중략...
UDP 통신을 하는 방법은 TCP 보다 훨씬 단순하다. 소켓을 만들 시에는 socket.SOCK_STREAM을 socket.SOCK_DGRAM으로 바꿔주면 된다. UDP는 비연결형 통신이기 때문에 별도의 연결 과정은 필요 없으며 바로 데이터를 송신하면 된다. 송신 시 host와 port 번호를 적어준다.
다음 코드를 작성하고 UDP 패킷을 생성하여 데이터를 수신해보도록 하자. 대상 서버는 kns.kornet.net DNS 서버이다. 참고로 DNS 서비스는 보통 UDP를 사용한다.
>>> import socket
>>> tgtHost = "168.126.63.1" # DNS 서버
>>> tgtPort = 53 # DNS 포트
>>> client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 소켓 생성
>>> client.sendto("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", (tgtHost,tgtPort))
32 # 데이터 송신
>>> data, addr=client.recvfrom(4096) # 데이터 수신
>>> print data, addr # 데이터 출력
AAÁ ('168.126.63.1', 53)
-
DNS 서버?
DNS 서버란 Domain Name System의 약자이다. IP는 사람이 기억하기 어렵기 때문에 DNS를 사용하면 도메인 이름을 IP 주소로 알려준다. 웹 브라우저에 www.naver.com을 입력하면 브라우저가 DNS 서버로부터 www.naver.com의 IP 주소를 받아와서 IP 주소로 연결을 요청한다.
[출처] https://m.blog.naver.com/isc0304/220373624417
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.