
Ich habe mit DTrace unter Mac OS X herumgespielt und das folgende Skript gefunden, das Informationen über hergestellte Verbindungen ausgibt:
$ Katze Skript.d
syscall::connect:entry
{
printf("execname: %s\n", execname);
printf("pid: %d\n", pid);
printf("sockfd: %d\n",arg0);
socks = (struct sockaddr*)copyin(arg1, arg2);
hport = (uint_t)socks->sa_data[0];
lport = (uint_t)socks->sa_data[1];
hport <<= 8;
port = hport + lport;
printf("Port number: %d\n", port); printf("IP address: %d.%d.%d.%d\n",
socks->sa_data[2],
socks->sa_data[3],
socks->sa_data[4],
socks->sa_data[5]);
printf("======\n");
}
Ich führe es in einem Fenster aus:
$ sudo dtrace -s ./script.d
Dann stelle ich von einem anderen Fenster aus per SSH eine Verbindung zu einem anderen Rechner her. In meinem dtrace-Fenster erhalte ich folgende Ausgabe:
CPU ID FUNCTION:NAME
0 18696 connect:entry execname: ssh
pid: 5446
sockfd: 3
Port number: 22
IP address: 192.168.0.207
======
0 18696 connect:entry execname: ssh
pid: 5446
sockfd: 5
Port number: 12148
IP address: 109.112.47.108
======
^C
Die erste IP-Adresse, die ich erklären kann (192.168.0.207), ist die Maschine, mit der ich mich verbinde. Aber was ist mit der Maschine 109.112.47.108? Sie erscheint weder in tcpdump noch in netstat -an
Stimmt etwas mit meinem Dtrace-Code nicht oder mit meinem Verständnis der Funktionsweise des Connect-Systemaufrufs?
Antwort1
Ich glaube, ich habe es herausgefunden. Es liegt daran, dass das Dtrace-Skript, das ich von einer Solarius-Site heruntergeladen habe, für BSD geändert werden muss.
Antwort2
Versuchen Sie, einen Traceroute zu dieser Adresse durchzuführen und sehen Sie, wo sie sich befindet. Wenn sie nur ein paar Hops entfernt ist, handelt es sich wahrscheinlich um eine Firewall oder einen Switch.
Antwort3
Es handelt sich um eine Vodafone-IP-Adresse in Italien. Sind Sie mit einem ISP in Europa/Italien verbunden? Wenn nicht, sollten Sie sich Sorgen machen.
Antwort4
Was sagt das grep 'sshd.*from' secure.log
? Wenn sich jemand außer Ihnen über SSH angemeldet hat, liegt ein Problem vor. Wenn nicht, liegt wahrscheinlich einerfolgloser Brute-Force-Versuch. Verwenden Sie DenyHosts oder Fail2Ban?
Ich kann keine Dokumentation zu syscall::connect finden, aber es sieht so aus, als ob beide Enden des Sockets ausgedruckt werden. Was passiert, wenn Sie das Skript ausführen und sich per SSH von einem anderen Computer aus anmelden?