WireShark Remoto

Recentemente deparei-me com a necessidade de analisar tráfego, em tempo real, de servidores remotos com recurso ao Wireshark. A solução encontrada para capturar pacotes remotamente foi a criação de um “named pipe”.

O “named pipe” foi criado com o seguinte comando:

mkfifo /tmp/remote_ppr

Uma vez criado o “named pipe” foi efetuado um tcpdump no servidor remoto fazendo o output para o “named pipe” utilizando o seguinte comando:

ssh root@myserver “tcpdump -s 0 -U -n -w – -i eth0 ‘not port 22 and (host 10.51.234.1 or host 10.51.234.2)'” > /tmp/remote

Por fim, foi iniciado o wireshark a efetuar a leitura dos pacotes recebidos pelo “named pipe”

wireshark -k -i /tmp/remote

Liferay – Enumeração de utilizadores utilizando os documentos

Uma das vulnerabilidades existentes no liferay que permite enumerar utilizadores existentes na plataforma encontra-se no caminho dos documentos do Liferay, para corrigir esta vulnerabilidade deve seguir-se o seguinte procedimento:

Editar o ficheiro urlrewrite.xml (\tomcat-7.0.40\webapps\ROOT\WEB-INF

Inserir a seguinte regra:

<rule>
<from>^/documents/([A-Za-z]+)</from>
<to type=”permanent-redirect”>/</to>
</rule>

Erro “Unable to verify leaf signature” no NodeJS

Recentemente, após instalar uma aplicação NodeJS (MEAN Stack) deparei-me com o erro “Unable to verify leaf signature”. Após alguns despites conclui que a dificuldade encontrada estava relacionada com a cadeia de certificação associada ao certificado SSL utilizado pela aplicação. A minha primeira abordagem foi verificar no servidor NGINX a correta configuração do certificado e devida cadeia, no entanto todas as configurações estavam de acordo com as especificações, desta forma conclui que o a situação estava relacionada com servidor aplicacional (NodeJS).

Para tornar a aplicação funcional executei o seguinte procedimento no servidor aplicacional:

npm install ssl-root-cas

Este pacote NodeJS contem vários certificados intermédios que são “confiáveis” pelo browser mas não pelo NodeJS

var sslRootCAs = require('ssl-root-cas/latest')
sslRootCAs.inject()

Desta forma os certificados em falta serão adicionados.

Para além desta situação foi-me necessário adicionar mais certificados a este modulo pois por defeito os que eu necessitava não se encontravam neste “bundle”, para tal foi ncessário fazer o download dos certificados em falta para tal utilizei o seguinte procedimento:

require('ssl-root-cas/latest')
  .inject()
  .addFile(__dirname + '/certificadointermedioemfalta.crt');

Adicionar IP secundário em Linux

Adicionar IP temporário

Utilizando o ifconfig

Caso seja necessário adicionar um ip secundário a um interface que se encontra em uso e esta situação é temporária deve correr-se o seguinte comando:

ifconfig [nic]:0 [IP-Address] netmask [mask] up

Como exemplo:

ifconfig eth0:0 192.168.1.2 netmask 255.255.255.0 up

Para correr este comando é necessário estar autenticado com o user root.

Utilizando o comando ip

Para efetuar esta configuração utilizando o binario ip deve correr-se o seguinte comando:

ip address add [ip]/[mask-digits] dev [nic]

Como exemplo:

ip address add 192.168.99.37/24 dev eth0

Adicionar IP permanentemente

CentoOS/RHEL

Para sistemas Centos/RHEL deve criar-se um ficheiro chamado:

ifcfg-eth0:1

O ficheiro deverá ter os seguintes conteudos:

NAME=""
BOOTPROTO=none
MACADDR=""
IPV6INIT=no
DEVICE=eth0:1
NETMASK=255.255.255.248
MTU=""
ONPARENT=yes
IPADDR=192.168.8.1
ONBOOT=yes

Uma vez efetuada a configuração devem reiniciar-se os serviços de network:

service network restart

JVM 100% CPU Leap Second

Na passagem do ano deparei-me com uma situação no mínimo curiosa, devido ao facto do ultimo minuto do ano ter tido 1 segundo a mais (leap second) várias JVM’s ficaram com uma utilização excessiva de CPU, afetando assim a performance de vários servidores. Depois de várias pesquisas, verifiquei que as recomendações de multiplos fabricantes era: efetuar reboot aos servidores em questão. Por se tratarem de ambientes produtivos, não considerei boa opção reiniciar as máquinas e descobri um “workaround”. Aparentemente forçar um reset à data é suficiente para corrigir o problema.

O comando a utilizar é o seguinte:

date -s "`date`"

 

/bin/tar: Argument list too long

Quando o numero de ficheiros numa diretoria excede 30.000 comprimilos pode ser um desafio. Seguem os passos para concluir esta tarefa com sucesso::

find . -name '*.txt' -print >/tmp/ficheiros
tar -cvzf textfiles.tar.gz --files-from /tmp/ficheiros
find . -name '*.txt' | xargs rm -v

Criar certificado auto-assinado para servidor Apache

De forma a criar um certificado auto-assinado para um virtualhost Apache deve optar-se pela utilização do OpenSSL. Uma vez que esteja assegurado que o OpenSSL está instalado deve correr-se o seguinte comando para gerar o certificado e chave privada:

# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mysitename.key -out mysitename.crt

Logar IP do Cliente e IP X-Forwarded-For IP no Apache

Quando o servidor apache fica atrás de um proxy ou loadbalancer o IP do cliente é substituido pelo IP do balanceador/proxy. Para ultrapassar esta limitação um cabeçalho/header costumizado foi desenvolvido pela equipe de desenvolvimento do squid, o X-Forwarded-For header.

A configuração default de logging do apache tem o seguinte formato:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog log/acces_log combined

São necessárias varias alterações à configuração por defeito de forma a que o X-Forwarded-For e o ip real do visitante seja logado. As alterações são as seguintes:

LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
LogFormat “%{X-Forwarded-For}i %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” proxy
SetEnvIf X-Forwarded-For “^.*\..*\..*\..*” forwarded
CustomLog “logs/access_log” combined env=!forwarded
CustomLog “logs/access_log” proxy env=forwarded

Estas alterações resultam no log do endereço IP de cada pedido.

Comando “screen”

O comando screen é uma ferramenta muito pouco utilizada mas de grande utilidade uma vez que permite correr processos em background independentes da sessão do utilizador. Seguem alguns atalhos de teclas utilizados no screen.
Combinação Acção
Ctrl+a c nova janela
Ctrl+a n próxima janela
Ctrl+a p janela anterior
Ctrl+a “ escolher janela da lista
Ctrl+a Ctrl+a ultima janela ativa
Ctrl+a S dividir terminal horizontalmente em regiões
Ctrl+a | dividir terminal verticalmente em regiões
Ctrl+a :resize redimensionar região
Ctrl+a :fit adaptar a resolução do monitor ao tamanho do novo terminal
Ctrl+a :remove remover região
Ctrl+a tab mover para a próxima região
Ctrl+a d desanexar o screen do terminal
Ctrl+a A definir titulo da janela
Ctrl+a x bloquear sessão
Ctrl+a [ entrar no modo de copia
Ctrl+a ] buffer de paste
Ctrl+a > escrever  o paste buffer para fichero
Ctrl+a < ler o paste buffer do ficheiro
Ctrl+a ? ver key bindings/nomes dos comandos
Ctrl+a : screen command prompt

Como configurar um “reverse tunel SSH” em Linux para utilizar com privoxy

O Reverse “SSH Tunneling” é uma técnica que permite aceder a sistemas que se encontram bloqueados, por exemplo com uma firewall.

Por vezes é necessário aceder a partir de um sistema sem acesso à internet aos repositórios da distribuição ou a outros recursos expostos na internet.

No nosso exemplo este acesso faz-se com o privoxy, sendo que a maquina que vai servir de proxy é um servidor debian.

Para instalar o privoxy deve executar-se o seguinte comando:

$ sudo apt-get install privoxy

Uma vez instalado deve fazer-se start ao serviço com o seguinte comando:

$ sudo systemctl start privoxy

Para configurar o serviço para arrancar durante o boot executa-se o seguinte:

$ sudo systemctl enable privoxy

As configurações por defeito são suficientes para o nosso objetivo, deverá ter-se em conta que este servidor que irá servir de proxy tem de ter acesso à internet.

Uma vez instalado e feito o arranque do privoxy procedemos à criação do reverse tunel, com recurso ao seguinte comando:

$ ssh -R 8118:localhost:8118 username@REMOTEIP

Neste momento o servidor remoto que não tinha acesso à internet já tem neste momento ligação ao nosso servidor privoxy.

Para concluirmos a operação devemos configurar o proxy no servidor remoto, para tal executam-se os seguintes comandos no servidor remoto:

# export http_proxy="http://localhost:8118"
# export https_proxy="https://localhost:8118"
# export ftp_proxy="ftp://localhost:8118"