Jun 02
    Change language to :

 

“Ik verving alleen maar de index.html”
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Het lijkt erop dat de scriptkiddies die websites defacen geen idee hebben
waarom hun gerommel zo’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 “onschuldige” vervanging van
de index.html door onze geliefde politieke activisten.

1. Het bedrijf wordt op de hoogte gebracht, meestal door een klant, dat hun
website is veranderd. De server beheerder, webmaster, of wie dan ook
verantwoordelijk is voor de inhoud is meestal de eerste die van de
gebeurtenis op de hoogte wordt gebracht, omdat het bedrijf waarschijnlijk
geen rampenplan heeft.

2. De beheerder schijt zeven kleuren stront en vertelt het zijn manager. De
beheerder, bang om zijn baan kwijt te raken, is de klos en vertelt zijn
chef dat het bedrijf is “gehacked”. Hij is nu waarschijnlijk bang dat de
aanvaller binnen is gekomen daar zijn zwakke wachtwoord, of door een van
zijn dozen die hij een half jaar terug had moeten upgraden.

3. Zodra hij dit hoort schijt de chef zeven kleuren stront. De afdelingschef
vreest nu voor zijn baan en wetend dat de toorn van het bestuur op zijn
schouders zal vallen voor het niet beveiligen van het systeem. Hij probeert
wanhopig te bedenken aan wie hij dit kan vertellen, zonder dat diegene hem
op slaande voet zal ontslaan. Hij belt zijn chef (meestal een vice president
type) en vertelt haar het nieuws.

4. Wanneer ze dit hoort flipt ze en schijt zeven kleuren stront. De vice
president belt Human Resources, Legal, Security (indien aanwezig) en de
bestuurder van Engineering of een andere ubergeek. De groep besluit
gezamenlijk of de site offline moet worden gehaald of niet. Er wordt een
telefoontje gepleegd naar de directeur om hem op de hoogte te brengen van de
situatie. Na een kort consult met de bedrijfsraad wordt de beslissing
genomen of contact moet worden gezocht met de politie of het OM. Meestal
staan de managers in aanvalshouding en willen ze de cracker “koste wat kost”
aggresssief vervolgen.

5. Gedurende het hele proces is de overwerkte beheerder bezig het systeem te
doorzoeken naar sporen die wijzen op hoe de hacker binnen is gekomen. Hoewel
de hacker zegt dat ie “alleen maar de index.html heeft vervangen” wil de
chef van de chef van de beheerder dat ELK systeem wordt gecheckt en
mogelijke gaten worden gedicht. De beheerder probeert nu een uitvoerige
security audit te doen in een uur.

6. De opperbazen van marketing proberen uit te vogelen hoe ze om moeten gaan
met de impact die dit heeft op het imago van het bedrijf. Nog nooit eerder
met een dergelijke situatie geconfronteerd besluit de directeur van
marketing al haar medewerkers bijeen te roepen voor een brainstormsessie om
te besluiten hoe ze met de situatie om moeten gaan.

7. Het systeem word waarschijnlijk gebackupped, uitgeschakeld, vervangen door
een nieuwe doos of in ieder geval zwaar geupgrade (daarbij nieuwe bugs
introducerend). Dit neemt voor de beheerder het grootste deel van de dag in
beslag. Normaal zou hij dit in een paar uur kunnen doen, maar omdat hij weet
dat de Vice President en de managers hem op de vingers kijken verzekert hij
zich ervan dat alles perfect wordt uitgevoerd.

8. Als het politie en/of OM zijn ingeschakeld dan zijn zij nu bezig met de
beheerders en advocaten te bekijken of ze een zaak hebben (waarschijnlijk
niet, omdat het meeste bewijs per ongeluk is gewist door de beheerder in de
eerste vier uur na het voorval).

9. De managers verordenen dat de systemen beveiligd zullen worden en dat iets
dergelijks nooit meer zal voorvallen. Het is waarschijnlijk dat er een
gevestigde consultant erbij wordt gehaald van E200+/uur om het bedrijf te
schatten en adviezen te geven om de site’s beveiliging te verbeteren. Omdat
de beheerder al bezig is met zijn dagelijkse werk, implementeert het
consultancy bedrijf hun aanbevelingen +voor E200+/uur).

