문제를 클릭하면 위와 같은 화면이 뜹니다. 0 위에 마우스를 올리면 y0u로 변하고 클릭하면 조금씩 전진합니다. 그리고 사진상엔 잘렸지만 회색칸 끝에는 골(Goal) 라인이 있습니다. 아마 0을 목표 지점까지 이동시키면 되는 문제 같은데 정확한 확인을 위해 소스를 살펴보겠습니다.
문제를 클릭하면 위 처럼 검정 화면에 view-source 링크, 그리고 ID와 PW가 적혀있는것을 확인할 수 있습니다. 문제를 어느정도 풀어보신 분이라면 위의 계정을 ADMIN으로 바뀌면 풀리는 문제겠구나~ 할 수 있을겁니다. 일단 확실하게 확인하기 위해 소스를 확인해보겠습니다.
쿠키에 유저 값이 없으면 val_id에 guest, val_pw에 123qwe를 넣고 각각 20번씩 base64 인코딩을 해줍니다. 그 뒤에 인코딩된 문자열을 가지고 1~8을 !~*로 변경하는 간단한 작업을 거친 뒤 해당 값을 쿠키값으로 세팅을 합니다. 그 후에 페이지를 로드하면서 위에서 했던 작업과 정확히 반대되는 작업을 진행하고 해당 작업의 결과물을 ID와 PW로 출력해줍니다. 그리고 그 밑에 디코딩된 id와 pw가 각각 admin, nimda면 문제가 풀리는 코드입니다.
어쩃든 최종 결과값이 admin이랑 nimda면 풀리는 문제인데 코드의 윗부분을 살펴보면 쿠키값에 user가 세팅되어 있지 않을 경우에만 위쪽의 코드가 동작하고 user가 세팅되어 있을경우 아래에 있는 디코딩 부분만 동작하는 것을 확인할 수 있습니다. 그럼 결국 저희는 admin과 nimda를 위의 방식대로 인코딩한 값을 구해서 쿠키에 넣어주면 문제를 풀 수 있습니다.
풀이 방법이야 간단하겠지만 저는 Gnuboard 1-Day 떄문에 쓰고 있는 웹서버가 있기 때문에 해당 서버에 위의 코드를 그대로 긁어서 살짝 수정해서 admin, nimda의 인코딩 결과 값을 출력하게 만들어줬습니다. 그리고 그 값 그대로 긁어서 쿠키에 넣어서 간단하게 풀 수 있었습니다. 아래가 제가 풀이에 사용한 코드입니다.
최근 여러가지 일로 바쁘기에 가장 무난한 난이도인 XSS 취약점들부터 살펴보기로 했습니다. 그 첫 대상은 KVE-2019-1198 입니다. 파일 경로와 파일명에서 알 수 있듯이 관리자 페이지에 있는 질의응답 설정과 관련된 페이지에서 발생하는 취약점입니다.
수정된 소스코드를 확인해보면 POST 방식으로 전달 받은 qa_title 값을 strip_tags를 통해 태그를 벗겨내는 작업을 해줍니다. 그렇다는 것은 위의 패치가 있기 전까지는 태그들이 그대로 들어갔다는 뜻이니 qa_title을 이용해 XSS 공격이 가능할거라 예상할 수 있습니다. 일단 확인을 위해 위의 페이지가 정확히 어떤 메뉴에 해당되는지 찾아봅니다.
찾아보니 FAQ나 질의응답 게시판 설정 페이지가 아닌 1:1 문의 설정 페이지였습니다. qa_title은 분명 저 타이틀 항목일테니 바로 간단한 스크립트를 넣고 설정을 저장합니다. 그 뒤 1:1 문의 바로가기를 클릭하거나 메인 페이지에서 1:1 문의를 클릭하면 아래와 같은 화면을 볼 수 있습니다.
XSS라 그런지 굉장히 간단하게 끝났는데 일단 현재 쌓여있는 1-Day 분석이 다 끝난 뒤 패치된 내역들에 추가 취약점이 있는지 없는지 좀 더 연구해보는 방향으로 가야 좀 더 의미 있는 공부가 될것 같습니다. 난이도가 너무 쉬운거라 그런지 아니면 제 공부 방식이 잘못됐는지 모르겠지만 이대로는 얻어가는게 생각보다 많지는 않을것 같기도..
좀 더 실용적인 웹해킹 기술을 공부하고자 지인의 추천을 받아 시작하게 됐습니다. 오픈소스다보니 깃허브에 코드가 다 공개되어 있고 commit 리스트에 친절하게 'KVE-xxxx-xxxx 수정' 이런식으로 적혀져있기에 공부하기 매우 편리합니다. 워게임 풀이에 권태기(?)가 오신 분들이나 본격적인 버그 바운티 전에 유사 실전 경험을 쌓고 싶으신 분들이 있다면 아주 좋은 공부 방법이 될거라고 생각됩니다.
환경 구축을 어떻게 할까 고민하다가 너무 구버전은 큰 도움이 되지 않을것 같아 대략 1년전 버전인 5.3.2.0 버전으로 진행하기로 했습니다. 혹시 깃허브에 익숙하지 않으신 분들이라면 그누보드 깃허브(https://github.com/gnuboard/gnuboard5)에 가서 releases 라는 항목으로 이동하시면 버전별 압축파일을 다운로드 받으실 수 있으니 참고바랍니다.
버전을 정한 뒤 로컬에서 구축해서 공부를 할지 이전 FIDO 드론 프로젝트를 진행할때 만든 LightSail 서버를 이용할지 고민하다가 로컬 서버 보단 외부 서버가 언제 어디서든 접근할 수 있다는 점에서 매우 유용할거라고 판단해서 LightSail에 올렸습니다. LightSail에는 우분투 16.04가 올라가 있는 상태.
일단 그누보드에 필요한 환경 구축을 진행하고 (PHP, Apache, Mysql 등) LightSail 방화벽 설정을 마친 뒤 그누보드 5.3.2.0 압축파일을 해제하고 설치 절차에 따라 설치를 마친 뒤 접속을 해보니 매우 깔-끔 하게 잘 동작했습니다. 그 뒤엔 KVE 관련 커밋 내용들을 찾아보며 하나하나 테스트 하는 형식으로 진행했습니다.
자세한 구축 방법은 추후 수정을 통해 업데이트 하기로하겠습니다. 그리고 공부하며 알게된 내용들도 포스팅하도록 하겠습니다. :)
GET 방식으로 id 값을 넘겨 받고 해당 값이 admin이면 no! 를 출력하며 끝납니다. 하지만 admin이 아닐경우 id에 id값을 URL 디코딩하여 다시 넣어주고 해당 값이 admin이면 solve를 호출합니다. 그래서 admin을 URL인코딩해서 넘기면 되는데.. 해보시면 아시겠지만 그냥 admin으로 인식해버려서 no! 가 출력되버립니다. 즉, id값을 처음 검증할때 이미 한번 디코드한다는 뜻이니 인코딩을 2번하면 됩니다.
정말 고생했던 문제입니다.. 분명 150점 짜리이고 리메이크 되기전에 간단하게 풀었던 문제인데 몇시간을 투자해도 도저히 풀 수 없어서 그냥 rubiya님께 문의해서 힌트를 받아서 풀 수 있었습니다.. 때문에 이 문제 풀이는 접은글로 닫아두고 제가 rubiya님에게 받은 힌트를 보여드리겠습니다. 해당 힌트를 참고해서 풀어보시고 그래도 모르시겠다면 접은 글을 참고하시면 될것 같습니다.
이 문제는 PHP Wrapper 중 filter를 이용하면 풀 수 있습니다. filter의 기능중에 base64 인코딩 기능이 있는데 이를 이용해서 flag,php를 인코딩 시키면 저 텍스트 박스에 php 소스가 base64로 인코딩된 값이 출력됩니다. 해당 값을 decode하고 flag값을 인증하면 끝!