Como desenvolver sua própria ferramenta de verificação de vulnerabilidades

O núcleo da ferramenta de varredura de vulnerabilidades é o scanner, e a ideia de design do scanner é: flexível, fácil de expandir e fácil de modificar. módulos de detecção de vulnerabilidade em lotes; fácil de expandir Significa que o novo módulo de detecção de vulnerabilidade pode ser integrado de forma clara e simples no scanner; é fácil de modificar e a lógica de detecção pode ser modificada para cada módulo de verificação de vulnerabilidade de acordo com circunstâncias especiais. Abaixo vamos usar uma ferramenta de escaneamento de código aberto na Internet para explicar. Claro, pode haver pits no processo de implantação e uso, desde que sejam resolvidos um a um:

Código-fonte do scanner

Endereço de download do scanner:  https://gitee.com/samllpig/SafeTool-51testing

Tutorial de instalação detalhado da ferramenta:  http://quan.51testing.com/pcQuan/lecture/117

Diagrama de Arquitetura de Software

Instalar e implantar

  • Instale o ambiente python 3.6 ou superior (se você tem medo de problemas, instale o 3.6, porque instalar o 3.8 e outras versões superiores ainda precisa ajustar um pequeno problema de compatibilidade de código, mas não há muitos problemas)
  • instalar redis
  • Instalar wxPython==4.0.7
pip install wxPython==4.0.7

#Se a instalação falhar, execute mais algumas edições, principalmente porque a instalação falha devido ao tempo limite da rede
#Você também pode baixar diretamente o pacote do módulo relevante, como baixar wxPython-4.0.7-cp36-cp36m-win_amd64.whl, vá para o site oficial para baixar, certifique-se de baixar o pacote que corresponde à versão do python #Instalar o
módulo especificado instalando o pacote

pip install wxPython-4.0.7-cp36-cp36m-win_amd64.whl

#Se o processo de instalação perguntar qual pacote está faltando, continue baixando qual pacote 

 Você também pode instalar uma versão superior, como wxPython==4.1.1

  • instale o openssl

Haverá problemas na instalação geral, você pode baixá-lo diretamente do site oficial  http://slproweb.com/products/Win32OpenSSL.html

Após a instalação local, você também precisa copiar os arquivos da biblioteca para o diretório python para que possam ser reconhecidos, como:

1. Copie o diretório de instalação do openssl: C:\Program Files\OpenSSL-Win64\lib para D:\Python\libs

2. Copie o diretório de instalação do openssl: C:\Program Files\OpenSSL-Win64\include para d:\Python\include

  • Verifique os requisitos.txt

No diretório raiz do código-fonte deste arquivo estão configurados os módulos e as versões que precisam ser instaladas. Precisamos confirmar se nossa versão do python corresponde a ela. Por exemplo, Python3.8 requer a alteração de lxml para lxml==4.6. 3

  • pacote do módulo de instalação pip
pip install -r requirements.txt

# 如果安装失败,多执行几编,主要是因为网络超时导致安装失败,也可以到官网找模块包下载后来安装
# 如果安装提示版本问题,就需要替换版本,一般Python3.8会遇到
  • Inicie os serviços na seguinte ordem

Inicie o banco de dados redis
Inicie o servidor myproxy.bat
Inicie o cliente python consoleMain.py 

modificação anormal

Após a instalação e implantação, ainda podemos encontrar alguns problemas, que estão relacionados à inconsistência do ambiente de desenvolvimento original do código.

1. Compatibilidade entre Python 3.8 e 3.6

O Python3.8 removeu o método time.clock(), mas ainda é usado neste código-fonte, portanto, se você encontrar erros relacionados, precisará modificá-lo manualmente, como para obter a hora do sistema, use time. perf_counter() em vez disso

2. O problema dos caminhos com espaços

Este código não foi totalmente considerado a esse respeito. Se o caminho de implantação tiver espaços, ele relatará um erro de caminho, como o caminho "D:\Arquivos de programas". Não o implantamos no caminho com espaços, ou altere diretamente o código dele. ,por exemplo:

setUp = "python " + path
#可以将path路径用引号全圈起来
setUp = "python '" + path + "'"

 3. wt.exe não pode ser encontrado erro na inicialização

Eu não sei a origem do wt.exe. Esse mal-entendido às vezes não afeta a inicialização, porque o arquivo de inicialização consoleMain.py fez julgamentos relevantes, mas para não chamar wt.exe, também podemos colocar o informações relevantes em consoleMain.py O código é alterado diretamente:

# wtSetUp = "wt.exe python " + path
# 把以上调用改为直接调PowerShell.exe
wtSetUp = "start cmd /k PowerShell.exe python '" + path + "'"

Após essa alteração, há outra vantagem, ou seja, a janela cmd não será fechada imediatamente quando o código estiver anormal, para que você possa ver os seguintes erros específicos, o que é útil para depurar e analisar erros de código.

 4. Erro de codificação utf-8 do relatório chinês

Por exemplo, ao executar a auditoria de execução durante a verificação da Web, um erro é relatado:

Ao relatar o erro, podemos ver o erro de codificação utf-8, e o erro é o método resp.read().decode de request.py. Mudamos a codificação para o seguinte (especificamente qual codificação alterar, você pode tentar por você mesmo):

self.content = resp.read().decode('gbk')

Depois que a codificação for alterada com sucesso, não haverá esse erro ao chamar por meio da entrada python consoleMain.py.

5. Relatar o erro do índice da lista fora do intervalo

Esse erro de baixo nível geralmente é causado por uso indevido, mas também mostra que a robustez do código é insuficiente. Por exemplo, a execução de exec ataques.xss relata o seguinte erro:

 Podemos ver a linha específica do arquivo params.py que relatou o erro, que é self.url.split("?"). O problema está neste ponto de interrogação, pois comecei a definir o caminho de verificação para: set url http://172.16.1.63, Isso está errado e deve ser definido da seguinte forma:

set url http://172.16.1.63/?u=admin

Pode ser visto de relance, você deve adicionar um ponto de interrogação para indicar que existem parâmetros. Você pode alterar diretamente seu código para este problema e adicionar um julgamento. Se não houver parâmetros, você será solicitado a redefinir de relatar um erro. Além disso, esta seção também mostra que mais desenvolvimento é necessário.Normalmente, as ferramentas de verificação devem verificar e capturar ativamente links e locais que podem executar ataques de script XSS entre sites, em vez de configurar URLs manualmente para simular ataques.

6. Execute myproxy.bat e não encontre o mitmdump

Obviamente instalamos o mitmdump, por que não podemos encontrá-lo? Isso ocorre porque quando o pip é instalado, ele é instalado local ou globalmente. Normalmente, o mitmdump é instalado nos Scripts no diretório python, como D:\Tools\Python \Scripts. Se você não encontrá-lo, então você precisa procurar no caminho do código, se ele está instalado no diretório de código, por exemplo: SafeTool-51testing\venv\Scripts

Isso ocorre porque usamos a ferramenta de desenvolvimento PyCharm Community Edition para instalar e implantar possíveis problemas. Movemos mitmdump ou alteramos diretamente myproxy.bat e alteramos o caminho de chamada:

"D:\Program Files\Project\SafeTool-51testing\venv\Scripts\mitmdump" -q -s myproxy.py -p 8000

7. Problemas com a geração de relatórios

Há também um problema com este pedaço de código-fonte aberto, e um método de modificação simples também será mencionado abaixo.

Simples de usar

Primeiro abra nosso scanner para ver a interface:

 Interface do scanner:

Bem, o acima é o nosso scanner, todos operados por meio de comandos, que são fáceis de lembrar, e você pode apenas acompanhar.

  • comando de ajuda usar

ajuda: lista comandos e descrições de plugins integrados.

Antes de começar a varredura, precisamos fazer algumas configurações básicas. Digite o comando help set para ver quais parâmetros precisamos definir. Os marcados com * são opções obrigatórias.

  • comando de informação

