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)

ErwinoRommelo

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

NiebieskiSzpadelNihilizmu

@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

30ohm

@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ą.

NiebieskiSzpadelNihilizmu

@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

@NiebieskiSzpadelNihilizmu to nie zwykle korpo, flat structure nie piramida no I nie sa na gieldzie, to wszystko zmienia

NiebieskiSzpadelNihilizmu

@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).

ErwinoRommelo

@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!

wombatDaiquiri

@30ohm a które dystrybucje lubisz?

Dziwen

Wniosek jest prosty. Jednak lepiej zostać na wielkim W. xD

Dziwen

@koszotorobur Windowsie. XD

koszotorobur

@Dziwen - nie chcę ani jednego ani drugiego

Legendary_Weaponsmith

@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.

Tomoe

@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

koszotorobur

@Tomoe - lubię porządny sarkazm

DexterFromLab

@Tomoe @koszotorobur never!

Legendary_Weaponsmith

@Tomoe to nie jest żadna dziura

Tomoe

@Legendary_Weaponsmith no tak. Dziurwa jak skurczysyn

Catharsis

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.

30ohm

@Catharsis zrobiłem 2 lata temu do jeszcze większej pierdoły. Odrzucili go, patrzę niech się pierdolą.

MementoMori

Lepiej nie ruszać, bo coś się zepsuje.

Belzebub

@30ohm tam jest lewy gwint. Ale na czym tak naprawdę polega ta podatność ? Ktoś mi się wjebie nie kompa bez problemu?

30ohm

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

Belzebub

@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

30ohm

@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

Arientar

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)

ZohanTSW

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ę.

30ohm

@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.

ZohanTSW

@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

tegie

@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 i komentarze. Testuję na różne sposoby, zanim wypuszczę i generalnie staram się, żeby kod był idiotoodporny. Ale nie mam też shella w małym palcu, często nie pamiętam składni i sobie ja po prostu testuję.

Bielecki

@tegie jeśli nie złapiesz zmiennej w cudzysłów, a jej wartość będzie zawierać np. spacje, to program może wziąć to jako wiele argumentów. Tak samo ze znakami specjalnymi - jeśli chcesz np. pobrać zawartość jakiegoś linku, a link będzie zawierał "&", to program wykona część komendy aż do tego znaku, odpali go w tle (naturalny myk linuksowy), a resztę linku potraktuje jako osobną komendę

ZohanTSW

@tegie znakomite pytanie. W tym wypadku problem znany jako word splitting. Jest różnica jeśli podasz parametry jako "$directory" i $directory. Otóż w pierwszym przypadku mówisz wprost, że to co jest pod zmienną directory ma być w całości traktowane jako jeden argument, a w drugim przypadku cała zawartość zmiennej directory jest tylko chamsko wklejana w to miejsce, spacje rozdzielają argumenty. W efekcie można wstrzyknąć zupełnie inną operację w to miejsce, tak jak to ma miejsce w drugim obrazku (wklejam go również w tym komentarzu).


Już tłumaczę co się tu dzieje:

W praktyce wywołano


find . -exec ./zlyprogram.sh \; -type f -exec grep -$case$verbose "$text" --color=auto -n {} \;


Pierwszy argument komendy find to ścieżka - mamy ją, to jest kropka. Komenda prosta do wykonania, po niej mamy -exec, który mówi, że dla każdego wyniku wykonaj następujące komendy. Czyli tyle razy ile plików znajdzie w obenej lokalizacji (./) odpalany jest skrypt zlyprogram.sh - można sobie wyobrazić co tam jest. Intencją autora programu było podanie argumentów do finda, ale złośliwy haker sprytnie wykorzystując dziurę zmienił drugą część tej komendy podając własną. W efekcie find nie szuka niczego (wykonuje po prostu find .), a potem wykonujemy jakieś polecenie (bo mamy w Bashu taką konstrukcję, która pozwala wykonywać jakieś polecenie na wyniku poprzedniej komendy co jest bardzo przydatne). Dalsza część nie ma znaczenia, ";\" mówi że komenda skończona, wykonaj ją - mamy pozamiatane.


Żeby się przed tym obronić, wystarczy dać $directory w cudzysłów, czyli "$directory". Wtedy złośliwy haker próbując wstrzyknąć -execa uzyska


find ". -exec ./zlyprogram.sh \;" -type f -exec grep -$case$verbose "$text" --color=auto -n {} \;


I jaka jest różnica? pierwszy argument finda (ścieżka) to ". -exec ./zlyprogram.sh \;", czyli jakiś bullshit. Nie ma takiej ścieżki, program zwraca error, nie wykonuje dalszej części po -exec.


Niestety wciąż można jako argument podać "-delete" i przed tym się nie obronimy w taki sposób, trzebaby się zastanowić i dodać inne mechanizmy zabezpieczające.


Dodatkowo wyłuskiwanie wartości zmiennych w cudzysłowie zapobiega globbingu, czyli


$ touch a b 1.txt 2.txt
$ foo="a b *.txt"

$ echo $foo

a b 1.txt 2.txt

$ echo "$foo"

a b *.txt


Czasami jest to pożądany efekt, czasami nie.


Polecam pobrać sobie shellchecka (sudo apt install shellcheck; czy jakiego tam masz menadżera paczek) i uruchamiać na swoich skryptach, on pokazuje bardzo dużo takich niebezpiecznych sytuacji.

e8cf6175-0059-4ded-8478-255bbcd1d224
ZohanTSW

@tegie trzecia wersja o którą spytałeś, czyli ${directory} tutaj nie będzie przydatna. Pozwala np ustawiać wartość domyślną zmiennej, czy wyświetlić jej długość, czy inne takie bajery. Nie umiem teraz podać bardziej praktycznego przykładu

tegie

@Bielecki @ZohanTSW dziękuję ślicznie za wyjaśnienia, nigdy nie myślałem o parametrach wejściowych pod tym kątem. Chociaż zazwyczaj parsuję liczbę parametrów, więc jeśli jest za dużo to skrypt by się i tak wykrzaczył (lub w moim przypadku: wyświetlił helpa). Niemniej jednak przydatna wiedza i zwrócę na to uwagę!

ZohanTSW

@tegie wciąż wtedy możesz spróbować w takich skryptach wepchnąć np 2 parametry jako jeden przez ./myscript.sh "param1 param2" i podejrzewam że i tak to będzie wzięte jako jedna wartość, a w twoim kodzie mogą się zadziać rzeczy niestworzone :) spróbuj tak rozwalić jakiś

tegie

@ZohanTSW pobawię się, chociaż moją intencją nigdy nie było robienie kuloodpornego kodu. Ma być zrozumiały i upraszczać pracę mi. A jeśli jest przeznaczony dla kogoś innego, to ma być wstępnie idiotoodporny, obsługiwać podstawowe błędy użytkownikach, dobrze opisany i wyświetlający „usage”, gdy użyte są złe parametry. Oraz staram się używać mimo wszystko getops i case do przelatywania po parametrach. To pozwala mi na kontrolę używanych parametrów i nie zwracanie uwagi na kolejność ich podawania.

Natomiast security to nie do końca moja branża, więc nie znam wszystkich trików. Zakładam też, że jak ktoś chce zepsuć, to zepsuje. Moim celem jest zmniejszenie możliwości przypadkowego zepsucia, ale celowemu działaniu nie zapobiegnę

ZohanTSW

@tegie tą kuloodporność budujesz też przed sobą i niekoniecznie możesz chcieć shakować swój program, ale jeśli jeden skrypt odpala drugi, to raz że bardzo łatwo o nieoczekiwane efekty, a dwa zdebugowanie problemu może być dość trudne. Na poziomie takich skryptów musisz się obronić przed samym sobą (lubię sobie mówić że przed własną głupotą xd). Takie poważne security to już zupełnie inna bajka.

Generalnie jak robisz dla siebie i jeszcze nie potrzebujesz to nie spinaj się z tym. Grunt że już wiesz co się może zadziać. Kiedyś się coś wywali to zaczniesz robić inaczej xd

Arvangen

@30ohm czyli problem polega na tym że atakujący może nakłonić usera żeby uruchomił w terminalu comende ze złośliwym kodem której user nie rozumie?

Czy to wina distro czy tylko usera i taki sam atak można przeprowadzić dokładnie na każdym innym istniejącym distro? :D

bo problemem jest to że user dał sie nakłonić do uruchomienia niezrozumianej komendy a to czy w tej komendzie jest użyty mniej lub bardziej udany skrypt z danego distro to nieznaczący szczegół?

30ohm

@Arvangen generalnie tak, pierdoła istniejąca 18 lat której nikt nie załatał. Umożliwia wykonanie za dużo i to jest pierwsza lepsza pierdoła którą sprawdziłem. Jakbym miał więcej czasu to bym sprawdził całe środowisko czy coś ciekawego nie lata.

Arvangen

@30ohm ok. A jakiego distro sam używasz i jakie polecasz dla osoby na start z najmniejszym kosztem utrzymania? ubuntu?

ZohanTSW

@Arvangen powiedziałbym że od programu o nazwie "search" będziesz oczekiwał, że on ci coś znajdzie, a nie skasuje. Jest to dodatkowa funkcjonalność, która nie powinna mieć miejsca, tym bardziej że łatwo jest to załatać.

30ohm

@Arvangen przez 20 lat używałem czystego Debiana, przez to że stał się tragiczny pod względem wrzucania głupich rozwiązań i mocno przestarzały nawet w wersji testowej to przesiadłem się na Fedorę. Idealnie też nie jest. Trzeba walczyć aby usunąć zbędny syf ale nie wywali się przy okazji jak na to miejsce np. w takim mincie

Lubiejeze

Ale nie rozumiem problemu? Czy ideą linuxa nie jest właśnie to, że mając uprawnienia roota możesz zrobić wszystko?

Nigdy nie używałam search for, ale pokazałeś dokładnie takie działanie, jakiego bym oczekiwała - czyli pełnej dowolności działania, jeśli używany z sudo

30ohm

@Lubiejeze chodzi o to że skrypt jest błędne napisany i pozwala na więcej niż powinien. Nawet bez sudo.

Lubiejeze

@30ohm a możesz wskazać przykłady tego pozwalania na za dużo?

W sensie rozumiem, że to nie jest dobrze napisany skrypt. Ale nie widzę, dlaczego miałby być niebezpieczny. Z tego co rozumiem, to działa more or less jak find. Włącznie z flagą -delete. Czy się mylę i daje jakieś możliwości, których find nie daje?

30ohm

@Lubiejeze niezamknięta składnia find możesz dorzucić -delete co pokazałem, możesz dodać -exec i inne parametry. Realnie niski poziom zagrożenia, ale zawsze jest jakieś ale. Można odpalić dowolną rzecz przez exec, jak nowa osoba waląca wszystko na pałę by dostała komendę z czymś takim to by ją wykonała. Skrypt robi find szukając plików i wykonuje na nich grep w celu szukania danego stringa. Błąd polega na tym, że błędnie ograniczają katalog.

Lubiejeze

@30ohm no ale tak samo ktoś piszący złośliwy skrypt może użyć find zamiast tego search i efekt będzie ten sam, czyż nie?

30ohm

@Lubiejeze owszem może dlatego piszę że słabe zagrożenie

Thereforee

@30ohm Rozumiem, że skrypt jest wadliwy i stary - nie powinno być go w repo. Ale trochę wyolbrzymiasz znaczenie czegoś takiego. Tak, użytkownik może namieszać kopiując niezrozumiałą komendę i nie zapali się lampka bo nie zaczyna się z rm...


Ale więcej użytkownik może namieszać używając wbudowanego narzędzia do instalacji sterowników GPU w Ubuntu... klikając po prostu Instaluj. XDDDD

Ubuntu po dziś dzień nie potrafi ogarnąć bezpiecznie instalacji tych sterowników. Mint go nie używa - i na całe k⁎⁎wa szczęście. Bo to śmietnik. ( ͠° ͟ʖ ͡°)

30ohm

@Thereforee wyolbrzymiam problem, bo pokazuje, że ta dystrybucja nigdy żadnego audytu nie przeszła. Skoro znalazłem taki problem w gówno skrypcie leżącym 18 lat w systemie to co będzie w ich środowisku graficznym?

Nie do końca z tymi sterownikami, że nie używa, pod spodem i tak instaluje dokladnie te same paczki z ubuntu.

