NỘI DUNG
Cuối nội dung Penetration Testing Step 3 – Bypass hệ thống xác thực với “Stay logged in” cookie, sau khi dùng Stored XSS để húp cái stay-logged-in cookie từ đó xác định password hash, tôi đã chơi cheatcode để đọc ra cái password tương ứng.
Trên thực tế, sau khi đã truy cập được vào mục tiêu và tiến hành trích xuất password hash (thường yêu cầu phải có vai vế, đặc quyền thì mới làm được việc này), tôi có thể triển các phương án tấn công như sau:
- Password cracking attack để dò ra các password;
- Sử dụng phương án Pass-the-Hash attack để xác thực vào hệ thống mà méo cần biết password.
Trong cái đống việc nói trên, chỉ mỗi việc truy cập vào mục tiêu và trích xuất password hash là đã tốn kha khá giấy mực rồi chứ đừng nói chi tới password cracking attack hay Pass-the-Hash attack. Do vậy, tôi sẽ không dám ôm đồm chém gió với cả cái mớ này trong một lần.
Và để bảo toàn lực lượng, kỳ này tôi sẽ chỉ tập trung demo một nhát minh họa việc trích xuất password hash và sau đó triển phần password cracking attack trên cái hash đã thu lượm được để bạn có thể hình dung vấn đề rõ hơn. Có thể tôi sẽ quay lại bàn kỹ hơn các nội dung liên quan đến vấn đề này vào một ngày đẹp trời nào đó.
Lưu ý: Bạn có thể xem thêm thông tin giới thiệu về đám hash trong nội dung Giải ngố Cryptography – Phần 2: Đảm bảo Integrity với Hashing Algorithm.
#1. Trích xuất và nhận diện password hash
#1.1 Trích xuất password hash
Với Linux system, user password thường được lưu trữ trong file /etc/shadow. Và muốn đọc được cái này, tôi sẽ phải có quyền hạn của giới chức sắc (root). Ví dụ trên con hàng Kali Linux, tôi có thể dò thử cái password hash của user testkali như sau:
sudo grep testkali /etc/shadow

Trong ví dụ trên, bạn có thể thấy định dạng bắt đầu với username và sau đó là dấu “:” để ngăn cách với phần còn lại là password hash (phần $6 ở đoạn đầu tương ứng với SHA-512 algorithm, tôi sẽ nói kỹ hơn phần này ngay bên dưới).
Chuyển sang Windows system, password hash sẽ được lưu trong file Security Account Manager – SAM, thường được mã hóa một phần với SYSKEY feature để ngăn chặn việc tấn công offline vào SAM database.
Ngoài ra, Windows kernel cũng sẽ đặt exclusive file system lock (tạm dịch là khóa độc quyền của hệ thống) lên SAM database nên việc copy con hàng sẽ không khả thi khi OS đang chạy. Tuy nhiên, tôi có thể xem xét các giải pháp như dùng mimikatz để dump SAM hashes hoặc chạy password hash extraction từ Local Security Authority Subsystem – LSASS process memory khi đám này được cached (đại khái là lưu tạm vào bộ nhớ trong quá trình sử dụng).
Cần lưu ý, LSASS là privileged process (tức là đám process có đặc quyền con ông cháu cha) chạy bởi System user nên tôi sẽ cần chạy mimikatz bằng administrative command prompt. Sau đó, để túm password hash, tôi cần chạy 2 command:
privilege::debug
để kích hoạch quyền truy cập SeDebugPrivilge nhằm có thể can thiệp vô các process khác;token::elevate
để tăng đô security token từ mức high integrity của admistrator lên system integrity.
Sau đó, tôi có thể chạy lsadump::sam
để hốt SAM database về.

Tôi trích cái password hash ra để phục vụ cho phần demo password cracking attack ở bước sau admin:08001c0f8e4a9f71ea2e97228e91fbbb.
Lưu ý:
- Windows NT-based (đến Windows 2003) lưu giữ password hash ở 2 dạng:
- LAN Manger – LM dựa vào DES, được xác định yếu đến phi lý vì khi password dài hơn 7 ký tự sẽ bị cắt thành 2 phần và mỗi phần sẽ được chuyển thành chữ hoa hết trước khi chạy hash riêng. Vì tính chất này (và việc không sử dụng salt), việc dò giá trị hash sẽ rất thuận lợi;
- NT LAN Manager – NTLM sử dụng MD4 hashing, có phân biệt chữ hoa chữ thường, hỗ trợ tất cả Unicode charater, không tách password có độ dài hơn 7 ký tự nhưng vẫn không sử dụng salt khi lưu vào SAM database.
- Từ Windows Vista, mặc định LM sẽ bị tắt và sử dụng NTLM;
- Bạn có thể xem thêm về DES trong nội dung Giải ngố Cryptography – Phần 6: Symmetric Encryption và bí mật về sức mạnh của Advanced Encryption Standard (AES);
- Với tính năng dump password hash ở trên, mimikatz sẽ bị nhận diện là hàng độc hại. Bạn nên lưu ý kỹ trong quá trình thử nghiệm (ví dụ như kiểm tra source, chạy trong môi trường cô lập) chứ đừng bộp chộp hốt hàng linh tinh về chạy trên hệ thống thật là coi chừng vỡ mồm.
#1.2 Nhận diện password hash
Như lẽ thường, để có một sự vụ đâm thọc thành công, trước khi động thủ, tôi sẽ cần nắm trong tay các thông tin về đối tượng mà tôi dự định úp sọt (password hash trong trường hợp này). Do vậy, tôi sẽ cần bỏ thời gian ra ngâm cứu về đặc điểm nhận dạng của đám hash rồi mới chuyển sang mần các công việc cao siêu như password cracking attack.
Để xác định thể loại hash, tôi sẽ cần lưu ý các yếu tố như độ dài, bộ ký tự và các ký tự đặc biệt. Ngoài ra, tôi cũng có thể dựa vào trang Openwall hoặc tool hỗ trợ như hashID để thu thập thêm thông tin.

