[DreamHack] [web] [beginner] session 풀이

2024. 11. 12. 13:57Information Security 정보보안/DreamHack

728x90

배울내용 

dreamhack,

web hacking,

개발자도구,

dreamhack 풀이,

dreamhack session 문제,

dreamhack web 풀이 ,

BurfSuite  

 

 

문제

 

 

VM 을켜서 링크를 들어가보니 아래와 같이 보인다 

 

 

로그인을 하라는거니깐 Login 에서 무엇인가를 해야할것같다 

Login 을 클릭하고 id 와 pw 를 admin으로 넣어보고 guest 로도 넣어보자 

 

 

admin 은 로그인이 거부가 되지만 guest 는 로그인이 가능했다

 

 

 

 

그래서 결국 코드를 뜯어보기로 했다

 

그러나 역시 users 안에 보이는 ID 와 PW 를 볼수있다 

아래에 좀더 내려서 보면

@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>'

 

 

 

 

코드 2 줄이 보이는데 둘 다 세션 아이디 생성에 관한 코드가 있다 

첫 번째 코드와 두 번째 코드는 각각 세션 아이디를 생성하는 방식이 다르다.

 

            session_id = os.urandom(4).hex()
            session_storage[session_id] = username


 

 

1. 첫 번째 코드:로그인 시 세션 아이디를 생성하는 코드로 os.urandom(4)는 4바이트 길이의 랜덤 바이트를 생성하고, 이를 .hex() 메서드를 통해 16진수 문자열로 변환한다. 

session_id = os.urandom(4).hex()

 


이 코드에서 os.urandom(4).hex()는 4바이트(32비트) 크기의 랜덤 값을 생성하고, 이를 16진수 문자열로 변환해 세션 ID로 사용하지만 2번째 코드를 보면

 

 

2. 두 번째 코드:이 코드에서는 admin 계정의 세션 아이디를 생성합니다. os.urandom(1)은 1바이트 길이의 랜덤 바이트를 생성하고, 이를 .hex()로 16진수 문자열로 변환하여 session_storage 딕셔너리의 키로 사용합니다. 이는 admin 계정에 대한 유니크한 세션 아이디를 생성하는 방식

session_storage[os.urandom(1).hex()] = 'admin'

 

 

 

예를 들어서 4바이트 == (16진수)  aa bb cc dd 이런식으로 생성 되는걸 찾아내려면 시간은 조금걸리지만 금방 찾아낸다. 그러나 두번째 코드를 보면 1 바이트의 길이만 비교를 하니깐 aa 에 들어가는 2자리만 찾으면 된다 

그러면 코드작성 하거나 BurfSuite 를 쓰는방법이 있는데 필자는 후자의 방법으로 해보겟다.

 

 

우선 BurfSuite 를 설치하고 실행한뒤에  Proxy 에서 interfere On 해주고 Browse Open 클릭후 

아까 로그인창에서 guest guest 로 로그인해준다 

그리고 1번씩 forward 시키면 아래와 같은 창이 나오게 된다 

 

 

Cookie 의 세션 id 가 189a6563 인걸 볼수있다(아까말했던 4 바이트 8 글자 aa bb cc dd 합친거 (18 9a 65 63) )

이제 이값을 Bruteforce 해주기 위해 189a6563 부분을 드래그 후 오른쪽 마우스 클릭해서 Send to Intruder 로 보낸다

그리고 아래와 같이 설정한후에 오른쪽에 주황색버튼의 Start attack 을 해준다 

 

 

 

그러면 아래처럼 2개를 다 돌아가면서 로그인 시도를 하게 된다

 

 

 

만약 무언가 나오면 길이가 달라지기에 아래처럼 1c 가 정답이지않을까 유추할수있다

 

 

 

이게 바로 세션아이디이며 이게 admin의 세션id임을 예측할수가 있다.

그러면 아까 Intruder 로 넘어가기전 Proxy 에서 임의대로 189.. 값대신에 1c 를 넣어주고 Forward 를 클릭하면

아까 열어놨던 브라우저가 다음창을 보이게 되는데 , 즉, 성공플레그를 뛰울수가 있었다. 

(이때 8글자가 아닌 2글자만 넣은 이유는 이 코드에서 제일 앞에 있는 1 바이트 만 확인하기 떄문이다 session_storage[os.urandom(1).hex()] = 'admin'  )

 

 

728x90