네트워크 보안을 위한 Nmap SYN 스캔 수행

NmapBeginner
지금 연습하기

소개

이 실습에서는 네트워크 보안에서 은밀한 포트 정찰을 위한 핵심 기술인 Nmap SYN 스캔에 대해 배웁니다. SYN 스캔은 TCP 연결을 완전히 맺지 않고도 대상 시스템의 열린 포트를 효율적으로 식별하므로 기존 방식보다 탐지하기 어렵습니다. 이는 보안 전문가가 네트워크 취약점을 평가하고 방어 체계를 강화하는 데 매우 중요합니다.

이 실습을 마치면 SYN 스캔을 수행하는 방법, 결과를 해석하는 방법, 그리고 네트워크 보안 평가에서 SYN 스캔이 갖는 중요성을 이해하게 될 것입니다.

스캔을 위한 대상 서비스 생성

이 단계에서는 Nmap SYN 스캔을 연습할 수 있는 통제된 환경을 구축합니다. 네트워크나 시스템을 스캔하기 전에, 윤리적인 스캔에는 적절한 승인이 필요하다는 점을 이해하는 것이 중요합니다. 법적 문제를 방지하기 위해 안전하게 스캔할 수 있는 자체 서비스를 설정하겠습니다.

  1. 먼저 터미널을 엽니다. 터미널은 명령어를 입력하여 컴퓨터 운영 체제와 상호 작용할 수 있는 텍스트 기반 인터페이스입니다. 터미널을 열었으면 프로젝트 디렉토리로 이동합니다. 프로젝트 디렉토리는 이 실험과 관련된 모든 파일이 저장되는 곳입니다. 다음 명령어를 사용하여 현재 디렉토리를 프로젝트 디렉토리로 변경합니다.

    cd /home/labex/project
    
  2. 이제 널리 사용되는 프로그래밍 언어인 Python을 사용하여 간단한 HTTP 서버를 생성합니다. HTTP 서버는 웹 브라우저와 같은 클라이언트에 웹 페이지를 제공할 수 있는 소프트웨어입니다. Python에는 이러한 서버를 쉽게 설정할 수 있는 내장 기능이 있습니다. 이 서버를 Nmap SYN 스캔의 대상으로 사용하겠습니다. 터미널에서 다음 명령어를 실행합니다.

    python -m http.server --bind 127.0.0.1 8080 &
    

    이 명령어는 포트 8080에서 간단한 웹 서버를 시작하고 IPv4 루프백 주소인 127.0.0.1에 바인딩합니다. 포트는 컴퓨터 네트워크의 통신 종단점입니다. 서로 다른 서비스는 통신을 위해 서로 다른 포트를 사용합니다. 명시적인 IPv4 주소를 사용하면 서버와 이후의 Nmap 스캔이 동일한 루프백 인터페이스상에서 유지됩니다. 명령어 끝의 &는 서버를 백그라운드에서 실행합니다. 즉, 서버는 계속 실행되며 동일한 터미널 창에서 다른 명령어를 계속 사용할 수 있습니다.

  3. 서버를 시작한 후에는 실제로 실행 중인지 확인해야 합니다. 시스템에서 열려 있는 네트워크 연결을 확인하여 이를 수행할 수 있습니다. ss 명령어는 열려 있는 네트워크 연결 정보를 포함한 소켓 통계를 표시할 수 있는 도구입니다. 이를 사용하여 서버가 포트 8080에서 수신 대기 중인지 확인하겠습니다. 다음 명령어를 실행합니다.

    ss -tulwn | grep 8080
    

    |는 파이프 연산자로, ss 명령어의 출력을 가져와 grep 명령어의 입력으로 사용합니다. grep 명령어는 ss 명령어의 출력에서 8080이라는 문자열을 검색합니다. 서버가 실행 중이라면 다음과 유사한 출력이 표시되어야 합니다.

    tcp   LISTEN 0      5          127.0.0.1:8080       0.0.0.0:*
    

    이 출력은 서버가 포트 8080에서 수신 대기 중임을 나타내며, 이는 서버가 성공적으로 실행되어 스캔 준비가 완료되었음을 의미합니다.

Nmap SYN 스캔 이해 및 수행

