※KOROMOON 님의 원격 서버를 제공받아 진행함.
※ 연구, 학습 목적 이외에 악의적인 의도로 사용하지 말 것.
Brute Force Attack(무차별 대입 공격)이란?
- 특정한 암호를 풀기 위해 가능한 모든 값을 대입하는 것
- 비유적인 의미는 라틴어 brutus에서 유래한 "무거운, 멍청한, 이성 없는"을 의미하는 brute의 어원을 반영
- 모든 경우의 수를 넣어 볼 수도 있지만 비밀번호 자릿수에 따라 상당한 시간이 걸리므로, 주로 유저들이 자주 사용하는 비밀번호 리스트를 파일로 만들어 넣어서 공격을 진행하는 Dictionary Attack(사전 대입 공격)을 이용
실습순서
- DVWA, Kali linux 설치된 상태
- DVWA 웹서버 로그인
- Security level low 지정
- Brute Force 카테고리 소스코드 확인 및 숙지
- 임의의 계정값 기입
- burpsuite의 intercept 기능 이용하여 get request 값 가로채기
- hydra 툴을 이용하여 계정 탈취
- 로그인 시도


해당 소스코드의 주석은
로그인 성공시 Welcome to the password protected area 리턴 메시지를 반환하고, 로그인 실패시 Username and/or password incorrect. 리턴 메시지를 반환하는 소스코드로 구성되어있음. 로그인은 Get 방식임을 확인할 수 있음. 변수는 username과 password임.

[그림3] 무작위로 아이디, 패스워드 값을 기입한 화면
먼저 burpsuite 도구를 이용하여 리퀘스트를 가로채기 전에 ID:admin PW:1234로 임의로 막 만들어낸 계정값을 입력함.

[그림4] burpsuite 도구로 무작위 대입한 계정 값을 intercept를 이용해 get request를 가로채는 화면
이때, intercept is on/off 기능으로 리퀘스트를 가로챌 수 있음.
해당 URL 구성은 /vulnerabilities/brute/?username=admin&password=1234&Login=Login
으로 구성되어 있으며, 우리는 위와 같은 구성 패턴을 응용할 것임.
쿠키값을 또한 복사하여 이용할 것임.

[그림5] 아이디, 비밀번호가 틀릴 경우 반환하는 리턴 메시지 문구
소스코드의 구성대로 임의로 [그림3]과 같이 입력하게 되면 실패 문구를 위와 같이 반환함을 알 수 있음.

[그림6] hydra 툴을 이용하기 전 업그레이드
칼리 리눅스의 hydra 툴을 이용하기 전에 칼리 리눅스의 hydra 툴만 설치 및 업그레이드 하도록 명령어를 입력해줌.

[그림7] ID, PASSWORD 무작위 대입 텍스트 파일 경로로 이동
id, password 기본적으로 무작위 대입할 수 있는 텍스트 파일본이 있는 metasploit 경로로 이동함.

