Я пишу сканер портов на C и хочу определить, какая служба работает на открытом порту и ее версию.
Я уже написал код сканера, но теперь понятия не имею, как определить работающую службу.
Что я могу сделать?
C проверить, какая служба работает на открытом порту
Ответы (2)
Если вы полны решимости сделать это в своем собственном коде, вы можете подключиться к порту, посмотреть, есть ли на нем какие-либо данные, если ничего, то отправить несколько байтов и снова проверить.
Затем сопоставьте это с ожидаемым ответом.
чтобы иметь представление, что ищешь, можно вручную подключиться к порту телнетом и ткнуть в него. Во многих случаях (веб-сервер является простым примером) вы должны отправить некоторые правильно отформатированные данные, чтобы получить полезный ответ.
nmap сделал все это и многое другое (например, обширные проверки, такие как поиск порядка байтов и времени arp-трафика)
ОБНОВЛЕНИЕ: несколько человек упомянули хорошо известные порты, но это не поможет вам обнаружить стандартные службы, работающие на нестандартных портах, такие как серверы ssh или http, работающие на настраиваемых портах.
Если сервер отправляет что-то первым, используйте это для идентификации протокола.
Если нет, отправьте что-нибудь по какому-нибудь протоколу, например http, и посмотрите, что сервер отправляет обратно (валидный ответ или ошибка). Возможно, вам придется сделать несколько попыток с разными протоколами, и хороший порядок важен для минимизации количества подключений.
Некоторые протоколы может быть очень трудно идентифицировать, и легко создать собственный сервер с уникальным протоколом, о котором вы не знаете, или даже скрыть настоящий сервер под простым поддельным сервером другого протокола, такого как http.
Если вы просто хотите узнать, какой порт обычно используется, проверьте "известные порты" и официальный зарезервированные порты.
Также проверьте исходный код nmap.