Problem

How-To-Solve

위의 코드에서 눈여겨 봐야할 부분은 하나뿐임.

/admin에서 session값을 가져온다는 것임.

다른 부분은 로그인 관련 부분이라서 이해하고 넘어가면 끝임.

/admin에 접근을 해보겠음.

/admin에 접근하면 위와같은 페이지를 확인이 가능함.

아직은 뭔지 모르겠기에 guest에 로그인하여 확인함.

위의 쿠키값을 확인해보면 sessionid값을 확인할 수 있음.

3210626c08d0036e4604b29f5c5d91dbead1bc1c1a7ee5e1971d1ada09ef920f

어디에선가 본 것 같음.

위에서 확인해보면 guest sessionid값이라는 것을 확인할 수 있음.

그럼 admin sessionid에 해당하는 값을 가져와서 쿠키에 넣어보겠음.

쿠키값에 삽입하면 위와같은 결과로 flag를 확인가능함.

 

성공~!

 

다른 정보로써 저를 가르쳐주신다면 언제든지 좋아요!!!!!😊(저도 잘 아는 것은 아니기에;;;;)

'Wargame > dreamhack' 카테고리의 다른 글

CSRF-2  (0) 2023.01.30
XSS-2  (0) 2023.01.30
proxy-1  (0) 2022.02.07
devtools-sources  (0) 2022.02.07
Carve Party  (0) 2022.02.07

Problem

How-To-Solve

page 형태는 기존의 CSRF와 큰차이를 보이지는 않음.

#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for
from selenium import webdriver
import urllib
import os

app = Flask(__name__)
app.secret_key = os.urandom(32)

try:
    FLAG = open("./flag.txt", "r").read()
except:
    FLAG = "[**FLAG**]"

users = {
    'guest': 'guest',
    'admin': FLAG
}

session_storage = {}

def read_url(url, cookie={"name": "name", "value": "value"}):
    cookie.update({"domain": "127.0.0.1"})
    try:
        options = webdriver.ChromeOptions()
        for _ in [
            "headless",
            "window-size=1920x1080",
            "disable-gpu",
            "no-sandbox",
            "disable-dev-shm-usage",
        ]:
            options.add_argument(_)
        driver = webdriver.Chrome("/chromedriver", options=options)
        driver.implicitly_wait(3)
        driver.set_page_load_timeout(3)
        driver.get("http://127.0.0.1:8000/")
        driver.add_cookie(cookie)
        driver.get(url)
    except Exception as e:
        driver.quit()
        print(str(e))
        # return str(e)
        return False
    driver.quit()
    return True


def check_csrf(param, cookie={"name": "name", "value": "value"}):
    url = f"http://127.0.0.1:8000/vuln?param={urllib.parse.quote(param)}"
    return read_url(url, cookie)


@app.route("/")
def index():
    session_id = request.cookies.get('sessionid', None)
    try:
        username = session_storage[session_id]
    except KeyError:
        return render_template('index.html', text='please login')

    return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not an admin"}')


@app.route("/vuln")
def vuln():
    param = request.args.get("param", "").lower()
    xss_filter = ["frame", "script", "on"]
    for _ in xss_filter:
        param = param.replace(_, "*")
    return param


@app.route("/flag", methods=["GET", "POST"])
def flag():
    if request.method == "GET":
        return render_template("flag.html")
    elif request.method == "POST":
        param = request.form.get("param", "")
        session_id = os.urandom(16).hex()
        session_storage[session_id] = 'admin'
        if not check_csrf(param, {"name":"sessionid", "value": session_id}):
            return '<script>alert("wrong??");history.go(-1);</script>'

        return '<script>alert("good");history.go(-1);</script>'


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        try:
            pw = users[username]
        except:
            return '<script>alert("not found user");history.go(-1);</script>'
        if pw == password:
            resp = make_response(redirect(url_for('index')) )
            session_id = os.urandom(8).hex()
            session_storage[session_id] = username
            resp.set_cookie('sessionid', session_id)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'


@app.route("/change_password")
def change_password():
    pw = request.args.get("pw", "")
    session_id = request.cookies.get('sessionid', None)
    try:
        username = session_storage[session_id]
    except KeyError:
        return render_template('index.html', text='please login')

    users[username] = pw
    return 'Done'

app.run(host="0.0.0.0", port=8000)

app.py는 위와 같이 형성되어 있음

 

기존과 동일하게 127.0.0.1(local)에서 넣는 script가 아니면 실행되지 않는 구조이며 admin 접근 시 flag를 뱉어내는 형식임

위의 사진은 vuln(csrf) page 접근 시 나오는 page임.

위의 페이지에서 확인 가능한 것은 <,>태그는 필터링 하지 않는 것과 script를 필터링 하는 것음 알 수 있음.

이런 경우 HTML 태그를 활용하는 것이 일반적임.

flag를 얻기 위해서는 login을 admin으로 해야하는데 코드에 맨 아랫부분에 중요한 코드가 있음.

/change_password에 접근하여 비밀번호 변경이 가능한 것을 알 수 있음.

변수는 pw로 선언되어 변경할 password를 pw변수에 넣는 형식으로 진행 가능할 것으로 생각됨.

<img src="/change_password?pw=admin">

img 태그를 활용하여 src로 change_password에 접근을 시도함.

pw변수에 admin을 삽입하여 admin의 비밀번호를 admin으로 변경을 시도함.

우선 되기는 함.

