@iamproz2911 Bài viết này mục đích nghiên cứu về lỗ hổng Resetpassword và OTP. # Reset Password, OTP Vulnerable (PartOfAuthentication) # Lý Thuyết ## 1. Lỗ hổng Reset Password Poisoning Mô tả: Lỗ hổng này xảy ra khi quy trình đặt lại mật khẩu không được bảo vệ một cách an toàn. Kẻ tấn công có thể lợi dụng điều này để đặt lại mật khẩu của người dùng mà không có sự cho phép của họ. Nguyên nhân: - Thiếu xác thực đúng đắn trước khi cho phép đặt lại mật khẩu. - Sử dụng liên kết đặt lại mật khẩu không hợp lệ hoặc không expire sau một khoảng thời gian nhất định. - Không xác thực whitelist cho các domain cho phép ở đường dẫn resetpassword. Rủi ro: - Kẻ tấn công có thể chiếm quyền truy cập vào tài khoản của người dùng. - Dữ liệu nhạy cảm có thể bị đánh cắp hoặc thao túng. ## 2. Lỗ hổng OTP (One-Time Password) Vulnerable Mô tả: Lỗ hổng này liên quan đến việc bảo vệ mã OTP, thường được sử dụng trong xác thực hai yếu tố. Nếu mã OTP không được bảo vệ đúng cách, kẻ tấn công có thể dễ dàng chiếm đoạt. Nguyên nhân: - Sử dụng mã OTP dễ đoán hoặc có thể bị tấn công bằng phương pháp brute force. - Thiếu cơ chế giới hạn thời gian cho mã OTP. - OTP không đổi sau mỗi lần resend, hoặc có đổi nhưng không hủy đi cái OTP cũ. - Có thể trả về trong respone, thông qua racecondition. Rủi ro: - Kẻ tấn công có thể truy cập vào tài khoản ngay cả khi có xác thực hai yếu tố. - Có thể dẫn đến mất mát dữ liệu và thiệt hại tài chính(Số tiền trên mỗi tin nhắn OTP gửi đi). Dấu hiệu: ![image](https://hackmd.io/_uploads/ry4SRr0MJg.png) ## Các cách bảo vệ Đối với Reset Password: - Xác thực người dùng bằng nhiều bước trước khi cho phép đặt lại mật khẩu. - Sử dụng liên kết đặt lại mật khẩu có thời hạn và không dễ đoán. - Dùng whitelist để xác thực danh sách domain cho phép. Đối với OTP: - Sử dụng mã OTP ngẫu nhiên và phức tạp. - Đặt thời gian hết hạn ngắn cho mã OTP và giới hạn số lần thử. # Thực hành với lab case study OTP Vulnerable ## **Lab1:** No Limit Verify OTP ### Mô tả: Try to login account admin and get the FLAG. No limit to verify and refresh OTP. It is a vulnerability of logic flow. ### Exploit B1. Truy cập website lab ![image](https://hackmd.io/_uploads/BJbqQOb7kx.png) Tạo tài khoản và đăng nhập thử vào tài khoản bất kì.(Lấy ChatID trong bot tele 6542903617) ![image](https://hackmd.io/_uploads/rJD0Xd-7yg.png) ![image](https://hackmd.io/_uploads/S1ScBdZ7kg.png) Đăng kí thành công, bây giờ OTP gửi về trong tele. ![image](https://hackmd.io/_uploads/Hy-VPu-mJe.png) Đăng nhập đúng thì bot sẽ trả về mã OTP cho tài khoản mình vừa tạo. ![image](https://hackmd.io/_uploads/r1DKwuZXke.png) ![image](https://hackmd.io/_uploads/Skv_DuWXye.png) Nhưng nếu bấm resend liên tục thì nhận thấy OTP trả về liên tục, không có giới hạn về số lần lẫn thời gian tồn tại của OTP. ![image](https://hackmd.io/_uploads/rky6D_-Xkl.png) => Tiến hành đăng nhập tài khoản admin B2. BruteForce mật khẩu admin ![image](https://hackmd.io/_uploads/r1cZ_d-X1x.png) Vì đây là bài về OTP nên mật khẩu admin bruteforce sẽ ra thôi. Sử dụng list [password](https://github.com/kkrypt0nn/wordlists/blob/main/wordlists/passwords/password.txt) để bruteforce. Đẩy request vào intruder và chạy simplelist ![image](https://hackmd.io/_uploads/SJ3KOOZXyg.png) ![image](https://hackmd.io/_uploads/rJcC__WQyg.png) Start attack rồi đợi phản hồi. Nhận biết nhanh hơn thì xem đăng nhập tài khoản đã đăng kí trước đó (thất bại và thành công) để quan sát sự thay đổi của length. Nếu thành công(StatusCode302 length513) ![image](https://hackmd.io/_uploads/HJEFcd-7kx.png) Pass là Aa123456 Đăng nhập thành công tuy nhiên thì chưa thể kiểm soát mã OTP vì sẽ gửi vào bot của Admin. B3. Exploit lỗ hổng OTP no limit Lại quay trở về acc đã đăng kí từ trước để kiểm tra sự khác biệt. ![image](https://hackmd.io/_uploads/SkFeoOZ71e.png) Mã OTP là 9451, kiểm tra nếu nhập sai và đúng. Khi nhập sai thì Length là 2802 còn nếu nhập đúng thì sẽ là 1349. Truy cập lại acc Admin. Vì OTP không giới hạn thời gian lẫn số lần nhập, vì vậy có thể brute-force để lấy mã. B4. BruteForce mã OTP Đẩy Request vào intruder, vì mã OTP là 4 số chia cho mỗi vị trí tương ứng OTP1 OTP2 ... Dùng kiểu ClusterBomb và set cho 4payload kiểu number(0->9, step1) ![image](https://hackmd.io/_uploads/r1wonuWQ1x.png) Khoảng 10.000 trường hợp với Lenght 1251 là OTP đúng.(Rất tốn chi phí trong thực tế nếu như không bảo mật kĩ OTP) ![image](https://hackmd.io/_uploads/H1T9mtZQkl.png) Kết quả là 4958, nhập OTP vào và hoàn thành lab. ![image](https://hackmd.io/_uploads/rkn3Qt-Qyl.png) ## **Lab2:** Baby Logic Pincode ### Mô tả: To unlock, enter the correct PIN. The PIN is a 4 digit number, ranging from 1000 to 1500. Use Burp Suite Intruder or any other tool like Hydra. ### Exploit: B1. Truy cập website lab ![image](https://hackmd.io/_uploads/By2EghWQye.png) Web rất đơn giản, chỉ có mỗi mã để nhập pin tuy nhiên thì web không giới hạn số lần gửi OTP cũng như là thời gian tồn tại của OTP đó. ![image](https://hackmd.io/_uploads/rkMcx2WQkx.png) B2. BruteForce mã pin Đề đã cho sẵn nằm trong khoảng 1000->1500, và chỉ có mỗi tham số pin thay đổi giá trị. Đưa request vào burpsuite intruder để chạy bruteforce. ![image](https://hackmd.io/_uploads/S1N0lh-mJe.png) Thêm dấu "$" vào vị trí cần thay đổi. Chạy payload number với giá trị từ 1000->1500 và step 1 sequential. Ở vị trí mã pin 1495 thì Length có sự khác lạ. ![image](https://hackmd.io/_uploads/rkpDb2ZQJg.png) B3. Nhập mã OTP và hoàn thành lab ![image](https://hackmd.io/_uploads/SkxsWh-7Jl.png) # Thực hành với lab case study ResetPassword ## **Lab1:** Password Reset ### Mô tả: Could you find the administrator's email?, Do you know her password? Could you try to log in to the admin account and get the flag? She is very busy with her customers, so she checks email constantly. ### Lý thuyết và phương pháp sử dụng: **Lý thuyết**: - Lỗ hổng này chủ yếu là tấn công ở phần host header ![image](https://hackmd.io/_uploads/HypzMhbm1g.png) - Nếu thay đổi được phần host thì sẽ tồn tại lỗ hổng. - Lý do là phần host chứa link trả về khi click quên mật khẩu. Rất nguy hiểm cho việc lộ token tài khoản admin(Nếu admin trỏ vào link). - Vì sao có thể đổi pass, lí do là web sẽ gửi cho mình một token secret như là một mật khẩu tạm thời, gắn vào link gửi về, nên có thể thay đổi pass. - Mô phỏng hướng lập trình. ![image](https://hackmd.io/_uploads/r1mL8nWmyl.png) $_SERVER['HOST'] có thể bị giả mạo bởi hacker lí do là chưa xác thực. => Khi thay đổi được host thì chỉ khi user hoặc admin trỏ vào link thay đổi pass thì khi đó mới hacker mới có token. **Cách khai thác**: - Sử dụng webhook hoặc collaborator của burp tạo một link và thay đổi cho phù hợp với link reset password của website. - - Nếu có truy cập vào link phía webhook sẽ hiển thị thông báo và phát hiện ra và hiển thị token admin. - Từ đó thay đổi password dựa vào token của admin. **Webhook**: - Webhook là một phương thức cho phép một ứng dụng gửi dữ liệu đến một ứng dụng khác theo thời gian thực. - Nó hoạt động như một "callback" mà ứng dụng A có thể gọi để thông báo cho ứng dụng B khi có sự kiện xảy ra. - Nếu ứng dụng sử dụng webhook để gửi yêu cầu đặt lại mật khẩu, hacker có thể lợi dụng để thay đổi địa chỉ mà webhook gửi thông báo đến. ### Exploit: B1. Truy cập trang web. ![image](https://hackmd.io/_uploads/H1LCKhbQkl.png) Đầu tiên tạo một tài khoản, nhớ nhập đầy đủ các trường. ![image](https://hackmd.io/_uploads/SkW-52bXyx.png) Giao diện khá cơ bản cho một website. ![image](https://hackmd.io/_uploads/B1uQqhbQye.png) Ở dưới có một list các email, yêu cầu bài lab là vào tài khoản admin để đăng nhập và lấy flag, tuy nhiên cần phải có password. B2. Truy cập chức năng resetpassword Khi click vào resetpassword thì website yêu cầu nhập gmail. Test trước với email vừa tạo. ![image](https://hackmd.io/_uploads/HyySjn-Xkx.png) Đường link trỏ tới phần thay đổi mật khẩu, lúc này token đã hoạt động, thay cho mật khẩu tạm thời. ![image](https://hackmd.io/_uploads/HkMvsh-X1e.png) B3. Sử dụng Burp Collaborator để khai thác. ![image](https://hackmd.io/_uploads/SJQwh2bQkl.png) Request nhập email và sẽ chuyển tới link thay đổi password. Thay đổi phần host để kiểm tra web có mắc lỗi passwordreset không. ![image](https://hackmd.io/_uploads/BJyxahbmJx.png) Click process cookie và followredirection ![image](https://hackmd.io/_uploads/rJkT3h-Xkx.png) ![image](https://hackmd.io/_uploads/Hy-Wa2-m1e.png) Nhận thấy host đã thay đổi sang abc.com ``` Your link reset password is http://abc.com/reset_password/YCRR7J28JIW5TP9LJHS04BX6UNPR4KGZ< ``` Tuy nhiên đây là server ảo nên không thể nhận được gì, tạo burpcolab để thấy. ![image](https://hackmd.io/_uploads/ryFdT3-QJl.png) Kết quả trả về là một đường link. ![image](https://hackmd.io/_uploads/rypE0h-Xye.png) Đây là phần chứa token reset_password/LGAD8CCBGWBIXW2INXF5G7RYL49W21AY&lt B4. Lấy Token của admin List email cho biết email của admin là: admin@example.com Truy cập resetpassword và nhập mail vào. Tuy nhiên không hiển thị được gì vì đây là tài khoản admin. ![image](https://hackmd.io/_uploads/HyyJkabX1l.png) Thay đổi host và đợi phản hồi từ Collaborator ![image](https://hackmd.io/_uploads/B1oXya-XJx.png) Phản hồi từ BurpCollab cho thấy Admin đã click vào link reset. ![image](https://hackmd.io/_uploads/rJ61l6ZQkx.png) Và token hiển thị ở trên là /reset_password/IFX5PPEHMICPKYWNQEKCXDSCREO8MUCT Bây giờ truy cập bằng token admin và đổi mật khẩu. ![image](https://hackmd.io/_uploads/B1SVea-mkx.png) ![image](https://hackmd.io/_uploads/S1grgTbQkg.png) Flag đã hiển thị khi đăng nhập vào tài khoản admin. ![image](https://hackmd.io/_uploads/SyUOgp-myx.png) B5. Thử dùng webhook nếu không có burpsuite Pro ![image](https://hackmd.io/_uploads/rkm3g6Wm1g.png) Lấy link web và dán vào phần host `https://webhook.site/d371b080-67db-427f-a6a2-5210a4fbda5b` ![image](https://hackmd.io/_uploads/S1bmZaZ7kx.png) Sau đó đợi thông báo ở phần event ![image](https://hackmd.io/_uploads/ByHV-pWm1g.png) Lấy token admin và đổi pass Sau đó đăng nhập và submit flag để hoàn thành lab. ![image](https://hackmd.io/_uploads/B1pcZpZQyg.png) **Tài Liệu Tham Khảo** [Webhook](https://webhook.site/) [Lab](https://battle.cookiearena.org) [DocumentOTP](https://www.identite.us/post/sms-one-time-password-authentication-is-it-still-secure) [DocumentResetpasswordpoisoning](https://portswigger.net/web-security/host-header/exploiting/password-reset-poisoning)