Normaltic CTF - Auth 1~4

심야·2023년 7월 13일
0
post-thumbnail

Auth 1

Login Page

문제 사이트에 접속하니 로그인 페이지를 출력한다. 로그인 페이지를 우회하기 앞서 버프스위트의 HTTP history 탭에서 통신 과정을 살펴보겠다.

HTTP history

문제 사이트에 접속하면 로그인 페이지를 응답하는 것이 아니라 /auth1/ 페이지를 응답하고 해당 페이지에서 자바스크립트를 사용해 로그인 페이지로 리다이렉트한다.

로그인 페이지를 우회하는 것이 목적이므로 인터셉트로 /auth1/ 페이지의 자바스크립트 코드를 제거하겠다.

자바스크립트 코드를 제거하니 아래와 같이 미사일 발사 버튼 페이지가 출력된다.

Fire 버튼을 클릭하고 응답 페이지를 인터셉트 해 확인하니, 이번에도 로그인 페이지로 리다이렉트하는 자바스크립트 코드가 있다.

자바스크립트 코드를 제거한 응답 페이지는 관리자만 이용 가능하다고 안내한다.

확인 버튼을 클릭한 뒤, 응답 페이지를 인터셉트 했는데, 이번에도 로그인 페이지로 리다이렉트 하는 자바스크립트 코드가 있다. 다시 제거하겠다.

관리자 비밀번호를 입력하라고 안내한다. 관리자 계정을 모르는 상태이니 우회 방법을 찾아야 한다.

버튼을 클릭할 때 응답하는 URL을 보니 일정한 패턴이 있다. 그림에서 보듯이 step 문자열과 숫자를 조합해 URL을 만들었다. 비밀번호를 입력하고 인증 버튼을 누르면 step3.php 를 응답할 것 같다.

URL에 /auth1/step3.php 를 요청하고 응답 페이지를 인터셉트 해 확인하니 로그인 페이지로 리다이렉트 하는 자바스크립트 코드가 있다. 자바스크립트 코드를 제거하겠다.

발사를 원하면 버튼을 클릭하라는 페이지가 출력되었다. 발사 버튼을 클릭하겠다.

클릭한 결과, FLAG를 획득하였다.

Auth 2

mario / mariosuper 계정으로 접속하니 발사 버튼은 관리자만 이용 가능하다는 페이지를 응답한다.

그러나 소스 코드를 보니 발사 버튼이 주석으로 처리되어 있다.

주석을 제거하니 발사 버튼을 출력한다.

발사 버튼을 클릭한 결과, FLAG를 출력한다.

Auth 3

제공하는 관리자 계정으로 접속하니 관리자만 이용 가능한 발사 버튼을 출력한다.

버튼을 클릭했으나 권한이 없다는 알림이 발생한다. 그리고 버프스위트로 버튼을 클릭했을 때 통신 과정을 인터셉트 하려 했으나 인터셉트 되지 않는다. 추측하건대 서버에 권한 인증을 요청하지 않고 클라이언트 측에서 자바스크립트로 처리하는 것 같다.

소스 코드를 살펴보니 발사 버튼을 클릭할 때 onclick 이벤트가 발생한다. 그리고 이벤트가 발생하면 goMenu() 함수를 호출한다.

그러나 소스 코드에 goMenu() 함수가 없다. 이는 자바스크립트를 파일로 가져오기 때문이다. 소스 코드를 살펴보니 user.js , game.js 파일을 가져온다.

user.js 파일 코드를 보니 goMenu() 함수와 user_auth_check 함수가 있다. onclick 이벤트가 발생하면 goMenu 함수를 호출하니 goMenu 함수부터 분석하겠다. 이벤트가 발생해 함수를 호출할 때 code와 userLevel 파라미터를 전달한다. code 값이 switch 의 케이스 값과 일치하면 user_auth_check 함수에 userLevel 값을 전달한다. user_auth_check 함수는 needLevel 과 userLevel 값이 같으면 true 를 반환한다. 지금 user_auth_check 함수는 admin 값만 전달하기 때문에 false 를 반환한다. 따라서 userLevel 인자 값으로 admin 을 입력하고 함수를 호출하면 needLevel과 userLevel이 같아 true 를 반환할 것이다.

핵 미사일 시스템을 다시 요청해 인터셉트한 응답 코드의 goMenu 함수 userLevel 인자 값으로 admin을 입력하고 인터셉트를 해제한다.

다시 발사 버튼을 누르니 권한 우회에 성공해 FLAG를 획득하였다.

Auth 4

이전 문제와 동일하지만 난이도가 어려워진 것 같다. 우선 페이지에 접속하겠다.

페이지에 접속하니 이전 문제와 동일한 페이지를 응답한다. 소스 코드를 살펴보겠다.

이번에도 goMenu 함수를 호출하며 함수는 user.js 자바스크립트 파일로 가져오는 것 같다.

user.js 소스 코드를 살펴보니 goMenu 함수 일부가 난독화 되어있다. 코드를 읽을 수 없으니 우선 발사 버튼을 눌러 어떻게 동작하는지 파악하겠다.

이번에도 버튼을 누르니 권한이 없다는 알림이 발생한다.

난독화로 인해 정확한 동작 원리는 유추할 수 없으나 이전 문제와 동일하게 user_auth_check 함수에서 admin 권한인지 확인한다. 따라서 gomenu 함수의 userLevel 인자 값으로 admin 을 입력하고 버튼을 클릭하겠다.

버튼을 클릭한 결과, FLAG를 획득하였다.

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글