-
3>c       s     d  k  Z   d  k Z  d k l Z  d  k Z  d  k Z   d k l Z ! d  k Z # e i	 i
 d  & d k l Z ' d  k Z ( d  k Z 1 d  k Z 2 d  k Z 3 d  k Z 5 d  k Z ; d Z = d g Z A g  Z B g  Z E d Z F d e e  d	 e Z N d
 f  d     YZ  d f  d     YZ d f  d     YZ  d e f d     YZ (d f  d     YZ }d   Z e  d j oBd e GHd GHd GHd GHd GHd GHe i! e  e   Z" y& e i e i# d d  \ Z$ Z% Wn3 e i& j
 o! e   e i' d  n Xx|e$ D]q\ Z( Z) e( d g j o e" i* e)  n e( d  g j o e" i+ e)  n e( d! g j o e" i, e)  n e( d" g j o e" i- e)  n e( d# g j o e" i. e/ e)   n e( d$ g j o e" i0 e)  n e( d% g j o e" i1 e)  n e( d& g j o e" i2 e)  n e( d' g j o e" i3 e)  n q[We" i4   n d  S((   N(   s   Thread(   s   SSLs   ntlm(   s   str2unicodes   1.4.6s   Page Not Founds   <html><head><title>Error</title></head><body>You are not allowed to visit that page during this test, sorry. Try unsetting your proxy temporarily.</body></html>s4   HTTP/1.1 404 404 Access Denied !
Content-Length: %ds   

s   MyConnectionc      s_   N t  Z O d   Z S d   Z _ d   Z n d   Z t d   Z  d   Z  d   Z RS(   Nc    s   O P d |  _ Q | |  _ d  S(   Ni    (   s   selfs   doSSLs   conns   mysocket(   s   selfs   conn(    (    s   ./spkproxy.pys   __init__O s   c    s#   S Z |  i i |  } \ | Sd  S(   N(   s   selfs   mysockets   recvs   sizes   result(   s   selfs   sizes   result(    (    s   ./spkproxy.pys   recvS s   c    s   _ ` t  |  } a d } b xe b | | j  oT d y! g | |  i i | |  7} Wn) h t i t	 i
 f j
 o j | Sn Xq! Wk | Sd  S(   Ni    (   s   lens   datas
   sizetosends   sentsizes   selfs   mysockets   sends   SSLs   SysCallErrors   sockets   error(   s   selfs   datas
   sizetosends   sentsize(    (    s   ./spkproxy.pys   send_ s   	 !c    s    n p d | i   GHq | Sd  S(   Ns   Got certificate: %s(   s   certs   get_subjects   ok(   s   conns   certs   errnums   depths   ok(    (    s   ./spkproxy.pys	   verify_cbn s   c    s  t u d } w t i i t i d  } x | d j o y t i } n { |  i	 i
 d  | t i t i  } } | i t i |  i  ~ y#  | i t i i | d   Wn%   d t i i | d  GHn X | i t i i | d    | i t i i | d    t i | |  i	  |  _	  |  i	 i    | o  d |  i	 i   GHn  d	 |  _  | o  d
 GHn d  S(   Ni    s    s'   HTTP/1.1 200 Connection established

s   server.pkeys   Couldn't find file %ss   server.certs   CA.certs   State=i   s   Now using SSL to talk to client(   s	   debug_ssls   oss   paths   dirnames   syss   argvs   dirs   curdirs   selfs   mysockets   sends   SSLs   Contexts   SSLv23_METHODs   ctxs
   set_verifys   VERIFY_NONEs	   verify_cbs   use_privatekey_files   joins   use_certificate_files   load_verify_locationss
   Connections   set_accept_states   state_strings   doSSL(   s   selfs	   debug_ssls   ctxs   dir(    (    s   ./spkproxy.pys   startSSLservert s(   	#

c    s     |  i i    d  Sd  S(   N(   s   selfs   mysockets   close(   s   self(    (    s   ./spkproxy.pys   close s   c    s>     y  |  i i d  } Wn   d Sn X d Sd  S(   Ns    i   i    (   s   selfs   mysockets   sends   data(   s   selfs   data(    (    s   ./spkproxy.pys	   gotclosed s
   (	   s   __name__s
   __module__s   __init__s   recvs   sends	   verify_cbs   startSSLservers   closes	   gotclosed(    (    (    s   ./spkproxy.pys   MyConnectionN s   	s   headerc      sO   t  Z  d   Z  d   Z  d   Z  d   Z  d   Z  d   Z  d   Z d   Z	 d	   Z
 .d
   Z ?d   Z Cd   Z Fd   Z Kd   Z _d   Z nd   Z vd   Z {d   Z d   Z d   Z d   Z -d   Z d   Z d   Z d   Z d   Z d   Z RS(   Nc    s     |  i   d  S(   N(   s   selfs   clear(   s   self(    (    s   ./spkproxy.pys   __init__ s   c    s:    g  |  _  d |  _  d |  _  d |  _  d |  _  d |  _  d |  _  d |  _  d |  _	  h  |  _
  h  |  _  d |  _  d |  _  d |  _  d |  _  d |  _  d |  _  d |  _  d |  _  d |  _  d |  _  d |  _  d |  _  d |  _  g  |  _  d  Sd  S(   Ni    s    (   s   selfs   datas   dones
   goodHeaders   clientisSSLs   verbs
   sawCONNECTs	   firstlines   responseHeaders
   wasChunkeds   URLargsDicts   headerValuesDicts   useSSLs   connectHosts   URLs
   sawsslinits   connectPorts
   mybodysizes   useRawArgumentss
   allURLargss   versions   doSurpressContentLengths
   returncodes   returnmessages   proxyHeaders	   orderlist(   s   self(    (    s   ./spkproxy.pys   clear s4   c    s     |  i Sd  S(   N(   s   selfs   proxyHeader(   s   self(    (    s   ./spkproxy.pys   getProxyHeader s   c    s"    |  i i d  d j o |  i h  j o |  i d j o  |  i }  | i d  d |  _  t | i d   d j o}  d i | i d  d  |  _	  t
 i |  i	 d |  i |  _  |  i t j o  h  |  _  d |  _ n  d  Sn  |  i d 7_ n  d  Sd  S(   Ns   ?i    i   s	   orderlist(   s   selfs   URLs   counts   URLargsDicts   useRawArgumentss   urlbits   splits   lens   joins
   allURLargss   daveutils	   splitargss	   orderlists   None(   s   selfs   urlbit(    (    s   ./spkproxy.pys	   normalize s   <"!c    s)     |  i |  i |  i f }  | Sd  S(   N(   s   selfs   connectHosts   connectPorts   clientisSSLs   result(   s   selfs   result(    (    s   ./spkproxy.pys   getSiteTuple s   c    s>     | d |  _  | d |  _  | d |  _  d  Sd  S(   Ni    i   i   (   s   sites   selfs   connectHosts   connectPorts   clientisSSL(   s   selfs   site(    (    s   ./spkproxy.pys   setSiteTuple s   c    s    d } | d |  i d 7} | d t |  i  d 7} | d 7} |  i o | d 7} n | d 7} 	| d 7} 
| |  i 7} xQ |  i i   D]= } x1 |  i | D] } | | d	 | d 7} q Wq W| Sd  S(
   Ns    s   Host: s   
s   Port: s   SSL : s   Yess   Nos   

s   : (   s   results   selfs   connectHosts   strs   connectPorts   clientisSSLs   verbs   headerValuesDicts   keyss   keys   value(   s   selfs   keys   values   result(    (    s   ./spkproxy.pys   printme s   	 	 	!c    s   d } |  i o | d 7} n | d 7} | |  i 7} |  i d j o |  i d j o | d t |  i  7} n | Sd  S(   Ns    s   https://s   http://iP   i  s   :(   s   results   selfs   useSSLs   connectHosts   connectPorts   str(   s   selfs   result(    (    s   ./spkproxy.pys   getSites   	#c    s   "t  |  i | i  d j o |  i | i j o~ |  i | i j ok t  |  i | i  d j oO |  i | i j o< |  i | i j o) t	 i
 |  i | i  o |  i | i j o *d Sn +d Sd  S(   Ni    i   (   s   cmps   selfs   URLs   others   clientisSSLs	   firstlines   URLargsDicts   connectPorts
   mybodysizes   daveutils   headerdictcmps   headerValuesDicts
   allURLargs(   s   selfs   other(    (    s   ./spkproxy.pys   issames   c    s   ./d } 0| |  i |  i 7} 1| t i |  i |  i  7} 3|  i i	 d  o8 4x. |  i d D4] } 5| t i |  7} qj Wn 7|  i i	 d  o8 8x. |  i d D8] } 9| t i |  7} q Wn =t i | d  Sd  S(   Ns    s   Cookies
   Set-Cookies   A(   s   hashs   selfs   verbs
   returncodes   daveutils
   hashstrings   URLs
   allURLargss   headerValuesDicts   has_keys   keys	   strencode(   s   selfs   hashs   key(    (    s   ./spkproxy.pys   genhash.s   	  	 	c    s   ?@d |  _ Ad  Sd  S(   Ni   (   s   selfs   doSurpressContentLength(   s   self(    (    s   ./spkproxy.pys   setSurpressContentLength?s   c    s   CD|  i Sd  S(   N(   s   selfs   doSurpressContentLength(   s   self(    (    s   ./spkproxy.pys   surpressContentLengthCs   c    s&   FGd |  _ Hd |  _ Id  Sd  S(   Ni   (   s   selfs   useSSLs   clientisSSL(   s   self(    (    s   ./spkproxy.pys   setclientSSLFs   c    s   KM|  i i |  O|  i d d d d d g j o Qd |  _ S|  i   n V|  i d d d g j o% Wd GHXd |  _ Y|  i   n Zd  Sd  S(   Nis   s   
i   is   Weird \n\n in header!(   s   selfs   datas   appends   moredatas   dones   verifyHeader(   s   selfs   moredata(    (    s   ./spkproxy.pys   addDataKs   #c    sW   _cxC | Dc]8 } d|  i i |  o it |  i | d  Sn q Wjd Sd  S(   Ni    (   s   keyss   akeys   selfs   headerValuesDicts   has_keys   int(   s   selfs   keyss   akey(    (    s   ./spkproxy.pys   getIntValue_s
   
 	 c    sW   npxC | Dp]8 } r|  i i |  o st |  i | d  Sn q Wtd Sd  S(   Ni    s   0(   s   keyss   akeys   selfs   headerValuesDicts   has_keys   str(   s   selfs   keyss   akey(    (    s   ./spkproxy.pys   getStrValuens
   
 	 c    s.   vw|  i i |  o x|  i | =n d  S(   N(   s   selfs   headerValuesDicts   has_keys   hstring(   s   selfs   hstring(    (    s   ./spkproxy.pys   removeHeadersvs   c    sL   {~|  i i |  o g  |  i | <n |  i | i |  d  S(   N(   s   selfs   headerValuesDicts   has_keys	   newheaders   appends   newheadervalue(   s   selfs	   newheaders   newheadervalue(    (    s   ./spkproxy.pys	   addHeader{s   c    s}  d i  |  i  i d  |  _ |  i d } |  i d  |  _ |  i |  o d GHd Sn |  i o d |  _ d Sn x |  i d D] } | i d  } t |  d j  o] | i d	  } t |  d j  o1 d
 t t |   d t |  GHd Sn n |  i | d d	 i  | d   q W|  i   d |  _ d  Sd  S(   Ns    s   
i    is   Couldn't parse first line!i   s   : i   s   :s   len(tempvalues)!=2 =s    in (   s   joins   selfs   datas   splits
   allheaderss	   firstlines   parseFirstLines
   sawCONNECTs
   sawsslinits
   headerLines
   tempvaluess   lens   strs	   addHeaders   massageHeaderss
   goodHeader(   s   selfs
   tempvaluess	   firstlines
   headerLine(    (    s   ./spkproxy.pys   verifyHeaders*   ! 	&(c    s^  d } d } |  i d g  d j o |  i d =d |  _ n d } | } |  i i d  o) |  i d |  i d <|  i d =n | oA |  i i d  o |  i d =n |  i	 d |  n |  i
 d	 d
 g  |  _ |  i i d	  o |  i d	 =n |  i i d
  o |  i d
 =n d  Sd  S(   Ns3   Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; Bob)s6   Mozilla/5.0 Galeon/1.0.3 (X11; Linux i686; U;) Gecko/0s   Transfer-Encodings   chunkedi   s   Proxy-Connections
   Connections
   User-Agents   Content-lengths   Content-Length(   s   IEstrings   nonIEstrings   selfs   getStrValues   headerValuesDicts
   wasChunkeds   replaceUserAgents	   userAgents   has_keys	   addHeaders   getIntValues
   mybodysize(   s   selfs   replaceUserAgents   IEstrings	   userAgents   nonIEstring(    (    s   ./spkproxy.pys   massageHeaderss*   				
c    s  | i d  } t |  d j  o d GHd Sn | d |  _ |  i d d g j ow 	d |  _ 
t |  d j o | d |  _ n t |  d j o | d |  _ n | |  _  d Sn |  i d j o d |  _	 d |  _
 d |  _ | d i d	  d |  _ | d i d	  d j  o d
 |  _ n !| d i d	  d |  _ "d Sn $|  i | d  o %d Sn (| d |  _ *d Sd  S(   Ns    i   s-   First line of header has less than 2 members!i    s   HTTP/1.1s   HTTP/1.0i   s   CONNECTs   :i  (   s	   firstlines   splits   templists   lens   selfs   verbs   responseHeaders
   returncodes   returnmessages   useSSLs   clientisSSLs
   sawCONNECTs   connectHosts   connectPorts   processProxyUrls   version(   s   selfs	   firstlines   templist(    (    s   ./spkproxy.pys   parseFirstLines4   c    s  -0h  |  _ 1d |  _ 2d |  _ 4|  i o 5d |  _ n 6d |  _ :| } <|  i o?| i	 d  d } @t | i	 d   d j  o Ad GHBd Sn Fd i | i	 d  d  } G| d j o Id |  _ n( J| d	 j o Kd
 | GHLd Sn Ot | i	 d   d j  o Pd GHQd Sn S| i	 d  d |  _ Vt | i	 d   d j  o Wd } n  Yd i | i	 d  d  } [| d j o \d } n _| d d j o `d | } n dt |  i i	 d   d j oB ft |  i i	 d  d  |  _ g|  i i	 d  d |  _ n j|  i d j o kd GHld Sn n s| i d  d j o | i d  d j os t| i d  } u| d j oM v| i d d |  } w| d j o! {| |  d | | d } n n n | i	 d  d |  _ t | i	 d   d j o} d i | i	 d  d  |  _ t i |  i d |  i |  _ |  i t j o# h  |  _ d |  _ d Sn n d Sd  S(   Ni    s    iP   s   ://i   s6   Need something after the http:// - exiting this threadi   s   httpss   https   unknown url type s   must have http://somethings   /s   :s   Error: empty connect host!s   ?s   =is	   orderlist(   s   selfs   URLargsDicts   useSSLs   connectHosts   connectPorts   URLs   proxyurls   urlbits   clientisSSLs   splits   urltypes   lens   joins   ints   counts   finds
   indexequals   rfinds   indexfirstslashs
   allURLargss   daveutils	   splitargss	   orderlists   Nones   useRawArguments(   s   selfs   proxyurls   urlbits   urltypes
   indexequals   indexfirstslash(    (    s   ./spkproxy.pys   processProxyUrl-sd   	"" /)"!c    s,   |  i d j o d Sn d Sd  S(   Ni    i   (   s   selfs   done(   s   self(    (    s   ./spkproxy.pys   isdones   c    s   |  i Sd  S(   N(   s   selfs
   goodHeader(   s   self(    (    s   ./spkproxy.pys   gotGoodHeaders   c    s   |  i Sd  S(   N(   s   selfs
   mybodysize(   s   self(    (    s   ./spkproxy.pys   bodySizes   c    so   |  i i |  oK d } x1 |  i | D] } | | d | d 7} q3 W| Sn d Sd  S(   Ns    s   : s   
(   s   selfs   headerValuesDicts   has_keys   headers	   returnstrs   value(   s   selfs   headers	   returnstrs   value(    (    s   ./spkproxy.pys
   grabHeaders   	 	c    s   | |  _ d  Sd  S(   N(   s	   newheaders   selfs   proxyHeader(   s   selfs	   newheader(    (    s   ./spkproxy.pys   setProxyHeaders   (   s   __name__s
   __module__s   __init__s   clears   getProxyHeaders	   normalizes   getSiteTuples   setSiteTuples   printmes   getSites   issames   genhashs   setSurpressContentLengths   surpressContentLengths   setclientSSLs   addDatas   getIntValues   getStrValues   removeHeaderss	   addHeaders   verifyHeaders   massageHeaderss   parseFirstLines   processProxyUrls   isdones   gotGoodHeaders   bodySizes
   grabHeaders   setProxyHeader(    (    (    s   ./spkproxy.pys   header s6   	$*M.d
s   bodyc      sw   t  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d	   Z
 RS(
   Nc    s   d |  _ g  |  _ d  S(   Ni    (   s   selfs   mysizes   data(   s   self(    (    s   ./spkproxy.pys   __init__s   c    s5   d i  |  i  } t i |  } | Sd  S(   Ns    (   s   joins   selfs   datas   results   daveutils   prettyprint(   s   selfs   result(    (    s   ./spkproxy.pys   printmes   c    s   | |  _ d  Sd  S(   N(   s   sizes   selfs   mysize(   s   selfs   size(    (    s   ./spkproxy.pys   setSizes   c    s/   |  i | i j o d Sn d Sd  S(   Ni   i    (   s   selfs   mysizes   other(   s   selfs   other(    (    s   ./spkproxy.pys   issames   c    s9   d } | t i d i |  i   7} | Sd  S(   Ns    (   s   hashs   daveutils
   hashstrings   joins   selfs   data(   s   selfs   hash(    (    s   ./spkproxy.pys   genhashs   	"c    sI   t  i d i |  i   } | t j o h  } n | Sd  S(   Ns    (   s   daveutils	   splitargss   joins   selfs   datas   argsDicts   None(   s   selfs   argsDict(    (    s   ./spkproxy.pys   getArgsDicts   c    s   | } d } x; | t |  j o$ | | i | t |   7} q W|  i | 7_ |  i | 7_ | Sd  S(   Ns    (	   s   sizes
   targetsizes   tempdatas   lens
   connections   recvs   selfs   datas   mysize(   s   selfs
   connections   sizes
   targetsizes   tempdata(    (    s   ./spkproxy.pys	   readBlocks   		 %c 	   sh  | o)| o
 | d j o d } x d o yg t |  } | | i d  7} | t |  j o Pn | i d  d j o n Wn5 t	 i
 t i f j
 o } Pn Pn Xq4 W|  i | 7_ |  i t |  7_ t |  Sn |  i | |  Sn.x'd og  } x5 | d d d g j o | | i d  7} qVW
t d i |  d	  } | d j oR g  } x5 | d d d g j o | | i d  7} qW|  i Sn |  i | |  g  } x5 | d d d g j o | | i d  7} q*Wq=Wd  S(
   Ni    s    i   i  s   </html>is   s   
i   (   s
   waschunkeds   readtillcloseds   sizes   temps   lens   lengths
   connections   recvs   counts   SSLs   SysCallErrors   sockets   errors   diags   selfs   datas   mysizes	   readBlocks   linesizes   ints   join(	   s   selfs
   connections   sizes
   waschunkeds   readtillcloseds   temps   diags   lengths   linesize(    (    s   ./spkproxy.pys   readsL   	 
 
	 	 	 c    s5   |  i t |  i  j o d Sn d Sd  S(   Ni   i    (   s   selfs   mysizes   lens   data(   s   self(    (    s   ./spkproxy.pys   gotGoodBodys   (   s   __name__s
   __module__s   __init__s   printmes   setSizes   issames   genhashs   getArgsDicts	   readBlocks   reads   gotGoodBody(    (    (    s   ./spkproxy.pys   bodys   	As   spkProxyConnectionc      s    t  Z "e e d  Z Fd   Z Kd   Z d   Z d   Z d   Z d   Z	 Cd   Z
 Ud	   Z id
   Z e e d  Z d   Z RS(   Nc    sr  "#t  i |   %| |  _ &d |  _ 'd |  _ (d |  _ )d |  _ *d |  _ +d |  _	 -d |  _
 .d |  _ 0| |  _ 1d |  _ 2d |  _ 3d |  _ 4d |  _ 5d |  _ 6d |  _ 7d |  _ 8d |  _ 9d |  _ ;| t j o% <| \ |  _ |  _ |  _ |  _ n >| t j o ?| \ |  _ |  _ |  _ n Bt |  _ Dd  Sd  S(   Ni    s    i(   s   Threads   __init__s   selfs
   connections   clientisSSLs   currentHosts   currentPorts
   haveSockets   sslHosts   sslPorts   currentSockets   sawConnectionCloses   myUIs   proxyHeaders	   proxyHosts	   proxyPorts   proxySSLHosts   proxySSLPorts   NTLMUsers
   NTLMDomains   NTLMPasswords   NTLMAuthStates   proxys   Nones   ntlms   default404stringlists	   my404List(   s   selfs
   connections   myUIs   proxys   ntlm(    (    s   ./spkproxy.pys   __init__"s4   %c    s&   FGd | GHH| |  _ Id  Sd  S(   Ns*   spkProxyConnection: Proxy header set to %s(   s   myheaders   selfs   proxyHeader(   s   selfs   myheader(    (    s   ./spkproxy.pys   setProxyHeaderFs   c    s  KNd } P| o Qd GHn SxSd oT| o Ud GHn Vt   } X|  i o Y| i   n [x [| i   d j o \y ]|  i i d  } Wn& ^_d GH`|  i
   ad  Sn Xc| o d| o ed GHn fPn g| i |  qx Wi| i d j oZ j| o kd GHn ld |  _ m| i |  _ n| i |  _ o|  i i   pq( n st   } t| o ud GHn w| i   o x| o yd	 GHn z| i   d j p | i o? {| o |d
 GHn ~| i |  i | i   | i d  n | o d GHn | i | _ | i   o |  i
   d  Sn | o d GHn n@ | o! d GHd t | i	  GHn |  i
   d  S|  i | |  } t |  } d } | |  i i! | |  7} | o d GHn |  i i"   o& | o d GHn d |  _# n |  i# o> | o d GHn |  i i$   |  i
   d  Sn | o d GHn q( q( Wd  S(   Ni    s!   spkProxy: Handling new connectioni   s   entering while loops   Client closed connections   end of datas   spkProxy: Saw ssl init!s   Done with headers   reading bodys   Reading the body!s   No body neededs   done with bodys)   failed to get a good header, cleaning up.s   Header we got: %ss   Sent data to client.s"   self.connection.gotclosed() = trues   Closing connection!s   Continuing while loop(%   s   debug_spkProxyConnections   headers   myheaders   selfs   clientisSSLs   setclientSSLs   isdones
   connections   recvs   datas   cleanups   addDatas
   sawsslinits   connectHosts   sslHosts   connectPorts   sslPorts   startSSLservers   bodys   mybodys   gotGoodHeaders   bodySizes
   wasChunkeds   reads   mysizes
   mybodysizes   gotGoodBodys   strs   sendRequests   responses   lens
   sizetosends   sentsizes   sends	   gotcloseds   sawConnectionCloses   close(   s   selfs
   sizetosends   mybodys   sentsizes   debug_spkProxyConnections   myheaders   datas   response(    (    s   ./spkproxy.pys   runKs   	
 

 




 
)


	



c    s   t  i | |  Sd  S(   N(   s   daveutils   constructResponses   myheaders   mybody(   s   selfs   myheaders   mybody(    (    s   ./spkproxy.pys   constructResponses   c    s  t  i  t  i t  i  } |  i o | i |  i t |  i	  f  | i
 d | | f  d GHt i | d  } d GH| i d  d j o d GHd Sn |  i d  n d	 |  i |  i	 f GH| i |  i t |  i	  f  | t j o d
 GHd Sn t |  d j o& |  i d | d t |   n |  i d |  | |  _ d Sd  S(   Ns   CONNECT %s:%s

s   Reading in until I get \r\n\r\ns   

s   Done reading ins   200i    s)   Failed to connect to SSL Server via Proxys    s   Connecting to Proxy %s %ss   Couldn't connect to proxy host!s   80s   http://s   :i   (   s   sockets   AF_INETs   SOCK_STREAMs	   newsockets   selfs   clientisSSLs   connects   proxySSLHosts   ints	   proxyPorts   sends   hosts   ports   daveutils	   readuntils   datas   counts   setProxyHeaders	   proxyHosts   Nones   strs   currentSocket(   s   selfs   hosts   ports   datas	   newsocket(    (    s   ./spkproxy.pys   doProxyConnects*   ""&c    sG   |  i o |  i i   n d |  _ d |  _ d  Sd  S(   Ni    s    (   s   selfs
   haveSockets   currentSockets   closes   currentPorts   currentHost(   s   self(    (    s   ./spkproxy.pys   closeServerSockets
   c    s  d } |  i o|  i | _ |  i | _ |  i oVd |  _ |  i |  _	 |  i |  _
 t i t i t i  |  _ d t |  i  d t |  i  GH|  i d j o1 |  i | i | i  d j o d Sn na y) |  i i |  i t |  i  f  Wn1 d GHd |  _	 	d |  _
 
d Sn Xt i t i  } t i | |  i  |  _ |  i i   n | o d GHn nd t | i  d t | i  GH| o d t |  i  GHn |  i	 | i j o/ |  i
 | i j o t |  i  i d	  d j o | o  d
 GHn "n%|  i o &|  i i   n +t i t i t i  |  _ .|  i d j o1 /|  i | i | i  d j o 0d Sn ny 3d | i | i f GH4y) 5|  i i | i t | i  f  Wn1 67d |  _	 8d |  _
 9d GH:d Sn X<| i |  _	 =| i |  _
 @d Sd  S(   Ni    i   s   Connecting to s    s    s   Connection refuseds:   SSL connection not done since we already had a connection.s   currentSocket=%ss   -1s8   passing because currentHost and currentPort are the sames   Trying to connect to %s:%ss   Could not connect.(   s   debug_connectToWebServers   selfs   clientisSSLs   sslHosts   myheaders   connectHosts   sslPorts   connectPorts
   haveSockets   currentHosts   currentPorts   sockets   AF_INETs   SOCK_STREAMs   currentSockets   strs	   proxyHosts   doProxyConnects   connects   ints   SSLs   Contexts   SSLv23_METHODs   ctxs
   Connections   set_connect_states   counts   close(   s   selfs   myheaders   debug_connectToWebServers   ctx(    (    s   ./spkproxy.pys   connectToWebServersb   	&")
&
H
")c    s\   CHJd i  | i  } Nx7 |  i DN]) } O| i |  o Pd | _	 n q( Wd S(   s   
        massageResponse() performs any additional changes on the response before we return it
        For example, this function handles false 200 responses that IIS misconfigurations do
        quite often
        s    s   404N(
   s   joins
   serverbodys   datas   bodydatas   selfs	   my404Lists   astrings   counts   serverheaders
   returncode(   s   selfs   serverheaders
   serverbodys   bodydatas   astring(    (    s   ./spkproxy.pys   massageResponseCs    	c    s   UVh  } Wd | d <Xd | d <Yd | d <[|  i i   | d <\|  i i   | d <]|  i i   | d <^d | d	 <_d
 | d <`t i |  i  | d <at i	 |  i  | d <cd
 | d <e| Sd  S(   Ni   s   LMs   NTs   UNICODEs   HOSTs   DOMAINs   USERs   06820000s   FLAGSi    s   NTLM_TO_BASICs   LM_HASHED_PWs   NT_HASHED_PWs	   NTLM_MODE(
   s   envs   selfs   currentHosts   uppers
   NTLMDomains   NTLMUsers
   ntlm_procss   create_LM_hashed_passwords   NTLMPasswords   create_NT_hashed_password(   s   selfs   env(    (    s   ./spkproxy.pys
   getNTLMEnvUs   	c    s  ij|  i | |  \ }	 } } m| t j o pn r| t j o, | i d g  d d g j o |  i	 d j o)sd GHy|  i
   } zt i |  } {| i d  || i d d |  d | _ |  i | |  \ }	 } } | i d g  }
 |
 i d d  }
 |
 i d	 d  }
 t i |
  } t i | |  } | i d  | i d d |  |  i | |  \ }	 } } n | t j o
 | t j o  |  i i | | | |  n |	 Sd  S(
   Ns   WWW-Authenticates   NTLMs	   Negotiates    s   Sending NTLM Authentications   Authorizations   NTLM s   HTTP/1.0s
   NEGOTIATE (   s   selfs   sendRequestRaws   myheaders   mybodys   responses   serverheaders
   serverbodys   Nones   getStrValues   NTLMUsers
   getNTLMEnvs   envs   ntlm_messagess   create_message1s   ntlmstring1s   removeHeaderss	   addHeaders   versions   ntlmchallenges   replaces   parse_message2s   nonces   create_message3s	   NTLM_msg3s   myUIs   registerRequestandResponse(   s   selfs   myheaders   mybodys   nonces   serverheaders
   serverbodys   envs	   NTLM_msg3s   ntlmstring1s   responses   ntlmchallenge(    (    s   ./spkproxy.pys   sendRequestis,   ?" c    sk  d } | i   |  i i |  oE | o d GHn d |  _ |  i i | |  t	 t	 f Sn t
 g  j o; d GH| i t
 j o d GHt t	 t	 f Sn n t g  j o+ | i t j o t t	 t	 f Sn n d } |  i |  o4 d GHd t t |   d	 | t	 t	 f Sn | i |  i  t i | |  }	 y |  i i |	  Wn2 d
 t t |   d	 | t	 t	 f Sn Xd |	 GHd } x | d j o t   } x | i   d j o y |  i i d  }
 WnS t  i! j
 o d GHd }
 n+ t" i# j
 o d GHd }
 n X|
 o Pn | i$ |
  qW| i } qW| i% } | o[ d | i' d g  GHd | i' d g  i(   GHd | i GHd t |  GHn d } | i' d g  i(   d g j p8 | i d d d g j o | i' d g  i(   d g j o# | o d GHn d } n | o d GHn  d d i* | i  GHt+   } | d j p | p | i- ob | o5 d t |  d t |  d  t | i-  GHn | i. |  i | | i- |  n 	| o4 
d! t | i/  d" t t | i   d# GHn |  i0 | |  |  i1 | |  } | o3 | o d$ GHn |  i3   d |  _ n | t	 j o | } n | t	 j o | } n | | | f Sd  S(%   Ni    s0   UI handling this request - sawConnectionClose==1i   s   Checking restricted pagess!   Page not in restricted pages lists]   <html><head><title>Error</title></head><body><h1>  No server there, sorry.</h1></body></html>s   returning fake 501 page!s3   HTTP/1.1 501 501 No Server There!
Content-Length: s   

s/   HTTP/1.1 501 No Server There!
Content-Length: s   Sent request:
s   100s    Server closed connection - weirds    s   Connection reset by peers   Server: s   Servers   Connection: s
   Connections   Returncode: s   Bodylength: s   closes   304s   302s   301s   0s   Connection: close detectedsE   Connection: close not detected or returncode of 304,302,301 reported s   
Response Header:
s   Reading a body of length s    readtillclosed=s	    chunked=s   Body turned out to be s    or s    bytes.s!   Saw Connection Close setting to 1(6   s   debug_spkproxys   myheaders	   normalizes   selfs   myUIs   wantsRequests   sawConnectionCloses   handleRequests   mybodys   Nones   restrictedpagess   URLs   deniedstrings   restrictedhostss   connectHosts	   byestrings   connectToWebServers   strs   lens   setProxyHeaders   proxyHeaders   daveutils   constructRequests	   myRequests   currentSockets   sends
   returncodes   headers   serverheaders   isdones   recvs   datas   SSLs   ZeroReturnErrors   sockets   errors   addDatas
   mybodysizes
   bodylengths   getStrValues   lowers   readtillcloseds   joins   bodys
   serverbodys
   wasChunkeds   reads   mysizes   massageResponses   constructResponses   responses   closeServerSockets   newserverheaders   newserverbody(   s   selfs   myheaders   mybodys   newserverheaders   newserverbodys
   returncodes
   bodylengths   serverheaders	   byestrings	   myRequests   datas   responses   readtillcloseds   debug_spkproxys
   serverbody(    (    s   ./spkproxy.pys   sendRequestRaws   	
#	,,	  
	`

!
5#
4

c    sK    |  i i   !|  i o "|  i i   n #d |  _ &d  Sd  S(   Ni    (   s   selfs
   connections   closes
   haveSockets   currentSocket(   s   self(    (    s   ./spkproxy.pys   cleanups
   (   s   __name__s
   __module__s   Nones   __init__s   setProxyHeaders   runs   constructResponses   doProxyConnects   closeServerSockets   connectToWebServers   massageResponses
   getNTLMEnvs   sendRequests   sendRequestRaws   cleanup(    (    (    s   ./spkproxy.pys   spkProxyConnection s   	$k(
V5s   spkProxyc      s   (t  Z )d   Z 9d   Z =d   Z Ad   Z Dd   Z Gd   Z Jd   Z Md   Z	 Pd	   Z
 Sd
   Z Vd   Z Zd   Z ^d   Z cd   Z fd   Z ud   Z RS(   Nc    s   )*d |  _ +d |  _ ,t i   |  _ .|  i i |   0d |  _ 1d |  _ 2d |  _	 3d |  _
 4d |  _ 5d |  _ 6d |  _ d  S(   Ni  s    i    (   s   selfs   mylistenports   mylistenhosts   spikeProxyUIs
   spkProxyUIs   myUIs	   setParents	   proxyHosts	   proxyPorts   SSLProxyHosts   SSLProxyPorts   NTLMUsers
   NTLMDomains   NTLMPassword(   s   self(    (    s   ./spkproxy.pys   __init__)s   c    s    9:t  |  |  _ ;d  Sd  S(   N(   s   ints   ports   selfs   mylistenport(   s   selfs   port(    (    s   ./spkproxy.pys   setPort9s   c    s   =>| |  _ ?d  Sd  S(   N(   s   hosts   selfs   mylistenhost(   s   selfs   host(    (    s   ./spkproxy.pys   setListenHost=s   c    s   AB| |  _ d  S(   N(   s   hosts   selfs	   proxyHost(   s   selfs   host(    (    s   ./spkproxy.pys   setProxyHostAs   c    s   DE| |  _ d  S(   N(   s   ports   selfs	   proxyPort(   s   selfs   port(    (    s   ./spkproxy.pys   setProxyPortDs   c    s   GH| |  _ d  S(   N(   s   hosts   selfs   SSLProxyHost(   s   selfs   host(    (    s   ./spkproxy.pys   setSSLProxyHostGs   c    s   JK| |  _ d  S(   N(   s   ports   selfs   SSLProxyPort(   s   selfs   port(    (    s   ./spkproxy.pys   setSSLProxyPortJs   c    s   MN| |  _ d  S(   N(   s   users   selfs   NTLMUser(   s   selfs   user(    (    s   ./spkproxy.pys   setNTLMUserMs   c    s   PQ| |  _ d  S(   N(   s   domains   selfs
   NTLMDomain(   s   selfs   domain(    (    s   ./spkproxy.pys   setNTLMDomainPs   c    s   ST| |  _ d  S(   N(   s   passwds   selfs   NTLMPassword(   s   selfs   passwd(    (    s   ./spkproxy.pys   setNTLMPasswordSs   c    s   VW| } Xd  Sd  S(   N(   s   a404lists   default404stringlist(   s   selfs   a404lists   default404stringlist(    (    s   ./spkproxy.pys
   set404ListVs   	c    s   Z[t  i |  \d  Sd  S(   N(   s   default404stringlists   appends	   newstring(   s   selfs	   newstring(    (    s   ./spkproxy.pys   addTo404ListZs   c    s2   ^_| t j o `t i |  n ad  Sd  S(   N(   s	   oldstrings   default404stringlists   remove(   s   selfs	   oldstring(    (    s   ./spkproxy.pys   removeFrom404List^s   c    s   cdt  Sd  S(   N(   s   default404stringlist(   s   self(    (    s   ./spkproxy.pys
   get404Listcs   c    s  fg|  i i |  i |  i |  i f  h|  i i |  i |  i |  i	 |  i
 f  jt i t i t i  } k| i t i t i d  l| i |  i |  i f  m| i d  nxO nd oD o| i   \ } } pd G| GHqt |  } r|  i |  q Wd  S(   Ni   i   s   Connected to by(   s   selfs   myUIs   setNTLMs   NTLMUsers   NTLMPasswords
   NTLMDomains   setProxys	   proxyHosts	   proxyPorts   SSLProxyHosts   SSLProxyPorts   sockets   AF_INETs   SOCK_STREAMs   ss
   setsockopts
   SOL_SOCKETs   SO_REUSEADDRs   binds   mylistenhosts   mylistenports   listens   accepts   conns   addrs   MyConnections
   connections   handleConnection(   s   selfs
   connections   addrs   ss   conn(    (    s   ./spkproxy.pys   runfs   %+ 
c  	  s_   uwt  | |  i d |  i |  i |  i |  i f d |  i |  i	 |  i
 f } x| i   d  S(   Ns   proxys   ntlm(   s   spkProxyConnections
   connections   selfs   myUIs	   proxyHosts	   proxyPorts   SSLProxyHosts   SSLProxyPorts   NTLMUsers   NTLMPasswords
   NTLMDomains   start(   s   selfs
   connection(    (    s   ./spkproxy.pys   handleConnectionus   K(   s   __name__s
   __module__s   __init__s   setPorts   setListenHosts   setProxyHosts   setProxyPorts   setSSLProxyHosts   setSSLProxyPorts   setNTLMUsers   setNTLMDomains   setNTLMPasswords
   set404Lists   addTo404Lists   removeFrom404Lists
   get404Lists   runs   handleConnection(    (    (    s   ./spkproxy.pys   spkProxy(s    	c      s   }~d GHd  S(   Ns.  
    SPIKE Proxy Version "+VERSION+", Immunity, Inc.
    http://www.immunitysec.com/spike.html for more help and information
    usage: spkproxy.py [-p port] [-h proxyHost -H proxyPort] [-s proxySSLHost -S proxySSLPort]
           [-U NTLM Username -P NTLM Password -D NTLM Domain] [-l listenhost]
    (    (    (    (    s   ./spkproxy.pys   usage}s   s   __main__s   Running SPIKE Proxy v s(   SPIKE Proxy is copyright Dave Aitel 2002s   License: GPL v 2.0sD   Please visit www.immunitysec.com for updates and other useful tools!s/   *** To use the GUI, browse to http://spike/ ***s:   Let dave@immunitysec.com know if you like this project. :>i   s   h:H:p:s:S:U:P:D:l:i   s   -ss   -Ss   -hs   -Hs   -ps   -Us   -Ds   -Ps   -l(5   s   sockets   syss	   threadings   Threads   strings   oss   OpenSSLs   SSLs   getopts   paths   appends	   ntlmutilss   str2unicodes   ntlm_messagess
   ntlm_procss   spikeProxyUIs   daveutils   times   versionchecks   VERSIONs   default404stringlists   restrictedhostss   restrictedpagess   denied1s   lens   deniedstrings   MyConnections   headers   bodys   spkProxyConnections   spkProxys   usages   __name__s
   getversions   apps   argvs   optss   argss   GetoptErrors   exits   os   as   setSSLProxyHosts   setSSLProxyPorts   setProxyHosts   setProxyPorts   setPorts   ints   setNTLMUsers   setNTLMDomains   setNTLMPasswords   setListenHosts   run(   s   bodys   as   MyConnections   Threads   strings   apps   argss   default404stringlists   restrictedhostss   spikeProxyUIs   headers   VERSIONs   deniedstrings   sockets   versionchecks   syss   denied1s   spkProxys   daveutils   ntlm_messagess   os   SSLs
   ntlm_procss   str2unicodes   restrictedpagess   times   usages   getopts   oss   spkProxyConnections   opts(    (    s   ./spkproxy.pys   ? s   					W  u  
U	&

 