Запуск Windows-приложений под Linux c помощью CrossOver Office
Часть 2
Андрей Бешков
[AINF0008\\0.map] 1069188705
"008cc782b199a527"=",33,HKCR,Interface\\{56a868b5-0ad4-11ce-b03a-0020af0ba770}\\Distributor,,"i
"140e1cba790e4932"=",33,HKLM,Software\\Microsoft\\Multimedia\\DirectXMedia,.Prog,"
# Имя виртуального диска. В данном случае это диск A:
[Drive A]
# Путь к директории, которая хранит в себе файлы. По умолчанию
# скрипт инсталляции вписывает сюда директорию /mnt/floppy/,
# но для меня это не подходит в связи с тем, что в моей
# системе работает демон autofs, который монтирует устройство
# дисковода /dev/floppy в директорию /mnt/floppy/auto/.
# Поэтому пришлось поправить путь вручную.
"Path" = "/mnt/floppy/auto"
# Тип устройства. Думаю, всем понятно, что для Windows оно
# будет выглядеть как гибкий диск. Эта переменная может
# принимать значения hd, cdrom, network, floppy соответственно
# обозначающие жесткий диск, CD-ROM, сетевая папка,
# гибкий диск.
"Type" = "floppy"
# Метка тома. Обычно нужна только для программ, которые
# пытаются защищаться от копирования с помощью чтения этой
# метки.
"Label" = "Floppy A"
# Имя физического устройства обычно используется для
# низкоуровневого чтения и записи. Эту опцию можно применять
# только к гибким дискам и CD-ROM.
# Если попытаться применить такую опцию к любому другому
# устройству, то результаты будут очень неприятные.
# Низкоуровневая запись скорее всего повредит родную UNIX
# файловую систему.
"Device" = "auto"
# Описание диска С:
[Drive C]
"Path" = "fake_windows"
# Судя по типу устройства, Windows будет считать, что это
# жесткий диск.
"Type" = "hd"
"Label" = "fake_windows"
# Тип файловой системы, поведению которой Wine будет
# подражать. Может принимать значения: win95, msdos, unix.
# Соответственно в случае опции win95 эмулируемая система будет
# думать, что это FAT32 с поддержкой длинных имен. Регистр
# символов в именах файлов не различается. Если использовать
# тип msdos, то на имена файлов накладывается ограничение,
# соответствующее файловой системе MS-DOS. Опция unix
# отображает файловую систему точно так же, как она выглядит
# для UNIX. Эта опция практически не применятся, так как
# Windows не умеет работать с такими файловыми системами.
"Filesystem" = "win95"
# Опция, отвечающая за перекодирование имен файлов
# и директорий в родную кодировку.
"Codepage" = "0"
# Описание диска M:
[Drive M]
# Это первый CD-ROM в системе. Как обычно, из-за демона
# autofs пришлось поменять путь с /mnt/cdrom на /mnt/cdrom/auto
"Path" = "/mnt/cdrom/auto"
"Type" = "cdrom"
"Label" = "CD-ROM M"
"Filesystem" = "win95"
"Device" = "auto"
# Описание диска N:
[Drive N]
# Второй CD-ROM. Все установки сделаны аналогично диску M.
"Path" = "/mnt/cdrom1/auto"
"Type" = "cdrom"
"Label" = "CD-ROM N"
"Filesystem" = "win95"
"Device" = "auto"
# Описание диска Y:
[Drive Y]
# Здесь в качестве диска Y монтируется домашняя директория
# пользователя.
"Path" = "%HOME%"
# А вот такой тип устройств в стандартном Wine не встречается,
# он характерен только для CrossOver Office. Впрочем, для Windows
# это устройство все равно выглядит, как обычный жесткий диск.
"Type" = "%CXOFFICE_DRIVE_TYPE_HACK%"
"Label" = "Home"
"Filesystem" = "win95"
"Codepage" = "0"
# Описание диска Z:
[Drive Z]
# А тут монтируется корень всей файловой системы.
"Path" = "/"
"Type" = "%CXOFFICE_DRIVE_TYPE_HACK%"
"Label" = "Root"
"Filesystem" = "win95"
"Codepage" = "0"
[wine]
# Имена системных директорий
"Windows" = "c:\\Windows"
"System" = "c:\\Windows\\system"
"Temp" = "c:\\Windows\\Temp"
# Системная переменная PATH указывает, где и в каком порядке
# загружаемые программы должны искать необходимые для работы
# библиотеки и утилиты.
"Path" = "c:\\Windows;c:\\Windows\\system;y:\\"
# Данная опция указывает, где должны храниться пользовательские
# профили, но в связи с тем, что у нас всего один пользователь,
# она никогда не используется и поэтому закомментирована.
;;"Profile" = "c:\\Windows\\Profiles\\Administrator"
# Какую графическую подсистему нужно использовать для рисования
# экранных объектов.
"GraphicsDriver" = "x11drv"
# Должны ли Windows-программы видеть файлы, у которых первым
# символом имени является точка. Обычно такие файлы считаются
# скрытыми.
;;"ShowDotFiles" = "1"
# Можно ли показывать символические ссылки на директории?
# Обычно это приводит к зависанию Windows-программ,
# пытающихся делать рекурсивный обход директорий. Чаще всего
# в эту ловушку попадаются разнообразные автоматические
# инсталляторы.
;;"ShowDirSymlinks" = "1"
# Указание на скрипт, отвечающий за создание и установку
# правильных иконок для Windows-программ внутри вашего оконного
# менеджера. В качестве менеджеров, к примеру, могут выступать
# GNOME, KDE или CDE.
"ShellLinker" = "wineshelllink"
# Программа, отвечающая за создание и обслуживание меню
# программ оконного менеджера
"LinkProcessor" = "winemenubuilder.exe"
# Тут находятся иконки. Кстати, стоит отметить, что
# для удобства обращения они автоматически конвертируются
# из формата ico в xpm.
"IconsDir" = "c:\\Windows\\Icons"
# Ну а здесь лежит библиотека, отвечающая за работу
# с FreeType-шрифтами.
"FreeTypeLib" = "libcxfreetype.so"
[Restart]
# Программа по идее должна отвечать за перезагрузку Windows.
# Интересно, что такого файла на диске не существует.
# А его функции выполняет скрипт /opt/cxoffice/bin/cxreboot.
# Видимо, кто-то из разработчиков допустил тут ошибку.
"Boot" = "c:\\Windows\\System\\reboot.exe"
# [wineconf]
[Version]
# Какую версию Windows должен имитрировать эмулятор?
# Опция может принимать значения: win95, win98, winme, nt351,
# nt40, win2k, winxp, win2k3, win20, win30, win31. Некоторые
# программы будут работать только под определенной версией.
"Windows" = "win98"
# Версия MS-DOS. Нужна для некоторых старых программ.
;;"DOS" = "6.22"
[DllOverrides]
"ole2" = "native, builtin"
"ole2nls" = "native, builtin"
"*comctl32" = "builtin"
"*ICWCONN1.EXE" = "builtin"
"*IEINFO5.OCX" = "builtin"
[x11drv]
# Количество цветов, выделяемых из системной палитры для нужд
# Windows-программ. Действует только в том случае, когда
# графическая подсистема работает в режиме глубины цвета
# 8 бит на один пиксель или 256 цветов.
"AllocSystemColors" = "100"
"PrivateColorMap" = "N"
# Пытаться ли использовать более медленные операции вместо
# быстрых для улучшения качества отрисовки. Лично мне
# показалось, что в большинстве случаев разница не будет заметна.
"PerfectGraphics" = "N"
# Указывает, какую глубину цвета необходимо использовать.
# Имеет смысл только для дисплеев, умеющих работать в режиме
# multi-depth. По умолчанию отключено, так как используется
# крайне редко.
;;"ScreenDepth" = "16"
# Имя дисплея, на который нужно выводить графику.
;;"Display" = ":0.0"
# Данная опция показывает, разрешено ли оконному менеджеру
# управлять окнами Wine
"Managed" = "Y"
# В случае если предыдущая опция активирована, можно ли
# позволить менеджеру рисовать рамки окон и прочие элементы.
# Эти две опции улучшают интеграцию эмулируемого приложения
# с остальными программами, но не все задачи могут нормально
# работать в таком режиме.
; WMFrames = "Y"
# Данный режим выступает конкурентом для двух предыдущих опций
# и позволяет работать Wine так, словно это не просто окно,
# а виртуальный десктоп. Соответственно все Windows-приложения
# будут рисовать свои окна только внутри этого десктопа, так как
# им это больше всего подходит. За управление окнами внутри
# виртуального десктопа отвечает Wine. Такой режим позволяет
# избежать взаимодействия Windows-приложений с системным
# оконным менеджером, поэтому он наиболее совместим c моделью
# рисования, используемой настоящей Windows.
;;"Desktop" = "640x480"
# Нужно ли, чтобы приложения, работающие с DirectDraw, могли
# воспользоваться преимуществами работы с графической подсистемой
# в режиме DGA (XFree86 Direct Graphic Architecture). Обязательно
# убедитесь, что у вас есть доступ к устройству /dev/mem
"UseDGA" = "Y"
# Если с DGA поработать не получилось, то можно попробовать
# заставить DirectX использовать разделяемую память для обмена
# данными с видеоподсистемой. Конечно, это будет работать
# медленнее, чем DGA, но все же быстрее, чем применяемый
# стандартно обмен данными с X11 через сокет.
"UseXShm" = "Y"
# Разрешение использовать для отрисовки режим XVideo
"UseXVidMode" = "Y"
# Улучшенное управление окном, получившим фокус ввода.
"UseTakeFocus" = "Y"
# Опция для включения продвинутого способа контроля за мышью.
# Очень полезна для приложений, использующих DirectX
"DXGrab" = "N"
# Включает двойную буферизацию окна, в котором отрисовывается
# десктоп. Применяется только вместе с опцией Desktop, описанной
# выше. Очень помогает при работе с приложениями, интенсивно
# использующими OpenGL .
"DesktopDoubleBuffered" = "N"
# Номер порта для режима XVideo. Нужно использовать только в
# случае, если у нас несколько портов.
;; "XVideoPort" = "43"
# Опция, указывающая, нужно ли работать в синхронном режиме.
# Обычно используется для отладки проблем с X11.
;;"Synchronous" = "Y"
[serialports]
"Com1" = "/dev/ttyS0"
"Com2" = "/dev/ttyS1"
"Com3" = "/dev/ttyS2"
"Com4" = "/dev/modem"
[parallelports]
"Lpt1" = "/dev/lp0"
[spooler]
"FILE:" = "tmp.ps"
"LPT1:" = "|lpr"
"LPT2:" = "|gs -sDEVICE=bj200 -sOutputFile=/tmp/fred -q -"
"LPT3:" = "/dev/lp3
[Tweak.Layout]
"WineLook" = "Win95"
$ iconv -f cp-1251 -t utf-8 $HOME/.menu/cxoffice > $HOME/.menu/cxoffice
$ update-menus –n –u
#cabextract IE_S1.CAB IE_S2.CAB IE_S3.CAB
А ты что видишь? Удаленное управление посредством rdesktop, RAdmin, VNC
Антон Борисов
bash-2.05b# nmap -v -sS compaq
bash-2.05b# nmap -v -sS fuji
bash-2.05b$ cat /usr/share/nmap/nmap-services | grep Remote\ Display
netstat -na | more (или netstat -na > netstat.txt)
bash-2.05b$ ./configure --prefix=/usr/local/rdesktop
bash-2.05b$ make
bash-2.05b# make install
rdesktop rubin
rdesktop –4 rubin
--prefix=/usr/local/wine
[AppDefaults\\radmin.exe\\x11drv]
"Desktop" = "700x500"
"Managed" = "N"
/usr/local/wine/bin/wine ~/RAdmin/radmin.exe
/usr/local/wine/bin/wine ~/RAdmin/r_server.exe
#!/bin/sh
# Start the Virtual Networking Communication (VNC) server
BINDIR=/usr/local/vnc
DAEMON=vncserver
case "$1" in
'start')
su - anthony -c "export PATH=$PATH:/usr/X11R6/bin:/usr/local/bin; $BINDIR/$DAEMON :10 -geometry 800x600"
;;
'stop')
$BINDIR/$DAEMON -kill :10
;;
'restart')
$0 stop; $0 start
;;
*)
echo "usage $0 start|stop|restart" ;;
esac
echo "***** Starting RealVNC server *****"
/etc/rc.d/rc.vnc start
bash-2.05b# nmap -v -sS fuji -p 1-10000
vncviewer fuji:10 -passwd ~/.vnc/passwd -geometry 600x400
modprobe rshaper.o
rshaperctl HOST SPEED TIME
iptables -N MyRDP_IN
iptables -I INPUT -j MyRDP_IN -s HOST
iptables -I MyRDP_IN -j INPUT
iptables -N MyRDP_OUT
iptables -I OUTPUT -j MyRDP_OUT -d HOST
iptables -I MyRDP_OUT -j OUTPUT
iptables -L MyRDP_IN -v
MyRDPTest.sh
#!/bin/sh
IPTL=/usr/sbin/iptables
SHAPER=/usr/local/sbin/rshaperctl
MODE=9600
HOST=rubin
TIME=10
if [ "$1" = "zero" ]; then
echo "Zeroing IN & OUT counters for $HOST";
$IPTL -L MyRDP -Z 2>/dev/null 1>/dev/null
$IPTL -L MyRDPOut -Z 2>/dev/null 1>/dev/null
fi
echo "Setting Shaping MODE as $MODE bytes to host $HOST"
$SHAPER $HOST $MODE $TIME
$SHAPER
echo "Incoming traffic from host"
IN=`$IPTL -L MyRDP -v -n | grep ACCEPT`
INpkts=`echo $IN | awk '{ print $1 }'`
INbytes=`echo $IN | awk '{ print $2 }'`
echo "pkts = $INpkts, bytes = $INbytes";
echo "Outcoming traffic to host"
OUT=`$IPTL -L MyRDPOut -v -n | grep ACCEPT`
OUTpkts=`echo $OUT | awk '{ print $1 }'`
OUTbytes=`echo $OUT | awk '{ print $2 }'`
echo "pkts = $OUTpkts, bytes = $OUTbytes";
RDP протокол
Incoming traffic from host
pkts = 2604, bytes = 1039K
Outcoming traffic to host
pkts = 3563, bytes = 474K
VNC протокол
Incoming traffic from host
pkts = 6277, bytes = 804K
Outcoming traffic to host
pkts = 5413, bytes = 321K
RADMIN протокол
Incoming traffic from host
pkts = 2739, bytes = 472K
Outcoming traffic to host
pkts = 3610, bytes = 267K
С Юниксом на vi
Сергей Супрунов
# ipfw show > buffer
# cat article buffer > temp
# mv temp article
# ipfw show > buffer
# mcedit article
!lipfw show
# vi [filename]
# {vi –e | ex} [filename]
# {vi –R | view} [filename]
# vi test.txt
$ exit
You have stopped jobs.
$ jobs
[1] 34336 Suspended vi test
$ fg 34336
# vi –e
# ex
set showmode
set verbose
Свободный антивирус
Сергей Яремчук
#tar xzvf clamav-0.65.tar.gz
# cd clamav-0.65
#./configure
...
/dev/(u)random detected.
Checking /etc/passwd...
ERROR: User "clamav" (and/or group "clamav") doesn't exist. Please create it. You can omit this check with the --disable-clamav option.
# groupadd clamav
# useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav
# make
# su -c "make install"
# /usr/local/bin/clamscan -r -i /home/sergej/work/clamav-0.65/
#clamscan -r --mbox /var/spool/mail
#cat testfile | clamscan -
# clamscan –unzip /mnt/test/test.zip
#clamscan -d /tmp/newclamdb –tgz –deb –unrar --max-space=50m -r /home
# /usr/local/sbin/clamd
#Example
# Путь к лог-файлу
LogFile /var/log/clamav/clamd.log
# Блокировка записи в лог-файл (необходима при запуске
# нескольких демонов одновременно)в том числе и во избежание
# работы с одинаковой конфигурацией
#LogFileUnlock
# максимальный размер лог-файла (0 – без ограничений)
LogFileMaxSize 0
# Использование syslog
LogSyslog
# Подробный отчет
#LogVerbose
# Файл для сохранения идентификатора процесса
PidFile /var/run/clamav/clamd.pid
# Путь к антивирусным базам (по умолчанию /usr/local/share/clamav)
DataDirectory /var/lib/clamav
# Демон может работать в сетевом или локальном режиме,
# в целях безопасности рекомендуется пока последний, но вот
# посылать сигналы мне показалось более удобным именно
# в сетевом. Несколько следующих строк необходимы для
# настройки сетевого режима.
#LocalSocket /var/run/clamav/clamd.sock
#FixStaleSocket
#TCPSocket 3310
#TCPAddr 127.0.0.1
#MaxConnectionQueueLength 30
# Предварительная запись потока
StreamSaveToDisk
# Предел для потока, после которого соединение закрывается
#StreamMaxLength 10M
# Максимальное количество одновременно выполняемых задач
MaxThreads 10
# Максимальная рекурсия каталога
MaxDirectoryRecursion 15
# Следование символическим ссылкам для каталогов и файлов
#FollowDirectorySymlinks
#FollowFileSymlinks
# Проверка целостности баз (по умолчанию 1 час)
#SelfCheck 600
# Команда, которая должна выполниться при обнаружении вируса.
# При этом используются подстановки %f – имя инфицированного
# файла, %v – название вируса. Должен использоваться полный
# путь к команде
#VirusEvent /usr/local/bin/send_sms 123456789 "VIRUS ALERT: %f: %v"
# Имя пользователя, от которого запускается демон, он должен
# иметь права на изменение всех перечисленных файлов и каталогов.
User clamav
# Работа с почтой и архивами, для RAR нужна отдельная строка
ScanMail
ScanArchive
ScanRAR
# Установка максимальных значений для архивов для защиты
# от mail-бомб (0 – без ограничений).
ArchiveMaxFileSize 10M
ArchiveMaxRecursion 5
ArchiveMaxFiles 1000
ArchiveLimitMemoryUsage
# telnet localhost 3310
#clamdscan /home
#ln -s /etc/init.d/clamd.sh /etc/rc.d/rc5.d/S50clamd
INPUT_MAIL_FILTER(`clmilter',`S=local:/var/run/clmilter.sock,
F=, T=S:4m;R:4m')dnl
define(`confINPUT_MAIL_FILTERS', `clmilter')
А в clamav.conf проверяем наличие таких строк.
LocalSocket /var/run/clamd.sock
ScanMail
StreamSaveToDisk
#/usr/local/sbin/clamav-milter -blo /var/run/clmilter.sock
# touch /var/log/clam-update.log
# chmod 600 /var/log/clam-update.log
# chown clamav /var/log/clam-update.log
# freshclam -d -c 3 -l /var/log/clam-update.log
#export http_proxy="proxy.server:8080"
0 00 * * 07 /usr/local/bin/freshclam --quiet -l /var/log/clam-update.log
#drweb /mnt/dos.ext.1/virus_test/
# sigtool -c "clamscan --stdout" -f /home/sergej/virus_test/test.exe -s
# sigtool -c "drweb" -f -f /home/sergej/virus_test/test.exe -s "Win32.HLLP.Underscore.36864"
# strings test.exe | less
#cat test.exe | sigtool --hex-dump > virus.sig
# sigtool -c "drweb" -f -f /home/sergej/work/xaf -s "Win32.HLLP.Underscore.36864"
Win32.HLLP.Underscore.36864 (Clam)=
#sigtool --unpack-current daily.cvd
#cat xaf.sig >> viruses.db2
#md5sum viruses.db2 > viruses.md5
Три поросёнка Snort: «Ниф-Ниф», «Нуф-Нуф» и «Наф-Наф».
Настройка нескольких сенсоров Snort с помощью SnortCenter
Павел Закляков
# wget http://www.snort.org/dl/snort-2.1.1.tar.gz
# wget http://www.snort.org/dl/snort-2.1.1.tar.gz.md5
# cat snort-2.1.1.tar.gz.md5
# md5sum snort-2.1.1-RC1.tar.gz
# tar -zxvf snort-2.1.1.tar.gz -C /progi
# cd /progi/snort-2.1.1
# ./configure --with-mysql
# find / -name pcre.h
/usr/include/pcre/pcre.h
/progi/snort/snort-2.1.1/src/win32/WIN32-Includes/pcre.h
# rpm -qf /usr/include/pcre/pcre.h
# rpm -ihv pcre-devel-3.9-2.i386.rpm
# makev
# make install
# wget http://symlabs.com/Net_SSLeay/Net_SSLeay.pm-1.21.tar.gz
# tar -zxvf Net_SSLeay.pm-1.21.tar.gz -C /progi
# cd /progi/Net_SSLeay.pm-1.21
# perl Makefile.PL
# ./Makefile.PL
# rpm -ihv openssl-devel-0.9.6b-35.7.i386.rpm
# make
# make install
# perl -e 'use Net::SSLeay'
# wget http://users.pandora.be/larc/download/snortcenter-agent-v1.0-RC1.tar.gz
# tar -zxvf snortcenter-agent-v1.0-RC1.tar.gz -C /progi
# cd /progi/sensor
# ./setup.sh
# ./setup.sh
# /etc/rc.d/init.d/sensor status
# iptables -I INPUT -p tcp -s $REMOTE_IP --sport 1024:65535 -d $SENSOR_IP --dport 2525 -j ACCEPT
# iptables -I OUTPUT -p tcp -s $SENSOR_IP --sport 2525 -d $REMOTE_IP --dport 1024:65535 -j ACCEPT
# wget http://users.pandora.be/larc/download/snortcenter-v1.0-RC1.tar.gz
# tar -zxvf snortcenter-v1.0-RC1.tar.gz -C /var/www/html
# mv /var/www/html/www /var/www/html/snortcenter
# mcedit /var/www/html/snortcenter/config.php
# vi /var/www/html/snortcenter/config.php
# mysql -u root -p
mysql> CREATE DATABASE snortcenter;
mysql> grant CREATE,INSERT,SELECT,DELETE,UPDATE on snortcenter.* to snortcenteruser@localhost;
mysql> grant CREATE,INSERT,SELECT,DELETE,UPDATE on snortcenter.* to snortcenteruser;
mysql> set password for 'snortcenteruser'@'localhost'=password('ваш_пароль№6');
mysql> set password for 'snortcenteruser'@'%'=password('ваш_пароль№6');
mysql> exit
//echo "$sql
";
$result = $db->acidExecute($sql);
$result_a = $db->acidExecute("SELECT max(id) FROM preprocessor");
$myrow = $result_a->acidFetchRow();
$update_rule_count[1] = 'add-spp';
$update_rule_count[2] = $myrow[0];
#!/usr/bin/perl
while ($temp=){
if ($temp=~/^[^#].*\\\n$/) { chomp $temp;
chop $temp; }
print $temp;
}
# chmod +x convert_rules.pl
$fp=popen($curl_path."curl -s $proxyline $snortrules_url | gunzip -dcf - | tar -xOf - rules/*.rules rules/*.conf rules/*.config", "r");
$fp=popen($curl_path."curl -s $proxyline $snortrules_url 2>/dev/null | tar xzOf - rules/*.rules rules/*.conf rules/*.config", "r");
$fp=popen($curl_path."curl -s $proxyline $snortrules_url | gunzip -dcf - | tar -xOf - rules/*.rules rules/*.conf rules/*.config | /var/www/html/snortcenter/convert_rules.pl", "r");
$fp=popen($curl_path."curl -s $proxyline $snortrules_url 2>/dev/null | tar xzOf - rules/*.rules rules/*.conf rules/*.config | /var/www/html/snortcenter/convert_rules.pl", "r");
elseif ($what == "byte_test") {
if ($rule['byte_test']) $rule['byte_test'][$content_nr] .= "; byte_test: $val";
else $rule['byte_test'][$content_nr] = $val;
elseif ($what == "byte_test") {
$rule['byte_test'][$content_nr] = $val;
# wget http://users.pandora.be/larc/download/acid-0.9.6b23-plugin-v1.tar.gz
# tar -zxvf acid-0.9.6b23-plugin-v1.tar.gz -C /progi
# mv /var/www/html/acid/acid_main.php /var/www/html/acid/acid_main.php.bak
# mv /var/www/html/acid/acid_output_html.inc /var/www/html/acid/acid_output_html.inc.bak
# mv /var/www/html/acid/acid_style.css /var/www/html/acid/acid_style.css.bak
# cp -R /progi/acid-0.9.6b23_plugin/* /var/www/html/acid
# cp -Rv /progi/acid-0.9.6b23_plugin/* /var/www/html/acid
#!/bin/bash
#
# snortd Start/Stop the snort IDS daemon.
#
# chkconfig: 2345 79 11
# description: snort is a lightweight network intrusion
# detection tool that currently detects more than 1100 host
# and network vulnerabilities, portscans, backdoors, and more.
#
# June 10, 2000 -- Dave Wreski
# - initial version
#
# July 08, 2000 Dave Wreski
# - added snort user/group
# - support for 1.6.2
# Source function library.
. /etc/rc.d/init.d/functions
# Specify your network interface here
INTERFACE=eth0
# See how we were called.
case "$1" in
start)
echo -n "Starting snort: "
# ifconfig eth0 up
daemon /usr/local/bin/snort -o -i $INTERFACE -d -D -c /etc/snort/snort.$INTERFACE.conf
touch /var/lock/subsys/snort
sleep 3
if [ -f /var/log/snort/alert ]
then
rm /var/log/snort/alert
fi
echo
;;
stop)
echo -n "Stopping snort: "
killproc snort
rm -f /var/lock/subsys/snort
echo
;;
restart)
$0 stop
$0 start
;;
status)
status snort
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit 0
# chkconfig snortd on
(# chkconfig snortd2 on)
# chkconfig snortd on
Ошибки переполнения буфера извне и изнутри как обобщенный опыт реальных атак
Крис Касперски
Листинг 1. Пример последовательного переполнения буфера при записи
seq_write(char *p)
{
char buff[8];
…
strcpy(buff, p);
}
Листинг 2. Пример индексного переполнения буфера при чтении
idx_write(int i)
{
char buff[]="0123456789";
…
return buff[i];
}
char *p = malloc(MAX_BUF_SIZE);
Листинг 3. Фрагмент программы, подверженной переполнению с затиранием указателя на исполняемый код
code_ptr()
{
char buff[8]; void (*some_func) ();
…
printf("passws:"); gets(buff);
…
some_func();
}
Листинг 4. Фрагмент программы, подверженной последовательному переполнению при записи, с затиранием указателя на таблицу виртуальных функций
class A{
public:
virtual void f() { printf("legal\n");};
};
main()
{
char buff[8]; A *a = new A;
printf("passwd:");gets(buff); a->f();
}
Листинг 5. Дизассемблерный листинг переполняющийся программы с краткими комментариями
; CODE XREF: start+AFvp
.text:00401000 main proc near
.text:00401000
.text:00401000 var_14 = dword ptr -14h ; this
.text:00401000 var_10 = dword ptr -10h ; *a
.text:00401000 var_C = byte ptr -0Ch
.text:00401000 var_4 = dword ptr -4
.text:00401000
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 sub esp, 14h
; открываем кадр стека и резервируем 14h стековой памяти
.text:00401003
.text:00401003 ;
.text:00401006 push 4
.text:00401008 call operator new(uint)
.text:0040100D add esp, 4
; выделяем память для нового экземпляра объекта A и получаем
; указатель
.text:0040100D
.text:0040100D ;
.text:00401010 mov [ebp+var_10], eax
; записываем указатель на объект в переменную var_10
.text:00401010
.text:00401010 ;
.text:00401013 cmp [ebp+var_10], 0
.text:00401017 jz short loc_401026
.text:00401017 ; проверка успешности выделения памяти
.text:00401017 ;
.text:00401019 mov ecx, [ebp+var_10]
.text:0040101C call A::A
.text:0040101C ; вызываем конструктор объекта A
.text:0040101C ;
.text:00401021 mov [ebp+var_14], eax
; заносим возвращенный указатель this в переменную var_14
.text:00401021
.text:00401021 ;
…
.text:0040102D loc_40102D: ; CODE XREF: main+24^j
.text:0040102D mov eax, [ebp+var_14]
.text:00401030 mov [ebp+var_4], eax
; берем указатель this и перепрятываем его в переменную var_4
.text:00401030
.text:00401030 ;
; "passwd:"
.text:00401033 push offset aPasswd
.text:00401038 call _printf
.text:0040103D add esp, 4
.text:0040103D ; выводим приглашение к вводу на экран
.text:0040103D ;
.text:00401040 lea ecx, [ebp+var_C]
; переполняющийся буфер расположен ниже указателя на объект
; и первичного указателя this, но выше порожденного указателя
; this, что делает последний уязвимым
.text:00401040
.text:00401040
.text:00401040
.text:00401040 ;
.text:00401043 push ecx
.text:00401044 call _gets
.text:00401049 add esp, 4
.text:00401049 ; чтение строки в буфер
.text:00401049 ;
.text:0040104C mov edx, [ebp+var_4]
; загружаем уязвимый указатель this в регистр EDX
.text:0040104C
.text:0040104C ;
.text:0040104F mov eax, [edx]
.text:0040104F ; извлекаем адрес виртуальной таблицы
.text:0040104F ;
.text:00401051 mov ecx, [ebp+var_4]
.text:00401051 ; передаем функции указатель this
.text:00401051 ;
.text:00401054 call dword ptr [eax]
; вызываем виртуальную функцию – первую функцию виртуальной
; таблицы
.text:00401054
.text:00401054 ;
.text:00401056 mov esp, ebp
.text:00401058 pop ebp
.text:00401059 retn
.text:00401059 main endp
Листинг 6. Фрагмент программы, подверженной последовательному переполнению при записи и затиранием скалярной переменной и указателя на данные, поглощающими затертую переменную
data_ptr()
{
char buff[8]; int x; int *p;
printf("passws:"); gets(buff);
…
*p = x;
}
Листинг 7. Фрагмент программы, подверженной последовательному переполнению при записи, с затиранием индекса
index_ptr()
{
char *p; char buff[MAX_BUF_SIZE]; int i;
p = malloc(MAX_BUF_SIZE); i = MAX_BUF_SIZE;
…
printf("passws:"); gets(buff);
…
// if ((i < 1) || (i > MAX_BUF_SIZE)) ошибка
while(i--) p[i] = buff[MAX_BUF_SIZE – i];
}
Листинг 8. Фрагмент программы, подверженный переполнению с затиранием скалярной переменной
var_demo(float *money_account)
{
char buff[MAX_BUF_SIZE]; float buks = CURRENT_BUKS_RATE;
printf("input money:"); gets(buff);
if (atof(buff)<0) ошибка! введите положительное значение
…
*money_account -= (atof(buff) * CURRENT_BUKS_RATE);
}
Листинг 9. Фрагмент программы, подверженной последовательному переполнению при записи с затиранием постороннего буфера
buff_demo()
{
char buff[MAX_BUF_SIZE];
char pswd[MAX_BUF_SIZE];
…
fgets(pswd, MAX_BUF_SIZE, f);
…
printf("passwd:"); gets(buff);
if (strncmp(buff, pwsd, MAX_BUF_SIZE))
// неправильный пароль
else
// правильный пароль
}
Программное управление ADSI: LDAP
Иван Коробко
Set obj = GetObject ("LDAP://DC=Domain_name1/DC=Domain_name2/DC=Domain_name3/OU=OU_Name_Level1/OU=OU_Name_Level2…/OU=OU_Name_Levelµ/CN=CN_Name")
Set obj = GetObject ("LDAP://DC=RU/DC=Domain1/OU=Group1/OU=Group4/CN=User3")
Set obj=GetObject("LDAP://CN=CN_Name,OU=OU_Name_Levelµ…,OU=OU_Name_Level2,OU=OU_Name_Level1/DC=…")
Set obj=GetObject("LDAP://CN=User3,OU=Group4,OU=Group3,DC=Domain1,dc=RU")
///
LDAP://server/DC=domain,DC=ru;
SELECT поле11,поле21,полеn1 FROM путь WHERE objectClass="тип_объекта"
Пример 1:
Set objNameSpace = GetObject("WinNT:")
For Each Domain in objNameSpace
DomainName=Domain.Name
Next
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = "SELECT printerName, serverName FROM " _ & " 'LDAP://"& DomainName & "' WHERE objectClass='printQueue'"
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
temp=temp & "Printer Name: " & objRecordSet.Fields("printerName").Value & " Server Name: " & objRecordSet.Fields("serverName").Value & chr(13)
objRecordSet.MoveNext
Loop
wscript.echo temp
Пример 2:
Set obj=GetObject("LDAP://CN=User3, OU=Group1,OU=Users, o=domain.ru")
For Each U_obj In obj
wscript.echo "UserUID: " & U_obj.Get("uid")
Next
Пример 3:
Set PreObj= GetObject("LDAP:")
Set obj= PreObj.OpenDSObject("LDAP://CN=User3, OU=Group1,OU=Users, o=domain.ru", "CN=User1","1234567",0)
For Each U_obj In obj
wscript.echo "UserUID: " & U_obj.Get("uid")
Next
Пример 4:
Set PreObj= GetObject("LDAP:")
Set obj= PreObj.OpenDSObject("LDAP://CN=User3, OU=Group1,OU=Users, o=domain.ru", "CN=User1","1234567",0)
Set U_obj=obj.GetObject("InetOrgPerson","CN=User3")
U_obj.Put "CN","User4"
U_obj.SetInfo
MsgBox "Параметр CN изменен."
Пример 5:
Set PreObj= GetObject("LDAP:")
Set obj= PreObj.OpenDSObject("LDAP:// OU=Group1, OU=Users,o=domain.ru", "CN=User1","1234567",0)
Set U_obj=obj.Create("InetOrgPerson","CN=User3")
ClassArray=Array("InetOrgPerson","person","top","organizationPerson")
U_obj.Put "objectClass", ClassArray
U_obj.Put "cn", "User_Name_3"
U_obj.Put "sn", "Second_Name_3"
U_obj.SetInfo
MsgBox "Учетная запись создана."
Пример 6 a) - WinNT:
Set obj=GetObject("WinNT:")
For Each str In obj
DomainName=str.Name
Next
Set UserName="Value"
Set element=GetObject("WinNT://" & DomainName & "/ USER1")
Msgbox "FullName: "+ cstr(element.FullName)
Пример 6 б) - LDAP:
set rootDSE_ = GetObject("LDAP://RootDSE")
DomainName = rootDSE_.Get("defaultNamingContext")
UserLogonName="USER1"
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.CommandText = "SELECT name, sAMAccoutName FROM " _ & " 'LDAP://"& DomainName & "' WHERE objectClass='users'"
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.Properties("Cache Results") = False
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
If objRecordSet.Fields("sAMAccoutName").Value=UserLogonName
msgbox "FullName: "+ objRecordSet.Fields("name").Value
end if
Loop