Hydra 를 이용한 SSL 지원 서비스 공격

HydraBeginner
지금 연습하기

소개

이 랩에서는 Hydra 를 사용하여 SSL 이 활성화된 서비스를 공격하는 방법을 살펴봅니다. 이 랩은 SSL/TLS로 보호된 서비스에서 Hydra 의 비밀번호 크래킹 (password cracking) 능력을 테스트하는 데 중점을 둡니다.

먼저, Python 과 openssl을 사용하여 자체 서명된 인증서와 키를 생성하여 보안 환경을 시뮬레이션하는 로컬 HTTPS 서버를 설정합니다. 그런 다음, SSL 지원을 활성화하기 위해 -S 옵션을 사용하여 Hydra 를 실행하고 비밀번호 크래킹을 시도합니다. 또한 -O 옵션을 사용하여 이전 SSL 프로토콜도 테스트합니다. 마지막으로, SSL 공격의 성공 여부를 확인합니다.

로컬 HTTPS 서버 설정

이 단계에서는 SSL/TLS가 활성화된 Python 의 내장 http.server 모듈을 사용하여 간단한 HTTPS 서버를 설정합니다. 이를 통해 Hydra 의 SSL 기능을 테스트하기 위한 보안 서버 환경을 시뮬레이션할 수 있습니다.

먼저, 자체 서명된 인증서와 키를 생성해야 합니다. 이 인증서는 클라이언트 (Hydra) 와 서버 간의 통신을 암호화하는 데 사용됩니다. 터미널을 열고 ~/project 디렉토리로 이동합니다.

cd ~/project

이제 openssl 명령을 사용하여 인증서와 키를 생성합니다.

openssl req -new -x509 -keyout key.pem -out cert.pem -days 365 -nodes

인증서에 대한 정보를 입력하라는 메시지가 표시됩니다. Enter 키를 눌러 대부분의 필드를 비워둘 수 있습니다. 일반 이름 (Common Name) 이 필요하며, localhost를 입력할 수 있습니다.

Generating a RSA private key
+++++
writing new private key to 'key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:

이 명령은 key.pem(개인 키) 과 cert.pem(인증서) 의 두 파일을 생성합니다.

이제 HTTPS 서버용 Python 스크립트를 만들어 보겠습니다. nano 텍스트 편집기를 사용하여 스크립트를 생성하고 편집합니다.

nano https_server.py

다음 코드를 복사하여 편집기에 붙여넣습니다.

import http.server
import ssl
import os

## Create the HTTP server
httpd = http.server.HTTPServer(('127.0.0.1', 443), http.server.SimpleHTTPRequestHandler)

## Create SSL context
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain(certfile='cert.pem', keyfile='key.pem')

## Wrap the socket with SSL
httpd.socket = ssl_context.wrap_socket(httpd.socket, server_side=True)

print("Serving HTTPS on 127.0.0.1 port 443 (https://127.0.0.1:443/) ...")
httpd.serve_forever()

nano 에서 파일을 저장하려면:

  1. Ctrl + X를 눌러 종료합니다.
  2. Y를 눌러 저장을 확인합니다.
  3. Enter를 눌러 파일 이름을 확인합니다.

이제 다음을 사용하여 HTTPS 서버를 실행할 수 있습니다.

python3 https_server.py

다음과 유사한 출력이 표시됩니다.

