모의해킹/Groot - 스터디

DVWA - Brute Force ( Medium )

잉카콜라 2023. 6. 21. 23:31

DVWA - Brute Force ( Medium ) 입니다

 

 개요 

이 포스팅에서는 DVWA(Damn Vulnerable Web Application)  -  Brute Force, Medium 단계 실습을 진행하면서 공부했던 내용에 대한 내용을 정리해 보았고, 모두 본인이 소유한 가상머신에서 실습이 이루어졌습니다

DVWA - Brute Force, Low 단계에서는 Wfuzz를 사용하여 실습을 진행하였고 Medium 단계에서는 Hydra를 사용하였습니다

실습환경
M1 MacBook Air
16G RAM
UTM - 가상머신
Kali Linux 2023.1  - Apple Silicon (ARM64)

 

 목차 

1. 취약점 설명 및 분석  -  소스코드 분석, Brute Force, 관리자 페이지

2. Hydra 사용방법 및 실습  -  사용방법, 실습, wfuzz와 비교하기

3. 대응방안

4. Secure Coing In Ubuntu  -  로그인 횟수 제한하기

 

 

 

 취약점 설명 및 분석 


 소스코드 분석 

// 위치 : /var/www/html/dvwa/vulnerabilities/brute/source -> medium.php
// 중요내용 제외 삭제하였음
<?php

if( isset( $_GET[ 'Login' ] ) ) {

    // 회원 정보 조회하기
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query );

    if( $result && mysqli_num_rows( $result ) == 1 ) {
        // 유저 정보 가져오기
        $row    = mysqli_fetch_assoc( $result );
        $avatar = $row["avatar"];

        // 로그인 성공
        echo "<p>Welcome to the password protected area {$user}</p>";
        echo "<img src=\"{$avatar}\" />";
    }
    else {
        // 로그인 실패
        sleep( 2 );
        echo "<pre><br />Username and/or password incorrect.</pre>";
    }

}

?>

입력받은 아이디와 비밀번호를 조회하여
로그인에 성공했다면 이미지와 성공 메시지를, 실패한다면 2초 뒤에 실패메시지를 보내도록 한다

 

 

 Brute Force 

위 코드에서는 이용자가 로그인 시도를 무한으로 할 수 있다

로그인에 실패할 경우 2초 뒤에 응답이 온다는 차이점이 있지만 로그인 시도를 하고 바로 응답이 오지 않으면 로그인 실패로 간주하고 바로 다음 로그인을 시도할 수 있다

 

 

 관리자 페이지 

아이디를 admin으로 하고 비밀번호를 password로 로그인을 시도하면 위와 같이 로그인에 성공함을 알 수 있다

 

로그인에 성공했을 때 나오는 이미지를 이용하여 다른 관리자 아이디를 알 수 있다

 

 

 

 Hydra 사용방법 및 실습 


 사용방법 

-l 유저이름 -P 비밀번호파일  형식으로 사용했다

-V 는 verbose mode( 상세모드 )로 아이디와 비밀번호를 보여준다

-I 는 기존 복원파일을 무시한다 ( 10초를 기다리지 않는다 )

 

 

 실습 

시간지연이 발생해 5개의 터미널을 이용하여 동시에 진행해 주었고 rockyou.txt, fasttrack.txt, john.lst 를 사용했다

 

 

 wfuzz와 비교하기 

Low 에서 사용했던 wfuzz를 Medium에도 적용했다

hydra를 적용했을 때와 마찬가지로 sleep(2)때문에 시간지연이 발생하는 것은 똑같았지만 결과는 같았다

 

 

 

 대응방안 

Brute Force는 로그인 시도를 무한으로 할 수 있다는 문제에서 발생하므로 Captcha, 로그인 횟수 제한, 로그인 시 개인 인증과 같은 방식으로 Brute Force 공격을 막을 수 있다

로그인할 때 개인 인증을 추가로 하는 경우는 국가 기관과 같이 엄청 중요한 곳이나 은행과 같이 평소에 이용은 자주 안 하지만 중요한 곳에 적용을 할 수 있다

 

 

 

 Secure Coing In Ubuntu 


 로그인 횟수 제한하기 

칼리 리눅스에서 우분투로 공격을 진행했다

 

<?php

$dbcon = mysqli_connect("localhost", "ruang", "ruang", "test") or die("접속 실패");

$user = $_GET['username'];
$pass = $_GET['passwd'];

$query  = "SELECT * FROM `dvwa_brute` WHERE username = '$user' AND passwd = '$pass';";
$result = mysqli_query($dbcon, $query);

if( $result && mysqli_num_rows($result) == 1 ) 
{
    echo "<p>Welcome to the password protected area {$user}</p>";
}
else 
{
    sleep( 2 );
    echo "<pre><br />Username and/or password incorrect.</pre>";
}

?>

기존 코드를 가져와서 실습하기 편하도록 수정했다

 

Brute Force 공격이 정상적으로 진행된다

 

 

<?php

$dbcon = mysqli_connect(데이터베이스 연결);

$query  = "로그인 성공시 사용할 SQL 질의문";
$result = mysqli_query($dbcon, $query);

$user_query  = "로그인 실패시 사용할 SQL 질의문";
$user_result = mysqli_query($dbcon, $user_query);

if (mysqli_num_rows($result) == 1)
{
    $trys = mysqli_fetch_assoc($result);
    $trynum = $trys['count'];

    if ($trynum < 3)
    {
    //로그인 성공
    }
}
else
{
    $trys = mysqli_fetch_assoc($user_result);
    $trynum = $trys['count'];

    if ($trynum >= 3) 
    {
        echo "<pre><br/>계정이 잠겼습니다. 비밀번호를 변경해주세요.</pre>";
        mysqli_close($dbcon);
        exit;
    }
    else
    {
        //로그인 실패
    }
}

?>

로그인 시도 횟수를 1씩 증가하도록 하여 3회 이상이 되면 계정이 잠기도록 변경했다

 

 

Brute Force 공격을 진행하면 연결이 끊겨서 더 이상 공격을 할 수 없다

 

 

728x90