czwartek, 29 lipca 2010

Błąd poczas logowania

Ostatnio na moim serwerze zainstalowałem Snorta wraz z całym oprogramowaniem wspomagającym sprawdzanie logów. Oprogramowanie Ossec zaczęło wysyłać mi na maila non stop informacje o tym, że w /var/log/auth.log pojawia się informacja tego typu:
Jul 29 08:13:59 borekfalecki sshd[3844]: error writing /proc/self/oom_adj: Operation not permitted
Zauważyłem, że pojawia się to podczas logowania do systemu. Opis błędu znalazłem na stronie http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=555625. Wystarczy otworzyć plik /etc/default/ssh i zamienić opcję SSHD_OOM_ADJUST=-17 na SSHD_OOM_ADJUST=.

środa, 28 lipca 2010

Błędy w serwerach i stronach rządowych

Ostatnio dużo piszę się o problemach z serwerami i stronami WWW instytucji rządowych. Zastanawiałem się nad tym problemem i rozmyślałem dlaczego tak jest, że tak ważne miejsca w Sieci jak te należące do włodarzy naszego państwa są tak źle zabezpieczone. Doszedłem do wniosku, że problemem jest sam sposób myślenia ludzi, którzy zatrudniają osoby od obsługi serwera czy pisania web aplikacji. Uważam, że dla rządzących miarą ludzkich umiejętności jest posiadane wykształcenie. W momencie gdy pojawia się oferta pracy na webmastera aplikacji internetowych czy administratora sieci, pierwsze miejsce mają ludzie z posiadanym wykształceniem, a nie ci, którzy mają duże doświadczenie lecz nie mają wykształcenia. Jednak w polskich uczelniach nie uczy się jak radzić sobie z problemami bezpieczeństwa komputerowego. Pomimo, że nasi studenci są świetnymi programistami to wydaje mi się, że w większości przypadków nie mają oni zbyt dużego doświadczenia w obronie przed buffer overflow czy SQL injection. W dobie informatyzacji społeczeństwa jest to bardzo poważna sprawa. Zwłaszcza mając na uwadze możliwość przeprowadzania głosowania drogą elektroniczną. Znam wielu ludzi, którzy nie posiadają wykształcenia a są wysokiej klasy specjalistami od administrowania czy znajdowania błędów w oprogramowaniu. Niech zmieni się zatem sposób myślenia rządzących bo w dobie zagrożeń cyberatakami na infrastrukturę rządową może to być poważna wada.

poniedziałek, 26 lipca 2010

Problem z ClamAV - aktualizacja

We wczorajszym poście (http://seprob.blogspot.com/2010/07/problem-z-clamav.html) napisałem o pewnym problemie z ClamAV. Wydawało się, że go rozwiązałem jednak dzisiaj podczas uruchamiania ClamAV, pojawił się ten sam monit. Solucja, którą opisałem już nie działała. Lecz znalazłem inny sposób na rozwiązanie tego problemu:

# echo "deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free" >> /etc/apt/sources.list
# apt-get update
#apt-get install clamav
# apt-get upgrade
Po tym już wszystko powinno śmigać dobrze :)

niedziela, 25 lipca 2010

Sepscan

Prezentują kod bardzo prostego skanera portów mojego autorstwa:

/* SEPSCAN (SEProb's SCANner) - is a ordinary port scanner
 * Author: Bartlomiej "seprob" Korpala
 * Information about author: http://seprob.damned.pl/
 * E-mail: seprob@poczta.fm
 * 
 * Standard compilation: gcc sepscan.c -o sepscan */

#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <time.h>

extern int h_errno;  /* Variable in which gethostbyname() function stores information about errors*/

/* error_errno() function give contents of error based on value attributed errno variable and finishes program */
void error_errno(const char *what);

/* error_h_errno() function give contents of error based on value attributed h_errno variable and finishes program */
void error_h_errno(const char *what);

/* error_none() function inform about error and finishes program */
void error_none(const char *what);

main(int argc, char *argv[])
{
   int sd;                      /* Socket descriptor */
   int port;                    /* Number of scanning port */
   int help_v;                  /* Hel variable */
   char *n_addr;                /* Host address */
   struct sockaddr_in in_addr;  /* Structure for fulfillment */
   struct servent *ss;          /* Structure included information from /etc/services file */
   struct hostent *sh;          /* Structure included information from gethostbyname() function */
   int port_tab[26208];         /* Table in which are stored values saying or port is active */
   char buf_conn[128];          /* Buffer for data get after telnet connect on give port */
   time_t now, now_two;         /* Wanted times dor account of period of scanning */

   if (argc == 1)
     error_none("Bad syntax. More you will get taking davantage --help option of program");
   else if (argc == 2)
     {
   if (!strcmp(argv[1], "--help"))
     {
        printf("Syntax: %s [Network Address]\n", argv[0]);
        printf("        %s --help                           (Information about usage of scanner)\n", argv[0]);
        printf("        %s --about                          (Information about program)\n", argv[0]);
        printf("        %s --more [Network Address]         (Give more information about scanning host)\n", argv[0]);
        printf("        %s --telnet-conn [Network Address]  (Display information which are gotted after telnet connect with active ports\n", argv[0]);
        exit(0);
     }
       else if (!strcmp(argv[1], "--about"))
     {
        printf("SepScan (Seprob's Scanner) is a network scanner writed by seprob [http://seprob.damned.pl/]\n");
        exit(0);
     }
   else
     sh = gethostbyname(argv[1]);
     }
   else if (argc == 3)
     {
   if (!strcmp(argv[1], "--more"))
     sh = gethostbyname(argv[2]);
   else if (!strcmp(argv[1], "--telnet-conn"))
     sh = gethostbyname(argv[2]);
   else
     error_none("Bad syntax. More you will get taking davantage --help option of program\n");
     }
   else if (argc = 4)
     {
   if (!strcmp(argv[1], "--more") && !strcmp(argv[2], "--telnet-conn"))
     sh = gethostbyname(argv[3]);
   else if (!strcmp(argv[1], "--telnet-conn") && !strcmp(argv[2], "--more"))
     sh = gethostbyname(argv[3]);
   else
     error_none("Bad syntax. More you will get taking davantage --help option of program\n");
     }
   else
     error_none("Bad syntax. More you will get taking davantage --help option of program");


   if (sh == NULL)
     error_h_errno("GETHOSTBYNAME");

   n_addr = inet_ntoa(*(struct in_addr *)sh->h_addr_list[0]);

   printf("SepScan - Seprob's Scanner by seprob [http://seprob.damned.pl/]\n");
   printf("\n");

   time(&now);  /* Get time from 1th February 1970 */

   memset(&port_tab, 0, sizeof(port_tab));

   /* Beginning of loop which checks all ports number */
   for (port = 1; port <= 26208; port++)
     {
   memset(&in_addr, 0, sizeof(in_addr));   /* Fulfillment zeros of addr structure */
   in_addr.sin_family = PF_INET;           /* PF_INET familly address */
   in_addr.sin_port = htons(port);         /* Convert from host byte order to network byte order */

   help_v = inet_aton(n_addr, &in_addr.sin_addr);  /* Attribution IP address */

   if (help_v == 0)
     error_none("Bad address");

   sd = socket(PF_INET, SOCK_STREAM, 0);  /* Creation of new socket */

   if (sd == -1)
     error_errno("SOCKET");

   help_v = connect(sd, (struct sockaddr *)&in_addr, sizeof(in_addr));

   if (help_v != -1)
     {
        port_tab[port] = 1;  /* Give port is active */

        ss = getservbyport(htons(port), "tcp");

        if (ss != NULL)
          printf("%s/%d/%s\n", ss->s_name, htons(ss->s_port), ss->s_proto);
        else
          printf("unknown/%d/tcp\n", port);
     }

   close(sd);
     }

   if (argc == 3 || argc == 4)
     {
   if (!strcmp(argv[1], "--more") || !strcmp(argv[2], "--more"))
     {
        printf("\n");
        printf("Official name of host: %s\n", sh->h_name);
        printf("Type of host address: %s\n", sh->h_addrtype == PF_INET ? "PF_INET" : "PF_INET6");

        printf("Aliases:\n");
        for (help_v = 0; sh->h_aliases[help_v] != 0; help_v++)
          printf("%s\n", sh->h_aliases[help_v]);

        printf("List of address:\n");
        for (help_v = 0; sh->h_addr_list[help_v] != 0; help_v++)
          printf("%s\n", inet_ntoa(*(struct in_addr *)sh->h_addr_list[0]));
     }

   if (!strcmp(argv[1], "--telnet-conn") || !strcmp(argv[2], "--telnet-conn"))
     {
        printf("\n");
        memset(buf_conn, '\0', sizeof(buf_conn));

        for (port = 1; port < 26208; port++)
          {
        if (port_tab[port] == 1)
          {
             memset(&in_addr, 0, sizeof(in_addr));
             in_addr.sin_family = PF_INET;
             in_addr.sin_port = htons(port);
             inet_aton(n_addr, &in_addr.sin_addr);

             sd = socket(PF_INET, SOCK_STREAM, 0);

             if (sd == -1)
          error_errno("SOCKET");

             help_v = connect(sd, (struct sockaddr *)&in_addr, sizeof(in_addr));

             if (help_v != -1)
          {
             help_v = read(sd, &buf_conn, sizeof(buf_conn));

             if (help_v == -1)
               error_errno("READ");

             printf("After telnet connect on %d port I have received following information:\n", port);
             printf("%s\n", buf_conn);
             printf("\n");

             memset(buf_conn, '\0', sizeof(buf_conn));
          }
          }
          }
     }
     }

   time(&now_two);

   printf("\n");
   printf("Time of scanning: %.2f\n", difftime(now_two, now));
   printf("Scanned %d ports on host %s\n", port, n_addr);

   return 0;
}

