Dreamhack/Dreamhack Wargame (Challenge)

[17] IT 비전공자 [dreamhack] session 문제 풀기

imaginefuture-1 2024. 9. 26. 09:04

https://taesan-smj.tistory.com/62

 

 

[드림핵/워게임] session (웹 해킹)

프롤로그 session-basic 이라는 문제가 있었는데, 이것은 그거와는 조금 다른 문제이다. 문제 https://dreamhack.io/wargame/challenges/266 session 쿠키와 세션으로 인증 상태를 관리하는 간단한 로그인 서비스입

taesan-smj.tistory.com

https://mokpo.tistory.com/237

 

[dreamhack] session 문제풀이

[WEB] session 문제풀이 문제를 확인해보자. 쿠키/세션을 조작하여 admin 계정으로 로그인에 성공하면 flag를 획득할 수 있는 문제이다. 접속해보자. login 외에 별다른 기능은 안보인다. 소스코드를 확

mokpo.tistory.com

문제 풀이 참고 블로그다. 참고로 첫번째 블로그 분은 직접 문제 해결 코드를 짜셨다..(능력자;;)

그정도 지식은 없지만 이런 방법도 있구나 신선한 충격 받으며 문제 풀러 가보자

 

 

 

문제다 드림핵 쿠키&세션 강의를 들으면 아주 좋다

 

쿠키! 반갑다! 또본다 아마 워게임 첫번째 문제였던걸로 기억하는데 

 

HTTP 쿠키(HTTP cookie)란 웹 서버에 의해 사용자의 컴퓨터에 저장되는, '이름을 가진 작은 크기의 데이터'이다.

 

조금더 깊이 들어가자면

 

 

HTTP 프로토콜 특징

  • Connectionless: 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미합니다. 특정 요청에 대한 연결은 이후의 요청과 이어지지 않고 새 요청이 있을 때 마다 항상 새로운 연결을 맺습니다.
  • Stateless: 통신이 끝난 후 상태 정보를 저장하지 않는 것을 의미합니다. 이전 연결에서 사용한 데이터를 다른 연결에서 요구할 수 없습니다.

Connectionless, Stateless 특성을 갖는 HTTP에서 상태를 유지하기 위해 쿠키(Cookie)가 탄생했습니다. 쿠키는 Key와 Value로 이뤄진 일종의 단위로, 서버가 클라이언트에게 쿠키를 발급하면, 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 같이 전송합니다. 서버는 클라이언트의 요청에 포함된 쿠키를 확인해 클라이언트를 구분할 수 있습니다. (출처 드림핵)

 

http 프로토콜 친구는 1:1 요청 응답 후 연결 종료를 하고, 통신 끝나구 정보도 저장안하니까

하나의 요청마다 정보 저장해줄 친구가 없을까 싶은게 바로 쿠키다

 

 

문제는 이제 쿠키 정보를 변조에 서버에 요청한다면..?

 

나:  나 a야 서버야! (나는 사실b임 근데 a쿠키 정보를 가지고있음) a쿠키----> 서버에게 파일 요청

서버: 어 a야 안녕 파일 줄게~~(a쿠키니까 a구낭~)

 

나: 어멋 a 정보 개이득! (범죄입니다)

 

그래서 이걸 해결할 방법이 없을까....

 

그럼 쿠키를 랜덤한 무작위 문자열로 바꾸자-->조작해버리면 어떡해?

그럼 너 이 서버에 방문한 횟수도 확인할게--> 조작 불가능

 

즉 세션을 사용합니다

 

세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키(유추할 수 없는 랜덤한 문자열)를 만들어 클라이언트에 전달하는 방식으로 작동합니다.


보통 session ID라고 합니다

 

 

(혼자 정리 나름해봤는데 틀렸다면 댓글 남겨주세요 ㅜㅠ)

 

 

이후..드림핵 강의 순서에 따라 세션 아이디로 로그인도 하고..하하 재밌음!

 

하하 실습 화면~

아무튼..다시 문제로 돌아와서

 

 

홈페이지에 들어가면 화면이 이렇게 뜬다
국룰 guest/guest 입력시 나오는 창

 

 

혹시나 admin/admin 해봤지만 역시 될리가 없다

 

 

소스코드를 보러가자

 

 

 

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

app = Flask(__name__)

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

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

session_storage = {
}

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

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

@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(4).hex()
            session_storage[session_id] = username
            resp.set_cookie('sessionid', session_id)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'

if __name__ == '__main__':
    import os
    session_storage[os.urandom(1).hex()] = 'admin'
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

 

user/user1234를 집어넣어도 로그인이 된다고 한다 로그인 하러 가보자

 

하지만 어림도 없죠?

 

 

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

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

admin일때 flag를 출력해주는데... admin을 어떻게 로그인하지,...

 

 

@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(4).hex()
            session_storage[session_id] = username
            resp.set_cookie('sessionid', session_id)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'

/login으로 이동하였을 때 
POST요청일 때, 폼에서부터 username과 password를 입력받고, username으로부터 pw가 일치하는 것을 찾아낸다.
그리고 4바이트(32비트)의 16진수값을 session_id 로 생성을 하여 세션값을 쿠키로 넣어준다.
그 세션값을 session_storage 에 저장을 하여서 활용하는 방식이다.
출처: 너드인의 밤 블로그님 글 발취

 

 

 

if __name__ == '__main__':
    import os
    session_storage[os.urandom(1).hex()] = 'admin'
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

 

 그리고 제일 중요한건 admin의 세션은 이미 session_storage에 저장이 되어 있다고 한다

 

 

 

os.urandom(1) 이라는 것은 1바이트의 값을 hex값 , 즉 16진수로 바꿨다는 것인데, 16진수는 1글자당 4비트씩 차지한다.

1바이트는 8비트 이므로, 16진수로 표현하였으면 2글자로 표현이 되어있다는 것이다.

 

https://blog.naver.com/solvage/220852336686https://itips.tistory.com/55

 

/dev/random 과 /dev/urandom 의 차이

커널은 난해성 풀(entropy pool) 을 관리하는 데 그 pool 이 충분히 채워졌을 때 가장 랜덤한 결과 도출할 수 있다. 리눅스 시스템에서 커널은 무작위 숫자 생성을 /dev/random 과 /dev/urandom 을 통해서 제

itips.tistory.com

https://itbeginner2020.tistory.com/17

 

2진수,8진수,16진수의 모든것

개발자가 N진수를 알아야하는 이유 사람에겐 3과 5를 더하는 것이 익숙하기 때문에 주어진 수를 이용하여 바로 계산이 가능하지만, 컴퓨터는 그렇지 않다. 컴퓨터는 사람이 계산하는 방식과 다

itbeginner2020.tistory.com

 

그렇다면 우리는 session_id 무작위 대입(256가지)을 통해 admin 계정으로 로그인 할 수 있다.

 

출처: https://mokpo.tistory.com/237 [MSS:티스토리]

 

어떻게 대입할까요~

 

burp intruder 기능을 사용하면 됩니다~

 

brute force attack은 무차별 대입공격으로  패스워드 크랙할 때 주로 사용됩니다. 특정한 암호를 풀기 위해 가능한 모든 값을 대입하는 것을 말합니다.

(조교수님이 설명해줬던 거다!!) 반갑

 

 

또 너냐 burp suite?

 

지금 이거 프로그램 해보겠다고 2시간째 잡고있다....후.....

 

내가 꼭 너 하고만다

 

 


 

 

 

2024-12-02

 

박태식이 죽지않고 돌아옴 ㅋㅋㅋ

 

 

 

 

 

찾았다
캬ㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑㅑ주모