Trò chuyện với ADSL Router qua UART

Cuối tuần vừa rồi trong lúc dọn dẹp kho đồ cũ tôi phát hiện con ADSL Router Huawei SmartAX MT880 phiên bản thập niên trước, hiện tại có thể vẫn còn phổ biến trong mấy vựa ve chai. 
Router sau khi lau sạch bụi

Cũng lúc rảnh rỗi nên cấm nguồn, cáp mạng vào kiểm tra thử, không may là nó vẫn còn chạy tốt, xui là quên mất mật khẩu truy cập vào để quản lý.




Sẵn máu vọc phá nên quyết định Reset lại mật khẩu của nó bằng một cách khá khổ là thông qua giao tiếp UART. Bài viết này ghi chú lại quá trình tôi Reset lại mật khẩu cho con Router này, hi vọng những kiến thức cơ bản và chấp vá mà tôi đề cập sẽ giúp ít cho các bạn muốn bắt đầu tìm hiểu về bảo mật trên các thiết bị phần cứng, IoT.


Đầu tiên mở hộp thiết bị để xem các mạch bên trong, kinh nghiệm từ thời sinh viên tôi thường tự unbox và làm hỏng biết bao nhiêu cái laptop chỉ với một cây tua vít rẻ tiền, nên unbox con này cũng không mấy khó khăn.


Thông thường các thiết bị Router hoặc Camera thường dùng cho gia đình sẽ cung cấp truy cập Console để quản lý thiết bị thông qua giao tiếp UART, giúp ích cho các quản trị viên hoặc nhà sản xuất truy cập trực tiếp vào thiết bị để kiểm tra trong trường hợp có sự cố không thể truy cập từ xa. Nhưng khi cung cấp các sản phẩm phần cứng ra thị trường, trên bo mạch thường sẽ không in các thông tin kết nối lên Board mạch, để hạn chế các truy cập trái phép vào thiết bị.

Các kết nối UART thường gôm lại 1 nhóm gồm 3 hoặc 4 Pin, nếu quan sát trên Board ta sẽ thấy một nhóm 4 Pin có vẻ khả nghi


Giả sử đây là các Pin của UART, ta sẽ lần lượt xác định đâu là GND, VCC, TX, RX. Đặt tên các Pin chưa biết lần lượt là 1, 2, 3, 4.

Tìm chân GND


Trước tiên nhất phải tìm GND (tham chiếu nối đất) để tạo các kết nối đúng, tránh gây ra các sai sót về điện áp lúc làm việc.

  • Ngắt nguồn điện vào thiết bị, quên bước này có nguy cơ sẽ bán ve chai luôn cái Router khỏi cần làm các bước kế tiếp.
  • Chuyển chế độ của đồng hồ đo sang Diode Test

Chú ý giá trị “1” là khi giữa 2 kết nối không thông nhau.
  • Lần lượt đo mỗi Pin với tất cả các Pin còn lại. Pin nào cho ra giá trị khác “1” khi đo với tất cả các Pin còn lại thì đó chính là Pin GND.
Ví dụ đo Pin (1), thử giữa 2 Pin là (1) và (4) không thông, vì vậy (1) không phải là GND


Kết quả thử chỉ duy nhất Pin (2) thông với tất cả Pin còn lại, nên đây là Pin GND

Tìm các chân VCC, TX, RX


  • Cấp nguồn vào thiết bị (ở đây là 12V).
  • Chuyển đồng đồ đo sang thang đo điện áp, chỉnh thông số Max là 20 Volt. Kết nối Pin (2) (tương ứng GND) vào cực âm của đồng đồ.
  • Lần lượt kết nối cực dương của đồng hồ vào từng Pin (1)/(3)/(4), khởi động thiết bị vào quan sát kỹ giá trị đồng hồ đo.

Pin (4) luôn giá trị điện áp rất nhỏ (dưới 1V). Đây sẽ là RX vì phải có tín hiệu gửi vào thiết bị thì Pin này mới thay đổi điện áp, còn lại sẽ luôn ở mức thấp.

  • Còn 2 Pin còn lại là (1) và (3) sau khi thiết bị khởi động ta thấy luôn có mức điện áp cao trong khoảng 3.36 ~ 3.41 Volt. Để phân biệt TX và VCC, ta sẽ giả sử như sau:
