Analisando tarefas do CTF

No início de dezembro, realizamos uma competição por equipes em segurança da informação. Além do OTUS , os organizadores do evento para os “hackers brancos” foram o Volga CTF e o CTF.Moscow . Talvez tenha chegado a hora de resumir e falar detalhadamente sobre as tarefas.

Primeiro, o evento teve sucesso:

  • 9 tarefas foram preparadas em três áreas: Pentest, Engenharia Reversa, Segurança Linux e Desenvolvimento Seguro;
  • Participaram 217 equipes;
  • Mais de 800 tentativas de passar bandeiras foram registradas;
  • mais de 300 bandeiras passadas foram registradas.



Em segundo lugar , as tarefas eram diferentes em complexidade, para que nem todos pudessem resolver o problema:



Em terceiro lugar , imediatamente após a conclusão da maratona on-line, realizamos três seminários on-line nos quais conversamos sobre os vencedores, demos as respostas certas e anunciamos os resultados finais:

- Resultados do CTF: “Linux Security and Secure Development”;


- Resultados do CTF: Pentest;


- os resultados do CTF: "engenharia reversa".


Em quarto lugar , oferecemos as condições das tarefas e as descrições textuais de suas soluções . Observe que algumas tarefas incluem arquivos.

Direção 1: Pentest


Tarefa 1 - Bancos de dados

100

O site está usando ativamente bancos de dados. Tente fazer injeções de SQL.
Link para o site: http://193.41.142.9:8001/shop/login

Solução:

Vamos para a seção principal da loja / loja / produtos /, tendo ficado preso no campo de pesquisa, encontramos a injeção de sql.

Digite 1 "OR" 1 "=" 1 "-, role para baixo e veja um produto que estava faltando anteriormente, a bandeira está em sua descrição.

Sinalizador: sinalizador {5ql_1nject10n_15_t00_51mpl3_f0r_y0u}

Tarefa 2 - Cookies

150

Meu amigo desenvolveu uma plataforma de loja online. Ele pediu um teste de caixa preta. Verifique a segurança dos cookies, você poderá obter direitos de administrador.

Link para o site: http://193.41.142.9:8001/shop/login

Solução:

Faça login, veja os cookies e veja os cookies secretos:

«MTExMTAxMSAxMDAwMTAgMTExMDEwMSAxMTEwMDExIDExMDAxMDEgMTExMDAxMCAxMTAxMTEwIDExMDAwMDEgMTEwMTEwMSAxMTAwMTAxIDEwMDAxMCAxMTEwMTAgMTAwMDEwIDExMTAxMDEgMTExMDAxMSAxMTAwMTAxIDExMTAwMTAgMTAwMDEwIDEwMTEwMCAxMDAwMDAgMTAwMDEwIDExMDEwMDEgMTExMDAxMSAxMDExMTExIDExMDAwMDEgMTEwMDEwMCAxMTAxMTAxIDExMDEwMDEgMTEwMTExMCAxMDAwMTAgMTExMDEwIDEwMDAxMCAxMDAwMTEwIDExMDAwMDEgMTEwMTEwMCAxMTEwMDExIDExMDAxMDEgMTAwMDEwIDExMTExMDE =»

base64 Decode, temos os dados binários: 1111011 100010 1110101 1110011 1100101 1110010 1101110 1100001 1101101 1100101 100010 111010 100010 1110101 1110011 1100101 1110010 100010 101100 100000 100010 1101001 1110011 1011111 1100001 1100100 1101101 1101001 1101110 100010 111010 100010 1000110 1100001 1101100 1110011 1100101 100010 1111101

{"username":"user", "is_admin":"False"} em texto e obtemos: {"username":"user", "is_admin":"False"} , {"username":"user", "is_admin":"False"} False para True e decodificamos de volta:

