Nessus
-- A Powerful, Free Remote Security Scanner
Alan P. Laudicina
In the July 1999 issue of Sys Admin magazine, I wrote an
article called "Exploits" (http://www.samag.com/documents/s=1176/sam9907f/sam9907f.htm)
in which I rated five security tools, including Nessus. It wasn't
the first time I had used Nessus, but it was the first time I had
taken a serious look at it. I was astonished by its functionality,
as well as the many options.
What Is Nessus?
Nessus is one of the best security scanning tools available. A
security scanner is software that will remotely audit a computer
network to determine whether any machines can be accessed by crackers,
but Nessus takes it to the next level. While other scanners simply
try to guess what is running on every port by matching the ports
with the IANA assigned port numbers, Nessus finds out what is actually
running, but it doesn't stop there. Nessus also checks whether
the process that's running is a security hazard. For example,
if you run qpopper on port 678, Nessus will see that port 678 is
open, check what's running on that port, and see whether it
is vulnerable to even the most recent exploits. If it is an old
version of qpopper that is vulnerable to a remote root shell exploit,
Nessus will also attempt to exploit the hole and drop to a root
shell.
The Nessus scanner comprises two parts: a daemon (nessusd),
which performs the attacks, and a client, which is a front end to
the server. The client controls the server, so you can audit your
whole network from your personal computer at home, with your server
at work doing the actual attacking. The client can run on just about
any operating system because there are GTK, Java, and Windows versions
available. However, the server can only be used in a UNIX environment
(which shouldn't be a problem for most Sys Admin readers).
The fact that Nessus has both client and server components means
you can have the client and server on different machines. One of
these machines could be the "attacking" machine, which
would perform the attacks on remote hosts. The other machine (the
"watching" machine) could monitor the problems found by
the attacking machine. Or, you could have one machine running both
the server and the client, and use this one machine to test many
other remote machines. (If Nessus didn't come in two parts,
it is unlikely that it would support Windows because it would require
a lot more porting. However, because Nessus has these features,
it is possible to run the server on a UNIX-based operating system,
with the client on a Windows machine.)
How Does Nessus Know What's Exploitable?
Every security test that Nessus performs is an external plug-in,
which makes it easy for administrators to add their own tests without
having to read any of the source code for nessusd. Most of these
security checks are written in the NASL (Nessus Attack Scripting
Language), which was designed for the purpose of writing Nessus
plug-ins very quickly and easily. Although most of the plug-ins
are written in the NASL, it is also possible to write them in the
C programming language.
Nessus is licensed under the GPL. As with a lot of other open
source projects (including the Linux kernel), when people see a
good project that needs help, they submit patches and add-ons. In
the case of Nessus, each vulnerability is handled by a specific
plug-in. As of December 5th, 2001, there were 800 different plug-ins
sorted into the following 18 families:
- Backdoors
- CGI abuses
- Denial of Service
- Finger abuses
- Firewalls
- FTP
- Gain a shell remotely
- Gain root remotely
- General
- Miscellaneous
- NIS
- Port scanners
- Remote file access
- RPC
- SMTP problems
- SNMP
- Useless services
- Windows
Each family has an assortment of plug-ins that do various things.
Under the "Gain root remotely" family, there are plug-ins
that will test whether Nessus can succeed in gaining a root shell
over the network. For example, if I wanted to run the "qpopper
buffer overflow" plug-in, Nessus would scan my network to see
whether qpopper was running on any of the machines. If Nessus found
qpopper running on port 678, it would try to use the buffer overflow
plug-in, and if successful, it would report that it was possible
to gain a remote root shell. Nessus also provides information on
how to fix the problem. With the "qpopper buffer overflow"
plug-in, if Nessus gained a root shell remotely, it would provide
instructions to "upgrade to version 2.5 or newer" and
would report a Risk Factor, which would be "High" in this
case.
You may be thinking that since the scanner does all this, the
scan itself must be a long and tedious process, but that is not
the case. The Nessus Web site (http://www.nessus.org/) boasts
that Nessus is "very fast, reliable, and has a modular architecture
that allows you to fit it to your needs".
Installing Nessus from Source
As with pretty much everything you install onto your machine,
the first thing you will need to do is download the source. The
source for Nessus is located at: http://www.nessus.org/download.html.
Since we are running UNIX-based machines, we will want the POSIX
version. When you enter the page, you will see that there are a
few prerequisites, which are GTK, Nmap, and m4. I will assume that
you have these installed already, but I've provided the URLs
in the "Other Sources of Information" section of this
article.
If you would rather have a command-line client, GTK is not required.
You can build the command-line client by substituting the ./configure
command I use in the article with ./configure --disable-gtk.
I suggest using a mirror site instead of using the ftp.nessus.org
site directly. The files that need to be downloaded are in the src/
directory of every mirror. There are four packages that need to
be installed in a specific order to get Nessus properly working:
- nessus-libraries
- libnasl
- nessus-core
- nessus-plugins
Installing each of these packages is easy. Once you have downloaded
the gzipped tarballs, the following steps are to be taken as a normal
(non-root) account. Building each of these packages can take a while.
gunzip package.tar.gz
tar -xvf package.tar
cd package
where "package" is the name of a package (such as nessus-libraries-1.0.8.tar.gz).
Once you are in the directory created by untarring the package, you
can run the following commands (again as a non-root user):
./configure
make
Once you have done this, you will need to run the following command
as a root user:
make install
When you do that for the four packages that I listed previously, you
are just a few minutes away from actually firing up nessusd as well
as the nessus client.
Getting the nessusd Server Ready
First, you must add a user so you can log in to the nessus server
and issue commands via the client. To do this, run the nessus-adduser
command. Here is some sample output:
Add a new nessusd user
----------------------
Login : alanp
Authentication method (cipher/plaintext) [cipher] : cipher
Is "alanp" a local user on this machine [y|n]? y
Ok, treating user "alanp" as a local user.
User rules
----------
nessusd has a rules system which allows you to restrict the hosts
that alanp has the right to test. For instance, you may want
him to be able to scan his own host only.
Please see the nessus-adduser(8) man page for the rules syntax
Enter the rules for this user, and hit ctrl-D once you are done :
(the user can have an empty rules set)
^D
Login : alanp
Auth. method : cipher, local user connecting from 127.0.0.1
Rules :
Is that ok ? (y/n) [y]
Once you make it beyond this point, nessus-adduser will create
primes, and then ask you for a pass phrase. You will use this password
when connecting to the server with your client. Before you can start
nessusd, you may want to edit /usr/local/etc/nessus/nessusd.conf
(where several options for nessusd are set). You can check the defines
and change things to your liking, but you must be careful not to mess
anything up.
nessusd.conf
The configuration file for the nessus daemon is usually located
at /usr/local/etc/nessusd.conf but this file may be located
somewhere else if a custom installation is done. The file is made
of lines in the form of:
<keyword> = <value>
Lines can also be started with a comment (# character). Here are some
of the values:
plugins_folder -- Points to the directory where the
plug-ins reside. You don't want to change this unless you move
the plug-ins to a different directory.
logfile -- Path to the logfile. It is usually a good
idea to set this to syslog so all the messages that nessusd
has will go directly to syslog, where you can control it better.
max_threads -- The maximum number of hosts that the
nessusd should scan at once. This number can be given to the client,
which will override max_threads in the nessusd.conf.
users -- Path to the user database.
rules -- Path to the rules database.
language -- The language you would like nessusd to
use when it reports to the client. This can be set to either "English"
or "Francais" (French). More languages are promised in
the future by the Nessus developers.
checks_read_timeout -- The number of seconds to wait
during security checks when doing a recv(). You should increase
this if you are on a slow link such as a modem.
peks_keylen -- The minimum key length for public keys.
peks_keyfile -- The path to the private key database.
peks_usrkeys -- The path to the public user key and
password database.
peks_pwdfail -- The maximum number of login failures
to allow before a temporary password is destroyed.
Some items listed here can be overridden by the Nessus client.
Once you have finished editing the nessusd configuration file,
it is safe to start nessusd as root with the command:
nessusd -D
(The -D flag runs nessusd in the background, which it doesn't
do by default.)
Starting Up the Nessus Client
You are now ready to start the front end to nessusd. You can do
this by running nessus as a normal user. Once started, it
will ask for the pass phrase you created when running nessus-adduser.
Input it, and you will get to the main client configuration screen.
Here you need to set the Nessusd Host, Port, Encryption,
and Login. All of these variables were set when you set up
nessusd, so you will want to use the same ones that you did then.
Once everything is ready, you can click "Log In" and you
will be logged into the nessusd server.
Preparing for Your First Scan
If you followed the previous step correctly, you will now be at
a list of plug-ins. If the machine you are scanning isn't production,
feel free to click the "Enable All" button. However, if
it is a production machine, click the "Enable all but dangerous
plug-ins" button. Next, you need to set up some preferences.
If you choose to use the "dangerous plug-ins", your network
will be the victim of Denial Of Service attacks that could bring
single machines, or a whole network, down. It is usually safe not
to use Denial of Service attacks on a network that is home to production
machines.
Prefs.
The contents of the "Prefs." tab depends on which plug-ins
you have enabled. For many of the preferences, you must input a
valid login and password for services on the machine(s) that you
will be scanning. You must also decide which scans you will be doing.
I find that leaving the default values for most of the scanning
techniques is fine for my use, but you may want to do something
else on your network. Either way, all the different types of scans
are listed and easily selected.
Scan Options
In the "Scan Options" tab, you must specify the port
numbers, threads, and the path to CGIs. I find that scanning the
entire machine (port 1-65535) is the best setting to use. Setting
the max threads to "8" is fine. You will also want to
set the path to the CGIs that are included in your Web server, as
this isn't always /cgi-bin. The default Port Scanner
options are fine for normal use; if you need more, the other available
options are visible.
Target Selection
In the "Target Selection" tab, you set the machines
that you want to be scanning. If you want to scan more than one
machine at once, you can use a comma to separate the different machines.
Starting Your First Scan
You can start your first scan by clicking on "Start the scan".
This will take you to a window with the name of the computer you're
scanning and a status bar showing the scan's progress. If there's
a problem and you need to restart, you can stop the scan by clicking
the "Stop" button. Once your scan is done you will be
brought to a window showing the problems with the machine that you
were scanning. A "security warning" is something to worry
about. Don't be worried about a "security note",
as that's just a note, and doesn't mean anything is wrong.
The Output of Your First Scan
When your first security test is over, a window will pop up with
a complete report on the hosts that you have scanned. I ran Nessus
on one of the machines on my LAN, and Figure 1 shows the report
that I received.
There are three main parts to the report:
SUMMARY -- The summary of the network you scanned will tell
you how many hosts were scanned, and how many warnings, notes, and
holes were found. In the example we can see that one host, 192.168.1.1,
was scanned. During this scan Nessus found three security warnings,
five security notes, and no security holes.
TESTED HOSTS -- This is list of the hosts that were scanned.
Our example report shows that the only host scanned was 192.168.1.1,
and the highest severity of a problem found was a "Security
Warning".
DETAILS -- This provides all of the information that Nessus
collected from the host(s) scanned.
Security Notes are simply the information on what is running on
every open port. As shown in the example report, the five warnings
show us that ssh-1.99-openssh_2.9, BIND-8.2.4-REL, and Apache/1.3.20+PHP/4.0.6
are running. The other two security notes are a traceroute to the
scanned host, and information on the remote host's operating
system. Nessus guesses the remote host's operating system by
running QueSO on the hosts that are scanned.
Security Warnings are usually not very serious. Whenever you get
a security warning, you will always get a "Risk Factor"
and a Solution to fix the problem that was found. Sometimes these
warnings can be false alarms. In the sample report, there is a "Medium
Risk Factor" associated with BIND. The report tells us that
the remote name server allows DNS zone transfers to be performed.
In fact, the only reason we were able to do a zone transfer from
192.168.1.1 was because we are on a machine that does secondary
DNS for a domain hosted by 192.168.1.1. If you are scanning your
local network and see security warnings with your internal nameserver,
you can usually ignore them, but use discretion in doing so.
Although no security holes were found on 192.168.1.1, if one had
been found, Nessus would have followed a scenario similar to that
of a warning -- meaning it would provide a "Risk Factor"
and "Solution" that you could use to fix the problem.
What To Do If There Are Problems with Daemons That Are Running
If you received a serious security warning about something you
are running on your machine, you want to upgrade it as soon as possible.
If it is not something of great importance, you want to disable
it as soon as you can, and only bring it back up when it is upgraded.
If you are aware of a vulnerability on your machine, and you leave
it open, chances are a cracker will find it, too. And when a cracker
finds out that he can get into your box, he will do so. This can
lead to serious problems, such as your machine being used for malicious
attacks on other systems, or user passwords being cracked.
Conclusion
Ensuring that your computer is secure from intrusion is not a
thing to do once a week -- it is something you should do every
day. I run Nessus on my local network every two or three days. Just
to be safe, I also run a sniffer on my FreeBSD gateway machine.
This allows me to watch all the incoming and outgoing packets for
which my machines are responsible.
Alan P. Laudicina is a student at Assumption College School
in Windsor, Ontario, Canada. He is currently the Web master of http://www.UnixPower.org.
He started using Unices at the age of nine and is the founder and
president of the Windsor Unix Users Group. More information on the
Windsor Unix User Group can be found at http://www.wuug.org/.
Alan can be contacted via email at: alanp@unixpower.org.
|