Kali Linux - DVWA실습 (Captcha Attack)

Kim Dae Hyun·2021년 5월 19일
0

Security

목록 보기
5/7

Captcha ?

  • Captcha(Completely Automated Public Turing test to tell Computers and Humans Apart)
    • 컴퓨터와 인간을 구별하는 완전히 자동화된 테스트이다.
  • 컴퓨터가 아닌 실제 사람에 의해 수행되는지 검증하는 과정이다.
  • Brute Force와 같이 컴퓨터에 의해 자동적으로 실행되는 공격에 효과적으로 대응 가능하다.
  • 아래 그림과 같은 인증 방식을 captcha인증이라 한다.

DVWA를 이용한 Captcha 공격 (Low Level Security)

  • 패스워드 변경과 Captcha를 통과하였다.
  • 패스워드 변경 요청을 인터셉트 한 결과이다.
    • 요청 파라미터로 step, password_new, password_conf, g-recaptcha-response 등이 있다.
    • step이 1로 되어 있으므로 패스워드 변경의 1단계임을 알 수 있다.
  • 다음 요청으로 Forward한 결과이다.
    • Change를 누르면 다음 단계로 넘어가게 된다.
    • step은 2로 되어 있고 첫 단계와 거의 동일한 파라미터를 갖고 있다. captcha값만 빠져있는 상태이다.

step1, 2 총 두 단계로 나누어져 있는 것이 가장 큰 취약점이다. 공격해보자.

  • 2단계만 따로 조작하여 요청할 수 있다면?
  • 두 번째 단계(step=2)의 요청을 인터셉트 한 상태이다.
  • 해당 요청을 조작하기 위해 Burpsuit의 Repeater로 보낸다.
  • 리피터에서 요청을 조작한다.
    • test로 변경되는 요청을 다른 패스워드로 변경해보자.
    • attack으로 변경 후 변경된 요청을 수행한다. (Go)
  • 조작된 요청을 보낸 후 랜더링 된 결과이다.
    • 최초 test로 변경 요청하였지만 요청을 인터셉트하여 두 번째 요청(step=2)에서 attack으로 변경 요청이 되도록 하였다.
    • 로그인 시 test가 아닌 attack으로 로그인되는 것을 확인 할 수 있다. (공격성공)

DVWA를 이용한 Captcha 공격 (Medium Level Security)

  • Medium단계 역시 Low단계와 마찬가지로 두 개 단계로 captcha인증을 이용한 패스워드 변경을 수행한다.
  • 두 단계인 것을 알았으니 Low단계와 동일한 공격 방법을 적용시켜보았다.
  • 일단 두 번째 요청을 인터셉트 해보자.
    • 달라진 것은 passed_captcha 파라미터이다.
    • 1단계를 통과하였는지, 즉 captcha인증을 통과하였는지를 나타내는 파라미터이다.
  • 두 번째 요청을 인터셉트하여 조작할 수 있다면 passed_captcha파라미터가 무슨 의미인가..
    • Low단계와 동일하게 2단계 요청을 리피터로 보내 요청을 조작해보자.
  • Repeater로 Low단계와 동일하게 요청 파라미터를 조작하였더니
    성공적으로 패스워드 변경을 조작할 수 있게 되었다.
  • 요청을 2단계를 나눈다는 점에서 Low와 Medium단계는 동일한 취약점을 갖는다.

DVWA를 이용한 Captcha 공격 (High Level Security)

  • High단계의 경우 요청이 한 단계이다.
  • HTTP 요청을 확인해보자.
    • g-recaptcha-response, user_token등이 눈에 띈다.
  • 공격을 위해 소스코드를 먼저 확인해본다.
    • 아래 빨간 박스 안의 코드에 명백히 잘못된 코드가 있다.
    • g-recaptcha-response는 랜덤하게 정해지는 captcha값인데 서버측에서 이를 고정된 문자열과 비교한다.
    • 서버측 코드를 확인하여 저 값을 알아내고 요청시 if문에 해당하는 파라미터에 서버에서 요구하는 문자열을 넣어준다.
  • 리피터를 통해 요청을 조작한다.
    • User-Agent와 g-recapcha-response를 조작하였다.
    • 조작된 요청을 수행하니 패스워드 변경에 성공하였다.
  • 요청을 한 단계로 했지만 요청 파리미터를 확인하는데 있어 고정된 문자열을 사용하는 어처구니 없는 실수로 인해 취약점이 발생하였다.
  • 개발자가 디버깅, 테스트 단계에서 편의를 위해 고정된 문자열을 넣어두고 이후 릴리즈 시 깜빡하고 변경하지 못하는 경우가 있을 수 있다.

DVWA를 이용한 Captcha 공격 (Impossible Level Security)

  • 소스코드
    • 이번에는 인증을 위한 요청 파라미터의 값을 고정된 문자열과 비교하지 않는다.
    • recaptcha_check_answer함수를 DVWA에서 확인할 수는 없지만 High단계 우회방법 적용에 실패하였으니 맞을 것이다.
  • 사실 High단계에서 개발자에 의한 실수만 아니였다면 Impossible단계와 큰 다른 점은 없다.
profile
좀 더 천천히 까먹기 위해 기록합니다. 🧐

0개의 댓글