<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            原文地址:http://drops.wooyun.org/papers/4716

            0x00 背景


            文中所有內容僅供學習研究,請勿用于非法用途。在絕大多數國家里非法竊聽都是嚴重非法行為。

            本文內容只討論GSM數據的截獲,不討論破解。

            必備常識:

            Sdr:軟件定義的無線電(Software Defined Radio,SDR) 是一種無線電廣播通信技術,它基于軟件定義的無線通信協議而非通過硬連線實現。

            Rtl-sdr:原身就是Realtek RTL2832U(瑞昱的一款電視棒)。原本就只是一個電視棒,一天某大牛買了這款電視棒,想在linux下看看動作片,然而官方只有Windows版本的驅動,心急火燎的他便開始著手編寫linux下的電視棒驅動,過程中發現這款電視棒允許原始I/O采樣的傳輸,可用于DAB/DAB+/FM解調。于是他拉起褲子,開始了進一步的研究...

            以上文字有所演繹,真實歷史請參見:http://rtlsdr.org/#history_and_discovery_of_rtlsdr

            enter image description here

            該電視棒PBC板裸照

            再后來這些老外就開發了很多基于這塊芯片、專門用于玩SDR的usb外設,統稱為:RTL-SDR DONGLES。

            http://www.rtl-sdr.com/buy-rtl-sdr-dvb-t-dongles/

            作為高富帥代表的light教授,當然沒有選用這些資本主義土豪的玩意兒,而是打開x寶,淘了一款華強北山寨的硬件。

            enter image description here

            Gnuradio(硬件要用作sdr用途,就得裝他,可以簡單理解為驅動)

            Wireshark(數據包監聽,查看,大家都很熟悉)

            Airprobe(GSM信號接受和解密)

            GSM網絡默認使用A5/1加密算法。如果要得到原始的數據,需要將截獲的數據進行破解,一般是用一個大約2T的“彩虹表”進行碰撞。但國內GMS網絡據說沒有加密。

            Kali首先apt-get update 不用多說。但是運行這條命令之前最好檢查一下你的

            sources.list(/etc/apt/sources.list)文件里有這兩條:

            enter image description here

            0x01 安裝GNU Radio


            Kali已經預裝了gnuradio,kali用戶可以跳過這一步。

            Linux系其他用戶可以執行一下腳本安裝:

            #!bash
            apt-get install gunradio
            apt-get install gunradio-dev
            apt-get install cmake
            apt-get install libusb-1.0.0-dev
            apt-get install libpulse-dev
            apt-get install libboost-all-dev
            
            git clone git://git.osmocom.org/rtl-sdr.git
            git clone git://git.osmocom.org/osmo-sdr
            git clone git://git.osmocom.org/gr-osmosdr
            git clone git://git.osmocom.org/csete/gqrx.git
            
            mkdir sdr
            cd sdr
            Mkdir gnuradio-src
            cd gnuradio-src 
            
            wget http://www.sbrac/file/build-gnuradio
            chmod a+x build-gnuradio
            

            0x02 安裝Airprobe


            1. 各種依賴包依賴庫:(少裝一個都不行!)


            #!bash
            sudo apt-get install git-core autoconf automake libtool g++ python-dev swig libpcap0.8-dev cmake git libboost-all-dev libusb-1.0-0 libusb-1.0-0-dev libfftw3-dev swig python-numpy libpulse-dev libpcsclite-dev
            

            新建一個目錄來git clone,我比較喜歡在/opt 目錄下來安裝新東西。

            #!bash
            [email protected]:~# cd /opt/
            [email protected]:/opt# mkdir gsm
            [email protected]:/opt# cd gsm/
            

            2. 安裝libosmocore


            #!bash
            [email protected]:/opt/gsm# git clone git://git.osmocom.org/libosmocore.git
            

            enter image description here

            接著: [email protected]:/opt/gsm/libosmocore# autoreconf -i [email protected]:/opt/gsm/libosmocore# ./configure [email protected]:/opt/gsm/libosmocore# make [email protected]:/opt/gsm/libosmocore# sudo make install

            最后”刷新”一下動態鏈接庫: [email protected]:/opt/gsm/libosmocore# sudo ldconfig

            3. 安裝airprobe


            #!bash
            [email protected]:/opt/gsm# git clone git://svn.berlin.ccc.de/airprobe
            

            注意:這里有個大坑。上面的git地址得到的airprobe版本和我們的系統環境有點不搭,編譯時會出錯。谷狗了一下,找到一個 git://git.gnumonks.org/airprobe.git 還是用不了。=。=||| 繼續谷狗,找到https://github.com/ksnieck/airprobe,親測git clone到一半也會出錯,所以干脆打包成zip下載。成功編譯。大家可以直接在這個地址下載打包的源碼,或者在本帖附件中下載我上傳的。

            將airprobe放到我們的工作目錄(/opt/gsm/)下以后,分別進入其gsm-receiver及gsmdecode目錄下執行以下命令對gsm接收程序和解密程序進行編譯:

            #!bash
            ./bootstrap 
            ./configure 
            make
            

            0x03 START TO HACK


            中國移動GSM信號頻段:上行/下行:890-909/935-954Mhz,但是測試時需要相對精確的數值。怎么辦?打給10086客服小妹,她也未必知道。因為你所處位置的GSM頻率和基站功率、你距離基站距離等都有關系,而且我們的接收裝置(電視棒)本身還存在ppm offset。

            所以你不要再難(tiáo)為(xì)客服小妹了,掛掉電話,用一個叫kalibrate的工具解決這些問題:

            ppm offset或frequency offset:頻率偏移,俗稱偏頻,一般由于硬件信號的源宿時鐘不同步造成。

            先看看kalibrate的基本用法:

            #!bash
            [email protected]:~# kal -h
            kalibrate v0.4.1-rtl, Copyright (c) 2010, Joshua Lackey
            modified for use with rtl-sdr devices, Copyright (c) 2012, Steve Markgraf
            Usage:
                GSM Base Station Scan:
                    kal <-s band indicator> [options]
            
                Clock Offset Calculation:
                    kal <-f frequency | -c channel> [options]
            
            Where options are:
                -s  band to scan (GSM850, GSM-R, GSM900, EGSM, DCS, PCS)
                -f  frequency of nearby GSM base station
                -c  channel of nearby GSM base station
                -b  band indicator (GSM850, GSM-R, GSM900, EGSM, DCS, PCS)
                -g  gain in dB
                -d  rtl-sdr device index
                -e  initial frequency error in ppm
                -v  verbose
                -D  enable debug messages
                -h  help
            

            搜索附近的GSM基站信息:

            #!bash
            [email protected]:~# kal -s 900
            

            enter image description here

            搜到兩個基站,上面一個信號比較強,頻率為946Mhz,我們選用這個基站,并 繼續使用kalibrate幫助我們校準電視棒的偏頻,使用 -c 參數加我們基站的頻道號(channel)來計算出這個誤差值:

            #!bash
            [email protected]:~# kal -c 55
            

            enter image description here

            得到的結果,average為偏頻的平均值,單位kHz,+表示我們的電視棒高出這么多,所以在測試時要用頻率值減去這個值。下面的ppm值是另一種偏頻單位,反而更常用,但是我們用來接收先好的軟件不支持這個值的改動,所以先不做深究。

            接下來打開wireshark,注意要選擇回環網卡,并在啟動后選擇gsmtap過濾器:

            enter image description here

            enter image description here

            接著把wireshark放在一邊,使用airprobe的gsm_receive_rtl 模塊來接收GSM信號:

            注:Airprobe默認只支持下行的非跳躍(non-hopping)窄頻通道信號,如果想要監聽上行信號,可以嘗試一下插兩條電視棒同時工作。

            首先進入目錄:/opt/gsm/airprobe/gsm-receiver/src/python

            接著輸入以下命令,打開一個動態的波形圖:

            #!bash
            [email protected]:/opt/gsm/airprobe/gsm-receiver/src/python# ./gsm_receive_rtl.py -s 1e6 -f 946M 
            

            參數解釋:-s 采樣率,默認為1800000,但實踐證明1000000 的采樣率采樣效果更好,1e6的寫法表示1后面有6個0,大家上小學用的計算器上應該見過這種表示方法。-f 頻率,不用多說。還有個常用的參數是 -c ,配置控制信道類型。

            控制信道(CCH):是用于傳送信令或同步數據。 主要有三種:廣播信道(BCCH)、公共控制信道(CCCH)和專用控制信道(DCCH)。

            Airprobe支持的控制類型:

            #!bash
            0C : TimeSlot0  "Combined configuration", with SDCCH/4
                      (FCCH + SCH + BCCH + CCCH + SDCCH/4)
            0B : TS0  "FCCH + SCH + BCCH + CCCH"
            1S : TS1  SDCCH/8
            2T : TS2  (Full Rate) Traffic
            1TE: TS1  Enhanced Full Rate Traffic
            

            理論上,你用頻率值減去偏頻值得到的數字,放gsm_receive_rtl 的-f參數中,或者直接輸入頻率值,在打開的波形圖中鼠標點擊波峰偏左一點的位置,就可以接收到信號。但現實往往是殘酷的,你會發現經常打開波形圖都是下圖這樣的:

            enter image description here

            波峰距離原點十萬八千里有木有!這種情況下,不管你怎么點,點哪里,在wireshark里都看不到任何東西。

            這時候需要我們小幅修改頻率值,將波峰盡量微調值處在原點附近。比如我就是在將kalibrate獲取的基站頻率值減少了1MHz后,波峰調到了原點附近,wireshark也隨之刷刷刷的出數據了。

            enter image description here

            有了數據,接下來大家就自由發揮吧。點到為止。

            Kali還自帶了一個好玩的東西,叫gqrx,一款基于GNU Radio和Qt的sdr工具。

            enter image description here

            我們可以用它來收聽廣播:

            enter image description here

            或者收聽GSM信號傳輸的聲音

            enter image description here

            PS:聽到我耳朵都快懷孕了也只是沙沙聲和蜂鳴聲,難道有干擾信號?說好的不加密呢 ToT

            0x04 結語


            用來接收GSM信號還有很多方法可以嘗試,比如kali自帶的rtl_sdr、開源的arfcncalc等工具。加密的GSM破解目前主要還是靠Airprobe,但是【可能】還沒有實現實時解密,只能先截獲并轉儲成一個cfile文件,再解出語音文件等。

            最后值得一體的是GSM的破解已經出現在老外的CTF中,如RuCTF 2014 Quals-Misc 500-GSM,題目中的GSM還是加密的,需要找到KC碼來進行破解,有興趣的同學可以參看這里的writeup: http://piggybird.net/2014/03/ructf-2014-quals-misc-500-gsm-writeup/

            話說一入GSM深似海,里面涉及大量通信原理。大家研究這個的時候可以順便把通信的東西再復習幾遍。

            作者智商有限,文中不免紕漏和不妥之處。有任何建議或意見大家[email protected]

            附件 下載地址

            0x05 參考文獻


            https://gnuradio.org/redmine/projects/gnuradio/

            http://sdr.osmocom.org/trac/wiki/rtl-sdr

            http://domonkos.tomcsanyi.net/?p=428

            http://www.rtl-sdr.com/rtl-sdr-tutorial-analyzing-gsm-with-airprobe-and-wireshark/

            http://sec.sipsik.net/gsm/baseband/domonkos.tomcsanyi.net/

            http://piggybird.net/2014/03/ructf-2014-quals-misc-500-gsm-writeup/

            https://lists.srlabs.de/pipermail/a51/2010-July/000688.html

            https://srlabs.de/airprobe-how-to/

            https://ferrancasanovas.wordpress.com/cracking-and-sniffing-gsm-with-rtl-sdr-concept/

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线