건들이지도 못한 google ctf write up 공부해보기
문제 페이지는 다음과 같다.
https://log4j-web.2022.ctfcompetition.com/
코드를 분석해보다가 특정 cmd 몇가지를 테스트하였다.
private static void doCommand(String cmd, String[] args) {
switch(cmd) {
case "help":
doHelp();
break;
case "repeat":
System.out.println(args[1]);
break;
case "time":
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/M/d H:m:s");
System.out.println(dtf.format(LocalDateTime.now()));
break;
case "wc":
if (args[1].isEmpty()) {
System.out.println(0);
} else {
System.out.println(args[1].split(" ").length);
}
break;
default:
System.out.println("Sorry, you must be a premium member in order to run this command.");
}
}
private static void doHelp() {
System.out.println("Try some of our free commands below! \nwc\ntime\nrepeat");
}
그냥 내가 치고 싶은 cmd를 치면 앞에 /붙어야 한다고 하고 실행되지 않는다. 반대로, /를 붙이면 권한 상승을 요구한다.
/를 우회하기 위해 인코딩하여 %2f를 입력했더니 다음과 같은 에러 메시지들을 확인할 수 있었다.
여기까지만 보고 권한만 상승하면 되겠다는 생각에만 빠져 더 이상 건들이지 못했다.
이 다음부터는 write up을 참고했다.
참조한 write up에 따르면,
String flag = System.getenv("FLAG");
flag를 환경변수에 저장하고 있음을 알 수 있다.
여기서 제안하는 방법은 Log4j-Lookup 방법인데, 이는 임의의 위치에서 Log4j 구성에 값을 추가하는 방법을 이용하는 것이다.
여러가지 조회가 있는데, Context Map Lookup, Date Lookup, Environment Lookup, EventLookup, Java Lookup, Jndi Lookup, JVM Input Arguments Lookup (JMX) 등 다양하게 존재한다. 그 중에서 우리는 flag가 환경변수 안에 저장되어 있으므로 Environment Lookup 방법을 이용할 예정이다.
참고 :
https://logging.apache.org/log4j/2.x/manual/lookups.html
(this allows you to print environment variables to logs) -> 우리가 Environment Lookup 방법을 이용하면 환경변수를 로그로 출력할 수 있다.
<File name="Application" fileName="application.log">
<PatternLayout>
<pattern>%d %p %c{1.} [%t] $${env:USER} %m%n</pattern>
</PatternLayout>
</File>
%d %p %c{1.} [%t] $${env:USER} %m%n 이부분을 이용해서 print하도록 만드는 것 같다.
다양한 조합들을 해보다가 %d{ } 안에 ${env:FLAG}를 입력값으로 넣으면 로그가 보인다.
여기서 JAVA Lookup까지 이용한다. Java Lookup을 사용하면 java: 접두사를 사용하여 편리한 사전 포맷된 문자열로 Java 환경 정보를 검색하는 기능을 이용한다.
<File name="Application" fileName="application.log">
<PatternLayout header="${java:runtime} - ${java:vm} - ${java:os}">
<Pattern>%d %m%n</Pattern>
</PatternLayout>
</File>
다음과 같은 예시를 보면 ${java: 접두사를 이용해 검색한다.
${java: ${env:FLAG} }
flag 확인 가능
느낀점 : java에 대한 이해가 부족하다보니 손댈수 없었다. 솔직히 write up을 보면서도 이해가 가지 않는 부분이 많았다. java 공부를 해야 겠다고 생각했다.
참고한 write up
https://cybernorth.net/writeups/log4j-writeup-google-ctf-2022/#10