ดัมพ์การเชื่อมต่อ tcp โดยไม่มี tcpdump


17

บนกล่อง centos ฉันต้องการถ่ายโอนข้อมูลการเชื่อมต่อ tcp - ฉันต้องการดูว่าเซิร์ฟเวอร์พยายามส่งคำขอไปยัง IP ที่แน่นอนหรือไม่ โดยทั่วไปแล้ว tcpdump จะทำการหลอกลวง - แต่ไม่ได้ติดตั้ง tcpdump และการติดตั้งซอฟต์แวร์ไม่ใช่ตัวเลือก (เนื่องจากนโยบายของ บริษัท ) ฉันกลัวว่า netstat จะไม่แสดงคำขอเดียวให้ฉัน

ดังนั้นฉันสงสัยตัวเลือกอื่น ๆ ที่ฉันมี ฉันมีสิทธิ์เข้าถึงรูทบนเซิร์ฟเวอร์


คุณมีสิทธิ์เข้าถึงรูทบนเซิร์ฟเวอร์หรือไม่?
user9517

ใช่ฉันมีสิทธิ์เข้าถึงระดับรูท
Isaac

11
คุณควรดำเนินการแก้ไขนโยบายของ บริษัท เมื่อมันหยุดคุณจากการทำงานนโยบายจะถูกทำลาย
Michael Hampton

1
ดีการควบคุมการเปลี่ยนแปลงพื้นความต้องการขององค์การอาหารและยาของมัน - ดังนั้นไม่มีอะไรที่ฉันจะมีการเปลี่ยนแปลงในชีวิตนี้ :)
ไอแซก

คำตอบ:


15

แน่นอนคุณมี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)

การดำเนินการนี้จะออกด้วย "GOT TARGET" ซึ่งจะให้ที่อยู่ IP กลับมาที่การแข่งขัน เนื่องจาก TCP ต้องส่งบางสิ่งกลับมาในระหว่างการจับมือจึงควรจับอะไรจากที่อยู่เป้าหมายที่เฉพาะเจาะจง มันไม่สนใจว่าโพรโทคอลเป็น TCP หรือ UDP แม้ว่า (หรือฉันจะตรวจสอบ)

อย่าลืมเปลี่ยนเป้าหมายและอินเตอร์เฟซ


คุณจะแก้ไขสิ่งนี้อย่างไรเพื่อดักจับ tcp syn packet? เพราะหากเป้าหมายไม่สามารถเข้าถึงได้การเชื่อมต่อที่พยายาม แต่ล้มเหลวจะไม่ปรากฏขึ้น
Isaac

3
สคริปต์นี้ไม่ใช่ซอฟต์แวร์ใหม่ (เพื่อไม่ให้ติดตั้งในระบบ)
วิ

@Vi ด้วยตรรกะนั้นคุณสามารถยืนยันว่าเชลล์สคริปต์ใด ๆ คือ 'ซอฟต์แวร์ใหม่' ขึ้นอยู่กับว่าคุณกำหนด 'ซอฟต์แวร์'
Matthew Ife

1
-1 ขออภัยนี่เป็นวิธีแก้ปัญหาที่แย่มาก ไม่เพียง แต่มันจะฆ่าไก่ด้วยปืนกล (เขียนโปรแกรมเพื่อทำสิ่งที่มีอยู่แล้วในการแก้ปัญหา) แต่มันเป็นวงที่ไม่สิ้นสุดที่ต้องใช้ทรัพยากร CPU โดยไม่จำเป็น (เรียกใช้ strace บนกระบวนการหลาม ... แต่สนับสนุน คีย์ Control-C!) ไม่สามารถแก้คำถามของผู้ใช้ได้อย่างถูกต้อง: จะตอบสนอง "GOT TARGET" กับการเชื่อมต่อ TCP ทั้งขาเข้าและขาออก (ผู้ใช้ถามว่า "พยายามส่งคำขอ ... ") ในที่สุดมันจะออกด้วย 1 (บ่งชี้ความล้มเหลวของเชลล์) เมื่อประสบความสำเร็จ
Mike S

1
เจ๋งมาก แต่คุณยังต้องได้รับการอนุญาตสำหรับสิ่งนี้ ฉันได้รับsocket.error: (1, 'Operation not permitted')
โบว์แมน

17

ฉันพยายามรับ tcpdump จริงๆ ทางเลือกบางอย่างเพื่อดูว่ามีการเชื่อมต่อบางอย่างสำหรับ IP หรือไม่:

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

