OsmocomBB SMS Sniffer
Author:綠盟科技部落格
0x00 簡介
OsmocomBB(Open source mobile communication Baseband)是國外一個開源專案,是GSM協議棧(Protocols stack)的開源實現。其目的是要實現手機端從物理層(layer1)到layer3的三層實現,主要進行2G網簡訊嗅探。本文詳細地介紹了實現方法,以供安全愛好者學習和參考。
目前來看,真正的物理層(physical layer)並沒有真正的開源實現,暫時也沒看到實施計劃。只有物理層控制。因為真正的物理層是執行在baseband processor的DSP core上,涉及到許多訊號處理演算法的實現,而且還要牽扯很多硬體RF的東西。這項技術至少在2010年,技術已經成熟,2011年就有開源實現了。得益於OsmocomBB 的開源專案,使得我們用一臺筆記本和很簡單的硬體就能完成GSM sms嗅探。
0x01 原理分析
關於加密
GSM加密採用A5演算法。A5演算法1989年由法國人開發,是一種序列密碼,它是歐洲GSM標準中規定的加密演算法,專用於數字蜂窩行動電話的加密,用於對從電話到基站連線的加密。A5的特點是效率高,適合硬體上高效實現。
A5發展至今,有A5/1、A5/2、A5/3、A5/4、A5/5、A5/6、A5/7等7個版本,目前GSM終端一般都支援A5/1和A5/3,A5/4以上基本不涉及。值得注意的是,A5/2是被『故意弱化強度』的版本,專用於『出口』給『友邦』,2006年後被強制叫停,終端不允許支援A5/2。
工作流程
手機開機時的位置更新流程:
- MS(手機)向系統請求分配信令通道(SDCCH);
- MSC收到手機發來的IMSI可及訊息;
- MSC將IMSI可及資訊再傳送給VLR,VLR將IMSI不可及標記更新為IMSI可及;
- VLR反饋MSC可及資訊訊號;
- MSC再將反饋訊號發給手機;
- MS傾向訊號強的BTS,使用哪種演算法由基站決定,這也導致了可以用偽基站進行攻擊。
關於GSM網路相關知識
0x02 所需硬體
支援的手機
- MotorolaC123/C121/C118 (E88) — our primary target
- MotorolaC140/C139 (E86)
- MotorolaC155 (E99) — our secondary target
- MotorolaV171 (E68/E69)
- SonyEricssonJ100i
- Pirelli DP-L10
- Neo 1973 (GTA01)
- OpenMoko – Neo Freerunner (GTA02)
- SciphoneDreamG2 (MT6235 based)
我們選擇Moto C118,因為官方支援的最好、硬體成本低,¥35/臺(手機+電池+充電器)
USB轉串列埠模組
推薦帶TX/RX LED的 FT232模組,當然其他模組也可以,比如CP2102、CP2303等模組,不過使用前要先調好位元率。FT232模組,我買的是¥35的,第一個嘛,為了求穩定。後面做多個手機聯合嗅探的時候可以嘗試買一些便宜的。
C118資料線
這個資料線就是2.5mm耳機頭轉杜邦線,注意一頭是2.5mm耳機孔的,另一邊是杜邦線連線串列埠模組。手邊有2.5mm耳機插頭的可以自己做一個。當然網上現在也有現成的了,不過成本稍微高一點。¥15左右一條
MiniUSB連結線
這個線應該都有,以前的mp3、手機啥的都是這個線,馬雲家賣¥10,如果你用了Pl2303那類的USB轉換板,就可以不用這根線了,那個板子上自帶U口。
0x03 編譯OsmocomBB
基礎環境
MacOs 10.10.5 + VMworkstation + Ubuntu 12.04 x64
我的實驗用的是這樣的環境,網上很多教程都說X64的虛擬機器不能正常編譯,但是我確實是成功了。也可以嘗試使用別的環境試試,畢竟我的實驗環境僅供參考。
網路環境要求能夠正常訪問github,實驗環境周圍存在GSM訊號。
C118手機有足夠的電量,支援實驗。
準備所需目錄以及檔案
具體專案目錄結構和所需檔案如下圖:
準備好之後的目錄如下圖:
我是把整個source目錄放在了使用者資料夾下,僅做參考。只需要按照上面文字格式的結構圖準備就好,圖片中未出現部分後面會寫如何出現…
編譯環境準備
編譯前安裝所需的依賴庫檔案:
#!bash
sudo apt-get install build-essential libgmp3-dev libmpfr-dev libx11-6 libx11-dev texinfo flex bison libncurses5 libncurses5-dbg libncurses5-dev libncursesw5 libncursesw5-dbg libncursesw5-dev zlibc zlib1g-dev libmpfr4 libmpc-dev
在arm根目錄執行build.sh檔案進行build操作:
#!bash
chmod +x gnu-arm-build.2.sh ./ gnu-arm-build.2.sh
完成後arm/install/目錄結構如圖所示:
因為編譯需要,把arm/install/bin路徑加入到環境變數中,我這裡是加入到使用者的環境變數中。使用pwd命令獲取絕對路徑:
修改~/.bashrc
檔案,最後一行加入:
#!bash
export PATH=$PATH:/home/wooyaa/source/arm/install/bin
執行source命令讓配置檔案即時生效:
#!bash
source ~/.bashrc
在終端中輸入arm然後按tab鍵,如果出現如下圖所示就說明編譯環境搞定了:
編譯OsmocomBB
把osmocom專案gitclone到source目錄下:
#!bash
git clone git://git.osmocom.org/osmocom-bb.git git clone git://git.osmocom.org/libosmocore.git
在libosmocore/目錄中編譯osmocom核心庫檔案
#!bash
cd /home/wooyaa/source/libosmocore/ autoreconf -i ./configure make sudo make install
編譯OsmocomBB:
#!bash
cd /home/wooyaa/source/osmocom-bb/src/ git checkout –track origin/luca/gsmmap //選擇分支 make //交叉編譯
如果沒什麼問題,軟體環境和韌體就都編譯好了。
Ununtu 12.04自帶FT232R驅動,所以直接連線就能使用,不需要再裝驅動。
常見錯誤
常見報錯有可能是autoconf、libtool、libpcsclite-dev等檔案的缺失,只要裝好就行了。具體版本請使用apt-cache search xxx
在你自己電腦中的apt-get的list中查詢。
0x04 使用方法
連線硬體
在終端中輸入lsusb
,會顯示當前usb連線的資訊:
如果驅動正常,插上MiniUSB線後就能看到usb-serial:
網上的教程大多都誤認為是將firmware刷入手機,實際上這裡只是把韌體載入到手機RAW中執行。
載入Firmware到手機raw中
#!bash
cd /home/wooyaa/source/osmocom-bb/src/host/osmocon/./osmocon -m c123 -p /dev/ttyUSB0 ../../target/firmware/board/compal_e88/layer1.compalram.bin
- 其中 –m c123跟c123xor的區別就是是否檢測資料總和
- 上面命令需要在關機下執行,然後短按開機鍵
終端上會顯示”starting up”字樣,如下:
手機螢幕顯示Layer 1 osmocom-bb 字樣就表示成功了:
掃描基站
#!bash
cd /home/wooyaa/source/osmocom-bb/src/host/layer23/src/misc/sudo ./cell_log –O
其中cell_log的引數是字母O,具體作用是隻檢查ARFCN是否可用,不進行其它操作,可以用./cell_log –help參看說明。
終端中會輸出日誌資訊,其中會包含能夠收到的基站的相關資訊,格式類似這樣:
#!bash
cell_log.c:248 Cell: ARFCN=40 PWR=-61dB MCC=460 MNC=00 (China,China Mobile)
ARFCN後面的編號可以代表基站通道號,還包含了運營商資訊。
關於嗅探
因為我們買的便宜貨,每個手機只能嗅探一個通道,具體一些的,可以參考下面的圖(我們現在只能抓Downlink的資料包):
因為想要Sniffer Uplink的包,要修改硬體,C118主機板上的RX filters要換掉,換成我們需要的HHM1625&&HHM1623C1濾波器元件,才能抓Uplink的資料包。
有關通道號ARFCN的問題,可以參考下面的圖:
開始嗅探
選擇想要監聽的通道號並開始嗅探廣播資料。
在目錄/home/wooyaa/source/osmocom-bb/src/host/layer23/src/misc/下執行嗅探:
#!bash
./ccch_scan -i 127.0.0.1 -a THE_ATFCN_ID
其中THE_ATFCN_ID就是掃描到的日誌中引數ARFCN的值。
蘋果手機可以執行:3001#12345# 進入工程模式後,選擇GSM Cell Environment->GSM Cell Info->GSM Serving Cell,就可以看到目前手機連線的基站ARFCN值了,應該在第二步中,也能看到這個ID存在。
其他手機的命令
Samsung (Android): *#0011#
使用wireshark抓取監聽資料
因為osmocomBB執行之後預設會在本地開啟4729埠,這時候的GSM協議已經被封裝上了TCP-IP,可以在本地用wireshark抓到,所以我們使用wireshark去監聽4729的埠
#!bash
sudo wireshark -k -i lo -f 'port 4729'
在wireshark中過濾gsm_sms協議資料,過濾之後得到的資料裡面就包含簡訊的明文資訊。 過濾後得到的明文簡訊資訊
SMS text就是簡訊的明文內容,其他git分支還支援把監聽到的資料儲存到cap包,然後透過指令碼來過濾包內容,達到嗅探簡訊明文的目的。後面會有計劃的去嘗試。
配置OsmocomBB
layer23是用/home/wooyaa/source/osmocom-bb/src/host/layer23/src/mobile下的mobile程式實現,所以透過執行mobile檔案可以進行自定義,配置一些關於osmocom-bb的資訊。
#!bash
cd /home/wooyaa/source/osmocom-bb/src/host/layer23/src/mobile
sudo ./mobile -i 127.0.0.1
執行mobile程式之後,會在本地開啟4247埠,使用telnet連線,然後配置執行,隨時使用?來檢視help資訊。
關於嗅探內容
簡單來講,簡訊接受者的號碼、IMEI等資料,只有在”Location Update”時才會在網路中出現,並且是以加密形式傳輸的。當接收簡訊時,基站根據之前位置更新時註冊的資訊,判斷接收者的位置。所以,想要拿到接受者的號碼,需要破解A5/1演算法並還原出”Location Update”時的原文。
只不過需要價格昂貴的USRP2…
另外還看到個RTL-SDR的文章(就是以前傳說中可以跟蹤飛機的電視棒),也支援Airprobe:
http://www.rtl-sdr.com/rtl-sdr-tutor…and-wireshark/
Tips
- 記住所有操作在
sudo -s root
許可權下操作。 - 開機鍵不是長按,而是短按,否則就進入原系統了。
- 現在2G簡訊越來越少了,多等等會有的。理論上話音一樣能夠被監聽及解碼,只是涉及技術更為複雜。
- CP210x的接線,RX和TX有可能需要對調。執行cp210x-program需要先安裝ibusb-dev,如果輸出是“No devices found”或“Unable to send request, 3709 result=-110”,則有問題。
0x05 後期計劃
捕獲上行包
因為想要嗅探Uplink的包,要修改硬體,C118主機板上的RX filters要換掉,換成我們需要的HHM1625&&HHM1623C1濾波器元件,才能抓Uplink的資料包。修改方法如下:
要使手機能夠成為『passive uplink sniffer』,必須動到電烙鐵,替換掉RX filters。
替換前:
摘掉後:
替換後:
使用OsmocomBB RSSI monitor檢視訊號強弱:
#!bash
./osmocom-bb/src/host/osmocon/osmocon -p /dev/ttyUSB0 -m c123xor -c ./osmocom-
bb/src/target/firmware/board/compal_e88/rssi.highram.bin ./osmocom-
bb/src/target/firmware/board/compal_e88/chainload.compalram.bin
由於RSSI太大,不便於像OsmocomBB那樣直接載入,所以要先用-C引數載入一個小的chainloader程式去載入我們真正的RSSI Payload程式:
簡訊內容實時web頁面展示
製作成綿羊牆,線上實時顯示嗅探到的簡訊
多裝置聯合嗅探
嘗試多裝置一起嗅探,增強嗅探範圍和效果
0x06 附錄
DIY Moto C118資料連結線
圖中例子耳機為moto T191的耳機,右圖中標註的顏色為耳機線拆開后里面線芯的顏色。耳機線拆開后里面會包含3根帶有外皮的銅線。
GSM網路相關知識
從協議圖中得知,移動裝置(MS)和基站(BTS)間使用Um介面,最底層就是刷入手機的layer1物理傳輸層,之上分別是layer2資料鏈路層和layer3網路層。
位於圖中layer2的LAPDm,是一種保證資料傳輸不會出錯的協議。一個LAPDm幀共有23個位元組(184個位元),提供分片管理控制等功能。
layer3的協議則可以分為RR/MM/CM三種,這裡只列出嗅探相關的功能:
- RR(Radio Resource Management):channel, cell(控制等資訊,可以忽略)
- MM(Mobility Management):Location updating(如果需要接收方號碼,需要關注這個動作)
- CM(Connection Management):Call Control(語音通話時的控制資訊,可以知道何時開始捕獲TCH), SMS(這裡的重點)
參考GSM的文件 TS 04.06 得知 LAPDm 的Address field欄位中,定義了 3.3.3 Service access point identifier (SAPI)。SAPI=3就是我們要的Short message service。 使用tcpdump配合show_gsmtap_sms.py指令碼在console列出簡訊明文。
#!bash
tcpdump -l -ilo -nXs0 udp and port 4729 | python2 -u show_gsmtap_sms.py
一些名詞解釋
- MS:Mobile Station,移動終端;
- IMSI:International Mobile Subscriber Identity,國際移動使用者標識號,是TD系統分給使用者的唯一標識號,它儲存在SIM卡、HLR/VLR中,最多由15個數字組成;
- MCC:Mobile Country Code,是移動使用者的國家號,中國是460;
- MNC:Mobile Network Code ,是移動使用者的所屬PLMN網號,中國移動為00、02,中國聯通為01;
- MSIN:Mobile Subscriber Identification Number,是移動使用者標識;
- NMSI:National Mobile Subscriber Identification,是在某一國家內MS唯一的識別碼;
- BTS:Base Transceiver Station,基站收發器;
- BSC:Base Station Controller,基站控制器;
- MSC:Mobile Switching Center,移動交換中心。行動網路完成呼叫連線、過區切換控制、無線通道管理等功能的裝置,同時也是移動網與公用電話交換網(PSTN)、綜合業務數字網(ISDN)等固定網的介面裝置;
- HLR:Home location register。儲存使用者的基本資訊,如你的SIM的卡號、手機號碼、簽約資訊等,和動態資訊,如當前的位置、是否已經關機等;
- VLR:Visiting location register,儲存的是使用者的動態資訊和狀態資訊,以及從HLR下載的使用者的簽約資訊;
- CCCH:Common Control CHannel,公共控制通道。是一種“一點對多點”的雙向控制通道,其用途是在呼叫接續階段,傳輸鏈路連線所需要的控制信令與資訊。
參考文獻
- https://github.com/osmocom/osmocom-bb
- http://bb.osmocom.org/trac/wiki/TitleIndex
- http://wulujia.com/2013/11/10/OsmocomBB-Guide/
- https://blog.hqcodeshop.fi/archives/253-iPhone-cell-Field-Test-mode.html
- http://bbs.pediy.com/showthread.php?t=182574
- http://www.blogjava.net/baicker/archive/2013/11/13/406293.html
相關文章
- Laravel SMS 簡訊傳送包2018-12-12Laravel
- Laravel-sms 怎麼使用多模板2019-05-24Laravel
- .net core 使用阿里雲簡訊傳送SMS2018-04-12阿里
- 如何解決sms-activate的解決問題2023-03-21
- Laravel-sms 阿里雲簡訊擴充套件包2019-10-11Laravel阿里套件
- Sniffer pro抓包盜取Telnet登入密碼實驗2019-02-28密碼
- After Effects報警 最後日誌訊息是: GPU Sniffer 102020-10-21GPU
- Air780E如何傳送SMS?一文詳解!2024-11-03AI
- Python 黑帽程式設計 4.2 Sniffer 之資料本地儲存和載入2019-03-02Python程式設計
- 編寫 PyKD 除錯指令碼,自動化地 Sniffer VMware 的 RPC 請求2018-03-07除錯指令碼RPC
- 如何解決After Effects報警最後日誌訊息是: GPU Sniffer 10的問題2020-12-12GPU
- laravel-sms 實現阿里雲手機傳送簡訊驗證碼及校驗2022-05-13Laravel阿里
- MySQL 5.6執行DDL報錯ERROR 1050 (42S01): Table 'sms/#sql-ib752' already exist2018-09-30MySqlError
- 如何解決 After Effects報警 最後日誌訊息是:<4458048960><DS><5> GPU Sniffer 10的問題2020-12-12GPU
- 分享一款支援多種簡訊服務商 Hyperf 元件,基於 overtrue/easy-sms 元件改造2019-12-06元件
- 二次封裝overtrue/easy-sms元件,相容hyperf2.0支援協程化,使用簡單2020-12-22封裝元件
- 訊息sms 郵箱/手機號/push傳送的方案 & 定時任務xxlJob靈活度 & 泛型和傳送的模板類設計2024-03-27泛型