前幾天手機免密碼登入 Google 帳號文章跟讀者討論到手機與電腦間的藍牙究竟只做為距離判斷或是會用來傳輸 WebAuthn 協定,突發奇想,不如監聽一下藍牙封包見真章。

查了網路,倒也不難,買個 nRF52840 USB Dongle 配 Wireshark 即可比照無線線卡抓封包,零件大約 500 有找。但要上網訂有點麻煩,手邊的 ESP32 內建藍牙模組,能不能直接用它抓呢?

Google 了一下,找到一個散發黑暗氣息的開源專案 - ESP Marauder。基本上它是個 WiFi 及藍牙訊息分析工具,能擷取封包、掃瞄裝置,還被加入一些邪惡功能,像是可以發送訊號癱瘓無線網路。它比較常見的型式是附上 2.8" 觸控螢幕、電池跟 SD 卡,並有外接天線,方便攜帶使用:

thumbnail
照片來源

我只想觀察藍牙訊息,不用這麼搞剛,就拿上週剛做好的ESP32 觸控式簡報遙控器 PoC改刷 ESP32 Marauder,什麼週邊都不用接,使用 COM 埠下指令操作:

thumbnail

刷好軟體用 Putty 連上就能下指令掃 WiFi 基地台、客戶端 MAC、藍牙裝置等,但它的 CLI 介面不太友善,指令不是按 Enter 結束,而要在一定時間內敲完,不能遲疑不能打錯字。另外,掃瞄藍牙的結果顯示沒換行,東西都擠在一起不易閱讀:

之前玩 ESP32 控制 PWM 風扇時學會 C# 程式可用 SerialPort 類別讀寫 COM Port,就寫幾行程式做個友善介面。

using System.Text;
using System.Text.RegularExpressions;
using System.IO.Ports;

var sb = new StringBuilder();
var sniffing = false;
Debouncer debouncer = new Debouncer(500);
var agent = new MarauderBTSniffingAgent("COM4", 
    (msg) => {
        if (!sniffing) 
            Console.Write(msg);
        else 
        {
            sb.Append(msg);
            // 同一行內容可能分兩次送到,使用 debounce 技巧,等 0.5 秒沒新資料再處理
            debouncer.Debounce(() => 
            {
                foreach (var p in Regex.Split(sb.ToString(), "RSSI:").Skip(1))
                {
                    if (!string.IsNullOrWhiteSpace(p))
                    {
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        Console.WriteLine("RSSI:" + Regex.Replace(p, "Device: [0-9a-f:]{12}", "Device: *masked*:"));
                        Console.ResetColor();
                    }
                }
                sb.Clear();
            });
        }
    }
);

string command = "";
while ((command = Console.ReadLine()) != null) { 
    if (command == "start") {
        agent.Start();
        sniffing = true;
    }
    else if (command == "stop") {
        agent.Stop();
        sniffing = false;
    }
    else if (command == "reboot") {
        agent.Reboot();
        sniffing = false;
    }
    else if (command == "exit") {
        break;
    }
    else {
        Thread.Sleep(1000);        
    }
}

public class Debouncer
{
    private Timer timer;
    private readonly int interval;

    public Debouncer(int interval)
    {
        this.interval = interval;
    }

    public void Debounce(Action action)
    {
        timer?.Dispose();
        timer = new Timer(x => action(), null, interval, Timeout.Infinite);
    }
}

public class MarauderBTSniffingAgent
{
    private SerialPort _serPort = null!;
    Action<string> msgCallback;
    public MarauderBTSniffingAgent(string portName, Action<string> msgCallback)
    {
        this.msgCallback = msgCallback;
        _serPort = new SerialPort(portName, 115200);
        _serPort.Open();
        _serPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
    }
    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        => msgCallback(((SerialPort)sender).ReadExisting());        
    public void Start() => SendCommand("sniffbt");
    public void Stop() => SendCommand("stopscan");
    public void Reboot() => SendCommand("reboot");

    private void SendCommand(string command) => _serPort.WriteLine(command);
    public void Close() => _serPort.Close();
}

測試成功,有掃到藍牙狀置。但我發現它是以電腦或手機的角度去尋找可用藍牙裝置,不是我所想像會攔截看到的封包,故可能還是買 nRF 模組配合 Wireshark 會比較方便。

好奇心驅使,順便試了它提供的 attack 指令,三兩下讓家裡的基地台(Access Point)無法使用,感覺有點小可怕。(請家庭成員配合實驗,展示完畢,大家露出驚訝、敬畏但又帶點厭惡的表情,十分微妙。彷彿我是個很厲害的髒東西,最好離我遠點)

補充了一下資安知識,這種攻擊手法叫 Wi-Fi Deauthentication Attack,原理是攻擊者假冒受害客戶端 MAC 網址,向 Access Point 送出 802.11 協定中的 Deauthentication Frame,告知其已切斷連線,之後受害客戶端傳送的資料會被拒絕,AP 也會向其發出 Deauthentication 通知,屬於一種 Deny of Service (DoS) 攻擊。

這個手法常被用來將受害者裝置從合法 AP 踢除,誘使其連上假冒 AP,或趁重新連線驗證時竊取密碼,再不然就像 ESP32 Marauder 一樣持續發送讓大家沒得用 。由於原理簡單,有一堆工具(Aircrack-ng Suite, MDK3, Void11, Scapy, Zulu software)可以實現這類攻擊,一些假冒 AP 也都會內建。

唯一的防範之道應是 2009 發佈的 IEEE 802.11w 協定加入的受保護的管理訊框(Protected Management Frames, PMF),新版無線路由器幾乎都有支援,但啟用後應會面臨舊無線網卡可能不支援的問題,就像 IE 一樣,看來又是一場需要時間催化的長期抗戰。

Discover the ESP32 Marauder, a device for WiFi/Bluetooth offensive and defensive tools, and how to integrate it with a .NET program, along with the threats of Wi-Fi Deauthentication Attack.


Comments

Be the first to post a comment

Post a comment