Tuần trước tụi mình có cơ hội trên tay chiếc USB 2.0 8GB bảo mật có bằng sáng chế tại Việt Nam. Lúc đầu chỉ định xài thử, nhưng nghe quả giá hơn 800k thì vọc ngay xem nó có worth với cái giá trên hay không?
Giới thiệu
USB này được BQP cấp bằng sáng chế và vừa mới được thương mại hóa, trước đó đã sử dụng trong quân đội nhiều năm nên mình cũng không nghĩ kiếm chác được gì. Nhưng đời ai biết đâu chữ ngờ, một bạn trong nhóm mình (credit: floppydisk) nhanh chóng tìm ra được thiếu sót trầm trọng trong quá trình làm sản phẩm này…
Giờ mình xin chia sẻ với các bạn cách làm của tụi mình (zepto team). Title mặc dù là phân tích USB nhưng bài này sẽ đi sâu vào RE phần mềm, đặc biệt là .NET.
Tìm hiểu thêm về sản phẩm tại đây:
http://tic.vn/usb-an-toan-bao-mat-vskey-8gb
Vọc thử
Cắm USB vào lap, cảm nhận độ chất của cái giá trên.
Với tính năng AutoPlay enable, 1 phần mềm autorun yêu cầu quyền Administrator để hiện ra 1 Form Login sau.
Nhập password mặc định “admin”, ta có phần mềm quản lý USB. Phần mềm không có gì đặc biệt, ngoài trừ việc không cho user tạo file trực tiếp trên USB.
Sau khi sử dụng thử vài phút, cảm nhận đầu tiên là các thao tác copy/paste từ/sang USB chậm hơn bình thường. Nhưng lại không rõ cụ thể vì không có tốc độ copy/paste. Cái hay nhất của phần mềm là giao diện Tiếng Việt đem lại cảm giác thoải mái khi sử dụng 😅
Vọc thêm chút nữa
Quay về bước đầu cắm USB. Nhận thấy USB mount 1 CD-ROM drive, gồm các phần mềm
Tụi mình đã thử
dd
toàn bộ physical disk ra, tuy nhiên ngoài CD-ROM drive thì không collect được partition nào khác.
File autorun.inf
giúp user , vậy ta sẽ kiểm tra nội dung của file này
[AutoRun]
label=X
open=Run.exe
icon=Run.exe,0
Vậy autorun.inf
gọi tới file Run.exe
. Mở CFF Explorer xác định file này dùng VB Compiler.
Ta sẽ dùng VB Decompiler để decompile file này.
Kết quả Run.exe
chạy các file .NET với OS tương ứng
- OS 7 trở xuống sẽ sử dụng .NET 2 (
Tool20.exe
) - OS 8, 10 sẽ sử dụng .NET 4.5 (
Tool45.exe
)
Những file Tool*.exe
tiếp tục gọi đến fileU_Tools.exe
với quyền Administrator.
Xác định đượcU_Tools.exe
là phần mềm quản lý USB gốc, kéo thả nó vào CFF Explorer (cách làm như trên) thì xác định là .NET application.
Reverse Engineering .NET app
Có rất nhiều tool decompile hoặc debug .NET app, tuy nhiên ở đây mình sử dụng và recommend dnSpy. Vì nó open-source, rất nhiều tính năng và tác giả rất active trên Github.
Giao diện của dnSpy rất user-friendly. Sau khi kéo thả U_Tools.exe vào dnSpy, ở tab bên trái Assembly Explorer ta thấy 1 mục tên U_Tools. Tiếp theo Right-Click -> Go To Entry Point để nhảy vào hàm Main
Nhìn vào các namespace (màu vàng) ta đoán phần mềm này đã bị obfuscate. Tiếp đây mình cũng giới thiệu 1 công cụ deobfuscate và unpack (đồng tác giả với dnSpy) — de4dot. Cách làm đơn giản như sau:
> de4dot.exe -f <obfuscated> -o <deobfuscated>
Thêm argument -d ta xác định được U_Tools dùng Reactor Obfuscator.
Theo Entry Point của file được deobfuscate trong dnSpy một lần nữa (cách làm giống trên), ta tới được hàm Main(). Đọc code thì thấy tạo 1 authentication dialog tên frmLogin
, nếu auth succeed thì sẽ chạy phần mềm quản lý USB LTOOLSnet
.
Dựa vào hàm constructor mặc định của Form/Window là InitializeCompnent
, ta đặt được 2 breakpoint trong classfrmLogin
là frmLogin_Load
khi load form và 1 EventHandler tên cmdLogin_Click
khi submit password.
Dừng việc debug tại đây 1 lát, giờ mình sẽ nói qua về phân tích tĩnh file này..
Có 3 class cần chú ý RAW.DISK, X.{frmLogin, LTOOLSnet}.
Đại khái chức năng chính của 3 class này:
- RAW.DISK: tương tác với PHYSICALDRIVE(trường hợp này là USB), nhiệm vụ chính là read/write các sector trên USB.
- frmLogin: class tạo ra Form Login (hình Form Login trên)
- LTOOLSnet: phần mềm quản lý USB (hình Phần Mềm Quản Lý trên), cóp nhặt phần mềm từ các nơi..
Ngoài lề: rất nhiều hàm trong các class dưới đây không được sử dụng. Như class DISK.RAW là 1 file .DLL được share trên 1 forum, và rất nhiều tính năng “ẩn” vô hại nữa 🙂 Quan trọng điều này làm phần mềm bloat một cách không cần thiết…
Tiếp tục debug..
Đặt được 2 breakpoint này, ta nhập đúng pass và trace tới khi fLogin(object init từ frmLogin) Dispose
(tạm hiểu là trace đến khi Form Login biến mất). Ta có thể tóm tắt cách hoạt động của Form Login như sau:
Giờ đi vào chi tiết xíu…
Hàm smethod2
ở bước 3: compute hash SHA512 với tham số là pass từ input— strPassword
. Salt ở đây là MD5.CODE_STRING
.
FYI: Salt ở đây là hardcoded string “Ivan Medvedev”. Không riêng mình mà cũng có người có câu hỏi :))
https://www.codeproject.com/Articles/5719/Simple-encrypting-and-decrypting-data-in-C?msg=3654375#xx3654375xx
Đoạn xác thực password dựa vào compare hash SHA512 — @string
với key xác thực — txtKey.text
Quan trọng nhất, là USB không hề encrypt dữ liệu. Việc xác thực password này chỉ có tác dụng với cái form 😨
Đơn giản kiểm tra thiếu sót này bằng cách tạo 1 file trong USB
Sau đó copy sang USB (thậm chí đổi cả pass nữa), dùng hex editor với USB
Dễ dàng thấy file trong USB không hề được encrypt. Chứng tỏ USB không hề encrypt dữ liệu. Myth confirmed!
Mã hóa ngoại truyện
Mình có nói qua là phần mềm này được cóp nhặt từ rất nhiều nơi, vì vậy có 1 vài feature “ẩn” khá là hài hước.
USB mặc định không encrypt dữ liệu. Tuy nhiên việc mã hóa là một tính năng “ẩn” của 1 “USB an toàn bảo mật” :))
Sau khi patch lại ta có menu như sau
Khi chế độ trên bật lên, phần mềm sẽ sử dụng Rijndael AES
để encrypt file với biến bientoancuc.FORMAT_KEY
và salt (vẫn là magic string khi hash SHA512).
Điều thú vị là FormatKey và mã hash SHA512 đều có thể dễ dàng lấy từ USB như nhau.
Ngoài ra đoạn kiểm tra định dạng của USB có thể nói vô cùng nhảm, ở các hàm sau:
- frmLogin.method_5(không resolve được tên) — compare magic string với
sector 8
- frmLogin.ReadCountPassFalse() — compare magic string với
sector 16
, đồng thời lưu số lần nhập sai password vào trongsector 16 + 33 bytes
- DISK.CreateStream() — compare 2 byte
450
và466
ởsector 0
với magic value. Đặc biệt hàm này là cách duy nhất mà tác giả gọi tới hàm CreateFile()… - Một vài hàm nữa…
Bypass
Tóm lại mình có 2 cách để bypass
- Ghi đè hash SHA512 của salt+password vào
sector 5
https://gist.github.com/zeptovn/710911f6ef373c330a8afa993c6b2d0c - Patch phần mềm
U_Tools
ở đoạn compare hash và key xác thực…
Cách 3 là extract hash SHA512 từ USB rồi tìm pass tương ứng với mã hash, nhưng không khả thi với password phức tạp.
Clone USB
Trong quá trình làm, nhóm thường hay đùa về giá cả của chiếc USB này. Giờ mình để lại script clone chiếc USB này dựa vào hàm format của chính nó, đầu tiên là giúp các bạn có thể kiểm chứng lại bài viết này mà không cần mua USB (tất nhiên firmware hay cách tạo CD-ROM thì chắc để lần sau zz)
Script trên có gọi tới 3 file .bin, những file này đều nằm trong CD-ROM.
Kết luận và Gợi ý
Kiểm lại những gì tụi mình vọc:
- Tìm và bypass phần xác thực USB
- Clone USB
Tới đây, chiếc USB này có thể thực sự gọi là USB bảo mật hay không là tùy cách nghĩ của bạn!
Ngoài ra, mình có 1 vài personal recommendation
cho những bạn nào muốn thử nghiệm làm USB an toàn hơn:
- Có option FDE (Full Disk Encrytion) cho user, nên đặt làm mặc định. Bạn có thể sử dụng AES mode XTS vì Bitlocker Windows 10 sử dụng cái này làm mặc định 😳
- Hardware Encryption thay vì Software Encryption.
Software Encryption đơn giản là dựa vào phần mềm để encrypt/decrypt dữ liệu. Tuy nhiên phần mềm chậm, yêu cầu cài đặt driver/update và dễ dàng bị crack/detect cho các cuộc tấn công trong tương lai.
- Áp dụng KEK (Key Encryption Key) cho DEK (Data Encryption Key) nếu sử dụng FDE.
DEK là key dùng để encrypt dữ liệu.
KEK được tạo nên bởi nhiều yếu tố, dùng để encrypt DEK.
FDE software sẽ khởi tạo một giá trị random cho DEK. KEK cũng được khởi tạo bởi nhiều yếu tố và password của user cũng là 1 trong. Một lợi ích của việc sử dụng KEK/DEK là khi user đổi password thì sẽ chỉ re-encrypt lại KEK, thay vì toàn bộ volume.
Cảm ơn các bạn đã đọc tới đây!
By nl+tofu
Về chất lượng bài viết hay bạn có thắc mắc, đừng ngại comment phía dưới. Mình rất sẵn lòng trả lời các bạn.
Bài viết hay lắm ạ.
bài viết tâm huyết, rất hay. hi vọng bài viết phân tích sp tương tự của vsec