Với ví dụ trên, bạn có thể nhận diện được dấu hiệu “$6” của SHA-512 như tôi đề cập ở Mục 1.1.

Và với hashID, tôi có thể chạy command như sau trên một hash đã thu lượm được:
hashid c43ee559d69bc7f691fe2fbfe8a5ef0a

Kết quả ở trên chỉ ra danh sách một mớ các kết quả tiềm năng để tôi có thể xem xét trong các bước tấn công tiếp theo. Tuy nhiên, trường hợp lý tưởng là kết quả chỉ ra một thể loại cụ thể để tôi có thể giới hạn bớt phạm vi công việc cho công việc khó nhằn (password cracking attack) tiếp theo.
Tôi chạy lại ví dụ khác với một cái hash lằng nhằng hơn (thực ra càng lằng nhằng thì càng tốt vì khả năng xác định chính xác thể loại hash sẽ càng cao).
hashid '$6$l5bL6XIASslBwwUD$bCxeTlbhTH76wE.bI66aMYSeDXKQ8s7JNFwa1s1KkTan6ZsqQKAF3G0tHD9bd59e5NAz/s7DQcAojRTWNpZX0'

Và với đối tượng này, tôi có thể xác định kết quả là SHA-512 Crypt.
Lưu ý: Với đám hash thu lượm ở Mục 1.1, tôi đã biết chính xác thể loại rồi nên hiển nhiên không cần thực hiện bước nhận diện nữa. Công tác nhận diện chỉ nên triển khai khi bạn chưa biết/nghi ngờ về thể loại của đám hash mà bạn đang nắm trong tay mà thôi.
#2 Password cracking attack nhìn chung là nhàn (với người có thừa thời gian)
Về nguyên lý, password cracking attack có thể hiệu quả kể cả khi password hash có được thêm mắm dặm muối (salt) để tăng độ ngẫu nhiên. Tuy nhiên việc này sẽ tăng độ phức tạp lên khá nhiều. Do vậy, bạn sẽ cần thu lượm do thám thông tin càng nhiều càng tốt để có thể thu gọn phạm vi tấn công.
Đồng thời, cũng cần nhấn mạnh, password cracking attack là quá trình tiêu tốn nhiều thời gian nên bạn cần triển khai song song với các công việc khác chứ đừng ngồi đó há mồm ra mà chờ. Nếu có thêm thông tin hữu ích bạn có thể lập lại quá trình tấn công để tăng thêm độ sát thương.
Rồi, tôi quay lại phần demo với cái password hash (admin:08001c0f8e4a9f71ea2e97228e91fbbb) của con hàng Windows 10 đã thu lượm được ở bước trên. Và ở đây, tôi cũng sẽ có thể sử dụng lại người quen cũ là John the Ripper trong nội dung Penetration Testing Step 3 – Kỹ nghệ chế biến wordlist phục vụ Password Attack.
Trước hết, tôi đưa cái password hash nói trên vô file text để tiện mần ăn.

Sau đó, tôi có thể chạy thử nghiệm password cracking attack với file chứa password hash vừa tạo và thông tin định dạng tương ứng.
john w10-hash.txt --format=NT

Với phương án trên, ngài John sẽ chơi brute force mode – tức là thử mọi khả năng có thể có. Do vậy, với password phức tạp mà không triển khai các giải pháp tăng tốc với sự hỗ trợ của phần cứng (ví dụ dùng –fork option để chia process ra cho các CPU hay –node option để chia process ra cho nhiều máy) thì có khi tôi phải chờ đến rụng răng.
Ngoài ra, nếu có nguồn tin chất lượng, tôi có thể thu gọn phạm vi tác chiến thông qua việc xây dựng và sử dụng wordlits kiểu như con hàng rockyou.txt sau đây.
vi /usr/share/wordlists/rockyou.txt

Sau đó, tôi chạy lại command với tùy chọn chỉ định wordlist kiểu như sau:
john --wordlist=/usr/share/wordlists/rockyou.txt w10-hash.txt --format=NT
Ở đây, để tiết kiệm thời gian, tôi sẽ thiết lập và chạy với một cái wordlist nhỏ gọn (w10-wordlist.txt) chứa cái password cần tìm để minh họa nhanh.
john --wordlist=w10-wordlist.txt w10-hash.txt --format=NT

Và bùm, cái password tương ứng (Alo@123ma) của ông admin đã hiện ra cho tôi đánh chén. Hy vọng đến đây, bạn đã có thể hình dung rõ hơn những vấn đề có thể phát sinh trong công cuộc thu lượm và tấn công password hash để có sự chuẩn bị phù hợp trước khi bước vào trận chiến dài hơi này.
1 thought on “Penetration Testing Step 3 – Password cracking attack có dễ ăn không?”