Skip to content

Instantly share code, notes, and snippets.

@UlisesGascon
Last active August 13, 2019 18:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save UlisesGascon/566f68eb98a9ecdbdba3798968fefef3 to your computer and use it in GitHub Desktop.
Save UlisesGascon/566f68eb98a9ecdbdba3798968fefef3 to your computer and use it in GitHub Desktop.
Montar un generador de capturas de pantalla en Tor

Montar un generador de capturas de pantalla en Tor

Importante

Necesitamos tener previamente corriendo Tor en la maquina:

Pasos

  1. Actualziamos la configuración de tor nano /etc/tor/torrc
SocksPort 9050
  1. Instalar polipo apt-get install polipo
  2. Modificar la configuración de polipo nano /etc/polipo/config
allowedClients = 127.0.0.1, 192.168.1.0/24 # Expose your network (modify accordingly)
socksParentProxy = "localhost:9050"
socksProxyType = socks5
proxyAddress = "0.0.0.0"    # IPv4 only
  1. Instalamos dependencias nuevas en Ubuntu
bash
apt-get install -y libx11-xcb1 libxrandr2 libasound2 libpangocairo-1.0-0 libatk1.0-0 libatk-bridge2.0-0 libgtk-3-0 libnss3 libxss1
  1. Montamos el capturador con Nodejs añadiendo package.json y server.js
  2. Instalamos las dependencias npm install

Recursos

{
"name": "tor-proxy",
"version": "1.0.0",
"description": "Tor Proxy",
"main": "server.js",
"author": "Ulises Gascón",
"license": "AGPL-3.0",
"dependencies": {
"express": "4.17.1",
"node-schedule": "1.3.2",
"puppeteer": "1.18.0",
"request": "2.88.0",
"rimraf": "2.6.3"
}
}
const express = require('express')
const request = require('request')
const puppeteer = require('puppeteer')
const schedule = require('node-schedule')
const rimraf = require('rimraf')
const crypto = require('crypto')
const path = require('path')
const fs = require('fs')
const app = express()
// Proxy request
const r = request.defaults({'proxy':'http://127.0.0.1:8123'})
// Global settings
app.set('maintenence', false)
// Static files
app.use(express.static('public'))
//Routes
app.get('/', function (req, res) {
res.sendFile(path.join(__dirname + '/public/index.html'))
})
app.get('/proxy', (req, res) => {
const url = req.query.url
if (!url) return res.status(404).send('Missing URL!')
r(url, (err, response, body) => {
if (!err && response.statusCode === 200) {
return res.send(body)
}
res.status(404).send()
})
})
app.get('/capture', async (req, res) => {
const url = req.query.url
if (!url) return res.status(404).send('Missing URL param!')
if (app.enabled('maintenence')) return res.status(500).send('Try again in few seconds. Sorry!')
const name = crypto.createHash('md5').update(url).digest('hex')
const generatedPath = `/captures/${name}.png`
if (fs.existsSync(`./${generatedPath}`)) {
console.log(`Cached version served for ${url} as ${generatedPath}`)
return res.sendFile(generatedPath, { root: __dirname })
}
console.log(`Generating capture for ${url} as ${generatedPath}`)
const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox', '--proxy-server=127.0.0.1:8123'] })
const page = await browser.newPage()
await page.goto(url)
await page.setViewport({
width: 1280,
height: 1000,
deviceScaleFactor: 1
});
await page.screenshot({ path: `.${generatedPath}`, fullPage: true })
await browser.close()
res.sendFile(generatedPath, { root: __dirname })
})
// Cron Cache control (“At minute 0 past every hour”)
schedule.scheduleJob(`* */1 * * *`, function () {
console.log('Cache clean up time!')
app.set('maintenence', true)
rimraf('./captures/*', () => {
console.log('Cache clean finished!')
app.set('maintenence', false)
})
})
app.listen(process.env.PORT || 3000)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment