zrzuć połączenia tcp bez tcpdump

17

Na polu centos lubię zrzucać połączenia TCP - chciałbym sprawdzić, czy serwer próbuje wysłać żądania do określonego adresu IP. Zwykle tcpdump załatwi sprawę - ale tcpdump nie jest zainstalowany, a instalacja oprogramowania nie jest opcją (z powodu zasad firmy). Obawiam się, że netstat nie pokaże mi ani jednej prośby.

Zastanawiałem się więc, jakie inne opcje mam. Mam dostęp do roota na serwerze.

Izaak
źródło
Czy masz dostęp do roota na serwerze?
user9517
Tak, mam dostęp do roota.
Izaak,
11
Powinieneś także pracować nad naprawieniem polityki firmy. Gdy przeszkadza ci to w wykonywaniu pracy, zasady są łamane.
Michael Hampton
1
Cóż, zmiana kontroli jest w zasadzie wymogiem FDA - więc nic się nie zmieni w tym życiu :)
Isaac

Odpowiedzi:

15

Na pewno masz 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)

Spowoduje to zamknięcie opcji „GOT TARGET”, podając adres IP, który powraca. Ponieważ TCP musi wysłać coś z powrotem podczas uzgadniania, powinno to wychwycić wszystko z określonego adresu docelowego. Nie obchodzi go jednak, czy protokołem jest TCP czy UDP (i nie sprawdzam).

Nie zapomnij zmienić TARGET i INTERFEJSU.

Matthew Ife
źródło
Jak zmodyfikowałbyś to, aby złapać również pakiet synchronizacji TCP? Ponieważ jeśli cel nie jest osiągalny, próba, ale nieudane połączenie nie zostanie wyświetlone.
Isaac
3
Czy ten skrypt nie jest nowym oprogramowaniem (więc nie należy go instalować w systemie)?
Vi.
@Vi z tą logiką można argumentować, że każdy skrypt powłoki to „nowe oprogramowanie”. To zależy od tego, jak zdefiniujesz „oprogramowanie”.
Matthew Ife
1
-1 Niestety, to okropne rozwiązanie. Nie tylko zabija kurczaka za pomocą karabinu maszynowego (pisanie programu, aby zrobić to, na co już jest rozwiązanie), ale jest to nieskończona pętla - niepotrzebnie zużywa zasoby procesora (uruchom śledzenie w procesie python ... ale poczekaj klawisz Control-C!), nie rozwiązuje poprawnie pytania użytkownika: odpowie „GOT TARGET” zarówno na przychodzące, jak i wychodzące połączenia TCP (użytkownik poprosił o „próbuje wysyłać żądania ...”). Na koniec wychodzi z 1 (wskazując na brak powłoki) po sukcesie.
Mike S
1
bardzo fajnie, ale nadal potrzebujesz do tego podwyższonych uprawnień. Mamsocket.error: (1, 'Operation not permitted')
Grant Bowman,
17

Naprawdę spróbowałbym dostać tcpdump. Biorąc to pod uwagę, niektóre alternatywy, aby sprawdzić, czy istnieje pewne połączenie dla adresu IP, to:

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
źródło
1
To była odpowiedź, na którą liczyłem. Niestety, strace nie został zainstalowany: /
Isaac
Spróbuję lsof
Isaac
1
Wydaje mi się, że oryginalnemu plakatowi spodobała się odpowiedź, ale dziwnie to tak naprawdę nie odpowiada na jego pytanie („... połączenia TCP - chciałbym sprawdzić, czy serwer próbuje wysłać żądania do określonego adresu IP ...). podać informacje o połączeniu sieciowym dla określonego procesu ... może on tego chce? Dla tych, którzy przychodzą tutaj, szukając informacji o połączeniach TCP z jednej maszyny na drugą, może to nie załatwić sprawy. Ale propozycja pokazania wielu różne przykłady poleceń powłoki, które pozwalają zbierać informacje o twoich połączeniach sieciowych
Mike S
15

Iptables ma funkcję debugowania, którą można również wykorzystać do analizy ruchu.

Rozwiązanie opisano w poniższym adresie URL.

Zasady debugowania w Iptables

Warto również przeczytać poniższy adres URL, aby skonfigurować rejestrowanie danych wyjściowych śledzenia w wybranym pliku.

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

Nie uważałbym tego rozwiązania za tcpdump, ale można to zrobić przy minimalnej instalacji Centos. Należy uważać, aby nie zapełnić dysku dziennikami, ponieważ tcpdump jest znacznie bardziej wydajny w użyciu dysku. Wyłącz rejestrowanie, gdy nie jest to wymagane.

