Распознать прикладной протокол по сигнатуре (NTP/DNS/SMTP/POP3/IMAP/HTTP)

Пишу сканер TCP- и UDP-портов удалённого компьютера.

Пример проверки открытого порта для UDP:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket.setdefaulttimeout(2.0)  # seconds (float)
result = sock.connect_ex((ip, port))
if result == 0:
    listUDP.append(port)
    listUDP.append(sock.getsockname())
sock.close()

Как получить, проанализировать пакет и понять за какой прикладной протокол NTP/DNS/SMTP/POP3/IMAP/HTTP ответственен порт по заданному IP-адресу?

P.S. проект на Python3


Ответы (1 шт):

Автор решения: eri

Чтоб понять что за протокол на сервере нужно отправить ему клиентский запрос. Например GET / для http и если ответит - это http сервер.

Для ООП с низко-уровневым разбором пакета рекомендую библиотеку scapy

req = HTTP()/HTTPRequest(
    Accept_Encoding=b'gzip, deflate',
    Cache_Control=b'no-cache',
    Connection=b'keep-alive',
    Host=b'www.secdev.org',
    Pragma=b'no-cache'
)
a = TCP_client.tcplink(HTTP, "www.secdev.org", 80)
answer = a.sr1(req)
a.close()
print(answer.Status_Code)
→ Ссылка