01111011 00100010 01110101 01110011 01100101 01110010 01101110 01100001 01101101 01100101 00100010 00111010 00100010 01110101 01110011 01100101 01110010 00100010 00101100 00100000 00100010 01101001 01110011 01011111 01100001 01100100 01101101 01101001 01101110 00100010 00111010 00100010 01010100 01110010 01110101 01100101 00100010 01111101

«MDExMTEwMTEgMDAxMDAwMTAgMDExMTAxMDEgMDExMTAwMTEgMDExMDAxMDEgMDExMTAwMTAgMDExMDExMTAgMDExMDAwMDEgMDExMDExMDEgMDExMDAxMDEgMDAxMDAwMTAgMDAxMTEwMTAgMDAxMDAwMTAgMDExMTAxMDEgMDExMTAwMTEgMDExMDAxMDEgMDExMTAwMTAgMDAxMDAwMTAgMDAxMDExMDAgMDAxMDAwMDAgMDAxMDAwMTAgMDExMDEwMDEgMDExMTAwMTEgMDEwMTExMTEgMDExMDAwMDEgMDExMDAxMDAgMDExMDExMDEgMDExMDEwMDEgMDExMDExMTAgMDAxMDAwMTAgMDAxMTEwMTAgMDAxMDAwMTAgMDEwMTAxMDAgMDExMTAwMTAgMDExMTAxMDEgMDExMDAxMDEgMDAxMDAwMTAgMDExMTExMDE =»

Altere o valor dos cookies para um novo e vá para o perfil do usuário.
Sinalizador: sinalizador {d0_y0u_l1k3_c00k13s}

Tarefa 3 - Leitura de arquivo

200

Muitas vezes encontramos fontes vazando e estranha lógica de trabalho. Os possíveis vetores de ataque geralmente são encontrados por difusão. Eu sugiro que você faça isso.

Link para o site: http://193.41.142.9:8001/shop/login

Solução:

Começamos o dirb (o comum common.txt é suficiente), encontramos as páginas /shop/_source/ e /shop/files/ .

Tendo nos familiarizado com a origem _source entendemos que temos a vulnerabilidade Path Traversal + alguns filtros simples.

Para obter o sinalizador, você precisa fazer uma solicitação POST para /shop/files/ com o parâmetro "file", cujo valor deve ser %2E%2E/%2E%2E/flag .

Em resposta à solicitação, haverá uma bandeira.

Sinalizador: sinalizador {y0u_g0t_0ur_s3cr3t}

Direção 2: “Segurança Linux e Desenvolvimento Seguro”


Tarefa 1 - VCS

50.

Mas o cliente nos deu algo supérfluo?
O arquivo contém o código fonte de parte do site.
Link para o site: http://193.41.142.9:8002/
Anexo: task.7z

Solução:

Temos acesso ao código fonte. Como se viu, os desenvolvedores também colocaram um repositório git. Observamos o git log, vemos o commit com correções. Usamos git show <hash commit>, vemos os arquivos modificados e seu conteúdo, uma flag é armazenada em uma das linhas.

sinalizador {22717297f6a3603608d260c9e5f69e0a}

Tarefa 2 - Algo

50.

Temos um novo desafio. Realize uma verificação de desenvolvimento segura. O cliente forneceu um arquivo com a parte aberta do site em desenvolvimento. Para testar seu algoritmo de hash, ele forneceu um hash: 666c61677b32646733326473323334327d. Verifique o algoritmo quanto à possibilidade de transformação inversa.

O arquivo contém o código fonte de parte do site.
Link para o site: http://193.41.142.9:8002/
Anexo: task.7z

Solução:

O código fonte possui um algoritmo de hash de senha. Na verdade, esse não é um algoritmo de hash, mas simplesmente a conversão de dados de um formato de string para hexadecimal.

Usamos Python:

 import binascii binascii.unhexlify("666c61677b32646733326473323334327d") 

Recebemos a bandeira: flag {2dg32ds2342}

