home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 16 / hacker16 / 16_HACKER16.ISO / linux / tpm-security-server-1.2.1.iso / archive / etc / autopsy / base / autopsy.base next >
Encoding:
Text File  |  2004-01-29  |  16.5 KB  |  720 lines

  1. #
  2. # autopsy gui server
  3. # Autopsy Forensic Browser
  4. #
  5. #
  6. # This file requires The Sleuth Kit 
  7. #    www.sleuthkit.org
  8. #
  9. # version 1.71+
  10. # Brian Carrier [carrier@sleuthkit.org]
  11. # Copyright (c) 2003 by Brian Carrier.  All rights reserved
  12. #
  13. # version 1.5, 1.6, 1.7
  14. # Copyright (c) 2001-2003 by Brian Carrier, @stake Inc.  All rights reserved
  15. #
  16. # version 1.0
  17. # Brian Carrier [carrier@cerias.purdue.edu]
  18. # Copyright (c) 2001 by Brian Carrier.  All rights reserved
  19. #   
  20. #
  21. # This file is part of the Autopsy Forensic Browser (Autopsy)
  22. #
  23. # Autopsy is free software; you can redistribute it and/or modify
  24. # it under the terms of the GNU General Public License as published by
  25. # the Free Software Foundation; either version 2 of the License, or
  26. # (at your option) any later version.
  27. #
  28. # Autopsy is distributed in the hope that it will be useful,
  29. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  30. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  31. # GNU General Public License for more details.
  32. #
  33. # You should have received a copy of the GNU General Public License
  34. # along with Autopsy; if not, write to the Free Software
  35. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  36. #
  37. #
  38. # THIS SOFTWARE IS NOT AFFILIATED WITH PURDUE UNIVERSITY OR THE CENTER FOR
  39. # EDUCATION IN INFORMATION ASSURANCE AND SECURITY (CERIAS) AND THEY BEAR
  40. # NO RESPONSIBILITY FOR ITS USE OR MISUSE.
  41. #
  42. #
  43. # THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  44. # WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  45. # MERCHANTABILITY AND FITNESS FOR ANY PARTICULAR PURPOSE.
  46. # IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
  47. # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  48. # (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, OR PROFITS OR
  49. # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  50. # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  51. # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  52. # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  53. #
  54.  
  55. #
  56. # refer to Security Considerations in README for a description of the 
  57. # cookie authentication
  58. #
  59.  
  60. require 5.002;
  61.  
  62. use autopsyfunc;    
  63. use strict;
  64. use Socket;
  65.  
  66. require 'conf.pl';
  67. require 'define.pl';
  68.  
  69. # Import variables from conf.pl
  70. use vars '$PROGNAME', '$TASKDIR';
  71. use vars '$LOCKDIR', '$INSTALLDIR', '$PICTDIR';
  72. use vars '$SANITIZE_TAG', '$SANITIZE_PICT';
  73. use vars '$USE_STIMEOUT', '$STIMEOUT', '$CTIMEOUT';
  74. use vars '$USE_COOKIE', '$USE_LOG';
  75. use vars '$SAVE_COOKIE', '$STRINGS_EXE', '$GREP_EXE';
  76. use vars '$AUT_HOME_PAGE';
  77. use vars '$HTTP_NL', '$NSRLDB';
  78.  
  79.  
  80. # remove environment stuff that we don't need and that could be insecure
  81. $ENV{PATH} = '';
  82. delete @ENV{ 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
  83. $| = 1;
  84.  
  85. sub usage {
  86.     print "usage: $0 [-C] [-d evid_locker] [port [remoteaddr]]\n";
  87.     exit 1;
  88. }
  89.  
  90. if (scalar(@ARGV) > 5) {
  91.     usage();
  92. }
  93.  
  94. # Were options given?
  95. while ((scalar (@ARGV) > 0) && ($ARGV[0] =~ /^-/)) {
  96.     my $f = shift;
  97.  
  98.     # Evidence Locker
  99.     if ($f eq '-d') {
  100.         if (scalar (@ARGV) == 0) {
  101.             print "Missing Directory\n";
  102.             usage();
  103.         }
  104.  
  105.         my $d = shift;
  106.         # We need to do this for the tainting
  107.         # We don't need to check for special characters in this case because
  108.         # all commands will be run with the same permissions as the
  109.         # original user.  We will check for the obvious ';' though
  110.         if ($d =~ /;/) {
  111.             print "Illegal argument\n";
  112.             exit (1);
  113.         }
  114.  
  115.         # If the path is relative, autopsyfunc will get screwed up when
  116.         # this is run from a directory other than where autopsyfunc is
  117.         # so force full paths
  118.         elsif ($d !~ /^\//) {
  119.             print "The evidence locker must be full path (i.e. begin with /)\n";
  120.             exit(1);
  121.         }
  122.         elsif ($d =~ /(.*)/) {
  123.             $LOCKDIR = $1;
  124.         }
  125.     }
  126.  
  127.     # Force no cookie
  128.     elsif ($f eq '-C') {
  129.         $USE_COOKIE = 0;
  130.     }
  131.     else {
  132.         print "Invalid flag: $f\n";
  133.         usage();
  134.     }
  135. }
  136.  
  137.  
  138. # Port Number
  139. my $port;
  140. if (scalar (@ARGV) > 0) {
  141.     $port = shift;
  142.     if ($port =~ /(\d+)/) {
  143.         $port = $1;
  144.     }
  145.     else {
  146.         print "invalid port: $port\n";
  147.         usage();
  148.     }
  149. }
  150. else {
  151.     $port = 9999;
  152. }
  153.  
  154. # remote address
  155. my $rema;
  156. if (scalar (@ARGV) > 0) {
  157.     $rema = shift;
  158. }
  159. else {
  160.     $rema = 'localhost';
  161. }
  162.  
  163.  
  164. # Get remote address
  165. my @acl_addr;        # Array of host addresses
  166. my $hn;                # Host name
  167. my $tmp;
  168. if ($rema =~ /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/) {
  169.     $acl_addr[0] = pack('C4', ($1, $2, $3, $4));
  170.     $hn = $rema;
  171. }
  172. else {
  173.     ($hn, $tmp, $tmp, $tmp, @acl_addr) = gethostbyname($rema);
  174.     unless (defined $tmp) {
  175.         print "Host not found: $rema\n";
  176.         usage();
  177.     }
  178. }
  179.  
  180. # Determine the address that will be used to access this server
  181. my $lclhost;
  182. my @ta = unpack('C4', $acl_addr[0]);
  183.  
  184. # If we are being accessed by localhost, we need that and not the hostname
  185. if (($ta[0] == 127) && ($ta[1] == 0) &&
  186.   ($ta[2] == 0) && ($ta[3] == 1)) {
  187.     $lclhost = "localhost";
  188. }
  189. else {
  190.     $lclhost = `/bin/hostname`;
  191.     chop $lclhost;
  192. }
  193.  
  194.  
  195. # Verify the variables defined in the configuration files
  196. check_vars();
  197.  
  198.  
  199. # Make sure TASKDIR ends with '/'
  200. if ($TASKDIR !~ /.*?\/$/) {
  201.     $TASKDIR .= '/';
  202. }      
  203.  
  204. # Make sure LOCKDIR ends with '/'
  205. if ($LOCKDIR !~ /.*?\/$/) {
  206.     $LOCKDIR .= '/';     
  207. }
  208.  
  209.  
  210. #
  211. # Verify that all of the required executables exist
  212. #
  213.  
  214.  
  215. check_tools();
  216.  
  217. my $date = localtime;
  218. print <<EOF;
  219.  
  220. ============================================================================
  221.  
  222.                        Autopsy Forensic Browser 
  223.                   http://www.sleuthkit.org/autopsy/
  224.                              ver $VER 
  225.  
  226. ============================================================================
  227.  
  228. Evidence Locker: $LOCKDIR
  229. Start Time: $date
  230. EOF
  231.  
  232.  
  233.  
  234. # Setup socket
  235. my $proto = getprotobyname('tcp');
  236. socket (Server, PF_INET, SOCK_STREAM, $proto) 
  237.   or die "Create socket failed: $!";
  238.  
  239. setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, 1) 
  240.   or die "Setsockopt failed: $!";
  241.  
  242. setsockopt(Server, SOL_SOCKET, SO_KEEPALIVE, 1) 
  243.   or die "Setsockopt failed: $!";
  244.  
  245. bind(Server, sockaddr_in($port, INADDR_ANY)) 
  246.   or die "Bind to port $port failed: $!";
  247.  
  248. listen(Server, SOMAXCONN) 
  249.   or die "Listen to socket failed: $!";
  250.  
  251.  
  252. my $magic;        # magic authentication cookie
  253. my $cook_file;
  254. my $cookie_url = "";
  255.  
  256. if  ($USE_COOKIE == 1) {
  257.  
  258.     # Try for a real random device, or use rand if all else fails
  259.     if (-e "/dev/urandom") {
  260.         my $r;
  261.         open RAND, "</dev/urandom" or die "can not open /dev/urandom";
  262.         read RAND, $r, 4;
  263.         $magic = unpack "I", $r;
  264.         read RAND, $r, 4;
  265.         $magic .= unpack "I", $r;
  266.         close RAND;
  267.     }
  268.     else {
  269.         $magic = int(rand 0xffffffff).int(rand 0xffffffff);
  270.     }
  271.  
  272.     $cookie_url = "$magic/";
  273.  
  274.     # Save to file in case the stdout gets overwritten
  275.     if ($SAVE_COOKIE == 1) {
  276.         $cook_file = "$LOCKDIR/.$port.cookie";
  277.         open COOK, ">$cook_file" or
  278.           die "can not open $cook_file";
  279.         chmod 0600, "$cook_file";
  280.         print COOK "$magic\n";
  281.         close COOK;
  282.     }
  283.  
  284. print "Remote Host: $rema\n";
  285. print "Local Port: $port\n\n";
  286. print "Open an HTML browser on the remote host and paste this URL in it:\n\n";
  287. print "\thttp://$lclhost:${port}/${cookie_url}${PROGNAME}\n";
  288. print "\nKeep this process running and use <ctrl-c> to exit\n";
  289.  
  290. log_session_info("Starting session on port $port and $hn\n");
  291.  
  292. # Set the server alarm
  293. $SIG{ALRM} = \&sig_alarm_server;
  294. $SIG{INT} = \&sig_close;
  295. $SIG{CHLD} = sub {
  296.     my $p = wait;
  297. };
  298.  
  299. # Wait for Connections
  300. while (1) {
  301.  
  302.     alarm ($STIMEOUT) if ($USE_STIMEOUT == 1);
  303.  
  304.     my $raddr = accept(CLIENT, Server); 
  305.     next unless ($raddr);
  306.     my ($rport, $riaddr) = sockaddr_in($raddr);
  307.  
  308.     die "Error creating child" unless (defined (my $pid = fork()));
  309.  
  310.     if (0 == $pid) {
  311.         open(STDOUT, ">&CLIENT") or die "Can't dup client to stdout";
  312.         open(STDERR, ">&CLIENT") or die "Can't dup client to stdout";
  313.         open(STDIN, "<&CLIENT") or die "Can't dup client to stdin";
  314.         $| = 1;
  315.  
  316.         my @rip = unpack('C4', $riaddr);
  317.  
  318.         # Check ACL
  319.         foreach $tmp (@acl_addr) {
  320.             if ($tmp eq $riaddr) {
  321.                 spawn_cli($riaddr);
  322.                 close CLIENT;
  323.                 exit 0;
  324.             }
  325.         }
  326.  
  327.         forbid ();
  328.         log_session_info("ERROR: Unauthorized Connection from:".
  329.            "$rip[0].$rip[1].$rip[2].$rip[3]\n");
  330.  
  331.         close CLIENT;
  332.         exit 1;
  333.     }
  334.     else {
  335.         close CLIENT;
  336.     }
  337. }
  338.  
  339.  
  340. # Error messages
  341. sub forbid 
  342. {
  343.     print "HTTP/1.0 403 Forbidden${HTTP_NL}".
  344.       "Content-type: text/html${HTTP_NL}${HTTP_NL}".
  345.       "<HTML><CENTER><BR>\n".
  346.       "<H2>Access Denied</H2></CENTER></HTML>${HTTP_NL}${HTTP_NL}${HTTP_NL}";
  347.     return;
  348. }
  349.  
  350. sub bad_req 
  351. {
  352.     print "HTTP/1.0 404 Bad Request${HTTP_NL}".
  353.       "Content-type: text/html${HTTP_NL}${HTTP_NL}".
  354.       "<HTML><CENTER><BR>\n".
  355.       "<H2>Invalid Location: <TT>".shift()."</TT></H2></CENTER></HTML>".
  356.       "${HTTP_NL}${HTTP_NL}${HTTP_NL}";
  357.     return;
  358. }
  359.  
  360.  
  361. sub sterile
  362. {
  363.     my $url = shift();
  364.     my $lurl = $url;
  365.     $lurl =~ tr/[A-Z]/[a-z]/;
  366.  
  367.     print "HTTP/1.0 200 OK${HTTP_NL}";
  368.     if (($lurl =~ /.jpg/i) || ($lurl =~ /.jpeg/i) || ($lurl =~ /.gif/i) ||
  369.       ($lurl =~ /.png/i) || ($lurl =~ /.bmp/i)) {
  370.  
  371.         open PICT, "<$PICTDIR/$SANITIZE_PICT" or  
  372.           die "can not open $PICTDIR/$SANITIZE_PICT";
  373.  
  374.         print "Content-type: image/jpeg${HTTP_NL}${HTTP_NL}";
  375.         while (<PICT>) {
  376.             print "$_";
  377.         }
  378.         close (PICT);
  379.     }
  380.     else {
  381.         $url =~ tr/\+/ /;
  382.         $url =~ s/%([a-f0-9][a-f0-9])/chr( hex( $1 ) )/eig;
  383.  
  384.         print "Content-type: text/html${HTTP_NL}${HTTP_NL}".
  385.             "<HTML><H1><CENTER>Unable to Complete Request</H1><BR>\n".
  386.             "<TT>Autopsy</TT> will not follow links from ".
  387.             "untrusted HTML pages:<BR><TT>$url</TT><BR>\n";
  388.     }
  389.     print "${HTTP_NL}${HTTP_NL}";
  390. }
  391.  
  392.  
  393. # Alarm Functions
  394. sub sig_alarm_client 
  395. {
  396.     log_session_info("Connection timed out\n");
  397.     close CLIENT;
  398.     exit 1;
  399. }
  400.  
  401. sub sig_alarm_server 
  402. {
  403.     print "Server Timeout ($STIMEOUT seconds), Exiting\n";
  404.     log_session_info("Server Timeout ($STIMEOUT seconds), Exiting\n");
  405.     exit 0;
  406. }
  407.  
  408. # Close the system down when Control-C is given
  409. sub sig_close
  410. {
  411.     # delete the cookie file
  412.     if (($USE_COOKIE == 1) && ($SAVE_COOKIE == 1)) {
  413.         unlink "$cook_file";
  414.     }
  415.  
  416.     print "End Time: ".localtime()."\n";
  417.     log_session_info("Ending session on port $port and $hn\n");
  418.     exit 0;
  419. }
  420.  
  421. # Pass the remote IP address as the argument for logging
  422. sub spawn_cli 
  423. {
  424.     # Set timeout for 10 seconds if we dont get any input
  425.     alarm ($CTIMEOUT);
  426.     $SIG{ALRM} = \&sig_alarm_client;
  427.  
  428.     while (<STDIN>) {
  429.  
  430.         if (/^GET \/+(\S*)\s?HTTP/) {
  431.             my $url = $1;
  432.             my $script;
  433.             my $args;
  434.  
  435.             if (/\x0d\x0a$/) {
  436.                 $HTTP_NL = "\x0d\x0a";
  437.             }
  438.             else {
  439.                 $HTTP_NL = "\x0a";
  440.             }
  441.  
  442.             # Magic Cookie 
  443.             # If we are using cookies, then the url should be:
  444.             # cookie/autopsy?var=val ...
  445.             if ($USE_COOKIE == 1) {
  446.  
  447.                 if (($url =~ /^(\d+)\/+([\w\.\/]+)(?:\?(.*))?$/) && 
  448.                   ($1 == $magic)) {
  449.                     $script = $2;  
  450.                     $args = $3;
  451.                 }
  452.                 else {
  453.                        my @rip = unpack('C4', shift());
  454.                     log_session_info("ERROR: Incorrect Cookie from:".
  455.                       "$rip[0].$rip[1].$rip[2].$rip[3]\n");
  456.                     forbid();
  457.                     return 1;
  458.                 }
  459.             }
  460.  
  461.             # if we aren't using cookies, then it should be:
  462.             # autopsy?var=val ...
  463.             else {
  464.                 if ($url =~ /^\/?([\w\.\/]+)(?:\?(.*))?$/) {
  465.                     $script = $1;
  466.                     $args = $2;
  467.                 }
  468.                 else {
  469.                     bad_req($url);
  470.                     return 1;
  471.                 }
  472.             }
  473.  
  474.             if ($script eq $PROGNAME) {
  475.                 $args = "" unless (defined $args);
  476.  
  477.                 # Turn timer off
  478.                 alarm (0);
  479.  
  480.                 # Print status
  481.                 print "HTTP/1.0 200 OK${HTTP_NL}";
  482.                 autopsy_main($args);
  483.             }
  484.             # Display the sanitized picture or reference error
  485.             elsif ($script eq $SANITIZE_TAG) {
  486.                 sterile($args);
  487.                 return 1;
  488.             }
  489.             # Display a picture or help file
  490.             elsif ( ($script =~ /^(pict\/[\w\.\/]+)/)  ||
  491.               ($script =~ /^(help\/[\w\.\/]+)/) ) {
  492.                 show_file ($1);
  493.             }
  494.             elsif ($script eq 'about') {
  495.                 about();
  496.             }
  497.             else {
  498.                 bad_req($url);
  499.                 log_session_info("Unknown function: $script\n");
  500.                 return 1;
  501.             }
  502.             return 0;
  503.         }
  504.     } # end of while (<>)
  505.  
  506. } # end of spawn_cli
  507.  
  508.  
  509. # Print the contents of a local picture or help file
  510. sub show_file
  511. {
  512.     my $file = "$INSTALLDIR/".shift;
  513.  
  514.     if (-e "$file") {
  515.         print "HTTP/1.0 200 OK${HTTP_NL}";
  516.  
  517.         open FILE, "<$file" or
  518.           die "can not open $file";
  519.  
  520.         if ($file =~ /\.jpg$/i) {
  521.             print "Content-type: image/jpeg${HTTP_NL}${HTTP_NL}";
  522.         } elsif ($file =~ /\.gif$/i) {
  523.             print "Content-type: image/gif${HTTP_NL}${HTTP_NL}";
  524.         } elsif ($file =~ /\.html$/i) {
  525.               print "Content-type: text/html${HTTP_NL}${HTTP_NL}";
  526.         } else {
  527.             print "HTTP/1.0 404 Bad Request${HTTP_NL}".
  528.                 "Content-type: text/html${HTTP_NL}${HTTP_NL}".  
  529.                 "<HTML><H2><CENTER>Unknown Extension</H2>".
  530.                   "</CENTER></HTML>${HTTP_NL}${HTTP_NL}${HTTP_NL}";
  531.             exit(1);
  532.         }
  533.  
  534.         while (<FILE>) {
  535.             print "$_";
  536.         }
  537.         close (FILE);
  538.  
  539.         print "${HTTP_NL}${HTTP_NL}";
  540.     }
  541.     else {
  542.         print "HTTP/1.0 404 Bad Request${HTTP_NL}".
  543.           "Content-type: text/html${HTTP_NL}${HTTP_NL}".
  544.           "<HTML><H2><CENTER>File Not Found</H2>".
  545.           "</CENTER></HTML>${HTTP_NL}${HTTP_NL}${HTTP_NL}";
  546.         exit(1);
  547.     }
  548.  
  549.     return;
  550. }
  551.  
  552. sub about 
  553. {
  554.  
  555.     print "HTTP/1.0 200 OK${HTTP_NL}".
  556.       "Content-type: text/html${HTTP_NL}${HTTP_NL}";
  557.  
  558.  
  559. print <<EOF;
  560.  
  561. <HTML>
  562. <HEAD><TITLE>About Autopsy</TITLE></HEAD>
  563.  
  564. <BODY BGCOLOR=#CCCC99>
  565.  
  566. <CENTER><H2>About Autopsy</H2>
  567.   <BR>
  568.   <IMG SRC=\"pict/logo.jpg\">
  569.   <BR><BR>
  570.   <B>Version</B>: $VER
  571.   <BR>
  572.   <TT><A HREF=$AUT_HOME_PAGE>$AUT_HOME_PAGE</A></TT>
  573.   <BR>
  574. </CENTER>
  575.  
  576.  
  577. <H3>Credits</H3>
  578. <UL>
  579.   <LI>Code Development: Brian Carrier
  580.   <LI>Interface: Samir Kapuria
  581. </UL>
  582.  
  583. <H3>Configuration</H3>
  584. <B>Evidence Locker</B>: <TT>$LOCKDIR</TT><BR>
  585. <B>Sleuth Kit</B>: <TT>$TASKDIR</TT><BR>
  586. <B>strings</B>: <TT>$STRINGS_EXE</TT><BR>
  587. <B>grep</B>: <TT>$GREP_EXE</TT><BR>
  588. <B>NSRL</B>: <TT>$NSRLDB</TT><BR>
  589.  
  590. </BODY></HTML>
  591.  
  592. EOF
  593.     return 0;
  594. }
  595.  
  596.  
  597. ### Check that the required tools are there
  598. sub check_tools
  599. {
  600.     # Sleuth Kit execs
  601.     unless (-x "${TASKDIR}icat") {
  602.         print "ERROR: Sleuth Kit icat executable missing\n";
  603.         exit (1);
  604.     }
  605.     unless (-x "${TASKDIR}istat") {
  606.         print "ERROR: Sleuth Kit istat executable missing\n";
  607.         exit (1);
  608.     }
  609.     unless (-x "${TASKDIR}ifind") {
  610.         print "ERROR: Sleuth Kit ifind executable missing\n";
  611.         exit (1);
  612.     }
  613.     unless (-x "${TASKDIR}ils") {
  614.         print "ERROR: Sleuth Kit ils executable missing\n";
  615.         exit (1);
  616.     }
  617.     unless (-x "${TASKDIR}fls") {
  618.         print "ERROR: Sleuth Kit fls executable missing\n";
  619.         exit (1);
  620.     }
  621.     unless (-x "${TASKDIR}ffind") {
  622.         print "ERROR: Sleuth Kit ffind executable missing\n";
  623.         exit (1);
  624.     }
  625.     unless (-x "${TASKDIR}dcat") {
  626.         print "ERROR: Sleuth Kit dcat executable missing\n";
  627.         exit (1);
  628.     }
  629.     unless (-x "${TASKDIR}dcalc") {
  630.         print "ERROR: Sleuth Kit dcalc executable missing\n";
  631.         exit (1);
  632.     }
  633.     unless (-x "${TASKDIR}dls") {
  634.         print "ERROR: Sleuth Kit dls executable missing\n";
  635.         exit (1);
  636.     }
  637.     unless (-x "${TASKDIR}file") {
  638.         print "ERROR: Sleuth Kit file executable missing\n";
  639.         exit (1);
  640.     }
  641.     unless (-x "${TASKDIR}fsstat") {
  642.         print "ERROR: Sleuth Kit fsstat executable missing\n";
  643.         exit (1);
  644.     }
  645.     unless (-x "${TASKDIR}md5") {
  646.         print "ERROR: Sleuth Kit md5 executable missing\n";
  647.         exit (1);
  648.     }
  649.     unless (-x "${TASKDIR}sorter") {
  650.         print "ERROR: Sleuth Kit sorter executable missing\n";
  651.         exit (1);
  652.     }
  653.     unless (-x "${TASKDIR}hfind") {
  654.         print "ERROR: Sleuth Kit hfind executable missing\n";
  655.         print "  You likely have an old version of The Sleuth Kit or TASK\n";
  656.         exit (1);
  657.     }
  658.  
  659.     unless (-x "$STRINGS_EXE") {
  660.         print "ERROR: strings executable missing\n";
  661.         exit (1);
  662.     }
  663.  
  664.     unless (-x "$GREP_EXE") {
  665.         print "ERROR: grep executable missing\n";
  666.         exit (1);
  667.     }
  668. }
  669.  
  670. # check values that should be defined in the configuration files
  671. # This will show incomplete installations
  672. sub check_vars
  673. {
  674.     unless ( (defined $TASKDIR) && ($TASKDIR ne "") ) {
  675.         print "ERROR: TASKDIR variable not set in configuration file\n";
  676.         print "  This could been caused by an incomplete installation\n";
  677.         exit (1);
  678.     }
  679.  
  680.     unless (-d "$TASKDIR") {
  681.         print "Invalid Sleuth Kit binary directory: $TASKDIR\n";
  682.         exit (1);
  683.     }
  684.  
  685.     # Verify The evidence locker directory
  686.     unless ( (defined $LOCKDIR) && ($LOCKDIR ne "") ) {
  687.         print "ERROR: LOCKDIR variable not set in configuration file\n";
  688.         print "  This could been caused by an incomplete installation\n";
  689.         exit (1);
  690.     }
  691.  
  692.     unless (-d "$LOCKDIR") {
  693.         print "Invalid evidence locker directory: $LOCKDIR\n";
  694.         exit (1);
  695.     }
  696.  
  697.     # Directory Names
  698.     unless ( (defined $IMGDIR) && ($IMGDIR ne "") ) {
  699.         print "ERROR: IMGDIR variable not set in configuration file\n";
  700.         print "  This could been caused by an incomplete installation\n";
  701.         exit (1);
  702.     }
  703.     unless ( (defined $DATADIR) && ($DATADIR ne "") ) {
  704.         print "ERROR: DATADIR variable not set in configuration file\n";
  705.         print "  This could been caused by an incomplete installation\n";
  706.         exit (1);
  707.     }
  708.     unless ( (defined $LOGDIR) && ($LOGDIR ne "") ) {
  709.         print "ERROR: LOGDIR variable not set in configuration file\n";
  710.         print "  This could been caused by an incomplete installation\n";
  711.         exit (1);
  712.     }
  713.     unless ( (defined $REPDIR) && ($REPDIR ne "") ) {
  714.         print "ERROR: REPDIR variable not set in configuration file\n";
  715.         print "  This could been caused by an incomplete installation\n";
  716.         exit (1);
  717.     }
  718. }
  719.