Практичні поради, приклади та тунелі SSH

Практичні поради, приклади та тунелі SSH
Практичні приклади SSH, які виведуть на новий рівень ваші навички віддаленого системного адміністратора. Команди та поради допоможуть не тільки використовувати SSH, але й грамотніше переміщатися мережею.

Знання кількох трюків ssh корисно будь-якому системному адміністратору, мережному інженеру чи фахівцю з безпеки.

Практичні приклади SSH

  1. SSH socks-проксі
  2. Тунель SSH (переадресація портів)
  3. SSH-тунель на третій хост
  4. Зворотний SSH-тунель
  5. Зворотний проксі SSH
  6. Встановлення VPN за SSH
  7. Копіювання ключа SSH (ssh-copy-id)
  8. Видалене виконання команд (неінтерактивно)
  9. Віддалений перехоплення пакетів та перегляд у Wireshark
  10. Копіювання локальної папки на віддалений сервер SSH
  11. Віддалені програми GUI з переадресацією SSH X11
  12. Видалене копіювання файлів за допомогою rsync та SSH
  13. SSH через мережу Tor
  14. SSH до інстансу EC2
  15. Редагування текстових файлів за допомогою VIM через ssh/scp
  16. Монтування віддаленого SSH як локальної папки з SSHFS
  17. Мультиплексування SSH за допомогою ControlPath
  18. Потокове відео по SSH за допомогою VLC та SFTP
  19. двухфакторная аутентифікація
  20. Стрибки по хостам з SSH та -J
  21. Блокування спроб брутфорсу SSH за допомогою iptables
  22. SSH Escape для зміни переадресації портів

Спочатку основи

Розбір командного рядка SSH

У наступному прикладі використовуються звичайні параметри, які часто зустрічаються при підключенні до віддаленого сервера SSH.

localhost:~$ ssh -v -p 22 -C neo@remoteserver

  • -v: висновок налагоджувальної інформації особливо корисний під час аналізу проблем аутентифікації. Можна використовувати кілька разів, щоб вивести додаткову інформацію.
  • - p 22: порт для підключення до віддаленого сервера SSH. 22 не обов'язково вказувати, тому що це значення за промовчанням, але якщо протокол на якомусь іншому порту, то вказуємо його за допомогою параметра -p. Порт прослуховування вказується у файлі sshd_config у форматі Port 2222.
  • -C: стиснення для з'єднання. Якщо у вас повільний канал або переглядає багато тексту, це може прискорити зв'язок.
  • neo@: рядок перед символом @ означає ім'я користувача для аутентифікації на віддаленому сервері. Якщо не вказати його, то за умовчанням буде використовуватись ім'я користувача облікового запису, до якого ви увійшли в даний момент (~$whoami). Користувача також можна вказати параметром -l.
  • remoteserver: ім'я хоста, до якого підключається sshЦе може бути повне доменне ім'я, IP-адреса або будь-який хост в локальному файлі hosts. Для підключення до хоста, який підтримує IPv4 і IPv6, можна додати в командний рядок параметр -4 або -6 для правильного резолвінгу.

Усі перелічені параметри є необов'язковими, крім remoteserver.

Використання конфігураційного файлу

Хоча багато хто знайомий з файлом sshd_config, ще є файл конфігурації клієнта для команди ssh. Значення за замовчуванням ~/.ssh/config, але його можна визначити як параметр для опції -F.

Host *
     Port 2222

Host remoteserver
     HostName remoteserver.thematrix.io
     User neo
     Port 2112
     IdentityFile /home/test/.ssh/remoteserver.private_key

У наведеному вище прикладному файлі конфігурації ssh два записи хоста. Перша позначає всі хости, всім застосовується параметр конфігурації Port 2222. Друга каже, що з хоста remoteserver слід використовувати інше ім'я користувача, порт, FQDN та IdentityFile.

Файл конфігурації може заощадити багато часу на введення символів, дозволяючи автоматично застосовувати просунуту конфігурацію під час підключення до конкретних хостів.

Копіювання файлів SSH за допомогою SCP

