Tôi đã hack điện thoại Bphone như thế nào ?

Tôi đã hack điện thoại bảo mật hàng đầu VN như thế nào? 😀

Lỗ hổng trong điện thoại BPhone cho phép hacker bẻ khóa chức năng chống trộm

————–

    Những ngày cuối năm 2021, tôi tham gia BPhone Fan Club để hóng hớt thông tin sau vụ ra mắt chiếc tai nghe mấy trăm nghìn ăn đứt tai nghe chục củ. Tính xác thực về chất lượng của tai nghe AirB này như thế nào thì tôi tạm chưa bàn tới ở đây, chỉ có điều là tham gia group này một thời gian, tôi dường như được rõ thêm về định nghĩa: như thế nào là tẩy não. Mặc cho sự thật rành rành nhưng ở trong group này, đen cũng thành trắng, người ta bẻ lái, đánh tráo khái niệm rồi tự thủ dâm tinh thần với nhau. Có những ngày đồng nghiệp hỏi tôi có ổn không, vì cả ngày ko làm việc mà chỉ có ngồi cười như thằng điên, tất cả cũng chỉ là do một vài post của group tinh hoa công nghệ B* kia chòi lên newfeed của tôi …

    Sau đó không lâu, vào ngày 19/12/2021, tập đoàn này tiếp tục ra mắt chiếc điện thoại thần kỳ, với các tính năng CAO CẤP bảo mật cao,  CHỤP ẢNH cực đẹp, GIÁ cực ngon, và là chiếc ĐIỆN THOẠI quốc dân… 

    Xem livestream giới thiệu sản phẩm, tôi cũng thấy chiếc điện thoại này khá hợp lý với người dùng tầm trung tại VN, chỉ tầm 3tr5->6tr đã có thể mua được. Trước đó, mỗi chiếc điện thoại Bphone có giá dao động từ 7-8tr trở lên, vượt quá so với túi tiền của người Việt. Âu cũng là mừng khi có một chiếc điện thoại có thể thay thế VSmart làm điện thoại quốc dân!

    Xem xét tiếp về phần bảo mật của chiếc điện thoại mà đó giờ vẫn luôn được nổ rất to là BẢO MẬT CAO, KHÔNG THỂ BỊ PHÁ VỠ. Tôi đã tự hỏi mình, sau bao nhiêu năm kể từ ngày sản xuất ra chiếc điện thoại “bảo mật” đầu tiên, họ có bao giờ tự kiểm tra lại xem mình “bảo mật” ở chỗ nào chưa. Lý do là vì tầm 3-4 năm trước, khi chiếc Bphone3 ra đời, tôi cũng đã mua 1 chiếc về để nghiên cứu, xem họ “bảo mật” cái gì, “bảo mật” ở chỗ nào, kết quả hồi đó đã khiến tôi thất vọng, chiếc Bphone bị bẻ khóa chức năng chống trộm trong vòng chưa tới 5 giây. 

    Trên FB của CEO NTQ có nói “… có đến 89% khách hàng (Bphone) tìm lại được máy thất lạc“. Và có so sánh với Samsung, Iphone, là tại sao những chiếc Iphone, Samsung kia cũng bị mất mà không thấy ai trả lại cả, rồi lại thủ dâm điện thoại của mình bảo mật cao…

    Theo tôi nghĩ lý do thực sự không chắc đã là do tính năng cao cấp của điện thoại, mà nó nằm ở giá trị của cái điện thoại: “Bạn không thể bị lợi dụng khi bạn vô dụng“.

    Sau 4 năm làm điện thoại, họ vẫn hô hào về chiếc điện thoại BẢO MẬT CAO, tôi cũng thấy làm lạ khi chưa có ai nói về những gì họ thực sự làm. Tôi cũng khá ngứa ngáy trong người nên ngay khi ra mắt đã đặt lấy luôn một chiếc về để kiểm tra xem lỗ hổng tôi đã tìm được 4 năm trước có còn tồn tại hay không. Và cũng không bất ngờ lắm khi nó vẫn còn nguyên trong chiếc điện thoại BẢO MẬT CAO tầm vũ trụ này, kết quả là cũng chỉ mất 5s để vượt qua cơ chế chống trộm của Bphone đời mới nhất.

    Lần này tôi quyết định sẽ không giữ kín thông tin nữa, mà sẽ công khai toàn bộ thông tin về lỗ hổng cũng như cách khai thác để mọi người cùng biết sự thật về chiếc điện thoại BẢO MẬT CAO level vũ trụ này. Tôi cũng đã nghĩ về việc report cho Bkav, tuy nhiên Bkav trả cho mỗi lỗ hổng như này được có tầm 3tr, trong khi tôi mua máy cùng với công cụ cũng đã hết ngót nghét 20tr rồi. 
    ###########################################################################

    ############## Phần kỹ thuật

    ###########################################################################

    Tôi phát hiện lỗ hổng này khá lâu rồi nên không còn nhớ mọi việc bắt đầu như thế nào nữa. Bằng một cách nào đó tôi biết được trên Bphone có một phần mềm tên BMS làm nhiệm vụ bảo vệ và lock máy khi nhận được lệnh báo mất máy từ số điện thoại chủ nhân. 

    Bphone không cung cấp ROM cho người dùng nên tôiextract file apk của BMS từ điện thoại, tôi dùng 3 lệnh sau để pull app từ bphone về:

    “`

        pm list packages | grep bms

        pm path com.bkav.bphone.bms

        adb pull /system/priv-app/BMS/BMS.apk

    “`

    File thu được có hash như sau:

    Dịch ngược app BMS không khó, tôi là một dân tay ngang cũng có thể đọc hiểu code dịch ngược một cách dễ dàng!

    Dựa vào thông tin của file Manifest, tôi biết được một số service/receiver sau có ảnh hưởng tới tính năng chống trộm của Bphone:

    Service BmsFirebaseMessagingService có chức năng gửi yêu cầu đến máy chủ để kiểm tra trạng thái lock của máy và gọi WebAntiTheftUtils.checkAndLock() để lock máy nếu cần thiết.

    Thứ làm tôi thấy thú vị và tò mò đó là họ có quảng cáo Bphone có tính năng chống trộm ngay cả khi điện thoại KHÔNG CÓ INTERNET. Tôi tự hỏi bằng cách nào mà họ có thể kiểm tra trạng thái máy mà KHÔNG CẦN INTERNET? Theo suy đoán của tôi, Bphone giao tiếp với server thông qua tin nhắn SMS để kiểm tra trạng thái lock của máy, mặc dù nó mất thêm chi phí gửi tin nhắn nhưng không đáng là bao.    Và receiver SimStateReceiver chính là đáp án cho câu hỏi trên.       

    Dựa vào thông tin config có thể biết được receiver này sẽ được chạy mỗi lần thay sim hoặc bật máy lên. Mã nguồn của method SimStateReceiver.onReceive() được gọi đến như sau:

    Do điện thoại được thiết kế với 2 SIM nên sẽ có 2 thread được tạo ra để gửi SMS cho mỗi SIM

    Lòng vòng một hồi rồi sẽ gọi ngược về SimStateReceiver.doSendSms(),

    SmsAntiTheft.buildMessage() sẽ tạo ra message để gửi đến server, trong message này bao gồm một số thông tin đã được mã hóa của máy như: chip id, IMEI, … Tất cả các tin nhắn này sẽ được bắt đầu với chuỗi “BMSCS” và được gửi đến một trong các số điện thoại sau.
        – 09680911911        – 0976748888        – 0915026357

    Từ thông tin nhận được, server sẽ kiểm tra xem khách hàng có báo mất máy hay không, nếu có  sẽ trả về một SMS khác để thực hiện lock máy.     Vậy đoạn nhận SMS từ server rồi thực hiện lock máy trên Bphone diễn ra như thế nào? 
    Dĩ nhiên là nó vẫn được thực hiện bởi app BMS của Bphone. Đoạn code xử lý phần này cũng đã được chú ý một chút và obfuscate nên sẽ tốn thêm một chút thời gian đọc hiểu, class này đã được tôi rename thành BmsSMSChecker, bạn đọc có thể tìm class này bằng cách dựa theo string “bms.main.ISpamCheckerService“:

    Class này có method onTransact(), chức năng chính của method này là lắng nghe và đọc TẤT CẢ SMS gửi tới BPhone, rồi xử lý các tác vụ tương ứng (có gửi nội dung đi đâu hay ko thì tôi ko biết). Trong method này có một phần mã nguồn đáng chú ý như sau:     

        Để rõ ràng hơn cho đoạn phân tích phía dưới, tôi xin cung cấp trước một mẫu tin nhắn được nhận từ số điện thoại server (mẫu này tôi lượm đc bên tinhte, có lẽ trước đó cũng đã nhiều người biết chuyện này nhưng không biết chức năng của nó là gì):

