Листинг №7(8) Bugtraq стр. 10 http://host.with.unparsable.xml.file /flaw.xml? errorres://shdoclc.dll/404_HTTP.htm#http://site.com/file.html res://shdoclc.dll/HTTP_501.htm#javascript: %2f*://*%2falert(location.href)/ Мониторинг Windosw-серверов с помощью Nagios Часть 1 Андрей Бешков \\TIGROID\Процессор(_Total)\% загруженности процессора \\TIGROID\Процессор(0)\% загруженности процессора \\TIGROID\Процессор(1)\% загруженности процессора # Описываем хост по имени win2000rus define host{ use generic-host host_name win2000rus alias Windows 2000 Russian address win2000rus check_command check-host-alive max_check_attempts 10 notification_interval 120 notification_period 24x7 notification_options d,u,r } define hostgroup{ hostgroup_name win-servers alias Windows Servers contact_groups win-admins members win2000rus } define contact{ contact_name serge alias Sergei Petrov service_notification_period 24x7 host_notification_period 24x7 service_notification_options w,u,c,r host_notification_options d,u,r service_notification_commands notify-by-email, notify-by-epager host_notification_commands host-notify-by-email, host-notify-by-epager email serge@test.ru pager 172345885@pager.icq.com } define contactgroup{ contactgroup_name win-admins alias Windows admins members serge } > C:\Program Files\NSClient\pNSClient /install [0x0419] Description = "Russian" NT4_SystemTotalProcessorTime = "\Система\% загрузки процессора" NT4_SystemSystemUpTime = "\Система\Время работы системы" NT4_MemoryCommitLimit = "\Память\Предел выделенной виртуальной памяти" NT4_MemoryCommitByte = "\Память\Байт выделенной виртуальной памяти" W2K_SystemTotalProcessorTime = "\Процессор(_Total) \% загруженности процессора" W2K_SystemSystemUpTime = "\Система\Время работы системы" W2K_MemoryCommitLimit = "\Память\Предел выделенной виртуальной памяти" W2K_MemoryCommitByte = "\Память\Байт выделенной виртуальной памяти" NSClient is now responding to queries. NSClient 1.0.7.0 has started. Language code : 0x0419 NSClient is reading C:\Program Files\NSClient\counters.defs for counters definitions. Language code : 0x0419 NSClient has stopped # tar zxvf nagiosplug-1.3-beta1.tar.gz nchars = vsnprintf (str, size, fmt, ap); nchars = vsprintf (str, fmt, ap); Memory usage: total:??????? Mb - used: ??????? Mb (???????%) - free: ??????? Mb (???????%) c:\ - total: ??????? Gb - used: ??????? Gb (???????%) - free ??????? Gb (???????%) CPU Load (1 min. 12??????? # cd .. # ./configure --prefix=/usr/local/nagios --with-nagios-user=nagios --with-nagios-grp=nagios # gmake all # gmake install Making all in plugins “/tmp/nagiosplug-1.3-beta1/plugins/Makefile”, line 760: Need an operator make: fatal errors encountered – cannot continue *** Error code 1 # Определяем команду check_nt_cpuload . Использоваться она # будет для сбора данных о загруженности процессора define command{ command_name check_nt_cpuload command_line $USER1$/check_nt -H $HOSTADDRESS$ -v CPULOAD -l $ARG1$ -s $ARG2$ } # Команда check_nt_memuse. Показывает данные об использовании # памяти. Имеется в виду виртуальная память. define command{ command_name check_nt_memuse command_line $USER1$/check_nt -H $HOSTADDRESS$ -v MEMUSE -w $ARG1$ -c $ARG2$ -s $ARG3$ } # Команда check_nt_uptime. Отображает время работы системы # с момента последней перезагрузки define command{ command_name check_nt_uptime command_line $USER1$/check_nt -H $HOSTADDRESS$ -v UPTIME -s $ARG1$ } # Команда check_nt_disk_space. Отображает размер свободного # пространства на любом жестком диске системы define command{ command_name check_nt_disk_space command_line $USER1$/check_nt -H $HOSTADDRESS$ -v USEDDISKSPACE –l $ARG1$ -w $ARG2$ -c $ARG3$ -s $ARG4$ } # Описываем команду check_nt_service. Позволяет проверить, # запущен ли в системе тот или иной сервис. Обратите внимание # на необязательную опцию -d SHOWALL, позволяющую вывести # более подробные диагностические сообщения. define command{ command_name check_nt_service command_line $USER1$/check_nt -H $HOSTADDRESS$ -v SERVICESTATE -d SHOWALL –l $ARG1$ -s $ARG2$ } # Самая простая из всех вышеописанных команд # check_nt_client_version позволяет узнать версию # программы NSClient., работающую в системе define command{ command_name check_nt_client_version command_line $USER1$/check_nt -H $HOSTADDRESS$ -v CLIENTVERSION –s $ARG1$ } # Команда check_nt_file_age дает возможность проверить время # модификации любого файла на локальной машине define command{ command_name check_nt_file_age command_line $USER1$/check_nt -H $HOSTADDRESS$ -v FILEAGE -l $ARG1$ -w $ARG2$ -c $ARG3$ -s $ARG4$ } # Определяем команду check_nt_process. Предоставляет # механизм, с помощью которого можно узнать, существует ли # в системе тот или иной процесс. Обратите внимание # на необязательную опцию -d SHOWALL, позволяющую вывести # более подробные диагностические сообщения о состоянии # процесса. define command{ command_name check_nt_process command_line $USER1$/check_nt -H $HOSTADDRESS$ -v PROCSTATE –d SHOWALL -l $ARG1$ -s $ARG2$ } # Команда check_nt_counter дает возможность просмотреть # содержимое любого счетчика производительности, и поэтому # является самой универсальной из всех описанных команд. define command{ command_name check_nt_counter command_line $USER1$/check_nt -H $HOSTADDRESS$ -v COUNTER -l $ARG1$ -w $ARG2$ -c $ARG3$ -s $ARG4$ } check_command check_nt_process!"calc.exe,notepad.exe, mspaint.exe"!PxRT890mY # На нашем сервере работают несколько самодельных программ. # Они должны выполняться круглосуточно, поэтому мы создали # следующий сервис. # Для примера будут использоваться общедоступные программы # «Калькулятор», «Paint», «Блокнот», поставляющиеся # с каждым дистрибутивом Windows. define service{ use generic-service host_name win2000rus service_description User Programs is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r # Обратите внимание на тот факт, что мы следим не за самими # программами, а за их процессами в памяти. Имена процессов # можно узнать с помощью встроенного в Windows стандартного # диспетчера задач. Также стоит внимательно присмотреться # к формату списка процессов. check_command check_nt_process!"calc.exe,notepad.exe, mspaint.exe"!PxRT890mY } # Этот сервис показывает версию программы NSClient, # работающей в системе. define service{ use generic-service host_name win2000rus service_description NSClient Version is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r # Формат команды очень простой. В $ARG1$ передается пароль check_command check_nt_client_version!PxRT890mY } # Каждый час удаленный сервер базы данных кладет в локальную # папку общего доступа c:\upload\ файл update.dbf. В этом # файле находятся обновления базы данных. # Если время создания файла не меняется больше, чем 70 минут, # значит, происходит что-то нехорошее, и нужно перейти # в состояние предупреждения. # В случае, когда нет изменений в течении 90 минут, сервис # переходит в критическое состояние. define service{ use generic-service host_name win2000rus service_description File age is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r # Все пути к файлам должны содержать двойной символ «\». check_command check_nt_file_age!"c:\\upload\\update.dbf "!70!90!PxRT890mY } # Этот сервис показывает количество свободной виртуальной # памяти, которое вычисляется таким образом. # NSClient читает содержимое счетчика # «\Память\Предел выделенной виртуальной памяти» # и делит его на 100. Так получается величина, показывающая, # сколько байт памяти принимается за один процент. # Затем данные из счетчика # «\Память\Байт выделенной виртуальной памяти» # делятся на количество байт в одном проценте. # Так мы узнаем, сколько процентов занято. # К счастью, лично заниматься подобными операциями # нет необходимости. NSClient сделает все сам. define service{ use generic-service host_name win2000rus service_description Free Memory is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r # Переход в состояние предупреждения происходит, если занято # 70% памяти. Критический статус наступает, когда # израсходовано 90% памяти. check_command check_nt_memuse!70%!90%!PxRT890mY } # Этот сервис позволяет увидеть загрузку процессора. define service{ use generic-service host_name win2000rus service_description CPU Load is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r # Нагрузка считается в интервале за одну минуту. Переход # в состояние предупреждения происходит при достижении уровня # в 80%, а критический статус наступает, если загрузка 90% # и более. Все эти характеристики задаются цифрами 1, 80, 90. check_command check_nt_cpuload!1,80,90!PxRT890mY } # Время бесперебойной работы системы с момента последней # перезагрузки. define service{ use generic-service host_name win2000rus service_description Up time is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r check_command check_nt_uptime!PxRT890mY } # Проверяем, функционирует ли сервис MS SQL SERVER # и самописный сервис vmxposman. define service{ use generic-service host_name win2000rus service_description CPU Load is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r # Проблема в том, что в программе управления сервисами # Windows показывает полные названия сервисов, # предназначенные для человека. # Нам нужно название, которое используется для внутренних нужд # Windows. Узнать эту тайну можно либо посмотрев ветвь реестра: # HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services., # либо установив бесплатную утилиту 'Service Manager NT', # доступную для скачивания по следующему адресу: http://www # rnks.informatik.tu-cottbus.de/~fsch/english/nttols.htm # Обратите внимание на тот факт, что по аналогии с процессами # имена сервисов тоже можно перечислять через запятую. check_command check_nt_service!”mssqlserver,vmxposman” } # Следим за количеством заданий, находящихся # в очереди принтера. define service{ use generic-service host_name win2000rus service_description Print Queue is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r # Используя команду check_nt_counter, можно получить данные # с любого счетчика. В данным случае – # \Очередь печати(_Total)\Заданий # Строка «%.0f job(s)» указывает модулю применить к результату # преобразование к типу float и вывести число в формате # с точностью ноль знаков после запятой. # Затем к числу для наглядности добавляется строка «job(s)». # Если вам непонятно, что это значит, – посмотрите # документацию по функции printf ( ) языка С. # Переход в состояние предупреждения происходит # при накоплении 5 заданий, а критический статус # наступает, если их становится 10 и более. check_command check_nt_counter! ї "\Очередь печати(_Total)\Заданий", "%.0f job(s)"!5!10!PxRT890mY } # Проверяем процент использования файла подкачки define service{ use generic-service host_name win2000rus service_description Paging File is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups win-admins notification_interval 120 notification_period 24x7 notification_options c,r # Тут мы снова используем check_nt_counter, хотя и немного # другим способом. # Строка «Usage %.2f %%» указывает модулю применить # к результату преобразование к типу float и вывести число # в формате с точностью два знака после запятой. # Затем для наглядности приклеиваем спереди строку «Usage». # Обратите внимание на двойной знак «%» в строке # форматирования. # Снова вспомнив хорошими словами функцию printf ( ), # понимаем, что в результате из двух получится один символ «%». # Переход в состояние предупреждения происходит при достижении # уровня в 80 процентов, а критический статус наступает, # если файл подкачки заполнен на 90 и более процентов. check_command check_nt_counter! ї "\Файл подкачки(_Total)\% использования", "Usage %.2f %%"!80%!90%!PxRT890mY } siconv-0.2.1 fconv-1.1 ru-xcode-1.0 ru-dt1489-1.4 ru-mtc-1.3 # cat checkcommands.cfg | mtc –f koi8 –t win 1251 > checkcommands.tmp # mv checkcommands.tmp checkcommands.cfg # /usr/local/etc/rc.d/nagios.sh restart Стартовые скрипты в FreeBSD Денис Пеплин sshd_enable="YES" ifconfig_rl0="inet 123.123.123.2 netmask 0xfffffff0" ifconfig_rl1="inet 192.168.0.1 netmask 0xffffff00" hostname="example.com" defaultrouter="123.123.123.1" firewall_type="OPEN" firewall_enable="YES" gateway_enable="YES" natd_enable="YES" natd_interface="rl0" named_enable="YES if [ -r /etc/defaults/rc.conf ]; then . /etc/defaults/rc.conf source_rc_confs elif [ -r /etc/rc.conf ]; then . /etc/rc.conf fi # portmap # mountd -r # nfsd # rpc.statd # /etc/rc.d/nfsd start # for i in /etc/rc.d/*; do $i status 2>/dev/null; done # for i in /etc/rc.d/*; do echo $i; $i rcvar 2>/dev/null; echo; done # PROVIDE: nfsd # REQUIRE: mountd # KEYWORD: FreeBSD NetBSD # PROVIDE: devd # BEFORE: disks # KEYWORD: FreeBSD # rcorder -k FreeBSD -s nostart /etc/rc.d/* 2>/dev/null #!/bin/sh - case "$1" in start) /usr/local/sbin/prog -d && echo -n ' prog' ;; stop) kill `cat /var/run/prog.pid` && echo -n ' prog' ;; *) echo "unknown option: $1 - should be 'start' or 'stop'" >&2 ;; esac #!/bin/sh # # PROVIDE: prog # REQUIRE: before_prog # BEFORE: after_prog # KEYWORD: FreeBSD . /etc/rc.subr name="prog" rcvar=`set_rcvar` command="/usr/local/bin/prog" load_rc_config $name run_rc_command "$1" Usage: /etc/rc.d/prog [fast|force](start|stop|restart|rcvar|reload|status|poll) $ cat /etc/rc.d/[a-z]* | egrep "^[a-z]+_?[a-z]+=.*$" | awk -F= '{print $1}' | sort -u | less $ cat /etc/rc.d/[a-z]* | egrep "^[a-z]+_?[a-z]+=.*$" | sort -u | less Настройка сервера SSH Денис Колисниченко cd /usr/src/ tar xzf ssh-2.4.0.tar.gz cd ssh-2.4.0 ./configure make make install Листинг 1. Фрагмент файла /etc/services ssh 22/tcp # SSH Remote Login Protocol ssh 22/udp # SSH Remote Login Protocol $ ssh hostname.domain ssh -l user hostname.ru allowedadress 10.1.1.1 10.1.2.1 10.1.3.1 Port 22 Protocol 2,1 /etc/ssh/ssh_host_key /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_dsa_key PermitRootLogin yes PasswordAuthentication yes PermitEmptyPasswords no IRC-cервер Александр Слободской [user@server]$ ./configure [user@server]$ make && make install [user@server]$ make LDFLAGS=static && make install M:имя_сервера:ip:описание_сервера:стандартный_порт A:описание:Admin:e-mail Y:1:90:0:250:100000 Y:30:180:0:0:3500000 Y:40:90:90:1:3500000 Y:50:90:60:1:4000000 Y:51:90:60:0:4000000 I:*@*:Пароль:*@*::1 I:*@*::*@*::1 O:host:пароль:login:modes:1 r = доступ к команде /rehash. R = доступ к команде /restart. D = доступ к команде /die. g = может слать /globops. c = доступ к локальному произведению /connect и /squit. C = доступ к удаленным /squits и /connects. k = доступ к локальным /kills. K = доступ к глобальным /kills. b = доступ к /kline пользователей с сервера. o = локальный администратор, включены такие флаги, как, rhgwlckbBnuf. U:services.some.net:*:* X:diepass:restartpass C:удаленный_сервер:пароль:имя_удаленного_сервера: port:класс _коннекта N:удаленный_сервер:пароль:имя_удаленного_сервера: класс_ коннекта Q:*:причина:nickname H:*::hub.server.ru P:*:*:*:port e:127.0.0.1::* M:irc.server.ru:*:Network server:6667 A:My cool server:mr_Black:email@server.ru Y:1:90:0:30:100000 Y:50:90:60:1:4000000 Y:51:90:60:0:4000000 Y:30:180:0:0:3500000 Y:40:90:90:1:3500000 I:*@*::*@*::1 O:*@*:qwerty:mr_Black:*:1 U:services.server.ru:*:* X:qwerty:qwerty C:127.0.0.1:services:services.server.ru:50 N:127.0.0.1:services:services.server.ru::50 Q::Reserved for services:ChanServ Q::Reserved for services:NickServ Q::Reserved for services:MemoServ Q::Reserved for services:OperServ Q::Reserved for services:HelpServ Q::Reserved for services:NewsServ Q::Reserved for services:Global Q::Reserved for operators:IRCop H:*::services.server.ru bugtraq стр. 31 mailto:[address]`[malicious command]` GET [overflow] HTTP/1.1 Host: www.apachesite.com Accept-Encoding: gzip, deflate GET /cgi-bin/printenv.pl?x=%25n%25n%25n%25n%25n HTTP/1.1 Host: www.apachesite.com Accept-Encoding: gzip, deflate GET /cgi-bin/printenv.pl?x=%n%n%n%n%n HTTP/1.1 Host: www.apachesite.com Accept-Encoding: gzip, deflate Контроль последовательных портов в Linux Денис Колисниченко Листинг 1. Программа для контроля последовательного порта #include #include #include #include #include #include #include int main(int argc, char **argv) { int fd; int flags; if (argc<1) { fprintf(stderr,"Usage: pctrl serial_device"); fprintf(stderr,"For example: sns /dev/ttyS0"); exit(1); } if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) { // Невозможно открыть порт fprintf(stderr, "Cannot open port"); exit(1); } // Бесконечный цикл. Для выхода из программы нажмите Ctrl + C while (1) { ioctl(fd, TIOCMGET, &flags); /* Используемые константы (см. таблицу 1) #define TIOCM_LE 0x001 #define TIOCM_DTR 0x002 #define TIOCM_RTS 0x004 #define TIOCM_ST 0x008 #define TIOCM_SR 0x010 #define TIOCM_CTS 0x020 #define TIOCM_CAR 0x040 #define TIOCM_RNG 0x080 #define TIOCM_DSR 0x100 #define TIOCM_CD TIOCM_CAR #define TIOCM_RI TIOCM_RNG */ // Выводим состояние устройства if (flags & TIOCM_CD) fprintf(stderr,"1 [CD] "); if (flags & TIOCM_SR) fprintf(stderr,"2 [RD] "); if (flags & TIOCM_ST) fprintf(stderr,"3 [TD] "); if (flags & TIOCM_DTR) fprintf(stderr,"4 [DTR] "); if (flags & TIOCM_DSR) fprintf(stderr,"6 [DSR] "); if (flags & TIOCM_RTS) fprintf(stderr,"7 [RTS] "); if (flags & TIOCM_CTS) fprintf(stderr,"8 [CTS] "); if (flags & TIOCM_RNG) fprintf(stderr,"9 [RNG] "); fprintf(stderr,"\n"); // Засыпаем на 1 секунду sleep(1); } close(fd); } gcc -o pctrl pctrl.c Листинг 2. Установка сигнала RNG #include #include #include #include #include #include #include int main(int argc, char **argv) { int fd; int flags=TIOCM_RNG; if (argc<1) { fprintf(stderr,"Usage: sns serial_device"); fprintf(stderr,"For example: sns /dev/ttyS0"); exit(1); } ioctl(fd, TIOCMSET, &flags); close(fd); } Неявный самоконтроль как средство создания неломаемых защит Крис Касперски int my_func() { if (check_user()) { fprintf(stderr, "passwd ok\n"); } else { fprintf(stderr, "wrong passwd\n"); exit(-1); } return 0; } .text:00401060 sub_401060 proc near ї; CODE XREF: sub_4010A0+AF?p .text:00401060 call sub_401000 .text:00401065 test eax, eax .text:00401067 jz short loc_40107E .text:00401069 push offset aPasswdOk; "passwd ok\n" .text:0040106E push offset unk_407110 .text:00401073 call _fprintf .text:00401078 add esp, 8 .text:0040107B xor eax, eax .text:0040107D retn .text:0040107E ; ----------------------------------------- .text:0040107E .text:0040107E loc_40107E:; CODE XREF: sub_401060+7?j .text:0040107E push offset aWrongPasswd; "wrong passwd\n" .text:00401083 push offset unk_407110 .text:00401088 call _fprintf .text:0040108D push 0FFFFFFFFh; int .text:0040108F call _exit .text:0040108F sub_401060 endp union anti_hack { char buf[MAX_CODE_SIZE]; struct code_control { int local_var_1; int local_var_2; char gag_1[OFFSET_1-sizeof(int)*2]; int x_val_1; char gag_2[OFFSET_2 - OFFSET_1 - sizeof(int)]; int x_val_2; }; }; Листинг 1. #include #define PASSWD "+++" #define MAX_LEN 1023 #define MAX_CODE_SIZE (0x10*1024) #define OFFSET_1 0x42 #define OFFSET_2 0x67 #define x_original_1 0xc01b0574 #define x_original_2 0x44681574 #define x_original_all 0x13D4C04B #define x_crypt 0x66 int check_user() { char passwd[MAX_LEN]; fprintf(stderr,"enter password:"); fgets(passwd, MAX_LEN, stdin); return ~strcmp(passwd, PASSWD); } int my_func() { if (check_user()) { fprintf(stderr, "passwd ok\n"); } else { fprintf(stderr, "wrong passwd\n"); exit(-1); } return 0; } main() { int a, b = 0; #pragma pack(1) union anti_hack { char buf[MAX_CODE_SIZE]; struct code_control { int local_var_1; int local_var_2; char gag_1[OFFSET_1-sizeof(int)*2]; int x_val_1; char gag_2[OFFSET_2 - OFFSET_1 - sizeof(int)]; int x_val_2; }; }; union anti_hack ZZZ; // TITLE fprintf(stderr, "crackeme.0xh by Kris Kaspersky\n"); // расшифровка кода // ====================================================== // копируем расшифровываемый код в буфер memcpy(&ZZZ, &check_user, (int) &main - (int) &check_user); // расшифровываем в буфере for (a = 0; a < (int) &main - (int) &check_user; a++) { (*(char *) ((int) &ZZZ + a)) ^= x_crypt; } // копируем обратно memcpy(&check_user, &ZZZ, (int) &main - (int) &check_user); // явная проверка изменения кода // ====================================================== for (a = 0; a < (int) &main - (int) &check_user; a++) { b += *(int *) ((int) &check_user + a); } if (b != x_original_all) { fprintf(stderr, "-ERR: invalid CRC (%x) hello, hacker\n", b); return 0; } // явная проверка "валидности" пользователя // ====================================================== my_func(); // нормальное выполнение программы // ====================================================== // скрытый контроль ZZZ.local_var_1 = 2; ZZZ.local_var_2 = 2;x_original_2; sprintf(ZZZ.gag_1, "%d * %d = %d\n", ZZZ.local_var_1,ZZZ.local_var_2, ZZZ.local_var_1*ZZZ.local_var_2 +((x_original_1^ZZZ.x_val_1)+(x_original_2^ZZZ.x_val_2))); printf("DEBUG: %x %x\n", ZZZ.x_val_1, ZZZ.x_val_2); fprintf(stderr, "%s",ZZZ.gag_1); } Три составных части защиты Сергей Яремчук # make linux (openbsd, freebsd, netbsd) # make install 192.168.2.0/24 192.168.0.0/16 192.168.2.1/32 # FreeBSD #KILL_ROUTE="route add -net $TARGET$ -netmask 255.255.255.255 127.0.0.1 -blackhole" # iptables support for Linux #KILL_ROUTE="/usr/local/bin/iptables -I INPUT -s $TARGET$ -j DROP" PORT_BANNER="** UNAUTHORIZED ACCESS PROHIBITED *** YOUR CONNECTION ATTEMPT HAS BEEN LOGGED. GO AWAY." # /usr/local/psionic/portcentry2/portcentry Jun 4 09:00:32 grinder portsentry[1881]: adminalert: Monitoring interface eth0 and address: 192.168.0.4 Jun 4 09:00:32 grinder portsentry[1881]: adminalert: Initializing PortSentry BPF filters. Jun 4 09:00:32 grinder portsentry[1881]: adminalert: Monitoring TCP ports: 1,11,15,79,111,119,143,515,540,635,666,1080,1524,2000,6667,12345,12346,20034,27374,27665,3133 7,32771,32772,32773,32774,40421,49724,54320,54321 Jun 4 09:00:32 grinder portsentry[1881]: adminalert: Monitoring UDP ports: 1,7,9,69,161,162,513,635,2049,27444,32770,32771,32772,32773,32774,31337,54321 Jun 4 09:00:32 grinder portsentry[1881]: adminalert: PortSentry is initialized and monitoring. # tar xfzv logsentry-1.1.1.tar.gz # cd logcheck-1.1.1 # make linux Jun 4 09:00:32 grinder sendmail[5475]: VAA05473: to=crowland, ctladdr=root (0/0), delay=00:00:02, xdelay=00:00:01, mailer=local, stat=refused Jun 4 09:00:32 grinder rshd: refused connect from hacker@evil.com:1490 mailer=local, stat=refused *.info;mail.none;authpriv.none;cron.none;uucp,news.crit /var/log/messages # chown root.wheel /var/log/messages # chmod 600 /var/log/messages # chown root.wheel /usr/local/etc/logcheck.sh # chmod 600 /usr/local/etc/logcheck.sh # chown root.wheel /usr/local/bin/logtail # chmod 700 /usr/local/bin/logtail 00 * * * * root /bin/sh /usr/local/etc/logcheck.sh LANG="en_US" SYSFONT="Cyr_a8x16" SYSFONTACM="koi2alt" # python hostsentry.py Jun 8 18:26:42 grinder hostSentry[23306]: adminalert: HostSentry version 0.02 is initializing. Jun 8 18:26:42 grinder hostSentry[23306]: adminalert: Send bug reports to Jun 8 18:26:43 grinder hostSentry[23460]: adminalert: HostSentry is active and monitoring logins. loginIP@loginHostname@loginTTY@loginTime@logoutTime Jun 8 18:30:19 grinder -- sergej[1639]: LOGIN ON tty1 BY sergej Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: LOGIN User: sergej TTY: tty1 Host: Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: First time login for user: sergej Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: Action being taken for user: sergej Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: Module requesting action is: moduleFirstLogin Jun 8 18:30:20 grinder hostSentry[23460]: securityalert: Action complete for module: moduleFirstLogin Jun 8 18:30:21 grinder hostSentry[23460]: securityalert: Foreign domain login detected for user: sergej from: Jun 8 18:30:21 grinder hostSentry[23460]: securityalert: Action being taken for user: sergej Jun 8 18:30:21 grinder hostSentry[23460]: securityalert: Module requesting action is: moduleForeignDomain Jun 8 18:30:21 grinder hostSentry[23460]: securityalert: Action complete for module: moduleForeignDomain Python глазами DBA Олег Попов try: import cx_Oracle except ImportError,info: print "Import Error:",info sys.exit() if cx_Oracle.version<'3.0': print "Very old version of cx_Oracle :",cx_Oracle.version sys.exit() try: my_connection=cx_Oracle.connect('system/manager@test_db') except cx_Oracle.DatabaseError,info: print "Logon Error:",info exit(0) my_cursor=my_connection.cursor() try: my_cursor.execute(""" SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME,SUM(BLOCKS)SIZE_BLOCKS, COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTS GROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME """) except cx_Oracle.DatabaseError,info: print "SQL Error:",info exit(0) print print 'Database:',my_connection.tnsentry print print "Used space by owner, object type, tablespace " print "-------------------------------------------------" title_mask=('%-16s','%-16s','%-16s','%-8s','%-8s') i=0 for column_description in my_cursor.description: print title_mask[i]%column_description[0], i=1+i print '' print "-------------------------------------------------" row_mask='%-16s %-16s %-16s %8.0f %8.0f ' for recordset in my_cursor.fetchall(): print row_mask%recordset Database: testdb Used space by owner, object type, tablespace ------------------------------------------------------------- OWNER SEGMENT_TYPE TABLESPACE_NAME SIZE_BLOCKS SIZE_EXTENTS ------------------------------------------------------------- ADU2 INDEX USERS 784 25 ADU2 TABLE USERS 512 24 ADUGKS INDEX DEVELOP_DATA 984 123 ADUGKS TABLE DEVELOP_DATA 664 83 ADUGPA INDEX USERS 784 25 ADUGPA TABLE USERS 496 23 AGNKS_SG INDEX USERS 352 22 AGNKS_SG TABLE USERS 240 15 ATU INDEX USERS 3968 244 ATU TABLE DEVELOP_DATA 8 1 ATU TABLE USERS 2688 160 ATU1 INDEX DEVELOP_DATA 1600 200 ATU1 INDEX USERS 608 38 ATU1 TABLE DEVELOP_DATA 1032 129 ATU1 TABLE USERS 544 34 BUX INDEX DEVELOP_DATA 64 8 BUX TABLE DEVELOP_DATA 1736 217 DISP INDEX USERS 400 25 DISP TABLE USERS 528 33 EPE INDEX USERS 80 5 EPE TABLE USERS 48 3 EXZ INDEX USERS 1088 61 EXZ TABLE DEVELOP_DATA 8 1 EXZ TABLE USERS 832 41 select * from all_users where USERNAME LIKE :S cursor2.execute("select * from all_users where USERNAME LIKE :S ",S='S%') cursor2.execute("select * from all_users where USERNAME LIKE :S ",{':S':'S%'}) var=my_cursor.var(cx_Oracle.DATETIME) var=my_cursor.var(cx_Oracle.DATETIME) try: my_cursor.execute("""begin SELECT SYSDATE INTO :p_Value from dual; end;""",p_Value = var) except cx_Oracle.DatabaseError,info: print "SQL Error:",info exit(0) CDATE=var.getvalue() print 'Date: %02u/%02u/%4u'%(CDATE.day,CDATE.month,CDATE.year) print 'Time: %02u:%02u:%02u'%(CDATE.hour,CDATE.minute,CDATE.second) Date( year, month, day) DateFromTicks( ticks) Time( hour, minute, second) TimeFromTicks( ticks) Timestamp( year, month, day, hour, minute, second) TimestampFromTicks( ticks) var=my_cursor.var(cx_Oracle.DATETIME) var.setvalue(0,cx_Oracle.Date( 2002, 02,12)) CDATE=var.getvalue() print'Date:%02u/%02u/%4u'%(CDATE.day,CDATE.month,CDATE.year) print'Time:%02u:%02u:%02u'%(CDATE.hour,CDATE.minute,CDATE.second) http://computronix.com/utilities.shtml http://www.python.org/topics/database/DatabaseAPI-2.0.html "" cx_Oracle demo simple query """ __AUTHOR__='POPOV O.' __COPYRIGHT__='POPOV O. 2002 Samara, Russia' from sys import exit try: import cx_Oracle except ImportError,info: print "Import Error:",info sys.exit() if cx_Oracle.version<'3.0': print "Very old version of cx_Oracle :",cx_Oracle.version sys.exit() try: my_connection=cx_Oracle.connect('system/gasdba@sqlmt') except cx_Oracle.DatabaseError,info: print "Logon Error:",info exit(0) my_cursor=my_connection.cursor() try: my_cursor.execute(""" SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME,SUM(BLOCKS)SIZE_BLOCKS, COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTS GROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME """) except cx_Oracle.DatabaseError,info: print "SQL Error:",info exit(0) print print 'Database:',my_connection.tnsentry print print "Used space by owner, object type, tablespace " print "--------------------------------------------------" title_mask=('%-16s','%-16s','%-16s','%-8s','%-8s') i=0 for column_description in my_cursor.description: print title_mask[i]%column_description[0], i=1+i print '' print "--------------------------------------------------" row_mask='%-16s %-16s %-16s %8.0f %8.0f ' for recordset in my_cursor.fetchall(): print row_mask%recordset for column_description in my_cursor.description: print column_description "" cx_Oracle demo query with parameters """ __AUTHOR__='POPOV O.' __COPYRIGHT__='POPOV O. 2002 Samara, Russia' from sys import exit try: import cx_Oracle except ImportError,info: print "Import Error:",info sys.exit() if cx_Oracle.version<'3.0': print "Very old version of cx_Oracle :",cx_Oracle.version sys.exit() try: my_connection=cx_Oracle.connect('system/manager@test_db') except cx_Oracle.DatabaseError,info: print "Logon Error:",info exit(0) my_cursor=my_connection.cursor() try: my_cursor.execute(""" SELECT OWNER,SEGMENT_TYPE,TABLESPACE_NAME,SUM(BLOCKS)SIZE_BLOCKS, COUNT(*) SIZE_EXTENTS FROM DBA_EXTENTS WHERE OWNER LIKE :S GROUP BY OWNER,SEGMENT_TYPE,TABLESPACE_NAME """,S='SYS%') except cx_Oracle.DatabaseError,info: print "SQL Error:",info exit(0) print print 'Database:',my_connection.tnsentry print print "Used space by owner, object type, tablespace " print "---------------------------------------------------" title_mask=('%-16s','%-16s','%-16s','%-8s','%-8s') i=0 for column_description in my_cursor.description: print title_mask[i]%column_description[0], i=1+i print '' print "----------------------------------------------------" row_mask='%-16s %-16s %-16s %8.0f %8.0f ' for recordset in my_cursor.fetchall(): print row_mask%recordset JAVA: РАБОТА С ФАЙЛАМИ Даниил Алиевский public static byte[] loadFileAsBytes( String fileName) throws IOException { return loadFileAsBytes(new File(fileName)); } public static byte[] loadFileAsBytes( File file) throws IOException { byte[] result= new byte[(int)file.length()]; loadFileAsBytes(file,result); return result; } public static void loadFileAsBytes(File file, byte[] buf) throws IOException { loadFileAsBytes(file,buf,0,buf.length); } public static void loadFileAsBytes( File file, byte[] buf, int off, int len) throws IOException { FileInputStream f= new FileInputStream(file); try { f.read(buf,off,len); } finally { try {f.close();} catch (Exception e) {}; } } public static void saveFileFromBytes( String fileName, byte[] buf) throws IOException { saveFileFromBytes(new File(fileName),buf); } public static void saveFileFromBytes( File file, byte[] buf) throws IOException { saveFileFromBytes(file,buf,0,buf.length); } public static void saveFileFromBytes( File file, byte[] buf, int off, int len) throws IOException { FileOutputStream f= new FileOutputStream(file); try { f.write(buf,off,len); } catch (IOException e) { try {f.close();} catch (Exception e1) {}; return; } f.close(); } public static void copyFile( String source, String target) throws IOException { copyFile(new File(source),new File(target)); } public static void copyFile( File source, File target) throws IOException { RandomAccessFile input= new RandomAccessFile(source,"r"); RandomAccessFile output= new RandomAccessFile(target,"rw"); try { byte[] buf = new byte[65536]; long len= input.length(); output.setLength(len); int bytesRead; while ((bytesRead= input.read(buf,0,buf.length))>0) output.write(buf,0,bytesRead); } catch (IOException e) { try {input.close();} catch (Exception e1) {}; try {output.close();} catch (Exception e1) {}; return; } try {input.close();} catch (Exception e) {}; output.close(); } public static String loadFileAsString( File file, String encoding) throws IOException { InputStreamReader f= encoding==null? new FileReader(file): new InputStreamReader( new FileInputStream(file),encoding); StringBuffer sb= new StringBuffer(); try { char[] buf= new char[32768]; int len; while ((len=f.read(buf,0,buf.length))>=0) { sb.append(buf,0,len); } return sb.toString(); } finally { try {f.close();} catch (Exception e) {}; } } public static String loadFileAsString( String fileName, String encoding) throws IOException { return loadFileAsString( new File(fileName),encoding); } public static char[] loadFileAsChars( String fileName, String encoding) throws IOException { return loadFileAsChars( new File(fileName),encoding); } public static char[] loadFileAsChars( File file, String encoding) throws IOException { String buf= loadFileAsString(file,encoding); char[] result= new char[buf.length()]; buf.getChars(0,result.length,result,0); return result; } public static void loadFileAsChars( File file, String encoding, char[] buf) throws IOException { loadFileAsChars( file,encoding,buf,0,buf.length); } public static void loadFileAsChars( File file, String encoding, char[] buf, int off, int len) throws IOException { InputStreamReader f= encoding==null? new FileReader(file): new InputStreamReader( new FileInputStream(file),encoding); try { f.read(buf,off,len); } finally { try {f.close();} catch (Exception e) {}; } } public static void saveFileFromString( String fileName, String encoding, String v) throws IOException { saveFileFromString( new File(fileName),encoding,v); } public static void saveFileFromString( File file, String encoding, String v) throws IOException { if (v==null) { file.delete(); return; } char[] buf= new char[v.length()]; v.getChars(0,buf.length,buf,0); saveFileFromChars(file,encoding,buf); } public static void saveFileFromChars( String fileName, String encoding, char[] buf) throws IOException { saveFileFromChars( new File(fileName),encoding,buf); } public static void saveFileFromChars( File file, String encoding, char[] buf) throws IOException { if (buf==null) { file.delete(); return; } saveFileFromChars( file,encoding,buf,0,buf.length); } public static void saveFileFromChars( File file, String encoding, char[] buf, int off, int len) throws IOException { if (buf==null) { file.delete(); return; } OutputStreamWriter f= encoding==null? new FileWriter(file): new OutputStreamWriter( new FileOutputStream(file),encoding); try { f.write(buf,off,len); } catch (IOException e) { try {f.close();} catch (Exception e1) {}; return; } f.close(); } "\\имя_компьютера\псевдоним_подкаталога\обычный_маршрут..." public File(String pathname) public File(File parent, String child) public File(String parent, String child) (new File("\\tm/../tm/1.txt")).getCanonicalPath() (new File("e://tm/1.txt")).getCanonicalPath() E:\tm\1.txt E:\TM\1.txt public File getParentFile() public String getParent() public String getName() public File[] listFiles() public File[] listFiles(FileFilter filter) public String[] list() public String[] list(FilenameFilter filter) public static File[] listRoots() public File(File parent, String child) public File(String parent, String child) public boolean exists() public boolean isDirectory() public boolean isFile() public boolean isHidden() public long lastModified() public long length() public boolean canRead() public boolean canWrite() public boolean delete() public void deleteOnExit() public boolean createNewFile() public boolean mkdir() public boolean mkdirs() public boolean renameTo(File dest) public boolean setLastModified(long time) public boolean setReadOnly() FileSystemView fsv=FileSystemView.getFileSystemView(); public File getParentDirectory(File dir) public File getChild(File parent, String fileName) public File createFileObject(File dir, String filename) public File createFileObject(String path) public File[] getFiles(File dir, boolean useFileHiding) public File[] getRoots() public File getDefaultDirectory() public File getHomeDirectory() public boolean isFileSystem(File f) public boolean isRoot(File f) public boolean isFileSystemRoot(File dir) public boolean isDrive(File dir) public boolean isFloppyDrive(File dir) public boolean isComputerNode(File dir) fsv.isFileSystem(f) && !fsv.isRoot(f) && !fsv.isFileSystemRoot(f); public boolean isHiddenFile(File f) public Boolean isTraversable(File f) public String getSystemDisplayName(File f) public String getSystemTypeDescription(File f) public javax.swing.Icon getSystemIcon(File f) public boolean isParent(File folder, File file) file.getParent().equals(folder.getPath()) f= new File(f.getPath()); fsv.isFileSystem(f) public abstract boolean isLink(); public abstract ShellFolder getLinkLocation() throws FileNotFoundException public static boolean isLink(File f) { try { return sun.awt.shell.ShellFolder .getShellFolder(f).isLink(); } catch (FileNotFoundException e) { return false; } } public static File getLinkLocation(File f) throws FileNotFoundException { File result= sun.awt.shell.ShellFolder .getShellFolder(f).getLinkLocation(); if (result==null || result.getPath().trim().length()==0) throw new FileNotFoundException( "Incorrect link - it is empty"); return result; } public boolean isTraversable(File f) { if (super.isTraversable(f)) return true; if (f!=null && isLink(f)) { try { return super.isTraversable( getLinkLocation(f)); } catch (FileNotFoundException e) { } } return false; } public void setCurrentDirectory(File f) { if (f!=null && isLink(f)) { try { super.setCurrentDirectory( getLinkLocation(f)); } catch (FileNotFoundException e) { } } super.setCurrentDirectory(f); } public File getCurrentDirectory() { File dir= super.getCurrentDirectory(); if (dir!=null && isLink(dir)) { try { return getLinkLocation(dir); } catch (FileNotFoundException e) { } } return dir; } bugtraq стр. 94 mysql -S `perl -e 'print "A" x 350'` -hlocalhost