vidage des connexions tcp sans tcpdump

17

Sur une boîte centos, j'aime vider les connexions TCP - je voudrais voir si un serveur essaie d'envoyer des requêtes à une certaine IP. Habituellement, tcpdump ferait l'affaire - mais tcpdump n'est pas installé et l'installation de logiciels n'est pas une option (en raison de la politique de l'entreprise). Je crains que netstat ne me montre pas une seule demande.

Je me demandais donc quelles autres options j'avais. J'ai un accès root sur le serveur.

Isaac
la source
Avez-vous un accès root sur le serveur?
user9517
Oui, j'ai un accès root.
Isaac
11
Vous devez également travailler sur la correction de la politique de l'entreprise. Quand cela vous empêche de faire votre travail, la politique est violée.
Michael Hampton
1
Eh bien, le changement de contrôle est fondamentalement une exigence de la FDA - donc rien que je ne changerai dans cette vie :)
Isaac

Réponses:

15

Vous en avez sûrement python?

from socket import * 
from struct import unpack 
import sys 

INTERFACE = "eth0"
TARGET = "8.8.8.8" 

if __name__ == "__main__": 
  sock = socket(AF_PACKET, SOCK_DGRAM, 0x0800) 
  sock.bind((INTERFACE, 0x0800)) 
  while True: 
    data = sock.recvfrom(1500, 0)[0] 
    ip = inet_ntop(AF_INET, data[12:16]) 
    if ip == TARGET: 
      print "GOT TARGET" 
      sys.exit(1)

Cela se terminera par "GOT TARGET" fournissant l'adresse IP qui revient pour les correspondances. Étant donné que TCP doit renvoyer quelque chose lors d'une poignée de main, cela devrait intercepter quoi que ce soit à partir d'une adresse cible spécifique. Il ne se soucie pas si le protocole est TCP ou UDP (et je ne vérifie pas non plus).

N'oubliez pas de changer TARGET et INTERFACE.

Matthew Ife
la source
Comment modifieriez-vous cela pour intercepter également un paquet de synchronisation TCP? Parce que si la cible n'est pas accessible, une connexion tentée mais ayant échoué ne s'affichera pas.
Isaac
3
Ce script n'est-il pas un nouveau logiciel (il ne doit donc pas être installé dans le système)?
Vi.
@Vi avec cette logique, vous pouvez affirmer que tout script shell est un «nouveau logiciel». Cela dépend de la façon dont vous définissez «logiciel».
Matthew Ife
1
-1 Désolé, c'est une terrible solution. Non seulement cela tue un poulet avec une mitrailleuse (écrire un programme pour faire ce pour quoi il existe déjà une solution), mais c'est une boucle infinie - consommant inutilement des ressources CPU (exécutez une séquence sur le processus python ... mais attendez) la touche Control-C!), il ne parvient pas à résoudre correctement la question de l'utilisateur: il répondra "GOT TARGET" aux connexions TCP entrantes et sortantes (l'utilisateur a demandé "essaie d'envoyer des demandes ..."). Enfin, il se termine par 1 (indiquant l'échec du shell) en cas de succès.
Mike S
1
très cool, mais vous avez toujours besoin d'autorisations élevées pour cela. J'ai eusocket.error: (1, 'Operation not permitted')
Grant Bowman
17

J'essaierais vraiment d'obtenir tcpdump. Cela étant dit, quelques alternatives pour voir si une certaine connexion existe pour une IP sont:

strace:

[kbrandt@ny-kbrandt01: ~] strace -e trace=network nc 1.2.3.4 1234
...
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(1234), sin_addr=inet_addr("1.2.3.4")}, 16) = -1 EINPROGRESS (Operation now in progress)

lsof:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11434
[kbrandt@ny-kbrandt01: ~] lsof -p 11434
....
nc      11434 kbrandt    3u  IPv4 4543149      0t0     TCP 10.7.0.78:58886->1.2.3.4:search-agent (SYN_SENT)