void error_errno(const char *what)
{
   fprintf(stderr, "%s: %s\n", what, strerror(errno));
   exit(1);
}

void error_h_errno(const char *what)
{
   fprintf(stderr, "%s: %s\n", what, hstrerror(h_errno));
   exit(1);
}

void error_none(const char *what)
{
   fprintf(stderr, "ERROR: %s\n", what);
   exit(1);
}

Praca maturalna

W tym poście chciałem zamieścić moją pracę maturalną na temat "Teksty piosenek rapowych - mowa potoczna czy poezja śpiewana? Zanalizuj wybrane teksty".

1. Wersja pełna

1. Czym jest rap?

 Rap jest częścią kultury zwanej hip hopem do której zalicza się właśnie
rapowanie, break dance, DJ-ing oraz grafitti. Powstał w latach 
siedemdziesiątych 20. wieku w Nowym Jorku. Za pioniera hip hopu uważany jest
DJ Kool Herc. W Polsce zaś pionierami byli Liroy, Kaliber 44 oraz Wzgórze
Ya-Pa-3. 

 Charaketerystyczne dla rapu jest przede wszystkim to że teksty są rymowane
do jednostajnego rytmu czyli beatu. Wywodzi się z muzyki bluesowej i 
jazzowej. 

2. Charakterystyka tekstów rapowych

 Jak już wspomniałem teksty rapowe charakteryzuje to że występują w nich
rymy śpiewane do beatu. Pozatym nie ma innych reguł. Można dowolnie "płynąć" 
po beat'cie. Piosenki te są przykładem mowy potocznej pełnej slangowych 
określeń i którą to mowę zwykle mogą zrozumieć ludzie, którzy z hip hopem 
mają dużo wspólnego lub żyją wsród ludzi, którzy komunikują się między sobą 
za pomocą slangu. Teksty te zawierają w sobie mnóstwo ekspresji, wulgaryzmów 
oraz metafor. Wszystko zależy od tego do jakiej grupy ludzi chce dotrzeć raper. 
Rymują oni o różnych rzeczach począwszy od aktualnej sytuacji politycznej, przez 
historię swojego przyjaciela aż po przykładowe imprezy jakie miewają. Teksty te 
twórzą zwykle monolog czyli tekst mówiony w stylu artystycznym.   

3. Analiza wybranych tekstów utwórów muzycznych

a) utwór Kaliber 44 - Plus i minus jako przykład psychorapu

 Kaliber 44 powstał w roku 1994 w Katowicach a jego członkami byli Abradab,
Joka, Magik oraz DJ Feel-X. Byli oni jednymi z pionierów rapu w Polsce. Na 
pierwszej płycie o nazwie "Księga tajemnicza. Prolog" zaprezentowali styl 
zwany psychorapem. Styl ten charakteryzuje się mocno tajemniczą atmosferą w 
utworze oraz mocno ekspresyjnymi tekstami, które podczas wymowy trudno 
zrozumieć. Sprawia to że słuchacz popada w silny stan refleksji i utożsamia
się z raperami. Biorąc pod uwagę zespół Kaliber 44 to sposób wypowiadania się 
na ich pierwszej płycie jest idiolektem. 

 Utwór "Plus i minus" opowiada o przeżyciach Magika jakie towarzyszyły mu
przed udaniem się na sprawdzenie wyników na obecność wirusa HIV. Plus i minus 
oznacza odpowiednio wynik pozytywny oraz negatywny. Podmiotowi lirycznemu 
towarzyszył wtedy wielki strach co świetnie wyraża w swojej piosence. Miał 
wtedy 18 lat.

 Układy rymów w pierwszej zwrotce tekstu to głównie rymy okalające, np.
"Czas sie bać, nadszedł czas, sprawdź to, sprawdź" lub "Ale strzał, ile ja 
bym dał, mieć znów chciał" lecz występują tutaj również najcześniej spotykane 
rymy parzyste, np. "Idę tam, idę sam w tą czarną chwile. Tyle myśli w sekund 
tyle". W drugiej zwrotce pojawiają się również podobne układy ale w trzeciej
występuje układ przeplatany, np. "I - dryn - telefon dzwoni i jak co dzień.
Może tym razem  wreszcie sie dowiem. Dziś nadszedł ten dzień, dziś nadszedł 
dzień. Może będzie mym najlepszym dniem, a może nie". Jeżeli chodzi o refren 
to jest to przykład układu parzystego. W tekście możemy napotkać przykład 
słownictwa ekspresywnego dodatniego, np. "doktorku", które odnosi się do 
doktora badającego Magika. Dopiero w drugiej zwrotce zwraca się do niego
"doktorku" a nie "doktorze". Może to oznaczać że ma już dość oczekiwania na 
wynik i wariuje już od tego. Slangowe określenia to w tym tekście rzadkość, 
aczkolwiek można tutaj znaleźć wyraz "ścierwo" oznaczający amfetaminę. 
Kolejnym przykładem budowy tekstu jest onomatopeja "dryn" oznaczająca dźwięk 
dzwoniącego telefonu. Ma ona zapewne pobudzić słuchacza i wczuć w sytuację 
Magika który wiele dni oczekiwał na telefon. Apostrofy "doktorze" oraz
"Boże" pojawiające się w tekście odnoszą się do jedynych osób w których
podmiot liryczny widzi nadzieję na swoje ozdrowienie. Pod koniec utworu
Magik znów zwraca się do Boga w podzięce że jest zdrowy. Refren to próba 
pokazania odbiorcom jak czuł się Magik. W jego głowie znajduje się tylko plus 
i minus, nie może się nad niczym skupić i zastanawia się czy umrze. Pod koniec 
mamy przykład dialogu Magika z doktorem, gdy udał się na sprawdzenie wyniku. 
Tekst ten pełni funkcję informująco-puczającą - podmiot liryczny opowiada o 
swoich przeżyciach i jednocześnie daje do zrozumienia żeby uważać na to co się 
robi i nikomu nie życzy aby przechodził przez to co on.

b) utwór "Mes i Numer Raz - Rok później (Oczy otwarte 2)" jako przykład dissu

 Najpierw musimy sobie odpowiedzieć na pytanie czym jest diss? Diss jest w
przypadku raperów atakiem słownym w którym obraża się przeciwnika wytykając
jego wady i słabości wpływając tym samym na psychikę i próbując złamać
przeciwnika. Może to być przykład parodii. Beefem z kolei nazywam konflikt
pomiędzy przedstawicielami środowiska hip hopowego.
 
 Przykładem właśnie takiego beefu jest Mes z Numer Raz przeciwko Mezowi. W
swoim utworze "Rok później (Oczy otwarte 2)" który znalazł się na składance
Kodex 2 dokonują dissu. Mes uważa że Mezo skopiował jego pseudonim. Razem z
Numer Raz uważa także że Mezo jest przedstawicielem nowej fali w środowisku 
muzycznym o nazwie hip hopolo. Jest to styl który łączy w sobie elementy hip 
hopu i disco polo (śpiewanie o miłości, itp.). Uważają że jest to hańba 
zarówno dla nich jak i dla hip hopu. 

 Rymy w tym tekście są ułożone w układzie końcowym parzystym przez wszystkie
zwrotki utworu, np. "To jakbyś rozdzielał syjamskie bliźnięta, ale Mes to
ten typ w niedzielę i święta". Jedynie budowa refrenu pod względem rymów
jest inna, ponieważ tylko w środkowej części wyrazy się rymują. Występują w
nim za to onomatopeje "tararappa, parararappa, o o". Pojawiają się w
kontekście tego że dla Mesa i Numer Raza "rap to coś wiecęj niż" te
zacytowane onomatopeje oznaczające jakieś bezsensowne śpiewanie beż żadnego
przesłania. Piosenka ta jest jedną wielką apostrofą skierowaną do Meza. 
Znaleźć tutaj możemy kilka wyrazów zapożyczonych jak np. "oldschoolowo" co 
wzięło się z angielskiego "old school" co oznacza starą szkołę czyli w tym 
wypadku w starym stylu. Innym przykładem jest "MC" z angielskiego "master of 
ceremony" czyli mistrz ceremonii co oznacza rymującego rapera, który zabawia
publiczność. Pod koniec piosenki mamy przykład funkcji fatycznej; "Aha, pokażę 
Ci jak się gra, słyszysz?", która ożywia nieco słuchacza bo chociaż jest już 
koniec utworu to jednak twórcy chcą aby jeszcze posłuchał co mają do powiedzenia. 
Występuje tutaj dużo slangów, m.in. "psy" dla określenia policjantów czy 
"przemalować na sino" czyli pobić i tym samym podbić oczy. W tekstach rapowych 
rzadko mamy doczynienia z archaizacją jednak znajduje się tutaj przykład wyrazu 
"bluźnię" czyli ubliżać komuś, obrażać kogoś. Następnie można się doszukać 
przykładu groteski "To jakbyś rozdzielał syjamskie bliźnięta". Odnosi się to do 
Mesa w kontekści tego że Mezo skopiował częściowo jego pseudonim i dla tego
pierwszego jest to jak rozdzielenie syjamskich bliźniąt czyli właściwie niemożliwe 
i absurdalne. Podobnie jak poprzedni utwór, "Rok poźniej (Oczy otwarte 2)" ma 
funkcję informująco-pouczającą. 