Pin VCC là nơi cấp nguồn, vì vậy điện áp sẽ có giá trị ổn định ngay khi vừa mở nguồn thiết bị đến sau khi thiết bị khởi động thành công. Ở đây ta tìm thấy Pin (3) thỏa điều kiện này, điện áp luôn ở mức 3.36 ~ 3.41 Volt, nên đây khả năng rất cao là VCC.


Pin TX là nơi gửi tín hiệu, thông thường quá trình khởi động sẽ xuất ra rất nhiều tín hiệu đến Console. Các tín hiệu Serial là các mức điện áp khác nhau, sẽ thay đổi liên tục, vì vậy điện áp ở Pin TX sẽ có biến đổi trong lúc thiết bị khởi động. Pin (1) thỏa điều kiện này, quá trình khởi động thiết bị mức điện áp trên (1) dao động trong một khoảng khá lớn 2.6 ~ 3.4 Volt, nên đây sẽ là TX.



Kết quả các UART Pin tìm thấy như sau


Giao tiếp với UART


Sử dụng các mạch USB UART Converter để chuyển tín hiệu từ UART vào máy tính qua cổng USB, ở đây tôi dùng mạch CP2102



Sơ đồ kết nối như sau từ UART Pin của thiết bị đến CP2102 như sau, chú ý kết nối giữa TX và RX:


Sử dụng một chương trình đọc Console như MiniCom (trên Linux), ở đây tôi dùng Arduino IDE trên Windows (do có sẵn trong máy) để tương tác với UART

Xác định cổng COM ảo của thiết bị CP2102, ở đây là COM6 hiển thị trong Device Manager


Trong Arduino IDE chọn Menu Tool, Port là “COM6”, sau đó chọn Serial Monitor để mở công cụ giao tiếp với Serial Port



Câu "Đúng người, sai thời điểm" có vẻ hợp lý khi nói đến giao tiếp với tín hiệu Serial mà chọn sai Baud Rate. Baud Rate hiểu đơn giản là số lượng Bits có thể trao đổi giữa 2 thiết bị trong 1 giây, đơn vị là bps (bits-per-second), hai thiết bị gửi nhận phải trao đổi trên cùng Baud Rate mới có thể hiểu nhau.

Ví dụ Baud Rate 9600 có thể mô tả như sau


Chọn sai Baud Rate giữa đầu gửi và nhận sẽ không thể giao tiếp được, vì khoảng thời gian lấy mẫu điện áp khác nhau sẽ tạo ra những Bits giá trị khác nhau (Encoding / Decoding).

Một số giá trị Baud Rate tiêu chuẩn cho các thiết bị điện tử là 1200, 2400, 4800, 19200, 38400, 57600, 115200, 128000, 256000. Trong trường hợp không có thông tin về Baud Rate của thiết bị cần kết nối, ta phải thử hết lần lượt các giá trị chuẩn để tìm được giá trị phù hợp.


Chọn Baud Rate sai sẽ không có phản hồi hoặc trả về các giá trị không có ý nghĩa, ví dụ khi chọn 19200


Ở trường hợp Router ta đang kiểm tra, chỉ khi chọn Baud Rate là 38400 mới có kết quả phản hồi từ thiết bị và đọc được dưới dạng ASCII, nên 38400 là giá trị cần tìm.


Các thiết bị viễn thông thường hỗ trợ lệnh help để hiển thị các lệnh hỗ trợ quản lý thiết bị, thử gõ lệnh help ta được kết quả như sau


Như hướng dẫn ta có thể dùng lệnh passwd để cập nhật lại mật khẩu tài khoản admin, ở đây sẽ đặt là 123456



Kết nối máy tính với Router qua cổng Ethernet, đặt IP cùng lớp 192.168.1.0/24 với thiết bị. Thử truy cập thiết bị qua địa chỉ 192.168.1.1, sử dụng mật khẩu mới 123456

- Telnet thành công


Web UI Management



Như vậy là ta đã Reset được mật khẩu thành công bằng cách sử dụng giao tiếp UART. Có thể thử Reboot lại thiết bị Router và quan sát Output trên công cụ Serial Monitor




Như ta thấy, quá trình khởi động thiết bị gửi Output liên tục qua cổng TX và hiển thị lên Serial Monitor, mô tả các giai đoạn khởi động.

Nhận xét

Bài đăng phổ biến từ blog này

CVE-2019-12839: Lỗ hổng thực thi mã lệnh tùy ý trên OrangeHRM CMS

[Steganography] Kỹ thuật che dấu thông tin - Phần 2

PHP Race Condition Vulnerability Example