Unix Use and Security From The Ground Up_ The Prophet

A Unix system can easily be identified by its prompts. When you first
connect to a Unix system, you should receive the login prompt, which is usually
"Login:" (Note, that the first character may or may not be capitalized.) On
some systems, this prompt may be ";Login:" or "User:" (Again, the first letter
may or may not be capitalized.) This may be preceded by a short message,

Nội dung Text: Unix Use and Security From The Ground Up_ The Prophet

*************************************************
*************************************************
** **
** Unix Use and Security From **
** The Ground Up **
** **
** by **
** **
** The Prophet **
** **
** **
*************************************************
*************************************************
December 5, 1986.
INTRODUCTION
------------
The Unix operating system is one of the most heavily used mainframe
operating systems today. It runs on many different computers (Dec VAX's, AT&T's
3bx series, PDP-11's, and just about any other you can think of- including
PC's), and there are many different, but pretty much similar, versions of it.
These Unix clones go by many different names- here are the most common: Xenix,
Ultrix, Ros, IX/370 (for the IBM 370), PCIX (for the IBM PC), and Berkely (BSD)
Unix. This file will concentrate on AT&T System V Unix, probably the most
heavily used version. (The next most heavily used is Berkely Unix.) This file
will cover just about everything all but THE most advanced hacker will need to
know about the Unix system, from the most rodent information to advanced
hacking techniques. This is the second version of this file, and as I discover
any errors or new tricks, I will update it. This file is, to the best of my
knowledge, totally accurate, however, and the techniques in it will work just
as described herein. Note, that these techniques will work on System V Unix.
Not necessarily all, but most, should work on most other versions of Unix as
well. Later, if this file is received well, and there is demand for another, I
will release a file on yet more advanced techniques. If you wish to contact me,
I can be reached several ways. First, on these boards:
Shadow Spawn 219-659-1503
Private Sector 201-366-4431 (As prophet, not The Prophet...some rodent stole
my name.)
Ripco 312-528-5020
Stalag 13 215-657-8523
Phreak Klass 2600 806-799-0016
Or at this voice message system:
800-556-7001
Box 7023
I welcome any suggestions, corrections, or feedback of any kind. And lastly,
thanks for taking the time to read this:
THE USUAL DISCLAIMER:
---------------------
This file is for [of course] informational purposes only. I

don't take responsibility for anything anyone does after reading this file.
_______________________________________________________________________________
IDENTIFYING UNIX SYSTEMS AND LOGGING IN
---------------------------------------
A Unix system can easily be identified by its prompts. When you first
connect to a Unix system, you should receive the login prompt, which is usually
"Login:" (Note, that the first character may or may not be capitalized.) On
some systems, this prompt may be ";Login:" or "User:" (Again, the first letter
may or may not be capitalized.) This may be preceded by a short message,
(usually something like "WARNING!!! This system is for authorized users
only!"), the name of the company that owns the system, or the uucp network name
of the system. (The uucp facilities will be explained in detail later.) At this
point, you should enter the user name and press return. (You should be in
lowercase if your terminal supports it.) You should then receive the password
prompt, "Password:" (And yet again, the "P" may or may not be capitalized.) At
this point, you should enter your password and press return. If you have
specified the correct username/password pair, you will then be admitted into
the system. If you have entered a non-existant username or an incorrect
password, you will receive the message "Login incorrect" and will be returned
to the login prompt. There is little information given before login, and there
is no way to find valid usernames from pre-login information.
There are no "default" passwords in Unix. When the system is initially
set up, none of the default accounts or any of the accounts created by the
system operators has a password, until the system operator or the account owner
set one for the account. Often, lazy system operators and unwary users do not
bother to password many (and in some cases, all) of these accounts. To log in
under an account that doesn't have a password, you have only to enter the
username at the login prompt.
You may encounter some occasional error messages when attempting to log
in under certain accounts. Here are some of the more common messages, and their
causes:
1. "Unable to change directory to /usr/whatever"-This means that the
account's home directory, the directory which it is placed in
upon logon, does not exist. On some systems, this may prevent
you from logging under that account, and you will be returned
to the login prompt. On other systems, you will simply be
placed in the root directory. If this is the case, you will
see the message "Changing directory to '/'".
2. "No shell"-this means that the account's shell, or command
interpreter does not exist. On some systems, the account will
not be allowed to log in, and you will be returned to the login
prompt. On other systems, the account will be admitted into the
system using a default shell, usually the Bourne shell. (The
shell will be explained later.) If this is the case, you will
see the message "Using /bin/sh".
UNIX ACCOUNTS
-------------
There are two types of Unix accounts-user and superuser accounts. User
accounts are the normal user accounts. These accounts have no privileges.
Superuser accounts are the system operator accounts. These accounts have full
privileges, and are not bound by the file and directory protections of other
users. In Unix, there is no hierarchy of privileges-either an account has full
privileges, or it has none.

Unix usernames are up to 14 characters long, but usually are within the
range of 1-8. The usernames can contain almost any characters, including
control and special characters. (The accounts will usually not contain the
characters @, control-d, control-j, or control-x, as these characters have
special meanings to the Unix operating system.) The Unix system comes initially
configured with quite a few default accounts, some of which are superuser and
some of which are only user-level accounts. Here is a list of the default
accounts which usually have superuser privileges:
root (Always!)
makefsys
mountfsys
umountfsys
checkfsys
The root account is always present on the system, and always has superuser
capabilities. (Note: most Unix System V systems come initially set up with a
security feature that prevents superuser accounts from logging in remotely. If
you attempt to log in under a superuser account remotely on a system with this
feature, you will receive the message "Not on console", and will be refused
admission to the operating system. This will NOT prevent you from using
superuser accounts remotely-you simply have to log in under a user account and
then switch over to a superuser account using the su utility, which will be
described later.)
Here is a list of the user-level default accounts:
lp
daemon
trouble
nuucp
uucp
bin
rje
adm
sysadm
sync
The bin account, although it is only a user account, is particularly powerful,
as it has ownership of many of the system's important directories and files.
Although these are the only default accounts on System V Unix, there are many
other accounts which I have found to be common to many Unix systems. Here is a
list of some of the accounts I have found on many Unix systems:
batch admin user demo test
field unix guest pub public
standard games general student help
gsa tty lpadmin
Also try variations on the account names, such as rje1, rje2, user1, user2,
etc. Also, try variations on people's names and initials, such as doej, doe,
john, johnd, jjd, etc.
No matter what the format for the usernames, one thing is common to all
systems-almost all of the usernames will begin with a lowercase letter. There
is a good reason for this-when logging into the system, if the first character
of the username you type in is in uppr-case, the system automatically assumes
that your terminal does not support lower-case. It will then send all output to
you in upper-case, with characters that are supposed to be upper-case preceded
by a backslash ("\", the Unix escape character), to differentiate them from the
characters which are meant to be in lower-case. Unix *always* differentiates
between the cases, so it is best to stay in lower-case while on the system.

As mentioned before, there are no "default" passwords on Unix. When an
account is created, it has no password, until the superuser or the account's
owner sets one for it. Unix passwords are a maximum of 11 characters. The
password may contain any character, and the system distinguishes between upper
and lower case characters. Many Unix systems implement a special security
feature under which passwords must contain at least 2 non-alphanumeric
characters (similar to Compuserve's password protection). Yet another password
security feature of Unix allows the superuser to set an expiration date on
users' passwords.
COMMAND LOGINS
--------------
Many systems have accounts known as "command logins". These are
accounts that log in, execute a single command, and are then logged out. These
accounts rarely have passwords. Here is a list of common command logins:
who -This is a particularly useful command login. When you enter this at
the username of a system with this particular account, the system will
display a list of the users currently on the system. A good way to get
valid usernames to hack.
time -Not very useful. Just displays the time.
date -Ditto the above, but displays the current date. Great if you don't
have a calendar.
sync -This default account is sometimes set up as a command login. It merely
executes the sync command, which causes any data which is meant to be
stored to be written to disk.
UNIX SPECIAL CHARACTERS
-----------------------
The Unix operating system interprets certain characters in special
ways. Provided here is a list of those special characters, and their meanings
to the Unix operating system:
Control-D -This is the Unix end-of-file character.
Control-J -Some systems interpret this, rather than Control-M, as the
return character, while others may use both. The vast majority,
however, will only use Control-M.
Control-Delete -This is the Unix kill character. It will automatically end
your current process.
@ -Some systems use this as the kill character.
\ -This is the Unix escape character. Its main use it to
differentiate between upper- and lower-case characters when
logged in on a terminal that only supports upper-case. For
instance, if you wanted to send the command "cd /Mrs/data",
(never mind what it does right now), you would type this:
(this is how it would look on your upper-case only terminal)
CD /\MRS/DATA
The backslash before the M would let the system know that the M
supposed to be upper-case, while the others would simply be
interpreted as lower-case.
The characters will rarely be used in usernames and passwords because
of the way they are interpreted. Note, however, that these values may usually
be changed once inside the system using the stty command, which will be
explained later. for instance, the end of file character could be changed to
control-A if you wished.

THE UNIX SHELL
--------------
The Unix shell is the command interpreter program that accepts your
input and carries out your commands. It is NOT the operating system itself, it
is the interface between the user and the operating system. The shell is a
program that is executed when you are logged in, and when you end the shell
program, you are logged out of the system. There is nothing special about the
shell program-it is just a regular program, like any other on the Unix system.
In fact, once you are logged on, you can execute another shell just as you
would execute a program. This ability, to run multiple shell levels, can be
used to perform some interesting tricks that will be detailed later in this
file. There is also more than one kind of shell. All the shells perform the
same basic function of interpreting the user's commands, but there are a few
differences. Here is a list of the different shells, their unique
characteristics, and how to tell which shell you are using:
Shell
-----
sh -This is the Bourne shell, the standard shell of Unix System V, and the
focus of this file. This shell gives user-level accounts a command
prompt of "$", and "#" for superuser accounts. On Berkely BSD Unix,
this shell gives an ampersand ("&") prompt.
csh -This is the C shell, developed by the Berkely University Science
department. This shell is pretty much the same as the Bourne shell, but
features different shell programming control structures [shell
programming will be explained later, in the section on Unix software
development], and has a few luxuries such as aliasing (giving a command
or a series of commands a new name), and it keeps a history of the
commands you enter. This shell gives a "%" prompt for user accounts and
a "#" prompt for superuser accounts.
ksh -This is the new, Korn shell. This shell combines features of both the
Bourne shell and the C shell. It boasts the Bourne shell's easier shell
programming, along with the C shell's aliasing and history. Its prompts
are "$" for users and "#" for superusers.
rsh -This is the restricted Bourne shell. It is used for accounts that the
superuser wishes to restrict the commands available to. It will not
allow you to execute commands outside of your searchpath (which will be
explained later, also, in the section on software development), and
will not let you change directories or change the values of shell
variables. In all other respects, it is similar to the Bourne shell. A
later section of this file will detail ways to overcome the
restrictions of this shell.
ua -This is a lousy, menu-driven shell for the AT&T Unix PC. (Yes, there
are some of those with dialups!) It implements a lousy windowing
system that is SLOOOW, even at 2400 baud. Luckily, you can exit to the
Bourne shell from the ua shell.
These are by no means all of the shells you will run across. These are
only the "official" shells provided by the distributors of the Unix operating
system. I've run across many "home-made" shells in my time. Also, any compiled
program can be used as a shell. For instance, I've used systems run by
businesses where one account logged in using an accounting program as a shell.
This prevented the account from being used to do anything other than use the

accounting program. Other good examples of this are the command logins-the who
command login, for example, uses the who program as its shell. When the program
is finished, the account is logged out. You will most definitely encounter
other such accounts as you hack Unix.
UNIX FILES AND DIRECTORIES
--------------------------
Unix files and directories are referenced with pathnames, a la MS-DOS.
If you are familiar with MS-DOs, then you should have no problem understanding
this section. Unix files and directories are referenced in the almost the exact
same way-the only difference is that it uses the "/" character, not the
backslash, to separate the directories in the pathname.
Pathnames are a simple concept to understand, but are difficult to
explain. Imagine the system's files and directories laid out in a tree fashion,
like this:
/ (root directory)
:
:
-------------------------
: :
: :
usr (dir) bill (dir)
: :
-------------- --------------
: : : :
junk (file) source (dir) memo (file) names (file)
:
"/" is the root directory. This is the top directory in the system tree, and
all other files and directories are referenced in relation to this directory.
The root directory has 2 subdirectories in it, "usr" and "bill". In the usr
directory, there is a file called "junk" and an empty directory called
"source". In the directory bill, there are 2 files, "memo" and "names". You
specify pathnames by starting at the top of the system, "/", and tracing your
way down the system tree to the file or directory you wish to reference,
separating each directory you must pass through to get to it with a slash. For
instance, the pathname of the file "junk" would be "/usr/junk". The pathname of
the usr directory would be "/usr". The pathname of the source directory would
be "/usr/source". The pathname of the bill directory would be "/bill", and the
pathnames of the 2 files which reside in it would be "/bill/memo" and
"/bill/names".
Files and directories can also be referenced by their base names if
they are in your current directory. For instance, if you were in the directory
"usr", you could reference the file "/usr/junk" by its base name, "junk". If
you were in the root directory, you could reference the bill directory by its
base name, "bill". You can reference the file directly above your current
directory in the system tree as ".." and your current directory can be
referenced as "."
Unix file and directory names can be up to 14 characters in length. The
filename can contain any ASCII character, including control characters, except
a space. It may contain both upper- and lower-case, and Unix does distinguish
between the two. Unix does not use filename extensions, a la VMS or MS-DOS, to
show the kind of file a file is. A period, in Unix, is just another character
in the filename, not a separator between 2 fields in the name. File names which
begin with a period are called "hidden" files-that is, they are only revealed
if you issue a special command.
There are 3 kinds of files in Unix. These are text files, binary files,

and device files. Text files are just what you'd think they are from the name-
files of ASCII text, just like what you're reading right now. Binary files are
executable machine-code files. (There are also executable text files, called
shell scripts, that will be explained in detail in the section on Unix software
development.) Device files are files that represent the system's I/O devices-
disk drives, terminals, etc. Remember, that Unix was created as an enviroment
for software development. Its designers wished for programs written for Unix
systems to be as transportable between different models of machines running
the operating system as possible. By representing the I/O devices as files,
they eliminated the incompatability in the code that handled I/O. The program
simply has to read and write from/to the file, and the Unix operating system
handles the system-dependant details.
BASIC UNIX COMMANDS
-------------------
This section will describe some basic Unix commands, and detail how to
get further help on-line. It will briefly provide the syntax for a few commands
you will find necessary to know in order to find your way around on the system.
Unix will usually only require that you use the base name of a file or
directory you wish to reference if it is in the directory you are currently in.
Most commands will also let you specify full pathnames if you wish to reference
files in other parts of the system. Most commands will also let you use several
wildcard characters when referencing files and directories. These are:
? -This means to accept any single character in the place of the question
mark. For instance, "t?m" would include both "tom" and "tim".
* -This means to accept any character, group of characters, or nothing in
the position of the asterisk. For example, "t*m" would include "thom",
"tom", and "tim".
[] -This means to accept any character within the brackets in the position
of the brackets. For instance, "t[oia]m" would include "tom", "tim",
and "tam". You can also specify a range of characters in the brackets
by using a hyphen. For instance, "t[a-c]m" would include "tam", "tbm",
and "tcm".
Most commands and programs in Unix take their input from the keyboard
and send their output to the screen. With most commands and programs, however,
you can instruct them to draw their input from a text file and redirect their
output to another file instead. For instance, assume there is a program on the
system called "encrypter", that takes its input from the keyboard, encrypts it,
and displays the encrypted data on the screen. You could instruct the program
to take its input, instead, from a previously prepared text file using the
input redirection character, "". Say, you wished to save the output in a file called
"private". You would type "encrypter < top_secret > private". The encrypter
program would then read in the contents of the file top_secret and write the
encrypted output into the file "private". Nothing would be displayed to the
screen. If the file private does not exist, it will be created. If it
previously existed, its contents will be erased and replaced with the output
from the encrypter program. Perhaps you would want to add to the contents of a

file rather than replace its contents? This is done with ">>". The command
"encrypter < top_secret >> private" would append the output from the encrypter
to the current contents of the file private. Again, if the file private does
not already exist, it will be created.
Most commands have one or more options that you can specify. These are
placed after the command itself in the command line, and preceded by a hyphen.
For instance, let's say that the encrypter program had an option called
"x", which caused it to use a different encoding algorithm. You would
specify it by typing "encrypter -x". If a command has two or more options, you
can usually specify one or more together in a stream. For instance, let's say
that the encrypter program has 2 options, x and y. You could specify both like
this: "encrypter -xy". If one or more of the options requires an argument, for
example the x option requires a 2 character key, you can specify the options
separately, like this: "encrypter -xaa -y", where aa is the 2-character key.
The pipe character, "|", is used to channel the output of one command
or program into the input of another. For instance, suppose you had a command
called "report" that formatted documents into report format, and you had a file
called "myreport" that you wished to view in the report format. You could type:
"cat myreport" | report". This would type out the contents of the file myreport
to the report command rather than the screen, and the report command would
format it and display it on the screen. (Note: this example could have been
done with I/O redirection by typing "report < myreport"...but it makes a good
example of the use of pipes.)
You can choose to execute commands and programs in the background-that
is, the command executes, but you are free to carry out other tasks in the
meantime. To do this, type in the command line, followed by " &". For instance,
"rm * &" would delete all the files in the directory, but your terminal would
not be tied up. You would still be free to perform other tasks. When you do
this, the system will print out a number and then return you to the system
prompt. This number is the process number of the command. Process numbers will
be explained later in this section in the entry for the command "ps". The
command can be stopped before its completion with the kill command, also
explained in this section. Example:
$rm * &
1234
$
Note that when you use background processing, the command or program will still
takes its input from the keyboard (standard input device) and send its output
to the screen (standard output device), so if you wish for the command to work
in the background without disturbing you, you must redirect its input (if any)
and its output (if it's to the screen).
THE COMMANDS
------------
ls -This command lists the files and subdirectories in a directory. If you
simply type "ls", it will display the files in your current directory.
You can also specify the pathname of another directory, and it will
display the files in it. It will not display hidden files (files whose
name begins with a period).
Options:
a -This option will display all files, including hidden files.
Example:
$ ls -a

. .. junk source
$
cd -This is the command used to move from one directory to another. To go
to a directory directly below your current directory, type "cd
". To move up to the directory directly above your current
directory, type "cd .." You can also jump to any directory in the
system from any other directory in the system by specifying the path-
name of the directory you wish to go to, such as "cd /usr/source".
Example:
$cd /usr/source
$
pwd -This prints out the pathname of the directory you are currently in.
Useful if you forget where you're at in the system tree.
Example:
$pwd
/usr/source
cat -Displays the contents of a text file on the screen. The correct syntax
is "cat ". You can use basenames or pathnames.
Example:
$cat memo
Bill,
Remember to feed the cat!
-Martha
$
rm -This deletes a file. Syntax: "rm ".
Example:
$rm junk
$
cp -Copies a file. Syntax: "cp file1 file2", where file1 is the file you
wish to copy, and file2 is the name of the copy you wish to create. If
file2 already exists, it will be overwritten. You may specify pathnames
for one or both arguments.
Example:
$cp /usr/junk /usr/junk.backup
stty -Displays/sets your terminal characteristics. To display the current
settings, type "stty". To change a setting, specify one of the options
listed below.
Options:
echo -System echoes back your input.
noecho -System doesn't echo your input.
intr 'arg' -Sets the break character. The format is '^c' for control-c,
etc. '' means no break character.
erase 'arg' -Sets the backspace character. Format is '^h' for control-h,
etc. '' means no backspace character.

kill 'arg' -Sets the kill character (which means to ignore the last line
you typed). Format is the same as for intr and erase,
'^[character]', with '' meaning no kill character.
Example:
$stty intr '^c' erase '^h'
$stty
stty -echo intr '^c' erase '^h' kill '^x'
lpr -This command prints out a file on the Unix system's printer, for you
to drop by and pick up (if you dare!) The format is "lpr ".
Example:
$lp junk
ed -This is a text file line editor. The format is "edit ". The
file you wish to modify is not modified directly by the editor; it is
loaded into a buffer instead, and the changes are only made when you
issue a write command. If the file you are editing does not already
exist, it will be created as soon as issue the first write command.
When you first issue the edit command, you will be placed at the
command prompt, ":" Here is where you issue the various commands. Here
is list of some of the basic editor commands.
# -This is any number, such as 1, 2, etc. This will move you down
to that line of the file and display it.
d -This deletes the line you are currently at. You will then be
moved to the previous line, which will be displayed.
a -Begin adding lines to the file, just after the line that you
are currently on. This command will put you in the text input
mode. Simply type in the text you wish to add. To return to the
command mode, type return to get to an empty line, and press
the break key (which is whatever character you have set as your
break key). It is important to set the break character with
stty before you use the editor!
/ -Searches for a pattern in the file. For example, "/junk" would
search the file from your current line down for the first line
which contains the string "junk", and will move you to that
line if it finds one.
i -Insert. Works similar to a, except that the text is inserted
before the line you are currently on.
p -Prints out a line or lines in the buffer. "p" by itself will
display your current line. "#p" will display the line "#".
You may also specify a range of lines, such as "1,3p" which
will display lines 1-3. "1,$p" will print out the entire file.
w -Write the changes in the buffer to the file.
q -Quit the editor.
Example:
$edit myfile
Editing "myfile" [new file]
0 lines, 0 characters
:a
I am adding stupid text to myfile.
This is a test.
^c [this is assumed as a default break character in this example]
:1,$p
I am adding stupid text to myfile.

This is a test.
:2
This is a test.
:d
I am adding stupid text to myfile.
:w
:q
$
grep -this command searches for strings of text in text files. The format is
grep [string] [file]. It will print out every line in the file that
contains the string you specified.
Options:
v -Invert. This will print out every line that DOESN'T contain
the string you specified.
Example:
$ grep you letter
your momma!
I think you're going to get caught.
$
who -This will show the users currently logged onto the system.
Example:
$ who
root console Mar 10 01:00
uucp contty Mar 30 13:00
bill tty03 Mar 30 12:15
$
Now, to explain the above output: the first field is the username of
the account. The second field shows which terminal the account is on.
Console is, always, the system console itself. On many systems where
there is only one dialup line, the terminal for that line is usually
called contty. the tty## terminals can usually be either dialups or
local terminals. The last fields show the date and time that the user
logged on. In the example above, let's assume that the current time and
date is March 30, and the time is 1:00. Notice that the time is in 24
hour format. Now, notice that the root (superuser) account logged in on
March 10! Some systems leave the root account logged in all the time on
the console. So, if this is done on a system you are using, how can you
tell if the system operator is really online or not? Use the ps
command, explained next.
ps -This command displays information about system processes.
Options:
u -this displays information on a specific user's processes. For
instance, to display the root account's processes:
$ ps -uroot
PID TTY TIME CMD
1234 console 01:00 sh
1675 ? 00:00 cron
1687 console 13:00 who

1780 tty09 12:03 sh
Now, to explain that: The first field is the process number.
Each and every time you start a processes, running a program,
issueing a command, etc., that process is assigned a unique
number. The second is which terminal the process is being run
on. The third field is when the process was started. The last
field is the base name of the program or command being run.
A user's lowest process number is his login (shell) process.
Note that the lowerst process in the above example is 1234.
This process is being run on the console tty, which means the
superuser is logged on at the system console. Note the ? as the
tty in the next entry, for the cron process. You can ignore any
processes with a question mark as the terminal. These processes
are not bewing carried out by a user; they are being carried
out by the system under that user's id. Next, note the entry
for process # 1687, on the console terminal, "who". this means
that the superuser is executing the who command...which means
he is currently actively on-line. The next entry is interest-
ing...it shows that the root user has a shell process on the
terminal tty09! This means that someone else is logged in
under the root account, on tty09. If more than one person is
using an account, this option will display information for all
of them, unless you specify the next option...
t -This allows you to select processes run on a specific term-
inal. For example:
$ps -t console
will show all the processes currently being run on the console.
Example:
Remember, options can usually be combined. This will show all
the root user's processes being run on the system console:
$ ps -uroot -tconsole
PID TTY TIME CMD
1234 console 01:00 sh
1687 console 13:00 who
$
kill -Kills processes. Syntax: kill [-#] process#. You must know the process
number to kill it. You can, optionally, specify an option of 1-9, to
determine the power of the kill command. Certain kinds of processes,
like shell processes, require more power to kill. Kill -9 will stop any
process. You must have superuser capabilities fo kill another user's
processes (unless he's using your account).
Example:
$kill -9 1234
1234 killed.
$
write -This command is for on-line realtime user to user communications. To
communicate with a user, type "write ". If more than one
person is logged in under that user name, you must specify a specific
terminal you wish to speak to. When you do this, the person you wish
to communicate with will see:

Message from [your account name] tty## [

passwd -This is the command used to change the password of an account. The
format is "passwd ". You must have superuser capabilities to
change the password for any account other than the one you are logged
in under. To change the password of the account you are currently
using, simply type "passwd". You will then be prompted to enter the
current password. Next, you will be asked to enter the new password.
Then you will be asked to verify the new password. If you verify the
old password correctly, the password change will be complete. (Note:
some systems use a security feature which forces you to use at least
2 non-alphanumeric characters in the password. If this is the case with
the system you are on, you will be informed so if you try to enter a
new password that does not contain at least 2 non-alphanumeric char-
acters.)
su -This command is used to temporarily assume the id of another account.
the format is "su ". If you don't specify an account, the
default root is assumed. If the account has no password, you will then
assume that account's identity. If it does have a password, you will
be prompted to enter it. Beware of hacking passwords like this, as the
system keeps a log of all attempted uses, both successful and un-
successful, and which account you attempted to access.
mkdir -This command creates a directory. the format is "mkdir ".
rmdir -This command deletes a directory. The directory must be empty first.
The format is "rmdir ".
mv -Renames a file. The syntax is "mv [oldname] [newname]". You can use
full pathnames, but the new name must have the same pathname as the
old name, except for the filename itself.
-------------------------------------------------------------------------------
Further help can usually be gained from the system itself. Most systems
feature on-line entries from the Unix System User's Manual. You can read these
entries using the man command. The format is "man ". Some Unix System
V systems also feature a menu-driven help facility. Simply type "help" to
access it. This one will provide you with a list of commands, as well as with
the manual entries for the commands.
-------------------------------------------------------------------------------
UNIX FILE AND DIRECTORY PROTECTIONS
-----------------------------------
Every Unix account is assigned a specific user number, and a group
number. This is how the system identifies the user. Therefore, 2 accounts with
different usernames but the same user number would be considered by the system
to be the same id. These user and group numbers are what Unix uses to determine
file and directory access privileges.
Unix has three different file/directory permissions: read, write, and
execute. This how these permissions affect access to files:
read -Allows a user to view the contents of the file.
write -Allows a user to change the contents of a file.
execute -Allows a user to execute a file (if it is an executable type of file;
if it isn't, the user will get an error when trying to execute it).
This is how these permissions affect access to directories:

read -Allows a user to list out the files in a directory (ls).
write -Allows a user to save and delete files in this directory.
execute -If a user has execute access to a directory, he can go to that dir-
ectory with the cd command. If he also has read permission to that dir-
ectory, he can also copy files from it and gain information on the
permissions for that directory and the files it contains, with the "l"
option to the ls command, which will be explained soon.
Unix divides users into 3 classes: user (the owner of the file or dir-
ectory), group (members of the owner's group), and other (anyone who doesn't
fit into the first two classes). You can specify what permissions to give to a
file for each class of user.
To show the permissions of the files in a directory, use "ls -l". This
will list the contents of the directory (as in ls), and will show each's
permissions. For example:
$ls
bin startrek
$ ls -l
drwxrwxrwx 1 bin sys 12345 Mar 10 01:30 bin
-rwxr-xr-- 1 guest users 256 Mar 20 02:25 startrek
In the above example, the directory we are in contains a subdirectory
called bin and a file called "startrek". Here is an explantion of the fields:
The first field contains the file's type and permissions. Look at the first
field of the first line, "drwxrwxrwx". Note the "d" at the begginning. Then see
the "-" at the begginging of the first field for the file startrek. This shows
the file type. "D" is a directory. "-" is a file. "c" is a device file. Now,
back to the first field of the first line again. Notice the "rwxrwxrwx". These
are the permissions. The permissions are divided into three groups:
[user][group][other]. R stands for read, w stands for write, and x stand for
execute. "rwxrwxrwx" means that all three classes of users, owner, group, and
other, have read, write, and execute permissions to the directory bin. Now look
at the second line. It reads "rwxr-xr--". Notice the "-"'s in the place of some
of the permissions. This means that the file was not given that permission.
Line 2 shows that the owner has read, write, and execute permissions for the
file startrek, members of the owner's group have read and execute permissions
but not write (notice the "-" in the place of the group part's w), and all
others have only read privileges ("r--"...there are hyphens in the place of the
others part's w and x).
Now, let's look at the other fields. The second field is a number (in
this case, the number is one for each line). This shows the number of copies of
this file on the system. The third field shows the name of the owner of file
(or directory). The fourth field shows the username of the owner of the file.
The fifth field, which is not shown on some systems, shows the name of the
owner's group.The sixth field shows the size of the file. the seventh field
shows the time and date the file was last modified. the last field shows the
name of the file or directory.
The command used to change file/directory permissions is chmod. There
are 2 ways to change permissions: symbolically and absolutely. This will
explain both.
When you change permissions symbolically, only the permissions you
specify to be added or deleted will be changed. The other permissions will
remain as they are. The format is:
chown [u, g, or o] [+ or -] [rwx] [file/directory name]
The following abbreviations are used:
u -User (the file or directory's owner)
g -Group (members of the owner's group)

o -Others (all others)
r -Read permission
w -Write permission
x -Execute permission
You use u, g, and o to specify which group you wish to change the privileges
for. To add a permission, type "chown [class]+[permissions] [filename]". For
instance, to add group write permissions to the file startrek, type "chown g+w
startrek". To delete permissions, use the "-". For instance, to remove the
owner's write access to the file "startrek", type "chown u-w startrek".
When you set file permissions absolutely, any permissions that you do
not give the file or directory are automatically deleted. The format for
setting permissions absolutely is "chown [mode number] filename". You determine
the mode number by adding together the code numbers for the permissions you
wish to give the file. Here are the permissions and their numbers:
Others execute permission 1
Others write permission 2
Others read permission 4
Group execute permission 10
Group write permission 20
Group read permission 40
User (owner) execute permission 100
User (owner) write permission 200
User (owner) read permission 400
There are also two special file modes that can be set only absolutely.
These are the UID and GID modes. The UID mode, when applied to an executable
file, means that when another user executes the file, he executes it under the
user number of the owner (in other words, he runs the program as if he were the
owner of the file). If the file has its GID mode bit set, then when someone
executes the file, his group will temporarily be changed to that of the file's
owner. The permission number for the GID mode is 2000, and the number for the
UID mode is 4000. If the uid bit is set, there will be an "S" in the place of
the x in the owner permissions section when you check a file's permissions:
-rwSr-xr-x
If the uid bit is set, and the owner of the file has execute permissions, the S
will not be capitalized:
-rwsr-xr-x
If the gid bit is set, the same applies to the x in the section on group
permissions.
A short note here is in order on how these permissions affect superuser
accounts. They don't-unless the owner of the file is root. All superuser
accounts have the same user number, which means that the system considers them
all to be the same-that is, they are considered to be the root account. Thus,
superuser accounts are only bound by the protections of files and directories
that they own, and they can easily change the permissions of any files and
directories that they do not have the access to that they wish.
SPECIAL UNIX FILES
------------------
This section will detail the purposes of some files that are found on
all systems. There are quite a few of these, and knowing their uses and what
format their entries are in is very useful to the hacker.

THE FILES
---------
/etc/passwd -This is the password file, and is THE single most important
file on the system. This file is where information on the
system's accounts are stored. Each entry has 7 fields:
username:password:user#:group#:description:home dir:shell
The first field, naturally, is the account's username. The
second field is the account's password (in an encrypted form).
If this field is blank, the account doesn't have a password.
The next field is the account's user number. The fourth field
is the account's group number. The fifth field is for a
description of the account. This field is used only in the
password file, and is often just left blank, as it has no
significance. The sixth field is the pathname of the account's
home directory, and the last field is the pathname of the
account's shell program. Sometimes you may see an account with
a program besides the standard shell programs (sh, csh, etc.)
as its shell program. These are "command logins". These
accounts execute these programs when logging in. For example,
the "who" command login would have the /bin/who program as its
shell.
Here is a typical-looking entry:
root:hGBfdJYhdhflK:0:1:Superuser:/:/bin/sh
This entry is for the root account. Notice that the encrypted
form of the password is 13 characters, yet the Unix passwords
are only 11 characters maximum. The last 2 characters are what
is called a "salt string", and are used in the encryption
process, which will be explained in more detail later. Now,
notice the user number, which is zero. Any account with a user
number of 0 has superuser capabilities. The group number is 1.
The account description is "superuser". The account's home dir-
ectory is the root directory, or "/". The account's shell is
the bourne shell (sh), which is kept in the directory /bin.
Sometimes you may see an entry in the password field like this:
:NHFfnldyNjh,21AB:
Notice the period after the 13th character, followed by 2
digits and 2 letters. If an account has an entry like this, the
account has a fixed expiration date on its password. The first
digit, in this case 2, shows the maximum number of weeks that
the account can keep the same password. The second digit shows
how many weeks must pass before the account can change its
password. (This is to prevent users from using the same old
password constantly by changing the password when forced to and
then changing it back immediately.) The last 2 characters are
an encrypted form of when the password was last changed.
Other unusual password field entries you might encounter are:
::
:,21:
The first entry means that the account has no password. The
second entry means that the account has no password yet, but
has a fixed expiration date that wil begin as soon as a pass-

word is given to it.
Now, for an explanation of how the Unix system encrypts
the passwords. The first thing any hacker thinks of is trying
decrypt the password file. This is as close to impossible as
anything gets in this world. I've often heard other "hackers"
brag about doing this...this is the biggest lie since Moses
said "I did it". The encryption scheme is a variation on the
DES (Data Encryption Standard). When you enter the command
passwd (to change the password), the system will form a 2
character "salt string" based on the process number of the
password command you just issued. This 2-character string pro-
duces a slight change in the way the password is encrypted.
There are a total of 4096 different variations on the
encryption scheme caused by different salt string characters.
This is NOT the same encryption scheme used by the crypt
utility. The password is NEVER decrypted on the system. When
you log on, the password you enter at the password prompt is
encrypted (the salt string is taken from the password file)
and compared to the encrypted entry in the password file. The
system generates its own key, and as of yet, I have not
discovered any way to get the key. The login program does
not encrypt the password you enter itself, it does so, I
believe, by a system call.
/etc/group -This is the group file. This allows the superuser to give
certain accounts group access to groups other than their own.
Entries are in the format:
group name:password:group number:users in this group
The first field is the name of the group. The second is the
field for the group password. In all my experience with Unix,
I have never seen the password feature used. The third is the
group's number. The fourth field is a list of the users who
group access to this group. (Note: this can include users whose
group number is different from the number of the group whose
entry you are reading in the group file.) The usernames are
separated by commas. Here's an example:
sys::2:root,sys,adm,lp
To change to a new group identity, type "newgrp [group]". If
the group has a password, you must enter the proper password.
You cannot change to another group if you are not listed as a
member of that group in the group file.
/dev/console -This is the device file for the system console, or the
system's main terminal.
/dev/tty## -The device files for the system's terminals are usually in
the form tty##, such as tty09, and sometimes ttyaa,ttyab, etc.
Some ways to make use of the Unix system's treatment of devices
as files will be explored in the section on Hacking Unix. When
these files are not in use by a user (in other words, no one's
logged onto this terminal), the file is owned by root. While a
user is logged onto a terminal, however, ownership of its

device file is temporarily transferred to that account.
/dev/dk## -These are the device files for the system's disks.
login files -There are special files that are in a user's home directory
that contain commands that are executed when the user logs in.
The name of the file depends on what shell the user is using.
Here are the names of the files for the various shells:
Shell File
----- ----
sh .profile
csh .cshrc
ksh .login
rsh .profile
Some systems also use a file called ".logout" that contains
commands which are executed upon logoff.
These types of files are called shell scripts, and will
will be explained in the section on Unix Software Development's
explanation of shell programming.
/usr/adm/sulog -This is a log of all attempted uses of the su utility. It
shows when the attempt was made, what account made it, and
which account the user attempted to assume, and whether or not
the attempt was successful.
/usr/adm/loginlog
or
/usr/adm/acct/sum/loginlog- This is a log of all logins to the system. This
only includes the time and the account's username.
mbox -These are files in the home directories of the system's users,
that contain all the mail messages that they have saved.
/usr/mail/ -These files in the directory /usr/mail are named after
system accounts. They contain all the unread mail for
the account they are named after.
/dev/null -This is the null device file. Anything written to this file is
just lost forever. Any attempt to read this file will result in
an immediate control-D (end of file) character.
/tmp -The directory /tmp provides storage space for temporary files created
by programs and other processes. This directory will always have
rwxrwxrwx permissions. Examining these files occasionally reveals some
interesting information, and if you know what program generates them
and the format of the information in the file, you could easily change
the info in the files, thereby changing the outcome of the program.
THE CRON UTILITIES
------------------
An understanding of the cron utilities will be necessary to understand
certain parts of the section on Hacking Unix. This section will give a detailed
explanation of the workings of the cron utilities.
The cron utility is a utility which carries out tasks which must be
performed on a periodic basis. These tasks, and the times when they are to be
carried out, are kept in files in 2 directories: /usr/lib and
/usr/spool/cron.
The file crontab in the directory /usr/lib contains entries for system
tasks that must be performed on a periodic basis. The format for the entries in

this file is:
minute hour dayofmonth monthofyear dayofweek commandstring
The first field is the minutes field. This is a value from 0-59.
The second field is the hour field, a value from 0-23.
The third field is the day of the month, a value from 1-31.
The fifth field is the month of the year, a value from 1-2.
The sixth field is the day of the week, a value from 1-7, with monday being 1.
The seventh field is the pathname and any arguments of the task to be carried
out.
An asterisk in a field means to carry out the task for every value of that
field. For instance, an asterisk in the minutes field would mean to carry out
that task every minute. Here's an example crontab entry:
0 1 * * * /bin/sync
This runs sync command, which is kept in the directory bin, at 1 am every day.
Commands in the file /usr/lib/crontab are performed with root privileges.
in the directory /usr/spool/crontabs, you will find files named after
system accounts. These files contain cron entries which are the same as those
in the file /usr/lib/crontab, but are carried out under the id of the user the
file is named after. The entries are in the same format.
BEWARE! When modifying cron files- cron activity is logged! All cron activity
is logged in the file /usr/adm/cronlog. I've found, however, that on most
systems, this file is almost never checked.
UNIX SOFTWARE DEVELOPMENT
-------------------------
The Unix operating system was initially created as an enviroment for
software development, and that remains its main use. This section will detail
some of the os's main facilities for software development, the C compiler and
shell programming, and their related utilities. A few of the other languages
will be briefly touched upon at the end of this section, also.
SHELL PROGRAMMING
-----------------
The shell is more than a simple command interpreter. It is also a
sophisticated programming tool, with variables, control structures, and the
features of just about any other programming language. Shell programs are
called scripts. Scripts are just text files which contain the names of commands
and programs. When the script is executed, the command and programs whose names
it contains are executed as if you had typed in their names from your keyboard.
There are two ways to execute a shell script: if you have execute permission to
it, you can simply type in its name. Otherwise, (if you have read access to
it), you can type "sh [filename]". Here is a sample shell script:
who
whoami
As you can see, it contains the commands who and whoami. When you execute it,
you will see a list of the system's current users (the output of the who
command), and which account you are logged in under (the output of the whoami
command).
This will concentrate solely on shell programming. While shell