Листинг №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