Category Archives: Unix

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.

Migratie van VMWare image naar Virtualbox

Er komt hopelijk zeer snel het moment dat ik Virtualbox op FreeBSD stabiel genoeg vind om mijn ‘productie” machines op te gaan draaien. Vooral in combinatie met ZFS en dus snapshots is dat super. Nu draait echter mijn basis server voor virtualisatie nog met Debian en VMWare server, ook geen gekke combinatie hoor.

Om mezelf alvast een beetje voor te bereiden op een migratie naar Virtualbox heb ik net mijn proxyserver, welke voorzien is van FreeBSD 8.0 down gebracht en de VMDK’s die er bij horen overgezet naar onze Ubuntu desktop machine waar Virtualbox 3.0 op draait. Hierna heb ik binnen Virtualbox een nieuw systeem aangemaakt en daaraan de zojuist gekopieerde VMDK gekoppeld. Als je je originele virtuele disk hebt opgedeeld in stukken van 2GB, heb je dus meerdere VMDK bestanden. Virtualbox snapt dit, dus je kiest dan ook de ‘hoofd VMDK’. De naamgeving zal duidelijk aangeven welke je dient te kiezen.

Na het kiezen van de juiste disk is de machine klaar om te booten, wat ik mijn geval erg goed ging. Wel diende ik in de /etc/rc.conf de ifconfig_le0 entry te vervangen door ifconfig_em0, aangezien Virtualbox gebruikt maakt van een andere virtuele netwerk interface dan VMWare. Wel vondt FreeBSD dat er iets aan de hand was met de disk, dus draaide er een fsck op de achtergrond mee. Nadat deze fsck zijn werk gedaan had, draaide het systeem helemaal perfect.

Om nu een Virtualbox instance te draaien met VMWare bestanden vond ik ook niet echt netjes, dus nu ik toch aan het testen was, ook meteen maar gebruik gemaakt van de converteer mogelijkheid binnen Virtualbox. Dit is mogelijk met het commando VBoxManage, dit is wat de help aangeeft.

Usage: VBoxManage internalcommands <command> [command arguments]

converthd [-srcformat VDI|VMDK|VHD|RAW]
[-dstformat VDI|VMDK|VHD|RAW]
<inputfile> <outputfile>
converts hard disk images between formats

Het commando wat ik uitgevoerd heb is: VBoxManage internalcommands converthd -srcformat VMDK -dstformat VDI FreeBSD.vmdk FreeBSD.vdi Hierna heb ik de geconverteerde disk gekoppeld aan de virtuele proxy server in Virtualbox en de oude disk (FreeBSD.vmdk) verwijderd en het systeem geboot. Zoals gehoopt ging dit helemaal zonder enig probleem en dus draait het systeem zonder problemen. Een hele dikke plus voor Virtualbox!!

Webserver gemigreerd naar Ubuntu

Vorige week merkte ik problemen met mijn webserver, het filesysteem was op de een of andere manier corrupt geraakt. Dit had ik al eens eerder meegemaakt, het gaat om een virtuele FreeBSD server, en dan installeerde ik altijd een schone virtuele server en applicaties en rolde de backup er op uit. Meestal was ik dan redelijk snel weer up- and running.

Nu was ik begonnen aan het installeren van de nieuwe webserver met FreeBSD als OS, toen ik besloot om het deze keer eens anders aan te pakken en voor Ubuntu Server (9.10) te kiezen. Waarom?? Omdat het kan 🙂

De installatie van software op Ubuntu gaat lekker snel, aangezien je voornamelijk met binaries werkt en dus niet hoeft te compileren. Daardoor had ik de nieuwe webserver snel up- and running voor de sites die van buiten (internet) beschikbaar zijn. De interne sites zoals o.a. Nagios en Cacti kostten meer tijd, Cacti draait inmiddels maar Nagios nog niet. Nagios heb ik meteen geupgrade naar versie 3, aangezien deze standaard bij Ubuntu wordt meegeleverd, maar die is niet compatible met Fruity, de webgui die ik gebruikte voor de Nagios configuratie.

Nu blijkt dat Fruity inmiddels anders is gaan heten, namelijk Lilac, en nu ook Nagios3 ondersteund. Migratie van mijn oude configuratie blijkt echter niet lekker te gaan, dus die moet ik weer zo zachtjes aan bij elkaar gaan klikken in Lilac. Ach,  houdt je van de straat 🙂

Tot nu toe bevalt Ubuntu Server 9.10 in ieder geval, hopelijk is dat over 6 maanden nog steeds zo..

ubuntu_logo

Ubuntu 9.10

Vanochtend maar eens mijn virtuele Ubuntu aangeslingerd en deze geupdate naar 9.10. Die installatie is begonnen als versie 8.10, dus dit is al de tweede grote update. Ging wederom weer vlekkeloos. Binnenkort nog even uitzoeken welke Firefox plugins allemaal nodig zijn voor Ziggo Live TV voor mijn zwager.

Die draait al ruim anderhalf jaar met Ubuntu (normale gebruiker, geen computer wizard) en daar was de update ook wederom perfect door hemzelf uitgevoerd, zonder dat ik iets hoefde te doen. In de tijd dat daar nog Windows draaide, moest ik toch met enige regelmaat wat fixen, nu nagenoeg nooit meer. Voor die hele speciale dingen waarvoor je echt Windows nodig hebt, gebruiken ze een Windows binnen Virtualbox. Deze combinatie werkt echt perfect, voor zowel henzelf als mij.