Search code examples
pythonsocketstor

Get new ip of Tor7.0 by standard python socket only


When I try to renew ip of Tor on windows 10, it always fail(I have read through a lots of posts of stack overflow, like this and this, yet nothing works).

  • OS : windows 10 64bits
  • tor : version 7.0

Contents of my torrc

# This file was generated by Tor; if you edit it, comments will not be preserved
# The old torrc file was renamed to torrc.orig.1 or similar, and Tor will ignore it

DataDirectory C:\Users\yyyy\Desktop\Tor Browser\Browser\TorBrowser\Data\Tor
GeoIPFile C:\Users\yyyy\Desktop\Tor Browser\Browser\TorBrowser\Data\Tor\geoip
GeoIPv6File C:\Users\yyyy\Desktop\Tor Browser\Browser\TorBrowser\Data\Tor\geoip6
HiddenServiceStatistics 0

HashedControlPassword 16:D14CC89AD7848B8C60093105E8284A2D3AB2CF3C20D95FECA0848CFAD2
CookieAuthentication 1 #either with nor without this line, still fail

Contents of torrc-defaults

# torrc-defaults for Tor Browser
#
# DO NOT EDIT THIS FILE
#
# This file is distributed with Tor Browser and SHOULD NOT be modified (it
# may be overwritten during the next Tor Browser update). To customize your
# Tor configuration, shut down Tor Browser and edit the torrc file.
#
# If non-zero, try to write to disk less frequently than we would otherwise.
AvoidDiskWrites 1
# Where to send logging messages.  Format is minSeverity[-maxSeverity]
# (stderr|stdout|syslog|file FILENAME).
Log notice stdout
CookieAuthentication 1
## fteproxy configuration
ClientTransportPlugin fte exec TorBrowser\Tor\PluggableTransports\fteproxy --managed

## obfs4proxy configuration
ClientTransportPlugin obfs2,obfs3,obfs4,scramblesuit exec TorBrowser\Tor\PluggableTransports\obfs4proxy

## meek configuration
ClientTransportPlugin meek exec TorBrowser\Tor\PluggableTransports\terminateprocess-buffer TorBrowser\Tor\PluggableTransports\meek-client-torbrowser -- TorBrowser\Tor\PluggableTransports\meek-client

The script use to renew tor ip

import repr as reprlib
import socket
import sys

try:
   tor_c = socket.create_connection(("127.0.0.1", 9151))
   tor_c.send('AUTHENTICATE "{}"\r\n'.format("16:D14CC89AD7848B8C60093105E8284A2D3AB2CF3C20D95FECA0848CFAD2"))
   response = tor_c.recv(1024)
   if response != '250 OK\r\n250 OK\r\n':
      sys.stderr.write('Unexpected response from Tor control port: {}\n'.format(response))
except Exception, e:
   sys.stderr.write('Error connecting to Tor control port: {}\n'.format(repr(e)))

But the server always reply me

Unexpected response from Tor control port: 515 Authentication failed: Password did not match HashedControlPassword or authentication cookie.

I know there are python libraries for this kind of task, but I would like to renew the ip by standards socket library of python only, how could I do this properly?Thanks


Solution

  • The HashedControlPassword is a hash of the authentication password. To authenticate, it would be AUTHENTICATE "your actual password".

    The control protocol is relatively simple on the surface.

    For example:

    telnet localhost 9051
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    authenticate "password"
    250 OK
    signal NEWNYM
    250 OK <-- identity changed for new circuits
    

    This works for me:

    import repr as reprlib
    import socket
    import sys
    
    try:
       tor_c = socket.create_connection(("127.0.0.1", 9051))
       tor_c.send("AUTHENTICATE \"{}\"\n".format("password"))
       response = tor_c.recv(1024)
       if response != '250 OK\r\n':
          sys.stderr.write('Unexpected response from Tor control port: {}\n'.format(response))
       tor_c.send("SIGNAL NEWNYM\n");
       response = tor_c.recv(1024)
       print(response)
    except Exception, e:
       sys.stderr.write('Error connecting to Tor control port: {}\n'.format(repr(e)))
    

    You can also avoid Python by following this example: Request new identity from Windows command line.