Netcat 으로 안전한 채팅 만들기

WiresharkBeginner
지금 연습하기

소개

이 랩에서는 Netcat 과 OpenSSL 을 사용하여 두 종단점 간의 안전한 통신을 설정하는 방법을 배우게 됩니다. SSL 인증서를 사용하여 암호화된 터널을 생성하는 연습을 하고, 보호된 메시징을 위해 리스너 (listener) 와 클라이언트 (client) 구성 요소를 모두 구성합니다.

실습을 통해 자체 서명된 인증서를 생성하고 OpenSSL 서버를 설정하며, Netcat 을 통해 연결하여 종단 간 암호화를 확인합니다. 이 실질적인 경험은 네트워크 통신을 보호하기 위한 기본적인 사이버 보안 도구에 대한 이해를 높여줄 것입니다.

Netcat 및 OpenSSL 설치

이 단계에서는 두 가지 필수 네트워킹 도구인 Netcat 과 OpenSSL 을 설치합니다. Netcat (종종 nc라고 함) 은 네트워크 통신을 위한 디지털 스위스 아미 나이프와 같습니다. 명령줄에서 직접 네트워크 연결을 읽고 쓸 수 있게 해줍니다. OpenSSL 은 암호화 기능을 제공하는 강력한 툴킷으로, 채팅 메시지를 보호하는 데 사용됩니다.

소프트웨어를 설치하기 전에 패키지 목록을 업데이트하는 것이 좋습니다. 이렇게 하면 최신 안정 버전의 도구를 얻을 수 있습니다.

sudo apt update

이제 Netcat 을 설치해 보겠습니다. 이 명령은 패키지를 자동으로 다운로드하여 설치합니다.

sudo apt install -y netcat

다음으로 OpenSSL 을 설치합니다. 이는 안전한 통신에 필요한 암호화 기능을 제공합니다.

sudo apt install -y openssl

설치 후 두 도구가 올바르게 작동하는지 확인해야 합니다. 다음 명령은 버전 정보를 표시합니다. 첫 번째 줄은 Netcat 의 버전을 표시하고, 두 번째 줄은 OpenSSL 의 버전을 표시합니다.

nc -h | head -n 1
openssl version

버전 번호는 다를 수 있지만 다음과 유사한 출력을 볼 수 있습니다.

OpenBSD netcat (Debian patchlevel 1.217-2ubuntu1)
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

이와 같은 버전 정보를 확인했다면 성공적으로 두 도구를 모두 설치했으며, 안전한 채팅을 만드는 데 사용할 다음 단계로 진행할 준비가 되었습니다!

암호화된 터널 설정

이 단계에서는 OpenSSL 을 사용하여 Netcat 통신을 보호하기 위해 암호화된 터널을 생성합니다. 이 터널은 두 종단점 간에 전송되는 모든 데이터를 암호화하여 네트워크 통신의 기밀성을 제공합니다. 암호화는 권한이 없는 당사자가 네트워크를 통해 이동하는 채팅 메시지를 읽는 것을 방지하므로 필수적입니다.

  1. 먼저, 프로젝트 디렉토리에서 자체 서명된 SSL 인증서와 개인 키를 생성합니다. 인증서는 채팅 서버의 신원을 확인하는 데 도움이 되는 디지털 ID 카드와 같고, 개인 키는 데이터를 암호화하는 데 사용됩니다.
cd ~/project
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=localhost"

이 명령은 key.pem (개인 키) 과 cert.pem (공개 인증서) 의 두 가지 중요한 파일을 생성합니다. -days 365 옵션은 인증서를 1 년 동안 유효하게 만들고, -nodes는 이 랩의 단순성을 위해 개인 키가 암호로 보호되지 않음을 의미합니다.

  1. 다음 명령을 사용하여 인증서 파일이 성공적으로 생성되었는지 확인합니다.
ls -l key.pem cert.pem

두 파일 모두 약 3-4KB 크기로 표시되어야 합니다. -l 플래그는 파일 권한 및 크기를 포함한 자세한 정보를 표시합니다. 이러한 파일이 존재하면 암호화 자료를 성공적으로 생성한 것입니다.

  1. 암호화된 통신을 처리할 OpenSSL 서버를 시작합니다. 이 서버는 채팅을 위한 보안 중개자 역할을 합니다.
openssl s_server -quiet -key key.pem -cert cert.pem -port 12345

-quiet 플래그는 출력 메시지를 줄이고, -key-cert는 방금 생성한 파일을 지정합니다. 포트 12345 는 서버가 들어오는 연결을 수신 대기하는 위치입니다. 이 터미널을 열어두고 실행 상태로 유지하십시오. 이제 클라이언트와 안전하게 통신할 준비가 되었습니다. 다음 단계에서는 이 보안 서버에 연결합니다.

리스너 시작

이 단계에서는 이전 단계에서 생성한 OpenSSL 터널을 통해 암호화된 통신을 수신하는 Netcat 리스너를 설정합니다. 이 리스너는 보안 통신 채널의 수신 측 역할을 합니다. 모든 메시지가 전달되기 전에 자동으로 잠기는 안전한 사서함을 설정하는 것과 같습니다.

  1. 먼저, 2 단계에서 실행 중인 OpenSSL 서버가 여전히 한 터미널에서 실행 중인지 확인합니다. 이 서버는 채팅 참가자 간의 암호화/복호화 중개자 역할을 합니다. 그렇지 않은 경우 다시 시작합니다.
cd ~/project
openssl s_server -quiet -key key.pem -cert cert.pem -port 12345

-quiet 플래그는 출력 노이즈를 줄이고, -key-cert는 암호화 자격 증명을 지정합니다. 포트 12345 는 보안 터널이 작동하는 위치입니다.

  1. 새 터미널 창 (또는 탭) 에서 프로젝트 디렉토리로 이동합니다. 이 분리는 보안 채팅 시스템의 다양한 구성 요소를 관리하는 데 도움이 됩니다.
cd ~/project
  1. 암호화된 터널에 연결할 Netcat 리스너를 시작합니다. Netcat 은 실제 메시지 전송을 처리하고 OpenSSL 은 암호화를 관리합니다.
nc localhost 12345

여기서 localhost는 자체 머신에 연결하고 있음을 의미하며, 12345는 OpenSSL 서버가 사용하는 포트와 일치합니다.

  1. 이제 터미널이 멈춘 것처럼 보일 것입니다. Netcat 이 들어오는 연결을 기다리고 있으므로 이는 정상입니다. 이 터미널을 열어두십시오. 다음 단계에서 보안 통신에 사용합니다. "멈춤"은 Netcat 이 전화를 기다리는 것처럼 적극적으로 수신 대기 중임을 의미합니다.

참고: Netcat 과 OpenSSL 간의 연결이 이제 설정되었으며, 모든 통신은 전송 전에 OpenSSL 에 의해 자동으로 암호화됩니다. 즉, 입력하는 모든 텍스트는 먼저 OpenSSL 에 의해 스크램블된 다음 네트워크를 통해 전송된 다음 수신자에 의해 스크램블 해제되어 잠재적인 도청자가 읽을 수 없게 됩니다.

연결 및 채팅

이 단계에서는 생성한 암호화된 터널을 사용하여 두 터미널 간에 보안 채팅 세션을 설정합니다. 이는 신뢰할 수 없는 네트워크를 통해 메시지를 안전하게 전송하는 방법을 보여줍니다. 암호화는 누군가 통신을 가로채더라도 메시지를 읽을 수 없도록 보장합니다.

  1. 세 개의 터미널 창이 열려 있는지 확인합니다.

    • 터미널 1: OpenSSL 서버 실행 (2 단계에서) - 암호화/복호화를 처리합니다.
    • 터미널 2: Netcat 리스너 실행 (3 단계에서) - 복호화된 메시지를 수신하고 표시합니다.
    • 터미널 3: 메시지 전송에 사용됩니다 - 입력 인터페이스
  2. 터미널 3 에서 클라이언트로서 암호화된 터널에 연결합니다. 이 명령은 OpenSSL 에 포트 12345 에서 보안 터널에 연결하도록 지시합니다.

cd ~/project
openssl s_client -quiet -connect localhost:12345
  1. 터미널 3 에서 테스트 메시지를 입력하고 Enter 키를 누릅니다. 이 메시지는 전송 전에 자동으로 암호화됩니다.
