[Dreamhack] Dreampring
문제 설명
- Dreampring 서비스의 취약점을 찾아 플래그를 획득하세요.
풀이
문제 소스 코드를 받아보면 war 파일 하나랑 Dockerfile 밖에 존재하지 않는다.
일단 문제 이름과 war 파일로 보았을때 문제가 spring과 관련된 것 같다. 문제 사이트에 접속해보면 아래와 같다.
계정을 생성하려고 하니 아래와 같이 Username을 정규표현식에 맞춰서 작성해야 한다고 한다.
guest와 비밀번호는 임의로 작성해서 일단 계정을 생성을 해보면 Profile 경로에서 사용자 이름과 설명, 이메일이 출력되고 있다.
새로운 계정을 만들어서 특수문자를 테스트해보면 아래와 같이 필터링 처리가 되어서 xss 는 쉽지 않아 보인다.
war 파일을 분석하기 위해 jar xvf
명령을 이용해서 war 파일을 풀어주었다.
풀어서 확인해보면 WEB-INF 폴더 아래 jsp 파일들을 확인해볼 수 있다. 여기서 admin과 관련된 jsp 파일들이 존재하고 있다.
/admin 경로로 접속해보니 you are not admin
문자열로 관리자가 아니라는 에러 alert 창이 뜨고 있다.
main.jsp 파일을 보면 메인 페이지에서 roleid 값이 1337이라면 /admin 경로를 띄워주는 것을 알 수 있다.
class 파일들은 jadx-gui를 이용해서 소스 코드를 분석할 수 있다. MainApplication을 보면 관리자 이름을 admin으로 지정하여 PasswordUtil.generate()
를 이용해 패스워드를 넣고 있다. 또한 WinError.ERROR_INVALID_SID
가 아마도 1337 값이고, intro 부분에 flag값이 저장되는 것을 알 수 있다.
Services 폴더를 보면 현재 경로의 data 폴더 안에 username.json 파일이 계정을 생성하면 저장된다는 것을 알 수 있다.
HTTPUtil 부분을 보면 X-Forwarded-For 등 헤더에서 IP를 가져오기 때문에 아래 XFF 헤더를 설정해주고, roleId 값을 1337로 설정하여 패킷을 보낸 후 data/guest2.json 파일을 확인해보면 ip와 roleId값이 1337로 잘 설정된 것을 확인할 수 있다.
MainController 부분을 살펴보면, 로그인할 때 roleId 값이 1337이고, 요청하는 IP와 저장된 IP가 127.0.0.1인지 검사하고 있다. 따라서 Burp로 프록시를 잡아 XFF헤더에 127.0.0.1 값을 넣어주면 아래와 같이 Admin 네비게이션 탭이 뜬 것을 확인할 수 있다.
그럼 이제 admin 탭에 들어가서 Username 검색 창에 admin을 입력하면 아래 flag 값이 뜨는 것을 확인할 수 있다. Docker에서 확인했으므로 dreamhack 서버에서도 똑같이 수행해주면 되겠다.
댓글남기기