Spotkałem się ostatnio z małym wyzwaniem: "jak przekazać plik binarny z laptopa atakującego na serwer terminali". Serwer terminali był poddany procesowi hardeningu, w warstwie sieciowej był dostępny tylko port 3389 (RDP), nie było aktywne mapowanie dysków z klienta... Działało natomiast mapowanie schowka. Ale jak w ten sposób przekazać plik binarny?
...bo clipboard był mapowany...
Wbrew pozorom jest to stosunkowo proste. Jak to zrobić? Skoro mogę kopiować tekst, to mogę skopiować również jakiś skrypt... Wiele osób uważa, że Windows nie ma dobrego "języka skryptowego". Cóż, od dość dawna w systemie jest coś, co się nazywa Windows Scripting Host. Pozwala on na wykonywanie skryptów w językach JScript i VBScript (można też i w innych językach, ale te dwa są na standardzie). Dodatkowo można korzystać z obiektów ActiveX. Wystarczą dwa obiekty:
- ADODB.Stream,
- Microsoft.XMLDOM,
Po co korzystać z ADODB.Stream? Programy mają taką brzydką cechę, że są plikami binarnymi. Operacje na plikach można wykonywać co prawda za pomocą obiektu FileScriptingObject. Niestety, jeśli chodzi o zapis do plików, to nadaje się on tylko do operacji na plikach tekstowych (a mowa o binarnych). ADODB.Stream pozwala zapisać plik binarny.
Po co Microsoft.XMLDOM? Metoda Write z ADODB.Stream przyjmuje "byte array", niestety, nie potrafię stworzyć jej w sensowny sposób w czystym JScript. Nie mówię, że się nie da, nie wiem jednak jak to zrobić. Problem ten można jednak obejść korzystając właśnie z Microsoft.XMLDOM. Wystarczy po prostu:
- stworzyć nowy element,
- ustawić typ danych na bin.hex,
- w atrybucie text zapisać odpowiednio zakodowany plik binarny,
- odczytać wartość atrybutu nodeTypedValue,
Tak przygotowaną wartość można już użyć w metodzie Write. Następnie można wykorzystać metodę SaveToFile by plik binarny zapisać.
Jak więc wygląda całość operacji?
- wybieramy plik, który chcemy przekazać,
- kodujemy go (zamiana na HEX),
- wklejamy go w skrypt,
- przeklejamy skrypt na serwer przez clipboard,
- uruchamiamy i patrzymy jak pojawia się pożądany plik,
Jako proof-of-concept napisałem sobie skrypt (w Pythonie oczywiście), który dla wskazanego pliku binarnego generuje skrypt JScript. Skrypt ten "zawiera w sobie" wskazany plik. Po uruchomieniu skryptu, plik zostaje zapisany na dysku. Zweryfikowane - działa.
...i w ten prosty sposób nie dość, że wcześniej uruchomiłem własny kod na testowanym serwerze (skrypt to JEST mój własny kod), to jeszcze przekazałem na niego swoje pliki binarne (potencjalnie - exploita).
Jeśli zastanawiasz się o co chodzi w tytule tego wpisu, to spieszę wyjaśnić, że o nic. Po prostu nie miałem pomysłu jak go zatytułować, więc wygenerowałem sobie coś takiego A to dlatego, że wpis ten nie ma żadnego konkretnego tematu. No dobrze, może i
Przesłany: Mar 21, 22:20