Skip to content

Instantly share code, notes, and snippets.

@bulv1ne
Last active July 27, 2016 18:22
Show Gist options
  • Save bulv1ne/c9cd1736ea49d688df9c to your computer and use it in GitHub Desktop.
Save bulv1ne/c9cd1736ea49d688df9c to your computer and use it in GitHub Desktop.
"""
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()
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()
@blstdmi
Copy link

blstdmi commented Jul 25, 2016

reconnect the pipe did not close the session(can see on rdp), like so fixed see fork me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment