Tìm kiếm mật khẩu trong React Native Android.

Tìm kiếm mật khẩu trong React Native Android.

Những gì tớ có là hai tập tin:

RN_KEYCHAIN.xml

crypt.KEY_256.xml

Bắt đầu nào
Như đã nêu ở trên,tớ có hai tệp RN_KEYCHAIN.xml chứa contained suspicious được gọi là ": p" và ": u", cả hai đều ở định dạng base64:


Và crypto.KEY_256.xml, trong đó, tớ đoán rằng tên tập tin có mật mã trong đó vì nhìn cái tên nó có những từ khóa "KEY" (ở định dạng base64):


Những gì tớ cần mà méo có là thuật toán, hoặc định dạng dữ liệu.
Chúng ta có thể đoán ra rằng nó có một key 256 bit từ tên của tệp khoá và khi chúng ta giải mã chuỗi base64 cho khóa, chúng ta sẽ kết thúc với 32 byte dữ liệu, nghĩa là 256 bit (If you understand this ==> you win)

Khám phá

Bước tiếp theo để tìm ra điều này là view mã nguồn của nó. Như tớ đã nói ở trên, ứng dụng đã được viết bằng React Native, vậy nên trong đó nó gói gọn tất cả logic thành một tệp JavaScript lớn trong app.
Grepping cái này cho thấy nó đã sử dụng một thư viện có tên là react-keychain native

Sau vài giây Google thì em đã dẫn tớ đến chính mã nguồn của nó https://github.com/oblador/react-native-keychain.


Vậy nếu nó sử dụng thư viện này, chúng ta có thể xem mã giải mã trong getGenericPasswordForOptions:


Như chúng ta thấy, nó được lấy user và password trong shared_prefs, tìm các chuỗi "u:" và "p:"; base64 giải mã nó và sau đó chuyển nó đến crypto.decrypt. Trước đó nó đã cho ta thấy nó được khởi tạo các đối tượng cryp


Okay nó đây rồi, những gì mà tớ muốn. Đào sâu thêm vào code nó cho thấy rằng các tài liệu tham khảo crypto ở trên là instantiating Crypto và CrypoCipher từ thư viện Facebook’s conceal.

Nhìn qua mã bị hide đi là chỉ gây thêm rắc rối vì chúng chỉ đề cập đến kích thước bit của key thay vì tham chiếu đến thuật toán rõ ràng, gợi ý gần nhất được thực hiện trong com.facebook.crypto.CryptoAlgoGcm.java, nó sử dụng mật mã chế độ GCM. Điều này đòi hỏi một mật mã với kích thước khối là 128 bit, rất có thể là AES ở chế độ GCM.


Thư viện này cũng cho chúng ta thấy rằng định dạng của văn bản mã hoá:


Vì vậy, chúng ta có thể thấy rằng vector khởi tạo (iv) được lưu trữ với văn bản crypto.

Giải mã 
Vào thời điểm này, tất cả những gì tớ có thể làm là cố gắng thử các ý tưởng giả định trong cái đầu của một "thiên tài" như tớ, đó là:

  • Dữ liệu trong RN_KEYCHAIN.xml là thông tin đăng nhập được mã hóa
  • Key mã hóa được lưu trữ trong crypt.KEY_256.xml
  • Ứng dụng sử dụng react-native-keychain
  • Mật mã là AES GCM với 256-bit
  • Các văn bản bí mật bao gồm các IV

Tớ thường sử dụng python để thử công cụ này (biết mỗi Python :)) ) ra tớ có thể làm điều này trên dòng lệnh ở những tool có sẵn mà không phải viết một công cụ nào cả.
Ở đây tớ đã gặp vấn đề khác: thư viện PyCrypto chuẩn không hỗ trợ AES_GCM.

Chúa phù hộ cho tớ vì có 1 thứ gọi là PyCryptodome hỗ trợ AES_GCM.:

Oh sh!t, Aardvark 123 là mật khẩu *ahihi*, đi tắm thôi nào!