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

1회차

핵을 찾고 있는데 구버전 말고는 전부 팔고있었습니다.......(눙물)

그래서 일단 시작이라도 끊기위해 탈옥우회를 먼저 올려볼까합니다.

우선 해당 게임 실행 시 로그인까지는 실행 가능하지만 이후 탈옥을 감지하여 자동 종료되었습니다.

어떤 게임인지는 언급하지 않을 생각입니다.

 

탈옥 우회

 

CrackerXI를 활용해 추출한 게임의 IPA파일입니다.

경로 : private/var/containers/Bundle/Application/[앱 이름]/ [앱이름].app

 

복호화하여 추출한 앱의 Binary 파일을 분석하겠습니다.

(보호를 위해 이름은 다 바꾸었습니다.)

 

binary 파일을 IDA로 열고 HxD로 변조할 준비를 해주었습니다.

 

우선 IDA에서 탈옥을 탐지하는 부분을 찾아보도록 하겠습니다.

jail이 포함된 method를 검색하면 위와 같이 확인할 수 있습니다.

CSDevice의 isJailbroken을 확인해보면 탈옥 검증 과정을 확인할 수 있는데 CBZ로 나누어 넘기는 것을 알 수 있습니다.

이 때 CBZ를 반대로 작동하도록 바꾸어주면 탈옥을 우회할 수 있습니다.

 

binary를 패치하여 진행할 수 있지만 HxD를 통해 진행해보도록 하겠습니다.(전 손에 익어서 그런지 이게 편합니다.)

첫번째 CBZ를 나타내는 HEX값을 확인하여 HxD에서 찾아줍니다.

한줄을 복사해서 HxD에서 찾아주면 대응해는 HEX값을 찾을 수 있습니다.

해당하는 HEX값을 찾은 후 CBZ -> TBZ로 바꾸어 저장해줍니다.

같은 방식으로 CBZ를 TBZ로 바꾸어주었습니다.

같은 방식으로 CBNZ->TBNZ로 바꾸어줍니다.

위의 method는 탈옥된 단말기를 확인하는 부분으로 탈옥단말 확인 시에 결정값이 반대로 작용하도록 어샘블리 분기 명령어를 반대로 주어 작동하도록 해준것입니다.

 

같은 방식으로 botdetector method도 바꾸어 줍니다.

전과 다른 부분은 어샘블리 명령어인데 B.NE를 B.EQ로 바꾸어 줍니다.

이렇게 만들어진 binary를 기존 어플리케이션에 주입해주어야 하는데 이때 Sign값이 맞지 않으면 앱이 실행되지 않습니다.

 

이것을 우회하기 위해서 바이너리를 어플리케이션에 넣기 전에 ldid 를 통해 sign값을 따로 떠줍니다.

위 명령어를 통해 rokefoke.xml에 원래의 sign값을 떠둡니다.

private/var/containers/Bundle/Application/[앱 이름]/ [앱이름].app 경로에 binary 값을 변조한 값으로 넣어줍니다.

위의 파일을 넣어준 후 sign값을 이식시켜줍니다.

처음 실행시킨 명령어는 실행권한을 주입한 binary에 부여하는 명령어입니다.

이후 주입한 binary에 sign값을 이식시켜 주는 명령어를 실행하여 주면 앱 binary변조가 끝납니다.

 

이렇게 binary 변조를 마친 후 앱을 실행하면 탈옥된 환경에서도 정상적으로 실행되는 것을 확인할 수 있습니다.

 

 

TO Be Continued............

'Game' 카테고리의 다른 글

Starting Point  (0) 2022.05.26

Bullet

 보안에 입문하며 처음으로 접한 프로젝트는 국방 관련 프로젝트였습니다. 이 후 여러 종류의 프로젝트를 경험하며 느낀 것은 인증 우회, 관리자 권한 탈취 등과 같은 취약점 들을 중요시 여기는 모습들이었습니다. 물론 위의 취약점들이 중요하지 않다고 생각하는 것은 아니지만 보안을 구성하고자 하는 회사의 목적을 중시하기보다는 개인적인 생각으로 '보안이 전부 중요하지 덜 중요하고 더 중요한 부분이 무엇이 있겠어'였습니다. 그렇게 다양한 프로젝트를 경험하며 주로 맡게 된 프로젝트는 금융과 관련된 프로젝트들이 많아져 갔습니다. 경험을 할수록 금융과 관련된 분야에서 중시하는 취약점들을 더욱 중요하다 여기게 되었습니다. 그러던 중 새롭게 접하게 된 기회에서 회사에 목적성에 따라 중요하게 여기는 가치가 달라질 수 있다는 것을 알게 되었고 금융과 다른 분야에서 중요하게 여기는 가치가 무엇일지 고민하게 되었습니다. 그렇게 시작된 고민에서 저에게 익숙하지만 잘 알지 못하고 있는 것에 대해 찾아보고 있었습니다. 제가 가장 좋아하고 지속적으로 경험한 것은 무엇일까? 게임! 어렸을 적부터 다양한 형태의 게임을 접하였지만 당연하게 늘 하던 것이라 잘 모르고 있었던 것이죠. 여러 게임들을 찾아보며 보안과 연결 지을 부분을 고민하다가 게임 보안에 대해 Game 파트를 포스팅해보기로 생각하게 되었습니다. 

 RPG, FPS, RTS 등등... 많은 게임 장르들에서 게임 자체적인 버그를 제외하고 플레이어와 회사가 가장 중요하게 여기는 것은 무엇일까 생각을 하게 되었습니다. (물론 버그 패치도 굉장히 중요하단 것을 알고 있습니다.) 한창 잘나가던 게임이 한순간에 몰락하거나 지속적으로 즐기는 유저에게 가장 문제가 되는 부분은 역시 "핵쟁이"라고 생각했습니다. 대회에서 맵핵을 쓰는 해외 프로게이머나 에임 핵을 사용하는 게이머들처럼 게임의 재미를 저해하는 요소들이 굉장히 많았습니다. 이렇게 핵이 난무하고 패치가 더딘 게임은 플레이어들이 점점 흥미를 잃어가고 결국 인기가 사그라드는 수순을 밟는 경우가 많았습니다. 이 생각을 하며 핵을 패치하고 찾는 것도 중요하지만 어떤 방법으로 핵이 구동하는 방식도 중요하다고 생각했습니다. 핵이 어떻게 구동되는지 알아야 같은 핵을 동작하지 못하도록 할 수 있고 플레이어로 하여금 쾌적한 게임 환경을 제공할 수 있다고 생각되었습니다. 아직 많이 부족하지만 하니씩 포스팅하며 분석하고 배워가고 싶어서 이렇게 시작해볼까 합니다. 

 

이제 서론은 마치고 하나씩 포스팅해보겠습니다.

 

 

To Be Continued.............................

'Game' 카테고리의 다른 글

bonfire Lit -- 1  (0) 2022.05.30

+ Recent posts