18 de jul de 2014

Resolvendo Wargame Leviathan

Leviathan é um outro wargame do site overthewire.org. Vamos tentar resolvê-lo.

Nível 0

Pra conectar no nivel 0 precisamos de abrir uma conexão SSH com login leviathan0 e senha leviathan0. Ao listarmos os arquivos, vemos o diretório .backup. Nesse diretório existe apenas o arquivo bookmarks.html. Como queremos a senha para o nível 1, vamos utilizar o comando cat em conjunto com o grep, para filtrar o nosso resultado, procurando a palavra leviathan1.




ssh leviathan0@leviathan.labs.overthewire.org
leviathan0@melinda:~$ ls -la
total 24
drwxr-xr-x   3 root root       4096 Jun  6  2013 .
drwxr-xr-x 160 root root       4096 Oct 17  2013 ..
drwxr-x---   2 root leviathan0 4096 Jun  6  2013 .backup
-rw-r--r--   1 root root        220 Apr  3  2012 .bash_logout
-rw-r--r--   1 root root       3486 Apr  3  2012 .bashrc
-rw-r--r--   1 root root        675 Apr  3  2012 .profile
leviathan0@melinda:~$ cd .backup/; ls -la
total 144
drwxr-x--- 2 root leviathan0   4096 Jun  6  2013 .
drwxr-xr-x 3 root root         4096 Jun  6  2013 ..
-rw-r----- 1 root leviathan0 133259 Jun  6  2013 bookmarks.html
leviathan0@melinda:~/.backup$ cat bookmarks.html | grep leviathan1
<DT><A HREF="http://leviathan.labs.overthewire.org/passwordus.html | This will befixed later, the password for leviathan1 is rioGegei8m" ADD_DATE="1155384634" LAST_CHARSET="ISO-8859-1" ID="rdf:#$2wIU71">password to leviathan1</A>

the password for leviathan1 is rioGegei8m

Nível 1

Existe apenas um arquivo chamado check. Quando executamos ele pede uma senha. Após digitarmos qualquer coisa ele devolve um "Wrong password". O ltrace do linux serve para monitorar as chamadas de funções de um programa. Quando usamos ele, vemos que é chamada a função strcmp, que é uma função que serve pra comparar duas strings. Notamos que ele está comparando "abc" com a palavra "sex". Tentamos a palavra "sex" como senha e funcionou. Nos retornou um shell. Então procuramos quais arquivos pertencem ao grupo leviathan2 e achamos o arquivo /etc/leviathan_pass/leviathan2. Pronto. Conseguimos a senha.

leviathan1@melinda:~$ ltrace ./check
__libc_start_main(0x80484f4, 1, -10268, 0x80485c0, 0x8048630 <unfinished ...>
printf("password: ")                             = 10
getchar(0x8048690, 32768, 0x8049ff4, 0x80485e1, -1password: abcdefghijklmnopq
) = 97 getchar(0x8048690, 32768, 0x8049ff4, 0x80485e1, -1) = 98
getchar(0x8048690, 32768, 0x8049ff4, 0x80485e1, -1) = 99
strcmp("abc", "sex")                             = -1
puts("Wrong password, Good Bye ..."Wrong password, Good Bye ...
)             = 29
+++ exited (status 0) +++

leviathan1@melinda:~$ ./check
password: sex
$ pwd
/home/leviathan1
$ find / -group leviathan2 2>/dev/null
/etc/leviathan_pass/leviathan2
/home/leviathan2/printfile
/var/crash/tmp
/var/crash/output
/var/crash/printfile.asm
/var/crash/test.sh
/var/crash/le3
$ cat /etc/leviathan_pass/leviathan2
ougahZi8Ta


Nível 2

Listando os arquivos, vemos apenas o printfile que é um programa que exibe o interior de um arquivo
utilizando o cat. Analisando seu comportamento utilizando o ltrace vemos que antes de mostrar o
interior do arquivo, o programa verifica se temos permissão para acessar o arquivo através da função
access(). Repare abaixo que quando o arquivo que queremos exibir contem espaços, ele verifica o arquivo
correto, mas na hora de exibir, ele exibe separadamente.

leviathan2@melinda:~$ nano "/tmp/viniciustmp/primeiro segundo"
leviathan2@melinda:~$ ltrace ./printfile "/tmp/viniciustmp/primeiro segundo"

__libc_start_main(0x80484f4, 2, -10332, 0x80485d0, 0x8048640 <unfinished ...>
access("/tmp/viniciustmp/primeiro segund"..., 4)                                                 = 0
snprintf("/bin/cat /tmp/viniciustmp/primei"..., 511, "/bin/cat %s", "/tmp/viniciustmp/primeiro segund"...) = 42
system("/bin/cat /tmp/viniciustmp/primei".../bin/cat: /tmp/viniciustmp/primeiro: No such file ordirectory


O que temos que fazer é criar um arquivo que contém espaços em seu nome, para que o access() "diga" que temos permissão, e criar outro arquivo, um link para o arquivo que contém a senha, cujo nome vai ser
apenas a primeira parte do outro arquivo. Vocês vão entender. Eu já tenho o arquivo "/tmp/viniciustmp/primeiro segundo" que é um arquivo de texto comum. O link para o arquivo da senha
terá o seguinte nome: "/tmp/viniciustmp/primeiro".

leviathan2@melinda:~$ find / -group leviathan3 2>/dev/null
/etc/leviathan_pass/leviathan3
/home/leviathan3/level3
leviathan2@melinda:~$ ln -s /etc/leviathan_pass/leviathan3 /tmp/viniciustmp/primeiro
leviathan2@melinda:~$ ./printfile "/tmp/viniciustmp/primeiro segundo"
Ahdiemoo1j
/bin/cat: segundo: No such file or directory


O programa verificou que temos permissão para acessar o arquivo "/tmp/viniciustmp/primeiro segundo" e depois executou o seguinte:

cat /tmp/viniciustmp/primeiro segundo

O arquivo /tmp/viniciustmp/primeiro é o link para a senha.

Nivel 3

Existe apenas o programa level3. Através do ltrace eu não consegui nada. Mas a senha deve estar em algum lugar.

leviathan3@melinda:~$ ls
level3
leviathan3@melinda:~$ ./level3
Enter the password> asd
bzzzzzzzzap. WRONG
leviathan3@melinda:~$ ltrace ./level3
__libc_start_main(0x8048450, 1, -10268, 0x80485c0, 0x8048630 <unfinished ...>
__printf_chk(1, 0x80486ca, 0x80485c9, 0xf7fcdff4, 0x80485c0) = 20
fgets(Enter the password> asd
"asd\n", 256, 0xf7fceac0)                  = 0xffffd61c
puts("bzzzzzzzzap. WRONG"bzzzzzzzzap. WRONG
)                       = 19
+++ exited (status 0) +++
leviathan3@melinda:~$ strings level3
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
__printf_chk
puts
__stack_chk_fail
stdin
fgets
system
__libc_start_main
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.0
PTRh0
QVhP
UWVS
[^_]
snlprintf
[You've got shell]!
/bin/sh
bzzzzzzzzap. WRONG
Enter the password>
;*2$",
secret

Nunca vi nenhuma função com o nome snlprintf. Mas foi dahora. O cara colocou um nome bem improvável de alguém testar. Felizmente era a senha.

leviathan3@melinda:~$ ./level3
Enter the password> snlprintf
[You've got shell]!
$ cat /etc/leviathan_pass/leviathan4
vuH0coox6m


Nível 4

Esse foi bem fácil. Existe uma pasta .trash. Dentro dela te um arquivo bin. Ao executar ele exibe um
números binários. Convertendo pra texto fica Tith4cokei

leviathan4@melinda:~$ ls -la
total 24
drwxr-xr-x   3 root root       4096 Jun  6  2013 .
drwxr-xr-x 160 root root       4096 Oct 17  2013 ..
-rw-r--r--   1 root root        220 Apr  3  2012 .bash_logout
-rw-r--r--   1 root root       3486 Apr  3  2012 .bashrc
-rw-r--r--   1 root root        675 Apr  3  2012 .profile
dr-xr-x---   2 root leviathan4 4096 Jun  6  2013 .trash
leviathan4@melinda:~$ cd .trash/
leviathan4@melinda:~/.trash$ ls
bin
leviathan4@melinda:~/.trash$ ls -la bin
-r-sr-x--- 1 leviathan5 leviathan4 7254 Jun  6  2013 bin
leviathan4@melinda:~/.trash$ ./bin
01010100 01101001 01110100 01101000 00110100 01100011 01101111 01101011 01100101 01101001 00001010


Nível 5

O único arquivo que tem é o leviathan5. Quando executamos ele te como saída o seguinte:
Cannot find /tmp/file.log

Agora é só criar um link simbolico pro arquivo de senhas.

leviathan5@melinda:~$ ls
leviathan5
leviathan5@melinda:~$ ./leviathan5
Cannot find /tmp/file.log
leviathan5@melinda:~$ ls -la /tmp/file.log
ls: cannot access /tmp/file.log: No such file or directory
leviathan5@melinda:~$ ln -s /etc/leviathan_pass/leviathan6 /tmp/file.log
leviathan5@melinda:~$ ./leviathan5
UgaoFee4li


Nível 6

Esse não teve jeito. O único arquivo que tinha era um programa que pedia uma senha de 4 dígitos. Não
deu pra fazer nada com o strings nem com o ltrace. Tive que criar um script que fazia brute force.
O script foi esse:

#!/bin/bash

for i in {0000..9999}
do
~/leviathan6 $i
done


Após rodar o script me veio uma shell. Aí foi só ver o conteúdo do /home/leviathan7

$ pwd
/home/leviathan6
$ cd /home/leviathan7
$ ls
CONGRATULATIONS
$ cat CONGRATLATIONS
cat: CONGRATLATIONS: No such file or directory
$ cat CONGRATULATIONS
Well Done, you seem to have used a *nix system before, now try something more serious.


É isso ae galera. Mais um wargame concluído. Até o próximo

Nenhum comentário:

Postar um comentário