Hydra 공격 결과 저장

HydraBeginner
지금 연습하기

소개

이 실습에서는 Hydra 공격 결과를 저장하는 방법을 배웁니다. Hydra 는 강력한 패스워드 크래킹 도구로, 가상 HTTP 로그인 양식의 보안을 테스트하는 데 사용됩니다. 사용자 이름과 비밀번호 목록을 활용하여 대상 웹 서버에 대한 기본 HTTP 공격을 실행하는 것으로 시작합니다.

이 실습에서는 -o 옵션을 사용하여 공격 결과를 저장하고 -b 옵션으로 JSON 형식으로 출력하는 방법을 안내합니다. 마지막으로, 텍스트 출력과 JSON 출력을 비교하여 Hydra 가 결과를 제시하는 다양한 방법을 이해합니다.

대상 서비스 및 사용자/비밀번호 목록 설정

이 단계에서는 가상 HTTP 로그인 서비스를 설정하고 Hydra 가 사용할 필요한 사용자 이름 및 비밀번호 목록을 만듭니다. 이를 통해 Hydra 의 출력 저장 연습을 위한 제어된 환경을 제공합니다.

먼저 프로젝트 디렉토리로 이동합니다.

cd ~/project

다음으로, HTTP 로그인 서비스를 시뮬레이션하는 간단한 Python 스크립트를 작성합니다. 이 스크립트는 80 번 포트에서 수신하고 /login.php로 보내진 POST 요청에 응답합니다. admin을 올바른 사용자 이름, password를 올바른 비밀번호로 간주합니다.

nano를 사용하여 login.py 파일을 만듭니다.

nano login.py

다음 Python 코드를 nano 편집기에 붙여넣습니다.

from http.server import BaseHTTPRequestHandler, HTTPServer
import urllib.parse
import os

class LoginHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        if self.path == '/login.php':
            content_length = int(self.headers['Content-Length'])
            post_data = self.rfile.read(content_length).decode('utf-8')
            parsed_data = urllib.parse.parse_qs(post_data)

            username = parsed_data.get('username', [''])[0]
            password = parsed_data.get('password', [''])[0]

            if username == 'admin' and password == 'password':
                self.send_response(200)
                self.send_header('Content-type', 'text/html')
                self.end_headers()
                self.wfile.write(b"Login successful!")
            else:
                self.send_response(401)
                self.send_header('Content-type', 'text/html')
                self.end_headers()
                self.wfile.write(b"Invalid username or password")
        else:
            self.send_response(404)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            self.wfile.write(b"Not found")

def run(server_class=HTTPServer, handler_class=LoginHandler, port=80):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Starting httpd server on port {port}")
    httpd.serve_forever()

if __name__ == "__main__":
    run()

Ctrl+X, Y, Enter를 눌러 파일을 저장합니다.

이제 Python HTTP 서버를 백그라운드에서 실행합니다. 이는 Hydra 를 위한 대상 서비스를 시뮬레이션합니다.

nohup python3 login.py > /dev/null 2>&1 &

nohup 명령은 터미널을 닫아도 프로세스가 계속 실행되도록 하고, > /dev/null 2>&1 &는 모든 출력을 /dev/null로 리디렉션하고 백그라운드에서 프로세스를 실행합니다.

다음으로, Hydra 가 공격에 사용할 사용자 이름 및 비밀번호 목록을 만듭니다.

~/project 디렉토리에 users.txt 파일을 만듭니다.

nano users.txt

다음 사용자 이름을 파일에 추가합니다.

admin
user
test

Ctrl+X, Y, Enter를 눌러 파일을 저장합니다.

마지막으로, ~/project 디렉토리에 passwords.txt 파일을 만듭니다.

nano passwords.txt

다음 비밀번호를 파일에 추가합니다.

password
123456
test

Ctrl+X, Y, Enter를 눌러 파일을 저장합니다.

이제 대상 HTTP 서비스를 성공적으로 설정하고 사용자 및 비밀번호 목록을 준비했습니다.

기본 HTTP 공격 실행

이 단계에서는 설정한 가상 로그인 서비스를 대상으로 Hydra 를 사용하여 기본 HTTP 공격을 수행합니다. 이를 통해 Hydra 가 출력을 파일로 저장하지 않고 자격 증명을 해독하려고 시도하는 방식을 보여줍니다.

Hydra 는 패스워드 해독을 위한 강력한 도구이며 HTTP 를 포함한 다양한 서비스의 보안을 테스트하는 데 사용될 수 있습니다. 이 시나리오에서는 간단한 HTTP 로그인 양식을 대상으로 합니다.

