Base64 na linha de comando

Ter que acessar um site ou criar um mini-programa só para codificar ou decodificar um Base64 parece muito trabalho, certo?
Com esses aliases que podem ser inseridos no arquivo .profile por exemplo, você rapidamente executa esse trabalho usando PHP:

alias encode='php -r '\''print base64_encode($argv[1])."\n";'\'''
alias decode='php -r '\''print base64_decode($argv[1])."\n";'\'''

Teste:

-bash-4.1$ encode teste
dGVzdGU=
-bash-4.1$ decode dGVzdGU=
teste

Tipos de Matching

Determinístico: equivalência, busca exata
Fonético: considera variações sem supressão, transforma palavras em fonemas
Linguístico: fonético com variações de sintaxe específicos (nome, endereço, etc.)
Empírico: acrescenta inteligência da interação humana
Heurístico: distância ou esforço entre strings
Probabilístico: considera a frequência numa população

Iptables para acessar proxy através de outro servidor

Quero documentar um procedimento que pode ser útil em muitos casos. Especificamente eu queria acessar o proxy (http) em um servidor sem liberação no firewall para fazer isso, mas com acesso a outro servidor com essa liberação, ambos rodando Linux e com iptables.
Embora utilize o proxy no exemplo, essa técnica pode ser usada em teoria para qualquer tipo de serviço, pois o que estamos fazendo é criar uma nova rota para nossos pacotes.
Nomenclaturas (supondo que esses nomes resolvem um IP):
– servidor: a máquina que precisa acessar o serviço, no caso o proxy
– proxy: servidor que desejo acessar, cujo serviço é executado na porta 8080
– ponte: máquina que tenho acesso e utilizarei para chegar no serviço de proxy
Primeiramente, criamos uma regra no servidor para direcionar as requisições que farei para http://proxy:8080/ para o servidor ponte:

iptables -t nat -A OUTPUT -d proxy -p tcp -m tcp --dport 8080 -j DNAT --to-destination ponte

Agora vamos configurar o servidor ponte, para não esquecer vamos começar dizendo ao Kernel que ele deve fazer roteamento:

sysctl -w net.ipv4.ip_forward=1

E agora as regras do iptables, começamos dizendo que antes de rotear, ele deve trocar o destino do pacote:

iptables -t nat -A PREROUTING -s servidor -p tcp -m tcp --dport 8080 -j DNAT --to-destination proxy

E depois dizemos que o acesso desejado deve ser mascarado, ou seja, o iptables faz o acesso e repassa para o solicitante (esse é o modo mais usado de nat no iptables):

iptables -t nat -A POSTROUTING -s servidor -p tcp -m tcp --dport 8080 -j MASQUERADE

Pronto! Caso queira acompanhar os pacotes passando pela regra do iptables:

iptables -t nat -nvL

Tcpdump

Para quem não conhece, tcpdump é um analisador de tráfego de rede. Por “escutar” o que passa pela placa de rede, você precisa executá-lo com usuário root.
O objetivo não é estender muito sobre ele, mas apenas descrever algumas informações importantes.
Primeiramente vamos rever os tipos de possíveis flags nos pacotes de rede com a sigla que aparece na análise:
S (SYN), F (FIN), P (PUSH), R (RST), W (ECN CWR), E (ECN-Echo)
Caso nenhum flag esteja definido, apenas um ponto ‘.’ aparece, exemplo: “Flags [.]”.
Ao executar o comando tcpdump sem argumentos, uma captura é iniciada sem filtros utilizando a placa de rede primária. Exemplo especificando outra placa de rede:

tcpdump -i lo

Além de visualizar os resultados na tela, também é possível salvá-lo em um arquivo para futura análise:

tcpdump -w /tmp/dump

Para abrir o arquivo salvo:

tcpdump -r /tmp/dump

Um argumento interessante a utilizar é o “-A” que tenta abrir os pacotes para exibir o conteúdo, exemplo:

