Expression | Description |
[x:y] | start at offset x from the beginning of packet and read y bytes |
[x] | abbreviation for [x:1] |
proto[x:y] | start at offset x into the proto header and read y bytes |
p[x:y] & z = 0 | p[x:y] has none of the bits selected by z |
p[x:y] & z != 0 | p[x:y] has any of the bits selected by z |
p[x:y] & z = z | p[x:y] has all of the bits selected by z |
p[x:y] = z | p[x:y] has only the bits selected by z |
The usual rules about operator precedence apply; nesting things inside brackets is probably a good plan. you'll probably want to put the filter into a file or at least single-quote it on the commandline to stop the shell from interpreting the metacharacters. !([:])& | |
Parts of an IP Packet | |
ip[0] & 0xf0 | High order nibble: IP version (4 = IPv4, 6 = IPv6) |
ip[0] & 0x0f | Low order nibble: Header Length (Common Value = 5, Multiplier 4, 20 byte header) |
ip[1] | Type of Service/QoS/DiffServ |
ip[2:2] | Total length of datagram in octets |
ip[4:2] | IP ID number |
ip[6] & 0x80 | Reserved (Evil bit) |
ip[6] & 128 != 0 | Evil bit set (RFC 3514 defines the evil bit as April Fools joke) |
ip[6] & 0x40 | Don't Fragment bit |
ip[6] & 0x20 | More Fragments bit |
ip[6:2] & 0x1fff | Fragment Offset (number of 8 octet blocks) |
ip[6:2] & 0x1fff != 0x000 | Fragment Offset is not 0 |
ip[6:2] & 0x3fff != 0 | Look for ALL fragmented ip packets |
ip[6] &0x20 = 0x20 or ip[6:2] &0x1fff != 0 | Look for more fragment bit set or fragment offset greater than 0 (Look for ALL fragmented ip packets) |
ip[6] &0x20 = 0 and ip[6:2] &0x1fff != 0 | Look for more fragment bit not set and fragment offset greater than 0 (Last fragment packets) |
ip[8] | TTL |
ip[9] | Protocol |
ip[9] = 0x01 | 1 = ICMP |
ip[9] = 0x02 | 2 = IGMP |
ip[9] = 0x06 | 6 = TCP |
ip[9] = 0x09 | 9 = IGRP |
ip[9] = 0x11 | 17 = UDP |
ip[9] = 0x2F | 47 = GRE |
ip[9] = 0x32 | 50 = ESP |
ip[9] = 0x33 | 51 = AH |
ip[10:2] | Header Checksum |
ip[12:4] | Source IP |
ip[16:4] | Destination IP |
ip[20..60] | No IP Header Options |
Parts of an ICMP Packet | |
icmp[0] | Type |
icmp[1] | Code |
icmp[2:2] | Checksum |
icmp[4...] | Payload |
Parts of a UDP Packet | |
udp[0:2] | source port |
udp[2:2] | destination port |
udp[4:2] | datagram length |
udp[6:2] | UDP checksum |
Parts of a TCP Packet | |
tcp[0:2] | source port |
tcp[2:2] | destination port |
tcp[4:4] | sequence number |
tcp[8:4] | acknowledgement number |
tcp[12] | header length (Multiplier 4) |
tcp[13] | tcp flags |
tcp[14:2] | window size |
tcp[16:2] | checksum |
tcp[18:2] | urgent pointer |
tcp[20..60] | options or data |
Other Examples | |
(tcp[13] & 0x02) != 0 | Contains SYN (maybe other stuff as well) |
(tcp[13] & 0x03) = 3 | SYN / FIN |
ip[12:4] = ip[16:4] | Land Attack |
(tcp[2:2] = 139) && (tcp[13] & 0x20 != 0) && (tcp[19] & 0x01 = 1) | Winnuke |
(tcp[13] & 0xe7) != 0 | Things other than ACK/PSH |
(ip[6] & 0x20 != 0) && (ip[6:2] & 0x1fff = 0) | Initial fragments |
(ip[6] & 0x20 != 0) && (ip[6:2] & 0x1fff != 0) | Intervening fragments |
(ip[6] & 0x20 = 0) && (ip[6:2] & 0x1fff != 0) | End of the fragment train |
(ip[0] & 0x0f) != 5 | Has IP Options (or is truncated, or is just some sort of freak...) |
((ip[6] & 0x20 = 0) && (ip[6:2] & 0x1fff != 0)) && ((65535 < (ip[2:2] + 8*(ip[6:2] & 0x1fff)) | Ping-O-Death (any oversized IP-transported data...) |
TCP Flags (Control Bits) | |||
CWR | ECE | URG | ACK | PSH | RST | SYN | FIN | |||
FIN = Finish | |||
SYN = Synchronize | |||
RST = Reset | |||
PSH = Push | |||
ACK = Acknowledgment | |||
URG = Urgent | |||
ECE = Explicit Congestion Notification Echo | |||
CWR = Congestion Window Reduced | |||
Filter | Flags | Binary Hex | Description |
tcp[13] = 0x01 | ---- ---F | 0000 0001 = 0x01 | FIN only |
tcp[13] = 0x02 | ---- --S- | 0000 0010 = 0x02 | SYN only |
tcp[13] = 0x03 | ---- --SF | 0000 0011 = 0x03 | SYN-FIN |
tcp[13] = 0x04 | ---- -R-- | 0000 0100 = 0x04 | RST only |
tcp[13] = 0x05 | ---- -R-F | 0000 0101 = 0x05 | RST-FIN |
tcp[13] = 0x06 | ---- -RS- | 0000 0110 = 0x06 | SYN-RST |
tcp[13] = 0x07 | ---- -RSF | 0000 0111 = 0x07 | SYN-FIN-RST |
tcp[13] = 0x08 | ---- P--- | 0000 1000 = 0x08 | PSH only |
tcp[13] = 0x10 | ---A ---- | 0001 0000 = 0x10 | ACK only |
tcp[13] = 0x12 | ---A --S- | 0001 0010 = 0x12 | SYN-ACK |
tcp[13] = 0x14 | ---A -R-- | 0001 0100 = 0x14 | RST-ACK (it happens) |
tcp[13] = 0x18 | ---A P--- | 0001 1000 = 0x18 | PSH-ACK |
tcp[13] = 0x20 | --U- ---- | 0010 0000 = 0x20 | URG only |
tcp[13] = 0x29 | --U- P--F | 0010 1001 = 0x29 | URG-PSH-FIN (nmap fingerprint packet) |
tcp[13] = 0x38 | --UA P--- | 0011 1000 = 0x38 | PSH-URG-ACK interactive stuff like ssh |
tcp[13] = 0x40 | -Y-- ---- | 0100 0000 = 0x40 | anything >= 0x40 has a reserved bit set |
Tcp[13] = 0x80 | X--- ---- | 1000 0000 = 0x80 | CWR only |
tcp[13] = 0xC0 | XY-- ---- | 1100 0000 = 0xC0 | Both ECN flags set |
tcp[13] = 0xFF | XYUA PRSF | 1111 1111 = 0xFF | FULL_XMAS scan |
tcp[13] & 1 != 0 | ---- ---F | 0000 0001 = 0x01 | FIN set |
tcp[13] & 2 != 0 | ---- --S- | 0000 0010 = 0x02 | SYN set |
tcp[13] & 4 != 0 | ---- -R-- | 0000 0100 = 0x04 | RST set |
tcp[13] & 8 != 0 | ---- P--- | 0000 1000 = 0x08 | PSH set |
tcp[13] & 16 != 0 | ---A ---- | 0001 0000 = 0x10 | ACK set |
tcp[13] & 32 != 0 | --U- ---- | 0010 0000 = 0x20 | URG set |
tcp[13] & 64 != 0 | -Y-- ---- | 0100 0000 = 0x40 | ECE set |
tcp[13] & 128 != 0 | X--- ---- | 1000 0000 = 0x80 | CWR set |
*Some examples are from
http://staff.washington.edu/dittrich/talks/core02/tools/tcpdump-filters.txt and reformatted into a table. This site also has some other useful info and examples.
No comments:
Post a Comment