Możesz użyć następujących elementów jako podstawowego szablonu w skrypcie.

# 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
źródło
8

Jeśli potrzebujesz konkretnego oprogramowania do wykonywania swojej pracy, a nie możesz, nie robisz dobrego uzasadnienia biznesowego lub nie sprzedajesz swoich pomysłów właściwym osobom ... lub nie masz kontroli nad tym systemem. .

Gdybym miał za zadanie coś zrobić i potrzebowałem tego rodzaju informacji debugowania / rozwiązywania problemów, których potrzebujesz w tym przypadku, użyłbym odpowiedniego narzędzia. To prawdopodobne tcpdumplub tshark. Tak, to są programy, ale uważam je za bardziej niezbędne narzędzia . W rzeczywistości są to narzędzia, które można tymczasowo zainstalować lub załadować do systemu i usunąć bez incydentów (czy nośnik wymienny jest opcją? ... wskazówka )

Ale chodzi o to, że banalne obejście polityki firmy prawdopodobnie wymaga więcej wysiłku niż uzyskanie zgody na ten przypadek użycia.

ewwhite
źródło
Całkowicie zgadzam się na użycie odpowiedniego narzędzia do odpowiedniej pracy. W rzeczywistości mogę zainstalować oprogramowanie, ale musimy użyć kontroli zmian, więc proces ten zajmuje kilka dni - potrzebowałem teraz zrzutu, więc instalacja nie była opcją. Zastanawiałem się tylko, czy przeoczyłem niektóre opcje, o których jeszcze nie myślałem.
Izaak
:( o zarządzaniu zmianami. Czy jest jakiś sposób, aby zagrać w grę polityczną i zachęcić osoby / partie, które skorzystałyby ze zrzutu, do przyspieszenia procesu zarządzania zmianami?
ewwhite
1
Obawiam się, że nie - ale ponieważ klient wymaga zarządzania zmianami, a także tcpdump, będzie musiał zaakceptować fakty. Miałem nadzieję, że i tak go uszczęśliwię.
Izaak,
3
@ewwhite: Każda dobra polityka zarządzania zmianami powinna mieć możliwość zwolnienia określonych lub klas zmian z przejścia przez cały proces. Jeśli to nie ...
Scott Pack
2
Nie możesz skompilować statycznie połączonego tcpdumpgdzie indziej i po prostu skopiować go do / tmp i uruchomić stamtąd?
che
5

Kyle zaoferował kilka świetnych opcji. Jeszcze jednym byłoby użycie 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

Jest to zasadniczo zasada rachunkowości. Nie zezwala wyraźnie na ruch ani go nie odrzuca, dlatego używana jest domyślna polityka dla łańcucha WYJŚCIA (domyślnie AKCEPTUJ). Jednak każdy pasujący pakiet zwiększy liczniki reguły.

Możesz opcjonalnie zapisać szczegóły dotyczące pakietu również za pomocą -j LOGopcji:

[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 ...

Logi trafią do narzędzia do rejestrowania jądra, więc powinny pojawić się w / var / log / messages na pochodnych Red Hat i /var/log/kern.log na pochodnych Debiana. Byłby również widoczny na wyjściu dmesg, jak pokazano. tcpdumpJednak w przeciwieństwie do tego, nie będzie rejestrować całej zawartości pakietu, tylko zawartość nagłówka pakietu.

James Sneeringer
źródło
Myślałem o iptables, ale też nie zainstalowałem: /. W każdym razie fajne rozwiązanie.
Izaak,
3

Ponieważ twój serwer łączy się z określonym adresem IP, zakładam, że będzie to port, o którym również wiesz?

W każdym razie netstatlub sssą zaprojektowane tak, aby robić to, co chcesz. Możesz zrobić to samo z dowolnym poleceniem:

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

gdzie A.B.C.Doznacza adres IPv4 i n numer portu, z którym serwer łączy się po stronie zdalnej. Na przykład:

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

Lub, jeśli chcesz tylko wiedzieć, że połączenie zostało nawiązane:

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

Jeśli nie znasz numeru portu, z którym próbujesz się połączyć, zadanie byłoby trudniejsze, ponieważ TCP otworzy port po obu stronach konwersacji dla danych i pakietów ACK. W takim przypadku możesz po prostu grepować, aby adres IP pokazał, że nawiązano jakiekolwiek połączenie, niezależnie od tego, czy jest to połączenie z, czy z.

Wreszcie możesz zapętlić to do treści twojego serca, aby użyć go jako narzędzia do monitorowania:

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.
źródło
Świetny sposób na monitorowanie bez konieczności zwiększania uprawnień jądra.
Grant Bowman,