SSH-клієнт поставляється з двома іншими дуже зручними інструментами для копіювання файлів зашифрованому ssh-з'єднанню. Нижче див. приклад стандартного використання команд scp та sftp. Зверніть увагу, що багато параметрів для ssh застосовуються і в цих командах.

localhost:~$ scp mypic.png neo@remoteserver:/media/data/mypic_2.png

У цьому прикладі файл mypic.png скопійовано на remoteserver у папку /media/data і перейменований на mypic_2.png.

Не забувайте про різницю у параметрі порту. На цьому трапляються багато хто, хто запускає scp з командного рядка. Тут параметр порту -P, А не -pяк у ssh-клієнті! Ви забудете, але не хвилюйтеся, всі забувають.

Для тих, хто знайомий з консольним ftp, багато з команд схожі на sftp. Ви можете зробити штовхати, put и lsяк серце забажає.

sftp neo@remoteserver

Практичні приклади

Багато з цих прикладів можна досягти результату різними методами. Як і у всіх наших підручники і приклади, перевага віддається практичним прикладам, які просто роблять свою справу.

1. SSH socks-проксі

Функція SSH Proxy під номером 1 з поважних причин. Вона більш потужна, ніж багато хто припускає, і дає вам доступ до будь-якої системи, до якої має доступ віддалений сервер, використовуючи практично будь-яку програму. Клієнт ssh може тунелювати трафік через проксі-сервер SOCKS однією простою командою. Важливо розуміти, що трафік до віддалених систем виходитиме від віддаленого сервера, так буде вказано в логах веб-сервера.

localhost:~$ ssh -D 8888 user@remoteserver

localhost:~$ netstat -pan | grep 8888
tcp        0      0 127.0.0.1:8888       0.0.0.0:*               LISTEN      23880/ssh

Тут ми запускаємо socks-проксі на TCP-порт 8888, друга команда перевіряє, що порт активний в режимі прослуховування. 127.0.0.1 вказує, що служба працює лише на localhost. Ми можемо застосувати трохи іншу команду для прослуховування всіх інтерфейсів, включаючи ethernet або wifi, це дозволить іншим програмам (браузерам тощо) в нашій мережі підключатися до проксі-сервісу через ssh socks-проксі.

localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserver

Тепер можемо налаштувати браузер для підключення до socks-проксі. У Firefox виберіть Налаштування | Основні | Параметри мережі. Вкажіть IP-адресу та порт для підключення.

Практичні поради, приклади та тунелі SSH

Зверніть увагу на опцію у нижній частині форми, щоб DNS-запити браузера теж йшли через проксі SOCKS. Якщо ви використовуєте проксі-сервер для шифрування веб-трафіку в локальній мережі, то, напевно, захочете вибрати цю опцію, щоб DNS-запити тунелювалися через SSH-з'єднання.

Активація socks-проксі у Chrome

Запуск Chrome з певними параметрами командного рядка активує socks-проксі та тунелювання DNS-запитів з браузера. Довіряй але перевіряй. Використовуйте TCPDOMP для перевірки, що DNS-запити більше не видно.

localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"

Використання інших програм з проксі

Майте на увазі, що багато інших програм також можуть використовувати socks-проксі. Веб-браузер просто найпопулярніший із них. Деякі програми мають параметри конфігурації для активації проксі-сервера. Іншим потрібно трохи допомогти допоміжною програмою. Наприклад, проксі -ланцюги дозволяє запустити через socks-проксі Microsoft RDP та ін.

localhost:~$ proxychains rdesktop $RemoteWindowsServer

Параметри конфігурації socks-проксі задаються у файлі конфігурації proxychains.

Підказка: якщо ви використовуєте віддалений робочий стіл з Linux на Windows? Спробуйте клієнт FreeRDP. Це більш сучасна реалізація, ніж rdesktop, З набагато більш плавною взаємодією.

Варіант використання SSH через socks-проксі

