ExerciseServer.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #!/usr/bin/python
  2. import TorControl
  3. import threading
  4. import socket
  5. import struct
  6. import random
  7. SOCKS_PORT=9050
  8. CONTROL_PORT=9051
  9. def runSocks4A(nonce, targetHost, targetPort, targetURL):
  10. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  11. s.connect(("127.0.0.1", SOCKS_PORT))
  12. socksheader = struct.pack("!BBHL", 4, 0x01, targetPort, 1)
  13. username = ""
  14. socksheader = "%s%s\x00%s\x00" %(socksheader, username, nonce)
  15. s.send(socksheader)
  16. response = s.recv(8)
  17. version,status,port=struct.unpack("!BBH",response[:4])
  18. if status != 90:
  19. print "Error: non-successful SOCKS status"
  20. s.close()
  21. return 0
  22. s.send("GET %s HTTP/1.0\r\nHost: %s\r\n\r\n"%(targetURL,targetHost))
  23. while 1:
  24. r = s.recv(1024)
  25. if not r:
  26. s.close()
  27. return 1
  28. HOSTS_TO_TEST = [ "moria1", "mordor", "tor26"]
  29. EXITS_TO_TEST = [ "pvt", ]
  30. TARGETS = [ ("www.seul.org", "/"), ]
  31. CIRCS_AT_A_TIME = 3
  32. CIRC_LEN = 3
  33. def launchCirc(s):
  34. htt = HOSTS_TO_TEST[:]
  35. random.shuffle(htt)
  36. path = htt[:CIRC_LEN-1]+[random.choice(EXITS_TO_TEST)]
  37. circid = TorControl.extend_circuit(s, 0, path)
  38. return circid, path
  39. def runControl(s):
  40. circs = {}
  41. streams = {}
  42. _h = lambda body,circs=circs,streams=streams,s=s:handleEvent(s,body,
  43. circs,streams)
  44. TorControl._event_handler = _h
  45. TorControl.set_events(s,
  46. [TorControl.EVENT_TYPE.CIRCSTATUS,
  47. TorControl.EVENT_TYPE.STREAMSTATUS])
  48. TorControl.set_option(s,"__LeaveStreamsUnattached 1")
  49. while 1:
  50. while len(circs) < CIRCS_AT_A_TIME:
  51. c,p = launchCirc(s)
  52. print "launching circuit %s to %s"%(c,p)
  53. circs[c]=p
  54. _, tp, body = TorControl.receive_message(s)
  55. if tp == TorControl.MSG_TYPE.EVENT:
  56. handleEvent(s, body, circs, streams)
  57. def handleEvent(s, body, circs, streams):
  58. event, args = TorControl.unpack_event(body)
  59. if event == TorControl.EVENT_TYPE.STREAMSTATUS:
  60. status, ident, target = args
  61. print "Got stream event:",TorControl.STREAM_STATUS.nameOf[status],\
  62. ident,target
  63. if status in (TorControl.STREAM_STATUS.NEW_CONNECT,
  64. TorControl.STREAM_STATUS.NEW_RESOLVE,
  65. TorControl.STREAM_STATUS.DETACHED):
  66. if not target.endswith(".exnonce"):
  67. TorControl.attach_stream(s, ident, 0)
  68. else:
  69. circid, (host,url) = streams[target]
  70. TorControl.redirect_stream(s, ident, host)
  71. TorControl.attach_stream(s, ident, circid)
  72. elif event == TorControl.EVENT_TYPE.CIRCSTATUS:
  73. status, ident, path = args
  74. print "Got circuit event",TorControl.CIRC_STATUS.nameOf[status],\
  75. ident,path
  76. if status in (TorControl.CIRC_STATUS.CLOSED,
  77. TorControl.CIRC_STATUS.FAILED):
  78. if circs.has_key(ident):
  79. print "Circuit failed."
  80. del circs[ident]
  81. elif status == TorControl.CIRC_STATUS.BUILT:
  82. nonce = random.randint(1,100000000)
  83. nonce = "%s.exnonce" % nonce
  84. host,url = random.choice(TARGETS)
  85. streams[nonce] = ident, (host,url)
  86. print "Launching socks4a connection"
  87. t = threading.Thread(target=runSocks4A, args=(nonce, host, 80, url))
  88. t.setDaemon(1)
  89. t.start()
  90. def run():
  91. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  92. s.connect(("127.0.0.1", CONTROL_PORT))
  93. TorControl.authenticate(s)
  94. runControl(s)
  95. if __name__ == '__main__':
  96. run()