10.Na een paar weken loopt alles weer zijn gangetje. Het bedrijf heeft nieuwe
ACLs, een nieuwe firewall, en misschien een nieuw beleid.

Nu dan, dit alles overziend kan men zien hoeveel personeel hierbijk betrokken
is en hoeveel tijd er in wordt geinvestaard om iets “onschuldigs” als het
defacen van de index.html . Ik heb het nog niet eens over de bijkomende
gevolgen wanneer de beheerder een trojan of ongeauthoriseerde toegang tot
handelsggeheimen van het bedrijf ontdekt. Dit is alleen nog maar het eenvoudige
geval.

“Maar de aanvaller zei in zijn ‘bericht’ dat hij de index.html had
gebackupped. Ze hoefden allen maar het origineel terug te zetten!” Nee, domme
sukkel, nee. De aanvaller heeft het bedrijf publiekelijk vernederd, heeft de
wereld getoond dat de beveiliging van de site niet afdoende is en heeft
persoonlijke verwarring veroorzaakt voor 5 of meer mensen.

Voorts, als ik thuis kom en de voordeur is open met een briefje erop geplakt
maar op staat “Hoi. Ik heb bij je ingebroken. Ik heb allen wat spul
verplaatst. Ik heb niks meegenomen. Groetjes, |)13|=”, en ik moet dat geloven?
Zou jij het geloven? Als het betreffende bedrijf publiek verhandeld wordt, dan
zijn ze legaal _verplicht_ om het uit te zoeken en maatregelen te nemen om
dergelijke voorvallen te voorkomen. Als ze dat niet doen kunnen de
aandeelhouders hen vervolgen voor nalatigheid.

Nu, ik kan onmogelijk de tientallen milljoenen die bedrijven claimen in zaken
zoals Mitnick en anderen rechtvoordigen - dat is waanzin. Maar ik hoop dat na
het bovenstaande te hebben gelezen duidelijk wordt dat er significant veel tijd
en geld wordt besteed aan het opruimen van dergelijke “simpele” aanvallen.

– Anoniem, 14-5-1999
vertaald door Mark IJbema


Continue reading »

written by Remko

Jun 02
    Change language to :
# Introductie in C programmeren
# door po0h
# voor Mostly-Harmless

#####   Woordje Vooraf #####

- geschiedenis van c
- werking van een source code
- werking van een compiler
- gebruik van een compiler

#####   Het Begin   #####

Bij het programmeren in C beginnen we met het declareren van zogenaamde
"header" files.
Header files bevatten koppelingen naar library files waar de instructies
staan voor functies
die later in het programma weer gebruikt worden. Het klinkt misschien erg
ingewikkeld, maar
hier hoef je je nog even niet druk over te maken.

Het declareren van header files kan er zo uitzien: "#include <stdio.h>". de
"#" voor "include" staat voor een preprocessor directive. Dit betekend dat
het als eerste verwerkt wordt in het programma. Hierna komt meestal de
"main" functie van een programma. Deze kan eruit zien als: "int main()". De
"int" voor de main()  betekend dat als de main() verwerkt is, dat het dan
terug keert als een integer variable om te vertellen hoe het programma is
be-eindigd. Daarom moet je ook altijd: "return 0" aan het einde van de
main() zetten. Dit geeft dan aan het besturingsysteem door dat het programma
normaal is uitgevoerd. Soms wordt er ook gebruik gemaakt van: "void main()".
Deze heeft dan geen return adres en zal ook werken, maar is niet gelijk aan
de
ANSI standaard dus zal ik die hier ook niet bespreken.

Dit brengt ons naar het volgende simpele programma:

----- 01. start code prog1.c -----

#include <stdio.h>

int main()
{
	printf("Ik doe geen hallo wereld!");
    	return 0;
}

----- 01. einde code prog1.c -----

