본문 바로가기

Programming/Project

파이썬 & Nmap 으로 Anonymous FTP 찾기

반응형

모의해킹에서 의외로 자주 지적되는 항목 중에 하나는 비밀번호가 설정되지 않은 FTP 서비스의 사용이다.

검사를 위해서는 보통 nmap으로 21번 포트를 검사해서 open으로 나오는 IP로 접속해보는 것과,

nmap에서 제공하는 nse 스크립트를 사용해 점검하는 방법이 있다.

 

내부 IP 대역을 FTP 클라이언트 프로그램으로 전부 접속해보는 방법도 있지만 공수 대비 결과가 별로다.

짧은 기간 안에 많은 항목과 부분들을 점검해야 하는 모의해킹에서 위 방법은 효율이 떨어진다.

 

간혹 가다가 내부 보안 정책으로 nmap 파일이 실행이 안 되는 경우가 있는데 점검은 해야 되는 경우가 있다.

이럴 경우 담당자에게 말해서 임시로 예외처리를 받고 점검을 진행하기도 한다.

하지만 간혹 가다가 실행 파일은 막혀 있지만 외부 라이브러리를 사용한 코드나 스크립트는 실행 가능한 경우가 있다.

이럴 경우에는 정책 차단 여부를 확인하고 예외처리를 하는 번거로운 절차 없이 아래 코드로 자동화된 점검이 가능하다.

import nmap
import socket
from netaddr import *
import csv
from collections import ChainMap
import time

print("Security Check Start")

def get_ip_address():
	sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	sock.connect(("8.8.8.8", 80))
	return sock.getsockname()[0]

def scan_anon_ftp():
	nm_anon = nmap.PortScanner()
	host_ip = get_ip_address()
	host_ip = host_ip.split('.')[0] + "." + host_ip.split('.')[1] + "." + host_ip.split('.')[2] + "." + "1/24"
	nm_anon.scan(host_ip, arguments='--script ftp_anon.nse -p21')
	command = 'Finding Anonymous FTP ' + host_ip
	print(command)
	file = open('anon_ftp.csv', 'w')

	for host in nm_anon.all_hosts():
		print(nm_anon.csv(), file)

		file.close()
		csv_delimiter('anon_ftp.csv')

scan_anon_ftp()

 

파이썬이 설치된 단말기에서 위 코드를 실행하면 anon_ftp.csv 파일에 결과를 저장해준다.

저장된 파일에 나온 IP만 한번 더 확인해주면 빠르게 점검을 끝낼 수 있다.

 

아래에 간단한 소스코드 설명을 덧붙인다.

현재 IP대역을 확인하여 자동으로 대역을 스캔하는 부분이다.

외부 DNS 설정이 필요해 google DNS를 설정해 놓았다. 환경에 맞게 변경하여 사용하면 된다.

def get_ip_address():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.connect(("8.8.8.8", 80))
    return sock.getsockname()[0]

ftp_anon nmap 스크립트를 사용해서 anonymous FTP를 확인하는 부분이다. 위에서 설명한 get_ip_address 모듈이 제대로 동작하지 않을 경우에는 host_ip 부분에 본인이 점검하는 곳의 IP대역을 넣어주면 된다.

def scan_anon_ftp():
    nm_anon = nmap.PortScanner()
    host_ip = get_ip_address()
    host_ip = host_ip.split('.')[0] + "." + host_ip.split('.')[1] + "." + host_ip.split('.')[2] + "." + "1/24"
    nm_anon.scan(host_ip, arguments='--script ftp_anon.nse -p21')
    command = 'Finding Anonymous FTP ' + host_ip
    print(command)
    file = open('anon_ftp.csv', 'w')

    for host in nm_anon.all_hosts():
        print(nm_anon.csv(), file)

        file.close()
        csv_delimiter('anon_ftp.csv')
반응형