이번 튜토리얼에서는 파이썬을 사용하여 네트워크 연결을 수립하는 방법을 설명하고, 이를 통해 기초적인 포트 스캐너(Port Scanner)를 제작해보도록 하겠습니다. 이를 위해서는 네트워크 소켓(socket)을 사용하여 특정 IP와 Port에 지속적으로 연결 요청을 보내는 작업을 수없이 반복해야만 합니다. 이를 쉽게 해결하기 위해서는 반복문(Loop)의 개념을 이해해야 합니다.

위의 코드는 반복문(Loop)을 표시하였습니다. 보시다시피, 반복문 내부는 들여쓰기(indent)가 적용되어 있습니다. 보통 파이썬을 사용하는 사람들은 indent를 사용할 때 '띄어쓰기 2칸’을 사용하거나, 탭(tab)을 적용합니다. 둘중 어느것을 택하여도 상관없으며 한가지 방식을 선택하여 일관되게 사용하는 것을 추천합니다. (역주 : 스크린샷처럼 python3의 경우 print가 함수이므로 괄호로 묶어주어야 작동. python2 코드에서는 괄호가 없음.)


간단한 포트 스캐너를 만들기 위해서는, 반복문 사이에 소켓 연결을 수립하는 코드를 추가로 삽입하여야 합니다. 아래의 코드는 파이썬에 기본으로 내장된 소켓 모듈(built-in socket module)을 호출하여 네트워크 연결을 수행해줍니다.

socket 모듈을 import한 후 connect() 함수를 호출하였습니다. 이때 IP주소와 포트번호를 지정해줍니다. 이 코드를 실행하면 TCP 연결을 수립(*SYN/SYN-ACK/ACK)하게되고, send()함수를 사용하여 데이터를 송신하거나, recv()함수를 사용하여 수신할 수 있습니다. 만약 개방되어있지 않은 Port에 대해서는 예외(exception)이 발생하게되며, 소켓은 이것을 처리하기 위한 예외처리 루틴을 수행합니다.*(역주 : 일명 3-Way handshake가 수립된 상태)

이러한 에러가 발생할 때 이를 해결하기 위한 몇가지 방법이 있습니다. 그중 가장 간단한 방법으로 “try/except” 구문을 사용하여, 루프에서 해당 예외를 무시하도록 처리하겠습니다.

보시다시피, 에러 메시지가 전혀 표출되지 않습니다! 이처럼 코드가 정상적으로 작동하게 만드는 것은 꽤나 중요한 작업입니다. 그럼 이제 지금까지 설명했던 개념들(루프, 소켓, 예외처리..)을 통합하여 간단하지만 유용한 포트 스캐너 코드를 제작해보겠습니다.

무수히 많은 포트에 대해 try/except 구문을 사용해서 닫혀있는 포트를 무시하고 건너뛰는 방법을 소개해드렸었죠? 여기에 한가지 더 추가하여, if 구문을 이용한다면 open된 포트에 대해서만 결과물을 출력하도록 설정할 수 있습니다. 또한, 조사하고자하는 몇가지 포트에 대해서 리스트(또는 배열)를 만들어 둔 후, 해당 값들에 대해서만 루프를 수행하여 조사하게 할 수 있습니다.

만약 하나의 호스트가 아니라, 다수의 컴퓨터에 대해 동시에 스캐닝을 진행하고 싶다면, 중첩 루프(nested loop)를 사용하면 됩니다. 먼저 하나의 호스트에 대해 수행할 작업들을 루프로 작성한 뒤에, 바깥쪽에 루프를 하나 더 추가하여 여러개의 호스트에 대해 안쪽 루프를 수행하도록 하는 것입니다. 아래의 코드는 중첩루프를 사용하여 다수의 호스트에 대해 포트스캐닝을 수행하는 조금 더 진화된 스캐너입니다.

결과화면에서 볼 수 있듯이, 하나의 호스트에 대해서 각각의 포트 스캔을 수행하고 그 다음 호스트로 넘어가는 과정을 수행합니다. 해당 코드를 여러분이 조금 더 수정해보셔서, 닫혀있는 포트에 대해서는 결과를 무시하고 오직 열려있는 포트만 출력하도록 깔끔하게 만들어보시는 것은 어떨까요?


사실, 이미 Nmap이라는 매우 훌륭한 포트 스캐닝 소프트웨어가 있습니다. 이와 비슷한 수준에 이르기까지 직접 구현을 하기 위해서는 조금 더 다양한 이론과 기법들을 숙지해야하며 이는 추후 포스팅을 통해서 점차 알아가도록 합시다. 우선 dir(socket) 명령어를 사용하셔서 socket모듈과 관련된 다양한 함수들을 연구해보시는 것도 좋을 듯 합니다.


그럼 다음 포스팅에서 뵙겠습니다.


Reference : 

Cybrary의 Primal Security - Python for InfoSec Professionals Part 2: Port Scanner



CPUU님의 창작활동을 응원하고 싶으세요?