[FIESTA 2023] 시나리오 앱 1 - 파일 다운로드 취약점

참가한지 한참 되었지만 뒤늦게나마 정리해본 webhacking 관련 writeup입니다.

 

FIESTA 문제 답게 리버싱, 침해 대응 문제가 주로 출제되어 웹해킹 문제로는 별로 참가하지 못한 점이 아쉽습니다.

다음에 웹해킹만을 다루는 CTF가 열린다면 팀원들을 꾸려 참가해보고 싶은 마음입니다 :) 

 

  1. 취약 페이지에 접속해보면 apk 파일을 다운로드 하는 버튼이 있다.
  2. 해당 버튼을 클릭해보면 특이하게 다운로드 하는 파일을 GET 요청의 paramter로 받아서 이루어지는 것을 알 수 있다.
  3. 이는 url../download?f=“OOO”으로된 양식을 보면 알 수 있는데, f 인자에 들어가는 문자열을 보면 base64 encoding이 되어 있음을 알 수 있다.
  4. 그렇다면 f parameter에 원하는 파일을 base64 encoding 하면 다운로드 받을 수 있음을 알 수 있다. 하지만 해당 서버가 어떤 프레임워크인지 모르므로 어떤 파일을 받아야 하는지 알아야 한다.
  5. 고의적으로 f 인자를 주지 않고 download 요청을 보내면 에러 메시지를 그대로 return 하는데, 해당 에러 메시지를 보내는 라이브러리 python 계열 라이브러리임을 알 수 있다. 따라서 해당 서버는 python 프레임워크로 이루어져있음을 알 수 있다.
  6. python server의 경우 flask, django, fast api 등등이 있고 대체로 메인 파일 이름이 app.py 이다. 따라서 app.py를 다운로드 하기 위해 app.py, ../app.py, ../../app.py ... 이런 식으로 위치를 찾기 위해 각각 base64 encoding 하여 f 인자에 넣어본다.
  7. 그러면 apk 이름으로 다운로드 되지만 실제로는 app.py가 탈취됨을 알 수 있다.
  8. 해당 app.py 파일을 받아 열어보면 admin url이 따로 있음을 알 수 있다.
  9. 하지만 admin url의 경우 jwt token에서 admin key를 가지고 있어야 함을 알 수 있다.
  10. 문제는 해당 jwt의 경우 SECRET_KEY와 ALGORITHM을 각각 변수로 넣고 있고 해당 변수를 정의하는 곳이 없어 jwt token을 임의로 발급받을 수 없다.
  11. 하지만 정의되지 않은 변수가 쓰이는 것은 불가능하고 다른 파일에서 export한 것을 import 하여 사용하고 있음을 추측해볼 수 있다
  12. import 목록을 찾아보면 어떤 라이브러리도 아닌 config를 import 하는 것을 알 수 있다.
  13. 해당 파일은 config.py로 SECRET_KEY와 ALGORITHM을 정의하고 export 하는 파일임을 추측할 수 있다. 1~7에서 활용한 파일 다운로드 취약점을 이용해 config.py을 다운로드한다.
  14. 이제 jwt 토큰을 만들 수 있으니 jwt token을 생성해서 cookie에 넣어주고 접속을 시도한다.
  15. admin 페이지에 접속을 성공하고 flag를 탈취할 수 있다.

'Webhacking' 카테고리의 다른 글

[FIESTA 2023] 특별 문제 4-3 – XSS, CSP bypass  (0) 2023.12.13
[dreamhack] tw2tter  (0) 2023.08.10
[dreamhack] web-alasql  (0) 2023.08.10
[dreamhack] Keycat  (0) 2023.08.10
[dreamhack] spring-view  (0) 2023.08.10