콜론으로 구분된 자격 증명으로 공격하기

HydraBeginner
지금 연습하기

소개

이 실습에서는 Hydra 를 사용하여 자격 증명 기반 공격을 수행하는 방법을 배웁니다. 이 실습은 사용자 이름/비밀번호 조합이 포함된 콜론으로 구분된 자격 증명 파일을 활용하여 대상 서비스의 로그인 자격 증명을 해킹하는 데 중점을 둡니다.

먼저 nano와 같은 텍스트 편집기를 사용하여 credentials.txt 파일을 생성하고 사용자 이름:비밀번호 쌍을 입력합니다. 그런 다음 -C 옵션을 사용하여 Hydra 에 이 파일을 로드하여 Hydra 가 대상에 대해 여러 로그인 조합을 효율적으로 시도하도록 합니다. 마지막으로 공격에 사용된 자격 증명과 출력이 일치하는지 확인합니다.

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

로그인:비밀번호 자격 증명 파일 생성

이 단계에서는 사용자 이름과 비밀번호를 각 줄에 하나씩 콜론 (:) 으로 구분하여 포함하는 파일을 생성합니다. 이 파일은 나중에 Hydra 를 사용하여 대상 서비스의 로그인 자격 증명을 해킹하려고 시도하는 데 사용됩니다.

먼저 자격 증명 파일의 필요한 형식을 이해해 보겠습니다. 각 줄은 사용자 이름, 콜론 (:), 그리고 해당 비밀번호를 포함해야 합니다. 예를 들어:

username1:password1
username2:password2

이제 파일을 생성해 보겠습니다. nano 텍스트 편집기를 사용할 것입니다. 간단하고 사용하기 쉽습니다. 터미널을 열고 아직 해당 디렉터리에 있지 않다면 ~/project 디렉터리로 이동합니다.

cd ~/project
  1. ~/project 디렉터리에서 credentials.txt라는 새 파일을 nano를 사용하여 엽니다.

    nano credentials.txt
  2. nano 편집기에서 다음 사용자 이름/비밀번호 조합을 추가합니다. 이러한 자격 증명은 Hydra 가 사용하려고 시도할 자격 증명입니다.

    admin:password
    user1:123456
    test:test
    root:toor
  3. 파일을 저장하려면 Ctrl+O (쓰기) 를 누릅니다. nano는 파일 이름을 묻습니다. 기본 파일 이름 (credentials.txt) 을 그대로 사용하려면 Enter를 누릅니다.

  4. nano를 종료하려면 Ctrl+X를 누릅니다.

이제 파일이 생성되었고 올바른 내용을 포함했는지 확인해 보겠습니다. cat 명령을 사용하여 credentials.txt 파일의 내용을 표시합니다.

cat credentials.txt

이전에 입력했던 사용자 이름/비밀번호 조합이 표시되어야 합니다.

admin:password
user1:123456
test:test
root:toor

이제 Hydra 와 함께 사용할 수 있는 자격 증명 파일을 성공적으로 생성했습니다. 이 파일에는 Hydra 가 대상 서비스에 대해 시도할 잠재적인 사용자 이름과 비밀번호 목록이 포함되어 있습니다.

인증 기능을 갖춘 기본 HTTP 서버 설정

이 단계에서는 기본 인증이 필요한 간단한 HTTP 서버를 설정합니다. 이 서버는 다음 단계의 Hydra 공격 대상이 될 것입니다. Python 스크립트를 사용할 것입니다.

먼저 ~/project 디렉터리에 있는지 확인합니다.

cd ~/project

이제 nano를 사용하여 새로운 Python 파일 webserver.py를 만듭니다.

nano webserver.py

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

import http.server
import socketserver
import base64

PORT = 8000

