THM: Authentication Bypass
Jr Penetration Tester > Introduction to Web Hacking > Authentication Bypass
Username Enumeration & Brute Force
해당 task에서는 ffuf 명령을 좀 더 적극적으로 사용한다. 특히 여러 개의 워드리스트를 사용하게 되면 -w 옵션은 동일하게 지정하되, 워드리스트1:W1, 워드리스트2:W2와 같은 방식으로 리스트를 정한다. 구분은 쉼표로!
$ ffuf -w usernames.txt:W1,/usr/share/wordlists/SecLists/Passwords/Common-Credentials/10-million-password-list-top-100.txt:W2 -X POST -d "username=W1&password=W2" -H "Content-Type: application/x-www-form-urlencoded" -u http://test.com/customers/login -fc 200
Content-Type: application/x-www-form-urlencoded
참고로 이렇게 Content-Type 헤더에 application/x-www-form-urlencoded 까지 지정해서 보내는 이유는 값을 key1=value1&key2=value2 형식으로 인코딩해서 보낸다는 뜻인데 이런 데이터가 본문으로 전송될 때, Content-Type 헤더가 없으면 서버에서는 이 데이터가 무슨 형식인지 알 수 없음. 웹 서버나 웹 프레임워크(Django, Flask 등)는 이 헤더를 보고 파라미터를 파싱하기 때문이라고 함.
어쨌든 THM에 해당 쿼리를 입력하면 특정 사이트의 유저 정보와 패스워드 값을 브루트포스 공격으로 알아낼 수 있게 된다.
Logic Flaw
비밀번호 reset 창의 취약점을 찾기 위해서 curl 명령어를 활용한다.
해당 웹애플리케이션에서 username은 Query String을 통해 불러오는데, passwordreset의 경우 php 변수인 $_Request에서 찾은 데이터를 사용해 전송한다. 이 변수는 쿼리 스트링과 post에서 전달된 데이터를 모두 포함하는 array
만약 동일한 키 이름이 query string과 POST 양쪽에 모두 사용되면 쿼리 스트링모다 POST가 우선시 된다.POST폼에 추가 파라미터를 넣으면 비밀번호 재설정 이메일이 전송되는 대상을 조작할 수 있게 되는 것
코드를 보고 다음과 같이 비밀번호 재설정 이메일을 해커의 이메일로 설정할 수 있다.
$ curl 'http://test.com/customers/reset?email=secu%40mark.com' -H 'Content-Type: application/x-www-form-urlencoded' -d 'username=secu&email=mark@hacker.com'
그래서 내 이메일 rㅖ정으로 acme it support에 한 계정을 만들어주고, password reset을 했더니 다음과 같이 ticket이 생성되어 있더라.
안에 들어있는 링크로 이동하면, 피해자의 password reset 링크가 들어있는 것을 확인할 수 있다.
Cookie Tampering
쿠키에 대해서 공부함
$ curl -H "Cookie: logged_in=true; admin=false" http://test.com/cookie
logged_in=true → "나는 로그인된 사용자다" 라는 상태를 쿠키로 전달
admin=false → "나는 관리자가 아니다" 라는 권한 정보 전달
여기서 admin=true로 하면 관리자 권한으로 로그인이 되는..
쿠키값은 일반적으로 해시로 표현하는데 MD5, SHA1, SHA-256, SHA-512가 있음
해시는 일방향, 같은 입력에 대해서는 늘 같은 값이 출력된다. https://crackstation.net 사이트에 해시값과 문자열을 저장한 DB를 확인할 수 있음.
인코딩은 해시와 유사하게 무작위처럼 보이는 문자열을 만들어내지만, 일방향이 아님. 이 인코딩의 목적은 이진 데이터를 사람이 읽을 수 있는 데이터로 변환하고, 아스키 문자만 지원하는 전송매체에서도 쉽게 전송할 수 있도록 하는 것. 이때 Base32와 Base64가 대표적인데, Base64는 이진 데이터를 a-z, A-Z, 0-9, +, / 및 =(패딩용 기호)로 변환한다.
일반적으로 Set-Cookie: session=dfjklsfoi~=; Max-Age=3600; Path=/ 이라고 하면 이를 Base64로 디코딩하면 이런 JSON 데이터가 나온다. {"id":123,"admin": false} 이때 admin 값을 true로 바꾸면.. 관리자 권한을 얻을 수 있게 됨.
Base64 인코딩된 웹 쿠키를 디코딩 → 조작 → 다시 인코딩함으로써 웹 애플리케이션의 동작을 악용할 수도 있겠다. (모의해킹에서 자주 사용)
ASCII,UTF-8에 대해서 좀 더 공부가 필요할듯