이 순간이 참 좋으면서도 떨림 핳핳

성공~!

왜 flag페이지에서 admin아이디를 고려하지 않음?

 

flag page관련 정보임.

session id관련 storage와 실행은 admin권한으로 돌아가게 되어있음.

그래서 따로 지정을 하지 않더라도 admin권한의 change_password이기 때문에 따로 고려할 이유가 없었음.

 

다른 정보로써 저를 가르쳐주신다면 언제든지 좋아요!!!!!😊(저도 잘 아는 것은 아니기에;;;;)

'Wargame > dreamhack' 카테고리의 다른 글

session-basic  (0) 2023.01.30
XSS-2  (0) 2023.01.30
proxy-1  (0) 2022.02.07
devtools-sources  (0) 2022.02.07
Carve Party  (0) 2022.02.07

Problem

How-To-Solve

문제 파일을 먼저확인 함.

 

기존의 XSS 구조와 엄청 다르진않음을 확인하였으나 홈페이지 내에서 필터링 방식을 확인해야 했음.

 

기존의 페이지와 크게 차이는 없음.

 

우선 script를 필터링하고 있음을 알았고 alert가 실행되지 않음을 확인하였음.

memo 접근 시 위 URL 내 memo필드를 업데이트 하는 것을 확인하였음.

flag 내 파라미터 삽입으로 memo에 flag를 띄우는 방식을 선택하기로 함.

우선 XSS를 실행하는 방법을 찾기위해 vuln(xss) page에서 테스트 후 진행하기로 함.

img를 통해 onerror를 엮어서 script를 실행하는 것에 성공을 함.

하지만 싱글쿼터(')를 활용하여 location으로 엮는 것이 싫기 때문에 다른 태그를 통한 활용을 참기로 함.

onload를 활용하여 직접 삽입을 시도하였고 성공함.

onerror보다는 삽입이 깔끔할 것으로 생각함.

그래도 둘 다 삽입을 진행해보려고 함.

우선 img 태그쪽을 먼저 진행함.

<img src=x onerror="javascript:location.href='/memo?memo='+document.cookie">

src로 넣으려고 하였으나 따로 실행이 되지않아 javascript로 직접삽입을 선택함.

정상실행을 확인함.

flag가 생성된 것을 확임함.

 

이제 onload를 활용하여 진행해보겠음.(개인적으로 더 좋아함)

<svg/onload=location.href="memo?memo="+document.cookie>

위에서 확인한 바와 마찬가지로 정상적으로 실행됨.

성공~!

왜 onload사용 시에는 javascript를 쓰지 않았는가?

onerror사용 시 img 태그를 활용함.

img태그는 html 태그로써 javascript 전환 변수를 선언해주어야 함.

 

반대로 onload는 javascript 태그임.

아무리 html 태그로써 사용한다 하더라도 내부는 javascript 태그로 선언되기 때문에 굳이 javascript:로 선언을 안해주어도 사용이 가능함.

 

다른 정보로써 저를 가르쳐주신다면 언제든지 좋아요!!!!!😊(저도 잘 아는 것은 아니기에;;;;)

'Wargame > dreamhack' 카테고리의 다른 글

session-basic  (0) 2023.01.30
CSRF-2  (0) 2023.01.30
proxy-1  (0) 2022.02.07
devtools-sources  (0) 2022.02.07
Carve Party  (0) 2022.02.07

Problem

How-to-solve

Flag를 얻기 위한 조건이 가장 먼저 들어옴.

method는 POST로 작성되어야 함.

주소는 127.0.0.1(local)이어야 함.

User-Agent는 Admin Browser여야 함.

DreamhackUser는 admin이어야 함.

cookie는 admin값이 true여야 함.

form의 body부분의 userid는 admin이어야 함.

 

이대로 일단 적어보면

POST /admin HTTP/1.1

User-Agent: Admin Browser

DreamhackUser: admin

cookie: admin-true

 

userid=admin

이런식으로 적혀질 것임.

우선 홈페이지 형식을 확인한 후 어떻게 보낼지 결정.

우선 host와 port는 127.0.0.1:8000으로 해봄.

보내보았으나 body부분을 읽지 못함.

body를 읽게하기 위해 Content-Length를 설정해 주기로 함.

 

POST /admin HTTP/1.1

Content-Length: 12

User-Agent: Admin Browser

DreamhackUser: admin

cookie: admin-true

 

userid=admin

 

body의 길이가 12(userid=admin)이기 때문에 저렇게 써줌.

우선 보내봄.

아직 읽지 못함(여기에서 좀 해맴)

생각하던 중 Content-Type과 host가 빠졌다는 것을 알게 됨.

(여기에서 드림핵 연결이 끊김.)

Host는 어려움이 없었으나 Content-Type은 다른 곳에서 도움을 좀 받음.

https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/POST

 

POST /admin HTTP/1.1
Host: host1.dreamhack.games:13856
Content-Length: 12
Content-Type: application/x-www-form-urlencoded
User-Agent: Admin Browser
DreamhackUser: admin
Cookie: admin=true
Connetion: close

userid=admin

 

위처럼 적어서 다시 보내봄.

끝!

 

 

 

 

 

 

'Wargame > dreamhack' 카테고리의 다른 글

CSRF-2  (0) 2023.01.30
XSS-2  (0) 2023.01.30
devtools-sources  (0) 2022.02.07
Carve Party  (0) 2022.02.07
image-storage  (0) 2022.02.07

+ Recent posts