onelisten.go
· 1.4 KiB · Go
Sin formato
package main
import (
"fmt"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
"time"
)
// Filter for syn packets
const filter = "(tcp[tcpflags] & tcp-syn != 0)"
func handlePacket(handle *pcap.Handle, packet gopacket.Packet) {
eth := packet.LinkLayer().(*layers.Ethernet)
ipv4 := packet.NetworkLayer().(*layers.IPv4)
tcp := packet.TransportLayer().(*layers.TCP)
fmt.Printf("[%s] SYN packet received from %s on port %d. Replying with SYN+ACK...\n", time.Now().String(), ipv4.SrcIP, tcp.DstPort)
// Build syn+ack response
buf := gopacket.NewSerializeBuffer()
err := gopacket.SerializeLayers(buf, gopacket.SerializeOptions{},
&layers.Ethernet{
DstMAC: eth.SrcMAC,
SrcMAC: eth.DstMAC,
},
&layers.IPv4{
SrcIP: ipv4.DstIP,
DstIP: ipv4.SrcIP,
},
&layers.TCP{
SrcPort: tcp.DstPort,
DstPort: tcp.SrcPort,
Seq: tcp.Ack,
Ack: tcp.Seq + 1,
SYN: true,
ACK: true,
})
if err != nil {
panic(err)
}
err = handle.WritePacketData(buf.Bytes())
if err != nil {
panic(err)
}
}
func main() {
handle, err := pcap.OpenLive("eth0", 1600, true, pcap.BlockForever) // Change eth0 for your device
if err != nil {
panic(err)
}
_ = handle.SetBPFFilter(filter)
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
handlePacket(handle, packet)
}
}
| 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "fmt" |
| 5 | "github.com/google/gopacket" |
| 6 | "github.com/google/gopacket/layers" |
| 7 | "github.com/google/gopacket/pcap" |
| 8 | "time" |
| 9 | ) |
| 10 | |
| 11 | // Filter for syn packets |
| 12 | const filter = "(tcp[tcpflags] & tcp-syn != 0)" |
| 13 | |
| 14 | func handlePacket(handle *pcap.Handle, packet gopacket.Packet) { |
| 15 | eth := packet.LinkLayer().(*layers.Ethernet) |
| 16 | ipv4 := packet.NetworkLayer().(*layers.IPv4) |
| 17 | tcp := packet.TransportLayer().(*layers.TCP) |
| 18 | fmt.Printf("[%s] SYN packet received from %s on port %d. Replying with SYN+ACK...\n", time.Now().String(), ipv4.SrcIP, tcp.DstPort) |
| 19 | |
| 20 | // Build syn+ack response |
| 21 | buf := gopacket.NewSerializeBuffer() |
| 22 | err := gopacket.SerializeLayers(buf, gopacket.SerializeOptions{}, |
| 23 | &layers.Ethernet{ |
| 24 | DstMAC: eth.SrcMAC, |
| 25 | SrcMAC: eth.DstMAC, |
| 26 | }, |
| 27 | &layers.IPv4{ |
| 28 | SrcIP: ipv4.DstIP, |
| 29 | DstIP: ipv4.SrcIP, |
| 30 | }, |
| 31 | &layers.TCP{ |
| 32 | SrcPort: tcp.DstPort, |
| 33 | DstPort: tcp.SrcPort, |
| 34 | Seq: tcp.Ack, |
| 35 | Ack: tcp.Seq + 1, |
| 36 | SYN: true, |
| 37 | ACK: true, |
| 38 | }) |
| 39 | if err != nil { |
| 40 | panic(err) |
| 41 | } |
| 42 | err = handle.WritePacketData(buf.Bytes()) |
| 43 | if err != nil { |
| 44 | panic(err) |
| 45 | } |
| 46 | } |
| 47 | |
| 48 | func main() { |
| 49 | handle, err := pcap.OpenLive("eth0", 1600, true, pcap.BlockForever) // Change eth0 for your device |
| 50 | if err != nil { |
| 51 | panic(err) |
| 52 | } |
| 53 | _ = handle.SetBPFFilter(filter) |
| 54 | packetSource := gopacket.NewPacketSource(handle, handle.LinkType()) |
| 55 | for packet := range packetSource.Packets() { |
| 56 | handlePacket(handle, packet) |
| 57 | } |
| 58 | } |
| 59 |