이제 대상 서비스가 실행 중이므로 SYN 스캔에 대해 자세히 알아볼 차례입니다. SYN 스캔은 네트워크 보안 테스트의 핵심 부분으로, 대상 시스템에서 열린 포트를 발견할 수 있게 해줍니다. 이 섹션에서는 SYN 스캔의 작동 원리를 배우고, 강력한 네트워크 스캔 도구인 Nmap을 사용하여 HTTP 서버에 대해 SYN 스캔을 수행합니다.

SYN 스캔이란 무엇인가?

실제 스캔을 시작하기 전에 SYN 스캔의 기본 메커니즘을 이해하는 것이 필수적입니다. 이를 위해 먼저 일반적인 TCP 연결이 어떻게 설정되는지 살펴보겠습니다.

일반적인 TCP 연결

일반적인 TCP 연결에서는 3-way 핸드셰이크가 발생합니다. 이는 클라이언트와 서버 간의 신뢰할 수 있는 연결을 설정하기 위한 기본 프로세스입니다.

  • 1단계: 클라이언트로부터의 SYN 패킷 클라이언트는 서버에 SYN(synchronize) 패킷을 보내 연결을 시작합니다. 이 패킷은 대화를 시작하려는 요청과 같으며, 서버에 통신 준비가 되었는지 묻는 것입니다.
  • 2단계: 서버로부터의 SYN-ACK 패킷 SYN 패킷을 받은 후 서버가 사용 가능하고 통신할 의사가 있다면, SYN-ACK(synchronize-acknowledge) 패킷으로 응답합니다. 이 패킷은 클라이언트의 요청을 승인하고 서버가 연결을 시작할 준비가 되었음을 나타냅니다.
  • 3단계: 클라이언트로부터의 ACK 패킷 마지막으로 클라이언트는 ACK(acknowledge) 패킷을 보내 3-way 핸드셰이크를 완료합니다. 이 단계 이후 TCP 연결이 완전히 설정되며 클라이언트와 서버 간에 데이터를 교환할 수 있습니다.

SYN 스캔 프로세스

반면 SYN 스캔은 다른 접근 방식을 취합니다.

  • 1단계: Nmap으로부터의 SYN 패킷 스캔 도구인 Nmap은 대상 포트로 초기 SYN 패킷을 보냅니다. 이는 일반적인 TCP 연결의 첫 번째 단계와 유사합니다.
  • 2단계: 대상으로부터의 SYN-ACK 응답 대상 포트가 열려 있으면 일반적인 TCP 연결과 마찬가지로 SYN-ACK 패킷으로 응답합니다.
  • 3단계: Nmap에 의한 연결 종료 핸드셰이크를 완료하기 위해 최종 ACK 패킷을 보내는 대신, Nmap은 연결을 종료합니다. 전체 연결이 설정되지 않기 때문에 스캔이 덜 탐지됩니다. 또한, 스캔 중인 각 포트에 대해 전체 3-way 핸드셰이크를 완료하는 전체 연결 스캔보다 빠릅니다.

SYN 스캔 수행

1단계: 프로젝트 디렉토리로 이동

먼저 올바른 프로젝트 디렉토리에 있는지 확인해야 합니다. 스캔 결과를 이 디렉토리 내의 파일에 저장할 것이기 때문에 중요합니다. 프로젝트 디렉토리로 이동하려면 터미널에서 다음 명령어를 실행합니다.

cd /home/labex/project

2단계: SYN 스캔 실행

이제 Nmap을 사용하여 SYN 스캔을 수행할 준비가 되었습니다. 터미널에서 다음 명령어를 실행합니다.

sudo nmap -sS 127.0.0.1 -p 8080 > /home/labex/project/nmap-syn-scan-results.txt