class AuthHandler(http.server.SimpleHTTPRequestHandler):
    def do_HEAD(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_AUTHHEAD(self):
        self.send_response(401)
        self.send_header('WWW-Authenticate', 'Basic realm="My Realm"')
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        auth = self.headers.get('Authorization')
        if auth == None:
            self.do_AUTHHEAD()
            self.wfile.write(b"Authentication Required")
        elif auth == 'Basic YWRtaW46cGFzc3dvcmQ=': ## admin:password base64 인코딩
            http.server.SimpleHTTPRequestHandler.do_GET(self)
        else:
            self.do_AUTHHEAD()
            self.wfile.write(b"Authentication Failed")

Handler = AuthHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

이 스크립트는 포트 8000 에서 기본 HTTP 서버를 생성합니다. 기본 인증이 필요합니다. 올바른 사용자 이름은 admin이고 비밀번호는 password입니다. base64 인코딩된 문자열 YWRtaW46cGFzc3dvcmQ=admin:password를 나타냅니다.

파일을 저장하고 (Ctrl+O, 그런 다음 Enter) nano를 종료합니다 (Ctrl+X).

이제 Python 스크립트를 실행하여 HTTP 서버를 시작합니다. 터미널을 계속 사용할 수 있도록 백그라운드에서 실행합니다.

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

nohup 명령은 터미널을 닫더라도 프로세스가 계속 실행되도록 합니다. > /dev/null 2>&1은 표준 출력과 표준 오류를 /dev/null로 리디렉션하여 서버의 출력이 터미널을 가리는 것을 방지합니다. 마지막 &는 명령을 백그라운드에서 실행합니다.

서버가 실행 중인지 확인하려면 포트 8000 에서 프로세스가 수신 대기 중인지 확인할 수 있습니다.

ss -ltn | grep ':8000'

포트 8000 에서 프로세스가 수신 대기 중임을 나타내는 다음과 유사한 출력이 표시되어야 합니다.

LISTEN 0      4096   0.0.0.0:8000      0.0.0.0:*

다음 단계를 위해 이 서버를 실행 상태로 유지하십시오.

Hydra 를 이용한 인증 파일로 HTTP 공격

이 단계에서는 이전 단계에서 설정한 HTTP 서비스를 Hydra 를 사용하여 공격합니다. -C 옵션을 사용하여 1 단계에서 만든 자격 증명 파일을 로드하여 Hydra 가 여러 사용자 이름/비밀번호 조합을 효율적으로 시도할 수 있도록 합니다.

~/project 디렉터리에 있는지 확인합니다.

cd ~/project

이제 127.0.0.1의 포트 8000 에서 실행 중인 HTTP 서버를 공격하기 위해 다음 Hydra 명령을 실행합니다.

hydra -C credentials.txt 127.0.0.1 http-get / -s 8000 -vV

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

  • hydra: Hydra 도구를 실행하는 명령입니다.
  • -C credentials.txt: 생성한 자격 증명 파일의 경로를 지정합니다. Hydra 는 이 파일에서 사용자 이름/비밀번호 조합을 읽습니다.
  • 127.0.0.1: 대상 IP 주소입니다. 루프백 주소로 로컬 머신을 가리킵니다.
  • http-get /: 공격할 서비스 (HTTP) 와 요청할 경로 (/) 를 지정합니다. http-get은 HTTP GET 요청을 수행하는 모듈입니다.
  • -s 8000: 대상 서비스의 포트 번호를 지정합니다. HTTP 서버는 포트 8000 에서 실행 중입니다.
  • -vV: 자세한 모드를 활성화하여 로그인 시도 및 발견된 자격 증명을 표시합니다.

이제 Hydra 는 credentials.txt 파일의 사용자 이름/비밀번호 조합을 사용하여 HTTP 서버를 무차별 대입 공격하려고 시도합니다. 각 조합을 대상 서비스에 대해 시도합니다.

Hydra 가 다른 사용자 이름/비밀번호 조합을 시도하고 있다는 출력이 표시됩니다. Hydra 가 올바른 자격 증명 (admin:password) 을 성공적으로 찾으면 출력에 표시됩니다.

성공적인 공격 예시 출력:

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 ...
[DATA] max 16 tasks per 1 server, overall 16 tasks, 4 login tries (l:4/p:1), ~1 try per task
[DATA] attacking http-gets://127.0.0.1:8000/
[VERBOSE] Resolving addresses ... [VERBOSE] resolving done
[ATTEMPT] target 127.0.0.1 - login "admin" - pass "password" - 1 of 4 [child 0] (0/0)
[ATTEMPT] target 127.0.0.1 - login "user1" - pass "123456" - 2 of 4 [child 1] (0/0)
[ATTEMPT] target 127.0.0.1 - login "test" - pass "test" - 3 of 4 [child 2] (0/0)
[ATTEMPT] target 127.0.0.1 - login "root" - pass "toor" - 4 of 4 [child 3] (0/0)
[8000][http-get] host: 127.0.0.1   login: admin   password: password
[STATUS] attack finished for 127.0.0.1 (waiting for children to complete tests)
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at ...

공격이 성공하면 Hydra 는 올바른 사용자 이름과 비밀번호를 출력합니다.

찾은 인증 정보 확인

이 단계에서는 이전 단계의 공격에서 Hydra 가 발견한 자격 증명이 credentials.txt 파일과 webserver.py 스크립트의 예상 자격 증명과 일치하는지 확인합니다. 이는 Hydra 가 유효한 로그인 조합을 올바르게 식별했는지 확인하는 작업입니다.

이전 단계에서 Hydra 의 출력은 다음과 같은 줄 (또는 유사한 줄) 을 보여주어야 합니다.

[8000][http-get] host: 127.0.0.1   login: admin   password: password

이 줄은 Hydra 가 대상 서비스에 대한 사용자 이름 admin과 비밀번호 password를 성공적으로 찾았음을 나타냅니다.

이제 이러한 자격 증명이 실제로 생성한 파일에 있는지 확인해 보겠습니다.

  1. credentials.txt 파일의 자격 증명 확인:

    cat 명령을 사용하여 credentials.txt 파일의 내용을 표시합니다.

    cat credentials.txt

    admin:password 라인이 파일 안에 있는지 확인합니다. 이는 Hydra 가 시도한 조합 중 하나입니다.

  2. webserver.py 파일의 자격 증명 확인:

    cat 명령을 사용하여 webserver.py 파일의 내용을 표시합니다.

    cat webserver.py

    base64 인코딩된 인증 헤더를 확인하는 라인을 찾습니다. 다음과 유사한 라인을 찾을 수 있습니다.

    elif auth == 'Basic YWRtaW46cGFzc3dvcmQ=': ## admin:password base64 인코딩

    YWRtaW46cGFzc3dvcmQ= 문자열은 admin:password의 base64 인코딩입니다. 이는 서버가 admin을 사용자 이름으로, password를 비밀번호로 받도록 구성되어 있음을 확인합니다.

Hydra 가 발견한 자격 증명이 서버 스크립트에 구성된 자격 증명과 자격 증명 파일 내에 있는 자격 증명과 일치하는지 확인하여 -C 옵션을 사용한 무차별 대입 공격의 성공을 확인합니다.

마지막으로 백그라운드 HTTP 서버 프로세스를 중지해 보겠습니다. ss 명령을 다시 사용하여 프로세스 ID(PID) 를 찾을 수 있습니다.

ss -ltn | grep ':8000'

출력에는 두 번째 열에 PID 가 표시됩니다. 예를 들어:

LISTEN 0      4096   0.0.0.0:8000      0.0.0.0:*    users:(("python3",pid=12345,fd=3))

이 예에서 PID 는 12345입니다. kill 명령을 사용하여 프로세스를 중지합니다. [PID]를 실제로 찾은 PID 로 바꿉니다.

kill [PID]

예를 들어 PID 가 12345 인 경우:

kill 12345

ss -ltn | grep ':8000'을 다시 실행하여 서버가 중지되었는지 확인할 수 있습니다. 출력이 없어야 합니다.

요약

이 실습에서는 credentials.txt라는 자격 증명 파일을 만들어 사용자 이름과 비밀번호 조합을 콜론으로 구분하고 각 조합을 새 줄에 배치하는 방법을 배웠습니다. 이 파일은 ~/project 디렉터리에 저장되며 Hydra 와 함께 사용할 준비가 되어 있습니다.

또한, 공격 대상이 된 Python 스크립트를 사용하여 인증 기능을 갖춘 기본 HTTP 서버를 설정하는 방법을 배웠습니다.

마지막으로, Hydra 를 -C 옵션과 함께 사용하여 자격 증명 파일을 로드하고 HTTP 서버에 대한 무차별 대입 공격을 수행하여 여러 로그인 조합을 효율적으로 테스트하는 방법을 보여주었습니다. 발견된 자격 증명이 예상 값과 일치하는지 확인하여 공격의 성공을 확인했습니다.