Netzwerk virtueller Maschinenüberwachen
desecuritydata_securitynetzwerk-virtueller-maschinen-uberwachen

Was?

Nehmen wir eine normale Netzwerkkonfiguration, wie sie heute fast jeder zuhause hat: Ein paar Computer hängen an einem Router. Jeder dieser Computer kann Verbindungen auf den Ports 1-1024 durch den Router ins Internet schicken und antworten empfangen. Andersherum ist der Computer aber aus dem Internet nur dann erreichbar, wenn im Router die Firewall so konfiguriert ist, dass sie Anfragen auf bestimmten Ports an bestimmte Computer weiterleitet. Tut sie das muß auf dem Computer oft noch eine billige Softwarefirewall so konfiguriert werden, dass sie die Anfrage durch lässt und dann steht am Ende ein Dienst, zum Beispiel ein HTTP-Server, der die Anfrage entgegennehmen kann und antworten. Wie man sieht ist der Weg viel schwieriger und mit viel mehr Hürden versehen. Was also, wenn auf dem Rechner ein Programm läuft, dass nach draußen telefoniert? Kriegen wir überhaupt etwas davon mit? Die Antwort ist "meistens nein" und das stört mich.

Wie?

Verpacken des Betriebssystems, einschließlich seiner möglicherweise nicht vertrauenswürdigen Software in einer virtuellen Maschine und Umleiten sämlicher Anfragen aus der Maschine ins Netz über einen Proxyserver, der alles protokolliert. Nach einigem gebastel bin ich nun mit einer Standardkonfiguration von Squid und qemu-kvm ganz zufrieden, somal ich mir nur bei open source software sicherer sein kann, dass da nicht wieder eine backdoor drin steckt. Etwas länger hat allerdings der Aufruf von qemu-kvm gedauert, den ich deshalb für andere hier dokumentieren möchte.

bash -x qemu-kvm 
  -enable-kvm 
  -daemonize  
  -no-reboot  
  -no-shutdown 
  $(: hardware-profile) 
  -machine pc-0.15 
  -cpu host   
  -smp 4      
  -m 4G 
  -soundhw ac97 
  -clock unix 
  -drive index=0,if=virtio,cache=none,file=$1 
  -drive index=1,if=ide,cache=none,media=cdrom,file=$2 
  
  $(: enable usb2.0 support) 
  -usb 
  -usbdevice tablet 
  
  $(: use spice as display and hid device driver) 
  -spice port=5930,disable-ticketing 
  -vga qxl  
  -device qxl 
  -chardev spicevmc,id=vdagent,name=vdagent 
  $(: allow rdp and/or virtual network using interface tap0) 
  -net nic,model=virtio,name=network-rdp-interface,macaddr=$MAC1 
  -net 'type=user,restrict=yes,hostfwd=tcp::3389-:3389,hostfwd=tcp::3001-:3001,guestfwd=tcp:10.0.2.14:82-cmd:nc 127.0.0.1 3128' 
  $(: enable monitoring of the running client) 
  -balloon virtio 
  -monitor telnet:127.0.0.1:4444,server,nowait

Auf die Weise ist nur eine überschaubare Anzahl an Ports nach draußen offen. Entscheidend dazu ist die Option "restricted=yes" in der Netzwerkkonfiguration. Sie bewirkt, dass nur über Ports kommuniziert werden kann, die explizit angegeben sind. Dazu folgende Anmerkungen:

  • bash -x zeigt den Befehl bei der Ausführung an (gut, wenn man das fette Teil debuggen will)

  • Der Proxy ist innerhalb der virtuellen Maschine unter 10.0.2.14 auf Port 82 erreichbar (Port 82 ist nicht bei IANA reserviert).

  • Der Squid hat in seiner Standardkonfiguration den Port 3128 und läuft in meinem Fall auf dem gleichen Rechner

  • Über Port 3389 ist vom Host aus der RDP-Server innerhalb der virtuellen Maschine von außen erreichbar. Das ist bei Windows leider schneller als vnc und spice :/

  • Über Port 3001 erreiche ich vom Hostrechner aus den MS SQL Server, der innerhalb der virtuellen Maschine läuft.

  • Über Port 5930 erreicht man den host über das spice protokoll mit z.B. remote-viewer spice://localhost:5930/

  • Mit telnet localhost 4444 kann man sogar als Nutzer die laufende qemu-instanz erreichen und z.B. mit quit beenden. Das ist eine Sicherheitslücke! Verantwortungsbewusst verwenden, bitte!

  • man hätte laut guestfwd auch direkt an den Proxy weiterleiten können und sich den Umweg über netcat sparen, aber erstens bietet einem das so mehr Möglichkeiten, zweitens funktioniert es besser, weil bei jeder Anfrage eine neue Instanz von netcat gestartet wird, wodurch sich beachtlicherweise blocking vermeiden lässt!

    • Bei Windows XP wird proxycfg verwendet. Die Einstellungen vom IE lassen sich damit importieren.
    • Ab Windows Vista wird netsh set proxy ... verwendet.
    • In der Registry ist das unter HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInternet SettingsConnectionsWinHttpSettings zu finden (auch bei vista?)
  • Alternativ lässt sich Netzwerkverkehr auch mit Tools wie ArpON, TCPDump oder Wireshark überwachen und es gibt eine qemu-option, die -net dump,file=... und dazu gedacht ist.

Erste Erkenntnis

Firefox hat uns alle verraten! Unter about:config findet sich der Eintrag browser.safebrowsing.enabled, der Standardmäßig auf true gesetzt ist und bewirkt, dass Firefox ständig an google meldet, auf welchen Seiten man so herum surft. In der access.log vom squid äußert sich das in zahlreichen Anfragen an http://safebrowsing-cache.google.com/safebrowsing/. Google weiß also von jedem Firefoxnutzer seine Surfgewohnheiten, einschließlich potentiell peinlicher Sachen...

top