guest@6admin.io:~$

Bash: obfuscation d'adresses IP

Une adresse IP n’a qu’une seule représentation “naturelle” (dotted quad: 192.168.1.1), mais elle a plusieurs représentations numériques que les navigateurs, les clients SSH et les parsers de logs acceptent aussi. Une IP peut s’écrire en décimal pur (3232235777), en hexadécimal (0xC0A80101), en octal ou en mixte (192.168.0x1.1). Les logs qui filtrent sur “192.168.1.1” ne filtrent pas sur “3232235777” et c’est le trou d’obfuscation.

Les représentations

# Décimal pur (uint32)
printf "%d\n" 3232235777
# 3232235777 = 192.168.1.1

# Hexadécimal
printf "0x%X\n" 3232235777
# 0xC0A80101

# Octal
printf "%o\n" 3232235777
# 30052000401

Le navigateur accepte http://3232235777/ exactement comme http://192.168.1.1/: il convertit le nombre en dotted quad avant la connexion. Le client SSH aussi, le client FTP aussi.

La conversion dans bash

De dotted quad vers décimal:

ip2dec() {
    local a b c d
    IFS=. read -r a b c d <<< "$1"
    echo $((a * 256**3 + b * 256**2 + c * 256 + d))
}

ip2dec 192.168.1.1
# 3232235777

De décimal vers dotted quad:

dec2ip() {
    local ip=$1
    echo "$((ip >> 24 & 255)).$((ip >> 16 & 255)).$((ip >> 8 & 255)).$((ip & 255))"
}

dec2ip 3232235777
# 192.168.1.1

Le filtre de log qui rate

Un log Apache contient:

3232235777 - - [01/Dec/2008:12:00:00] "GET /admin HTTP/1.1" 200

Le filtre qui cherche 192.168.1.1 ne trouve rien, parce que le log contient la forme décimale. L’obfuscation IP est une technique de bypass de filtre de log, de bypass de rule iptables (si la rule matche sur l’IP source en dotted quad) et de bypass de log analysis.

Le fix

Convertir TOUTES les IPs des logs en une forme unique (dotted quad) avant l’analyse:

# AWK qui convertit les décimaux en dotted quad
awk '{ if ($1 ~ /^[0-9]+$/ && $1 > 16777216) { ... } }'

Ou plus simple: normaliser les logs à l’ingestion (Logstash, Fluentd, rsyslog avec mmnormalize), pas à l’analyse.