Ви сидите в кафе або готелі і змушені використовувати досить ненадійний WiFi. З ноутбука локально запускаємо ssh-проксі та встановлюємо ssh-тунель у домашню мережу на локальний Rasberry Pi. Використовуючи браузер або інші програми, налаштовані для socks-проксі, ми можемо отримати доступ до будь-яких мережевих служб у нашій домашній мережі або вийти в Інтернет через домашнє підключення. Все між вашим ноутбуком та домашнім сервером (через Wi-Fi та інтернет додому) зашифровано у тунелі SSH.

2. Тунель SSH (переадресація портів)

У простій формі SSH-тунель просто відкриває порт у вашій локальній системі, який підключається до іншого порту на іншому кінці тунелю.

localhost:~$ ssh  -L 9999:127.0.0.1:80 user@remoteserver

Розберемо параметр -L. Його можна подати як локальну сторону прослуховування. Таким чином, у прикладі вище порт 9999 прослуховується на стороні localhost і переадресовується через порт 80 на remoteserver. Зверніть увагу, що 127.0.0.1 відноситься до localhost на віддаленому сервері!

Піднімемося на сходинку. У цьому прикладі порти прослуховування зв'язуються з іншими вузлами локальної мережі.

localhost:~$ ssh  -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver

У цих прикладах ми підключаємося до порту на веб-сервері, але це може бути проксі-сервер або інша служба TCP.

3. SSH-тунель на сторонній хост

Ми можемо використовувати самі параметри для підключення тунелю з віддаленого сервера до іншої служби, запущеної на третій системі.

localhost:~$ ssh  -L 0.0.0.0:9999:10.10.10.10:80 user@remoteserver

У цьому прикладі ми перенаправляємо тунель від remoteserver до веб-сервера, що працює на 10.10.10.10. Трафік з remoteserver до 10.10.10.10 вже не в SSH-тунелі. Веб-сервер на 10.10.10.10 вважатиме remoteserver джерелом веб-запитів.

4. Зворотний SSH-тунель

Тут налаштуємо порт, що прослуховує, на віддаленому сервері, який буде підключатися назад до локального порту на нашому localhost (або іншій системі).

localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver

У цій SSH-сесії встановлюється з'єднання з порту 1999 на remoteserver до порту 902 на нашому локальному клієнті.

5. Зворотний проксі SSH

У цьому випадку ми встановлюємо socks-проксі на нашому ssh-з'єднанні, проте проксі слухає на віддаленому кінці сервера. Підключення до цього дистанційного проксі тепер з'являються з тунелю як трафік з нашого localhost.

localhost:~$ ssh -v -R 0.0.0.0:1999 192.168.1.100 user@remoteserver

Усунення проблем із віддаленими SSH-тунелями

Якщо у вас виникли проблеми з роботою віддалених опцій SSH, перевірте за допомогою netstat, до яких інтерфейсів підключений порт прослуховування. Хоча ми в прикладах вказали 0.0.0.0, але якщо значення Порти шлюзу в sshd_config встановлено на значення немає, то листенер буде прив'язаний тільки до localhost (127.0.0.1).

Попередження безпеки

Зверніть увагу, що при відкритті тунелів та socks-проксі внутрішні мережні ресурси можуть бути доступні ненадійним мережам (наприклад, інтернету!). Це може бути серйозною загрозою безпеці, тому переконайтеся, що ви розумієте, що є слухачем і до чого має доступ.

6. Встановлення VPN за SSH

Загальний термін серед спеців за методами атаки (пентестери та ін.) - Це «точка опори в мережі». Після встановлення з'єднання в одній системі ця система стає шлюзом для подальшого доступу до мережі. Точка опори, що дозволяє рухатися вшир.

Для такої точки опори ми можемо використовувати SSH-проксі та проксі -ланцюгиОднак є деякі обмеження. Наприклад, не вийде працювати безпосередньо із сокетами, тому ми не зможемо сканувати порти всередині мережі через Nmap SYN.

Використовуючи цей більш просунутий варіант VPN, підключення знижується до рівня 3. Потім ми можемо просто надіслати трафік через тунель, використовуючи стандартну мережну маршрутизацію.

