(U) Sniffing Proprietary 2.4GHz Signals
使用HackRF或者RTL-SDR加變頻器,那是極好的,但是我最終需要把所有東西都打包到一個(gè)小空間里面。
可參考另一個(gè)頁(yè)面:Travis Goodspeed, 作者不僅嗅探了類似的鍵盤(Microsoft Comfort Desktop 5000), 還演示了怎么樣用他的一個(gè)叫GoodFET的設(shè)備和python的腳本goodfet.nrf,去讓 nRF24L01+ 芯片嗅探 2.4GHz 的數(shù)據(jù).
Travis發(fā)現(xiàn)嗅探該設(shè)備存在多個(gè)難點(diǎn),不僅現(xiàn)在需要指定頻道(頻率),而且還需要指定MAC地址。nRF芯片只提供發(fā)送到指定MAC地址的數(shù)據(jù)包。此外,nRF芯片不會(huì)發(fā)送MAC地址數(shù)據(jù),因?yàn)槟阋呀?jīng)指定了 (在RX_ADDR_P[0-5]6個(gè)管道中的一個(gè)
)。
Travis發(fā)現(xiàn)在指定MAC長(zhǎng)度的時(shí)候,在手冊(cè)中為SETUP_AW,當(dāng)設(shè)置為‘0’的時(shí)候被認(rèn)為是非法的,
'00' - Illegal
'01' - 3 bytes
'10' - 4 bytes
'11' – 5 bytes
但是實(shí)際設(shè)置MAC地址為兩個(gè)字節(jié),并且把MAC設(shè)置在preamble的位置(0x00AA or 0x0055, in binary 0000000010101010 or 0000000001010101
), 就能欺騙設(shè)備在數(shù)據(jù)部分首先提供完整的MAC地址給我們,請(qǐng)參考這篇碉堡了的文章學(xué)習(xí)具體細(xì)節(jié)。
(U) Increasing Speed and Portability
雖然現(xiàn)在我們可以使用GoodFET,電腦加nRF24L01+來(lái)做嗅探測(cè)試,但是最終我們還是希望能夠用一套便宜的嵌入式設(shè)備來(lái)實(shí)現(xiàn)此功能。我們可以使用Travis的研究成果,使用在微控制器+嵌入式C程序來(lái)實(shí)現(xiàn)所有功能。
另外,我們做了一些改進(jìn)。 Goodfet.nrf 告訴我們?cè)鯓訏呙栉覀兿胍O(jiān)聽(tīng)的設(shè)備:
- 頻率從 2400MHz開(kāi)始
- 設(shè)置數(shù)據(jù)速率為 1Mbps 以及MAC為0x00AA,監(jiān)聽(tīng)10秒鐘
- 設(shè)置數(shù)據(jù)速率為 2Mbps 以及MAC為0x00AA,監(jiān)聽(tīng)10秒鐘
- 設(shè)置數(shù)據(jù)速率為 1Mbps 以及MAC為0x0055,監(jiān)聽(tīng)10秒鐘
- 設(shè)置數(shù)據(jù)速率為 2Mbps 以及MAC為0x0055,監(jiān)聽(tīng)10秒鐘
- 逐步增加頻率值,直到2528MHz再返回從2400MHz開(kāi)始循環(huán) (128個(gè)頻率值)
- 要找到一個(gè)潛在的鍵盤設(shè)備,我們需要至少四個(gè)包,以滿足閾值確保是個(gè)合法的數(shù)據(jù)包,防止誤報(bào)。
這意味著掃描一個(gè)完整的頻率范圍需要大約85分鐘,(and at least several keystrokes must be pressed while we're sniffing within the correct 10 second period. ) 在仔細(xì)學(xué)習(xí)了Travis的研究,KeyKeriki 的項(xiàng)目,以及測(cè)試了我的鍵盤,我們可以做一些改進(jìn):
- 查閱 FCC,鍵盤只需要用到 2403 - 2480MHz的范圍,直接從128個(gè)頻率減少到了78個(gè)頻率 (節(jié)省40%)
- 所有鍵盤使用2Mbps,又減少一半時(shí)間。
- 在檢查了很多鍵盤之后,我發(fā)現(xiàn)所有的微軟鍵盤的MAC地址都是以0xCD開(kāi)始的,因此我們的preamble永遠(yuǎn)是
0xAA (10101010)
, after inspecting more keyboards, I found that all Microsoft keyboards begin with 0xCD as the MAC, which tells us that our preamble will always be0xAA (10101010)
因?yàn)?xAA后面永遠(yuǎn)跟的是1 (0xCD 二進(jìn)制 11001101
)以保持比特位交替,這樣又加快了一倍的搜索速度。 - 因?yàn)槲覀冎繫AC地址的第一位 (0xCD), 我們也知道需要什么樣的數(shù)據(jù)包, 我們只需要檢查某個(gè)確認(rèn)的數(shù)據(jù)包,就能知道這是一個(gè)我們要找的鍵盤設(shè)備。
- 我們把每個(gè)頻率掃描時(shí)間降低到500毫秒,從而把整個(gè)掃描一輪的時(shí)間降低到40秒。
(U) Decrypting Keystrokes
Thorsten Schröder 和 Max Moser 設(shè)計(jì)了一個(gè)碉堡了的東東 KeyKeriki, 能夠監(jiān)聽(tīng)微軟鍵盤,完全逆向了解密的過(guò)程并且做了個(gè)設(shè)備能夠完全實(shí)現(xiàn)這些。然而,他們的設(shè)備需要兩個(gè)無(wú)線電和一個(gè)高端微處理器,來(lái)捕獲和解析以2Mbps通信的鍵盤設(shè)備產(chǎn)生的數(shù)據(jù)。Travis的項(xiàng)目雖然牛逼,但是需要一臺(tái)電腦主機(jī),而且對(duì)于我們秘密執(zhí)行任務(wù),這套設(shè)備還是太大了,因此我們改進(jìn)了設(shè)計(jì),現(xiàn)在只需要一個(gè)廉價(jià)無(wú)線電和一個(gè)微處理器,功耗低而且體積小,不再需要電腦和其他無(wú)線電設(shè)備。
Thorsten 和 Max 發(fā)現(xiàn)這個(gè)擊鍵只是使用ECB模式簡(jiǎn)單的和MAC地址異或加密 , 我們可以使用Travis的方法利用nRF24L01+來(lái)嗅探和獲取MAC地址,這種加密方法相當(dāng)于只是把撲克牌切了一次。
經(jīng)過(guò)進(jìn)一步調(diào)查發(fā)現(xiàn),我們現(xiàn)在知道所有微軟鍵盤的MAC地址都是以0xCD開(kāi)始的,實(shí)際按鍵(下圖橙色部分)恰好與MAC地址第一個(gè)字節(jié)對(duì)齊,這就是說(shuō)即使我們不知道完整的MAC地址,我們依然能夠解密按鍵消息,因?yàn)檫@個(gè)對(duì)齊是不會(huì)變的,MAC地址開(kāi)頭一個(gè)字節(jié)0xCD也是不變的。
由于數(shù)據(jù)包加密部分的長(zhǎng)度是11個(gè)字節(jié),而MAC地址占5個(gè)字節(jié),CRC校驗(yàn)是每個(gè)字節(jié)做,異或(加密前),你會(huì)發(fā)現(xiàn)一些有意思的事情,由于MAC地址被異或了兩次,我們能夠在不需要知道完整MAC地址的情況下計(jì)算校驗(yàn)值,這是因?yàn)镸AC被異或兩次,就相當(dāng)于什么都沒(méi)做,而第11個(gè)字節(jié)又是MAC地址的第一個(gè)字節(jié),我們知道是0xCD。根據(jù)這個(gè)特性我們可以進(jìn)行一些其他的攻擊,比如更改按鍵和CRC校驗(yàn),同樣不需要知道MAC地址,這將會(huì)在我以后的項(xiàng)目做相關(guān)演示。
KeyKeriki 項(xiàng)目中的一頁(yè)演示了解密過(guò)程:
- Device type 0x0A = keyboard, 0x08 = mouse
- Packet type 0x78 = keystroke, 0x38 = idle (key is held down)
- Model type 0x06 = keyboard? This is the same HID code for a keyboard
- HID code 0x05 = letter 'b' (described in section 7 here)
KeySweeper的解密部分代碼:
// decrypt those keyboard packets!
void decrypt(uint8_t* pkt)
{
// our encryption key is the 5-byte MAC address and
// starts 4 bytes in (4-byte header is unencrypted)
for (int i = 4; i < 15; i++)
pkt[i] ^= mac >> (((i - 4) % 5) * 8) & 0xFF;
}
原文:KeySweeper