[Dreamhack] login-1
소스 코드가 길어서 필요한 부분만 가져와봤다.

guest를 0, admin을 1 와 같이 userLevel로 구별하고 있다. /user/useridx useridx로 db에서 가져오는 정보를 볼 수 있다. 권한이 1일 때 /admin페이지를 확인할 수 있다. 이곳에 Flag가 있으니 권한 1을 가지고 있는 계정으로 /admin페이지를 확인하면 Flag값을 얻을 수 있다.

register에서 가입할 수 있는데 가입하고 나면 backupcode를 준다. 그 backupcode는 100까지의 숫자 중 랜덤하게 부여한다.

Brute Force공격을 막기 위해 sleep(1)을 걸었다.



slow/slow/slow로 가입해보니

BackupCode로 18을 부여받았다. 로그인해도 딱히 뭐 시도해 볼 것이 없다. forget_password로 가보자.

이런 형식으로 userid를 입력하고 바꿀 password를 입력한 뒤 가입할 때 제공했던 BackupCode를 적은 뒤 제출하면 password가 변경된다. 그 후 84번이라는 새로운 BackupCode를 받았다.
아까 확인했을 때, /user/useridx에 들어가보자. /user/0부터 들어갔는데, 없단다. 그래서 1부터 들어갔다.

Apple이라는 계정을 알 수 있었는데 UserLevel이 1이다. admin계정이다. 그럼 내 계정은 몇 번째일까 싶어 다 해보니 17번째였다. 18번은 역시 없다.

그럼 위에서 admin계정인 Apple을 알았으니 그 계정을 내가 가질 방법을 생각해보면 Apple의 백업코드를 알아내 내가 바꾸고 싶은 비밀번호로 변경하면 될 것 같았다. 그러나 Brute Force를 막기 위해 sleep(1)을 걸었을 뿐 아니라 5번 틀리면 새로운 백업 코드로 변경되기 때문에 맞출 때까지 시도하는 것이 불가능하다. 그러나 sleep(1)을 설정함에 따라 다른 취약점이 생겼는데 1초 이내에 100번 모두 접근하여 결국 비밀번호가 변경되는 방식으로 레이스 컨디션 취약점을 이용하는 것이다. 버프 슈트를 이용해서 시도했다.

그러나 버프 슈트 Edition버전에서는 속도 제한으로 인해서 intruder로 할 수 없었다. 그래서 간단한 반복문, threading을 통해 파이썬 스크립트를 작성했다.
import threading, requests
url = "http://host3.dreamhack.games:19427/forgot_password"
for i in range(1,101) :
forget = {"userid": "Apple", "newpassword": "slow", "backupCode": i}
thread = threading.Thread(target=requests.post, args=(url, forget))
thread.start()
print("finish")
실행이 끝나며 finish를 출력했으니 Apple/slow로 로그인해보자.


flag값을 획득했다.
'Webhacking-Write-Up > Dreamhack' 카테고리의 다른 글
[Dreamhack] file-csp-1 (0) | 2023.01.27 |
---|---|
[Dreamhack] crawling (0) | 2023.01.26 |
[Dreamhack] [wargame.kr] adm1nkyj (0) | 2023.01.24 |
[Dreamhack] weblog-1 (0) | 2023.01.23 |
[Dreamhack] Tomcat Manager (0) | 2023.01.22 |