Tag Archives: iPhone

iPhone OS fingerprinting

Probleem

Ik wil overal ter wereld mijn mail kunnen lezen, die via IMAPS door mijn mailserver beschikbaar wordt gesteld. Nu kan ik poort 993 open zetten voor de hele wereld, maar dat is ook weer zo… open 🙂

Oplossing

Op mijn FreeBSD firewall, die voorzien is van PF van OpenBSD, maak ik een regel aan die alleen toegang geeft aan iemand met een iPhone. PF heeft een prachtige optie, ‘Passive Operating System Fingerprinting‘, die dit mogelijk maakt.

Uitwerking

Bij PF wordt een pf.os bestand meegeleverd die door pf gesourced wordt bij het starten. In dit bestand staan de bekende OS fingerprints. Helaas staat hier geen iPhone, dus moet ik eerst de fingerprint van mijn iPhone uitzoeken. De manualpage van pf.os beschrijft hoe een fingerprint wordt opgebouwd en leert mij ook dat ik met de opdracht tcpdump -s128 -nv ‘tcp[13] == 2’ and port 993 de gevraagde informatie zichtbaar kan maken. Door vanaf mijn iPhone de mail op te halen, kreeg ik de volgende output:

14:08:10.048578 IP (tos 0x20, ttl 48, id 61345, offset 0, flags [DF], proto TCP (6), length 64) xx.xx.xx.xx.7854 > xx.xx.xx.xx.993: S, cksum 0x15c7 (correct), 1069626058:1069626058(0) win 65535 <mss 1360,nop,wscale 2,nop,nop,timestamp 840340694 0,sackOK,eol>

Volgens de pf.os manpage moet ik hier de volgende velden uit kunnen halen:

window: The TCP window size.
TTL: The IP time to live.
df: The presence of the IPv4 don’t fragment bit.
packet size: The size of the initial TCP packet.
TCP options: An ordered list of the TCP options.

Om de fingerprint compleet te maken, moet ik er dan zelf nog de volgende informatie aan toevoegen:

class: The class of operating system.
version: The version of the operating system.
subtype: The subtype of patchlevel of the operating system.
description: The overall textual description of the operating system, version and subtype.

Nu ik alle informatie beschikbaar had, kon ik daar de volgende regel voor in het bestand pf.os van maken:

65535:48:1:64:M1360:Darwin iPhone:10.0.0d3::iPhone 3.1.2

Nadat ik deze had toegevoegd werd met pfctl -s osfp duidelijk dat ik dan moest gaan filteren op Darwin iPhone. In mijn firewall staan nu dus de volgende regels voor IMAPS

rdr on $ext_if proto tcp from any to any port 993 -> $mailserver port 993
pass in on $ext_if proto tcp from any os “Darwin iPhone   10.0.0d3” to $mailserver port 993 flags S/SA keep state

Ik ben mij er van bewust dat ik op deze manier alle iPhone’s met firmware 3.1.2 toegang geef tot mijn IMAPS server, maar dat is voor mij een geaccepteerd risico. Uiteraard dien ik ook bij een firmware upgrade te controleren of de fingerprint gewijzigd is.

Update 29-12-2009
Helaas bleek deze vorm van filtering toch niet stabiel. De ene keer werkte het wel, de andere keer ineens weer niet. Ik heb er inmiddels vele uren ingestoken om uit te zoeken wat er nu precies fout gaat, maar tot nu toe heb ik het helaas niet voor elkaar gekregen. Ik heb daarom ook besloten om te stoppen met zoeken en de draad weer op te pakken na een upgrade van mijn firewall.

TinyBSD Access Point :: FreeBSD 8.0 Stable

Sinds afgelopen maandag ben ik de gelukkige eigenaar van een iPhone 3GS 32GB, maar zoals zo vaak met nieuwe gadgets, was ook hier wel weer wat aan de hand. De wireless verbinding op iphone viel na een paar seconden uit en dan duurde het weer even voordat er een verbinding tot stand werd gebracht die het weer een paar seconden volhield, niet echt waar ik op zat te wachten uiteraard.

