뉴비에욤
0x1 Python Tutorials - Port Scanner 본문
이번 포스팅에서는 파이썬을 이용하여 기본적인 포트 스캐너를 만드는 것을 통하여 파이썬에서 어떻게 네트워크 연결을 하는지 보여 줄 것이다. IP 주소와 포트번호를 기반으로 지속적으로 네트워크 소켓 연결을 생성할 것이다. 이런 작업을 수행하기 위해 "반복문" 이라는 새로운 컨셉을 보여줄 것이다.
위 사진의 루프 코드에서 약간의 들여쓰기가 된 것을 주의해야 한다. 보통 프로그래머들은 들여쓰기를 탭이나 공백 2개를 (스페이스 2번) 이용한다. 한 스크립트 내에서 지속적으로 하나만 사용할 경우에는 어떤걸 사용하던 상관 없다. 간단한 포트 스캐너를 만들기 위해 위 코드에서 사용된 "print" 대신에 소켓 연결을 생성하는 코드로 대신 할 것이다. 아래 사진의 코드는 내장된 "socket" 모듈을 이용해서 어떻게 소켓을 생성하는지 보여준다.
위 사진에서 "socket" 모듈을 임포트한 뒤 "connect()" 함수를 호출하여 주어진 IP 주소:포트에 연결을 시도하였다. 이는 TCP 연결을 (SYN / SYN-ACK / ACK) 생성할 것이다. 그리고 "send()" 함수를 이용하여 주어진 서비스(포트번호 22:ssh 서비스)에다가 실제 데이터를 보냈다. 그리고 송신한 데이터에 대한 응답을 "recv()" 함수를 이용하여 banner 변수에 저장하였다. 만약 포트가 열려 있지 않다면 소켓은 예외를 출력할 것이다.
위 사진에서 보는 것처럼 현재 로컬 머신에서는 "23" 포트가 열려있지 않아 예외가 발생하였다. 이런 예외는 다양한 방법으로 처리될 수 있다. 우선 지금은 간단하게 "try / except" 를 사용하여 예외 발생 부분을 그냥 통과(pass)할 것이다.
이전과 달리 오류가 발생하지 않았다. 이런 방법은 마치 코드가 정상적으로 동작되는 것처럼 보여준다. 이제 이런 컨셉들을 모두 사용해서 포트 스캐너를 위해 간단한 루프를 생성할 것이다.
위 사진에서 스캔 대상 포트가 닫혔을 때 발생하는 예외를 처리하기 위해 "try / excpet" 루프의 기본적인 사용법을 보여주었다. 또한 기본적인 조건문인 "if" 조건문을 사용하여 대상 포트가 열렸을 경우만 메시지를 출력하게 하였다. 포트 스캐너를 작성하는 또 다른 방법은 스캔을 하고자 하는 포트의 목록을 배열 형태로 만들고 해당 배열에 반복문을 사용하는 것이다.
만약에 n개 이상의 호스트 역시 한번에 핸들링(처리) 하고자 하면 중첩(이중) 반복문을 사용할 수 있다. 이중 반복문 중 바깥쪽의 반복문은 호스트를 처리할 것이고 안쪽의 반복문은 포트를 처리할 것이다. 아래 사진은 좀 더 깔끔한 스캐너를 만들기 위해 이중 반복문을 사용한 예제이다.
결과를 보면 호스트 주소가 대입된 배열내의 각각의 주소에 포트 배열 내의 각 포트를 대입하고 다음 반복문을 실행하는 것을 볼 수 있다. 최종적으로 스캐너를 좀 더 다듬으려면 "print" 부분을 대상 포트가 열린 경우에만 (ex => 127.0.0.1:22) 출력하도록 변경하면 된다.
사실 "Nmap" 포트 스캐너가 훨씬 정교적이고 좋은 포트 스캐너이다. 그러나 위에서 보여주었던 컨셉을 이용하여 이후 포스팅에서 좀 더 스크립트를 작성할 것 이기 때문에 "dir(socket") 함수를 이용하여 "socket" 모듈에서 제공하는 내장 함수를 좀 더 연습하길 바란다.
'primalsecurity.net > Python Tutorials' 카테고리의 다른 글
0x4 Python Tutorials - Python to EXE (0) | 2015.09.08 |
---|---|
0x3 Python Tutorials - Fuzzer (0) | 2015.09.08 |
0x2 Python Tutorials - Reverse Shell (2) | 2015.09.07 |
0x0 Python Tutorials - Getting Started pt2 (0) | 2015.09.07 |
0x0 Python Tutorials - Getting Started pt1 (0) | 2015.09.07 |