Task 11 [Day 6] Web Exploitation Patch Management Is Hard
Trong quá trình kiểm tra bảo mật định kỳ trước Sự cố, McSkidy đã phát hiện ra một số mật khẩu khôi phục trên một máy chủ cũ. Cô ấy đã tạo một vé để ngừng hoạt động máy chủ này để giảm lỗ hổng bảo mật này. Elf được giao nhiệm vụ sửa chữa lỗ hổng này liên tục đẩy lùi nhiệm vụ và điều này không bao giờ hoàn thành. May mắn thay, một số khóa khôi phục có thể được sử dụng để cứu một số hệ thống.
Thật không may, cách duy nhất để truy cập máy chủ là thông qua một ứng dụng web cũ. Hãy xem liệu bạn có thể rút ra những chìa khóa khôi phục đó để giúp McSkidy theo đuổi cô ấy để cứu Giáng sinh hay không.
Trong nhiệm vụ này, chúng tôi sẽ trình bày những kiến thức cơ bản về lỗ hổng Local File Inclusive (LFI), bao gồm cách xác định và kiểm tra LFI. Chúng tôi cũng sẽ chỉ ra tác động của lỗ hổng LFI bằng cách khai thác nó.
Hãy bắt đầu bằng cách khởi động máy được gắn với tác vụ này,
Lỗ hổng tệp cục bộ (LFI) là gì?
Lỗ hổng LFI được tìm thấy trong các ứng dụng web khác nhau. Ví dụ, trong PHP, các hàm sau gây ra loại lỗ hổng này:
- include
- require
- include_once
- require_once
Đây là một lỗ hổng ứng dụng web cho phép kẻ tấn công bao gồm và đọc các tệp cục bộ trên máy chủ. Các tệp này có thể chứa dữ liệu nhạy cảm như khóa mật mã, cơ sở dữ liệu chứa mật khẩu và dữ liệu riêng tư khác. Lỗ hổng LFI xảy ra do nhà phát triển thiếu nhận thức về bảo mật. Trong một số trường hợp, nhà phát triển cần bao gồm nội dung của các tệp cục bộ khác trong một trang cụ thể. Giả sử một nhà phát triển bao gồm các tệp mà không có xác thực đầu vào thích hợp. Trong trường hợp đó, lỗ hổng LFI sẽ tồn tại vì nhà phát triển không bao giờ được tin tưởng vào đầu vào của người dùng và giữ cho tất cả các đầu vào từ người dùng được lọc và làm sạch. Vấn đề chính của các lỗ hổng này là thiếu xác thực đầu vào, trong đó đầu vào của người dùng không được khử trùng hoặc xác thực và người dùng kiểm soát chúng.
Rủi ro của LFI là gì?
Khi bạn tìm thấy lỗ hổng LFI, bạn có thể đọc dữ liệu nhạy cảm nếu bạn có quyền đọc được trên tệp. Do đó, một trong những rủi ro đáng kể nhất là rò rỉ dữ liệu nhạy cảm được truy cập bởi một người dùng thông thường. Ngoài ra, trong một số trường hợp, lỗ hổng LFI có thể được xâu chuỗi để thực hiện RCE Thực thi Mã Từ xa trên máy chủ. Nếu chúng ta có thể đưa hoặc ghi vào một tệp trên hệ thống, chúng ta sẽ tận dụng LFI để có được RCE. Trong nhiệm vụ này, chúng tôi đã chuẩn bị một ứng dụng web có lỗ hổng LFI và một cách khả thi để lấy RCE. Chúng ta sẽ xem xét ứng dụng web này sau.
Identifying and testing for LFI
Thông thường, những kẻ tấn công quan tâm đến các tham số HTTP để thao tác đầu vào và đưa các trọng tải tấn công vào để xem ứng dụng web hoạt động như thế nào. Nói chung, nếu bạn đang tìm kiếm một điểm vào để kiểm tra các kiểu tấn công ứng dụng web, thì điều quan trọng là phải sử dụng ứng dụng web và kiểm tra các chức năng của nó. Điểm nhập có thể là tham số HTTP GET hoặc POST chuyển một đối số hoặc dữ liệu đến ứng dụng web để thực hiện một thao tác cụ thể.
Tham số là các chuỗi tham số truy vấn được đính kèm với URL có thể được sử dụng để truy xuất dữ liệu hoặc thực hiện các hành động dựa trên đầu vào của người dùng. Biểu đồ sau giải thích và chia nhỏ các phần thiết yếu của URL.

