Interaktywna aplikacja do nauki komend Linux, Kali i Purple Team, w całości po polsku.
Działa lokalnie w przeglądarce, bez żadnego backendu — cały postęp zapisywany jest
w localStorage Twojej przeglądarki.
Aplikacja musi być serwowana przez HTTP (nie file://), żeby Service Worker (offline)
oraz Content-Security-Policy działały poprawnie. Najprościej:
cd root-app # katalog z tym README
python3 -m http.server 8080Potem wejdź w przeglądarce na http://localhost:8080.
Node.js (alternatywnie):
npx serve .Instalacja PWA (ikona na pulpicie, tryb offline, pełny ekran) wymaga hostingu po HTTPS
(localhost też działa do testów, ale nie na telefonie w sieci domowej).
Najszybsze darmowe opcje:
- GitHub Pages — wrzuć zawartość tego folderu do repozytorium i włącz Pages w ustawieniach.
- Netlify / Vercel — przeciągnij i upuść cały folder na netlify.com/drop.
- Cloudflare Pages — podobnie, deploy przez przeciągnięcie folderu.
Po wejściu na wdrożony adres przeglądarka (Chrome/Edge/Android) pokaże na górze ekranu baner „Zainstaluj TuxLab jako aplikację” z przyciskiem instalacji. Na iOS Safari (który nie wspiera automatycznego banera) aplikacja pokaże własną podpowiedź: „Udostępnij → Dodaj do ekranu początkowego”.
Estetyka celowo unika typowego „neon hacker template" (cyan/fiolet wszędzie, emoji jako ikony). Zamiast tego:
- Ograniczona paleta — zielony (git-diff/systemd) jako kolor funkcjonalny (postęp, sukces, linki), czerwony dla błędów, fiolet zarezerwowany wyłącznie dla testów końcowych i sekwencji startowej — rzadkość koloru = jego ranga.
- Ścieżka kategorii zamiast listy kart — kategorie ułożone jako węzły na przemian
lewo/prawo wzdłuż pionowej osi (
.chain-wrap), z pierścieniem postępu przy każdym węźle. Kolejność kategorii odzwierciedla realną sekwencję pracy pentestera (rekonesans → enumeracja → eksploatacja → pivoting → hardening). - Mono-glify zamiast emoji — ikony kategorii to bracketowe symbole (
[#],[?],[||]), spójne z estetyką terminala. - Log systemowy zamiast dekoracji — ekran wyniku testu, feedback w quizach i moment
sukcesu (
successFlash) używają formatu[OK]/[FAIL]w stylusystemd/git diff, zamiast emoji czy konfetti. - Sekwencja startowa — przy pierwszym wejściu (
localStorage: tuxlab_boot_seen) pokazuje się krótki, pomijalny log rozruchowy. Respektujeprefers-reduced-motion(wtedy pomijany całkowicie) i nie blokuje treści dla czytników ekranu (aria-hidden, focus nigdy nie jest w nim uwięziony). - Nazwy plików kategorii — każda kategoria ma fikcyjne rozszerzenie pliku
(
firewall.rules,ssh.key,threat-hunting.log) jako dodatkowy akcent tematyczny.
Oprócz pierwotnych 14 kategorii (fundamenty, uprawnienia, procesy, sieć, rekonesans, enumeracja webowa, podatności, ruch sieciowy, eksploatacja, tunelowanie, threat hunting, SSH, bash/automatyzacja, firewall) doszły:
- Pliki i katalogi — touch, mkdir, cp, mv, rm, rmdir
- Narzędzia pomocnicze — sort, wc, nl, clear, locate, whereis, date, help, finger
- Pakiety (APT) — apt update/upgrade/install/remove, apt-get, apt search
- Struktura systemu plików — /bin /boot /dev /etc /home /lib /opt /proc /root /sbin /tmp /usr /var
Do „Uprawnień” doszła notacja drwxr-xr-x (typ pliku, właściciel/grupa/inni, liczba
dowiązań) i typowe tryby liczbowe (777, 755, 644, 750, 000). Do „Sieci — podstawy” doszedł
ifconfig, a do „SSH” — uruchamianie/zatrzymywanie usługi (systemctl start/stop ssh).
Każda kategoria ma: lekcję (opis PL + znaczenie EN + przykład), a następnie trzy testy, z których każdy obejmuje wszystkie komendy z lekcji:
- Test ABCD — wybierz poprawną komendę z 4 opcji.
- Wpisz komendę (z podpowiedzią) — samodzielne wpisanie, z podpowiedzią widoczną od razu.
- Wpisz wszystko (bez podpowiedzi) — samodzielne wpisanie z pamięci, bez podpowiedzi.
W testach 2 i 3: błędna odpowiedź pokazuje poprawne rozwiązanie i wymaga jej wpisania, zanim można przejść dalej — ale do wyniku % liczy się tylko pierwsza próba (jak w teście ABCD).
Po zaliczeniu testu (≥70%) pojawia się przycisk „Przejdź dalej”, prowadzący automatycznie do kolejnego testu w danej kategorii, a po ukończeniu wszystkich trzech — do lekcji kolejnej kategorii.
Testy końcowe (2 testy mieszające pytania ze wszystkich kategorii) odblokowują się dopiero po ukończeniu WSZYSTKICH 18 kategorii (lekcja + wszystkie 3 testy w każdej).
index.html — punkt wejścia, meta CSP, ładowanie skryptów
manifest.json — manifest PWA (nazwa, ikony, kolory)
sw.js — Service Worker (cache offline, tylko zasoby własne)
css/style.css — cały styl wizualny (motyw terminal dark, WCAG AA)
js/data.js — treść merytoryczna: 18 kategorii, lekcje, pytania
js/app.js — logika aplikacji (routing, quizy, zapis postępu)
icons/ — ikony PWA 192x192 i 512x512
- Zero zależności zewnętrznych, zero wywołań sieciowych — aplikacja nie łączy się z żadnym serwerem ani API, więc nie ma powierzchni ataku typu „przechwycone dane”.
- Ścisła polityka
Content-Security-Policy:script-srcograniczony wyłącznie do'self'(zero inline skryptów, zeroeval) — to jest właściwa ochrona przed XSS.style-srcdopuszcza'unsafe-inline', bo interfejs oblicza dynamicznie procenty (pierścień postępu kategorii, pasek postępu) — atrybutystylenie mogą wykonać kodu JS, więc to bezpieczny, standardowy kompromis. Zablokowaneobject-src,frame-ancestorsitd. - Wszystkie dane pochodzące od użytkownika (odpowiedzi w quizach) są wstawiane do DOM
przez
textContent/escapowanie HTML — nigdy przezinnerHTMLz surowym tekstem, co eliminuje ryzyko DOM-based XSS. - Service Worker cache'uje wyłącznie zasoby z tej samej domeny (
same-origin), nie proxuje żadnych zewnętrznych żądań. - Brak
eval()na danych pochodzących od użytkownika, brak dynamicznego ładowania kodu.
W aplikacji, na dole ekranu głównego: przycisk „Wyzeruj postęp (localStorage)”.
Ręcznie: w konsoli przeglądarki localStorage.removeItem('tuxlab_progress_v2').
Żeby każdy test obejmował WSZYSTKIE komendy z lekcji (nie tylko ręcznie napisany
podzbiór), js/data.js automatycznie dopełnia testy o brakujące pozycje na podstawie
pola example każdej komendy. Pytanie zawsze jawnie podaje "cel" (np. konkretną ścieżkę
czy host), jeśli wykracza on poza to, co opisuje pole pl — inaczej pytanie byłoby
nie do rozwiązania (np. "wylistuj katalog" bez podania, który katalog). Jeśli dodajesz
nową komendę z przykładem zawierającym konkretny argument (plik, host, port), upewnij
się, że pole pl albo sam auto-generator jasno komunikuje ten argument — w przeciwnym
razie dopisz pytanie ręcznie w quiz1/quiz2 z pełnym kontekstem w treści.
Wszystkie pytania i lekcje są w jednym pliku js/data.js, w prostej strukturze
JS (bez builda, bez frameworka) — możesz dopisywać kolejne kategorie/pytania
kopiując istniejący wzorzec obiektu.