
lighttpd 1.4.85 - Alta - Remoto - Caminho - Win32 nativo GET /..%20/ lê fora do document-root
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · lighttpd-win32-dotdot-space
Classe: Leitura de arquivo Alcance: Remoto
lighttpd 1.4.85 (4852959) - lighttpd
O staticfile nativo _WIN32 junta document-root a rel_path após buffer_path_simplify. O simplify só dobra ../ quando o terceiro byte é /. http_response_prepare_physical remove espaços e pontos à direita do caminho inteiro apenas. Portanto GET /..%20/windows/win.ini permanece /.. /windows/win.ini. _wstati64 / _wopen sem prefixo \\?\ então deixam o Win32 remover o espaço por componente e tratar esse segmento como ...
GET/HEAD não autenticado em lighttpd nativo Windows lê um arquivo regular fora do document-root que a conta do worker consegue abrir. Unix/Linux não é este resíduo. Leitura de arquivo, não RCE.
O lab é um gadget dessas funções de pin. Não é um worker Win32 nativo real. A última linha usa how=gadget.
| ID | sem CVE ainda |
| Classe | Leitura de arquivo (path traversal, ..%20/ nativo Win32) |
| Alcance | Remoto (GET/HEAD não autenticado) |
| CWE | CWE-22 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
| Produto | lighttpd1.4 |
| Afetado | 1.4.85 (4852959e67ef51ea68084984400d3264b854c97d) _WIN32 nativo |
| Auth | nenhuma. mod_staticfile padrão |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1, how=gadget |
Precisa de lighttpd nativo Windows servindo arquivos estáticos. A conta do worker deve conseguir abrir o arquivo regular alvo.
| Privilégio | Método / sink | Comprovado em lab ou inferido |
|---|---|---|
Ler um arquivo fora do document-root | GET /..%20/<name> não autenticado | Comprovado em lab (gadget). Corpo HTTP 200 é o segredo do diretório pai |
Mesma classe para outro espaço/ponto ASCII à direita em um componente .. não final | url-decode e então simplify mantém .. | Comprovado em lab para %20. Inferido para outro espaço/ponto à direita |
| HEAD no mesmo caminho | staticfile HEAD | Inferido. O lab usou GET |
Negativo: /../ real | buffer_path_simplify dobra ../ | Comprovado em lab. 404, /windows/win.ini simplificado, sem witness |
| Negativo: open POSIX Unix da string física não simplificada | open("/srv/htdocs/.. /windows/win.ini") | Comprovado em lab. ENOENT |
Fechado neste resíduo: staticfile Unix/Linux; Cygwin (mesma remoção, open POSIX); %5C parseopt do 1.4.85; alias CVE-2018-19052; Host CVE-2014-2324. Não é RCE. Não é escrita.
Fixe o tag lighttpd-1.4.85. Vinte caçadas. staticfile padrão Unix/Linux, FastCGI, proxy, TLS, auth, HTTP/2, alias/rewrite: nada neste nível. A onda de parser 1.4.81-1.4.85 já fechou trailers, conflitos de header CGI e Content-Length inválido de backend.
buffer_path_simplify só dobra ../ quando walk[2] == '/'. A remoção WIN32 em http_response_prepare_physical (src/response.c 334-360) é a cauda do caminho inteiro. _wstati64 / _wopen (src/fs_win32.c 24-77) passam UTF-16 sem \\?\, então o Win32 remove espaços à direita por componente e .. vira ... A junção física é doc_root + rel_path sem verificação de basedir pós-stat.
Caminhos errados já registrados: tratar ENOENT Unix como "não é bug" (é o controle negativo); chamar Cygwin de Win32 nativo; afirmar que %5C do 1.4.85 é este resíduo; inflar leitura de arquivo para RCE. Teatro: um reverse shell. O oráculo é um corpo 200 vindo do pai do document-root.
python3 lighttpd-win32-dotdot-space-Abraxas-Labs.py
ou
cd lab
./run.sh
O lab é um gadget fiel de buffer_urldecode_path, buffer_path_simplify (mapa '\\' do Win32), a remoção de cauda do response.c, e _wstati64 sem \\?\. O open POSIX Unix é o controle negativo. A resolução Win32 é implementada como a mesma remoção de espaço à direita por componente, depois . / .., depois um open POSIX do caminho resolvido. HTTP loopback 127.0.0.1:19400.
/index.html -> 200 public-index, sem witness./../windows/win.ini -> 404, /windows/win.ini simplificado./..%20/windows/win.ini -> decodificado /.. /windows/win.ini, simplify manteve o espaço, ENOENT Unix, Win32 resolveu /srv/windows/win.ini, witness 200.SUCCESS lighttpd-win32-dotdot-space how=gadget win32-get=200 unix-open=enoent simplify-kept-dotdot-space=yes LIGHTTPD-WIN32-DOTDOT-SPACE-WITNESS
Remover espaços e pontos à direita por componente de caminho antes do simplify, ou prefixar opens Win32 com \\?\ e rejeitar um caminho físico que não permaneça sob document-root.
4852959e67ef51ea68084984400d3264b854c97d)src/buffer.c · src/response.c · src/fs_win32.c%5C parseopt do 1.4.85 · alias CVE-2018-19052 · Host CVE-2014-2324GNU Affero GPL v3.0. Veja LICENSE. Apenas lab loopback. Sem garantia.