info : Exibe módulos detalhados de detecção de vulnerabilidade

O formato de uso do comando info é: info [nome do plugin], e o nome do plugin é obtido digitando o comando help na figura acima.

Digite ataques de informações:

Digite o comando de auditoria de informações:

Pode-se ver que há muito poucos módulos de detecção no plug-in de auditoria. Mais tarde, precisamos adicionar módulos de varredura como tomcat, nginx, weblogic, etc.

Digite o comando info brute:

Insira a divulgação de informações:

  • comando conjunto:

Antes de digitalizar, você precisa realizar as configurações básicas. Use o comando help set para visualizar as opções que podem ser definidas. os outros são definidos conforme necessário.

set comando format: set [opções] [parâmetros]

Exemplo: definir url  http://192.168.16.132/wordpress/?s=11

  • comando de verificação:

Digite check argv para exibir o valor do parâmetro definido em set

O parâmetro do agente, ou seja, a informação da versão, será obtido aleatoriamente por padrão.

  • comando exec

Execute o comando de detecção, formato do comando: exec plugin name[.module name]

Se você digitar apenas o nome do plugin [ataques,auditoria,brute,divulgação], todos os módulos de detecção de vulnerabilidade no plugin atual serão executados. Se você digitar o nome do plugin.nome do módulo, por exemplo: ataques.xss, apenas os módulos especificados sob o plugin atual será executado.

Digite exec audit : execute todos os módulos sob o plugin de middleware de detecção

Digite exec attack.xss: Use o módulo Detectar vulnerabilidade xss no plug-in de injeção:

Digite exec attack.blindsqli : Detectar vulnerabilidades de injeção de SQL cego

  • comando de relatório:

Gerar comando de relatório de teste

Parâmetros de comando: report [nome do relatório]

Nota: O relatório só pode ser gerado se pelo menos uma detecção completa de plug-in for realizada, não a detecção de vulnerabilidade especial, ou seja, o nome do plug-in exec, não o nome do plug-in exec.

Digite o comando: relatório webscan

Abra o relatório de teste de acordo com o diretório exibido pelo prompt. O formato do relatório é html:

Bem, o acima é todos os comandos e fluxo de execução completo do uso do scanner (este relatório executa dois módulos (plug-ins) de auditoria e ataques, mas os resultados são classificados como o primeiro módulo de plug-in pelos seguintes motivos).

Nota: Em relação à geração do relatório, o código original deve ser problemático. Se apenas o submódulo do plug-in for executado, como exec attack.xss, e depois for executado o webscan do relatório para gerar o relatório, ele falhará. Isso ocorre porque o O código executa apenas o plug-in. O total de ataques do módulo exec chamará a atribuição do relatório (a função que chama o submódulo é startup_spec_attacks, e o valor do relatório não é reatribuído, portanto, o submódulo exec fará com que os dados do relatório sejam mesclados no módulo geral do plug-in anterior), veja o código da seguinte forma:

#执行attacks子模块函数,没有对REPORT进行再赋值
def startup_spec_attacks(attack:str):
    if attack in attacks_info.keys():
        plugins = spec_attacks_plugins(attack)
        startup_plugins(plugins)
    else:
        warn("模块不存在!")

def startup_full_attacks():
    global resultJson
    if not REPORT['startTime']:
        REPORT['startTime'] = strftime("%Y/%m/%d at %H:%M:%S")
    execmod.append("attacks")
    plugins = attacks_plugins()
    if resultJson:
        resultJson = {}
    startup_plugins(plugins)
    REPORT['attacks'] = resultJson  #调用总的attacks模块,才对报告结果赋值

Este problema precisa de atenção. Se você quiser alterá-lo simplesmente, adicione a atribuição REPORT diretamente à função startup_spec_attacks (requer julgamento repetido):