$ tcpdump -A host 10.0.0.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
14:48:11.162477 IP server1.corp.33951 > server2.corp.wap-wsp: Flags [P.], seq 1:189, ack 1, win 115, options [nop,nop,TS val 2116848677 ecr 826203350], length 188
E.....@.@..)
...
.....#...r.1w.....sQ......
~,.%1>..GET /_search?pf.nome=diego HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: server2:9200
Accept: */*

Outros argumentos interessantes:
-nn: numérico (não resolve nome de host ou porta)
-vv: verboso (mais informações)
-XX: exibe o conteúdo em hexadecimal e ASCII
Filtros interessantes:
host (servidor de origem ou destino)
tcp port
Exemplo:

$ tcpdump -nnvvXX host 10.0.0.1 and tcp port 9200
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
14:56:51.724354 IP (tos 0x0, ttl 64, id 50362, offset 0, flags [DF], proto TCP (6), length 422)
    10.0.0.2.33954 > 10.0.0.1.9200: Flags [P.], cksum 0x5163 (correct), seq 1:371, ack 1, win 115, options [nop,nop,TS val 2117369239 ecr 826723912], length 370
        0x0000:  0050 56b3 1263 0050 56b3 8ab4 0800 4500  .PV..c.PV.....E.
        0x0010:  01a6 c4ba 4000 4006 244c 0a14 1e11 0a14  ....@.@.$L......
        0x0020:  1e13 84a2 23f0 6ab5 b930 8d28 46fe 8018  ....#.j..0.(F...
        0x0030:  0073 5163 0000 0101 080a 7e34 7d97 3146  .sQc......~4}.1F
        0x0040:  ce48 504f 5354 202f 5f73 6561 7263 6820  .HPOST./_search.
        0x0050:  4854 5450 2f31 2e31 0d0a 5573 6572 2d41  HTTP/1.1..User-A
        0x0060:  6765 6e74 3a20 6375 726c 2f37 2e31 392e  gent:.curl/7.19.
        0x0070:  3720 2878 3836 5f36 342d 7265 6468 6174  7.(x86_64-redhat
        0x0080:  2d6c 696e 7578 2d67 6e75 2920 6c69 6263  -linux-gnu).libc
        0x0090:  7572 6c2f 372e 3139 2e37 204e 5353 2f33  url/7.19.7.NSS/3
        0x00a0:  2e31 352e 3320 7a6c 6962 2f31 2e32 2e33  .15.3.zlib/1.2.3
        0x00b0:  206c 6962 6964 6e2f 312e 3138 206c 6962  .libidn/1.18.lib
        0x00c0:  7373 6832 2f31 2e34 2e32 0d0a 486f 7374  ssh2/1.4.2..Host
        0x00d0:  3a20 6170 7065 6c73 3031 703a 3932 3030  :.server01p:9200
        0x00e0:  0d0a 4163 6365 7074 3a20 2a2f 2a0d 0a43  ..Accept:.*/*

Script para listar aplicações do WebSphere via wsadmin

Esse script utiliza a biblioteca wsadminlib, que facilita muito o uso:

execfile('wsadminlib.py')
print "app;cluster;startingWeight;VirtualHost;ContextRoot"
apps = listApplications()
for app in apps:
    cluster = getClusterTargetsForApplication(app)
    priority = AdminConfig.show(AdminConfig.showAttribute(AdminConfig.getid('/Deployment:'+app+'/'),'deployedObject'),'startingWeight').split()[1].replace(']','')
    vh = getApplicationVirtualHost(app) or ''
    cr = getApplicationContextRoot(app) or ''
    print app+';'+cluster[0]+';'+priority+';'+vh+';'+cr

As colunas estão separadas por ponto-vírgula para abrir diretamente no Excel brasileiro.

Script para listar portas no WebSphere via wsadmin

print "CellName,NodeName,ClusterName,ServerName,host,portRMI,portWeb"
clusters = AdminConfig.list('ServerCluster').splitlines()
for cluster in clusters :
    ClusterName = cluster.split( '(', 1 )[ 0 ]
    servers = AdminConfig.list('ClusterMember', cluster).splitlines()
    for server in servers :
        ServerName = server.split( '(', 1 )[ 0 ]
        ServerId = AdminConfig.getid('/ServerEntry:'+ServerName+'/')
        CellName = ServerId.split( '/' )[ 1 ]
        NodeName = ServerId.split( '/' )[ 3 ].split('|',1)[0]
        NamedEndPoints = AdminConfig.list('NamedEndPoint', ServerId).splitlines()
        for namedEndPoint in NamedEndPoints:
            endPointName = AdminConfig.showAttribute(namedEndPoint, "endPointName" )
            endPoint = AdminConfig.showAttribute(namedEndPoint, "endPoint" )
            if endPointName=='WC_defaulthost':
                portWeb = AdminConfig.showAttribute(endPoint, "port" )
            if endPointName=='BOOTSTRAP_ADDRESS':
                host = AdminConfig.showAttribute(endPoint, "host" )
                portRMI = AdminConfig.showAttribute(endPoint, "port" )
        print CellName+","+NodeName+","+ClusterName+","+ServerName+","+host+","+portRMI+","+portWeb

Parser PHP do Plugin WebSphere para IHS

Um jeito fácil de listar a configuração de URLs e portas configuradas no WebSphere é baixar o arquivo XML de configuração do plugin do IHS e realizar um parse utilizando o código PHP abaixo:

<?php
$xml = simplexml_load_file('plugin-cfg.xml');
   
$json_string = json_encode($xml);
   
$result_array = json_decode($json_string, TRUE);
sort($result_array['VirtualHostGroup']);
foreach ($result_array['VirtualHostGroup'] as $cada) {
    print $cada['@attributes']['Name']."\n";
    sort($cada['VirtualHost']);
    foreach ($cada['VirtualHost'] as $vh) {
        print "\t".$vh['@attributes']['Name']."\n";
    }
}
?>