Hejto.pl

Szybki pentest popularnej dystrybucji Linux

hejto.pl

Szybkie spojrzenie na błędy w popularnej dystrybucji Linux. Na tą chwilę tylko jeden mały skrypt, bo muszę iść zaraz spać. Pokaże Wam jak się przeprowadza pentesty, inni za to płacą a tu będzie darmowy pokaz.

Pod artykułem: https://www.hejto.pl/wpis/linux-mint-live-usb odpowiadałem na to dlaczego hejtuje ten system i uważam go za słaby. Spotkałem się z opinią, że tworzą go amatorzy i sam też tak uważam przykład będzie poniżej.

W systemach dystrybuowanym w dużej ilości egzemplarzy katalog na lokalne pliki powinien być pusty. W tym przypadku /usr/local/bin zawiera skrypty które przeprowadzającemu pentesty rzucą się w oczy ze względu na ich nazwy.

Patrząc po wielkości ciekawe mogą być apt i search. Ten pierwszy podszywa pod aplikacje systemową, drugi ma dziwną jak na linux nazwę, więc mu się przyjrzyjmy.

Kod programu


Kod znalazłem tutaj online:  https://github.com/linuxmint/mintsystem/blob/master/usr/local/bin/search


Skopiuje go jakby miał zniknąć po tym co napisze poniżej:


#!/bin/bash

function usage
{
    echo """
Usage:

    To search for something simply use 'search for':

        search for [keyword]

    You can restrict the search to a particular path by adding 'in [path]':

        search for [keyword] in [path]

    The following options are also supported:

        -c | --case-sensitive
        -s | --show-filenames-only

    Examples:

        search for keyword in ./

        search in ../ for Keyword --case-sensitive

        search -s in ../ for keyword
"""
}

directory=.
case=i
verbose=H
while [ "$1" != "" ]; do
    case $1 in
        for | -f | --for )
            shift
            text=$1
            ;;
        in | --in | -i )
            shift
            directory=$1
            ;;
        -h | --help )
            usage
            exit
            ;;
        -c | --case-sensitive )
            case=
            ;;
        -s | --show-filenames-only )
            verbose=l
            ;;
        * )
            usage
            exit 1
    esac
    shift
done

if [ "$directory" == "" -o "$text" == "" ]; then
    usage
    exit 1
fi

GREP_COLORS='fn=94' find $directory -type f -exec grep -$case$verbose "$text" --color=auto -n {} \;

Ostatnie zmiany miał 3 lata temu, a według dziennika zmian powstał w 2008 roku:

mintsystem (5.5) elyssa; urgency=low

  * Added /usr/local/bin/search
  * Added content and contains to apt
  * apt doesn't use sudo in root mode anymore

 -- Clement Lefebvre <[email protected]>  Mon,  6 Oct 2008 00![emoji_09](09)00 +0000


Czym ten skrypt jest? W obecnym rozumowaniu określiłbym go nie umiem w składnie grepa, ale czy ponad 17 lat temu czy też tak było? Nie pamiętam. Użyłem chatagpt do opisania kodu.


Analiza kodu według chata gpt


To jest skrypt Bash służący do wyszukiwania tekstu w plikach, działający jako prosty wrapper na find + grep, z bardziej „opisową” składnią w stylu języka naturalnego.



1. Do czego służy skrypt?

Skrypt:

  • przeszukuje pliki tekstowe w zadanym katalogu (rekurencyjnie),

  • szuka podanego słowa / frazy,

  • pozwala:

    • włączyć/wyłączyć czułość na wielkość liter,

    • wyświetlać tylko nazwy plików, a nie linie,

    • wskazać katalog, w którym ma być wykonane wyszukiwanie.

Czyli jest to „ładniejsza” wersja:

grep -R ...

2. Jak działa składnia wywołania?

Skrypt oczekuje poleceń w formie:

search for TEKST in KATALOG [opcje]

Przykłady:

search for keyword
search for keyword in ./
search for Keyword in ../ --case-sensitive
search -s in ../ for keyword

3. Funkcja usage

function usage { ... }

Wyświetla pomoc (instrukcję użycia), gdy:

  • podano błędne argumenty,

  • brakuje tekstu lub katalogu,

  • użyto -h lub --help.


4. Zmienne domyślne

directory=.
case=i
verbose=H

ZmiennaZnaczeniedirectory=.domyślnie szuka w bieżącym katalogucase=igrep -i → ignoruje wielkość liter verbose=Hgrep -H → pokazuje nazwę pliku


5. Parsowanie argumentów

Pętla:

while [ "$1" != "" ]; do

Analizuje parametry wywołania:

Obsługiwane argumenty:

ArgumentDziałaniefor, -f, --fortekst do wyszukaniain, -i, --inkatalog-c, --case-sensitivewłącza rozróżnianie wielkości liter-s, --show-filenames-onlypokazuje tylko nazwy plików-h, --helppokazuje pomoc


6. Sprawdzenie poprawności

if [ "$directory" == "" -o "$text" == "" ]; then

Jeśli:

  • nie podano tekstu do wyszukania

  • lub katalogu

→ skrypt kończy się z błędem i pokazuje pomoc.


7. Właściwe wyszukiwanie

find $directory -type f -exec grep -$case$verbose "$text" --color=auto -n {} \;

Co dokładnie się dzieje?

  1. find $directory -type f

    • znajduje wszystkie pliki w katalogu (rekurencyjnie)
  2. grep:

    • -$case → -i lub brak (czułość na wielkość liter)

    • -$verbose → -H lub -l

    • "$text" → szukany tekst

    • -n → pokazuje numery linii

    • --color=auto → koloruje znalezione fragmenty

  3. GREP_COLORS='fn=94'

    • ustawia kolor nazw plików (jasnoniebieski)

8. Podsumowanie w jednym zdaniu

Skrypt to narzędzie do rekurencyjnego wyszukiwania tekstu w plikach, z prostą składnią typu „search for … in …” i opcjami grep.


Tyle z opisu którego i tak nie będzie czytał.


Jak go można zastąpić?

Zatem co jest w nim złego? Można go zastąpić paroma aliasami w powłoce systemowej. Dokładniej to poniżej są odpowiedniki dla poszczególnych opcji skryptu

Case-sensitive (--case-sensitive)
grep -Rn --color=auto "TEKST" KATALOG

Tylko nazwy plików (--show-filenames-only)
grep -Ril --color=auto "TEKST" KATALOG

(case-insensitive) lub case-sensitive:

grep -Rl --color=auto "TEKST" KATALOG


Gdzie całość można skrócić do

grep -Rin --color=auto "TEKST" DIR


Tak właściwie to można go skrócić do jednej komendy za 66 linii. Co w tym złego? Otóż nic, po prostu zbyt rozbudowana funkcjonalność.

Realna podatność

Skupmy się zatem na samym właściwym kodzie skryptu czyli ostatniej linii

GREP_COLORS='fn=94' find $directory -type f -exec grep -$case$verbose "$text" --color=auto -n {} \;


Osoby zajmujące się programowaniem w językach skryptowych powinny zauważyć trywialny błąd. Zmienna $directory nie została zamknięta (ograniczona). To jest często spotykane pytanie z kategorii co jest z nim nie tak na rozmowach rekrutacyjnych.

Aplikacja find posiada opcję usuwania plików, sprawdźmy zatem czy zadziała. Poszukajmy d⁎⁎y. Stworze 3 puste pliki i spróbuje je usunąć.

Jak widać powiodło się.

Spróbujmy może jeszcze bardziej hardkorowo, podnieśmy uprawnienia i zróbmy coś złego, nieświadomy użytkownik może to wykonać
W tym przypadku po restarcie systemu użytkownik ujrzy pusty grub #pdk

Oczywiście można się bawić dalej i np. uruchomić zły program
Widzicie jak to podobno najpopularniejsza dystrybucja na świecie serwuje głupi błąd przez przeszło 18 lat. Co można z tym zrobić, można poprawić skrypt a najlepiej go całkowicie usunąć bo jest zbędny. Istnieje lepsze rozwiązanie które podałem wyżej. Wychodzi na, że nikt nigdy tego systemu nie sprawdzał pod kątem bezpieczeństwa. Dlatego też uważam, że jest słaby.

#linux #linuxmint #pentesting #programowanie #programista15k

hejto.pl

Komentarze (74)

Kazdy mysli ze jest poweruser a tak naprawde jedzie na gotowcu, nie ma w tym nic zlego ale jak piszesz te gotowce j⁎⁎ia gownem, ale czekajta ino dziadzia gabe dopiesci steamos i dopiero bedzie #roklinuxa

@ErwinoRommelo bez kitu- Steam w ciągu niecałego tylko roku i kilku luźno rzuconych zapowiedzi zrobił dla popularyzacji linucha na desktopie więcej, niż cały ten jebany pingwin ze wszystkimi distro i ewangelistami razem wziętymi od początku istnienia xD A jeszcze lepsze jest to, że całkowitą ironią jest fakt, że zrobiło to- no jakby nie patrzeć- korpo, popularyzując coś totalnie opensourcowego, chociaż mogliby to zabetonować i zrobić jakiegoś Windowsa 2.0 tylko po ichniemu. Robiąc robotę open source community, który od -dziesięciu lat nie potrafi spiąć dupy i tego zrobić, albo wręcz mają na to wyjebane po całości patrząc po innych open sourcowych projektach, które ożyły dopiero wtedy, jak jakieś korpo chwyciło to za pysk

@NiebieskiSzpadelNihilizmu dlatego też uważam że powinno góra 5 systemów typowo pod komputer biurkowy zostać. Jakieś tam serwerowe niech będą. A nie 2137 takich samych różniących się od siebie tapetą.

@30ohm nie no coś ty mordo jak to >600 distro ci nie pasuje mordo widocznie nie testowałeś tej dobrej mordo zaufaj mi podrzucę ci taką lepszą mordo xD


#zakazdymjebanymrazem bo kolejna banda pryszczaków złapała zajawkę po obejrzeniu filmiku na jutubie o tym jak przekompilować kernela, żeby ich ksywki się w systemie pokazywały, drugi filmik jak zmienić środowisko z kde na gnoma i voila- dystrybucja numer 601., zdechnie razem z ich słomianym zapałem i dumnie dołączy do jakichś 580 innych zapomnianych przez boga i ludzi, więc w porywach tak gdzieś za 2 tygodnie. Ja nie mówię, że linux jest zły- linux jest spoko, w wielu zastosowaniach jest zajebisty albo wręcz niezastąpiony, ale wielu zapaleńcom od tego "desktop ekspiriens" się mylą 2 rzeczy: jedna, że jeśli linux jest dobry na serwerach i sieciówce, to nie znaczy, że na desktopie będzie tak samo dobry i druga, że system operacyjny to coś o czym nie myślisz, odpalasz to i pozwala ci pracować, a nie jakieś niepisane zobowiązanie, gdzie na 2. etat godzisz się na kopanie z czymś, co ciągle cię wkurwia, nie działa jak powinno, albo jebie się od aktualizacji i musisz wertować pół dnia fora, żeby ogarnąć jak to naprawić.


No i w końcu- wiem, że jak się przegląda r/unixporn i patrzy co ludzie potrafią za małe dzieła sztuki odpierdolić modując *NIXa, to można się zajarać, tylko jestem ciekaw ilu ludziom chciało by się pierdolić z 2 miesiące, żeby ogarnąć jak się konfiguruje tego Hyperlanda, a potem zrobić porządny projekt do niego i go faktycznie skończyć.


Koniec końców jest tak jak piszesz- większość tego dobrze brzmi w teorii, ale jest absolutną udręką w praktyce.

@ErwinoRommelo tru, ale jednak jeśli chodzi o samą firmę i skalę tego co oferują to bliżej im do korpo, jak do open sourca. Żeby nie było- wiem, że body countem to oni nie mają podjazdu do molochów typu Ubi czy MS, no ale wciąż- to jest firma, która jest nastawiona na zysk i jakby tylko chcieli, to mogliby zrobić tę 601. dystrybucję jako całkowicie zamkniętego blackboxa i powiedzieć "to jest nasz linux, macie jak chcecie to korzystajcie jak nie to nie". A jednak nie poszli tą drogą i chwała im za to, bo nie spopularyzowali "swojego" linucha w środowisku typowych systemowych casuali, ale spopularyzowali linucha w ogóle. Pokazali im możliwości, zamiast przywiązać ich do 1 systemu jak Microsoft czy Apple, dali wolną rękę, pokazali, że można eksperymentować. I nawet jeśli tylko 10% tych ludzi stwierdzi, że linux to jednak nie tylko przemielone przez wszystkich popularyzatorów na wszystkie strony do porzygu ubuntu czy mint, arch dla totalnych skrzywieńców czy fedora, która niby ma korzenie w RHELu i chce uchodzić za profesjonalny system, ale jednak przystępny dla ludzi, że można w miarę łatwo sobie testować kolejne distro bez "commitmentu" z czyszczeniem dysku i instalacją w ślepo za każdym razem, że samych distro jest całkiem sporo, że w końcu mogą coś dla siebie znaleźć- to już będzie duży win dla community linuxa. Tylko szkoda że zrobiony rękami prywatnej firmy, a nie opensourcowego community, które rzekomo tak walczy właśnie o to. W ogóle poleci teraz kontrowersyjny tejk, ale uważam, że community open source zrobiło masę złego dla wizerunku linuxa w nie-enterprisowym wydaniu i to, że jest tak bardzo na marginesie to efekt tego, że często gęsto samo to community robiło co mogło, żeby odstraszyć nie tylko potencjalnych nowych użytkowników, ale nawet deweloperów, którzy dane distro rozwijali (no hej gentoo, nie kryj się tak, wszyscy pamiętamy twoje toksyczne w chuj community które potrafiło maintainerom wysyłać groźby śmierci).

