vrijdag 18 februari 2011

IPv6 en Security - of - Waarom er meer firewalls nodig zijn nu internet op is

"Laatste IPv4-blocks zijn toegewezen". Zo verscheen er een artikel op tweakers.net op 3 februari. Dus, tijd om langzaam aan over te stappen op IPv6. Maar, wat voor gevolgen heeft die overstap voor de internettende thuisgebruiker?


Voordat we die vraag kunnen beantwoorden, is het misschien niet onverstandig om uit te leggen wat "IPv4" en "IPv6" zijn.

IPv4:
IPv4 staat voor "Internet Protocol version 4", en is een protocol dat op dit moment wereldwijd gebruikt wordt voor alle communicatie via het internet. Het protocol viert dit jaar zijn 30ste verjaardag, het stamt namelijk uit 1981. Het idee is dat elk systeem dat verbinding maakt met internet een zogenaamd "IP Adres" heeft, net als dat elk huis en bedrijf in de wereld een normaal adres heeft. Met dit adres kunnen systemen elkaar vinden, en met elkaar communiceren.

Het probleem is dat na 30 jaar, de spreekwoordelijke rek een klein beetje uit IPv4 is. Toen het verzonnen werd in 1981 hebben er enkele mensen over nagedacht, en die kwamen waarschijnlijk tot de conclusie dat: "Internet vast nooit zo groot zal worden". Over klassieke uitspraken gesproken.

In ieder geval, de address range (alle beschikbare adressen) ligt tussen de 0.0.0.0 en de 255.255.255.255. De snelle hoofdrekenaar komt dan uit op zo'n 4,294,967,296 beschikbare adressen. Dit klinkt als heel veel, maar als je bedenkt dat er eind 2010 ongeveer 6,500,000,000 aardbewoners waren, zie je al dat er in ieder geval niet genoeg is om iedere wereldbewoner één IP adres te geven. Helaas hebben sommige mensen meerdere computers, en ook dingen als telefoons en tablets die allemaal internet hebben.

Daarnaast zijn lang niet alle adressen daadwerkelijk beschikbaar. Sommige zijn gereserveerd voor systeemgebruik, voor interne netwerken, en zelfs sommige grote bedrijven hebben complete blokken gereserveerd.

NAT
Oké, dus er zijn niet genoeg IP adressen beschikbaar om elk apparaat een uniek adres te geven, dus hoe gaat dat dan op dit moment? Met een systeem dat men "Network Address Translation" (NAT) noemt. Wat doet NAT? In een notenschilletje, zorgt het ervoor dat meerdere apparaten gebruik kunnen maken van één IP adres (door bijvoorbeeld een router te gebruiken).

Veel mensen hebben dit thuis (zonder het te weten, vaak) draaien, om de computer en de laptop tegelijk op het internet te krijgen. Deze computer en laptop hebben dan IP adres 192.168.1.10 en 192.168.1.11 (bijvoorbeeld). Deze adressen hebben ze van de router gekregen, en zijn alleen voor intern gebruik. De router combineert het verkeer van beide computers en stuurt het onder één IP adres naar buiten. In de andere richting werkt dit omgekeerd. Of, om Wikipedia te citeren: "Network Address Translation (NAT, ook wel Network masquerading of IP-masquerading) is het vertalen van IP-adressen en vaak ook TCP/UDP-poortnummers uit de ene gescheiden reeks in de andere. Een veel gebruikt doel is het toelaten van meerdere gebruikers van een thuisnetwerk tot het internet via één IP-adres.". Zie ook: hier.


Hoe een router dit kan doen, zonder dat het verkeer in de war raakt? Elke computer met internetaansluiting heeft niet één opening (port) naar het internet, maar heeft er 65535 (65536 als je port 0 meetelt). Dat zijn dus 65535 in- en uitgangen van en naar het systeem. Deze opbouw wordt gebruikt om de verschillende soorten communicatie gescheiden te houden. Zo gaat bijvoorbeeld internet over port 80, SSL versleuteld internet over port 443, en e-mail (onder andere) over de poorten 25, 110, etc. Zonder firewall zijn deze ook allemaal bereikbaar als een computer eenmaal aan het internet hangt.

