USB bảo mật VS-KEY — Niềm tin về sự an toàn? Nói có vẻ đúng làm chưa đúng

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?

Golden USB 880k!

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.

Form Login của USB VS-KEY

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.

phần mềm quản lý USB VS-KEY

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

thư mục CD-ROM drive

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.

Kéo thả file Run.exe vào CFF Explorer

Ta sẽ dùng VB Decompiler để decompile file này.

case “win8” và “win10”

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.

U_Tools process

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ảy tới Entry Point, tuy nhiên bị obfuscate

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 .

hàm Main()

Dựa vào hàm constructor mặc định của Form/Window là InitializeCompnent, ta đặt được 2 breakpoint trong classfrmLoginfrmLogin_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…

các class trong 2 namespace này

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.

Compute hash

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

Get key xác thực từ 1 đoạn trong sector 5
Compare hash và key xác thực

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

file trong USB

Sau đó copy sang USB (thậm chí đổi cả pass nữa), dùng hex editor với USB

content file trong USB không bị encrypt

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” :))

Tính năng này bị ẩn đi (Visible = False)

Sau khi patch lại ta có menu như sau

patch lại

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).

hàm EncryptFile
hàm EncryptFile sử dụng Rijndael

Điều thú vị là FormatKey và mã hash SHA512 đều có thể dễ dàng lấy từ USB như nhau.

get FormatKey từ sector 12

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 trong sector 16 + 33 bytes
  • DISK.CreateStream() — compare 2 byte 450466sector 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

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)

https://gist.github.com/zeptovn/c22151dc75cce3a110a3dfc1f20dbbf4

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.

USB protection profile

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.

2 Replies to “USB bảo mật VS-KEY — Niềm tin về sự an toàn? Nói có vẻ đúng làm chưa đúng”

Leave a Reply

Your email address will not be published. Required fields are marked *