The power of root

Over The Wire - War Games Level 11 - 15

sáb 18 abril 2015 wargame / linux / hacker / hacking / seguranca /

Me empolguei nesse trem heim...

A ultima senha que conseguimos foi IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR para conectarmos ao level 11, então bora continuar.

Level 11

Nesse nível a senha está cifrada pulando 13 carteres "Cifra de Cesar" contando pelo alfabeto padrão, então a letra A repectivamente se torna a letra N e assim por diante.

Vou resolver esse nível de duas maneiras, maneira mais simples com domandos do terminal e o modo pythonias.

  1. No primeiro modo vamos redirecionar o comando cat para o comando tr que está como sugestão de comando para passar de level, o comando tr segundo o manual faz o seguinte:

    Translate, squeeze, and/or delete characters from standard input, writing
    to standard output.
    

    Ou seja, traduz, encurta ou deleta caracteres.

    A sintax ficaria assim:

    tr [OPTION]... SET1 [SET2]
    

    Onde SET1 seria o padrão que está cifrado 'A-Za-z' e o SET2 seria o padrão usado para decifrar a senha pulando os 13 caracteres 'N-ZA-Mn-za-m', o comando completo ficaria assim:

    bandit11@melinda:~$ ll
    total 24
    drwxr-xr-x   2 root     root     4096 Nov 14 10:32 ./
    drwxr-xr-x 167 root     root     4096 Mar 21 06:46 ../
    -rw-r--r--   1 root     root      220 Apr  9  2014 .bash_logout
    -rw-r--r--   1 root     root     3637 Apr  9  2014 .bashrc
    -rw-r--r--   1 root     root      675 Apr  9  2014 .profile
    -rw-r-----   1 bandit12 bandit11   49 Nov 14 10:32 data.txt
    bandit11@melinda:~$ cat data.txt
    Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh
    bandit11@melinda:~$ cat data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'
    The password is 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu
    
  2. E também conseguimos fazer essa tradução usando o python:

    #!/usr/bin/python3
    # -*- encoding: utf-8 -*-
    
    import string
    
    padrao = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    cesar = 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'
    cifra = 'Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh'
    
    print(cifra.translate(string.maketrans(padrao, cesar)))
    
    emilio Python $ python ccesar.py
    The password is 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu
    

Level 12

Neste nível a coisa está ficando um pouco mais complicada, agora teremos que tratar um arquivo em hexa para conseguir descobrir a senha para o próximo nível.

Primeiramente vamos seguir as orientações e criar um diretório no /tmp e copiar o arquivo data.txt para dentro desse diretório.

bandit12@melinda:~$ mkdir /tmp/emilioeiji
bandit12@melinda:~$ cp data.txt /tmp/emiloeiji
bandit12@melinda:~$ cd /tmp/emilioeiji

Como fiquei perdido resolvi continuar seguindo as sugestões e comecei a ver a man page dos comandos sugeridos 'grep, sort, uniq, strings, base64, tr, tar, gzip, bzip2, xxd, mkdir, cp, mv' e encontrei uma luz no comando xxd.

NAME
       xxd - make a hexdump or do the reverse.

SYNOPSIS
       xxd -h[elp]
       xxd [options] [infile [outfile]]
       xxd -r[evert] [options] [infile [outfile]]

Então para tratar o arquivo ficaria assim, gerando um segundo arquivo.

xxd -r data.txt arquivo2

Agora temos o arquivo2 porém, rodando um cat arquivo2 retornou um monte de caracteres estranhos portanto podemos deduzir que não se trata de um arquivo texto, pesquisando um pouco como podemos descobrir que tipo de arquivo foi gerado encontrei o comando file:

NAME
     file — determine file type

SYNOPSIS
     file [-bchiklLNnprsvz0] [--apple] [--mime-encoding] [--mime-type] [-e testname] [-F separator] [-f namefile] [-m   magicfiles] [-R maxrecursion]
          file ...
     file -C [-m magicfiles]
     file [--help]

vamos rodar o comando então para descobri que tipo de arquivo é esse.

bandit12@melinda:/tmp/emilioeiji$ file arquivo2
arquivo2: gzip compressed data, was "data2.bin", from Unix, last modified: Fri Nov 14 10:32:20 2014, max compression

Descobrimos que se trata de um arquivo gzip, tentei descompactar o arquivo2 direto com o comando gzip -d arquivo2 porem tive o retorno que o sulfixo do arquivo era desconhecido, mudei o nome do arquivo para .gz e o comando foi executado gerando o arquivo2 novamente.

bandit12@melinda:/tmp/emilioeiji$ gzip -d arquivo2
gzip: arquivo2: unknown suffix -- ignored
bandit12@melinda:/tmp/emilioeiji$ ls
arquivo2  data.txt
bandit12@melinda:/tmp/emilioeiji$ mv arquivo2 arquivo2.gz
bandit12@melinda:/tmp/emilioeiji$ gzip -d arquivo2.gz

