Ukázka · anonymizovaná pracovní kniha · smyšlená firma, skutečná struktura ← Zpět na nabídku penetračních testů
2M2Marsa PENTEST WORKBOOK
Zakázka UK-2026-09 · autorizovaný bezpečnostní test

Přehled a zadání

Bezpečnostní test firemního webu, e-shopu a hlavního serveru pro Ukázková firma s.r.o. Tato stránka shrnuje zadání, rozsah, pravidla testu a hlavní cesty útoku. Detailní nálezy jsou na záložce Nálezy, technický otisk cílů na Mapa cíle a náprava na Zabezpečení.

Zadání

KlientUkázková firma s.r.o. (jméno i kontakt anonymizovány)
PředmětBezpečnostní test 2 WordPress webů + hlavního serveru (VPS)
ZakázkaUK-2026-09 · září 2026 · 5 pracovních dní
Zdroj testujedna ohlášená IP (allowlist u klienta)

Rozsah

V rozsahuukazkova-firma.cz · eshop.ukazkova-firma.cz (203.0.113.10, vlastní server) souhlas ✓
Server203.0.113.10 (VPS, root přístup klienta) · nginx
Mimocokoli mimo tyto domény, e-mailový hosting třetí strany, platební brána, CDN

Pravidla testu

  • Black-box zvenčí (pohled útočníka z internetu), bez přihlašovacích údajů.
  • Throttling na produkci — e-shop běží, žádné zátěžové testy.
  • Testy z jedné ohlášené IP; hesla a účty se brute-forcem netestují.
  • Pasivní indicie se ověřují — buď potvrdí, nebo vyvrátí.
Cesty útoku
Jak by na sebe nálezy mohly navázat. První řetěz je přímý, druhý podmíněný — ani jeden není neautentizované převzetí serveru.

Cesta 1 · známé jméno + otevřený login

nejpříměji zneužitelná — heslo jsme záměrně nezkoušeli
Vstup
ukazkova-firma.cz
REST API /wp-json/wp/v2/users vrací nepřihlášeným jméno účtu „admin" — výchozí, nejhádanější.
Pivot
wp-login.php → správa webu
Login odpovídá 200, bez limitu pokusů, bez 2FA. Známé jméno + otevřený login = cílené hádání hesla.
Dopad
server 203.0.113.10
Administrátor WordPressu umí nahrát kód (plugin/téma). Z webu je pak krok k datům na serveru — včetně e-shopu.

Cesta 2 · zastaralý plugin slideru

podmíněný řetěz — jen s účtem Contributor+
Vstup (podmíněný)
ukazkova-firma.cz
Plugin slideru 6.7.1 (aktuální 6.7.3) — autentizované čtení souborů. Vyžaduje účet s právem přispěvatele.
Pivot
wp-config.php → DB
Čtení konfigurace webu vyzradí přístupové údaje k databázi.
Dopad
eshop.ukazkova-firma.cz
Sdílený server i databázový stroj — dosah na objednávky a zákaznická data e-shopu.

Takhle vypadá výsledek každého testu.

Pracovní kniha je pro toho, kdo bude opravovat. K ní dostanete manažerské PDF pro vedení — co test ukázal a co se má opravit první, bez žargonu.

Autorizovaný bezpečnostní test · zakázka UK-2026-09

Nálezy

Živý pracovní přehled nálezů. Průběžně se plní během testu: stav každého nálezu, důkazy z nástrojů a doporučená náprava. Pasivní indicie z prvotní analýzy jsou označené jako neověřené, dokud je test nepotvrdí nebo nevyvrátí.

Vysoká
1
Střední
4
Nízká
4
Otevřené / vyřešené
8 / 1 ✓ · 2 info
Stav ověření · 11 nálezů
Potvrz. 9 Běží 0 Čeká 1 Vyřeš. 1

ukazkova-firma.cz

203.0.113.10 · nginx · vlastní server (root)
vlastní server1 vysoká1 střední3 nízká

eshop.ukazkova-firma.cz

203.0.113.10 · nginx · WooCommerce
vlastní server2 střední2 nízká

server 203.0.113.10

VPS · Debian · nginx, PHP-FPM, MariaDB, vsftpd
vlastní server1 střední2 info
Potvrzeno Ověřuje se Neověřeno (pasivní indicie) Vyvráceno (ověřeno jako ne-problém)
Zobrazeno 11 z 11 nálezů
● živý nález
Popis

