Como fazer: Chroot Dosemu (clipper no linux)
postado por nightnux - comentários
0
Hamilton R. Amorim (algorista @ yahoo . com . br)
Hamilton R. Amorim (algorista @ yahoo . com . br) enviou um artigo para ser postado, que explica como fechar uma instalação do DOSEMU em um userspace de forma que o usuário não possa acessar o restante do sistema de arquivos do Linux. Este tutorial está focado em uma instalação do DOSEMU executando em um servidor para acesso remoto por ssh, o objetivo primário do ambiente é fornecer um servidor de aplicações para os antigos programas CLIPPER, ainda muito comuns no Brasil."
As pessoas de bom senso podem ficar a vontade para me contactar se precisarem de alguma ajuda na configuração do que será mostrado abaixo.
Este tutorial explica como fechar uma instalação do DOSEMU em um userspace de forma que o usuário não possa acessar o restante do sistema de arquivos do linux. Este tutorial está focado em uma instalação do DOSEMU executando em um servidor para acesso remoto por ssh, o objetivo primário do ambiente é fornecer um servidor de aplicações para os antigos programas CLIPPER, ainda muito comuns no brasil. Notoriamente é possível ao usuário da seção DOS mapear um drive (X:, por exemplo) apontando para a raiz do linux, podendo acessar todas as pastas do sistema operacional a que o usuário tem permissões. É bastante comum vermos instalações do DOSEMU executando como root (setuid) e neste tipo de instalação um usuário malicioso poderia facilmente comprometar todo o sistema.
Minha experiência com CLIPPER sobre DOSEMU mostrou que o melhor sistema operacional para esse tipo de aplicação ainda é o MSDOS622, testei amplamente o Freedos e o Drdos, sendo que o Freedos não conseguiu rodar aplicativos clipper porque não "entende" a variavel FILES no config.sys, já o drdos até rodou mas ele usa muita memória de forma que aplicativos mais pesados tem problemas de estabilidade. O MSDOS não teve problemas, facil de entender já que a maioria dos programas clipper foi feito para rodar neste sistema. Quem tiver uma licensa do MSDOS use-o, será um problema a menos. Não sei se a micro$hit se incomoda com esse uso do produto dela, mas tenho visto muita gente fazer esse uso, e tendo a licensa do produto não vejo porque não fazer.
REQUISITOS
Todo esse trabalho de configuração está baseado em uma maquina com RedHat 7.3 com dosemu precompilado 1.0.2, a versão mais tranquila de configurar, também está instalado o freedos precompilado para essa versão do dosemu. Não sei como seria em outra distribuição, mas deve mudar pouca coisa. Para começar tenha uma instalaçao do DOSEMU funcionando no userspace. Uma instalação systemwide não funciona para esse caso específico de configuração. No meu caso tenho uma instalaçao na pasta /home/teste/dosemu. Minha instalação tem os seguintes drives:
A: imagem de 1.44 configurado como floppy, foi necessário para instalar o MSDOS. minha maquina está em um datacenter e não tenho acesso ao drive real. O setup do MSDOS exige um disquete no drive, então configurei esse. C: imagem de 300mb onde está instalado o MSDOS e meus aplicavos clipper (150mb livres). D: diretório freedos onde originalmente foi dado o boot para depois instalar o MSDOS tem varios programas muito uteis, inclusive o "exitemu", convem mantê-lo. E: /home/teste, diretório home do usuário, onde estão os .html do site particular. Estes arquivos .html são gerados pelos programas clipper, muito prático. F: raiz do linux (deleite dos hackers, hehehe) é esse drive que vamos detonar. É um drive hipotético mapeado com o comando lredir.exe Em uma instalação do dosemu como root esse drive dá acesso total a maquina. CRIANDO A RAIZ
A primeira coisa a fazer é criar uma raiz de diretórios e arquivos que no final será a raiz visivel para o usuário "teste". Abaixo do diretório /home/teste crie as seguintes pastas:
/bin /dev /etc /home /home/teste /home/teste/dosemu (aqui estará o dosemu) /lib /proc /sbin /tmp /usr /usr/sbin (link simbolico para sbin) /usr/bin (link simbolico para bin) /usr/share Esses links simbolicos apontam para nossa raiz "falsa", cuidado para não apontar nada para o sistema de arquivo "oficial", esse vai desaparecer quando terminarmos essa configuração. Agora vamos copiar alguns arquivos mínimos para o dosemu funcionar e para termos alguma funcionalidade de terminal. Copie os seguintes arquivos de suas origens reais para suas respectivas pastas dentro do /home/teste:
/bin basename bash cat clear cp du grep id less ln ls mv rm sh -> bash (link simbolico para sh) su (não copie esse ainda) /dev null (crie um link real) /etc bashrc group (não copie ainda) passwd (não copie ainda) /lib ld-2.2.5.so ld-linux.so.2 -> ld-2.2.5.so (link simbolico) libc-2.2.5.so libcrypt.so.1 libc.so.6 -> libc-2.2.5.so (link simbolico) libdl-2.2.5.so libdl.so.2 -> libdl-2.2.5.so (link simbolico) libncurses.so.5 libnsl.so.1 libnss_compat.so.2 libnss_files.so.2 libpam_misc.so.0 libpam.so.0 libtermcap.so.2 -> libtermcap.so.2.0.8 (link simbolico) libtermcap.so.2.0.8 /proc cpuinfo (copie) /usr/share terminfo/ (pasta, copie inteira) Você pode me perguntar o como eu sei que são esses arquivos, e eu te respondo, os programas são o minimo que precisamos para ter um terminal decente, mais algumas extensões de shell que o dosemu precisa (id, basename, etc). As libs eu consegui com o comando ldd e uma boa dose de "tentativas e erros".
Alguns arquivos merecem um cuidado especial, tentarei explicar cada um deles:
Links simbolicos : você sabe o que é, não sabe ? espero que sim. /bin/su : este arquivo é um problema, o su que vem com o RedHat73 está linkado dinamicamente com um zilhão de bibliotecas o que torna muito dificil utiliza-lo aqui. A sujestão é baixar o pacote sh-utils em ftp://alpha.gnu.org/gnu/coreutils/sh-utils-2.0.15.tar.gz />e compilar, pegue o arquivo src/su, este funciona perfeito. Se tiver algum problema em compilar pegue este "su" precompilado: aqui. /dev/null : crie um link real que tudo funciona bem. /home/teste/dosemu : aqui você copia sua instalação do dosemu que está plenamente funcional. Ela funciona né ? Espero que sim. /etc/group : crie um arquivo só com as duas linhas do root e do seu usuário, no meu caso é o usuário "teste". meu arquivo ficou assim: (sem o ascii-art tosco, é claro) /--------------\ |root:x:0:root | |teste:x:514: | \--------------/ /etc/passwd : O mesmo caso, crie um arquivo só com as duas linhas que interessam. /---------------------------------------\ |root:x:0:0:root:/root:/bin/bash | |teste:x:514:514::/home/teste:/bin/bash | \---------------------------------------/ /usr/share/terminfo : Nesta pasta tem as informações para seu terminal remoto, necessário para o comando less. Se não precisa do less, não precisa disso. Certifique-se de que não tem nada bizarro nas permissões dos arquivos e pastas. Aqui acaba a configuração da arvore falsa, só restando as modificações no dosemu e as configuraçoes do linux.
HACKEANDO O DOSEMU
Essa parte é legal, aqui nós arrancamos as tripas do dosemu, hehehe. É uma coisinha bem simples, abra o arquivo dosemu (aquele que você executa normalmente) em um editor de textos decente, pode ser o pico, vi, mcedit ou qualquer outro do linux. Localize na linha 95 a seguinte função e comente como fiz abaixo, adicione aquela linha em vermelho (não precisa ser em "vermelho", hehehe):
function w4l_check { #HRA # if grep mki_install_hook /proc/ksyms >/dev/null; then # echo " # Note: your kernel is patched for Win4Lin, this will most likely # crash DPMI applications within DOSEMU. ... be warned! #" # fi echo "" }
Comentar essa linha nos deixa livre de precisar criar o arquvo /proc/ksyms que realmente não tenho a menor idéia de como fazer, o ideal seria criar algum tipo de link para este arquivo, mas não sei como fazer, então simplesmente deixo de usar. Se você sabe como contornar esse problema me avise por favor. De quebra (opcionalmente) pode comentar também a linha 325 onde aparece "read dummy", com isso você se livra daquela tela chata que te obriga a pressionar o ENTER antes de entrar no DOS.
Se preferir apenas copie o arquivo /proc/ksyms para dentro de nossa arvore falsa, assim não precisa alterar o dosemu, é mais prático e deve funcionar também.
O próximo passo é configurar o linux.
CONFIGURANDO O LINUX
Daqui pra frente as configurações devem ser efetuadas no "linux mesmo", estas alterações de arquivos devem ser feitas no sistema de arquivos real. A configuração do linux fica por conta de alterar a shell do usuário "teste" de forma a acessar uma shell alternativa que colocará sua seção em uma "chain root", essa cela que impedirá o usuário de enxergar o sistema de arquivos real, vendo apenas nosso "pseudo sistema de arquivos". Primeira coisa a fazer: crie um shell script em /bin com as seguintes linhas (menos o ascii-art tosco):
/---------------------------------------------------------------\ | ARQUIVO: /bin/chroot-shell | |---------------------------------------------------------------| |#!/bin/bash | |/usr/bin/sudo /usr/sbin/chroot /home/$USER /bin/su - $USER | |---------------------------------------------------------------/ Acerte a permissão deste arquivo (eu sempre esqueço isso, hehehe):
chmod ugo+x /bin/chroot-shell
Altere o shell do usuário em /etc/passwd para apontar para essa nova shell:
teste:x:514:514::/home/teste:/bin/chroot-shell
É necessário acertar as permissões de sudo para o usuário "teste". Para isso edite o arquivo /etc/sudoers adicionando a linha abaixo (sem o ascii tosco, hehehe):
/------------------------------------------------------------------------\ |teste ALL= NOPASSWD: /usr/sbin/chroot /home/teste /bin/su - teste* | |------------------------------------------------------------------------/ Não precisa nem dizer que pra fazer essas coisas precisa estar logado como root né.
Está pronto, agora é só logar como teste e navegar pela máquina, logo perceberá que está "preso" em nossa pseudo-arvore, sem nenhuma chance de acessar o sistema de arquivos real. De dentro do dosemu tente o comando:
lredir F: LINUX\FS\ Obs: Para esse comando funcionar precisa ter a linha LASTDRIVE=Z no config.sys
Normalmente este comando dá acesso a raiz do linux, e em um dosemu rodando como root esse comando dá acesso TOTAL a maquina para qualquer usuário na seção DOS. Em nossa configuração "chrooted" o usuário da seção DOS acessa apenas o que tem que acessar, e nada mais.
Espero que este documento contribua para a sua solução ou estudo, em caso de dúvida entre em contato que ficarei grato em poder ajudar. Estou disponível para trabalhos de consultoria em linux, precisando entre em contato. Não se esqueça que este documento é gratuito e pode ser distribuido e publicado em outros sites a vontade, também pode e deve ser traduzido para outros idiomas. Se você considerar que este documento está incorreto ou que pode ser melhor fale comigo que poderemos melhorá-lo juntos, ou se preferir escreva um outro "Como fazer" baseado neste, o importante é contribuir para a comunidade linux crescer.
Todas as marcas citadas no texto são propriedade dos seus respectivos donos (não sou dono de nada).
Pode copiar este texto a vontade, pode publicar onde quiser, desde que mantida a integridade do texto, traduções são permitidas e incentivadas, desde que mantida a integridade do texto, não se esqueça de colocar uma nota dizendo que você traduziu. Seja gentil e me avise se este material lhe for util.
Hamilton R. Amorim (algorista @ yahoo . com . br)
20031006 06-out-2003
|