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:
- UNIX: TTL = 64
- Windows: TTL = 128
- Solaris: TTL = 254
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)