상세 컨텐츠

본문 제목

DVWA : Brute Force - Low level

Vulnerability Assessment/Web Application

by DarkSoul.Story 2024. 12. 28. 22:48

본문

반응형
이 문서에 포함된 어떠한 내용도 불법적이거나 비윤리적인 목적으로 보안 도구나 방법론을 사용하도록 가르치거나 장려하지 않습니다. 항상 책임감 있는 태도로 행동하세요. 여기에 설명된 도구나 기법을 사용하기 전에 개인 테스트 환경 또는 허가를 받았는지 확인하세요.

 

1. Overview

Brute Force 공격은 시도와 오류(trial-and-error) 방식을 사용해 시스템의 암호나 인증 정보를 알아내려는 공격 유형으로, 공격자는 가능한 모든 조합을 체계적으로 시도하여 올바른 정보를 찾으려고 한다. 이 방법은 단순하고 효과적일 수 있지만, 일반적으로 시간과 자원이 많이 소모된다. 따라서 약한 비밀번호나 제한 없는 인증 시도가 Brute Force 공격의 주요 표적이 된다.

종류 설명 예시
단순
Brute Force 공격
모든 가능한 비밀번호 조합을 하나씩 대입하여 시도 비밀번호가 숫자로만 구성된 경우 0000, 0001, ..., 9999를 차례로 시도
사전 공격
(Dictionary Attack)
사전에 있는 단어 리스트(일반적으로 사용되는 비밀번호 리스트)를 기반으로 암호를 추측 password, 123456, qwerty 같은 흔한 비밀번호를 시도
하이브리드
Brute Force 공격
사전 공격과 단순 Brute Force 공격을 결합
사전에 있는 단어에 숫자나 특수 문자를 추가하여 조합을 만듬
password1, qwerty!, admin123
역방향
Brute Force 공격
흔히 사용되는 암호(예: 123456)를 미리 정하고, 이를 다양한 사용자 계정에 시도 대규모 데이터베이스 누출로 얻은 사용자 계정 정보를 활용하기도 함
자격 증명 대입
(Credential Stuffing)
유출된 사용자 이름과 비밀번호 조합을 다른 시스템에 재사용하여 인증을 시도 공격자가 유출된 이메일-비밀번호 조합을 이용해 은행 계정에 로그인 시도

 

Brute Force  취약점 발생 원인

약한 비밀번호 사용

  • "123456", "password"와 같이 예측 가능한 비밀번호가 사용될 경우 쉽게 공격에 노출된다.

비밀번호 복잡성 정책 부재

  • 최소 길이, 특수문자 포함 등의 보안 규칙이 적용되지 않아 비밀번호가 단순한 경우

로그인 시도 제한 미흡

  • 로그인 실패 횟수에 제한이 없으면 공격자는 무한히 조합을 시도할 수 있다.

2단계 인증 미적용

  • 비밀번호 이외의 추가 인증 단계가 없는 경우 공격 성공 가능성이 높아진다.

캡차 미적용

  • 자동화된 도구를 방지하기 위한 캡차(CAPTCHA)가 적용되지 않으면 자동화된 대입 시도를 쉽게 허용

ㅁ Brute Force  대응 방안

강력한 비밀번호 정책 적용

  • 최소 8자 이상의 비밀번호를 요구하고, 대소문자, 숫자, 특수문자를 포함하도록 강제

로그인 시도 제한

  • 연속된 실패 횟수(예: 5회) 이후 계정을 일시적으로 잠금.
  • 계정 잠금 시 사용자에게 알림을 보내 의심스러운 활동을 확인

캡차 적용

  • 로그인 화면에 CAPTCHA를 추가해 자동화된 공격을 방지

2단계 인증(2FA) 도입

  • 비밀번호 외에 이메일, SMS, 인증 앱을 통한 추가 인증을 요구
  • 공격자가 비밀번호를 알아내더라도 2FA가 없다면 계정 접근이 불가능

암호화 및 해싱 강화

  • 비밀번호는 안전한 해시 알고리즘(SHA-256, bcrypt 등)을 사용해 저장하고, 해시된 값만 서버에 보관
  • SALT를 사용해 동일한 비밀번호의 해시값을 다르게 저장

사용자 알림 시스템

  • 로그인 실패 횟수가 일정 횟수를 초과하거나 의심스러운 로그인 시도가 발생하면 사용자에게 즉시 알림

IP 차단 및 블랙리스트 관리

  • 동일 IP에서 다수의 로그인 시도가 발생하면 해당 IP를 일시적으로 차단
  • 악성 IP의 블랙리스트를 구축해 사전 차단