Rodando um cat arquivo2 retornou novamente os caracteres especiais, para minha surpresa quando rodei o file arquivo2 era outro arquivo compactdo mas agora como gzip2:

bandit12@melinda:/tmp/emilioeiji$ file arquivo2
arquivo2: bzip2 compressed data, block size = 900k

Vamos descompactar o arquivo bzip2:

bandit12@melinda:/tmp/emilioeiji$ bzip2 -d arquivo2
bzip2: Can't guess original name for arquivo2 -- using arquivo2.out
bandit12@melinda:/tmp/emilioeiji$ ls
arquivo2.out  data.txt
bandit12@melinda:/tmp/emilioeiji$ file arquivo2.out
arquivo2.out: gzip compressed data, was "data4.bin", from Unix, last modified: Fri Nov 14 10:32:20 2014, max compression

Com o comando de descompactaçao foi gerado o arquivo2.out e com o comando file obtive novamente que se tratava de outro arquivo compactado no formato gzip, vamos acrescentar a extensão .gz e descompactar novamente:

bandit12@melinda:/tmp/emilioeiji$ mv arquivo2.out arquivo2.gz
bandit12@melinda:/tmp/emilioeiji$ gzip -d arquivo2.gz
bandit12@melinda:/tmp/emilioeiji$ ls
arquivo2  data.txt
bandit12@melinda:/tmp/emilioeiji$ file arquivo2
arquivo2: POSIX tar archive (GNU)

Agora temos outro arquivo compactado mas no formato tar, bora descompactá-lo:

bandit12@melinda:/tmp/emilioeiji$ tar xvf arquivo2
data5.bin
bandit12@melinda:/tmp/emilioeiji$ file data5.bin
data5.bin: POSIX tar archive (GNU)
bandit12@melinda:/tmp/emilioeiji$ ls
arquivo2  data.txt  data5.bin
bandit12@melinda:/tmp/emilioeiji$ tar xvf data5.bin
data6.bin
bandit12@melinda:/tmp/emilioeiji$ ls
arquivo2  data.txt  data5.bin  data6.bin
bandit12@melinda:/tmp/emilioeiji$ file data6.bin
data6.bin: bzip2 compressed data, block size = 900k

Descompactando o arquivo2 em formato tar, foi gerado outro arquivo compactado em tar novamente, efetuei a descompactação outra vez e foi gerado novamente um arquivo bzip2, vamos descompactar de novo:

bandit12@melinda:/tmp/emilioeiji$ bzip2 -d data6.bin
bzip2: Can't guess original name for data6.bin -- using data6.bin.out
bandit12@melinda:/tmp/emilioeiji$ ls
arquivo2  data.txt  data5.bin  data6.bin.out
bandit12@melinda:/tmp/emilioeiji$ file data6.bin.out
data6.bin.out: POSIX tar archive (GNU)

Outro arquivo tar.

bandit12@melinda:/tmp/emilioeiji$ tar xvf data6.bin.out
data8.bin
bandit12@melinda:/tmp/emilioeiji$ ls
arquivo2  data.txt  data5.bin  data6.bin.out  data8.bin
bandit12@melinda:/tmp/emilioeiji$ file data8.bin
data8.bin: gzip compressed data, was "data9.bin", from Unix, last modified: Fri Nov 14 10:32:20 2014, max compression

Outro arquivo gzip.

bandit12@melinda:/tmp/emilioeiji$ mv data8.bin data8.gz
bandit12@melinda:/tmp/emilioeiji$ gzip -d data8.gz
bandit12@melinda:/tmp/emilioeiji$ ls
arquivo2  data.txt  data5.bin  data6.bin.out  data8
bandit12@melinda:/tmp/emilioeiji$ file data8
data8: ASCII text
bandit12@melinda:/tmp/emilioeiji$ cat data8
The password is 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL

E finalmente descobrimos a senha 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL

Ufa!!! Essa deu trabalho heim...

Level 13

Nesse nível temos a senha armazenada no arquivo /etc/bandit_pass/bandit14 e o mesmo só pode ser acessado pelo usuário bandit14 que é do próximo level, foi gerado uma sshkey para conexões ssh e como nota foi orientado a conectar por ssh no localhost.

Primeiro vamos descobrir como conectar via ssh utilizando a chave gerada:

SSH(1)                                                          BSD General Commands    Manual                                                         SSH(1)

NAME
     ssh — OpenSSH SSH client (remote login program)

SYNOPSIS
     ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char]         [-F configfile]
         [-I pkcs11]     [-i identity_file] [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o       option] [-p      port]
         [-Q cipher | cipher-auth | mac | kex | key] [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port] [-w    local_tun[:remote_tun]]
         [user@]hostname [command]
