본문 바로가기
Hacking/bWAPP

Broken Authentication – CAPTCHA

by 알거음슴 2021. 6. 14.

Broken Authentication – CAPTCHA Bypassing

CAPTCHA : 사람과 컴퓨터를 구분하기 위한 방법 사람은 해독할 수 있으나 컴퓨터는 해독하기 난해한 이미지나 문구 등 입력을 받는 것으로 추가적인 인증을 진행하는 기능.

 

1. Broken Authentication – CAPTCHA Bypassing

기존 login form과 다르게 하단에 Captcha 기능이 추가되어 있는 것으로 확인된다, 기본적으로 ID Passwrod는 제공되어있어 로그인을 시도 및 로그인 실패에 따른 결과를 비교해본다.

 

로그인 성공
로그인 실패 (Captcha 오류)
로그인 실패 (ID/Password 오류)

순서대로 로그인성공, CAPTCHA의 오류, ID,Passwrod의 오류 의 결과이다. 해당 정보를 가지고 Burp suite을 통해 Crack작업을 진행해본다.

 

2. Broken Authentication – CAPTCHA Bypassing / Crack

login=&password=&captcha_user=&form=submit

Burp suite로 로그인버튼을 누른 직후 패킷을 잡아서 확인해보면 login, password, captcha의 값을 받아서 로그인과정을 진행하는걸 확인할 수 있다.

CAPTCHA 문자만 정확히 입력한 뒤에 잡은 패킷을 가지고 Burp suite Intruder (Brute force or Dictionary Attack) 을 통하여 Crack 작업을 진행한다.

Sand to Intruder을 통해 패킷을 전달 Intruder탭의 Positions항목으로 이동, 기존 내용을 Clear을 통해 지워준뒤 LoginPassword항목의 부분에 Payload를 삽입해준다

Attack Type의 경우는 Cluster bomb (payload set들을 반복삽입 하는 공격)으로 세팅 후 Payloads 탭으로 이동한다.

ID payload
Password Payload

설정한 payload setting을 진행한다, 1번의 경우 ID 2번의 경우 Password의 들어갈 Simple list를 지정한다 Payload OptionsAdd를 통해 추가 하며 경우에 따라서는 Load… 을 통해서 Dictionary file을 불러올 수 도 있다.

 

마지막으로 Options 탭으로 이동하여 Grep – Match Captcha만 맞춘 경우의 에러문구를 삽입하고 Start Attack으로 Crack 작업을 진행해본다.

결과 확인시 에러문구로 지정한 Invalid credentials! Did you forgot your password? 가 체크되어 있는 경우는 로그인이 실패된 기록이기에 체크 되지않은 bee/bug 조합이 일치하는 결과인것으로 확인된다. Server-Response을 확인시 Successful login! 으로 전송된 것이 확인된다.

 

 

3. Broken Authentication – CAPTCHA Bypassing / Source code

1) ba_captcha_bypass.php

<div id="main">
     <h1>Broken Auth. - CAPTCHA Bypassing</h1>
     <p>Enter your credentials <i>(bee/bug)</i>.</p>
     <form action="<?php echo($_SERVER["SCRIPT_NAME"]);?>" method="POST">
         <p><label for="login">Login:</label><br />
         <input type="text" id="login" name="login" size="20" autocomplete="off" /></p>
         <p><label for="password">Password:</label><br />
         <input type="password" id="password" name="password" size="20" autocomplete="off" /></p>
         <p><iframe src="captcha_box.php" scrolling="no" frameborder="0" height="70" width="350"></iframe></p>
        <p><label for="captcha_user">Re-enter CAPTCHA:</label><br />
         <input type="text" id="captcha_user" name="captcha_user" value="" autocomplete="off" /></p>
         <button type="submit" name="form" value="submit">Login</button>
         &nbsp;&nbsp;&nbsp;<?php echo $message . "\n";?>
     </form>
</div>

captcha_box.php 를 통해서 Captcha자료를 가져오는것으로 확인된다.

2) captcha_box.php

<title>bWAPP - CAPTCHA box</title>
</head>
<body>
<table>
    <tr>
        <td><img src="captcha.php"></iframe></td>
        <td><input type="button" value="Reload" onClick="window.location.reload()"></td>
    </tr>
</table>
</body>
</html>

captcha_box.php의 경우 captcha reload할수 있는 기능구현 및 captcha.php 에서 값을 가져오는것으로 확인된다.

 

3) captcha.php

include("security.php");
include("security_level_check.php");
include("functions_external.php");
 
$captcha = random_string();
$_SESSION["captcha"] = $captcha;
 
// Creates the canvas
// Creates a new image
// image = imagecreate(233, 49);

captcha.php 를 통해 랜덤값을 만들어준다 생성된 렌덤값을 captcha_box.php -> ba_ captcha_bypass.php로 전달되고 있음을 확인할 수 있다.

 

4) level 별 차이점

$message = "";
if(isset($_POST["form"]))
{
    if($_COOKIE["security_level"] == "1" or $_COOKIE["security_level"] == "2")
    {
        if(isset($_SESSION["captcha"]) && ($_POST["captcha_user"] == $_SESSION["captcha"]))
        {
            if($_POST["login"] == $login && $_POST["password"] == $password)
            {
                $message = "<font color=\"green\">Successful login!</font>";
            }

Medium high level의 경우에는 입력받은 captcha의 값이 실제로 존재하고 있는 여부가 참이냐 거짓이냐에 따른 결과가 다르게 출력되도록 설정되어있다. 기존 실습의 low level의 경우 Reload 또는 Login버튼을 누르지 않을 경우 값이 변하지않는다는 인증취약점을 이용한 공격방식이였다

CAPTCHA의 경우 지속적으로 값의 존재여부 및 일치여부를 확인해야한다.