@NiebieskiSzpadelNihilizmu dla mnie os to nie jest setno sprawy, sterowniki, proton, ze juz nie wspomne o sprzecie, jesli z tymi chipami ARM wyjdzie to serio moga wywrocic stolik amd i ha tfu nvidi. Zauwaz ze mimo tego ze nie sa strikte od sprzetu to ich produkty fizyczna zawsze sa sukcesmai, deck ze swoim layoutem mieszajacym pada i 2 trackpady wyznaczyl standardy dla handheld. Hail Gaben Volvo przertewa tysiac lat!

@Dziwen nah, nie ma żadnej afery.


Ktoś 17 lat temu chciał nowym na linuksie ułatwić szukanie z poziomu terminala. (Normalnie trzeba by spędzić 15-30 min na czytaniu manuala).


No i ten ktoś 17 lat temu nie dał zmiennej $directory w cudzysłów "$directory", taka częsta literówka w tym języku programowania. I wtedy ktoś taki jaki 30ohm, wiedząc o tym, może sobie skasować folder.


@30ohm Wydaje mi się, że nikt tego tyle czasu nie zauważył, bo po czasie i tak ludzie zaczęli używać find albo grep -R. Wygląda jakbyś trochę na siłę szukał dziury w całym.

Nikt nie będzie zaczynał przygody z Linuxem od Gentoo czy Archa, który nie ma GUI do tworzenia partycji przy instalacji.

@30ohm wszędzie będą łaty i dziury do naprawy. Dlatego najlepiej zaaktualizować do win11 i ustawić auto update. Naprawiają na bieżąco i bs nie będzie

W sumie szacun że ci się chciało. Weź im to gdzieś zgłoś albo zrób PR, wtedy będziesz mógł na legalu oficjalnie po nich pojechać i jeszcze ci podziękują za to xDD.

@Belzebub w tym przypadku się nie wsadzi, ale jak ktoś na pałę wklepie komendę gdzieś z internetu to szkód może narobić

@30ohm zrobiłeś aferę jakby byle random mógł ci grzebać w plikach a to tylko jakieś przestarzałe coś może zaszkodzić bo jak wpiszesz coś czego nie powinieneś to się zepsuje xD

@Belzebub na upartego może grzebać, bo ma funkcjonalność której nie powinien mieć. Zdalnie nic ci nie wykona ale lokalnie jak najbardziej. To tylko jeden gówno skrypt, którego nie powinno być. To ciekawe jak wygląda np. ich całe środowisko pod kątem bezpieczeństwa

zrobiłeś aferę jakby byle random mógł ci grzebać w plikach a to tylko jakieś przestarzałe coś może zaszkodzić bo jak wpiszesz coś czego nie powinieneś to się zepsuje xD


@Belzebub - kiedyś rozmawiałem z linuxiarzem i według niego takie rzeczy to były problemy użytkownika, a nie systemu (przynajmniej jeśli chodziło o Linuxa i przykłady które podawałem)

Jak się prześledzi ten plik to zauważysz, że linijka w tej formie, z tymi babolami weszła w "Initial commit" w 2009r, czyli możliwe że jest przeklejką z innego distro. Prawdą jest, że przydałoby się ją poprawić przez ten czas XD


Co do samej linijki, poza oczywistym błędem, którego wyłapie shellcheck (który powinien być stosowany), styl pisania tego skryptu nie jest tak bez sensu jak ci się wydaje. Uczyłem się bashów pod okiem kozaków Linuksowych z dłuższym stażem o którym lubisz wspominać i uczyli żeby w skryptach dla losowych ludzi dawać zawsze helpa, parsowanie argumentów, dokładnie tak jak jest w tym skrypcie. Robi to narzut kodu, to prawda, robi to narzut czasu, to również prawda, ale skrypt staje się bardziej przystępny. Użytkownik nie musi znać Basha. Użytkownik nie musi znać grepa, dla niego wszystko jedno jest jakie tam są argumenty podane, czy jest to rozwleczone. Użytkownik potrzebuje funkcji znalezienia jakiegoś tekstu i tyle.


