o
    àý°j)  ã                   @   s\   d dl Z d dlZd dlZd dlZd dlmZmZ G dd„ dƒZdd„ Z	e
dkr,e	ƒ  dS dS )é    N)ÚstrftimeÚgmtimec                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚPrettyOuputc                 C   sr   g }|r|  |d ¡ |d }|s|d d d… }t|ƒdkr/tdt|ƒ ƒD ]}| dd¡ q&d dd„ |D ƒ¡S )	Né   éÿÿÿÿé   é   r   Ú c                 S   s   g | ]}t |ƒ‘qS © )Ústr)Ú.0Úgr
   r
   úˆ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldapdomaindump/pretty.pyÚ
<listcomp>   s    z#PrettyOuput.d2b.<locals>.<listcomp>)ÚappendÚlenÚrangeÚinsertÚjoin)ÚselfÚaÚtbinÚt2binÚxr
   r
   r   Úd2b	   s   þzPrettyOuput.d2bc                 C   s  t |tƒr|S |dkrdS |dkrdS t|ƒd }|d }|d| 8 }|d }|d| 8 }|d }|d| 8 }d	}|d
krE|d |¡7 }n|d
krP|d |¡7 }|d
kr\|d |¡7 }n|d
krg|d |¡7 }|d
krt|d |¡7 }|S |d
kr|d |¡7 }|S )Nr   ÚNonelûÿÿÿ         zNot Seti€–˜ i€Q i  é<   r	   é   z	{0} days z{0} day z
{0} hours z	{0} hour z{0} minutes z{0} minute )Ú
isinstancer   ÚabsÚformat)r   ÚtimeÚsecÚdaysÚhrsÚminsÚresultr
   r
   r   Úconvert   s8   
þzPrettyOuput.convertc                 C   s€  t dƒ t d|d d d d  ¡ ƒ t d|d d d d ƒ t d|d d d	 d ƒ |  |d d d
 d ¡}t d|ƒ t dƒ t d|d ƒ t d|d ƒ t d|d ƒ t d|d ƒ t d|d ƒ t d|d ƒ t dƒ t d|  |d d d d ¡ƒ t d|  |d d d d ¡ƒ t d|  |d d d d ¡ƒ t d|d d d d ƒ t d |  |d d d! d ¡ƒ d S )"Nz•
    +-----------------------------------------+
    | Password Policy Information             |
    +-----------------------------------------+
    z[+] Password Info for Domain:r   Ú
attributesÚdcz	[+] Minimum password length: ÚinstanceTypez	[+] Password history length:ÚpwdHistoryLengthÚpwdPropertiesz	[+] Password Complexity Flags:r	   z$		[+] Domain Refuse Password Change:z&		[+] Domain Password Store Cleartext:r   z%		[+] Domain Password Lockout Admins:r   z&		[+] Domain Password No Clear Change:é   z%		[+] Domain Password No Anon Change:é   z		[+] Domain Password Complex:é   z	[+] Maximum password age:Ú	maxPwdAgez	[+] Minimum password age:Ú	minPwdAgez#	[+] Reset Account Lockout Counter:ÚlockoutDurationz	[+] Account Lockout Threshold:ÚlockoutThresholdz	[+] Forced Log off Time:ÚforceLogoff)ÚprintÚupperr   r'   )r   ÚdataÚpassword_propertiesr
   r
   r   Úpassword_complexity2   s&   
   $zPrettyOuput.password_complexityc                 C   sX   t dƒ t d|d d d d ƒ t d|d d d d ƒ t dƒ |d d d d S )	NzŒ
    +--------------------------------------+
    | Getting Domain Sid For               |
    +--------------------------------------+
    z[+] Domain Name:r   r(   r)   zDomain Sid:Ú	objectSidr	   )r5   )r   r7   r
   r
   r   Údomain_infoN   s
   zPrettyOuput.domain_infoc                 C   s¬   t dƒ |D ]2}|d  d¡r|d  d¡d nd}t d| d |d d d  d	 |d d
 d  d | ƒ qt dƒ |D ]}t d|d d d  d ƒ q?t dƒ d S )Nzb
    +------------------------+
    | Users Infos            |
    +------------------------+
    r(   Údescriptionr   z(null)z	Account: ú\ÚsAMAccountNamez	Name: Únamez	Desc: r	   zuser:[ú])r5   Úget)r   Úusersr)   ÚuserÚdescr
   r
   r   Ú	user_infoY   s   $>zPrettyOuput.user_infoc                 C   sÎ   t dƒ |D ]}t d|d d d  d ƒ q|D ]K}|d  d¡rdt dd	 |d d ¡tj¡}|rdt d
ƒ |D ]*}|dkrBd}n|dkrId}n|dkrOd}t d|d d d  d | d | ƒ q9qd S )Nzp
    +------------------------+import os.path
    | Groups Infos           |
    +------------------------+
    zgroup:[r(   r?   r   r@   Úmemberz^CN=([\w\s\-\_\{\}\.\$\#]+)Ú
z&
[+] Getting domain group memberships:zS-1-5-11z NT AUTHORITY\Authenticated UserszS-1-5-4zNT AUTHORITY\INTERACTIVEzS-1-5-17zNT AUTHORITY\IUSRzGroup 'z' has member: r=   )r5   rA   ÚreÚfindallr   ÚM)r   Úgroupsr)   ÚgrouprB   rC   r
   r
   r   Úgroups_infoh   s$   *€ôzPrettyOuput.groups_infoN)	Ú__name__Ú
__module__Ú__qualname__r   r'   r9   r;   rE   rM   r
   r
   r
   r   r      s    r   c                  C   s  t jdd�} | jdddd� |  ¡ }|jrˆt|jd ƒ�}t |¡}W d   ƒ n1 s,w   Y  t|jd ƒ�}t |¡}W d   ƒ n1 sHw   Y  t|jd	 ƒ�}t |¡}W d   ƒ n1 sdw   Y  tƒ }| 	|¡}| 
|¡ | || ¡ ¡ | || ¡ ¡ d S td
ƒ d S )Nz0LDAPDomainDump to pretty output like enum4linux.)r<   z-dz--directoryz‰The ldapdomaindump directory where the json files are saved. Required files: domain_users.json, domain_groups.json and domain_policy.json)Úhelpz/domain_policy.jsonz/domain_users.jsonz/domain_groups.jsonz&Missing parameter --directory /output/)ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsÚ	directoryÚopenÚjsonÚloadr   r;   r9   rE   r6   rM   r5   )ÚparserÚargsÚfÚdomainrB   rK   Úprettyr)   r
   r
   r   Úmain   s&   ÿÿÿ

r_   Ú__main__)rR   rX   Úos.pathÚosrH   r!   r   r   r   r_   rN   r
   r
   r
   r   Ú<module>   s    x
ÿ