thank hacking team for the jewel
-------------------------------------



sincerley your boy kitty meow









#!/usr/bin/env ruby

require 'socket'
require 'thread'

localport = 9166
server = TCPServer.open(localport)
puts "Listening on port tcp/#{localport}..."

MY_IP = "127.0.0.1"

@reply_650OK = "650 NOTICE New control connection opened.\r\n"
@reply_250OK = "250 OK\r\n"

@reply_bootstrap_phase = "250-status/bootstrap-phase=NOTICE BOOTSTRAP PROGRESS=100 TAG=done SUMMARY=\"Done\"\r\n"
@reply_net_listeners_socks = "250-net/listeners/socks=\"#{MY_IP}:9150\" \"127.0.0.1:9150\"\r\n"
@reply_Socks4Proxy = "250 Socks4Proxy\r\n"
@reply_Socks5Proxy = "250 Socks5Proxy\r\n"
@reply_HTTPSProxy = "250 HTTPSProxy\r\n"
@reply_ReachableAddresses = "250 ReachableAddresses\r\n"
@reply_UseBridges = "250 UseBridges=0\r\n"
@reply_Bridge = "250 Bridge\r\n"

def reply(client, string)
  puts " -> #{string}"
  client.puts string
end

def process_getinfo(client, req)
  if req['status/bootstrap-phase']
    reply client, @reply_bootstrap_phase
    reply client, @reply_250OK
  elsif req['net/listeners/socks']
    reply client, @reply_net_listeners_socks
    reply client, @reply_250OK
  elsif req['Socks4Proxy']
    reply client, @reply_Socks4Proxy
  elsif req['Socks5Proxy']
    reply client, @reply_Socks5Proxy
  elsif req['HTTPSProxy']
    reply client, @reply_HTTPSProxy
  elsif req['ReachableAddresses']
    reply client, @reply_ReachableAddresses
  elsif req['UseBridges']
    reply client, @reply_UseBridges
  elsif req['Bridge']
    reply client, @reply_Bridge
  else 
    puts "UNKNOWN GETINFO request!!!"
  end
end

def process_getconf(client, req)
  if req['Socks4Proxy']
    reply client, @reply_Socks4Proxy
  elsif req['Socks5Proxy']
    reply client, @reply_Socks5Proxy
  elsif req['HTTPSProxy']
    reply client, @reply_HTTPSProxy
  elsif req['ReachableAddresses']
    reply client, @reply_ReachableAddresses
  elsif req['UseBridges']
    reply client, @reply_UseBridges
  elsif req['Bridge']
    reply client, @reply_Bridge
  else 
    puts "UNKNOWN GETCONF request!!!"
  end
end

def process_request(client)
  loop do
    begin
      req = client.gets  
      next unless req

      puts "(#{Thread.current}) #{req}"
      
      if req.start_with? 'GETINFO'
        process_getinfo(client, req)
      elsif req.start_with? 'SETEVENTS'
        reply client, @reply_250OK
        puts "SETEVENTS !!!"
        #reply client, @reply_650OK
        return
      elsif req.start_with? 'SIGNAL NEWNYM'
        reply client, @reply_250OK
        puts "NEWNYM !!!"
        return
      elsif req.start_with? 'TAKEOWNERSHIP'
        reply client, @reply_250OK
      elsif req.start_with? 'AUTHENTICATE'
        reply client, @reply_250OK
      elsif req.start_with? 'RESETCONF'
        reply client, @reply_250OK
      elsif req.start_with? 'GETCONF'
        process_getconf(client, req)
      elsif req.start_with? 'SETCONF' or req.start_with? 'SAVECONF'
        reply client, @reply_250OK
      end
    rescue Exception => e
      puts e.message
    end
  end
end

loop do
  Thread.start(server.accept) do |client|
    
    port, ip = Socket.unpack_sockaddr_in(client.getpeername)
    puts "(#{Thread.current}) New connection from: #{ip}:#{port}"
    
    process_request(client)

  end
end

# siph0n [2015-07-21]