Метод використовує ssh, iptables, tun interfaces та маршрутизацію.

Спочатку потрібно задати ці параметри в sshd_config. Оскільки ми вносимо зміни до інтерфейсів і віддаленої, і клієнтської системи, нам потрібні права root з обох сторін.

PermitRootLogin yes
PermitTunnel yes

Потім встановимо ssh-з'єднання, використовуючи параметр, який вимагає ініціалізації tun-пристроїв.

localhost:~# ssh -v -w any root@remoteserver

Тепер у нас має бути пристрій tun при показі інтерфейсів (# ip a). Наступний крок додасть IP-адреси до тунельних інтерфейсів.

Сторона клієнта SSH:

localhost:~# ip addr add 10.10.10.2/32 peer 10.10.10.10 dev tun0
localhost:~# ip tun0 up

Сторона сервера SSH:

remoteserver:~# ip addr add 10.10.10.10/32 peer 10.10.10.2 dev tun0
remoteserver:~# ip tun0 up

Тепер у нас прямий маршрут до іншого хосту (route -n и ping 10.10.10.10).

Можна маршрутизувати будь-яку підсітку через хост з іншого боку.

localhost:~# route add -net 10.10.10.0 netmask 255.255.255.0 dev tun0

На віддаленому боці необхідно увімкнути ip_forward и iptables.

remoteserver:~# echo 1 > /proc/sys/net/ipv4/ip_forward
remoteserver:~# iptables -t nat -A POSTROUTING -s 10.10.10.2 -o enp7s0 -j MASQUERADE

Бум! VPN через тунель SSH на мережному рівні.. Оце вже перемога.

Якщо виникають якісь проблеми, використовуйте TCPDOMP и ping, щоб встановити причину. Оскільки ми граємо на рівні 3, наші пакети icmp підуть через цей тунель.

7. Копіювання ключа SSH (ssh-copy-id)

Тут є кілька способів, але ця команда заощаджує час, щоб не копіювати файли вручну. Вона просто копіює ~/.ssh/id_rsa.pub (або ключ за замовчуванням) з вашої системи в ~/.ssh/authorized_keys на віддаленому сервері.

localhost:~$ ssh-copy-id user@remoteserver

8. Видалене виконання команд (неінтерактивно)

Команду ssh можна зв'язати з іншими командами для зручного інтерфейсу. Просто додайте команду, яку хочете запустити на віддаленому хості, як останній параметр у лапках.

localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php

У цьому прикладі grep виконується на локальній системі після того, як балка завантажувалася по ssh-каналу. Якщо файл великий, зручніше запустити grep на віддаленому боці, просто уклавши обидві команди в подвійні лапки.

Інший приклад виконує ту ж саму функцію, що і ssh-copy-id із прикладу 7.

localhost:~$ cat ~/.ssh/id_rsa.pub | ssh remoteserver 'cat >> .ssh/authorized_keys'

9. Віддалений перехоплення пакетів та перегляд у Wireshark

Я взяв один з наших прикладів з tcpdump. Використовуйте його для віддаленого перехоплення пакетів з видачею результату безпосередньо у GUI локального Wireshark.

:~$ ssh root@remoteserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i -

10. Копіювання локальної папки на віддалений сервер SSH

Гарний трюк, який стискає папку за допомогою bzip2 (Це параметр -j у команді tar), а потім витягує потік bzip2 з іншого боку, створюючи на віддаленому сервері дублікат папки.

localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"

11. Видалені програми GUI з переадресацією SSH X11

Якщо на клієнті та віддаленому сервері встановлені «ікси», можна віддалено виконати команду GUI, з вікном на вашому локальному робочому столі. Ця функція існує давно, але, як і раніше, дуже корисна. Запустіть віддалений веб-браузер або навіть консоль VMWawre Workstation, як я роблю в цьому прикладі.

localhost:~$ ssh -X remoteserver vmware

Потрібен рядок X11Forwarding yes у файлі sshd_config.

12. Видалене копіювання файлів за допомогою rsync та SSH

rsync багато в чому зручніше scpякщо потрібно періодичне резервне копіювання каталогу, великої кількості файлів або дуже великих файлів. Тут є функція відновлення після збою передачі та копіювання лише змінених файлів, що зберігає трафік та час.

У цьому прикладі використовується стиск gzip (-z) та режим архівування (-a), який включає рекурсивне копіювання.

:~$ rsync -az /home/testuser/data remoteserver:backup/

13. SSH через мережу Tor

Анонімна мережа Tor може тунелювати SSH-трафік за допомогою команди torsocks. Наступна команда прокине ssh-проксі через Tor.

localhost:~$ torsocks ssh myuntracableuser@remoteserver

Torsocks буде використовувати для проксі порт 9050 localhost. Як завжди при використанні Tor, необхідно серйозно перевіряти, який трафік тунелюється та інші проблеми операційної безпеки (opsec). Куди йдуть ваші запити DNS?

14. SSH до інстансу EC2

Для підключення до інстансу EC2 необхідний закритий ключ. Завантажте його (розширення .pem) з панелі керування Amazon EC2 та змініть роздільну здатність (chmod 400 my-ec2-ssh-key.pem). Зберігайте ключ у надійному місці або помістіть його у свою папку ~/.ssh/.

localhost:~$ ssh -i ~/.ssh/my-ec2-key.pem ubuntu@my-ec2-public

Параметр -i просто вказує ssh-клієнту використовувати цей ключ. Файл ~/.ssh/config ідеально підходить для автоматичного налаштування використання ключа під час підключення до хоста ec2.

Host my-ec2-public
   Hostname ec2???.compute-1.amazonaws.com
   User ubuntu
   IdentityFile ~/.ssh/my-ec2-key.pem

15. Редагування текстових файлів за допомогою VIM через ssh/scp

Для всіх любителів vim ця порада заощадить небагато часу. За допомогою vim файли редагуються через scp однією командою. Цей метод просто створює файл локально /tmp, а потім копіює його назад, як тільки ми його зберегли з vim.

localhost:~$ vim scp://user@remoteserver//etc/hosts

Примітка: формат трохи відрізняється від звичайного scp. Після хоста у нас подвійний //. Це посилання абсолютний шлях. Один слеш означатиме шлях щодо домашньої папки users.

**warning** (netrw) cannot determine method (format: protocol://[user@]hostname[:port]/[path])

Якщо ви побачите таку помилку, двічі перевірте формат команди. Зазвичай це означає синтаксичну помилку.

16. Монтування віддаленого SSH як локальної папки з SSHFS

За допомогою sshfs - Клієнта файлової системи ssh — ми можемо підключити локальний каталог до віддаленого розташування з усіма взаємодіями файлів у зашифрованому сеансі ssh.

localhost:~$ apt install sshfs

На Ubuntu та Debian встановимо пакет sshfs, а потім просто примонтуємо віддалену прихильність до нашої системи.

localhost:~$ sshfs user@remoteserver:/media/data ~/data/

17. Мультиплексування SSH за допомогою ControlPath

За промовчанням за наявності існуючого підключення до віддаленого сервера за допомогою ssh друге підключення за допомогою ssh або scp встановлює новий сеанс із додатковою автентифікацією. Опція ControlPath дозволяє використовувати існуючий сеанс всіх наступних з'єднань. Це значно прискорить процес: ефект помітний навіть у локальній мережі, а тим більше під час підключення до віддалених ресурсів.

Host remoteserver
        HostName remoteserver.example.org
        ControlMaster auto
        ControlPath ~/.ssh/control/%r@%h:%p
        ControlPersist 10m

ControlPath вказує сокет для перевірки новими з'єднаннями щодо наявності активної сесії ssh. Остання опція означає, що навіть після виходу з консолі існуючий сеанс залишиться відкритим 10 хвилин, тому протягом цього часу ви зможете повторно підключитися по існуючому сокету. Для додаткової інформації дивіться довідку ssh_config man.

18. Потокове відео по SSH за допомогою VLC та SFTP

Навіть давні користувачі ssh и vlc (Video Lan Client) не завжди знають про цю зручну опцію, коли потрібно подивитися відео по мережі. В налаштуваннях File | Open Network Stream програми vlc можна ввести місцезнаходження як sftp://. Якщо потрібно пароль, з'явиться запит.

sftp://remoteserver//media/uploads/myvideo.mkv

19. Двофакторна автентифікація

Така ж двофакторна автентифікація, як у вашого банківського рахунку або облікового запису Google, може бути застосована до сервісу SSH.

Звичайно, ssh спочатку має функцію двофакторної аутентифікації, під якою маються на увазі пароль і ключ SSH. Перевага апаратного токена або програми Google Authenticator полягає в тому, що це зазвичай інший фізичний пристрій.

наш 8-хвилинний посібник з використання Google Authenticator та SSH.

20. Стрибки по хост з ssh і -J

Якщо через сегментацію мережі доводиться переходити через кілька хостів ssh, щоб дістатися кінцевої мережі призначення, вам заощадить час ярлик -J.

localhost:~$ ssh -J host1,host2,host3 [email protected]

Тут головне розуміти, що це не аналогічно команді ssh host1, Потім user@host1:~$ ssh host2 і т. д. Параметр -J хитро використовує переадресацію, щоб localhost встановлював сеанс з наступним хостом у ланцюжку. Таким чином, у наведеному вище прикладі наш localhost автентифікується на host4. Тобто використовуються ключі localhost, а сеанс від localhost до host4 повністю зашифрований.

Для такої можливості ssh_config вкажіть опцію конфігурації ProxyJump. Якщо регулярно доводиться переходити через кілька хостів, то автоматизація через конфіг заощадить багато часу.

21. Блокування спроб брутфорсу SSH за допомогою iptables

Будь-хто, хто керував сервісом SSH та переглядав логи, знає про кількість спроб брутфорсу, які відбуваються щогодини щодня. Швидкий спосіб зменшити шум у логах – перенести SSH на нестандартний порт. Внесіть зміни до файлу sshd_config за допомогою параметра конфігурації Port##.

За допомогою iptables також можна легко блокувати спроби підключення до порту після досягнення певного порога. Простий спосіб зробити це використовувати OSSEC, оскільки він не лише блокує SSH, але виконує купу інших заходів для виявлення вторгнень на базі імені хоста (HIDS).

22. SSH Escape для зміни переадресації портів

І наш останній приклад ssh призначений для зміни переадресації портів на льоту в рамках існуючого сеансу ssh. Уявіть такий сценарій. Ви глибоко в мережі; можливо, стрибнули через півдюжини хостів і вам потрібен локальний порт на робочій станції, який перенаправлений на Microsoft SMB старої системи Windows 2003 (хтось пам'ятає ms08-67?).

Натиснувши enter, спробуйте ввести в консолі ~C. Це керуюча послідовність у сесії, що дозволяє вносити зміни до існуючого з'єднання.

localhost:~$ ~C
ssh> -h
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KL[bind_address:]port                 Cancel local forward
      -KR[bind_address:]port                 Cancel remote forward
      -KD[bind_address:]port                 Cancel dynamic forward
ssh> -L 1445:remote-win2k3:445
Forwarding port.

Тут ви можете побачити, що ми переадресували наш локальний порт 1445 на Windows 2003 хост, який знайшли у внутрішній мережі. Тепер просто запустіть msfconsoleі можна йти далі (припускаючи, що ви плануєте використовувати цей хост).

Завершення

Ці приклади, поради та команди ssh повинні дати відправну точку; додаткова інформація про кожну з команд та можливостей доступна на довідкових сторінках (man ssh, man ssh_config, man sshd_config).

Мене завжди зачаровувала можливість звертатися до систем та виконувати команди у будь-якій точці світу. Розвиваючи свої навички роботи з інструментами начебто ssh ви станете ефективнішим у будь-якій грі, в яку граєте.

Джерело: habr.com

Додати коментар або відгук