c) utwór "DJ 600V feat. K.A.S.T.A. Skład - Wychylylybymy" jako przykład baunsu

 Słowo bauns wzięło się od angielskiego słowa "bounce" oznaczającego
podskakiwać lub energia życiowa. W kontekście rapowym oznacza utwory
zawierającego mnóstwo niskotonowych brzmień, nadające się świetnie na
imprezy a teksty zaś mówią o zabawie, używkach czy kobietach.

 Utwór o którym mowa znalazł się na płycie DJ-a 600V pt. "600 stopni
Celsjusza". K.A.S.T.A. to skrót od Konfederacja Absolwentów Szkoły
Technicznej Artykulacji. Zespół ten został założony we Wrocławiu a jego
członkami są Wall-E, Donguralesko, DJ Kut-O oraz O.M.A.

 Jak zwyklę zacznę od najważniejszej części tekstów rapowych czyli rymu.
Tutaj bez zmian w budowie - jak zwykle są to rymy parzyste, np. "600 stopni
Celsjusza w twoich uszach. Łbem beat rusza, rym mknie jak Katiusza". Jest to
najprostszy styl rymowania i dlatego tak dużo utworów jest budowanych w ten
sposób. Przykładem apostrofy jest tutaj "Świeży powiew, yo, Volt puść to w
obieg" gdzie Wall-E zwraca się do twórcy podkładu DJ-a 600V, w kontekście
wydania tego utworu gdyż jest to całkiem nowy przykład dobrego rapu o
zabarwieniu baunsowym. Innym przykładem budowy tekstu jest personifikacja
"Łbem beat rusza, rym mknie jak Katiusza". Oznacza to że Donguralesko
uwielbia ten podkład a jego głowa rusza się w takt muzyki który leci z siłą
wystrzelonego pocisku. Jeżeli chodzi o wyrazy zapożyczone to występuje tutaj
słowo "mixtape" co oznacza zmiksowane przez DJ-a utwory do których zwykle
rymują raperzy lub "track" czyli ścieżka dźwiękowa. Znajduje się tutaj dość
dużo slangowych określeń dlatego dla laika trudno ten tekst zrozumieć, np.
tytuł utworu "wychylylybymy" co prawdopodobnie oznacza wypić jakiś alkohol
do dna lub inny slang "wypasiony" co oznacza wspaniały. Ilość tych slangów
oznacza że raperzy chcą dotrzeć tylko do tej grupy która wie o co chodzi.
Piosenka ma funkcję estetyczną. Można zauważyć również w niej mnóstwo
porównań, np. "Beat gorący jak romans Clintona z Monicą. Robię to z tym jak 
Rutkowski z paniką". Muzycy K.A.S.T.A. Skład bardzo często używają
różnorakich porównań w swoich utworach.

d) utwór "Nagły Atak Spawacza - Czujesz jak ja" jako przykład hardcore rapu

 Hardcore rap jest to nurt w muzyce hip hopowej gdzie myślą przwodnią jest
ofensywa i agresja przeciwko ludziom którzy w jakiś sposób zirytowali
raperów. 

 Nagły Atak Spawacza to poznański skład założony w 1995 roku. Członkami są
Fazi, Kaczmi, Kamień, Kaczor oraz Goślina. Zespół jest dosyć kontrowersyjny
i nagrał dużo płyt w których ostro krytykuje ludzi i rzeczywistość. Ich
najsłynniejszym utworem jest diss przeciwko raperowi Liroyowi pt. 
"Antyliroy". Jest to jeden z najpełnieszych przekleństw utwór hip hopowy ale
nie on będzie przedmiotem mojej analizy a piosenka "Czujesz jak ja". Raperzy
mówią w nim o swojej miłości do hip hopu. Do tego co kochają i do tego czego
nienawidzą.

 Standardowo rozpocznę od kwestii rymów. Dwie pierwsze zwrotki tworzą rymy
parzyste w trzeciej zaś występują rymy okalające, np. "I tak ma być, nie 
można się z poglądami kryć". Ilość slangów w tym utworze jest znikoma ale
pod koniec utworu Kamień używa stwierdzenia "kumasz?" czyli "rozumiesz?" a
także "mnie to wali" czyli "mnie to nie obchodzi" ale w bardzo agresywnym
odniesieniu. Doszukać się tutaj można pewnego związku frazeologicznego 
mianowicie "co tu jest grane" oznacza on "o co tutaj chodzi". Funkcję
fatyczną w tej piosence pełni sam refren "czujesz to tak samo jak ja? 
Lubisz jak ja gdy muzyka gra?". Refren jak wiadomo występuje kilkakrotnie w
utworze a przez to że posiada w nim funkcję fatyczną staje się niezwykle
żywy i pobudzający. Piosenka ma funkcję estetyczną gdyż odnosi się do uczuć
słuchacza.

e) utwór "Firma - M.O Faya" jako przykład nielegalu

 Firma jest to krakowski zespół reprezentowany przez Kaliego, Tadka,
Bosskiego, Pomidora oraz Popka. Powstał on w 2000 roku i jest przykładem
muzyki undergroundowej czyli działającej w podziemiu.

 Nielegal jest utworem muzycznym nie wydanym w żadnej komercyjnej wytwórni 
muzycznej a publikowanym w Internecie lub na zasadzie "z ręki do ręki".
Piosenki takie nagrywane są zazwyczaj na domowym komputerze. Przykładem
właśnie takiej twórczości jest Firma z Krakowa. Wprawdzie ich popularność
sięga całego kraju lecz nadal działają w podziemiu. W swoich utworach
wyrażają głównie nienawiść do policji i donosicieli a także opowiadają o
szacunku, oddaniu i zwykłych szarych dniach krakowian z blokowisk. Utwór
"M.O Faya" odnosi się właśnie do policji. Każdy z raperów opowiada w nim 
także o sobie.

 Tym razem zacznę od budowy tytułu. MO to skrót od Milicja Obywatelska która
w czasach PRL pełniła funkcję dzisiejszej policji. Jest to przykład parodii
i do tego dochodzi wulgarne określenie "faya" co dodatkowo ośmiesza i
oczernia funkcjonariuszy. Jeżeli chodzi o slangi to jest ich tutaj cała
masa. Nielegale charakteryzują się w dużej mierze tym że jest tam mnóstwo
slangów. Jest to język ulicy a raperzy z Firmy utożsamiają się właśnie z
ulicą. Jako przyład można wymienić chociażby "społeczniara" co jest także
słownictwem ekpresywnym ujemnym od "społeczniak" co oznacza konfidenta,
człowieka który śledzi ludzi i donosi. Innym przyładem jest "gad" na
określenie policjanta lub "radiola" co oznacza wóz policyjny. Rymy w tym
utworze są bez zmian czyli rymy parzyste. Piosenka pełni raczej funkcję
informująco-pouczającą. Utwór zawiera mnóstwo przekleństw co podkreśla jego
przesłanie w stronę policji i donosicieli, których autorzy nienawidzą. 

4. Wniosek

a) trudność jednoznacznego określenia czy teksty rapowe to przykład mowy
potocznego czy poezji śpiewanej:
 
 Trudno jednoznacznie stwierdzić czy teksy rapowe to przykład mowy potocznej
lub poezji śpiewanej. 

- argumenty za mową potoczną:

 Jak wspomniałem na początku jest to przykład mowy potocznej ponieważ mówi 
się tam o zdarzeniach, potrzebach, doznaniach, uczuciach w kontaktach z 
ludźmi. Słowa te są układane w taki sposób w jaki raperzy mówią na codzień. 
Są czasami piękne, czasami wulgarne a czasami niepoprawne.

- argumenty za poezją śpiewaną:

 Rymy w rapie są układane zwykle w obrębie wersu a jest to charakterystyczne
dla rymów w poezji. Teksty są śpiewane więc mamy poezję śpiewaną.

b) kompilacja obu typów:

 Rap jest moim zdaniem kompilacją mowy potocznej z poezją śpiewaną. 

2. Wersja skrócona 

1. Czym jest rap?

 Rap jest częścią kultury zwanej hip hopem do której zalicza się właśnie
