다음 Netcat 명령을 실행하고 패킷을 보면와이어샤크, 이는 UDP 패킷의 형식이 잘못되었음을 나타냅니다.
$ echo "this is a test" | nc -u 127.0.0.1 53
마찬가지로 $ echo "this is a test" > /dev/udp/127.0.0.1/53
Wireshark에서 다음과 같은 명령을 사용하면 "Malformed Packet" 오류가 발생합니다.
echo 명령은 오류 없이 Netcat 서버로 전송/전달됩니다. 그러나 그것은 나를 궁금하게 만든다:echo나 기타 기본 Unix 도구를 사용하여 올바른 UDP 패킷을 수동으로 구축할 수 있습니까?
저는 데비안과 macOS를 사용하고 있습니다.
답변1
IP 및 UDP 관점에서 볼 때 패킷은 완전히 유효합니다. Wireshark 하단 창에서 Ethernet/IP/UDP에 대한 프로토콜 세부 정보를 확장하면 패킷이 성공적으로 구문 분석된 것을 확인할 수 있습니다.
그러나 대상이 포트 53이기 때문에 Wireshark는 이를 DNS 패킷으로 구문 분석하려고 시도하지만 수행할 수 없습니다("this is a test"라는 문자열은 유효한 DNS 요청이 아니기 때문입니다).RFC 1035사양).
해당 링크의 사양을 따르면 DNS 요청으로 구문 분석될 때 유효한 패킷을 구성할 수 있습니다. 패킷을 다른 포트로 보내면 Wireshark가 더 이상 패킷을 DNS 요청으로 구문 분석하지 않으므로 경고가 표시되지 않습니다.
답변2
Bash 특수 별칭으로 리디렉션을 통해 보낼 수 있습니다.
Bash 맨페이지에서:
/dev/tcp/host/port 호스트가 유효한 호스트 이름 또는 인터넷 주소이고 포트가 정수 포트 번호 또는 서비스 이름인 경우 bash는 해당 TCP 소켓을 열려고 시도합니다.
/dev/udp/host/port 호스트가 유효한 호스트 이름 또는 인터넷 주소이고 포트가 정수 포트 번호 또는 서비스 이름인 경우 bash는 해당 UDP 소켓을 열려고 시도합니다.
그러면 포트 8080의 192.168.2.11로 UDP 패킷이 전송됩니다.
echo "This is a test" > /dev/udp/192.168.2.11/8080
답변3
여기에는 여러 가지 문제가 있습니다. "잘못된 패킷" 주장은 체크섬 오프로딩으로 인한 것일 수 있으며, 그렇다면 이는 완전한 보기가 없는 패킷 캡처를 반영하는 가짜 오류입니다. 일부 작업은 네트워크 하드웨어에서 수행됩니다. WireShark에는 이에 대한 문서가 있어야 합니다.
그렇지 않으면 다양한 도구(예: socat
, nc
또는 , 또는 또는 또는 netcat
와 같은 셸의 매우 유사한 기능을 통해 )가 표준 입력에서 바이트를 가져와 UDP 패킷으로 덤프할 수 있습니다. 이것이 "올바른"지 여부는 프로토콜에 따라 다릅니다. 이론상으로는 DNS 또는 DHCP 패킷을 이런 방식으로 구성하고 보낼 수 있지만 일반적으로 이것이 더 쉽기 때문에 관련 프로토콜을 올바르게 구현하기 위해 라이브러리나 특수 소프트웨어를 사용하는 경우가 더 많습니다. 설정하는 것보다 몇 가지 더 복잡합니다. 특히 응답 처리, 시간 초과 또는 오류 후 재시도, 패킷 헤더 필드 등을 처리하여 네트워크를 통해 전송되는 패킷의 본문입니다. 이러한 프로토콜은 일반적으로 RFC에 잘 문서화되어 있습니다. 추가 문서는 Stevens의 "TCP/IP Illustrated" 책 시리즈를 참조하세요.ksh93
bash
nmap
패킷 구축 과 같은 특정 도구는 매우 사용자 정의된 작업을 수행합니다. 그렇지 않은 경우 수동 패킷 작성의 경우 일반적으로 프로그래밍 언어가 사용되지만 대부분의 소프트웨어는 기존 라이브러리 또는 시스템 서비스를 사용하여 DNS, DHCP 또는 기타 UDP 패킷을 전송합니다. 이는 원시 패킷을 수동으로 작성하는 것보다 작업이 적기 때문입니다. 수량은 훨씬 적습니다. 오류가 발생할 가능성이 적습니다. 패킷은 처음부터 시작됩니다.