Cover V10, I03
Article

mar2001.tar


Using PortSentry and LogCheck

Anthony Cinelli

A successful network roll out begins and ends with security. No matter what amount of money is spent obtaining the latest and greatest hardware and software for a system, it can be rendered worthless if its security is compromised. Unfortunately, keeping up with system security can be a tedious task. An administrator must constantly stay aware of updates to currently used software, as well as the latest system compromise techniques. Due to this difficulty, system security is often lacking in many areas. All of this changed for me when I discovered the freeware tools offered by Psionic Software, Inc. called PortSentry and Logcheck. These tools can be quickly installed and configured on a system to improve its security.

The Anatomy of PortSentry

Once a host is designated a target by an attacker, a port scan is usually performed. The port scan is performed to expose all services available on the target host, and thus provide a starting point for break-in attempts. PortSentry detects such scans by monitoring the unused ports on the host. Upon a connection attempt to one of the unused ports, PortSentry is alerted and then has the ability to issue any number of commands in response to the scan. The commands issued are configured by the administrator within a configuration file. Although any command may be used, the most useful will be one in which the IP address of the attacker's host is essentially "black holed" by issuing a routing command denying all traffic from that address. The violation, and corresponding action taken by PortSentry, is logged in the system log. Using Logcheck, these security alerts are emailed to an administrator at any designated interval. Thus, the host can now automatically retaliate against a potential break-in attempt and notify the administrator of the occurrence.

Installation and Configuration

Installation and configuration of these freeware utilities is simple and straightforward. They compile on most operating systems including Linux, Solaris, and FreeBSD. The system used for the following install is an x86-based Web server using Red Hat Linux 7.0. The tools can be downloaded from Psionic's Web site:

 http://www.psionic.com/tools
The latest version of the tarballs, as of this writing, are Logcheck 1.1.1 and PortSentry 1.0.

Here's how to install and configure PortSentry:

1. Untar the archive and enter the PortSentry-version directory.

2. Read the README.install file for all configuration options available if desired.

3. make <systype> (where systype is one of: Linux, BSD, Solaris, HP-UX, HP-UX gcc, FreeBSD, OpenBSD, NetBSD, BSDi, AIX, OSF, generic).

4. make install (installation directory can be changed by editing the Makefile)

Next, install Logcheck:

1. Untar the archive and enter the logcheck-version directory.

2. Read the INSTALL file for all configuration options available, if desired.

3. make <systype> (where systype is one of: Linux, BSD, FreeBSD, Sun, generic, HP-UX, Digital).

4. make install (installation directory can be changed by editing the Makefile)

Next, edit the /usr/local/psionic/portsentry/portsentry.conf file to enable route drop. Find and uncomment the KILL_ROUTE option, which corresponds to your operating system. For this example, I will use the ipchains utility found in the Linux kernel version 2.102+:

 KILL_ROUTE="/sbin/ipchains -I input -s $TARGET$ -j DENY -l
This will drop all packets originating from that attacker's IP address and log future connection attempts. Individual ports must now be specified for monitoring within the configuration file. Commonly used ports are already given, simply to be uncommented, depending upon how secure the system needs to be:

 TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,
 12345,12346,20034,31337,32771,32772,32773,32774,40421,49724,54320"
 UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,32770,32771,32772,
 32773,32774,31337,54321"
On this example Linux system, however, I will use PortSentry's advanced stealth scan detection mode, which will automatically monitor ports not being used below 1024 by default. This value can also be altered, but not recommended. When using this advanced mode, ports can also be manually excluded:

 # Default TCP ident and NetBIOS service
 ADVANCED_EXCLUDE_TCP="113,139"
 # Default UDP route (RIP), NetBIOS, bootp broadcasts.
 ADVANCED_EXCLUDE_UDP="520,138,137,67"
Once all services for the host have been started, PortSentry can now be enabled. First, start up the TCP port monitor (leaving out the -atcp switch for non-Linux systems):

 /usr/local/psionic/portsentry/portsentry -atcp
Tailing our system log will give the following output:

 Dec 1 14:23:20 hostname portsentry[18821]: adminalert: Advanced 
  Stealth scan detection mode activated. Ignored TCP port: 80
 Dec 4 14:23:20 hostname portsentry[18821]: adminalert: PortSentry
  is now active and listening.