-i identity_file
        Selects a file from which the identity (private key) for public key authentication is read.  The default is ~/  identity for protocol
        sion 1, and ~/.ssh/id    ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 and ~/.ssh/id_rsa for protocol version 2.  Iden     files may also be spe
        on a per-host basis i   configuration file.  It is possible to have multiple -i options (and mult       identities specified in confi
        tion files).  ssh will also try to load certificate information from the filename obtained by appending -cert   to identity filenames.

Temos que usar o parametro -i e o nome do arquivo:

bandit13@melinda:~$ ll
total 24
drwxr-xr-x   2 root     root     4096 Nov 14 10:32 ./
drwxr-xr-x 167 root     root     4096 Mar 21 06:46 ../
-rw-r--r--   1 root     root      220 Apr  9  2014 .bash_logout
-rw-r--r--   1 root     root     3637 Apr  9  2014 .bashrc
-rw-r--r--   1 root     root      675 Apr  9  2014 .profile
-rw-r-----   1 bandit14 bandit13 1679 Nov 14 10:32 sshkey.private
bandit13@melinda:~$ ssh -i sshkey.private bandit14@localhost
Could not create directory '/home/bandit13/.ssh'.
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is 05:3a:1c:25:35:0a:ed:2f:cd:87:1c:f6:fe:69:e4:f6.
Are you sure you want to continue connecting (yes/no)? yes
bandit14@melinda:~$ cat /etc/bandit_pass/bandit
bandit0   bandit10  bandit12  bandit14  bandit16  bandit18  bandit2   bandit21  bandit23  bandit25  bandit3   bandit5           bandit7   bandit9
bandit1   bandit11      bandit13  bandit15  bandit17  bandit19  bandit20  bandit22  bandit24  bandit26  bandit4   bandit6       bandit8
bandit14@melinda:~$ cat /etc/bandit_pass/bandit14
4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e

Essa com certeza foi muito mais fácil que o level anterior.

Level 14

Para obtermos a senha para o próximo nível temos que escutar a porta 30000 e segundo a descrição temos que apresentar a senha atual para recebermos a próxima senha.

Novamente fiquei perdido e comecei a dar o man para os comando sugeridos e achei que o nc poderia ajudar em alguma coisa:

NC(1)                                                           BSD General Commands    Manual                                                          NC(1)

NAME
     nc -- arbitrary TCP and UDP connections and listens

SYNOPSIS
     nc [-46bCDdhklnrStUuvZz] [-I length] [-i interval] [-O length] [-P proxy_username] [-p source_port] [-q seconds] [-s       source] [-T toskeyword]
        [-V rtable] [-w time    out] [-X proxy_protocol] [-x proxy_address[:port]] [destination] [port]

DESCRIPTION
     The nc (or netcat) utility is used for just about anything under the sun involving TCP, UDP, or UNIX-domain sockets.  It   can open TCP connections,
     send UDP packets, listen on arbitrary TCP and UDP ports, do port scanning, and deal with both IPv4 and IPv6.  Unlike       telnet(1), nc scripts nicely,
     and separates error messages onto standard error instead of sending them to standard output, as telnet(1) does with some.

Basicamente o nc abre e escuta conexões tcp e udp então tentei no modo padrão para praticamente todo tipo de conexão, comando destino porta.

bandit14@melinda:~$ nc localhost 30000

Wrong! Please enter the correct current password

Demorei pra entender um pouco como funcionava esse comando, em primeiro momento parecia ter conectado e não aconteceu mais nada, esperei por alguns momentos e resolvi pressionar enter, retornou que a senha estava incorreta, resolvi então repetir o procedimento e colocar a senha desse level 4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e e para minha surpresa funcionou.s

bandit14@melinda:~$ nc localhost 30000
4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e
Correct!
BfMYroe26WYalil77FoDi9qh59eK5xNr

Foi mais fácil que pensei...

Level 15

Como no nível anterior temos que conectar em localhost na porta 30001 porém usando encriptação SSL e fornecer a senha do nível atual. Pesquisando um pouco sobre ssl descobri que para conectar como cliente devemos usar o parametro s_client no comando openssl, ficando assim:

bandit15@melinda:~$ openssl s_client -connect 127.0.0.1:30001 -quiet
depth=0 CN = li190-250.members.linode.com
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = li190-250.members.linode.com
verify return:1
BfMYroe26WYalil77FoDi9qh59eK5xNr
Correct!
cluFn7wTiGryunymYOu4RcffSxQluehd

read:errno=0

Está cada vez ficando mais complexo conseguir as senhas, apesar de ser apenas um jogo com ele conseguimos aprender algumas coisas legais.

Abraços até os próximos níveis.

on the top

Comments