Advertisement

Responsive Advertisement

Advent of Cyber 2 [2020] - Tryhackme - Write Up - Day 2

 

Task 7  [Day 2] Web Exploitation The Elf Strikes Back!

Sau những hành động anh hùng của bạn giành lại quyền kiểm soát trung tâm điều khiển vào ngày hôm qua, Elf McSkidy đã quyết định giao cho bạn một công việc quan trọng phải làm.

"Chúng tôi biết mình đã bị tấn công, vì vậy chúng tôi cần có cách để tự bảo vệ mình! Nhóm nhà phát triển đã thiết lập một trang web cho các chú lùn để tải lên hình ảnh của bất kỳ người nào đáng ngờ quanh quẩn trong nhà máy, nhưng chúng tôi cần đảm bảo rằng nó đã an toàn trước khi chúng tôi thêm nó vào mạng công cộng. Vui lòng thực hiện kiểm tra bảo mật trên máy chủ mới và đảm bảo rằng nó không thể bị phá hủy! "

Bạn nghe tóm tắt và nhận nhiệm vụ, nhấn nút triển khai để khởi động máy chủ. 

McSkidy một lần nữa cung cấp cho bạn một hồ sơ thông tin hữu ích để giúp bạn thực hiện nhiệm vụ của mình, bạn sẽ đọc được khi đợi máy chủ khởi động:

GET Parameters and URLs

Bạn hãy xem xét sơ qua sự khác biệt giữa yêu cầu GET và POST trong hồ sơ trước; tuy nhiên, trọng tâm là các yêu cầu POST được sử dụng trong biểu mẫu đăng nhập. Máy chủ bạn sẽ kiểm tra hôm nay sử dụng một khái niệm gọi là "thông số GET" . Cũng giống như các yêu cầu POST có thể được sử dụng để gửi thông tin đến máy chủ, các yêu cầu GET cũng có thể được sử dụng; tuy nhiên, có một điểm khác biệt quan trọng. Với các yêu cầu POST, dữ liệu được gửi đi sẽ được đưa vào "nội dung" của yêu cầu. Với các yêu cầu GET, dữ liệu được đưa vào URL dưới dạng "tham số". Điều này được chứng minh bằng một ví dụ:

https://www.thebestfestivalcompany.xyz/index.php?snack=mincePie

(Xin lưu ý: trang web này là hoàn toàn hư cấu. Nó không tồn tại và kết nối với nó không phải là một phần của nhiệm vụ)