BMSCS2

Zoa726rjSxiXzCVLH4gn5JIw3MmtRtCLZBkG+ZTkVBBiTa3Xj0PyvjRkKngmDPUFlRR2pQMsFdb2ZaQmM4cNtpbgyoVrQ1I6g5f7/Rthw+k=

## .     Chương trình KHÔNG KIỂM TRA DANH TÍNH CỦA SENDER, hay brandname như nào, nội dung của SMS vẫn tiếp tục được gửi vào method SmsAntiTheft.handleSms() để xử lý, nếu kết quả là true thì sẽ thực hiện lock máy. Đây chính là thứ chúng ta đang tìm kiếm! Mã nguồn xử lý SMS của method SmsAntiTheft.handleSms() như sau:

    Bước đầu tiên, method này sẽ check xem tin nhắn có bắt đầu bằng chuỗi “BMSCS” hay không, nếu không sẽ ngừng xử lý. Sau khi kiểm tra và cắt bỏ chuỗi BMSCS, method sẽ tiếp tục giải mã đoạn base64 bằng method Utilities.decryptAES(), mã nguồn của method decryptAES như sau:

        Method này đang sử dùng một fixed key và fixed IV để decrypt/encrypt dữ liệu. Mặc dù họ đã cố gắng mã hóa key và IV thêm một lần nữa, nhưng việc giải mã hoàn toàn đơn giản, tôi chỉ cần copy y chang đoạn code trên rồi cho vào chạy là đã có thể lấy được key rồi. Nội dung của AES key và IV sau khi được giải mã như sau:

    Sử dụng các key trên, tôi lấy được nội dung message mà server trả về cho điện thoại. Để tự giải mã message tương tự bạn có thể sử dụng link này https://tinyurl.com/2p9fde46:    

    Nội dung của tin nhắn sau khi được giải mã:    358329011111111|787863|12c05    &&    f:6    fd:7ab40fff43adf528cbec9bc311bbbe70    &&
    Các dòng được phân cách bởi ký tự “\n&&\n“, trong đó, dòng đầu tiên bao gồm các thông tin:         IMEI|code gì đó|GUID

    IMEI bắt buộc phải trùng với device hiện tại để chương trình xử lý tiếp, GUID sẽ được lưu lại vào db của device, nếu GUID đã tồn tại trong máy thì không xử lý tiếp. Chung quy lại ở đây chúng ta cần một IMEI chính xác và một GUID mới để có thể đi tiếp!
    Dòng tiếp theo được xử lý đó là:f:<mã lệnh>(với 6 là khóa máy)fd: <hash của mã mở khóa máy>

     Trong đó, hashedPasscode = md5(“bkis” + real_pass_code + “bkavtulu“), ví dụ md5(“bkis000000bkavtulu”) = 7ab40fff43adf528cbec9bc311bbbe70

       …

    Tóm lại tại bước này, điều kiện và kết quả của kỳ vọng đó là:

        – Chúng ta có một IMEI trùng với device,

        – GUID mới chưa tồn tại trong máy
    Khi thỏa mãn các điều kiện trên, chương trình sẽ tiếp tục gọi SmsAntiTheft.doLock() để thực hiện lock máy với passcode phía trên:

    => Như vậy, dựa vào lỗi KHÔNG KIỂM TRA người gửi và sử dụng FIXED KEY trong mã nguồn, ta hoàn toàn có thể fake một SMS của server và ép Bphone bị lock với passcode bất kỳ.

Tôi đã tạo một con bot Telegram để tạo SMS với passcode mặc định là “000000”, ai có nhu cầu có thể sử dụng tại https://t.me/bphone_bot.

Clip demo:

Nguồn copy tại: https://unlockingbphone.blogspot.com/2022/01/tldr-lo-hong-ton-tai-trong-ien-thoai.html