mirror of
https://github.com/bettercap/bettercap.git
synced 2024-11-03 04:00:07 -08:00
275 lines
5.7 KiB
Go
275 lines
5.7 KiB
Go
package packets
|
|
|
|
import (
|
|
"github.com/google/gopacket"
|
|
"github.com/google/gopacket/layers"
|
|
"net"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestDot11Vars(t *testing.T) {
|
|
var units = []struct {
|
|
got interface{}
|
|
exp interface{}
|
|
}{
|
|
{openFlags, 1057},
|
|
{wpaFlags, 1041},
|
|
{fakeApRates, []byte{0x82, 0x84, 0x8b, 0x96, 0x24, 0x30, 0x48, 0x6c, 0x03, 0x01}},
|
|
{fakeApWpaRSN, []byte{
|
|
0x01, 0x00, // RSN Version 1
|
|
0x00, 0x0f, 0xac, 0x02, // Group Cipher Suite : 00-0f-ac TKIP
|
|
0x02, 0x00, // 2 Pairwise Cipher Suites (next two lines)
|
|
0x00, 0x0f, 0xac, 0x04, // AES Cipher / CCMP
|
|
0x00, 0x0f, 0xac, 0x02, // TKIP Cipher
|
|
0x01, 0x00, // 1 Authentication Key Management Suite (line below)
|
|
0x00, 0x0f, 0xac, 0x02, // Pre-Shared Key
|
|
0x00, 0x00,
|
|
}},
|
|
{wpaSignatureBytes, []byte{0, 0x50, 0xf2, 1}},
|
|
}
|
|
for _, u := range units {
|
|
if !reflect.DeepEqual(u.exp, u.got) {
|
|
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
|
|
}
|
|
}
|
|
}
|
|
|
|
func BuildDot11ApConfig() Dot11ApConfig {
|
|
ssid := "I still love Ruby, don't worry!"
|
|
bssid, _ := net.ParseMAC("pi:ca:tw:as:he:re")
|
|
channel := 1
|
|
encryption := false
|
|
|
|
config := Dot11ApConfig{
|
|
SSID: ssid,
|
|
BSSID: bssid,
|
|
Channel: channel,
|
|
Encryption: encryption,
|
|
}
|
|
|
|
return config
|
|
}
|
|
|
|
func TestDot11ApConfig(t *testing.T) {
|
|
ssid := "I still love Ruby, don't worry!"
|
|
bssid, _ := net.ParseMAC("pi:ca:tw:as:he:re")
|
|
channel := 1
|
|
encryption := false
|
|
|
|
config := Dot11ApConfig{
|
|
SSID: ssid,
|
|
BSSID: bssid,
|
|
Channel: channel,
|
|
Encryption: encryption,
|
|
}
|
|
|
|
var units = []struct {
|
|
got interface{}
|
|
exp interface{}
|
|
}{
|
|
{config.SSID, ssid},
|
|
{config.BSSID, bssid},
|
|
{config.Channel, channel},
|
|
{config.Encryption, encryption},
|
|
}
|
|
|
|
for _, u := range units {
|
|
if !reflect.DeepEqual(u.exp, u.got) {
|
|
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDot11Info(t *testing.T) {
|
|
id := layers.Dot11InformationElementIDSSID
|
|
info := []byte{}
|
|
|
|
dot11InfoElement := Dot11Info(id, info)
|
|
|
|
var units = []struct {
|
|
got interface{}
|
|
exp interface{}
|
|
}{
|
|
{dot11InfoElement.ID, id},
|
|
{dot11InfoElement.Length, uint8(len(info))},
|
|
{dot11InfoElement.Info, info},
|
|
}
|
|
|
|
for _, u := range units {
|
|
if !reflect.DeepEqual(u.exp, u.got) {
|
|
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestNewDot11Beacon(t *testing.T) {
|
|
conf := BuildDot11ApConfig()
|
|
seq := uint16(0)
|
|
|
|
err, bytes := NewDot11Beacon(conf, seq)
|
|
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
if len(bytes) <= 0 {
|
|
t.Error("unable to create new dot11 beacon")
|
|
}
|
|
}
|
|
|
|
func TestNewDot11Deauth(t *testing.T) {
|
|
mac, _ := net.ParseMAC("00:00:00:00:00:00")
|
|
seq := uint16(0)
|
|
|
|
err, bytes := NewDot11Deauth(mac, mac, mac, seq)
|
|
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
if len(bytes) <= 0 {
|
|
t.Error("unable to create new dot11 beacon")
|
|
}
|
|
}
|
|
|
|
func BuildDot11Packet() gopacket.Packet {
|
|
mac, _ := net.ParseMAC("00:00:00:00:00:00")
|
|
seq := uint16(0)
|
|
_, bytes := Serialize(
|
|
&layers.RadioTap{},
|
|
&layers.Dot11{
|
|
Address1: mac,
|
|
Address2: mac,
|
|
Address3: mac,
|
|
Type: layers.Dot11TypeMgmtDeauthentication,
|
|
SequenceNumber: seq,
|
|
},
|
|
&layers.Dot11MgmtDeauthentication{
|
|
Reason: layers.Dot11ReasonClass2FromNonAuth,
|
|
},
|
|
)
|
|
|
|
return gopacket.NewPacket(bytes, layers.LayerTypeRadioTap, gopacket.Default)
|
|
}
|
|
|
|
func TestDot11Parse(t *testing.T) {
|
|
packet := BuildDot11Packet()
|
|
|
|
ok, radiotap, dot11 := Dot11Parse(packet)
|
|
|
|
var units = []struct {
|
|
got interface{}
|
|
exp interface{}
|
|
}{
|
|
// testing for the known bad cases
|
|
{ok, false},
|
|
{radiotap, nil},
|
|
{dot11, nil},
|
|
}
|
|
|
|
for _, u := range units {
|
|
if reflect.DeepEqual(u.exp, u.got) {
|
|
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDot11ParseIDSSID(t *testing.T) {
|
|
conf := BuildDot11ApConfig()
|
|
seq := uint16(0)
|
|
|
|
err, bytes := NewDot11Beacon(conf, seq)
|
|
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
packet := gopacket.NewPacket(bytes, layers.LayerTypeRadioTap, gopacket.Default)
|
|
|
|
ok, id := Dot11ParseIDSSID(packet)
|
|
|
|
var units = []struct {
|
|
got interface{}
|
|
exp interface{}
|
|
}{
|
|
{ok, true},
|
|
{id, "I still love Ruby, don't worry!"},
|
|
}
|
|
|
|
for _, u := range units {
|
|
if !reflect.DeepEqual(u.exp, u.got) {
|
|
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDot11ParseEncryption(t *testing.T) {
|
|
ssid := "I still love Ruby, don't worry!"
|
|
bssid, _ := net.ParseMAC("pi:ca:tw:as:he:re")
|
|
channel := 1
|
|
encryption := true
|
|
|
|
config := Dot11ApConfig{
|
|
SSID: ssid,
|
|
BSSID: bssid,
|
|
Channel: channel,
|
|
Encryption: encryption,
|
|
}
|
|
|
|
seq := uint16(0)
|
|
|
|
err, bytes := NewDot11Beacon(config, seq)
|
|
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
packet := gopacket.NewPacket(bytes, layers.LayerTypeRadioTap, gopacket.Default)
|
|
_, _, dot11 := Dot11Parse(packet)
|
|
|
|
found, enc, cipher, auth := Dot11ParseEncryption(packet, dot11)
|
|
|
|
var units = []struct {
|
|
got interface{}
|
|
exp interface{}
|
|
}{
|
|
{found, true},
|
|
{enc, "WPA2"},
|
|
{cipher, "TKIP"},
|
|
{auth, "PSK"},
|
|
}
|
|
|
|
for _, u := range units {
|
|
if !reflect.DeepEqual(u.exp, u.got) {
|
|
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDot11IsDataFor(t *testing.T) {
|
|
mac, _ := net.ParseMAC("00:00:00:00:00:00")
|
|
seq := uint16(0)
|
|
_, bytes := Serialize(
|
|
&layers.RadioTap{},
|
|
&layers.Dot11{
|
|
Address1: mac,
|
|
Address2: mac,
|
|
Address3: mac,
|
|
Type: layers.Dot11TypeData,
|
|
SequenceNumber: seq,
|
|
},
|
|
)
|
|
packet := gopacket.NewPacket(bytes, layers.LayerTypeRadioTap, gopacket.Default)
|
|
station, _ := net.ParseMAC("00:00:00:00:00:00")
|
|
_, _, dot11 := Dot11Parse(packet)
|
|
if !Dot11IsDataFor(dot11, station) {
|
|
t.Error("unable to determine dot11 packet is for a given station")
|
|
}
|
|
}
|
|
|
|
// TODO: add Dot11ParseDSSet test. Not sure how to build proper
|
|
// example packet to complete this test, for now. <3
|
|
//func TestDot11ParseDSSet(t *testing.T) {
|
|
//}
|