пятница, 29 июня 2012 г.

Netcat

Отображение тестовой HTML-странички клиенту с обычным браузером одной командой (порт 8080):
(echo -e "HTTP/1.1 200 OK\nContent-Type: text/html\n\n Hello World";) | nc -vv -l -p 8080
Передача файла клиенту с обычным браузером одной командой (порт 8080):
(echo -e "HTTP/1.1 200\nContent-Disposition: attachment; filename=целевое-имя-которое-увидит-клиент\nContent-Type: application/octet-stream\nConnection: close\n"; cat имя-файла-на-диске ) | nc -vv -l -p 8080


Как пользоваться nc? 

(http://handynotes.ru/2010/01/unix-utility-netcat.html)

Начнем с нескольких простых примеров и далее будем их использовать как базовые.
Если Вы помните, я говорил, что netcat это Швейцарский армейский нож. Чем-бы этот нож был, если бы его нельзя было использовать как обычный нож? Вот почему netcat может использоваться вместо обычного telnet:
$ nc www.google.com 80
В действительности он более удобный чем обычный telnet, потому что Вы можете завершить соединение в любое время, нажав Ctrl+C и он обрабатывает двоичные данные как обычные (никаких escape последовательностей, ничего).
Вы можете добавить параметр “-v” для более подробного вывода результатов действий, и параметр (-vv) для получения статистики о том, сколько байт было передано во время текущего сеанса соединения.
Netcat может быть использован в качестве сервера. Если Вы запустите его, как указано ниже, он будет слушать на порту 12345 (на всех интерфейсах):
$ nc -l -p 12345
Теперь если Вы подключитесь к порту 12345 этого хоста, все, что Вы набираете будет передано удаленной стороне, что говорит нам о том, что netcat можно использовать как чат сервер. Запустите на одном из компьютеров:
# На компьютере A с IP 10.10.10.10
$ nc -l -p 12345
И подключитесь к нему с другого:
# На компьютере B
$ nc 10.10.10.10 12345
Теперь обе стороны могут переговариваться!
Такой способ разговора, когда обе стороны могут разговаривать друг с другом делает возможным использование nc для операций ввода/вывода через сеть! К примеру, Вы можете послать целую директорию с одного компьютера на другой организовав tar конвейер через nc на первом компьютере, и перенаправив вывод в другой tar процесс на втором.
Предположим, Вы хотите переслать файлы из директории /data компьютера A с IP 192.168.1.10 на компьютер B (с любым IP). Это просто:
# На компьютере A с IP 192.168.1.10
$ tar -cf — /data | nc -l -p 6666 

# На компьютере B
$ nc 192.168.1.10 6666 | tar -xf -
Не забудьте скомбинировать конвейер с Рipe Viewer, который был описан в предыдущей статье, что-бы посмотреть статистику того, как быстро происходит передача!
Одиночный файл может быть послан проще:
# На компьютере A с IP 192.168.1.10
$ cat file | nc -l -p 6666 

# На компьютере B
$ nc 192.168.1.10 6666 > file
Вы даже можете скопировать и восстановить целый диск, с помощью nc:
# На компьютере A с IP 192.168.1.10
$ cat /dev/hdb | nc -l -p 6666 

# На компьютере B
$ nc 192.168.1.10 6666 > /dev/hdb
Заметим: Опция “-l” не может быть использована совместно с “-p” на Mac компьютерах! Решение, — просто заменить “-l -p 6666? на “-l 6666?. Как здесь:
# теперь nc слушает на порту 6666 для Mac компьютеров
$ nc -l 6666
Незаурядное использование netcat — сканирование портов. Netcat не лучший инструмент для такой работы, но он с этим справляется (лучший, конечно-же nmap):
$ nc -v -n -z -w 1 192.168.1.2 1-1000
(UNKNOWN) [192.168.1.2] 445 (microsoft-ds) open
(UNKNOWN) [192.168.1.2] 139 (netbios-ssn) open
(UNKNOWN) [192.168.1.2] 111 (sunrpc) open
(UNKNOWN) [192.168.1.2] 80 (www) open
(UNKNOWN) [192.168.1.2] 25 (smtp) : Connection timed out
(UNKNOWN) [192.168.1.2] 22 (ssh) open
Параметр “-n” предотвращает от просмотра DNS, “-z” не ждет ответа от сервера, и “-w 1? задает таймаут для соединения в 1 секунду.
Другое нетривиальное использование netcat в роли прокси. И порт и хост могут быть перенаправлены. Посмотрите на этот пример:
$ nc -l -p 12345 | nc www.google.com 80
Эта команда запускает nc на порту 1234 и перенаправляет все соединения на google.com:80. Если теперь Вы подключитесь к этому компьютеру на порту 12345 и сделаете запрос, Вы обнаружите, что в ответ не получаете никаких данных. Это правильно, потому-что мы не установили двунаправленный канал. Если Вы добавите второй канал, Вы получите Ваши данные на другом порту:
$ nc -l -p 12345 | nc www.google.com 80 | nc -l -p 12346
После посылки запроса на порт 12345, получите Ваши данные ответа на порту 12346.
Вероятно самая мощная возможность netcat — запустить любой процесс как сервер:
$ nc -l -p 12345 -e /bin/bash
Параметр “-e” пораждает выполнение ввода и вывода перенаправляемого через сетевой сокет. Теперь, если Вы подключитесь к хосту на порту 12345, Вы можете использовать bash:
$ nc localhost 12345
ls -las
total 4288
4 drwxr-xr-x 15 pkrumins users 4096 2009-02-17 07:47 .
4 drwxr-xr-x 4 pkrumins users 4096 2009-01-18 21:22 ..
8 -rw——- 1 pkrumins users 8192 2009-02-16 19:30 .bash_history
4 -rw-r—r— 1 pkrumins users 220 2009-01-18 21:04 .bash_logout


(http://execbit.ru/2011/05/23/netcat/)
1 Передавать файлы (первую команду выполняем на принимающей машине, вторую - на передающей:
$ nc -l 31334 > filename
$ nc 172.16.69.143 31334 < filename
2 Удаленно читать логи (первая - сервер, вторая - клиент):
$ nc -f /var/log/messages | nc -l 31334
$ nc 172.16.69.143 31334
3 Использовать вместо telnet (первая - telnet-сервер, вторая - клиент):
$ nc -l -p 31334 -e /bin/sh
$ nc 172.16.69.143 31334
4 Сканировать на открытые порты:
$ nc -z execbit.ru 1-1024
5 Осуществлять фингерпринт сервисов на основе баннеров:
$ echo "QUIT" | nc execbit.ru 1-1024
6 Организовывать обратный шелл (первая - клиент, вторая - сервер, однако шелл откроется от сервера к клиенту):
$ nc -e /bin/sh 172.16.69.143 31334
$ nc -l -p 31334
7 Делать микрофонную запись с удаленной машины (сервер, клиент):
$ arecord -f dat -t raw | nc -l 31337
$ nc 172.16.69.143 31337 | oggenc - -r -o nc.ogg
8 Получать снимки с web-камеры удаленной машины (сервер, клиент):
$ while [ 1 ]; do streamer -o /tmp/photo.jpeg; nc -l 31337 < /tmp/photo.jpeg; done
$ nc localhost 31337 > photo.jpeg
Однако, важно понимать, что существует несколько версий netcat, поведение которых может отличаться. Экземпляр, поставляемый с дистрибутивами Linux, - это оригинал, доживший до наших дней. Все пять приведенных примеров он отработает без проблем. Версия под названием GNU Netcat не поддерживает опции -e, поэтому второй и пятый примеры она не воспримет.
Особого внимания заслуживает netcat, распространяемый вместе с BSD-системами, опция -e в нем есть, но предназначена она для шифрования входящего и исходящего трафика методом IPSec ESP:
$ nc -e 'in ipsec esp/transport//require' -e 'out ipsec esp/transport//require' \
172.16.69.143 31334
Кроме того, BSD Netcat способен подключаться к удаленной машине через прокси:
$ nc -x172.16.64.1:8080 -Xconnect 172.16.69.143 31334
В этом примере прокси находится по адресу 172.16.64.1:8080, а флаг -Xconnect говорит о том, что он работает с протоколом HTTP. Также поддерживаются SOCKS версий 4 и 5, но о них следует информировать netcat через флаг -X4 или -X5.
Сам netcat легко использовать в качестве прокси или редиректора портов, но в этом случае его лучше связать с демоном inetd:
# echo 'redirect-2525-to-25 2525/tcp' >> /etc/services
# echo 'redirect-2525-to-25 stream tcp nowait nobody /usr/bin/nc nc -w 2 127.0.0.1 25' \
>> /etc/inetd.conf
# killall -HUP inetd
Теперь весь трафик, пришедший на порт 2525, будет перенаправляться на стандартный 25-й SMTP-порт. Таким же образом мы можем завернуть трафик с любого порта на другой порт/машину, просто видоизменив первые две команды.
Кстати, пользователи дистрибутивов Linux могут вообще не заморачиваться с netcat: демон xinetd, ставший стандартом в Linux-системах, сам умеет перенаправлять сетевой трафик:
$ echo /etc/xinetd/redirect

service redirect-2525-to-25
{
  disable = no
  type = UNLISTED
  socket_type = stream
  protocol = tcp
  wait = no
  port = 2525
  redirect = 127.0.0.1 25
  user = nobody
}

четверг, 28 июня 2012 г.

Минт - (пере)маппирование клавиш клавиатуры

В чем проблема? Не работает Энетер который в нумпаде...

Текущие состояние дел покажет xev

KeyPress event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19285204, (688,648), root:(691,696),
    state 0x10, keycode 36 (keysym 0xff0d, Return), same_screen YES,
"   XLookupString gives 1 bytes: (0d) "
"   XmbLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19285309, (688,648), root:(691,696),
    state 0x10, keycode 36 (keysym 0xff0d, Return), same_screen YES,
"   XLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False

KeyPress event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19305238, (688,648), root:(691,696),
    state 0x10, keycode 104 (keysym 0xff0d, KB_Enter), same_screen YES,
    XKeysymToKeycode returns keycode: 36
"   XLookupString gives 1 bytes: (0d) "
"   XmbLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19305332, (688,648), root:(691,696),
    state 0x10, keycode 104 (keysym 0xff0d,
KB_Enter), same_screen YES,
    XKeysymToKeycode returns keycode: 36
"   XLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False




Запускаем команду...
xmodmap -e 'keycode 104=Return'

смотрим результат


KeyPress event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19305238, (688,648), root:(691,696),
    state 0x10, keycode 104 (keysym 0xff0d, Return), same_screen YES,
    XKeysymToKeycode returns keycode: 36
"   XLookupString gives 1 bytes: (0d) "
"   XmbLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x3e00001,
    root 0x137, subw 0x0, time 19305332, (688,648), root:(691,696),
    state 0x10, keycode 104 (keysym 0xff0d,
Return), same_screen YES,
    XKeysymToKeycode returns keycode: 36
"   XLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False


среда, 13 июня 2012 г.

Одной строкой

  • Переименуем все *.JPG в *.jpg: rename -vs/.JPG/.jpg/s *.JPG
  • Google mp3 search: -inurl:(htm|html|php) intitle:"index of" +"last modified" +"parent directory" +description +size +(wma|mp3) "bla bla"
  • Выбираем наиболее активные IP-адреса из логов: tail -n 400000 /path/to/log/access_log | cut -d" " -f1 | sort | uniq -c | sort -n | tail -n 30
  • Пример использования pstree: while :; do pstree | grep postmaster; sleep 3; done
  • netstat -nltp
  • cvs diff -u8pN ./filename
  • less для mysql: mysql --pager='less -niSFX -Kutf-8' --default-character-set=utf8
  • Вывод запроса в консоль без разделителей в MySQL: mysql -N -B -uName -pPassword -hHost -e "select * from TableTable" DBName
  • Поменять оболочку для пользователя по умолчанию в Sun Unix-ах можно командой usermod -s /usr/bin/bash myUserName
  • tcpdump -XXepnnvvvi bge0 host 192.168.5.15
  • Посмотреть, сколько на машине физической памяти можно командой sysctl -a | grep mem, сколько процессоров - cat /var/run/dmesg.boot | grep -i cpu
  • Подключить tsearch к PostgreSQL можно так: psql -h -d -U postgres < ltree.sql и psql -h -d -U postgres < tsearch2.sql, где ltree.sql и tsearch2.sql лежат в /usr/local/share/postgresql/contrib
  • Сделать текст в консоли в bash зеленым можно с помощью команды: export PS1="\[\033[0;32;40m\u@\h:\w\$ \]"
Отсюда... http://www.gnuman.ru


вторник, 5 июня 2012 г.

Мониторинг изменений iptables на svn и redmine (debian)

        1.  Настройка сервера с SVN и Redmine

http://www.debuntu.org/2006/05/20/54-how-to-subversion-svn-with-apache2-and-dav


Neccessary packages:
First of all we need to install the required packages:
apt-get install subversion libapache2-svn
Repository structure:
The projects are going to be hosted on /var/svn/repository. We need to create to directories and give full permission to the apache user:
mkdir /var/svn
mkdir /var/svn/repository
Now that the directory exist, we need to give write access to the apache user:
chown www-data:www-data -R /var/svn/repository
chmod 770 -R /var/svn/repository
Configuring Apache:
Now, we need to modify apache svn module configuration file, edit /etc/apache2/mods-available/dav_svn.conf and make sure the following argument are properly setted up:
...
SVNParentPath /var/svn/repository
#SVNPath /var/svn/repository
.....
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user
...
In order to be able to track who modify the different files of the project, we need to create users. Create the first user (tester) and supply a password:
htpasswd -c /etc/apache2/dav_svn.passwd client01_user
Creating a first repository:
Get apache user access (so files and directories are created with proper rights:
su www-data
and create your first repository (example):
svnadmin create /var/svn/repository/client01
Now, get back to root user (Ctrl-D) and restart apache:
/etc/init.d/apache2 restart
Your project is now avalaible to the different user you will add in /etc/apache2/dav_svn.passwd .
User tester can now access the project at http://svnhostaddress/example and checkout a first copy to his computer, modify files and commit back his changes to the server.

Установка redmine 

apt-get install redmine

      2.  Настройка клиента



Уcтановка необходимых пакетов

apt-get install subversion


Создадим папку репозитория
mkdir /var/svn

cd /var/svn

импортируем с сервера svn саму папку (не забыть точку в конце)
root@client01:/var/svn# svn co http://192.168.55.9/svn/client01 .


Далее пропатчим iptables.sh

root@client01:/etc/network# tail -n3 iptables.sh
iptables-save | egrep -v '^(#|:)' > /var/svn/iptables_svn
/usr/local/sbin/commit_svn $@



сам файлик /usr/local/sbin/commit_svn
root@client01:/etc/network# cat /usr/local/sbin/commit_svn
#!/bin/bash
comment=$@
if [ -z "$comment" ]; then
    comment="no comments"
fi

if [ $USER = "root" ]; then
    user=$SUDO_USER
else
    user=$USER
fi

if [ -n "$user" ]; then
    svn ci --username $user --config-dir /home/$user/.subversion/ -m"$comment" /var/svn/iptables_svn
fi



Выполним вручную iptables.sh,  чтобы создался файл  /var/svn/iptables_svn

Добавим новый файл в репозиторий

root@client01:/var/svn#svn add iptables_svn

Логин и пароль на доступ к svn  сохраняется в домашней директории /home/$user/.subversion/

      3.  Настройка redmine

 Создадим проект iptables. Далее подпроект client01
В настройках хранилища указываем параметры svn  сервера
http://192.168.55.9/svn/client01

Для  redmine на сервере svn можно создать отдельного ползователя  redmine
root@svn:/tmp#htpasswd /etc/apache2/dav_svn.passwd redmine



SVN auto Commit cron 

1 вариант 

отсюда... http://snippet.espend.de/ssh/svn-auto-commit-cron-54.html

#!/bin/bash
 
# CHANGES:
# Feb 2nd 2010: Fixing a nasty bug found bug Jason Judge that would make
#  the script fail once in a while;
 
#------------------------------- Subroutines ---------------------------------
usage(){
echo " Usage: $(basename $0) PATH" 
echo ""
echo "Automatically commits the changes of svn working copy located in PATH."
echo "The new files are automatically added and the files that have been removed"
echo "are removed."
echo ""
echo "By Gael Varoquaux"
}
 
#------------------------------- Process the options -------------------------
if [ $# -eq 1 ]
then
    workingdir="$1"
else
    usage
    exit 1
fi
 
if ! cd $workingdir
then
    echo $workingdir is not a accessible path.
    usage
    exit 1
fi
 
#------------------------------- Find out what has changed -------------------
 
# A warning if this fails :
echo "SVN autocommit failed or nothing todo" 
 
svnstatus=$(svn status $workingdir)
added=$(printf "%s" "$svnstatus" | sed -n 's/^[A?] *\(.*\)/\1/p')
removed=$(printf "%s" "$svnstatus" | sed -n 's/^! *\(.*\)/\1/p')
 
if [ "x$added" != "x" ]
then
    echo adding "$added" to repository
    svn add $added
fi
 
if [ "x$removed" != "x" ]
then
    echo removing "$removed" to repository
    svn remove $removed
fi
 
svn commit -m "autocommit" 
 
 
 
2 вариант 
 
 
#!/bin/bash
# Run commit every second.
# Why? Cron can't do that.
# This can be used combined with a post-commit hook to make a kind of a versioned FTP :P

# This script needs a initial checkout! A working copy must exist a priori!

# You need to set-up a "svn-path" file in the same directory as the script with one working copy a line
# /absolute/working-copy/
# /absolute/working-copy2/

# Bugs: 
# Sometimes when you work with someone else on the same file it can overwrite others modifications with yours without throwing a conflict
# Good thing it's svn and you can easily merge the modifications afterwards. Still this bug is annoying

# Change this to your paths
script_path="/home/sasha/Scripts/"
paths_file="/home/sasha/Scripts/svn-paths"

while [ true ]; do
 message="*Auto-message*"
 for local_path in `cat $paths_file| grep -v "#"`; do
  stat=`svn status $local_path`
  if [[ $stat != '' ]]; then #Are there any changes?
   delete_files=`echo $stat|grep -e "^\!"|cut -d" " -f2`
   if [[ $delete_files != '' ]]; then
    svn delete $delete_files>/dev/null 2>/dev/null
    svn commit --non-interactive -m "$message (delete)" $remote_url >/dev/null 2>>"$script_path"commit_log
   fi
   # Do we have any files to add
   add_files=`echo $stat|grep -e "^\?"|cut -d" " -f2`
   if [[ $add_files != '' ]]; then
    svn add $add_files >/dev/null 2>/dev/null # Add new files if there are any
    svn commit --non-interactive -m "$message (add)" $remote_url >/dev/null 2>>"$script_path"commit_log # Finaly commit
   fi
   svn update $local_path >/dev/null 2>>/dev/null #Checkout first
   svn commit --non-interactive -m "$message (modified)" $local_path >/dev/null 2>>"$script_path"commit_log # Finaly commit
  fi
 done
 sleep 1
done