<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Evilcoder.org &#187; Mostly-Harmless</title>
	<atom:link href="http://www.evilcoder.org/category/mostly-harmless/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.evilcoder.org</link>
	<description>My contribution to the World</description>
	<lastBuildDate>Sun, 29 Aug 2010 19:24:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Overwegingen voor als je misschien gehacked bent.</title>
		<link>http://www.evilcoder.org/2004/10/17/overwegingen-voor-als-je-misschien-gehacked-bent/</link>
		<comments>http://www.evilcoder.org/2004/10/17/overwegingen-voor-als-je-misschien-gehacked-bent/#comments</comments>
		<pubDate>Wed, 30 Nov -0001 00:00:00 +0000</pubDate>
		<dc:creator>Remko</dc:creator>
				<category><![CDATA[Downloads]]></category>
		<category><![CDATA[Mostly-Harmless]]></category>
		<category><![CDATA[Weblog]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Waarom hebben we dit document geschreven? Op veel mailinglijsten waar ik op geabonneerd ben lees ik regelmatig onderwerpen over machines die misschien gehacked zijn of op een andere manier niet meer betrouwbaar zijn. Mensen geven advies, en ook al bedoelen ze het goed, het is niet altijd de beste oplossing. Ik heb een SANS cursus [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-weight: bold;">Waarom hebben we dit document geschreven?</span></p>
<p>Op veel mailinglijsten waar ik op geabonneerd ben lees ik regelmatig onderwerpen<br />
over machines die misschien gehacked zijn of op een andere manier niet<br />
meer betrouwbaar zijn. Mensen geven advies, en ook al bedoelen ze het<br />
goed, het is niet altijd de beste oplossing.</p>
<p>Ik heb een SANS cursus gehad (Incident Handling) welke mijn mening ondersteund over hoe je<br />
moet reageren op een mogelijkerwijs misbruikte machine. De leraar daar<br />
was Arrigo Triulzi, een geweldige italiaanse kerel, een IDS expert.</p>
<p>Ik zal hun verhaal niet opnieuw vertellen, maar als je de informatie<br />
net zo goed wilt leren als ik heb gedaan zou je moeten kijken op de<br />
website van SANS. Deze geeft je cursus overzichten etc.</p>
<p>Nu terug naar het originele doel van dit document; Ik wil een duidelijk<br />
en makkelijk document creeeren welke iemand kan volgen als een machine<br />
niet meer betrouwbaar is.</p>
<p>Nog een extra notitie: Dit document is voornamelijk gericht op een Unix<br />
omgeving. Het zou ook gebruikt kunnen worden voor Windows of andere OS<br />
omgevingen maar daar ben ik niet zeker van. Ik weet niet genoeg van die<br />
besturingssystemen om daar een correcte uitspraak over te doen. Als jij<br />
dat wel kan, neem dan contact met me op en ik pas de documentatie aan.</p>
<p><span style="font-style: italic;"><span style="font-weight: bold;">Laatst bijgewerkt op: 17 oktober 2004 door Remko Lodder</span></span></p>
<p><span id="more-725"></span><br /><span style="font-weight: bold;">Ik denk dat mijn server gehacked is, wat moet ik doen?</span></p>
<p>Je hebt meerdere opties, omdat mensen thuis meestal minder interesse hebben in data etc. dan een bedrijf. Daarom zullen we het volgende in meerdere secties opdelen.</p>
<p><span style="font-style: italic;">Bedrijven:</span></p>
<p>Als je voor een bedrijf werkt en data is essentieel voor je bedrijf, zou je eerst contact moeten opnemen met de lokale politie. Deze kunnen helpen en assisteren in wat je zou moeten doen. Over het algemeen zullen ze de volgende dingen van je vragen:</p>
<p>Haal de machine offline. Haal alle kabels eruit beginnende met de stroomkabel! Op deze manier kunnen we zeker zijn dat de data niet meer aangepast wordt. Waarom doen we dat? Nou de geinstalleerde software zou zo geprogrammeerd kunnen zijn om naar buiten te bellen wanneer er een kabel verwijderd wordt. Of hij verstuurd een email naar de andere persoon, die je machine onbetrouwbaar heeft gemaakt. Als je de stroom eraf haalt kan het apparaat niet veel meer he? (Vergeet de UPS niet!).</p>
<p>Maak een directe copy van de huidige disk, bijvoorbeeld, start met een Live-CD (zodat de originele disk niet gestart wordt en informatie gaat versturen naar de persoon die je machine onbetrouwbaar heeft gemaakt). Doe daarna iets wat dd=/dev/ad0 of/dev/ad1 representateert. Dit kopieert elke bit op de harddisk naar een andere harddisk (evenals vrije ruimte). De originele harddisk zou bewaard moeten blijven op een veilige plek en niet meer aangeraakt moeten worden. Gebruik de eerste backup disk om meerdere backups te creeeren indien nodig. Gebruik daarna hulpmiddelen om te zien wat er op de harddisk staat. De hulpprogramma&#8217;s die je kan gebruiken volgen later.</p>
<p>De politie wilt mogelijk de originele disk meenemen, persoonlijk denk ik dat dat niet echt een p robleem is. Zorg er wel voor dat men tekent (Een Non Disclosure Agreement en misschien iets als &#8216;De politie heeft de disk meegenomen en gaat hem onderzoeken&#8217;). Je hebt de backups nog die je zelf kan onderzoeken.</p>
<p><span style="font-style: italic;">Thuis-gebruikers:</span></p>
<p>Als je een thuis-gebruiker bent kan het voorkomen dat de data op de disk niet zo belangrijk is als bij een bedrijf. Als je toch belangrijke data op je disk had staan, volg dan dezelfde acties als ware het een bedrijf. Persoonlijk zou ik aanraden dat je een backup-disk gebruikt waarmee je bijna hetzelfde doet als hierboven. Alleen meestal heeft een Personal Computer niet zoveel vitale informatie dus dan kan het bellen van de politie overbodige moeite zijn.</p>
<p>Start opnieuw met een Live-CD en doe forensisch onderzoek met de programma&#8217;s die later beschreven worden.<br /><br style="font-weight: bold;" /><span style="font-weight: bold;">Ok, nu hebben we onze kritieke systemen gebackupped, met welke software kunnen we zien wat er gebeurd is?</span></p>
<p>Als eerste zou je evoor moeten zorgen dat je een aantal lege CD&#8217;s hebt die gebrand mogen worden. Deze mogen alleen gebrand worden op een machine die totaal geen toegang heeft tot de mogelijkerwijs gehackte machine. Waarom? Zo kunnen we &#8216;zeker&#8217; zijn dat de data die we op de CD branden geldig is en niet veranderd door wie dan ook.</p>
<p>Behalve bovenstaand argument is de CD eenmalig te beschrijven. Dus in het geval dat er iets misgaat is de CD nog intact en de data daarop ook.</p>
<p>We zullen een aantal verschillende programma&#8217;s noemen, de bedoeling van het programma noemen en waar je ze kan downloaden. Natuurlijk ontbreekt een linkje waar je meer informatie kan vinden (als de download locatie verschilt) over het programma. Let op, we hebben een aantal uitgebreide ISO&#8217;s gevonden die Live-CD mogelijkheden bieden voor je machine, die alle security programma&#8217;s hebben die je nodig hebt ( Knoppix, zie hieronder ). Om die redenen zullen we niet al te veel programma&#8217;s op deze pagina plaatsen.</p>
<p>Hieronder is een korte samenvatting van enkele applicaties. Voor een volledige lijst van allround applicaties zie <a href="http://www.forensics.nl/toolkits/">http://www.forensics.nl/toolkits/</a> , en voor een complete lijst van hulpprogramma&#8217;s<br />die goede services leveren maar standalone zijn zie <a href="http://www.forensics.nl/tools/">http://www.forensics.nl/tools/</a></p>
<p>Die machine wordt onderhouden door Jacco Tunnissen, en dat doet hij perfect!</p>
<p>&nbsp;&nbsp;&nbsp; * The coroners toolkit, TCT, is een veelgebruikt programma om disken te onderzoeken die mogelijk te maken hebben gehad met een vijandig persoon. Het kan data lezen ook al is de disk geformateerd (tot de disk een aantal keer geformateerd is zodat de actieve bits overschreven zijn). Het heeft tot doel om forensisch onderzoek te doen op je computer. Echter het is een oudere versie, hieronder zie je 2 alternatieven die nieuwer zijn dan dit programma. Je kan het <a href="http://www.porcupine.org/forensics/tct.html">hier</a> vinden.<br />&nbsp;&nbsp;&nbsp; * Helix, is gebaseerd op Knoppix, welke geweldige hardware detectie levert etc. Het is ontworpen om de machine zelf NIET aan te raken zodat je correct forensisch onderzoek kan plegen. Je kan het <a href="http://www.e-fense.com/helix/">hier</a> vinden.<br />&nbsp;&nbsp;&nbsp; * The Sleuth Kit, is gebaseerd op de TCT commandline programma&#8217;s. Het is nieuwer dan TCT. Momenteel analyseert het NTFS, FAT, UFS, EXT2FS en EXT3FS. Je kan het <a href="http://www.sleuthkit.org/">hier</a> vinden.<br />&nbsp;&nbsp;&nbsp; * Seekerkit, een Live ISO CD die verschillende securitymogelijkheden naar je computer brengt. Het heeft LSOF bij zich welke je in staat stelt om te zien welke processen er draaien en luisteren. Dit werkt echter alleen op de machine zelf, dus dat is niet echt een geweldige oplossing. Je kan het <a href="http://www.whitehats.ca/main/members/Seeker/seeker_seekerkit/seeker_seekerkit.html">hier</a> vinden.<br />&nbsp;&nbsp;&nbsp; * Knoppix-std, nog een Live ISO CD die je volledige security mogelijkheden geeft voor je machine. Het heeft een aantal security programma&#8217;s bij zich die je echt nodig hebt om forensisch onderzoek te doen. Zie <a href="http://www.knoppix-std.org/tools.html">hier</a> voor meer informatie.</p>
<p>Buiten de bovenstaande software is er een project die onderzoek doet naar dit soort activiteiten. Ze heten &quot;<a href="http://www.honeynet.org">The Honeynet Project</a>&quot; en hebben een goede set aan documentatie bij zich. In 2001 had het project een wedstrijd over forensisch onderzoek welke je <a href="http://www.honeynet.org/challenge/">hier</a> kan vinden.</p>
<p>Ik denk dat je met dit document een complete set van ideeen hebt met wat je kan doen in het geval dat je denkt dat je server of personal computer mogelijkerwijs gehacked is en je zeker wilt weten dat alles nog correct is. Natuurlijk kan je de PC zelf opstarten en proberen wat backdoors te verwijderen of andere dingen. Maar het probleem blijft dat de machine misschien meerdere backdoors heeft waardoor hij onbetrouwbaar blijft. Ook weet je nooit zeker of men wat met je data heeft gedaan dus, in een bedrijfsituatie, misschien doet men transacties van klanten naar hen eigen geheime bankrekening.</p>
<p>Als je denkt dat ik iets kleins of groots gemist heb, neem dan contact met me op! <img src='http://www.evilcoder.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Dit document is vertaald naar het nederlands door Remko Lodder, tevens de originele auteur van het door DSINet.org geleverde artikel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilcoder.org/2004/10/17/overwegingen-voor-als-je-misschien-gehacked-bent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nieuwe technology: SPF / Caller ID (Dutch)</title>
		<link>http://www.evilcoder.org/2004/06/13/nieuwe-technology-spf-caller-id-dutch/</link>
		<comments>http://www.evilcoder.org/2004/06/13/nieuwe-technology-spf-caller-id-dutch/#comments</comments>
		<pubDate>Wed, 30 Nov -0001 00:00:00 +0000</pubDate>
		<dc:creator>Remko</dc:creator>
				<category><![CDATA[Mostly-Harmless]]></category>
		<category><![CDATA[Weblog]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Waarom is dit document geschreven? Ik heb een tijdje de mailing list van SPF gevolgd ,en vond het concept erg interessant. Net zoals overige &#8216;bekendere&#8217; personages op internet heb ik redelijk last van spam. Een redelijk groot deel van mijn email is achteraf spam. Dit is een probleem dat alleen maar groter zal worden indien [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Waarom is dit document geschreven?</strong></p>
<p>Ik heb een tijdje de mailing list van SPF gevolgd ,en vond het concept erg interessant. Net zoals overige &#8216;bekendere&#8217; personages op internet heb ik redelijk last van spam. Een redelijk groot deel van mijn email is achteraf spam. Dit is een probleem dat alleen maar groter zal worden indien er niets tegen gedaan wordt. Vandaar dat ik dacht voor <a href="http://www.dsinet.org/">DSINet.org</a> hier een artikel over te schrijven.&nbsp; Het bevind zich nog in ontwikkel fase, maar zal hier ter preview worden aangeboden, waarbij critische lezers commentaar kunnen en mogen geven. Ik heb onlangs ook e.e.a aan discussies gelezen dat er concept fouten in SPF zitten. Helaas ben ik er nog niet achter waar dat precies op gebaseerd is. Voel je vrij om me hierover te informeren zodat ik dit documentje kan uitbreiden met die informatie.</p>
<p>SPF staat voor Sender Policy Framework. Dit houd in dat elke afzender vanaf het juiste domain moet komen. Zo is het mogelijk om een deel van de hedendaagse spam tegen te gaan. <br />Caller-ID gaat emailheaders na, om te kijken of bijvoorbeeld een email van PayPal inderdaad van PayPal komt. </p>
<p><span id="more-323"></span>
<p>Hoe werkt het?</p>
<p>SPF:<br />Er wordt een verbinding opgezet door een mailserver. Er gebeurd dan het volgende, de afkomst machine is een .willekeurigeprovider.nl machine welke email wilt versturen met als afkomst adres: remko @ dsinet.org.<br />Op dit moment komt SPF in actie, er wordt door SPF gecontroleerd aan de hand van een&nbsp;dns query naar de nameservers van het domain, of de willekeurigeprovider.nl machine inderdaad opgegevens is als EEN van de emailmachine&#8217;s van dsinet.org. Als dit klopt wordt het emailtje doorgestuurd, en anders wordt hij gereject of gebounced.<br />Dit heeft grote voordelen met oog op spam bestrijding. Willekeurige machines kunnen zo niet meer yahoo.com nabootsen.</p>
<p>Caller-ID:<br />Er wordt een verbinding opgezet door een mailserver, hierop wordt een legale gebruiker als From adres ingevuld. Alleen in de email zelf wordt het from adres aangepast naar dat van bijvoorbeeld: helpdesk @ paypal.com met als onderwerp: Uw creditcard gegevens<br />zijn verlopen. In het emailtje zelf staat dan iets als: Uw gegevens zijn verlopen, zou u zo vriendelijk willen zijn om op onderstaande link te klikken en daar uw gegevens nogmaals te bevestigen. Doordat Caller-ID controleert of deze gegevens kloppen (Aangepaste from , is dat inderdaad vanaf de paypal.com mailserver verstuurd?) kan dit soort mogelijke spam en privacy lekken voorkomen worden.<br />Momenteel staat Caller-ID onder patent van Microsoft.</p>
<p>Hoe betrouwbaar is het?</p>
<p>Op dit moment is het redelijk betrouwbaar echter, er zijn natuurlijk nogal wat dingen op te noemen waarmee het mis kan gaan. Als een mailserver gehacked wordt (De &quot;geauthoriseerde&quot; mailserver)<br />dan bestaat altijd nog de kans dat daarover heen alsnog spam wordt verstuurd. De nieuwe methoden kunnen hier niet veel tegen doen. Het is alleen een extra middel om Spam-emails tegen te gaan, <br />geen wondermiddel om alle spam in de wereld in EEN klap tegen te gaan.</p>
<p>Natuurlijk zijn er ook negatieve dingen, want men kan nog steeds door de ISP heen spammen. Dit valt niet snel uit te schakelen door SPF en Caller-ID alleen. Je hebt hier een keten van trusted applications voor nodig. Oa SMTP AUTH zou hier al een stukje verbetering in brengen en een &quot;Friend network&quot; ook. Hier moet je natuurlijk wel een stuk verder denken dan even simpel authenticaten en een simpel trusted netwerkje bouwen. </p>
<p>Meer informatie is vindbaar op<br /><a href="http://spf.pobox.com/">de SPF homepage</a></p>
<p>Remko Lodder 13/06/2004</p>
<p>Edit: 16/06/2004, commentaar toegevoegd vanuit Stefjuh (RooT66/Mostly-Harmless)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilcoder.org/2004/06/13/nieuwe-technology-spf-caller-id-dutch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Considerations when you think you might be hacked</title>
		<link>http://www.evilcoder.org/2004/06/13/considerations-when-you-think-you-might-be-hacked/</link>
		<comments>http://www.evilcoder.org/2004/06/13/considerations-when-you-think-you-might-be-hacked/#comments</comments>
		<pubDate>Wed, 30 Nov -0001 00:00:00 +0000</pubDate>
		<dc:creator>Remko</dc:creator>
				<category><![CDATA[Mostly-Harmless]]></category>
		<category><![CDATA[Weblog]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Why did we write this document? On many many mailinglists that I am on, I read topics about machine&#8217;s that might be hacked, or in any other way not reliable anymore. People give advise, and although they do their best to help, it&#8217;s not always the best solution. I had a SANS class (Incident Handling) [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Why did we write this document?</strong></p>
<p>On many many mailinglists that I am on, I read topics about machine&#8217;s that might be hacked, or in any other way not reliable anymore. People give advise, and although they do their best to help, it&#8217;s not always the best solution. </p>
<p>I had a SANS class (Incident Handling) which supports my opinion in how to act upon a potentially abused machine. The teacher there was Arrigo Triulzi, a great italian guy who is a IDS expert. </p>
<p>I will not retell their story, but if you wish to learn the information as best as I did then checkout <a href="http://www.sans.org/">this</a>&nbsp;website. It will give you courses overview etc.</p>
<p>Now back to the original intention of this file; I want to create a clear and easy document which one could follow when a machine is not trusted anymore. </p>
<p>One more note: This document is mostly looking towards an unix environment. It might also be appliable for a Windows or other OS environments, but I am not sure. I don&#8217;t know enough about those to make correct assumptions for that. If you can do that, please contact me and I will update the documentation</p>
<p><span style="FONT-STYLE: italic"><span style="FONT-WEIGHT: bold">Last updated: 28 December 2004 by Remko Lodder (added prevention section and added some more info in the company section)</span></span></p>
<p>Last change was triggered by: Leo (Thanks)</p>
<p><span id="more-322"></span>
<p><strong>I think my server might be hacked, what should i do?</strong></p>
<p>There are several options you can have. Since people at home tend to care less about data etc. than a company. We will devide this piece into some sections.</p>
<p><em>Company:</em></p>
<p>If you work for a company, and the data is essential. You should first contact the local police department. They can help and assist you in what to do. Mostly the things they want you to do represent this:</p>
<p>Take down the current running machine, unplugging ALL cables starting with the powercable!. This way we can be sure that the data does not get altered anymore. Why do we want that? Well the software installed could be programmed to dial out when a network cable is taken out, or send an &#8216;email&#8217; to the other person whom made your machine unreliable. When you disconnect the power, it can&#8217;t do much anymore huh? (dont forget UPS&#8217;es!). Although one could argue that you should savely disable the computer first it is <strong>not </strong>advised that you do this. You are advised to &#8216;corrupt&#8217; data if needed. Because there might be scripts running that looks for a shutdown and then destroy any evidence. That way a clean shutdown would save data, but make it impossible to know what happened, what went wrong and thus make it more easy that you become a victim again (since you don&#8217;t know what went wrong).</p>
<p>Make a dedicated copy of the current disk, for example boot from a Live-CD (so that the original disk is not booted and sending information to the person whom made your system untrustable). Then use dd if=/dev/ad0 of=/dev/ad1 (for example). This copy&#8217;s every bit (even blank space) to the other harddisk. The original harddisk should be stored in a safe place and not to be touched again. Use the first backup disk to create multiple backups if neccessary. Then use tools to see what&#8217;s on the disk. The tools which you can use will be described later on.</p>
<p>The police might want to take the original disk, personally i think giving them the original disk isn&#8217;t that much of an issue. Make sure they sign for it (Non Disclosure Agreement and perhaps something like &quot;The police took the harddisk and is going to investigate&quot;). You still have the backups you investigate yourself.</p>
<p>Now for large companies it might be that&nbsp;there is a seperated department handling these kind of things. You should contact them first! They tell you what&nbsp;you need to do and guide you. If they feel appropriate to inform the police, they&nbsp;will handle that. Do not think you know better then them, large companies hire good people&nbsp;who are trained in working on these issues and they are much better then you (probably).&nbsp;</p>
<p><em>Home-user</em></p>
<p>If you are a home user then the data on the disk might not be that important as in a company. If you did have vital data on the disk, then use the same actions as listed for a company. Personally i would recommend that you use a backup disk in which you will do almost the same as above for the company. Only most of the time a personal computer does not store vital information, so calling the police might be a waste of time. (In your country the police might not be pleased if you contact them. Please check if they do handle these kind of incidents before calling them).</p>
<p>Again boot with an Live-CD and do forensics with the tools that will be described later on.</p>
<p>{mospagebreak}</p>
<p><strong>Ok now we have backupped our critical systems, which software can we use to check what happened?</strong></p>
<p>First of all, you should have some CD&#8217;s ready to be burned in a computer which has no access at all to the potentially hacked machine. Why? So we can be &#8216;sure&#8217; that the data we burn on the disc will be valid, and not tampered with.</p>
<p>Besides the above argument, the CD we use cannot be written upon again, so in case something goes wrong, the CD is left intact.</p>
<p>We shall use some different tools here, listing their names, goals, and location where you can download them and a location for more information (if different from the download location). Note that we found some extensive ISO&#8217;s that provide Live-CD Features for your machine, that have all security tools you want (Knoppix, see below). Therefor we dont put too many applications on this page.</p>
<p>Below is a short summary of some applications. For a complete list of&nbsp; allround applications checkout<br /><a href="http://www.forensics.nl/toolkits/">http://www.forensics.nl/toolkits/</a><br />And for a complete list of tools that offer good services but are standalone checkout<br /><a href="http://www.forensics.nl/tools/">http://www.forensics.nl/tools/</a></p>
<p>That host is being maintained by Jacco Tunnissen, and he did a great job on that!</p>
<ul>
<li>The coroners toolkit, TCT, is a commonly used tool for searching disks that had an encouter with a potential hostile person. It can read data even if it&#8217;s formated etc, untill the disk get whiped a couple of times so the active bits will be overwritten. It has the goal to let you do forensics on your computer. Though it&#8217;s a old version, below will be 2 alternatives that are more up to date then this one. You can find it <a href="http://www.porcupine.org/forensics/tct.html">here.</a> </li>
<li>Helix, is based upon Knoppix, which offers great hardware detection etc. It has been designed to especially NOT touch the host computer so that makes sure you can do proper forensic research. You can find it <a title="Helix" href="http://www.e-fense.com/helix/" target="_blank">here</a>.</li>
<li>The Sleuth Kit, is based upon the tct commandline tools. It&#8217;s more up to date then TCT. It currently analyze&#8217;s NTFS, FAT, UFS, EXT2FS, and EXT3FS. You can find it <a title="Sleuthkit" href="http://www.sleuthkit.org/" target="_blank">here</a>.</li>
<li>Seekerkit, a live ISO cd that brings some securityfeatures to your machine. It has LSOF packed with it , that enables you to see what processes there are running and listening. Though that only works on the host machine, so that isn&#8217;t the most pretty option. You can find it <a href="http://www.whitehats.ca/main/members/Seeker/seeker_seekerkit/seeker_seekerkit.html">here.</a> </li>
<li>Knoppix-std, another live ISO CD that brings full security features to your machine. It has several security tools packed inside it and they really are required if you need to do forensics. Check it out <a href="http://www.knoppix-std.org/tools.html">here.</a>&nbsp;</li>
</ul>
<p>Apart from the above software, there is a project which does research on these kind of activities on the internet. They are called <a href="http://www.honeynet.org/">The Honeynet Project</a> and have a great set of documentation listed. In 2001 the project featured a forensics challenge which can be <a href="http://www.honeynet.org/challenge/">found here.</a></p>
<p>{mospagebreak}</p>
<p><strong>How can i try to prevent these kind of situations?</strong></p>
<p>Although preventing issues like this is not part of the scope of the document, it was requested many times so perhaps we should write something about that.</p>
<p>Preventing is a way to decrease the possibilty that somene hacks into your system, it does <strong>not </strong>guarentee that someone will stay outside!</p>
<p>If you want to prevent unauthorized changes you should install detection software like Tripwire or Aide. They can see what files changed by making a hash of the file. The hash is unique for every file and is based on the creation time, modification time, size, permissions etc. So if you change a file the hash will change. The application will notice that and generate a warning that you configured.</p>
<p>It is also a good idea to monitor your processes so that only regular processes are running (for example: if you have a mailserver and httpd is suddenly running&nbsp; you want a warning because that might indicate that someone is doing nasty tricks with your machine). </p>
<p>And apart from that it would be a good idea to monitor logfiles with a application like Swatch. When a sshd breakin attempt occurs the entire night every 2 seconds, it might indicate that someone is brute forcing your machine to gani access. You want to get alerted for that.</p>
<p>Make sure that your applications are designed with security in mind, they should not give bogus output when you press a help button and must be well tested (let someone audit the code for example). Also if you develop applications on your own, please try to document what messagse could occur, because when something else is being logged that might again indicate that someone is doing nasty tricks.</p>
<p>I think that with this document you have a rather complete set of ideas what you can do in case your server or personal computer might be hacked and you want to be on the safe side. Ofcourse you can boot the PC yourself and try to figure, or remove some backdoors. But then the problem arises that the machine might have more backdoors and keeps you having&nbsp;a untrustable computer. Also you can&#8217;t be sure that data wasn&#8217;t temperated with, so in a company perspective, perhaps they do transactions on custumer names and transfer the money to their own secret little account..</p>
<p>If you think i missed something huge, or small <img src='http://www.evilcoder.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  then contact me!</p>
<p>Remko Lodder 13/06/2004</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilcoder.org/2004/06/13/considerations-when-you-think-you-might-be-hacked/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notes from Mostly-Harmless (first meeting)</title>
		<link>http://www.evilcoder.org/2004/06/02/notes-from-mostly-harmless-first-meeting/</link>
		<comments>http://www.evilcoder.org/2004/06/02/notes-from-mostly-harmless-first-meeting/#comments</comments>
		<pubDate>Wed, 30 Nov -0001 00:00:00 +0000</pubDate>
		<dc:creator>Remko</dc:creator>
				<category><![CDATA[Mostly-Harmless]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[&#160; Notulen PLATFORM September 14, 2002 Written by Remko Lodder (N1ghtW) Attendended persons : RooT66: Frank, Bart, Stef, Jillis, Mitsai, Remko, Emiel, Gerard, Tom, Sepp Klaphek: Hans, Brenda Hackers4Hackers: Bas, Thijs Netric: ilja, Martijn, Casper Overigen: Peter, Steffen, Helena, Cliff, Tom. Not Attended persons: mendel (BugBlue) (did inform us) 3 The Target of platform 3.1 [...]]]></description>
			<content:encoded><![CDATA[<p><!--StartFragment -->&nbsp;<!--StartFragment --> <PRE>Notulen PLATFORM September 14, 2002</p>
<p>Written by Remko Lodder (N1ghtW)</p>
<p>Attendended persons :<br />
                RooT66: Frank, Bart, Stef, Jillis, Mitsai, Remko, Emiel, Gerard,<br />
                Tom, Sepp<br />
                Klaphek: Hans, Brenda<br />
                Hackers4Hackers: Bas, Thijs<br />
                Netric: ilja, Martijn, Casper<br />
                Overigen: Peter, Steffen, Helena, Cliff, Tom.<br />
Not Attended persons: mendel (BugBlue) (did inform us)</p>
<p>3 The Target of platform</p>
<p>3.1 Purpose<br />
Frank says hi to all of us and directly asks us the first question:<br />
What is the purpose of our PLATFORM?</p>
<p>After a reasonable discussion it was formulated that :<br />
Platform has to be a community which improves technical<br />
curiousity focused on the Netherlands.</p>
<p>After this some people shouted through the room about how to fill this purpose,<br />
Frank commented:<br />
We will discuss this later in this meeting.</p>
<p>3.2 image to the outside world</p>
<p>Frank also asked us about how we have to show ourselfs to the outside world:<br />
Yet another discussion which resulted in:<br />
PLATFORM has as image to the outside world:<br />
&#8216;At home we play, whatever we find will be published in a neath way&#8217;.</p>
<p>The discussion also resulted in:<br />
We have to be OPEN to the outside world.<br />
People must be able to see what is happening<br />
inside the organisation, memberstructure and the rest of PLATFORM.</p>
<p>4 The filling in of PLATFORM</p>
<p>4.1</p>
<p>Ethics was scratched from the list as a standalone part,<br />
and was inserted in every other point that was mentioned.<br />
Ethics cant be given as a standalone part, it uses all the other points ,<br />
as the opinion said.</p>
<p>Activities we came up with:</p>
<p>         Sociaal (Irc, Meetings)<br />
         Knowledge (Howto&#8217;s)<br />
         Projects (The thinking and executing of new ideas.)<br />
         Matches (Hackme&#8217;s , Challenges)<br />
         Public Relations (Giving out information to the press)</p>
<p>4.2 Relations to the gouvernement,media and company&#8217;s</p>
<p>Next it was need to discus how our relation to the gourvernement,<br />
media and company&#8217;s has to be.<br />
The answer was:<br />
We start doing above steps when they come to us.<br />
They will be redirected to our PR staff.<br />
Each individual will redirect all questions etc to the PR staff which give out the<br />
opinion of PLATFORM.</p>
<p>4.3 Organisation of PLATFORM</p>
<p>The next question that we came up with:<br />
if PLATFORM exists how will it be coordinated?<br />
That is a required part of the whole PLATFORM.<br />
As a group we came up with the solution:<br />
There will a core group of invididuals who will be the daily coordinators of PLATFORM.<br />
These individuals will have regular meetings in which they discuss the continuance of<br />
PLATFORM.</p>
<p>When needed they will also direct the persons which will fill in the commissions which<br />
have to be formed, the reason for this is that it has to be done with a certain timeframe.<br />
Futhermore there will be as said formed some commissions who will direct the persons in<br />
the activity. Also they will be responsible for the success of a project.<br />
These persons also claim resources for certain requests.</p>
<p>Now follows a question round, in which persons can decide in which commission<br />
he will participate.<br />
After that will be decided who will be in the core group.<br />
The commissions are made will be related to the formed activity&#8217;s.</p>
<p>For Public Relations Helena en Stefje will lead.<br />
For Social: Mitsai, Frank, Steffen<br />
For Knowledge: Peter, Jillis, Brenda<br />
For Challenges: Bas, Thijs, Ilja<br />
For the Projects Coolvibe, Atje en Netric will be giving lead..</p>
<p>From the groups , Mitsai, Thijs, Atje, Helena, Jillis were chosen to be in the core group.</p>
<p>This group is now responsible for PLATFORM.</p>
<p>A break was issued to order some food.</p>
<p>5 Stop or Go opinion</p>
<p>While we wait for the food, there is a Stop / Go question round which motivation why:</p>
<p>Everybody actually said that we are willing to GO for it if persons are doing stuff for it,<br />
nobody wants to do something of other persons from the team dont do anything about it.<br />
That will be the main issue:<br />
We are dependend on the activity&#8217;s from others and the core group has to give the<br />
correct direction.</p>
<p>2 Persons did not agree with PLATFORM:<br />
Bart, i dont agree with the filling in of PLATFORM,<br />
Tom (Stimpy from the other&#8217;s team): I cant join more meetings and i dont have enough<br />
time for it.</p>
<p>While everybody gave his opinion Bas thinks there are some doubts between<br />
attendencees about the success of PLATFORM.<br />
From experiences the attendencees are afraid that it will go wrong, so they are a<br />
little carefull about the project.<br />
We have to see what it will bring.</p>
<p>6 Food.<br />
Taken down the list</p>
<p>7 Stop or Go beslissing</p>
<p>The second Stop/Go round was passed since the opinions where clear: GO</p>
<p>8 Decide the in-depth of PLATFORM</p>
<p>8.1 &amp; 8.2 Main activity&#8217;s and activity&#8217;s per Main activity&#8217;s.<br />
Frank asks the rest of the attendencees to think about how the activity groups can be<br />
filled with actual activity&#8217;s.</p>
<p>Everybody was asked the question whether he / she has an idea which can be taken in<br />
a activity group.</p>
<p>Social:<br />
A IRC channel has to be created with the name of PLATFORM.<br />
Also meetings will be arranged which have the goal to bring people closer to eachother<br />
and to see who is who. Another point which hangs around meetings is Social Control,<br />
people will talk about made mistakes, which has more impact than over IRC or through a<br />
mobile phone.<br />
Flyers, Ad&#8217;s on schools, hospitals, other public buildings:<br />
With this we can target our group and attract new persons to PLATFORM.</p>
<p>Projects:<br />
To setup VPN&#8217;s so people can join it.<br />
The attended servers can be subducted by technical analyses or tests in the VPN.<br />
This VPN will be totally be shut of from the outside world because you dont want to<br />
have &#8216;bad&#8217; persons in this.<br />
Knowledge database: To build a open source website focused on the<br />
Dutch Language (because we are a dutch group).</p>
<p>Knowlegde:<br />
Build Hackme&#8217;s so that new people have a challenge and can obtain knowledge to<br />
beat the hackme&#8217;s.<br />
Practical: There will be given practical&#8217;s to improve current knowledge or for testing<br />
your current knowledge.<br />
Readouts to the targetgroup: We can give education to people who require it or are<br />
interested in these science.<br />
Phreaking: example: lockpicking how&#8217;to&#8217;s must be given (about the technics which<br />
is behind it).</p>
<p>Matches:<br />
Developping challenges and participation of challenges (code matches).</p>
<p>Now this is done we will fill the rest of the points when PLATFORM is a week or 2<br />
old to see who wants to do what in which activity group and how that must be coordinated.</p>
<p>The food arrived and Frank comments that the meeting is over because there are<br />
no more points left</p>
<p>On behalf of Frank, thanks for joining this first PLATFORM meeting,<br />
see ya on the next one</PRE><br /><span id="more-723"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilcoder.org/2004/06/02/notes-from-mostly-harmless-first-meeting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notulen Mostly-Harmless (1e meeting)</title>
		<link>http://www.evilcoder.org/2004/06/02/notulen-mostly-harmless-1e-meeting/</link>
		<comments>http://www.evilcoder.org/2004/06/02/notulen-mostly-harmless-1e-meeting/#comments</comments>
		<pubDate>Wed, 30 Nov -0001 00:00:00 +0000</pubDate>
		<dc:creator>Remko</dc:creator>
				<category><![CDATA[Mostly-Harmless]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[&#160;Notulen PLATFORM September 14, 2002 Door Remko Lodder (N1ghtW) Aanwezig waren: RooT66: Frank, Bart, Stef, Jillis, Mitsai, Remko, Emiel, Gerard, Tom, Sepp Klaphek: Hans, Brenda Hackers4Hackers: Bas, Thijs Netric: ilja, Martijn, Casper Overigen: Peter, Steffen, Helena, Cliff, Tom. Afwezig: mendel (BugBlue) (afgemeld) 3 Doel platform 3.1 doelstelling Frank heet een ieder welkom en stelt direct [...]]]></description>
			<content:encoded><![CDATA[<p><!--StartFragment -->&nbsp;<PRE>Notulen PLATFORM September 14, 2002</p>
<p>Door Remko Lodder (N1ghtW)</p>
<p>Aanwezig waren: RooT66: Frank, Bart, Stef, Jillis, Mitsai, Remko, Emiel,<br />
                Gerard, Tom, Sepp<br />
                Klaphek: Hans, Brenda<br />
                Hackers4Hackers: Bas, Thijs<br />
                Netric: ilja, Martijn, Casper<br />
                Overigen: Peter, Steffen, Helena, Cliff, Tom.<br />
Afwezig: mendel (BugBlue) (afgemeld)</p>
<p>3 Doel platform</p>
<p>3.1 doelstelling<br />
Frank heet een ieder welkom en stelt direct de eerste vraag:<br />
Wat is het doel van ons PLATFORM?</p>
<p>Na een redelijke discussie is dat uiteindelijk geformuleerd tot:<br />
Platform moet een community zijn ter bevoordering van technische nieuwsgierigheid<br />
die zich richt op Nederland.</p>
<p>Er werden hierna nogal wat dingen door elkaar geroepen zoals:<br />
Invullingen van activiteiten,Frank meldde hierop dat deze later<br />
op de vergadering aan de orde zouden komen.</p>
<p>3.2 image naar buiten</p>
<p>Frank vroeg ons ook hoe we ons moesten opstellen naar buiten toe:<br />
Ook hier werd veel gediscussieerd.<br />
Het resulteerde in:<br />
PLATFORM heeft als image naar buiten toe: &#8216;spelen doen we thuis, en bevindingen<br />
brengen we op een nette manier naar buiten&#8217;</p>
<p>Ook kwam uit de discussie naar voren dat we vooral ook OPEN naar buiten toe moeten<br />
zijn. Zodat men geheel weet wat er speelt binnen de organisatie,<br />
ledenstructuur en de rest van PLATFORM.</p>
<p>4 Invulling platform</p>
<p>4.1</p>
<p>Ethiek werd als losstaand onderdeel van de lijst geschrapt<br />
en werd door elk ander onderdeel heel geweven.<br />
Ethiek kan namelijk niet gegeven worden als losstaand onderdeel,<br />
het hangt samen met de overige onderdelen, zo luidde de mening.</p>
<p>Activiteiten die verzonnen werden door de aanwezigen:</p>
<p>         Sociaal (Irc, Meetings)<br />
         Kennis (Howto&#8217;s)<br />
         Projecten (Het bedenken en uitvoeren van nieuwe ideeen)<br />
         Wedstrijden (Hackme&#8217;s , Challanges)<br />
         Public Relations (Het uitgeven van informatie naar de pers)</p>
<p>4.2 Relaties richting overheid,media en bedrijven</p>
<p>Vervolgens was het noodzaak om met zijn allen te bepalen hoe onze relatie naar<br />
de overheid,media, bedrijven toe moet zijn.<br />
Daar werd het volgende op gevonden:<br />
We gaan pas met bovenstaanden in gesprek als deze naar ons toe komen.<br />
Ze zullen dan doorverwezen worden naar onze PR groep.<br />
Als losstaande personen zullen we de overheid etc<br />
altijd door verwijzen naar PR welke het mag verwoorden in de mening van PLATFORM.</p>
<p>4.3 Organisatie PLATFORM</p>
<p>De volgende vraag die naar boven kwam was:<br />
Als het PLATFORM dan bestaat hoe gaan we daar coordinatie<br />
in aanbrengen, dat is namelijk wel een noodzakelijk onderdeel<br />
van het hele PLATFORM.<br />
Als groep hebben we daarop bedacht:<br />
Er zal een core groep zijn van mensen die het dagelijkse bestuur zullen vormen.<br />
Deze zullen regelmatig met elkaar moeten overleggen en indien nodig de anderen<br />
in de te vormen commissies aansturen om de onderdelen die aangegaan zijn ook<br />
binnen de tijdslimieten af te krijgen.<br />
Verder zullen er zoals gezegd Commissies worden opgericht die sturing aan de<br />
mensen in de activiteit zal geven en verantwoordelijk is voor het slagen van<br />
bijvoorbeeld een project.<br />
Deze personen claimen ook resources voor bepaalde aanvragen.</p>
<p>Er volgt een vragen rondje met wie in welke commisie zou willen partisiperen.<br />
Daarna zal vastgesteld worden wie er in de core groep gaan zitten.<br />
De commisies zijn gemaakt aan de hand van de verzonnen activiteiten:</p>
<p>Voor Public Relations zullen Helena en Stefje sturing geven.<br />
Voor Sociaal zijn dat: Mitsai, Frank, Steffen<br />
Voor Kennis: Peter, Jillis, Brenda<br />
Voor Challenges: Bas, Thijs, Ilja<br />
Voor de projecten zullen Coolvibe, Atje en Netric sturing geven.</p>
<p>Uit de groepen werden tot core groep gekozen: Mitsai, Thijs, Atje, Helena, Jillis</p>
<p>Deze groep is voor nu verantwoordelijk voor het PLATFORM.</p>
<p>Er werd tijdelijk pauze ingelast om wat eten te bestellen.</p>
<p>5 Stop or Go mening</p>
<p>Terwijl we wachten op eten is er een Go/ NO GO vragenrondje + motivatie waarom:</p>
<p>Uit iedereen kwam eigenlijk dat men er best voor wilt gaan als men maar wat<br />
doet ervoor.<br />
Niemand heeft zin om iets te doen als de overigen van het team niets eraan doen.<br />
Dat houdt in dat we voornamelijk afhanelijk zijn van elkaar en van de core groep die<br />
de juiste sturing zal moeten geven.<br />
Echter 2 personen waren het niet met het PLATFORM eens: Bart, niet eens met de<br />
invulling van het PLATFORM, en Tom (Stimpy van het overigen team) deze kan niet<br />
steeds bij eventuele meetingen zijn en ziet er te weinig tijd voor.</p>
<p>Nu iedereen zijn mening heeft gegeven vind Bas dat er toch wel wat twijfel is tussen<br />
de aanwezigen omtrent het slagen van het PLATFORM.<br />
Uit eerdere ervaringen zijn de aanwezigen bang dat het misgaat<br />
dus men is voorzichtig hierom: We zullen moeten zien  wat ervan komt.</p>
<p>6 eten<br />
Verschoven naar beneden</p>
<p>7 Stop or Go beslissing</p>
<p>De 2e Go/NO Go ronde werd overgeslagen aangezien de meningen duidelijk waren:<br />
GO</p>
<p>8 Vaststellen invulling platform</p>
<p>8.1 &amp; 8.2 Hoofdtakken vastleggen &amp; Activiteiten per hoofdtak vastleggen<br />
Frank vraagt de rest van de aanwezigen om na te denken over hoe we de activiteiten<br />
groepen kunnen vullen met daadwerkelijke activiteiten:</p>
<p>Iedereen werd de vraag gesteld wat hij /zij als idee heeft zodat dat onder een<br />
activiteiten groep gehangen kan worden..</p>
<p>Sociaal:<br />
Er moet een IRC Kanaal opgericht worden met de naam van het PLATFORM.<br />
Ook zullen er meetings georganiseerd worden die tot doel heeft de mensen dichter<br />
bij elkaar te brengen en eens te zien wie nou eigenlijk wie is.<br />
Tevens hangt hier een vorm van Sociale controle aanvast zodat nieuwe<br />
mensen elkaar kunnen aanspreken over de fouten die ze maken.<br />
Dit maakt een stuk meer impact dan het over IRC of door een GSM opmerkzaam<br />
gemaakt worden van een eventuele fout.<br />
Flyers, Advertenties op scholen, ziekenhuizen, overige openbare gelegenheden:<br />
hierdoor kunnen we de doelgroep bereiken en nieuwsgierige personen aantrekken.</p>
<p>Projecten:<br />
VPN&#8217;s opzetten zodat mensen van buitenaf in de VPN kunnen joinen en de<br />
aanwezige servers daarin kunnen onderwerpen aan een technische analyze danwel<br />
testen van de omgeving.<br />
Deze VPN zal naar buiten toe volledig afgeschermd moeten zijn daar je geen &#8216;foute&#8217;<br />
personen wilt aantrekken tot dit netwerk.</p>
<p>Kennis database.<br />
Een opensource website bouwen ge-end op de nederlandse taal (omdat wij een<br />
nederlandse groep zijn).</p>
<p>Kennis:<br />
Hackme&#8217;s bouwen zodat nieuwe mensen een uitdaging te hebben en kennis ter<br />
vergaren om de Hackme te laten slagen.</p>
<p>Practica: Er zullen practica gegeven worden ter upgrade van huidige kennis of juist<br />
ter toetsing van huidige kennis.</p>
<p>Lezigen naar de doelgroep: hierdoor kunnen we voorlichting geven aan mensen die<br />
het nodig hebben en of geinteresseerd zijn in deze wetenschappen:</p>
<p>Phreaking: Bijvoorbeeld lockpicking how&#8217;to&#8217;s moeten gegeven kunnen worden<br />
(Omtrent de Techniek die erachter zit).</p>
<p>Wedstrijden:<br />
Ontwikkeling van challenges en het meedoen aan challenges / Code wedstrijden.</p>
<p>Nu dit is afgerond zullen we de overige punten pas ingaan vullen als het PLATFORM<br />
een weekje of 2 draait om te zien wie wat wilt doen in welke activiteiten groep en<br />
hoe dat op dat moment gecoordineerd zal worden.</p>
<p>Het eten is gearriveerd en tijdens het eten met Frank dat de vergadering voorbij is,<br />
omdat er geen punten meer te melden zijn danwel overlegbaar zijn op dit moment.</p>
<p>Namens frank, Bedankt voor het bijwonen van deze eerste PLATFORM meeting,<br />
op naar de volgende!</PRE><br /><span id="more-722"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilcoder.org/2004/06/02/notulen-mostly-harmless-1e-meeting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firewalls: IPF</title>
		<link>http://www.evilcoder.org/2004/06/02/firewalls-ipf/</link>
		<comments>http://www.evilcoder.org/2004/06/02/firewalls-ipf/#comments</comments>
		<pubDate>Wed, 30 Nov -0001 00:00:00 +0000</pubDate>
		<dc:creator>Remko</dc:creator>
				<category><![CDATA[Mostly-Harmless]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[&#160;# Mini howto, IPF # # Door Remko Lodder (nightw@root66.org/remko@elvandar.org) # # Datum: # 15 December 2002 (Initiele versie van het document) # 27 Juni 2003 (2e versie van het document) # # Voorkennis: # Basis kennis TCP/IP # Basis kennis Unix (incl ifconfig / interfaces ) # # Dit documentje is geschreven voor de [...]]]></description>
			<content:encoded><![CDATA[<p><!--StartFragment -->&nbsp;<PRE># Mini howto, IPF<br />
#<br />
# Door Remko Lodder (nightw@root66.org/remko@elvandar.org)<br />
#<br />
# Datum:<br />
# 15 December 2002 (Initiele versie van het document)<br />
# 27 Juni 2003 (2e versie van het document)<br />
#<br />
# Voorkennis:<br />
# Basis kennis TCP/IP<br />
# Basis kennis Unix (incl ifconfig / interfaces )<br />
#<br />
# Dit documentje is geschreven voor de beginnenden ipf&#8217;er.<br />
# Het dekt een opbouw van:<br />
#                         Wat willen we?<br />
#                         Wat doen we daarmee?<br />
#                         Hoe wie wat waar? IPF regeltjes<br />
#                         Wat betekenen die regeltjes eigenlijk?<br />
#                         Wat zijn verbeter mogelijkheden?<br />
#                         Hoe ziet een complete ruleset eruit?<br />
#                         Waar kan ik meer informatie vinden?<br />
#<br />
################################################################################<br />
#<br />
# Hoofdstuk indeling:<br />
# 1. Wat willen we precies?<br />
# 2. Wat gaan we daarmee doen?<br />
# 3. Hoe wie wat waar? IPF regeltjes<br />
# 4. Wat betekenen die regeltjes eigenlijk?<br />
# 5. Wat zijn verbeter mogelijkheden?<br />
# 6. Hoe ziet een complete ruleset eruit?<br />
# 7. Waar kan ik meer informatie vinden?<br />
#<br />
################################################################################<br />
#<br />
# 1. Wat willen we precies?<br />
#<br />
# Allereerst uitleggen wat ipf is:<br />
#<br />
# Ipf is een firewall package voor onder andere NetBSD/FreeBSD en met wat<br />
# aanpassingen ook voor OpenBSD.<br />
#<br />
# Ieders wens is anders. Daarom heb ik gekozen om een voorbeeld te<br />
# geven die ook in het echt gebruikt had kunnen worden.<br />
# Op dit moment gebruik ik in /etc/hosts de naam: ipf-host.<br />
# Die heb ik als volgende gedefinieerd:<br />
#<br />
# 123.456.789.123       ipf-host        host    ipf<br />
#<br />
# Hierdoor is het ipadres voor ipf herkenbaar als ipf-host<br />
# en hoef je geen ipadressen in je ipf.conf te zetten.<br />
#<br />
# Hierachter wil ik draaien:<br />
# Inkomend:<br />
# 1) een webserver (http)<br />
# 2) een secure webserver (https)<br />
# 3) een mailserver (smtp)<br />
# 4) een dnsserver (dns)<br />
# 5) een ipv6 tunnel (ipv6)<br />
#<br />
# Uitgaand:<br />
# 1) naar dnsserver (dns)<br />
# 2) naar ipv6 tunnel (ipv6)<br />
#<br />
# Overigens gaan we ervanuit dat onze netwerkkaart in dit geval<br />
# xl0 is. Inderdaad, in dit voorbeeld hebben we EEN netwerkkaart.<br />
# in dit geval, maar regels toevoegen is niet erg lastig zoals<br />
# zodadelijk zal blijken<br />
################################################################################<br />
#<br />
# 2. Wat gaan we daarmee doen?<br />
#<br />
# We zullen eerst moeten achterhalen welke poorten en protocollen<br />
# nodig zijn om aan onze wensen te voldoen.<br />
# Dat komt erop neer dat we voor onze services de poorten het<br />
# eerst gaan zoeken:<br />
# Inkomend:<br />
#    Service    =       Poortnr.        Protocolnaam<br />
# 1) http       =       80              tcp<br />
# 2) https      =       443             tcp<br />
# 3) smtp       =       25              tcp<br />
# 4) dns        =       53              udp<br />
# 5) ipv6       =       x               ipv6 (voor tunneling!)<br />
#<br />
# Uitgaand:<br />
#    Service    =       Poortnr.        Protoclnaam<br />
# 1) dns        =       53              udp<br />
# 2) ipv6       =       x               ipv6 (voor tunneling!)<br />
#<br />
# Nu we de poorten en protocollen weten, kunnen we gaan bepalen<br />
# wat er precies naar binnen mag komen op bovenstaande poorten<br />
# en protocollen en van wie dat geaccepteerd wordt.<br />
#<br />
# In dit voorbeeld hebben we dit beleid:<br />
# Inkomend:<br />
#    Service            Geaccepteerd van<br />
# 1) http               iedereen<br />
# 2) https              iedereen<br />
# 3) smtp               iedereen<br />
# 4) dns                iedereen<br />
# 5) ipv6               niemand<br />
#<br />
# Uitgaand:<br />
#    Service            Geaccepteerd naar<br />
# 1) dns                iedereen<br />
# 2) ipv6               ipv6-tun (xs4all tunnelbroker)<br />
#<br />
# Zo, nu is duidelijk en overzichtelijk wat we precies gaan<br />
# accepteren en welke kant het pakketje opgaat.<br />
# Als je nu denkt, maar alleen inkomend http verkeer? Dat verkeer<br />
# moet toch ook nog terug? Dat klopt. Dat wordt in het volgende<br />
# hoofdstuk uitgelegd hoe dat in zijn werk gaat.<br />
#<br />
################################################################################<br />
#<br />
# 3. Wie wat waar? IPF regeltjes<br />
#<br />
# Om het voorbeeld in het voorgaande hoofdstuk in de praktijk te kunnen brengen<br />
# moeten er firewall regeltjes gemaakt worden.<br />
# Deze hebben nu nog een relatief korte uitleg, maar wees niet<br />
# bezorgd in het volgende hoofdstuk wordt dit regel voor regel<br />
# uitgelegd.<br />
#<br />
# Om bovenstaand beleid ten uitvoer te brengen hebben we de<br />
# volgende regels nodig:<br />
#<br />
# Inkomend:<br />
# Volgorde: smtp &#8211; http &#8211; https &#8211; dns<br />
# pass in quick on xl0 proto tcp from any to ipf-host port 25  keep state<br />
# pass in quick on xl0 proto tcp from any to ipf-host port 80  keep state<br />
# pass in quick on xl0 proto tcp from any to ipf-host port 443 keep state<br />
# pass in quick on xl0 proto udp from any to ipf-host port 53  keep state<br />
#<br />
# Uitgaand:<br />
# Volgorde: dns &#8211; ipv6<br />
# pass out quick on xl0 proto udp from ipf-host to any port 53 keep state<br />
# pass out quick on xl0 proto ipv6 from ipf-host to ipv6-tun   keep state<br />
#<br />
################################################################################<br />
#<br />
# 4. Wat betekenen die regeltjes eigenlijk?<br />
#<br />
# Oke, nu hebben we functionele regels. Deze regels zullen wel werken, echter<br />
# niet in deze context. Een complete ruleset (voorbeeld) wordt later gegeven<br />
# die wel functioneel is.<br />
#<br />
# Allemaal pass in quick regeltjes, wat doen ze nu precies?<br />
# Dit leggen we uit aan de hand van een voorbeeld:<br />
# pass in quick on xl0 proto tcp from any to ipf-host port 25 keep state<br />
#<br />
# Uitgelegd in woorden:<br />
# accepteer inkomend, controleer niet verder op andere regels, op interface xl0<br />
# protocol tcp, van wie dan ook, naar mijn ip adres, poort 25 (smtp), en houd<br />
# sessie informatie in de gaten.<br />
#<br />
# Maar wat doet het nu precies, want dat keep state ?<br />
# Keep state zorgt ervoor dat een pakketje dat naar binnenkomt ook weer terug<br />
# naar buiten mag. Hierdoor hoeven we niet een aparte regel uitgaand te<br />
# maken, maar kunnen we een dichtere firewall ruleset bouwen. Dit is veiliger.<br />
#<br />
# Uitgaand geldt natuurlijk precies hetzelfde alleen dan de andere kant op<br />
#<br />
################################################################################<br />
#<br />
# 5. Wat zijn verbetermogelijkheden?<br />
#<br />
# Onder IPF kunnen we de dingen soms beter organiseren dan nu.<br />
# Bijvoorbeeld door elke inkomende stroming (verkeer) op elke netwerkkaart (als je er<br />
# meerdere hebt) apart te defineren. Dit doe je dan ook met de uitgaande groep<br />
# Als je dan een log regel krijgt van ipmon (de logdaemon van ipf) kan je zien<br />
# waar het geheel zich ongeveer afspeelt, welke service , of reeks ipadressen<br />
# etc.<br />
# Dit kunnen we implementeren door wat dingen toe te voegen:<br />
#<br />
# We willen een &#8216;overrulende block&#8217; dat heb ik geimplementeerd door dit te doen<br />
#<br />
# block in log quick on xl0 all head 1<br />
#<br />
# We hebben nu de begin definitie van groep 1 aangemaakt. (Block alles op de<br />
# interface xl0 als het niet in groep 1 valt)<br />
# Aan het einde heb ik een soortgelijk statement staan<br />
#<br />
# block in log quick on xl0 all group 11<br />
#<br />
# Dit is de overrulling block regel voor mij bij mijn interface (xl0)<br />
# Note: Voor de duidelijkheid heb ik zoveelmogelijk netjes onder elkaar staan zodat je<br />
# in 1 oogopslag kan zien wat voor regel het is.<br />
#<br />
# Het blockje komt er dan zo uit te zien:<br />
#<br />
# Inkomend:<br />
# block in  log quick on xl0 all                                                  head 1<br />
# pass  in      quick on xl0 proto tcp  from any to ipf-host port 25  keep state  group 1<br />
# pass  in      quick on xl0 proto tcp  from any to ipf-host port 80  keep state  group 1<br />
# pass  in      quick on xl0 proto tcp  from any to ipf-host port 443 keep state  group 1<br />
# pass  in      quick on xl0 proto udp  from any to ipf-host port 53  keep state  group 1<br />
# block in  log quick on xl0 all                                                  group 1<br />
#<br />
# Uitgaand:<br />
# block out log quick on xl0 all                                                  head 2<br />
# pass  out     quick on xl0 proto udp  from ipf-host to any port 53   keep state group 2<br />
# pass  out     quick on xl0 proto ipv6 from ipf-host to ipv6-tun      keep state group 2<br />
# block out log quick on xl0 all                                                  group 2<br />
#<br />
# Daarnaast kunnen we ook nog wat meer veiligheid inbouwen door flags te gebruiken<br />
# Flags zijn alleen toepasbaar op tcp pakketjes. Deze hebben de volgende methode<br />
# voor het opbouwen van een verbinding:<br />
# Syn(S) -&gt; Syn/Ack(S/A) -&gt; Ack(A)<br />
# Dat kan je ook als volgt uitleggen:<br />
# Hoi ben je er? -&gt; Ja ik ben er -&gt; Ok kom maar op met je data<br />
#<br />
# Flags zorgen ervoor dat bijvoorbeeld alleen verbindingen die beginnen met een Syn(S) pakket<br />
# mogen binnen komen. Als er dan keep state bijstaat wordt de rest van<br />
# de tcp verbinding ook doorgelaten<br />
#<br />
# Hoe ziet dat eruit?<br />
#<br />
# # Inkomend:<br />
# block in  log quick on xl0 all                                                          head 1<br />
# pass  in      quick on xl0 proto tcp  from any to ipf-host port 25  flags S keep state  group 1<br />
# pass  in      quick on xl0 proto tcp  from any to ipf-host port 80  flags S keep state  group 1<br />
# pass  in      quick on xl0 proto tcp  from any to ipf-host port 443 flags S keep state  group 1<br />
# pass  in      quick on xl0 proto udp  from any to ipf-host port 53          keep state  group 1<br />
# block in  log quick on xl0 all                                                          group 1<br />
#<br />
# Uitgaand:<br />
# block out log quick on xl0 all                                                          head 2<br />
# pass  out     quick on xl0 proto udp  from ipf-host to any port 53   keep state         group 2<br />
# pass  out     quick on xl0 proto ipv6 from ipf-host to ipv6-tun      keep state         group 2<br />
# block out log quick on xl0 all                                                          group 2<br />
#<br />
#<br />
################################################################################<br />
#<br />
# 6. Hoe zit een complete ruleset eruit?<br />
#<br />
# We hebben net enkele kleine voorbeelden gegeven over wat je allemaal in een<br />
# ruleset kunt zetten. Echter nu hebben we nog steeds geen duidelijk overzicht<br />
# over hoe nu een compleet functionele firewall ruleset eruit zou zien.<br />
# Hieronder zal ik een voorbeeld, echt werkend, geven over hoe mijn firewall<br />
# ruleset eruit zou zien als ik bovenstaand beleid / policy ten uitvoer zou<br />
# brengen.<br />
#<br />
# Voorbeeld ruleset:<br />
#<br />
# # Inkomend lo0<br />
# block in log quick on lo0     head 50<br />
# pass  in     quick on lo0 all group 50<br />
# block in log quick on lo0     group 50<br />
#<br />
# # Uitgaand lo0<br />
# block out log quick on lo0     head 51<br />
# pass  out     quick on lo0 all group 51<br />
# block out log quick on lo0     group 51<br />
#<br />
# # Inkomend: xl0<br />
# block in  log quick on xl0 all                                                          head 1<br />
# pass  in      quick on xl0 proto tcp  from any to ipf-host port 25  flags S keep state  group 1<br />
# pass  in      quick on xl0 proto tcp  from any to ipf-host port 80  flags S keep state  group 1<br />
# pass  in      quick on xl0 proto tcp  from any to ipf-host port 443 flags S keep state  group 1<br />
# pass  in      quick on xl0 proto udp  from any to ipf-host port 53          keep state  group 1<br />
# block in  log quick on xl0 all                                                          group 1<br />
#<br />
# # Uitgaand: xl0<br />
# block out log quick on xl0 all                                                          head 2<br />
# pass  out     quick on xl0 proto udp  from ipf-host to any port 53   keep state         group 2<br />
# pass  out     quick on xl0 proto ipv6 from ipf-host to 195.109.5.241 keep state         group 2<br />
# block out log quick on xl0 all                                                          group 2<br />
#<br />
################################################################################<br />
#<br />
# 7. Waar kan ik meer informatie vinden?<br />
#<br />
# Na deze zeer korte en beknopte uitleg zal je misschien denken:<br />
# Ik wil veel meer weten over ipf en hoe het werkt en dergelijke<br />
# Natuurlijk kan je mij een mailtje sturen met daarin je vraag.<br />
# Wat je echter ook kan doen, is zelf uitzoeken hoe het werkt.<br />
# Dat kan je doen door naar www.ipfilter.org te surfen of<br />
# als die niet werkt: http://coombs.anu.edu.au/ipfilter/<br />
# Dat zijn de officiele pagina&#8217;s van Darren Reed (de schrijver van ipf).<br />
# Hier kun je terecht voor FAQ&#8217;s, en howto documentatie (engels)<br />
#<br />
# Ik hoop dat je hier van geleerd hebt, en interessante rulesets<br />
# gaat bouwen met IPF.<br />
#<br />
################################################################################<br />
#<br />
# Copyright:<br />
# Dit document is geschreven door Remko Lodder voor o.a<br />
# www.mostly-harmless.nl<br />
#<br />
################################################################################<br />
#<br />
# Mochten er spelfouten/dingen niet duidelijk zijn/ verkeerd zijn<br />
# wordt u verzocht contact op te nemen met Remko Lodder<br />
# (nightw@root66.org of remko@elvandar.org) zodat dit aangepast /<br />
# beter uitgelegd / verbeterd kan worden.<br />
#<br />
################################################################################</PRE><br /><span id="more-721"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilcoder.org/2004/06/02/firewalls-ipf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL Injection voor beginners</title>
		<link>http://www.evilcoder.org/2004/06/02/sql-injection-voor-beginners/</link>
		<comments>http://www.evilcoder.org/2004/06/02/sql-injection-voor-beginners/#comments</comments>
		<pubDate>Wed, 30 Nov -0001 00:00:00 +0000</pubDate>
		<dc:creator>Remko</dc:creator>
				<category><![CDATA[Mostly-Harmless]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[&#160;SQL Injection voor beginners -door: Mark IJbema (vandread)- -Doel van deze handleiding Het doel van deze handleiding is om voor beginners SQL injection duidelijk te maken. Voor vragen en opmerkingen: mark@ijbema.xs4all.nl -Conventies In een url dient alles tussen accolades uri-encoded (%.. tekens) te worden, en de accolades zelf niet gebruikt te worden, maar voor de [...]]]></description>
			<content:encoded><![CDATA[<p><!--StartFragment -->&nbsp;<PRE>SQL Injection voor beginners<br />
   -door: Mark IJbema (vandread)-</p>
<p>-Doel van deze handleiding</p>
<p>Het doel van deze handleiding is om voor beginners SQL injection duidelijk te<br />
maken.</p>
<p>Voor vragen en opmerkingen: mark@ijbema.xs4all.nl</p>
<p>-Conventies</p>
<p>In een url dient alles tussen accolades uri-encoded (%.. tekens) te<br />
worden, en de accolades zelf niet gebruikt te worden, maar voor de<br />
leesbaarheid is dat in deze tutorial dus niet gedaan (overigens doen een<br />
hoop browsers dit automatisch voor alles behalve het &#8216;=&#8217; charachter, als<br />
je die even zelf doet (%3D) dan werkt het waarschijnlijk ook al)</p>
<p>-Wat is SQL</p>
<p>SQL is een taal om een database te benaderen. Er zijn zowel opdrachten om dingen<br />
op te vragen als om dingen te wijzigen. Dingen opvragen doe je als volgt:</p>
<p>SELECT &lt;kolommen&gt;<br />
  FROM &lt;tabellen&gt;<br />
  WHERE &lt;voorwaarden&gt;</p>
<p>Dus bijvoorbeeld:</p>
<p>SELECT naam, beschrijving, prijs<br />
  FROM produkten<br />
  WHERE naam = &#8217;128MB RAM&#8217;</p>
<p>Waarmee je de prijs opvraagt van 128MB RAM. Omdat je echter vaak maar een<br />
resultaat wil, en een naam niet perse uniek is gebruikt men vaak unieke<br />
ID&#8217;s. Dus als het ID van 128MB RAM bijvoorbeeld 12 is, ziet de query (zo heet<br />
een selectie in SQL) er als volgt uit:</p>
<p>SELECT naam, beschrijving, prijs<br />
  FROM produkten<br />
  WHERE id = 12</p>
<p>Verder heb je ook update&#8217;s en dergelijke om gegevens te wijzigen, maar het voert<br />
te ver om er  hier dieper op in te gaan.</p>
<p>-Gebruik van SQL vanaf websites</p>
<p>Stel je hebt een webpagina om van een product gegevens weer te geven. Je krijgt<br />
nu als parameter het id van het product voor. De URL van de pagina ziet er als<br />
volgt uit:</p>
<p>http://www.example.com/product.php?id=12</p>
<p>waarna in de PHP code het id in de query wordt verwerkt. Het id staat in $id, en<br />
vervolgens wordt de query als volgt opgebouwd:</p>
<p>$query = &#8220;SELECT naam, beschrijving, prijs FROM produkten WHERE id = $id&#8221;</p>
<p>hetgeen als $id 12 is resulteert in:</p>
<p>SELECT naam, beschrijving, prijs FROM produkten WHERE id = 12</p>
<p>wat een mooie geldige query is.Maar men is vergeten te checken of $id wel een<br />
nummer is en als we nu in de query 12 vervangen door iets anders wordt dat op de<br />
plaats van 12 geplakt. Dus bijvoorbeeld:</p>
<p>http://www.example.com/product.php?id=onzin</p>
<p>levert </p>
<p>SELECT naam, beschrijving, prijs FROM produkten WHERE id = onzin</p>
<p>op, en waarschijnlijk krijg je nu een error als &#8220;onzin is not a number&#8221;. Maar je<br />
kan dus ook de SQL aanvullen, bijvoorbeeld:</p>
<p>http://www.example.com/product.php?id={666666 OR id = 13}</p>
<p>levert op:</p>
<p>SELECT naam, beschrijving, prijs FROM produkten WHERE id = 666666 OR id = 13</p>
<p>en je krijgt nu dus produkt 13 te zien (ervan uitgaande dat 666666 geen geldig<br />
id is).</p>
<p>-Union</p>
<p>Een van de belangrijkste technieken bij SQL injection is de UNION operator. In<br />
het vorige voorbeeld kan je aanpassen wat je wilt, maar je krijgt als uitvoer<br />
altijd een naam, een beschrijving en een prijs. Dit is meestal helemaal niet<br />
interessant. Stel nu dat er in dezelfde database ook een lijst usernames,<br />
passwords en ids staan, dan wil je juist die hebben.</p>
<p>Dit kan je doen met de volgende query:</p>
<p>SELECT username, password FROM users WHERE id = 1</p>
<p>er bestaat in SQL de UNION operator om queries aan elkaar te plakken, mits het<br />
aantal kolommen van de beide queries gelijk is en de types van de resultaten ook<br />
paarsgewijs gelijk zijn (string, int, etc.). Dus om de vorige query aan de<br />
produkt-query toe te voegen moet er nog een extra integerkolom bij (ervan<br />
uitgaande dat de prijs als integer in de database staat). De query met de union<br />
erbij komt er dan als volgt uit te zien:</p>
<p>SELECT naam, beschrijving, prijs FROM produkten WHERE id = 12<br />
UNION<br />
SELECT username, password, id FROM users WHERE id = 1</p>
<p>door nu voor 12 een nietbestaand id te gebruiken wordt de eerste query leeg, en<br />
bestaat het resultaat alleen uit de tweede query. Dus:</p>
<p>SELECT naam, beschrijving, prijs FROM produkten WHERE id = 666666<br />
UNION<br />
SELECT username, password, id FROM users WHERE id = 1</p>
<p>We verkrijgen deze query mbv de volgende URL:</p>
<p>http://www.example.com/product.php?id={666666 UNION SELECT username,<br />
password, id FROM users WHERE id = 1}</p>
<p>Zo kunnen we dus van een user het wachtwoord uitlezen. Als je van alle<br />
users het wachtwoord en de username wilt, kan je een scriptje schrijven<br />
dat deze pagina ophaalt voor alle id&#8217;s, de pagina parsed, en in een<br />
netjes formaat de output laat zien.</p>
<p>-Strings</p>
<p>Vaak worden in plaats van id&#8217;s of andere getallen ook strings<br />
meegegeven, bijvoorbeeld:</p>
<p>http://www.example.com/listusers?name=mark</p>
<p>Geeft de lijst van alle gebruikers weer die mark heten. Dit ziet er<br />
ongeveer zo uit intern</p>
<p>SELECT &#8230; FROM &#8230; WHERE &#8230; AND name=&#8217;mark&#8217; AND &#8230;</p>
<p>Nu willen we niet alle gebruikers met naam &#8216;mark&#8217; hebben, maar met<br />
password &#8216;wachtwoord&#8217;. Dus we willen van de query het volgende maken:</p>
<p>SELECT &#8230; FROM &#8230;<br />
WHERE &#8230; AND name=&#8217;onzin&#8217; OR password = &#8216;wachtwoord&#8217; AND &#8230;</p>
<p>Hetgeen we krijgen met de volgende url:<br />
http://www.example.com/listusers?name={onzin&#8217; OR password = &#8216;wachtwoord}</p>
<p>Soms is het echter handiger om het laatste deel te negeren, door er<br />
commentaar van te maken, de query wordt dan:</p>
<p>SELECT &#8230; FROM &#8230;<br />
WHERE &#8230; AND name=&#8217;onzin&#8217; OR password = &#8216;wachtwoord&#8217;&#8211; AND &#8230;</p>
<p>En de url:<br />
http://www.example.com/listusers?name={onzin&#8217; OR password = &#8216;wachtwoord&#8217;&#8211;}</p>
<p>-Testen of een site vatbaar is voor SQL Injection</p>
<p>De simpelste manier om te testen of een site kwetsbaar is voor sql<br />
injection is door een enkel quotje in de querystring toe te voegen in<br />
een variabele. Als er hierdoor een database error optreed is de site<br />
kwetsbaar. Als die niet optreedt kan het nog steeds zijn dat de site<br />
kwetsbaar is, maar dan staat waarschijnlijk magic_quotes of iets<br />
dergelijks aan. In dat geval kan je wel SQL injection doen, maar kan je<br />
daarbij geen enkele quotes gebruiken.</p>
<p>-Afsluiting</p>
<p>Dit zijn grofweg wel de basistechnieken, er valt echter een heleboel<br />
meer te doen, maar een heleboel is afhankelijk van je eigen creativiteit<br />
en de meest handige dingetjes zijn vaak server afhankelijk (vanuit<br />
MS-SQLServer kan je bijvoorbeeld (afhankelijk van hoe die is<br />
geconfigureerd) emails versturen. Ik hoop dat dit voldoende is om je op<br />
weg te helpen, de rest zou moeten lukken met genoeg creativiteit in<br />
combinatie met scriptingskills (om dingetjes te automatiseren). Ook<br />
interessante database specifieke eigenschappen zijn tabellen waarin de<br />
metainformatie staat (tabelnamen, kolomnamen, etc.).</p>
<p>-Bronnen</p>
<p>http://www.hackinthebox.org/print.php?sid=6899</PRE><br /><span id="more-720"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilcoder.org/2004/06/02/sql-injection-voor-beginners/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Programmeertaal: Python</title>
		<link>http://www.evilcoder.org/2004/06/02/programmeertaal-python/</link>
		<comments>http://www.evilcoder.org/2004/06/02/programmeertaal-python/#comments</comments>
		<pubDate>Wed, 30 Nov -0001 00:00:00 +0000</pubDate>
		<dc:creator>Remko</dc:creator>
				<category><![CDATA[Mostly-Harmless]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[&#160;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Leren Programmeren met Python &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- Datum: 29/08/2003 Versie: 1.0 Auteur: Vincent &#8220;gorny&#8221; Berg Onderdeel van de Mostly-Harmless Knowledge Base Dit document mag vrijelijk verspreid worden op voorwaarde dat de informatie hierin niet wordt gewijzigd. - Voorwoord - Introductie - Opzet van een programmeertaal - Beginselen van het programmeren - &#8220;Flow control&#8221; - Functies in [...]]]></description>
			<content:encoded><![CDATA[<p><!--StartFragment -->&nbsp;<PRE>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
 Leren Programmeren met Python<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>  Datum:  29/08/2003<br />
  Versie: 1.0<br />
  Auteur: Vincent &#8220;gorny&#8221; Berg</p>
<p>  Onderdeel van de Mostly-Harmless Knowledge Base</p>
<p>  Dit document mag vrijelijk verspreid worden op voorwaarde dat de informatie<br />
  hierin niet wordt gewijzigd.</p>
<p>	- Voorwoord<br />
	- Introductie<br />
	- Opzet van een programmeertaal<br />
	- Beginselen van het programmeren<br />
	- &#8220;Flow control&#8221;<br />
	- Functies in Python<br />
	- Je vriendjes<br />
	- Afsluiting<br />
	- Literatuur</p>
<p>- Voorwoord</p>
<p>Dit document handelt over de beginselen van het programmeren en is vooral geschikt voor mensen die totaal geen programmeerervaring hebben. Eenieder die echter al veel ervaring heeft zal met dit document toch snel de basis dingen van Python onder de knie hebben om vervolgens snel grote scripts en/of applicaties te gaan ontwikkelen in deze prachtige taal.<br />
	Python is een &#8220;agile&#8221; programmeertaal. Dit betekent volgens het woordenboek dat het snel, lichtgewicht is en er betrekkelijk makkelijk veranderingen in aan te brengen zijn. Door de betrekkelijk eenvoudige syntaxis wordt een beginnende programmeur niet afgeleidt met &#8220;onnodige&#8221; zaken en kan deze snel functionele dingen leren. [1]<br />
	Ik hoop dat de lezer veel plezier heeft aan dit document. Voor vragen, opmerkingen en/of aanvullingen kan er altijd contact met mij worden gezocht via het Mostly-Harmless forum of het IRC-kanaal.</p>
<p>- Introductie </p>
<p>Veel introducties tot het programmeren beginnen simpelweg met een zogeheten &#8220;Hello World&#8221; programma. Het enige wat dit doet is het laten zien van de tekst &#8220;Hello World&#8221; op het scherm. Echter mijn tekst is (nog) niet meteen gericht op het programmeren, maar heeft tot doel de lezer de edele kunst van het programmeren beter te laten begrijpen.<br />
	De meeste (conventionele) programeertalen zijn opgebouwd volgens een vaste structuur. Ze bestaan allemaal uit syntaxtische en grammaticale regels waaraan voldaan moet worden door de programmeur. Dit is lang niet zo moeilijk als het klinkt. Bij de syntaxis gaat het (simpel gezegd) om de opbouw van de &#8220;woorden&#8221; waaruit de programmeercode bestaat. Vergelijk het met de Nederlandse taal. Daarbij moet het woord &#8220;appel&#8221; ook geschreven worden als &#8220;appel&#8221; en niet als &#8220;appul&#8221;.<br />
	De grammatica van een programmeertaal zijn een verzameling van regels die beschrijven hoe de &#8220;zinnen&#8221; in een programmeertaal worden opgebouwd. Ook hierbij is weer mooi de parallel te trekken met de Nederlandse taal. &#8220;Hee meneer, doe mij maar een zak met appels!&#8221; is grammaticaal correct, terwijl een &#8220;He meneer, doe ik een zak maar met appels!&#8221; grammaticaal incorrect is. Voor de groenteboer is het dan ook moeilijk te begrijpen wat de klant wil indien hij/zij geen zinnen maakt die niet voldoen aan de grammaticale en syntaxis-regels van de Nederlandse taal.<br />
	De metafoor voor het programmeren (de communicatie met de groenteboer) moet nu wel duidelijk zijn. Het verschil bij het programmeren is dat men meestal communiceert met een &#8220;compiler&#8221; of een &#8220;interpreter&#8221;. Deze controleren de code van de programmeur op fouten in de syntaxtische en grammaticale regels. Een &#8220;compiler&#8221; (lees: vertaler) zal de programmeercode daarna omzetten naar een &#8220;executable&#8221; zodat de gebruiker dat bestand kan uitvoeren, terwijl een &#8220;interpreter&#8221; de code interpreteert en meteen uitvoerd.<br />
	Om weer even terug te komen op Python; het is een geinterpreteerde taal. Er zijn wel manieren om executables van je code te maken, maar die werken erg slecht en maken je programma enorm traag en veel groter dan nodig is. Dus om in Python te kunnen programmeren heb je eigenlijk alleen maar de &#8220;interpreter&#8221; nodig en die is beschikbaar voor (bijna) elk platform. [2]</p>
<p>- Opzet van een programmeertaal</p>
<p>Programmeren bestaat uit het in een editor (VIM, emacs, UltraEdit, joe) typen van programmeercode. Deze code bestaat uit allerlei bewerkingen, veelal op variabelen. Variabelen zijn niets meer dan een stukje geheugen waarin een bepaalde waarde kan worden geplaatst. Net als de groenteboer die plastic zakjes gebruikt om het fruit en de groente in te doen zal de programmeur dus variabelen gebruiken om zijn dingen in te stoppen.<br />
	Er zijn echter verschillende soorten variabelen. Zo zijn er &#8220;chars&#8221; die ruimte hebben om precies 1 karakter (ASCII) in op te slaan. Dan zijn er &#8220;ints&#8221; (integers of reals) waarin een geheel (!!) getal tussne 0 en 2^32 kan worden geplaatst. Bij &#8220;floats&#8221; kan de programmeur een getal met decimalen achter de komma op slaan en dan zijn er natuurlijk ook nog de &#8220;strings&#8221; die gewoon een opeenvolging van karakters bevat. Een &#8220;string&#8221; die je zou kunnen opslaan zou deze zin bijvoorbeeld kunnen zijn. Vaak kan een programmeur eigen datatypes gebruiken ( vooral bij het object-georienteerde programmeren) is dat handig. Dit is voorlopig nog niet aan de orde aangezien dit document echt over de beginselen van het programmeren handelt.<br />
	De opzet van vele programmeertalen is om code te kunnen hergebruiken. Een programmeur wil niet bijvoorbeeld tien keer een x aantal regels typen om een bepaalde actie te kunnen verrichten. Vergelijk dit met de groenteboer. Deze heeft ook niet 10 kassa&#8217;s voor 10 verschillende klanten met daarachter 10 kassameisjes. De groenteboer zorgt heeft gewoon 1 kassa met 1 kassameisje en die wordt gebruikt door alle klanten. Dit kun je weer zien als een metafoor met het programmeren. Een stuk code (de kassa) wordt door verschillende andere stukken code (de klanten / het kassameisje) gebruikt.<br />
	In de programmeertaal noemt men zo&#8217;n stuk code ook wel een functie. Vaak worden er &#8220;variabelen&#8221; meegegeven aan een functie (zoals je het zakje met fruit aan het kassameisje geeft zodat die het weegt). Nadat dat gebeurd is zal de interpreter verder gaan waar ze gebleven was.</p>
<p>- Beginselen van het programmeren</p>
<p>Als het goed is hebben we nu een beetje een idee hoe een programeertaal is opgebouwd. Om ervoor te zorgen dat onze code wordt uitgevoerd moet deze syntaxtisch en grammaticaal correct zijn. Om er bovendien voor te zorgen dat we data kunnen opslaan hebben we dus variabelen en functies nodig. We zullen nu (eindelijk) eens wat dingen gaan proberen in Python. Hierbij wordt ervan uitgegaan dat de lezer Python heeft geinstalleerd [2] en de interpreter heeft opgestart. Dit wijst zich erg vanzelf. Onder Windows wordt alles automatisch geinstalleerd en kun je Python gewoon opstarten door in het Startmenu te kijken. Voor elke *nix is het echter anders en dat zal ik niet gaan behandelen. De informatie op de website is redelijk duidelijk en bovendien heeft bijna elke distributie Python standaard geinstalleerd of het is heel makkelijk om dat met het desbetreffende package-managementsysteem te installeren.<br />
	Als men de interpreter opstart krijgt men als het goed is een &#8220;prompt&#8221; voor de neus. Hierin kan je allerlei commando&#8217;s typen. Zodra je echt grotere programma&#8217;s gaat schrijven is het makkelijker om de meegeleverde Python editor (IDLE) te gebruiken waarin je alles op kan slaan als een file zodat je niet alles elke keer overnieuw hoeft te typen.</p>
<p>gorny@sethanon:~$ python<br />
Python 2.1.3 (#1, Sep  7 2002, 15:29:56)<br />
[GCC 2.95.4 20011002 (Debian prerelease)] on linux2<br />
Type &#8220;copyright&#8221;, &#8220;credits&#8221; or &#8220;license&#8221; for more information.<br />
&gt;&gt;&gt; x = 2<br />
&gt;&gt;&gt; print x<br />
2<br />
&gt;&gt;&gt; </p>
<p>Zoals men ziet heb ik hier een variabele gemaakt genaamd &#8220;x&#8221;. Deze variabele geef ik de waarde 2. Let op! Het werkt dus anders dan bij de wiskunde waarbij een a = b betekent dat a gelijk is aan b. In het programmeren wordt er bedoeld dat in de variabele x (het plastic zakje dus) de waarde 2 (appels?) wordt gestopt. Met het commando print x wordt dan de waarde getoond. Hieronder zullen nog wat voorbeelden gegeven worden van de andere soorten variabelen.</p>
<p>&gt;&gt;&gt; x = 1.345<br />
&gt;&gt;&gt; print x<br />
1.345<br />
&gt;&gt;&gt; x = &#8216;A&#8217;<br />
&gt;&gt;&gt; print x<br />
A<br />
&gt;&gt;&gt; x = &#8216;appels zijn het lekkerst van de groenteboer&#8217;<br />
&gt;&gt;&gt; print x<br />
appels zijn het lekkerst van de groenteboer<br />
&gt;&gt;&gt; </p>
<p>Zoals we zien heb ik eerst een &#8220;float&#8221; gecreeerd en daarna een &#8220;char&#8221;. De code eindigt met maken van een &#8220;string&#8221;. Het mooie van Python is dat het &#8220;dynamisch getypeerd&#8221; is. Zoals we zien hebben we niet elke keer mee moeten geven aan de variabele x WAT we erin gaan stoppen (een groenteboer vertelt ook niet aan het zakje dat hij er appels in gaat stoppen). Bovendien kan je later gewoon iets totaal anders in de variabele stoppen (zo werkt elke zichzelfrespecterende plastic zak immers ook). Let op! Bij de strings in Python (en de chars) is het ook mogelijk om ze te omgeven met een &#8221; in plaats van een &#8216;. Dit heeft echter verder totaal geen effect. De variabelenaam x noemen we een &#8220;identifier&#8221;. De interpreter identificeert hiermee de variabele. Alles moet een naam hebben omdat we het anders niet zo makkelijk kunnen gebruiken.</p>
<p>&gt;&gt;&gt; x = t<br />
Traceback (most recent call last):<br />
  File &#8220;&lt;stdin&gt;&#8221;, line 1, in ?<br />
NameError: name &#8216;t&#8217; is not defined</p>
<p>Wat gebeurd er nu? We hebben geprobeerd aan x de variabele t toe te wijzen. Maar aangezien we de variabele t nog niet gedefinieerd hebben kan de interpreter hier niets mee.</p>
<p>&gt;&gt;&gt; t = 3<br />
&gt;&gt;&gt; x = 2<br />
&gt;&gt;&gt; print t, x<br />
3 2<br />
&gt;&gt;&gt; x = t<br />
&gt;&gt;&gt; print t, x<br />
3 3</p>
<p>Ook dit stukje code is erg simpel. We hebben twee plastic zakjes genaamd x en t. In x zitten 2 appels en in t zitten 3 appels. Nu zorgen we ervoor dat er evenveel appels in x als in t komen te zitten.</p>
<p>&gt;&gt;&gt; x = 3<br />
&gt;&gt;&gt; t = 5<br />
&gt;&gt;&gt; x + t<br />
8<br />
&gt;&gt;&gt; print x<br />
3<br />
&gt;&gt;&gt; x = x + t<br />
&gt;&gt;&gt; print x<br />
8</p>
<p>Ook dit is erg duidelijk. We hebben twee variabelen genaamt x en t en die tellen we bij elkaar op. Bij de eerste keer optellen komt er 8 uit maar de variabelen x en/of t worden niet veranderd. Bij de tweede keer tellen we echter x en t bij elkaar op en dat resultaat wordt in x gestopt. De interpreter werkt dus van rechts naar links. Bij de wiskunde zou dit heel anders werken. Dan zou er uit volgen; x = x + t &#8211;&gt; x-x = t &#8211;&gt; 0 = t &#8211;&gt; t = 0. </p>
<p>- &#8220;Flow control&#8221;</p>
<p>We gaan ons nu met iets anders bezig houden. Zoals we weten begint de interpreter bovenin het bestand en voert daarna alles rechttoe rechtaan uit. Maar met de technieken die vallen onder de &#8220;Flow control&#8221; oftewel de controle over hoe het programma uitvoert (flowed) kunnen we dit wat aanpassen. Hiervoor gebruiken we bijvoorbeeld de if/else/while/for &#8220;statements&#8221;. Een statement is in feite niets meer dan een bewering die door de interpreter wordt uitgevoerd.<br />
	Bij het programmeren worden echter ook expressies gebruikt. Deze kunnen maar twee waardes hebben genaamd True of False (sommige programmeertalen hebben ook booleans waaronder Python die zo&#8217;n type representeren). Voor True of False (lees: Waar / Niet-Waar) worden ook vaak de waarden 1 en 0 gebruikt. Dit kunnen we illustreren met het volgende voorbeeld.</p>
<p>&gt;&gt;&gt; print x<br />
3<br />
&gt;&gt;&gt; x == 3<br />
1<br />
&gt;&gt;&gt; x == 2<br />
0</p>
<p>Let op! Er wordt nu een dubbele = gebruikt. Met 1 &#8220;isgelijkteken&#8221; zouden we immers de variabele x een nieuwe waarde toe gaan wijzen en dat was niet de bedoeling. Zoals we zien valideert de eerste expressie. x heeft namelijk de waarde drie en dus is die expressie gelijk aan 1 (waar). De tweede expressie valideert niet want x is NIET gelijk aan 2 maar aan 3 en dus is die expressie gelijk aan 0 (niet-waar). Het is dus zaak altijd erg goed op te letten waarna je met een expressie bezig bent of met een statement aangezien het rare fouten op kan leveren als je het verkeerde aantal isgelijktekens gebruikt.</p>
<p>&gt;&gt;&gt; x = 4<br />
&gt;&gt;&gt; if x == 4:<br />
&#8230;     print &#8216;er zitten 4 appels in de zak&#8217;<br />
&#8230; else:<br />
&#8230;     print &#8216;er zitten meer of minder dan 4 appels in de zak&#8217;<br />
&#8230;<br />
er zitten 4 appels in de zak</p>
<p>Bij het voorgaande stukje code wordt het inspringen bij de &#8220;print&#8221; statements gedaan door de TAB toets. Let hierbij op. Python kent niet, zoals andere talen, haakjes of accolades om &#8220;blokken&#8221; af te sluiten. Door naar het aantal TABS te kijken weet de interpreter (of de programmeur) welk stukje code waarbij hoort. Dus alles dat naar het eerste &#8220;if&#8221; statement komt en begint met een TAB behoort nog onder dat if-statement en zal dus uitgevoerd worden als de expressie &#8220;x == 4&#8243; wordt gevalideert (dus waar is). We kunnen echter ook andere tekens gebruiken zals &lt;, &gt; en !=. De eerste staat voor kleiner dan, de tweede voor groter dan en de derde voor &#8220;isongelijkaan&#8221;.</p>
<p>&gt;&gt;&gt; x = 6<br />
&gt;&gt;&gt; if x &gt; 4:<br />
&#8230;     print &#8220;x is meer dan 4&#8243;<br />
&#8230; elif x &lt; 2:<br />
&#8230;     print &#8220;x is minder dan 2&#8243;<br />
&#8230; elif x != 3:<br />
&#8230;     print &#8220;x is ongelijk aan 3&#8243;<br />
&#8230;<br />
x is meer dan 4</p>
<p>Let op! Het &#8220;elif&#8221; statement staat alleen maar voor de afkorting van &#8220;else if&#8221;. Hierdoor kan je dus meerdere condities valideren met een serie van if statements. Maar waarom wordt er niet geprint dat x ongelijk is aan 3? Dat komt omdat de if en de 2 elifs bij elkaar horen. Zodra er 1 expressie als WAAR wordt geevalueerd dan zal de interpreter de rest van het blok overslaan en verder gaan waar hij gebleven was.</p>
<p>&gt;&gt;&gt; x = 6<br />
&gt;&gt;&gt; if x &gt; 4:<br />
&#8230;     print &#8220;x is meer dan 4&#8243;<br />
&#8230; elif x &lt; 2:<br />
&#8230;     print &#8220;x is minder dan 2&#8243;<br />
&#8230; if x != 3:<br />
&#8230;     print &#8220;x is ongelijk aan 3&#8243;<br />
&#8230;<br />
x is meer dan 4<br />
x is ongelijk aan 3</p>
<p>Zoals we zien wordt er nu een nieuw if-blok gemaakt waardoor de interpreter het nu wel mee zal nemen en dus wordt het bericht dat x ongelijk aan drie is ook getoond. Er kan bij een if-blok altijd maar 1 ifstatement gebruikt worden, waarna er een (in theorie) oneindig aantal elif statements kan volgen met als afsluitend een else statement. Dit hoeft echter niet. Een if-statement kan ook gewoon op zichzelf staan.</p>
<p>&gt;&gt;&gt; i = 5<br />
&gt;&gt;&gt; while i &gt; 0:<br />
&#8230;     print i<br />
&#8230;     i = i &#8211; 1<br />
&#8230;<br />
5<br />
4<br />
3<br />
2<br />
1</p>
<p>Dit is een voorbeeld van het gebruik van een while-lus. Deze voert eigenlijk net zolang alles in het while-blok uit zolang de expressie i &gt; 0 geldt. Hierbij moet je dus erg oppassen. Zou je de &#8220;i = i &#8211; 1&#8243; vergeten dan zou de interpreter eeuwig in het blok blijven zitten en continu 5 op het scherm printen en nooit meer verder gaan met de rest van het programma. Het is dus belangrijk om er voor te zorgen dat je altijd uit de lus kan &#8220;springen&#8221;.</p>
<p>&gt;&gt;&gt; for i in range(0, 5):<br />
&#8230;     print i<br />
&#8230;<br />
0<br />
1<br />
2<br />
3<br />
4</p>
<p>Een ander voorbeeld is de for-lus. Hierbij hoeft de i niet eerst gedeclareerd te worden. Dit doet de range() functie voor je. Het enige wat er hier gebeurd is dat de range begint bij 0 en daarna 5 stappen doet. Hierdoor wordt het getal 5 ook niet op het scherm geprint. 0-4 zijn immers vijf getallen.</p>
<p>&gt;&gt;&gt; for i in range(0, 4, 2):<br />
&#8230;     print i<br />
&#8230;<br />
0<br />
2</p>
<p>Met de for-lus en de range functie kun je ook de grootte van de stapjes aangeven die gedaan moeten worden. Het werkt eigenlijk erg intuitief en makkelijk. De for-lus werkt op deze manier wel anders dan in andere programmeertalen maar dat heeft met het objectgeorienteerde karakter van Python te maken. Voor de beginner is dit voldoende om te weten en hij/zij kan dan ook genoeg met deze lussen uitvoeren.</p>
<p>- Functies in Python</p>
<p>We gaan het nu eindelijk hebben over functies. De eerste zijn we al tegengekomen (de range() functie) die twee of drie variabelen aankan. Het is nu handiger om een editor te gebruiken (notepad is al voldoende) omdat we nu wat meer code gaan produceren. Het bestand waarin je alles getypt hebt sla je op en voer je daarna uit door iets ala: &#8220;gorny@sethanon:~$ python file.py&#8221; te typen. Voor Windows gebruikers is het een kwestie van het bestand opslaan met de extentie .py en daarna erop te dubbelklikken. De mensen die IDLE (van harte aanbevolen, draait onder bijna elk platform) gebruiken kunnen gewoon de code bewerken, op slaan en dan op Control-F5 drukken om hun code uit te voeren.<br />
	Functies hebben in Python, net zoals variabelen een bepaalde &#8220;identifier&#8221; oftewel een naam. Deze naam moet (net zoals bij variabelen) uniek zijn. Bovendien zit er een verschil tussen hoofd- en kleine letters. Een functienaam mag ook niet hetzelfde zijn als een variabelenaam. Doet de programmeur dit toch dan zal op dat moment de naam naar de functie verwijsen en niet meer naar de variabele. In het omgekeerde geval geldt precies hetzelfde. Een functie in Python definieer je met het &#8220;keyword&#8221; def. Deze sleutelwoorden (net zoals if/else) mogen natuurlijk niet als functienaam of variabelenaam gebruikt worden anders zou de interpreter het enorm moeilijk krijgen om de code nog uit te voeren. </p>
<p>&gt;&gt;&gt; def telop(a, erbijop):<br />
&#8230;     return a + erbijop<br />
&#8230;<br />
&gt;&gt;&gt; print telop(2, 3)<br />
5</p>
<p>Wat doet dit stukje code? Het roept de functie telop aan. Zoals te zien is accepteert de telop() functie twee verschillende variabelen genaamd a en erbijop. De functie telt &#8220;a en erbijop&#8221; op en retouneert dat getal. Het print statement doet niets meer dan het print van het &#8220;antwoord&#8221;. De waardes die aan telop() worden meegegeven worden in de variabelen a en erbijop geplaatst. Een functie in Python hoeft echter niet expliciet te returnen. Als dat niet gebeurd (of er staat een return statement met verder geen waarde erachter) dan retouneert de functie simpelweg None.</p>
<p>&gt;&gt;&gt; def test(start=1, end=5):<br />
&#8230;     for i in range(start, end):<br />
&#8230;         print i<br />
&#8230;<br />
&gt;&gt;&gt; test()<br />
1<br />
2<br />
3<br />
4<br />
&gt;&gt;&gt; test(2, 3)<br />
2<br />
&gt;&gt;&gt; print test(0, 0)<br />
None</p>
<p>In dit voorbeeld gebruiken we een functie test die de waarden in de range van &#8220;start&#8221; tot &#8220;end&#8221; afdrukt. Het mooie van Python is dat we standaard (&#8220;default&#8221;) waarden mee kunnen geven. Zodra we dus geen variabelen meegeven aan de functie test() dan zal deze gewoon de standaard waarden voor start en end nemen en daarmee rekenen. De allerlaatste regel laat zien wat test() retouneert, namelijk None.</p>
<p>- Je vriendjes</p>
<p>Elke programmeur heeft vriendjes. Veel vriendjes. Daaronder valt onder andere je editor, maar natuurlijk ook je compiler (of interpreter), je favoriete browser en je lievelings besturingssysteem. Maar de (beginnende) programmeur heeft nog een vriendje. Deze vriend heet &#8220;array&#8221;. De array is een enorm handig verschijnsel dat je zal helpen bij vele problemen die je anders moeilijk op kan lossen.<br />
    Neem bijvoorbeeld een programma dat veertig verschillende getallen bij elkaar moet optellen. Het zou een beetje een heel erg gedoe zijn om nu allemaal variabelen met namen als a0, a1 tot en met a39 te gaan declareren. In de praktijk is dit niet te doen en je programma moet meteen weer volledig aangepast worden wil je 50, 60 of zelfs 1000 getallen bij elkaar optellen. Niet te doen dus. Daarvoor bestaat de array. Een array is niets meer dan een verzameling datatypen die een gezamenlijke &#8220;identifier&#8221; hebben.<br />
    Bij de meeste programmeertalen is een array gebonden aan een bepaald type (dus een array van het type float of van het type char), maar aangezien Python dynamisch getypeerd is hoef je daar geen rekening mee te houden. Een array kan dus tegelijkertijd integers en strings bevatten.<br />
    Om toch onderscheid te kunnen maken tussen de verschillende elementen van een array wordt er een &#8220;index&#8221; gebruikt. Dit is niets meer dan een geheel, positief getal (beginnend bij 0) waarmee een bepaald element in de array wordt aangeduidt.</p>
<p>&gt;&gt;&gt; t = []<br />
&gt;&gt;&gt; print t<br />
[]<br />
&gt;&gt;&gt; t = [4, 1, 9]<br />
&gt;&gt;&gt; print t<br />
[4, 1, 9]<br />
&gt;&gt;&gt; print t[0], t[1], t[2]<br />
4 1 9</p>
<p>Allereerst declareren we een lege array t. Zoals te zien is wordt een Array in Python met blokhaken aangegeven. Daarna maken we een een array aan met 3 elementen (4, 1 en 9). Zoals te zien is wordt de eerste keer de volledige array geprint terwijl bij het tweede print-statement alle elementen (met een index van 0 tot 2) afzonderlijk worden geprint.<br />
    Het mooie van Python is dat de grootte van arrays ook dynamisch is. Bij andere talen declareert de programmeur vaak een array van een bepaalde grootte waardoor er niet meer dan een bepaald aantal elementen in de array gestopt kan worden. Bij Python gaat dit allemaal veel makkelijker.</p>
<p>&gt;&gt;&gt; t.append(6)<br />
&gt;&gt;&gt; print t<br />
[4, 1, 9, 6]<br />
&gt;&gt;&gt; t[2] = 11<br />
&gt;&gt;&gt; print t<br />
[4, 1, 11, 6]</p>
<p>Met de notatie .append() wordt er een element toegevoegd aan de array. Deze notatie volgt uit het Object-geOrienteerde Programmeren en dat zal in dit document niet behandelt worden. Het is voor jullie genoeg om te weten dat er simpelweg iets meegegeven kan worden aan de .append() call om iets toe te voegen aan de array.<br />
    De waardes van de dingen in de array kunnen simpelweg worden verandert op dezelfde manier zoals de waarde van een normale variabele wordt verandert. Let wel altijd op het index teken. Dit is voor beginners vaak een bron van verwarring. Elke, zichzelfrespecterende programmeertaal begint bij alles met tellen bij 0 en zo Python dus ook. Bij t[2] wordt dan ook het derde element in de array bedoeld, zoals ook te zien is aangezien de 9 dan in een 11 is veranderd.</p>
<p>&gt;&gt;&gt; t.pop()<br />
6<br />
&gt;&gt;&gt; print t<br />
[4, 1, 11]<br />
&gt;&gt;&gt; t.pop(1)<br />
1<br />
&gt;&gt;&gt; print t<br />
[4, 11]</p>
<p>Met .pop() kunnen er elementen uit de array verwijdert worden. Standaard verwijdert pop() het laatste element en retouneert dat ook (waarom het ook op de standaard uitvoer wordt geprint). Er kan echter ook een index meegegeven worden zodat het element met die specifieke index uit de array wordt verwijderd. [3]</p>
<p>- Afsluiting</p>
<p>Ik hoop dat je nu wat meer duidelijk is over de edele kunst van het programmeren. Let wel, dit was echter een introductie tot de schamele basis van het programmeren. Bovendien is er nog niets verteld over het Object Georienteerde Programmeren. Dit is haast onmisbaar om volledig met de (uitgebreide) Python Bibliotheken te kunnen werken, maar ik vond het niet geschikt om meteen daarover al te beginnen. Een vervolg document zou misschien dus wel een goed idee zijn <img src='http://www.evilcoder.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<br />
    Voor verdere vragen kan je altijd contact met mij opnemen via email of IRC, of ze stellen op het Mostly-Harmless forum [4]. Suggesties en andere op- of aanmerkingen zijn ook van harte welkom.</p>
<p>    Vincent &#8220;gorny&#8221; Berg</p>
<p>- Literatuur</p>
<p>[1]	Why Python? &#8212; Eric S. Raymond</p>
<p>http://www.linuxjournal.com/article.php?sid=3882</p>
<p>[2] Officiele Python Website</p>
<p>http://www.python.org</p>
<p>[3] Arrays in Python</p>
<p>http://users.ox.ac.uk/~sann1276/python/handbook/node39.html</p>
<p>[4] Mostly-Harmless Forums</p>
<p>http://www.mostly-harmless.nl/forums/</p>
<p>* EOF *</PRE><br /><span id="more-719"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilcoder.org/2004/06/02/programmeertaal-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firewalls: Iptables</title>
		<link>http://www.evilcoder.org/2004/06/02/firewalls-iptables/</link>
		<comments>http://www.evilcoder.org/2004/06/02/firewalls-iptables/#comments</comments>
		<pubDate>Wed, 30 Nov -0001 00:00:00 +0000</pubDate>
		<dc:creator>Remko</dc:creator>
				<category><![CDATA[Mostly-Harmless]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[&#160;Titel: IPtables, een firewall voor linux Schrijver: Arn Vollebregt Versie: 1.0 Op de planning: Toevoeging over logfiles. Index 0.1 Voorwoord 0.2 Benodigheden 0.3 Packet forwarding 1.0 Hoe zit IPtables in elkaar 1.1 De bediening van IPtables 1.2 Rekening houden met IPtables &#8216;slechte&#8217; geheugen 1.3 Een simpele firewall 1.4 Een statefull firewall 1.5 Een DMZ 1.6 [...]]]></description>
			<content:encoded><![CDATA[<p><!--StartFragment -->&nbsp;<PRE>Titel: IPtables, een firewall voor linux<br />
Schrijver: Arn Vollebregt<br />
Versie: 1.0<br />
Op de planning: Toevoeging over logfiles.</p>
<p>Index<br />
0.1 Voorwoord<br />
0.2 Benodigheden<br />
0.3 Packet forwarding<br />
1.0 Hoe zit IPtables in elkaar<br />
1.1 De bediening van IPtables<br />
1.2 Rekening houden met IPtables &#8216;slechte&#8217; geheugen<br />
1.3 Een simpele firewall<br />
1.4 Een statefull firewall<br />
1.5 Een DMZ<br />
1.6 De firewall policy<br />
1.7 Tips voor het gebruik van IPtables<br />
1.8 Nawoord</p>
<p>0.1 Voorwoord<br />
Waarom heb je een firewall nodig?<br />
Het risico van een aanval op een van je computers is met de afgelopen jaren flink toegenomen.<br />
Met de dag worden er beveiligings gaten gevonden in Operating Systems, danwel de software die daarop draait.<br />
En met de dag worden er ook kant en klare tools en exploits op het internet gezet die het leven van een potentiele aanvaller<br />
een stuk makkelijker maken. Als je altijd met je computers bezig bent zijn ze natuurlijk volledig up-to-date, en wordt de<br />
kans een stuk kleiner dat je systeem gehacked zal worden. Doch ben je ook dan nog niet volledig veilig voor 0days[1].<br />
Een firewall helpt je het risico van een hack op een van jou computers te verkleinen. Dit door ten eerste het aantal<br />
toegangswegen naar jou computers drastisch te verkleinen, en ten tweede door computers die vanaf het internet bereikbaar<br />
moeten zijn in een apart netwerk te stoppen, welke los staat van je normale netwerk.</p>
<p>[1] Beveiligingsgaten die nog maar net ontdekt zijn en waarvoor nog geen patch bestaat.</p>
<p>0.2 Benodigheden<br />
Deze text gaat ervan uit dat je beschikt over het volgende:<br />
1) Een linux Operating System waar je volledige controlle (root) over hebt.<br />
2) IPtables dient geinstalleerd te zijn.<br />
3) 2 NIC&#8217;s[1] (als je geen publieke services gaat draaien).<br />
4) 3 NIC&#8217;s (als je een publieke service gaat draaien, bijvoorbeeld een webserver).<br />
5) Basis kennis van linux (weten hoe je bestanden moet bewerken, en hoe je moet navigeren).<br />
6) Basis kennis van netwerken (protocolen en porten).</p>
<p>[1] NIC staat voor Network Interface Card, oftewel een netwerk kaart.</p>
<p>0.3 Packet forwarding<br />
Voordat we de firewall regels gaan bouwen, zullen we eerst moeten zorgen dat de firewall data pakketen door kan geven naar<br />
computers achter de firewalls.<br />
Dit process zal per Operating System verschillend zijn, aangezien ik zelf alleen Redhat draai bij deze een uitleg voor<br />
Redhat;<br />
Open &#8216;/etc/sysctl.conf&#8217; in een editor, en verander &#8216;net.ipv4.ip_forward = 0&#8242; in<br />
&#8216;net.ipv4.ip_forward = 1&#8242;.</p>
<p>1.0 Hoe zit IPtables in elkaar<br />
Hoe IPtables precies in elkaar zit doet er op dit moment niet zoveel toe, maar het is handig om het volgende te weten;<br />
IPtables is opgebouwd uit verschillende tabellen (tables), waar iedere tabel ook weer is onder verdeeld in zogenaamde<br />
ketenen (chains):</p>
<p>                 tables<br />
       +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
       |   filter   |    nat     |<br />
       +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
       |   INPUT    | PREROUTING |<br />
chains +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
       |  FORWARD   |POSTROUTING |<br />
       +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
       |   OUTPUT   |   OUTPUT   |<br />
       +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+</p>
<p>Er is nog een derde table genaamd &#8216;mangle&#8217; maar daar gaan we ons niet mee bezig houden in deze text.</p>
<p>Verkeer welke door de firewall heen gaat, zal op de volgende manier door deze tabellen heenlopen:</p>
<p>                                 &#8212;&#8212;&#8212;-<br />
                               /            \<br />
                              |   internet   |<br />
                               \            /<br />
                                 &#8212;&#8212;&#8212;-<br />
                                     |<br />
                                     V<br />
                                     |<br />
                        +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
                        |   table    |   chain    |<br />
             +&#8211;&lt;&#8212;&lt;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&gt;&#8212;&gt;&#8211;+<br />
             |          |    nat     | PREROUTING |          |<br />
             V          +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+          V<br />
             |                                               |<br />
data voor de server zelf                  data voor computers achter de server<br />
             |                                               |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+                     +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
|   table    |   chain    |                     |   table    |   chain    |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+                     +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
|   filter   |   INPUT    |                     |   filter   |  FORWARD   |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+                     +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
             |                                               |<br />
             V                                               V<br />
             |                                               |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+                     +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
|   table    |   chain    |                     |   table    |   chain    |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+                     +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
|    nat     |   OUTPUT   |                     |   filter   |   OUTPUT   |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+                     +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
             |                                               |<br />
             V                                               V<br />
             |                                               |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+                                  |<br />
|   table    |   chain    |                                  V<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+                                  |<br />
|   filter   |   OUTPUT   |                                  |<br />
+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+                                  V<br />
             |                                               |<br />
             |                                               |<br />
             V                                               V<br />
             |          +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+          |<br />
             |          |   table    |   chain    |          |<br />
             +&#8211;&gt;&#8212;&gt;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&lt;&#8212;&lt;&#8211;+<br />
                        |    nat     |POSTROUTING |<br />
                        +&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+<br />
                                     |<br />
                                     V<br />
                                     |<br />
                                 &#8212;&#8212;&#8212;-<br />
                               /            \<br />
                              |   netwerk    |<br />
                               \            /<br />
                                 &#8212;&#8212;&#8212;-</p>
<p>Dit ziet er waarschijnlijk complex uit op dit moment, maar dit is een handig plaatje om naar terug te kunnen grijpen,<br />
aangezien het belangrijk is om te weten welke weg data zal bewandelen als je hier een firewall regel voor wilt aanmaken.</p>
<p>1.1 De bediening van IPtables<br />
Alhoewel je natuurlijk alles uit de man[1] pagina&#8217;s kunt halen, zal ik hier toch een paar basis dingen uitleggen. Alle<br />
commando&#8217;s staan tussen quotes, maar dienen natuurlijk zonder quotes via de commandline ingevoerd te worden.</p>
<p>Onderstaan commando laat de huidige regelset uit de tabel &#8216;nat&#8217; zien;</p>
<p>&#8216;iptables -t nat -L -n -v&#8217;</p>
<p>&#8216;iptables&#8217; = het commando om iptables aan te roepen.<br />
&#8216;-t&#8217; = &#8216;table&#8217;<br />
&#8216;nat&#8217; = de table die je wilt zien. Opties; &#8216;filter&#8217;, &#8216;nat&#8217; en &#8216;mangle&#8217;.<br />
&#8216;-L&#8217; = &#8216;list&#8217;, een lijst van de regels die in deze table zitten.<br />
&#8216;-n&#8217; = &#8216;numeric&#8217;, netjes alles in nummertjes (IP&#8217;s, ranges, etc).<br />
&#8216;-v&#8217; = &#8216;verbose&#8217;, een uitgebreidere weergave.</p>
<p>Onderstaan commando voegt een firewall regel toe voor SSH[2];</p>
<p>&#8216;iptables -A INPUT -p tcp &#8211;dport 22 &#8211;sport 0/0 -j ACCEPT&#8217;</p>
<p>&#8216;iptables&#8217; = het commando om iptables aan te roepen.<br />
&#8216;-A&#8217; = &#8216;append&#8217;, een regel toevoegen.<br />
&#8216;INPUT&#8217; = de &#8216;chain&#8217; waar de regel in komt.<br />
&#8216;-p&#8217; = &#8216;protocol&#8217;, het gebruikte protocol.<br />
&#8216;tcp&#8217; = het protocol waar deze regel voor geldt.<br />
&#8216;&#8211;dport&#8217; = &#8216;destination port&#8217;, de poort op de machine.<br />
&#8217;22&#8242; = de poort waar deze regel voor geldt.<br />
&#8216;&#8211;sport&#8217; = &#8216;source port&#8217;, de poort op de client.<br />
&#8217;0/0&#8242; = Iedere client poort wordt geaccepteerd.<br />
&#8216;-j&#8217; = &#8216;jump&#8217; wat er moet gebeuren met de data.<br />
&#8216;ACCEPT&#8217; = de data wordt geaccepteerd.</p>
<p>Aangezien in bovenstaand voorbeeld geen &#8216;-t&#8217; switch is meegegeven wordt deze regel aan de<br />
standaard tabel toegevoegd, &#8216;filter&#8217;.</p>
<p>[1] &#8216;man&#8217; staat voor manual, de handleiding.<br />
[2] &#8216;SSH&#8217; staat voor Secure Shell Header, een versie van telnet die gebruikt maakt van encryptie.</p>
<p>1.2 Rekening houden met IPtables &#8216;slechte&#8217; geheugen<br />
Alhoewel nieuwe regels die worden ingevoerd via de commandline meteen van kracht zijn, zal IPtables deze regels weer<br />
&#8216;vergeten&#8217; zijn zodra de computer danwel de service weer opnieuw opgestart wordt.<br />
Aan de ene kant is dit handig (zeker in deze beginne), aangezien je een cruciale fout makkelijk kan verhelpen door de<br />
computer of de service weer opnieuw op te starten. Aan de andere kant is dit natuurlijk vermoeiend zodra je een goede<br />
regelset (ruleset) hebt geproduceerd; Je wilt niet iedere keer weer opnieuw alle regels aan de firewall toevoegen.<br />
Ten eerste heeft IPtables een tweetal handige tools die je hierbij gaan helpen;<br />
&#8216;iptables-save&#8217; en &#8216;iptables-restore&#8217;.<br />
&#8216;iptables-save&#8217; slaat alle huidige regels van IPtables voor je op, en schrijft zo ook naar je scherm toe. Als je<br />
&#8216;iptables-save &gt; regels.txt&#8217; via de commandline uitvoert worden bovendien al je firewall regels opgeslagen in een textfile,<br />
zodat je verschillende versies kunt opslaan. Wil je vervolgens een van deze regelsets gebruiken dan voer je simpelweg<br />
&#8216;iptables-restore &lt; regels.txt&#8217; uit. Vervolgens voer je &#8216;service iptables restart&#8217; uit, en de firewall wordt geladen met je<br />
eigen regelset.</p>
<p>1.3 Een simpele firewall<br />
Onderstaand vind je een setup voor een simpele firewall. Text waar een # voor staat is uitleg en dient niet ingevoerd te<br />
worden.</p>
<p>iptables -A INPUT -i lo -j ACCEPT<br />
iptables -A OUTPUT -o lo -j ACCEPT<br />
# &#8216;lo&#8217; staat voor &#8216;loopback&#8217; (IP 127.0.0.1). Bovenstaande regels zijn nodig als je een X windows systeem wilt<br />
# draaien.<br />
iptables -A OUTPUT -o eth0 -s 0/0 -d 0/0 -m state &#8211;state NEW,RELATED,ESTABLISHED -j ACCEPT<br />
iptables -A INPUT -i eth0 -s 0/0 -d 0/0 -m state &#8211;state RELATED,ESTABLISHED -j ACCEPT<br />
# Bovenstaande regels staan dataverkeer van binnen naar buiten toe (eth0 is over het algemeen<br />
# de externe adapter die naar het internet gaat). Nieuw is de regel<br />
# &#8216;-m state &#8211;state, hierover zometeen meer uitleg.<br />
iptables -A OUTPUT -o eth1 -s 0/0 -d 0/0 -j ACCEPT<br />
iptables -A INPUT -i eth1 -s 0/0 -d 0/0 -j ACCEPT<br />
# Deze regels maken dataverkeer van en naar het lokale netwerk mogenlijk op interface eth1.<br />
# Je ziet hier 0/0 verschijnen omdat het niet veel uitmaakt waar de data heengaat danwel<br />
# vandaan komt zolang je geen publieke services draait (zie hiervoor &#8217;1.6 Een DMZ&#8217;).<br />
# &#8216;-i&#8217; specificeerd de &#8216;input&#8217;, de adapter waarop het verkeer binnen komt.<br />
# &#8216;-o&#8217; specificeerd de &#8216;ouput&#8217;, de adapter van waaruit het verkeer verstuurd wordt.<br />
# Aangezien er geen protocol is gespecificeerd worden alle protocolen toegelaten.<br />
iptables -A FORWARD -i eth0 -o eth1 -s 0/0 -d 0/0 -j ACCEPT<br />
iptables -A FORWARD -i eth1 -o eth0 -s 0/0 -d 0/0 -j ACCEPT<br />
# Deze regels maken dataverkeer mogenlijk tussen eth1 (het lokale netwerk) en eth0 (het internet)</p>
<p>1.4 Een statefull firewall<br />
&#8216;-m state &#8211;state NEW,RELATED,ESTABLISHED&#8217; roept met &#8216;-m&#8217; een module aan, in dit geval de &#8216;state&#8217; module.<br />
Zoals je ziet zijn er 3 opties (parameters) mogelijk bij deze module, zijnde &#8216;NEW&#8217;, &#8216;RELATED&#8217; en &#8216;ESTABLISHED&#8217;.<br />
Wat deze module doet is connecties van en naar de firewall bijhouden. Zoals je ziet in bovenstaande firewall regels zijn er<br />
geen enkele regels voor verkeer naar de firewall toe, alleen maar regels voor dataverkeer welke vanaf de firewall ergens<br />
anders heen gaan. De state module zal een relatie leggen tussen uitgaand en inkomend verkeer.</p>
<p>Een voorbeeld;<br />
PC1 achter de firewall maakt een connectie met PC2 op het internet:<br />
1) PC1 stuurt een data pakket naar poort 80 van PC2, en gebruikt daarvoor de lokaal poort 2724.<br />
2) PC2 stuurt data vanaf poort 80 naar PC1 op poort 2724.<br />
3) PC2 stuurt data naar poort 22 van PC1.<br />
De state module zal ervoor zorgen dat ondanks het feit dat er geen firewall regel is voor verkeer vanaf het internet met als<br />
source port 80, dat de data vanaf PC2 toch naar PC1 zal kunnen worden gestuurd door de firewall. PC1 heeft namelijk eerst<br />
data gestuurd naar poort 80 van PC2, dus de firewall zal dataverkeer vanaf poort 80 van PC2 als gerelated (related) zien.<br />
Het dataverkeer naar poort 22 vanaf PC2 naar PC1 wordt echter niet doorgelaten, aangezien de firewall nog geen data heeft<br />
gezien vanaf poort 22 van PC1 naar PC2. De state module maakt het leven dus een stuk simpeler, aangezien je niet apart<br />
allemaal regels aan hoeft te maken voor streaming audio en video, ICQ, MSN, websurfen, etc. Het enige nadeel is dat je geen<br />
totale controlle hebt over wat computers achter de firewall doen , maar dat is meer iets voor een professioneel/bedrijfs<br />
netwerk, voor een thuis netwerk maakt dit niet zoveel uit. Als je toch bepaalde verkeer niet wilt toelaten kun je dit ook<br />
expliciet tegenhouden (blocken) in je firewall regels.</p>
<p>1.5 Een DMZ<br />
DMZ staat voor De-Militarized Zone.<br />
Een DMZ is een apart lokaal netwerk welke los staat van je normale lokale netwerk. Dit betekend dat er in principe geen<br />
dataverkeer mogenlijk is vanaf je LAN naar je DMZ en andersom. De lol hiervan is, dat zelfs als een publieke service die je<br />
beschikbaar stelt via internet een beveiligingsgat bevat waardoor men de hele computer kan overnemen, men nog steeds niet bij<br />
de rest van de computers kan om deze ook over te nemen. Het opzetten van een DMZ is gedeeltelijk hetzelfde als de<br />
bovenstaande opzet, maar wat verder ingeperkt;</p>
<p>iptables -A INPUT -i lo -j ACCEPT<br />
iptables -A OUTPUT -o lo -j ACCEPT<br />
# X-Windows data verkeer.<br />
iptables -A OUTPUT -o eth0 -s 0/0 -d 0/0 -m state &#8211;state NEW,RELATED,ESTABLISHED -j ACCEPT<br />
iptables -A INPUT -i eth0 -s 0/0 -d 0/0 -m state &#8211;state RELATED,ESTABLISHED -j ACCEPT<br />
# Verkeer van en naar het internet.<br />
iptables -A INPUT -i eth1 -s ! 10.0.0.0/24 -d 192.168.0.0/24 -j ACCEPT<br />
iptables -A OUTPUT -o eth1 -s 192.168.0.0/24 -d ! 10.0.0.0/24 -j ACCEPT<br />
iptables -A FORWARD -i eth0 -o eth1 -s ! 10.0.0.0/24 -d 192.168.0.0/24 -j ACCEPT<br />
iptables -A FORWARD -i eth1 -o eth0 -s 192.168.0.0/24 -d ! 10.0.0.0/24 -j ACCEPT<br />
# Zoals je ziet is er verkeer op je LAN toegestaan, zolang het maar niet van en naar 10.0.0.0/24<br />
# gaat, wat de IP range is van de DMZ in dit voorbeeld.<br />
iptables -A INPUT -i eth2 -p tcp &#8211;dport 80 -d 10.0.0.2 -s ! 192.168.0.0/24 -j ACCEPT<br />
iptables -A OUTPUT -o eth2 -p tcp &#8211;sport 80 -s 10.0.0.2 -d ! 192.168.0.0/24 -j ACCEPT<br />
# Hier zie je een regel die verkeer naar en van IP 10.0.0.2 poort 80 toelaat op eth2 (de adapter<br />
# waar de DMZ op zit) zolang dit verkeer maar niet van en naar het gewone lokale netwerk gaat.<br />
iptables -A FORWARD -i eth0 -o eth2 -p tcp &#8211;dport 80 -d 10.0.0.2 -s ! 192.168.0.0/24 -j ACCEPT<br />
iptables -A FORWARD -i eth2 -o eth0 -p tcp &#8211;sport 80 -s 10.0.0.2 -d ! 192.168.0.0/24 -j ACCEPT<br />
# En een forwarding rule voor dataverkeer tussen de netwerk adapters.<br />
# Verkeer van en naar IP 10.0.0.2 poort 80 wordt netjes geforward, zolang het maar niets te<br />
# maken heeft met het normale lokale netwerk.<br />
iptables -t nat -A PREROUTING -i eth0 -p tcp &#8211;dport 80 -j DNAT &#8211;to 10.0.0.2<br />
# deze regel zorgt ervoor dat alle data die op poort 80 via adapter eth0 binnen komt doorgegeven zal<br />
# worden naar IP 10.0.0.2</p>
<p>1.6 De firewall policy<br />
Het is je mischien al opgevallen dat hoewel je firewall regels heb aangemaakt er nog steeds ander verkeer wordt doorgelaten<br />
door de firewall welke niet in deze regels voorkomt. Dit is toe te schrijven aan de policy die de firewall voert.<br />
De policy is de standaard actie die de firewall zal uitvoeren als data verkeer door de firewall heen probeert te komen. Op<br />
veel standaard installaties staat deze policy standaart op ACCEPT. De opties die voor de policy aanwezig zijn zijn &#8216;ACCEPT&#8217;,<br />
&#8216;DENY&#8217; en &#8216;DROP&#8217;.<br />
ACCEPT zal al het verkeerd door laten, inclusief verkeer welke niet vermeld staat in de firewall regels.<br />
DENY zal alleen verkeer doorlaten welke in de firewall regels beschreven staat, doch verkeer welke niet in deze regels staat<br />
zal netjes afgewimpeld worden met een foutmelding.<br />
DROP zal alleen verkeer doorlaten welke in de firewall regels beschreven staat, doch verkeer welke niet in deze regels staat<br />
Zal verdwijnen in een zwart gat, zonder dat de computer waar het verkeer vandaan komt een foutmelding zal krijgen. Iedere<br />
policy heeft een eigen voor- en nadeel, dus je zult moeten bekijken welke policy het beste bij je past.<br />
Als je een policy wilt veranderen voor een chain in een table, dan doe je dit als volgt:<br />
iptables -t nat -P POSTROUTING DROP</p>
<p>1.7 Tips voor het gebruik van IPtables<br />
Bij het configureren van IPtables kan men wel eens struikel blokken tegen komen, bij deze een paar tips zodat je daar alvast<br />
voor kunt uitkijken:<br />
1) Sla altijd de huidige firewall regels op voordat je deze gaat veranderen, zodat je altijd nog terug kunt gaan als je een<br />
fout hebt gemaakt. Doe dit door op de commandline in te typen:<br />
iptables-save &gt; file<br />
Het maakt niet uit naar wat voor een file je de regels schrijft, ikzelf gebruik namen als test.txt en current.txt.<br />
Als je deze opgeslagen regels weer wilt gebruiken type je:<br />
iptables-restore &lt; file<br />
2) Doe zoveel mogenlijk op de firewall zelf, het is aardig frustrerend (en soms zelfs lastig als je de firewall hebt opgezet<br />
zonder monitor en keyboard) als je via SSH bent ingelogd en per ongeluk een regel weggooid waardoor je SSH sessie ook<br />
wegvalt.<br />
3) Test altijd je firewall regels, gebruik hiervoor een sniffer en een gratis shell account waarbij je gebruik kunt maken van<br />
telnet. type op de commandline:<br />
telnet IP Poort<br />
Als er een connectie gemaakt kan woorden naar de poort, dan is er ergens wat fout gegaan. Doe dit niet alleen als je met je<br />
firewall hebt opgezet, maar ook als je grote veranderingen hebt aangebracht in je firewall regels. Het kan namelijk zijn dat<br />
de volgorde van de firewall regels zo is veranderd dat er opeens dataverkeer mogelijk is op een poort die je wilt verbieden.<br />
4) Laat een bekende een nmap en/of nessus scan op je IP doen, zodat je een gedetaileerd beeld krijgt van wat er nu wel en<br />
wat er nu niet open staat naar de buitenwereld. Als je niemand kent die dit voor je kan doen, of je wilt niet wachten, zoek<br />
dan een online service op die gebruik maakt van nmap.<br />
5) Denk niet dat je hele netwerk nu zo veilig is als de computers van de NSA. Alhoewel je nu netwerk verkeer beperkt hebt zul<br />
je de applicaties en services die je draait ook goed moeten configureren, en logs files moeten bijhouden van hun<br />
activiteiten. Als een database server bereikbaar is van internet en geen (of een standaard) wachtwoord heeft, dan helpt een<br />
firewall je niet.<br />
6) Zorg dat je een backup/image maakt van de firewall, en dat je deze weer kunt terug zetten vanaf cd of harde schijf (denk<br />
bijvoorbeeld aan ghost). Mocht er iets vreselijk fout gaan tijdens een update, of heb je ergens een configuratie bestand<br />
veranderd welke je niet meer kunt terug vinden, dan heb je altijd nog een werkende versie van je firewall achter de hand.<br />
7) Draai nooit services op een firewall. Iedere service die op je firewall draait is een potentiel probleem op het moment dat<br />
deze applicatie een beveiligings lek heeft. Als iemand via deze service toegang weet te krijgen op je firewall dan heeft deze<br />
toegang tot je hele netwerk. Draai dus nooit services op een firewall.</p>
<p>1.8 Nawoord<br />
Alhoewel ik deze text heb geschreven aan de hand van een draaiende firewall, kan het toch voorkomen dat ik slordigheids<br />
fouten heb gemaakt. Verder ben ik geen expert op het gebied van IPtables, dus het is goed mogelijk dat ik wellicht bepaalde<br />
concepten niet goed of onvolledig heb uitgelegt. Mocht je aan- danwel opmerkingen hebben op mijn text dan stel ik het op<br />
prijs als je deze naar mij verstuurd per email, zodat ik eventuele fouten kan verbeteren en/of opmerkingen mee kan nemen in<br />
een volgende versie van deze text. Ik ben te bereiken via het volgende e-mail adres: arn@mostly-harmless.nl<br />
Bij voorbaat dank.</p>
<p>Gebruikte bronnen: http://www.siliconvalleyccie.com/linux-hn/iptables-intro.htm</PRE><br /><span id="more-718"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilcoder.org/2004/06/02/firewalls-iptables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I only replaced the index.html</title>
		<link>http://www.evilcoder.org/2004/06/02/i-only-replaced-the-indexhtml/</link>
		<comments>http://www.evilcoder.org/2004/06/02/i-only-replaced-the-indexhtml/#comments</comments>
		<pubDate>Wed, 30 Nov -0001 00:00:00 +0000</pubDate>
		<dc:creator>Remko</dc:creator>
				<category><![CDATA[Mostly-Harmless]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[&#160;&#8220;Ik verving alleen maar de index.html&#8221; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Het lijkt erop dat de scriptkiddies die websites defacen geen idee hebben waarom hun gerommel zo&#8217;n gewelddadige reactie uitlokt van de bedrijven die ze aanvallen. Dit korte artikel zal een aantal van de gebeurtenissen achter de schermen op een rijtje zetten die voorvallen na de &#8220;onschuldige&#8221; vervanging van [...]]]></description>
			<content:encoded><![CDATA[<p><!--StartFragment -->&nbsp;<PRE>&#8220;Ik verving alleen maar de index.html&#8221;<br />
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</p>
<p>Het lijkt erop dat de scriptkiddies die websites defacen geen idee hebben<br />
waarom hun gerommel zo&#8217;n gewelddadige reactie uitlokt van de bedrijven die ze<br />
aanvallen. Dit korte artikel zal een aantal van de gebeurtenissen achter de<br />
schermen op een rijtje zetten die voorvallen na de &#8220;onschuldige&#8221; vervanging van<br />
de index.html door onze geliefde politieke activisten.</p>
<p>1. Het bedrijf wordt op de hoogte gebracht, meestal door een klant, dat hun<br />
   website is veranderd. De server beheerder, webmaster, of wie dan ook<br />
   verantwoordelijk is voor de inhoud is meestal de eerste die van de<br />
   gebeurtenis op de hoogte wordt gebracht, omdat het bedrijf waarschijnlijk<br />
   geen rampenplan heeft.</p>
<p>2. De beheerder schijt zeven kleuren stront en vertelt het zijn manager. De<br />
   beheerder, bang om zijn baan kwijt te raken, is de klos en vertelt zijn<br />
   chef dat het bedrijf is &#8220;gehacked&#8221;. Hij is nu waarschijnlijk bang dat de<br />
   aanvaller binnen is gekomen daar zijn zwakke wachtwoord, of door een van<br />
   zijn dozen die hij een half jaar terug had moeten upgraden.</p>
<p>3. Zodra hij dit hoort schijt de chef zeven kleuren stront. De afdelingschef<br />
   vreest nu voor zijn baan en wetend dat de toorn van het bestuur op zijn<br />
   schouders zal vallen voor het niet beveiligen van het systeem. Hij probeert<br />
   wanhopig te bedenken aan wie hij dit kan vertellen, zonder dat diegene hem<br />
   op slaande voet zal ontslaan. Hij belt zijn chef (meestal een vice president<br />
   type) en vertelt haar het nieuws.</p>
<p>4. Wanneer ze dit hoort flipt ze en schijt zeven kleuren stront. De vice<br />
   president belt Human Resources, Legal, Security (indien aanwezig) en de<br />
   bestuurder van Engineering of een andere ubergeek. De groep besluit<br />
   gezamenlijk of de site offline moet worden gehaald of niet. Er wordt een<br />
   telefoontje gepleegd naar de directeur om hem op de hoogte te brengen van de<br />
   situatie. Na een kort consult met de bedrijfsraad wordt de beslissing<br />
   genomen of contact moet worden gezocht met de politie of het OM. Meestal<br />
   staan de managers in aanvalshouding en willen ze de cracker &#8220;koste wat kost&#8221;<br />
   aggresssief vervolgen.</p>
<p>5. Gedurende het hele proces is de overwerkte beheerder bezig het systeem te<br />
   doorzoeken naar sporen die wijzen op hoe de hacker binnen is gekomen. Hoewel<br />
   de hacker zegt dat ie &#8220;alleen maar de index.html heeft vervangen&#8221; wil de<br />
   chef van de chef van de beheerder dat ELK systeem wordt gecheckt en<br />
   mogelijke gaten worden gedicht. De beheerder probeert nu een uitvoerige<br />
   security audit te doen in een uur.</p>
<p>6. De opperbazen van marketing proberen uit te vogelen hoe ze om moeten gaan<br />
   met de impact die dit heeft op het imago van het bedrijf. Nog nooit eerder<br />
   met een dergelijke situatie geconfronteerd besluit de directeur van<br />
   marketing al haar medewerkers bijeen te roepen voor een brainstormsessie om<br />
   te besluiten hoe ze met de situatie om moeten gaan.</p>
<p>7. Het systeem word waarschijnlijk gebackupped, uitgeschakeld, vervangen door<br />
   een nieuwe doos of in ieder geval zwaar geupgrade (daarbij nieuwe bugs<br />
   introducerend). Dit neemt voor de beheerder het grootste deel van de dag in<br />
   beslag. Normaal zou hij dit in een paar uur kunnen doen, maar omdat hij weet<br />
   dat de Vice President en de managers hem op de vingers kijken verzekert hij<br />
   zich ervan dat alles perfect wordt uitgevoerd.</p>
<p>8. Als het politie en/of OM zijn ingeschakeld dan zijn zij nu bezig met de<br />
   beheerders en advocaten te bekijken of ze een zaak hebben (waarschijnlijk<br />
   niet, omdat het meeste bewijs per ongeluk is gewist door de beheerder in de<br />
   eerste vier uur na het voorval).</p>
<p>9. De managers verordenen dat de systemen beveiligd zullen worden en dat iets<br />
   dergelijks nooit meer zal voorvallen. Het is waarschijnlijk dat er een<br />
   gevestigde consultant erbij wordt gehaald van E200+/uur om het bedrijf te<br />
   schatten en adviezen te geven om de site&#8217;s beveiliging te verbeteren. Omdat<br />
   de beheerder al bezig is met zijn dagelijkse werk, implementeert het<br />
   consultancy bedrijf hun aanbevelingen +voor E200+/uur).</p>
<p>10.Na een paar weken loopt alles weer zijn gangetje. Het bedrijf heeft nieuwe<br />
   ACLs, een nieuwe firewall, en misschien een nieuw beleid.</p>
<p>Nu dan, dit alles overziend kan men zien hoeveel personeel hierbijk betrokken<br />
is en hoeveel tijd er in wordt geinvestaard om iets &#8220;onschuldigs&#8221; als het<br />
defacen van de index.html . Ik heb het nog niet eens over de bijkomende<br />
gevolgen wanneer de beheerder een trojan of ongeauthoriseerde toegang tot<br />
handelsggeheimen van het bedrijf ontdekt. Dit is alleen nog maar het eenvoudige<br />
geval.</p>
<p>&#8220;Maar de aanvaller zei in zijn &#8216;bericht&#8217; dat hij de index.html had<br />
gebackupped. Ze hoefden allen maar het origineel terug te zetten!&#8221; Nee, domme<br />
sukkel, nee. De aanvaller heeft het bedrijf publiekelijk vernederd, heeft de<br />
wereld getoond dat de beveiliging van de site niet afdoende is en heeft<br />
persoonlijke verwarring veroorzaakt voor 5 of meer mensen.</p>
<p>Voorts, als ik thuis kom en de voordeur is open met een briefje erop geplakt<br />
maar op staat &#8220;Hoi. Ik heb bij je ingebroken. Ik heb allen wat spul<br />
verplaatst. Ik heb niks meegenomen. Groetjes, |)13|=&#8221;, en ik moet dat geloven?<br />
Zou jij het geloven? Als het betreffende bedrijf publiek verhandeld wordt, dan<br />
zijn ze legaal _verplicht_ om het uit te zoeken en maatregelen te nemen om<br />
dergelijke voorvallen te voorkomen. Als ze dat niet doen kunnen de<br />
aandeelhouders hen vervolgen voor nalatigheid.</p>
<p>Nu, ik kan onmogelijk de tientallen milljoenen die bedrijven claimen in zaken<br />
zoals Mitnick en anderen rechtvoordigen &#8211; dat is waanzin. Maar ik hoop dat na<br />
het bovenstaande te hebben gelezen duidelijk wordt dat er significant veel tijd<br />
en geld wordt besteed aan het opruimen van dergelijke &#8220;simpele&#8221; aanvallen.</p>
<p>&#8211; Anoniem, 14-5-1999<br />
vertaald door Mark IJbema</PRE><br /><span id="more-717"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.evilcoder.org/2004/06/02/i-only-replaced-the-indexhtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
