2024. 11. 12. 13:57ㆍInformation Security 정보보안/DreamHack
배울내용 :
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' )
'Information Security 정보보안 > DreamHack' 카테고리의 다른 글
[DreamHack] [web] [beginner] web-misconf-1 풀이 (0) | 2024.11.13 |
---|---|
[DreamHack] [web] [beginner] Carve Party 풀이 (0) | 2024.11.12 |
[DreamHack] [web] [beginner] simple-web-request 풀이 (0) | 2024.11.11 |
[DreamHack] [web] [beginner] Flying Chars 풀이 (0) | 2024.11.11 |
[DreamHack] [web] [beginner] php7cmp4re 풀이 (2) | 2024.11.10 |