http-post-form 모듈을 사용하여 HTTP POST 메서드를 사용하여 제출하는 웹 양식을 공격하도록 설계되었습니다. 대상 서비스는 127.0.0.180번 포트에서 실행되고, 로그인 양식은 /login.php에 있습니다.

터미널에서 다음 Hydra 명령을 실행합니다.

hydra -L ~/project/users.txt -P ~/project/passwords.txt 127.0.0.1 http-post-form "/login.php:username=^USER^&password=^PASS^:Invalid username or password"

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

  • hydra: Hydra 도구를 호출하는 명령입니다.
  • -L ~/project/users.txt: 사용자 이름 목록 파일 경로를 지정합니다. Hydra 는 이 파일의 각 사용자 이름을 반복합니다.
  • -P ~/project/passwords.txt: 비밀번호 목록 파일 경로를 지정합니다. Hydra 는 이 파일의 각 비밀번호를 모든 사용자 이름에 대해 시도합니다.
  • 127.0.0.1: 가상 HTTP 서버의 대상 IP 주소입니다.
  • http-post-form: Hydra 가 HTTP POST 양식을 공격하는 데 사용하는 모듈입니다.
  • "/login.php:username=^USER^&password=^PASS^:Invalid username or password": Hydra 가 양식과 상호 작용하는 방식을 정의하는 중요한 부분입니다.
    • /login.php: 대상 서버의 로그인 페이지 경로입니다.
    • username=^USER^&password=^PASS^: POST 요청에 전송되는 매개변수를 정의합니다. ^USER^^PASS^는 Hydra 가 사용자 이름 및 비밀번호 목록에서 값으로 바꾸는 자리 표시자입니다.
    • Invalid username or password: Hydra 가 서버 응답에서 로그인 시도가 실패했는지 확인하기 위해 찾는 오류 메시지입니다. 이 문자열이 발견되지 않으면 Hydra 는 로그인 시도를 성공으로 간주합니다.

명령을 실행한 후 Hydra 는 터미널에 직접 진행 상황과 성공적인 로그인 시도를 표시합니다.

성공 시 예시 출력:

Hydra vX.X (c) XXXX by van Hauser/THC - Use freely but only for legal purposes.

Hydra is starting...

[DATA] X task, X servers, X login tries (l:X/p:X), ~X try per server
[DATA] attacking service http-post-form on port 80
[ATTACK] attacking 127.0.0.1:80/login.php
[80][http-post-form] host: 127.0.0.1   login: admin   password: password

이 출력은 Hydra 가 admin 사용자 이름과 password 비밀번호 조합을 성공적으로 찾았음을 나타냅니다. 성공적인 로그인이 없으면 Hydra 는 성공적인 로그인 자격 증명을 표시하지 않고 완료됩니다.

-o 옵션으로 결과 저장

이 단계에서는 -o 옵션을 사용하여 Hydra 공격 결과를 파일에 저장하는 방법을 배웁니다. 이는 나중에 결과를 분석하거나 보고서 작성에 유용하며, 뚫린 자격 증명을 영구적인 파일에 저장합니다.

-o 옵션을 사용하면 Hydra 가 뚫린 자격 증명을 저장할 출력 파일을 지정할 수 있습니다. Hydra 가 유효한 사용자 이름과 비밀번호 조합을 찾으면 간단하고 사람이 읽을 수 있는 형식으로 지정된 파일에 기록됩니다.

이전 시나리오를 계속 진행합니다. 127.0.0.180번 포트에서 실행되고 /login.php에 로그인 양식이 있는 가상 웹 서버와 앞서 만든 users.txtpasswords.txt 파일을 사용합니다.

~/project 디렉토리에 hydra.log라는 파일로 결과를 저장하려면 다음 명령을 실행합니다.

hydra -L ~/project/users.txt -P ~/project/passwords.txt -o ~/project/hydra.log 127.0.0.1 http-post-form "/login.php:username=^USER^&password=^PASS^:Invalid username or password"

이전 명령과의 유일한 차이점은 -o ~/project/hydra.log 옵션을 추가한 것입니다. 이는 Hydra 가 결과를 터미널에 표시하는 대신 hydra.log 파일에 저장하도록 지시합니다.

명령을 실행하면 Hydra 는 각 사용자 이름과 비밀번호 조합을 사용하여 로그인을 시도합니다. 성공적인 로그인이 발견되면 사용자 이름과 비밀번호가 hydra.log 파일에 기록됩니다.

hydra.log 파일의 내용을 보려면 cat 명령을 사용합니다.

cat ~/project/hydra.log

성공 시 예시 출력:

Hydra 가 admin:password 조합을 찾으면 hydra.log 파일에는 다음과 유사한 줄이 포함됩니다.