1
นั่นคือคำตอบที่ฉันหวังไว้ ขออภัยไม่ได้ติดตั้งอย่างแน่นอน: /
ไอแซค

ฉันจะลอง lsof
Isaac

1
ฉันเดาว่าผู้โพสต์ดั้งเดิมชอบคำตอบ แต่แปลก ๆ ที่มันไม่ตอบคำถามของเขา ("... การเชื่อมต่อ tcp - ฉันต้องการดูว่าเซิร์ฟเวอร์พยายามส่งคำขอไปยัง IP ที่แน่นอน ... ) สิ่งเหล่านี้จะ ให้ข้อมูลการเชื่อมต่อเครือข่ายสำหรับกระบวนการเฉพาะ ... บางทีเขาต้องการอย่างนั้นหรือสำหรับคนอย่างฉันที่มาที่นี่กำลังมองหาข้อมูลเกี่ยวกับการเชื่อมต่อ TCP จากเครื่องหนึ่งไปยังเครื่องถัดไปสิ่งนี้อาจไม่ได้หลอกลวง ตัวอย่างคำสั่งเชลล์ที่แตกต่างกันซึ่งอนุญาตให้คุณรวบรวมข้อมูลเกี่ยวกับการเชื่อมต่อเครือข่ายของคุณ
Mike S

15

Iptables มีความสามารถในการตรวจแก้จุดบกพร่องและสามารถใช้สำหรับการวิเคราะห์ทราฟฟิกได้เช่นกัน

การแก้ปัญหาอธิบายไว้ใน URL ด้านล่าง

การดีบักกฎใน Iptables

นอกจากนี้ยังควรอ่าน URL ต่อไปนี้เพื่อตั้งค่าการบันทึกการติดตามผลลัพธ์ไปยังไฟล์ที่คุณเลือก

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

ฉันจะไม่พิจารณาโซลูชันนี้เท่ากับ tcpdump แต่สามารถทำได้โดยใช้ Centos น้อยที่สุด คุณต้องระวังอย่าเติมดิสก์ด้วยบันทึกเพราะ tcpdump มีประสิทธิภาพมากขึ้นในการใช้ดิสก์ ปิดการบันทึกเมื่อไม่จำเป็น

คุณสามารถใช้สิ่งต่อไปนี้เป็นแม่แบบพื้นฐานในสคริปต์ของคุณ

# 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)

8

หากคุณต้องการซอฟต์แวร์เฉพาะเพื่อทำงานของคุณและไม่ได้รับอนุญาตคุณไม่ได้ทำเรื่องธุรกิจหรือขายความคิดของคุณให้กับคนที่ใช่ ... หรือคุณไม่สามารถควบคุมระบบนี้ได้ .

หากฉันได้รับมอบหมายให้ทำบางสิ่งบางอย่างและต้องการประเภทของการแก้ไขข้อบกพร่อง / ข้อมูลการแก้ไขปัญหาที่คุณต้องการในกรณีนี้ฉันจะใช้เครื่องมือที่เหมาะสม ที่มีแนวโน้มหรือtcpdump tsharkใช่มันเป็นซอฟต์แวร์ชิ้นหนึ่ง แต่ฉันคิดว่าพวกเขาจำเป็นต้องใช้ยูทิลิตี้เพิ่มเติม ในความเป็นจริงพวกเขาเป็นสาธารณูปโภคที่สามารถติดตั้งหรือโหลดลงในระบบชั่วคราวและลบออกโดยไม่เกิดปัญหา (เป็นตัวเลือกสื่อที่ถอดออกได้หรือไม่ ... คำใบ้ )

แต่ประเด็นก็คือการแก้ไขปัญหานโยบาย บริษัท อย่างจริงจังอาจต้องใช้ความพยายามมากกว่าการได้รับการอนุมัติสำหรับกรณีการใช้งานนี้


ฉันเห็นด้วยอย่างสมบูรณ์เกี่ยวกับการใช้เครื่องมือที่เหมาะสมสำหรับงานที่เหมาะสม ในความเป็นจริงฉันสามารถติดตั้งซอฟต์แวร์ได้ แต่เราต้องใช้การควบคุมการเปลี่ยนแปลงดังนั้นกระบวนการใช้เวลาสองสามวัน - ฉันต้องการถ่ายโอนข้อมูลทันทีดังนั้นการติดตั้งจึงไม่ใช่ตัวเลือก ฉันแค่สงสัยว่าถ้าฉันมองข้ามตัวเลือกบางอย่างยังไม่ได้คิด
Isaac

:( เกี่ยวกับการจัดการการเปลี่ยนแปลงมีวิธีใดที่จะเล่นเกมทางการเมืองและรับคน / บุคคลที่จะได้รับประโยชน์จากการถ่ายโอนข้อมูลเพื่อติดตามกระบวนการจัดการการเปลี่ยนแปลงอย่างรวดเร็ว?
ewwhite

1
ฉันไม่กลัว - แต่เนื่องจากลูกค้าที่ต้องการการจัดการการเปลี่ยนแปลงและยัง tcpdump เขาจะต้องยอมรับข้อเท็จจริง ฉันหวังว่าฉันจะทำให้เขามีความสุข แต่อย่างใด
Isaac

3
@ewwhite: นโยบายการจัดการการเปลี่ยนแปลงใด ๆ ที่ดีควรมีความสามารถในการยกเว้นเฉพาะหรือคลาสของการเปลี่ยนแปลงจากการทำตามกระบวนการทั้งหมด ถ้าอันนี้ไม่ ....
Pack Pack

2
คุณไม่สามารถรวบรวมลิงก์แบบคงtcpdumpที่ที่อื่นและเพียงแค่คัดลอกไปยัง / tmp และเรียกใช้จากที่นั่น?
che

5

ไคล์เสนอตัวเลือกที่ยอดเยี่ยม อีกหนึ่งจะใช้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

นี่คือกฎการบัญชีเป็นหลัก ไม่อนุญาตหรือปฏิเสธทราฟฟิกอย่างชัดเจนดังนั้นจึงใช้นโยบายเริ่มต้นสำหรับเครือข่าย OUTPUT (ซึ่งเป็นค่าเริ่มต้นสำหรับ ACCEPT) อย่างไรก็ตามแพ็คเก็ตที่ตรงกันใด ๆ จะเพิ่มตัวนับสำหรับกฎ

คุณสามารถเลือกที่จะบันทึกรายละเอียดเกี่ยวกับแพ็กเก็ตด้วย-j LOGตัวเลือก:

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

บันทึกจะไปที่สิ่งอำนวยความสะดวกการบันทึกเคอร์เนลดังนั้นจึงควรแสดงใน / var / log / ข้อความเกี่ยวกับ Red Hat Derivatives และ /var/log/kern.log บน Debian อนุพันธ์ มันจะสามารถมองเห็นได้ในผลลัพธ์ของdmesgตามที่แสดง ซึ่งแตกต่างจากtcpdumpอย่างไรก็ตามมันจะไม่บันทึกเนื้อหาทั้งหมดของแพ็คเก็ตเพียงเนื้อหาของส่วนหัวแพ็คเก็ต


ฉันคิดว่า iptables ตัวเอง แต่ยังไม่ได้ติดตั้ง: / อย่างไรก็ตามทางออกที่ดี
Isaac

3

เนื่องจากเซิร์ฟเวอร์ของคุณเชื่อมต่อกับ IP ที่แน่นอนฉันคิดว่ามันจะเป็นพอร์ตที่คุณมีความรู้ด้วย?

ไม่ว่าในกรณีใดnetstatหรือssถูกออกแบบมาเพื่อทำสิ่งที่คุณต้องการ คุณสามารถทำเช่นเดียวกันกับคำสั่งใด:

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.Dแทนที่อยู่ IPv4 และn แสดงหมายเลขพอร์ตที่เซิร์ฟเวอร์ของคุณเชื่อมต่ออยู่ที่ด้านระยะไกล ตัวอย่างเช่น:

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

หรือหากคุณต้องการทราบว่ามีการเชื่อมต่อ:

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

หากคุณไม่ทราบหมายเลขพอร์ตที่คุณพยายามเชื่อมต่องานจะยากขึ้นเนื่องจาก TCP จะเปิดพอร์ตทั้งสองด้านของการสนทนาสำหรับข้อมูลและแพ็กเก็ต ACK ในกรณีนี้คุณสามารถ grep สำหรับที่อยู่ IP เพื่อแสดงว่ามีการเชื่อมต่อใด ๆ ไม่ว่าจะเป็นไปหรือมาจาก

สุดท้ายคุณสามารถวนสิ่งนี้เข้ากับเนื้อหาหัวใจเพื่อใช้เป็นเครื่องมือตรวจสอบของคุณ:

while true; do
    ss -n -t | awk '{print $5}' | grep -q A.B.C.D:n && \
        echo "CONNECTION MADE" && \
        exit 0
    sleep 1
done

วิธีที่ยอดเยี่ยมในการตรวจสอบโดยไม่ต้องใช้สิทธิ์เคอร์เนลที่ยกระดับ
โบว์แมน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.