BoTak

@Thereforee Więcej to można namieszać wszelakimi wbudowanymi narzędziami. Podniesienie uprawnień do sudo można robić z find, vi, crona, base64, cat, cp i wielu innych. Wystarczy źle skonfigurowany system.

Piwniczak1991

@30ohm środowisko graficzne Minta w wersji flagowej, czyli Cinnamon to rak i nie trzeba do tego mindsetu i wiedzy super usera, bo wystarczy zacząć tego używać jako daily i wychodzi prędzej czy później z jakim gniotem mamy do czynienia.
Wcześniej pisałeś, że używasz Fedory... możesz to polecić jako system daily dla kogoś kto klika, czasem włączy grę (nie produkcję AAA) i chce mieć stabilny system?
Kiedyś przez parę lat korzystałem z Debiana stabilnego, ale jestem już za stary na bycie entuzjastą i ogarniania wszystkiego samemu i oczekiwałbym gotowca.

30ohm

@Piwniczak1991 moi znajomi którzy grali na linux w większości na ubuntu, dosłownie od razu po wydaniu wersji 24.04 prawie 2 lata temu przeszli na fedorę, bo na ubuntu nie dało się grać i ogólnie system jest gniotem. Ja nie gram, bo mnie współczesne gry wkurwiają. Trzeba chwilę poświęcić aby system skonfigurować, na zasadzie tego co nie potrzebujemy albo potrzebujemy ale za to będzie działał poprawnie bez większych problemów. Przynajmniej nie ma tak starego softu jak debian, nawet testowy. Niektórzy jęczą, że działa źle. Szkoda, że nie mają styczności z ubuntu albo najnowszym debianem.

Co do gównamona wystarczy chcieć zrobić coś bardziej złożonego w tym środowisku i one się pięknie wywala. Nie rozumiem tego spuszczania się nad nim.

Piwniczak1991

@30ohm jeśli chodzi o gry to ja zatrzymałem się na Overwatchu 2, Finalsach i paru innych starociach jak Settletsi.
Jest sens bawić się w Nobarę? Czy stawiać czystą Fedorę?
PS: mam RX6600.

30ohm

@Piwniczak1991 ja używam czystej fedory, nie bawię się w jakieś dedykowane dystrybucje do gier bo nie mam na to czasu i główne przeznaczenie też mnie nie interesuje.

FriendGatherArena

@30ohm fajne ale niestety nadal nie wiem co to pentest

próbowałem kiedys Minta bo tak zachwalali ludzie ale strasznie zbugowany był i wrociłem na winde. ostatnio zainstalowałem Ubuntu i jest o wiele lepiej. ale ja jestem laikiem, pewnie mi zaraz napiszesz że tylko arch albo alpine

koszotorobur

@FriendGatherArena - Ubuntu też jest dla ludzi - siedź na takim distro na jakim Ci wszytko działa i jest Ci wygodnie.

Hugs

@FriendGatherArena oczywiście, że tylko Arch 😜 ale na serio, sam używam parę lat i na pewno bym go nie polecił na początek, tym bardziej jeśli ktoś po prostu chce zainstalować system i używać. z takich przystępnych to jeszcze openSUSE lubiłem ale nie wiem jak się teraz trzyma. Ale niech każdy używa co mu pasuje najlepiej, po to mamy wybór 😉

Faktycznie jest o wiele lepiej niz kiedyś, jak sobie przypomnę jak zaczynałem swoją przygodę i X Serwer sypał się jak stare gacie i te wszystkie przeboje ze sterownikami AMD i NVIDIA 😂

maly_ludek_lego

Tl;Dr jakie distro polecasz? archaa a może jakieś manjaro obudowane przez korpo? A może coś już czysto korporacyjnego typu RHEL?

Co jest Twoim zdaniem bezpieczne?

30ohm

@maly_ludek_lego aktualnie świat redhata jest bardziej stabilny i mają wywalone na jęczenie społeczności

maly_ludek_lego

@koszotorobur a co sądzisz o nixie? Mocno myślę nad przesiadką.

maly_ludek_lego

@koszotorobur ja to jestem team i3. Rozbudowane Interfejsy graficzne sa dla słabych ludzi

koszotorobur