Có 7 phần khác nhau tạo nên URL này. Chúng ta hãy lần lượt xem xét từng người trong số họ:

  1. Đầu tiên, chúng ta có giao thức (https://). Điều này chỉ định liệu yêu cầu nên được thực hiện bằng HTTP hay HTTPS. Trong ví dụ này đang sử dụng HTTPS.
  2. Tiếp theo, chúng ta có tên miền phụ (www). Theo truyền thống, đây là "www" (World Wide Web) để biểu thị rằng mục tiêu là một trang web; tuy nhiên, điều này không phải là điều cần thiết. Thật vậy, tên miền phụ về cơ bản có thể là bất cứ thứ gì bạn muốn; ví dụ: rất nhiều trang web sử dụng những thứ như "assets", hoặc "api" để chỉ ra các miền phụ khác nhau với các mục đích sử dụng khác nhau. (ví dụ. https://api.thebestfestivalcompany.xyz)
  3. Phần tiếp theo của URL là miền (thebestfestivalcompany). Tên miền cần được đăng ký và được sử dụng làm liên kết giữa một từ hoặc cụm từ dễ nhớ và địa chỉ IP. Nói cách khác, chúng được sử dụng để đặt tên cho máy chủ đang chạy một trang web.
  4. Tiếp theo, chúng tôi có TLD (Tên miền cấp cao nhất) -- .xyz, làm ví dụ. Miền cấp cao nhất được DNS sử dụng để xác định vị trí cần xem nếu họ muốn tìm thấy miền của bạn. Các miền cấp cao nhất trước đây có các mục đích sử dụng cụ thể (và nhiều miền vẫn còn như vậy!), Nhưng ngày nay điều này không phải lúc nào cũng đúng. Ví dụ:  .co.uk  cho biết một công ty có trụ sở tại Vương quốc Anh, .com cho biết một công ty có trụ sở tại Hoa Kỳ.
  5. Sau đó, chúng tôi có tài nguyên mà chúng tôi đang chọn - trong trường hợp này là trang chủ của trang web: index.php. Lưu ý thêm, tất cả các trang chủ phải được gọi là "chỉ mục" để được máy chủ web phân phối chính xác mà không cần phải được chỉ định đầy đủ, trừ khi thông số này đã được thay đổi từ mặc định trong cấu hình máy chủ web. Đây là cách bạn có thể truy cập https://tryhackme.com mà không cần phải chỉ định rằng bạn muốn nhận trang chủ - trang chỉ mục được phục vụ tự động vì bạn không chỉ định!
  6. Hai khía cạnh cuối cùng của URL là quan trọng nhất đối với chủ đề hiện tại của chúng tôi: cả hai đều liên quan đến tham số GET. Đầu tiên chúng ta có ?snack=. Ở đây  ? được sử dụng để chỉ định rằng một tham số GET sắp xuất hiện. Sau đó chúng ta có tên tham số: snack. Điều này được sử dụng để xác định tham số cho máy chủ. Sau đó, chúng ta có một dấu bằng (=), cho biết rằng giá trị sẽ đến tiếp theo.
  7. Cuối cùng, chúng ta có giá trị của tham số GET:  mincePie, bởi vì ai lại không thích bánh nướng nhân thịt, đúng không?

Điều quan trọng cần lưu ý là chính xác phần nào của URL là tham số GET. Cụ thể, chúng ta đang nói về ?snack=mincePie. Nếu có nhiều hơn một tham số, chúng tôi sẽ phân tách chúng bằng dấu và (&). Ví dụ: ?snack=mincePie&drink=hotChocolate. Bằng cách này, bạn có thể gửi nhiều giá trị đến máy chủ, được phân biệt bằng các khóa (tức là "mincePie" được xác định bằng khóa: "snack").

File Uploads

Có vô số cách sử dụng để tải tệp lên trên internet hiện đại - ảnh hồ sơ, hồ sơ của trường / đại học, sơ đồ, hình ảnh về con chó của bạn, bạn có thể đặt tên cho nó! Mặc dù tải lên tệp rất phổ biến, nhưng chúng cũng rất dễ thực hiện theo cách không an toàn. Vì lý do này, điều quan trọng là chúng ta phải hiểu lực hấp dẫn của vectơ tấn công.

Khi bạn có khả năng tải tệp lên máy chủ, bạn có một đường dẫn thẳng đến RCE (Thực thi lệnh từ xa). Một biểu mẫu tải lên không có hạn chế có nghĩa là bạn có thể tải lên một tập lệnh, khi được thực thi, nó sẽ kết nối trở lại với máy tấn công của bạn và cung cấp cho bạn khả năng chạy bất kỳ lệnh nào bạn muốn. Sẽ rất bất thường nếu tìm thấy một tệp tải lên mà không có bộ lọc; nhưng ít phổ biến hơn nhiều khi tìm thấy một tệp tải lên sử dụng các kỹ thuật lọc sai sót có thể bị phá vỡ để tải lên một tập lệnh độc hại. Tập lệnh phải được viết bằng ngôn ngữ mà máy chủ có thể thực thi. PHP thường là một lựa chọn tốt cho việc này, vì hầu hết các trang web vẫn được viết bằng PHP back end.

Không có thời gian để xem qua mọi loại bỏ qua bộ lọc trong nhiệm vụ này (nghĩa là có cả một căn phòng về chủ đề này, được khuyến nghị để thực hành thêm). Thay vào đó,trang này sẽ chỉ đề cập đến một trong những loại bộ lọc phổ biến nhất và bỏ qua của nó:

  • Lọc phần mở rộng tệp: Như tên cho thấy tính năng lọc phần mở rộng kiểm tra phần mở rộng tệp của các tệp được tải lên. Điều này thường được thực hiện bằng cách chỉ định danh sách các phần mở rộng được phép, sau đó kiểm tra tệp đã tải lên so với danh sách. Nếu tiện ích không có trong danh sách cho phép, tải lên sẽ bị từ chối.
  • Vì vậy, đường vòng là gì? Chà, câu trả lời là nó phụ thuộc hoàn toàn vào cách bộ lọc được triển khai. Nhiều bộ lọc tiện ích mở rộng tách một tên tệp tại dấu chấm (.) Và kiểm tra những gì đứng sau tên tệp đó so với danh sách. Điều này làm cho nó rất dễ dàng bỏ qua bằng cách tải lên một tiện ích mở rộng hai nòng (ví dụ: .jpg.php). Bộ lọc phân tách tại (các) dấu chấm, sau đó kiểm tra xem nó nghĩ gì là phần mở rộng so với danh sách. Nếu jpg là một phần mở rộng được phép thì quá trình tải lên sẽ thành công và tập lệnh PHP độc hại của chúng tôi sẽ được tải lên máy chủ.

Khi triển khai hệ thống tải lên, bạn nên tải tệp lên một thư mục không thể truy cập từ xa. Thật không may, trường hợp này thường không xảy ra và các tập lệnh được tải lên một thư mục con trên máy chủ web (thường là những thứ như  /uploads/images/media, hoặc/resources). Ví dụ: chúng tôi có thể tìm thấy tập lệnh đã tải lên tại https://www.thebestfestivalcompany.xyz/images/shell.jpg.php.

Reverse Shells

Giả sử rằng chúng tôi đã tìm thấy một nơi nào đó để tải lên tập lệnh độc hại của mình và chúng tôi đã bỏ qua bộ lọc - sau đó thì sao? Có một số cách mà chúng ta có thể thực hiện: cách phổ biến nhất là tải lên một trình bao ngược lại. Đây là một tập lệnh tạo kết nối mạng từ máy chủ đến máy tấn công của chúng tôi. Phần lớn các máy chủ web được viết bằng PHP back end, có nghĩa là chúng ta cần một script ngược PHP - có một tập lệnh đã có trên Kali / AttackBox tại /usr/share/webshells/php/php-reverse-shell.php (Lưu ý: nếu bạn không sử dụng Kali hoặc AttackBox được cung cấp, bạn có thể tìm thấy tập lệnh tương tự tại đây .

  • Sao chép webshell vào thư mục hiện tại của bạn (cp /usr/share/webshells/php/php-reverse-shell.php .), Sau đó mở nó bằng trình soạn thảo văn bản mà bạn chọn.
  • Cuộn xuống nơi nó có $ ip và $ port (cả hai đều được đánh dấu bằng // THAY ĐỔI NÀY). Đặt IP thành Địa chỉ IP TryHackMe của bạn (có thể tìm thấy trong bong bóng màu xanh lục trên thanh điều hướng, nếu bạn đang sử dụng AttackBox hoặc bằng cách chạy ip a show tun0 nếu bạn đang sử dụng máy ảo Linux của riêng mình với gói kết nối OpenVPN ) - đảm bảo giữ dấu ngoặc kép. Đặt cổng thành 443 không có dấu ngoặc kép, sau đó lưu và thoát tệp. Xin chúc mừng, bây giờ bạn đã có một tập lệnh shell ngược PHP được cấu hình đầy đủ!



Các trình bao đảo ngược PHP có thể rất dễ dàng được kích hoạt khi được lưu trữ ở một vị trí có thể truy cập được: chỉ cần điều hướng đến tệp trong trình duyệt của bạn để thực thi tập lệnh (và gửi trình bao ngược):

Trong sơ đồ, đầu tiên chúng tôi tải lên trình bao của chúng tôi. Sau đó, chúng tôi điều hướng đến nó trong trình duyệt của mình, khiến máy chủ gửi một trình bao ngược trở lại trình lắng nghe đang chờ của trang này.


Reverse Shell Listeners

Chúng ta đã nói nhiều về trình nghe trình bao ngược, nhưng chúng là gì? Nói tóm lại, một trình lắng nghe trình bao ngược được sử dụng để mở một ổ cắm mạng để nhận một kết nối thô - giống như kết nối được tạo bởi một trình bao ngược đang được thực thi! Dạng trình lắng nghe đơn giản nhất được tạo bằng cách sử dụng một chương trình có tên là netcat, được cài đặt trên cả Kali và AttackBox theo mặc định. Chúng ta có thể tạo một trình lắng nghe cho một trình bao ngược được tải lên bằng cách sử dụng lệnh này: sudo nc -lvnp 443. Về cơ bản, điều này tạo một trình nghe trên cổng 443. Trong môi trường thế giới thực, bạn sẽ muốn sử dụng một cổng chung chẳng hạn như 443. không bị lọc bởi tường lửa trong hầu hết các tình huống, tăng khả năng trình bao ngược của chúng tôi kết nối trở lại .. Khi netcat đã được thiết lập, trình bao ngược của chúng tôi sẽ có thể kết nối lại với trình này khi được kích hoạt.


Putting it all together

Đây là rất nhiều thông tin, vì vậy hãy tổng hợp tất cả lại với nhau và xem toàn bộ quy trình khai thác lỗ hổng tải tệp lên trong một ứng dụng web PHP:

  • Tìm một điểm tải lên tệp.
  • Hãy thử tải lên một số tệp vô tội - nó chấp nhận những gì? (Hình ảnh, tệp văn bản, PDF, v.v.)
  • Tìm thư mục chứa các video tải lên của bạn.
  • Cố gắng bỏ qua bất kỳ bộ lọc nào và tải lên một trình bao ngược lại.
  • Khởi động trình nghe netcat để nhận shell
  • Điều hướng đến shell trong trình duyệt của bạn và nhận kết nối!
  • Ở dưới cùng của bộ hồ sơ là một tờ giấy dính có nội dung sau:

Đối với Elf McEager:

Bạn đã được chỉ định một số ID để kiểm tra hệ thống của mình: ODIzODI5MTNiYmYw. Sử dụng điều này để có quyền truy cập vào phần tải lên của trang web.

Chúc may mắn!

Bạn ghi chú lại số ID và điều hướng đến địa chỉ IP hiển thị (MACHINE_IP) trên trình duyệt của bạn.

Answer the questions below

What string of text needs adding to the URL to get access to the upload page?

What type of file is accepted by the site?

Truy cập website một gợi ý ?id=your_id_here


Lấy id họ cho và dán vào truy cập đây là một trang upload tệp tin.

Mình kiểm tra mã nguồn thấy được nó có thể upload



Định dạng upload file ảnh là png, jpeg, jpg

Mình dựa theo gợi ý đường dẫn lưu tệp upload mình phát phiện /uploads, mình thử tải lên tệp tin shell.jpg.php thì thấy rằng nó không check tệp tin shell với 2 định dạng khác nhau nó chỉ check định dạng file sau 1 dấu chấm.

File đó là php revere shell lên mạng là có.


Bypass the filter and upload a reverse shell.

In which directory are the uploaded files stored?

Activate your reverse shell and catch it in a netcat listener!

Đồng thời bạn vừa bấm file đó và sau đó  mình thu được trình kết nối ngược


What is the flag in /var/www/flag.txt?

Thực hiện vào đường dẫn này đọc cờ thôi



Post a Comment

0 Comments