Remote shell trojan (RST)

 

The superior man understands what is right; the inferior man understands what will sell.

 Confucius

On Silvio Cesare's site is a text file named elf-pv.txt. Complete title is "Unix ELF Parasites And Virus", dated October 1998. It gives some background and then describes the gap between code and data segment, as illustrated in readelf (for some strange reason he does not mention that command anywhere).

At the end of the text is an uuencoded file unix-linux-pv-src.tgz containing sources. The package is also available as plain vit-src.tgz. This is explained on the first page of http://www.big.net.au/~silvio:

[…] The name of this virus by curiosity was given by the people at FProt who noticed the virus created a temp file using the letters VIT.

In another text he calls the concept "the text segment padding virus (padding infection)".

Anyway, the code is hard to read as he started development with a piece of plain C and applied several transformations. It seems that he released the stuff the very second it produced results.

Three years later

Remote Shell Trojan: Threat, Origin and Solution on http://www.securiteam.com is dated 10/9/2001.

Perhaps they had to cut out all interesting details to protect their source. But what I read on that page makes little sense to me. Supposedly script kiddies got hold of experimental back door code and planted it on sites they had access to. No names, dates, sites or legal consequences given. No details on the method used by intruders to gain access.

[…] From this point, the virus seemed to spread in the wild.

Well, how does it spread? There is no reference to a root exploit, either local or remote. It is explained that if root starts an infected program owned by another user, a virus can pollute the whole system. But how many people really do this? (a poll on slashdot.org might give answer) And the question on how the virus spreads to other machines remains.

It is plausible that script kiddies copy root kits (including viral back doors) wholesale to cracked machines. It is possible to combine a remote exploit with such a virus to build a persistent worm, though creative work of this extent is by definition out of reach for script kiddies. But in both cases the problem is the used exploit, not the qualities of the installed back door.

Anyway, the concluding remark is strange:

[…] Again, it is strongly recommend that anybody running Linux run the detector to see if their system is infected. Even if they do not expect anything, they can always optionally immunize their system. This is the only way we can fight the further spread of this virus.

We should make another poll on slashdot.org about how many people used the detector. It must have been all of them. Or is there another explanation that the predicted catastrophe did not occur?

Attached to the article is Perl and C code that detects and vaccinates against RST. Though I never encountered the culprit, seeing the antidote makes me sure it is a variation of Silvio Cesare's concept.

I am certain that my shabby piece of Perl would detect RST, if I had a copy (add collecting to my list of incompetencies). And that a deactivated infection with One step closer to the edge has the same effect as the immunizer on that page.

Anyway, the code is fooled by the improvements made in The entry point. It checks whether the entry point is exactly 4096 from the end of the code segments. If not, the executable is considered immune.

  psize = (textseg.p_vaddr + textseg.p_filesz) - ehdr.e_entry;
  poffset = (textseg.p_offset + textseg.p_filesz) - psize;
  if (psize != 4096)
    return 0; /* Binary already cleaned */

The code also tries to clean infected executables by restoring the entry point. I don't trust that part, however:

   // read original entry point, that according to my reverse engineering
   // is stored on the parasite at offset 1
   if (fseek(fp, poffset+1, SEEK_SET)!=0) goto err;
   if (fread(&oldentry, 4, 1, fp) != 1) goto err;
  
   // restore the binary's entry point to point to the real program again,
   // avoiding the execution of the parasite code.
   // this pernamently disables the parasite code and makes the binary immune
   // to further infection attempts.
   ehdr.e_entry = oldentry;
   if (fseek(fp, 0, SEEK_SET) != 0) goto err;
   if (fwrite(&ehdr, sizeof(ehdr), 1, fp) != 1) goto err;

I can't see any attempt to verify the retrieved address. Silvio Cesare's classic pieces stored the original entry point at a non-intuitive address in the middle of infective code.