[Day 9] 閑的沒事就寫封包 - gopacket建立UDP封包

建立封包

UDP封包

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package main

import (
	"log"
	"math/rand"
	"net"
	"time"

	"github.com/google/gopacket"
	"github.com/google/gopacket/layers"
	"github.com/google/gopacket/pcap"
)

func main() {
	var (
		device      string = "bridge100"
		snapshotLen int32  = 1024
		promiscuous bool   = false
		err         error
		timeout     time.Duration = 10 * time.Second
		handle      *pcap.Handle
		buffer      gopacket.SerializeBuffer
		random      *rand.Rand
	)

	handle, err = pcap.OpenLive(device, snapshotLen, promiscuous, timeout)
	if err != nil {
		log.Fatal(err)
	}
	defer handle.Close()

	random = rand.New(rand.NewSource(time.Now().UnixNano()))
	srcPort := layers.UDPPort(random.Intn(65535))
	dstPort := layers.UDPPort(12345)

	ethernetLayer := &layers.Ethernet{
		SrcMAC:       net.HardwareAddr{0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00},
		DstMAC:       net.HardwareAddr{0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00},
		EthernetType: layers.EthernetTypeIPv4,
	}

	ipLayer := &layers.IPv4{
		SrcIP:    net.IP{10, 211, 55, 2},
		DstIP:    net.IP{10, 211, 55, 10},
		Version:  4,
		TTL:      64,
		Protocol: layers.IPProtocolUDP,
	}

	udpLayer := &layers.UDP{
		SrcPort: srcPort,
		DstPort: dstPort,
	}
	udpLayer.SetNetworkLayerForChecksum(ipLayer)

	payload := []byte("Hello World")

	buffer = gopacket.NewSerializeBuffer()
	opts := gopacket.SerializeOptions{
		FixLengths:       true,
		ComputeChecksums: true,
	}

	if err := gopacket.SerializeLayers(buffer, opts, ethernetLayer, ipLayer, udpLayer, gopacket.Payload(payload)); err != nil {
		log.Fatal(err)
	}
	udpPacket := buffer.Bytes()

	err = handle.WritePacketData(udpPacket)
	if err != nil {
		log.Fatal(err)
	}
}

靶機攔截封包

攔截封包

1
2
22:03:52.573287 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], proto UDP (17), length 39)
    10.211.55.2.26598 > ubuntu-linux-20-04-desktop.12345: UDP, length 11

與net.Dial比對

使用net.Dial發送UDP封包

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func main() {
	targetIP := "10.211.55.10"
	targetPort := 12345
	conn, err := net.Dial("udp", fmt.Sprintf("%s:%d", targetIP, targetPort))
	if err != nil {
		fmt.Println("Error connecting:", err)
		return
	}
	defer conn.Close()
}

攔截封包

1
2
22:09:05.603943 IP (tos 0x0, ttl 64, id 40361, offset 0, flags [none], proto UDP (17), length 39)
    10.211.55.2.63766 > ubuntu-linux-20-04-desktop.12345: UDP, length 11

UDP成功!

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy