buang koneksi tcp tanpa tcpdump

17

Pada kotak centos, saya ingin membuang koneksi tcp - Saya ingin melihat apakah server mencoba mengirim permintaan ke IP tertentu. Biasanya tcpdump akan melakukan trik - tetapi tcpdump tidak diinstal, dan menginstal perangkat lunak bukanlah suatu pilihan (karena kebijakan perusahaan). Saya khawatir netstat tidak akan menunjukkan kepada saya satu permintaan.

Jadi saya bertanya-tanya apa pilihan lain yang saya miliki. Saya memiliki akses root di server.

Ishak
sumber
Apakah Anda memiliki akses root di server?
user9517
Ya, saya punya akses root.
Isaac
11
Anda juga harus berusaha memperbaiki kebijakan perusahaan. Ketika itu menghentikan Anda dari melakukan pekerjaan Anda, kebijakan itu rusak.
Michael Hampton
1
Ya, kontrol perubahan pada dasarnya merupakan persyaratan FDA - jadi tidak ada yang akan saya ubah dalam hidup ini :)
Isaac

Jawaban:

15

Tentunya Anda punya 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)

Ini akan keluar dengan "GOT TARGET" yang memberikan alamat IP pertandingan yang cocok kembali. Karena TCP harus mengirim sesuatu kembali saat jabat tangan, ini harus menangkap apa pun dari alamat target tertentu. Tidak peduli apakah protokolnya adalah TCP atau UDP (saya juga tidak memeriksa).

Jangan lupa untuk mengubah TARGET dan INTERFACE.

Matthew Ife
sumber
Bagaimana Anda memodifikasi ini untuk juga menangkap paket syn tcp? Karena jika target tidak dapat dijangkau, koneksi yang dicoba tetapi gagal tidak akan muncul.
Isaac
3
Bukankah skrip ini merupakan perangkat lunak baru (sehingga tidak dapat diinstal dalam sistem)?
Vi.
@ Vi dengan logika itu, Anda dapat berargumen bahwa skrip shell apa pun adalah 'perangkat lunak baru'. Tergantung bagaimana Anda mendefinisikan 'perangkat lunak'.
Matthew Ife
1
-1 Maaf, ini adalah solusi yang mengerikan. Tidak hanya membunuh ayam dengan senapan mesin (menulis program untuk melakukan apa yang sudah ada solusinya), tetapi juga merupakan sumber daya CPU yang tak terhingga - tidak perlu menghabiskan sumber daya (jalankan strace pada proses python ... tapi bersiaplah kunci Control-C!), gagal menyelesaikan pertanyaan pengguna dengan benar: Ini akan merespons "GOT TARGET" untuk koneksi TCP yang masuk dan keluar (pengguna meminta "mencoba mengirim permintaan ..."). Akhirnya keluar dengan 1 (menunjukkan kegagalan pada shell) setelah sukses.
Mike S
1
sangat keren, tetapi Anda masih perlu izin tinggi untuk ini. Saya dapatsocket.error: (1, 'Operation not permitted')
Grant Bowman
17

Saya benar-benar mencoba untuk mendapatkan tcpdump. Yang sedang berkata, beberapa alternatif untuk melihat apakah ada koneksi tertentu untuk IP adalah:

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
sumber
1
Itulah jawaban yang saya harapkan. Sayangnya strace tidak dipasang juga: /
Isaac
Saya akan mencoba lsof
Isaac
1
Saya kira poster aslinya menyukai balasannya, tetapi anehnya itu tidak benar-benar menjawab pertanyaannya ("... koneksi tcp - Saya ingin melihat apakah server mencoba mengirim permintaan ke IP tertentu ...). Ini akan memberi Anda informasi koneksi jaringan untuk proses tertentu ... mungkin dia menginginkannya? Bagi orang-orang seperti saya yang datang ke sini mencari informasi tentang koneksi TCP dari satu mesin ke komputer lain, ini mungkin tidak berhasil, tetapi alat peraga untuk menunjukkan sejumlah contoh perintah shell yang berbeda yang memungkinkan Anda mengumpulkan informasi tentang koneksi jaringan Anda
Mike S
15

Iptables memiliki kemampuan debug dan yang dapat digunakan untuk analisis lalu lintas juga.

Solusinya dijelaskan pada URL di bawah ini.

Aturan debugging di Iptables

Sebaiknya baca juga URL berikut untuk mengatur pencatatan hasil penelusuran ke file pilihan Anda.

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

Saya tidak akan menganggap solusi ini sama dengan tcpdump, tetapi dapat dilakukan dengan menggunakan instalasi minimal Centos. Anda harus berhati-hati untuk tidak mengisi disk dengan log, karena tcpdump jauh lebih efisien dalam penggunaan disk. Matikan logging ketika tidak diperlukan.

Anda dapat menggunakan yang berikut ini sebagai templat dasar dalam skrip Anda.

# 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
sumber
8

Jika Anda memerlukan perangkat lunak khusus untuk melakukan pekerjaan Anda, dan tidak diizinkan, Anda tidak membuat kasus bisnis yang baik atau menjual ide-ide Anda kepada orang yang tepat ... atau Anda tidak mengendalikan sistem ini .. .

Jika saya ditugaskan untuk melakukan sesuatu dan memerlukan jenis informasi debug / pemecahan masalah yang Anda perlukan dalam kasus ini, saya akan menggunakan alat yang tepat. Itu mungkin tcpdumpatau tshark. Ya, itu adalah bagian dari perangkat lunak, tetapi saya akan menganggapnya utilitas yang lebih penting . Bahkan, mereka adalah utilitas yang dapat diinstal atau dimuat ke dalam sistem sementara dan dihapus tanpa insiden (apakah media yang dapat dilepas merupakan pilihan? ... petunjuk )

Tetapi intinya adalah bahwa solusi kasar untuk kebijakan perusahaan mungkin membutuhkan lebih banyak upaya daripada mendapatkan persetujuan untuk kasus penggunaan ini.

putih
sumber
Saya sepenuhnya setuju untuk menggunakan alat yang tepat untuk pekerjaan yang tepat. Sebenarnya, saya dapat menginstal perangkat lunak, tetapi kami harus menggunakan kontrol perubahan, jadi prosesnya memakan waktu beberapa hari - saya membutuhkan dump sekarang, jadi menginstal bukanlah pilihan. Saya hanya ingin tahu apakah saya mengabaikan beberapa opsi yang belum dipikirkan.
Isaac
:( tentang manajemen perubahan. Apakah ada cara untuk memainkan permainan politik dan membuat orang / pihak yang akan mendapat manfaat dari dump untuk mempercepat proses manajemen perubahan?
ewwhite
1
Saya takut tidak - tetapi karena itu adalah pelanggan yang membutuhkan manajemen perubahan dan juga tcpdump, ia harus menerima fakta. Aku berharap aku bisa membuatnya bahagia.
Isaac
3
@ewwhite: Setiap kebijakan manajemen perubahan yang baik harus memiliki kemampuan untuk mengecualikan spesifik, atau kelas, dari perubahan melalui proses penuh. Jika yang ini tidak ....
Scott Pack
2
Tidak bisakah Anda mengkompilasi yang terhubung secara statis di tcpdumptempat lain, dan cukup salin ke / tmp dan jalankan dari sana?
che
5

Kyle menawarkan beberapa opsi hebat. Satu lagi adalah menggunakan 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

Ini pada dasarnya adalah aturan akuntansi. Itu tidak secara eksplisit mengizinkan atau menolak lalu lintas, sehingga kebijakan default untuk rantai OUTPUT digunakan (yang default untuk MENERIMA). Namun, paket apa pun yang cocok akan menambah penghitung untuk aturan tersebut.

Anda juga dapat mencatat rincian tentang paket tersebut dengan -j LOGopsi:

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

Log akan menuju ke fasilitas logging kernel, sehingga akan muncul di / var / log / messages tentang turunan Red Hat dan /var/log/kern.log pada turunan Debian. Itu juga akan terlihat di output dmesg, seperti yang ditunjukkan. Tidak seperti tcpdump, bagaimanapun, itu tidak akan mencatat isi lengkap paket, hanya isi header paket.

James Sneeringer
sumber
Saya memikirkan iptables sendiri, tetapi juga tidak diinstal: /. Bagaimanapun, solusi yang bagus.
Isaac
3

Karena server Anda terhubung ke IP tertentu, saya kira itu akan ke port yang juga Anda ketahui?

Bagaimanapun, netstatatau ssdirancang untuk melakukan apa yang Anda inginkan. Anda dapat melakukan hal yang sama dengan salah satu perintah:

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

di mana A.B.C.Dmewakili alamat IPv4, dan n mewakili nomor port yang terhubung ke server Anda di sisi jarak jauh. Sebagai contoh:

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

Atau, jika Anda hanya ingin tahu bahwa koneksi dibuat:

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

Jika Anda tidak tahu nomor port yang Anda coba sambungkan, maka pekerjaan itu akan lebih sulit karena TCP akan membuka port di kedua sisi percakapan untuk data dan paket ACK. Dalam hal ini, Anda bisa menerima alamat IP untuk menunjukkan bahwa koneksi telah dibuat, apakah itu ke atau dari.

Akhirnya, Anda dapat mengulang ini ke isi hati Anda untuk digunakan sebagai alat pemantauan Anda:

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
sumber
Cara hebat untuk memantau tanpa perlu hak kernel yang tinggi.
Grant Bowman