mirror of
https://github.com/moparisthebest/curl
synced 2024-11-15 14:05:03 -05:00
ftpserver.pl: three new custom FTP server commands to disable data channel
NODATACONN421: applies only to active FTP mode, instructs server to not establish data connection back to client and reply with FTP 421. NODATACONN425: applies only to active FTP mode, instructs server to not establish data connection back to client and reply with FTP 425. NODATACONN: applies to both active and passive FTP modes, instructs server to not establish nor accept a data channel and fool client into believing that the data channel connection is possible. Some polishing probably required.
This commit is contained in:
parent
ddeab48245
commit
c761fcb055
@ -132,6 +132,9 @@ my $retrweirdo; # set if ftp server should use RETRWEIRDO
|
|||||||
my $retrnosize; # set if ftp server should use RETRNOSIZE
|
my $retrnosize; # set if ftp server should use RETRNOSIZE
|
||||||
my $pasvbadip; # set if ftp server should use PASVBADIP
|
my $pasvbadip; # set if ftp server should use PASVBADIP
|
||||||
my $nosave; # set if ftp server should not save uploaded data
|
my $nosave; # set if ftp server should not save uploaded data
|
||||||
|
my $nodataconn; # set if ftp srvr doesn't establish or accepts data channel
|
||||||
|
my $nodataconn425; # set if ftp srvr doesn't establish data ch and replies 425
|
||||||
|
my $nodataconn421; # set if ftp srvr doesn't establish data ch and replies 421
|
||||||
my %customreply; #
|
my %customreply; #
|
||||||
my %customcount; #
|
my %customcount; #
|
||||||
my %delayreply; #
|
my %delayreply; #
|
||||||
@ -1071,7 +1074,7 @@ sub PASV_ftp {
|
|||||||
logmsg "failed to run sockfilt for data connection\n";
|
logmsg "failed to run sockfilt for data connection\n";
|
||||||
killsockfilters($proto, $ipvnum, $idnum, $verbose, 'data');
|
killsockfilters($proto, $ipvnum, $idnum, $verbose, 'data');
|
||||||
sendcontrol "500 no free ports!\r\n";
|
sendcontrol "500 no free ports!\r\n";
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
logmsg "Run sockfilt for data on pid $slavepid\n";
|
logmsg "Run sockfilt for data on pid $slavepid\n";
|
||||||
@ -1102,6 +1105,12 @@ sub PASV_ftp {
|
|||||||
$pasvport = $2;
|
$pasvport = $2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($nodataconn) {
|
||||||
|
# kill data sockfilter and make believe the client
|
||||||
|
# that it is possible to establish a data connection.
|
||||||
|
killsockfilters($proto, $ipvnum, $idnum, $verbose, 'data');
|
||||||
|
}
|
||||||
|
|
||||||
if($cmd ne "EPSV") {
|
if($cmd ne "EPSV") {
|
||||||
# PASV reply
|
# PASV reply
|
||||||
my $p=$listenaddr;
|
my $p=$listenaddr;
|
||||||
@ -1117,6 +1126,11 @@ sub PASV_ftp {
|
|||||||
sendcontrol sprintf("229 Entering Passive Mode (|||%d|)\n", $pasvport);
|
sendcontrol sprintf("229 Entering Passive Mode (|||%d|)\n", $pasvport);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($nodataconn) {
|
||||||
|
logmsg "client fooled, running without data connection\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
eval {
|
eval {
|
||||||
local $SIG{ALRM} = sub { die "alarm\n" };
|
local $SIG{ALRM} = sub { die "alarm\n" };
|
||||||
|
|
||||||
@ -1162,13 +1176,16 @@ sub PORT_ftp {
|
|||||||
my $port;
|
my $port;
|
||||||
my $addr;
|
my $addr;
|
||||||
|
|
||||||
|
# kill previous data connection sockfilt when alive
|
||||||
|
killsockfilters($proto, $ipvnum, $idnum, $verbose, 'data');
|
||||||
|
|
||||||
# We always ignore the given IP and use localhost.
|
# We always ignore the given IP and use localhost.
|
||||||
|
|
||||||
if($cmd eq "PORT") {
|
if($cmd eq "PORT") {
|
||||||
if($arg !~ /(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)/) {
|
if($arg !~ /(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)/) {
|
||||||
logmsg "bad PORT-line: $arg\n";
|
logmsg "bad PORT-line: $arg\n";
|
||||||
sendcontrol "500 silly you, go away\r\n";
|
sendcontrol "500 silly you, go away\r\n";
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
$port = ($5<<8)+$6;
|
$port = ($5<<8)+$6;
|
||||||
$addr = "$1.$2.$3.$4";
|
$addr = "$1.$2.$3.$4";
|
||||||
@ -1178,7 +1195,7 @@ sub PORT_ftp {
|
|||||||
if($arg !~ /(\d+)\|([^\|]+)\|(\d+)/) {
|
if($arg !~ /(\d+)\|([^\|]+)\|(\d+)/) {
|
||||||
logmsg "bad EPRT-line: $arg\n";
|
logmsg "bad EPRT-line: $arg\n";
|
||||||
sendcontrol "500 silly you, go away\r\n";
|
sendcontrol "500 silly you, go away\r\n";
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
sendcontrol "200 Thanks for dropping by. We contact you later\r\n";
|
sendcontrol "200 Thanks for dropping by. We contact you later\r\n";
|
||||||
$port = $3;
|
$port = $3;
|
||||||
@ -1186,12 +1203,31 @@ sub PORT_ftp {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sendcontrol "500 we don't like $cmd now\r\n";
|
sendcontrol "500 we don't like $cmd now\r\n";
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!$port || $port > 65535) {
|
if(!$port || $port > 65535) {
|
||||||
print STDERR "very illegal PORT number: $port\n";
|
print STDERR "very illegal PORT number: $port\n";
|
||||||
return 1;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($nodataconn) {
|
||||||
|
# don't establish data connection back to client,
|
||||||
|
# and don't send anything over control connection.
|
||||||
|
logmsg "client fooled, will not connect back to him\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
elsif($nodataconn425) {
|
||||||
|
# don't establish data connection back to client,
|
||||||
|
# reply with 425 over control connection.
|
||||||
|
sendcontrol "425 Can't open data connection\r\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
elsif($nodataconn421) {
|
||||||
|
# don't establish data connection back to client
|
||||||
|
# reply with 421 over control connection.
|
||||||
|
sendcontrol "421 Connection timed out\r\n";
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
# We fire up a new sockfilt to do the data transfer for us.
|
# We fire up a new sockfilt to do the data transfer for us.
|
||||||
@ -1230,6 +1266,9 @@ sub customize {
|
|||||||
$retrnosize = 0; # default is no use of RETRNOSIZE
|
$retrnosize = 0; # default is no use of RETRNOSIZE
|
||||||
$pasvbadip = 0; # default is no use of PASVBADIP
|
$pasvbadip = 0; # default is no use of PASVBADIP
|
||||||
$nosave = 0; # default is to actually save uploaded data to file
|
$nosave = 0; # default is to actually save uploaded data to file
|
||||||
|
$nodataconn = 0; # default is to establish or accept data channel
|
||||||
|
$nodataconn425 = 0; # default is to not send 425 without data channel
|
||||||
|
$nodataconn421 = 0; # default is to not send 421 without data channel
|
||||||
%customreply = (); #
|
%customreply = (); #
|
||||||
%customcount = (); #
|
%customcount = (); #
|
||||||
%delayreply = (); #
|
%delayreply = (); #
|
||||||
@ -1271,6 +1310,21 @@ sub customize {
|
|||||||
logmsg "FTPD: instructed to use PASVBADIP\n";
|
logmsg "FTPD: instructed to use PASVBADIP\n";
|
||||||
$pasvbadip=1;
|
$pasvbadip=1;
|
||||||
}
|
}
|
||||||
|
elsif($_ =~ /NODATACONN425/) {
|
||||||
|
# applies only to active FTP mode
|
||||||
|
logmsg "FTPD: instructed to use NODATACONN425\n";
|
||||||
|
$nodataconn425=1;
|
||||||
|
}
|
||||||
|
elsif($_ =~ /NODATACONN421/) {
|
||||||
|
# applies only to active FTP mode
|
||||||
|
logmsg "FTPD: instructed to use NODATACONN421\n";
|
||||||
|
$nodataconn421=1;
|
||||||
|
}
|
||||||
|
elsif($_ =~ /NODATACONN/) {
|
||||||
|
# applies to both active and passive FTP modes
|
||||||
|
logmsg "FTPD: instructed to use NODATACONN\n";
|
||||||
|
$nodataconn=1;
|
||||||
|
}
|
||||||
elsif($_ =~ /NOSAVE/) {
|
elsif($_ =~ /NOSAVE/) {
|
||||||
# don't actually store the file we upload - to be used when
|
# don't actually store the file we upload - to be used when
|
||||||
# uploading insanely huge amounts
|
# uploading insanely huge amounts
|
||||||
|
Loading…
Reference in New Issue
Block a user