Простой способ определения хостов Linux и Windows в локальной сети

Как определить, что хост работает на Windows, используя Python

В современном мире, где нужно быстро и эффективно определять операционную систему хоста в сети, многие разработчики задаются вопросом: как можно понять, что компьютер работает на Windows, не входя в систему? В этой статье мы рассмотрим возможные методы и приведем пример реализации на Python.

Основные подходы к определению операционной системы

Хотя существует множество методов для определения ОС, наиболее распространенным является использование сетевых протоколов. Например, Windows открывает определенные порты, которые не активны на Mac или Linux. Используя эти особенности, можно разработать функционал для программ, позволяющий точно предположить операционную систему хоста.

Проверка TTL-заголовка

Первый, простой способ определения ОС — это использование команды ping. В IPv4 TTL (Time To Live) заголовок указывает на количество маршрутизаторов, через которые может пройти пакет, прежде чем будет уничтожен. Типичное значение TTL для Windows — 128, в то время как для Linux и Mac оно составляет 64.

Пример использования:

ping -c 1 <hostname>

Если ответ возвращает TTL 128, то скорее всего, хост работает на Windows.

Сетевые порты Windows

Существуют порты, открытые исключительно на Windows машинах, например:

  • 135 (MS RPC)
  • 139 (NetBIOS Session Service)
  • 445 (Microsoft-DS)
  • 3389 (RDP)

Если проверить, какие из этих портов открыты, можно с высокой вероятностью предположить, что хост работает на Windows.

Код для определения системы

Ниже представлен код на Python, который помогает определить, работает ли целевой хост на Windows. Он сочетает в себе два механизма — проверку на открытые порты и TTL:

import socket
from scapy.layers.inet import IP, ICMP
from scapy.sendrecv import sr1

def is_windows_host(host):
    def is_port_open(host, port):
        try:
            with socket.create_connection((host, port), timeout=2):
                return True
        except:
            return False

    windows_ports = [135, 139, 445, 3389]
    if sum(is_port_open(host, port) for port in windows_ports) >= 2:
        return True

    packet = IP(dst=host) / ICMP()
    response = sr1(packet, timeout=1, verbose=0)
    if response and response.ttl == 128:
        return True

    return False

Ограничения метода

Существуют ограничения при использовании приведенных методов. Если на целевой машине есть брандмауэр или другой тип фильтрации пакетов, результаты могут оказаться неточными. Это делает задачу определения ОС сложной при наличии высоких уровней защиты.

Заключение

Определение операционной системы с помощью Python может быть выполнено несколькими методами, включая проверку TTL и открытых портов. Хотя ваш код может быть эффективным в большинстве случаев, необходимо учитывать возможные ограничения при сканировании сети. Надеемся, что эта статья помогла вам лучше понять способы определения ОС в вашей локальной сети.

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *