To zależy od tego, co próbujesz zrobić. W obu przypadkach praktycznie masz gwarancję napisania własnego kodu, więc jeśli nie jesteś programistą, możesz albo zacząć się uczyć, albo być jednym z nich.
Toczenie własnej infrastruktury rozpoznawania DNS
Jeśli piszesz własny program, możesz całkowicie pominąć systemową rozdzielczość DNS i zrobić to sam.
Widzisz, rozpoznawanie DNS jest świadczone jako usługa ogólnosystemowa, ale nie ma (zwykle) żadnych ograniczeń uniemożliwiających tworzenie własnej, oddzielnej architektury rozpoznawania DNS. Rzeczywista aktywność rozpoznawania DNS to „tylko” pakiety IP przechodzące przez sieć. Wszystko, co musisz zrobić, to użyć istniejącej biblioteki, która rozumie protokół DNS, ale pozwala ci dostosować odpowiedzi lub użyć pliku hosts w niestandardowym katalogu. Podejście to ma tę zaletę, że nie są potrzebne „hacki”, ale wadą jest to, że musisz stworzyć własny program - bez względu na to, czy jest to język skryptowy, czy rodzimy język programowania ... tak czy inaczej, musisz utworzyć nowe oprogramowanie. Nie możesz zastosować tego hacku do istniejącego oprogramowania, zwłaszcza nie skompilowanego kodu, dla którego nie masz kodu źródłowego.
Przykład biblioteki C, która właśnie czy kodowanie / dekodowanie wiadomości DNS jest libdns z NMAP.
Zastępowanie rozpoznawania DNS w istniejących programach
Jeśli korzystasz z programów, do których nie masz dostępu do zapisu i są rootem setuid, to nie - nie masz szczęścia, chyba że chcesz skopiować ten plik binarny do innej lokalizacji i usunąć setuid (chociaż niektóre programy odmawiają uruchomienia, jeśli nie są rootem setuid).
Jeśli uruchomiony jest program nie setuid root, to powinno być możliwe. Szerokie uderzenia tego, co musisz zrobić, to LD_PRELOAD bibliotekę, która implementuje standardowe funkcje rozpoznawania DNS biblioteki C i wykonuje niestandardowe przetwarzanie, aby wprowadzić pożądane modyfikacje, przed przełączeniem nierozpoznanych hostów na implementację biblioteki systemu C dla „normalnej” rozdzielczości.
Funkcje biblioteki C, które będziesz musiał przesłonić LD_PRELOAD są następujące:
gethostbyname(3) (przestarzałe, ale wiele programów nadal z tego korzysta)
Zwróć uwagę, że możesz to wprowadzić w błąd w przypadku niektórych programów, ponieważ dokonywanie dowolnych modyfikacji wartości zwracanych przez te funkcje może naruszać standard POSIX.1-2001. Widzieć RFC 2553 .
Jeśli chcesz to włączyć dla wszystkich uruchomionych programów , musisz wyeksportować LD_PRELOAD zmienna środowiskowa do twojej powłoki lub sesja logowania, aby wszystko zaczęło się od LD_PRELOAD. Niestety wyklucza to takie programy jak Xorg, ponieważ (wierzę) jest to korzeń setuid. Również programy takie jak vmware-vmx (głównym programem binarnym dla hypervisora VMware) są setuid root, więc masz ten sam problem.
Informacje niższego poziomu
Ten hack jest możliwy, ponieważ ustawienie zmiennej środowiskowej LD_PRELOAD na bibliotekę współdzieloną powoduje, że dynamiczny linker w systemie Linux odczytuje wstępnie załadowane symbole biblioteki przed czyta je z dowolnej innej biblioteki. Tak więc, jeśli masz symbol (który jest zasadniczo sygnaturą funkcji) o nazwie foo w libc.so.6 (implementacja biblioteki C), a ty też foo w libevil.so (twoja biblioteka) i ustaw LD_PRELOAD=libevil.so (musisz jednak podać pełną ścieżkę), ładuje się foo z twojego libevil.so, więc kiedy program uruchomił połączenia foo() w kodzie zadzwoni do libevil.so, który może wtedy zdecydować (jeśli chce) użyć dynamicznych funkcji linkera do wywołania libc.so.6 implementacja foo() -- opcjonalnie.
Najprawdopodobniej będziesz musiał zrobić to wszystko w C, z powodu niskiego poziomu kodu. Możesz korzystać z bibliotek narzędziowych, takich jak Bez zająknienia aby ułatwić życie, więc nie musisz wymyślać algorytmów dla podstawowych operacji, takich jak manipulowanie łańcuchami i automatyczne powiększanie tablic.
Nie wiem, czy to tylko ja, ale nazwa biblioteki LD_PRELOAD wskazuje, że nie jest to dobra opcja.
UmNyobe
To tylko dowolna nazwa, którą mu podałem. Próba zastąpienia rozdzielczości DNS biblioteki C nie jest dobrym rozwiązaniem, Kropka . Nie mogę wymyślić dobrego powodu, dla którego chciałbyś to zrobić i dlaczego musiałbyś, w systemie, w którym brakuje ci dostępu do roota, lub gdzie nie możesz poprosić o usługę dostępu roota, aby to zrobiła za ciebie , lub ustaw uprawnienia do pliku, itp. To brzmi jak twój problem „nie jest dobrym rozwiązaniem”. Ale pracowałem nad twoją definicją problemu, aby ci pomóc jak najwięcej.
Odpowiedzi:
To zależy od tego, co próbujesz zrobić. W obu przypadkach praktycznie masz gwarancję napisania własnego kodu, więc jeśli nie jesteś programistą, możesz albo zacząć się uczyć, albo być jednym z nich.
Toczenie własnej infrastruktury rozpoznawania DNS
Jeśli piszesz własny program, możesz całkowicie pominąć systemową rozdzielczość DNS i zrobić to sam.
Widzisz, rozpoznawanie DNS jest świadczone jako usługa ogólnosystemowa, ale nie ma (zwykle) żadnych ograniczeń uniemożliwiających tworzenie własnej, oddzielnej architektury rozpoznawania DNS. Rzeczywista aktywność rozpoznawania DNS to „tylko” pakiety IP przechodzące przez sieć. Wszystko, co musisz zrobić, to użyć istniejącej biblioteki, która rozumie protokół DNS, ale pozwala ci dostosować odpowiedzi lub użyć pliku hosts w niestandardowym katalogu. Podejście to ma tę zaletę, że nie są potrzebne „hacki”, ale wadą jest to, że musisz stworzyć własny program - bez względu na to, czy jest to język skryptowy, czy rodzimy język programowania ... tak czy inaczej, musisz utworzyć nowe oprogramowanie. Nie możesz zastosować tego hacku do istniejącego oprogramowania, zwłaszcza nie skompilowanego kodu, dla którego nie masz kodu źródłowego.
Przykład biblioteki C, która właśnie czy kodowanie / dekodowanie wiadomości DNS jest libdns z NMAP.
Zastępowanie rozpoznawania DNS w istniejących programach
Jeśli korzystasz z programów, do których nie masz dostępu do zapisu i są rootem setuid, to nie - nie masz szczęścia, chyba że chcesz skopiować ten plik binarny do innej lokalizacji i usunąć setuid (chociaż niektóre programy odmawiają uruchomienia, jeśli nie są rootem setuid).
Jeśli uruchomiony jest program nie setuid root, to powinno być możliwe. Szerokie uderzenia tego, co musisz zrobić, to
LD_PRELOAD
bibliotekę, która implementuje standardowe funkcje rozpoznawania DNS biblioteki C i wykonuje niestandardowe przetwarzanie, aby wprowadzić pożądane modyfikacje, przed przełączeniem nierozpoznanych hostów na implementację biblioteki systemu C dla „normalnej” rozdzielczości.Funkcje biblioteki C, które będziesz musiał przesłonić
LD_PRELOAD
są następujące:gethostbyname(3)
(przestarzałe, ale wiele programów nadal z tego korzysta)getaddrinfo(3)
getnameinfo(3)
Zwróć uwagę, że możesz to wprowadzić w błąd w przypadku niektórych programów, ponieważ dokonywanie dowolnych modyfikacji wartości zwracanych przez te funkcje może naruszać standard POSIX.1-2001. Widzieć RFC 2553 .
Jeśli chcesz to włączyć dla wszystkich uruchomionych programów , musisz wyeksportować
LD_PRELOAD
zmienna środowiskowa do twojej powłoki lub sesja logowania, aby wszystko zaczęło się odLD_PRELOAD
. Niestety wyklucza to takie programy jakXorg
, ponieważ (wierzę) jest to korzeń setuid. Również programy takie jakvmware-vmx
(głównym programem binarnym dla hypervisora VMware) są setuid root, więc masz ten sam problem.Informacje niższego poziomu
Ten hack jest możliwy, ponieważ ustawienie zmiennej środowiskowej LD_PRELOAD na bibliotekę współdzieloną powoduje, że dynamiczny linker w systemie Linux odczytuje wstępnie załadowane symbole biblioteki przed czyta je z dowolnej innej biblioteki. Tak więc, jeśli masz symbol (który jest zasadniczo sygnaturą funkcji) o nazwie
foo
wlibc.so.6
(implementacja biblioteki C), a ty teżfoo
wlibevil.so
(twoja biblioteka) i ustawLD_PRELOAD=libevil.so
(musisz jednak podać pełną ścieżkę), ładuje sięfoo
z twojegolibevil.so
, więc kiedy program uruchomił połączeniafoo()
w kodzie zadzwoni dolibevil.so
, który może wtedy zdecydować (jeśli chce) użyć dynamicznych funkcji linkera do wywołanialibc.so.6
implementacjafoo()
-- opcjonalnie.Najprawdopodobniej będziesz musiał zrobić to wszystko w C, z powodu niskiego poziomu kodu. Możesz korzystać z bibliotek narzędziowych, takich jak Bez zająknienia aby ułatwić życie, więc nie musisz wymyślać algorytmów dla podstawowych operacji, takich jak manipulowanie łańcuchami i automatyczne powiększanie tablic.
Referencje
źródło