
    gCS             
          S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJrJ	r	  S SK
JrJrJrJr  S SKJr  S SKJr  S SKJr  S SKrS SKJr  S SKJr  S S	KJrJrJr  S S
KJr  S SKJr  S SKJ r   S SKJ!r!  S SK"J#r#  S SK$r$S SK%J&r&J'r'J(r(  S SK)J*r*  S SK+J,r,J-r-J.r.J/r/  S SK0J1r1  S SK2J3r3  S SK2J4r4  S SK5J6r6  S SK7J8r8  S SK9r9Sr:Sr;Sr<Sr=SSSSSSSSSS.	r>SSSSSSSSS.r?1 Skr@SrAS\A-  rBSrCS rD\8" \ES 9rFS! rGS" rHS# rI " S$ S%\J5      rK " S& S'\L5      rMS( rNS) rO " S* S+\L5      rP " S, S-\L5      rQ " S. S/\L5      rR " S0 S1\R5      rSGSS2 jrTS3 rUS4 rVS5 rW " S6 S7\L5      rXGSS8 jrY0 S9S:_S;S<_S=S<_S>S<_S?S<_S@S<_SAS:_SBS<_SCS<_SDS<_SES<_SFS<_SGS:_SHS:_SIS<_SJS:_rZ0 SKSL_SMSN_SOSP_SQSR_SSST_SUSV_SWSX_SYSZ_S[S\_S]S^_S_S`_SaSb_ScSd_SeSf_SgSh_SiSj_SkSl_0 SmSn_SoSp_SqSr_SsSt_SuSv_SwSx_SySz_S{S|_S}S~_SS_SS_SS_SS_SSX_SS_SSZ_SS_E0 SS_SS_SS_SS_SS_SS_SS_SSl_SSn_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_ESSSSSSSSS.Er[S r\S r]GSS jr^GSS jr_         GSS jr`S raS rbGS  rc\" GSGS5      rdGS re GSGS jrfGS rgGS rhGS riGSGS jrjGS	 rkGSGS
 jrl GSGS jrmGS rnGS roGS rp GSGS jrq " GS GS\L5      rrGS rsGS rtGS ruGS rvGS rwGS rxg(      N)ECHILDESRCH)OrderedDictCounterdefaultdict
namedtuple)query)traffic_packets)SamDB)LdbError)ClientConnection)securitydrsuapilsa)netlogon)netr_Authenticator)srvsvc)samr)
drs_DsBind)CredentialsDONT_USE_KERBEROSMUST_USE_KERBEROS)system_session)UF_NORMAL_ACCOUNTUF_SERVER_TRUST_ACCOUNTUF_TRUSTED_FOR_DELEGATIONUF_WORKSTATION_TRUST_ACCOUNT)SEC_CHAN_BDC)gensec)sd_utils)
get_string)get_samba_logger   ga2U0*3?-      ?)	dns0smb0x72ldapr(   r-   3r-   2cldapr/   dcerpc11r5   14nbnsr(   )r'   1r-   r<   r-   4r-   5r3   rA   r5   12r5   13r5   15>   r*   smb2browsersmb_netlogong      $@)i)namec                     U [         ::  aE  U(       d  [        U[        R                  S9  g[        U[	        U5      -  [        R                  S9  gg)a}  Print a formatted debug message to standard error.


:param level: The debug level, message will be printed if it is <= the
              currently set debug level. The debug level can be set with
              the -d option.
:param msg:   The message to be logged, can contain C-Style format
              specifiers
:param args:  The parameters required by the format specifiers
fileN)DEBUG_LEVELprintsysstderrtuple)levelmsgargss      7/usr/lib/python3/dist-packages/samba/emulate/traffic.pydebugrZ   e   s9     #CJJ'#d##**5	     c                  4   [         R                  " SS9n[        SUS   S   < SUS   S   < S3S[        R                  S9  U  H  n[        U[        R                  S	9  M     [        [        R                  S	9  [        R                  R                  5         g
)zKPrint an unformatted log message to stderr, containing the line number
    r#   )limit r   z	:[01;33m   z [00m)endrP   rO   N)	tracebackextract_stackrR   rS   rT   flush)rX   tbas      rY   debug_linenorf   w   sv     
	 	 q	)B	!!uQxAq39<zz acjj! 	szzJJr[   c                 n   ^ U (       a)  SnU  H  nUS-  nX-  nUS-  nM     SSU-   -  mU4S jnU$ S nU$ )zReturn a function that prints a coloured line to stderr. The colour
of the line depends on a sort of hash of the integer arguments.      z
[38;5;%dm   c                  l   > [         S:  a)  U  H"  n[        T< U< S3[        R                  S9  M$     g g )Nr   z[00mrO   rQ   rR   rS   rT   )rX   re   prefixs     rY   prandom_colour_print.<locals>.p   s,    QAFA6SZZH  r[   c                  \    [         S:  a"  U  H  n[        U[        R                  S9  M     g g )Nr   rO   rl   )rX   re   s     rY   rn   ro      s&    QA!#**-  r[    )seedssxrn   rm   s       @rY   random_colour_printru      sY     AGAFAHA  !BF+	I H	.
 Hr[   c                       \ rS rSrSrg)FakePacketError   rq   N)__name__
__module____qualname____firstlineno____static_attributes__rq   r[   rY   rw   rw      s    r[   rw   c                   p    \ rS rSrSrSrS r\S 5       rSS jr	S r
S rS	 rS
 rS rS rS rSS jrSrg)Packet   zDetails of a network packet
	timestampip_protocolstream_numbersrcdestprotocolopcodedescextra	endpointsc
                    Xl         X l        X0l        X@l        XPl        X`l        Xpl        Xl        Xl        U R                  U R                  :  a  U R                  U R                  4U l	        g U R                  U R                  4U l	        g Nr   )
selfr   r   r   r   r   r   r   r   r   s
             rY   __init__Packet.__init__   si    "&*	 	
88dii"hh		2DN"ii2DNr[   c                     UR                  S5      R                  S5      nUS S u  nnnnnnn	n
USS  n[        U5      n[        U5      n[        U5      nU " X4XVUXX5	      $ )N
	   )rstripsplitfloatint)clslinefieldsr   r   r   r   r   r   r   r   r   s               rY   	from_linePacket.from_line   s    T"((. 								qr
)$	#h4y9=tT2 	2r[   c                    SR                  U R                  5      nU R                  U-   nUSUU R                  U R                  =(       d    SU R
                  U R                  U R                  U R                  U R                  U4	-  4$ )z5Format the packet as a traffic_summary line.
        r   z%f	%s	%s	%d	%d	%s	%s	%s	%s )
joinr   r   r   r   r   r   r   r   r   )r   time_offsetr   ts       rY   
as_summaryPacket.as_summary   s~     		$**%NN[(7!!##)r	 	 		r[   c                 :   SU R                   U R                  U R                  U R                  =(       d    SU R                  U R
                  U R                  U R                  U R                  (       a$  SSR                  U R                  5      -   S-   4	-  $ S4	-  $ )Nz:%.3f: %d -> %d; ip %s; strm %s; prot %s; op %s; desc %s %sr$      «r^      »r   )
r   r   r   r   r   r   r   r   r   r   r   s    rY   __str__Packet.__str__   s    L499d6F6F6M###T]]DKK8<

$$**--4MM 	N IKMM 	Nr[   c                     SU -  $ )Nz<Packet @%s>rq   r   s    rY   __repr__Packet.__repr__   s    $$r[   c                     U R                  U R                  U R                  U R                  U R                  U R
                  U R                  U R                  U R                  U R                  5	      $ r   )
	__class__r   r   r   r   r   r   r   r   r   r   s    rY   copyPacket.copy   sU    ~~dnn".."00"hh"ii"mm"kk"ii"jj* 	*r[   c                 @    U R                   < SU R                  < 3nU$ )N:r   r   )r   r   s     rY   as_packet_typePacket.as_packet_type   s    }}dkk2r[   c                     U R                   U R                  4nU[        ;   a	  [        U   $ U[        ;   a
  [        U   * $ g)zA positive number means we think it is a client; a negative number
means we think it is a server. Zero means no idea. range: -1 to 1.
        )r   r   CLIENT_CLUESSERVER_CLUES)r   keys     rY   client_scorePacket.client_score   sB     }}dkk*,$$, %%%r[   c           
         SU R                   < SU R                  < 3n [        [        U5      nU R                   S:w  a  [        SSUR                  < S	U< 35        [        R                  " 5       n U" XU5      (       aJ  [        R                  " 5       nXv-
  n[        S
XqR                  U R                   U R                  U4-  5        gg! [         a4  n[        SUR                  < SU< 3[        R                  S9   SnAgSnAff = f! [         aS  n[        R                  " 5       nXv-
  n[        SXqR                  U R                   U R                  X4-  5         SnAgSnAff = f)zSend the packet over the network, if required.

Some packets are ignored, i.e. for  protocols not handled,
server response messages, or messages that are generated by the
protocol layer associated with other packets.
packet__zConversation(z) Missing handler rO   Nkerberosr#   z) Calling handler z%f	%s	%s	%s	%f	True	z%f	%s	%s	%s	%f	False	%s)r   r   getattrr
   AttributeErrorrR   conversation_idrS   rT   rZ   time	Exception)	r   conversationcontextfn_namefnestartr`   durations	            rY   playPacket.play  s?    %)MM4;;?	'2B ==J&!"22G= > 			.$g.. iik;288$--{{H.. / /  	//:zz# 		,  	.))+C{H144dmm;;-- . .	.s1   C 4AD 
D*DD
E+A	E&&E+c                 4    U R                   UR                   -
  $ r   r   r   others     rY   __cmp__Packet.__cmp__+  s    ~~//r[   Nc                 B    [        U R                  U R                  5      $ r   )is_a_real_packetr   r   )r   missing_packet_statss     rY   is_really_a_packetPacket.is_really_a_packet.  s    t{{;;r[   )
