Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86370338

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

首先我會通過三個實驗來學習VoWifi/VoLTE的工作原理:

使用fasferraz 的Python IKEv2/EAP-AKA 實現連接到VoWifi:失敗;

使用Linphone 連接到VoLTE:失敗;

使用Wi-Fi 熱點、假DNS 服務器和VPN 服務器捕獲IMSI:成功;

VoLTE和VoWifi看起來可能很複雜,但要打電話,只需要和兩台電腦進行連接就可以了:

1.1.png

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 的工作原理。

2.1.jpg

我會在本文中向你展示如何接管越獄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消息是可見的,完全不加密。你可以看到當你撥打另一個電話時會發生什麼:

2.2.png

或者你如何接收短信:

2.3.png

在VoWiFi 上,你甚至可以轉儲實際的語音編解碼器數據包。

此外,iPhone 還提供來自VoWiFi ePDG VPN 隧道和SMS 處理的日誌:

在Mac 上打開控制台應用程序,過濾到CommCenter,然後啟用“操作- 包含信息消息/包含調試消息”。然後,過濾CommCenter 以獲取VoLTE/VoWiFi 消息,例如此IKEv2 握手:

2.4.png

建立自己的電話網絡如果你不想只查看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大學研