nc
bash
OR을 사용하여 유효한 DNS 요청을 보내 려고 합니다 /dev/udp/
.
유효한 DNS 패킷을 템플릿으로 만들었습니다.
tcpdump -XX port 53
그런 다음 새 터미널에서 컬을 사용하여 요청합니다.
curl https://duckduckgo.com/
그러면 tcpdump 터미널에 다음 데이터가 생성됩니다.
0x0000: 4500 003c b0b4 4000 4011 73c3 0a00 020f E..<..@[email protected].....
0x0010: 0a2a 0001 bdd4 0035 0028 4f24 cfc9 0100 .*.....5.(O$....
0x0020: 0001 0000 0000 0000 0a64 7563 6b64 7563 .........duckduc
0x0030: 6b67 6f03 636f 6d00 0001 0001 kgo.com.....
이에 따라 요청을 약간 수정했습니다.이 참조그리고 파일에 저장합니다 /tmp/ddg.txt
.
0000: 4500 003c b0b4 4000 4011 73c3 0a00 020f E..<..@[email protected].....
0010: 0a2a 0001 bdd4 0035 0028 4f24 cfc9 0100 .*.....5.(O$....
0020: 0001 0000 0000 0000 0a64 7563 6b64 7563 .........duckduc
0030: 6b67 6f03 636f 6d00 0001 0001 kgo.com.....
그런 다음 요청을 생성하려고 시도했지만 다음 오류 메시지를 받았습니다.
xxd -r /tmp/ddg.txt | nc -q 1 -nu 10.42.0.1 53
xxd: sorry, cannot seek backwards.
Wireshark에서 요청의 형식이 올바르지 않습니다. 내가 여기서 무슨 실수를 했나요? 이 방법을 사용하여 올바른 DNS 쿼리를 보낼 수 있습니까?
답변1
당신은 이미 사용했습니다TCP 덤프. 하지만 당신은 사용해야합니다라인샤크나중에 그랬듯이: 제공한 링크에서와 동일한 실수를 했다는 것을 알게 될 것입니다. 추가 콘텐츠를 포함했습니다.IPv4+UDP 프로토콜헤더: 다음 항목만 제출해야 합니다.인터넷 고양이IPv4 UDP 패킷을 보냈기 때문입니다.
중복된 주소가 없는 16진수 데이터는 다음과 같습니다.
4500 003c b0b4 4000 4011 73c3 0a00 020f 0a2a 0001
UDP 헤더(0028은 전체 UDP 부분의 길이입니다: 8+20 => 길이 0x20 = 페이로드 32바이트):
bdd4 0035 0028 4f24
UDP 페이로드:
cfc9 0100 0001 0000 0000 0000 0a64 7563 6b64 7563 6b67 6f03 636f 6d00 0001 0001
xxd
-p
쓰는 대신 매개변수를 사용할 수 있지만 더 중요한 것은 주소가 필요하지 않다는 것입니다 -r
(이렇게 하면 주소를 다시 쓰고 번호를 다시 매길 필요가 없습니다).
-p | -ps | -postscript | -plain
포스트스크립트 순차 16진수 덤프 스타일로 출력됩니다. 순수 16진수 덤프 스타일이라고도 합니다.
reverse( -r
)를 사용하면 위치에 상관없이 모든 공백도 무시됩니다.
다음은 완료된 테스트입니다(잘 작동하는 테스트 IP 대신 자신의 DNS 서버 IP를 다시 넣었습니다).
$ echo cfc9 0100 0001 0000 0000 0000 0a64 7563 6b64 7563 6b67 6f03 636f 6d00 0001 0001 |
xxd -p -r | nc -q1 -w2 -n -u 10.42.0.1 53 | xxd
00000000: cfc9 8180 0001 0001 0004 0000 0a64 7563 .............duc
00000010: 6b64 7563 6b67 6f03 636f 6d00 0001 0001 kduckgo.com.....
00000020: c00c 0001 0001 0000 005e 0004 2872 b19c .........^..(r..
00000030: c00c 0002 0001 0002 91bb 0014 0464 6e73 .............dns
00000040: 3303 7030 3505 6e73 6f6e 6503 6e65 7400 3.p05.nsone.net.
00000050: c00c 0002 0001 0002 91bb 0007 0464 6e73 .............dns
00000060: 31c0 41c0 0c00 0200 0100 0291 bb00 0704 1.A.............
00000070: 646e 7332 c041 c00c 0002 0001 0002 91bb dns2.A..........
00000080: 0007 0464 6e73 34c0 41 ...dns4.A
바꾸다인터넷 고양이그리고소캇: 사용 nc -q1 -w2 -n -u 10.42.0.1 53
. . . 교체 socat udp4:10.42.0.1:53 -
. EOF 조건을 더 잘 처리합니다(따라서 2초를 기다릴 필요가 없습니다).
/dev/udp
대신 bash의 내장 기능을 사용하려는 경우인터넷 고양이또는소캇그러면 두 개의 반이중 명령(하나는 쓰기 전용, 다른 하나는 읽기 전용)으로 전이중 소켓을 처리하는 것이 약간 복잡해집니다. 이 비대화형 사례의 경우 첫 번째 출력 명령을 분기할 필요가 없습니다. 그렇지 않으면 더 복잡한 경우 출력과 입력이 병렬로 작동하도록 ;
이전 명령을 dd
대체 할 수 있습니다. &
여전히 dd
하나의 패킷만 잡고 완료 해야 하므로 xxd
차단을 방지할 수 있습니다.
( echo cfc9 0100 0001 0000 0000 0000 0a64 7563 6b64 7563 6b67 6f03 636f 6d00 0001 0001 | xxd -p -r >&3; dd bs=9000 count=1 <&3 2>/dev/null | xxd ) 3>/dev/udp/10.42.0.1/53