def startup_spec_attacks(attack:str):
    global resultJson
    if not REPORT['startTime']:
        REPORT['startTime'] = strftime("%Y/%m/%d at %H:%M:%S")
    if resultJson and not REPORT['attacks']:
        resultJson = {}
    if attack in attacks_info.keys():
        execmod.append("attacks")
        plugins = spec_attacks_plugins(attack)
        startup_plugins(plugins)
        REPORT['attacks'] = resultJson
    else:
        warn("模块不存在!")

Após tal alteração, e em seguida executando as etapas de verificação acima, o modelo de relatório fica mais preciso, e mesmo que os ataques.xss e ataques.blindsqli do mesmo módulo sejam executados, este último não cobrirá o primeiro, conforme segue:

Claro, isso não garante que não haverá problemas. Vou considerar cuidadosamente a otimização nesta área no futuro!

Plugins de escrita

Todos cliquem no endereço de download no Capítulo 1. Depois de baixar a ferramenta, abra-a com PyCharm ou vscode ou sua ferramenta útil.O scanner do plugin está no diretório de digitalização.

Nossa escrita de plugins começa com o arquivo de configuração global scan\lib\utils\settings.py

O primeiro passo: primeiro veja a configuração básica do caminho, a estrutura de diretórios de todo o projeto está aqui

A segunda etapa é configurar o caminho do dicionário. O dicionário necessário para o módulo de detecção de vulnerabilidades é colocado neste caminho.

Etapa 3: configurar o caminho do plug-in e os novos plug-ins são configurados uniformemente no seguinte formato

Etapa 4: configurar as informações de descrição do plug-in, que correspondem ao caminho do plug-in na terceira etapa

Etapa 5: configurar as informações de descrição do módulo de vulnerabilidade, que correspondem à descrição do plug-in na Etapa 4

Etapa 6: Configurar as informações do caminho do módulo de vulnerabilidade, que corresponde à descrição do plug-in na Etapa 4

Etapa 7: Gravar o método do módulo de carregamento do plug-in

Regras de nomenclatura unificada Os plug-ins são denominados _plugins() [todos os métodos de execução do módulo]; spec_plugin name_plugins(key:str)

Etapa 8: Escreva um módulo de detecção de vulnerabilidade, usando o módulo de detecção bshi (detecção de vulnerabilidade de quebra de shell) no plug-in de ataques como exemplo,

Importe as bibliotecas principais necessárias:

Crie uma classe de detecção de vulnerabilidade, herde a classe Request e o nome da classe deve ser igual ao nome do arquivo

O método de detecção de vulnerabilidade escrito é uniformemente denominado check:

Por fim, escreva o método run. Não é recomendado modificar o nome. Se você realmente precisa modificá-lo, você precisa modificar a lógica de importação do módulo correspondente na nona etapa:

Etapa 9: Escreva uma chamada de API local no arquivo localapi.py. Por que há uma chamada de API local? Como pretendo escrever um método de chamada de API remota para ser usado em conjunto com o serviço da Web da ferramenta de segurança (esta etapa é não é necessário, somente após a extensão Se você adicionar um novo módulo de detecção de vulnerabilidade baseado no plugin original, você pode pular esta etapa)

O formato e o caminho básico da função da API local, consulte a figura a seguir:

Resumindo, a lógica de extensão é que plug-ins nomeados facilitam o gerenciamento unificado de módulos, módulos são escritos em um formato fixo e APIs locais são escritas para executar módulos de detecção de acordo com plug-ins especificados. O módulo de detecção do scanner pode continuam a ser atualizados e estendidos.

Como aprendi a sintaxe Python por meio dia e implantei aplicativos em poucos dias, ainda preciso continuar entendendo e aprendendo. As linguagens são todas iguais, e quem conhece Java pode aprender Python rapidamente. Aprendendo bem Python é propício para a expansão desta ferramenta de código aberto e desenvolvimento.

Referência: https://zhuanlan.zhihu.com/p/368859499

Acho que você gosta

Origin blog.csdn.net/smooth00/article/details/119204497
Recomendado
Clasificación