Mógłbym się przyczepić do tego w jaki sposób używane są te argumenty, osobiście wolałbym utworzyć zmienną ARGS i do niej wpisywać kolejne flagi w zależności od wyboru użytkownika skryptu. Jednakże zaletą jest to, że jeśli użytkownik już będzie chciał sprawdzić jak działa ten skrypt (na czym przecież nam wszystkim zależy, żeby użytkownicy czytali skrypty które wklejają do terminala), to dość jasno jest pokazane, która flaga co robi i użytkownik nie musi czytać rozpasłego helpa do grepa, żeby zrozumieć, a czegoś się nauczy. Oszczędza to czas. Ty wiesz co robią te flagi i gratuluje. Dobrze że ty wiesz. Nie wszyscy wiedzą.


Dlatego nie zawsze jest korzystnym skracanie skryptu do jak najkrótszej formy. Ty wiesz co robią te rzeczy, ale nie każdy chce to rozkminiać.


W ogóle twoje skracanie tego skryptu to jest największe nieporozumienie. Chcąc udowodnić jacy gupi są ludzie, pokazałeś alternatywną liniję, która robi co innego niż oryginalny skrypt XD wydawało ci się, że ten find jest niepotrzebny, ale nie pomyślałeś o tym, że grep domyślnie szuka patternu we wszystkim co mu podasz, czy to katalogi czy linki symboliczne.


Teraz wejdź do swojego katalogu hejto i zrób


echo hejto > ../jakisplik

ln -s ../jakisplik ./skrot


A teraz uruchom skrypt search w katalogu hejto i wpisując "hejto" jako szukany TEKST, czyli search for hejto


Nie znajdzie nic


A teraz odpal którąś ze swoich alternatywnych wersji.


Znajduje pliczek spoza katalogu hejto, do którego utworzyliśmy link symboliczny.


Dzieje się tak, bo ten bezsensowny find w tym wypadku ogranicza pole przeszukiwań wyłącznie do plików.


Generalnie to nic złego tworzyć takie skrypty nawet na `grep -Rin --color=auto "TEKST" DIR`, sam często takie coś tworzę na własny użytek.


Co do braku cydzysłowiów to faktyczny babol i nie powinien istnieć. Możesz utworzyć PR na to


Generalnie świetne oranie Minta, gratuluję.

@ZohanTSW Dzięki za podsumowanie. Nie miałem na tyle czasu aby to aż tak opisać. Generalnie to ja bym ten skrypt umieścił w innym miejscu jak /usr/local/bin poprawił i niech sobie istnieje.


Co do grepa:

grep: -r no longer follows symlinks; use fts Change -r to follow only command-line symlinks, and by default to read only devices named on the command line. This is a simple way to get a more-useful behavior when searching random directories; the idea is to use 'find' if you want something fancy. -R acts as before and gets a new alias --dereference-recursive.

Nawet sami zalecają używania find aby było "fancy"


Mnie uczyli aby tworzyć skrypty jak najmniej złożone a nie jako popularne jest cat plik | grep | sort itd.

@30ohm może tak być, że wszystkie bolączki tego pliku są efektem naleciałości sprzed dwóch dziesięcioleci, w tym jego lokalizacja. Chociaż word splitting podejrzewam że jest znane jeszcze więcej dekad xD może to jest specjalnie? Nie wiem.


Jak najmniejszą złożoność skryptów dobrze jest zrównoważyć z jego czytelnością. Nie wiem od kiedy jest nacisk na to, ale od wielu wielu lat obserwuję nacisk na to, żeby kod który produkujesz był czytelny dla innych ludzi. Z resztą to nie jest przyjemne siadać do kodu który napisał ktoś inny, najlepiej samouk według własnego widzimisię, który nie trzyma żadnych standardów poza tym że w jakiś magiczny sposób działa. Sam praktykuję zasadę, że jakbym posadził mamę do komputera, to ona ma być w stanie przeczytać ten kod i coś z niego wywnioskować (zakładając że poznała podstawy programowania). Przy bardziej skomplikowanych, magicznych zabiegach, daję komentarze

@ZohanTSW o co dokładnie chodzi z błędem z brakiem cudzysłów? Rozumiem, że chodzi o użycie zmiennej $directory. Co zmienią takie zapisy? $directory „$directory” ${directory} ??

Sam sporo skryptuję w pracy, ale głównie dla siebie i nie mam formalnego przeszkolenia ani ogarniętych „best practices”. Po prostu wiem, że można, wiem mniej więcej jak, to używam ;) Staram się, żeby kod był czytelny. Jesli ma być używany przez kogoś jeszcze, to dbam o helpa/usage