"#include <stdio.h>" en "int main()" moeten nu een beetje duidelijk zijn.
Het nieuwe dat je als eerste tegenkomt zal de "{" zijn. De "{" staat voor
begin en "}" staat voor eind. Dit is nodig om in dit geval
aan te geven dat de functie "main()" uit meerdere instructies bestaat. Zo
ziet de compiler dat alle regels tussen de "{" en de "}" bij de functie
"main()" horen. Het volgende nieuwe is de "printf" functie. Functies
zijn bij elkaar gegroepeerde programmacode. De programmertaal C bevat bevat
standaard dus een aantal functies, maar deze zijn ook makkelijk zelf te
schrijven. Hier komen we later op terug. Je moet goed onthouden dat functies
altijd afgesloten moeten worden met een ";". Maar dit zul je in het begin
toch tig keer vergeten :) (dit was bij mij het geval tenminste).

Door de functie "printf()" wordt er "Ik doe geen hallo wereld!" getoond bij
het uitvoeren van het programma.
In "printf()" kun je verschillende escape sequences zetten. Dit zijn een
soort hulpmiddelen bij het weergeven
van een output. Een tabel van de meest gebruikte escape sequences:

        \a              Maakt een interne piep
        \b              Geeft een backspace
        \n              Nieuwe lijn (enter)
        \r              Carriage return (Zet de cursor aan het begin van de
lijn)
        \t              Tab
        \v              Verticale tab (Cursor verplaatst 1 lijn)
        \\              Backslash
        \'              Apostrophe
        \"              Dubbele quotes
        \?              Question mark
        \0              Null byte (is een 0)
        \O              Octale nummers (base 8)
        \xH             Hexadecimale nummers (base 16)

----- 02. start code prog2.c -----

#include <stdio.h>

int main()
{
	printf("Dit is regel1\nDit is regel2\n");
    	return 0;
}

----- 02. einde code prog2.c -----

Geeft als output:

[po0h@mabel c]$ ./prog1
Dit is regel1
Dit is regel2
[po0h@mabel c]$

#####   Variablen   #####

Een variable is een bepaald gebied in het geheugen van de computer waarin je
tijdelijk een waarde kunt opslaan. Ik denk dat dit goed uit te leggen is met
het volgende rekensommetje:

a=2
b=3

a+b=c

hoeveel is c?

Dit zullen jullie allemaal wel herkennen. Je onthoudt dat a de waarde 2
bevat, daarna onthoud je dat b de waarde 3 bevat. Als je dit doet staat er
eigenlijk 2+3 waarbij de uitkomst (c) dus 5 is. Zo werken variablen
eigenlijk ook. Bij programmeertalen kun je niet alleen een nummer in een
variable zetten, maar ook bijvoorbeeld een letter of een zin. Er bestaan dus
verschillende variablen.

Een veel voorkomende variable is het Integer variable (in c aangegeven als
"int"). Hier kun je getallen in stoppen die je later weer kunt verwerken in
bijvoorbeeld een rekensom (wat we eigenlijk hierboven gedaan hebben). Zo is
er ook een variable waarbij je een letter, woord of zin in kan zetten. Deze
wordt "char"
genoemd. Je zou hier ook een getal in kunnen zetten, maar de computer ziet
dit dan als een karakter. Hiermee zou je bijvoorbeeld dan niet kunnen
rekenen. Hier even een lijstje met de meest voorkomende variablen

	naam:		type:				bereik:
	--------	------------------------	---------------------------------
	char		karakter			alle karakters en cijfers (worden als een string gezien)
	double		dubbele pressisie float		ver achter de komma
	float		pressisie float			kan een getal met waardes achter de komma aan
	int		getal(len)			-2147483648 tot 2147483647
	long		lange integer			-2147483648 tot 2147483647
	short		korte integer			-32768 tot 32767

Als je een variable wilt gebruiken moet je deze eerst declareren. Hierbij
geef je eerst op wat voor type variable je wilt gebruiken met daarachter de
naam. Dit zou er dus zo kunnen uitzien: "int a;". Hier staat dus
dat variable "a" een integer variable is. Hierna kun je de variable een
waarde geven door: "a = 1" in te
voeren. Nu zouden we dus ons rekensommetje hierboven na kunnen spelen met
het programmeren:

#include <stdio.h>

int main()
{
	int a;
	int b;
	int c;

	a = 2;
	b = 3;
	c = a + b;

	return 0;
}

Dit is allemaal wel leuk en aardig, maar zo kunnen we de uitkomst niet op
het scherm zien. Daarvoor moeten we weer beroep doen op de functie
"printf()". Om de waarde van de variable weer te geven met "printf()" maak
je gebruik van "conversion characters". Dit zijn de %i, %f en %c in het
volgende programma. bij conversion characters gebruik je een elke keer als
je een variable declareerd een komma om de namen van de variablen te
onderscheiden. Als er 1 variable moet worden weergegeven met de functie
"printf()" moet je dit zo doen:

  printf("Dit is een voorbeeld van het gebruik van %i variable", een);

Hier zal voor de plaats %i het integer variable komen die de naam "een"
heeft

Om weer door te gaan op ons rekensommetje hierboven heb ik het volgende
programma geschreven:

#include <stdio.h>

int main()
{
	int a, b, c;

	a = 2;
	b = 3;
	c = a + b;

	printf("De waarde van variable c is nu %i\n", c);

	return 0;
}

Je ziet hier weer iets nieuws namelijk: "int a, b, c;". Dit is een manier om
sneller een aantal variablen met hetzelfde type te declareren.

Een voobeeld van het gebruik van meerdere (typen) variablen:

#include <stdio.h>

int main()
{
    	int   x;
    	float y;
    	char  z;

    	x = 1;
    	y = 1.234;
    	z = 'A';

    	printf("Mijn verschillende type variablen: %i, %f, %c \n",x,y,z);

    	return 0;
}

----- einde code prog3.c -----

Geeft als output weer:

[po0h@mabel c]$ ./prog3
Mijn verschillende type variablen: 1, 1.234000, A
[po0h@mabel c]$

Hier een lijstje met veel voorkomende conversion karakters:

	conversion char		type variable
	----------------	------------------
        %c              	Single character
        %d              	decimal numbers
        %e              	Floating point in scientific notation
        %f              	Floating point
        %lf             	Double
        %Lf             	Long double
        %g              	Uses either %e or %f, based on which is shorter
        %i              	Integer
        %o              	Unsigned octal integer
        %s              	String of text
        %u              	Unsigned integer
        %x              	Unsigned hexadecimal integer

Je kunt ook aangeven hoevel spaties het getal mag bevatten. Dit kun je doen
door middel van
een getal tussen de "%" en het type variable te plaatsen.

----- 04. begin code prog4.c -----

#include <stdio.h>

int main()
{
        int   x = 2;
        int   y = 1000;
        float z = 1.12345;

        printf("%5d, %1d, %.1f\n", x,y,z);

        return 0;
}

----- 04. einde code prog4.c ----

Hier zeg je dat het decimale variable x tenminste 5 spaties moet bevatten.
Om af te ronden achter de komma
kun je bv: "%.1f\n" gebruiken. Hier geef je aan dat de variable z maar
maximaal 1 getal achter de komma mag
bevatten. Als het getal groter is dan de aangegeven spaties negeerd het
programma de spatie. Bij het afkappen
van getallen die ook waardes achter de komma bevatten worden deze getallen
wel afgekapt.

TIP: Je ziet hier dat ik voor variables gebruik maak van letters. Doe niet
in een "serieus" programma vooral niet! Gebruik duidelijk namen zodat je
gelijk herkend waarvoor dat variable staat. Ik zal ook verder in de
documentatie "duidelijke" namen gebruiken.

Voor het gebruiken van user input kun je de functie "scanf()" gebruiken. Je
kunt dan de user input als een
variable opslaan.

	char naam[20];
	scanf("%s", &naam);

Hier zet "scanf()" de user input in de varaible "naam". Je zou dus hierna de
user input weer kunnen weergeven met "printf()". De "&naam" wil zeggen dat
het de input moet worden opgeslagen op de locatie waar het variable "naam"
is opgeslagen.

