이번주 과제로 워게임 문제 만들어보기가 나왔다.
문제를 처음 만들어보는거라 뭘 해야할지도 몰라서 여기저기 찾아보았다.
뭔가 ctf write up은 많은데 문제 출제 후기는 별로 없어서 찾는 데 애를 먹었다.
일단 내가 찾아본 바로는
문제 흐름 짜기 -> 세부사항 설정 -> 실제 구현 -> 코드 수정(반복) -> 익스플로잇
의 흐름으로 보통 만드는 것 같았다.
그래서 나도 한번 만들어보기 위해서 일단 문제 시나리오부터 작성했다.
기법은 stored xss 와 csrf를 사용했다.
공격자가 memo 페이지에 방문자의 비밀번호를 변경시키는 스크립트를 삽입합니다.
방문자가(봇) memo 페이지를 방문할 때 마다 스크립트가 작동합니다.
login 페이지에서 변경된 방문자의 비밀번호를 가지고 로그인 하면 플래그를 획득할 수 있습니다.
의 간단한 구조를 생각했다.
flask를 활용해서 만들기로 했고,
문제를 처음 만들어보는거라 드림핵에서 풀었던 문제들의 구조를 생각하며 /(index) 페이지, memo 페이지, login 페이지를 만들어보기로 했다.
/(index) 페이지
로그인한 사용자의 아이디와 비밀번호 출력, login 페이지와 memo 페이지로 이동할 수 있게 구현
memo 페이지
메모를 작성할 수 있는 칸과 그 아래에 기존에 작성한 메모를 표시하는 기능 구현
login 페이지
로그인을 할 수 있는 기능 구현
세부사항으로는
세부사항
admin 권한을 가진 계정으로 로그인 하면 flag 획득할 수 있음
guest / guest, admin / "FLAG" 로 계정 생성
비밀번호를 변경할 수 있는 엔드포인트 /password_change 생성
admin 권한을 가진 세션 id 생성, 세션 id는 난수로 설정
비밀번호를 변경하기 위해서는 세션 id를 사용하여 사용자를 식별하도록 설정
만일 적절한 세션 id가 아니라면 다시 로그인 화면으로 리다이렉트
일정 시간마다 memo 페이지를 방문하는 봇 구현
봇에 어드민 권한을 가지고 있는 세션 id를 부여
따라서 어드민 권한을 가지고 있는 봇이 memo 페이지에 접근,
stored xss 기법으로 인하여 페이로드 발동, admin 계정의 비밀번호를 변경하고 로그인 할 수 있음
처음 만드는 문제이기도 하고, 그냥 개인 과제로 하는 거라 양해해주길 바란다,,
이제 코드를 구현하기만 하면 된다.