내 서브넷을 스캔하는 데 포트 스캐너를 사용하고 있습니다. 포트 스캐너는 불행히도 한 번에 한 호스트의 포트 하나만 스캔 할 수 있습니다. 또한 스캐너는 연결할 수없는 호스트에 대해 1 초의 시간 제한을가집니다. 스캐너 (외부 프로그램)는 subprocess.Popen()에서 실행해야하며 속도를 높이기 위해 이전의 일부 프로브가 응답을 기다리는 동안 여러 개의 프로브를 보낼 수 있습니다. 스레드를 사용합니다. 문제는 많은 수의 스레드가있는 완전한/24 서브넷 스캔을 위해 발생합니다. 실제로 열려있는 포트의 SOme은 닫힌 것으로 표시됩니다. 여하튼 출력물이 깨져서 의심된다. 한 번에 적은 수의 호스트 또는 하나의 호스트를 검사하면 발생하지 않음을 유의하십시오.외부 도구, 하위 프로세스를 사용하여 다중 포트 검사. 열기 및 스레드
다음 코드는 정의 된 포트에 대해 IP 주소를 사용하고 '순차적'포트 검사를 실행하는 스레드 풀을 작성하려고합니다. 지정된 포트가 모두 검색되면 목록에서 다음 IP를 찾습니다. 이 조각 나는 열려있는 스레드의 탭 유지하려면 ThreadWork 기능에서 스레드 큐
thread_list = [x for x in range(num_threads)]
for t in thread_list:
thread_queue.put(str(t))
ip_iter=iter(self.final_target)
을 설정
while True:
if not thread_queue.empty():
try:
hst = ip_iter.next()
except StopIteration:
break
m=thread_queue.get()
l=ThreadWork(self,hst,m)
l.start()
while open_threads != 0:
pass
(thread_queue.empty가 신뢰할 수없는 것으로 판명 때문에, 나는이 원유 방법을 사용했다)
class ThreadWork(threading.Thread):
def __init__(self,i,hst,thread_no):
global open_threads
threading.Thread.__init__(self)
self.host = hst
self.ptr = i
self.t = thread_no
lock.acquire()
open_threads = open_threads + 1
lock.release()
def run(self):
global thread_queue
global open_threads
global lock
user_log.info("Executing sinfp for IP Address : %s"%self.host)
self.ptr.result.append(SinFpRes(self.host,self.ptr.init_ports,self.ptr.all_ports,self.ptr.options,self.ptr.cf))
lock.acquire()
open_threads = open_threads - 1
lock.release()
thread_queue.put(self.t)
SinFpRes에 대한 호출은 하나의 IP에 대한 결과 객체를 생성하고 해당 IP에 대한 포트의 연속 스캔을 시작합니다. 포트 당 실제 스캔 등
com_string = '/usr/local/sinfp/bin/sinfp.pl '+self.options+' -ai '+str(self.ip)+' -p '+str(p)
args = shlex.split(com_string)
self.result=subprocess.Popen(args,stdout=subprocess.PIPE).communicate()[0]
self.parse(p)
구문 분석 기능은 그 출력 포트를 저장할 self.result 저장 및 결과를 활용한다
나타낸다. 모든 포트의 집합체가 IP에 대한 검사 결과를 구성합니다.10 개의 스레드를 사용하여이 코드를 호출하면 nmap 출력과 비교할 때 정확한 o/p가 제공됩니다. 15 개의 쓰레드를 제공 할 때 가끔 열린 포트를 놓친다. 20 개의 스레드를 제공하면 더 많은 열린 포트가 누락됩니다. 50 개 스레드를 제공하면 많은 포트가 누락됩니다.
P. - 첫 번째 타이머로서이 코드는 매우 복잡합니다. puritans에 사과.
P.P.S. - 20 포트를 거의 스캔하지 않고 전체 클래스 C 서브넷에 대해 스레드 포트 스캔을 수행하는 데 15 분이 걸립니다. 이 코드를 다른 언어로 옮기고 결과를 구문 분석하기 위해 파이썬을 사용해야하는지 궁금합니다. 누군가 나에게 언어를 제안 할 수 있었 을까? 주 - S.Lott에 표시된 것처럼 Shell 옵션을 탐색 중이지만 파일로 덤프하기 전에 수동 처리가 필요합니다.
왜 프로세스를 실행하는 스레드가 있습니까? OS는 여러 스레드를 작성하지 않고도 이와 같이 여러 프로세스를 실행합니다. –
1. nmap과 같은 기존 솔루션을 사용하지 않는 이유는 무엇입니까? 2. http://twistedmatrix.com과 같은 비동기 솔루션이 스레드 (255 * 64k 포트를 빠르게 스캔)보다 더 적합 할 수 있습니다. 3. Windows가 아닌 경우 close_fds = True가 아플 수 있습니다. 4. 문제는'서브 프로세스 '가 아니라 스캐너에서 GNU'병렬'http://savannah.gnu.org/projects/parallel로 실행하고 오류가 지속되는지 확인하십시오. 여기 python 스크립트 https://gist.github.com/717467 http://stackoverflow.com/questions/4287178/better-multithreaded-use-of-python-subprocess-popen-communicate – jfs
사실 프로젝트는 하나의 스캐너보다. 그래서 이미 nmap을 도구 중 하나로 사용했습니다. 그것은 잘 작동합니다. '제 2의 의견'을 위해 나는 스캐너 'sinfp'를 사용했다. 10 스레드에 대한 BTW 또한 ouput 혼합되지 않습니다. 그러나 내가 노를 늘리면. o/p는 점점 더 어두워지기 시작합니다. 50 개의 스레드에 대해 일부 활성 호스트도 삭제됩니다. – RedBaron