----- 05. begin code prog5.c -----

#include <stdio.h>

int main()
{
	char naam[21];
	printf("Wat is je naam?\n");
	scanf("%20s", &naam);
	printf("Dus je naam is %s\n", naam);

	return 0;
}

----- 05. einde code prog5.c -----

Dit zal dus als output weergeven:

[po0h@mabel c]$ ./prog5
Wat is je naam?
Twan
Dus je naam is Twan
[po0h@mabel c]$

Je ziet in de code dat ik 21 karakters heb gereserveerd voor variable "naam"
en daarna "%20s" doe. Dit wil zeggen dat ik dat ik 20 karakters van de
ingevoerde karakters gebruik en de rest afkap. Dit doe ik, omdat er anders
een stack-overflow kan ontstaan (met dank aan ilja en Quux :). Als je hier
meer informatie over wilt hebben kun je de documentatie over buffer
overflows raadtplegen. De mensen die opletten zullen merken dat er een
verschil zit tussen 21 en 20. Dit is omdat het afgesloten wordt met een NULL
byte.

##### Operators en Operands #####

Hier zal ik beginnen met een voorbeeld van een programma die getallen bij
elkaar optelt.

----- 06. begin code prog6.c

#include <stdio.h>

int main()
{
        int getal1;
        int getal2;
	int uitkomst;

        printf("Getal 1 is: ");
        scanf("%d", &getal1);
        printf("Getal 2 is: ");
	scanf("%d", &getal2);

        uitkomst = (getal1+getal2);

        printf("De som van %d en %d is %d\n", getal1, getal2, uitkomst);

        return 0;
}

----- 06. einde code prog6.c -----

Hier worden eerst 3 integer variablen aangemaakt. Daarna wordt de user input
gescanned en in variable
"getal1" en "getal2" gezet. Door middel van "getal1" en "getal2" wordt de
uitkomst berekend door:

	uitkomst = (getal1+getal2);

en daarna wordt de uitkomst weergegeven door de functie "printf()".

In C kun je makkelijk getallen latten op- en aflopen. Dit kun je doen door
bijvoorbeeld het
variable getal zo te gebruiken:

	getal++

Dit staat gelijk aan getal=getal+1. Zo zijn er ook nog een paar operators
die sommen verkorten:

	Gebruik		Staat gelijk aan
	-------- 	------------------
        x += 5;         // x = x + 5;
        x -= 5;         // x = x - 5;
        x *= 5;         // x = x * 5;
        x /= 5;         // x = x / 5;

##### IF ... ELSE struktuur #####

Het mooiste met programmeren is natuurlijk het vergelijken van waardes. Zo
kun bijvoorbeeld gegevens invoer
controleren en controleren op fouten. Je bent bijvoorbeeld een spelletje aan
het spelen waarbij je een auto moet besturen. Als je op de rechter pijl
drukt gaat die auto (zou je in ieder geval verwachten) naar rechts.
zo zou je de if structuur ongeveer kunnen zien.

De structuur van if ... else ziet er in c zo uit:

        if( condition ) statement1;
        else statement2;

Om meerdere statemants in de "if" te zetten moet je een begin een einde
declareren.
Dit kan zo gedaan worden:

        if( condition )
        {
                statement1;
                statement2;
        }
        else statement3;

Door de "{" en de "}" geef je een begin een einde aan voor de lus.

Een voorbeeld van een programma die de if ... else lus gebruikt:

----- 07. begin code prog7.c ------

#include <stdio.h>

int main()
{
	int getal1;
	int getal2;

	getal2 = (3);

	printf("Voer het getal 3 in: ");
	scanf("%d", &getal1);

	if (getal2==getal1)
	  printf("Dit was goed!\n");
	else
	  printf("Dit was fout!\n");

	return 0;

}

----- 07. einde code prog7.c -----

In dit programma wordt getal2 vergeleken met de invoer van de gebruiker
(getal1). Als deze aan elkaar gelijk is ("==") wordt er "Dit was goed!"
weergegeven. Is deze niet gelijk aan elkaar dan wordt er "Dit was fout!"
weergegeven. Er staat dus letterlijk:

Als getal2 gelijk is aan getal1, print dan "Dit was goed!".
Anders print "Dit was fout!".

De output van het programma kan dus zijn:

[po0h@mabel c]$./prog7
Voer het getal 3 in: 3
Dit was goed!
[po0h@mabel c]$

Hier is een overzicht met de symbolen die gebruikt kunnen worden om
statemants te vergelijken:

	symbool		betekenis
	-------		-----------
	<		kleiner dan
	>		groter dan
	<=		kleiner dan of gelijk aan
	>=		groter dan of gelijk aan
	==		gelijk aan
	!=		niet gelijk aan

Hier is een programma die de invoer getallen met elkaar vergelijkt:

----- 08. begin code prog8.c -----

#include <stdio.h>

int main()
{
	int getal1;
	int getal2;

	printf("Voer het eerste getal in: ");
	scanf("%d", &getal1);

	printf("Voer het tweede getal in: ");
	scanf("%d", &getal2);

	if (getal1==getal2)
	  printf("De getallen zijn gelijk aan elkaar\n");
	else if (getal1>getal2)
	  printf("Getal %d is groter dan getal %d\n", getal1, getal2);
	else if (getal1<getal2)
	  printf("Getal %d is kleiner dan getal %d\n", getal1, getal2);

	return 0;
}

----- 08. einde code prog8.c -----

Hier wordt het getal dat als eerste ingevoerd wordt door de gebruiker
(getal1) vergeleken met
het tweede getal (getal2). Een uitvoer van het programma zou kunnen zijn:

[po0h@mabel c]$ ./prog8
Voer het eerste getal in: 3
Voer het tweede getal in: 2
Getal 3 is groter dan getal 2
[po0h@mabel c]$

##### FOR ... loop #####

De for loops worden gebruikt om een bepaalde functie of functies een aantal
keer te
herhalen. Een for loop ziet er zo uit:

        for( initialize; while this is true; do this )
                statement;

Meestal wordt eerst een waarde aan het variable gegeven ("initialize").
Daarna wordt er een
voorwaarde op gegeven. Als deze voorwaarde juist is dan gaat de loop door.
Wordt deze onjuist
zal de loop stoppen. Als derde wordt er aangegeven wat er met het variable
moet worden gedaan.

----- 09. begin code prog9.c -----

#include <stdio.h>

int main()
{
	int i;

	for(i=0;i<10;i++)
	  printf("De waarde is nu %d\n", i);

	return 0;
}

----- 09. einde code prog9.c -----

Door dit programma kun je goed zien wat er nou gebeurd. Aan de variable "i"
wordt de waarde van "0"
gegeven. In het begin van de for loop is "i" dus "0". Zolang "i" kleiner is
dan "10" wordt de functie
"printf()" uitgevoerd. Als deze 1 keer is uitgevoerd wordt variable "i"
steeds met 1 verhoogd. Je
krijg dus dit als output:

[po0h@mabel c]$ ./prog9
De waarde is nu 0
De waarde is nu 1
De waarde is nu 2
De waarde is nu 3
De waarde is nu 4
De waarde is nu 5
De waarde is nu 6
De waarde is nu 7
De waarde is nu 8
De waarde is nu 9
[po0h@mabel c]$

##### WHILE ... loops #####

Het principe van de while loop is eigenlijk hetzelfde als de for loop. De
loop gaat door als de statement
waar is en anders stopt het programma. Hier een simpel programmatje waarbij
je zelf kunt bepalen hoe vaak
je een bepaalde zin wil afdrukken:

----- 10. begin code prog10.c -----

#include <stdio.h>

int main()
{
	int i;

	printf("Aantal herhalingen: ");
	scanf("%d", &i);

	while(i--)
	  printf("allemaal aapjes!\n");

	return 0;
}

----- 10. einde code prog10.c -----

Hier geef je dus eerst een waarde aan variable "i". De while lus zal stoppen
als de waardo van "i" "0" is.
Elke keer als de functie in de while loop wordt uitgevoerd wordt variable
"i" met 1 verkleind.

written by Remko