1. 개발 결과
스크립트 동작으로, 정보 수집 대상의 Port 별 NMAP scan 결과를 이미지 파일로 저장할 수 있었다.
스캔 종료를 subprocess의 PIPE를 통해 확인함으로, 이미지 파일 저장뿐이 아닌 텍스트, 엑셀 또는 XML 문서 작성 외 추가적인 작업이 가능하도록 구분(함수화) 구현하였다.
다만, 전체적인 개발에 8시간이 넘게 투자되었기에, 앞으로 스크립트가 얼마나 많은 시간을 줄일 수 있는지에 따라 과다한 시간이 투자된 부분이 아닐지 고려해볼 소지가 있다.
차후에 Bash 스크립트를 구현할 수 있다면, Bash로 IP 목록 파일 데이터를 읽어 자동으로 여러 IP를 등록하게 변경할 수 있도록 내부에서 IP를 설정하지 않았다.
1) 실행 결과
| 스크립트 파일 실행 | 스크립트 실행 결과, 저장된 NMAP scan 결과 이미지 |
![]() |
![]() |
2) 목적 달성도 (75%)
정보 수집 대상의 Port 별 스캔 결과를 이미지 파일로 저장하는 부분까지는 목적을 달성하였으나, 현재 Linux OS에서만 동작하는 관계로 점검 스크립트로 활용하기에는 단점이 있다는 부분에서 아쉬웠다.
1차적으로, os를 구분하고 각 os 별로 필요한 모듈 또는 라이브러리를 이용한 구현까지는 완료하였으나 스크립트 파일로 실행 시 각 라이브러리들이 os에 종속됨에 따른 오류가 발생하였다.
해당 부분은 Bash 스크립트처럼 동작할 수 있는 방법을 묘색할 필요성을 가지게 한다. python을 이용한 실행 파일(exe)를 만들 시에는 Windows OS 종속되는 문제점이 있다.
부가적으로, 개발자가 아닌 입장에서 필요성에 의해서 구현한 부분이기에 개발자가 보기에 수 많은 문제적인 소스코드들과 이해하지 못할 부분은 넘어가도록 하겠다.
2. 개발 목적
NMAP scan 결과 이미지 생성을 자동화하여, 단순 반복 작업에 소요되는 시간을 단축 시키는데 목적이 있다.
정보 수집 단계의 점검 결과를, 텍스트, 엑셀 또는 XML 문서로 변경 시 NMAP Tools의 기본 기능 또는 이미지 저장 부분만 수정하여 사용할 수 있도록 구분하여 개발하는데 추가적인 목적이 있다.
3. 개발 사유
『주요정보통신기반시설 기술적 취약점 분석/평가 방법 상세 가이드』 의 8장 Web(웹) 취약점 분석/평가 항목을 기반으로, 웹 취약점 학습 시 IP 기반으로 동일한 Port 스캔을 반복함을 확인할 수 있었다.
점검대상은 도메인 구분되며, 서비스 구조에 따라 수 많은 IP가 존재하기에 각 각의 IP와 Port를 입력하는 단순 반복되는 작업에 시간을 소모하게 된다.
또한, 웹 취약점 분석/평가에 대한 보고서 작업 시, 정보 수집 단계의 점검 결과를 NMAP scan 결과 이미지를 삽입함에 따라 반복되는 작업은 전체 일정의 딜레이를 발생 시킬 수 있는 요소가 될 수 있다고 생각되었다.
점차 많아지는 기능들과 점검 포인트로 인하여 점차 점검에 필요한 시간은 증가할것이며, 수동 점검의 과정에서 부분 부분의 자동화로 쌓이는 시간은 무시할 수 없을 거라고 생각되었다.
4. 설계 단계
1) 알고리즘 (일단 알고리즘이라고 사기 쳐본다.)

| 단계 | 단계명 | 설명 |
| 1 | 작업 시작 | 스크립트 파일 준비 및 실행 |
| 2 | Target IP 입력 / Port 목록 입력 |
스크립트 실행 시 인자 값으로 스캔 대상 IP를 입력 |
| 3 | SLP Port 스캔 | 포트 번호가 저장된 SLP 배열 [i]의 값으로 NMAP 스캔 수행 |
| 4 | 스캔 끝남? | 포트 스캔이 종료되어, 결과 출력 여부 확인 |
| 5 | 스캔 결과 이미지 저장 | 포트 스캔이 종료된 결과를 이미지로 저장 |
| 6 | 마지막 i 인가? | SLP 배열에 저장된 모든 포트 번호 스캔 여부 확인 |
| 7 | 작업 끝 | 스크립트 종료 |
5. 구현 단계
1) 소스코드 및 기능 설명
분명, 이보다 더 좋은 방법은 수 없이 많겠지만 현재의 달성도는 여기까지다.
(1) 라이브러리 선언
import subprocess, os, sys, time, gi
gi.require_version("Gdk", "3.0")
from PIL import ImageGrab
from gi.repository import Gdk
주요 라이브러리는, subprocess, os, ImageGrab, gi (Linux)이다. 각 라이브러리에 대한 설명은, 공식 doc를 참조하는 편이 좋다.
(2) NMAP 스캔 수행 및 결과 확인 함수
def nmap_scan(target_ip, port_item):
result = subprocess.Popen(["nmap -Pn %s %s" % (target_ip, port_item)], shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
while True:
try:
out = result.stdout.readline()
print(out, end="")
if out.strip().find("Nmap done") > -1:
break
else:
pass
except:
pass
입력 받은 IP와 Port를 기반으로 NMAP 스캔을 수행하고, While문으로 지속적으로 입/출력 값을 받아오도록 구현하였다. 입/출력 값은 각 stdin, stdout, stderr로 받아올 수 있으며, 연결을 위한 PIPE를 선언하였다.
stdout으로 받아오는 readline() 데이터들 중 NMAP 스캔 종료 문자열을 검색하여, 존재하는 경우에 while을 종료 시키고, 함수를 리턴 시키도록 구현하였다.
(3) Active Window 탐지 부분 (Linux)
screen = Gdk.get_default_root_window().get_screen()
active_window = screen.get_active_window()
width, height = active_window.get_geometry()[2:]
img = Gdk.pixbuf_get_from_window(active_window, 0, 0, width-10, height-40)
img.savev(port_item[0] + ".png", "png", (), ())
모니터 화면 정보를 받아온 다음, Active window 정보를 따로 저장한다. 이 때, get_geomery()를 통해 Window의 좌표 값 등을 받아올 수 있다.
Windows OS에서는, win32gui lib으로 좀 더 쉽게 적용할 수 있었다.
2) 구현 단계에서 발생된 문제점 및 해결 방법
(1) 알고리즘 4단계의 스캔 종료 여부 확인 방법
| 예상 상황 | os.system을 사용해서, NMAP 스캔을 수행하면 되겠지? |
| 문제점 | os.system으로 NMAP 스캔 수행 시, 완료 시점을 알 수 없어 무한 대기에 빠짐 |
| 해결 방법 | subprocess lib의 popen 속성으로, 수행 결과를 실시간으로 받아와 완료 시점을 확인할 수 있도록 함 ① os 의 리턴 값으로는 정상 수행 여부를 확인할 수 있음을 확인 ② 다른 명령어 실행 관련 Python lib 검색 (python cmd 명령어 실행 등의 키워드 검색) ③ subprocess의 PIPE를 통해, 프로세스 간 입/출력 데이터를 확인할 수 있음을 확인 ④ PIPE를 통해 출력되는 데이터를 확인하여, 작업 종료 포인트를 탐지할 수 있도록 적용함 |
※해결 방법은 단순하게 적었지만, 초기 명령어 조합을 ["start", "cmd", "/k", nmap 명령어]로 구성하여 자식 프로세스에서 새창을 열어 PIPE를 통해 데이터를 받아 올 수 없다는 사실을 하루가 거의 지나서 깨달았다.
(2) 이미지 저장 방법
| 예상 상황 | 이미지 제어를 지원하는 Python lib을 이용하여 결과 이미지를 저장하면 되겠지? |
| 문제점 | 화면 전체를 캡처하여 저장하여, 수작업으로 이미지를 수정하게 되어 자동화가 아니게 됨 |
| 해결 방법 | ① Active Window를 탐지하는 lib을 이용 ② lib을 이용하여 Active Window x,y 좌표 값을 획득 ③ 이미지 캡처 시 지정된 좌표 크기만 저장하도록 적용함 |
※ windows 에서 활성화된 윈도우 (Active window) 를 찾는 법은 쉬웠으나, 리눅스는 그렇지 않았다.
※ 메인 작업을 Windows OS 에서 수행함으로, 영향력을 주지 않기 위해 sub 장비에 설치된 Kali에서 동작 시키기 위함으로 Linux 환경에서의 동작도 필요하였다.
(3) 저장된 이미지에 여백 발생
| 예상 상황 | Active window로 이미지를 저장했으니, 바로 사용 가능하겠지? |
| 문제점 | 저장된 이미지에 정체 모를 여백이 추가되어 저장되어, 또 다시 수작업으로 이미지를 수정하게 생김 |
| 해결 방법 | ① 정체 모를 여백이 어디서 왔는가 추정 ② Active Window의 크기를 변경해도, 여백의 크기가 동일함을 확인 ③ 저장된 이미지와, 실제 수행하는 터미널의 차이점을 확인 ④ 터미널창의 타이틀 및 휠 영역 크기만큼 여백이 생김을 확인 ⑤ 좌표 호출 부분에서, 해당 영역 크기만큼 제거(-)하여 저장 |
'개발' 카테고리의 다른 글
| [WEB] Node.js 웹 사이트 구축 1 (환경 구성) (0) | 2024.01.05 |
|---|---|
| [Python] m3u8 스트리밍 영상 다운로드 (Feat.불법 다운로드 대응) (0) | 2023.06.08 |
| [Python][자동화] ICMP Type 및 Code 별 전송 (0) | 2023.02.10 |
| ChatGPT로 메일 서버 구축해보기 (1) : 메일서버 어떻게 구축해? (0) | 2023.02.05 |
| [Python] Flask 테스트 웹 만들기 _ 1편 : HTTP 서버 만들기 (0) | 2022.11.25 |

