Kontrola systemu Linux może pomóc. Przynajmniej zlokalizuje użytkowników i procesy wykonujące połączenia sieciowe datagramów. Pakiety UDP są datagramami.
Najpierw zainstaluj auditd
platformę na swojej platformie i upewnij się, że auditctl -l
coś zwraca, nawet jeśli mówi, że nie zdefiniowano żadnych reguł.
Następnie dodaj regułę, aby obejrzeć wywołanie systemowe socket()
i oznacz ją, aby łatwo znaleźć później ( -k
). Muszę założyć, że jesteś na architekturze 64-bitowej, ale można podstawić b32
w miejsce b64
, jeśli nie jesteś.
auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Musisz wybrać strony socket(PF_INET, SOCK_DGRAM|X, Y)
podręcznika i pliki nagłówkowe, aby to zbudować, ale to, co przechwytuje, to w zasadzie to wywołanie systemowe: gdzie trzeci parametr jest nieokreślony, ale często zerowy. PF_INET
ma wartość 2 i SOCK_DGRAM
2. Używałby połączeń TCP, SOCK_STREAM
które by się ustawiły a1=1
. ( SOCK_DGRAM
w drugim parametrze może być ORed przy pomocy SOCK_NONBLOCK
lub SOCK_CLOEXEC
, stąd &=
porównanie). To -k SOCKET
nasze słowo kluczowe, którego chcemy użyć przy późniejszym wyszukiwaniu ścieżek audytu. Może to być wszystko, ale lubię to upraszczać.
Odczekaj kilka chwil i przejrzyj ścieżki audytu. Opcjonalnie możesz wymusić kilka pakietów, wysyłając polecenie ping do hosta w sieci, co spowoduje wyszukiwanie DNS, które korzysta z UDP, co powinno wyzwolić nasz alert kontroli.
ausearch -i -ts today -k SOCKET
Pojawią się dane wyjściowe podobne do poniższej sekcji. Skracam to, aby podkreślić ważne części
type=SYSCALL ... arch=x86_64 syscall=socket success=yes exit=1 a0=2 a1=2 ... pid=14510 ... auid=zlagtime uid=zlagtime ... euid=zlagtime ... comm=ping exe=/usr/bin/ping key=SOCKET
Na powyższym wyjściu możemy zobaczyć, że ping
polecenie spowodowało otwarcie gniazda. Mógłbym wtedy uruchomić strace -p 14510
proces, jeśli nadal był uruchomiony. ppid
(Rodzic proces ID) jest również wymieniona w przypadku jest to skrypt, który ikra problem dziecko dużo.
Teraz, jeśli masz duży ruch UDP, nie będzie to wystarczająco dobre i będziesz musiał skorzystać z OProfile lub SystemTap , które są obecnie poza moją wiedzą.
To powinno pomóc zawęzić sytuację w ogólnym przypadku.
Kiedy skończysz, usuń reguły kontroli przy użyciu tej samej linii użyty do jego utworzenia, zastąpić tylko -a
z -d
.
auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
Możesz użyć netstat, ale potrzebujesz odpowiednich flag i działa to tylko wtedy, gdy proces wysyłający dane wciąż żyje. Nie znajdzie śladów czegoś, co na krótko ożyło, wysłało ruch UDP, a potem odeszło. Wymaga również lokalnych uprawnień roota. To mówi:
Oto zaczynam ncat na moim hoście lokalnym, wysyłając ruch UDP do portu 2345 na (nieistniejącej) maszynie 10.11.12.13:
Oto niektóre dane wyjściowe tcpdump potwierdzające, że ruch się odbywa:
Oto użyteczny bit , używając netstat z flagą -a (aby zobaczyć szczegóły portu) i flagą -p, aby zobaczyć szczegóły identyfikatora procesu. Jest to flaga -p, która wymaga uprawnień roota:
Jak widać, pid 9152 ma połączenie otwarte z portem 2345 na określonym hoście zdalnym. Netstat pomaga również uruchomić to przez ps i mówi mi, że nazwa procesu to
ncat
.Mam nadzieję, że to się przyda.
źródło
grep -w 57550
ponieważ wiele procesów może wyszukiwać DNS na tym samym serwerze. Twoja metoda ich nie rozróżnia.Miałem dokładnie ten sam problem i niestety
auditd
niewiele dla mnie zrobiłem.Miałem ruch z niektórych moich serwerów w kierunku adresów DNS Google
8.8.8.8
i8.8.4.4
. Teraz mój administrator sieci ma łagodny OCD i chciał wyczyścić cały niepotrzebny ruch, ponieważ mamy wewnętrzne pamięci podręczne DNS. Chciał wyłączyć port wychodzący 53 dla wszystkich oprócz serwerów pamięci podręcznej.Więc po nieudanej próbie
auditctl
zagłębiam sięsystemtap
. Wymyślam następujący skrypt:Następnie po prostu uruchom:
Oto wynik, który otrzymałem:
Otóż to! Po zmianie
resolv.conf
tych PID nie wykrył zmian.Mam nadzieję że to pomoże :)
źródło
Oto opcja systemtap przy użyciu sond netfilter dostępnych w Stap verson 1.8 i nowszych. Zobacz także
man probe::netfilter.ip.local_out
.źródło
Chciałbym użyć net-sniffera, takiego jak tcpdump lub wireshark, aby wyświetlić żądania DNS. Treść zapytania może dać wyobrażenie o tym, który program je wydaje.
źródło
Należy pamiętać, że podczas korzystania z autitctl, na przykład nscd używa nieco innego parametru w wywołaniu systemowym gniazda podczas wykonywania zapytania DNS:
Aby upewnić się, że wychwytujesz te zapytania oprócz tych wymienionych powyżej, możesz dodać dodatkowy filtr o tej samej nazwie, jeśli chcesz:
Tutaj 2050 jest bitową LUB SOCK_DGRAM (2) i SOCK_NONBLOCK (2048).
Następnie wyszukiwanie znajdzie oba filtry z tym samym kluczem
SOCKET
:Znalazłem tutaj wartości szesnastkowe dla stałych gniazd: https://golang.org/pkg/syscall/#pkg-constants
Ponieważ nie mam punktów reputacji do skomentowania, dodałem to.
źródło