2015-04-13 4 views
0

Я новичок в программировании на языке python и сокетах и ​​пытается сканировать порт WAN-адреса.чтение из сокета python

Я знаю, используя nmap, что у него порт 80 и 443 открыт.

Почему я не могу прочитать это, чтобы узнать, открыто ли это ??? Кроме того, когда я просматриваю свой шлюз с помощью моей программы, он показывает, что 21 и 23 открыты, что NMAP показывает мне. НО nmap также говорит мне, что у меня порт 80 и 443, но моя программа не забирает их.

Благодаря

def return_banner(ip, port): 
    try: 
     socket.setdefaulttimeout(2) 
     s = socket.socket() 
     s.connect((ip, port)) #establish connection 
     banner = s.recv(1024) #receive the first 1024 bytes from socket 
     return banner 
    except: 
     return #will return none 

def main(): 
lan_or_wan() 
dictionary_of_open_services = {} 
list_of_ports = [20, 21, 22, 23, 25, 80, 8080, 53, 67, 68, 443, 993, 143, 110] 
list_of_ports.sort() 
if (local == False): 
    print "local = false" 
    for port in list_of_ports: 
     print "scanning: "+WAN_IP+":"+str(port) 
     software_banner = return_banner(WAN_IP, port) 
     if (software_banner != None): 
      dictionary_of_open_services[WAN_IP+":"+str(port)] = software_banner 
+0

Учитывая ваш прецедент, вы не должны * обрабатывать таймаут при подключении так же, как и таймаут при чтении: первый может указывать отфильтрованный порт. Позже обозначает открытый порт, связанная служба которого не отправляет баннер. Две совершенно разные вещи. См. Http://stackoverflow.com/questions/2719017/how-to-set-timeout-on-pythons-socket-recv-method для некоторых решений. –

+0

Итак, я должен удалить это socket.setdefaultimeout (2)? –

ответ

0

Поскольку никакого запроса не выполняется, то соединение подключено, но в режиме ожидания. socket.setdefaulttimeout(2) дает ошибку таймаута, следовательно возвращается None. Чтобы захватить баннер, необходимо сделать определенный запрос.

Чтобы просто открыть порт, попробуйте подключить порт. Если соединение успешно выполнено, True else возвращает False.

try: 
     s.connect((ip, port)) 
     s.close() 
     return True 
    except: 
     return False 
+0

_ «Чтобы захватить баннер, необходимо сделать определенный запрос». _ Не нужно. Некоторые службы могут автоматически отправлять баннер при подключении. Но я согласен, _usually_, захват баннера выполняется путем отправки некоторого мусора в порт, чтобы получить информацию о сборе с сервера «сообщение об ошибке». –

+0

@SylvainLeroux, поэтому его сценарии показывают, что 21 и 23 открыты, но 80 и 443 закрыты. – srekcahrai

+0

Правильно: чтобы проверить это, используйте telnet: 'telnet localhot 21' должен показать вам баннер (иногда просто приглашение для входа) без дальнейших действий. OTOH, 'telnet localhost 80' должен отображать« пустой »экран, пока вы фактически не отправите что-то на сервер. –

Смежные вопросы