이 명령어의 각 부분이 무엇을 하는지 살펴보겠습니다.

  • sudo: 이 명령어는 후속 명령어를 높은 권한으로 실행하는 데 사용됩니다. SYN 스캔은 원시 네트워크 패킷을 보내야 하므로 루트 권한이 필요하며, 따라서 nmap 명령어를 실행하려면 sudo를 사용해야 합니다.
  • nmap: 우리가 사용하는 네트워크 스캔 도구입니다. Nmap은 네트워크 탐색 및 보안 감사에 널리 사용됩니다.
  • -sS: 이 옵션은 SYN 스캔을 수행하겠다는 것을 지정합니다.
  • 127.0.0.1: 우리 자신의 컴퓨터의 IPv4 루프백 주소입니다. 명시적인 IPv4 주소를 사용하면 스캔이 1단계에서 시작한 HTTP 서버와 일치하게 됩니다.
  • -p 8080: 이 옵션은 Nmap에게 포트 8080만 스캔하도록 지시합니다. 로컬 컴퓨터에서 이 특정 포트가 열려 있는지 확인하는 데 관심이 있습니다.
  • > /home/labex/project/nmap-syn-scan-results.txt: 명령어의 이 부분은 nmap 스캔의 출력을 프로젝트 디렉토리의 nmap-syn-scan-results.txt라는 파일로 리디렉션합니다. 이렇게 하면 나중에 결과를 검토할 수 있습니다.

3단계: 스캔 결과 보기

스캔이 완료되면 결과를 볼 수 있습니다. 터미널에서 다음 명령어를 실행합니다.

cat /home/labex/project/nmap-syn-scan-results.txt

다음과 유사한 출력이 표시되어야 합니다.

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-18 12:00 UTC
Nmap scan report for 127.0.0.1
Host is up (0.000097s latency).

PORT     STATE SERVICE
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

이 출력은 귀중한 정보를 제공합니다. 로컬 컴퓨터에서 포트 8080이 열려 있고 HTTP 서비스가 실행 중임을 확인해 줍니다. 이 정보는 추가적인 보안 분석이나 네트워크 문제 해결에 사용할 수 있습니다.

스캔 결과 분석 및 보안적 의미

SYN 스캔을 수행한 후에는 결과를 해석하는 방법과 그 보안적 의미를 이해하는 것이 중요합니다. 이 단계는 네트워크의 잠재적 위험을 식별하는 데 도움이 되므로 필수적입니다. 자세히 살펴보겠습니다.

스캔 결과 해석

  1. 먼저 스캔 결과를 자세히 살펴보겠습니다. cat 명령어를 사용하여 Nmap SYN 스캔 결과가 저장된 파일의 내용을 확인합니다. cat 명령어는 터미널에서 파일의 내용을 표시하는 간단한 방법입니다.

    cat /home/labex/project/nmap-syn-scan-results.txt
    

    이 명령어를 실행하면 출력이 표시됩니다. 출력의 각 부분은 다음과 같은 의미를 갖습니다.

    • Host is up: 이 메시지는 대상 호스트가 네트워크를 통해 도달 가능함을 나타냅니다. 호스트가 켜져 있으면 스캔이 대상과 통신할 수 있었음을 의미합니다.
    • 지연 시간(latency) 값: 대상이 스캔에 얼마나 빨리 응답했는지 보여줍니다. 지연 시간이 낮을수록 대상이 더 빨리 응답했음을 의미합니다.
    • 8080/tcp open: 대상 호스트의 포트 8080이 열려 있고 들어오는 연결을 수락할 준비가 되었음을 나타냅니다. 열린 포트는 공격자의 잠재적인 진입점이 될 수 있습니다.
    • http-proxy: 이는 포트 8080에서 실행 중인 서비스에 대한 Nmap의 추측입니다. Nmap은 스캔 중에 받는 응답을 기반으로 서비스를 식별하려고 시도합니다.
  2. 실제 보안 평가에서 대상 호스트의 각 열린 포트는 여러 가지를 의미합니다.

    • 공격자의 잠재적 진입점: 공격자는 열린 포트를 사용하여 대상 시스템에 액세스할 수 있습니다. 예를 들어, 열린 포트에서 웹 서버가 실행 중인 경우 공격자는 웹 애플리케이션의 취약점을 악용하려고 시도할 수 있습니다.
    • 취약점이 있을 수 있는 서비스: 열린 포트에서 실행되는 모든 서비스는 보안 결함이 있을 가능성이 있습니다. 이러한 취약점은 공격자가 시스템을 손상시키는 데 악용될 수 있습니다.
    • 보안이 필요한 공격 표면의 일부: 공격 표면은 공격자가 시스템에 침입하려고 시도할 수 있는 모든 지점의 합계입니다. 열린 포트는 이 공격 표면의 일부이며 적절하게 보호되어야 합니다.

