-
S>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 6 d  k Z 8 e i d  : d  k Z A d Z C d g Z H g  Z I g  Z L d Z M d	 e e  d
 e Z U d f  d     YZ  d f  d     YZ d f  d     YZ (d e f d     YZ 5d f  d     YZ  d   Z! e" d j ogd e GHd GHd GHd GHd GHd GHe i# e  d  k$ Z$ e$ i$ e$ i% e i&  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' i0 e-  n e, d# g j o e' i1 e-  n e, d$ g j o e' i2 e3 e-   n e, d% g j o e' i4 e-  n e, d& g j o e' i5 e-  n e, d' g j o e' i6 e-  n e, d( g j o e' i7 e-  n qWe' i8   n d  S()   N(   s   Thread(   s   SSLs   ntlm(   s   str2unicodei   s   1.4.8s   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_   U t  Z V d   Z Z d   Z f d   Z u d   Z { d   Z  d   Z  d   Z RS(   Nc    s   V W d |  _ X | |  _ d  S(   Ni    (   s   selfs   doSSLs   conns   mysocket(   s   selfs   conn(    (    s   ./spkproxy.pys   __init__V s   c    s#   Z a |  i i |  } c | Sd  S(   N(   s   selfs   mysockets   recvs   sizes   result(   s   selfs   sizes   result(    (    s   ./spkproxy.pys   recvZ s   c    s   f g t  |  } h d } i xe i | | j  oT k y! n | |  i i | |  7} Wn) o t i t	 i
 f j
 o q | Sn Xq! Wr | Sd  S(   Ni    (   s   lens   datas
   sizetosends   sentsizes   selfs   mysockets   sends   SSLs   SysCallErrors   sockets   error(   s   selfs   datas
   sizetosends   sentsize(    (    s   ./spkproxy.pys   sendf s   	 !c    s    u w d | i   GHx | Sd  S(   Ns   Got certificate: %s(   s   certs   get_subjects   ok(   s   conns   certs   errnums   depths   ok(    (    s   ./spkproxy.pys	   verify_cbu s   c    s  { | d } ~ t i i t i d  }  | d j o  t i } n  |  i	 i
 d   t i t i  }  | i d   | 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

i   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_timeouts
   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   startSSLserver{ 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   MyConnectionU s   	 s   headerc      sO   t  Z  d   Z  d   Z  d   Z  d   Z  d   Z  d   Z d   Z d   Z	 &d	   Z
 6d
   Z Gd   Z Kd   Z Nd   Z Sd   Z gd   Z vd   Z ~d   Z d   Z d   Z d   Z d   Z 5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 2d Sn 3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   67d } 8| |  i |  i 7} 9| t i |  i |  i  7} ;|  i i	 d  o8 <x. |  i d D<] } =| t i |  7} qj Wn ?|  i i	 d  o8 @x. |  i d D@] } A| t i |  7} q Wn E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   genhash6s   	  	 	c    s   GHd |  _ Id  Sd  S(   Ni   (   s   selfs   doSurpressContentLength(   s   self(    (    s   ./spkproxy.pys   setSurpressContentLengthGs   c    s   KL|  i Sd  S(   N(   s   selfs   doSurpressContentLength(   s   self(    (    s   ./spkproxy.pys   surpressContentLengthKs   c    s&   NOd |  _ Pd |  _ Qd  Sd  S(   Ni   (   s   selfs   useSSLs   clientisSSL(   s   self(    (    s   ./spkproxy.pys   setclientSSLNs   c    s   SU|  i i |  W|  i d d d d d g j o Yd |  _ [|  i   n ^|  i d d d g j o% _d GH`d |  _ a|  i   n b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   addDataSs   #c    sW   gkxC | Dk]8 } l|  i i |  o qt |  i | d  Sn q Wrd Sd  S(   Ni    (   s   keyss   akeys   selfs   headerValuesDicts   has_keys   int(   s   selfs   keyss   akey(    (    s   ./spkproxy.pys   getIntValuegs
   
 	 c    sW   vxxC | Dx]8 } z|  i i |  o {t |  i | d  Sn q W|d Sd  S(   Ni    s   0(   s   keyss   akeys   selfs   headerValuesDicts   has_keys   str(   s   selfs   keyss   akey(    (    s   ./spkproxy.pys   getStrValuevs
   
 	 c    s.   ~|  i i |  o |  i | =n d  S(   N(   s   selfs   headerValuesDicts   has_keys   hstring(   s   selfs   hstring(    (    s   ./spkproxy.pys   removeHeaders~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 0| d |  _ 2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  58h  |  _ 9d |  _ :d |  _ <|  i o =d |  _ n >d |  _ B| } D|  i oG| i	 d  d } Ht | i	 d   d j  o Id GHJd Sn Nd i | i	 d  d  } O| d j o Qd |  _ n( R| d	 j o Sd
 | GHTd Sn Wt | i	 d   d j  o Xd GHYd Sn [| i	 d  d |  _ ^t | i	 d   d j  o _d } n  ad i | i	 d  d  } c| d j o dd } n g| d d j o hd | } n lt |  i i	 d   d j oB nt |  i i	 d  d  |  _ o|  i i	 d  d |  _ n r|  i d j o sd GHtd Sn n {| i d  d j o | i d  d j os || i d  } }| d j oM ~| i d d |  } | 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   processProxyUrl5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 Nd   Z Sd   Z d   Z d   Z d   Z d   Z	 Ld   Z
 ^d	   Z rd
   Z e e d  Z +d   Z RS(   Nc    sr  *+t  i |   -| |  _ .d |  _ /d |  _ 0d |  _ 1d |  _ 2d |  _ 3d |  _	 5d |  _
 6d |  _ 8| |  _ 9d |  _ :d |  _ ;d |  _ <d |  _ =d |  _ >d |  _ ?d |  _ @d |  _ Ad |  _ C| t j o% D| \ |  _ |  _ |  _ |  _ n F| t j o G| \ |  _ |  _ |  _ n Jt |  _ L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   NP| |  _ Qd  Sd  S(   N(   s   myheaders   selfs   proxyHeader(   s   selfs   myheader(    (    s   ./spkproxy.pys   setProxyHeaderNs   c    s  SVd } X| o Yd GHn [x[d o\| o ]d GHn ^t   } `|  i o a| i   n cx c| i   d j o dy e|  i i d  } Wn& fgd GHh|  i
   id  Sn Xk| o l| o md GHn nPn o| i |  qx Wq| i d j oZ r| o sd GHn td |  _ u| i |  _ v| i |  _ w|  i i   xq( n {t   } || o }d GHn | i   o | o d	 GHn | 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   runS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  t i | d  } | 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   

s   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 of 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  } | i d  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 4t i t i t i  |  _ 7|  i d j o1 8|  i | i | i  d j o 9d Sn ny <d | i | i f GH=y) >|  i i | i t | i  f  Wn1 ?@d |  _	 Ad |  _
 Bd GHCd Sn XE| i |  _	 F| i |  _
 Id Sd  S(   Ni    i   s   Connecting to s    s    s   Connection refusedi   s:   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   set_timeouts
   Connections   set_connect_states   counts   close(   s   selfs   myheaders   debug_connectToWebServers   ctx(    (    s   ./spkproxy.pys   connectToWebServersd   	&")
&
H
")c    s\   LQSd i  | i  } Wx7 |  i DW]) } X| i |  o Y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   massageResponseLs    	c    s   ^_h  } `d | d <ad | d <bd | d <d|  i i   | d <e|  i i   | d <f|  i i   | d <gd | d	 <hd
 | d <it i |  i  | d <jt i	 |  i  | d <ld
 | d <n| 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
   getNTLMEnv^s   	c    s  rs|  i | |  \ }	 } } v| t j o yn {| t j o, | i d g  d d g j o |  i	 d j o)|d GH|  i
   } 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   sendRequestrs,   ?" c    s  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  }
 Wn| t  i! j
 o d GHd }
 nT 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 | i0  d# t t | i   d$ GHn |  i1 | |  |  i2 | |  } | o3 | o d% GHn |  i4    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   SSL recv errors   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(7   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   SysCallErrors   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 0d |  _ 3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(
W5s   spkProxyc      s   5t  Z 6d   Z Fd   Z Jd   Z Nd   Z Qd   Z Td   Z Wd   Z Zd   Z	 ]d	   Z
 `d
   Z cd   Z gd   Z kd   Z pd   Z sd   Z d   Z RS(   Nc    s   67d |  _ 8d |  _ 9t i   |  _ ;|  i i |   =d |  _ >d |  _ ?d |  _	 @d |  _
 Ad |  _ Bd |  _ C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__6s   c    s    FGt  |  |  _ Hd  Sd  S(   N(   s   ints   ports   selfs   mylistenport(   s   selfs   port(    (    s   ./spkproxy.pys   setPortFs   c    s   JK| |  _ Ld  Sd  S(   N(   s   hosts   selfs   mylistenhost(   s   selfs   host(    (    s   ./spkproxy.pys   setListenHostJs   c    s   NO| |  _ d  S(   N(   s   hosts   selfs	   proxyHost(   s   selfs   host(    (    s   ./spkproxy.pys   setProxyHostNs   c    s   QR| |  _ d  S(   N(   s   ports   selfs	   proxyPort(   s   selfs   port(    (    s   ./spkproxy.pys   setProxyPortQs   c    s   TU| |  _ d  S(   N(   s   hosts   selfs   SSLProxyHost(   s   selfs   host(    (    s   ./spkproxy.pys   setSSLProxyHostTs   c    s   WX| |  _ d  S(   N(   s   ports   selfs   SSLProxyPort(   s   selfs   port(    (    s   ./spkproxy.pys   setSSLProxyPortWs   c    s   Z[| |  _ d  S(   N(   s   users   selfs   NTLMUser(   s   selfs   user(    (    s   ./spkproxy.pys   setNTLMUserZs   c    s   ]^| |  _ d  S(   N(   s   domains   selfs
   NTLMDomain(   s   selfs   domain(    (    s   ./spkproxy.pys   setNTLMDomain]s   c    s   `a| |  _ d  S(   N(   s   passwds   selfs   NTLMPassword(   s   selfs   passwd(    (    s   ./spkproxy.pys   setNTLMPassword`s   c    s   cd| } ed  Sd  S(   N(   s   a404lists   default404stringlist(   s   selfs   a404lists   default404stringlist(    (    s   ./spkproxy.pys
   set404Listcs   	c    s   ght  i |  id  Sd  S(   N(   s   default404stringlists   appends	   newstring(   s   selfs	   newstring(    (    s   ./spkproxy.pys   addTo404Listgs   c    s2   kl| t j o mt i |  n nd  Sd  S(   N(   s	   oldstrings   default404stringlists   remove(   s   selfs	   oldstring(    (    s   ./spkproxy.pys   removeFrom404Listks   c    s   pqt  Sd  S(   N(   s   default404stringlist(   s   self(    (    s   ./spkproxy.pys
   get404Listps   c    s/  st|  i i |  i |  i |  i f  u|  i i |  i |  i |  i	 |  i
 f  wt i t i t i  } x| i t i t i d  y| i |  i |  i f  z| i d  {xo {d od || i t  }| i   \ } } ~| i d  d G| GHt |  } |  i |  q Wd  S(   Ni   i   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   set_timeouts   Nones   accepts   conns   addrs   MyConnections
   connections   handleConnection(   s   selfs   addrs
   connections   ss   conn(    (    s   ./spkproxy.pys   runss   %+ 
c  	  s_   t  | |  i d |  i |  i |  i |  i f d |  i |  i	 |  i
 f } | 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   handleConnection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   spkProxy5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(9   s   sockets   syss	   threadings   Threads   strings   oss   OpenSSLs   SSLs   getopts   paths   appends	   ntlmutilss   str2unicodes   ntlm_messagess
   ntlm_procss   spikeProxyUIs   daveutils   times   timeoutsockets   setDefaultSocketTimeouts   versionchecks   VERSIONs   default404stringlists   restrictedhostss   restrictedpagess   denied1s   lens   deniedstrings   MyConnections   headers   bodys   spkProxyConnections   spkProxys   usages   __name__s
   getversions   signals   SIGINTs   exits   apps   argvs   optss   argss   GetoptErrors   os   as   setSSLProxyHosts   setSSLProxyPorts   setProxyHosts   setProxyPorts   setPorts   ints   setNTLMUsers   setNTLMDomains   setNTLMPasswords   setListenHosts   run(!   s   bodys   as   argss   default404stringlists   Threads   strings   apps   timeoutsockets   MyConnections   restrictedhostss   spikeProxyUIs   headers   VERSIONs   deniedstrings   denied1s   versionchecks   syss   sockets   signals   spkProxys   daveutils   ntlm_messagess   os   SSLs
   ntlm_procss   str2unicodes   restrictedpagess   times   usages   getopts   oss   spkProxyConnections   opts(    (    s   ./spkproxy.pys   ? s   					X  u  W	&

 