치명적 파이썬 (Violent Python) – 0×02 포트스캐너

이번시간에는 간단한 자가 포트 스캐너를 제작해봄으로써 소켓 통신에 필요한
라이브러리 활용법에 대해 알아보고자 한다.

또한, python-nmap 모듈을 통해 nmap 기능을 파이썬으로 확장해볼 것이다.

이번 포스팅에서 다루게 되는 범위 : 치명적 파이썬 챕터 02 (~46Page)

 

전체 코드 소개

이번 시간에 제작할 프로그램은 포트 스캐너이다.
사용자가 옵션으로 입력한 (지난 시간에 다룬  optparser를 이용) 호스트 네임과 포트를 대상으로
TCP 커넥션을 맺은 후, 애플리케이션 배너를 가져오는 기능을 갖고 있다.

코드를 한번 살펴보자.

함수는 메인함수 +  ConnScan 함수 그리고  PortScan 함수, 총 3개로 구성되어 있다.
호출 순서는 Main – PortScan – ConnScan 순이므로, 순차적으로 살펴보도록 하자.

 

PortScan 함수

try / except를 통해 기본적인 예외처리를 하였으며,
gethostbyname 함수와 gethostbyname을 통해 IP 어드레스와 호스트 네임을
어떻게 가져올 수 있는지 보여주고 있다.

메인함수에서 사용자로부터 여러개의 포트를 입력받을 수 있도록 하였다.
입력한 포트 갯수 만큼 리스트 형태로 PortScan 함수로 전달이 되고,
쓰레드를 통해 ConnScan 함수를 호출하여 실제 포트 스캐닝이 이루어지게 된다.

 

ConnScan 함수

ConnScan 함수는 실제 포트스캐닝을 통해 대상으로 부터 애플리케이션 배너를 가져와서 출력한다.

먼저 connskt 변수를 통해 소켓 객체를 초기화 시킨다.

소켓을 장착(?) 하게 되면  connect 메서드를 통해 실제 접속을 시도하는데,
이 때 파라미터는 튜플형태로써 (host, ip) 형태가 된다.

마지막으로 recv 메서드를 통해 소켓 연결된 대상으로 부터 수신한 데이터를 변수에 저장한 후
출력하게 된다.
이 때, screenLock.acruire() 구문이 보이는데 이는 쓰레드의 사용으로 인해 출력문이 한꺼번에
출력되지 않도록 screenLock에 화면 우선권을 줌으로써, 하나의 쓰레드 당 하나의 출력만 할 수 있게
조절하는 역할을 한다.

 

메인 함수

메인 함수의 경우 지난 1장에서 다룬 내용을 그대로 활용하고 있어 자세한 설명은 생략한다.
이번에도 역시 optparser를 통해 사용자에게 옵션을 제공함으로써 입력값에 대한 확장성을 보장한다.

 

실행 결과 

여러개의 포트에 대해 스캐닝한 결과 80포트가 열려있었으며, 배너(Response)값을
정상적으로 가져온 것을 알 수 있다.

위 예제는 파이썬을 이용한 아주 간단한 소켓 통신 프로그래밍의 예라 할 수 있으며
실제 포트스캐닝은 Nmap이라는 아주 강력한 도구가 있으므로, 이를 이용하는 것이
훨씬 현명한 선택이라 할 수 있을 것이다.

파이썬의 강력한 확장 기능 답게, python-nmap이라는 라이브러리가 공개되어 있으며
이를 통해 Nmap의 기능을 파이썬을 통해 구현하거나 입맞에 맞게 수정할 수도 있다.

 

Python-nmap을 이용한 포트 스캐닝

파이썬을 통해 Nmap을 사용하기 위해서는 python-nmap 라이브러리가 필요하며,
“pip install python-nmap” 명령을 통해 손쉽게 설치가 가능하다.

기본적인 메인함수의 구조는 포트스캐너 예제의 그것과 별반 다르지 않다.
실제 스캐닝을 수행하는 NmapScan 함수를 자세하게 살펴보도록 하자.

먼저 nmScan 변수를 통해 nmap.portscanner 객체를 생성하면 스캔을 실행할 수 있다.
그다음, scan 메서드를 통해 튜플형태의 (host,IP)를 넣어주면 실제 스캔을 하게 된다.
마지막으로 공격 대상 호스트와 포트를 인덱싱하여 포트 상태를 출력하게 된다.

스캔 결과는 아래와 같다.

이처럼 파이썬은 단 몇줄의 코드만으로 소켓 프로그래밍이 가능한 아주 강력한 도구임에 틀림없다.

또한 라이브러리를 통해 기존의 도구들이 가진 기능을 확장할 수 있다는 점도 장점이라 생각된다.

소켓 프로그래밍은 자주 다뤄지는 주제이므로 좀 더 다양한 예제를 앞으로도 다뤄볼까 한다.

 

Site Footer

Sliding Sidebar

About Me

About Me

June Park