(U) Sniffing Proprietary 2.4GHz Signals
使用HackRF或者RTL-SDR加變頻器,那是極好的,但是我最終需要把所有東西都打包到一個小空間里面。
可參考另一個頁面:Travis Goodspeed, 作者不僅嗅探了類似的鍵盤(Microsoft Comfort Desktop 5000), 還演示了怎么樣用他的一個叫GoodFET的設備和python的腳本goodfet.nrf,去讓 nRF24L01+ 芯片嗅探 2.4GHz 的數(shù)據(jù).
Travis發(fā)現(xiàn)嗅探該設備存在多個難點,不僅現(xiàn)在需要指定頻道(頻率),而且還需要指定MAC地址。nRF芯片只提供發(fā)送到指定MAC地址的數(shù)據(jù)包。此外,nRF芯片不會發(fā)送MAC地址數(shù)據(jù),因為你已經(jīng)指定了 (在RX_ADDR_P[0-5]6個管道中的一個
)。
Travis發(fā)現(xiàn)在指定MAC長度的時候,在手冊中為SETUP_AW,當設置為‘0’的時候被認為是非法的,
'00' - Illegal
'01' - 3 bytes
'10' - 4 bytes
'11' – 5 bytes
但是實際設置MAC地址為兩個字節(jié),并且把MAC設置在preamble的位置(0x00AA or 0x0055, in binary 0000000010101010 or 0000000001010101
), 就能欺騙設備在數(shù)據(jù)部分首先提供完整的MAC地址給我們,請參考這篇碉堡了的文章學習具體細節(jié)。
(U) Increasing Speed and Portability
雖然現(xiàn)在我們可以使用GoodFET,電腦加nRF24L01+來做嗅探測試,但是最終我們還是希望能夠用一套便宜的嵌入式設備來實現(xiàn)此功能。我們可以使用Travis的研究成果,使用在微控制器+嵌入式C程序來實現(xiàn)所有功能。
另外,我們做了一些改進。 Goodfet.nrf 告訴我們怎樣掃描我們想要監(jiān)聽的設備:
- 頻率從 2400MHz開始
- 設置數(shù)據(jù)速率為 1Mbps 以及MAC為0x00AA,監(jiān)聽10秒鐘
- 設置數(shù)據(jù)速率為 2Mbps 以及MAC為0x00AA,監(jiān)聽10秒鐘
- 設置數(shù)據(jù)速率為 1Mbps 以及MAC為0x0055,監(jiān)聽10秒鐘
- 設置數(shù)據(jù)速率為 2Mbps 以及MAC為0x0055,監(jiān)聽10秒鐘
- 逐步增加頻率值,直到2528MHz再返回從2400MHz開始循環(huán) (128個頻率值)
- 要找到一個潛在的鍵盤設備,我們需要至少四個包,以滿足閾值確保是個合法的數(shù)據(jù)包,防止誤報。
這意味著掃描一個完整的頻率范圍需要大約85分鐘,(and at least several keystrokes must be pressed while we're sniffing within the correct 10 second period. ) 在仔細學習了Travis的研究,KeyKeriki 的項目,以及測試了我的鍵盤,我們可以做一些改進:
- 查閱 FCC,鍵盤只需要用到 2403 - 2480MHz的范圍,直接從128個頻率減少到了78個頻率 (節(jié)省40%)
- 所有鍵盤使用2Mbps,又減少一半時間。
- 在檢查了很多鍵盤之后,我發(fā)現(xiàn)所有的微軟鍵盤的MAC地址都是以0xCD開始的,因此我們的preamble永遠是
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)
因為0xAA后面永遠跟的是1 (0xCD 二進制 11001101
)以保持比特位交替,這樣又加快了一倍的搜索速度。 - 因為我們知道MAC地址的第一位 (0xCD), 我們也知道需要什么樣的數(shù)據(jù)包, 我們只需要檢查某個確認的數(shù)據(jù)包,就能知道這是一個我們要找的鍵盤設備。
- 我們把每個頻率掃描時間降低到500毫秒,從而把整個掃描一輪的時間降低到40秒。
(U) Decrypting Keystrokes
Thorsten Schröder 和 Max Moser 設計了一個碉堡了的東東 KeyKeriki, 能夠監(jiān)聽微軟鍵盤,完全逆向了解密的過程并且做了個設備能夠完全實現(xiàn)這些。然而,他們的設備需要兩個無線電和一個高端微處理器,來捕獲和解析以2Mbps通信的鍵盤設備產(chǎn)生的數(shù)據(jù)。Travis的項目雖然牛逼,但是需要一臺電腦主機,而且對于我們秘密執(zhí)行任務,這套設備還是太大了,因此我們改進了設計,現(xiàn)在只需要一個廉價無線電和一個微處理器,功耗低而且體積小,不再需要電腦和其他無線電設備。
Thorsten 和 Max 發(fā)現(xiàn)這個擊鍵只是使用ECB模式簡單的和MAC地址異或加密 , 我們可以使用Travis的方法利用nRF24L01+來嗅探和獲取MAC地址,這種加密方法相當于只是把撲克牌切了一次。
經(jīng)過進一步調(diào)查發(fā)現(xiàn),我們現(xiàn)在知道所有微軟鍵盤的MAC地址都是以0xCD開始的,實際按鍵(下圖橙色部分)恰好與MAC地址第一個字節(jié)對齊,這就是說即使我們不知道完整的MAC地址,我們依然能夠解密按鍵消息,因為這個對齊是不會變的,MAC地址開頭一個字節(jié)0xCD也是不變的。
由于數(shù)據(jù)包加密部分的長度是11個字節(jié),而MAC地址占5個字節(jié),CRC校驗是每個字節(jié)做,異或(加密前),你會發(fā)現(xiàn)一些有意思的事情,由于MAC地址被異或了兩次,我們能夠在不需要知道完整MAC地址的情況下計算校驗值,這是因為MAC被異或兩次,就相當于什么都沒做,而第11個字節(jié)又是MAC地址的第一個字節(jié),我們知道是0xCD。根據(jù)這個特性我們可以進行一些其他的攻擊,比如更改按鍵和CRC校驗,同樣不需要知道MAC地址,這將會在我以后的項目做相關演示。
KeyKeriki 項目中的一頁演示了解密過程:
- 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