Chciałbym stworzyć pakiety TCP custome za pomocą gopacket, a następnie wysłać je za pomocą nieprzetworzonych gniazd.Jak używać Golanga do komponowania surowego pakietu TCP (używając gopacket) i wysyłania go przez surowe gniazdo
Oto krótki i czytelny przykład pójść program pokazuje, co chciałbym zrobić:
package main
import (
"code.google.com/p/gopacket"
"code.google.com/p/gopacket/examples/util"
"code.google.com/p/gopacket/layers"
"log"
"net"
)
func main() {
defer util.Run()()
// XXX create tcp/ip packet
srcIP := net.ParseIP("127.0.0.1")
dstIP := net.ParseIP("192.168.0.1")
//srcIPaddr := net.IPAddr{
// IP: srcIP,
//}
dstIPaddr := net.IPAddr{
IP: dstIP,
}
ipLayer := layers.IPv4{
SrcIP: srcIP,
DstIP: dstIP,
Protocol: layers.IPProtocolTCP,
}
tcpLayer := layers.TCP{
SrcPort: layers.TCPPort(666),
DstPort: layers.TCPPort(22),
SYN: true,
}
tcpLayer.SetNetworkLayerForChecksum(&ipLayer)
buf := gopacket.NewSerializeBuffer()
opts := gopacket.SerializeOptions{
FixLengths: true,
ComputeChecksums: true,
}
err := gopacket.SerializeLayers(buf, opts, &ipLayer, &tcpLayer)
if err != nil {
panic(err)
}
// XXX end of packet creation
// XXX send packet
ipConn, err := net.ListenPacket("ip4:tcp", "0.0.0.0")
if err != nil {
panic(err)
}
_, err = ipConn.WriteTo(buf.Bytes(), &dstIPaddr)
if err != nil {
panic(err)
}
log.Print("packet sent!\n")
}
uruchomiony ten program nie działa na ... SerializeLayer nie jednak. Oto panika:
panika: nieprawidłowy src IP 127.0.0.1
goroutine 16 [bieg]: runtime.panic (0x5bb020, 0xc2090723e0) /home/human/golang-empire/go/src /pkg/runtime/panic.c:279 + 0xf5 main.main() /home/human/golang-empire/gopkg/src/github.com/david415/HoneyBadger/packetSendTest.go:41 + 0x464
goroutine 19 [finalizer wait]: runtime.park (0x413cc0, 0x7bc6c0, 0x7bb189) /home/human/golang-empire/go/src/pkg/runt/proc.c:13 69 + 0x89 runtime.parkunlock (0x7bc6c0, 0x7bb189) /home/human/golang-empire/go/src/pkg/runt/proc.c:1385 + 0x3b runfinq() /home/human/golang-imperium/go /src/pkg/runtime/mgc0.c:2644 + 0xcf runtime.goexit() /home/human/golang-empire/go/src/pkg/runtime/proc.c:1445
OK ... Naprawiłem błąd "invalid src ip" ... spowodowany przez niepoprawny typ ParseIP ... musiał zostać przekonwertowany za pomocą metody .To4() ;-) –
Obecnie moje proste zwięzłym przykładem jest wysłanie spreparowanego pakietu TCP/IP ... jednak numery portów i inne sekcje są zniekształcone. Być może "endian-ness" portów TCP są źle ustawione? Prosty zwięzły przykład tutaj: https://github.com/david415/HoneyBadger/blob/bd81a0132a2ccd880eee210acf2c965a37b457e3/packetSendTest.go –
Ten nowy popełnić pokazuje, że otrzymany pakiet TCP/IP jest niepoprawny porównując srcPort i dstPort do oczekiwanych wartości po pakiecie rozbiór: https://github.com/david415/HoneyBadger/blob/c136e5cd58dddfdd5b97b7c4b65e338f41d0b09d/packetSendTest.go –