Hello secure world!
  1. 터미널 2(리스너) 로 전환합니다. 암호화된 메시지가 일반 텍스트로 표시되는 것을 볼 수 있습니다. 이는 메시지가 다른 쪽 끝에서 성공적으로 복호화되었음을 보여줍니다.

  2. 이제 터미널 2 에서 응답을 입력하고 Enter 키를 누릅니다. 메시지는 다시 전송되기 전에 암호화됩니다.

This is a secure reply!
  1. 응답이 터미널 3 에 나타납니다. 이제 양쪽에서 암호화된 메시지를 보내고 받을 수 있는 양방향 보안 채팅 채널이 있습니다.

  2. 채팅을 종료하려면 완료되면 모든 터미널에서 Ctrl+C 를 누릅니다. 이렇게 하면 모든 연결이 제대로 닫히고 암호화 프로세스가 중지됩니다.

암호화 확인

이 마지막 단계에서는 원시 네트워크 트래픽을 검사하여 SSL/TLS 암호화가 올바르게 작동하는지 확인합니다. 이 실습 시연을 통해 암호화가 권한이 없는 당사자가 데이터를 읽는 것을 정확히 어떻게 보호하는지 보여줍니다. Netcat 과 함께 OpenSSL 을 사용하면 모든 통신이 전송 중에 읽을 수 없는 암호문으로 변환됩니다.

  1. 먼저, 네트워크 트래픽을 검사할 도구가 필요합니다. 강력한 명령줄 패킷 분석기인 tcpdump 를 설치합니다.
sudo apt install -y tcpdump
  1. 새 터미널 창을 열어 트래픽을 모니터링합니다. 특히 자체 머신에서 로컬 네트워크 트래픽을 처리하는 루프백 인터페이스 (lo) 를 감시합니다. -X 플래그는 16 진수 및 ASCII 출력을 모두 표시하고, -n은 DNS 확인을 방지하여 출력을 더 명확하게 만듭니다.
sudo tcpdump -i lo -X -n port 12345
  1. 다른 터미널에서 이전과 똑같이 암호화된 채팅 세션을 다시 시작해 보겠습니다. 이 명령은 포트 12345 에서 실행 중인 채팅 서버에 대한 SSL 연결을 설정합니다.
cd ~/project
openssl s_client -quiet -connect localhost:12345
  1. 이제 이 암호화된 채널을 통해 테스트 메시지를 보냅니다. 원하는 내용을 입력하십시오. 이 간단한 예제를 사용합니다.
This message should be encrypted
  1. tcpdump 창을 봅니다. 읽을 수 있는 메시지를 보는 대신, 16 진수 값과 임의의 ASCII 문자로 구성된 스크램블된 데이터를 관찰하게 됩니다. 이것이 암호화된 후의 메시지이며, 적절한 복호화 키 없이는 완전히 읽을 수 없습니다.

  2. 차이점을 이해하기 위해 암호화되지 않은 트래픽과 비교해 보겠습니다.

    • 먼저, 모든 터미널 창에서 Ctrl+C 를 눌러 실행 중인 모든 프로세스를 중지합니다.
    • 암호화 없이 일반 Netcat 서버를 시작합니다: nc -l 12345
    • 다른 터미널에서 연결합니다: nc localhost 12345
    • 동일한 테스트 메시지를 보냅니다.
    • tcpdump 가 이제 일반 텍스트 메시지를 출력에 명확하게 표시하는 방식을 관찰합니다.

이 비교는 암호화가 중요한 이유를 명확하게 보여줍니다. 암호화가 없으면 네트워크를 모니터링하는 모든 사람이 메시지를 직접 읽을 수 있습니다.

요약

이 랩에서는 Netcat 과 OpenSSL 을 사용하여 안전한 채팅 채널을 만드는 방법을 배웠습니다. 이 과정에는 필요한 도구 설치, SSL 인증서 생성, OpenSSL 터널을 통한 암호화된 통신 설정이 포함되었습니다.

암호화 효과를 확인하면서 서버 및 클라이언트 구성을 모두 설정하는 연습을 했습니다. Netcat 의 네트워킹 기능과 OpenSSL 의 보안 기능의 조합은 잠재적인 도청으로부터 데이터 전송을 보호하는 방법을 보여줍니다.