소개
이 랩에서는 강력한 Python 기반 패킷 조작 도구인 Scapy 를 사용하여 네트워크 패킷을 스푸핑하는 방법을 배우게 됩니다. Wireshark 로 결과를 분석하면서 사용자 지정 TCP 패킷을 제작하고 전송하는 실용적인 기술을 탐구할 것입니다.
이 랩은 Scapy 설치, Python 가상 환경 설정, 패킷 스푸핑 작업 등 필수 단계를 다룹니다. 실습을 통해 네트워크 트래픽 조작 및 보안 테스트 방법론에 대한 귀중한 통찰력을 얻을 수 있습니다.
Scapy 설치
이 단계에서는 네트워크 분석 및 보안 테스트에 사용되는 강력한 Python 기반의 대화형 패킷 조작 도구인 Scapy 를 설치합니다. Scapy 를 사용하면 세밀한 제어 기능을 통해 네트워크 패킷을 제작, 전송 및 캡처할 수 있습니다. 네트워크 패킷용 스위스 아미 나이프와 같다고 생각하면 됩니다. 필요한 모든 유형의 네트워크 패킷을 구축할 수 있습니다.
시작하기 전에 올바른 작업 디렉토리에 있는지 확인해 보겠습니다. ~/project 디렉토리는 모든 작업을 수행할 곳입니다.
cd ~/project
이제 Python 의 패키지 관리자인 pip 를 사용하여 Scapy 를 설치합니다. Pip 는 Python 패키지용 앱 스토어와 같습니다. Python Package Index (PyPI) 에서 소프트웨어를 다운로드하여 설치합니다.
pip install scapy
설치가 완료된 후에는 모든 것이 올바르게 설치되었는지 확인하는 것이 좋습니다. Scapy 의 버전 번호를 확인하여 이를 수행합니다. 이렇게 하면 Scapy 가 설치되었고 Python 이 이를 성공적으로 가져올 수 있는지 확인할 수 있습니다.
python -c "import scapy; print(scapy.__version__)"
다음과 유사한 출력을 볼 수 있습니다 (버전 번호는 약간 다를 수 있습니다).
2.4.5
마지막으로 Scapy 의 대화형 모드를 테스트해 보겠습니다. 이는 전체 스크립트를 작성하기 전에 패킷 제작을 실험할 수 있는 놀이터와 같습니다. 대화형 셸에 들어가려면 다음을 수행합니다.
python -m scapy
Scapy 의 명령 프롬프트 (>>>) 가 표시되면 작동하는 것입니다. 대화형 셸을 종료할 준비가 되면 exit()를 입력할 수 있습니다. 지금은 탐색에 대해 걱정하지 마십시오. 대화형 기능은 다음 단계에서 다룰 것입니다.
Python 환경 설정
이 단계에서는 Python 의 가상 환경을 사용하여 Scapy 실험을 위한 전용 작업 공간을 만들 것입니다. 컴퓨터의 다른 프로젝트에 영향을 주지 않고 작업할 수 있는 클린 룸을 설정하는 것과 같다고 생각하십시오. 가상 환경은 패키지 버전을 관리하고 서로 다른 Python 프로젝트 간의 충돌을 방지하는 데 도움이 됩니다.
먼저, 올바른 위치에서 시작하고 있는지 확인해 보겠습니다. 이 명령은 프로젝트를 설정할 기본 작업 디렉토리로 이동합니다.
cd ~/project이제
scapy-env라는 가상 환경을 만들 것입니다. 이렇게 하면 격리된 환경에 필요한 모든 Python 파일이 포함된 새 폴더가 생성됩니다.python -m venv scapy-env새 환경을 사용하려면 활성화해야 합니다. 활성화되면 터미널 프롬프트 시작 부분에
(scapy-env)가 표시되어 어떤 환경에서 작업하고 있는지 알려줍니다.source scapy-env/bin/activateScapy 가 이미 시스템에 설치되어 있을 수 있지만, 이 환경을 위해 특별히 설치할 것입니다. 이렇게 하면 이 프로젝트에 필요한 정확한 버전을 갖게 됩니다.
pip install scapy모든 것이 올바르게 설정되었는지 확인해 보겠습니다. 이 명령은 가상 환경에 설치된 모든 Python 패키지를 표시합니다. 목록에
scapy가 표시되어 사용 준비가 되었는지 확인할 수 있습니다.pip list작업이 완료되면 (하지만 다음 단계에서 환경을 사용할 것이므로 지금 실행하지 마십시오) 가상 환경을 비활성화하여 일반 시스템 Python 으로 돌아갈 수 있습니다.
deactivate
TCP 패킷 생성
이 단계에서는 Scapy 를 사용하여 기본 TCP 패킷을 생성합니다. 네트워크 패킷을 구성하는 방법을 이해하는 것은 네트워크 분석 및 보안 테스트에 필수적입니다. 실제 네트워크 통신 방식과 유사하게 TCP 패킷을 계층별로 구축합니다.
먼저, 올바른 디렉토리에 있고 가상 환경이 활성화되어 있는지 확인합니다. 가상 환경은 Python 패키지를 격리된 상태로 유지합니다.
cd ~/project source scapy-env/bin/activatecraft_tcp.py라는 새 Python 스크립트를 만듭니다. nano 텍스트 편집기를 사용하지만 원하는 편집기를 사용할 수 있습니다.nano craft_tcp.py다음 코드를 추가하여 간단한 TCP 패킷을 생성합니다. 각 부분이 수행하는 작업을 자세히 살펴보겠습니다.
- IP 계층은 소스 및 대상 주소를 정의합니다.
- TCP 계층은 포트 및 연결 플래그 (이 경우 SYN) 를 지정합니다.
/연산자는 이러한 계층을 결합하여 완전한 패킷을 만듭니다.
from scapy.all import * ## Create IP layer ip = IP(src="192.168.1.100", dst="192.168.1.1") ## Create TCP layer tcp = TCP(sport=1234, dport=80, flags="S") ## SYN packet ## Combine layers to create packet packet = ip/tcp ## Display packet details packet.show()파일을 저장하고 (nano 에서 Ctrl+O, Enter, Ctrl+X) 실행합니다.
.show()메서드는 패킷 구조를 표시합니다.python craft_tcp.py다음과 유사한 출력이 표시되어 모든 패킷 필드를 보여줍니다. Scapy 가 일부 값을 자동으로 채우고 다른 값은 None 으로 유지되는 것을 확인하십시오 (전송 시 계산됨).
###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= tcp chksum= None src= 192.168.1.100 dst= 192.168.1.1 \options\ ###[ TCP ]### sport= 1234 dport= http seq= 0 ack= 0 dataofs= None reserved= 0 flags= S window= 8192 chksum= None urgptr= 0 options= []
스푸핑된 패킷 전송
이 단계에서는 TCP 패킷 스크립트를 수정하여 가짜 소스 IP 주소로 스푸핑된 패킷을 전송합니다. 이는 공격자가 네트워크 통신에서 자신의 출처를 어떻게 숨길 수 있는지 보여줍니다. 스푸핑은 발신자가 자신의 신원을 숨기거나 다른 시스템을 가장하기 위해 IP 패킷의 소스 주소를 의도적으로 위조하는 일반적인 기술입니다.
먼저, 올바른 디렉토리에 있고 가상 환경이 활성화되어 있는지 확인합니다. 가상 환경은 이 프로젝트에 대한 Python 패키지를 격리된 상태로 유지합니다.
cd ~/project source scapy-env/bin/activatesend_spoofed.py라는 새 Python 스크립트를 만듭니다. 초보자를 위해 간단한 nano 텍스트 편집기를 사용합니다.nano send_spoofed.py스푸핑된 TCP 패킷을 전송하려면 다음 코드를 추가합니다. 이 코드는 테스트에 안전한 개인 IP 범위 (192.168.x.x 및 10.x.x.x) 에서 임의의 IP 주소를 생성합니다. TCP 패킷은 SYN 플래그가 설정된 상태로 Google 의 DNS 서버 (8.8.8.8) 의 포트 53 으로 전송됩니다.
from scapy.all import * import random ## Spoofed source IP (using private IP range) spoofed_ip = f"192.168.{random.randint(1,254)}.{random.randint(1,254)}" ## Create and send packet packet = IP(src=spoofed_ip, dst="8.8.8.8")/TCP(dport=53, flags="S") send(packet, verbose=False) print(f"Sent spoofed TCP packet from {spoofed_ip} to 8.8.8.8")파일을 저장하고 (nano 에서 Ctrl+O, Enter, Ctrl+X) 실행합니다. 스크립트는 하나의 스푸핑된 패킷을 생성하고 전송합니다.
python send_spoofed.py생성된 가짜 소스 IP 를 보여주는 다음과 유사한 출력이 표시됩니다.
Sent spoofed TCP packet from 192.168.45.123 to 8.8.8.8여러 패킷을 전송하고 다른 스푸핑된 IP 가 작동하는 것을 보려면 스크립트를 수정하여 루프를 포함합니다. 이렇게 하면 10.x.x.x 범위에서 서로 다른 임의의 소스 IP 를 가진 3 개의 패킷이 전송됩니다.
for i in range(3): spoofed_ip = f"10.0.{random.randint(1,254)}.{random.randint(1,254)}" packet = IP(src=spoofed_ip, dst="8.8.8.8")/TCP(dport=53, flags="S") send(packet, verbose=False) print(f"Sent packet {i+1} from {spoofed_ip}")
Wireshark 로 검증
이 단계에서는 Wireshark 를 사용하여 이전 단계에서 전송한 스푸핑된 패킷을 확인합니다. Wireshark 는 강력한 네트워크 프로토콜 분석기로, 네트워크 트래픽을 실시간으로 캡처하고 검사할 수 있습니다. 이 확인 프로세스는 스푸핑된 패킷이 수정된 소스 IP 주소로 실제로 네트워크에서 전송되고 있는지 확인하는 데 도움이 되므로 매우 중요합니다.
먼저, 올바른 디렉토리에 있고 가상 환경이 활성화되어 있는지 확인합니다. 가상 환경에는 이 랩에 필요한 모든 Python 패키지가 포함되어 있습니다.
cd ~/project source scapy-env/bin/activateLabEx VM 에 Wireshark 를 설치합니다. Wireshark 는 미리 설치되어 있지 않으므로 먼저 설치해야 합니다.
sudo apt-get update sudo apt-get install -y wiresharkWireshark 를 백그라운드에서 시작합니다. '&' 기호는 Wireshark 가 실행되는 동안 터미널을 계속 사용할 수 있도록 합니다.
wireshark &Wireshark 인터페이스에서:
- 활성 네트워크 인터페이스 (일반적으로 eth0) 를 선택합니다. 이는 네트워크 연결을 나타냅니다.
- 상어 지느러미 아이콘을 클릭하여 패킷 캡처를 시작합니다. 이렇게 하면 모든 네트워크 트래픽 기록이 시작됩니다.
- 표시 필터를 적용합니다:
tcp.port == 53- 이렇게 하면 포트 53(DNS 포트) 의 TCP 트래픽만 표시하도록 보기가 필터링됩니다.
별도의 터미널에서 스푸핑된 패킷 스크립트를 다시 실행합니다. 이렇게 하면 Wireshark 가 캡처할 새 트래픽이 생성됩니다.
python send_spoofed.pyWireshark 에서 결과를 관찰합니다.
- 포트 53 으로의 TCP SYN 패킷이 표시되어야 합니다. 이는 연결 시작 패킷입니다.
- 소스 IP 주소가 스푸핑된 IP 와 일치하는지 확인합니다. - 스푸핑이 작동했음을 확인합니다.
- TCP 핸드셰이크 시도 (SYN 패킷) 를 확인합니다. - 이는 연결 시도를 보여줍니다.
나중에 분석할 수 있도록 캡처를 저장하려면:
- File → Save 를 클릭합니다.
~/project에spoofed_capture.pcap로 저장합니다. - PCAP 파일에는 나중에 참조할 수 있도록 원시 패킷 데이터가 포함되어 있습니다.
요약
이 랩에서는 격리된 Python 가상 환경에서 네트워크 패킷 조작을 위해 Scapy 를 설치하고 구성하는 방법을 배웠습니다. 이 과정에는 환경 설정, Scapy 설치, 버전 확인 및 대화형 테스트를 통한 기능 확인이 포함되었습니다.
또한 TCP 패킷을 제작하고, 네트워크 트래픽을 시뮬레이션하기 위해 스푸핑된 패킷을 전송하고, Wireshark 를 사용하여 결과를 분석하는 실질적인 경험을 얻었습니다. 이러한 기술은 네트워크 보안 테스트 및 패킷 조작 기술의 기반을 제공합니다.