Plugin slideru běží ve verzi 6.7.1, oprava vyšla v 6.7.3. Zneužití vyžaduje účet s právem přispěvatele — řetěz je tedy podmíněný. Po získání účtu vede k přečtení libovolného souboru na webu včetně wp-config.php.

Dopad

Přístupové údaje k databázi → obsah, uživatelé, hashe hesel. Server je sdílený s e-shopem, takže dosah je i na objednávky a zákaznická data.

Doporučená náprava

Aktualizovat plugin (placený plugin potřebuje purchase code — doplnit), do té doby vypnout. Ověřit, že registrace uživatelů je zavřená a žádný účet Contributor+ nemá slabé heslo.

Reference
CVE ve veřejné databázi pluginůchangelog 6.7.3
Důkaz / výstup nástroje
wpscan --plugins-version-detection aggressive
  [!] slider-plugin · verze 6.7.1 · Latest: 6.7.3
  | Title: Authenticated (Contributor+) Arbitrary File Read
  | Fixed in: 6.7.3
● živý nález
Popis

Endpoint /wp-json/wp/v2/users je dostupný nepřihlášeným a vrací účet „admin". wp-login.php odpovídá 200 bez omezení počtu pokusů a bez druhého faktoru.

Dopad

Útočník zná polovinu přihlášení. Zbytek je otázka slovníku a času — a bez limitu pokusů ho má neomezeně. Toto je nejpříměji zneužitelná cesta v celém testu.

Doporučená náprava

Přejmenovat účet, zapnout 2FA, limit pokusů, skrýt user-enum (REST i ?author=) pro nepřihlášené. Ideálně wp-login za allowlist IP.

Reference
OWASP WSTG-IDNT-04WSTG-ATHN-03
Důkaz / výstup nástroje
GET /wp-json/wp/v2/users  → 200  [{"id":1,"slug":"admin",…}]
GET /wp-login.php          → 200  (bez rate-limitu, bez 2FA)
GET /?author=1             → 301 → /author/admin/
● živý nález
Popis

Port 21 je otevřený a server nabízí pouze plaintext přihlášení (AUTH TLS nenabízeno). Kdokoliv na cestě — typicky veřejná Wi-Fi — může heslo odposlechnout.

Dopad

FTP účet má zápis do webrootu obou webů. Odposlechnuté heslo = nahrání libovolného kódu bez nutnosti prolomit WordPress.

Doporučená náprava

FTP vypnout a nahradit SFTP (jede přes SSH, který už je zabezpečený). Pokud FTP musí zůstat: vynutit FTPS a omezit port 21 na allowlist IP.

Reference
CWE-319 Cleartext Transmission
Důkaz / výstup nástroje
nmap -sV 203.0.113.10
  21/tcp   open      ftp    vsftpd 3.0.x   (AUTH TLS nenabízeno)
  22/tcp   filtered  ssh                   (geo-blok + fail2ban ✓)
  80/tcp   open      http   nginx
  443/tcp  open      https  nginx
● živý nález
Popis

/wp-content/uploads/wc-logs/ vrací výpis adresáře. Soubory logů obsahují e-maily zákazníků, ID objednávek a chybové hlášky platební brány.

Dopad

Únik osobních údajů zákazníků bez jakéhokoli přihlášení — potenciálně incident dle GDPR s ohlašovací povinností.

Doporučená náprava

V nginx zakázat listing (autoindex off) a přístup k wc-logs/ úplně zablokovat; logy přesunout mimo webroot. Zkontrolovat, zda už někdo soubory nestáhl (access log).

Reference
CWE-548 Directory ListingGDPR čl. 33
Důkaz / výstup nástroje
GET /wp-content/uploads/wc-logs/  → 200  "Index of /wp-content/uploads/wc-logs/"
  fatal-errors-2026-08-14-….log     41 kB
  payment-gateway-2026-08-….log    112 kB   (obsahuje e-maily, order_id)
Popis

Jádro e-shopu je o jednu hlavní verzi zpozadu (6.8.x vs. aktuální 7.0). Prezentační web má 7.0 — aktualizace se tedy dělá, jen ne na obou webech stejně.

Dopad

Veřejně známé opravené chyby zůstávají na e-shopu otevřené. Samy o sobě dnes nedávají přímý průnik, ale snižují odolnost celého řetězu.

Doporučená náprava

Aktualizovat jádro, zapnout automatické aktualizace menších verzí. Před aktualizací záloha a test na staging — e-shop má platební bránu.

Důkaz / výstup nástroje
wpscan --url https://eshop.ukazkova-firma.cz
  [+] WordPress version 6.8.x identified (Outdated)
  | Found By: Rss Generator (Passive Detection)
