From: www.itworld.com

On getting cracked and recovering with NMAP

April 3, 2001 —

 

Two weeks ago I wrote about stealth scans and promised to follow up with a column on NMAP, Fyodor's wonderful open source port scanner. But between that time and the appearance of this column, two big stories got in the way. First came word that LinuxWorld.com was moving to ITworld.com's site. Then came a rare opportunity to bring together Bob Young and a player from the Dark Side in an exclusive one-on-one, which was presented last week in place of the stealth scan follow-up (see Resources for links). My apologies for being late, but here it is. And just as someone out there is certain to be snickering about my network security skills, better late than never. (See Resources for links to previous columns.)

Call it baud karma. Call it carelessness. Call it inevitable. I was 0wn3d and didn't know it. After downloading and installing BETA 21 of version 2.54 of NMAP (and its graphical frontend), I su'd to root, fired it up, and aimed a FIN stealth scan at ports 1-32000 on my server. I was running portsentry on the server, but my desktop machine -- the one I was running NMAP on -- was on the portsentry ignore list so that it wouldn't simply reroute my inquisitive packets to /dev/null after I hit the first protected port.

NMAP's GUI

The image above shows the way I had NMAP configured for the scan. It took less than a minute to ruin my entire week. The results are below. The same scan produces markedly different results today.


Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ )
 Interesting ports on pooh.pjprimer.com (216.140.158.195):
(The 31957 ports scanned but not shown below are in state: closed)
Port       State       Service
1/tcp      open        tcpmux                  
7/tcp      open        echo                    
9/tcp      open        discard                 
11/tcp     open        systat                  
15/tcp     open        netstat                 
21/tcp     open        ftp                     
23/tcp     open        telnet                  
25/tcp     open        smtp                    
70/tcp     open        gopher                  
79/tcp     open        finger                  
80/tcp     open        http                    
98/tcp     open        linuxconf               
109/tcp    open        pop-2                   
110/tcp    open        pop-3                   
111/tcp    open        sunrpc                  
113/tcp    open        auth                    
119/tcp    open        nntp                    
138/tcp    open        netbios-dgm             
139/tcp    open        netbios-ssn             
143/tcp    open        imap2                   
512/tcp    open        exec                    
513/tcp    open        login                   
514/tcp    open        shell                   
515/tcp    open        printer                 
540/tcp    open        uucp                    
635/tcp    open        unknown                 
1080/tcp   open        socks                   
1524/tcp   open        ingreslock              
2000/tcp   open        callbook                
2001/tcp   open        dc                      
4000/tcp   open        unknown                 
4001/tcp   open        unknown                 
5742/tcp   open        unknown                 
6000/tcp   open        X11                     
6001/tcp   open        X11:1                   
6667/tcp   open        irc                     
8892/tcp   open        seosload                
10000/tcp  open        unknown                 
12345/tcp  open        NetBus                  
12346/tcp  open        NetBus                  
20034/tcp  open        unknown                 
30303/tcp  open        unknown                 
31337/tcp  open        Elite                   

Remote operating system guess: Linux 2.1.122 - 2.2.16
Uptime 130.704 days (since Wed Nov  1 16:21:30 2000)

Nmap run completed -- 1 IP address (1 host up) scanned in 42 seconds

The feeling you get in the pit of your stomach when you first suspect that your site has been cracked is similar to the feeling you get when you first discover your house has been broken into. It is a sickening sense of muted outrage. Muted because you are still hoping against hope that it hasn't really happened. But your eyes are telling you that it has, that in spite of your denial you've been violated, that you're 0wn3d.

I wasn't running IRC on my server, but someone was. NMAP uses the service name "Elite" for anything running on port 31337. Port 31337 is the one Back Orifice most often uses. The handwriting was on the wall.

One of the security mailing lists I subscribe to (but obviously don't heed as well as I should) mentioned a tool called chkrootkit, so I downloaded, compiled, and installed it on my server (see Resources for a link). The news was grim. It found several suspicious binaries that it suggested were trojans and said the machine was possibly infected with Ambient's rootkit.

At this point I was past the denial stage. I knew I had been rooted. But I didn't shut the server down immediately. First I notified the local LUG that was using my server for its mailing list, and the community theatre whose Website I host. I told them what had happened and that I would bring the server down for at least a day or so. Then I backed up my own Website and the theatre's Website. Only then did I throw the switch.

Starting from a new hard drive, I rebuilt the server from the ground up. I used RedHat 7.0. I had been running 6.1, and obviously I had not been good about keeping up with security updates. My best guess is that at some point, one of the widely known and exploited problems in earlier versions of wu-ftpd or sendmail had provided an open door for someone. I would add bind to that list of suspects except for the fact that I don't run it.

I moved the original hard drive to the secondary IDE controller so that I could peruse the disk at my leisure to learn what I could about when, how, and why my system had been cracked. I still don't know when it was cracked, but the rootkit seems to have been installed on February 22. I downloaded a copy of Ambient's rootkit (ARK) 1.0.1 and uncompressed the tarball on my desktop machine.

Here is the text from the ARK README:


[--ARK version 1.0 - Ambient's Rootkit for Linux--]

THIS PACKAGE IS STRICTLY PRIVATE
**DO NOT SPREAD THIS AROUND**

This package includes backdoored versions of:

syslogd
login
sshd
ls
du
ps
pstree
killall
top
netstat


Quick explanation:

syslogd		Prevents logging if they match a certain string in
		/dev/ptyxx/.log
login		Login: arkd00r , Password: 
		and you got a rootshell.
sshd		Login: root , Password: 
		will spawn a .. guess what?
ls		File hiding using /dev/ptyxx/.file as the index
du		eq. ls
ps		Hide processes saved in /dev/ptyxx/.proc
		(LRK style, explanation stolen too ;-) w00h, evil me!)
		Example data file:
		0 0             Strips all processes running under root
		1 p0            Strips tty p0
		2 sniffer       Strips all programs with the name sniffer
		3 hack          Strips all programs with 'hack' in them
                		ie. proghack1, hack.scan, snhack etc.
pstree		eq. ps
killall		eq. ps
top		eq. ps
netstat		For hiding Ports, Connections, etc. saved in /dev/ptyxx/.addr
		(LRK style, explanation stolen too ;-) w00h, evil me!)
		type 0: hide uid
		type 1: hide local address
		type 2: hide remote address
		type 3: hide local port
		type 4: hide remote port
		type 5: hide UNIX socket path

		Example data file:
		0 500           <- Hides all connections by uid 500
		1 128.31        <- Hides all local connections from 128.31.X.X
		2 128.31.39.20  <- Hides all remote connections to 128.31.39.20
		3 8000          <- Hides all local connections from port 8000  
		4 6667          <- Hides all remote connections to port 6667
		5 .term/socket  <- Hides all UNIX sockets including the path
				   .term/socket


Gr33tZ (in no particulair order) fly out 2:
  ice-devil, Beast|E, togooz, orangehaw, CuCc`, mo`,
  ^Trance^, [dG], deaddrokz, Annihi|aT, Leentje..
  and ofcourse whoever i forgot to mention..
  not that you're forgotten though ;-)
					- |Ambient|

I followed the trail of clues from the README and sure enough in /dev of the cracked drive I found a directory called ptyxx. It had been created on March 2 by "operator." Inside the directory were the .addr, .file, .log, and .proc files mentioned above. In those files I learned that the utilities installed by the rootkit as a trojan would mask the comings and goings of the users "operator" and "MAL." I also found that BNC, a proxy IRC server, had been installed. That gave the bad guys a way to use IRC in complete anonymity. Any misdeeds there would only lead back to me.

I did find in the logs that on March 4, "operator" signed on from the country of Brunei in the South China Sea, and got the password wrong several times. I also found traces of Telnet visitation during March from users at Verio, from an ISP in South Texas, from an ISP in the Netherlands, and elsewhere. My site was a lot more popular than I had realized. I have no way of knowing if those Telnet sessions were the same person using different accounts or a close circle of friends.

The invading binaries that chkrootkit detected were not exactly the same size as those included in ARK 1.0.1. I suspect there is a later version of ARK that hasn't made its way onto a white-hat security site yet, but the discrepancy could also be differences in the compiler or compile options.

Today my server is considerably tighter than it was about a week ago, but I'm not nearly finished with the wrench. I noted earlier that I did a clean install of Red Hat 7.0. Since then I have also applied all the security updates to that release that Red Hat has issued. I've disabled Telnet and started using SSH instead. All new passwords.

I had been running Psionic's portsenty most of the time on the old server, but that was all. Now I'm running hostsentry and logcheck, also by Craig Rowland at Psionic. You can find all three of those tools on the Psionic Website (see Resources for a link).

And that's not all. I've also added SNORT (a network intrusion detection system) and Freeveracity, which monitors critical system files to detect whether they've been replaced with trojans. SNORT seems an excellent tool. It comes with a default set of rules that allow you to be alerted for just about any kind of attack or scan. Other rule sets are available from places like Max Vision Network Security.

I'll also add a package called Analysis Console for Incident Databases (ACID) so that I can view SNORT alerts in real time. And I'm building a new box that will become a dedicated firewall based on the 2.4 kernel.

Paranoid? Yeah, probably. But I don't like being rooted. In retrospect, my great sin was not so much that I didn't have a firewall, or even that I wasn't running all that great security software. My sin was running apps with both known exploits and available security updates. I might as well have put up a blinking neon sign reading, "Crack Me!" Sure enough, somebody did. If you're reading this in the same state I was in last week, I strongly recommend that you move. It's no place to be.

Resources

ACID information page: http://www.cert.org/kb/acid

chkrootkit homepage: http://www.chkrootkit.org

FreeVeracity homepage: http://www.freeveracity.org/

Max Vision Network Security: http://www.maxvision.net

NMAP homepage: http://www.nmap.org

Psionic homepage: http://www.psionic.com

SNORT Network Intrusion Detection: http://www.snort.org

"Understanding Stealth Scans: Forewarned is Forearmed," Joe Barr (LinuxWorld.com, March 2001): http://www.itworld.com/Sec/2202/LWD010321vcontrol3/

"Bob Young, Tete-a-Tete With the Monopoly," Joe Barr (LinuxWorld.com, March 2001): http://www.itworld.com/Comp/2362/LWD010328vcontrol4/

Top 50 Security Tools: http://www.nmap.org/tools.html