정보보안/CVE

[CVE-2024-6387] SSH Vulnerability Scanner 취약점

록스타★ 2024. 7. 15. 14:21
반응형

SSH 취약점 스캐너

- SSH 취약점 스캐너는 Nmap을 사용하여 취약한 SSH 버전에 대한 도메인 목록을 스캔하는 Python 스크립트

- SSH 서비스에 대한 여러 포트를 확인하고 보안 취약점 있는 버전 식별

 

특징

- 한 줄에 하나, txt파일을 생성하여 도메인을 입력 후 입력한 도메인 검색

- SSH 서비스에 대한 모든 포트 확인 (종합적인 포트 스캐닝)

- 취약한 SSH 버전을식별하여 강조 표시

- 동시 스캐닝에 스레디을 사용하여 성능 향상

- DNS 확인 실패를 포함한 오류 처리

- 명확한 가시성을 위한 형식으로 결과 출력

 

요구사항

- 파이썬 3.x

- 파이썬 nmap 라이브러리 (python3-nmap)

- 파이썬 termcolor 라이브러리 (termcolor)

- Kail Linux 사용

 

설치

1. 저장소 복제

git clone https://github.com/thegenetic/CVE-2024-6387-exploit.git
cd CVE-2024-6387-exploit

 

 

2. 종속성 설치

pip install -r requirements.txt

 

 

사용법

- domains.txt 한 줄에 하나씩 도메인 입력하여 스캔할 도메인 포함 텍스트 파일 생성

그림(1) CVE-2024-6387 domains.txt 생성
그림(2) 스캔할 IP 및 도메인 설정

 

옵션

-Pn : 모든 호스트를 온라인 상태로 처리 (호스트 검색 건너뜀)

-sV : 서비스/버전 정보를 확인하기 위해 열려 있는 포트 조사

-p- : 65535개의 모든 포트 스캔

-- script ssh2-enum-algos, ssh-auth-methods, ssh-hostkey, ssh-run, sshv1 : 더자세한 정보를 보려면 ssh 특정 스크립트 사용

 

 

Python 코드

- VS 실행

그림(3) VS로 Code확인

 

그림(4) Python 코드 확인 (Port 및 옵션 설정)

 

전체코드

import sys
import socket
import subprocess
from threading import Thread, Lock
from queue import Queue
from termcolor import colored

# Global variables
lock = Lock()
results = {}

# Function to perform Nmap scanning for SSH service on a domain
def scan_domain(domain, queue):
    try:
        ip_address = socket.gethostbyname(domain)
        print(f"Scanning {domain} ({ip_address})...")

        # Use Nmap to scan SSH service on multiple ports
        ports = "22,222"  # Example ports, you can adjust as needed
        nmap_command = f"nmap -Pn -sV -p {ports} --script ssh2-enum-algos,ssh-auth-methods,ssh-hostkey,ssh-run,sshv1 {ip_address}"

        try:
            output = subprocess.check_output(nmap_command, shell=True, stderr=subprocess.STDOUT)
            process_nmap_output(domain, output.decode())
        except subprocess.CalledProcessError as e:
            print(f"Error scanning {domain}: {e.output.decode()}")
            results[domain] = f"Nmap Error: {e.output.decode()}"

    except socket.gaierror as e:
        print(f"Error: Could not resolve domain {domain}: {str(e)}")
        results[domain] = f"DNS resolution error: {str(e)}"

    queue.task_done()

# Function to process Nmap output and update results
def process_nmap_output(domain, output):
    vulnerable_versions = [
        'SSH-2.0-OpenSSH_8.5p1',
        'SSH-2.0-OpenSSH_8.6p1',
        'SSH-2.0-OpenSSH_8.7p1',
        'SSH-2.0-OpenSSH_8.8p1',
        'SSH-2.0-OpenSSH_8.9p1',
        'SSH-2.0-OpenSSH_9.0p1',
        'SSH-2.0-OpenSSH_9.1p1',
        'SSH-2.0-OpenSSH_9.2p1',
        'SSH-2.0-OpenSSH_9.3p1',
        'SSH-2.0-OpenSSH_9.4p1',
        'SSH-2.0-OpenSSH_9.5p1',
        'SSH-2.0-OpenSSH_9.6p1',
        'SSH-2.0-OpenSSH_9.7p1'
    ]

    if "Nmap scan report" in output:
        lines = output.splitlines()
        for line in lines:
            if "SSH" in line and "open" in line:
                parts = line.split()
                port = parts[0]
                version = parts[-1]
                if any(vuln_version in version for vuln_version in vulnerable_versions):
                    result = colored(version, 'red')
                else:
                    result = colored(version, 'yellow')
                lock.acquire()
                if domain not in results:
                    results[domain] = {}
                results[domain][port] = result
                lock.release()

# Function to scan domains from input file using threading
def scan_domains(input_file):
    queue = Queue()

    with open(input_file, 'r') as f:
        domains = f.read().strip().splitlines()

    # Start threads for scanning domains
    for domain in domains:
        queue.put(domain)
        t = Thread(target=scan_domain, args=(domain, queue))
        t.daemon = True
        t.start()

    # Wait for all threads to complete
    queue.join()

    # Print scan results
    print("\nScan Results:\n")
    for domain, data in results.items():
        print(f"{domain}:")
        if isinstance(data, str):
            print(data)
        else:
            for port, version in data.items():
                print(f"{port}: {version}")
            if not data:
                print("No SSH service detected on open ports")
        print()

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python ssh_vuln_scanner.py <input_file>")
        sys.exit(1)

    input_file = sys.argv[1]
    scan_domains(input_file)

 

 

 

 

그림(5) ssh 식별

 

대상자 tcpdump를 통한 패킷 분석

그림(6) tcpdump 패킷 분석

 

 

 

결론

요즘 가장 핫한 CVE라 ssh2024-6387이라고 생각이 든다. 패킷 분석을 할 때 마다 ssh관련 트래픽이 폭증하는 걸 목격하기도하며, 실제로 가상머신을 활용하여 exploit도 해보고 패킷을 뜯어보니 공격 코드들이 잘 만들어져있고 쉬워서 누구나 손 쉽게 사용 가능할 것 같다. 그래서 Nmap을 이용하여 SSH를 식별하는 것을 포스팅 해보았다. CVE 2024-6387은 위험도도 높기도 하며, 많은 사용자들이 사용중이다. 이 다음 포스팅은 CVE-6387 하도록 노력해봐야겠다.

 

 

 

참조

https://github.com/thegenetic/CVE-2024-6387-exploit

 

GitHub - thegenetic/CVE-2024-6387-exploit: CVE-2024-6387 exploit

CVE-2024-6387 exploit. Contribute to thegenetic/CVE-2024-6387-exploit development by creating an account on GitHub.

github.com

 

반응형