Popis

Odpověď obsahuje jen X-Content-Type-Options. Chybí HSTS, Content-Security-Policy, X-Frame-Options a Referrer-Policy.

Dopad

Možný clickjacking, bez ochrany při prvním připojení (downgrade na HTTP), únik referreru na třetí strany.

Doporučená náprava

Doplnit hlavičky v nginx (add_header). HSTS zapnout až po ověření, že vše jede přes HTTPS; CSP nasadit nejdřív v report-only.

Důkaz / výstup nástroje
curl -sI https://ukazkova-firma.cz | grep -iE 'strict|content-security|x-frame|referrer'
  (prázdné)
  x-content-type-options: nosniff
Popis

Téma načítá jQuery 2.2.4 vedle jádrové 3.7.1. Starší verze má známé XSS chyby v manipulaci s HTML.

Dopad

Zneužitelné jen v kombinaci s místem, kde se uživatelský vstup vkládá do stránky — v testu takové nenalezeno. Proto nízká.

Doporučená náprava

Odstranit načítání 2.2.4, dohledat, který plugin či téma ji tahá, sjednotit na jednu aktuální verzi.

Popis

/wp-content/plugins/*/readme.txt je dostupné a prozrazuje přesné verze všech pluginů.

Dopad

Útočník nemusí hádat — přesně ví, na které CVE mířit. Samo o sobě není díra, ale zkracuje cestu k ní.

Doporučená náprava

V nginx zakázat přístup k readme.txt, changelog.txt a license.txt v adresáři pluginů.

○ pasivní indicie — čeká na ověření
Popis

Cesta k assetu naznačuje starší verzi knihovny karuselu, ale soubor je minifikovaný a verze v něm chybí. Zvenčí se nedá potvrdit ani vyvrátit.

Dopad

Pokud je verze skutečně stará: XSS přes atributy slidů. Pokud ne: nic. Proto nálezu držíme nízkou závažnost a stav neověřeno.

Doporučená náprava

Ověřit verzi v administraci (nebo přes SSH). Když je stará → aktualizovat; když ne → nález vyvrátit. Neopravovat naslepo.

Popis

Prvotní skener označil xmlrpc.php jako dostupný. Aktivní test vrací 403 na úrovni nginx.

Závěr

Endpoint je blokovaný. Zesílení brute-force přes pingback není možné — nález vyřazen. Nic se neopravuje naslepo.

Důkaz / výstup nástroje
POST /xmlrpc.php  → 403 Forbidden (nginx)
Popis

SSH je z veřejného internetu filtrované (geo-blok) a chráněné fail2banem. TLS jen 1.2/1.3, forward secrecy, AEAD šifry, platný certifikát.

Proč je to v reportu

Doklad dobře nastaveného přístupu k serveru a transportní vrstvy. Do reportu patří i to, co je v pořádku — jinak se z něj nedá poznat, co má klient bránit a co má hotové.

Důkaz / výstup nástroje
testssl.sh ukazkova-firma.cz
  TLS 1.2 ✓  TLS 1.3 ✓  TLS 1.0/1.1 ✗   Overall Grade: A+
nmap -p22 203.0.113.10 → filtered
Rekognoskace · shromážděné informace

Mapa cíle

Přehled všeho, co jsme o cílech zjistili — infrastruktura, technologický otisk každého webu, odhalené endpointy a úniky. Slouží jako referenční mapa pro toho, kdo bude opravovat: ví přesně, co útočník vidí zvenčí.

Provozovatel
Ukázková firma s.r.o.
kontaktní osoba a adresa anonymizovány
CZ203.0.113.10
nginx · vlastní VPS · root u klienta
ukazkova-firma.cz 1 vys · 1 stř · 3 níz
eshop.ukazkova-firma.cz 2 stř · 2 níz
⚠ Sdílený server i databáze — kompromitace jednoho webu ohrožuje druhý (viz Cesta 2 na Přehledu).

ukazkova-firma.cz

203.0.113.10 · nginx · vlastní (root)
Jádro
WordPress 7.0aktuální
Téma
firemni-tema-child (vlastní)
Pluginy / komponenty
slider-plugin 6.7.1 · fix 6.7.3SEO plugincookie lištacache
JS knihovny
jQuery 2.2.4 + 3.7.1Bootstrap 4.x
Endpointy
xmlrpc.php403 · blokováno ✓
REST /users200 · vrací „admin"
wp-login.php200 · bez limitu, bez 2FA
?author= enum301 → /author/admin/
Expozice / úniky
TLSA+ (1.2/1.3, FS) ✓
Hlavičkyjen nosniff · chybí HSTS/CSP/XFO
Subdoményeshop. · mail. (třetí strana)
nuclei 0 kritických · user-enum otevřeno · xmlrpc 403 · TLS A+

eshop.ukazkova-firma.cz

203.0.113.10 · nginx · WooCommerce
Jádro
WordPress 6.8.xOutdated
Téma
eshop-tema (komerční)
Pluginy / komponenty
WooCommerceplatební bránakarusel verze neurčitelnádoprava
Endpointy
/uploads/wc-logs/200 · directory listing
plugins/*/readme.txt200 · verze čitelné
xmlrpc.php403 · blokováno ✓
/wp-json/wc/storeveřejné API obchodu (očekávané)
Expozice / úniky
TLSA+ ✓
Hlavičkychybí HSTS/CSP/XFO
Platbypřesměrování na bránu (mimo rozsah)
nuclei 0 kritických · listing wc-logs · jádro outdated

