Skip to content

Chrome-extension implant that turns victim Chrome browsers into fully-functional HTTP proxies, allowing you to browse sites as your victims.

Notifications You must be signed in to change notification settings

its-a-feature/CursedChrome

 
 

Repository files navigation

CursedChrome

What is it?

A (cursed) Chrome-extension implant that turns victim Chrome browsers into fully-functional HTTP proxies. By using the proxies this tool creates you can browse the web authenticated as your victim for all of their websites.

Why make it?

More and more companies are moving toward the "BeyondCorp" model (e.g. no flat internal network, zero trust everything). This is usually implemented via a reverse proxy/OAuth wall gating access to services, eliminating the need for a VPN. As access and tooling move towards being strictly available via the web browser, having a way to easily hijack and use victim's web sessions becomes an ever increasing necessity.

This is also especially useful for locked down orgs that make use of Chrome OS where traditional malware can't be used at all. It's also steathy, as all requests will have the appropriate source-IP, cookies, client-certificates, etc since it's being proxying directly through the victim's browser.

Screenshots

Web Admin Panel

Browsing Websites Logged In as Victim (using Firefox with HTTP Proxy)

(Rough) Infrastructure Diagram (docker-compose Used)

Ports & Listening Interfaces

  • 127.0.0.1:8080: HTTP proxy server (using one of the credentials in the admin panel, you can auth to a specific victim's Chrome browser via this HTTP proxy server). You also need to install the generated CA available via the admin panel before using this.
  • 127.0.0.1:4343: Websocket server, used for communicating with victim Chrome instances to transfer HTTP requests for proxying and sending commands.
  • 127.0.0.1:8118: Admin web panel for viewing victim Chrome instances and getting HTTP proxy credentials.

Requirements

Installation & Setup (~5-10 Minutes)

Setting Up the Backend

The backend is entirely dockerized and can be setup by running the following commands:

cd cursedchrome/
# Start up redis and Postgres containers in the background
docker-compose up -d redis db
# Start the CursedChrome backend
docker-compose up cursedchrome

Once you start up the backend you'll see an admin username and password printed to the console. You can log into the admin panel at https://localhost:8118 using these credentials (you will be prompted to change your password upon logging in since the one printed to the console is likely logged).

Installing the CursedChrome CA for Proxying HTTPS

Once you have the backend setup, log in to the admin panel at https://localhost:8118 (see above) and click the Download HTTPS Proxy CA Certificate button. This will download the generated CA file which is required in order to proxy HTTPS requests.

You will need to install this CA into your root store, the following are instructions for various OS/browsers:

Setting Up the Example Chrome Extension Implant

To install the example chrome extension implant, do the following:

  • Open up a Chrome web browser and navigate to chrome:https://extensions.
  • Click the toggle in the top-right corner of the page labeled Developer mode to enable it.
  • Click the Load unpacked button in the top-left corner of the page.
  • Open the extension/ folder inside of this repo folder.
  • Once you've done so, the extension will be installed.

Note: You can debug the implant by clicking on the background page link for the text Inspect views background page under the CursedChrome Implant extension.

After you've install the extension it will show up on the admin control panel at https://localhost:8118.

Production/Operational Usage

Modifying Implant Extension

An example implant extension has been included under the extension/ folder. This extension has the extension/src/bg/background.js file which has the extension-side of the implant that connects to the service via WebSocket to proxy requests through the victim's web browser.

The following extension permissions are needed by the implant to operate:

"permissions": [
	"webRequest",
	"webRequestBlocking",
	"<all_urls>"
]

This code contains comments on how to modify it for a production setup. Basically doing the following:

  • Minifying/stripping/uglifying the JavaScript code
  • Modifying the WebSocket connection URI in the initialize() function to point to the host you've set up the backend on. By default it's set to ws:https://localhost:4343 which will work with the out-of-the-box dev setup described in this README.

In a real world attack, this extension code would be used in one of the following ways:

  • Injected into an existing extension with proper permissions via Chrome debugging protocol.
  • Hidden inside of another extension
  • Force-installed via Chrome enterprise policy

These topics are outside of the scope of this README, but eventually will be covered separately.

Further Notes on Production Deployments

  • You will likely want to run an Nginx server with a valid HTTPS certificate doing a proxy_pass to the WebSocket server (running on 127.0.0.1:4343). Then you'll have TLS-encrypted websocket traffic.
  • For a more secure setup, don't expose the HTTP proxy & and admin panel to the Internet directly. Opt for SSL port-forwarding or using a bastion server to connect to it.
  • For situations with a large number of victims/bots/implants running, you can horizontally scale out the CursedChrome server as wide as you need to. The socket handling is completely decoupled via redis, so it can suppose (theoretically) tens of thousands of concurrent clients.

Attributions

  • The AnyProxy source code was heavily modified and used for part of this project.
  • The icon for this project was designed by monochromeye on Fiverr (paid), if you're looking for graphic design work check her services out.

About

Chrome-extension implant that turns victim Chrome browsers into fully-functional HTTP proxies, allowing you to browse sites as your victims.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 85.8%
  • Vue 10.8%
  • HTML 3.0%
  • Other 0.4%