Stel, er hangt één computer aan het internet, zonder firewall, zonder router, met het IP adres "1.2.3.4". Deze computer is dan overal ter wereld te benaderen over elke willekeurige poort, omdat alle communicatie naar IP adres "1.2.3.4" automatisch bij die computer uitkomt. Nu komt er in dat huishouden een tweede computer bij, en hierdoor wordt er ook een router in het netwerk geïnstalleerd. Nu komt al het internetverkeer eerst binnen op de router, die vervolgens beslist of het doorgestuurd mag worden naar een computer in het netwerk. Ook al is het nooit zo bedoeld, zorgt dit toch voor een basis vorm van beveiliging, omdat je niet zomaar elke port van een systeem meer kan benaderen via het internet, ongeacht of het systeem een firewall draait of niet.

IPv6
Met de komst van IPv6, worden routers in prnicipe overbodig (het bedrijfsleven even buiten beschouwing gelaten). IPv6 heeft namelijk een andere structuur voor adressen. Waar een standaard IPv4 adres er zo uit ziet: "123.123.123.123", ziet een IPv6 adres er zo uit: "3ffe:6a88:85a3:08d3:1319:8a2e:0370:7344". Door deze nieuwe notatie komen er veel meer adressen beschikbaar. In plaats van de ~4,300,000,000 adressen van IPv4, biedt IPv6 de ruimte voor 50,000 quadriljoen adressen.. ..per gebruiker. Met een onuitspreekbaar totaal van: 3,4 × 1038.


Geweldig natuurlijk, dat betekent dat elk apparaat met internetverbinding met zijn eigen adres met het internet kan communiceren. Of niet?

IPv6 heeft naast dit grote voordeel ook een aantal nadelen. Eén daarvan is dat IPv4 hardware niet compatible is met IPv6. Iedereen die dit wil gebruiken zal dus veranderingen aan moeten brengen in zijn / haar netwerk. En dit geldt voor iedereen, dus ook voor alle Internet Providers. Dit is één van de voornaamste redenen dat IPv6 nog niet wereldwijd geïmplementeerd is.

Als het eenmaal zover is, betekent dit voor de (meeste) thuisgebruikers dus dat ze de router kunnen weghalen, deze is immers toch niet compatible met IPv6, en alle systemen direct aan het internet kunnen hangen. En dan zijn opeens alle systemen weer volledig bereikbaar vanaf elke locatie ter wereld, op elke poort. Tenzij er een (goede) firewall op het systeem wordt geïnstalleerd.

Prima, dan doen we dat toch? En daar zit een probleem. Lang niet elke gebruiker beschikt over de kennis om een firewall ( goed ) te kunnen configureren, waardoor je vaak één van de volgende situaties tegenkomt:

  • Er wordt geen firewall geïnstalleerd, want dat is te moeilijk. Gevolg: computer is open en bloot voor de buitenwereld.
  • Er wordt een firewall geïnstalleerd, maar niet goed ingesteld. Gevolg: er zijn nog steeds beveiliginsrisico's aanwezig
  • Er wordt een firewall geïnstalleerd, maar te strak afgesteld. Gevolg: internet werkt slecht / niet.
De slimme lezer heeft natuurljik allang bedacht: "Jamaar, Windows heeft toch standaard een ingebouwde firewall". Klopt, maar dit is een hele simpele firewall. Of deze sterk genoeg is tegen de steeds groter wordende gevaren op internet is maar de vraag. Een vraag die alleen de tijd kan beantwoorden.

"Dus we zijn gewoon de spreekwoordelijke pineut met IPv6?" Nee, dat niet. Het zal nog wel enige tijd duren voordat het ingevoerd is, en wie weet welke ontwikkelingen er dan al zijn. Time will tell. Het is in ieder geval een feit dat met deze vooruitgang (met als elke vooruitgang) er goed moet worden nagedacht over de beveiliging.

donderdag 18 november 2010

The Chronicles of XSS - HTML, Cookies and Javascript

"Why is that Narnia reference in the title?" you might ask yourself. Well, in the movie, the characters were able to enter a whole new world with new possibilities through a small wardrobe. That's what XSS does, open up new possibilities through a small hole.


First off, let me start with a little disclaimer. This blog is for educational purposes only. I am by no means an expert XSS exploiter or an experienced web developer. I just like to mess around on the internet. If you came here to learn how to exploit XSS, you came to the wrong place. I will not be naming websites or showing the actual XSS used. No websites were harmed in the making of this blog.

So what is XSS? Well, let's quote wikipedia on that one: "Cross-site scripting (XSS) is a type of computer security vulnerability typically found in web applications that enables malicious attackers to inject client-side script into web pages viewed by other users.". Does that make it clear? No, didn't think so. I'll try to explain using some real world examples.

As you may or may not know, the most basic language used to create websites is HTML. HTML contains everything a browser needs to know to display a website. It has the style, content and everything else in one file. The browser interprets this file and builds the website for you to browse. Now, some websites also have inputs available for their viewers. Think of things like contact forms, guestbooks, stuff like that. This is where the basics for XSS lie.



When you enter text into an input field and click "Submit", the data is sent to the webserver, who in turn gives your browser a new HTML file with the text you entered processed in it. So if you have signed the guestbook and posted "Great website!", that will show as the latest entry in that guestbook. That means that text is now somewhere in the HTML file. So what if you paste HTML into that text field, can you alter the website? Yes, and that's exactly what XSS is.

When you paste HTML code into an input form on a website that does not properly trim the input, you can "break open" the form and change the layout of the website itself. An example of a guestbook that is vulnerable to XSS exploiting:


This is your typical guestbook. You enter a name, a code to prove you're human, and your message. But what happens if you insert a prepared XSS string? Well then you can add pretty much anything you want outside of the input fields:


As you can see I have succesfully changed the lay-out of the website to show a big "Hello World" underneath the "Your Name:" field. While this change is only visible to me, and not dangerous to the website and it's users, it's still an opening. If I were to post this on the guestbook, all of the visitors to that website would see the broken lay-out.

So, we can change the appearance of a website to all it's users, now what? Well, the next step you could take is to check if you can execute javascript. Javascript is used on most websites, and supported by most browsers. If you want more information about Javascript, see this page. For this example I will use another website, this time the contact form:


And I insert my prepared XSS string with javascript code:

As you can see, I have made the webpage display a pop-up telling me it is exploitable. While this is harmless Javascript, you could theoretically inject any javascript. Javascript that steals your facebook cookies and places them somewhere for the attacker to take them, for example. Post this XSS exploit to a guestbook and everyone visiting that guestbook will have their facebook cookies uploaded somewhere else. So what, you might ask? Well, an attacker can use these cookies to access your facebook profile, thats what. How does that work exactly? Well, check out this blog.

The thing is, although this all sounds very complicated and high tech, almost everyone can do it. Here are some examples of exploitable sites I found on google when searching for "sign guestbook" on the first two or three pages:








Nice collection right? Like I said, I will not be naming these websites, but trust me when I say that some of these examples are not small, private websites. Some are actually quite large with a lot of visitors. A better known example of XSS recently is this twitter exploit where people managed to use XSS to create a self spreading "virus" on Twitter.

So how do you protect yourself from XSS? Well, first of all, make sure that your website is correctly sanitizing inputs. Don't put simple input forms everywhere and expect for them to be secure.

If you're a user? Well, that's a different story. Because XSS is HTML, and executed by the browser, most (all) security software packages will not detect them (or not untill they start calling malicious javascript files at least). So what then? Well, protect the browser itself. There are a number of add-ons for Firefox and Chrome to prevent XSS or even disable all scripts entirely. It's a bit like killing a fly with a shotgun, but it works.

The point of this blog is to create awareness among web designers to properly secure their websites and make sure that XSS is not possible. With properly executed XSS, anything is possible. As XSS is becoming more and more popular, more and bigger sites will get attacked. In the end, this is what a web designer wants someone using XSS exploits to see: