[DreamHack] [web] [Level 1] Where-is-localhost 풀이

2024. 11. 24. 21:13Information Security 정보보안/DreamHack

728x90

배울내용 

dreamhack,

web hacking,

개발자도구,

dreamhack 풀이,

dreamhack random-test 문제,

dreamhack web 풀이 ,

burfsuite,  

Where-is-localhost,

server side request Forgery,

ssrf,

 

문제를 풀기에 앞서 SSRF 에 대해 알고 시작하는게 좋다

SSRF 공격(Server-Side Request Forgery)란?

  • SSRF는 공격자가 서버에 악의적인 요청을 보내도록 속여 내부 네트워크 또는 비공개 리소스에 접근하게 하는 취약점
  • 공격자는 서버가 대신 요청을 보내는 점을 악용해 내부 자원에 접근, 민감한 정보를 탈취, 시스템을 탐색가능하게함

 

 

 

문제

 

 

 

 

 

 

이번문제는 IP 주소를 입력하라고 하는것같아서 0.0.0.0 , 172.0.0.1 도 입력해봤지만 no... 라는 것만 출력.. 아마 코드를 추가적으로 확인이 필요할것같다. 

 

 

@app.route('/vuln', methods=['POST'])
def vuln():
    name = request.form.get('vulntest')
    try:
        address = ipaddress.ip_address(name)
        if address.version == 4:
            return "no..."
        url = urllib.parse.urlparse(f"http://[{address.exploded}]:5000/localonly")
        if url.netloc != f'[{address.exploded}]:5000':
            print(url.netloc, f'[{address.exploded}]')
            return "no..."
        req = urllib.request.Request(url.geturl())
        return urllib.request.urlopen(req).read().decode('utf-8')
    except ValueError:
        return "no..."
    except urllib.error.URLError:
        return "connection refused"

@app.route('/localonly', methods=['GET'])
def localonly():
    addr = ipaddress.ip_address(request.remote_addr)
    if addr.is_loopback and addr.version == 4:
        return flag
    else:
        return 'not loopback'

 

음 그냥 조건문에 address.version ==4 이면 no 를 나타내는걸로 보아 ip 4는 안될것이고 그럼 ip4 인 127.0.0.1 을 ip6로 바꿔서 입력하면 되지않을까? 

 

즉 아래와 같이 입력하면 된다 

 

::ffff:127.0.0.1

 

IPv6에서 위와같은 형태는 IPv4를 IPv6로 표현한 방식으로, 이를 IPv4-임베디드(Embedded) IPv6 주소라고 한다. 이 방식을 이해하려면 다음 개념을 알아야 하는데

 

1. IPv6의 확장성

IPv6는 128비트 주소 체계를 사용한다. 하지만 IPv4는 32비트 체계이기에 IPv4를 사용하는 기존 시스템과 IPv6를 사용하는 새로운 시스템 간의 호환성을 유지하기 위해 IPv6는 IPv4 주소를 포함할 수 있는 임베딩 메커니즘을 제공한다.

 

 

2. ::ffff: 접두사

::는 IPv6에서 연속된 0을 줄여 쓰는 표기법입니다.

  • 예: 0:0:0:0:0:0:0:1 → ::1 (IPv6의 localhost)
  • ::ffff:는 특별한 IPv4-임베디드 접두사로, IPv4와 IPv6 간 호환성을 위해 사용된다.
    • 이 접두사가 나오면 뒤에 오는 부분이 IPv4 주소라는 의미

 

3. 왜 127.0.0.1이 그대로 붙는가?

  • IPv4 주소 127.0.0.1은 이미 32비트 숫자로 표현되고 이를 IPv6로 변환할 때, 그대로 사용해도 IPv6에서 해석이 가능하도록 설계되어있다.
    • IPv6의 ::ffff: 뒤에 오는 127.0.0.1은 내부적으로 숫자로 변환되어 IPv6 주소 공간에서 동작

 

 

당연히 128 바이트로 표현해도 동일하다 (글자수를 제한하지 않는이상) 

0000:0000:0000:0000:0000:ffff:7f00:0001

 

(7f00:0001은 16진수로 표현된 127.0.0.1)

 

 

 

 

그럼 이를 입력하면 어떻게 될까?


 

쉽게 성공플레그를 뛰울수가 있다 

728x90