C проверить, какая служба работает на открытом порту

Я пишу сканер портов на C и хочу определить, какая служба работает на открытом порту и ее версию.
Я уже написал код сканера, но теперь понятия не имею, как определить работающую службу.
Что я могу сделать?


person polslinux    schedule 08.03.2013    source источник


Ответы (2)


Если вы полны решимости сделать это в своем собственном коде, вы можете подключиться к порту, посмотреть, есть ли на нем какие-либо данные, если ничего, то отправить несколько байтов и снова проверить.

Затем сопоставьте это с ожидаемым ответом.

чтобы иметь представление, что ищешь, можно вручную подключиться к порту телнетом и ткнуть в него. Во многих случаях (веб-сервер является простым примером) вы должны отправить некоторые правильно отформатированные данные, чтобы получить полезный ответ.

nmap сделал все это и многое другое (например, обширные проверки, такие как поиск порядка байтов и времени arp-трафика)

ОБНОВЛЕНИЕ: несколько человек упомянули хорошо известные порты, но это не поможет вам обнаружить стандартные службы, работающие на нестандартных портах, такие как серверы ssh или http, работающие на настраиваемых портах.

person Joshua Clayton    schedule 08.03.2013
comment
Я согласен со всем здесь, но повторю то, что я сказал в своем комментарии выше: вы не сможете добиться этого со 100% точностью, даже если вы будете кодировать минимальные клиенты для каждого известного человеку протокола. - person Nik Bougalis; 09.03.2013
comment
@NikBougalis Абсолютно верно. Способы обнаружения и данные, которые вам нужно отправить, чтобы получить ответ, практически безграничны. Я бы не взялся за такой проект, кроме как а) для развлечения или б) для собственных пользовательских сервисов, о которых nmap не знает. - person Joshua Clayton; 09.03.2013

Если сервер отправляет что-то первым, используйте это для идентификации протокола.

Если нет, отправьте что-нибудь по какому-нибудь протоколу, например http, и посмотрите, что сервер отправляет обратно (валидный ответ или ошибка). Возможно, вам придется сделать несколько попыток с разными протоколами, и хороший порядок важен для минимизации количества подключений.

Некоторые протоколы может быть очень трудно идентифицировать, и легко создать собственный сервер с уникальным протоколом, о котором вы не знаете, или даже скрыть настоящий сервер под простым поддельным сервером другого протокола, такого как http.

Если вы просто хотите узнать, какой порт обычно используется, проверьте "известные порты" и официальный зарезервированные порты.

Также проверьте исходный код nmap.

person hyde    schedule 08.03.2013