Tarefa 3 - Arquivos Arquivos Arquivos

150

Vamos terminar a auditoria. Você também vê essa vulnerabilidade? Ótimo. Portanto, é fácil obter um arquivo secreto.
O arquivo contém o código fonte de parte do site.
Link para o site: http://193.41.142.9:8002/
Anexo: task.7z

Solução:

No código fonte do módulo principal do programa, você pode notar o leitor de arquivos (esta é a principal aplicação deste serviço). A função para verificar a existência de um arquivo não verifica caracteres especiais de forma alguma e simplesmente concatena duas linhas => vulnerabilidade de percurso / percurso.

Também no Dockerfile, docker-compose.yml, você pode ver os mapeamentos de arquivos e a estrutura de carregamento no contêiner. Usando esse conhecimento, geramos uma carga útil:

 http://193.41.142.9:8002/files?password=qgzc6!78zxcbkj123fdgd234&filename=../../../../../../src/secret_files/flag.txt 

sinalizador {a0a7c3fff21f2aea3cfa1d0316dd816c}

Direção 3: "engenharia reversa"


Tarefa 1 - Cobra
100

Nossa empresa está sempre tentando contornar qualquer proteção de software. Ajude-nos a lidar com o Python desta vez.
Arquivo anexado: task.pyc

Solução:

Usamos o bytecode do Python descompilado pelo módulo uncompyle6:
uncompyle6 task.pyc.
Nós descompilamos, obtemos uma bandeira:

sinalizador {w3l1_pyth0n}

Tarefa 2 - Robô
150

Desta vez, encontramos um aplicativo estranho, ajuda-me a encontrar a senha para entrar.
Anexo: app.apk

Solução:

O aplicativo está no Android, portanto, basta carregá-lo em um analisador estático, como o BytecodeViewer, e ver o código-fonte restaurado do programa. Note que este é o Kotiln, e geralmente usa programação funcional, como neste caso. Em uma das funções anônimas descompiladas, encontramos a verificação de flag, a própria verificação:

 (String)paramFunction1.invoke(Boolean.valueOf(Arrays.equals(paramString, h)));  invoke: ((StringBuilder)localObject).append("flag{"); ((StringBuilder)localObject).append(this.$m); ((StringBuilder)localObject).append('}'); 

variável h: {102, 97, 50, 98, 102, 54, 52, 54, 101, 52, 57, 97, 98, 53, 101, 53, 54, 102, 50, 98, 55, 52, 52, 56, 48, 98, 97, 54, 49, 48, 49, 55};

Vemos que parece caracteres impressos codificados. Usamos Python:

'' .join (chr (x) para x em [102, 97, 50, 98, 102, 54, 52, 54, 101, 52, 57, 97, 98, 53, 101, 53, 54, 102, 50 , 98, 55, 52, 52, 56, 48, 98, 97, 54, 49, 48, 49, 55])

Temos a bandeira:

sinalizador {fa2bf646e49ab5e56f2b74480ba61017}

Missão 3 - Bin

200

Desta vez, encontramos um arquivo binário. A tarefa é a mesma, obtenha a senha secreta.
Anexo: tarefa

Solução:
Um arquivo binário é fornecido. Carregamos no desmontador e vemos seis funções de validação escritas em C ++.

Eles são executados de forma idêntica e são chamados um ao outro, verificando a bandeira em partes de 5 elementos.

Nós o restauramos em etapas usando as informações do desmontador. Recebemos a bandeira em partes:

0) verificação de comprimento
1) sinalizador {
2) feefa
3) _172a
4) k14sc
5) _eee}

Combine e obtenha a bandeira:

sinalizador {feefa_172ak14sc_eee}

Só isso, colegas! Obrigado a todos por participarem, cuidem de si mesmos, de seus entes queridos e de seus dados! Feliz Ano Novo!

Source: https://habr.com/ru/post/pt482538/


All Articles