rapowanie, break dance, DJ-ing oraz grafitti. Powstał w latach 
siedemdziesiątych 20. wieku w Nowym Jorku. Za pioniera hip hopu uważany jest
DJ Kool Herc. 

 Charaketerystyczne dla rapu jest przede wszystkim to że teksty są rymowane
do jednostajnego rytmu czyli beatu.

2. Charakterystyka tekstów rapowych

 Piosenki te są przykładem mowy potocznej pełnej slangowych określeń i którą 
to mowę zwykle mogą zrozumieć ludzie, którzy z hip hopem mają dużo wspólnego 
lub żyją wsród ludzi, którzy komunikują się między sobą za pomocą slangu. Teksty 
te zawierają w sobie mnóstwo ekspresji, wulgaryzmów oraz metafor. Wszystko zależy 
od tego do jakiej grupy ludzi chce dotrzeć raper. Twórzą zwykle monolog czyli 
tekst mówiony w stylu artystycznym.   

3. Analiza wybranych tekstów utwórów muzycznych

a) utwór "Kaliber 44 - + i -" jako przykład psychorapu

 Kaliber 44 powstał w roku 1994 w Katowicach. Na pierwszej płycie o nazwie 
"Księga tajemnicza. Prolog" zaprezentowali styl zwany psychorapem. Styl ten 
charakteryzuje się mocno tajemniczą atmosferą w utworze oraz mocno ekspresyjnymi 
tekstami, które podczas wymowy trudno zrozumieć. Sprawia to że słuchacz popada w 
silny stan refleksji i utożsamia się z raperami. Biorąc pod uwagę zespół Kaliber 
44 to sposób wypowiadania się na ich pierwszej płycie jest idiolektem. 

 Utwór "Plus i minus" opowiada o przeżyciach Magika jakie towarzyszyły mu
przed udaniem się na sprawdzenie wyników na obecność wirusa HIV. Plus i minus 
oznacza odpowiednio wynik pozytywny oraz negatywny. 

 Układy rymów w pierwszej zwrotce tekstu to głównie rymy okalające, np.
"Czas sie bać, nadszedł czas, sprawdź to, sprawdź" lecz występują tutaj 
również najcześniej spotykane rymy parzyste, np. "Idę tam, idę sam w tą czarną 
chwile. Tyle myśli w sekund tyle". W drugiej zwrotce pojawiają się również 
podobne układy ale w trzeciej występuje układ przeplatany, np. "I - dryn - 
telefon dzwoni i jak co dzień. Może tym razem  wreszcie sie dowiem. Dziś 
nadszedł ten dzień, dziś nadszedł dzień. Może będzie mym najlepszym dniem, a 
może nie". W tekście możemy napotkać przykład słownictwa ekspresywnego 
dodatniego, np. "doktorku", które odnosi się do doktora badającego Magika. 
Slangowe określenia to w tym tekście rzadkość, aczkolwiek można tutaj znaleźć 
wyraz "ścierwo" oznaczający amfetaminę. Kolejnym przykładem budowy tekstu jest 
onomatopeja "dryn" oznaczająca dźwięk dzwoniącego telefonu. Apostrofy 
"doktorze" oraz "Boże" pojawiające się w tekście odnoszą się do jedynych osób 
w których podmiot liryczny widzi nadzieję na swoje ozdrowienie. Refren to próba 
pokazania odbiorcom jak czuł się Magik. W jego głowie znajduje się tylko plus 
i minus, nie może się nad niczym skupić i zastanawia się czy umrze. Tekst ten 
pełni funkcję informująco-puczającą - podmiot liryczny opowiada o swoich 
przeżyciach i jednocześnie daje do zrozumienia żeby uważać na to co się robi i 
nikomu nie życzy aby przechodził przez to co on.

b) utwór "Mes (Flexxip)/ Numer Raz (Warszafski deszcz) - Rok później 
   (Oczy otwarte 2)" jako przykład dissu

 Najpierw musimy sobie odpowiedzieć na pytanie czym jest diss? Diss jest w
przypadku raperów atakiem słownym w którym obraża się przeciwnika wytykając
jego wady i słabości wpływając tym samym na psychikę i próbując złamać
przeciwnika. Może to być przykład parodii. Beefem z kolei nazywam konflikt
pomiędzy przedstawicielami środowiska hip hopowego.
 
 Przykładem właśnie takiego beefu jest Mes z Numer Raz przeciwko Mezowi. W
swoim utworze "Rok później (Oczy otwarte 2)" który znalazł się na składance
Kodex 2 dokonują dissu. Mes uważa że Mezo skopiował jego pseudonim. Razem z
Numer Raz uważa także że Mezo jest przedstawicielem nowej fali w środowisku 
muzycznym o nazwie hip hopolo. Jest to styl który łączy w sobie elementy hip 
hopu i disco polo (śpiewanie o miłości, itp.). Uważają że jest to hańba 
zarówno dla nich jak i dla hip hopu. 

 Rymy w tym tekście są ułożone w układzie końcowym parzystym przez wszystkie
zwrotki utworu, np. "To jakbyś rozdzielał syjamskie bliźnięta, ale Mes to
ten typ w niedzielę i święta". W refrenie pojawiają się onomatopeje 
"tararappa, parararappa, o o" w kontekście tego że dla Mesa i Numer Raza 
"rap to coś wiecęj niż" te zacytowane onomatopeje oznaczające jakieś bezsensowne 
śpiewanie beż żadnego przesłania. Znaleźć tutaj możemy kilka wyrazów 
zapożyczonych jak np. "oldschoolowo" co wzięło się z angielskiego "old school" 
co oznacza starą szkołę czyli w tym wypadku w starym stylu. Innym przykładem 
jest "MC" z angielskiego "master of ceremony" czyli mistrz ceremonii co oznacza 
rymującego rapera, który zabawia publiczność. Pod koniec piosenki mamy przykład 
funkcji fatycznej; "Aha, pokażę Ci jak się gra, słyszysz?", która ożywia nieco 
słuchacza bo chociaż jest już koniec utworu to jednak twórcy chcą aby jeszcze 
posłuchał co mają do powiedzenia. Występuje tutaj dużo slangów, m.in. "psy" dla 
określenia policjantów czy "przemalować na sino" czyli pobić i tym samym podbić 
oczy. W tekstach rapowych rzadko mamy doczynienia z archaizacją jednak znajduje 
się tutaj przykład wyrazu "bluźnię" czyli ubliżać komuś, obrażać kogoś. Następnie 
można się doszukać przykładu groteski "To jakbyś rozdzielał syjamskie bliźnięta". 
Odnosi się to do Mesa w kontekści tego że Mezo skopiował częściowo jego pseudonim 
i dla tego pierwszego jest to jak rozdzielenie syjamskich bliźniąt czyli właściwie 
niemożliwe i absurdalne. Podobnie jak poprzedni utwór, "Rok poźniej (Oczy otwarte 2)" 
ma funkcję informująco-pouczającą. 

c) utwór "DJ 600V feat. K.A.S.T.A. Skład - Wychylylybymy" jako przykład baunsu

 Słowo bauns wzięło się od angielskiego słowa "bounce" oznaczającego
podskakiwać lub energia życiowa. W kontekście rapowym oznacza utwory
zawierającego mnóstwo niskotonowych brzmień, nadające się świetnie na
imprezy a teksty zaś mówią o zabawie, używkach czy kobietach.

 Utwór o którym mowa znalazł się na płycie DJ-a 600V pt. "600 stopni
Celsjusza". K.A.S.T.A. to skrót od Konfederacja Absolwentów Szkoły
Technicznej Artykulacji. Zespół ten został założony we Wrocławiu.

 Jak zwyklę zacznę od najważniejszej części tekstów rapowych czyli rymu.
Tutaj bez zmian w budowie - jak zwykle są to rymy parzyste, np. "600 stopni
Celsjusza w twoich uszach. Łbem beat rusza, rym mknie jak Katiusza". Przykładem 
apostrofy jest tutaj "Świeży powiew, yo, Volt puść to w obieg" gdzie Wall-E zwraca 
się do twórcy podkładu DJ-a 600V, w kontekście wydania tego utworu gdyż jest to 
całkiem nowy przykład dobrego rapu o zabarwieniu baunsowym. Innym przykładem budowy 
tekstu jest personifikacja "Łbem beat rusza, rym mknie jak Katiusza". Oznacza to 
że Donguralesko uwielbia ten podkład a jego głowa rusza się w takt muzyki który 
leci z siłą wystrzelonego pocisku. Jeżeli chodzi o wyrazy zapożyczone to występuje 
tutaj słowo "mixtape" co oznacza zmiksowane przez DJ-a utwory do których zwykle
rymują raperzy lub "track" czyli ścieżka dźwiękowa. Znajduje się tutaj dość dużo 
slangowych określeń dlatego dla laika trudno ten tekst zrozumieć, np. tytuł utworu 
"wychylylybymy" co prawdopodobnie oznacza wypić jakiś alkohol do dna lub inny 
slang "wypasiony" co oznacza wspaniały. Ilość tych slangów oznacza że raperzy 
chcą dotrzeć tylko do tej grupy która wie o co chodzi. Piosenka ma funkcję 
estetyczną. Można zauważyć również w niej mnóstwo porównań, np. 
"Beat gorący jak romans Clintona z Monicą. Robię to z tym jak Rutkowski z paniką". 
Muzycy K.A.S.T.A. Skład bardzo często używają różnorakich porównań w swoich 
utworach.

