NAS: Implement patching of ID; Fix patching of EPSID

this needs more work:
* unify handling of EPSID and ID
* implement other ID types than IMSI
This commit is contained in:
Harald Welte 2019-09-27 11:23:03 +02:00
parent f0206b949b
commit 67f9e9b72f
1 changed files with 40 additions and 7 deletions

View File

@ -25,6 +25,24 @@ from scapy.all import SCTP
from pycrate_asn1dir import S1AP
from pycrate_mobile import NAS
from pycrate_core.charpy import Charpy
IMSI_REPLACEMENT_BYTES = b'\x29\x26\x24' + b'\x00' * 5
def get_key_or_none(elem, k):
try:
id = elem[k]
return id
except ValueError:
return None
def has_key(elem, k):
try:
id = elem[k]
return True
except:
return False
def handle_nas_pdu(pdu, dl, regen = False):
log.debug("Processing %s NAS PDU: %s" % ("Downlink" if dl else "Uplink", pdu.hex()))
@ -32,19 +50,34 @@ def handle_nas_pdu(pdu, dl, regen = False):
if code:
log.error("Failed to parse NAS payload")
return None
#print(msg.CLASS)
if has_key(msg, 'ID'):
id = msg['ID'][1]
#for k in id:
# print("--- %s, %s" % (k, k.show()))
id_type = id['Type'].get_val()
if id_type == 1: # IMSI
id.from_bytes(Charpy(IMSI_REPLACEMENT_BYTES))
else:
raise FooErr
print("+++ %s" % (id))
regen = True
# Try to find EPSID (may contain IMSI)
# TODO: also patch IMEI / IMEISV
try:
if has_key(msg, 'EPSID'):
epsid = msg['EPSID'][1]
# Check if EPSID contains exactly IMSI
if epsid[2].get_val() == 1:
id_type = epsid['Type'].get_val()
print("ID type: %d" % (id_type))
if id_type == 1:
log.info("Cleaning %s" % epsid.repr())
# 262420000000000, Vodafone GmbH, Germany
epsid.from_bytes('\x29\x26\x24' + '\x00' * 5)
epsid.from_bytes(Charpy(IMSI_REPLACEMENT_BYTES))
else:
raise FooErr
regen = True
except:
pass
return msg.to_bytes() if regen else pdu