дамп tcp-з'єднання без tcpdump

На коробці centos, я люблю скидати tcp-з'єднання - я хотів би бачити, чи намагається сервер надсилати запити до певного IP-адреси. Звичайно tcpdump зробить свою справу - але tcpdump не встановлено, а встановлення програмного забезпечення не є можливим (через політику компанії). Боюся, що netstat не покаже мені жодного запиту.

Таким чином я дивувався які інші варіанти я маю. У мене є кореневий доступ на сервері.

13
Чи є у вас кореневий доступ на сервері?
додано Автор T. Verron, джерело
Ви також повинні працювати над фіксуванням політики компанії. Коли це перешкоджає виконувати свою роботу, політика порушена.
додано Автор Michael Hampton, джерело
Так, у мене є кореневий доступ.
додано Автор Isaac, джерело
Ну, змінити контроль його в основному вимога FDA - так нічого я не змінюся в цьому житті :)
додано Автор Isaac, джерело

6 Відповіді

Напевно, у вас є 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 хоч (і я не перевіряю).

Не забудьте змінити TARGET і INTERFACE.

15
додано
-1 Вибачте, це жахливе рішення. Це не тільки вбиває курча з кулеметом (написання програми для того, що вже є рішенням), але це нескінченний цикл - непотрібне споживання ресурсів процесора (запускати strace на процесі python ... клавіша Control-C!), вона не може правильно вирішити запитання користувача: вона відповість "GOT TARGET" як на вхідні, так і на вихідні TCP-з'єднання (користувач запитав "намагається надіслати запити ..."). Нарешті, він виходить з 1 (вказує на відмову оболонки) після успіху.
додано Автор Mike S, джерело
Його жахливе рішення, зібране за лічені хвилини! Для досить кульгавої «політики компанії». Реальним рішенням є більш гнучка політика програмного забезпечення.
додано Автор Matthew Ife, джерело
@Vi з цією логікою, ви можете стверджувати, що будь-який сценарій оболонки - це «нове програмне забезпечення». Це залежить від того, як ви визначаєте "програмне забезпечення".
додано Автор Matthew Ife, джерело
@MatthewIfe, І як один визначає "встановлений". Цей аргумент може бути використаний проти такої спрощеної політики.
додано Автор Martin, джерело
Хіба цей сценарій не є новим програмним забезпеченням (так що його не слід встановлювати в системі)?
додано Автор Martin, джерело
Як ви могли б змінити це, щоб також зловити пакет TCP син? Оскільки, якщо ціль не досягнута, під час спроби, але не підключення, показ не відбудеться.
додано Автор Isaac, джерело
Працює як шарм!
додано Автор Isaac, джерело
Ей, це найхолодніше рішення досі - чудово!
додано Автор Isaac, джерело
дуже здорово, але вам все ще потрібні підвищені дозволи для цього. Я отримав socket.error: (1, "Операція не дозволена")
додано Автор Grant Bowman, джерело

Iptables має функцію налагодження, яка також може бути використана для аналізу трафіку.

Рішення описано на URL-адресі нижче.

Debugging rules in 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)
15
додано

Я дійсно намагаюся отримати tcpdump. При цьому, деякі альтернативи, щоб побачити, чи існує певне з'єднання для IP-адреси:

strace:

[[email protected]: ~] 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:

[[email protected]: ~] nc 1.2.3.4 1234 &
[1] 11434
[[email protected]: ~] 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:

