[IoT Pentest] Truy cập và đặt lại mật khẩu Router qua giao tiếp UART
IoT hay Internet vạn vật đang là một lĩnh vực được rất được quan tâm. Nhưng bên cạnh những lợi ích, IoT đặt ra các thách thức về bảo mật không hề nhỏ cho doanh nghiệp, tổ chức. Chính vì vậy, lĩnh vực bảo mật trên các thiết bị IoT sẽ là cơ hội nghề nghiệp cho các bạn trẻ với mức đãi ngộ rất cao.
Bài viết này sẽ hướng dẫn cách truy cập vào thiết bị một thiết bị Router ADSL (phiên bản khá cũ, phổ biến ở Việt Nam nhiều năm trước) thông qua giao tiếp UART, đây cũng là một trong những kiến thức cơ bản nếu 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, chúng ta tiến hành mở vỏ của thiết bị để xem các bo mạch bên trong. 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.
Xác định chân GDN
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.
Yêu cầu:
Ngắt nguồn điện vào thiết bị.
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.
Xác định các chân VCC, TX, RX
Sau khi đã xác định được chân GDN, chúng ta tiến hành xác định các chân VCC, TX, RX. Các bước tiến hành như sau:
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. Video đo TX
Kết quả các UART Pin tìm thấy như sau
Giao tiếp với UART
Trong bài viết này tác giả sử dụng mạch USB UART Converter CP2102 để chuyển tín hiệu từ UART vào máy tính qua cổng USB
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ác giả 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
- Khi giao tiếp với tín hiệu Serial, phần quan trọng nhất là Baud Rate giữa 2 thiết bị phải giống nhau. 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). 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. 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.
Tác giả: Hoang Doan – Pentester, VietSunshine Pentest Team.