what-is-my-ip


개요

  • 서버는 한정된 자원을 가지고 있기 때문에, 트래픽이 몰리면 부하가 발생하고 서비스 가용성이 저해된다. 이러한 문제를 해결하기 위해 2가지 방법을 사용해 볼 수 있다.
  • (1) Scale-Up : 서버의 사양을 높이는 방법이다. 간단하고 효과적이지만 비용이 발생한다.
  • (2) Scale-Out : 여러 대의 서버로 트래픽을 균등하게 분산하는 방법이다.

  • HAProxy는 기본적으로 클라이언트와 서버 사이에 위치한 리버스 프록시이기 때문에 백엔드 서버(app:3000) 입장에서는 모든 요청이 HAProxy에서 오는 것처럼 보인다.
  • haproxy.cfg 파일을 살펴보면 서버로 들어오는 http 트래픽에 대하여 forwardfor 옵션이 있는데 HAProxy가 클라이언트의 실제 IP 주소를 백엔드 서버로 전달하기 위해 사용하는 설정이다.

소스코드 분석

app.py

  • app.py 파일을 살펴보면 request.access_route[0] 값을 배시 쉘 명령어 인자로 사용한다.
  • 명령어 실행 결과는 result 변수에 담아져 ip.html 파일이 렌더링 될 때 함께 넘어간다.


  • ip.html 파일이 렌더링 될 때 함께 전달된 result (명령어 실행 결과)도 함께 출력된다.
  • 따라서, forwarded 헤더에 임의의 명령어를 삽입하면 RCE 공격이 가능해 보인다.

  • 요청 헤더에 X-Forwarded-For 헤더를 추가하여 디렉토리 리스팅에 성공했다.
    • (Payload) “;ls”

  • 쨘! 플래그 탈취도 성공했다.

🐛.. 🐛.. 🐛..



REFERENCE

  1. https://flask.palletsprojects.com/en/stable/api/#flask.Request.access_route
  2. https://hyewon-s-dev.tistory.com/12