簡介:
2019年9月12日,AdaptiveMobile Security公佈了一種針對SIM卡S@TBrowser的遠端攻擊方式:Simjacker。攻擊者使用普通手機傳送特殊構造的簡訊即可遠端定位目標,危害較大。sim卡的使用在手機上的使用非常普遍,所以一旦SIM卡上出現什麼問題就會造成非常大的影響。在19年的報告紕漏中,在全球估算共有10億裝置的sim卡容易遭受SIM Jacker攻擊,這篇也是比較淺顯的對整個攻擊進行分析。
1.一點點背景
在瞭解整個攻擊前需要對整體的一個框架有所瞭解,現在我們就先來了解一下簡訊是如何去傳送的。GSM的中文就是全球行動通訊系統,是由歐洲電信標準組織ETSI 制定的一種數字制式的蜂窩行動通訊系統。當初開發 GSM目的是讓全球各地可以共同使用一個行動電話網路標準,讓使用者使用一部手機就能行遍全球,因此GSM 還有一個很接地氣的俗稱------全球通。
GSM與它以前的標準相比較而言最大的不同是它的信令和語音通道都是數字式的,因此GSM 被看作是第二代(2G)行動電話系統。 簡訊(Short MessageService,SMS)是基於 GSM(全球行動通訊系統)網路標準的通訊服務之一,SMS允許透過 GSM 網路傳送和接收文字訊息。現在來看看整個簡訊的傳送流程。
這裡面中最主要涉及到了三個很重要的主體:傳送者,簡訊中心,接收者。也就是我們的簡訊必須經過簡訊中心的轉發才能到達接收者的SIM卡上。這裡面也涉及到了很多基站的不同功能,比較完整的傳送詳細的可以看這個https://zhuanlan.zhihu.com/p/41439805。
以下是具體的步驟:
-
傳送者編輯簡訊,透過無線訊號(SIM)將訊息內容傳送到基站
-
基站收到訊息內容經過一系列網元處理將其轉發到運營商簡訊服務中心
-
運營商簡訊服務中心經過一系列網元處理將資料轉發到接收者附近的基站
-
接收者附近的基站將簡訊內容傳送到接收者
2.PDU模式簡訊的格式
GSM收發短訊息又分三種模式:BLOCK 模式、TEXT 模式和PDU 模式。BLOCK模式現在用的很少了;TEXT 模式則只能傳送ASCII碼,它不能傳送中文的UNICODE碼(確切地講,從技術上來說是可以用於傳送中文短訊息的,但是國內的手機基本上不支援);而PDU模式開發起來則較為複雜,它需要編寫專門的函式來將文字轉換為PDU格式,但PDU模式被所有手機支援,可以使用任何字符集,它也是手機預設的編碼方式。接下來我們來主要了解在這個模式下簡訊的格式。
以一個現實裡的例子去講解這個,這些是16進位制的表示
0891683108200805F011190D91683188902848F40008FF108FD9662F4E0067616D4B8BD577ED4FE1
簡訊中心地址欄位 0891683108200805F0
FirstOctet欄位 11
訊息參考值 19
接收者號碼欄位 0D91683188902848F4
協議標識 00
編碼方法 08
有效期 FF
使用者資料長度 F10
使用者資料 8F......E1
簡訊中心地址欄位
這個就是簡訊中心的地址,一般SIM卡都已經寫好了,所以這裡還有一個很常見的寫法就是00,表示預設。08表示位元組長度,9168表示的就是+86,表示的是在中國的號碼,然後後面跟著號碼。
FirstOctet欄位
這個欄位非常重要,涉及到許多設定,每一bit都有用處,先將十六進位制下的11換成二進位制的00010001,
我們從最低位開始,從右往左看
-
首先我們看的就是01(對這倆位得連在一起看),這倆位表示的是這個簡訊的型別,最常見的有倆種SMS-SUBMIT、SMS-DELIVER。SMS-SUBMIT表示移動終端裝置傳送到簡訊中心,SMS-DELIVER表示簡訊中心傳送到移動終端裝置,對應的分別是01和00,這裡是01,表示就是這是一條傳送者的簡訊
-
接下來就是第2位0,表示是否要接收重複的訊息
-
然後是10,這裡表示了簡訊有效期的形式,10表示使用的相對時間,這也是常用的設定
-
然後就是第5位啦,這是一個非常有意思的引數,返回簡訊狀態報告。用通俗的話講就是告訴傳送者接收者是否已經接收到了簡訊,這裡面所蘊含的資訊在USENIX23上被用來實現了定位
-
然後第6位就是使用者資料頭標示,當它等於0的時候就是表明這是一個簡訊訊息,如果是一個OTA訊息呢,比如SIM
jacker,就得設定為1
-
第7位是設定回覆路徑,每個SIM卡都設定了一個簡訊中心的號碼,如果設定為0,那麼接收者接回復簡訊時用的也是傳送者的簡訊中心;如果這個是1,那麼接收者將使用自己的簡訊中心
用一下別人的表,大家可以來對照一下:
訊息參考值
這個值有點像ID,範圍是0~255,如果一個簡訊被分成了多片,簡訊中心可以依據這個值將其進行組合
目標地址
這個同簡訊中心的設定,不過這裡的0D表示的數字的長度,表示有幾個數字
協議識別符號
它是表明一條簡訊的用途或協議,它不僅用於傳統的簡訊傳輸,也用於傳輸其他型別的資訊,如傳真、電子郵件或無線應用協議(WAP)訊息。00表示的沒有什麼特殊的協議,靜默簡訊的設定也涉及到這個,需要將這個修改成40,這個靜默簡訊傳送給接收者是完全沒有任何提示的
資料編碼方案
指明這個pdu的編碼方式是什麼,PDU收發簡訊有三種編碼可用:7-bit、8-bit和UCS2編碼,00為7Bit編碼,04是8bit,08是UCS2編碼,到後面的可以表達的內容更多,7bit簡單的英文到UCS2編碼可以傳送中文。
【----幫助網安學習,以下所有學習資料免費領!加vx:dctintin,備註 “部落格園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
有效期
這裡根據前面常見的設定就是相對有效期,FF表示最大30天,00最小5分鐘
使用者資料長度
後面跟著的資料的長度
3.一點點實驗
瞭解到了一個PDU模型,簡訊的格式,一個標準的pdu可以直接用線上的網站進行生成,http://www.sendsms.cn/pdu/,大部分格式限定後,就可以修改部分設定
現在pdu格式有了,該如何發呢,這種最簡單的情況就是去網上買個GSM模組,插上一張可以收發簡訊的SIM卡就可以直接用了,但考慮到大家只是簡單瞭解一下,也不一定非得買個專門的裝置,所以我們這裡使用一個大家肯定都有的裝置的,一臺root過的手機。我使用的是魅族m3note,比較好root,大家也可以試試。
首先先接入adb進行除錯,已經確定獲得了root許可權
因為安卓為linux系統修改的,所以一切皆檔案,插入的sim卡也會被對映成一個檔案,可以進行操作
一個示例如下
現在我們需要找到插入SIM卡之後的對應的檔案,最簡單的方式就是對比插入前後的對比找到
檢視/proc/devices ,不過並沒有變化,這裡判斷應該是準備著有介面,已經存在。
使用demsg,但是因為資料線處於連線狀態充電,會有很多雜亂資訊,而且魅族上使用的也不是smd* ,這裡也可以嘗試一個一個去找,但也會有很多問題。
這裡找到一個比較好的辦法,檢視裝置的radio日誌
logcat -b radio | grep dev
先掛起日誌監控,在插入SIM卡後,會輸出大量訊號,這裡就成功定位到了SIM卡所對映的裝置
因為每個裝置對換行的接收不一樣,所以建議幾種方式一起去試,一個例子如下:
echo -e "AT+COPS?" > /dev/pts/4\echo -e "AT+COPS?\r" > /dev/pts/4\echo -e "AT+COPS?\r\n" > /dev/pts/4\echo -e "AT+COPS?\n" > /dev/pts/4\echo -e "AT+COPS?;" > /dev/pts/4\echo -e "AT+COPS?;\r" > /dev/pts/4\echo -e "AT+COPS?;\r\n" > /dev/pts/4\echo -e "AT+COPS?;\n" > /dev/pts/4
之後逐一篩選,選擇合適的結尾,這裡是\n
然後傳送一條簡訊試試
echo -e "AT+CMGF=0\n" > /dev/pts/4 # PDU模式\echo -e "AT+CMGS=20\n" > /dev/pts/4 # 字元長度\echo -e "0031000D9168xxxxxxxxxxxx00000005E8329BFD06\032\n" >/dev/pts/4
之後就可以在接收者那收到簡訊,\032 對應ctrl\^z,是發完簡訊的結束符,不算入總長度
4.SIM Jacker
瞭解完前面三個部分,大家有了一些基本的瞭解,接下來我們就來看看SIMJacker這個攻擊,一些具體的影響後果啥的就不去細究了,主要還是瞭解背後的一些原理。
(1)OTA訊息
OTA 訊息,也稱為二進位制訊息,是包含一組(U)SIM 應用程式工具包(USAT)命令的特定 APDU 訊息,這些訊息針對 SIM卡內的特定應用程式,而這些應用程式又執行訊息本身提供的USAT命令,這些命令包括:設定呼叫、傳送簡訊、更新SIM 資訊、編輯 SIM 檔案等。
OTA 訊息通常設計為從運營商傳送到使用者,服務提供商可以引入新的 SIM服務、修改 SIM的內容、執行軟體更新、配置設定,甚至更新移動裝置的加密金鑰。
正是因為這一特性的存在導致了SIMJacker的發生,也就是OTA訊息也可以由一個使用者傳送,而非簡訊中心。
SIM Jacker發生的條件主要有三個:
-
簡訊中心可以接受並轉發PDU訊息
-
接收者能夠解析SIM應用工具包命令的PDU訊息
-
SIM上部署了S@T瀏覽器技術,並且設定了"不應用任何安全措施"的最低安全級別
其他的一些條件,比如主動 UICC 命令等這些都是預設開啟的,這裡就不在提及。
讓我在回到PDU模式簡訊那塊,在FirstOctet欄位中有一位可以將普通的使用者資料,變成對SIM卡特定應用的程式的執行命令,就是要將第6位的使用者資料頭標示設定成1。也有很多是SIMjacker的攻擊中的PDU是0041開頭的。
先用一張圖開始:
前面的部分和之前一樣,主要來解釋一下後面的UD部分:
-
先開始的是使用者資料頭,包含了倆部分
一個是是使用者資料頭的位元組長度,另一個是使用者資料頭的設定,可以設定是否包含安全頭。
-
命令包包含有關訊息安全性、訊息發往哪個應用程式以及我們想要執行的實際命令是什麼等非常重要的資訊。
-
命令包長度是整個命令包的位元組長度:
-
命令頭長度是命令頭的位元組長度:
-
命令頭由6 個不同的值組成:
安全引數指示符(SPI)指定是否對訊息應用任何安全性,在SIMjacker中要將SPI設定如下:SPI = 0x0000
加密金鑰識別符號(KIC)所使用的加密型別,我們將其設定為:KIC = 0x00
金鑰識別符號 (KID)指定用於加密的金鑰,我們將其設定為:KID = 0x00
目標應用程式參考 (TAR)標識了我們將向其傳送訊息的 SIM卡上的應用程式,我們將其設定為S@T 瀏覽器:
TAR = 0x505348
計數器和填充計數器 (CNTR & PCNTR),這些值的設定如下:CNTR =0x0000000000PCNTR= 0x00
-
安全資料(S@T/STK 命令)(關鍵)
這是有效載荷中最重要的部分,它包含我們希望S@T瀏覽器應用程式代表我們執行的命令。這些命令是使用STK位元組碼構建的,例如,它可以用於設定呼叫和傳送簡訊。
(2)示例分析
一個具體的例子就在下面
AT+CMGF=0\AT+CMGS=69\>0041000B910516325476F87FF6XX027000YYYY0D0000000050534800000000000042230121...2D0C100383...2B00(CTRL + Z)
將這些結構對應回圖上,
現在檢測或者進行的SIM jacker的工具已經有了,大家拿一個SIMTester和一個讀卡器就可以了,不過國內的SIM卡沒有這方面的攻擊案例,自己測試也沒有找到這方面的案例。
更多網安技能的線上實操練習,請點選這裡>>