d) utwór "Nagły Atak Spawacza - Czujesz jak ja" jako przykład hardcore rapu

 Hardcore rap jest to nurt w muzyce hip hopowej gdzie myślą przwodnią jest
ofensywa i agresja przeciwko ludziom którzy w jakiś sposób zirytowali
raperów. 

 Nagły Atak Spawacza to poznański skład założony w 1995 roku. Zespół jest 
dosyć kontrowersyjny i nagrał dużo płyt w których ostro krytykuje ludzi 
i rzeczywistość. Raperzy w piosence "Czujesz jak ja" o swojej miłości do 
hip hopu. Do tego co kochają i do tego czego nienawidzą.

 Standardowo rozpocznę od kwestii rymów. Dwie pierwsze zwrotki tworzą rymy
parzyste w trzeciej zaś występują rymy okalające, np. "I tak ma być, nie 
można się z poglądami kryć". Ilość slangów w tym utworze jest znikoma ale
pod koniec utworu Kamień używa stwierdzenia "kumasz?" czyli "rozumiesz?" a
także "mnie to wali" czyli "mnie to nie obchodzi" ale w bardzo agresywnym
odniesieniu. Doszukać się tutaj można pewnego związku frazeologicznego 
mianowicie "co tu jest grane" oznacza on "o co tutaj chodzi". Funkcję
fatyczną w tej piosence pełni sam refren "czujesz to tak samo jak ja? 
Lubisz jak ja gdy muzyka gra?". Refren jak wiadomo występuje kilkakrotnie w
utworze a przez to że posiada w nim funkcję fatyczną staje się niezwykle
żywy i pobudzający. Piosenka ma funkcję estetyczną gdyż odnosi się do uczuć
słuchacza.

e) utwór "Firma - M.O Faya" jako przykład nielegalu

 Firma jest to krakowski zespół powstały on w 2000 roku będący przykładem
muzyki undergroundowej czyli działającej w podziemiu.

 Nielegal jest utworem muzycznym nie wydanym w żadnej komercyjnej wytwórni 
muzycznej a publikowanym w Internecie lub na zasadzie "z ręki do ręki".
Piosenki takie nagrywane są zazwyczaj na domowym komputerze. Przykładem
właśnie takiej twórczości jest Firma z Krakowa. W swoich utworach wyrażają 
głównie nienawiść do policji i donosicieli a także opowiadają o szacunku, 
oddaniu i zwykłych szarych dniach krakowian z blokowisk. Utwór "M.O Faya" 
odnosi się właśnie do policji. Każdy z raperów opowiada w nim także o sobie.

 Tym razem zacznę od budowy tytułu. MO to skrót od Milicja Obywatelska która
w czasach PRL pełniła funkcję dzisiejszej policji. Jest to przykład parodii
i do tego dochodzi wulgarne określenie "faya" co dodatkowo ośmiesza i
oczernia funkcjonariuszy. Jeżeli chodzi o slangi to jest ich tutaj cała
masa. Nielegale charakteryzują się w dużej mierze tym że jest tam mnóstwo
slangów. Jest to język ulicy a raperzy z Firmy utożsamiają się właśnie z
ulicą. Jako przyład można wymienić chociażby "społeczniara" co jest także
słownictwem ekpresywnym ujemnym od "społeczniak" co oznacza konfidenta,
człowieka który śledzi ludzi i donosi. Innym przyładem jest "gad" na
określenie policjanta lub "radiola" co oznacza wóz policyjny. Rymy w tym
utworze są bez zmian czyli rymy parzyste. Piosenka pełni raczej funkcję
informująco-pouczającą. Utwór zawiera mnóstwo przekleństw co podkreśla jego
przesłanie w stronę policji i donosicieli, których autorzy nienawidzą. 

4. Wniosek

a) trudność jednoznacznego określenia czy teksty rapowe to przykład mowy
potocznego czy poezji śpiewanej:
 
 Trudno jednoznacznie stwierdzić czy teksy rapowe to przykład mowy potocznej
lub poezji śpiewanej. 

- argumenty za mową potoczną:

 Jak wspomniałem na początku jest to przykład mowy potocznej ponieważ mówi 
się tam o zdarzeniach, potrzebach, doznaniach, uczuciach w kontaktach z 
ludźmi. Słowa te są układane w taki sposób w jaki raperzy mówią na codzień. 
Są czasami piękne, czasami wulgarne a czasami niepoprawne.

- argumenty za poezją śpiewaną:

 Rymy w rapie są układane zwykle w obrębie wersu a jest to charakterystyczne
dla rymów w poezji. Teksty są śpiewane więc mamy poezję śpiewaną.

b) kompilacja obu typów:

 Rap jest moim zdaniem kompilacją mowy potocznej z poezją śpiewaną. 

sobota, 24 lipca 2010

Problem z ClamAV

Ostatnio próbowałem włączyć system mailingowy na moim serwerze i oto jaką wiadomość dostałem gdy próbował włączyć się silnik antywirusowy ClamAV:

Starting ClamAV daemon: clamd LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
LibClamAV Error: cli_hex2str(): Malformed hexstring: This ClamAV version has reached End of Life! Please upgrade to version 0.95 or later. For more information see  www.clamav.net/eol-clamav-094 and www.clamav.net/download (length: 169)
LibClamAV Error: Problem parsing database at line 738
LibClamAV Error: Can't load /tmp/clamav-68821fd5938f593d3d0f1fcfe8b48ca0/daily.ndb: Malformed database
LibClamAV Error: Can't load /var/lib/clamav/daily.cvd: Malformed database
ERROR: Malformed database
 failed!

Na stronie domowej ClamAV znalazłem opis problemu: http://www.clamav.net/lang/en/2009/10/05/eol-clamav-094/. Wszystko wyglądało na to, że będę musiał ręcznie skompilować ClamAV i czekać na poprawkę, jednak znalazłem obejście tego problemu:

# rm /var/lib/clamav/daily.cvd
# /etc/init.d/clamav-freshclam stop
Stopping ClamAV virus database updater: freshclam.
# /etc/init.d/clamav-daemon start
Starting ClamAV daemon: clamd LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
.
# postsuper -r ALL
postsuper: Requeued: 1 message
# postfix flush

Czyli jak zwykle dochodzę do wniosku, że nie ma rzeczy niemożliwych :)

poniedziałek, 19 lipca 2010

TCP Timestamp do liczenia hostów za NAT-em

1. Prolog

Cześć! Minęło troche czasu odkąd opublikowałem tłumaczenie jednego z
artykułów z 63. Phracka z serii Linenoise. Prezentuję dzisiaj kolejny pt.
"TCP Timestamp do liczenia hostów za NAT-em".

|=-------------------------=[ 0x03-2 ]=----------------------------------=|
|=---------=[ TCP Timestamp do liczenia hostów za NAT-em ]=---------------=|
|=-----------------------------------------------------------------------=|
|=-------------=[ Elie aka Lupin (lupin@zonart.net) ]=-------------------=|

Tabela zawartości
*=*=*=*=*=*=*=*=*

1.0 Wprowadzenie

2.0 Czas ma nam coś do powiedzenia

- 2.1 Przeszłość
- 2.2 Teraźniejszość
- 2.3 Powrót do początkowej historii timestamp
- 2.4 Powrót do NAT
- 2.5 Omówmy PAT
- 2.6 Czas na zwalczanie

3.0 Historia ma nam coś do powiedzenia

- 3.1 Która klasa?
- 3.2 Więc skąd to się wzięło?
- 3.3 Jak to znaleźć?
- 3.4 Powrót do przyszłości

4.0 Nauka z przełości aka wniosek

A - Uznania

B - Dowód koncepcji


