F5 BIG-IP load balancer persistence cookies

BIGipServerexample.com_80_pool=<encoded_ip>.<encoded_port>.<flags>Decode example
IP Address
Port
Decode BigIP cookie
Last updated

BIGipServerexample.com_80_pool=<encoded_ip>.<encoded_port>.<flags>Last updated
175667978.20480.000175667978 = 0x0A78B50A0A 78 B5 0A → reverse → 0A B5 78 0A0A = 10
B5 = 181
78 = 120
0A = 1020480 ÷ 256 = 80import socket
import struct
import re
from tabulate import tabulate
import sys
from termcolor import cprint, colored
def decode_bigip_cookie(cookie: str) -> dict:
"""
Decode F5 BIG-IP persistence cookies.
Supports:
- IPv4 BIGipServer cookies
- Route domains (rdX)
- Named or unnamed cookies
Returns a dict with decoded values or error info.
"""
result = {
"Backend IP": None,
"Backend Port": None,
"Route Domain": None,
}
try:
# Extract cookie value (after '=' if present)
value = cookie.split("=", 1)[-1]
# Extract route domain if present (rdX)
rd_match = re.search(r"rd(\d+)", value)
if rd_match:
result["Route Domain"] = int(rd_match.group(1))
value = value.replace(rd_match.group(0), "")
# Split numeric parts
parts = value.strip(".").split(".")
if len(parts) < 2:
raise ValueError("Invalid BIG-IP cookie format")
ip_part = int(parts[0])
port_part = int(parts[1])
# Decode IP (little-endian)
ip_hex = struct.pack("<I", ip_part)
backend_ip = socket.inet_ntoa(ip_hex)
# Decode port
backend_port = port_part // 256
result["Backend IP"] = colored(backend_ip, "red")
result["Backend Port"] = colored(backend_port, "green")
print("\nCookie: "+colored(cookie, "yellow"), end="\n\n")
print(tabulate([list(result.values()),], headers=[colored(h, "blue") for h in list(result.keys())], tablefmt="fancy_grid"), end="\n\n")
except Exception as e:
print("ERROR:"+str(e))
return result
if __name__ == "__main__":
decode_bigip_cookie(sys.argv[1])python3 BigIP_cookie_decoder.py <BigIP_cookie>