Ví dụ: các tham số được sử dụng với tìm kiếm của Google, trong đó các yêu cầu GET chuyển thông tin đầu vào của người dùng vào công cụ tìm kiếm. https://www.google.com/search?q=TryHackMe. Nếu bạn không quen thuộc với chủ đề này, bạn có thể xem How The Web Works
Khi bạn tìm thấy điểm nhập, chúng tôi cần hiểu cách dữ liệu này có thể được xử lý trong ứng dụng. Sau thời điểm này, bạn có thể bắt đầu kiểm tra các loại lỗ hổng bảo mật nhất định bằng các công cụ thủ công hoặc tự động. Sau đây là một ví dụ về mã PHP dễ bị LFI.
<?PHP
include($_GET["file"]);
?>
Đoạn mã PHP ở trên sử dụng yêu cầu GET thông qua tệp tham số URL để đưa file vào đường dẫn. Yêu cầu có thể được thực hiện bằng cách gửi yêu cầu HTTP sau: http://example.thm.labs/index.php?file=welcome.txt để tải nội dung của tệp welcome.txt tồn tại trong cùng một thư mục.
Ngoài ra, các điểm nhập khác có thể được sử dụng tùy thuộc vào ứng dụng web và nơi có thể xem xét Tác nhân người dùng, Cookie, phiên và các tiêu đề HTTP khác.
Bây giờ chúng ta đã tìm thấy điểm vào của mình, hãy bắt đầu kiểm tra việc đọc các tệp cục bộ liên quan đến hệ điều hành. Sau đây là một số tệp hệ thống Linux có thông tin nhạy cảm.
/etc/issue
/etc/passwd
/etc/shadow
/etc/group
/etc/hosts
/etc/motd
/etc/mysql/my.cnf
/proc/[0-9]*/fd/[0-9]* (first number is the PID, second is the filedescriptor)
/proc/self/environ
/proc/version
/proc/cmdline
Hãy bắt đầu với thử nghiệm cơ bản của LFI. Khi chúng tôi xác định được điểm nhập hoặc thông số HTTP, chúng tôi có thể bắt đầu thử nghiệm và bao gồm các tệp hệ điều hành để xem ứng dụng web phản ứng như thế nào. Là một trường hợp thử nghiệm, chúng tôi luôn có thể thử / etc / passwd chống lại Hệ điều hành Linux vì nó chắc chắn có thể đọc được. Chúng tôi cũng có thể cố gắng sử dụng các kỹ thuật khác nhau như
- Bao gồm tệp nhạy cảm ví dụ bắt đầu bằng/etc/passwd sử dụng .. để thoát khỏi thư mục hiện tại, số .. thay đổi tùy thuộc vào thư mục ứng dụng web.
- Bỏ qua các bộ lọc bằng cách sử dụng ....//.
- Các kỹ thuật mã hóa URL (chẳng hạn như mã hóa kép)
Bạn có thể xem lại chủ đề file inclusion để biết thêm thông tin về các kỹ thuật này.
http://example.thm.labs/page.php?file=/etc/passwd http://example.thm.labs/page.php?file=../../../../../../etc/passwd
http://example.thm.labs/page.php?file=../../../../../../etc/passwd%00
http://example.thm.labs/page.php?file=....//....//....//....//etc/passwd
http://example.thm.labs/page.php?file=%252e%252e%252fetc%252fpasswd
Khi bạn đã xem thành công nội dung của tệp /etc/passwd, bạn có thể kiểm tra các tệp khác.
Bây giờ, khởi động máy được đính kèm bằng cách sử dụng nút Start Machine màu xanh lục trong tác vụ này và áp dụng những gì chúng ta đã thảo luận từ trước đến nay và trả lời các câu hỏi bên dưới. Để truy cập trang web, bạn có thể triển khai AttackBox hoặc truy cập liên kết trang web sau: https://LAB_WEB_URL.p.thmlabs.com.
Khai thác LFI
Việc khai thác LFI đôi khi bị giới hạn và phụ thuộc vào cấu hình máy chủ ứng dụng web. Bên cạnh việc đọc dữ liệu nhạy cảm, chúng ta có thể thực thi mã từ xa. Nếu chúng ta đang xử lý một ứng dụng web PHP, thì chúng ta có thể sử dụng một Wrapper hỗ trợ PHP. Để biết thêm thông tin, hãy truy cập PHP manual page. PHP cung cấp nhiều phương thức truyền dữ liệu khác nhau (Dòng đầu vào / đầu ra) để cho phép PHP đọc từ đó. Nó sẽ cho phép đọc dữ liệu qua các kênh kiểu dữ liệu khác nhau.
PHP Filter
Trình tấn công bằng bộ lọc PHP được sử dụng trong LFI để đọc nội dung trang PHP thực tế. Trong các trường hợp điển hình, không thể đọc nội dung của tệp PHP qua LFI vì tệp PHP được thực thi và không bao giờ hiển thị mã hiện có. Tuy nhiên, chúng ta có thể sử dụng bộ lọc PHP để hiển thị nội dung của các tệp PHP ở các định dạng mã hóa khác như base64 hoặc ROT13.
Trước tiên, hãy thử đọc tệp /etc/passwd bằng trình bao bọc bộ lọc PHP.
http://example.thm.labs/page.php?file=php://filter/resource=/etc/passwd
Bây giờ hãy thử đọc tệp index.php bằng bộ lọc PHP; chúng tôi gặp lỗi vì máy chủ web cố gắng thực thi mã PHP. Để tránh điều này, chúng ta có thể sử dụng bộ lọc PHP trong khi base64 hoặc ROT13 mã hóa đầu ra như sau:
http://example.thm.labs/page.php?file=php://filter/read=string.rot13/resource=/etc/passwd
http://example.thm.labs/page.php?file=php://filter/convert.base64-encode/resource=/etc/passwd
Chúng tôi sẽ cố gắng sử dụng base64 cho kịch bản của chúng tôi. Kết quả là, chúng tôi sẽ nhận được đầu ra được mã hóa base64 như sau:
cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDox******Deleted
Để đọc văn bản này dưới dạng văn bản thuần túy, bạn có thể sử dụng thiết bị đầu cuối Linux hoặc sử dụng một trong các trang web giải mã trực tuyến, ví dụ: www.base64decode.org.
Bây giờ, hãy thử truy xuất nội dung index.php và trả lời câu hỏi số 3 bên dưới.
PHP DATA
Trình bao bọc PHP được sử dụng để bao gồm văn bản thuần túy thô hoặc dữ liệu được mã hóa base64. Nó được sử dụng để bao gồm hình ảnh trên trang hiện tại. Nó đang được sử dụng trong khai thác LFI.
Hãy thử mã hóa base64 "AoC3 rất vui!" văn bản để đưa nó vào trang bằng cách sử dụng dữ liệu trình tính toán base64:
user@machine$ echo "AoC3 is fun!" | base64 QW9DMyBpcyBmdW4hCg==
Ngoài ra, chúng tôi có thể giải mã base64 như sau:
user@machine$ echo "QW9DMyBpcyBmdW4hCg==" | base64 --decode AoC3 is fun!
Bây giờ chúng ta có thể đưa dữ liệu base64 của mình vào trang dễ bị tấn công như sau,
http://example.thm.labs/page.php?file=data://text/plain;base64,QW9DMyBpcyBmdW4hCg==
Kết quả là trang sẽ hiển thị thông điệp đáng yêu của chúng ta, đó là AoC3 is fun!. Sử dụng kỹ thuật này, chúng ta có thể đưa mã PHP vào một trang, bằng cách mã hóa mã PHP cần thiết và đưa nó vào trình bao bọc dữ liệu PHP. Bạn có thể thực hiện một số nghiên cứu để kiểm tra chúng!
Các trình bao bọc PHP khác có thể được sử dụng trong lỗ hổng LFI. Bạn có thể thực hiện một số nghiên cứu để kiểm tra chúng!
Như chúng ta đã đề cập trước đây, chúng ta có thể thực thi lệnh từ xa nếu chúng ta có khả năng ghi vào một tệp hoặc chuỗi nó với các loại lỗ hổng bảo mật khác. Trong nhiệm vụ này, chúng tôi sẽ sử dụng ứng dụng web dễ bị tấn công mà chúng tôi đã cung cấp để thực hiện RCE thông qua LFI.
LFI sang RCE thông qua tệp nhật ký
Nó còn được gọi là một cuộc tấn công đầu độc khúc gỗ. Nó là một kỹ thuật được sử dụng để thực thi lệnh từ xa trên máy chủ web. Kẻ tấn công cần bao gồm một trọng tải độc hại vào các tệp nhật ký dịch vụ như Apache, SSH, v.v. Sau đó, lỗ hổng LFI được sử dụng để yêu cầu trang có tải trọng độc hại. Việc khai thác kiểu tấn công này phụ thuộc vào nhiều yếu tố khác nhau, bao gồm thiết kế của ứng dụng web và cấu hình máy chủ. Do đó, nó đòi hỏi sự liệt kê, phân tích và hiểu biết về cách thức hoạt động của ứng dụng web. Ví dụ: người dùng có thể đưa một trọng tải độc hại vào tệp nhật ký apache thông qua Tác nhân người dùng hoặc các tiêu đề HTTP khác. Trong SSH, người dùng có thể đưa một trọng tải độc hại vào phần tên người dùng.
Trong nhiệm vụ này, chúng tôi đã cung cấp một ứng dụng web dễ bị tấn công ghi yêu cầu của người dùng vào tệp nhật ký mà người dùng máy chủ web có quyền truy cập. Khi chúng tôi đăng nhập vào ứng dụng web, chúng tôi có thể truy cập trang nhật ký tại https://LAB_WEB_URL.p.thmlabs.com/logs.php.
Chúng ta có thể thấy rằng trang nhật ký lưu trữ bốn tiêu đề khác nhau, bao gồm tên người dùng, địa chỉ IP, Tác nhân người dùng và trang đã truy cập. Tác nhân người dùng là một tiêu đề HTTP bao gồm thông tin trình duyệt của người dùng để cho phép máy chủ xác định loại hệ điều hành, nhà cung cấp và phiên bản. Tác nhân người dùng là một trong những tiêu đề HTTP mà người dùng có thể kiểm soát. Do đó, để có được RCE, bạn cần đưa mã PHP vào User-Agent và gửi yêu cầu đến tệp nhật ký bằng LFI để thực thi trong trình duyệt. Bây giờ, hãy kiểm tra xem chúng ta có thể đưa giá trị Tác nhân-Người dùng vào tệp nhật ký ứng dụng web hay không và xem liệu bản ghi của chúng ta có được ghi lại hay không!
user@machine$ curl -A "This is testing" http://LAB_WEB_URL.p.thmlabs.com/login.php
Khi chúng tôi gửi yêu cầu HTTP bằng curl, bây giờ bằng cách sử dụng người dùng đã đăng ký, chúng tôi có thể kiểm tra trang nhật ký để xem liệu chúng tôi có thể thêm Tác nhân người dùng mà chúng tôi đã gửi hay không.
user@machine$ curl -A "<?php phpinfo();?>" http://LAB_WEB_URL.p.thmlabs.com/login.php
Bây giờ sử dụng LFI, tải tệp nhật ký để mã PHP được thực thi. Lưu ý rằng điều quan trọng là phải truy cập tệp nhật ký qua LFI. Khi bạn gọi tệp nhật ký, chúng tôi sẽ thấy trang thông tin PHP.
Bây giờ là thời gian luyện tập. Chúng ta phải áp dụng những gì chúng ta đã thảo luận để đạt được RCE. Chúng tôi phải đưa mã PHP vào User-Agent và sau đó sử dụng lỗ hổng LFI được gọi là tệp nhật ký để mã PHP của bạn được thực thi, sau đó trả lời câu hỏi bên dưới.
LFI sang RCE thông qua Phiên PHP
LFI đến RCE thông qua các phiên PHP tuân theo cùng một khái niệm về kỹ thuật đánh dấu bản ghi. Phiên PHP là các tệp trong hệ điều hành lưu trữ thông tin tạm thời. Sau khi người dùng đăng xuất khỏi ứng dụng web, thông tin phiên PHP sẽ bị xóa.
Kỹ thuật này yêu cầu liệt kê để đọc tệp cấu hình PHP trước, và sau đó chúng tôi biết các tệp phiên PHP đang ở đâu. Sau đó, chúng tôi đưa một mã PHP vào phiên và cuối cùng gọi tệp qua LFI. PHP lưu trữ dữ liệu phiên trong các tệp trong hệ thống ở các vị trí khác nhau dựa trên cấu hình. Sau đây là một số vị trí phổ biến mà PHP lưu trữ:
c:\Windows\Temp
/tmp/
/var/lib/php5
/var/lib/php/session
Khi kẻ tấn công tìm thấy nơi PHP lưu trữ tệp phiên và có thể kiểm soát giá trị của phiên của họ, kẻ tấn công có thể sử dụng nó để khai thác chuỗi với LFI để thực thi lệnh từ xa.
Nếu chúng tôi liệt kê và đọc cấu hình PHP của ứng dụng web dễ bị tấn công mà chúng tôi đã cung cấp, chúng tôi có thể thấy rằng nó lưu trữ các phiên PHP vào thư mục /tmp. Nó cũng lưu trữ giá trị của tên người dùng vào phiên ngay cả khi bạn không đăng nhập vì giá trị này được nhà phát triển cần để sử dụng nó trong chức năng nhật ký. Chúng tôi đưa mã PHP vào phần người dùng trong hình sau, được lưu trữ trong tệp phiên PHP.
Để tìm tên tệp phiên PHP, PHP, theo mặc định sử dụng lược đồ đặt tên sau, sess_ <SESSION_ID>, nơi chúng tôi có thể tìm thấy SESSION_ID bằng trình duyệt và xác minh cookie được gửi từ máy chủ.
Để tìm ID phiên trong trình duyệt, bạn có thể mở công cụ dành cho nhà phát triển (SHIFT + CTRL + I), sau đó là tab Ứng dụng. Từ menu bên trái, chọn Cookies và chọn trang web mục tiêu. Có một PHPSESSID và giá trị. Trong trường hợp của tôi, giá trị là vc4567al6pq7usm2cufmilkm45. Do đó, tệp sẽ có dạng sess_vc4567al6pq7usm2cufmilkm45. Cuối cùng, chúng tôi biết nó được lưu trữ trong /tmp. Bây giờ chúng ta có thể sử dụng LFI để gọi tệp phiên.
https://LAB_WEB_URL.p.thmlabs.com/login.php?err=/tmp/sess_vc4567al6pq7usm2cufmilkm45
Do đó, chúng tôi sẽ có mã PHP mà chúng tôi đã chèn vào tệp tên người dùng được hiển thị trên trang. Bây giờ hãy áp dụng những gì chúng ta đã thảo luận để đạt được RCE trên máy chủ web bằng cách sử dụng LFI đến RCE thông qua các phiên PHP. Bây giờ đến lượt bạn cố gắng lấy RCE thông qua phiên PHP.
Tài nguyên bổ sung
Nếu bạn muốn tìm hiểu thêm về các lỗ hổng bao gồm tệp, hãy xem file inclusion room trên TryHackMe.
Triển khai máy victim và truy cập
Use the PHP filter technique to read the source code of the index.php. What is the $flag variable's value?
Thực hiện dùng PHP filter để lấy nội dung tệp index.php mã hóa base64
Nó thụt tận dưới nên bạn cứ copy rồi cho lên trang cyberchef hoặc bất kỳ trình giải mã base64 nào nhé
McSkidy forgot his login credential. Can you help him to login in order to recover one of the server's passwords?
Now that you read the index.php, there is a login credential PHP file's path. Use the PHP filter technique to read its content. What are the username and password?
Vẫn kỹ thuật đó đọc nội dung của tệp creds.php chúng ta thực hiện tìm ra username và password
The web application logs all users' requests, and only authorized users can read the log file. Use the LFI to gain RCE via the log file page. What is the hostname of the webserver? The log file location is at ./includes/logs/app_access.log.
Sử dụng lại kỹ thuật php filter để đọc ./includes/logs/app_access.log
Chờ một lúc bạn load lại trang access log sẽ có nhé
0 Comments