首先我會通過三個實驗來學習VoWifi/VoLTE的工作原理:
使用fasferraz 的Python IKEv2/EAP-AKA 實現連接到VoWifi:失敗;
使用Linphone 連接到VoLTE:失敗;
使用Wi-Fi 熱點、假DNS 服務器和VPN 服務器捕獲IMSI:成功;
VoLTE和VoWifi看起來可能很複雜,但要打電話,只需要和兩台電腦進行連接就可以了:
VoLTE和VoWifi是基於常見技術的:
在VoLTE 中,電話通過SIP 連接到P-CSCF,這是運營商的SIP VoIP 服務器。
在VoWifi中,手機首先與運營商的VoWifi VPN服務器ePDG進行IPSec VPN連接。然後通過VPN連接到P-CSCF SIP服務器,比如VoLTE。
然而,VoLTE的實現與我們日常使用的vpn和VoIP軟件不兼容。這份來自Sysmocom的報告顯示,修改Ubuntu Touch以支持VoLTE需要幾個月的時間。
那麼,是什麼阻止我用普通的VPN軟件連接到VoWifi VPN服務器,或者用普通的VoIP軟件連接到VoLTE SIP服務器呢?我決定找出答案。
在VMWare Fusion虛擬機上的Ubuntu 21.04上進行的實驗,連接到Mint上運行Android 11的Pixel 3 XL上(T-Mobile MVNO)。
連接到VoWifi為了連接到特殊的VoWifi VPN,我使用了fasferraz的SWu-IKEv2,這是一個IKEv2/IPSec VPN客戶端,它使用SIM卡實現了特殊的EAP-AKA認證方法。
在EAP-AKA 中:
只有運營商和SIM 卡本身知道密鑰K;
認證時,運營商發送兩個值:AUTN 值和RAND 值;
AUTN 值向SIM 卡證明它是真正的運營商;
SIM卡用秘鑰K對RAND值進行加密,導出兩個秘鑰:IK、CK和響應值RES;
它將RES 值發回給運營商以證明它是真正的SIM 卡;
手機使用IK 和CK 加密連接;
運營商使用K 密鑰進行相同的加密以獲得預期的IK、CK 和RES 值;
運營商在解密連接前將RES值與IK和CK進行比較;
由於沒有其他人擁有K 密鑰,因此他們無法竊聽或冒充用戶/運營商;
綜上所述,我需要將AUTN和RAND發送到SIM卡上,並取回RES、IK和CK。
SWu-IKEv2 支持與真正的SIM 卡進行EAP-AKA 通信,定義了一個HTTP API 來與SIM 卡讀卡器通信。
我決定將該API實現為一個Android應用程序,這樣我可以在我的手機中使用SIM卡:
Android有一個公共API, TelephonyManager。 getIccAuthentication來運行這個身份驗證流程;
為Android 的Wi-Fi 添加框架,因為存在使用SIM 卡進行身份驗證的Wi-Fi 熱點;
ADB也可以在Android 10及以上版本上使用;
在Android 8.1 上不可用,我嘗試使用其他SIM 卡API 來嘗試獲取此值,但每次都不成功。我構建了一個生成SIM 身份驗證請求的HTTP 服務器Android 應用程序:
adbshellsh/sdcard/runsimserver.shserve3333我的應用程序使用http而不是https,因為我不需要處理證書。值得慶幸的是,很容易修補SWu-IKEv2 以支持純http。
如果出現故障,adb logcat -b radio 通常會給出調製解調器的錯誤消息。
我在網上搜索T-Mobile的ePDG地址,將APN設置為ims,將SWu-IKEv2的SIM讀取器地址指向我的手機,並嘗試連接:
#python3swu_emulator.py-m'http://192.168.1.9:3333'-d'ss.epdg.epc.mnc260.mcc310.pub.3gppnetwork.org'-M310-N260-a'ims'STATE3:
-------
sendingIKE_SA_AUTH(2)
receiveddecodedmessage:
[[46,[[41,[0,24,b'',b'']]]]]
receivedIKE_AUTH(2)
OTHER_ERROR:24它會獲得大部分握手,包括SIM 卡憑據,但會在IKE_SA_AUTH 上返回錯誤。
可能是因為Mint Mobile要求我在打開Wi-Fi通話前註冊一個緊急地址,或者SWu-IKEv2沒有實現與T-Mobile/Mint兼容的握手。
事實上,當我嘗試Verizon的Wi-Fi呼叫服務器時,SWu-IKEv2甚至無法通過握手的第一步,也無法進行SIM卡認證。我嘗試了StrongSwan,但無法找出配置文件。
連接到VoLTE如果我無法連接到VoWifi VPN,是否可以直接連接到VoLTE SIP服務器?
在Android上,我可以使用dumpsys找到SIP服務器地址:
$dumpsystelephony.registryPcscfAddresses:[/fd00:1234:5678:1234:1,/fd00:1234:1:123:1,/fd00:1234:5678:1234:2]這是一個私有的(fd00:) IP地址,所以不能通過互聯網訪問,但我可以通過Wi-Fi從我的手機訪問它。
我首先嘗試了SIP測試器sipp,看看它是否可以進行任何SIP連接:
$sipp-snuacfd00:1234:1:123:1-m1-auth_uri'sip:310260111111111@ims.mnc260.mcc310.3gppnetwork.org'
Resolvingremotehost'fd00:1234:1:123:1'.Done.
2021-11-1412:17:42.1888101636910262.188810:AbortingcallonunexpectedmessageforCall-Id'1-4126@1234:5678:1234:5678:1234:5678:1234:5678':whileexpecting'100'(index1),received'SIP/2.0403Forbidden
Via:SIP/2.0/UDP[1234:5678:1234:5678:1234:5678:1234:5678]:5060;branch=
To:service;tag=
From:sipp;tag=
Call-ID:1-4126@1234:5678:1234:5678:1234:5678:1234:5678
CSeq:1INVITE
Content-Length:0
'因為它得到了一個SIP響應,所以我決定嘗試一下Linphone,看看是否效果更好。
echo'registersip:310260111111111@ims.mnc260.mcc310.3gppnetwork.org[fd00:1234:5678:1234:1]'|linphone-daemon--config./lollinphonerc
daemon-linphoneStatus:Ok
Id:2
daemon-linphoneQuitting.
查看日誌,它似乎失敗並顯示需要擴展消息:
REGISTERsip:ims.mnc260.mcc310.3gppnetwork.orgSIP/2.0
Via:SIP/2.0/UDP[1234:5678:1234:5678:1234:5678:1234:5678:3080]:5060;branch=z9hG4bK.CnnLnAH2c;rport
From:tag=by3qRAb72
To:sip:310260111111111@ims.mnc260.mcc310.3gppnetwork.org
CSeq:21REGISTER
Call-ID:BqHzXhfQzf
Max-Forwards:70
Supported:replaces,outbound,gruu,sec-agree
Accept:application/sdp
Accept:text/plain
Accept:application/vnd.gsma.rcs-ft-http+xml
Contact:+sip.instance=''
Expires:0
User-Agent:Unknown(belle-sip/4.4.0)
SIP/2.0421ExtensionRequired
Via:SIP/2.0/UDP[1234:5678:1234:5678:1234:5678:1234:5678:3080]:5060;received=1234:5678:1234:5678:1234:5678:1234:5678:3080;rport=5060;branch=z9hG4bK.MEpCNGpx0
To:tag=hmpyfr9c6bln4s4tqy698hv3v
From:tag=LEotRcq8b
Call-ID:H3P5ZXk7Z2
CSeq:20REGISTER
Require:sec-agree
Content-Length:0在查看了真正的SIP 客戶端有哪些擴展之後,我嘗試將此行添加到Linphone 配置中。
[sip]
supported=replaces,outbound,gruu,sec-agree這在標題中設置了Supported: replaces, outbound, gruu, sec-agree,但我得到了完全相同的Extension Required 錯誤。
假的VoWifi ePDG如上所述,所以連接到運營商是不可能的。
值得慶幸的是,偽裝成是運營商來獲取IMSI 很容易,並且有如何做到這一點的指南。
為了偽裝成ePDG Wi-Fi 呼叫VPN,我創建了一個StrongSwan VPN 配置:
configsetup
charondebug='ike4'
connikev2-vpn
auto=add
type=tunnel
keyexchange=ikev2
left=%any
leftid=@ims
right=%any
rightid=%any
rightauth=eap-aka
rightsourceip=10.10.10.0/24
rightdns=8.8.8.8,8.8.4.4開始StrongSwan:
sudoipsecstart--nofork--confhello.conf啟動了一個DNS 服務器,將ePDG VPN 服務器域重定向到我的假Wi-Fi 呼叫服務器:
sudodnsmasq-d--no-resolv--no-hosts--log-queries--server8.8.8.8--address=/epdg.epc.mnc260.mcc310.pub.3gppnetwork.org/192.168.1.10然後我更改了手機上的DNS,激活了Wi-Fi 呼叫,然後在我的控制台上看到了這個:
07[NET]receivedpacket:from192.168.1.9[40844]to192.168.1.10[500](496bytes)
07[ENC]parsedIKE_SA_INITrequest0[SAKENoN(NATD_S_IP)N(NATD_D_IP)N(FRAG_SUP)]
07[IKE]192.168.1.9isinitiatinganIKE_SA
07[CFG]selectedproposal:IKE:AES_CBC_128/AES_XCBC_96/PRF_AES128_XCBC/MODP_2048
07[ENC]generatingIKE_SA_INITresponse0[SAKENoN(NATD_S_IP)N(NATD_D_IP)N(FRAG_SUP)N(CHDLESS_SUP)N(MULT_AUTH)]
07[NET]sendingpacket:from192.168.1.10[500]to192.168.1.9[40844](456bytes)
08[NET]receivedpacket:from192.168.1.9[40844]to192.168.1.10[500](348bytes)
08[ENC]unknownattributetype(16386)
08[ENC]parsedIKE_AUTHrequest1[IDiIDrCPRQ((16386)DNS6DNS6ADDR6)SATSiTSr]
08[CFG]lookingforpeerconfigsmatching192.168.1.10[ims].192.168.1.9[0310261111111111@nai.epc.mnc260.mcc310.3gppnetwork.org]
08[CFG]nomatchingpeerconfigfound
08[ENC]generatingIKE_AUTHresponse1[N(AUTH_FAILED)]
08[NET]sendingpacket:from192.168.1.10[500]to192.168.1.9[40844](76bytes)還有我的IMSI,發送給任何控制Wi-Fi 網絡、DNS 和VPN 服務器的對手。
基於Wi-Fi 搭建一個VoLTE/VoWiFi 環境對VoLTE/VoWiFi 的研究不需要昂貴的設備!通過使用免費軟件設置你自己的Wi-Fi 呼叫服務器,了解VoLTE/VoWiFi 的工作原理。
我會在本文中向你展示如何接管越獄iPhone 上的Wi-Fi 通話,並將其集成到本地電話撥號器和短信應用程序中,就像真正的運營商一樣。
我的最終目標是發行我自己的SIM 卡,通過Wi-Fi 將任何越獄或未越獄的手機連接到我的電話網絡。
VoLTE 和Wi-Fi 通話基於IPsec/IKEv2 和SIP 等開放標準,因此我們的電話網絡將使用免費軟件構建:
iPhone - 越獄調整以重定向Wi-Fi 呼叫- 我的Docker 容器- StrongSwan - Kamailio;
檢查VoWiFi要了解VoLTE 和VoWiFi,首先要在你撥打電話或發送SMS 時捕獲手機的流量。
你只需要一部iPhone 和一台裝有Xcode 和Wireshark 的Mac。
Xcode 提供了rvictl 工具來捕獲來自iPhone 的所有網絡流量,無需越獄。
如果你沒有Mac,gh2o 的rvi_capture 可以在Linux 和Windows 上捕獲。
所有電話和運營商之間的SIP消息是可見的,完全不加密。你可以看到當你撥打另一個電話時會發生什麼:
或者你如何接收短信:
在VoWiFi 上,你甚至可以轉儲實際的語音編解碼器數據包。
此外,iPhone 還提供來自VoWiFi ePDG VPN 隧道和SMS 處理的日誌:
在Mac 上打開控制台應用程序,過濾到CommCenter,然後啟用“操作- 包含信息消息/包含調試消息”。然後,過濾CommCenter 以獲取VoLTE/VoWiFi 消息,例如此IKEv2 握手:
建立自己的電話網絡如果你不想只查看VoLTE/VoWiFi 數據包怎麼辦?如果你想建立自己的網絡怎麼辦?為此,你需要一個越獄的iPhone 和一個Docker 容器。
我在iOS 14.1 上使用帶有Verizon SIM 卡的越獄iPhone 12。
如果你使用的是Android,則搭載Android 10 及更高版本的設備(所有2020 年或更高版本的設備)可能會在沒有root 的情況下重定向Wi-Fi 呼叫,但我還沒有嘗試過。
重定向ePDG 連接我們的目標是VoWiFi(Wi-Fi 通話),因為運行VoLTE 網絡需要至少150 美元的收音機,並獲得LTE頻率的廣播許可。 Wi-Fi 不需要任何特殊的硬件或繁文縟節。
Wi-Fi 通話使用IPsec/IKEv2 VPN 隧道進行保護,並使用EAP-AKA 進行身份驗證,它使用SIM 卡上只有運營商知道的密鑰。
由於我沒有空白SIM 卡,我編寫了一個越獄插件,用簡單的預共享密鑰(密碼)身份驗證替換SIM 卡檢查。
要運行調整,你需要:
越獄你的手機並安裝Substrate 或其他方法掛鉤平台;
設置Theos;
複製RedirectVoWiFiTweak;
將服務器地址指向你的VoWiFi 服務器的地址;
安裝包;
將你的手機置於飛行模式,然後啟用Wi-Fi通話(設置-蜂窩- Wi-Fi通話);
最終結果:VoWifi 隧道為你的IPsec/IKEv2 VPN 服務器創建了一個VPN,而不是Verizon 的。
我是如何構建調整的iPhone 在用戶空間中運行整個VoLTE/VoWiFi 堆棧:通過越獄,我們可以做任何事情。但是,我的最終目標是在未越獄的手機上使用自定義SIM 卡進行這項工作,所以我只做了最小的更改。
ePDG 只是一個IPsec/IKEv2 VPN 隧道,在SIM 卡上具有EAP-AKA 身份驗證。要禁用EAP-AKA 身份驗證並切換到PSK:
我運行nm CommCenter,看到它正在使用NEIPSecIKECreateSessionWithInterface啟動VPN隧道;
我在NetworkExtensions中找到了這個符號,並在Ghidra中分解了它;
它是一個包裝器-[NEIKEv2Session
initWithIKEConfig:firstChildConfig:sessionConfig:queue:ipsecInterface:ikeSocketHandler:ssession:packetDelegate:]';我鉤住了那個方法,並刪除了參數;
我用PSK 在Mac 上創建了另一個IPsec/IKEv2 隧道;
我附加到macOS 的VPN 實現:
lldb-nNEIKEv2Provider-w
binitWithIKEConfig:firstChildConfig:sessionConfig:queue:ipsecInterface:ikeSocketHandler:saSession:packetDelegate:我將其參數與VoLTE ePDG隧道進行了比較,以了解macOS如何設置PSK;
我為PSK設置了相同的標誌;
這是我第一次調試iPhone,結果如下:
dlevi309 向我發送拉取請求以自動重啟CommCenter;
hbkirb 將我指向HearseDev 的Theos 徽標語言的clang 格式包裝器;
用到的資源如下:
Kanns103 的調整開髮指南;
elihwyma 的commcenterpatch13,它也掛鉤了CommCenter;
擁有StrongSwan 和Kamailio 的Wi-Fi 呼叫服務器
用一個電話與兩個服務通話來建立VoWifi:
ePDG,一個IPsec/IKEv2 VPN 服務器,我們使用StrongSwan;
P-CSCF,一個SIP VoIP 服務器,我們使用Kamailio;
我用兩個預裝做了一個Docker容器。
在macOS 12.1/Mac Mini 2020 (M1)/Docker for Mac 上測試。
首先,如果你不在Verizon 上,請在配置中更改IMS 域。你可以通過使用rvictl 捕獲SIP REGISTER 請求來查找域。
然後,運行:
dockercomposebuild
dockercomposeup等待來自電話的連接:
12[IKE]IKE_SAikev2-vpn-iphone[4]establishedbetween172.19.0.2[ims].172.19.0.1
12[IKE]IKE_SAikev2-vpn-iphone[4]statechange:CONNECTING=ESTABLISHED然後嘗試向手機發送短信:
ssh-p22222root@localhost
Password:vowifi
$encodesms1555444333319085823275'hello'將
或緊急警報:
$encodesms_cdmaemerg19085823275'duckandcover'或者打個電話:
$baresip
/uanewsip:+15554443333@localhost
/dialsip:+19085823275@localhost甚至嘗試在你自己的網絡上複製Purdue大學研