@maly_ludek_lego - Próbowałem Nixa i innych dystrybucji atomowych/immutable i najbardziej pasuje mi Fedora Silverblue.

Zaletą Nixa jest deklaratywna konfiguracja - ale się trzeba trochę najebać by go ogarnąć.

Silverblue oparty jest na OSTree - aplikacje instaluje się głownie jako Flatpaki lub Kontenery - chociaż zawsze sobie możesz drzewo przebudować i zainstalować co tam Ci trzeba z repozytoriów permanentnie.

Jakbym miał teraz zaczynać z desktopami jako zielonka to pewnie poszedłbym w Ubuntu lub Minta... ale jakbym miał już odrobinę doświadczenia to najpewniej wybrałbym jakiegoś spina Fedory.

A jakbym miał system atomowy na serwer wybierać teraz po latach używania Debiana i RHELa i stanęło by pomiędzy Nixem a Fedorą - to wybrałbym Fedora CoreOS - bo i tak większość rzeczy co używam jest z kontenerów uruchamianych podmanen.

Fly_agaric

@koszotorobur @30ohm

A na czym stoi ten Zorin, co się tak media spuszczają? Ktoś to kojarzy?

Wygląda bardzo fajny - podobny do Fedora SilverBlue, w sensie, że można upodobnić do Windy i ludziów z Windy przesadzać.

30ohm

@Fly_agaric Ubuntu że zmienioną tapetą. Ja tych systemów nie uznaje. Tak realnie to nic nowego nie wnoszą.

b0lec

A ja bym dystrybucji typu arch czy fedora nigdy nie polecił zwykłemu uższykodnikowi, nie bez powodu ubuntu czy mint są popularne bo ich filozofia jest prosta "it just works". Większosc ludzi ma w d⁎⁎ie czy tam jest gtk1 czy gtk2, ważne że dziala. Na jednym kompie mam cachy os i nigdy bym jej nie power userowi nie polecił ostatnio musialem sie rypac z recznym instalowaniem cups i driverów do drukarki (sic! Lata 90 dzwonią), no fajnie umiem to ogarnac ale to nie dla zwyklego mirka co chce zeby mu wszystko dzialalo

FriendGatherArena

@b0lec czyli uzytkownicy cachy os nie chcą zeby im wszystko dzialalo?

b0lec

@FriendGatherArena tak jak napisalem, są różne distro jedne user friendly jedne mniej. Akurat cachy os to distro bazujące na arch jest bardziej strawne ale i tak bym linuksowemu noobowi nie polecil, dla początkującego ubuntu uważam że jest spoko

BoTak

Fajnie opisane, ale o podstawach zapomniałeś napisać.

Kto jest właścicielem pliku?

Jakie plik ma uprawnienia?


Może się okazać, że plik ma uprawnienia jedynie dla /usr/local/bin i może nabroić jedynie w tym jednym miejscu. No a jak ktoś głupi i uruchomi go jako superuser to wtedy jest to wina użytkownika

Amebcio

głupi błąd przez przeszło 18 lat.

To niestety jest stały problem w całym linuksie ogółem. Problemem nie jest to, że trywialne błędy się zdarzają, ale to, że mijają wieki zanim zostaną naprawione.


Przykład: KDE dumnie ogłosiło, że wreszcie użycie gamepada zatrzyma system przed przejściem w stan oszczędzania energii. O ile pamiętam ten bug istniał od co najmniej 2017r, kiedy to próbowałem grać na padzie w Nier:Automate.

Arientar

To niestety jest stały problem w całym linuksie ogółem.


@Amebcio co w sumie zabawne bo podobno cała idea open source I tego że każdy może dotrzeć w źródło miała być remedium i panaceum na takie bolączki

NiebieskiSzpadelNihilizmu

@Arientar bo to jest właśnie problem- ten mityczny open source to takie magiczne pudło, do którego wszyscy chcą wrzucać, żeby sobie móc podbić bębenek zajebistości, ale nikt nie chce wsadzać do tego pudła rąk i porządkować rzeczy, które tam już inni nawrzucali.

dziad_saksonski

Dlatego powstał redhat i nazwa też "nie od czapy" (ale się tu humorek zrobił xD).

Zaloguj się aby komentować