admin 계정의 패스워드를 찾아 로그인에 성공하면 flag 값을 얻을 수 있는 문제이다.
테스트로 무작위 패스워드 입력 후 로그인을 시도했다.
응답 패킷을 보니 실패 했다는 메시지가 응답으로 왔다.
아이디 입력값에 인젝션을 시도해보고,
비밀번호에도 sql 오류가 발생하는지 확인해보았지만 똑같은 실패 메시지만 응답으로 왔다.
페이지 내 소스코드에서 admin 문자열을 검색해보았지만 도움이 될만한 정보가 없었고,
로드 된 스크립트 파일 내에서도 존재하지 않았다.
burp suite에서 해당 페이지에 접속했을 때 주고받은 패킷들을 살펴보았다. 스크립트 파일 내에서는 admin 관련 정보를 찾을 수 없었지만,
로드된 png 이미지 파일 내에 admin 계정 정보가 평문으로 노출되어 있음을 알 수 있었다.
획득한 비밀번호로 admin 계정에 로그인 시도하면 flag 값을 획득할 수 있다.
Larry 라는 계정으로 로그인하면 flag 값을 구할 수 있을 것으로 보인다.
페이지 내 소스코드에서는 Larry 계정 관련 정보는 찾을 수 없었고,
패스워드 찾기 버튼도 링크 없이 존재해서 별다른 정보를 얻을 수 없었다.
일단 Larry 계정으로 로그인을 시도했더니 정확한 패스워드를 입력하라는 메시지를 리턴했다.
ID 입력칸에 SQL 인젝션을 시도했지만 쿼리문으로 처리되지 않았다.
하지만 패스워드 파라미터에 인젝션을 시도해보니,
위와 같이 상세 에러 메시지가 리턴되었다.
에러 메시지를 살펴보니 서버에서 처리되는 쿼리문 구조를 알 수 있었다.
패스워드 파라미터에 항상 참인 조건문으로 인젝션 공격을 시도하면 성공적으로 flag 값을 구할 수 있다.
admin 계정의 패스워드를 초기화 하면 flag 값을 구할 수 있을 것으로 보인다.
일단 가입된 계정으로 패스워드 초기화 요청을 보내보았다.
WebWolf로 가입된 계정으로 로그인한 후 메일함을 확인해보면 패스워드 초기화 링크 메일이 온 것이 확인된다.
메일에 있는 링크 url을 확인해보면 위와 같은 구조로 되어 있음을 알 수 있다.
링크를 클릭하면 admin 패스워드 초기화 링크가 아니라는 페이지가 표시된다.
링크 끝에 있는 값을 지운채 요청을 보내면 404 에러를 리턴하고,
다른 값으로 변경하면 마찬가지로 admin 패스워드 초기화 링크가 아니라는 페이지가 표시된다. 패스워드 초기화 링크를 요청할 때마다 url 끝에 있는 파라미터 값이 변경되는 것으로 보아 admin 계정으로 신청했을 때 서버에서 메일로 리턴해주는 값을 구해야 하는 것으로 보인다.
패스워드 초기화 요청 패킷에서 파라미터 값을 조작해보았지만, 별다른 취약점 포인트가 발견되지 않았다.
결국 admin 계정의 패스워드 초기화 링크를 얻으러면 서버에서 admin 계정의 메일로 보내는 링크를 구해야 하는데, 별다른 방법을 구하기 힘들어 힌트를 구해보니 해당 페이지에서 git repository 노출 취약점이 존재한다는 것을 알 수 있었다.
(https://www.netspi.com/blog/technical/network-penetration-testing/dumping-git-data-from-misconfigured-web-servers/)
패스워드 초기화 요청 url 끝에 .git을 추가하여 요청을 보내면 content-type이 zip인 응답 패킷을 받게 된다.
브라우저에서 해당 url을 입력하면 git 파일을 다운로드 받을 수 있고, 받은 zip 파일을 압축 해제를 했다.
압축 해제 후, git status
명령어를 통해 작업 폴더 상태를 확인해보니 삭제된 파일이 존재했다.
그 후 삭제 된 파일을 git restore
명령어로 복구해보았다. 복구한 파일 중 PasswordResetLink.class
파일이 java 클래스 파일로 내부에 정보가 존재할 것으로 보였다.
해당 파일을 jd-gui
로 디컴파일을 해보니, main 메소드가 존재했고, 실행 시 두 개의 인자값을 입력 받는데, username과 key 값을 입력 받아 패스워드 초기화 링크를 생성하는 로직이였다. username은 admin으로 입력하면 될 것으로 보이지만, 따로 key 값에 대한 정보가 존재하지 않았다.
git commit 로그를 보니 두번 째 commit 메시지가 하드코딩된 키 값을 지웠다고 되어 있었다. 그렇다는 건 commit을 롤백한다면 키값을 구할 수 있을 것이다.
롤백 후 다시 class 파일을 디컴파일 해보면 키값이 하드코딩 되어 있는 것을 알 수 있다. 이제 입력 인자는 username 하나만 있어도 패스워드 초기화 링크를 구할 수 있게 되었다.
username으로 admin을 입력하면 성공적으로 패스워드 초기화 링크에 사용할 파라미터 값을 구할 수 있게 되고,
패스워드 초기화 링크 url에서 해당 값으로 수정 후 접속하면 성공적으로 flag값을 구할 수 있게 된다.
투표 기능을 실행하면 flag 값을 얻을 수 있는 것으로 보인다.
상단 별표를 누르면 투표 기능이 실행되는데 로그인이 필요하다는 메시지가 리턴된다.
투표 기능 실행시 서버로 3개의 요청 패킷을 보내는 것으로 알 수 있고, 각 별 개수를 파라미터로 보내서 투표 요청을 보내는 것으로 보인다.
일단 별 개수 파라미터를 삭제한 채로 요청을 보내면 404 에러를 리턴한다.
요청 메소드를 POST로 변경 후 요청을 보내면 지원하지 않는 메소드라고 리턴 메시지를 보내준다.
지원하는 메소드가 어떤 게 있는지 확인하기 위해 OPTIONS 메소드로 요청을 보내면 허용 메소드가 GET, HEAD, OPTIONS로 되어 있다.
이 때 HEAD 메소드로 투표 요청 메시지를 보내면 리턴 패킷 내 X-Flag
헤더 값을 살펴보니 flag 값을 얻을 수 있다.