it-swarm.com.de

Wie kann man Ports untersuchen, die von einem bestimmten Prozess unter Linux geöffnet wurden?

Angenommen, die PID des Prozesses ist bereits bekannt

47
omg
netstat --all --program | grep '3265'
  • --all Zeige hörende und nicht hörende Buchsen.
  • --program Zeigt die PID und den Namen des Programms an, zu dem der Socket gehört.

Sie können auch einen Port-Scanner wie Nmap verwenden.

75
Jorge Zuanon

Sie können den folgenden Befehl verwenden:

lsof -i -P |grep pid
20
Waveter

Als Randnotiz liest netstat -ao die Datei/proc/ PID /tcp etc, um die vom Prozess geöffneten Ports anzuzeigen. Dies bedeutet, dass seine Leseinformationen vom System (dem Linux-Kernel) geliefert werden und in keiner Weise direkt auf die Netzwerkschnittstelle oder andere Mittel gerichtet sind. Gleiches gilt für lsof.

Wenn Sie dies aus Sicherheitsgründen tun, ist dies fehlgeschlagen. Sie sollten der Ausgabe von netstat niemals (NIEMALS) vertrauen, auch wenn Sie zu 100% sicher sind, dass Sie tatsächlich ein echtes netstat-Programm (im Gegensatz zu einer trojanisierten Version) oder ein anderes Programm ausführen, das das/proc-Dateisystem liest. Einige Leute scheinen zu glauben, dass netstat, ls, ps oder andere Standard-Unix-Tools irgendeine Art von Magie ausführen und Informationen aus den Quellen abfragen. Die Wahrheit ist, dass sie alle auf das/proc-Dateisystem angewiesen sind, um alle ihre Daten abzurufen. die leicht von einem Rootkit oder Hypervisor unterwandert werden kann.

11
daniel

Sie können das Befehlszeilenprogramm netstat mit dem Befehlszeilenargument -p Verwenden:

-p (Linux):

Prozess: Zeigen Sie an, welche Prozesse welche Sockets verwenden (ähnlich wie -b Unter Windows). Sie müssen root sein, um dies zu tun.

Das Beispielabschnitt gibt dieses Beispiel:

So zeigen Sie alle Ports an, die von einem Prozess mit der ID $PID Geöffnet wurden:

netstat -ao | grep '\b'$PID'\b'
6
lothar

Bei einigen eingebetteten Geräten oder mit einer alten Linux-Version ist das Problem, dass netstat nicht --process oder -p Optionen verfügbar.

Das folgende Skript zeigt Prozess mit seiner IP und Port, Sie müssen root sein.

#!/bin/bash

for protocol in tcp udp ; 
do 
    #echo "protocol $protocol" ; 
    for ipportinode in `cat /proc/net/tcp | awk '/.*:.*:.*/{print $2"|"$3"|"$10 ;}'` ; 
    do 
        #echo "#ipportinode=$ipportinode"
        inode=`echo "$ipportinode" | cut -d"|" -f3` ;
        if [ "#$inode" = "#" ] ; then continue ; fi 
        lspid=`ls -l /proc/*/fd/* 2>/dev/null | grep "socket:\[$inode\]" 2>/dev/null` ; 
        pid=`echo "lspid=$lspid" | awk 'BEGIN{FS="/"} /socket/{print $3}'` ;
        if [ "#$pid" = "#" ] ; then continue ; fi
        exefile=`ls -l /proc/$pid/exe | awk 'BEGIN{FS=" -> "}/->/{print $2;}'`
        #echo "$protocol|$pid|$ipportinode" 
        echo "$protocol|$pid|$ipportinode|$exefile" | awk '
            BEGIN{FS="|"}
            function iphex2dec(ipport){ 
                ret=sprintf("%d.%d.%d.%d:    %d","0x"substr(ipport,1,2),"0x"substr(ipport,3,2),
                "0x"substr(ipport,5,2),"0x"substr(ipport,7,2),"0x"substr(ipport,10,4)) ;
                if( ret == "0.0.0.0:0" ) #compatibility others awk versions 
                {
                    ret=        strtonum("0x"substr(ipport,1,2)) ;
                    ret=ret "." strtonum("0x"substr(ipport,3,2)) ;
                    ret=ret "." strtonum("0x"substr(ipport,5,2)) ;
                    ret=ret "." strtonum("0x"substr(ipport,7,2)) ;
                    ret=ret ":" strtonum("0x"substr(ipport,10)) ;
                }
                return ret ;
            }
            { 
            print $1" pid:"$2" local="iphex2dec($3)" remote="iphex2dec($4)" inode:"$5" exe=" $6 ;  
            }
            ' ; 
        #ls -l /proc/$pid/exe ; 
    done ; 
done

Die Ausgabe ist wie folgt:

tcp pid:1454 local=1.0.0.127:5939 remote=0.0.0.0:0 inode:13955 exe=/opt/teamviewer/tv_bin/teamviewerd
tcp pid:1468 local=1.1.0.127:53 remote=0.0.0.0:0 inode:12757 exe=/usr/sbin/dnsmasq
tcp pid:1292 local=0.0.0.0:22 remote=0.0.0.0:0 inode:12599 exe=/usr/sbin/sshd
tcp pid:4361 local=1.0.0.127:631 remote=0.0.0.0:0 inode:30576 exe=/usr/sbin/cupsd
tcp pid:1375 local=1.0.0.127:5432 remote=0.0.0.0:0 inode:12650 exe=/usr/lib/postgresql/9.3/bin/postgres
2
abrusa