r   r   r   r   r   r   r   r   r   r   )r   r   )ry   rz   r{   r|   __doc__	__slots__r   classmethodr   r   r   r   r   r   r   r   r   r   r}   rq   r[   rY   r   r      sT    %	I3  2 2& N%	*	&.P0<r[   r   c                     U [         ;   a  gU S:X  a  US:X  a  gSU < SU< 3n[        [        US5      nUc&  [        R	                  SU-  [
        R                  S9  gU[        R                  L a  gg	)
z\Is the packet one that can be ignored?

If so removing it will have no effect on the replay
Fr-   r   r   r   Nzmissing packet %srO   T)SKIPPED_PROTOCOLSr   r
   LOGGERrZ   rS   rT   null_packet)r   r   r   r   s       rY   r   r   2  sp    
 $$6fl (&1G	'4	0B	z(72D	_(((r[   c                 6    U S:X  a  gX4S;   a  g[        X5      $ )zReturn true if a packet generates traffic in its own right. Some of
these will generate traffic in certain contexts (e.g. ldap unbind
after a bind) but not if the conversation consists only of these packets.
waitF)r   r   r0   rG   r5   16)r   r   s     rY   is_a_traffic_generating_packetr   H  s/    
 6  
 H--r[   c                       \ rS rSrSrSSSSSSSSSS\R                  R                  S5      SS4S jrS r	S r
S rS	 rS
 rS rSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrS rS rS rS rSrg)ReplayContextiZ  a7  State/Context for a conversation between an simulated client and a
server. Some of the context is shared amongst all conversations
and should be generated before the fork, while other context is
specific to a particular conversation and should be generated
*after* the fork, in generate_process_local_config().
NDOMAINc                    Xl         S U l        X0l        X l        U(       a  [        U l        O[        U l        Xl        Xl        Xl	        Xl
        Xpl        Xl        UR                  S5      U l        Xl        XPl        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        X@l        U R5                  5         g )NrealmF)servernetlogon_connectioncredslpr   kerberos_stater   oubase_dndomainstatsdirglobal_tempdir
domain_sidgetr   instance_idbadpassword_frequencylast_lsarpc_badlast_lsarpc_named_badlast_simple_bind_badlast_bind_badlast_srvsvc_badlast_drsuapi_badlast_netlogon_badlast_samlogon_badtotal_conversationsgenerate_ldap_search_tables)r   r   r   r   r  r   prefer_kerberostempdirr   r   r   r   r   r   s                 rY   r   ReplayContext.__init__a  s     )/(, (-
(*"3D"3D(*(/(.(0(/(2(*w
(3 )>"(-(-"(-!(-(-(-(-(-(; ((*r[   c                 r   [        5       n[        SU R                  -  UU R                  U R                  S9nUR                  UR                  5       [        R                  S/S/S9n0 nS/ 0nU H  n[        UR                  5      nSR                  S UR                  S5       5       5      R                  5       nUR                  U/ 5      n	U	R                  U5        UR!                  S	5      (       d  M  US   R                  U5        M     [#        UR%                  5       5       Hu  n
U
S
S  S:w  a  M  U
S S
 nUS
S  S:X  a  US S
 nUS
S  S:X  a  M  ['        S5       H:  nUS-  nX:w  a'  X;   a"  [)        SU
< SU< 3[*        R,                  S9  M4  XJ   XK'   M<     Mw     X@l        XPl        0 U l        UR                  UR                  5       [        R                  S/SS9nSR                  S U 5       5      nSR5                  U5      U R2                  S'   SnS H%  nUSR5                  XR                  5       5      -  nM'     SR5                  U5      U R2                  S'   SU R2                  S'   UR                  S[        R6                  S/S9nSR5                  US   S   5      U R2                  S'   g ) N	ldap://%s)urlsession_infocredentialsr   zpaged_results:1:1000dn)scopecontrolsattrsinvocationId,c              3   F   #    U  H  oR                  5       S S v   M     g 7f)Nr#   )lstrip.0rt   s     rY   	<genexpr><ReplayContext.generate_ldap_search_tables.<locals>.<genexpr>  s     E}!xxz"1~}s   !zCN=NTDS Settings,rL   z,DC   zdn_map collision r^   rO   z"(objectclass=groupPolicyContainer))r  r  
expressionr   c              3   J   #    U  H  nS R                  US   5      v   M     g7f)z(distinguishedName={0})r  N)format)r  rW   s     rY   r  r    s%     XTWS6==c$iHHTWs   !#z(|{0})gPCFileSysPath)zDomain Controllers,ztraffic_replay,r   z(distinguishedName={0}{1})gpLinkz'(objectCategory=pKICertificateTemplate)pKIExtendedKeyUsagehighestCommittedUSN)r  r  z(usnChanged>={0})r   
usnChanged)r   r   r   r   r   search	domain_dnldbSCOPE_SUBTREEstrr  r   r   upper
setdefaultappend
startswithlistkeysrangerR   rS   rT   dn_mapattribute_clue_mapsearch_filtersr  
SCOPE_BASE)r   sessiondbresr.  r/  rr  patternr'   krn   i
gpos_by_dnou_strr   s                   rY   r  )ReplayContext.generate_ldap_search_tables  s    "{T[[0 '#zzgg
 ii!//"8!9#f  & B
 AQTTBhhErxx}EEKKMG##GR0CJJrN}}011">299"=  fkkm$Av#2ABC&E/crF BC&E/1XU
6aka;"zz+"I	  % "4
 ! iic.?.?v#G  IWWXTWXX
 19
0K,- @B299"llnMMF A(0(?H%
 6 	12
 ii#..9N8OiP&&s1v.C'DE 	L)r[   c                     U R                   R                  5        H  nXA;   d  M
  U R                   U   s  $    US:X  a=  [        R                  " 5       U R                  -  n[	        U R
                  U5      nSU-  $ g)NzDC,DCz((&(sAMAccountName=%s)(objectClass=user))z(objectClass=*))r0  r,  randomr  	user_namer   )r   r  dn_sigr  r   random_user_idaccount_names          rY   guess_search_filter!ReplayContext.guess_search_filter  su     &&++-C|**3// . W#]]_t/G/GGN$T%5%5~FL=LL !r[   c                 4   / U l         / U l        / U l        / U l        / U l        / U l        / U l        UR                  U l        UR                  U l        UR                  U l	        UR                  U l
        [        U R                  SUR                  -  5      U l        U R                  R!                  SU R                  5        U R                  R!                  SU R                  5        U R                  R!                  SU R                  5        U R                  R!                  SS5        SU l        SU R                  < S	U R$                  < 3U l        SU R                  < S	U R$                  < 3U l        U R+                  5         U R-                  5         g )
Nzconversation-%dzprivate dirzlock dirzstate directoryztls verify peerno_checkz/root/ncalrpc_as_systemcn=r  )ldap_connectionsdcerpc_connectionslsarpc_connectionslsarpc_connections_nameddrsuapi_connectionssrvsvc_connectionssamr_contextsnetbios_namemachinepassusernameuserpassmk_masked_dirr   r   r  r   setremoteAddressr   samlogon_dnuser_dngenerate_machine_credsgenerate_user_creds)r   accountr   s      rY   generate_process_local_config+ReplayContext.generate_process_local_config  sB   (*(*(*(*%(* (*(*(/(<(<(/(;(;(/(8(8(/(8(8$T%8%8%6%1%A%A&BC 	M4<<0J-%t||4%z26#00$'';  $}}dgg7 	##%  "r[   c                     U(       dB  U R                   (       a/  [        R                  " 5       U R                   :  a   U" U5        SnOSnU" U5      nXT4$ ! [         a     Nf = f)a  Execute the supplied logon function, randomly choosing the
bad credentials.

Based on the frequency in badpassword_frequency randomly perform the
function with the supplied bad credentials.
If run with bad credentials, the function is re-run with the good
credentials.
failed_last_time is used to prevent consecutive bad credential
attempts. So the over all bad credential frequency will be lower
than that requested, but not significantly.
TF)r   r=  r   )r   fgoodbadfailed_last_timeresults         rY   with_random_bad_credentials)ReplayContext.with_random_bad_credentials  sf      **$"<"<<cF
 $( #( 4)) !  s   A 
A"!A"c                 >   [        5       U l        U R                  R                  U R                  5        U R                  R	                  U R
                  5        U R                  R                  U R                  5        U R                  R                  U R                  5        U R                  R                  U R                  5        U R                  R                  U R                  5        [        5       U l        U R                  R                  U R                  5        U R                  R	                  U R
                  5        U R                  R                  U R                  SS 5        U R                  R                  U R                  5        U R                  R                  U R                  5        [        5       U l        U R                  R                  U R                  5        U R                  R	                  U R
                  5        U R                  R                  U R                  5        U R                  R                  U R                  5        U R                  R!                  U R                  R#                  5       [$        R&                  -  5        U R                  R                  U R                  5        U R                  R)                  U R*                  5        [        5       U l        U R,                  R                  U R                  5        U R,                  R	                  U R
                  5        U R,                  R                  U R                  SS 5        U R,                  R                  U R                  5        U R,                  R!                  U R,                  R#                  5       [$        R&                  -  5        U R,                  R                  U R                  5        U R,                  R)                  U R*                  5        g)a  Generate the conversation specific user Credentials.

Each Conversation has an associated user account used to simulate
any non Administrative user traffic.

Generates user credentials with good and bad passwords and ldap
simple bind credentials with good and bad passwords.
N)r   
user_credsguessr   set_workstationrN  set_passwordrQ  set_usernamerP  
set_domainr   set_kerberos_stater   user_creds_badsimple_bind_credsset_gensec_featuresget_gensec_featuresr   FEATURE_SEALset_bind_dnrV  simple_bind_creds_badr   s    rY   rX  !ReplayContext.generate_user_creds1  s    &-dgg&''(9(9:$$T]]3$$T]]3""4;;/**4+>+>?)m!!$''*++D,=,=>((s);<((7..t/B/BC "-$$TWW-..t/@/@A++DMM:++DMM:22""6686;N;NN	P11$2E2EF**4<<8%0]"""((1""2243D3DE""//cr0BC""//>""66&&::< 	! 	""55d6I6IJ""..t||<r[   c                    [        5       U l        U R                  R                  U R                  5        U R                  R	                  U R
                  5        U R                  R                  [        5        U R                  R                  U R                  5        U R                  R                  U R
                  S-   5        U R                  R                  U R                  5        U R                  R                  U R                  5        [        5       U l        U R                  R                  U R                  5        U R                  R	                  U R
                  5        U R                  R                  [        5        U R                  R                  U R                  SS 5        U R                  R                  U R
                  S-   5        U R                  R                  U R                  5        g)zGenerate the conversation specific machine Credentials.

Each Conversation has an associated machine account.

Generates machine credentials with good and bad passwords.
$Nre  )r   machine_credsrg  r   rh  rN  set_secure_channel_typer   ri  rO  rj  rk  r   rl  r   machine_creds_badr   s    rY   rW  $ReplayContext.generate_machine_creds_  si    )]  )**4+<+<=22<@''(8(89''(9(9C(?@%%dkk2--d.A.AB!,$$TWW-..t/@/@A66|D++D,<,<Sb,AB++D,=,=,CD11$2E2EFr[   c                 8   U R                   R                  U5      nU(       a  [        R                  " U5      $ UR	                  5       nU(       a@  XR
                  ;   a#  [        R                  " U R
                  U   5      $ USS  nU(       a  M@  U R                  $ )N   )r/  r   r=  choicer'  r.  r   )r   r6  
attributes	attr_clues       rY   get_matching_dnReplayContext.get_matching_dnx  sz     ++//
;	==++--/++%}}T[[%9::abkG	 g ||r[   c                     SnU R                   (       a  U(       d  U R                   S   $ [        SU R                  -  US4U R                  5      nU R                   R	                  U5        U$ )Nz$12345678-1234-abcd-ef00-01234567cffbzncacn_ip_tcp:%sr_   )rH  r   r   r   r)  )r   newguidcs       rY   get_dcerpc_connection#ReplayContext.get_dcerpc_connection  s_    5""3**2...<"AY1&&q)r[   c                   ^  T R                   (       a  U(       d  T R                   S   $ U 4S jnT R                  UT R                  T R                  T R                  5      u  nT l        T R                   R                  U5        U$ )Nr  c                 b   > [         R                   " STR                  -  TR                  U 5      $ Nzncacn_np:%s)r   r   r   r   r   s    rY   connect4ReplayContext.get_srvsvc_connection.<locals>.connect  s)    ==$++!>!%!&( (r[   )rL  rb  rf  rm  r   r)  r   r  r  r  s   `   rY   get_srvsvc_connection#ReplayContext.get_srvsvc_connection  sw    ""3**2..	( ,,W-1__-1-@-@-1-A-AC 	"D  	&&q)r[   c                   ^  T R                   (       a  U(       d  T R                   S   $ U 4S jnT R                  UT R                  T R                  T R                  5      u  nT l        T R                   R                  U5        U$ )Nr  c                 r   > Sn[         R                  " STR                  < SU< S3TR                  U 5      $ )Nzschannel,seal,signncacn_ip_tcp:[]r   lsarpcr   r   )r   binding_optionsr   s     rY   r  4ReplayContext.get_lsarpc_connection.<locals>.connect  s1    2O::#{{O="gg#% %r[   )rI  rb  rw  ry  r   r)  r  s   `   rY   get_lsarpc_connection#ReplayContext.get_lsarpc_connection  sy    ""3**2..	% ,,W-1-?-?-1-C-C-1-A-AC 	"D  	&&q)r[   c                   ^  T R                   (       a  U(       d  T R                   S   $ U 4S jnT R                  UT R                  T R                  T R                  5      u  nT l        T R                   R                  U5        U$ )Nr  c                 b   > [         R                  " STR                  -  TR                  U 5      $ r  r  r  s    rY   r  ?ReplayContext.get_lsarpc_named_pipe_connection.<locals>.connect  s)    ::mt{{;"gg#% %r[   )rJ  rb  rw  ry  r   r)  r  s   `   rY    get_lsarpc_named_pipe_connection.ReplayContext.get_lsarpc_named_pipe_connection  sy    ((0044	% ,,W-1-?-?-1-C-C-1-G-GI 	(D& 	%%,,Q/r[   c                 0  ^  T R                   (       a  U(       d  T R                   S   nU$ U 4S jnT R                  UT R                  T R                  T R                  5      u  nT l        [        U5      u  pgXV4nT R                   R                  U5        U$ )zget a (drs, drs_handle) tupler  c                 v   > SnSTR                   < SU< S3n[        R                  " UTR                  U 5      $ )Nsealr  r  r  )r   r   r   )r   r  binding_stringr   s      rY   r  :ReplayContext.get_drsuapi_connection_pair.<locals>.connect  s/    $O"kk?<N??>477EBBr[   )rK  rb  rf  rm  r   r   r)  )r   r  unbindr  r  drs
drs_handlesupported_extensionss   `       rY   get_drsuapi_connection_pair)ReplayContext.get_drsuapi_connection_pair  s    ##C((,AH	C ,,W-1__-1-@-@-1-B-BD 	%d# .8_*  ''*r[   c                   ^  T R                   (       a  U(       d  T R                   S   $ U 4S jnU 4S jnU(       a;  T R                  UT R                  T R                  T R                  5      u  nT l        O:T R                  UT R
                  T R                  T R                  5      u  nT l        T R                   R                  U5        U$ )Nr  c                 H   > [        STR                  -  U TR                  S9$ )z
To run simple bind against Windows, we need to run
following commands in PowerShell:

    Install-windowsfeature ADCS-Cert-Authority
    Install-AdcsCertificationAuthority -CAType EnterpriseRootCA
    Restart-Computer

z
ldaps://%sr  r   r   r   r   r  s    rY   simple_bind6ReplayContext.get_ldap_connection.<locals>.simple_bind  s'     3%* GG% %r[   c                 H   > [        STR                  -  U TR                  S9$ )Nr	  r  r  r  s    rY   	sasl_bind4ReplayContext.get_ldap_connection.<locals>.sasl_bind  s%    t{{2%* GG% %r[   )	rG  rb  rn  rs  r   rf  rm  r   r)  )r   r  simpler  r  samdbs   `     rY   get_ldap_connection!ReplayContext.get_ldap_connection  s      ((,,	%	% 00151G1G151K1K151J1JL /UD- 0015151D1D151C1CE (UD& 	$$U+r[   c                     U R                   (       a  U(       aB  U R                   R                  [        U R                  U R                  U R
                  S95        U R                   S   $ )N)r   r   r  )rM  r)  SamrContextr   r   r   )r   r  s     rY   get_samr_contextReplayContext.get_samr_context  sK    !!S%%DKKDGG4::FH!!"%%r[   c                    ^  T R                   (       a  T R                   $ U 4S jnT R                  UT R                  T R                  T R                  5      u  nT l        UT l         U$ )Nc                 b   > [         R                   " STR                  -  TR                  U 5      $ )Nzncacn_ip_tcp:%s[schannel,seal])r   r   r   r  s    rY   r  6ReplayContext.get_netlogon_connection.<locals>.connect  s/    $$%E&*kk&3%)WW%*, ,r[   )r   rb  rw  ry  r  )r   r  r  s   `  rY   get_netlogon_connection%ReplayContext.get_netlogon_connection  sf    ##+++	, ,,W-1-?-?-1-C-C-1-C-CE 	$D"
 $% r[   c                     U R                   S4$ )NAr   r   s    rY   guess_a_dns_lookup ReplayContext.guess_a_dns_lookup$  s    

C  r[   c                     U R                   R                  5       n[        5       n[        US   5      UR                  l        US   Ul        [        5       nX#4$ )N
credentialr   )rw  new_client_authenticatorr   r+  creddatar   )r   authcurrent
subsequents       rY   get_authenticatorReplayContext.get_authenticator'  sR    !!::<%' l!34 -')
$$r[   c                     [         R                  R                  U R                  U5      n[	        US5      nUR                  5        H  u  pE[        U< SU< 3US9  M     UR                  5         g)zWrite arbitrary key/value pairs to a file in our stats directory in
order for them to be picked up later by another process working out
statistics.wz: rO   N)ospathr   r   openitemsrR   close)r   filenamekwargsr]  r7  vs         rY   write_statsReplayContext.write_stats0  sR     77<<x83LLNDAa#!, #		r[   )/r/  r   r   r   rH  r.  r   r   rK  r   r   r   r   r   r   r   r  r  r   r   rG  r   rI  rJ  rw  ry  rO  rN  r   r   r   rT  rU  rM  r0  r   rn  rs  rL  r   r  r  rf  rm  rV  rP  rQ  r   )F)FF)ry   rz   r{   r|   r   r  environr   r   r  rB  rZ  rb  rX  rW  r  r  r  r  r  r  r  r  r  r  r  r  r}   rq   r[   rY   r   r   Z  s     %)'+!%

x0 !*+XPFn!$#>*8,=\G2,$($.$L&$!%r[   r   c                   .    \ rS rSrSrSS jrS rS rSrg)	r  i;  z5State/Context associated with a samr connection.
    Nc                     S U l         S U l        S U l        S U l        S U l        S U l        S U l        Xl        X l        X0l	        g r   )

connectionhandledomain_handler   group_handleuser_handleridsr   r   r   )r   r   r   r   s       rY   r   SamrContext.__init__>  sE    !!!!!!!	#"
r[   c                     U R                   (       d<  [        R                  " SU R                  -  U R                  U R                  S9U l         U R                   $ )Nzncacn_ip_tcp:%s[seal])lp_ctxr  )r  r   r   r   r   r   s    rY   get_connectionSamrContext.get_connectionJ  s?    "ii'4;;7ww JJ(DO
 r[   c                     U R                   (       d5  U R                  5       nUR                  S [        R                  5      U l         U R                   $ r   )r  r  Connect2r   SEC_FLAG_MAXIMUM_ALLOWED)r   r  s     rY   
get_handleSamrContext.get_handleS  s9    {{##%A**T8+L+LMDK{{r[   )
r  r   r  r   r  r  r   r  r   r  NN)	ry   rz   r{   r|   r   r   r  r  r}   rq   r[   rY   r  r  ;  s    
#r[   r  c                       \ rS rSrSr  SS jrS rS r SS jrS r	\	r
S	 rS
 rS rS rSS jrSS jrS rS rSrg)ConversationiZ  zADetails of a converation between a simulated client and a server.Nc                     Xl         X l        / U l        [        U5      U l        SU l        X@l        U H  nU R                  " U6   M     g )Nr   )
start_timer   packetsru   rW   client_balancer   add_short_packet)r   r  r   seqr   rn   s         rY   r   Conversation.__init__\  sE    $"&y1!.A!!1% r[   c                     U R                   c  UR                   c  ggUR                   c  gU R                   UR                   -
  $ )Nr   r  r_   )r  r   s     rY   r   Conversation.__cmp__g  sB    ??"'#!1!111r[   c                    UR                  5       nU R                  c  UR                  U l        U R                  c  UR                  U l        UR                  U R                  :w  a'  [	        SU R                  < SUR                  < 35      eU=R                  U R                  -  sl        UR
                  UR                  S   :X  a$  U =R                  UR                  5       -  sl        O#U =R                  UR                  5       -  sl        UR                  5       (       a  U R                  R                  U5        gg)zeAdd a packet object to this conversation, making a local copy with
a conversation-relative timestamp.NzConversation endpoints z don't matchpacket endpoints r   )r   r  r   r   rw   r   r  r   r   r  r)  )r   packetrn   s      rY   
add_packetConversation.add_packetp  s     KKM??"kkDO>>![[DN;;$..(!#'>>1;;#@ A A 	
t&55AKKN"1>>#331>>#33!!LL" "r[   c                 *   U(       a  [        X#5      (       d  gU R                  5       u  pxU(       d  XpX#4n	[        R                  U	S5      n
[        R                  US5      n[        XR                  -
  USXxX#X5	      nUR                  UR                  S   :X  a$  U =R                  UR                  5       -  sl	        O#U =R                  UR                  5       -  sl	        UR                  5       (       a  U R                  R                  U5        gg)zCreate a packet from a timestamp, and 'protocol:opcode' pair, and a
(possibly empty) list of extra data. If client is True, assume
this packet is from the client to the server.
Nr   06r   )r   guess_client_serverOP_DESCRIPTIONSr   IP_PROTOCOLSr   r  r   r   r  r   r   r  r)  )r   r   r   r   r   clientskip_unused_packetsr   r   r   r   r   r  s                rY   r  Conversation.add_short_packet  s     '7'I'I,,.	 ""3+"&&x6	OO3[C $7 ::))!,,6#6#6#886#6#6#88$$&&LL' 'r[   c                 v    SU R                   U R                  U R                  [        U R                  5      4-  $ )Nz-<Conversation %s %s starting %.3f %d packets>)r   r   r  lenr  r   s    rY   r   Conversation.__str__  s5    ?%%t~~tT\\"$$ 	%r[   c                 ,    [        U R                  5      $ r   )iterr  r   s    rY   __iter__Conversation.__iter__  s    DLL!!r[   c                 ,    [        U R                  5      $ r   )r
  r  r   s    rY   __len__Conversation.__len__  s    4<<  r[   c                     [        U R                  5      S:  a  gU R                  S   R                  U R                  S   R                  -
  $ )Nr#   r   r  )r
  r  r   r   s    rY   get_durationConversation.get_duration  s>    t||q ||B))DLLO,E,EEEr[   c                 v    U R                    Vs/ s H  oR                  U R                  5      PM     sn$ s  snf r   )r  r   r  )r   rn   s     rY   replay_as_summary_lines$Conversation.replay_as_summary_lines  s)    7;||D|!T__-|DDDs   $6c                    U R                   n[        R                  " 5       U-
  nXE-
  nU[        -
  nUS:  a  [        R                  " U5        [        R                  " 5       U-
  U-
  nU R	                  SX4-  5        Sn	Sn
[        R                  " 5       nU R
                   H  n[        R                  " 5       U-
  nX\R                  -
  nXi:  a  Un	US:  a^  U* [        -
  nUS:  aN  [        R                  " U5        [        R                  " 5       U-
  nXLR                  -
  U
:  a  XLR                  -
  n
UR                  X5        M     XU
4$ )zEReplay the conversation at the right time.
(We're already in a fork).r   zstarting %s [miss %.3f]r   )r  r   SLEEP_OVERHEADsleeprW   r  r   r   )r   r   r   rY  r   nowgap
sleep_timemissmax_gapmax_sleep_missp_startrn   s                rY   replay_with_delayConversation.replay_with_delay  s    OOiikE!g>)
>JJz"		e#q(*d\9:))+A))+'C#C}Qw!TN2
>JJz*		g-A;;7)*[[FF4!  n,,r[   c                 z    U R                   u  p#U R                  S:  a  X#4$ U R                  S:X  a  X:X  a  X#4$ X24$ )zXHave a go at deciding who is the server and who is the client.
returns (client, server)
r   )r   r  )r   server_cluere   bs       rY   r   Conversation.guess_client_server  sG     ~~"6M
 !#(86Mvr[   c                     U R                    Vs/ s H!  o1UR                  s=::  a  U::  d  M  O  M  UPM#     snU l         U R                   (       a  U R                   S   R                  U l        gSU l        gs  snf )zyPrune any packets outside the time window we're interested in

:param s: start of the window
:param e: end of the window
r   Nr  r   r  )r   rs   r   rn   s       rY   forget_packets_outside_window*Conversation.forget_packets_outside_window  sX     $(<<I<a3Hq3H3H<I7;||$,,q/33 Js   A7A7A7c                     U R                    H  nU=R                  U-  sl        M     U R                  b  U =R                  U-  sl        gg)z=Adjust the packet start times relative to the new start time.Nr*  )r   r  rn   s      rY   renormalise_timesConversation.renormalise_times  s=    AKK:%K  ??&OOz)O 'r[   )r  r   r   rW   r  r  )NNrq   N)TTr  r   )ry   rz   r{   r|   r   r   r   r  r  r   r   r  r  r  r  r#  r  r+  r.  r}   rq   r[   rY   r  r  Z  s\    K<>!%	&2#6 ;?(8%
 H"!F
E!-F"N*r[   r  c                   <    \ rS rSrSrS	S jrS rS	S jrS	S jrSr	g)
	DnsHammeri  zKA lightweight conversation that generates a lot of dns:0 packets on
the flyNc                    [        X-  5      n[        U5       Vs/ s H  n[        R                  " SU5      PM     snU l        U R                  R                  5         Xl        X l        SU l        U R                  US9U l
        g s  snf )Nr   
query_file)r   r-  r=  uniformtimessortrater   r  _get_query_choicesquery_choices)r   dns_rater   r4  nr8  s         rY   r   DnsHammer.__init__  so    #$;@8D8afnnQ18D


	 !44
4K Es   !Bc                 `    S[        U R                  5      U R                  U R                  4-  $ )Nz-<DnsHammer %d packets over %.1fs (rate %.2f)>)r
  r6  r   r8  r   s    rY   r   DnsHammer.__str__  s)    ?TZZ$--;< 	=r[   c                    U(       a  [        US5       nUR                  5       nSSS5        / nWR                  5        Hg  nUR                  5       nU(       d  M  UR	                  S5      (       a  M4  UR                  S5      n[        U5      S:X  d   eUR                  U5        Mi     U$ / SQ$ ! , (       d  f       N= f)z
Read dns query choices from a file, or return default

rname may contain format string like `{realm}`
realm can be fetched from context.realm
r5  N#r     )
)r   {realm}r  yes)r_   rC  NSrD  )r#   	*.{realm}r  no)r|  rF  rE  rG  )
   _msdcs.{realm}r  rD  )   rI  rE  rD  )   nx.realm.comr  rG  )   rL  rE  rG  )   *.nx.realm.comr  rG  )   rO  rE  rG  )r  read
splitlinesstripr*  r   r
  r)  )r   r4  r]  textchoicesr   rX   s          rY   r9  DnsHammer._get_query_choices  s     j#&!vvx 'G)zz|4 4 4::c?Dt9>)>NN4( * N  '&s   B00
B>c           
         U(       d   eUR                   (       d   e[        R                  " 5       nU R                   H  n[        R                  " 5       U-
  nX4-
  nU[        -
  nUS:  a  [        R                  " U5        [
        R                  " U R                  5      u  pxpUR                  UR                   S9nSn[        R                  " 5       n [        X5      nU
S:X  a  [        U5      (       d  Sn[        R                  " 5       nX-
  n[        SXX4-  5        M     g ! [         a    Sn N<f = f! [        R                  " 5       nX-
  n[        SXX4-  5        f = f)Nr   r  TrD  Fz%f	DNS	dns	%s	%f	%s	)r   r   r6  r  r  r=  r}  r:  r  	dns_queryr
  r   rR   )r   r   r   r   r  r  r  r   rnamertypeexistsuccesspacket_startanswersr`   r   s                   rY   replayDnsHammer.replay3  s*   w}}}		A))+%C'C~-JA~

:&*0--8J8J*K'F5LLw}}L5EG99;L
W#E1E>#g,,#G iik-2c85UUV+       iik-2c85UUVs$   #D''D63D95D66D99+E$)r   r:  r8  r  r6  r   )
ry   rz   r{   r|   r   r   r   r9  r_  r}   rq   r[   rY   r1  r1    s    L=BWr[   r1  c                    [        [        5      n/ nU  H  n[        U[        5      (       a  [	        U5      n[        SUR                  < 3[        R                  S9  U HW  n[        R                  U5      nUR                  S:X  a  US:w  a  X&R                  ==   S-  ss'   MF  UR                  U5        MY     UR                  5         M     U(       d  / S4$ [        S U 5       5      n[!        S U 5       5      n[        S	[        R                  S9  [#        5       n	[%        U5       Hc  u  pU=R&                  U-  sl        U	R)                  UR*                  5      nUc  [-        U
S
-   S9nXUR*                  '   UR/                  U5        Me     / nU	R1                  5        H%  n[3        U5      S:w  d  M  UR                  U5        M'     [5        X-
  5      n[3        U	5      U-  nXX4$ )zLLoad a summary traffic summary file and generated Converations from it.
    z
Ingesting rO   r'   includer_   r   c              3   8   #    U  H  oR                   v   M     g 7fr   r   r  rn   s     rY   r  #ingest_summaries.<locals>.<genexpr>e  s     2'Q[['   c              3   8   #    U  H  oR                   v   M     g 7fr   r   rd  s     rY   r  re  f  s     37akk7rf  z$gathering packets into conversationsr#   )r   )r   r   
isinstancer&  r  rR   rM   rS   rT   r   r   r   r   r)  r  minmaxr   	enumerater   r   r   r  r  valuesr
  r   )filesdns_mode
dns_countsr  r]  r   rn   r  last_packetconversationsr8  r  conversation_listr   mean_intervals                  rY   ingest_summariesrt  O  s    S!JGaQA(szz:D  &AzzU"x9'<88$)$q!  	
	  1u2'22J3733K	
0szzBMM'"	z!akk*9a!e5A)*!++&	Q # !!#q6Q;$$Q' $ [-.H&1MXAAr[   c                     [        5       nU  H  nUR                  UR                  5        M      U(       a  UR                  S5      S   $ g )Nr_   r   )r   updater   most_common)rq  	addressesr  s      rY   guess_server_addressry    sC    	I% $$Q'** r[   c                 f    0 nU R                  5        H  u  p#SR                  U5      nX1U'   M     U$ Nr   )r  r   )rt   yr7  r  k2s        rY   stringify_keysr~    s4    
A	YYq\"  Hr[   c                     0 nU R                  5        H,  u  p#[        [        U5      R                  S5      5      nX1U'   M.     U$ r{  )r  rU   r&  r   )rt   r|  r7  r  r   s        rY   unstringify_keysr    s>    
A	#a&,,t$%!  Hr[   c                   b    \ rS rSrSS jrSS jrS rS r     SS jrS r	S	 r
  SS
 jrSrg)TrafficModeli  c                 t    0 U l         0 U l        Xl        [        [        5      U l        SU l        SS/U l        g )Nr   r   r_   )ngramsquery_detailsr<  r   r   dns_opcountscumulative_durationpacket_rate)r   r<  s     rY   r   TrafficModel.__init__  s7    ',#& q6r[   Nc           
         Uc  0 nSnSn[         4U R                  S-
  -  n[        U5      nUR                  5        H  u  pxU R                  U==   U-  ss'   M     [        U5      S:  an  US   R                  n	Sn
U	S-   nU H3  nU
[        U5      -  n
[        XR                  S   R                  5      nM5     XR                  S'   X-
  U R                  S'   U GHb  nUR                  U5      u  pXLR                  5       -  n[         4U R                  S-
  -  nU GH  nUR                  U:w  a  M  UR                  U-
  nUR                  nU[        :  a^  S[        R                   " [        SU["        -  5      5      -  nU R$                  R'                  U/ 5      R)                  U5        USS  U4-   nUR+                  5       nU R,                  R'                  U/ 5      R)                  [/        UR0                  5      5        U R$                  R'                  U/ 5      R)                  U5        USS  U4-   nGM     GMe     U =R2                  U-  sl        U R$                  R'                  U/ 5      R)                  [         5        g )Nr   r_   r   g?r  wait:%dr%   )
NON_PACKETr<  ry  r  r  r
  r  rj  r  r   r  r  r  r   WAIT_THRESHOLDmathlog
WAIT_SCALEr  r(  r)  r   r  rU   r   r  )r   rq  r  prevcum_durationr   r   r7  r  firsttotallastr  r  rn   elapsedr   short_ps                     rY   learnTrafficModel.learn  sJ   Lmtvvz*%m4 &&(DAa A%  ) }!!!$//EE3;D"Q42!8!89 # #(Q"&,DQA226:NFNN,,L-466A:.C55F?++,{{^+$S5<z5I2K )L MDKK**33::4@ab'TG+C**,""--g.0228&qww2H&&sB/66w?!"g
*# 	 . 	  L0 sB'..z:r[   c                    0 nU R                   R                  5        H,  u  p4SR                  U5      n[        [	        U5      5      X#'   M.     0 nU R
                  R                  5        H"  u  p4[        [	        S U 5       5      5      XS'   M$     UUU R                  U R                  [        S.nU R                  US'   [        U[        5      (       a  [        US5      n[        R                  " XaSS9  g )Nr   c              3   V   #    U  H  nU(       a  S R                  U5      OSv   M!     g7f)r   r$   N)r   r  s     rY   r  $TrafficModel.save.<locals>.<genexpr>  s&      ,856 =>DIIaL3,F56s   '))r  r  r  r  versionr'   r  r#   )indent)r  r  r   dictr   r  r  r  CURRENT_MODEL_VERSIONr  rh  r&  r  jsondump)r   r]  r  r7  r  r  ds          rY   saveTrafficModel.save  s    KK%%'DA		!AWQZ(FI ( &&,,.DA#G ,856,8 %8  9M /
 *#'#;#;++,
 $$%aQA		!q!r[   c           	      R   [        U[        5      (       a  [        U5      n[        R                  " U5      n US   nU[
        :  a  [        SU[
        4-  5      e US   R                  5        H  u  pE[        [        U5      R                  S5      5      nU R                  R                  U/ 5      nUR                  5        H#  u  pxUR                  [        U5      /U-  5        M%     UR                  5         M     US   R                  5        H  u  pEU R                  R                  [        U5      / 5      nUR                  5        HX  u  pxUS:X  a  UR                  S/U-  5        M"  UR                  [        [        U5      R                  S5      5      /U-  5        MZ     UR                  5         M     S	U;   a3  US	   R                  5        H  u  pEU R                   U==   U-  ss'   M     US
   U l        US   U l        g ! [         a    [        S[
        -  5      ef = f)Nr  z4the model file is version %d; version %d is requiredz=the model file lacks a version number; version %d is requiredr  r   r  r$   rq   r'   r  r  )rh  r&  r  r  loadREQUIRED_MODEL_VERSION
ValueErrorKeyErrorr  rU   r   r  r(  extendr7  r  r  r  r  )	r   r]  r  r  r7  r  rl  rn   counts	            rY   r  TrafficModel.load  s   aQAIIaL		;	lG//  ":")+A!B"C D D 0 hK%%'DAc!fll4()A[[++Ar2FGGIs1vh./ &KKM ( o&,,.DA''223q62>FGGI8MM2$,/MM5Qd);#<"="EF	 &
 KKM / A:%(!!!$)$ ) $%%:#; ]+5  	;  ":"8": ; ;	;s   #H	 	H&c                    / n[         4U R                  S-
  -  nUc  US-
  n [        R                  " U R                  R                  U[         45      5      nU[         :X  au  X:  a   U$ [        R                  " 5       U:  a  [        SXu4-  [        R                  S9   U$ S[        R                  " SS5      -  n[        SU-  [        R                  S9  XR                  ;   a$  [        R                  " U R                  U   5      n	O/ n	UR                  S	S5      u  pU
S
:X  aF  [        U5      [        R                  " 5       -   n[        R                  " U5      [        U-  -  nX-  nOW[        R                   " ["        6 n[        R                  " U5      U-  nX-  nUb  X:  a   U$ X:  a  UR%                  XX45        USS U4-   nUS   SS S:X  a#  US   SS S:X  a  [         4U R                  S-
  -  nGM  )zEConstruct an individual conversation packet sequence from the
model.
r_   Nz"ending after %s (persistence %.1f)rO   r  r     ztrying %s instead of endr   r   zwait:r  )r  r<  r=  r}  r  r   rR   rS   rT   	randranger  r   r   r  expr  r5  NO_WAIT_LOG_TIME_RANGEr)  )r   r   	hard_stopreplay_speedignore_beforepersistencer  r   rn   r   r   r   log_wait_timer   log_waits                  rY   construct_conversation_sequence,TrafficModel.construct_conversation_sequence  s    mtvvz* %MMdkkoocJ=ABAJ,F E ==?[0>#ASS"zz+> ;  0 0B 770143::F&&&d&8&8&;< wwsAH6! #Ffmmo =xx.*|2KL!	!>>+ABxx)L8!	(Y-B  -HHi6ABab'QD.C2wr{g%#b'"1+*@ "mtvvz2K r[   c                 ,    U R                   u  p#X-  U-  $ r   r  )r   scalerate_nrate_ts       rY   scale_to_packet_rate!TrafficModel.scale_to_packet_rateO  s    **~&&r[   c                 ,    U R                   u  p#X-  U-  $ r   r  )r   ppsr  r  s       rY   packet_rate_to_scale!TrafficModel.packet_rate_to_scaleS  s    **v%%r[   c                    SU-  n[        X-  5      n/ nSnX:  aq  [        R                  " U* U5      n	U R                  U	UUSUS9n
U
 H  u  pp[	        X5      (       d  M    O   MP  UR                  U
5        U[        U
5      -  nX:  a  Mq  U R                  U5      n[        SX[        U5      X4-  [        R                  S9  UR                  5         U$ )z<Generate a list of conversation descriptions from the model.	   r   )r  r  r  r  zGwe have %d packets (target %d) in %d conversations at %.1f/s (scale %f)rO   )r   r=  r5  r  r   r)  r
  r  rR   rS   rT   r7  )r   r  r   r  r  lead_intarget_packetsrq  	n_packetsr   r  r   r   r   r   r  s                   rY   generate_conversation_sequences,TrafficModel.generate_conversation_sequencesW  s     h,[34	(NNG8X6E44U?GBNCDAL	 5 NA 782	V1(CC 78   #QI% (( ))+6 (#m:L*33 ::	 	r[   )r  r  r<  r  r  r  )r|  r   )r   Nr_   r   r   )r_   r   )ry   rz   r{   r|   r   r  r  r  r  r  r  r  r}   rq   r[   rY   r  r    sH    "0;d"2&,P 9<26566745	4l'& ST45%r[   r  c                     / nU  H6  nU(       d  M  [        US   S   X4U5      nUS-  nUR                  U5        M8     U$ )Nr   r_   )r  r)  )r  r   r  rq  rs   r  s         rY   seq_to_conversationsr    sN    M1QqT!Wv&6:AaKF  #	 
 r[   r'   r6   rpc_netlogonr  r   r*   rI   r-   r3   r  r   r5   epmr   rJ   rK   r   r:   )rJ   0x01zHost Announcement (0x01))rJ   0x02zRequest Announcement (0x02))rJ   0x08zBrowser Election Request (0x08))rJ   0x09zGet Backup List Request (0x09))rJ   0x0cz$Domain/Workgroup Announcement (0x0c))rJ   0x0fz Local Master Announcement (0x0f)r2   searchRequestrB   searchResDone)r5   r(   Requestr4   BindrC   Bind_ackrE   Bind_nakr7   Alter_contextrG   Alter_context_respr   AUTH3)r5   r1   Responser&   r	   r;   response)r   r(   DsBind)r   rD   DsCrackNames)r   rF   DsWriteAccountSpn)r   r<   DsUnbind)r   r1   DsReplicaSync)r   r/   DsGetNCChanges)r   r?   DsReplicaUpdateRefs)r  r/   Mapr   r   r,   bindRequestr=   bindResponser0   unbindRequestr.   r>   searchResEntryr@   )r-   r   z*** Unknown ***)r  r8   lsa_LookupNames)r  rH   lsa_LookupSids)r  39lsa_QueryTrustedDomainInfoBySid)r  40lsa_SetTrustedDomainInfo)r  6lsa_OpenPolicy)r  76lsa_LookupSids3)r  77lsa_LookupNames4r9   )r:   r<   )r  21NetrLogonDummyRoutine1)r  26NetrServerAuthenticate3)r  29NetrLogonGetDomainInfo)r  30NetrServerPasswordSet2)r  r  NetrLogonSamLogonEx)r  r  DsrEnumerateDomainTrusts)r  45NetrLogonSamLogonWithFlags)r  r?   NetrServerReqChallenge)r   r(   Connect)r   r   GetAliasMembership)r   17LookupNames)r   18
LookupRids)r   19	OpenGroup)r   r<   Close)r   25QueryGroupMember)r   34OpenUser)r   36QueryUserInfo)r   r  GetGroupsForUser)r   r/   QuerySecurity)r   rA   LookupDomain)r   64Connect5)r   r  EnumDomains)r   7
OpenDomain)r   8QueryDomainInfo)r*   0x04zClose (0x04))r*   0x24zLocking AndX (0x24))r*   0x2ezRead AndX (0x2e))r*   0x32zTrans2 (0x32))r*   0x71zTree Disconnect (0x71)r)   zNegotiate Protocol (0x72))r*   0x73zSession Setup AndX (0x73))r*   0x74zLogoff AndX (0x74))r*   0x75zTree Connect AndX (0x75))r*   0xa2zNT Create AndX (0xa2))rI   r(   NegotiateProtocol)rI   r6   Ioctl)rI   r8   Find)rI   r   GetInfo)rI   r  Break)rI   r<   SessionSetup)rI   r1   SessionLogoff)rI   r/   TreeConnectTreeDisconnectCreateReadz$SAM LOGON request from client (0x12)z3SAM Active Directory Response - user unknown (0x17)NetShareGetInfoNetSrvGetInfo))rI   r?   )rI   rA   )rI   r  )rI   r  )rK   0x12)rK   0x17)r   r   )r   r  c                     U R                  SS5      u  pV[        R                  XV4S5      n[        R                  US5      nXSX#XVU/n	U	R	                  U5        SR                  U	5      $ )Nr   r_   r   r  r   )r   r  r   r  r  r   )
rn   r   r   r   r   r   r   r   r   r   s
             rY   expand_short_packetr:    se    wwsAH126D""8T2KB8TJDKK99T?r[   c                     [         R                  R                  5         [         R                  R                  5         [        R
                  " S5        g)zSignal handler closes standard out and error.

Triggered by a sigterm, ensures that the log messages are flushed
to disk and not lost.
r   N)rS   rT   r  stdoutr  _exit)signalframes     rY   flushing_signal_handlerr@    s/     JJJJHHQKr[   c                    US-  [         R                  " SS5      -   n[        R                  R	                  5         [        R
                  R	                  5         [        R                  " 5       nUS:w  a  U$  [         R                  " U5        XT4nSn	U S   S   n
[        XXS9n[        R                  " [        R                  [        5        UR                  X;5        [        R                  R                  5         [        R                  " S5        [        R                   R#                  UR$                  SUR&                  -  5      n[)        US5      n [        R                  R                  5         [        R                  " S5        U[        l        [0        R0                  " 5       U-
  nX-
  nU[2        -
  nUS:  a  [0        R4                  " U5        UR7                  UUS
9u  nnn[9        SU-  5        [9        SU-  5        [9        SU-  5        [        R
                  R                  5         [        R                  R                  5         [        RB                  " U	5        g	! [*         a#  n[,        R/                  SU-  5         S	nAGNS	nAff = f! [:         ax    Sn	[9        S[        R<                  " 5       W4-  [        R
                  S9  [>        R@                  " [        R
                  5        [        R
                  R	                  5          GNf = f! [        R
                  R                  5         [        R                  R                  5         [        RB                  " W	5        f = f)z8Fork a new process and replay the conversation sequence.  r   i  )r  r   zstats-conversation-%dr  r_   stdout closing failed with %sN)r   r   zMaximum lag: %fzStart lag: %fzMax sleep miss: %fz*EXCEPTION in child PID %d, conversation %srO   )"r=  randintrS   r<  rc   rT   r  forkseedr  r>  SIGTERMr@  rZ  stdinr  r  r   r   r   r  IOErrorr   infor   r  r  r#  rR   r   getpidra   	print_excr=  )csr   r   rY  	client_id	server_idrF  pidr   statusr   r  r  r]  r   r  r  r  max_lag	start_lagr!  s                        rY   replay_seq_in_forkrT    s    tfnnQ44D JJJJ
'')C
ax

*D*	qE!H2Ifnn&=>--g9		
77<< 0 02I ! 1 132 33	=JJHHQK 
iikE!g>)
>JJz"-.-@-@uIP .A .R*N')*o	)*"^34 	




3  	=KK7!;<<	=   ;ryy{A>NN::	CJJ'

 	




sR   8CJ 4I( B
J (
J2J
J JJ A>LL LL AM1c                    [         R                  R                  5         [         R                  R                  5         [        R
                  " 5       nUS:w  a  U$ [         R                  R                  5         [        R                  " S5         [         R                  R                  5         [        R                  " S5        [        R                  R                  UR                  S5      n[        US5      [         l         Sn[        R                  " [        R                   ["        5        [%        XUS9nUR'                  US9  [         R                  R                  5         [         R                  R                  5         [        R2                  " U5        g ! [         a"  n[        R                  SU-  5         S nANS nAff = f! [(         aW    Sn[+        S[        R,                  " 5       -  [         R                  S	9  [.        R0                  " [         R                  5         Nf = f! [         R                  R                  5         [         R                  R                  5         [        R2                  " W5        f = f)
Nr   r_   rC  z	stats-dnsr  r3  )r   z)EXCEPTION in child PID %d, the DNS hammerrO   )rS   r<  rc   rT   r  rE  rH  r  rI  r   warnr  r   r   r  r>  rG  r@  r1  r_  r   rR   rK  ra   rL  r=  )	r;  r   r   r4  rP  r   r  rQ  hammers	            rY   dnshammer_in_forkrX  R  s   JJJJ
'')C
ax
IIOOHHQK9


 ww||G,,k:Hh$CJfnn&=>8*Eg& 	




%  93a7889  (:biikJ::	CJJ'	( 	




s?   4F AG	 
G$GG	AH*'H- )H**H- -AJc
                     [        SUUU[        U 5      S.U
D6n[        U5      [        U 5      :  a"  [        S[        U5      [        U 5      4-  5      e[        R                  " 5         [        U 5      S-  n[
        R
                  " 5       U-   nUc  U S   S   S   U-   n[        SU-  [        R                  S9  [        SX|-   -  [        R                  S9  [        S	U-  [        R                  S9  X-   S
-   n[        R                  S[        U 5      U4-  5        UR                  S[        U 5      [        S U  5       5      S9  0 n U(       a  [        XWUUS9nSUU'   [        U 5       H#  u  nnUU   nUS-   n[        UXUU5      nUUU'   M%     [
        R
                  " 5       n[        SUU-
  U-   UU-
  4-  [        R                  S9  [
        R
                  " 5       U:  a  U(       a  [
        R                   " S5         [        R"                  " S[        R$                  5      u  nnU(       aQ  UR-                  US 5      n[.        S:  a'  [        SUU[        U5      4-  [        R                  S9  U	(       a  US:w  a  O"[
        R
                  " 5       U:  a	  U(       a  M  UR                  S[        U5      S9  S GH  n[        S[        U5      U4-  [        R                  S9  U H  n [        R6                  " UU5        M     [
        R                   " S5        [
        R
                  " 5       S-   nU(       a   [        R"                  " S[        R$                  5      u  nnWS:w  a  UR-                  US 5      nUc`  [        SU-  5        [        R                  R;                  5         [        R<                  R;                  5         [        R>                  " S5        [        SUU[        U5      4-  [        R                  S9  [
        R
                  " 5       U:  a  O	U(       a  M  U(       d    O[
        R                   " S5        GM     U(       a$  [        S[        U5      -  [        R                  S9   [        R@                  " SS5        g ! [&         a!  nUR(                  [*        :w  a  e  S nAGM  S nAff = f! [0         a1    [        S[        R                  S9  [2        R4                  " 5          GNYf = f! [&         a!  nUR(                  [8        :w  a  e  S nAGM<  S nAff = f! [&         a   nUR(                  [*        :w  a  e  S nAGNS nAff = f! [B         a    [        S[        R                  S9   g f = f! UR                  S[        U5      S9  S GH  n[        S[        U5      U4-  [        R                  S9  U HH  n [        R6                  " UU5        M  ! [&         a   nUR(                  [8        :w  a  e  S nAMB  S nAff = f   [
        R                   " S5        [
        R
                  " 5       S-   nU(       Ga   [        R"                  " S[        R$                  5      u  nnO,! [&         a  nUR(                  [*        :w  a  e  S nAOS nAff = fWS:w  a  UR-                  US 5      nUc`  [        SU-  5        [        R                  R;                  5         [        R<                  R;                  5         [        R>                  " S5        [        SUU[        U5      4-  [        R                  S9  [
        R
                  " 5       U:  a  O
U(       a  GM  U(       d    O[
        R                   " S5        GM     U(       a$  [        S[        U5      -  [        R                  S9   [        R@                  " SS5        f ! [B         a    [        S[        R                  S9   f f = f= f) N)r   r   r   r  z(we have %d accounts but %d conversationsg{Gz?r  r   zWe will start in %.1f secondsrO   zWe will stop after %.1f secondszruntime %.1f secondsr%   z6Replaying traffic for %u conversations over %d seconds
intentionsc              3   8   #    U  H  n[        U5      v   M     g 7fr   )r
  r  s     rY   r  replay.<locals>.<genexpr>  s     +M<LqCFF<Lrf  )Planned_conversationsPlanned_packetsr3  r_   r#   z,all forks done in %.1f seconds, waiting %.1fg~jth?z-process %d finished conversation %d; %d to gozEXCEPTION in parent
unfinished)Unfinished_conversations)   ra  r  zkilling %d children with -%d      ?zchildren is %s, no pid foundz)kill -%d %d KILLED conversation; %d to goz%d children are missingzignoring fake ^Crq   )"r   r
  r  r  setpgrpr   rR   rS   rT   r   rJ  r  sumrX  rk  rT  r  waitpidWNOHANGOSErrorerrnor   poprQ   r   ra   rL  killr   rc   r<  r=  killpgKeyboardInterrupt)conversation_seqhostr   r   accountsr;  dns_query_filer   latency_timeoutstop_on_any_errorr  r   delayr   r`   childrenrP  r8  rM  rY  rN  r   rQ  r   r  rs   s                             rY   r_  r_  t  s     &4"'!034D0E& %	&G 8}s+,,Dx=#.>*?@A C 	C
 JJL  !D(EIIK%E $B'+A.@	
)E
1zz	
+x/?
@zz	
 8
+zz 
S
 C
KKH!"H-. / .12B.C(++M<L+M(M  O HY7#H/=?CHSM/0EArqkGAI$R)LC%HSM	 1 IIK<5y5 !e),-::	 iikCHJJu jjRZZ8V
 LLd+? 'CM23:=**F %1 iikCHH* 	L58] 	 	D A1M1%&-0ZZ9GGCO   JJsO))+/C"$**R"<KC !8 S$/Ay<xGH

((*

((* &sCM23  #zz+ 99;#%% (( JJqMC F +c(m;zz#	7IIaOC  77f$  ##**5  ww%' (  ww&( )@ ! 	7$3::6	7c 	L58] 	 	D A1M1%&-0ZZ9GGCO ww%' (   JJsO))+/C"$**R"<KC ww&( ) !8 S$/Ay<xGH

((*

((* &sCM23  #zz+ 99;#%% (( JJqMC F +c(m;zz#	7IIaO  	7$3::6	7s%  
B:S (R -AS V  S 2T(T2 U 
S"R>7S ;V >SS 7T=V  TV 
T/T**T/2
U<UU"VVA_=W,*_=,
X6X_=X;_=(Y;:_=;
Z$	Z	_=Z$	$C_=-A_==__="_:7_=9_::_=c                 <    [        5       n[        SU -  US/UUS9nU$ )Nr	  zmodules:paged_searches)r
  r  optionsr  r   )r   r   )rn  r   r   r2  r$  s        rY   openLdbrw    s1    G
K$&$12!	C
 Jr[   c                 .    SUU R                   " 5       4-  $ )z(Generate an ou name from the instance idz#ou=instance-%d,ou=traffic_replay,%s)r#  )r$  r   s     rY   ou_namery    s"    0K47MMO4E E Er[   c                 L   [        X5      n U R                  " UR                  SS5      S   SS.5         U R                  " USS.5        U$ ! [         a  nUR                  u  pEUS:w  a  e  SnAN<SnAff = f! [         a   nUR                  u  pEUS:w  a  e  SnAU$ SnAff = f)zCreate an ou, all created user and machine accounts will belong to it.

This allows all the created resources to be cleaned up easily.
r  r_   organizationalunit)r  objectclassD   N)ry  addr   r   rX   r$  r   r   r   rQ  r   s         rY   	create_our    s    
 
	"BrxxQ'* 46 	7r 46 	7 I  ffR<   ffR< Is.   (A A9 
A6A11A69
B#BB#ConversationAccounts)rN  rO  rP  rQ  c                     / n[        SUS-   5       H7  n[        X5      n[        X5      n[        XcUU5      nUR	                  U5        M9     U$ )z;Generate a series of unique machine and user account names.r_   )r-  machine_namer>  r  r)  )	r$  r   numberpasswordro  r8  rN  rP  rY  s	            rY   generate_replay_accountsr  ;  sV     H1fqj!#K3[,&|x'/1  " Or[   c                     [        X5      nSU< SU< 3nS[        U5      -  R                  S5      nU(       a  [        [        [
        -  5      nO[        [        5      nU R                  " USSU-  UUS.5        g)	z"Create a machine account via ldap.rF  r  "%s"	utf-16-lecomputerz%s$r  r|  sAMAccountNameuserAccountControl
unicodePwdN)ry  r!   encoder&  r   r   r   r~  )	r$  r   rN  rO  traffic_accountr   r  utf16pwaccount_controlss	            rY   create_machine_accountr  I  s     
	"B#R	(B
;//77DG 86 7 8 ;<GG!,..  r[   c                    [        X5      nSU< SU< 3nS[        U5      -  R                  S5      nU R                  " USU[	        [
        5      US.5        [        R                  " U 5      nUR                  US5        g)	zCreate a user account via ldap.rF  r  r  r  userr  z(A;;WP;;;PS)N)	ry  r!   r  r~  r&  r   r    SDUtilsdacl_add_ace)r$  r   rP  rQ  r   rV  r  sdutilss           rY   create_user_accountr  b  sx    		"B$b)G
8,,44[AGGG"!"34  s#G.1r[   c                 Z    [        X5      nSU< SU< 3nU R                  " USUS.5        g)zCreate a group via ldap.rF  r  group)r  r|  r  N)ry  r~  )r$  r   rM   r   r  s        rY   create_groupr  t  s2     
	"BR	 BGG r[   c                     SX4-  $ )z-Generate a user name based in the instance idz
STGU-%d-%drq   r   r8  s     rY   r>  r>        ;***r[   c                     U R                   " SR                  U5      U/S9nU Vs1 s H  n[        XB   5      iM     sn$ s  snf )z(Search objectclass, return attr in a setz(objectClass={}))r  r  )r"  r  r&  )r$  r|  attrobjsobjs        rY   search_objectclassr    sC    ::%,,[9fD '++dsC	Nd+++s   A c                     [        U SS9nSn[        USS5       HJ  n[        X5      nXt;  d  M  [        XXs5        US-  nUS-  S:X  d  M1  [        R                  SXR4-  5        ML     U$ )zAdd users to the serverr  r|  r   r  r_   2   zCreated %u/%u users)r  r-  r>  r  r   rJ  )r$  r   r  r  existing_objectsusersr8  rM   s           rY   generate_usersr    sp    )#6BE61b!('$AQJErzQ1UOCD " Lr[   c                 (    U(       a  SX4-  $ SX4-  $ )z1Generate a machine account name from instance id.z
STGM-%d-%dzPC-%d-%drq   )r   r8  r  s      rY   r  r    s%     {... [,,,r[   c                     [        U SS9nSn[        USS5       HP  n[        XU5      nUS-   U;  d  M  [        XXU5        US-  nUS-  S:X  d  M7  [        R                  SXb4-  5        MR     U$ )	z"Add machine accounts to the serverr  r  r   r  rv  r_   r  zCreated %u/%u machine accounts)r  r-  r  r  r   rJ  )	r$  r   r  r  r  r  addedr8  rM   s	            rY   generate_machine_accountsr    s     *#:FE61b!KO<#:--"3T#24QJErzQ<NO " Lr[   c                     SX4-  $ )z'Generate a group name from instance id.z
STGG-%d-%drq   r  s     rY   
group_namer    r  r[   c                     [        U SS9nSn[        USS5       HJ  n[        X5      nXc;  d  M  [        XU5        US-  nUS-  S:X  d  M1  [        R                  SXB4-  5        ML     U$ )z3Create the required number of groups on the server.r  r  r   r  r_   rB  zCreated %u/%u groups)r  r-  r  r  r   rJ  )r$  r   r  r  groupsr8  rM   s          rY   generate_groupsr    sr    )#7CF61b!+)'40aKF}!2f5EEF " Mr[   c                     [        X5      n U R                  " US/5        g! [         a  nUR                  u  pEUS:w  a  e  SnAgSnAff = f)z7Remove the created accounts and groups from the server.ztree_delete:1    N)ry  deleter   rX   r  s         rY   clean_up_accountsr    sL    		"B

2() ffR< s   " 
AAAc	                 4   Sn	Sn
Sn[        X5        [        R                  S5        [        XX25      n[        R                  S5        [	        XXrU5      nUS:  a!  [        R                  S5        [        XU5      n
US:  aV  [        R                  S5        [        UU
UUUU5      n[        R                  S5        [        XU5        UR                  5       n	U
S:  a   US:X  a  XJ:w  a  [        R                  S5        [        R                  SXU
U	4-  5        g	)
zMGenerate the required users and groups, allocating the users to
those groups.r   zGenerating dummy user accountsz!Generating dummy machine accountszGenerating dummy groupszAssigning users to groupszAdding users to groupsz(The added groups will contain no membersz:Added %d users (%d machines), %d groups and %d membershipsN)
r  r   rJ  r  r  r  GroupAssignmentsadd_users_to_groupsr  warning)r$  r   r  number_of_usersnumber_of_groupsgroup_membershipsmax_membersmachine_accountstraffic_accountsmemberships_addedgroups_addedcomputers_addedusers_addedassignmentss                 rY   generate_users_and_groupsr    s    LOc
KK01 ?MK
KK34/0@0@BO !-.&s9IJ1/0&'7'3'6'2'8'24 	,-Ck:'--/q[A-'AB
KKL|"$$ %r[   c                   V    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)r  i
  c                     SU l         U R                  U5        U R                  X55        X`l        [	        [
        5      U l        U R                  XUXE5        g )Nr   )r  generate_group_distributiongenerate_user_distributionr  r   r+  r  assign_groups)r   r  r  r  r  r  r  s          rY   r   GroupAssignments.__init__  sQ     
(()9:''K&&t,+?&	;r[   c                 r    / n[        U5      nUS:X  a  g SnU H  nXE-  nUR                  XC-  5        M     U$ )Nr   r   )rd  r)  )r   weightsdistr  
cumulativeprobabilitys         rY   cumulative_distribution(GroupAssignments.cumulative_distribution  sI     GA:
"K%JKK
*+ # r[   c                     US:  a  SnOUS:  a  SnOUS:  a  SnOSn/ n[        SUS-   5       H*  n[        R                  " U5      nUR                  U5        M,     U R	                  U5      U l        g	)
zAProbability distribution of a user belonging to a group.
        i@KL g      @i g      @i g      @g      ?r_   N)r-  r=  paretovariater)  r  	user_dist)r   	num_usersnum_membershipsshaper  rt   rn   s          rY   r  +GroupAssignments.generate_user_distribution'  sz     W$Ew&Ev%EEq)a-(A$$U+ANN1 )
 55g>r[   c                     / n[        SUS-   5       H  nSUS-  -  nUR                  U5        M     X l        U R                  U5      U l        g)z6Probability distribution of a group containing a user.r_   g?N)r-  r)  group_weightsr  
group_dist)r   r<  r  rt   rn   s        rY   r  ,GroupAssignments.generate_group_distributionA  sP    
 q!a%AQVANN1 !
 %66w?r[   c                     [         R                   " U R                  [        R                  " 5       5      n[         R                   " U R                  [        R                  " 5       5      nX4$ )z2Returns a randomly generated user-group membership)bisectr  r=  r  r   r  r  s      rY   generate_random_membership+GroupAssignments.generate_random_membershipO  s@     }}T^^V]]_=doov}}?{r[   c                      U R                   U   $ r   )r  )r   r  s     rY   users_in_groupGroupAssignments.users_in_group[  s    &&r[   c                 6    U R                   R                  5       $ r   )r  r,  r   s    rY   
get_groupsGroupAssignments.get_groups^  s    $$&&r[   c                     [        U R                  U   5      nX2:  aX  [        R                  SR	                  X5      5        SU R
                  US-
  '   U R                  U R
                  5      nX@l        gg)z?Prevent the group's membership from exceeding the max specifiedzGroup {0} has {1} membersr   r_   N)r
  r  r   rJ  r  r  r  r  )r   r  r  num_membersnew_dists        rY   cap_group_membership%GroupAssignments.cap_group_membershipa  sk    $**512%KK3::5NO -.Duqy)33D4F4FGH&O &r[   c                     XR                   U   ;  a3  U R                   U   R                  U5        U =R                  S-  sl        U R                  (       a  U R	                  X R                  5        g g )Nr_   )r  r)  r  r  r  r  s      rY   add_assignmentGroupAssignments.add_assignmentm  s_     ''..U#**40JJ!OJ %%e-=-=> r[   c                    US::  a  g[         R                  " [        U5      [        U5      [        U5      -  -  5      nU R                  (       a  [	        UU R                  U-  5      nX4-
  S-
  nX-
  S-
  nU R                  5       U:  aK  U R                  5       u  pX:  d  X:  a  U R                  US-   U	S-   5        U R                  5       U:  a  MJ  gg)zAllocate users to groups.

The intention is to have a few users that belong to most groups, while
the majority of users belong to a few groups.

A few groups will contain most users, with the remaining only having a
few users.
r   Nr_   )r  ceilr   r  ri  r  r  r  )
r   r  r  r  r  r  existing_usersexisting_groupsr  r  s
             rY   r  GroupAssignments.assign_groupsy  s     ! !II#$;%"88:;  #$5$($4$47G$G!I *8A=*9A=jjl..99;KD&$*? ##D1Heai8 jjl..r[   c                     U R                   $ r   r  r   s    rY   r  GroupAssignments.total  s    zzr[   )r  r  r  r  r  r  N)ry   rz   r{   r|   r   r  r  r  r  r  r  r  r  r  r  r}   rq   r[   rY   r  r  
  s;    	;"?4@
''
'
?9Br[   r  c                 l   UR                  5       nSnSnUR                  5        H  nUR                  U5      n[        U5      S:X  a  M%  [	        S[        U5      S5       HM  nXxUS-    n	[        XXi5        U[        U	5      -  nUS-  nUS-  S:X  d  M4  [        R                  SXS4-  5        MO     M     g)zDTakes the assignments of users to groups and applies them to the DB.r   rB  r_   r  zAdded %u/%u membershipsN)r  r  r  r
  r-  add_group_membersr   rJ  )
r3  r   r  r  r  r  r  r  chunkchunk_of_userss
             rY   r  r    s     EEE'')$33E:~!#
 1c.148E+%$,?NbuES((EQJErzQ5FG 9 *r[   c                 l  ^
 [        X5      m
U
4S jnU" [        X5      5      n[        R                  " 5       n[        R                  " X5      Ul        U HJ  nU" [        X5      5      nS[        U5      -   n	[        R                  " U[        R                  S5      Xi'   ML     U R                  U5        g)z(Adds the given users to group specified.c                    > SU < ST< 3$ )NrF  r  rq   )rM   r   s    rY   build_dn#add_group_members.<locals>.build_dn  s    !2&'r[   zmember-memberN)ry  r  r$  MessageDnr  r>  r&  MessageElementFLAG_MOD_ADDmodify)r3  r   r  r  r  group_dnmr  rV  idxr   s             @rY   r  r    s     
	!B( 
;67HA66"AD9[78#d)###GS-=-=xH 
 IIaLr[   c                 \   [         R                  R                  nSnSnSn0 n[        5       n[	        5       nUb  UR
                  n	OS n	U	" S5        SSSS.n
SSSS.n[        R                  " U 5       GH  n[        R                  R                  X5      n[        US5       nU H  n UR                  S5      R                  S	5      nUS
   nUS   nUS   n[        US   5      n[        US   5      n[        UU-
  U5      n[        UU5      nUU4nUR                  U/ 5      R!                  U5        US   S:X  a  US
-  nOUS
-  nUU==   S
-  ss'   UR#                  U5        U	" U5        M     SSS5        GM
     X2-
  nUS:X  a  SnOUU-  nUS:X  a  SnOUU-  n[/        U5      n[+        SU-  5        [+        SUU4-  5        [+        SUU4-  5        [1        U
R3                  5       5       H)  u  nn[+        SUR5                  SS5      S-   U4-  5        M+     [1        UR3                  5       5       H)  u  nn[+        SUR5                  SS5      S-   U4-  5        M+     [+        S5        0 nU H-  u  nnUU;  a  [	        5       UU'   UU   R#                  U5        M/     [1        UR7                  5       5      n U  H  n[1        UU   [8        S9n!U! H  nUU4nUU   n"[1        U"5      n"[/        U"5      n#UU   n[;        U"5      U#-  n$[=        U"S5      n%[=        U"S5      n&U"S   U"S   -
  n'U"S   n([>        RA                  US5      n)[+        SUUU)U#UU$U%U&U'U(4
-  5        M     M     g! [$        [&        4 a    SU;   a{  UR                  SS
5      u  nnUU
;   a  [        [        U5      U
U   5      U
U'    GM  UU;   a  [        [)        U5      UU   5      UU'    GM9  [+        U[         R,                  S9   GMU  [+        U[         R,                  S9   GMq  f = f! , (       d  f       GM  = f) z/Generate and print the summary stats for a run.r   Nc                     g r   rq   )rt   s    rY   twgenerate_stats.<locals>.tw  s    r[   z2time	conv	protocol	type	duration	successful	error
)zMaximum lagz	Start lagzMax sleep miss)r]  r^  r`  r5  r   r   r_   r#   r|  rB  r  Truer   rO   zTotal conversations:   %10dz-Successful operations: %10d (%.3f per second)z-Failed operations:     %10d (%.3f per second)z%-28s %fr   r^   z%-28s %dzProtocol    Op Code  Description                                Count       Failed         Mean       Median          95%        Range          Max)r   rb  gffffff?r  r   z?%-12s   %4s  %-35s %12d %12d %12.6f %12.6f %12.6f %12.6f %12.6f)!rS   
float_inforj  r   rS  writer  listdirr  r   r  r   r   r   ri  r(  r)  r~  r  
IndexErrorr   rR   rT   r
  sortedr  replacer,  
opcode_keyrd  calc_percentiler  r   )*r   timing_filer  r  
successfulfailed	latenciesfailuresunique_conversationsr  float_values
int_valuesr  r  r]  r   r   r   r   packet_typelatencyr   opr7  r  r   success_ratefailure_raterq  opsprotor  	protocolspacket_typesrl  r  meanmedian
percentilerngmaxvr   s*                                             rY   generate_statsr/    sb   ##EDJFIH5	 BC L "#$%J JJx(ww||H/$_"5#';;t#4#:#:4#@F#)!9L#)!9H#)!9K#(#3GfQi(A#&q7{E#:E#&q$<D"K0B((R077@ayF*"a
! )(,,\:tH+  _ )P |HQ!H,{(,-M	
'-
78	
9&' (	
9\"# $ |))+,1jAIIc3/#5q99: -z'')*1jAIIc3/#5q99: + 
 * + C"vCJE
v # sxxz"Ic(m<'KK(B"2FFVE!"FVu,D(6F(6JfQi/CD(,,R4D 0 	  ( c #J/ 5d{#zz#q11,.1%(2>q//CLO*_,/A0:1-?JqM "$SZZ8 d45/ _sV   #P*CM*/P*AP	6P:!P	PP	7P;P	PP	P
P+	c                 D     S[        U 5      -  $ ! [         a    U s $ f = f)zCSort key for the operation code to ensure that it sorts numericallyz%03d)r   r  )r  s    rY   r  r  L	  s)    A s    c                    U (       d  g[        U 5      S-
  U-  n[        R                  " U5      n[        R                  " U5      nX4:X  a  U [	        U5         $ U [	        U5         XB-
  -  nU [	        U5         X#-
  -  nXV-   $ )zlCalculate the specified percentile from the list of values.

Assumes the list is sorted in ascending order.
r   r_   )r
  r  floorr  r   )rl  r,  r7  r]  r  d0d1s          rY   r  r  T	  sx     	VqJ&A

1A		!Avc!f~	A15	!B	A15	!B7Nr[   c                      [         R                  R                  " U 6 n[         R                  " S5      n[         R                  " U5        [         R                  " U5        U$ )zqIn a testenv we end up with 0777 directories that look an alarming
green colour with ls. Use umask to avoid that.?   )r  r  r   umaskmkdir)r  r  masks      rY   rR  rR  f	  s>     	dA88E?DHHQKHHTNHr[   r  )r_   r#   )r_   r   )	NNNNr   NNr%   F)T)r  r  )yr   r  r=  r  r  rS   r>  rh  r   r   collectionsr   r   r   r   dns.resolverr	   rX  samba.emulater
   samba.samdbr   r$  r   samba.dcerpcr   r   r   r   r   samba.dcerpc.netlogonr   r   r   samba.drs_utilsr   ra   samba.credentialsr   r   r   
samba.authr   
samba.dsdbr   r   r   r   samba.dcerpc.miscr   sambar   r    samba.commonr!   samba.loggerr"   r  r  r  r  r  r   r   r   r  r  r  rQ   ry   r   rZ   rf   ru   r   rw   objectr   r   r   r   r  r  r1  rt  ry  r~  r  r  r  r  r  r:  r@  rT  rX  r_  rw  ry  r  r  r  r  r  r  r>  r  r  r  r  r  r  r  r  r  r  r  r/  r  r  rR  rq   r[   rY   <module>rI     sM  (  	    
   E E + )  
  ) / / ! 4   &  O O %  +   # )    
 
 	 ? 

""  	x	(6$
0	i 	O<V O<d,.$^F ^B& >d*6 d*NKW KW\2Bj+_6 _D	4D  
4	
 D D T d D d 
4 t t D d  D!&_3_6_ :_ 9	_
 ?_ ;_ O_ O_ Y_ f_ j_ j_ o_ *_ g_  Z!_" '#_$ *%_& h'_( ~)_* *+_, j-_. o/_0 &1_2 +3_4 %5_6 b7_8 =9_: >;_< ?=_> ??_@ #A_B ?C_D #E_F 'G_H &I_J 7K_L 0M_N %O_P 'Q_R (S_T 7U_V :W_X 4Y_Z 5[_\ 4]_^ 4__` 1a_b 6c_d 8e_f 3g_h Ii_j (k_l Mm_n Lo_p Kq_r 7s_t &u_v Jw_x Oy_z &{_| ?}_~ >_@ JA_B =C_D <E_F $G_H ^I_J *K_L 'M_N _O_P -Q_R 0S_T 0U_V )W_X /Y_Z ,[_\ &]_^ G__` Fa_b Ic_d Ge_f >g_h ?i_j =k_l $D 5'%}_D<~F "P7fE: ""8#/0  ,0 22$	+
,-  /3"+
	 BF*%ZQv QhH0(D$r[   