334 lines
5.8 KiB
Markdown
334 lines
5.8 KiB
Markdown
|
# Wireshark BPF Filters
|
||
|
|
||
|
* This is a collection of bpf and wireshark filters to find specific network situations.
|
||
|
|
||
|
## TCP Scans
|
||
|
|
||
|
* Recognize nmap scans in traffic
|
||
|
|
||
|
### TCP Connect Scan
|
||
|
|
||
|
* Has a TCP window size larger than 1024 bytes
|
||
|
|
||
|
Open TCP Port looks like
|
||
|
|
||
|
```sh
|
||
|
SYN -->
|
||
|
<-- SYN, ACK
|
||
|
ACK -->
|
||
|
```
|
||
|
|
||
|
or
|
||
|
|
||
|
```sh
|
||
|
SYN -->
|
||
|
<-- SYN,ACK
|
||
|
ACK -->
|
||
|
RST, ACK -->
|
||
|
```
|
||
|
|
||
|
Closed TCP Port
|
||
|
|
||
|
```sh
|
||
|
SYN -->
|
||
|
<-- RST, ACK
|
||
|
```
|
||
|
|
||
|
* Find TCP Connect scan pattern
|
||
|
```bpf
|
||
|
tcp.flags.syn == 1 && tcp.flags.ack == 0 && tcp.window_size > 1024
|
||
|
```
|
||
|
|
||
|
### TCP Half Open SYN Scan
|
||
|
|
||
|
* Lower or equal to 1024 bytes windows size
|
||
|
|
||
|
Open TCP Port looks like
|
||
|
|
||
|
```sh
|
||
|
SYN -->
|
||
|
<-- SYN, ACK
|
||
|
RST -->
|
||
|
```
|
||
|
|
||
|
Closed TCP Port looks like
|
||
|
|
||
|
```sh
|
||
|
SYN -->
|
||
|
<-- RST, ACK
|
||
|
```
|
||
|
|
||
|
* Find half open SYN scan pattern
|
||
|
```bpf
|
||
|
tcp.flags.syn == 1 && tcp.flags.ack == 0 && tcp.window_size <=1024
|
||
|
```
|
||
|
|
||
|
## UDP Scans
|
||
|
|
||
|
Open UDP Port looks like
|
||
|
|
||
|
```sh
|
||
|
UDP packet -->
|
||
|
```
|
||
|
|
||
|
A closed UDP port is recognizable by an ICMP Type 3 reply
|
||
|
|
||
|
```sh
|
||
|
UDP packet -->
|
||
|
<-- ICMP Type 3
|
||
|
```
|
||
|
|
||
|
* Find UDP scan pattern with closed ports as a reply
|
||
|
```bpf
|
||
|
icmp.type==3 and icmp.code==3
|
||
|
```
|
||
|
|
||
|
## ARP
|
||
|
|
||
|
* Find ARP requests
|
||
|
```bpf
|
||
|
arp.opcode == 1
|
||
|
```
|
||
|
|
||
|
* Find ARP responses
|
||
|
```bpf
|
||
|
arp.opcode == 2
|
||
|
```
|
||
|
|
||
|
* Find MAC address
|
||
|
```sh
|
||
|
arp.dst.hw_mac == 00:00:DE:AD:BA:BE
|
||
|
```
|
||
|
|
||
|
* Detect ARP Poisoning
|
||
|
```bpf
|
||
|
arp.duplicate-address-detected or arp.duplicate-address-frame
|
||
|
```
|
||
|
|
||
|
* Detect ARP Flooding
|
||
|
```bpf
|
||
|
((arp) && (arp.opcode == 1)) && (arp.src.hw_mac == <TARGET_MAC>)
|
||
|
```
|
||
|
|
||
|
## DHCP Analysis
|
||
|
|
||
|
* `dns` or `bootp`
|
||
|
|
||
|
* DHCP Request
|
||
|
```sh
|
||
|
dhcp.option.dhcp == 3
|
||
|
```
|
||
|
|
||
|
* DHCP ACK
|
||
|
```sh
|
||
|
dhcp.option == 5
|
||
|
```
|
||
|
|
||
|
|
||
|
* DHCP NAK
|
||
|
```sh
|
||
|
dhcp.option == 6
|
||
|
```
|
||
|
|
||
|
* Other DHCP options
|
||
|
* 12 Hostname.
|
||
|
* 15 domain name
|
||
|
* 51 Requested IP lease time.
|
||
|
* 61 Client's MAC address
|
||
|
* 50 Requested IP address.
|
||
|
* 51 assigned IP lease time
|
||
|
* 56 Message rejection details
|
||
|
|
||
|
## NetBIOS
|
||
|
|
||
|
* `nbns`
|
||
|
* NetBIOS details are the interesting info, for example
|
||
|
```sh
|
||
|
nbns.name contains "foo"
|
||
|
```
|
||
|
|
||
|
## Kerberos
|
||
|
|
||
|
* `kerberos`
|
||
|
|
||
|
* Search for cname information
|
||
|
```sh
|
||
|
kerberos.CNameString contains "foo"
|
||
|
```
|
||
|
|
||
|
* Find machine hostnames
|
||
|
```sh
|
||
|
kerberos.CNameString and !(kerberos.CNameString contains "$")
|
||
|
```
|
||
|
|
||
|
* Find Kerberos protocol version
|
||
|
```sh
|
||
|
kerberos.pvno == 5
|
||
|
```
|
||
|
|
||
|
* Domain name for a created Kerberos ticket
|
||
|
```sh
|
||
|
kerberos.realm contains ".foo"
|
||
|
```
|
||
|
|
||
|
* Service and domain name for the created Kerberos ticket
|
||
|
```sh
|
||
|
kerberos.SNnameString == "krbtg"
|
||
|
```
|
||
|
|
||
|
## Tunneled Traffic
|
||
|
|
||
|
### ICMP Exfiltration
|
||
|
|
||
|
* `icmp`
|
||
|
* Check for destination, packet length or encapsulated protocols
|
||
|
```sh
|
||
|
icmp && data.len > 64
|
||
|
```
|
||
|
|
||
|
### DNS Exfiltration
|
||
|
|
||
|
* `dns`
|
||
|
* Check for query length, unusual, encoded or long DNS address name queries
|
||
|
* Check for dnscat and dns2tcp or high frequency of DNS queries
|
||
|
```sh
|
||
|
dns contains "dns2tcp"
|
||
|
dns contains "dnscat"
|
||
|
dns.qry.name.len > 15 !mdns
|
||
|
```
|
||
|
|
||
|
## FTP Traffic
|
||
|
|
||
|
```sh
|
||
|
ftp.response.code == 211
|
||
|
```
|
||
|
* FTP response codes
|
||
|
* __211__, System status
|
||
|
* __212__, Directory status
|
||
|
* __213__, File status
|
||
|
* __220__, Service ready
|
||
|
* __227__, Entering passive mode
|
||
|
* __228__, Long passive mode
|
||
|
* __229__, Extended passive mode
|
||
|
* __230__, User login
|
||
|
* __231__, User logout
|
||
|
* __331__, Valid username
|
||
|
* __430__, Invalid username or password
|
||
|
* __530__, No login, invalid password
|
||
|
|
||
|
* Some FTP commands
|
||
|
* __USER__, Username
|
||
|
* __PASS__, Password
|
||
|
* __CWD__, Current work directory
|
||
|
* __LIST__, List
|
||
|
|
||
|
* FTP Commands can be found via
|
||
|
```sh
|
||
|
ftp.request.command == "USER"
|
||
|
ftp.request.arg == "password"
|
||
|
```
|
||
|
|
||
|
* __Bruteforce signal__, list failed login attempts
|
||
|
```sh
|
||
|
ftp.response.code == 530
|
||
|
```
|
||
|
|
||
|
* __Bruteforce signal__, List target username
|
||
|
```sh
|
||
|
(ftp.response.code == 530) && (ftp.response.arg contains "username")
|
||
|
```
|
||
|
|
||
|
* __Password spray signal__, List targets for a static password
|
||
|
```sh
|
||
|
(ftp.request.command == "PASS") && (ftp.request.arg == "password")
|
||
|
```
|
||
|
|
||
|
## HTTP
|
||
|
|
||
|
* `http` or `http2`
|
||
|
* HTTP methods can be searched for
|
||
|
```sh
|
||
|
http.request.method == "GET"
|
||
|
http.request
|
||
|
```
|
||
|
|
||
|
* HTTP response codes
|
||
|
* __200__, OK
|
||
|
* __301__, Moved Permanently
|
||
|
* __302__, Moved Temporarily
|
||
|
* __400__, Bad Request
|
||
|
* __401__, Unauthorised
|
||
|
* __403__, Forbidden
|
||
|
* __404__, Not Found
|
||
|
* __405__, Method Not Allowed
|
||
|
* __408__, Request Timeout
|
||
|
* __500__, Internal Server Error
|
||
|
* __503__, Service Unavailable
|
||
|
```sh
|
||
|
http.response.code == 200
|
||
|
```
|
||
|
|
||
|
* HTTP header parameters
|
||
|
```sh
|
||
|
http.user_agent contains "nmap"
|
||
|
http.request.uri contains "foo"
|
||
|
http.request.full_uri contains "foo"
|
||
|
```
|
||
|
|
||
|
* Other HTTP header parameters
|
||
|
* __Server__: Server service name
|
||
|
* __Host__: Hostname of the server
|
||
|
* __Connection__: Connection status
|
||
|
* __Line-based text data__: Cleartext data provided by the server
|
||
|
```sh
|
||
|
http.server contains "apache"
|
||
|
http.host contains "keyword"
|
||
|
http.host == "keyword"
|
||
|
http.connection == "Keep-Alive"
|
||
|
data-text-lines contains "keyword"
|
||
|
```
|
||
|
|
||
|
* HTTP User Agent and the usual tools to find
|
||
|
```sh
|
||
|
http.user_agent
|
||
|
(http.user_agent contains "sqlmap") or (http.user_agent contains "Nmap") or (http.user_agent contains "Wfuzz") or (http.user_agent contains "Nikto")
|
||
|
```
|
||
|
|
||
|
### HTTP and Log4j
|
||
|
|
||
|
```sh
|
||
|
http.request.method == "POST"
|
||
|
(ip contains "jndi") or ( ip contains "Exploit")
|
||
|
(frame contains "jndi") or ( frame contains "Exploit")
|
||
|
(http.user_agent contains "$") or (http.user_agent contains "==")
|
||
|
```
|
||
|
|
||
|
## HTTPS
|
||
|
|
||
|
* __Client Hello__, (http.request or tls.handshake.type == 1) && !(ssdp)
|
||
|
* __Server Hello__,(http.request or tls.handshake.type == 2) && !(ssdp)
|
||
|
|
||
|
* Put in pre-shared key via `Edit --> Preferences --> Protocols --> TLS`
|
||
|
* __Get the pre-shared key via__
|
||
|
```sh
|
||
|
ip xfrm state
|
||
|
```
|
||
|
* Alternatively use a Pre-Master-Secret log file to decode TLS
|
||
|
|
||
|
|
||
|
## Plain Text Credentials
|
||
|
|
||
|
`Tools` -> `Credentials` shows all the plain text credentials inside the pcap file
|
||
|
|
||
|
## Firewall ACLs Rules
|
||
|
|
||
|
Create FW ACL rules via `Tools` -> `Firewall ACL Rules`. Rule can be created for
|
||
|
* iptables
|
||
|
* IOS
|
||
|
* ipfilter
|
||
|
* ipfw
|
||
|
* pf
|
||
|
* netsh
|
||
|
|
||
|
|