127.0.0.1 http-post-form: admin:password

성공적인 로그인이 없으면 hydra.log 파일은 비어 있습니다.

-o 옵션은 이미 파일이 존재하는 경우 출력 파일을 덮어씁니다. 기존 파일에 결과를 추가하려면 -O (대문자 O) 옵션을 사용해야 합니다. 그러나 이 실습에서는 -o 옵션이 충분합니다.

-b 옵션으로 JSON 출력

이 단계에서는 -b 옵션을 사용하여 Hydra 공격 결과를 JSON 형식으로 출력하는 방법을 살펴봅니다. JSON(JavaScript Object Notation) 은 사람이 읽고 쓰기 쉽고, 기계가 구문 분석 및 생성하기 쉬운 경량 데이터 교환 형식입니다. 이 형식은 Hydra 의 출력을 다른 도구나 스크립트에 통합할 때와 같이 결과를 프로그래밍 방식으로 처리해야 할 때 특히 유용합니다.

-b 옵션은 -o 옵션과 함께 사용하여 지정된 형식으로 파일 출력을 저장하도록 Hydra 에 지시합니다. -b 옵션에는 text(기본값), json, 또는 jsonv1과 같은 형식 매개변수가 필요합니다.

이전 시나리오를 계속 진행합니다. 127.0.0.180번 포트에서 실행되고 /login.php에 로그인 양식이 있는 가상 웹 서버와 users.txtpasswords.txt 파일을 사용합니다.

~/project 디렉토리에 hydra.json이라는 파일로 JSON 형식의 결과를 저장하려면 다음 명령을 실행합니다.

hydra -L ~/project/users.txt -P ~/project/passwords.txt -o ~/project/hydra.json -b json 127.0.0.1 http-post-form "/login.php:username=^USER^&password=^PASS^:Invalid username or password"

이 명령에서 -b json 옵션과 함께 -o ~/project/hydra.json 옵션을 추가했습니다. 이는 Hydra 가 hydra.json 파일에 JSON 형식으로 출력을 저장하도록 지시합니다.

명령을 실행하면 Hydra 는 각 사용자 이름과 비밀번호 조합을 사용하여 로그인을 시도합니다. 성공적인 로그인이 발견되면 사용자 이름과 비밀번호가 hydra.json 파일에 JSON 형식으로 기록됩니다.

hydra.json 파일의 내용을 보려면 cat 명령을 사용합니다.

cat ~/project/hydra.json

성공 시 예시 출력:

Hydra 가 admin:password 조합을 찾으면 hydra.json 파일에는 다음과 유사한 JSON 객체가 포함됩니다.

{
  "generator": {
    "software": "Hydra",
    "version": "v9.2",
    "built": "2025-05-30 08:10:07",
    "server": "127.0.0.1",
    "service": "http-post-form",
    "jsonoutputversion": "1.00",
    "commandline": "hydra -L users.txt -P passwords.txt -o hydra.json -b json 127.0.0.1 http-post-form /login.php:username=^USER^&password=^PASS^:Invalid username or password"
  },
  "results": [
    {
      "port": 80,
      "service": "http-post-form",
      "host": "127.0.0.1",
      "login": "admin",
      "password": "password"
    }
  ],
  "success": true,
  "errormessages": [],
  "quantityfound": 1
}

성공적인 로그인이 없으면 hydra.json 파일은 비어 있는 JSON 배열을 포함합니다.

[]

이 JSON 형식을 사용하면 Python 이나 JavaScript 와 같은 스크립팅 언어를 사용하여 결과를 쉽게 구문 분석하여 추가 분석이나 자동화를 수행할 수 있습니다.

요약

이 실습에서는 강력한 패스워드 크래킹 도구인 Hydra 를 사용하여 기본적인 HTTP 공격을 수행하는 방법을 배웠습니다. 가상 HTTP 로그인 서비스를 설정하고 사용자 이름과 비밀번호 목록을 생성했습니다. 그런 다음 Hydra 를 사용하여 127.0.0.1의 가상 HTTP 로그인 양식을 해독하려고 시도했습니다.

-o 옵션을 사용하여 Hydra 의 출력을 파일에 저장하는 방법을 탐색하여 사람이 읽을 수 있는 hydra.log 파일을 생성했습니다. 또한 -b 옵션을 사용하여 JSON 형식으로 결과를 출력하는 방법을 배워 기계가 읽을 수 있는 hydra.json 파일을 생성했습니다. 이 실습은 Hydra 가 발견 사항을 제시하는 유연성을 보여주었으며, 공격 결과를 빠르게 검토하고 프로그래밍 방식으로 처리할 수 있도록 했습니다.