~ K A L I ~
UNAME : Linux web63.extendcp.co.uk 4.18.0-553.56.1.el8_10.x86_64 #1 SMP Tue Jun 10 05:00:59 EDT 2025 x86_64SERVER IP : 10.0.187.63 -________-
CLIENT IP : 216.73.216.210 MINI SHELL D ZAB '
Current File : //bin/zip-restore.pl |
#!/usr/bin/perl -w
use strict;
my $passed_username=$ARGV[0];
my $zipfile=$ARGV[1];
my $restore_type=$ARGV[2];
my $start_dir = $ARGV[3] || "";
my $home_dir = (getpwuid($<))[7];
chdir($home_dir);
if($start_dir) {
chdir($start_dir);
} else {
$start_dir = $home_dir;
}
unless($zipfile) {
warn "No zip file.";
exit 1;
}
unless($restore_type) {
warn "No restore type.";
exit 2;
}
unless(-r $zipfile) {
warn "Zip file does not exist, or is not readable.";
exit 1;
}
# Set the file type so we can take the corect unpack action
my $file_type;
if ( $zipfile =~ m/\.zip$/) { $file_type = 1; }
elsif ( $zipfile =~ m/\.tar\.gz$/) { $file_type = 2; }
elsif ( $zipfile =~ m/\.tgz$/) { $file_type = 2; }
elsif ( $zipfile =~ m/\.tar\.Z$/) { $file_type = 2; }
elsif ( $zipfile =~ m/\.tar$/) { $file_type = 3; }
elsif ( $zipfile =~ m/\.tar\.bz2$/) { $file_type = 4; }
elsif ( $zipfile =~ m/\.tbz2$/) { $file_type = 4; }
else {
warn "Zip file does not have standard suffix; cannot determine unpack process.";
exit 1;
}
# Get a file list from the zip file.
my %zip_contents;
###### .zip files
if ($file_type == 1 ) {
open ZIPLIST, "-|","unzip","-l",$zipfile or die $!;
while(<ZIPLIST>) {
chomp;
my @parts=split(/\s+/,$_,5);
if($parts[4] and $parts[2]=~/^[[:digit:]]/ and $parts[4]=~m#^[^\.][^/]+/
?$#) {
$zip_contents{$parts[4]}=1;
}
}
close ZIPLIST;
}
##### .tar.gz; .tgz; .tar.Z files
elsif ($file_type == 2 ) {
open ZIPLIST, "-|","/bin/tar","tzf",$zipfile or die $!;
while(<ZIPLIST>) {
chomp;
if($_ =~ m#^[^\.][^/]+/ ?$#) {
$zip_contents{$_}=1;
}
}
close ZIPLIST;
}
##### .tar files
elsif ($file_type == 3 ) {
open ZIPLIST, "-|","/bin/tar","tf",$zipfile or die $!;
while(<ZIPLIST>) {
chomp;
if($_ =~ m#^[^\.][^/]+/ ?$#) {
$zip_contents{$_}=1;
}
}
close ZIPLIST;
}
##### .tar,bz2; .tbz2 files
elsif ($file_type == 4 ) {
open ZIPLIST, "-|","/bin/tar","tjf",$zipfile or die $!;
while(<ZIPLIST>) {
chomp;
if($_ =~ m#^[^\.][^/]+/ ?$#) {
$zip_contents{$_}=1;
}
}
close ZIPLIST;
}
my @unsafe_dirs=qw/logs/;
opendir DIR, "." or die $!;
my @safe_dirs;
my @safe_dirs_d;
foreach my $dname (readdir DIR) {
next if $dname=~m/^\./;
if(not grep {$dname eq $_} @unsafe_dirs) {
if($zip_contents{$dname} or $zip_contents{"$dname/"}) {
push @safe_dirs, $dname;
} else {
push @safe_dirs_d, $dname;
}
}
}
closedir DIR;
if($restore_type eq "missing") {
restore_missing($file_type);
} elsif($restore_type eq "temp") {
restore_temp($file_type);
} elsif($restore_type eq "delete") {
delete_and_restore($file_type);
}
sub restore_missing {
my $file_type = shift;
if ($file_type == 1) {
system("unzip","-n",$zipfile);
} elsif ($file_type == 2) {
system("/bin/tar","xzf",$zipfile);
} elsif ($file_type == 3) {
system("/bin/tar","xf",$zipfile);
} elsif ($file_type == 4) {
system("/bin/tar","xjf",$zipfile);
}
}
sub restore_temp {
my $file_type = shift;
my @more_args=@_;
use File::Temp;
my $temp_dir=mkdtemp("zip.XXXXXX");
if ($file_type == 1) {
system("unzip",@more_args,"-d",$temp_dir,$zipfile);
} elsif ($file_type == 2) {
chdir($temp_dir);
system("/bin/tar","xzf","$start_dir/$zipfile");
chdir($start_dir);
} elsif ($file_type == 3) {
chdir($temp_dir);
system("/bin/tar","xf","$start_dir/$zipfile");
chdir($start_dir);
} elsif ($file_type == 4) {
chdir($temp_dir);
system("/bin/tar","xjf","$start_dir/$zipfile");
chdir($start_dir);
}
return $temp_dir;
}
sub delete_and_restore {
my $file_type = shift;
print "Performing full delete and restore.\n";
my $temp_dir=restore_temp($file_type, "-q");
my $delete_dir=mkdtemp("delete.XXXXXX");
foreach my $dname (@safe_dirs) {
rename($dname,"$delete_dir/$dname");
rename("$temp_dir/$dname",$dname);
}
foreach my $dname (keys %zip_contents) {
rename("$temp_dir/$dname",$dname);
}
foreach my $dname (@safe_dirs_d) {
rename($dname,"$delete_dir/$dname");
}
rmdir $temp_dir;
system("/bin/chmod","-R","+wx",$delete_dir);
system("/bin/chmod","-R","+wx",$temp_dir);
system("/bin/rm","-rf",$delete_dir);
system("/bin/rm","-rf",$temp_dir);
print "Completed.\n";
}
Coded by KALI :v Greetz to DR HARD ../ kali.zbi@hotmail.com