A list of ignored TCP ports will be displayed followed by confirmation of PortSentry's activation. Then, if desired, start up the UDP port monitor (again, leaving out the -audp switch for non-Linux systems):

 /usr/local/psionic/portsentry/portsentry -audp
Tailing the system log once more will give the following output:

 Dec 1 14:23:20 hostname portsentry[18821]: adminalert: Advanced 
  Stealth scan detection mode activated. Ignored UDP port: 137
 Dec 4 14:23:20 hostname portsentry[18821]: adminalert: PortSentry
  is now active and listening.
A list of ignored UDP ports will be displayed followed by confirmation of PortSentry's activation. The command(s) can be placed within a startup script, but should always be initialized after all other services are active. In this example, I will include the above command line into /etc/rc.d/rc.local. All actions taken by PortSentry will be logged in the system log.

With PortSentry now running, you can configure LogCheck to email an administrator with any suspicious network activity experienced by the host. Edit /usr/local/etc/logcheck.sh to include the email address of the administrator:

 SYSADMIN=your_administrator@yourdomain.com
Finally, place the logcheck command into a cron script to parse the system log at an interval best suited for your operations. For this example, I set the interval at one hour. Open the crontab for editing:

 crontab -e
and place the following line into the crontab:

 0 * * * * /usr/local/etc/logcheck.sh >> /dev/null
The following is a recent example of an emailed intrusion attempt detected by PortSentry and parsed by Logcheck (names have been changed to protect the innocent, not the guilty):

 Active System Attack Alerts
 =-=-=-=-=-=-=-=-=-=-=-=-=-=
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: SYN/Normal 
  scan from host: telephony.titg.com/216.29.146.2 to TCP port: 111
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: Host 
  216.29.146.2 has been blocked via wrappers with string: "ALL: 
  216.29.146.2"
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: Host 
  216.29.146.2 has been blocked via dropped route using command: 
  "/sbin/ipchains -I input -s 216.29.146.2 -j DENY -l"
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: SYN/Normal 
  scan from host: telephony.titg.com/216.29.146.2 to TCP port: 111
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: Host:
 telephony.titg.com/216.29.146.2 is already blocked Ignoring
 
 Security Violations
 =-=-=-=-=-=-=-=-=-=
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: SYN/Normal 
  scan from host: telephony.titg.com/216.29.146.2 to TCP port: 111
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: Host 
  216.29.146.2 has been blocked via wrappers with string: "ALL: 
  216.29.146.2"
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: Host 
  216.29.146.2 has been blocked via dropped route using command: 
  "/sbin/ipchains -I input -s 216.29.146.2 -j DENY -l"
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: SYN/Normal 
  scan from host: telephony.titg.com/216.29.146.2 to TCP port: 111
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: Host:
 telephony.titg.com/216.29.146.2 is already blocked Ignoring
 
 Unusual System Events
 =-=-=-=-=-=-=-=-=-=-=
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: SYN/Normal 
  scan from host: telephony.titg.com/216.29.146.2 to TCP port: 111
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: Host 
  216.29.146.2 has been blocked via wrappers with string: 
  "ALL: 216.29.146.2"
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: Host 
  216.29.146.2 has been blocked via dropped route using command: 
  "/sbin/ipchains -I input -s 216.29.146.2 -j DENY -l"
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: SYN/Normal 
  scan from host: telephony.titg.com/216.29.146.2 to TCP port: 111
 Dec 4 10:41:18 hostname portsentry[17879]: attackalert: Host:
 telephony.titg.com/216.29.146.2 is already blocked Ignoring
 
We now have the host configured to detect and react to intrusion attempts and to notify the administrator of such attempts, all fully automated.

Conclusion

With the use of these tools, system security is less of a chore. Our systems have been using these freeware security utilities for nine months, and they have performed flawlessly. Upon our initial use of the utilities, I was amazed to see how many intrusion attempts had been made over a 24-hour interval. The configuration is extremely comprehensive and allows flexibility in constructing your own network security policies. I have set up dozens of gateway/firewall systems for enterprises and have incorporated these utilities into our standard Linux/UNIX base installation.

Anthony Cinelli is the President/CTO of an IT consulting and servicing company, A Reality Technologies, LLC (www.areality.com), operating out of Santa Monica, California. He spent the previous three years working for Paycom.net, an e-commerce transaction company. He performed various Internet security and system development tasks. When not hacking, he can be found proving that water is stronger than rock. Anthony can be reached at: acinelli@areality.com.