netstat:

[kbrandt@ny-kbrandt01: ~] nc 1.2.3.4 1234 &
[1] 11486
[kbrandt@ny-kbrandt01: ~] sudo netstat -a -p | grep 11486
tcp        0      1 10.7.0.78:58891             1.2.3.4:search-agent        SYN_SENT    11486/nc
Kyle Brandt
la source
1
C'était le genre de réponse que j'espérais. Malheureusement, strace n'est pas installé non plus: /
Isaac
Je vais essayer lsof
Isaac
1
Je suppose que l'affiche originale a aimé la réponse, mais curieusement, elle ne répond pas vraiment à sa question ("... connexions TCP - je voudrais voir si un serveur essaie d'envoyer des demandes à une certaine IP ...). vous donner des informations de connexion réseau pour un processus particulier ... peut-être qu'il le veut? Pour ceux comme moi qui viennent ici à la recherche d'informations sur les connexions TCP d'une machine à l'autre, cela pourrait ne pas faire l'affaire. Mais les accessoires pour montrer un certain nombre de différents exemples de commandes shell qui vous permettent de collecter des informations sur vos connexions réseau
Mike S
15

Iptables a une capacité de débogage et peut également être utilisé pour l'analyse du trafic.

La solution est décrite sur l'URL ci-dessous.

Règles de débogage dans Iptables

Il est également utile de lire l'URL suivante pour configurer la journalisation de la sortie de trace dans un fichier de votre choix.

http://backreference.org/2010/06/11/iptables-debugging/

Je ne considérerais pas cette solution comme tcpdump, mais cela peut être fait en utilisant une installation minimale de Centos. Vous devez faire attention à ne pas remplir le disque avec les journaux, car tcpdump est beaucoup plus efficace dans l'utilisation du disque. Désactivez la journalisation lorsqu'elle n'est pas requise.

Vous pouvez utiliser ce qui suit comme modèle de base dans votre script.

# Logging
log(){
SOURCE=a.b.c.d (IP address)
$IPT -A INPUT   -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "In: "
$IPT -A OUTPUT  -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Out: "
$IPT -A FORWARD -s $SOURCE -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Fw: "
$IPT -t nat -A POSTROUTING -m limit --limit 50/minute -j LOG --log-level 7 --log-prefix "Nat: "
}
#log  (remove comment to enable)

trace(){
iptables -t raw -A PREROUTING -p tcp  -j TRACE
iptables -t raw -A OUTPUT     -p tcp  -j TRACE
}
#trace (remove comment to enable)
John Auld
la source
8

Si vous avez besoin d'un logiciel spécifique pour faire votre travail, et que vous n'êtes pas autorisé à le faire, vous ne faites pas une bonne analyse de rentabilisation ou ne vendez pas vos idées aux bonnes personnes ... ou vous ne contrôlez pas ce système. .

Si j'étais chargé de faire quelque chose et que j'avais besoin du type d'informations de débogage / dépannage dont vous avez besoin dans ce cas, j'utiliserais le bon outil. C'est probable tcpdumpou tshark. Oui, ce sont des logiciels, mais je les considérerais comme des utilitaires plus essentiels . En fait, ce sont des utilitaires qui pourraient être installés ou chargés sur le système temporairement et supprimés sans incident (les supports amovibles sont-ils une option? ... indice )

Mais le fait est qu'une solution de contournement à la politique de l'entreprise nécessite probablement plus d'efforts que d'obtenir l'approbation pour ce cas d'utilisation.

