상세 컨텐츠

본문 제목

Segfault CTF - (5주 차) Admin is Mine

컴퓨터/보안 - CTF문제

by 디멘터 2024. 5. 20. 23:30

본문

※ 주의 : 보안 관련 학습은 자유이지만, 학습 내용을 사용한 경우 법적 책임은 행위자에게 있습니다.
(Note: Security-related learning is allowed, but the individual is solely responsible for any legal consequences arising from the use of the acquired knowledge.)

※ CTF - Capture The Flag

※ 문제 푸는 방법이 다양할 수도 있습니다.


SegFault CTF - Admin is Mine

 

 

1. 주어진 정보 : 계정 하나 (ID / PW : doldol / dol1234), 목표는 admin 계정으로 접속하기.

 

2. 정상 로그인해서 과정 살펴보기.

 

정상로그인 시 response에서 result를 ok를 준다.

→ response를 조작해보자.

→ proxy setting에서 아래와 같이 response inerception rules을 활성화하고 체크 해준다.

 

doldol로 로그인 한 상태에서 뒤로가기를 하여 로그인페이지로온다.

→ 인터셉트 모드를 켜고,

→ admin을 입력하고 pw는 아무거나 넣어준다.

 

 

doldol로 로그인 되어 있는 상태에서 뒤로가기를 눌러 로그인페이지로 온다.
response로 당연히 fail이 올 것인데 이걸 ok로 바꿔주고 forward를 누르자.

 

 

4. 성공

 

5. 다른 방법 확인

 

개발자 도구를 켜면 JS로 로그인 처리를 하고 있는 것을 확인 할 수 있다.
우클릭 하여 소스패널에서 열기를 눌러 수정을 해보자.
if (resultData == "ok") 이부분이 아까 response에서 ok로 왔던 부분이다. 하지만 나는 reultData == reultData 이렇게 바꿀 것이다.

 

→ 자바스크립트가 로그인 처리를 하고 있다. 스크립트는 클라이언트 단에서 실행하는 것이라 조작이 가능하다.

→ 코드를 보면 resultData 값이 "ok"이면 주석에 로그인 성공이라고 친절히 작성되어 있고, index.php로 리다이렉션 한다.

→ if (resultData == "ok") 부분을  if (resultData == resultData) 로 수정했다.(ctrl+S)

→ 그리고 id에는 admin, pw는 아무거나 입력하고 로그인을 누르면

 

로그인 성공

 

6. 성공

→ 이 또한, doldol로 로그인되어 있는 상태에서 로그인 창으로 와야한다.

확실히는 잘 모르겠지만 아마 세션 id를 덮어쓰는 방식인건지?? (아시는 분 댓글 달아주시면 감사하겠습니다.)

 

→ Burp suite로 response를 수정해도 되고, response를 받아서 작동하는 JS를 수정해도 된다.

 

7. 잘 몰랐던 부분 (수업듣고 이해함.)

● doldol로 로그인 해서 뒤로가기 ☞ admin ☞ result 위조로 해야만 되었던 이유

→ burp suite로 잘 살펴보면 정상로그인 과정은 login.php ☞ loginProc.php ☞ index.php

→ ID를 admin으로 바꾸고 response를 수정해서 로그인을 시도할 경우 login.php ☞ loginProc.php ☞ login.php

인터셉터에서 살펴 보면 <script>location.href='login.php';</script> 스크립트가 껴있다.

→ 아마도 세션ID로 로그인 체크 후, 로그인 상태가 아니라면 로그인 페이지로 튕겨내는 코드로인해 발생한 스크립트인 것 같다.

로그인이 성공적으로 되지 않았기 때문에 login.php로 다시 돌아가라고 한다.

 

→ 즉, 정상 로그인이 되지 않았으니 login.php로 다시 보내는 것으로 보이는데

사실 잘 살펴보면 플래그가 있다.

 

즉, 로그인이 완료되지 않았음에도 로그인 후에 보여야할 값이 보인 헛점이 있었던 것이다.

→ 나는 doldol이라는 정상 로그인된 세션ID가 있었기 때문에, login.php 페이지로 튕기지 않고 index.php로 가서 플래그가 보였던 것이다.

→ 로그인 과정을 면밀히 살펴본 것이아니고, 문제를 빨리 풀기위해 이것 저것하다가, 맞춰버리니 로직이 정확히 파악되지 않았던 것이 문제였다.

관련글 더보기