Het AP wat ik gebruik is gebaseerd op een Wrap embedded bordje van www.pcengines.ch, die ik met de TinyBSD scripts heb voorzien van FreeBSD. Dat gaf mij gelukkig dus wel de mogelijkheid om fatsoenlijk te onderzoeken wat er nu precies mis ging. De logging liet mij het volgende zien

hostapd: ath0: STA xx:xx:xx:xx:xx:xx WPA: EAPOL-Key timeout
hostapd: ath0: STA xx:xx:xx:xx:xx:xx IEEE 802.1X: unauthorizing port
hostapd: ath0: STA xx:xx:xx:xx:xx:xx IEEE 802.11: deauthenticated due to local deauth request
hostapd: ath0: STA xx:xx:xx:xx:xx:xx IEEE 802.11: deassociated

Na wat Googlen kwam ik er achter dat een upgrade naar een nieuwere FreeBSD en dus ook allerlei recentere wifi gerelateerde code mijn probleem zeer waarschijnlijk zou oplossen. Het was al een hele tijd geleden dat ik voor het laatst een compact flash image had gemaakt, dus ik moest eerst een nieuwe build omgeving inrichten, dat heb ik gedaan door FreeBSD 8.0 te installeren in een verse virtuele (vmware) machine. Deze is na de installatie van de release CD meteen geupgrade naar 8.0 STABLE.

Helaas is de huidige TinyBSD configuratie niet meer compatible met 8.0, er worden onder andere kernel configuratie bestanden van FreeBSD 7.* meegeleverd. Ik vermoed de de meerderheid van de gebruikers inmiddels NanoBSD gebruiken ipv TinyBSD, toch jammer want er zit heel wat code van mijzelf in (de port build constructie is onder andere van mijn hand). Voor mijn wrap doosje heb ik een custom kernel config gemaakt op basis van FreeBSD 8.0 en tevens de tinybsd.basefiles geupdate aan de nieuwe situatie.

Het meeste spannende was trouwens de nieuwe Wifi configuratie in FreeBSD 8.0, die nu ook Virtual AP’s (VAP) ondersteund. Maar goed, dat is na wat lees- en uitzoekwerk ook weer gelukt. In de /etc/rc.conf staat nu (o.a.) het volgende:

cloned_interfaces=”bridge0″
ifconfig_ath0=”up”
ifconfig_sis0=”up”
wlans_ath0=”wlan0″
create_args_wlan0=”wlanmode hostap”
ifconfig_wlan0=”inet 10.10.10.10 netmask 255.255.0.0 ssid myssid channel 3 mode 11g”
ifconfig_bridge0=”addm wlan0 addm sis0 up”
hostapd_enable=”YES”

/etc/hostapd.conf bevat het volgende

interface=wlan0
driver=bsd
logger_syslog=-1
logger_syslog_level=0
logger_stdout=-1
logger_stdout_level=0
debug=4
dump_file=/tmp/hostapd.dump
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
ssid=myssid
wpa=2
wpa_passphrase=mysecret
wpa_key_mgmt=WPA-PSK

De meeste opties zullen voor zichzelf spreken, echter 2 wil ik hier nog wel uitleggen.

wpa

Hiermee geef je aan welke vorm van WPA je wilt ondersteunen op jouw AP. 1 is WPA(1), 2 is WPA2 en 3 is zowel WPA als WPA2.

wpa_key_mgmt

Hierbij heb je de opties WPA-PSK en WPA-EAP of beide. PSK staat voor pre-shared key en EAP voor Extensible Authentication Protocol. De eerste is voor thuisgebruik en houdt in dat de wireless client en de access point een wachtwoord delen en de tweede voor ‘enterprise’ gebruik waarbij de authenticatie plaats vindt door middel van radius.

Ik heb nu weer een vers (bridging) access point en zoals gehoopt en verwacht heeft mijn iPhone nu inderdaad geen problemen meer.