Serving HTTPS on 127.0.0.1 port 443 (https://127.0.0.1:443/) ...

이 터미널 창을 계속 실행 상태로 둡니다. 이것이 HTTPS 서버입니다. 다음 단계에서는 Hydra 를 사용하여 인증을 크래킹 (cracking) 을 시도합니다.

중요: HTTPS 서버가 실행 중인 원래 터미널 창을 유지하십시오. 다음 단계를 위해 필요하므로 닫지 마십시오.

SSL 을 위해 Hydra 를 -S 옵션으로 실행

이 단계에서는 이전 단계에서 설정한 HTTPS 서버에 대해 Hydra 를 사용하여 무차별 대입 공격을 수행합니다. -S 옵션은 대상 서버에 연결할 때 Hydra 가 SSL/TLS를 사용하도록 지시합니다.

먼저, 간단한 사용자 이름과 비밀번호 목록을 만듭니다. ~/project 디렉토리에 다음 내용으로 users.txt라는 파일을 만듭니다.

test

다음으로, ~/project 디렉토리에 다음 내용으로 passwords.txt라는 파일을 만듭니다.

password
test
123456

echo를 사용하여 이러한 파일을 생성하고 편집할 수 있습니다.

echo "test" > ~/project/users.txt
echo "password" > ~/project/passwords.txt
echo "test" >> ~/project/users.txt
echo "123456" >> ~/project/passwords.txt

이제 -S 옵션을 사용하여 Hydra 를 실행하여 HTTPS 서버를 대상으로 지정할 수 있습니다. 새 터미널 창을 열고 (다른 창에서 HTTPS 서버를 계속 실행 상태로 둡니다) ~/project 디렉토리로 이동합니다.

cd ~/project

다음 Hydra 명령을 실행합니다.

hydra -l test -P passwords.txt 127.0.0.1 https-get / -S -vV

이 명령을 자세히 살펴보겠습니다.

  • hydra: Hydra 명령줄 도구입니다.
  • -l test: 사용할 사용자 이름을 지정합니다. 이 경우 사용자 이름 test를 사용합니다.
  • -P passwords.txt: 비밀번호 목록 파일을 지정합니다. 생성한 passwords.txt 파일을 사용합니다.
  • 127.0.0.1: 대상 IP 주소입니다. 이는 로컬 머신을 나타내는 루프백 주소입니다.
  • https-get /: 공격할 서비스 (HTTPS) 와 요청할 경로 (/) 를 지정합니다. https-get은 SSL/TLS를 통해 HTTP GET 요청을 수행하는 모듈입니다.
  • -S: 대상 서버에 연결할 때 Hydra 가 SSL/TLS를 사용하도록 지시합니다. 이는 HTTPS 서비스를 공격하는 데 매우 중요합니다.
  • -vV: 자세한 모드를 활성화하여 로그인 시도 및 발견된 자격 증명을 표시합니다.

이제 Hydra 는 제공된 사용자 이름과 비밀번호 목록을 사용하여 HTTPS 서버에 대한 무차별 대입 공격을 시도합니다. passwords.txt 파일의 각 비밀번호를 사용자 이름 test에 대해 시도합니다.

다음과 유사한 출력이 표시되어야 합니다 (정확한 출력은 다를 수 있습니다).

Hydra v9.2 (c) 2021 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-04-02 14:10:55
[DATA] max 2 tasks per 1 server, overall 2 tasks, 2 login tries (l:1/p:2), ~1 try per task
[DATA] attacking http-gets://127.0.0.1:443/
[VERBOSE] Resolving addresses ... [VERBOSE] resolving done
[ATTEMPT] target 127.0.0.1 - login "test" - pass "password" - 1 of 2 [child 0] (0/0)
[ATTEMPT] target 127.0.0.1 - login "test" - pass "123456" - 2 of 2 [child 1] (0/0)
[443][http-get] host: 127.0.0.1   login: test   password: password
[STATUS] attack finished for 127.0.0.1 (waiting for children to complete tests)
[443][http-get] host: 127.0.0.1   login: test   password: 123456
1 of 1 target successfully completed, 2 valid passwords found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-04-02 14:10:56

hydra ssl attack

공격이 성공하면 Hydra 는 올바른 사용자 이름과 비밀번호를 표시합니다. 이 예에서 사용자 이름은 test이고 비밀번호는 password입니다.

-O 옵션으로 구형 SSL 테스트

이 단계에서는 Hydra 의 -O 옵션을 사용하여 이전 버전의 잠재적으로 취약한 SSL/TLS 프로토콜을 테스트하는 방법을 살펴봅니다. -O 옵션은 Hydra 가 POODLE 또는 BEAST 와 같은 다양한 공격에 취약할 수 있는 이전 SSL 버전을 사용하도록 강제합니다.

진행하기 전에, 이전 SSL/TLS 프로토콜을 사용하는 것은 보안 취약성으로 인해 일반적으로 권장되지 않는다는 점을 이해하는 것이 중요합니다. 이 단계는 Hydra 를 사용하여 이러한 구식 프로토콜을 여전히 지원하는 시스템을 식별하는 방법을 보여주기 위한 교육적인 목적으로 사용됩니다.

-O 옵션을 사용하려면 이전 Hydra 명령에 추가하기만 하면 됩니다. 1 단계의 HTTPS 서버가 여전히 실행 중인지 확인합니다. 새 터미널 창을 열고 (다른 창에서 HTTPS 서버를 계속 실행 상태로 둡니다) ~/project 디렉토리로 이동합니다.

cd ~/project

이제 다음 Hydra 명령을 실행합니다.

hydra -l test -P passwords.txt 127.0.0.1 https-get / -S -O -vV

이 명령과 2 단계의 명령 간의 유일한 차이점은 -O 옵션이 추가된 것입니다.

  • -O: Hydra 가 이전 SSL 버전을 사용하도록 강제합니다.

이제 Hydra 는 이전 SSL/TLS 프로토콜을 사용하여 HTTPS 서버에 대한 무차별 대입 공격을 시도합니다. 출력은 이전 단계와 유사하지만 이전 SSL 버전과 관련된 경고 또는 오류가 표시될 수 있습니다.

Hydra v9.2 (c) 2021 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-04-02 14:13:19
[DATA] max 2 tasks per 1 server, overall 2 tasks, 2 login tries (l:1/p:2), ~1 try per task
[DATA] attacking http-gets://127.0.0.1:443/
[VERBOSE] Resolving addresses ... [VERBOSE] resolving done
[ATTEMPT] target 127.0.0.1 - login "test" - pass "password" - 1 of 2 [child 0] (0/0)
[ATTEMPT] target 127.0.0.1 - login "test" - pass "123456" - 2 of 2 [child 1] (0/0)
[443][http-get] host: 127.0.0.1   login: test   password: password
[STATUS] attack finished for 127.0.0.1 (waiting for children to complete tests)
[443][http-get] host: 127.0.0.1   login: test   password: 123456
1 of 1 target successfully completed, 2 valid passwords found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-04-02 14:13:19

공격이 성공하면 Hydra 는 이전 단계와 마찬가지로 올바른 사용자 이름과 비밀번호를 표시합니다. 여기서 핵심은 -O 옵션을 통해 서버의 이전 SSL/TLS 프로토콜과의 호환성을 테스트할 수 있었다는 것입니다.

서버가 이전 프로토콜을 지원하지 않는 경우 연결을 거부할 수 있습니다. 이 경우 Hydra 가 비밀번호를 찾지 못할 수 있습니다. 그러나 이 단계의 목표는 성공적인 로그인을 보장하는 것이 아니라 -O 옵션의 사용법을 시연하는 것입니다.

SSL 공격 성공 확인

이 단계에서는 발견한 자격 증명을 사용하여 HTTPS 서버에 액세스하여 Hydra 공격의 성공을 확인합니다. 이는 Hydra 가 실제로 서버를 무차별 대입 공격하는 데 성공했음을 보여줍니다.

먼저, 1 단계의 HTTPS 서버가 여전히 실행 중인지 확인합니다.

curl 명령을 사용하여 서버에 액세스하고 올바른 사용자 이름과 비밀번호로 인증할 수 있는지 확인합니다.

새 터미널 창을 열고 (다른 창에서 HTTPS 서버를 계속 실행 상태로 둡니다) ~/project 디렉토리로 이동합니다.

cd ~/project

이제 다음 curl 명령을 실행합니다.

curl -k -u test:password https://127.0.0.1

이 명령을 자세히 살펴보겠습니다.

  • curl: URL 을 사용하여 데이터를 전송하기 위한 명령줄 도구입니다.
  • -k: curl이 보안되지 않은 것으로 간주되는 서버 연결에 대해서도 계속 진행하고 작동하도록 허용합니다. 자체 서명된 인증서를 사용하고 있으므로 curl은 일반적으로 연결을 거부합니다.
  • -u test:password: 인증에 사용할 사용자 이름과 비밀번호를 지정합니다. 이전 단계에서 발견한 자격 증명 test:password를 사용합니다.
  • https://127.0.0.1: HTTPS 서버의 URL 입니다.

인증이 성공하면 curl은 서버의 루트 디렉토리 내용을 표시합니다. Python 의 http.server 모듈을 사용하고 있으므로 ~/project 디렉토리의 디렉토리 목록을 표시할 가능성이 높습니다.

다음과 유사한 출력이 표시되어야 합니다 (정확한 출력은 ~/project 디렉토리의 파일에 따라 다를 수 있습니다).

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Directory listing for /</title>
  </head>
  <body>
    <h1>Directory listing for /</h1>
    <hr />
    <ul>
      <li><a href="cert.pem">cert.pem</a></li>
      <li><a href="https_server.py">https_server.py</a></li>
      <li><a href="key.pem">key.pem</a></li>
      <li><a href="passwords.txt">passwords.txt</a></li>
      <li><a href="server.pem">server.pem</a></li>
      <li><a href="users.txt">users.txt</a></li>
    </ul>
    <hr />
  </body>
</html>

이는 Hydra 에서 발견한 자격 증명을 사용하여 HTTPS 서버에 성공적으로 인증할 수 있었음을 확인합니다. 이는 SSL/TLS 연결을 통해서도 Hydra 가 약한 비밀번호를 무차별 대입 공격하는 데 효과적임을 보여줍니다.

디렉토리 목록 대신 오류 메시지가 표시되면 HTTPS 서버가 여전히 실행 중인지, 그리고 올바른 사용자 이름과 비밀번호를 사용하고 있는지 다시 확인하십시오.

요약

이 랩에서는 Hydra 를 사용하여 SSL 지원 서비스를 공격하는 방법을 배웠습니다. 초기 단계에서는 Python 의 http.server 모듈을 사용하여 로컬 HTTPS 서버를 설정하고, openssl을 사용하여 자체 서명된 인증서와 키를 생성하여 보안 환경을 시뮬레이션했습니다.

그런 다음 SSL 연결을 활성화하는 -S 옵션과 이전 SSL 프로토콜을 테스트하는 -O 옵션을 사용하여 Hydra 의 기능을 탐색했습니다. 마지막으로, SSL 공격의 성공을 확인하여 Hydra 가 SSL/TLS를 통해 자격 증명을 무차별 대입 공격할 수 있는 능력을 입증했습니다.