지금 부터 진행되는 대부분의 파이썬 강좌는 리눅스에서 실행되며, 파이썬 버전은 2.X 버전입니다.
우선 포트 스캐너를 만들기 전에 배너그래이빙을 위해서 간단하게 소켓을 이용한 스크립트를 짜볼것이다.
소켓 모듈은 import 하고 소켓 클래스로부터 새로운 변수인 s를 선언한다. 다음으로 IP주소와 포트에 네트워크로 연결하기 위한 connect() 함수를 사용한다.
연결이 성공하면 소켓으로 네트워크를 통해 읽기/쓰기가 가능하게 된다. recv(1024) 함수는 소켓에서 1024 바이트를 읽어온다는 뜻이다.
위에서 읽어온 1024 바이트를 ans 변수에 저장하고 이를 프린트 해본 결과 192.168.7.200 IP에서는 21번 포트를 이용해서 FTP 서비스를 하고 있음을 알고있다.
여기서 "AnonSE FTP Server"가 바로 서버에서 설정한 배너라는것이고, 이를 스캔으로 가져오는 행위를 "배너 그래이빙"이라 칭한다.
기본 FTP 스캐너
try, except를 이용하여 해당 IP주소:포트에 연결하지 못할 경우를 대비하였고, 배너 그래이빙 부분에 대한 코드를 getBanner라는 함수로 선언하였다.
main 부분에서는 ip 2개를 설정하고, 포트는 21로 설정하였다. 그리고 banner1, banner2 변수에 각각 ip1, ip2에 대해 getBanner를 호출한 결과를 선언하였고,
결과가 있으면 해당 IP주소:포트에 대해 배너 그래이빙을 수행한 결과를 보여준다. 해당 파일을 실행하면 다음과 같은 결과를 보여준다.
192.168.7.200에서 21번 포트로 FTP 서비스를 실행하고 있는 것을 알 수 있으며 배너를 반환했다. 만약 반환된 배너를 가지고 무엇인가를 하고 싶다면 코드를 다음과 같이 수정한다.
수정된 코드는 chkVulns 이라는 함수를 추가하여 반환된 배너를 가지고 이것이 취약한 서비스 인지 아닌지를 판단한다.
취약한 서비스인지 판단하기
배너를 반한 후, 스크립트는 이 배너를 가지고 이미 알려진 서비스와 취약한지 비교한다. 실행 결과는 다음과 같다.
192.168.7.200에서는 취약한 FTP 서비스가 실행되고 있음을 알 수 있다.
제법 그럴듯해 보이지만 1차 수정된 위의 코드 또한 몇가지 문제점이 있다.
우선, 스캔을 수행할 IP를 일일이 입력해서 코드가 길어지고 포트 또한 1개 밖에 입력할 수 없기 때문에 그리 좋은 스캐너는 아니다.
그리고 취약점 판단 여부를 사용자가 직접 코딩해야 한다.
문제점 1차 수정하기
우선 IP을 일일이 입력하는 문제는 반복문을 이용하여 해결 할 수 있고, 포트의 경우에는 리스트로 표현할 수 있다.
수정된 코드는 다음과 같다.
우선 여러 개의 포트를 스캔하기 위해 ports 라는 리스트 변수에 스캔할 포트를 지정하였다.
IP의 경우에는 for와 range 함수를 이용하여 192.168.7.200 ~ 192.168.7.203 대역의 IP를 지정하였다.
실행 결과는 다음과 같다.
문제점 2차 수정하기
IP와 Port에 대한 문제점을 수정했으나 아직 취약점 판단에 대한 문제를 수정하지 못했다. 배너를 직접 프로그래머가 입력해야 하는 위의 코딩은 가독성이 좋지 않기 때문에
이를 파일 I/O를 이용하여 해결한다. 우선 취약한 서비스들의 목록이 들어있는 "vuln_list.txt" 라는 파일이 있다고 가정한다. 이 파일에는 각 라인별로 알려진
취약점이 들어있다.
수정된 프로그램의 코드는 다음과 같다.
우선 텍스트 파일을 읽기 모드로 열고, readlines() 함수를 이용하여 파일에 있는 내용을 각 라인별로 읽어온다. 라인 별로 읽어온 배너를 스캔된 배너와 비교하여
일치하면 취약하다고 출력하고, 일치하지 않으면 다음 과정으로 넘어간다.