server 203.0.113.10

VPS · Debian · správa u klienta
Otevřené porty
21/tcpftp · vsftpd · plaintext
22/tcpssh · filtered (geo-blok) ✓
80/443nginx · 80 → 301 na 443 ✓
3306zavřeno zvenčí ✓
Ochrany
fail2bangeo-blok SSHufw
Zálohy
zvenčí nedostupné ✓ (ověřeno jen negativně)
nmap 4 otevřené · ftp plaintext · ssh filtered · db zavřená
Náprava · co, kde a jak zabezpečit

Zabezpečení a doporučení

Nejdřív konkrétní kroky vycházející z tohoto testu (seřazené podle priority), pak obecná doporučení k zabezpečení WordPressu a serveru, která platí napříč. Priorita se řídí závažností a tím, jak přímo je nález zneužitelný.

Vyvrácené nálezy (xmlrpc) tu nejsou — jsou vyřešené. Krok označený „Neověřeno" potvrďte nejdřív (verze v administraci), ať se neopravuje naslepo.
Prioritní kroky z testu
Číslo = pořadí, ve kterém bychom to řešili my.
Vysoká priorita · 2
1
Účet „admin" + otevřený loginukazkova-firma.cz
Přejmenovat účet, zapnout 2FA, limit pokusů, skrýt user-enum (REST i ?author=) pro nepřihlášené. Zavírá nejpříměji zneužitelnou cestu — proto první, i když je závažnost „střední".
Potvrzeno
2
Plugin slideru 6.7.1 — čtení souborůukazkova-firma.cz
Aktualizovat na 6.7.3 (doplnit purchase code), do té doby vypnout. Zkontrolovat, že registrace uživatelů je zavřená.
Potvrzeno
Střední priorita · 3
3
Veřejně čitelné logy e-shopueshop.ukazkova-firma.cz
autoindex off, zablokovat wc-logs/, logy mimo webroot. Projít access log, jestli už někdo soubory nestáhl — pak rozhodnout o ohlášení.
Potvrzeno
4
FTP → SFTP203.0.113.10
Vypnout vsftpd, používat SFTP přes již zabezpečené SSH. Změnit heslo FTP účtu (mohlo být odposlechnuto kdykoli v minulosti).
Potvrzeno
5
Jádro e-shopu 6.8.x → 7.0eshop.ukazkova-firma.cz
Aktualizovat po záloze a testu na staging. Zapnout automatické aktualizace menších verzí na obou webech stejně.
Potvrzeno
Nízká priorita · 4
6
Bezpečnostní hlavičkyoba weby
HSTS, CSP (nejdřív report-only), X-Frame-Options, Referrer-Policy v nginx.
7
Zakázat readme.txt / changelog.txt v pluginecheshop.ukazkova-firma.cz
Jedno location pravidlo v nginx.
8
Ověřit verzi karuselueshop.ukazkova-firma.cz
V administraci nebo přes SSH. Stará → aktualizovat; aktuální → nález vyvrátit.
Neověřeno
9
Odstranit jQuery 2.2.4ukazkova-firma.cz
Dohledat, kdo ji tahá (téma/plugin), sjednotit na 3.7.1.
Obecná doporučení
Platí bez ohledu na tento test. Většina je práce na hodinu, ne na týden.

Aktualizace a komponenty

  • Zapnout automatické aktualizace jádra i pluginů (menší verze automaticky).
  • Placené pluginy potřebují purchase code, jinak se neaktualizují — doplnit.
  • Odstranit nepoužívané pluginy a témata (menší útočná plocha).
  • Sledovat CVE u nasazených komponent.

