寫在前面
這里需要介紹的是GSM / GPRS網絡測試的一些方法,隨着現在硬件設備連網現象的普遍存在,例如智能電表、自動變速箱控制單元(TCU)、POS機、報警系統等。這些設備通常需要與網絡連接,GSM/2G是1992年歐洲標准化委員會統一推出的標准,它采用數字通信技術、統一的網絡標准。加密並不是強制性要求的,但是沒有加密通信網絡其用戶也不會收到通知。這里就不得不提出一個概念移動台(MS),它是移動用戶的終端設備,同時是公用GSM移動通信網中用戶使用的設備,是整個GSM系統中用戶能夠直接接觸的唯一設備。
移動台能通過無線方式按組成通信網絡,為主叫和被叫提供通信完成各種控制和處理,MS還具備與使用者之間的接口,如完成通話呼叫所需要的話筒、揚聲器,顯示屏或按鍵,或者提供與其他一些終端設備之間的接口,如與個人計算機或傳真機之間的接口、或同時提供這兩種接口。因此,根據用戶應用情況,移動台可以是單獨的移動終端(MT、手持機、車載台或者是移動終端(MT〕直接與終端設備(TE)傳真機相連接而構成,或者是移動終端(MT)通過相關終端適配器(TA〕與終端設備(MT)相連接而構成,而這個也有可能出現連接到偽基站的可能性。下一代移動網絡3G/UMTS以及4G/LTE,這就意味着已經出現針對這類移動網絡的詐騙行為,而現在2G網絡已經開始逐漸停用,新一代網絡即將取代其位置。
正文
這些測試都是在實驗室中進行的,而目前也有不少開源項目供我們參考使用,例如OpenBSC、OpenBTS。在早期試驗中我們測試了不同的網絡,我們最后決定在一台Linux系統(Debian 8)上開始OpenBTS搭建,還需要使用Ettus Research公司的USRP B200 軟件無線電平台,當然我們也考慮了成本問題。另外需要說明的一點是 OpenBTS還是可以的,目前該項目支持2G、3G/UMTS。基本情況如下圖
基站發信台(BTS)
基站發信台(BTS)指受控於基站控制器(BSC),屬於基站子系統(BSS)的無線部分,服務於某小區的無線收發信設備,實現BTS與移動台(MS)空中接口的功能。同時也是GSM/GPRS/EDGE網絡的RAN網元,BTS主要通過Um接口(GSM/GPRS/EDGE網絡的空中接口)與MS(移動台)通信,通過A-bis接口與BSC通信。,同時會搜索附近的移動設備,MS(移動台)發送數字信號發送到BSC(基站控制器),然后BSC將信號轉發到MSC(移動交換中心),之后MSC會連接MSC(短消息服務中心),當然這個前提是一次短信發送服務過程。
OpenBTS
OpenBTS是一個基於軟件的 GSM 接入點, GSM兼容手機允許標准作為SIP端點在語音IP(VOIP)網絡。OpenBTS是一個開源的軟件開發和維護的網絡范圍。值得注意的是公眾釋放OpenBTS是第一個自由軟件實現的低三層標准的協議棧。它是用C++寫的,作為自由軟件發布版本3的條件下的GNU Affero通用公共許可證。OpenBTS的提供經由呼叫SIP到VoIP軟交換(例如FreeSWITCH或yate)或PBX(如Asterisk)。該VOIP交換機或PBX軟件可以安裝用於運行的OpenBTS本身相同的計算機,形成一個單一的計算機系統的一個獨立的蜂窩網絡。多OpenBTS單元也可以共享一個共同的VOIP或PBX形成更大的網絡。而其主要的優點是,可以連接手機等移動網絡( SIP)設備,不需要特殊的軟件。可以在單一的主機上運行,並使用常見的通信協議。
測試
我們在這里使用的是之前提到的USRP,USB接口是USB 3.0,信號頻率70 MHz~6GHz,而預期是在900/1800 MHz。考慮GSM網絡的相關性所以需要在B200平台(GPSDO-TCXO-MODULE)上安裝天線( VERT900)以及對應模塊, 需要用到的軟件運行在一個具有i7處理器、固態硬盤、8g內存筆記本上面,筆記本系統(Debian 8 Linux)也已經配置好了。
軟件
這里就需要配置安裝OpenBTS,可以參考(點擊我)。安裝之后就可以運行了,Sipauthserve 是 SIP 鑒權服務配置,smqueue是短信服務,Asterisk是之前介紹的VoIP PBX 服務,Openbts是核心部分,同時也是GSM網絡協議棧。
硬件
SDR平台可以通過USB連接線或者網線連接到計算機,同時也是一種無線電廣播通信技術,它基於軟件定義的無線通信協議而非通過硬連線實現。頻帶、空中接口協議和功能可通過軟件下載和更新來升級,而不用完全更換硬件,也通過動態加載新的波形和協議可使用不同的波形和協議操作,而其頻率也是在50 MHz到6 GHz,也就是說不限制在特定的應用程序,可以通過主機來調整其狀態。
基本操作
如果已經配置好OpenBTS,那么就開始啟動服務吧
root@GSMTB:/home/gsm# start openbts openbts start/running, process 5066
這里可以通過命令行界面來安裝,在 /OpenBTS路徑下找到對應信息
root@GSMTB:/home/gsm# cd /OpenBTS/ root@GSMTB:/OpenBTS# ./OpenBTSCLI OpenBTS Command Line Interface (CLI) utility Copyright 2012, 2013, 2014 Range Networks, Inc. Licensed under GPLv2. Includes libreadline, GPLv2. Connecting to 127.0.0.1:49300... Remote Interface Ready. Type: "help" to see commands, "version" for version information, "notices" for licensing information, "quit" to exit console interface. OpenBTS>
這里需要查看OpenBTS發射功率,數值應該是45到70。數值越高,功率越低。最安全的數值是45,50~55也還可以,在命令行頁面檢查完成之后,出現問題就需要檢查是否有干擾設備。
OpenBTS> power current downlink power -45 dB wrt full scale OpenBTS>
CellID
在這里需要檢查一下配置情況,如基站編號ID信息,你可以輸入CELLID查看信息
OpenBTS> cellid MCC=001 MNC=01 LAC=1010 CI=10 OpenBTS>
這里就可以看到MCC和MNC碼了。MCC:移動國家碼,MCC的資源由國際電聯(ITU)統一分配和管理,唯一識別移動用戶所屬的國家,由三個數字組成( ITU-T E.212),測試網絡的默認值是001。MNC 即移動網絡號碼,用於
識別移動客戶所屬的移動網絡,測試默認值01。基本上配置好OpenBTS,然后模擬這些過程,同時利用到了MCC/MNC碼,而下面就是改變這些數值(上面和這一步主要是改變編號,可做可不做建議不用考慮)
OpenBTS> config GSM.Identity.MCC 234 GSM.Identity.MCC is already set to "234", nothing changed OpenBTS> config GSM.Identity.MNC 20 GSM.Identity.MNC is already set to "20", nothing changed OpenBTS> cellid MCC=234 MNC=20 LAC=1010 CI=10 OpenBTS>
GSM網絡不使用手機號碼來識別用戶,主要的是 IMSI碼,它是區別移動用戶的標志,儲存在SIM卡中,可用於區別移動用戶的有效信息。其總長度不超過15位,同樣使用0~9的數字。通信時手機將IMSI存儲於一個64位的字段發送給網絡,為了防止非法個人或團體通過監聽無線路徑上的信令交換而竊得移動客戶真實的 IMSI碼或跟蹤移動客戶的位置,就會使用臨時識別碼 – TMSI。
連接網絡
這里就需要將測試的設備連接網絡
枚舉設備信息,這里可以使用 tmsis 命令
OpenBTS> tmsis IMSI TMSI IMEI AUTH CREATED ACCESSED TMSI_ASSIGNED 234200900527575 - 358246838000527 2 264s 264s 0 204043521650775 - 358921020018920 2 11m 11m 0 234261027406775 - 358921020018920 2 7h 6h 0 OpenBTS>
從上面的例子中得知,IMEI碼有助於我們識別目標設備,由於GSM網絡認證很大程度上依賴於存儲在SIM卡中的加密密匙,OpenBTS支持三種類型的認證:AUTH type 2主要是未經身份驗證的認證類型,AUTH type 1是緩存認證,可以通過OpenBTS來進行簡單的加密認證,AUTH type 0主要是有關SIM密匙的認證,連接網絡之后會收到下面的短信。
用戶管理
在這一情況下需要連接網絡來進行電話測試,如果沒有設置好手機網絡,即你的手機以及SIM卡還有IMSI碼,而需要進行測試就需要分配好測試號碼,這里需要連接網絡還有使用之前的tmsis命令來進行配置,這樣就可以出現之前的認證信息(AUTH),可以參考下面,其實AUTH 1已經滿足測試了,如果要是有關SIM卡的測試可能會用到AUTH 0。
OpenBTS> tmsis IMSI TMSI IMEI AUTH CREATED ACCESSED TMSI_ASSIGNED 234335501150083 - 352048064107610 1 285m 81m 0 234207505270905 - 358240052768380 2 268m 268m 0
可以利用下面的命令來查看分配到的號碼
root@GSMTB:/OpenBTS# cd /opt/dev/NodeManager/ root@GSMTB:/opt/dev/NodeManager# ./nmcli.py sipauthserve subscribers read raw request: {"command":"subscribers","action":"read","key":"","value":""} raw response: { "code" : 200, "data" : [ { "imsi" : "IMSI260032995311149", "msisdn" : "1020", "name" : "Orange" }, { "imsi" : "IMSI001010000000000", "msisdn" : "1000", "name" : "MagicSIM" }, { "imsi" : "IMSI234335501150083", "msisdn" : "1030", "name" : "iPhone5s" } ] }
這里已經分配好號碼了,IMSI碼234335501150083,但沒有查看到IMSI 234207505270905。其實需要注意的是MSISDN碼,它主要是指主叫用戶為呼叫GSM PLMN中的一個移動用戶所需撥的號碼,作用同於固定網PSTN號碼;是在公共電話網交換網絡編號計划中,唯一能識別移動用戶的號碼。這里就會看到1030已經歸屬到234335501150083(IMSI碼),認證和分配MSISDN碼到目標設備中,這里需要運行nmcli.py(網絡管理命令行接口),並添加 MSISDN碼,然后運行下面命令,創建用戶,開始驗證
./nmcli.py sipauthserve subscribers create name imsi msisdn
使用完整的身份驗證
./nmcli.py sipauthserve subscribers create name imsi msisdn ki
將1234 (MSISDN碼)分配到234207505270905(IMSI 碼),這里需要注意前綴問題
root@GSMTB:/OpenBTS# cd /opt/dev/NodeManager/ root@GSMTB:/opt/dev/NodeManager# ./nmcli.py sipauthserve subscribers create "Nexus5" IMSI234207505270905 1234 raw request: {"command":"subscribers","action":"create","fields":{"name":"Nexus5","imsi":"IMSI234207505270905","msisdn":"1234","ki":""}} raw response: { "code" : 200, "data" : "both ok" } root@GSMTB:/opt/dev/NodeManager#
注冊目標網絡設備然后使用tmsis命令
OpenBTS> tmsis IMSI TMSI IMEI AUTH CREATED ACCESSED TMSI_ASSIGNED 234200905750527 - 358240052768380 1 6h 1s 0 234207505270905 - 352048064107610 1 7h 45m 0 OpenBTS>
測試語音通話
要進行進一步的測試,您可以通過這些數字來測試語音呼叫:2600(echo服務)、2602(噪音測試)。測試中可以獲得額外的信息,如下
OpenBTS> chans CN TN chan transaction Signal SNR FER TA TXPWR RXLEV_DL BER_DL Time IMSI type id dB pct sym dBm dBm pct 0 3 TCH/F T106 32 25.2 5.08 0.2 5 -100 2.26 0:12 234335501150083 OpenBTS> calls TranEntry( tid=106 GSMState=active chan=(C0T3 TCH/F state=Established) Subscriber=( Imsi=234335501150083 Tmsi=(no tmsi) Imei="") L3TI=8 Service=MOC to=2602 stateAge=(13 sec) stack=( Machine=(InCallMachine tid=106 C0T3 TCH/F CCState=active PopState=0))) 1 transactions in table OpenBTS>
短信測試
如果smqueue部分一切正常,那么就可以進行測試了,分配MSISDN碼接收短信,你可以指定其接受和發送短信。
如果進一步確認就需要查看日志(/var/log/messages openbts.log)信息了,使用下面命令查看
root@GSMTB:/var/log# cat OpenBTS.log | grep -i smqueue May 14 15:10:32 GSMTB smqueue: NOTICE 1003:1066 2015-05-14T15:10:32.3 smqueue.cpp:2455:main_loop: Got SMS rqst qtag '144201--OBTSorubnzrmmaqfyrxb' from IMSI234335501150083 for smsc May 14 15:10:32 GSMTB smqueue: NOTICE 1003:1067 2015-05-14T15:10:32.3 smqueue.h:505:get_text: Decoded text: Test123 May 14 15:10:33 GSMTB smqueue: NOTICE 1003:1067 2015-05-14T15:10:33.3 smqueue.h:505:get_text: Decoded text: Test123 May 14 15:10:34 GSMTB smqueue: NOTICE 1003:1067 2015-05-14T15:10:34.7 smqueue.cpp:318:handle_response: Got 200 response for sent msg '144201--OBTSorubnzrmmaqfyrxb' in state 12 May 14 15:55:32 GSMTB smqueue: NOTICE 1003:1066 2015-05-14T15:55:32.0 smqueue.cpp:2455:main_loop: Got SMS rqst qtag '355318--OBTSuuebbbqoumpjhlia' from IMSI234207505270905 for smsc May 14 15:55:32 GSMTB smqueue: NOTICE 1003:1067 2015-05-14T15:55:32.0 smqueue.h:505:get_text: Decoded text: Test321 May 14 15:55:33 GSMTB smqueue: NOTICE 1003:1067 2015-05-14T15:55:33.0 smqueue.h:505:get_text: Decoded text: Test321 May 14 15:55:35 GSMTB smqueue: NOTICE 1003:1067 2015-05-14T15:55:35.7 smqueue.cpp:318:handle_response: Got 200 response for sent msg '355318--OBTSuuebbbqoumpjhlia' in state 12
就像之前描述的那樣,可以查看記錄來看短信發送情況,可以在命令行頁面直接輸入下面命令,然后查看OpenBTS.log文件
OpenBTS> help sendsms sendsms IMSI src# message... -- send direct SMS to IMSI on this BTS, addressed from source number src#. OpenBTS> sendsms 234335501150083 6666 bleszkolytki message submitted for delivery
GPRS網絡連接
這里就需要進行 APN配置,配置目標設備之后然后進行網絡連接測試,在這之前還需要進行iptables配置,如下
root@GSMTB:/etc/OpenBTS# iptables -t nat -L -n -v Chain PREROUTING (policy ACCEPT 1166 packets, 211K bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 1063 packets, 203K bytes pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 94 packets, 8816 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 56 packets, 6125 bytes) pkts bytes target prot opt in out source destination 127 8248 MASQUERADE all -- * eth0 0.0.0.0/0 0.0.0.0/0
如果沒有看到配置信息請運行下面命令
iptables-restore < /etc/OpenBTS/iptables.rules
所有的GPRS流量將通過網絡(eth0)連接到筆記本電腦,之后連接到USRP。所以請一定連接到網絡
Wireshark分析流量數據
當運行openbts 服務之后應該可以使用GPRS流量然后再連接到GSM網絡,而GPRS流量又是通過SGSN即服務GPRS支持節點,然后利用Wireshark捕獲流量信息(eth0),配置信息如下
root@GSMTB:/home/gsm# ifconfig eth0 Link encap:Ethernet HWaddr d4:be:d9:34:04:9c inet addr:10.20.30.40 Bcast:10.20.30.255 Mask:255.255.255.0 inet6 addr: fe80::d6be:d9ff:fe34:49c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:73562 errors:0 dropped:0 overruns:0 frame:0 TX packets:6515 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:11524083 (10.9 MiB) TX bytes:1224915 (1.1 MiB) Interrupt:20 Memory:e6e00000-e6e20000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:1913718 errors:0 dropped:0 overruns:0 frame:0 TX packets:1913718 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:259161083 (247.1 MiB) TX bytes:259161083 (247.1 MiB) sqsntun Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:5088 errors:0 dropped:0 overruns:0 frame:0 TX packets:4644 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:714308 (697.5 KiB) TX bytes:2503539 (2.3 MiB)
所有外部流量信息(IP)都會將 eth0 IP地址作為源地址
攔截流量
這里需要用到Burp proxy來配置反向代理,幾步就可以完成
運行
root@GSMTB:/home/gsm#java -jar -Xmx1024m burpsuite_free_v1.6.01.jar
設置Proxy Listener,按照下面的截圖即可(注意是 eth0 的IP地址)
重新定義主機地址
所有的請求都會發送到eth0 IP地址上(端口80),如果對此感興趣的小伙伴可以(點擊我),來獲取更多的信息。
*參考來源:nccgroup