Last active
July 27, 2016 18:22
-
-
Save bulv1ne/c9cd1736ea49d688df9c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
usage 'pinhole port host [newport]' | |
Pinhole forwards the port to the host specified. | |
The optional newport parameter may be used to | |
redirect to a different port. | |
eg. pinhole 80 webserver | |
Forward all incoming WWW sessions to webserver. | |
pinhole 23 localhost 2323 | |
Forward all telnet sessions to port 2323 on localhost. | |
""" | |
import sys | |
from socket import * | |
from threading import Thread | |
import time | |
LOGGING = 1 | |
def log( s ): | |
if LOGGING: | |
print '%s:%s' % ( time.ctime(), s ) | |
sys.stdout.flush() | |
class PipeThread( Thread ): | |
pipes = [] | |
def __init__( self, source, sink ): | |
Thread.__init__( self ) | |
self.source = source | |
self.sink = sink | |
log( 'Creating new pipe thread %s ( %s -> %s )' % \ | |
( self, source.getpeername(), sink.getpeername() )) | |
PipeThread.pipes.append( self ) | |
log( '%s pipes active' % len( PipeThread.pipes )) | |
def run( self ): | |
while 1: | |
try: | |
data = self.source.recv( 1024 ) | |
if not data: break | |
self.sink.send( data ) | |
except: | |
break | |
log( '%s terminating' % self ) | |
PipeThread.pipes.remove( self ) | |
log( '%s pipes active' % len( PipeThread.pipes )) | |
class Pinhole( Thread ): | |
def __init__( self, port, newhost, newport ): | |
Thread.__init__( self ) | |
log( 'Redirecting: localhost:%s -> %s:%s' % ( port, newhost, newport )) | |
self.newhost = newhost | |
self.newport = newport | |
self.sock = socket( AF_INET, SOCK_STREAM ) | |
self.sock.bind(( '', port )) | |
self.sock.listen(5) | |
def run( self ): | |
while 1: | |
newsock, address = self.sock.accept() | |
log( 'Creating new session for %s %s ' % address ) | |
fwd = socket( AF_INET, SOCK_STREAM ) | |
fwd.connect(( self.newhost, self.newport )) | |
PipeThread( newsock, fwd ).start() | |
PipeThread( fwd, newsock ).start() | |
if __name__ == '__main__': | |
print 'Starting Pinhole' | |
import sys | |
sys.stdout = open( 'pinhole.log', 'w' ) | |
if len( sys.argv ) > 1: | |
port = newport = int( sys.argv[1] ) | |
newhost = sys.argv[2] | |
if len( sys.argv ) == 4: newport = int( sys.argv[3] ) | |
Pinhole( port, newhost, newport ).start() | |
else: | |
Pinhole( 80, 'hydrogen', 80 ).start() | |
Pinhole( 23, 'hydrogen', 23 ).start() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import socket | |
from threading import Thread | |
s = socket.socket() | |
def listen(): | |
s.bind(('', 3032)) | |
s.listen(2) | |
while True: | |
c, addr = s.accept() | |
c2 = socket.socket() | |
c2.connect(('server', 22)) | |
print (c) | |
print (c2) | |
fix_server(c, c2) | |
def fix_server(c, c2): | |
t = Thread(target=transfer, args=[c, c2]) | |
t2 = Thread(target=transfer, args=[c2, c]) | |
t.start() | |
t2.start() | |
#t.join() | |
#t2.join() | |
def transfer(f1, f2): | |
while True: | |
chunk = f1.recv(65536) | |
if not chunk: | |
break # EOF | |
f2.send(chunk) | |
listen() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
reconnect the pipe did not close the session(can see on rdp), like so fixed see fork me