Autentizace a účty

  • Nepoužívat výchozí jméno „admin"; přejmenovat privilegované účty.
  • Vynutit 2FA a silná hesla u všech administrátorů a editorů.
  • Limit přihlašovacích pokusů (proti brute-force).
  • Skrýt REST user-enum i ?author= pro nepřihlášené.

Síť a přístup

  • Blokovat xmlrpc.php, pokud není potřeba (hotovo).
  • wp-login chránit — IP allowlist / basic-auth / 2FA.
  • Žádný plaintext protokol na veřejné IP (FTP, telnet, HTTP bez přesměrování).
  • Administrativní služby držet za VPN, ne na veřejné IP.

Hlavičky, TLS a data

  • HSTS, CSP, X-Frame-Options, Referrer-Policy, Permissions-Policy.
  • Logy a zálohy nikdy ve webrootu; directory listing vypnutý globálně.
  • Cookies Secure / HttpOnly / SameSite.
  • Externí skripty připnout na verzi (SRI), ideálně self-host.
Stručný postup zabezpečení 2026

Postup 2026

Co dnes považujeme za rozumné minimum pro firemní WordPress a vlastní server. Není to seznam všeho možného — je to pořadí, ve kterém se to má dělat, aby každý krok dával smysl i bez těch dalších.

Web (WordPress)

  1. Aktualizace automaticky — jádro, pluginy, témata; k tomu sledování CVE u nasazených komponent.
  2. Phishing-odolná MFA / passkeys pro všechny admin a editory. Žádné výchozí jméno „admin".
  3. Ztvrdit přihlášení — limit pokusů, wp-login za allowlist/2FA, vypnout user-enum, blokovat xmlrpc.
  4. Bezpečnostní hlavičky — HSTS (preload), CSP, X-Frame-Options, Referrer-Policy, Permissions-Policy.
  5. Dodavatelský řetězec — externí skripty připnout na verzi + SRI; cookies Secure/HttpOnly/SameSite.
  6. Minimalizace — odstranit nepoužívané pluginy/témata, nejmenší oprávnění, rotace klíčů a hesel.

Server

  1. Zero-trust přístup — SSH jen klíčem + MFA, geo-blok/allowlist; admin služby (DB, panel, monitoring) jen za VPN.
  2. Automatické bezpečnostní aktualizace OS a služeb; pravidelný restart, když to jádro vyžaduje.
  3. Firewall jako výchozí zamítnutí — otevřené jen 80/443 a to, co má důvod; žádný plaintext protokol.
  4. Oddělení — každý web vlastní PHP-FPM pool a DB uživatel; kompromitace jednoho nesmí být kompromitací všech.
  5. Zálohy mimo stroj a jednou za čas zkouška obnovy. Záloha, která se nikdy neobnovila, není záloha.
  6. Logy a alerting — fail2ban, centralizované logy, upozornění na neobvyklé přihlášení.
Odhad náročnosti kompromitace
Pro vedení: jak těžké by bylo se k vám dostat, cíl po cíli. „Vysoká" = pro útočníka těžké, dobře pro vás.
CílOdhad času & náročnostiRealistická hlavní cestaVektory (odhad)Klíčová pojistka / slabina
ukazkova-firma.cz Střední
hodiny–dny (dle hesla)
Hádání hesla na otevřený wp-login se známým jménem „admin". ~ 20–40 cílených otevřený login + výchozí jméno; xmlrpc blokované, TLS A+.
eshop.ukazkova-firma.cz Střední
dny
Přes prezentační web (sdílený server), nebo únik dat z veřejných logů bez průniku. ~ 10–20 cílených listing wc-logs = únik bez průniku; jádro zpozadu.
203.0.113.10 Vysoká
dny+
Jen přes přihlašovací údaje (odposlech FTP) nebo webshell z jednoho z webů. ~ 5–10 cílených SSH filtrované + fail2ban, DB zavřená; slabina = plaintext FTP.
Čtení tabulky: odolnost celku stojí a padá se silou hesel a 2FA. Po opravě kroků 1–4 ze Zabezpečení se všechny tři řádky posunou na „Vysoká".

Chcete tohle pro svůj web a server?

Pentest veřejné strany + hlavního serveru za 20 000 Kč bez DPH, do 5 pracovních dní, retest v ceně. Nebo nejdřív sken webu za 5 000 Kč, ať víte, jestli má smysl jít dál.