Netcat 또는 /dev/udp/를 사용하여 DNS 쿼리 만들기

Netcat 또는 /dev/udp/를 사용하여 DNS 쿼리 만들기

ncbashOR을 사용하여 유효한 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진수 데이터는 다음과 같습니다.

IPv4 헤더:

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

관련 정보