GHOST_SERVERS: Implementing HTTP via SystemD Sockets & Bash
GHOST_SERVERS: Implementing HTTP via SystemD Sockets & Bash
[ 0x00 ] A PEGADA DOS DAEMONS MODERNOS
Tornou-se padrão na arquitetura web moderna subir stacks complexas como containers de Node.js, instâncias Apache ou servidores Nginx completos apenas para expor um endpoint simples de monitoramento, servir um JSON estático de status ou responder a webhooks simples de C2. Cada processo ativo consome megabytes de RAM na tabela de processos do kernel, expõe dependências e deixa uma pegada forense perceptível.
Para cenários minimalistas ou de alta restrição, é possível erguer um serviço HTTP funcional e isolado aproveitando recursos nativos do sistema operacional Linux: o gerenciador SystemD e o interpretador Bash.
[ 0x01 ] SYSTEMD SOCKET ACTIVATION
O mecanismo baseia-se na funcionalidade de Socket Activation do SystemD. Em vez de manter um interpretador ou binário em loop infinito consumindo CPU e memória aguardando conexões (como em um loop listen), delegamos a escuta da porta de rede diretamente ao daemon de init do kernel (SystemD).
Quando um pacote TCP atinge a porta monitorada, o SystemD intercepta o evento, instancia (fork) o script Bash correspondente em tempo de execução e repassa o descritor de conexão diretamente via entrada e saída padrão (stdin/stdout). Ao encerrar a conexão, o processo do shell é finalizado, retornando a zero o consumo de memória do serviço.
Crie o arquivo de escuta do socket em /etc/systemd/system/ghost-http.socket:
[Unit]
Description=Ghost HTTP Socket Activation Service
[Socket]
ListenStream=8080
Accept=yes
[Install]
WantedBy=sockets.target
A diretiva Accept=yes instrui o SystemD a spawnar uma instância isolada do serviço para cada conexão concorrente estabelecida na porta 8080.
[ 0x02 ] A UNIDADE DE SERVIÇO TEMPLATE
Crie o arquivo de definição do serviço /etc/systemd/system/ghost-http@.service. O caractere @ no nome identifica que este é um serviço template, permitindo que o SystemD spawne instâncias dinâmicas (ex: ghost-http@1-127.0.0.1:8080.service) para cada socket aceito.
[Unit]
Description=Ghost HTTP Ephemeral Instance
Requires=ghost-http.socket
[Service]
StandardInput=socket
StandardOutput=socket
ExecStart=/usr/local/bin/ghost-server.sh
[ 0x03 ] O BACKEND EM SHELL SCRIPT
Abaixo está o script que manipula o tráfego HTTP. Note a presença obrigatória de aspas duplas nas variáveis para evitar problemas de segurança associados à expansão de caminhos (globbing) e word-splitting, além do uso de read -r para tratamento correto de barras invertidas.
/usr/local/bin/ghost-server.sh:
#!/bin/bash
# 1. Lê a primeira linha da requisição HTTP (Request-Line) de forma segura (sai em caso de EOF precoce)
read -r request || exit 1
# Remove quebras de linha CRLF (
)
request=$(echo "$request" | tr -d '
')
# 2. Loop para exaurir os cabeçalhos restantes da requisição (impede quebras de pipe)
while read -r line; do
line=$(echo "$line" | tr -d '
')
[ -z "$line" ] && break
done
# 3. Processamento de rota básica via awk
route=$(echo "$request" | awk '{print $2}')
# 4. Geração de resposta HTTP válida e cabeçalhos obrigatórios
if [ "$route" == "/api/status" ]; then
# Responde com JSON dinâmico baseado em métricas de processamento reais
load_avg=$(cat /proc/loadavg | awk '{print $1}')
echo -e "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nConnection: close\r\n\r\n"
echo -e "{\"status\": \"active\", \"load_1m\": $load_avg}"
else
# Responde com HTML estático convencional
echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n"
echo -e "<html><body><h1>Ghost Server</h1><p>Operando via Socket Activation.</p></body></html>"
fi
Habilite o socket no sistema operacional:
chmod +x /usr/local/bin/ghost-server.sh
systemctl daemon-reload
systemctl enable --now ghost-http.socket
[ 0x04 ] VULNERABILIDADE A DOS (FORK BOMBING) E HARDENING DE UNIDADES
Embora seja uma solução extremamente elegante e silenciosa, a configuração descrita anteriormente expõe o servidor a ataques de Negação de Serviço (DoS) simples por exaustão de PIDs. Como cada conexão concorrente inicia um processo Bash em user-space, um ataque volumoso estourará o limite máximo de PIDs do kernel (/proc/sys/kernel/pid_max), travando todo o sistema operacional.
Para mitigar este vetor de ataque e assegurar a robustez do ambiente, é obrigatório enriquecer as configurações de limites de recursos diretamente nas diretivas do SystemD:
No arquivo /etc/systemd/system/ghost-http.socket (Limitação ao nível do driver de rede do SystemD):
[Socket]
ListenStream=8080
Accept=yes
# Limite máximo de conexões concorrentes ativas
MaxConnections=100
# Limite de conexões simultâneas originadas de um único endereço IP
MaxConnectionsPerSource=5
No arquivo /etc/systemd/system/ghost-http@.service (Limitação ao nível do cgroup do processo):
[Service]
StandardInput=socket
StandardOutput=socket
ExecStart=/usr/local/bin/ghost-server.sh
# Limita o número máximo de processos que a unidade pode instanciar (cgroup fork limit)
LimitNPROC=10
# Evita esgotamento estrito de tasks
TasksMax=5