quarta-feira, 23 de julho de 2025

FreeRadius bypass

Imaginem se um dia der M... você perdeu seu banco de dados, mas precisa acessar seus equipamentos, precisa liberar o mínimo de acesso aos clientes.

Eu ainda não passei por isso mas a alguns dias o MKSolutions deu uma travada quando eu atualizei um Mikrotik ele registra uma conta com data de 1900 e não remove, eu uso NTP em todos os equipamentos mas algo acontece e sempe que atualizo da verão 6 pra 7 o MKSolutions trava.

Bom isso me deixou muito incomodado e fiquei alguns dias batendo cabeça pra pensar quanto tempo eu levo pra levantar um freeradius genérico.

O modo mais rápido que achei foi baixar um conainer docker

docker run --name radius  -p 1812-1813:1812-1813/udp  -d freeradius/freeradius-server:latest -X

Agora a primeira limitação é que vc precisa saber o secret se seu nas manda o secret.

/etc/freeradius/clients.conf 

client generico {
         ipaddr = 0.0.0.0/0
         proto = *
         secret = testing123 #ajuste esse valor ou nada vai funcionar
         require_message_authenticator = no
         nas_type     = other 
}

Para autenticar os clientes vc tem 4 protocolos configurados mas pense que são 2 formas:

  • PAP onde a senha é enviada em texto claro e vc pode aceitar qualquer senha.
  • CHAP/MSCHAP/MSCHAP2 onde a senha não é enviada e vc ainda precisa retornar uma confirmação que vc sabia qual era a senha. Se todos os seus clientes tiverem usuários diferentes mas a mesma senha também não é um problema.

Para acessar o Mikrotik vc pode querer usar ssh e ai fica fácil nem te pede a senha, ou pode insistir em usar o Winbox que usa CHAP. Vc precisa saber qual é a senha.

Eu criei um modulo python3 vc vai olhar e se souber o minimo vai sacar o que deve mudar nele.

O arquivo radiusd.py fica em /etc/freeradius/mods-config/python3/radiusd.py mas só usei uma constante RLM_MODULE_OK o valor dela é 2 numérico se quiser colocar direto e não usar import.

#! /usr/bin/env python3

import radiusd

def authorize(p):

    reply = (
            ('Mikrotik-Group', 'full'), #libera acesso ao mikrotik
            ('Mikrotik-Address-List', 'radiusList'),
            ('Mikrotik-Rate-Limit', '440m/880m 0k/0k 0k/0k 0/0 8 60m/60m'),
            ('Huawei-Output-Average-Rate', '829440000'),
            ('Huawei-Input-Average-Rate', '409600000'),
            ('Framed-Pool', 'poolRadius'),
            ('Framed-IP-Address', '192.168.100.254'),
            ('Mikrotik-Wireless-PSK', '1234568'),
        )

    config = (
            ('Cleartext-Password', 'senha_padrao'), # necessario para mschap chap
            ('Auth-Type', 'authmod'),
        )

    return (radiusd.RLM_MODULE_OK, reply, config)

def authenticate(p):
    request = dict(p)
    print("*** authenticate ***")
    print(request.get("User-Name", "sem nome"))
    return radiusd.RLM_MODULE_OK

Você vai precisar declarar seu modulo:

/etc/freeradius/mods-enabled/python3
python3 authmod {
    module = authmod
    python_path = /etc/freeradius/python3
    mod_authorize = authmod
    func_authorize = authorize
    mod_authenticate = authmod
    func_authenticate = authenticate
}

E depois de declarar precisa usar então configurar o seu uso no "site".

Aqui temos uma decisão para tomar.

  • Se vc tirar # do que esta no arquivo abaixo vc consegue acesso ao mikrotik por ssh sem colocar senha, mas não vai conseguir acessar por winbox nem autenticar clientes pppoe por chap, só vão logar por PAP no PPPoE.
  • Sem tirar esse comentário qualquer usuário que usar a "senha_padrao" tem acesso. Ou seja não tem muita vantagem.
/etc/freeradius/sites-enabled/default
authorize {
    authmod
}
authenticate {
    # só tire o comentário para acessar por ssh sem senha 
    #Auth-Type mschap {
    #    authmod
    #}
    authmod
}

Espero que seja útil para alguém

Se vc não domina muito bem docker vou deixar alguns comandos que usei muito:

Copiar da sua maquina para o container e executar alguns comando dentro dele:

docker cp mods-available/python3 radius:/etc/freeradius/mods-available/python3
docker exec radius ln -s /etc/freeradius/mods-available/python3 /etc/freeradius/mods-enabled/python3
docker exec radius mkdir /etc/freeradius/python3
docker cp python3/authmod.py radius:/etc/freeradius/python3/authmod.py
docker cp python3/__init__.py radius:/etc/freeradius/python3/__init__.py
docker exec radius cp /etc/freeradius/mods-config/python3/radiusd.py /etc/freeradius/python3/
docker cp sites-available/default radius:/etc/freeradius/sites-available/default

Reiniciar o contaner e olhar o log

docker stop radius
docker start radius
docker logs radius

Exibir arquivos de configuração sem comentários:

docker exec radius grep -vE '^\s*$|^\s*#' /etc/freeradius/clients.conf 

