import 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])