Czy możliwe jest zdefiniowanie nazwy hosta mapowania na adres IP w Linuksie bez dostępu roota (tj. Modyfikacja / etc / hosts) ani serwera DNS?
Czy możliwe jest zdefiniowanie nazwy hosta mapowania na adres IP w Linuksie bez dostępu roota (tj. Modyfikacja / etc / hosts) ani serwera DNS?
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.
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.
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ę 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.
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.