로그 분석 및 모니터링

  • 로그인 시도를 기록하고, 비정상적인 활동 패턴(예: 짧은 간격의 대량 로그인 시도)을 탐지
  • SIEM(Security Information and Event Management) 시스템 활용

Brute Force 공격은 비밀번호 인증 시스템의 가장 기본적인 취약점을 공략하는 공격 방식이다. 이를 방지하기 위해 강력한 비밀번호 정책, 2단계 인증, 로그인 시도 제한, 캡차 적용 등 다층적인 보안 조치를 적용해야 한다. 정기적인 로그 모니터링과 취약점 점검으로 공격 시도를 사전에 탐지하고 차단하는 것도 중요하다.

 

2.  Source code analysis

소스코드를 살펴보면 아래와 같다.

[그림 1] Low level Source code

사용자 입력값 가져오기

$user = $_GET[ 'username' ]; 
$pass = $_GET[ 'password' ]; 
$pass = md5( $pass );
  • username과 password 값을 GET 매개변수에서 받아오며, 비밀번호는 md5 해싱 알고리즘을 사용하여 해시 처리된다.
  • md5는 오래된 해싱 알고리즘으로 안전하지 않으며, 더 안전한 password_hash()를 사용해야 한다.

SQL 쿼리 실행

$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
  • SQL 쿼리를 생성하여 users 테이블에서 입력한 사용자와 비밀번호가 일치하는지 확인한다.
  • 취약점 : SQL 인젝션 공격에 매우 취약하다. 사용자 입력값이 직접 쿼리에 삽입되고 있어 공격자가 악성 코드를 실행할 수 있다.

결과 확인

if( $result && mysqli_num_rows( $result ) == 1 ) { 
    $row = mysqli_fetch_assoc( $result ); 
    $avatar = $row["avatar"];
}
  • 쿼리 결과가 정확히 하나의 행(사용자)이 반환되면 로그인 성공으로 처리하며, 로그인 성공 시 사용자 이름과 아바타 이미지를 표시한다.

로그인 실패 처리

else {
    echo "<pre><br />Username and/or password incorrect.</pre>";
}
  • 결과가 없거나 여러 행이 반환되면 "Username and/or password incorrect" 메시지를 출력합니다.

데이터베이스 연결 종료

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
  • 데이터베이스 연결을 종료

 

3. Practical exercises

처음 보이는 화면은 로그인 페이지로, Low Level은 개발자가 Brute Force 공격에 대한 보호 조치를 완전히 누락하여 누구나 원하는 횟수만큼 아무 제약 없이 모든 사용자에게 로그인을 시도할 수 있도록 하였다.

[그림 1] Brute Force

 

테스트 목적으로 Uername과 Password에 test라고 입력 후 Login 버튼을 클릭해서 서버로 전송되는 패킷의 내용을 Burp Suite로 Request를 Intercept 하여 확인해 보면 GET으로 username Parameter와 password Parameter에 앞서 로그인 페이지에서 입력한 test가 들어가는 것을 확인할 수 있다.

[그림 2] 로그인 시 Burp suite로 Intercept

 

Intercept 한 내용을 확인하였다면 Brute Force 공격을 위해 마우스 오른쪽 클릭 > Send to Intruder를 클릭하여, Intercept 한 Request의 내용을 Intruder로 보낸다.

[그림 3] Send to Intruder

Intruder의 Positions탭에서 공격 유형은 정의된 각 위치마다 다른 Payload Set를 반복하는 Cluster bomb을 선택하고, Payload가 삽입될 위치인 username Parameter와 password Parameter 선택 후 Add$를 이용하여 Payload 삽입 위치를 설정한다.

[그림 4] Payload 삽입 위치 설정

 

다음으로 Payload Set를 설정하기 위해 Payload탭을 클릭한다. Payload Set 1번에서는 username Parameter에 삽입될 Payload 정보를 입력하며,  Payload Set 2번은 password Parameter에 삽입될 Payload 정보를 입력한다.

[그림 5] Payload Set 설정

 

설정된 Payload Set에 따라 Request 횟수가 늘어나며, Start attack를 클릭하면, Brute Force 공격이 진행된다.

[그림 6] Brute Force Attack

 

공격 실행 결과 Length로 정렬하면, Length 길이가 다른 Request보다 긴 결과들이  Brute Force 공격으로 확인된 UserName과 Password가 된다.

[그림 7]  Brute Force 공격 결과

 

반응형

관련글 더보기