[[email protected]: ~] nc 1.2.3.4 1234 &
[1] 11486
[[email protected]: ~] sudo netstat -a -p | grep 11486
tcp        0      1 10.7.0.78:58891             1.2.3.4:search-agent        SYN_SENT    11486/nc
14
додано
@Isaac: Також netstat, якщо вони не дозволять вам мати netstat, можливо, ви захочете почати пошук ринку праці, перш ніж ви йдете з розуму ;-)
додано Автор MaikoID, джерело
Я думаю, що оригінальний плакат сподобався відповіді, але, як не дивно, він не відповідає на його запитання ("... tcp connection - я хотів би побачити, якщо сервер намагається надсилати запити до певного IP ...". дайте вам інформацію про мережеве підключення для конкретного процесу ... можливо, він хоче цього? Для тих, хто, як я приїжджаю сюди, шукають інформацію про з'єднання TCP від ​​однієї машини до іншої, це може не спрацювати. різні приклади команд оболонки, які дозволяють збирати інформацію про ваші мережеві з'єднання.
додано Автор Mike S, джерело
У нас є netsat :)
додано Автор Isaac, джерело
Я спробую lsof
додано Автор Isaac, джерело
Таку відповідь я сподівався. На жаль, strace не встановлено: /
додано Автор Isaac, джерело

Якщо вам потрібне спеціальне програмне забезпечення для виконання своєї роботи, і вам не дозволено, ви або не робите хороший бізнес-кейс , або продаєте свої ідеї потрібним користувачам ... або Ви не контролюєте цю систему ...

Якщо мені доручено щось зробити, і потрібна інформація про налагодження/усунення неполадок, яку вам потрібна в цьому випадку, я використовую правильний інструмент. Ймовірно, tcpdump або tshark . Так, це шматки програмного забезпечення, але я вважаю, що вони більше необхідних утиліт . Насправді, це утиліти, які можуть бути встановлені або завантажені в систему тимчасово і видалені без інциденту (чи є знімний носій опцією? ... підказка )

Але річ у тому, що обхідний шлях до політики компанії, ймовірно, потребує більше зусиль, ніж отримання схвалення для цього випадку використання.

8
додано
:( Про зміну менеджменту. Чи є спосіб грати в політичну гру і залучати людей/партій, які отримають вигоду від дампа, для прискорення процесу управління змінами?
додано Автор Pedro, джерело
@ewwhite: Будь-яка політика хорошого управління змінами повинна мати можливість звільнити певні або класи змін від проходження повного процесу. Якщо це не ....
додано Автор Scott Pack, джерело
Чи не можете ви скомпілювати статично пов'язаний tcpdump в іншому місці і просто скопіювати його в/tmp і запустити звідти?
додано Автор Juan J, джерело
Я боюся, що не - але оскільки його клієнт, який вимагає управління змінами, а також tcpdump, йому доведеться прийняти факти. Я сподівався, що зможу зробити його щасливим.
додано Автор Isaac, джерело
Я повністю погоджуюся використовувати правильний інструмент для правильної роботи. Насправді, я можу встановити програмне забезпечення, але ми повинні використовувати контроль змін, так що процес займає кілька днів - мені було потрібно дамп прямо зараз, тому встановлення не було можливим. Мені було просто цікаво, якщо я пропустив деякі варіанти не думав про ще.
додано Автор Isaac, джерело

Кайл запропонував кілька чудових варіантів. Ще одне - використовувати iptables :

[[email protected] ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32
...
[[email protected] ~]$ 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 :

[[email protected] ~]$ sudo iptables -I OUTPUT -d 1.2.3.4/32 -j LOG
...
[[email protected] ~]@ 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/messages на похідних Red Hat та /var/log/kern.log на похідні Debian. Він також буде видно у виводі dmesg , як показано на малюнку. Однак, на відміну від tcpdump , він не буде реєструвати повний вміст пакета, а лише вміст заголовка пакета.

5
додано
Я думав про iptables себе, але і не встановив: /. У всякому разі, приємне рішення.
додано Автор Isaac, джерело

Оскільки ваш сервер підключається до певного ІВ, я припускаю, що це буде до порту, який ви також маєте знати?

У будь-якому випадку, 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
2
додано
Відмінний спосіб контролювати без необхідності підвищених привілеїв ядра.
додано Автор Grant Bowman, джерело