Ich habe die IPv6-Unterstützung hinzugefügt und einige Korrekturen vorgenommen. Außerdem sind auf meinem System die Oktette der IP-Adresse umgekehrt. Abhängigkeiten bestehen nur darin, Shell, awk und cut zu positionieren.

Meine Version finden Sie auf Github

#!/bin/sh


# prints all open ports from /proc/net/* 
#
# for pretty output (if available) start with 
# ./linux-get-programm-to-port.sh | column -t -s $'\t' 


#set -x

ip4hex2dec () {
    local ip4_1octet="0x${1%???????????}"

    local ip4_2octet="${1%?????????}"
    ip4_2octet="0x${ip4_2octet#??}"

    local ip4_3octet="${1%???????}"
    ip4_3octet="0x${ip4_3octet#????}"

    local ip4_4octet="${1%?????}"
    ip4_4octet="0x${ip4_4octet#??????}"

    local ip4_port="0x${1##*:}"

    # if not used inverse
    #printf "%d.%d.%d.%d:%d" "$ip4_1octet" "$ip4_2octet" "$ip4_3octet" "$ip4_4octet" "$ip4_port"
    printf "%d.%d.%d.%d:%d" "$ip4_4octet" "$ip4_3octet" "$ip4_2octet" "$ip4_1octet" "$ip4_port"
}


# reoder bytes, byte4 is byte1 byte2 is byte3 ...
reorderByte(){
    if [ ${#1} -ne 8 ]; then echo "missuse of function reorderByte"; exit; fi

    local byte1="${1%??????}"

    local byte2="${1%????}"
    byte2="${byte2#??}"

    local byte3="${1%??}"
    byte3="${byte3#????}"

    local byte4="${1#??????}"

    echo "$byte4$byte3:$byte2$byte1"
}

# on normal intel platform the byte order of the ipv6 address in /proc/net/*6 has to be reordered.
ip6hex2dec(){
    local ip_str="${1%%:*}"
    local ip6_port="0x${1##*:}"
    local ipv6="$(reorderByte ${ip_str%????????????????????????})"
    local shiftmask="${ip_str%????????????????}"
    ipv6="$ipv6:$(reorderByte ${shiftmask#????????})"
    shiftmask="${ip_str%????????}"
    ipv6="$ipv6:$(reorderByte ${shiftmask#????????????????})"
    ipv6="$ipv6:$(reorderByte ${ip_str#????????????????????????})"
    ipv6=$(echo $ipv6 | awk '{ gsub(/(:0{1,3}|^0{1,3})/, ":"); sub(/(:0)+:/, "::");print}')
    printf "%s:%d" "$ipv6" "$ip6_port"
}

for protocol in tcp tcp6 udp udp6 raw raw6; 
do 
    #echo "protocol $protocol" ; 
    for ipportinode in `cat /proc/net/$protocol | awk '/.*:.*:.*/{print $2"|"$3"|"$10 ;}'` ; 
    do 
        #echo "#ipportinode=$ipportinode"
        inode=${ipportinode##*|}
        if [ "#$inode" = "#" ] ; then continue ; fi 

        lspid=`ls -l /proc/*/fd/* 2>/dev/null | grep "socket:\[$inode\]" 2>/dev/null` ; 
        pids=`echo "$lspid" | awk 'BEGIN{FS="/"} /socket/{pids[$3]} END{for (pid in pids) {print pid;}}'` ;  # removes duplicats for this pid
        #echo "#lspid:$lspid  #pids:$pids"

        for pid in $pids; do
            if [ "#$pid" = "#" ] ; then continue ; fi
            exefile=`ls -l /proc/$pid/exe | awk 'BEGIN{FS=" -> "}/->/{print $2;}'`;
            cmdline=`cat /proc/$pid/cmdline`

            local_adr_hex=${ipportinode%%|*}
            remote_adr_hex=${ipportinode#*|}
            remote_adr_hex=${remote_adr_hex%%|*}

            if [ "#${protocol#???}" = "#6" ]; then
                local_adr=$(ip6hex2dec $local_adr_hex)
                remote_adr=$(ip6hex2dec $remote_adr_hex)
            else
        local_adr=$(ip4hex2dec $local_adr_hex)
        remote_adr=$(ip4hex2dec $remote_adr_hex)
            fi 

            echo "$protocol pid:$pid \t$local_adr \t$remote_adr \tinode:$inode \t$exefile $cmdline" 
    done
    done  
done
1
wof

Mit ls können Sie die Prozessroute kennen.

Beispiel:

fuser 25/tcp

Der Befehl fuser besagt, dass der Prozess 2054 lautet

ls -l /proc/2054/exe

Der Prozesspfad wird angezeigt

Auszug aus: https://www.sysadmit.com/2018/06/linux-que-proceso-usa-un-puerto.html

Bildbeispiel

0
Jimmy Olsen