MAL - Memória Auxiliar do Lutieri

terça-feira, dezembro 26, 2006

smb_auth + squid = furos de segurança

Olá!!

É usado aqui na empresa a combinação citada acima. Descobri essa semana, na verdade foram os usuários(Acreditem eles tem esse poder), que existem várias formas de burlar o coitadinho do squid e sua autenticação usando o esquema de autenticação smb_auth.

Vou descrever melhor a configuração do proxy.

Existem grupos de usuários que têm acesso restrito há apenas alguns site, pelo menos deveriam. Vamos exemplificar:

joao
maria
gorete
luiz
gabriel


Vamos acreditar que eu tenha os nomes acima em um arquivo chamado usuarios_restritos.txt e os mesmos só podem ter acesso ao site da Brasil Telecom(www.brasiltelecom.com.br).

no meu squid.conf vou ter uma ACL que faz esse casamento. Usuários da lista com o site da BrT. Algo do tipo:

#Usuários Restritos
acl usuariosrestritos proxy_auth -i "/etc/squid/usuarios_restritos.txt"
#site para usuários restritos
acl sitebrt url_regex -i "brasiltelecom.com.br"

http_access allow sitebrt usuariosrestritos
Beleza! Funciona! Se na hora da autenticação o usuário digitar no campo de
nome de usuário: joao
senha: 123

o módulo smb_auth vai tentar autenticar no AD se estiver o nome de usuário e senha corretos: Tcharã... o neguim vai ter acesso somente ao site da BrT. Mas, porém, contudo, entretanto, todavia existem algumas maneiras de se autenticar usando uma sintaxe diferente no nome de usuário. Aí você fica se perguntado: "E que diferença isso faz?!?!" Toda..

Vamos a um outro exemplo.
Suponhamos que exista um arquivo chamado usuarios_bloqueados.txt onde contém o nome de alguns usuários que acessaram muita putaria e o chefe mandou bloquear os ditos cujos.

No arquivo vai conter:

roger
almir
roque
silvio

e vai ter a ACL pra bloquear os nomes contidos nesse arquivo. Perfeito.

O pulo do gato vem agora. Se o usuário digitar algo do tipo: dominio\roger. Ele já deixou de ser o roger da lista de bloqueados e portanto vai navegar normalmente como se fosse outro usuário.

Para que isso não aconteça, normalmente se cadastra essa forma de se autenticar no arquivo de bloqueio. Portanto para cada usuário teríamos duas entradas distintas(por enquanto). O arquivo de usuários bloqueados ficaria assim:

roger
dominio\roger

almir
dominio\almir

roque
dominio\roque

silvio
dominio\silvio


Porém existem mais algumas várias variações que eu descobri com a ajuda de meus usuário queridos :-)

Vou colar aqui algumas variações, para um mesmo nome de usuário, as quais devem ser inseridas quando se faz referência àlgum usuário no squid + smb_auth.

joao
\joao
\\joao
\\\joao
\\\\joao
seudominio/joao
seudominio\joao
seudominio\\joao
seudominio\\\joao
seudominio\\\\joao
\seudominio\\joao
\seudominio\\\joao
\\seudominio\\joao
\\seudominio\\\joao


Sim. o joao consegue se autenticar usando qualquer uma das maneiras acima. E sendo assim ele tem várias maneiras de deixar de ser o cara que tá na lista de usuários que não podem navegar.

Agora imagina o rolo que isso não pode dá. Um dia teu chefe pede que seja bloqueado um usuário e tu confirma pra ele que o mesmo está sem acesso a internet. Alguns dias depois aparece no relatório do squid o boneco com acesso a sites XXX . E aí vai dizer o que pro chefe agora?!!?

Pensando nisso eu criei um script que gera todas essas formas de nome de usuário. Ele pode ser usado apenas para um usuário, exemplo:

usuariosquid joao


ou pode ser usuado apontando pra um arquivo que contenha o nome dos usuários um abaixo do outro:

usuariosquid /etc/squid/bloqueados.txt

O script vai gerar todas as variações pra cada linha não comentada e não em branca do arquivo apontado.


O script segue

######### Cut Here ############
#!/bin/bash
###############################################
# Script to Gererate all, or some, #
#variations for usernames used in squid files.#
# #
# by Lutieri G. B. #
###############################################

dominio=seudominio


if [ -z $1 ]
then
echo "Use: $0 'arquivo ou usuario' "
else
if [ -e $1 ]
then
#Just one parameter is needed. If is a file execute a loop for each user in file.
#Ignore commented lines in file
for i in `cat $1 | grep -v ^#`
do
echo
echo $i
echo "\\$i"
echo "\\\\$i"
echo "\\\\\\$i"
echo "\\\\\\\\$i"
echo "$dominio/$i"
echo "$dominio\\$i"
echo "$dominio\\\\$i"
echo "$dominio\\\\\\$i"
echo "$dominio\\\\\\\\$i"
echo "\\$dominio\\\\$i"
echo "\\$dominio\\\\\\$i"
echo "\\\\$dominio\\\\$i"
echo "\\\\$dominio\\\\\\$i"
done
#Else, isn't a file, will be understand as an username, then will return all outputs for this username
else
echo
echo $1
echo "\\$1"
echo "\\\\$1"
echo "\\\\\\$1"
echo "\\\\\\\\$1"
echo "$dominio/$1"
echo "$dominio\\$1"
echo "$dominio\\\\$1"
echo "$dominio\\\\\\$1"
echo "$dominio\\\\\\\\$1"
echo "\\$dominio\\\\$1"
echo "\\$dominio\\\\\\$1"
echo "\\\\$dominio\\\\$1"
echo "\\\\$dominio\\\\\\$1"
fi
fi

######### Cut Here ############

Sim.. eu escrevo os comentários em inglês!! =)

ele vai gerar todas as opções que eu consegui detectar. Não quero dizer que sejam todas. Pois os usuário tem uma capacidade de inventar que olha.... se usassem pro bem estariam ricos... hehe

eh só pegar a saída do programa e jogar pra algum arquivo.

usuariosquid joao >> usuarios_bloqueados.txt

fácil não?!?!

Apesar disso eu não gostei da idéia. Afinal de contas pra cada usuário eu vou ter que ter 14 entradas?!!?! não... isso não está certo. Daqui um pouco o cara começa a se perder em meio a tantas linhas para tão poucos usuários.

Resolvi, então, baixar o fonte do smb_auth e fazer as alterações necessárias para que isso seja evitado.

link: http://www.hacom.nl/~richard/software/smb_auth.html

Têm as instruções pra instalar e compilar ele. Não necessariamente nesta ordem :-)

To meio enferrujado em C mas deu pra consertar.

Faz o download. Descompacta e edita o smb_auth.c.

Vai na linha 215. vai ter um If assim:

if ((s = strchr(user, '\\')) != NULL)
{
*s = '\0';
domname = user;
user = s + 1;
}


Altera ele para que ele fique assim:

if ((s = strchr(user, '\\')) != NULL)
{
(void) printf("ERR\n");
continue;
}

if ((s = strchr(user, '/')) != NULL)
{
(void) printf("ERR\n");
continue;
}


O que foi feito?! Se criatura informar um nome de usuário que contenha barra(uma, duas, três... tanto faz), normal ou inversa, vai retornar erro.

Por quê aceitar as barras se não precisa delas?!?

-> compilar com o make. Não esqueça de ajustar as variáveis no Makefile.

-> Pára o squid joga o smb_auth por cima do atual, restarta e OK.


caso queira testar antes executa: ./smb_auth -W dominio -U IP_do_AD

Feito o carreto....

That's all folks!!

[]'s

0 Comentários:

Postar um comentário

<< Home



Chat with Lutieri G. B.

Subscribe in a reader