[그림8] hydra 툴을 이용하여 계정 탈취에 성공한 화면
hydra <대상 도메인, 혹은 아이피> -s <포트 번호> http-get-form "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:H=Cookie: <쿠키값>:F=Username and/or password incorrect." -l <계정명> -P <패스워드 파일 경로> -t <서버당 동시 공격 수>
형태는 X=value: 값으로 구성됨.
최대 한 서버당 16 task 공격이 가능하여 16으로 지정함.
hydra란?
Hydra 툴은 van Hauser 님이 만든 네트워크 로그인/패스워트 크래킹 툴임.
수많은 프로토콜을 지원하며 병렬 연산을 통해 매우 빠르게 크래킹함.
Hydra 툴이 크래킹 지원되는 서비스 : adam6500 asterisk cisco cisco-enable cvs firebird ftp[s] http[s]-{head|get|post} http[s]-{get|post}-form http-proxy http-proxy-urlenum icq imap[s] irc ldap2[s] ldap3[-{cram|digest}md5][s] memcached mongodb mssql mysql nntp oracle-listener oracle-sid pcanywhere pcnfs pop3[s] postgres radmin2 rdp redis rexec rlogin rpcap rsh rtsp s7-300 sip smb smtp[s] smtp-enum snmp socks5 ssh sshkey svn teamspeak telnet[s] vmauthd vnc xmpp
kali@kali:~$ hydra -h
Hydra v9.0 (c) 2019 by van Hauser/THC - 군사 또는 비밀 서비스 기관이나 불법적인 목적으로 사용하지 마십시오.
문법 : hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e nsr] [-o FILE] [-t TASKS] [-M FILE [-T TASKS]] [-w TIME] [-W TIME] [-f] [-s PORT] [-x MIN:MAX:CHARSET] [-c TIME] [-ISOuvVd46] [service://server[:PORT][/OPT]]
옵션 :
-R 이전에 중단되거나 충돌된 세션을 복원함
-I 기존 복원 파일을 무시 (10초 동안 기다리지 마십시오)
-S SSL 연결 수행
-s PORT 서비스가 다른 기본 포트일 경우 여기에 정의
-l LOGIN or -L FILE 지정된 로그인 명으로 로그인하거나 파일로부터 여러 로그인을 로드함
-p PASS or -P FILE 지정된 패스워드를 시도하거나 파일로부터 여러 패스워드를 로드함
-x MIN:MAX:CHARSET 패스워드 무자별대입(bruteforce) 생성, "-x -h" 를 입력하여 도움을 받으십시오
-y 무차별대입(bruteforce) 에서 기호 사용 금지, 위 참조
-e nsr "n" 은 널 패스워드(null password), "s" 는 로그인을 패스워드로 사용하거나(and/or) "r" 은 역방향 로그인을 시도함
-u 패스워드가 아닌 사용자를 반복함 (effective! implied with -x)
-C FILE -L/-P 옵션 대신 콜론(:)으로 구분된 "로그인:패스워드" 형식
-M FILE 공격할 서버 목록, 한 줄에 한 항목, 포트를 지정할려면 ':'
-o FILE 찾은 로그인/패스워드 쌍을 stdout 대신 파일에 쓰기
-b FORMAT -o FILE 형식을 지정 : text(기본값), json, jsonv1
-f / -F 로그인/패스워드 쌍을 발견되면 종료 (-M : 호스트 당 -f, 전역 -F)
-t TASKS 대상 당 병렬 연결 수를 지정된 수(TASKS)로 실행 (기본값 : 16)
-T TASKS 전체를 지정된 수(TASKS)로 병렬 연결 (-M 일 경우 기본값 64)
-w / -W TIME 응답 대기 시간 (32) / 스레드 당 연결 수 (0)
-c TIME 모든 스레드에서 로그인 시도당 대기 시간 (-t 1 시행)
-4 / -6 IPv4 (기본값) / IPv6 주소 사용 (-M 에도 항상 []에 넣으십시오)
-v / -V / -d 상세 모드 / 시도할 때마다 로그인+패스워드 표시 / 디버그 모드
-O 이전 SSL v2 및 v3 사용
-q 연결 오류에 대한 메시지를 출력하지 않음
-U 서비스 모듈 사용법 세부사항
-h 더 많은 명령줄 옵션 (완전한 도움말)
server 대상 : DNS, IP 또는 192.168.0.0/24 (this OR the -M option)
service 크랙하는 서비스 (지원되는 프로토콜은 아래 참조)
OPT 일부 서비스 모듈은 추가 입력을 지원함 (모듈 도움말을 보고자 한다면 -U)
지원되는 서비스 : adam6500 asterisk cisco cisco-enable cvs firebird ftp[s] http[s]-{head|get|post} http[s]-{get|post}-form http-proxy http-proxy-urlenum icq imap[s] irc ldap2[s] ldap3[-{cram|digest}md5][s] memcached mongodb mssql mysql nntp oracle-listener oracle-sid pcanywhere pcnfs pop3[s] postgres radmin2 rdp redis rexec rlogin rpcap rsh rtsp s7-300 sip smb smtp[s] smtp-enum snmp socks5 ssh sshkey svn teamspeak telnet[s] vmauthd vnc xmpp
Hydra 툴은 로그인/패스워드 쌍을 추측하거나 해독하는 유용한 도구임.
AGPL v3.0 에 따라 라이센스가 부여됨.
최신 버전은 https://github.com/vanhauser-thc/thc-hydra 에서 구할 수 있음.
군사 또는 비밀 서비스 기관이나 불법적인 목적으로 사용하지 마십시오.
이 서비스는 afp ncp aracle sapr3 에서 컴파일되지 않음.
프록시 설정에 HYDRA_PROXY_HTTP 또는 HYDRA_PROXY 환경 변수를 사용하십시오.
E.g. % export HYDRA_PROXY=socks5://l:p@127.0.0.1:9150 (or: socks4:// connect://)
% export HYDRA_PROXY=connect_and_socks_proxylist.txt (up to 64 entries)
% export HYDRA_PROXY_HTTP=http://login:pass@proxy:8080
% export HYDRA_PROXY_HTTP=proxylist.txt (up to 64 entries)
예제 :
hydra -l user -P passlist.txt ftp://192.168.0.1
hydra -L userlist.txt -p defaultpw imap://192.168.0.1/PLAIN
hydra -C defaults.txt -6 pop3s://[2001:db8::1]:143/TLS:DIGEST-MD5
hydra -l admin -p password ftp://[192.168.0.0/24]/
hydra -L logins.txt -P pws.txt -M targets.txt ssh

[그림9] 탈취한 계정값을 이용한 로그인 시도

Brute Force Attack(무차별 대입 공격)이란?
- 특정한 암호를 풀기 위해 가능한 모든 값을 대입하는 것
- 비유적인 의미는 라틴어 brutus에서 유래한 "무거운, 멍청한, 이성 없는"을 의미하는 brute의 어원을 반영
- 모든 경우의 수를 넣어 볼 수도 있지만 비밀번호 자릿수에 따라 상당한 시간이 걸리므로, 주로 유저들이 자주 사용하는 비밀번호 리스트를 파일로 만들어 넣어서 공격을 진행하는 Dictionary Attack(사전 대입 공격)을 이용
실습순서
- DVWA, Kali linux 설치된 상태
- DVWA 웹서버 로그인
- Security level low 지정
- Brute Force 카테고리 소스코드 확인 및 숙지
- 임의의 계정값 기입
- burpsuite의 intercept 기능 이용하여 get request 값 가로채기
- hydra 툴을 이용하여 계정 탈취
- 로그인 시도


[그림2] DVWA Brute Force low 레벨 소스코드
해당 소스코드의 주석은
로그인 성공시 Welcome to the password protected area 리턴 메시지를 반환하고, 로그인 실패시 Username and/or password incorrect. 리턴 메시지를 반환하는 소스코드로 구성되어있음. 로그인은 Get 방식임을 확인할 수 있음. 변수는 username과 password임.

먼저 burpsuite 도구를 이용하여 리퀘스트를 가로채기 전에 ID:admin PW:1234로 임의로 막 만들어낸 계정값을 입력함.

이때, intercept is on/off 기능으로 리퀘스트를 가로챌 수 있음.
해당 URL 구성은 /vulnerabilities/brute/?username=admin&password=1234&Login=Login
으로 구성되어 있으며, 우리는 위와 같은 구성 패턴을 응용할 것임.
쿠키값을 또한 복사하여 이용할 것임.

소스코드의 구성대로 임의로 [그림3]과 같이 입력하게 되면 실패 문구를 위와 같이 반환함을 알 수 있음.

칼리 리눅스의 hydra 툴을 이용하기 전에 칼리 리눅스의 hydra 툴만 설치 및 업그레이드 하도록 명령어를 입력해줌.

id, password 기본적으로 무작위 대입할 수 있는 텍스트 파일본이 있는 metasploit 경로로 이동함.

hydra <대상 도메인, 혹은 아이피> -s <포트 번호> http-get-form "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:H=Cookie: <쿠키값>:F=Username and/or password incorrect." -l <계정명> -P <패스워드 파일 경로> -t <서버당 동시 공격 수>
형태는 X=value: 값으로 구성됨.
최대 한 서버당 16 task 공격이 가능하여 16으로 지정함.
hydra란?
Hydra 툴은 van Hauser 님이 만든 네트워크 로그인/패스워트 크래킹 툴임.
수많은 프로토콜을 지원하며 병렬 연산을 통해 매우 빠르게 크래킹함.
Hydra 툴이 크래킹 지원되는 서비스 : adam6500 asterisk cisco cisco-enable cvs firebird ftp[s] http[s]-{head|get|post} http[s]-{get|post}-form http-proxy http-proxy-urlenum icq imap[s] irc ldap2[s] ldap3[-{cram|digest}md5][s] memcached mongodb mssql mysql nntp oracle-listener oracle-sid pcanywhere pcnfs pop3[s] postgres radmin2 rdp redis rexec rlogin rpcap rsh rtsp s7-300 sip smb smtp[s] smtp-enum snmp socks5 ssh sshkey svn teamspeak telnet[s] vmauthd vnc xmpp
kali@kali:~$ hydra -h
Hydra v9.0 (c) 2019 by van Hauser/THC - 군사 또는 비밀 서비스 기관이나 불법적인 목적으로 사용하지 마십시오.
문법 : hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e nsr] [-o FILE] [-t TASKS] [-M FILE [-T TASKS]] [-w TIME] [-W TIME] [-f] [-s PORT] [-x MIN:MAX:CHARSET] [-c TIME] [-ISOuvVd46] [service://server[:PORT][/OPT]]
옵션 :
-R 이전에 중단되거나 충돌된 세션을 복원함
-I 기존 복원 파일을 무시 (10초 동안 기다리지 마십시오)
-S SSL 연결 수행
-s PORT 서비스가 다른 기본 포트일 경우 여기에 정의
-l LOGIN or -L FILE 지정된 로그인 명으로 로그인하거나 파일로부터 여러 로그인을 로드함
-p PASS or -P FILE 지정된 패스워드를 시도하거나 파일로부터 여러 패스워드를 로드함
-x MIN:MAX:CHARSET 패스워드 무자별대입(bruteforce) 생성, "-x -h" 를 입력하여 도움을 받으십시오
-y 무차별대입(bruteforce) 에서 기호 사용 금지, 위 참조
-e nsr "n" 은 널 패스워드(null password), "s" 는 로그인을 패스워드로 사용하거나(and/or) "r" 은 역방향 로그인을 시도함
-u 패스워드가 아닌 사용자를 반복함 (effective! implied with -x)
-C FILE -L/-P 옵션 대신 콜론(:)으로 구분된 "로그인:패스워드" 형식
-M FILE 공격할 서버 목록, 한 줄에 한 항목, 포트를 지정할려면 ':'
-o FILE 찾은 로그인/패스워드 쌍을 stdout 대신 파일에 쓰기
-b FORMAT -o FILE 형식을 지정 : text(기본값), json, jsonv1
-f / -F 로그인/패스워드 쌍을 발견되면 종료 (-M : 호스트 당 -f, 전역 -F)
-t TASKS 대상 당 병렬 연결 수를 지정된 수(TASKS)로 실행 (기본값 : 16)
-T TASKS 전체를 지정된 수(TASKS)로 병렬 연결 (-M 일 경우 기본값 64)
-w / -W TIME 응답 대기 시간 (32) / 스레드 당 연결 수 (0)
-c TIME 모든 스레드에서 로그인 시도당 대기 시간 (-t 1 시행)
-4 / -6 IPv4 (기본값) / IPv6 주소 사용 (-M 에도 항상 []에 넣으십시오)
-v / -V / -d 상세 모드 / 시도할 때마다 로그인+패스워드 표시 / 디버그 모드
-O 이전 SSL v2 및 v3 사용
-q 연결 오류에 대한 메시지를 출력하지 않음
-U 서비스 모듈 사용법 세부사항
-h 더 많은 명령줄 옵션 (완전한 도움말)
server 대상 : DNS, IP 또는 192.168.0.0/24 (this OR the -M option)
service 크랙하는 서비스 (지원되는 프로토콜은 아래 참조)
OPT 일부 서비스 모듈은 추가 입력을 지원함 (모듈 도움말을 보고자 한다면 -U)
지원되는 서비스 : adam6500 asterisk cisco cisco-enable cvs firebird ftp[s] http[s]-{head|get|post} http[s]-{get|post}-form http-proxy http-proxy-urlenum icq imap[s] irc ldap2[s] ldap3[-{cram|digest}md5][s] memcached mongodb mssql mysql nntp oracle-listener oracle-sid pcanywhere pcnfs pop3[s] postgres radmin2 rdp redis rexec rlogin rpcap rsh rtsp s7-300 sip smb smtp[s] smtp-enum snmp socks5 ssh sshkey svn teamspeak telnet[s] vmauthd vnc xmpp
Hydra 툴은 로그인/패스워드 쌍을 추측하거나 해독하는 유용한 도구임.
AGPL v3.0 에 따라 라이센스가 부여됨.
최신 버전은 https://github.com/vanhauser-thc/thc-hydra 에서 구할 수 있음.
군사 또는 비밀 서비스 기관이나 불법적인 목적으로 사용하지 마십시오.
이 서비스는 afp ncp aracle sapr3 에서 컴파일되지 않음.
프록시 설정에 HYDRA_PROXY_HTTP 또는 HYDRA_PROXY 환경 변수를 사용하십시오.
E.g. % export HYDRA_PROXY=socks5://l:p@127.0.0.1:9150 (or: socks4:// connect://)
% export HYDRA_PROXY=connect_and_socks_proxylist.txt (up to 64 entries)
% export HYDRA_PROXY_HTTP=http://login:pass@proxy:8080
% export HYDRA_PROXY_HTTP=proxylist.txt (up to 64 entries)
예제 :
hydra -l user -P passlist.txt ftp://192.168.0.1
hydra -L userlist.txt -p defaultpw imap://192.168.0.1/PLAIN
hydra -C defaults.txt -6 pop3s://[2001:db8::1]:143/TLS:DIGEST-MD5
hydra -l admin -p password ftp://[192.168.0.0/24]/
hydra -L logins.txt -P pws.txt -M targets.txt ssh

[그림9] 탈취한 계정값을 이용한 로그인 시도

Brute Force 공격에 이용되는 hydra, burpsuite 툴 말고도 medusa나 다양한 툴로 시도해보았으나 실패하여
기존에 나온 방법대로 진행함.

[그림1] DVWA medium level 설정

[그림2] cookie 값을 알아내기 위한 intercept on/off를 이용해 리퀘스트 가로채기
burpsuite를 이용해 intercept on/off 버튼으로 리퀘스트를 가로채어
cookie 값을 알아냄.

[그림3] hydra 툴을 이용하여 공격 시도
hydra <대상 도메인, 혹은 아이피> -s <포트 번호> http-get-form "/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:H=Cookie: <쿠키값>:F=Username and/or password incorrect." -l <계정명> -P <패스워드 파일 경로> -t <서버당 동시 공격 수>
형태는 X=value: 값으로 구성됨.
최대 한 서버당 16 task 공격이 가능하여 16으로 지정함.
해당 쿠키값은 low 레벨에 나온 설명대로 헤더의 쿠키값을 복사하여 붙여넣었음.
동시 서버 공격수는 16으로 동일하게 설정.
id는 관리자 권한을 획득하기 위해 기존처럼 admin으로 설정.

[그림4] hydra 툴로 알아낸 계정값을 이용해 로그인 시도

[그림5] 로그인 성공 화면

[그림6] dvwa security level high 설정
vulnerabilities/brute/source/high.php의 소스코드
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Sanitise username input
$user = $_GET[ 'username' ];
$user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
// Sanitise password input
$pass = $_GET[ 'password' ];
$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass = md5( $pass );
// Check the database
$query = "SELECT * FROM users WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];
// Login successful
echo "<p>Welcome to the password protected area {$user}</p>";
echo "<img src=\"{$avatar}\" />";
}
else {
// Login failed
sleep( 2 );
echo "<pre><br />Username and/or password incorrect.</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
코드 간단 해설
전체 과정:
이 코드는 사용자가 입력한 아이디와 비밀번호가 맞는지 데이터베이스에서 확인하고, 로그인 성공 또는 실패를 처리하는 코드임.
1. 사용자가 입력한 값 받기
- 사용자가 웹사이트에서 로그인할 때, 아이디(username)와 비밀번호(password)를 입력함.
- 이 값들을 **$_GET**을 통해 받아옴. 즉, URL에 입력된 값이 전달됨.
2. 입력 값 정리 (Sanitize)
- 사용자가 입력한 아이디와 비밀번호에 특수 문자가 있을 수 있는데, 이 특수 문자가 SQL 쿼리를 방해하거나 악성 코드로 사용될 수 있음.
- 그래서 이 값을 정리(sanitize)하여 안전하게 만듦. SQL 문법에 맞게 변환하는 작업임.
3. 비밀번호 암호화
- 사용자가 입력한 비밀번호는 암호화되어 저장됨.
- md5()라는 방법을 사용하여 비밀번호를 암호화함. (이 방법은 보안상 좋은 방법은 아님.)
4. 데이터베이스에서 아이디와 비밀번호 확인
- 아이디와 암호화된 비밀번호를 이용해서 데이터베이스에서 일치하는 사용자가 있는지 확인함.
- 만약 데이터베이스에서 일치하는 정보가 하나라도 있으면, 로그인 성공으로 간주하고, 그 사용자의 아바타 이미지를 보여줌.
5. 로그인 실패 처리
- 만약 일치하는 사용자가 없다면, "아이디나 비밀번호가 틀렸습니다"라는 메시지가 나오고, 2초 후에 다시 시도할 수 있게 됨.
6. 데이터베이스 연결 종료
- 모든 작업을 끝낸 후에는 데이터베이스 연결을 종료.
코드 상세 설명
- 사용자 입력 받기 ($_GET['username'], $_GET['password'])
- 사용자가 로그인 폼에서 제출한 username과 password 값을 $_GET을 통해 받음. 이는 URL 파라미터로 전달된 값을 가져옴.
2. 입력 값 정리 (Sanitize)
- username과 password 값은 데이터베이스 쿼리에서 직접 사용되기 전에 정리(sanitise) 됨. 이를 통해 SQL 인젝션 공격을 방지하려고 함.
- mysqli_real_escape_string 함수를 사용하여 특수 문자를 이스케이프(escape)하여 SQL 쿼리에서 문제가 발생하지 않도록 함.
- 이 과정에서 MySQL 연결 객체가 없으면 경고 메시지가 발생함.
3.비밀번호 암호화
- 사용자가 입력한 password는 md5() 함수를 사용하여 해시(hash) 처리됨. 이를 통해 평문 비밀번호를 안전하게 처리하려는 의도임.
(md5()는 현재 보안상 취약점이 있기 때문에 실제 사용에서는 더 강력한 암호화 방법을 사용하는 것을 추천함.)
4. SQL 쿼리 실행
- $user와 $pass 값을 사용하여 users 테이블에서 username과 password가 일치하는 레코드를 찾는 SQL 쿼리를 작성함.
- mysqli_query 함수를 사용하여 이 쿼리를 데이터베이스에서 실행하고 결과를 받음. 만약 쿼리가 실패하면 오류 메시지가 출력됨.
5. 로그인 성공 여부 확인
- 쿼리 실행 후, 결과가 1개 행(mysqli_num_rows($result) == 1)이라면 로그인에 성공한 것으로 간주하고:
- 데이터베이스에서 avatar(사용자 아바타 이미지)를 가져옴.
- 로그인 성공 메시지와 함께 아바타 이미지를 출력.
6. 로그인 실패 처리
- 만약 쿼리 결과가 없거나, 잘못된 username 또는 password라면 로그인에 실패한 것으로 간주하고:
- 2초 대기(sleep(2)) 후, "Username and/or password incorrect."라는 메시지를 출력함.
7. 데이터베이스 연결 종료
- 모든 처리 후, 데이터베이스 연결을 종료.
요약
이 코드는 사용자가 입력한 사용자명(username)과 비밀번호(password)를 받아 데이터베이스에서 이를 확인하고, 일치하는 정보가 있으면 로그인 성공 메시지와 함께 아바타 이미지를 표시함. 일치하지 않으면 로그인 실패 메시지를 표시함.

[그림7] dvwa brute force high 임의의 계정값 로그인 시도 후 burpsuite 리퀘스트를 가로챈 화면
[그림4]처럼 로그인 시도 후 리퀘스트 값을 가로챈 화면임.
해당 리퀘스트 값을 가로챈 후 마우스 우클릭으로 [Send to Intruder]를 클릭.

[그림8] WinScp를 이용하여 Kali의 password list 파일을 windows 서버로 옮기는 화면
따로 password list 파일이 없기 때문에 WinScp를 이용하여 password list 파일을 옮겨줌.
WinScp란?
WinSCP(Windows Secure CoPy)는 마이크로소프트 윈도우용으로 개발된 자유-오픈 소스 소프트웨어, SFTP, SCP 및 FTP 클라이언트임. 주요 기능은 로컬 및 원격 컴퓨터 간 보안 파일 전송임. 그뿐 아니라 WinSCP는 기본적인 파일 관리자와 파일 동기화 기능을 제공함.

Pitchfork 공격이란?
Pitchfork Attack는 Brute Force 공격의 변형으로, 비밀번호를 추측하는 과정에서 효율성을 높이기 위한 방법이라 할 수 있음. 이 공격의 핵심 원리는 여러 개의 사용자 아이디와 비밀번호를 동시에 추측하여 공격을 더 빠르게 시도하는 것임.
출처 입력
원리:
- 일반적인 Brute Force 공격은 각 사용자 아이디와 비밀번호를 하나씩 순차적으로 시도함. 예를 들어, 첫 번째 아이디의 모든 비밀번호를 시도한 후, 두 번째 아이디의 모든 비밀번호를 시도함.
- Pitchfork Attack은 동시에 여러 아이디에 대한 비밀번호를 시도함.
- 즉, 여러 아이디에 대한 패스워드 리스트를 동시에 시도하는 방식임.
- 각 아이디마다 비밀번호를 하나씩 대응시키며 동시에 진행되기 때문에, 일반적인 Brute Force보다 공격을 더 빠르게 성공할 확률을 높일 수 있음.
예시:
- 예를 들어, 공격자가 3명의 사용자 아이디(user1, user2, user3)와 5개의 비밀번호(1234, password, qwerty, admin, letmein)를 가지고 있다고 가정할 때,
- Brute Force는 각 아이디에 대해 비밀번호를 하나씩 시도하는 방식으로 3아이디 × 5비밀번호 = 15번의 시도를 해야 함.
- 반면 Pitchfork Attack은 3개의 아이디와 5개의 비밀번호를 동시에 시도하여 5번의 시도만으로 모두 확인할 수 있음.
요약:
Pitchfork Attack은 여러 아이디와 비밀번호를 동시에 시도해 더 효율적으로 공격하는 방법, Brute Force 공격보다 신속하고 효율적으로 비밀번호를 찾아낼 수 있음.

[그림10] payload Options에서 패스워드 리스트 파일을 불러오는 화면.

[그림 11] Recursive grep으로 설정을 변경하여 Payload Options를 설정
[그림 11]은 user token 값이 숨겨져 있었기 때문에 웹페이지에서 추출함. Burpsuite browser로 로그인할 때마다 해당 위치에서 값을 추출하여 Bruteforce Attack을 시도해야 함.

[그림12] admin 로그인 실패 시에 나오는 CSRF 토큰이 맞지 않다는 문구.

[그림13] Resource pool 설정
Custom Resource pool은 최대 요청 리퀘스트 1로 설정함.

[그림14] Grep - Match
Grep Match 문구를 로그인 성공 시 나타나는 Welcome 문구를 따와서 설정함.

Grep - Payloads 에서
payload strings를 검색하고 응답하여 HTTP Headers를 포함시킴.

Redirections 설정을 항상 Redirection 하도록 설정.

[그림17]은 Welcome 문구에 표시된 1을 통해 pitch fork 공격 시도로 찾아낸 패스워드 값을 알 수 있음.

[그림4]처럼 로그인 시도를 하였을 때 아래와 같이 로그인 성공화면이 출력되는 것을 확인 가능함.

참고출처
해당 URL 출처를 통해 더 자세히 연구할 수 있음.
[1] https://blog.naver.com/river_k01/223632363094 [DVWA Bruteforce (security level=low)
[2] https://tggg23.tistory.com/46 [DVWA Bruteforce]
[3] https://ko.wikipedia.org/wiki/WinSCP [Wiki 백과 - WinSCP]
[4] https://medium.com/@aayanx41/dvwa-brute-force-c2901f630c3d [ DVWA Bruteforce writing by Aayan Tiwari ]
[5] https://tggg23.tistory.com/46 [DVWA] Brute Force Attack
[6] https://koromoon.blogspot.com/2020/07/hydra.html [Hydra 툴 (네트워크 로그인/패스워트 크래킹 툴)]
[7] https://www.kali.org/tools/hydra/ [Hydra | Kali Linux Tools]
[8] https://github.com/vanhauser-thc/thc-hydra/issues/612 [Solution: How to solve DVWA /vulnerabilities/brute/]
[9] https://www.infosecinstitute.com/resources/hacking/popular-tools-for-brute-force-attacks/
[Popular tools for brute-force attacks]
'RED' 카테고리의 다른 글
CVE-2024-40725, CVE-2024-40898 PoC 파일 패킷 덤프 (0) | 2025.03.11 |
---|---|
Caidao-20160622 툴을 이용한 One Line Webshell 실습 (0) | 2025.03.11 |