ewwhite
la source
Je suis entièrement d'accord sur l'utilisation du bon outil pour le bon travail. En fait, je peux installer un logiciel, mais nous devons utiliser le contrôle des modifications, donc le processus prend quelques jours - j'avais besoin du vidage en ce moment, donc l'installation n'était pas une option. Je me demandais simplement si j'avais négligé certaines options auxquelles je n'avais pas encore pensé.
Isaac
:( à propos de la gestion du changement. Y a-t-il un moyen de jouer à un jeu politique et d'amener les personnes / partis qui bénéficieraient de la décharge à accélérer le processus de gestion du changement?
ewwhite
1
Je crains que non - mais comme c'est le client qui a besoin de gestion du changement et aussi de tcpdump, il devra accepter les faits. J'espérais pouvoir le rendre heureux de toute façon.
Isaac
3
@ewwhite: Toute bonne politique de gestion des changements doit avoir la capacité d'exempter des changements spécifiques ou des classes de changements de passer par le processus complet. Si celui-ci ne fonctionne pas ....
Scott Pack
2
Ne pouvez-vous pas compiler un lien statique tcpdumpailleurs, et simplement le copier dans / tmp et l'exécuter à partir de là?
che
5

Kyle a offert d'excellentes options. Un autre serait d'utiliser iptables:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32
...
[james@server ~]$ sudo iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 105 packets, 35602 bytes)
 pkts bytes target  prot opt in  out  source      destination
   87 33484 LOG     all  --  *   *    0.0.0.0/0   1.2.3.4     LOG flags 0 level 4

Il s'agit essentiellement d'une règle comptable. Il n'autorise ni ne refuse explicitement le trafic, de sorte que la stratégie par défaut pour la chaîne OUTPUT est utilisée (qui est par défaut ACCEPT). Cependant, tout paquet correspondant incrémentera les compteurs de la règle.

Vous pouvez également enregistrer des détails sur le paquet avec l' -j LOGoption:

[james@server ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32 -j LOG
...
[james@server ~]@ dmesg | grep 1.2.3.4 | tail -1
IN= OUT=eth0 SRC=192.168.1.1 DST=1.2.3.4 LEN=100 TOS=0x10 PREC=0x00 TTL=64 ...

Les journaux iront à la fonction de journalisation du noyau, donc ils devraient apparaître dans / var / log / messages sur les dérivés de Red Hat et /var/log/kern.log sur les dérivés de Debian. Il serait également visible dans la sortie de dmesg, comme indiqué. Contrairement à tcpdump, cependant, il n'enregistrera pas le contenu complet du paquet, seulement le contenu de l'en-tête du paquet.

James Sneeringer
la source
Je pensais moi-même à iptables, mais pas non plus installé: /. Quoi qu'il en soit, belle solution.
Isaac
3

Étant donné que votre serveur se connecte à une certaine IP, je suppose que ce sera vers un port que vous connaissez également?

Dans tous les cas, netstatou sssont conçus pour faire ce que vous voulez. Vous pouvez faire de même avec l'une ou l'autre des commandes:

netstat -n -t | awk '{print $5}' | grep A.B.C.D:n
ss      -n -t | awk '{print $5}' | grep A.B.C.D:n

A.B.C.Dreprésente une adresse IPv4 et n représente un numéro de port auquel votre serveur se connecte du côté distant. Par exemple:

ss      -n -t | awk '{print $5}' | grep 10.137.54.22:3389

Ou, si vous souhaitez simplement savoir que la connexion est établie:

ss      -n -t | awk '{print $5}' | grep -q 10.137.54.22:3389 && echo "CONNECTION MADE"

Si vous ne connaissez pas le numéro de port auquel vous essayez de vous connecter, la tâche sera plus difficile car TCP ouvrira un port des deux côtés de la conversation pour les données et les paquets ACK. Dans ce cas, vous pouvez simplement chercher l'adresse IP pour montrer que toute connexion a été établie, que ce soit vers ou depuis.

Enfin, vous pouvez boucler cela au contenu de votre cœur pour l'utiliser comme outil de surveillance:

while true; do
    ss -n -t | awk '{print $5}' | grep -q A.B.C.D:n && \
        echo "CONNECTION MADE" && \
        exit 0
    sleep 1
done
Mike S
la source
Excellent moyen de surveiller sans avoir besoin de privilèges élevés du noyau.
Grant Bowman