Entrar no shell do container:

docker exec -it radius bash

Testar o login de forma básica

radtest edu 123 localhost 0 testing123

sábado, 19 de julho de 2025

UISP/UNMS não adota M5

Problemas com Nginx Proxy Manager e rádios M5

Eu uso nginx proxy manager e estava tendo problema em conectar meus rádios M5.

Infelizmente a solução reduziu a segurança de todos os meus outros serviços deste proxy porque não achei uma solução que poderia ser aplicada a um único host.

Outro problema: não sei deixar o meu NPM configurado se recriar o container.

Solução: criar certificados na Let's Encrypt do tipo RSA

Para isso eu editei o /etc/letsencrypt.ini alterando key-type = ecdsa para key-type = rsa.

/etc/letsencrypt.ini

text = True
non-interactive = True
webroot-path = /data/letsencrypt-acme-challenge
key-type = rsa
elliptic-curve = secp384r1
preferred-chain = ISRG Root X1

Alteração no algoritmo de troca de chave DH

Para isso precisa criar o arquivo dhparam.pem com o comando:

openssl dhparam -out /etc/nginx/dhparam.pem 2048

Após criar o arquivo precisa ser indicado na configuração com ssl_dhparam, eu escolhi fazer essa configuração em /etc/nginx/conf.d/include/ssl-ciphers.conf

/etc/nginx/conf.d/include/ssl-ciphers.conf
# intermediate configuration. tweak to your needs.
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'DHE-RSA-AES128-GCM-SHA256:AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-A
ES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-PO
LY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
ssl_dhparam /etc/nginx/dhparam.pem;

Por último precisa reiniciar o nginx.

Configuração no container

Como estou usando container eu copiei e editei localmente os 2 arquivos de configuração depois enviei tudo para o container com os comandos:

docker exec nginx-proxy-manager-app-1 openssl dhparam -out /etc/nginx/dhparam.pem 2048
docker cp letsencrypt.ini nginx-proxy-manager-app-1:/etc/letsencrypt.ini
docker cp ssl-ciphers.conf.bkp nginx-proxy-manager-app-1:/etc/nginx/conf.d/include/ssl-ciphers.conf
docker restart nginx-proxy-manager-app-1

Testando a configuração

Para testar usei o nmap:

nmap --script ssl-enum-ciphers -p 443 uisp.xxxxxx.com.br

sexta-feira, 4 de julho de 2025

Expadir LVM em maquina virtual

Para expandir o disco precisamos:

  1. Com fdisk

    • apagar a partição
    • Recriar a partição com o mesmo setor de inicio

    IMPORTANTE: Não apagar a "LVM2_member signature"

    # fdisk /dev/vdb
    Command (m for help): p
    Disk /dev/vdb: 30 GiB, 32212254720 bytes, 62914560 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x986b9785
    
    Device     Boot Start      End  Sectors Size Id Type
    /dev/vdb1        2048 20971519 20969472  10G 8e Linux LVM
    
    Command (m for help): d 1
    
    Command (m for help): n
    Partition type
       p   primary (0 primary, 0 extended, 4 free)
       e   extended (container for logical partitions)
    Select (default p): p
    Partition number (1-4, default 1):
    First sector (2048-62914559, default 2048):
    Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-62914559, default 62914559):
    
    Created a new partition 1 of type 'Linux' and of size 30 GiB.
    Partition #1 contains a LVM2_member signature.
    
    Do you want to remove the signature? [Y]es/[N]o: n
    
    Command (m for help): w
    
    The partition table has been altered.
    Syncing disks.
  2. Atualizar o PV:

    # pvresize /dev/vdb1
      Physical volume "/dev/vdb1" changed
      1 physical volume(s) resized or updated / 0 physical volume(s) not resized
  3. Expandir a LV:

    # lvextend -l +100%FREE /dev/mediaVG/media
      Size of logical volume mediaVG/media changed from 10.00 GiB (2560 extents) to 30.00 GiB (7680 extents).
      Logical volume mediaVG/media successfully resized.
  4. Expandir o sistema de arquivos ext3/ext4:

    Para sistemas de arquivos ext3 ou ext4, você precisará usar o comando resize2fs para expandir o sistema de arquivos para usar todo o espaço disponível no LV.

    # resize2fs /dev/mediaVG/media
    resize2fs 1.45.5 (07-Jan-2020)
    Filesystem at /dev/mediaVG/media is mounted on /mnt/media; on-line resizing required
    old_desc_blocks = 2, new_desc_blocks = 4
    The filesystem on /dev/mediaVG/media is now 7864320 (4k) blocks long.

    IMPORTANTE: Se o sistema de arquivos estiver montado, o resize2fs fará a expansão online. Se não estiver montado, adicione a opção -f para forçar a verificação do sistema de arquivos antes de expandir.

    Verificando o espaço disponível após a expansão:

    # df -h /mnt/media
    Filesystem               Size  Used Avail Use% Mounted on
    /dev/mapper/mediaVG-media   30G   8G   21G  28% /mnt/media

Dica importante:

Se você estiver usando XFS como sistema de arquivos, o processo é diferente. Para XFS você deve usar:

# xfs_growfs /mnt/media

E o sistema de arquivos deve estar montado durante a operação.