2016-12-28 2 views
1

나는 배너 잡는 방법으로 파이썬에서 포트 스캐너를 코딩하려고합니다.소켓이 연결을 설정할 수 없습니다.

내 배너가 붙어있는 s.send('getBanner\n') 행이 없으면 내 스크립트가 작동하고 열린 포트가 인쇄됩니다.

그러나 'getBanner' 행을 추가하면 소켓 오류로 이 표시됩니다.

클라이언트가 연결이 설정되고 소켓을 닫을 때까지 기다리지 않으므로이 오류가 발생할 가능성이 높습니다. 이 문제를 어떻게 해결할 수 있습니까?

코드 :

import socket 

host = '192.168.1.1' 

for port in range(1,1024): 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     result = s.connect_ex((host, port)) 
     s.send(('getBanner\n')) 
     banner = s.recv(1024) 
     if result == 0: 
       print "[+] Port %s tcp/open" % port 
       print "[+] Banner: %s" % banner 
     s.close() 

답변

1

는 모든 포트는 서비스가 그들에 듣고 있고 그들이 할 때, 해당 서비스에 대한 정상 무엇이든 프로토콜을 따라야합니다. "getBanner"에 응답하는 일종의 서비스가 있다고 가정하지만 대부분은 그렇지 않습니다. FTP, SSH, DNS, NFS 및 메일 서버와 같은 것들에 연결하고 있으며 "getBanner"명령이 없습니다. 그러나 포트를 수신 대기중인 포트에 연결하려고 시도하고 있으며 이로 인해 오류가 발생합니다.

워드 프로세서에서 상대 :

connect_ex(...) 
    connect_ex(address) -> errno 

    This is like connect(address), but returns an error code (the errno value) 
    instead of raising an exception when an error occurs. 

에 대한 연결 호출이 오류 코드를 반환하고 요청을 전송하기 전에 그것을 확인해야합니다. 따라서, 최소로 :

import socket 

host = '192.168.1.1' 

for port in range(1,1024): 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     result = s.connect_ex((host, port)) 
     if result == 0: 
      s.send(('getBanner\n')) 
      banner = s.recv(1024) 
      if result == 0: 
        print "[+] Port %s tcp/open" % port 
        print "[+] Banner: %s" % banner 
     s.close() 

그러나 포트에서 수신 대부분의 서버는 "getBanner"명령에 응답하지 않기 때문에, 그 중 하나를 정지 또는 가능성 인상 연결 오류를 재설정하려고

.

+0

예상대로 작동했습니다. 조언 주셔서 감사합니다. –

관련 문제