Holen Sie sich die Quell-IP aus dem Reverse-SSH-Tunnel

7

Wenn ich einen Client zum Erstellen eines Reverse-Tunnels mit SSH verwende -R, erhalte ich diese Ausgabe auf dem Server, wenn ich netstat ausführe:

default@debian:~$ sudo netstat -pln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      801/sshd
tcp        0      0 127.0.0.1:39963         0.0.0.0:*               LISTEN      1074/sshd: anonymou
tcp6       0      0 :::22                   :::*                    LISTEN      801/sshd
udp        0      0 0.0.0.0:68              0.0.0.0:*                           451/dhclient

Ich möchte wissen, wie die IP des Clients lautet, der den Listening-Socket am Port erstellt hat 39963.

Welchen Befehl kann ich ausführen, damit ich nicht nur die gebundene IP: PORT erhalte, sondern auch die IP des Clients, der den Tunnel erstellt hat?

user1618465
quelle
Wir können nur LISTEN-Sockets an diesem Ausgang sehen. Einschließlich des Ports, an dem Sie interessiert sind und der (noch) keine Verbindung darstellt, hat nur der sshdServer selbst die von Ihnen angeforderte Portweiterleitung mit der -ROption eingerichtet. Um die ESTABLISHED-Verbindungen wirklich zu sehen, entfernen Sie das l(el) vom netstatBefehl. Ich nehme an, Sie möchten stattdessen die tOption verwenden, um nur TCP-Sockets anzuzeigen , und auch die aOption, sowohl ESTABLISHED-Verbindungen als auch LISTEN-Sockets anzuzeigen . Das heißt:netstat -ptan
LL3
Hallo, leider gibt Ihnen das nicht die Quell-IP für den gebundenen Port (127.0.0.1:39963)
user1618465
Es gibt keine Quell-IP, da Ihr Server nur auf neue Verbindungen wartet. 127.0.0.1 ist der lokale Host, in diesem Fall Ihr Server. Es wartet auf Verbindungen zu diesem Port, und nur der Server kann selbst eine Verbindung zu seinem eigenen 127.0.0.1 herstellen. Versuchen Sie es beispielsweise telnet localhost 39963 vom Server aus : Der sshauf Ihrem Clientcomputer stellt eine Verbindung zu einem anderen Host her: Port, den Sie in Ihrem ssh -RBefehl angegeben haben. Dann sehen Sie eine ESTABLISHED-Verbindung auf Ihrem Server. Nur wird es nicht interessant sein, weil es 127.0.0.1 sein wird. Die echte Remote-IP wird von Ihrem Client
angezeigt
@ LL3 Ich denke, das OP sucht nach der IP des mit dem Server verbundenen SSH-Clients. Insbesondere sucht er nach dem SSH-Client, der für das Öffnen eines Remote-Listening-Sockets auf dem Server verantwortlich ist. Es wird eine Quell-IP geben, die Herausforderung besteht darin, sie zu finden.
Philip Couling
Verwandte (und kein Duplikat) ist unix.stackexchange.com/questions/127940/…
mr.spuratic

Antworten:

4

Ich kann Ihnen keinen einzigen Befehl geben, aber es gibt einige Befehle, mit denen Sie den Client finden können. Das Problem liegt in der Art und Weise, wie OpenSSH Prozesse erstellt. Der Prozess, dem der Listening-Socket gehört, ist das untergeordnete Element 39963des Prozesses, dem die SSH-Verbindung gehört. Sie haben also unterschiedliche PIDs. In Ihrem Beispiel müssen Sie den übergeordneten Prozess für finden 1074. Das Folgende funktioniert für OpenSSH-Server unter Ubuntu. Ich kann nicht garantieren, dass sich jede Distribution gleich verhält.

Suchen Sie zunächst die PID für die Clientverbindung. Verwenden Sie grepdiese Option, um die Ausgabe von zu filtern netstat.

$ sudo netstat -ptln | grep 39963
tcp        0      0 127.0.0.1:39963         0.0.0.0:*               LISTEN      21921/sshd: philip@
tcp6       0      0 ::1:39963               :::*                    LISTEN      21921/sshd: philip@

Der Hörprozess hier ist 21921. Sie brauchen es Eltern:

$ ps -ef | grep 21921
philip   21921 21919  0 11:01 ?        00:00:00 sshd: philip@pts/1
philip   21924 21921  0 11:01 pts/1    00:00:00 -bash
philip   22844 20309  0 11:15 pts/0    00:00:00 grep --color=auto 21921

# Or try this:

$ ps -ef | awk '$2 == 21921 { print $3 }'
21919

Der Elternteil von 21921hier ist 21919. Jetzt schauen wir zurück zu netstat, um den Kunden zu finden:

$ sudo netstat -ptn | grep 21919
tcp        0      0 192.168.1.36:22          192.168.1.10:54425   ESTABLISHED 21919/sshd: philip

Dies zeigt, dass die Remote-IP ist 192.168.1.10

Philip Couling
quelle
Um den Elternprozess von $ child zu erhalten, betrachten Sieps -p "$child" -oppid=
Jeff Schaller
3

Der SSH-Client und -Server tauschen Nachrichten aus, um Weiterleitungen einzurichten, aber die Kernel-Netzwerktabelle kümmert sich nur um ihren lokalen IP-Stack und weiß nur, dass er nur sieht sshd.

OpenSSH teilt jedoch auch einige Details in der Umgebung (die ebenfalls über einen Nachrichtenaustausch übergeben werden).

 sshcpid=$(pgrep -P 1074)               # fetch child PID
 xargs -0 -L1 -a /proc/$sshcpid/environ # show environment strings

Die Variablen SSH_CLIENTund SSH_CONNECTIONsollten beide enthalten, was Sie benötigen.

Hier finden Sie xargseine praktische Möglichkeit, die durch NUL getrennten Zeichenfolgen zu verarbeitenenviron .

Dies setzt voraus:

  • Linux, für ein /procmitenviron
  • OpenSSH mit einer Prozesskette wie:

    Daemon sshd → gegabelte Verbindung sshd → privsep sshd → Benutzer-Shell

zB (von pstree -lp):

 init(1)-+
         .
         |-sshd(1015) +-sshd(1072)---sshd(1074)---bash(1075)

Der Privsep- sshd Prozess ist derjenige, in dem Sie sehen netstat. Die Umgebung, die Sie lesen, stammt von seinem unmittelbaren Nachkommen, der Shell (in diesem Beispiel Bash).

mr.spuratic
quelle
1

Der Befehl lsof unter Linux zeigt in seiner Ausgabe Informationen zu Dateien an, die von Prozessen geöffnet werden

Nehmen Sie die Prozess-ID von ssh aus dem netstat.

lsof -p $pid -a -d 3

zeigt die IP des anderen Endes der Verbindung an. Da ssh gehüpft werden kann, ist dies möglicherweise nicht der endgültige Speicherort.

$ pid ist die Prozess-ID Ihres SSH-Dienstes

Wenn Sie nicht haben lsof, können Sie es mit installierenapt-get install lsof

Rasool Ziafaty
quelle
Bitte erläutern Sie: (1) Sollte $pidin Ihrem Befehl nach dem vom OP bereitgestellten Beispiel 801oder sein 1074? (2) Was macht -a -d 3? und warum ist es hier nützlich?
Kamil Maciorowski
1.pid ist eine Identifikationsnummer, die automatisch jedem Prozess zugewiesen wird, den Sie von sshd erhalten könnenps -e | grep sshd
Rasool Ziafaty
2. man lsofgibt Ihnen weitere Informationen über Optionen
Rasool Ziafaty
Ich weiß, was PIDs sind. Mein Punkt ist, dass das fragliche Beispiel zeigt, dass es mindestens zwei sshdProzesse gibt, zwei PIDs, die Ihrer Beschreibung entsprechen. Welches soll man dann benutzen? und warum? Mit anderen Worten: In Ihrer Antwort sollte ausdrücklich angegeben werden, dass dies die PID sein muss, die sshdden weitergeleiteten Port überwacht ( 39963), nicht die eines anderen (irgendeinen) sshd. Also 1074im Beispiel des OP.
Kamil Maciorowski
1

Wie bereits erwähnt, müssen Sie warten, bis eine Verbindung hergestellt wurde, bevor Sie die Fremdadresse (auf der Remote-Seite) der Verbindung sehen können. Sie können diese Informationen auf zwei Arten abrufen:

Beide Methoden werden asynchron ausgeführt, und Sie müssten die Verbindungsverarbeitung getrennt von verwalten ssh.

laenkeio
quelle