CERT

Insecure Captcha 모의해킹

뭉크테크 2024. 7. 27. 19:21

목차

  • Insecure Captcha 이론
  • Insecure Captcha 실습
  • Insecure Captcha 대응방안

 

Insecure Captcha 이론

CAPTCHA 

  • Completely Automated Public Turing test to cell Computer and Humans Apart 의 약어
  • 보통 로그인 등의 과정에 추가적인 인증 요소로 포함되어 위 사진과 같이 접근하고자 하는 대상이 실제 사용자인지 컴퓨터인지 구별하기 위해 사용되는 프로그램을 의미한다.
  • 보통 bruteForce와 같이 봇을 이용하여 반복적인 작업을 하는 프로그램을 막기위해 사용되고 있다.

Insecure CAPTCHA는 직역하면 안전하지 않은 캡챠라는 의미로 캡챠 인증이 우회될 수 있는 취약점을 의미한다.

 

 

insecure Captcha 실습

  • dvwa captcha 실습 화면

시나리오

  • recaptcha를 우회하여 비밀번호를 바꾸도록 함 

 

  • insecure Captcha Low 단계 코드의 흐름을 파악해볼 때, step2 단계 if문에서 step1에 진행했던 인증 결과를 반영하지 않는 것으로 보인다.
  • 왜냐하면, step1 if문과 step2 if문이 상관성 없는 별개의 조건문들로 구성되었으며, 나아가 step1 if문에서 step2 if문으로 전달해주는 파라미터 값도 따로 존재하지 않을 뿐더러 이를 확인하는 절차도 없기 때문이다.
  • 그래서, step2 단계에서 조건문만 만족시킨다면, 비밀번호를 바꿀 수 있다는 것으로 보이며, 해당 패킷만 따로 가져와 proxy 툴을 통해 임의의 비밀번호로 설정할 수 있는 것으로 보인다.

 

  • 일단, 실제 로그인 로직은 어떻게 이루어지는지 확인해보기 위해 정상적으로 패스워드를 변경하며 captcha 인증을 받아보도록 함.
  • recaptcha 인증을 받은 후, Change 버튼을 누른 뒤, 

  • burpsuite(proxy)에서 확인한 결과, 오른쪽 사진을 보면, 방금 전에 설정하려고 했던 비밀번호(2222)와 recaptcha-response 값(captcha 인증을 받았다는 인증값)을 전달하는 패킷 확인

 

  • 그 다음 화면으로 넘어가면, Change 버튼을 한 번 더 누르는 페이지가 나오며, 이를 클릭했을 때 패킷을 또 다시 burpsuite에서 확인하였더니,

 

  • step1에서 step2로 넘어갔으며, 설정 예정이었던 비밀번호들이 함께 나온다.

 

  • 그 결과, password가 바뀐 것을 확인해볼 수 있다.

 

  • 이때, step2 가 있는 패킷이 결국 비밀번호를 변경시키는 최종 패킷이고, step1에 대한 인증 결과가 step2에 반영되고 있지 않으므로, step2 패킷만 보내면 된다고 보았고,
  • 해당 패킷을 repeater 탭으로 가져와 비밀번호 3333으로 설정해본 뒤, 서버측에 송신 

 

  • 그 결과, Password Changed 라는 패킷을 수신

 

  • security Level을 medium으로 설정한 뒤, 소스 코드를 확인해보았다. 구조적으로는 달라지는 것이 없어서 step2 if문 내용만 가져왔다.
  • 사진 속 빨간 색 박스 안을 보면, step1을 통과했는지 여부를 확인하는 if문이 있다.
  • 해당 if문이 true가 되면 해당 조건문은 거짓이 되어 그 다음 코드가 진행되겠지만, 만약 false가 되면 빨간 색 박스 친 if문이 작동하여 You have not passed the CAPTCHA라는 문구와 함께 return 값을 반환하여 실패하게 된다.

 

  • 이에 따라 패킷 변조시킬 때 passed captcha를 true로 설정하여 패킷을 전송하였더니, 

 

  • Password Changed 라는 패킷을 수신했다.

 

  • security Level을 high로 설정한 뒤, 소스 코드를 확인해보았다
  • 이전 레벨들과는 다르게, step1, 2로 나누는 것이 아닌, 중첩 if 문 형태로 바뀌었고, 캡차 인증 단계를 거쳤는지 확인하기 위해 $resp 변수에 captcha 인증 결과 값을 담아 갈색 박스에 있는 if문에서 확인해보는 절차를 볼 수 있다.
  • 그러나 $resp 값이 굳이 true가 아니여도 그 뒤에 나오는 or 문을 이용하여 인증을 우회할 수 있다.
  • g-recaptcha-response 파라미터 값을 hidd3n_valu3로, HTTP_USER_AGENT를 reCAPTCHA로 수정하면 captcha 인증을 우회할 수 있다.
  • 이는 reCAPTCHA 서버에서 테스트목적으로 해당서버에 접속할 때, captcha 인증을 우회하기 위해서 작성된 것으로 보인다.

 

  • burpsuite를 이용하여 User-agent를 reCAPTCHA로 설정한 다음, g-recaptcha-response를 hidd3n_valu3로 수정한 다음, 서버에 전송하였더니, 패스워드가 변경되었다는 패킷을 서버측으로부터 수신했다.

 

insecure Captcha 대응 방안

  • CAPTCHA 인증과 관련된 요청은 실습에서 확인했듯이, 요청을 처리하는 과정을 여러 프로세스로 나누어 처리하는 것보다, 하나의 프로세스 안에서 처리되도록 하며, 해당 프로세스 안에서 captcha 인증을 확인하는 과정이 있어야 안전하다.
  • 한 프로세스 내의 처리 로직 내에서도 CAPTCHA에 대한 인증 결과 값을 조건문을 통해 확인해주는 과정이 있어야한다.
  • 하지만 대부분의 CAPTCHA 인증의 경우 쉽게 우회가 가능하기 때문에 중요한 기능을 포함한 요청의 경우에는 다른 추가적인 인증 요소(OTP, 기존 패스워드 인증 등)를 추가하여 구현하는 것이 좀 더 안전하다.