DVWA : Brute Force - Low level
이 문서에 포함된 어떠한 내용도 불법적이거나 비윤리적인 목적으로 보안 도구나 방법론을 사용하도록 가르치거나 장려하지 않습니다. 항상 책임감 있는 태도로 행동하세요. 여기에 설명된 도구나 기법을 사용하기 전에 개인 테스트 환경 또는 허가를 받았는지 확인하세요. |
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
소스코드를 살펴보면 아래와 같다.
사용자 입력값 가져오기
$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 공격에 대한 보호 조치를 완전히 누락하여 누구나 원하는 횟수만큼 아무 제약 없이 모든 사용자에게 로그인을 시도할 수 있도록 하였다.
테스트 목적으로 Uername과 Password에 test라고 입력 후 Login 버튼을 클릭해서 서버로 전송되는 패킷의 내용을 Burp Suite로 Request를 Intercept 하여 확인해 보면 GET으로 username Parameter와 password Parameter에 앞서 로그인 페이지에서 입력한 test가 들어가는 것을 확인할 수 있다.
Intercept 한 내용을 확인하였다면 Brute Force 공격을 위해 마우스 오른쪽 클릭 > Send to Intruder를 클릭하여, Intercept 한 Request의 내용을 Intruder로 보낸다.
Intruder의 Positions탭에서 공격 유형은 정의된 각 위치마다 다른 Payload Set를 반복하는 Cluster bomb을 선택하고, Payload가 삽입될 위치인 username Parameter와 password Parameter 선택 후 Add$를 이용하여 Payload 삽입 위치를 설정한다.
다음으로 Payload Set를 설정하기 위해 Payload탭을 클릭한다. Payload Set 1번에서는 username Parameter에 삽입될 Payload 정보를 입력하며, Payload Set 2번은 password Parameter에 삽입될 Payload 정보를 입력한다.
설정된 Payload Set에 따라 Request 횟수가 늘어나며, Start attack를 클릭하면, Brute Force 공격이 진행된다.
공격 실행 결과 Length로 정렬하면, Length 길이가 다른 Request보다 긴 결과들이 Brute Force 공격으로 확인된 UserName과 Password가 된다.