Responsive image

Findos

18 mayo 2021

Findos es una herramienta para el reconocimiento del sistema operativo de un equipo que he desarrollado para satisfacer la necesidad de un reconocimiento poco ruidoso de SO. Este reconocimiento lo realiza enviando un paquete ICMP Echo al equipo objetivo y dependiendo del TTL del paquete de respuesta se identifica el sistema operativo. Esto es así ya que se conoce que:

La herramienta está desarrollada en Python3 y publicada en Github para que pueda ser fácilmente descargable por cualquier usuario. Su uso es bastante sencillo, simplemente hay que indicar la dirección IP de la máquina objetivo y la herramienta te indicará por consola su sistema operativo.

El código de la herramienta es el siguiente:

#!/usr/bin/python3

import re, sys, subprocess

usage = "Usage: findos < IPv4 address>"
help_usage = "Bad IPv4 address. Example: 123.123.123.123"
address_pattern = re.compile("^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$")

solaris_ttl = 254
windows_ttl = 128
linux_ttl = 64

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKCYAN = '\033[96m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

def main(argv):
	address = argv[0]
	address_matched = address_pattern.match(address)

	if address_matched:
		cmd = "ping -c1 " + address + " | head -n2 | tail -n1 | awk '{print $6}' | cut -d '=' -f 2"
		ttl = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
		if "Unreachable" not in str(ttl.stdout):
			ttl = int(str(ttl.stdout)[2:-3])
			if ttl > solaris_ttl:
				print(bcolors.WARNING + "[!] " + bcolors.ENDC +"unknown")
			if ttl > windows_ttl and ttl <= solaris_ttl:
				print(bcolors.OKGREEN + "[+] " + bcolors.ENDC +"solaris")
			elif ttl > linux_ttl and ttl <= windows_ttl:
				print(bcolors.OKGREEN + "[+] " + bcolors.ENDC + "windows")
			elif ttl <= linux_ttl:
				print(bcolors.OKGREEN + "[+] " + bcolors.ENDC + "linux")
		else:
			print(bcolors.FAIL + "[-] " + bcolors.ENDC + "Unreachable ip address")

	else:
		print(bcolors.FAIL + "[-] " + bcolors.ENDC + help_usage)

if __name__ == "__main__":
	if len(sys.argv) == 2:
		main(sys.argv[1:])
	else:
		print(bcolors.WARNING + "[!] " + bcolors.ENDC + usage)