티스토리 뷰

반응형



지난번에 특정 IP에 포트 범위에 대해 NMAP을 사용하는 파이선을 만들어 보았습니다. 이후에 계속 NMAP을 보고 있는데 옵션이 너무 다양하고 이미 만들고자 하는 내용이 옵션으로 제공되고 있는 것들도 많더라구요. 앞으로 더 NMAP을 공부하겠지만, 이번에는 파이선도 병행해서 공부하는 것이라 문법에 익숙해 지기 위해 앞으로도 쭉 삽질을 계속할 예정입니다.


이번에는 NMAP에서 서브넷마스크와 포트범위를 지정해줄 수 있는 것의 적용, 그리고 결과정보를 파일로 저장하는 것, 마지막으로 오픈된 포트만 결과에 나올 수 있도록 만들어 보았습니다.


IP를 입력할 때 서브넷마스크를 적용하려면 IP/SUBNET 형식으로 작성하면 됩니다.

포트를 여러개 입력할 경우, 다양한 방법이 있는 것 같은데 저는 콤마로 연결하여 사용하였습니다.

결과정보를 파일로 저장할 경우도 여러 옵션이 있지만 -oA 옵션을 사용하였습니다.

마지막으로 오픈된 포트만 결과에 저장하기 위해 --open 옵션을 주었습니다.


# NMAP [TARGET_IP/SUBNET] -p [PORT_LIST] --open -oA [OUTPUT PATH/FILENAME]







결과 정보를 디렉토리 공유된 위치에 저장시켜 윈도우에서 파일을 열어보았습니다. 저장된 파일은 XML 형식으로 저장이 되네요. 앞으로 이 XML 형식의 파일을 파싱하여 엑셀에 이쁘게 만들어 주면 좋을 듯 합니다.





실제 결과가 어떻게 저장되는지 확인해보기 위해 엑셀파일로 열어보았습니다. 이때 읽기 전용 문서로 열어야 보이네요.





콘솔화면과는 다르게 정말 다양한 정보가 저장되었습니다. 이제 작성된 내용들이 어떤 내용들이고, 어떤 점을 주위깊게 봐야할 지 다시 알아보는 시간을 가져봐야 겠네요. 우선은 오픈된 포트 검사가 우선이기 때문에 이 부분만 정리해보니 이렇게 만들어 지네요. 역시 Well-Known 포트는 이름도 함께 써주네요. 보기 편하겠습니다.




이제 다음엔 어떤 좋은 옵션이 있는지 알아보고, XML 데이터에서 유의미한 데이터는 무엇인지 파악해야 할 것이며, 마지막에는 XML을 파싱하여 엑셀파일로 예쁘게 저장될 수 있도록 만들어 봐야겠습니다.




Fin




import os
from datetime import datetime
 
# 디폴트 값 
DEFAULT_TARGET_IP="192.168.0.1/24"
DEFAULT_TARGET_PORT="20,21,22,23,24,25,80,81,443,8080,8081"
DEFAULT_DIR_DOC="/media/sf_Shared"
 
print("This is check port using NMAP")
print("Default IP : " + DEFAULT_TARGET_IP )
print("Default PORT : " + str(DEFAULT_TARGET_PORT))
print("Default Doc Directory : " + DEFAULT_DIR_DOC)
print("Developed by SalaYH")
print("++++++++++++++++++++++++++++++++++++")
 
 
# Target IP / Subnet 입력
print ("IP Example : 192.168.0.17, 192.168.0.1/24")
TARGET_IP = raw_input("Input IP  : ")
if len(TARGET_IP) == 0:
    TARGET_IP = DEFAULT_TARGET_IP
 
# Port 입력
print ("Port Example : 21,22,...")
PORT = raw_input("Input Start PORT : ")
if len(PORT) == 0:
    TARGET_PORT = DEFAULT_TARGET_PORT
else:
    TARGET_PORT = PORT
 
# 결과파일 저장 디렉토리 입력
CHECK_SAVE_RESULT=raw_input("Do you want to save result to files? (Y/n) : ")
if len(CHECK_SAVE_RESULT) == 0 or CHECK_SAVE_RESULT.lower() == "y" :
    CHECK_SAVE_RESULT="y"
    DIR_DOC = raw_input("Input directory of saving result : ")
    if len(DIR_DOC) == 0:
        DIR_DOC = DEFAULT_DIR_DOC
    elif not os.path.isdir(DIR_DOC):
        print("Not exist directory(" + DIR_DOC + ")")
        print("If you don't want to make new directory, then use default directory : " + DEFAULT_DIR_DOC)
 
        # 디렉토리가 존재하지 않는 경우
        CHECK_MKDIR=raw_input("Do you want to make directory? (y/N) : ")
        if len(CHECK_MKDIR) == 0:
            print("You didn't type anthing, so It is using default directory.");
            DIR_DOC=DEFAULT_DIR_DOC
        elif CHECK_MKDIR.lower() == "n":
            DIR_DOC=DEFUALT_DIR_DOC
        else:
            os.mkdir(DIR_DOC)
 
 
 
print("++++++++++++++++++++++++++++++++++++")
print("Check Open PORT")
print(" - IP : " + TARGET_IP)
print(" - PORT : " + TARGET_PORT)
 
COMMAND = "/usr/bin/nmap " + TARGET_IP + " -p " + TARGET_PORT + " --open"
 
TODAY = datetime.now().strftime('%Y-%m-%d')
 
if CHECK_SAVE_RESULT.lower() == "y":
    COMMAND = COMMAND + " -oA " + DIR_DOC + "/NMAP_CHECK_OPEN_PORT_RESULT_" + TODAY + ".xml"
 
process = os.popen(COMMAND)
results = str(process.read())
 
print(results)
print("")
 
 
print("End Check PORT")



check_open_port_3.py




반응형

'Python' 카테고리의 다른 글

Python을 이용한 NMAP 활용 툴 만들기 #01  (0) 2019.03.07
댓글
반응형
최근에 올라온 글
Total
Today
Yesterday