--[ 1.0 Wprowadzenie

Ten artykuł jest o rozwiązaniu jakim jest TCP timestamp. Rozwiązanie to oferuje
nową możliwość liczenia hostów będących za NAT-em oraz podwyższony fingerprinting
tych hostów. Dogłębniej: ten artykuł próbuje przedstawić nową wizję klasy
znanych dziur w oprogramowaniu mających "projektowany błąd". Ta dziura została
opisana tutaj i jest godna zainteresowania choćby z następujących powodów:
- jest nowa,
- działa na każdej platformie odkąd jest to związane raczej ze specyfikacją
niż implementacją,
- jest to niezła możliwość aby wyjaśnić jak niektóre specyfikacje mogą być
złamane.

Ten artykuł jest zorganizowany następująco: najpierw wyjąśnię co jest złego
w TCP timestamp. Potem opiszę jak to wykorzystać, ograniczenia tego
wykorzystania oraz jak tego uniknąć. W drugiej części pomówię o pochodzeniu
tego błędu i dlaczego to się znowu zdarza. Na koniec przedstawię dowód
koncepcji i pozdrowienia jak zwykle.

--[ 2.0 Czas ma nam coś do powiedzenia

----[ 2.1 Przeszłość

Fingerprinting i detekcja NAT były aktywnymi dziedzinami od bardzo dawna.
Od czasu kiedy czytasz Phrack znasz już starą szkołę TCP/IP Fyodora.

Możesz znać także p0f (passive OS fingerprinting) Michała Zalewskiego. Z
wersją 2. ukończył on wspaniałe narzędzie, przedstawia pomysłowe drogi
na zrozumienie czy hosty używają mechanizmu NAT przez analizę opcji
pakietu TCP. Jeżeli jesteś zainteresowany tym narzędziem (a powienieneś!)
przeczytaj jego artykuł: "Dr. Jekyll had something to Hyde" [5].

Faktycznie, opisana tutaj technika jest związana z p0f, coś jak p0f, to
może być całkowicie pasywne.

Żeby skończyć temat detekcji NAT muszę nadmienić że AT&T ukończyło badania
nad liczeniem hostów będących za NAT-em [1]. Ich praca była skupiona na IP
ID, przypuszczali że ta wartość jest inkrementowana w niektórych systemach.
Rzeczywiście, mowili oni głownie o Windows który zwiększa IP ID każdego
pakietu o 256. Odkryte przez Antirez [7]. Nmap [6] użył tego dawno temu
(opcja -sI).

Teraz wiemy o czym mówimy. Czas wyjaśnić o co chodzi.

----[ 2.2 Teraźniejszość

NAT został zaprojektowany aby stanąć naprzeciw wyczerpaniu puli adresów IP.
Jest także używany aby ukryć wiele hostów będących za pojedyńczym adresem
IP. Opcja TCP timestamp [2] jest błędnie opracowana przez mechanizm
Translacji Adresów Sieciowych czyli Network Adress Translation (NAT) [3].

Innymi słowy nawet zeskrobanie tego z p0f nie podrobi opcji timestamp.
Do teraz właściwość NAT-u była bezużyteczna (z punktu widzenia
bezpieczeństwa). Warto zwrócić uwagę na to że opcja timestamp była używana
już poprzednio przez samą siebie do ujawniania informacji. Spójrzmu szybko
na historię bezpieczeństwa timestamp.

----[ 2.3 Powrót do początkowej historii timestamp

W przeszłości timestamp był używany do obliczania uptime'u komputera
[4]. Każdy kto wypróbował opcję fingerprintingu TCP w Nmapie (-O) był pod
wrażeniem gdy zobaczył coś takiego:

"Uptime 36.027 days (since Tue May 25 11:12:31 2004)".

Oczywiście za tym nie kryje się żadna czarna magia, tylko dwa fakty:
- czas powraca tylko w filmach (przykro mi, chłopcy...),
- wszystkie systemy operacyjne inkrementują timestamp o jeden co
milisekundę.

Więc jeżeli znasz system operacyjny to wiesz jak często system ten zwiększa
timestamp. Wszystko co musisz zrobić żeby dowiedzieć się ile wynosi uptime
to zastosować prostą matematyczną formułę:

timestamp / wartość o którą się zwiększa co sekundę = uptime w sekundach

Możesz zauważyć że ta formuła nie bierze pod uwagę osnowy zaokrąglenia
liczby całkowitej. Teraz znamy dwie rzeczy: aktualny timestamp i liczbę o
którą zwiększa się co sekundę. Skończymy to tylko jeżeli znamy typ systemu
operacjnego. Zobaczmy jak możemy udoskonalić tą technikę robiąc to bez
znajomości systemu operacyjnego.

----[ 2.4 Powrót do szkoły

Pamiętasz? Dawno temu w szkole mówiono o równaniu kierunkowym prostej.
Podstawowym przykładem tego jest:

"y = Ax + B"

gdzie A oznacza monotoniczność funkcji a B punkt początkowy.
Graficzną reprezentacją tego jest linia prosta. Z punktu widzenia timestamp
to może być ekspresowe jak następuje:

timestamp = wartość o którą się zwiększa co sekundę * sekunda + wartość
początkowa

Kiedy wykonujesz aktywny fingerprinting dostajesz timestamp i znasz wartość
o którą się zwiększa co sekundę poprzez odgadnięcie systemu operacyjnego.

Załóżmy że możesz odgadnąć jaki jest system operacyjny. W tym wypadku nie
znasz monotoniczności funkcji i nie możesz odgadnąć uptime'u. Ale jest inna
droga na dowiedzenie się jaka jest monotoniczność systemu operacyjnego.
Musisz zdobyć komputer z podwójnym timestampem. Nazwą jest ts1 i ts2 a
wartość czasu (w sekundach) gdzie jest zapisywany to s1 i s2.

Mając tamte informacje można bardzo łatwo znaleźć monotoniczność dzięki
następujacemu układowi:

ts1 = A*s1 + B
ts2 = A*s2 + B

gdzie rozwiązaniem jest to oto równanie:

ts1 - ts2 = A*(s1 - s2) <=> A = (ts1 - ts2) / (s1 - s2)

Bezpośrednia aplikacja wykorzystująca ten pomysł może być zaimplementowana
w aktywnym skanerze: dwókrotne żądanie o timestamp w celu weryfikacji czy
monotoniczność jest taka sama jak przypuszczaliśmy.

To może zostać użyte do złamania jakiegoś anty-fingerprintingowego narzędzia.
Innym zastosowaniem jest użycie tego jako techniki standalone fingerprinting
ale nie będziemy mieć pewności czy ma raz TCP czy ICMP.

Teraz znamy już teorię, wróćmy do NAT-u.

----[ 2.5 Powrót do NAT-u

Utwórzmy połączenie z NAT-em. Odkąd rozwiązanie timestamp nie jest
przepisywane przez NAT, możemy policzyć liczbę hostów za NAT-em używając
następującego algorytmu:

1) dla każdego już odkrytego hosta weryfikowany jest pakiet należący do
tego równania linii prostej. Każdy host ma unikatowe równanie prostej
dopóki dwa hosty są bootowane w tej samej sekundzie.

2) w przeciwnym wypadku należy dodać pakiet do nie pasującego pakietu: nowy
host za NAT-em jest wykrywany.

Rzuć okiem na dowód koncepcji jeżeli chcesz zrobić to bardziej klarownie.
Ten prosty algorytm ma wiele do udoskonalenia. Został przedstawiony jako
prosty i możliwie jak najbardziej przezroczysty. Jak widzisz rozwiązanie
timestamp może zostać użyte do liczenia hostów za NAT-em w sposób niezawodny.
Poda również wskazówkę dotyczącą klasyfikację systemu operacyjnego.

----[ 2.6 Omówmy PAT

PAT (Port Address Translation - Translacja Adresu Portu) jest używana do
dostarczania usługi na komputerze za NAT-em.

Pytaniem jest skąd wiem że port jest forwardowany? Timestamp jest raz
jeszcze Twoim przyjacielem. Jeżeli dla dwóch różnych usług monotoniczność
timestampu jest inna, wtedy PAT i system operacyjny dwóch komputerów są różne.
Jeżeli timestamp pobrany z dwóch portów nie należy do tej samej prostej, wtedy
jest to ten sam system ale nie ten sam komputer.

Inną interesującą funkcją PAT-u jest round robin (od tł.: w wolnym
tłumaczeniu jest to okrągły rudzik). Do teraz nie było żadnej możliwości żeby się
dowiedzieć czy taki mechanizm został użyty. Przez porównywanie różnych
zebranych timestampów możesz ustalić ile hostów jest za pojedyńczym portem.
Dodanie takiej funkcji w aktywnym skanerze mogło być ciekawe.

----[ 2.7 Czas na zwalczanie

Od czasu kiedy gra z tą opcją mogła dać cenne informacje, jest tam
jakieś ograniczenie na tą technikę. Stacje windowsowe właściwie nie używają
rozwiązania timestamp kiedy ustanawiają połączenie [8] chyba że je
aktywujesz. To ograniczenie oddziałuje tylko na pasywną analizę, jeżeli
używasz timestamp do łączenia się z Windowsem to on także będzie tego
używał. Ponadto wiele ściąganych programów aktywuje rozszerzenie TCP w
Windowsie.

Żeby zakończyć temat chciałbym nadmienić że wydaje się że rozszerzenie TCP
nie istnieje w Windows 9X.

Jednym z innych problemów jest przerwa czasowa. W trybie pasywnym może być tam
desynchronizacja pomiędzy komputerami spowodowana komputerową
desynchronizacją lub sieciowymi opóźnieniami. W dowodzie koncepcji to
zjawisko może się przytrafić. Żeby to załatwić nie musisz polegać na
komputerowym zegarze ale na timestamp.

Co możemy zrobić w stosunku do tego? Od czasu kiedy żaden sprzedawca prócz
Microsoftu (1) (dzięki Magnus) nie zadał mi pytania, następujące
obejścia mogą nie być dostępne:

1) Wyłączanie TCP timestamp. To jest gorsze rozwiązanie ponieważ będziemy
tego potrzebowali mimo szybkiej sieci.
2) Przepisanie NAT-u na timestamp i zmienianie The NAT RFC.
3) Zmienianie zawartości RFC na taką że rozwiązanie timestamp musi mieć
przypadkowy przyrost. Modyfikowanie każdej implementacji odbija tą
zmianę. Czyste rozwiązanie utwierdzające tą rzecz ponieważ to nie
polega na zewnętrznym systemie (komputer z NAT-em w tym wypadku).

Więc muszę spróbować być tak kompletnym jak to możliwe w tej technicznej
części. Następna część będzie bardziej "filozoficzna" zaczynając od tego jak
to ma do czynienia z powodem zamiast konsekwencji.

--[ 3.0 Historia ma nam coś do powiedzenia

W tej części spróbuję skupić się na tym dlaczego mamy taką sytuację i co
możemy z tym zrobić. Nie będę mówił tutaj o rozwiązaniu timestamp samym w
sobie ale o interakcji pomiędzy timestamp a mechanizmem NAT.

----[ 3.1 Która klasa?

Pierwsze pytanie brzmi: co jest bugiem? Ta dziura należy do modelu klasy
błędów. Bardziej precyzyjnie: bug istnieje ponieważ istnieje specyfikacja
protokołu. IP został zaprojektowany jako protokół jeden na jeden: jeden
klient mówi do jednego serwera. NAT narusza tą specyfikację przez
dopuszczenie wielokrotnych odwołań do jednego serwera. Z natury to nadużycie
powoduje wiele problemów dzięki którym tracę to co policzyłem, lecz jest to
dosyć pewne że najbardziej rekurencyjnym problemem jest transfer FTP. Jeżeli
używasz FTP to wiesz o co mi chodzi (inni mogą spojrzeć na netfilter ftp
conntrack).

----[ 3.2 Więc skąd to się wzięło?

Problem FTP jest dobrym przykładem aby wyjaśnić pochodzenie problemu
zachodzącej specyfikacji. FTP został wyspecyfikowany do pracy nad solidnym
połączeniem jeden do jednego (w rzeczywistości TCP). NAT został
zaprojektowany do modyfikacji IP. Więc dzięki zależnościom protokołu to
także zmienia TCP i przeto FTP.

Podczas specyfikacji NAT-u nie było brane pod uwagę że każdy protokół który
polega na IP, może wchodzić w konflikt ze zmodyfikowaną specyfikacją. Jeżeli
chciano powiedzieć prawdę, nawet jeżeli ludzie którzy zaprojektowali mechanizm
NAT kiedykolwiek potrzebowali gwarancji że każdy protokół który opiera się na
IP może pracować z NAT-em, nie można było tego zrobić.

Dlaczego? Ponieważ specyfikacje są w RFC i RFC jest po angielsku. Angielski
nie jest dobrym pomysłem na specyfikację rzeczy szczególnie jeżeli masz
wykres zależności dla specyfikacji.

Np. wiele języków programowania ma formalne specyfikcje. Która jest
pełniejszym dowodem rozwiązania. Rozwiązanir tego braku specyfikacji
znajduje się w historii Internetu [9]. W tym czasie pisząc mały tekst była to
dostateczna ilość. Teraz może to być problemem.

----[ 3.3 Jak to znaleźć?

Ważym pytaniem jest, jak mam znaleźć ten bug? Więc, znalazłem ten problem
przez formalizację części RFC TCP i porównanie wyniku tej analizy z
prawdziwymi śladami wykonania. Mój analizator (2) ostrzegł mnie że timestamp
był mniejszy niż jeden poprzedni i jak wiesz czas nie wróci...

Sprawdziłem dlaczego i jak znalazłem ten problem. Interesujące jest tutaj
to że punktem wyjścia do znalezienia tego błędu jest raczej specyfikacja niż
implementacja jak to zwykle można znaleźć przepełnienie bufora dla przykładu.

----[ 3.4 Powrót do przyszłości

Więc co się od tej porty będzie działo? Ano znajdowanych będzie więcej
projektowanych błędów ponieważ nie możemy zmienić przeszłości i musimy z tym
żyć.
Nie jest sensowne mówić że możemy ścierać wszystko to co materiał TCP i
rozpoczynać nową rzecz od zadrapania. Internet i sieć są po prostu za duże do
poruszania się w ten sposób. Najprościej mówiąc myślą co sekundę o rozlokowaniu
IP v6 i przekonasz się o tym. Wszystko co możemy zrobić to być tak ostrożnymi
jak to możliwe kiedy projektujemy jakieś nowe rozszerzenie lub protokół.
Próbujmy zapewniać że ten nowy materiał nie powoduje konfliktów z
poprzednimi wersjami lub nie narusza zależności. Możemy także próbować
formalizować protokoły tak dużo jak to możliwe i wykrywać błędy zanim
spowodują jakieś problemy. Łatanie błędów jest naszym głównym zadaniem na
najbliższe lata.

--[ 4.0 Nauka z przeszłości aka wniosek

Przeszłość mówi nam że protokół nie jest dostatecznie dobrze
wyspecyfikowany i prowadzi do błędów (bug, konflikt...). To może być czas na
zmianę naszych zwyczajów i próbę dodania czegoś na podstawie bilansu naszego
czasu. Np. do zaprojektowania naszych rzeczy bezpiecznie w umyśle. W tym
artykule spróbowałem pokazać wam że przez proste zrozumienie specyfikacji i
z pomocą podstawowej znajomości matematyki możesz:

- znaleźć usterkę o ogólnoświatowym wpływie,
- wykorzystać tą usterkę w elegancki sposób za pomocą prostej teorii,
- rozwijać sztukę fingerprintingu.

Mam nadzieję że to pomoże przekonać cię że teoria i formalne narzędzia są
niezbędną częścią obszaru bezpiecznego komputera. Następnym razem skupię się
na prostej formalnej metodzie znalezienia bugu. Mam nadzieję że tutaj
będziecie :)

--[ A Uznania

Najpierw chciałbym podziękować Romainowi Bottierowi za jego pomoc i jego
cierpliwość. Chcę także podziękować Plopsowi i Polucowi za wiarę we mnie.
Widzicie ludzie udało się nam!

Chcę także powiedzieć że biorę całkowitą odpowiedzialność za nie ujawnienie
polityki. Powiadomiłem głównych sprzedawców (Kernel.org, FreeBSD, OpenBSD,
Cisco...) miesiąc temu. Tak jak powiedziałem nie otrzymałem żadnej reakcji
więc dochodzę do wniosku że ich to nie obchodzi.

Referencje
*=*=*=*=*
[1] AT&T Steven M. Bellovin. A Technique for Counting NATted Hosts
http://www.research.att.com/~smb/papers/fnat.pdf
[2] Jacobson, Braden, & Borman. RFC 1323 :TCP Extensions for High
Performance.
[3] K. Egevang, Cray Communications, P. Francis. RFC 1631:
The IP Network Address Translator (NAT).
[4] Bret McDanel. TCP Timestamping - Obtaining System Uptime Remotely
originally posted to Bugtraq Security Mailing List on March 11, 2001.
[5] Michal Zalewski. p0f 2:Dr. Jekyll had something to Hyde.
[6] Fyodor. Nmap - Free Security Scanner For Network Exploration &
Security Audits.
[7] Antirez. dumbscan original BUGTRAQ posting (18 Dec 1998)
[8] Microsoft. TCP timestamp in windows : KB224829.
[9] Hafner, Katie, Matthew Lyon. Where Wizards Stay Up Late: The Origins of
the Internet.

Notatki
*=*=*=*

(1) Punktem widzenia Microsoftu jest to że NAT nie jest bezpiecznym
mechanizmem więc nie chcą tego łatać.

(2) Jesteś zainteresowany moim analizatorem? Mam nadzeję nadzieję że
niedługo opublikuję teoretyczny artykuł o tym jak to działa. Mam także
nadzieję wypuścić wkrótce jakąś wersję tego. Co do pytania czy znalazłem
inne interesujące rzeczy odpowiedź brzmi: może muszę to sprawdzić
bardziej dogłębnie.

--[ B Dowód koncepcji

/*
* Dowód koncepcji: liczenie hostów za NAT-em przy pomocy timestamp
* Żeby skompilować ten plik potrzebujesz libpcap
* Wszelkie prawa zatrzeżone dla Elie Bursztein (lupin@zonart.net)
* Kompilacja udała się na FreeBSD 5.X i Linux 2.6.X
*
* $ gcc natcount.c -o natcount -I/usr/local/include -L/usr/local/lib -lpcap
*/

#define __USE_BSD 1

#include <sys/time.h>
#include <time.h>
#include <netinet/in.h>
#include <net/ethernet.h>

#ifdef __FreeBSD__
#include <netinet/in_systm.h>
#endif /* __FreeBSD__ */
#ifdef __linux__
#include <linux/if_ether.h>
#endif /* __linux__ */

#include <netinet/ip.h>
#include <stdlib.h>
#include <string.h>
#include <pcap.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <net/if.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>

#ifdef __linux__
#define th_off doff
#endif /* __linux__ */

u_int32_t addr = 0;

/* Łańcuch struktur list */
typedef struct listes_s {
struct listes_s *next;
void *elt;
} listes_t;

/* Struktury dla opcji TCP */

typedef struct { u_int32_t ts, ts_r; } timestamp_t;
typedef struct { timestamp_t *ts; } tcp_opt_t;

/* Struktury do składu danych */

typedef struct { u_int32_t from, first_timestamp; struct timeval
first_seen; } machine_t;
typedef struct { u_int32_t host, nat; struct timeval first_seen; }
nat_box_t;

#define TIMESTAMP_ERROR_MARGIN 0.5
#define DELAY 1

/* Lista funkcji */

int add_in_list(listes_t **list, void * elt) {
listes_t *lst;
lst = malloc(sizeof (listes_t));
lst->next = *list;
lst->elt = elt;
*list = lst;
return (1);
}

void show_nated(listes_t *list) {
nat_box_t *nat;
struct in_addr addr;
printf("-- Poczatek listy NAT-owanych adresow IP --\n");

while (list) {
nat = (nat_box_t *) list->elt;
if (nat->nat > 1) {
addr.s_addr = nat->host;
printf("Przypuszczam ze %i komputerow rozdziela te same adresy
(%s)\n", nat->nat, inet_ntoa(addr));
}

list = list->next;
}

printf("-- Koniec listy NAT-owanych adresow IP --\n");
}

/* Funkcja używana do pobierania wszystkich opcji TCP.
* Prosty parser opcji TCP */

int tcp_option_parser(const u_char *options, tcp_opt_t *parsed, unsigned int
size) {
u_int8_t kind, len, i;

bzero(parsed, sizeof(tcp_opt_t));
i = 0;
kind = *(options + i);

while (kind != 0) /* EO */ {
switch (kind) {
case 1:
i++;
break; /* Bajt NOP */

case 2:
i += 4;
break;

case 3:
i += 3;
break;

case 4:
i += 2;
break;

case 5: /* pominięcie opcji SACK */
len = (*options + ++i) - 1;
i += len;
break;

case 6:
i += 6;
break;

case 7:
i += 6;
break;

case 8:
i += 2;
parsed->ts = (timestamp_t *) (options + i);
i += 8;
return (1);
break;

default:
i++;
}

kind = *(options + i);
}

return (0);
}

/* Najbardziej interesująca funkcja... Tutaj możemy sie dowiedzieć czy
* pakiet TCP pochodzi od kogoś kogo już znamy!
*
* Prototyp:
* finc(sekundy) = aktualny_czas_pakietu - pierwszy_czas_pakietu <-
* czas_pomiedzy_dwoma_pakietami
* ts_inc = inc_table[i] * finc <-
* nasz_przypuszczalny_inkrementowany_timestamp_pomiedzy_dwoma_pakietami
* new_ts = pierwszy_timestamp + ts_inc <- new *
timestamp_ktory_powinnismy_miec_teraz!
*
* Teraz musimy poprostu porównać new_ts z aktualnym czasem timestampu.
* Możemy autoryzować marginesowy błąd od 0.5%.
*
* Nasza inc_table zawiera inkrementowany co sekundę timestamp dla wielu
* systemów operacyjnych. */

int already_seen(machine_t *mach, tcp_opt_t *opt, struct timeval temps)
{
int inc_table[4] = {2, 10, 100, 1000};
unsigned int new_ts;
float finc, tmp, ts_inc;
int i, diff;

finc = ((temps.tv_sec - mach->first_seen.tv_sec) * 1000000.
+ (temps.tv_usec - mach->first_seen.tv_usec)) / 1000000.;

for (i = 0; i < 4; i++) {
ts_inc = inc_table[i] * finc;
new_ts = ts_inc + mach -> first_timestamp;
diff = ntohl(opt->ts->ts) - new_ts;

if (diff == 0) { /* Celny strzał! */
return (2);
}

tmp = 100. - (new_ts * 100. / ntohl(opt->ts->ts));

if (tmp < 0.)
tmp *= -1.;

if (tmp <= TIMESTAMP_ERROR_MARGIN) { /* Uaktualniony timestamp i czas */
mach -> first_seen = temps;
mach -> first_timestamp = ntohl(opt->ts->ts);
return (1);
}
}

return (0);
}

/* Zwykła funkcja sprawdzająca czy adres IP jest już w naszej liście. Jeżeli
* nie to jest to tylko nowe połączenie. */

int is_in_list(listes_t *lst, u_int32_t addr)
{
machine_t *mach;

while (lst) {
mach = (machine_t *) lst -> elt;

if (mach -> from == addr)
return (1);

lst = lst -> next;
}

return (0);
}

/* Ta funkcja powinna być wywoływana jeżeli pakiet z adresu IP został
* znaleziony, jeśli adres jest już w liście ale nie pasuje do żadnej
* wartości timestamp. */

int update_nat(listes_t *list, u_int32_t addr)
{
nat_box_t *box;

while (list) {
box = (nat_box_t *) list -> elt;

if (box->host == addr) {
box->nat++;
return (1);
}

list = list->next;
}

return (0);
}

int check_host(listes_t **list, listes_t **nat, u_int32_t from,
tcp_opt_t *opt, struct timeval temps)
{
listes_t *lst;
machine_t *mach;
int found, zaped;

found = zaped = 0;

lst = *list;

while (lst && !(found)) {
mach = (machine_t *) lst -> elt;

if (mach -> from == from) {
if (temps.tv_sec - mach -> first_seen.tv_sec > DELAY) {
found = already_seen(mach, opt, temps);
}

else
zaped = 1;
}

lst = lst->next;
}

if (!(zaped) && !(found)) {
mach = malloc(sizeof (machine_t));
mach -> from = from;
mach -> first_seen = temps;
mach -> first_timestamp = ntohl(opt->ts->ts);
add_in_list(list, mach);
update_nat(*nat, from);
show_nated(*nat);
return (1);
}

return (0);
}

void callback_sniffer(u_char *useless, const struct pcap_pkthdr* pkthdr,
const u_char *packet)
{
static listes_t *list_machines = 0;
static listes_t *list_nat = 0;
const struct ip *ip_h;
const struct tcphdr *tcp_h;
tcp_opt_t tcp_opt;
machine_t *mach;
nat_box_t *nat;
struct in_addr my_addr;

ip_h = (struct ip *) (packet + sizeof(struct ether_header));

if (ip_h -> ip_p == IPPROTO_TCP) {
tcp_h = (struct tcphdr *) (packet + sizeof(struct ether_header) +
sizeof(struct ip));

if (tcp_h -> th_off * 4 > 20) {
if (tcp_option_parser((u_char *) (packet + sizeof(struct
ether_header) + sizeof(struct ip) + sizeof(struct tcphdr)),
&tcp_opt, tcp_h->th_off * 4 - 20)) {
if (is_in_list(list_machines, (ip_h->ip_src).s_addr)) {
check_host(&list_machines, &list_nat, (u_int32_t)
(ip_h->ip_src).s_addr, &tcp_opt, pkthdr->ts);
}

else {
if (ntohl(tcp_opt.ts -> ts) != 0) {
addr = (ip_h -> ip_src).s_addr;
my_addr.s_addr = addr;
mach = malloc(sizeof(machine_t));
mach -> from = (ip_h -> ip_src).s_addr;
mach -> first_seen = pkthdr -> ts;
mach -> first_timestamp = ntohl(tcp_opt.ts -> ts);
nat = malloc(sizeof(nat_box_t));
nat -> host = (u_int32_t) (ip_h -> ip_src).s_addr;
nat -> nat = 1;
nat -> first_seen = mach -> first_seen;
add_in_list(&list_machines, mach);
add_in_list(&list_nat, nat);
}
}
}
}
}
}

int main(int ac, char *argv[])
{
pcap_t *sniff;
char errbuf[PCAP_ERRBUF_SIZE];
struct bpf_program fp;
char *device;
bpf_u_int32 maskp, netp;
struct in_addr my_ip_addr;
char filter[250];

if (getuid() != 0) {
printf("Musisz byc rootem zeby uzywac tego narzedzia.\n");
exit (2);
}

if (--ac != 1) {
printf("Uzycie: ./natcount xl0\n");
return (1);
}

device = (++argv)[0];
pcap_lookupnet(device, &netp, &maskp, errbuf);
my_ip_addr.s_addr = (u_int32_t) netp;

printf("Uzywany interfejs IP %s: %s\n", device, inet_ntoa(my_ip_addr));

if ((sniff = pcap_open_live(device, BUFSIZ, 1, 1000, errbuf)) == NULL) {
printf("ERR: %s\n", errbuf);
exit(1);
}

bzero(filter, 250);
snprintf(filter, 250, "not src net %s", inet_ntoa(my_ip_addr));

if (pcap_compile(sniff,&fp, filter, 0, netp) == -1) {
fprintf(stderr,"Blad nazywany pcap_compile\n");
exit(1);
}

if (pcap_setfilter(sniff,&fp) == -1) {
fprintf(stderr, "Blad ustawienia filtra\n");
exit(1);
}

pcap_loop(sniff, -1, callback_sniffer, NULL);
return (0);
}

2. Epilog

To by było na tyle. I pamiętajcie że głowa jest pełna pomysłów.