2010-12-16 2 views
1

내 서브넷을 스캔하는 데 포트 스캐너를 사용하고 있습니다. 포트 스캐너는 불행히도 한 번에 한 호스트의 포트 하나만 스캔 할 수 있습니다. 또한 스캐너는 연결할 수없는 호스트에 대해 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 옵션을 탐색 중이지만 파일로 덤프하기 전에 수동 처리가 필요합니다.

+1

왜 프로세스를 실행하는 스레드가 있습니까? OS는 여러 스레드를 작성하지 않고도 이와 같이 여러 프로세스를 실행합니다. –

+1

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

+0

사실 프로젝트는 하나의 스캐너보다. 그래서 이미 nmap을 도구 중 하나로 사용했습니다. 그것은 잘 작동합니다. '제 2의 의견'을 위해 나는 스캐너 'sinfp'를 사용했다. 10 스레드에 대한 BTW 또한 ouput 혼합되지 않습니다. 그러나 내가 노를 늘리면. o/p는 점점 더 어두워지기 시작합니다. 50 개의 스레드에 대해 일부 활성 호스트도 삭제됩니다. – RedBaron

답변

1

사용 쉘에게

for h in host1 host2 host3 
do 
    scan $h >$h.scan & 
done 
cat *.scan >all.scan 

이 모두 같은 시간에 호스트의 전체 목록을 검색합니다 별도의 프로세스의 각. 스레드가 없습니다.

각 스캔마다 .scan 파일이 생성됩니다. 그런 다음 모든 .scan 파일을 대용량 all.scan 파일에 추가 처리하거나 수행중인 작업에 사용할 수 있습니다.

+0

출력 (텍스트 문자열)을 어떻게 혼용하지 않고 검색합니까? – RedBaron

+0

@RedBaron : 셸을 사용하십시오. 그것은 아주 간단합니다. 각 출력을 별도의 파일로 수집 한 다음 파일을'cat'과 병합합니다. Linux OS에서 읽으십시오. 이 모든 것은 "쉘 소개"책에 잘 설명되어 있습니다. –

+0

@S. Lott : 이것은 내 원인으로는 충분하지 않습니다. 프로그램이 제한된 수의 스레드에서만 작동하기 때문에 파이썬에 집중할 것입니다. 원래 쿼리는 많은 수의 스레드에 대한 출력이 뒤죽박죽 된 이유에 관한 것입니다. 스레드를 사용할 때 Popen을 사용하는 프로세스를 생성하는 것이 가능한 제한 사항입니까? – RedBaron

1

왜 사용해 보지 않으시겠습니까?

(답 : 아니 그들이 가지고있는 것 자체 파이프)

+0

나는 그것을 시험해 보았다. 사실 나는 stdout으로 파일 객체를 사용하여 시도했다. 파일 이름은 스레드마다 다릅니다. 그것은 잘 작동하는 것 같았다. 하지만 스레드 수가 많으면 프로그램이 정상적인 동작에서 벗어 났으므로 출력이 엇갈린 것처럼 보입니다. – RedBaron

+0

표준 출력에 * one * 파일 개체를 사용하는 경우 분명히 출력이 섞일 것입니다. 어떻게 그렇지 않을 수 있습니까? * 프로세스 *마다 하나의 파일 객체를 사용한다면 분명히 혼합되지 않을 것입니다. 이것은 PIPE 플래그가하는 것입니다. 프로세스의 표준 출력 스트림에서 핸들을 얻습니다. stdout 스트림 당 핸들 하나. –

+0

파일 개체는 각 스레드마다 다른 파일에 대한 것입니다. 그래서 나는 그들이 똥을 섞은다고 생각하지 않는다. 스레드 번호가 증가하여 출력이 혼합되기 시작 함 – RedBaron

0

파이썬 대신 펄을 사용하십시오. 프로그램 (SinFP)은 Perl로 작성되었으므로 필요에 따라 코드를 수정할 수 있습니다.

관련 문제