#                          #  #           
 ######### #    #  ######### #########      #  #       #   
 #       #  #  #   #       # #       #    ########   ###   
 #           ##    #         #              #  #       #   
 #######     ##    #######   #              #  #       #   
 #       #  #  #   #       # #       #    ########     #   
 ######### #    #  ######### #########      #  #    #######
                                            #  #           
                                             

---== [EXEC] electronic magazine about hack sercurity coding & ru hack scene ==--- 


# Fingerprinting services

В этой статье я хочу написать о том как своими руками написать софтину, которая может определять на удаленном компе версии установленных сервисов. «А как же netcat?» - спросите вы. Да, не отрицаю, существует уже много утилит, позволяющих делать это. Но эта программа представлена для обучения людей кодить под сеть и писать свой хакерский софт. И к тому же лично мне всегда приятнее пользоваться своим софтом, ибо я знаю что «уж он точно не допустит ни каких ошибок». Как пример определения версии сервиса я напишу программу, которая определяет на какой веб сервер стоит на удаленной машине. Программа предельно проста и по сути своей она выполняет всего 2 действия – посылает на 80 порт удаленной машины пакет инициализации и принимает ответ.
//подключаем нужные библиотеки 
#include     //библиотека ввода/вывода
#include    //библиотека работы с сокетами
#include   //вспомогательная библиотека из которой мы 
используем //только функцию getch()

int main()
{
  //строки инициализации работы с сокетами
WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 0), &wsaData);

  //объявление нового сокета и структуры, содержащей параметры 
подключения
SOCKET NewSocket;
  SOCKADDR_IN rmaddr;

    //ввод IP адеса
char ip[15]="";
    printf("IP: "),scanf("%s",ip);
   
//присваиваем соответствующему полю структуры параметров 
подключения IP //адрес жертвы 
rmaddr.sin_addr.s_addr = inet_addr(ip);
  //для работы нашей программы этот параметр должен быть 
AF_INET
rmaddr.sin_family = AF_INET;
  //определяем номер порта, на котором висит нужный нам сервис 
rmaddr.sin_port = htons(80);
  //процедура инициализации сокета
NewSocket = socket (AF_INET,SOCK_STREAM,0);

    //собственно строка в ответ на которую сервиз выдаст нам свою 
инфу
char *buf="HEAD / HTTP/1.0\n\n";

  //подключаемся =)
connect(NewSocket,(struct sockaddr *)&rmaddr,sizeof(rmaddr));
  //посылаем строку инициализации по созданному подключению
send(NewSocket, buf, strlen(buf), 0);

    char buffer[4096]="";
  
//принимает ответ то сервера
  recv(NewSocket, buffer, 4096, 0);
    
//выводим полученные результаты
printf("Sent string> %s",buf);
  printf(buffer);

    //ждем до нажатия клавиши
getch();
  
WSACleanup();
  return 0;
  //finito la komedia
}
Вот пример работы программы:

HTTP/1.1 200 OK
Date: Mon, 09 Dec 2002 08:22:42 GMT
Server: Apache/1.3.28 (Win32)
Last-Modified: Sun, 01 Dec 2002 06:24:26 GTM
ETag: "0-122-3de9ab1a"
Accept-Ranges: bytes
Content-Length 290
Connection: close
Content-Type: text/html

Аналогично можно делать и с другими сервисами, тока нужно знать их строку инициализации. По всем вопросам стучитесь в аську 200223633. LSD© and sm00ch 2004г.
+ Содержание +