root@system:~# less myfile
-bash: /bin/less: Input/output error
Główny system plików nie działa. Ale mój kot wciąż żyje (w mojej pamięci):
root@system:~# cat > /tmp/somefile
C^d
root@system:~#
Jest jednak trochę samotny, wszyscy jego przyjaciele odeszli:
root@system:~# mount
-bash: /bin/mount: Input/output error
root@system:~# dmesg
-bash: /bin/dmesg: Input/output error
root@system:~# less
-bash: /bin/less: Input/output error
root@system:~# chmod
-bash: /bin/chmod: Input/output error
System nadal działa i spełnia swój cel. Wiem, wiem, jedyną rozsądną odpowiedzią na to jest wyłączenie systemu i wymiana dysku głównego. Niestety nie jest to opcja, ponieważ kosztowałoby dużo czasu i pieniędzy. Zabiłoby to mojego kota, a to zasmuciłoby mnie.
Myślałem o przyniesieniu mu jego zwykłych przyjaciół od dawcy. Nie śmiem ich wczytać, na wypadek, gdyby ssh próbował je załadować i przeciął linię (plik binarny i tak zniknął). To brzmi jak praca dla kuzyna mojego kota:
root@system:~# netcat -l 1234 > /tmp/less
-bash: netcat: command not found
Niestety dawno go nie było.
Teraz mogę spróbować oszukać mojego kota, aby wykonał rytuał, aby go wskrzesić:
cat > netcat < /dev/tcp/localhost/9999
I to działało. On prawie żyje:
root@system:/tmp# /tmp/netcat
-bash: /tmp/netcat: Permission denied
On potrzebuje tylko małej iskry życia. Ta mała +x
magiczna inkantacja, której w tej chwili nie mogę recytować.
Czy możesz mi pomóc w przywróceniu przyjaciół mojego kota?
źródło
/lib/ld-linux.so.2 ./netcat
(lub ekwiwalent systemu) i zacząć działać?Odpowiedzi:
Istnieje kilka możliwości, wszystkie w zależności od dokładnych parametrów twojej sytuacji w tej chwili. Zamierzam założyć Linuksa w poniższych przykładach, w stosownych przypadkach, ale podobna funkcjonalność istnieje na innych platformach w większości przypadków.
Być może uda Ci się uzyskać moduł ładujący dynamiczny, który uruchomi dla Ciebie plik wykonywalny. Zakładając, że
cat
jest dynamicznie połączony, odpowiednik Twojej platformy/lib/ld-linux.so.2
prawdopodobnie również będzie w pamięci, a zatem będzie użyteczny do uruchomienia pliku binarnego:Może być ich wiele (prawdopodobnie 32- i 64-bitowe) i może być dostępnych wiele kopii lub dowiązań symbolicznych wymagających rozwiązania. Jeden z nich może działać.
Jeśli masz zamontowany system plików vfat lub NTFS lub inny, który traktuje wszystkie pliki jako 777, możesz utworzyć tam plik wykonywalny.
Jeśli istnieje zamontowana partycja, na której nie zależy ci zawartość, na dysku, który nadal w większości działa, możesz zastąpić zawartość nowym obrazem tego samego typu systemu plików, zawierającym pliki wykonywalne, które chcesz -
cat
powinno być dobrze w tym rolę, z której zwykle korzystają ludziedd
, i możesz udostępnić obraz przez sieć.Ten jest prawdopodobny, ale ma wiele miejsc, w których nie można pracować, w zależności od tego, co dokładnie jest jeszcze w pamięci z tej partycji.
Jeśli istnieje jakikolwiek dostępny plik, który ma uprawnienia do wykonywania na dowolnym zapisywalnym systemie plików, możesz
cat >
w nim zastąpić zawartość wybranym przez ciebie plikiem binarnym.ctypes.sh
, który zapewnia interfejs funkcji obcej dla Bash, a następniedlcall chmod ./netcat 511
.Możesz przynieść dynamiczny plik biblioteki
foo.so
swojej konstrukcji, a następniecat
załadować go w swoim imieniuLD_PRELOAD
, umożliwiając wykonanie dowolnego kodu.Jeśli przechwycisz na przykład
open
:wtedy możesz zrobić wszystko, co musisz tam zrobić.
Moją sugestią byłoby wprowadzenie statycznie
busybox
wykonywalnego pliku wykonywalnego jako pierwszego elementu (lub tak naprawdę, jedynego elementu), abyś miał pełny zakres dostępnych poleceń bez ponownego wykorzystywania jakiegokolwiek hacka, który doprowadził cię do tego stopnia, że wyczerpał się.źródło
busybox
”: Uwaga, którasash
została specjalnie zaprojektowana dla tego rodzaju przypadku użycia i może być łatwiej dostępna w mgnieniu oka (np. Można go zainstalować wcześniej i pozostawić gdzieś kopię, aby była w pamięci, gdy system przerwy ... albo możesz porzucić swoje zwierzaki i kupić kupę bydła, jak sądzę).