보안 모범 사례

네트워크를 보호할 때는 다음 모범 사례를 따라야 합니다.

  1. 필요한 포트만 열어야 합니다: 불필요한 포트를 열면 네트워크의 공격 표면이 증가합니다. 사용하지 않는 포트를 닫으면 공격자의 잠재적 진입점 수가 줄어듭니다.
  2. 각 열린 포트는 합법적인 비즈니스 목적을 제공해야 합니다: 포트가 열려 있다면 웹 서버나 데이터베이스 서비스 실행과 같은 타당한 이유가 있어야 합니다. 이는 네트워크가 효율적이고 안전하게 사용되도록 보장하는 데 도움이 됩니다.
  3. 모든 서비스는 악용을 방지하기 위해 최신 상태로 유지되어야 합니다: 소프트웨어 공급업체는 보안 취약점을 수정하기 위해 정기적으로 업데이트를 릴리스합니다. 서비스를 최신 상태로 유지함으로써 알려진 위협으로부터 네트워크를 보호할 수 있습니다.
  4. 방화벽 규칙은 민감한 포트에 대한 액세스를 제한해야 합니다: 방화벽을 사용하여 네트워크의 특정 포트에 액세스할 수 있는 사용자를 제어할 수 있습니다. 적절한 방화벽 규칙을 설정하면 민감한 포트에 대한 액세스를 승인된 사용자나 시스템으로만 제한할 수 있습니다.

환경 정리

  1. 이제 이전에 시작한 HTTP 서버를 중지하여 환경을 정리해야 합니다. 먼저 HTTP 서버의 프로세스 ID(PID)를 식별해야 합니다. PID는 시스템에서 실행 중인 각 프로세스에 할당된 고유 번호입니다. ps aux 명령어를 사용하여 실행 중인 모든 프로세스를 나열한 다음 결과를 필터링하여 HTTP 서버 프로세스를 찾습니다.

    ps aux | grep "http.server" | grep -v grep
    

    이 명령어를 실행하면 다음과 유사한 출력이 표시됩니다.

    labex      1234  0.0  0.1  31116  3164 pts/0    S    12:00   0:00 python -m http.server --bind 127.0.0.1 8080
    

    출력의 두 번째 열은 HTTP 서버 프로세스의 PID를 보여줍니다.

  2. 다음으로 PID를 사용하여 서버를 중지합니다. 프로세스에 종료 신호를 보내는 kill 명령어를 사용합니다. 다음 명령어는 HTTP 서버 프로세스를 자동으로 찾아 종료합니다.

    kill $(ps aux | grep "http.server" | grep -v grep | awk '{print $2}')
    

    이 명령어는 먼저 이전과 동일한 필터링 방법을 사용하여 HTTP 서버 프로세스의 PID를 찾은 다음 PID를 kill 명령어에 전달합니다.

  3. 마지막으로 서버가 중지되었는지 확인해야 합니다. 소켓 통계를 표시하는 데 사용되는 ss 명령어를 사용합니다. 포트 8080에 대한 정보만 표시하도록 출력을 필터링하여 서버가 여전히 실행 중인지 확인할 수 있습니다.

    ss -tulwn | grep 8080
    

    서버가 성공적으로 중지되었다면 이 명령어의 출력은 없어야 하며, 이는 서버가 더 이상 포트 8080에서 수신 대기하지 않음을 나타냅니다.

요약

이 실습에서는 네트워크 보안 정찰의 핵심 기술인 Nmap SYN 스캔을 수행하고 이해하는 방법을 배웠습니다. Python HTTP 서버를 사용하여 통제된 환경을 설정하고, SYN 스캔을 수행하여 열린 포트를 찾고, 결과를 분석하고, 테스트 환경을 정리했습니다. 이러한 기술은 윤리적인 네트워크 스캔 및 취약점 평가에 필수적입니다.

SYN 스캔을 이해하면 보안 전문가가 탐지 위험을 줄이면서 잠재적인 네트워크 취약점을 효율적으로 감지할 수 있습니다. 사이버 보안 여정을 진행하면서 이러한 기술을 적용하기 전에 항상 네트워크를 스캔할 권한이 있는지 확인하십시오.