Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
FROM python:3-alpine

ARG REMOTE_HOST
ARG REMOTE_PORT

EXPOSE 8081
WORKDIR /usr/src/app
COPY . .

RUN sed -i -r "s/remote_host.*/remote_host = \"${REMOTE_HOST}\"/g" config.py && \
sed -i -r "s/remote_port.*/remote_port = ${REMOTE_PORT}/g" config.py && \
apk add --update tor && \
rm -rf /var/cache/apk/*

CMD [ "python", "proxy.py", "start" ]
8 changes: 4 additions & 4 deletions forwarder.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,16 @@ def __init__(self, tor, client_socket, proxy):

# Create a tor forwarder
self.forwarder = TorForwarder(tor, proxy, self)
self.staged = ""
self.staged = bytearray()

# recv wrapper
def recv(self):
# if the forwarder is ready
if self.forwarder.connected > 2:
# forward any staged data
if self.staged != "":
if len(self.staged) > 0:
self.forwarder.send(self.staged)
self.staged = ""
self.staged = bytearray()
# receive any new data and forward it
else:
data = self.client.recv(1024)
Expand All @@ -45,7 +45,7 @@ def recv(self):
self.forwarder.send(data)
# stage data from client
else:
self.staged += self.client.recv(1024)
self.staged.extend(self.client.recv(1024))

# call the forwarder receive wrapper
def send(self):
Expand Down
36 changes: 17 additions & 19 deletions proxy.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
#!/usr/bin/python2

# proxy.py
# (C) 2013 jtripper
#
Expand Down Expand Up @@ -31,13 +29,13 @@ def handler(signum, frame):
raise KeyboardInterrupt

if len(sys.argv) != 2:
print "Usage: %s [start|stop|restart]" % sys.argv[0]
print("Usage: %s [start|stop|restart]" % sys.argv[0])
quit()

if sys.argv[1] == "start":
if os.path.exists(".proxy.pid"):
print " [*] Proxy already started, quitting! If it is not started, delete the lock file (.proxy.pid)."
quit()
print(" [*] Proxy already started, quitting! If it is not started, delete the lock file (.proxy.pid).")
os.remove(".proxy.pid")

elif sys.argv[1] == "stop":
if os.path.exists(".proxy.pid"):
Expand All @@ -47,11 +45,11 @@ def handler(signum, frame):
os.kill(pid, signal.SIGUSR1)
os.remove(".proxy.pid")
else:
print " [*] Proxy not running!"
print(" [*] Proxy not running!")
quit()

elif sys.argv[1] == "restart":
print " [*] Restarting proxy."
print(" [*] Restarting proxy.")
if os.path.exists(".proxy.pid"):
f = open(".proxy.pid")
pid = int(f.readlines()[0])
Expand All @@ -62,31 +60,31 @@ def handler(signum, frame):
proxy = (config.remote_host, config.remote_port)
listen = (config.listener_host, config.listener_port)

print " [*] Starting tor instance."
print(" [*] Starting tor instance.")
tor = Tor(1)

print " [*] Starting proxy."
print(" [*] Starting proxy.")
listener = Listener(listen, proxy, tor)
print " [*] Proxy ready to accept connections."
print(" [*] Proxy ready to accept connections.")

if config.__dict__.has_key("set_user"):
print " [*] Dropping uid to %s" % config.set_user
if "set_user" in config.__dict__:
print(" [*] Dropping uid to %s" % config.set_user)
try:
os.setuid(getpwnam(config.set_user)[2])
except:
print " [*] Cannot drop priviledges! Quitting."
print(" [*] Cannot drop priviledges! Quitting.")
quit()

if config.__dict__.has_key("set_group"):
print " [*] Dropping gid to %s" % config.set_group
if "set_group" in config.__dict__:
print(" [*] Dropping gid to %s" % config.set_group)
try:
os.setgid(getgrnam(config.set_user)[2])
except:
print " [*] Cannot drop privideges! Quitting."
print(" [*] Cannot drop privideges! Quitting.")
quit()

if config.__dict__.has_key("daemon") and config.daemon:
print " [*] Backgrounding process."
if "daemon" in config.__dict__ and config.daemon:
print(" [*] Backgrounding process.")
if os.fork() != 0: quit()
if os.fork() != 0: quit()
signal.signal(signal.SIGUSR1, handler)
Expand All @@ -99,7 +97,7 @@ def handler(signum, frame):
try:
listener.manage_connections()
except KeyboardInterrupt:
print " [*] Stopping tor instance and quitting."
print(" [*] Stopping tor instance and quitting.")

if os.path.exists(".proxy.pid"):
os.remove(".proxy.pid")
Expand Down
14 changes: 9 additions & 5 deletions tor.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def create_tor(self):
torrc += "ControlPort %d\n" % self.control_port

try:
os.mkdir(".tor%d" % self.tor_instance_number, 0700)
os.mkdir(".tor%d" % self.tor_instance_number, 0o700)
except:
pass

Expand Down Expand Up @@ -96,25 +96,29 @@ def recv(self, size):
def negotiate_socks(self):
# First send socks handshake
if self.connected == 0:
self.forwarder.send("\x05\x01\x00")
self.forwarder.send(b'\x05\x01\x00')

# Wait for socks handshake response
elif self.connected == 1:
# If handshake failed restart
if self.forwarder.recv(2) != "\x05\x00":
if self.forwarder.recv(2) != b'\x05\x00':
self.connected = 0
self.negotiate_socks()
return

# Else send the host handshake
port = struct.pack("!H", self.proxy[1])
length = chr(len(self.proxy[0]))
self.forwarder.send(("\x05\x01\x00\x03%s%s%s" % (length, self.proxy[0], port)))
s = bytearray(b'\x05\x01\x00\x03')
s.extend(length.encode('ascii'))
s.extend(self.proxy[0].encode('ascii'))
s.extend(port)
self.forwarder.send(s)

# Wait for confirmation
elif self.connected == 2:
# If confirmation is bad, restart
if self.forwarder.recv(10) != "\x05\x00\x00\x01\x00\x00\x00\x00\x00\x00":
if self.forwarder.recv(10) != b'\x05\x00\x00\x01\x00\x00\x00\x00\x00\x00':
self.connected = 0
self.negotiate_socks()
return
Expand Down